「砂糖をやめればうつにならない」を読んだ

「砂糖をやめればうつにならない」という本を読んだ。

この本で主張していることを整理すると以下のようになる。

砂糖を摂取すると血糖値が急激に上昇する。 これによりインシュリンが過剰に分泌され、必要以上に血糖値を下げてしまう。 結果、低血糖症状となる。 心が不安定となり、人によって異なるが、頭痛、めまい、頭がぼーっとする、うつ症状などが起こるのだという。

このように低血糖症状を引き起こしやすい食べ物は砂糖の他に、クイックカーボと呼ばれる、炭水化物の中でも血糖値を上昇させやすい白米、パンなどがある。 これらの摂取を行わないことで低血糖を回避できる。

しかしそもそも、この低血糖症というものは医学的に公認されたのはずいぶん最近になってからのようで、 それまでは鬱などの症状はすべて別の病気として誤診されてきたようだ。 これにより、食べ物を見直し、クイックカーボと砂糖をやめるだけで改善するような患者に対しても抗鬱剤などの投与が行われてきたらしい(現在進行形とも)。

私はこの本を読んで、自分が最近感じている頭痛や不安感というものが砂糖により引き起こされているのではないかと疑っている。 私は低血糖症で 50mg/dl 程度しか無いし、砂糖を好んで摂取する傾向にあるためである。

よって、この本をきっかけに食生活を見直そうと考えている。 手始めに以下のことを行おうと考えている。

  • タンパク質や脂質を食事のメインとする
  • 食事から炭水化物を基本的に除外する
    • 摂取するにしても、スローカボと呼ばれる、玄米、大麦、とうもろこし、オートミール、豆類、野菜、海藻類のみとする
  • 血糖値上昇を回避するために一度にたくさん食べない
    • 間食などを行いつつ、必要な量を摂取するようにする

unicorn コマンドと unicorn_rails コマンドの違いと使い分け

unicorn コマンドと unicorn_rails コマンドの違いは -E オプションで渡すものが RACK_ENV になるのか、RAILS_ENV になるのかがメインのよう。 でも ActiveAdmin を使うときなどは unicorn_rails じゃなかったりするようだし、Rails アプリケーションの場合には特に理由がない限り unicorn_rails を使っておくのがよさそう。

reference

Unicorn の特徴について初歩的なことを書いておく

アプリサーバー対決 パート1:主なRubyアプリケーションサーバーの機能比較 [和訳] - Engine Yard Blog を読んで、Unicorn がわかった。

  • 高速クライアント用と呼ばれる理由
  • ホットデプロイをどのように実現しているか

Unicorn はmasterプロセスとそれをforkしたワーカが処理を行う仕組みになっている。 masterプロセスは監視役に徹していて、ワーカが死んだりした場合そいつを殺し、自分自身をforkしてくれる。

高速クライアントにむいている(むしろそれ以外では使っちゃダメ)な理由としては

Unicornは、デフォルト設定ではワーカープロセスが30秒を超えて処理を継続している場合、そのプロセスをSIGKILL経由で終了させる設計になっています。これが「高速クライアント用」と呼ばれる所以です

ということで、master プロセスは各ワーカを監視して、リクエストに時間がかかりすぎているようなものは処理途中でもあっさり殺してしまうのだ。そうして、自分自身をforkして、後から来るリクエストに備える。

また、ホットデプロイをどのように実現しているかについても簡単に理解できる。 コードをデプロイしたあとそれを元にmasterプロセスを一つ起動するだけで、あとはそいつがよしなにforkして指定した分だけワーカを起動し、問題ないか確認した上で、古いmasterプロセスを殺してくれる仕組みになっているからだ。

この辺りの初歩的なことでも理解しておくと選定の時に役に立ったり、デプロイの時にあたふたするのが減りそう。

reference

SaaS vs. PaaS vs. IaaS vs. VPS vs. オンプレ

SaaS vs. PaaS vs. IaaS vs. VPS vs. オンプレ

私の覚書として乱暴にまとめておく。

(# 特に PaaS vs. IaaS vs. VPS がメインです。)

SaaS (Software as a Service), PasS (Platform as a Service), IaaS (Infrastructure as a Service) はクラウドコンピューティングサービスの一種。 提供する機能やサービスの多さ順にソートすると以下のとおり。

SaaS > PaaS > IaaS

サポートしてくれるものを適当にまとめたのが下の表。

SaaS PaaS IaaS
Google Apps, Salesforce Heroku, Engine Yard, Sqale, Google App Engine Amazon Elastic Compute Cloud (EC2), Google Compute Engine
Application -
Middleware √  √  -
OS √  √  √ 
Hardware √  √  √ 
Network √  √  √ 

VPS (virtual private server) は定められたスペックの仮想化環境がそのまままるっと提供されるもの。 そして、オンプレ(on-premises)はサーバ調達からまるっとご自分で。

SaaS, PaaS, IaaS の中で最も提供する機能が少なくVPSと近しいものは IaaS。 よって、まずは IaaS と VPS の比較から。

IaaS の中で最も有名な例を上げると Amazon EC2VPSさくらインターネットとかconohaとか。 IaaS と VPS は両方共、サーバ、ストレージ、ネットワークを提供する。 しかし、異なる点がひとつあって(本当はもう少しあるが特徴的なもの)、それはCPUやメモリ容量などのリソースを柔軟に変更できるかどうか、という点。

この2つのうちどちらを選択するべきかについてはサービスによって異なって、 例えば突然スケールアウトが必要なサービス、例えばバイラルメディアとかSNSとかの場合にはIaaSとかのほうが向いている。 一方で、企業ページのウェブサイトとかその手のものについてはVPSで十分そう。

このへんの詳細は http://gihyo.jp/design/serial/01/hosting_department/0013 が詳しい。

次に PaaS と IaaS の比較。

PaaS は IaaS よりも提供されるサービスが更に多くて、RDBMSやキャッシュサーバ、その他必要そうなミドルウェアが最初から提供されていて、 スケーラビリティやシステム運用上必要な監視ツールなどについても提供してくれるというもの。

PaaS で有名なものは Heroku とか Engine Yard とか。

(PaaS の魅力とかは https://www.engineyard.co.jp/paas-vs-iaas とかに詳しい)

しかし当然その分柔軟性は更に低くなり、いろいろ問題点が指摘されていたりもする。

reference

モチベーションを保ちつつ学習を継続するには

なにかやると自分の不足しているものが見えてきて、 目的が明確になり、学習へのモチベーションが湧く。

なにかやる→しばらくそれについて学習する の繰り返しが望ましいようだ。

僕の場合、とにかく学習しなければ、と思い学習を始めるが、 ボトムアップ方式で始めたくなる性格(理学出身)のため、 膨大すぎ&&目的意識が薄れてしまいいつも立ちゆかなくなる。

トップダウン型での学習、 具体的にはまず技術習得の結果作ってみたいものなどを最初に作り始める、 方式であれば、わからないことが発生した時に、 強い目的意識を保持した状態で(作りたいものを作るためという目的が明確となっているため)学習することができる。

「超高速勉強法」を読みました

Amazon.co.jpkindle版のセールをしていたので、寝る前に読むように買って読んでみました。

やや暗記や速読よりの内容ではありましたが、 当初の目的である「勉強法」的なことも学べましたし、 それに加えて、ワークショップ形式で自分の状況を書き出したりすることが多く、 自己分析する感じで理解が深まり、スッキリすることができました。

Amazon.co.jp: 超高速勉強法 eBook: 椋木修三: Kindleストア

本書の目次は以下のとおりです。

  • 1章 「あせり」をうまく使え!
  • 2章 「長時間」の損に気づこう
  • 3章 「平均点」は挙げなくていい!
  • 4章 「目次」を暗記せよ!
  • 5章 「わからないまま」を恐れるな
  • 6章 頭はリラックスでより強くなる

この本で自分が主に学んだことは3つあります。

目的設定

まず、勉強の目的を設定します。 自分はなぜこの勉強をするのか、それを記載しておきます。 モチベーションが低下した時にはそれをまた見て向上させます。 本当に自分の心に火をつける理由を見つけて設定しておくことが大事のようです。

期限設定

次に、期限を決めること。 渡しの場合、期限が決まらないとスイッチが入りません。 よって、期限を決めるというのはやはり有効な手だと思いました。 そして期限を決めたらそれだけではなく、 やるべきと思っていたToDoを優先度付し、 スケジュールに応じて捨てるものは捨てる、残すものは残す、 と取捨選択してやる必要があります。

凡事徹底

そしてなにより、凡事徹底。 1日30分の勉強を毎日コツコツ継続すると1年継続したらものすごい量勉強することができます。 これを短時間で取り返そうと思ってもかなりしんどいです。 難しい物事を習得するときこそ、この凡事徹底が効いてくるわけです。 改めて継続の力を認識させられたので、これから頑張っていきます。

その他にも、例えば自分に自信がなくなったときなど、 自分の可能性をとことん信じて、絶対にできると自己暗示をかけるとよい、 といったことなども紹介されていて、この辺りも参考になりました。

Amazon.co.jp: 超高速勉強法 eBook: 椋木修三: Kindleストア

Amazon RDS な MySQL で 不要 process を kill する

MySQLToo many connections が発生しました。 processlist を確認したところ、Command が Sleep なプロセスが多く発生しており、 結果最大接続数の上限に達してしまうことで発生していたのでした。 Sleep なプロセスが接続を持ったまま残っていることは問題なので、これを削除することとします。

まずは processlist を表示します。

show full processlist を実行するか、select * from information_schema.PROCESSLIST を実行します。

COMMAND が 'Sleep' で、TIME が 1000 以上のものを抽出するには下記のようにします。

mysql> select * from information_schema.PROCESSLIST where USER='user' and COMMAND='Sleep' and TIME > 1000;

これらの process を一気に kill するためにコマンドを作ります。

mysql -uroot -hhostname testdb -p -e "select concat('KILL ', id, ';') from information_schema.PROCESSLIST where USER='mery_db_user' and Command='Sleep' and TIME > 1000;" > /tmp/a.txt

mysql 上で source するか、shell上で 流し込みます。

mysql> source /tmp/a.txt

ちなみに、Amazon RDS だと kill で process を kill できません...

mysql> kill 64890;
ERROR 1095 (HY000): You are not owner of thread 64890

そのような場合には mysql.rds_kill を使って kill します。

mysql> CALL mysql.rds_kill(66825542);
Query OK, 0 rows affected (0.00 sec)

付録

show full processlistselect * from information_schema.PROCESSLIST

root@localhost[footest]:4> show full processlist ;
+-----+------+-----------+----------+---------+-------+-------+-----------------------+
| Id  | User | Host      | db       | Command | Time  | State | Info                  |
+-----+------+-----------+----------+---------+-------+-------+-----------------------+
| 774 | root | localhost | foo     | Sleep   |    55 |       | NULL                  |
| 775 | root | localhost | NULL     | Sleep   |    24 |       | NULL                  |
| 918 | root | localhost | foo     | Sleep   | 13242 |       | NULL                  |
| 933 | root | localhost | footest | Sleep   | 21712 |       | NULL                  |
| 965 | root | localhost | foo     | Sleep   | 21472 |       | NULL                  |
| 969 | root | localhost | footest | Query   |     0 | init  | show full processlist |
+-----+------+-----------+----------+---------+-------+-------+-----------------------+
6 rows in set (0.00 sec)

root@localhost[footest]:5> select * from information_schema.PROCESSLIST;
+-----+------+-----------+----------+---------+-------+-----------+----------------------------------------------+
| ID  | USER | HOST      | DB       | COMMAND | TIME  | STATE     | INFO                                         |
+-----+------+-----------+----------+---------+-------+-----------+----------------------------------------------+
| 965 | root | localhost | foo     | Sleep   | 21640 |           | NULL                                         |
| 918 | root | localhost | foo     | Sleep   | 13410 |           | NULL                                         |
| 969 | root | localhost | footest | Query   |     0 | executing | select * from information_schema.PROCESSLIST |
| 774 | root | localhost | foo     | Sleep   |    43 |           | NULL                                         |
| 775 | root | localhost | NULL     | Sleep   |     2 |           | NULL                                         |
| 933 | root | localhost | footest | Sleep   | 21880 |           | NULL                                         |
+-----+------+-----------+----------+---------+-------+-----------+----------------------------------------------+
6 rows in set (0.02 sec)

Ref

MySQL int(10) の意味するところ

MySQLにおいてint(10)は整数データタイプの表示幅を10桁に指定するという意味になります。

 

create文例:

CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL DEFAULT '0',
`name` varchar(40) NOT NULL DEFAULT '',
`type` smallint(6) NOT NULL DEFAULT '0',
`status` tinyint(4) NOT NULL DEFAULT '0',
`created_on` int(10) unsigned NOT NULL DEFAULT '0',
`comment` text NOT NULL,
`path` varchar(16) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `i1` (`type`,`created_on`)
);

 

int(10)が使用されている例:

`id` int(10) unsigned NOT NULL DEFAULT '0',

 

この表示幅はカラムに格納できる値の範囲及びカラムに指定された幅を超える値の表示される桁数を制限しません。 例えばint(10)の場合、-2147483648から2147483648のint範囲をもち、10文字で許容された範囲外は10文字以上の文字を使って表示されます。

ちなみにこのオプションは ZEROFILL という拡張属性が指定されなければ有効になりません。 このオプションを使用することで、すなわちINT(5) ZEROFILLとすることで、4の値が00004として表示されます。

 

Ref

JSON にコメント(っぽいもの)を書く方法

JSONは便利ですが、一点不満なところがあるとすればそれはコメントが書けないことです。

例えば以下の様なJSONがある場合、 JavaScriptのように // などでコメントを表現しようとするとエラーとなります。

{
"startAt":0, // 開始位置
"maxResults":18,
"total":18
}

 

The Hack

これを解消するためにはJSON同じキー文字列の要素が重複した時には最後に定義したものが優先されるという特性を利用するとよいらしいです。 これを利用すると下記のような形でコメントが残せます。

{
"startAt":"開始位置",
"startAt":0,
"maxResults":"最大結果数",
"maxResults":18,
"total":"合計",
"total":18
}

 

Ref

Adding Comments to JSON

Mac OS X に homebrew で mysql を install する

MySQLのインストール、初期設定まで

MySQL のインストール

まずは homebrew を使ってmysqlをインストールします。

% brew install mysql

ここでインストール後の設定方法が出力されます。 これらの情報は brew info mysql で確認可能。

 

データベース及びユーザー設定

データベースのインストール、格納場所の設定をします。

 % unset TMPDIR
 % mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

mysql の起動します。

 % mysql.server start

password の設定します。

 % /usr/local/opt/mysql/bin/mysqladmin -u root password 'new-password'
 % /usr/local/opt/mysql/bin/mysqladmin -u root -h YOUR_MACHINE_NAME.local password 'new-password'

mysql データベースの格納場所: /usr/local/var/mysql

 

起動スクリプトの設定

OS 起動時にmysql自動起動するための下記にシンボリックリンクを配備します。

 % ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents

デフォルトではmysqlは落ちても自動で再起動する設定となっているので、サーバ出ない場合はとりあえずこれをオフにしておきます。

 % open ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

開いたら、 "KeepAlive" の Value を "NO" に設定します。

スクリプトの有効化を行います。

% launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
% launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

 

その他

mysqlの再起動
% mysql.server stop
% mysql.server start
my.cnf を使うには
  • /etc/my.cnf: global
  • /usr/local/var/mysql/my.cnf: server固有
  • ~/my.cnf: user固有
show variables like "char%";

PerlのArrayとListでは挙動が異なるので注意が必要です

Perlのarraysとlistsは似ていますが全く異なるものです。

どこがどう違うのかはよくまとめられた記事がありましたのでこちらを見ていただくとして、 ここでは自分用にメソッドの戻り値としてarraysとlistsそれぞれを指定したときに、 スカラーコンテキストでそれらの値を取得した時の振る舞いの違いを書き留めておきます。

get_listget_array 2つのメソッドの戻り値をそれぞれスカラーとして受け取った場合、 どのような戻り値が返るでしょうか。

sub get_list {
    my ($one, $two, $three) = (3, 5, 8);
    return ($one, $two, $three);
}

sub get_array {
    my @array = qw(3 5 8);
    return @array;
}

結果はこのとおりです。

my $scalar_from_list = get_list();
#=> 8

my $scalar_from_array = get_array();
#=> 3

 

まとめ

  • listsを戻り値にした関数をスカラーで受け取ると、listsの末尾の値が代入されます。
  • arraysを戻り値にした関数をスカラーで受け取ると、arraysの要素数が代入されます。

 

Ref

transactionの途中でトランザクションが切れてしまった時にそのトランザクションを殺す方法

起こったこと

transactionモードで作業途中、セッションが切れた。 そのとき特定tableにinsertをしたがcommitしていない状態だった。

後ほど再度そのtableをselectしたが、当然commitしていないのでデータがなかった。 しかしinsertしようとすると、

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

というエラーが表示され失敗した。

 

原因

transactionがロックを取得したまま放置状態になっていたために発生した。

 

対処

基本方針は show processlist;show innodb status; の結果を見比べてそれっぽいthread見つけて kill [thread id] する。

show processlist; してみると、今回はこのへんのデータが怪しかった。

| Id      | User        | Host               | db            | Command     | Time  | State  | Info
| 3503944 | game        | 10.33.84.237:36220 | game_item     | Sleep       |  3912 |        | NULL

show innodb status; してみると、以下が今回のやつに対応しているっぽいことがわかる。(show processlistとshow innodb status の結果を何度か見比べているとわかるはず)

---TRANSACTION 70B8606F4, ACTIVE 4251 sec, process no 2451, OS thread id 1501722944
2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 2
MySQL thread id 3503944, query id 53043667 10.33.84.237 game
Trx read view will not see trx with id >= 70B8621E3, sees < 70B8617B7

よって、この thread id 3503944

kill 3503944

で完了。

 

めも

timeoutの時間のチェック

mysql> show global variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 5     |
+--------------------------+-------+
1 row in set (0.01 sec)

 

Ref

http://d.hatena.ne.jp/hhelibex/20110329/1301421815

mac os x で 音源ファイルのフォーマットを mp4 へ変換するコマンド

afconvert はmac os x に標準で搭載されているコマンド。 SNDFILE.aiffaac フォーマット、拡張子 mp4 で変換するコマンド例 (-f mp4f なのがみそ)

$ afconvert -f mp4f -d aac -b 256000 SNDFILE.aiff
$ afplay SNDFILE.mp4

 

Ref.

Herokuの登録とデプロイ

HerokuはWebアプリ用のホスティングプラットフォームです。

初期はRuby on Railsなアプリケーションのみのサポートでしたが, 現在は Java, Node.js, Scala, Cloure, Python, PHP などに対応しているらしいです。(DBはPostgresQL, MySQLなど)

ソースコードのバージョン管理にGitを使用していれば, アプリケーションを簡単に本番環境にデプロイできます。

登録

  1. Herokuのユーザー登録 を行います。

  2. アカウント作成後完了メールが届いたら, Heroku Toolbelt という CLI tool を利用して必要な Heroku ソフトウェアをインストールします。

  3. ターミナルで heroku コマンドを実行してサーバにアプリケーション用の場所を確保します。

ログインして

$ heroku login

プロジェクトディレクトリに移動し, Herokuサーバ上にアプリケーション用の場所を作成します。

$ heroku create 
Created http://enigmatic-bastion-7425.herokuapp.com/ |
git@heroku.com:enigmatic-bastion-7425.herokuapp.com
Git remote heroku added

このコマンドを実行すると, アプリケーション専用のサブドメインが作成され, ただちにブラウザで表示可能になります。

 

アプリケーションのデータベースが動作するようにするには,

以下を実行して本番データベースのマイグレーションを行う必要もあります。

$ heroku run rake db:migrate

 

デプロイ

remote に heroku が追加されていることを確認します。

$ git remote -v
heroku git@heroku.com:enigmatic-bastion-7425.git (fetch)
heroku git@heroku.com:enigmatic-bastion-7425.git (push)
...

Heroku への deploy を行います。

$ git push heroku master

 

デプロイされたアプリケーションを表示します。 (heroku create を実行した際に生成されたアドレスをブラウザで開くだけ)

$ heroku open

 

その他の heroku コマンド

アプリケーションの名前を変更
$ heroku rename NAME_YOU_WANT_TO_CHANGE

 

参考