OmniAICreator/Qiita-1.07M huggingface dataset:
スタイルガイドや命名規則記事まとめ( JavaScript )

僕の会社にソースレビューはありません。指摘してくれる人もいません。
何が良い、何が悪いか判断ができるようになるために記事やサイトをまとめます。


## JavaScript
グーグル先生のスタイルガイド
とりあえずこれに目を通しておくといいと思います。
[Google JavaScript Style Guide](http://cou929.nu/data/google_javascript_style_guide/)

Node.jsをやる人はこっちもしっかり読んでおこう！
[Felix's Node.js Style Guide(日本語)](http://popkirby.github.io/contents/nodeguide/style.html)


## CoffeeScript

好き嫌いが分かれるが、Javascriptをいろいろ省略して記述できるCoffeeScript。

これ、どう書くんだ？と思ったらここ
[CoffeeScript 言語リファレンス](http://memo.sappari.org/coffeescript/coffeescript-langref)

CoffeeScriptは何も考えずに記述してもある程度は綺麗にかけます。
それでも意識して書くことは重要なのでこれも読みます。
[CoffeeScript Style Guide](https://github.com/polarmobile/coffeescript-style-guide)

JavaScriptで書かれたサンプルとかを手っ取り早くCoffeeにしたい時は、
JavaScriptとCoffeeScriptの相互変換を行ってくれるj2coffeeで確認してます。
[j2coffee](http://js2.coffee/)

## フレームワークを使う時
JavaScriptのフロントのフレームワークは書き方が特殊なものが多いですが、
そういった時も綺麗に書くことを心がけたいです。

JQueryを使う時はこれ！
[JavaScript Style Guide](https://contribute.jquery.org/style-guide/js/)

Angular.jsやAngular.js Coffeeも探せばあるんですね。ありがたい。
[AngularJS スタイルガイド](https://github.com/tama3bb/angularjs-styleguide)
[AngularJS CoffeeScript Style Guide](https://github.com/Plateful/plateful-mobile/wiki/AngularJS-CoffeeScript-Style-Guide)


## 命名規則で参考にしている記事
ドラクエの主人公なら名前は「あああ」でいいかもしれない。
でもプログラムではダメ！

Qiitaにある以下の記事を参考にさせてもらってます。
[Naming -名前付け-](http://qiita.com/Koki_jp/items/f3d3e824f98d182d4100#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%90%8D%E3%81%AF%E5%8B%95%E8%A9%9E%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B)
[プログラマなのに知らなかったら恥ずかしい英単語集](http://qiita.com/usatie/items/b41adf8114188406d2b8)
[クラスの命名のアンチパターン](http://qiita.com/magicant/items/8134edf969f9629fa66e)
[うまくメソッド名を付けるための参考情報](http://qiita.com/KeithYokoma/items/2193cf79ba76563e3db6)
[うまくメソッド名を付けるための参考情報](http://qiita.com/KeithYokoma/items/ee21fec6a3ebb5d1e9a8)



## その他

Qiitaで綺麗に記事を書くにはこれ！
[Markdown記法 サンプル集](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[Qiitaでシンタックスハイライト可能な言語一覧](http://qiita.com/Qiita/items/e84f5aad7757afce82ba)
Oracle Enterprise Managerにアクセスする

## 前提
- Windows Server 2012 R2
- Oracle Database Express Edition 11g インストールしたところ

## 手順

### 環境変数設定
（この手順をせずにemctl等しても、以下のエラーが表示される）

```
>emctl -h
Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to database unique name.
```

setxコマンドによる環境変数設定(以下はDB名がdbnameの場合）

```
>setx /M ORACLE_UNQNAME "dbname"
```

### HTTPSを無効化してHTTPに

```
>emctl stop dbconsole
>emctl unsecure dbconsole
>emctl start dbconsole
```

### ブラウザでアクセス
http://x.x.x.x:1158/em/
Ansibleでとりあえず authorized_key を通す

Ansible Advent Calendar 2015 の５日目の記事です。

# authorized_key モジュール

ansible実行時にSSHのパスワード入力ではなく、公開鍵認証で済ませたい。
そしてその設定１回だけのためにplaybookを書きたくないな～ということで、どう書けるのか試して見ました。


```
$ ANSIBLE_HOST_KEY_CHECKING=False \
ansible -i hosts all -m authorized_key -a "user=hoge key='`cat $HOME/.ssh/id_rsa.pub`'" -k
```

ansibleコマンドだと、ドキュメントに記載があるような、lookupが使えるのかわかりませんでしたので、catで文字列を取得しています。

playbookで実施する場合は、素直にドキュメント通りにやりましょう。
http://docs.ansible.com/ansible/authorized_key_module.html

以上です。

---
(2019.8.15 追記)

ansible-playbook を実行する前に、リモートのauthorized_keyの設定だけは事前に済ませておきたい！ という場面で上記のコマンドは便利かと思います。
```
 -k, --ask-pass   ask for connection password 
```
を指定し、sshパスワード認証をしつつリモートの$HOME/.ssh/authorized_keys にローカルの公開鍵をコピーします。
Shellscriptでかんたん！Mackerelにサービスメトリックを自動ポスト

この記事は [animateLAB Advent Calendar 2015](http://qiita.com/advent-calendar/2015/animatelab "animateLAB Advent Calendar 2015 - Qiita") および [Mackerel Advent Calendar 2015](http://qiita.com/advent-calendar/2015/mackerel "Mackerel Advent Calendar 2015 - Qiita") 5日目の記事です。1記事で2カレンダーに参加の実績解除だ！

こんにちは、[id:karia](http://profile.hatena.ne.jp/karia/ "kariaさんのプロフィール - はてな")です。Qiita的には "@kariaです" と自己紹介するのが正しい気がしますが、Mackerelははてなさんのプロダクトだし、はてなIDで自己紹介するのが何となく正しい気がしました。ちなみにはてなブログには（はてなダイアリー時代から含めて）12〜13年ほど前からお世話になってます。古参アピール乙！

ここからが本題です。Mackerelにはカスタムメトリックと言って、ユーザーが定義した任意の数値をポストしグラフ化する機能が存在します。そのヘルプがこちら。

[ホストのカスタムメトリックを投稿する - Mackerel ヘルプ](http://help-ja.mackerel.io/entry/advanced/custom-metrics "ホストのカスタムメトリックを投稿する - Mackerel ヘルプ")

うーん、ちょっと難しそうだな？

……とお思いの貴方にお勧めなのが[API仕様](http://help-ja.mackerel.io/entry/spec/api/v0#service-metric-value-post "API仕様（v0） - Mackerel ヘルプ")にある「サービスメトリックの投稿」です。このAPIを利用すると、curlでワンライナーでMackerelにサービスメトリックの値を投げられるぞ！やったー！というのが本日のお題です。

サンプルとして、MySQLのprocesslistを見てテーブルレベルロックの状況を確認するというソースコードをGitHubに置いときました。

[karia/post_mackerel_mysql_process](https://github.com/karia/post_mackerel_mysql_process "karia/post_mackerel_mysql_process")

MySQLのrootパスワードがスクリプト内に直書きとかツッコミ所は多々あるかと思いますが、サンプルなのでそれは置いておくとして肝となる部分は以下の箇所です。

```bash
curl https://mackerel.io/api/v0/services/SERVICENAME/tsdb -H 'X-Api-Key: APIKEY' -H 'Content-Type: application/json' -X POST -d '[{"name": "MySQL.USERNAME.all", "time": '$(date +%s)', "value": '${COUNT_USER}'}, {"name": "MySQL.USERNAME.locked", "time": '$(date +%s)', "value": '${COUNT_LOCKED}'}]'
```

ヘッダ部分にはMackerelのAPI Keyと、JSON形式で投げるのでContent-Typeをそのように指定します。

JSONの中身については、timeの箇所には`date +%s`で現在のUNIX時刻を置いておきます（任意の時刻を置きたければ置いてよいかと思います）。あとはnameは何らか決めた上でvalueに値を入れてやれば完了です。上記の例では、`$COUNT_USER`および`$COUNT_LOCKED`という変数にあらかじめ値を入れた上でcurlコマンドを叩いています。

なおサービスメトリックは秒単位でPOSTできてしまうのですが（サンプルでも5秒おきに投げてます）、実際のグラフ上では1分単位で見ることができないので1分未満の間隔でPOSTする意味は今のところないです。[Mackerel ヘルプ](http://help-ja.mackerel.io/entry/overview "概要 - Mackerel ヘルプ")にもデータの保持間隔は最短でも1分おきであることが明記されています。

私からは以上です。なお、昨日のMackerel Advent Calendarはid:senyoltwさんの[Mackerel+IFTTTで運用担当者がアラートに絶対に気づく仕組みを作る](http://senyoltw.hatenablog.jp/entry/2015/12/04/061206)でした。私も前職で担当者にアラート発生連絡の電話を100回ぐらいしたことがあるのでお気持ちはわかります。そして明日の担当は@HKDnetさんです。よろしくお願いします！
Webフォントで手軽にWebページの印象を変える

Webでのタイポグラフィーが注目されて久しいですが、「そもそもそんなにフォント持ってねーよ」という方にフォント持ってなくても手軽に色々なフォントを試すことができるGoogle Fontsの紹介です。

実装自体は１分でできるはず。きっと…。

# フォント探し
[Google Fonts](https://www.google.com/fonts)でお気に入りのフォントを探します。
また日本語にも対応した[Noto Sans Japanese](https://www.google.com/fonts/earlyaccess)も利用してみます。

# Webページへ導入
導入はとっても簡単です。

## CSSの読み込み
Google Fontsのページにもサンプルが記載されていますが、まずcssの読み込みを行います。

```html
<link href='http://fonts.googleapis.com/css?family=Alegreya+Sans' rel='stylesheet' type='text/css'>
```
こんな感じ。

Noto Sans Japaneseの場合は少し違って

```html
<link href="http://fonts.googleapis.com/earlyaccess/notosansjapanese.css" rel="stylesheet" type='text/css'>
```
こんな感じ。

## フォントの指定
次にWebフォントを適用したい部分にCSSでfont-familyを指定します。

それでもう出来上がり。

```css
.font1{
    font-family: 'Alegreya Sans', sans-serif;
}
```


# サンプル
３種類のフォントを読み込んで利用してみたサンプルです。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<meta name="author" content="">
	<meta name="copyright" content="">
	
	<!-- webfonts -->
	<link href='http://fonts.googleapis.com/css?family=Alegreya+Sans' rel='stylesheet' type='text/css'>
	<link href='http://fonts.googleapis.com/css?family=Gilda+Display' rel='stylesheet' type='text/css'>
    <link href="http://fonts.googleapis.com/earlyaccess/notosansjapanese.css" rel="stylesheet" type='text/css'>
	
    <!-- CSS -->
	<style type="text/css">
        body{
            font-size:2em;
        }
        .font1{
            font-family: 'Alegreya Sans', sans-serif;
        }
        .font2{
            font-family: 'Gilda Display', serif;
        }
        .font3{
            font-family: 'Noto Sans Japanese', serif;
        }
    </style>
    
</head>
<body>
	<p class="font1">
        1分で実現できる有用な技術 Advent Calendar 2015
    </p>
	<p class="font2">
        1分で実現できる有用な技術 Advent Calendar 2015
    </p>
	<p class="font3">
        1分で実現できる有用な技術 Advent Calendar 2015
    </p>
    
</body>
</html>
```

表示するとこんな感じ。
![image](https://qiita-image-store.s3.amazonaws.com/0/83530/40ffa618-b1a1-69f9-91c7-71430dd7fcec.png)
RPi > フォトトランジスタの試用 > NJL7502-L > 明るさの検知

```txt:動作確認
Raspberry Pi2 (GNDと5Vとしてのみ使用)
```

フォトトランジスタで可視光の強さを計測できるらしい。
試してみた。

- デジボル
- フォトトランジスタ NJL7502-L (新日本無線) > [データシート](http://akizukidenshi.com/download/NJL7502L.pdf)
- 抵抗 1.1kΩ


## 回路

回路としては以下が参考になった。
http://yaplog.jp/kazuikazui/archive/178

実際にこちらではRPiとブレッドボードを用いて以下のように接続した。

- RPiのPin#02(DC Power 5V)をNJL7502-Lのコレクタに接続
- NJL7502-Lのエミッタを抵抗1.1kΩに接続
- 抵抗1.1kΩをRPiのPin#06(GND)に接続

抵抗の両端にデジボルを接続し、その電圧を測定した。

## 結果


- 部屋[18時 蛍光灯オン] : 約8.7mV
- 部屋[18時 蛍光灯オフ] : 約0.5mV
- フラッシュライト[正面から] : 500mV-700mV (つけ始めに1.5Vなどなる)
- フラッシュライト[側面から] : 50mV-70mV

入射光の強度で電流値が変化している様子がみれた。

周囲の光のON/OFFを認識するのは上記の0.5mVと8.7mVの２値がGPIO.LOW, GPIO.HIGHに対応するように抵抗を考えればいいのだろうか。

その場合、強い光で電圧があがりすぎた時の保護回路的なものをどうするかについて現在のところ未調査。

## GPIOの入力

GPIOのインプットについては以下のようなQAがある。
http://raspberrypi.stackexchange.com/questions/29918/gpio-voltage-thresholds

> High Low is detected on falling or rising edge, just putting 1v doesn't produce and edge so to speak and may be inconsistent.
サクラエディタでCSV/TSVモード

## インストール

1. http://sakura-editor.sourceforge.net/download.html から V2(Unicode版)の最新パッケージをダウンロードしてインストール。
1. ver 2.3.0.0 未満なら http://sakura.qp.land.to/ から V2(Unicode版) の最新単体配布版をダウンロードして解凍。sakura.exe をパッケージでインストールしたものに上書きする。

## タイプ別設定の追加

1. 設定 > タイプ別設定一覧 を開く
1. 「テキスト」を複製したものを設定変更
    - 名前: `CSV`
    - ファイル拡張子: `csv`
    - 折り返し方法: 折り返さない
    - **CSV** を選択
1. 「テキスト」を複製したものを設定変更
    - 名前: `TSV`
    - ファイル拡張子: `tsv`
    - 折り返し方法: 折り返さない
    - **TSV** を選択

以上で設定完了。

拡張子が csv or tsv のファイルを開くと、それぞれのモードで表示されるようになります。

## おまけ - 特定列を抽出する
矩形範囲選択モードと組み合わせる事により特定列の抽出が簡単に行えます。

1. `Alt+[→]` で1行目の対象列を選択
1. `PageDown` で最終行まで選択
1. コピー
1. 別途、末尾のカンマやタブを空文字列で置換して除去
EC-CUBEなサイトの見つけ方（神田編）

EC-CUBE Advent Calendar 2015 6日目です。

EC-CUBEは推定2万2千店舗で使われているといわせていただいておりますが、おかげさまで実際に自分がプライベートで買い物をしているサイトなんかでも、あっ、これEC-CUBEじゃね？って思うこともあるわけです。

そこで、そんな時に私がチェックしているポイントがいくつかあるのですが、その中でも、非常に簡単に真似していただけるものをお教えします。


## 確認時間10秒。EC-CUBEなサイトの見つけ方

ずばり！

会員登録ページにいって登録フォームの住所の例が
「千代田区神田神保町」
になっていれば、EC-CUBEです。
（100%ではありません）


他のアプリケーションでもそうだと思いますが、インストール時にサンプルとして登録されているような文言ありますよね。
ここをそのままにされている方も結構いらっしゃいます。

EC-CUBE LOVEな私としてはEC-CUBEで作られたサイトだと、購買意欲が高まります。  
最近だとホームシアターがほしくて調べていたのですが、[こちらのショップ](http://apex-net.com/)で購入させていただきました。

今後あれ？EC-CUBEかな？って思うようなサイトに出会ったら、ちょっと確認してみて、ぜひお買い上げいただければと思います。

## サンプルテキストの変更方法

EC-CUBEはカスタマイズして使われる方が多いので、EC-CUBEのオフィシャルサイトに掲載されている[構築事例](http://www.ec-cube.net/product/cases/backnumber.php)をみていただいても、ぱっと見では、本当にEC-CUBEって思うようなものも沢山あります。

それでも、サンプルテキストがそのままならすぐにEC-CUBEだと推定できてしまうわけですが、サンプルテキストの変更方法をお伝えしておきます

### 2系での変更方法

管理画面のシステム設定→パラメーター設定から  

+ SAMPLE_ADDRESS1
+ SAMPLE_ADDRESS2  

を変更するだけです。

### 3系での変更方法

3系なら、src/Eccube/Resource/locale/message.ja.yml に

+ form.address1.help: 
+ form.address2.help: 

として記載されていますので、こちら変更すれば変えることができます。

## 最後に

サンプルテキストの変更方法をご紹介しました。
3系はまだ、ここのメッセージを変更する機能がないのですが、今後用意されることになっていくでしょう。  
また、message.ja.yml という名前をみてもらえば分かるように、EC-CUBE3.0は多言語を意識した作りがすでに入っていることが伺えるかと思います。

最後にEC-CUBE3の開発にちらっと触れつつ。

先日「EC-CUBE名古屋ユーザーグループｘさくらクラブ」に登壇された @hiroyasu55 さんにバトンをお渡しします
JavaScriptでCSSアニメーションの@keyframesを使う


## JavaScriptから@keyframesを使うには

element.styleなどでは指定できないので、
head内にstyleタグを作成し、その中に@keyframesを追加します。

## たとえばfadein/fadeoutを作成する


```javascript


(function() {
	var css, rules, fadein, fadeout;
  
	// styleタグを作成
	css = document.createElement('style');
	css.media = 'screen';
	css.type = 'text/css';
  
	// フェードイン
	fadein = '@keyframes fade-in{' + [
		'0% {opacity: 0}',
		'100% {opacity: 1.0}'
	].join(' ') + '}';
  
	// フェードアウト
	fadeout = '@keyframes fade-out{' + [
 		'0% {opacity: 1.0}',
		'100% {opacity: 0}'
	].join('') + '}';
  
	// ルールをstyleタグに追加
	rules = document.createTextNode([fadein,fadeout].join('\n'));
	css.appendChild(rules);
	
	// head内に作成
	document.getElementsByTagName('head')[0].appendChild(css);
}());
```
各ブラウザでソースマップを確認する方法

# はじめに
最近のフロントエンド開発ではgulpなどでビルドしたjavascript、cssを使うのが当たり前になりつつあります。ビルドされたコードをデバッグするのに便利なsourceMapですが、ブラウザごとに使い方が違います。なので、今回は備忘録も兼ねて、ブラウザごとのsourceMapの使い方についてまとめてみました。

# 各ブラウザでのsourceMap確認方法
## Chrome
* 開発者ツールの「Source」タブを開きます。
* webpack://配下にオリジナルソースが表示されます。
![スクリーンショット 2015-12-05 17.08.02.png](https://qiita-image-store.s3.amazonaws.com/0/26979/4fef9fd0-8573-4d7f-c8cf-11b48f794754.png)

## Safari
* 開発者ツールのS「リソース」タブを開きます。
* 左側のウインドウから、ビルドされたコードを選択します。
* 上記コードの下にオリジナルコードが表示されます。

下図はビルドしたコード名がindex.jsの場合
![スクリーンショット 2015-12-05 17.15.24.png](https://qiita-image-store.s3.amazonaws.com/0/26979/48537b21-c1a7-f01f-0aee-92bee08102f7.png)

## FireFox
* 開発者ツールのソースタブを開く
* 左側のウインドウでwebpack:://からはじまるのがオリジナルのコード
![スクリーンショット 2015-12-05 17.29.04.png](https://qiita-image-store.s3.amazonaws.com/0/26979/31393eb0-f62d-21e9-b56f-2c8ca0be7051.png)


## 各ブラウザ共通でオリジナルコードを見る方法
現状では各ブラウザともに、開発者ツールのデバッグタブでファイル名検索でオリジナルコードを表示することができます。上で色々書きましたが、この方法でいいと思いました。

# 終わりに
これで普段とは違うブラウザでも、sourceMapの使いかたで迷うことはなくなったと思います。
メモに使ってたブログ消すからnvmを使ったNode.js環境を作るコピペ手順をこっちに書く。

前に描いた奴と内容はほぼ一緒だけど自分的にやりやすく書く

## 事前準備 

Gitから入れるのでgitは入れておいてね！  
 
```$ brew install git``` とか
```$ yum install git```　とか

## nvm (Node Version Manager) のインストール

```git clone git://github.com/creationix/nvm.git ~/.nvm ```

# .bash_profileに以下を記述

```bash:.bash_profile
[[ -s ~/.nvm/nvm.sh ]] && . ~/.nvm/nvm.sh
```

## コンソール立ち上げ直すbashを読み込ませる
``` $ bash ```

## nvm使ってNode.jsをインストール
インストールできるバージョンを確認
```$ nvm ls-remote ```
インストール
```$ nvm install v*.**.* ```
デフォルトに設定
```$ nvm alias default v*.**.* ```
確認
```$ nvm ls ```

![73fcd6bcddf33f0e73b7d9392a5b326e.png](https://qiita-image-store.s3.amazonaws.com/0/28820/0a0098bb-6d18-d16c-a2d7-b43dd734cdb1.png)

以上！！！
PHP array キャストのススメ


ある1つの関数で、単一の値でも、複数の値でも受け取りたいというニーズは割とあると思います。

対象が1個なら、可変長引数 `...` や `func_get_args()` の方が楽ですが、2個以上になると、それぞれちゃんとお世話しなければいけません。
例えば私は、以下のように書いてました。

```php
function hoge($fuga, $piyo) {
  // 配列じゃなかったら配列にする
  if (!is_array($fuga)) $fuga = [$fuga];
  if (!is_array($piyo)) $piyo = [$piyo];

  foreach($fuga as $f) {
    foreach($piyo as $p) {
      print "$f <-> $p\n";
    }
  }
}

hoge(1, 1);             // "1 <-> 1"
hoge(1, [1, 2, 3]);     // "1 <-> 1", "1 <-> 2", "1 <-> 3"
hoge([1, 2, 3], 1);     // "1 <-> 1", "2 <-> 1", "3 <-> 1"
hoge([1, 2], [1, 2]);   // "1 <-> 1", "1 <-> 2", "2 <-> 1", "2 <-> 2"
```

`is_array` は、やってることは分かり易いんですが、冗長な気もしなくもない…。

## array へのキャスト

もっと楽ちんに実装できないものかと、PHPのマニュアルをめくると、以下の記述を発見。

> integer, float, string, boolean, resourceのいずれの型においても、 array に変換する場合、 最初のスカラー値が割り当てられている一つの要素 (添字は 0) を持つ配列を得ることになります。 
>
> ... [PHP: 配列](http://php.net/manual/ja/language.types.array.php#language.types.array.casting)

つまりどういうことかと言うと、

```php
(array)1;         // == [1]
(array)0.5;       // == [0.5]
(array)'string';  // == ['string']
(array)true;      // == [true]
(array)[1,2,3]    // == [1, 2, 3]

// resource 型
$fp = fopen("/dev/null", "r");
(array)$fp;       // == [$fp]
```

スカラー値を取る型に対して array キャストすると、それを配列にラップしてくれます。勿論 array の場合は array のまま。

つまり、やってる事は `if (!is_array($fuga)) $fuga = [$fuga];` とほぼ一緒です。
よって、冒頭の関数は、以下のように書き換えられます。

```php
function hoge($fuga, $piyo) {
  foreach((array)$fuga as $f) {
    foreach((array)$piyo as $p) {
      print "$f <-> $p\n";
    }
  }
}
```

コードもスッキリしました。やった！

## 要注意の値/型

### null 値

```php
$fuga = null;

if (!is_array($fuga)) [$fuga];    // [null]
(array)$fuga;                     // []
```

null 値を array にキャストすると、`[null]` ではなく、空要素の配列 `[]` が返ります。

"関数の引数として扱う" という場面だと、"`foreach` でループが回らなくなる = 処理しない"
という意味になるので、むしろこっちの方が好都合かもしれませんが、`is_array` の時とは挙動が違うので要注意です。

*※null をラップする必要がある場合は、`[null]` と明示する必要があります*

### object 型

より注意が必要なのは object 型です。例えば、クラスのインスタンスを関数に渡す場合には、array キャストした時の挙動が他の型と異なります。

> objectを配列にする場合には、配列の要素として オブジェクトの属性 (メンバ変数) を持つ配列を得ることになります。 
>
> ... [PHP: 配列](http://php.net/manual/ja/language.types.array.php#language.types.array.casting)

```php
// object(stdClass)
$fuga = json_decode('{"hoge": 1, "fuga": 2}');

if (!is_array($fuga)) [$fuga];    // [object(stdClass)]
(array)$fuga;                     // ["hoge" => 1, "fuga" => 2]
```

object を配列でラップするのではなく、インスタンスが持つメンバ変数を、連想配列に変換する動きになってしまいます。これでは、先ほど書き換えた関数も、想定通りの動きにはなりません。

## 使いどころ

結論、**引数の型によって使い分けが必要**な感じです。

- **スカラー値** を渡す関数なら、`(array)` キャストで楽する
- **object** を渡す関数なら、素直に `is_array` で判定する

### 処理速度

テキトーに100万回ベンチを取ってみましたが、単一引数でラップする必要がある場合、 `(array)` キャストが 3～4割 ほど早くなる模様です。

一方で、ラップの必要が無い (はじめから配列) の場合は、配列を再生成する分のオーバーヘッドが無くなるため、差はほぼ皆無でした。

とはいえ、このへんは元々の処理が一瞬なので、普通に扱う分には全然気にしなくて良いでしょう。

### オマケ: どっちにも対応させる

あんまりケースとしては少ないと思いますが、"スカラー値も object も取り得て、同じようにラップさせたい!!" という場合には、以下のようにすると良いかも。

```php
function hoge($fuga, $piyo) {
  $fuga = is_object($fuga) ? [$fuga] : (array)$fuga;
  $piyo = is_object($piyo) ? [$piyo] : (array)$piyo;

  foreach($fuga as $f) {
    foreach($piyo as $p) {
      // ...
    }
  }
}
```

**...最初より長いじゃん!!**
Scala Sprayで開発する時の初期設定


自分用

JSONライブラリとassemblyは使うので最初から入れておく

sbt-assembly
https://github.com/sbt/sbt-assembly


play-json
https://www.playframework.com/documentation/ja/2.1.x/ScalaJson


<h3>build.sbt</h3>

```
organization  := "org.XXX"

version       := "0.1"

scalaVersion  := "2.11.6"

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8", "-Ylog-classpath")

libraryDependencies ++= {
  val akkaV = "2.3.9"
  val sprayV = "1.3.3"
  Seq(
    "io.spray"            %%  "spray-can"     % sprayV,
    "io.spray"            %%  "spray-routing" % sprayV,
    "io.spray"            %%  "spray-testkit" % sprayV  % "test",
    "com.typesafe.akka"   %%  "akka-actor"    % akkaV,
    "com.typesafe.akka"   %%  "akka-testkit"  % akkaV   % "test",
    "org.specs2"          %%  "specs2-core"   % "2.3.11" % "test",
    "org.scalikejdbc"     %%  "scalikejdbc"    % "2.2.+",
    "org.slf4j"           %   "slf4j-simple"   % "1.7.+",
    "mysql"               %   "mysql-connector-java" % "5.1.29",
    "com.typesafe.play"   %   "play-json_2.11" % "2.4.2"
  )
}

ivyScala := ivyScala.value map { _.copy(overrideScalaVersion = true) }

Revolver.settings


assemblyMergeStrategy in assembly := {
  case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".properties" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".xml" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".types" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".class" => MergeStrategy.first
  case "application.conf"                            => MergeStrategy.concat
  case "unwanted.txt"                                => MergeStrategy.discard
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}
```


<h3>application.conf</h3>

```
akka {
  loglevel = INFO
}

spray.can.server {
  request-timeout = 1s
}

include "securesocial.conf"
```

<h3>plugins.sbt</h3>

```
addSbtPlugin("io.spray" % "sbt-revolver" % "0.7.2")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.1")

```
ローカルGAEサーバにlocalhost以外からアクセスする(Eclipse)

0. `パッケージエクスプローラー` > `プロジェクト名を右クリック` > `Debug` > `Debug Configuration` >
`Arguments`へ移動
0. Program argumentsに "--host=[自PCのIPアドレス]"を追記 > `apply` > `debug`

# 参考
 - https://github.com/Polymer/docs/issues/767
SNIの仕組みをOpenSSLコマンドで理解する

この記事ではOS X Yosemite 10.10と、元々インストールされているOpenSSL 0.9.8を利用しています。

```bash
$ openssl version
OpenSSL 0.9.8zg 14 July 2015
```

 * `help.hipchat.com`にリクエストを投げたら何故か`*.uservoice.com`の証明書が返ってくる（2015-12-05現在）

```bash
$ openssl s_client -connect help.hipchat.com:443 -showcerts < /dev/null 2>&1 | grep subject
subject=/OU=GT20300774/OU=See www.rapidssl.com/resources/cps (c)15/OU=Domain Control Validated - RapidSSL(R)/CN=*.uservoice.com
```

[SNI](https://jp.globalsign.com/blog/2015/server_name_indication.html)という、一つのIPアドレスが複数のSSL証明書を扱える技術があるのですが、サーバ側でSNIを使っている場合、SSLハンドシェイク時にドメイン名を指定しないと正しいSSL証明書が返ってこない事があります。

比較的新しいサービスだとSNIを使っている事が多いです。例えば、HipChatのヘルプページ（help.hipchat.com）ですが、これはSNIを使っています。なので、`openssl`コマンドを使って証明書を取得しようとすると上記のようなことが起こります。

サイトのURLを表すコモンネーム（CN）の値が`*.uservoice.com`となっています。なぜこんなことが起きるのでしょうか？それは、一つのIPアドレスが複数のSSL証明書を持っているからです。ドメイン名は単なるIPアドレスを単に見やすくしたものです。アクセス時は番号に変換されてしまいます。なので、サーバはリクエスト一つ一つが、どのドメイン名を意図して送られたものなのかわからないのです。当然、どの証明書を返してよいか分からないわけです。そこで、SSLハンドシェイク時に明示的に文字列としてドメイン名を指定しなければ、デフォルトとして設定されているSSL証明書が返ってきます。
`openssl`コマンドで明示的にドメイン名を指定するには下記のオプションを使います。

| オプション | 内容 |
|-------|----|
| -servername   | 欲しいSSL証明書のドメイン名を明示的に指定する |

 * 明示的にサーバ名を指定すると正しい証明書が返ってくる。

```bash
$ openssl s_client -connect help.hipchat.com:443 -servername help.hipchat.com -showcerts < /dev/null 2>&1 | grep subject
subject=/C=US/L=San Francisco/ST=California/O=Atlassian, Inc./OU=HipChat/CN=help.hipchat.com
```

私はとあるAPIを叩いていたのですが、どうしても通信がうまく行きませんでした。それは、APIのエンドポイントでSNIが使われていることと、私が使っているAPIクライアントがJava1.6製だったのが原因でした。Java1.6のHTTPSクライアントは、SSLハンドシェイク時にドメイン名を指定する機能がありません。なので、上記の`help.hipchat.com`のような例では証明書が不正だと判断され通信が失敗します（この場合、何も指定しなくてもhelp.hipchat.comのCNを持った証明書が返ってくるよう、サーバ側で設定されていれば通信はできるのですが……）。
brewでredisをインストールしてみよう

# 前提
・homebrewがインストールされている

# redisインストール
```bash
$ brew install redis
==> Downloading https://homebrew.bintray.com/bottles/redis-3.0.5.el_capitan.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/redis-3.0.5.el_capitan.bottle.tar.gz
==> Pouring redis-3.0.5.el_capitan.bottle.tar.gz
==> Caveats
To have launchd start redis at login:
  ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don't want/need launchctl, you can just run:
  redis-server /usr/local/etc/redis.conf
==> Summary
🍺  /usr/local/Cellar/redis/3.0.5: 9 files, 892K
$
```

# ログイン時、自動起動するように登録
```bash
$ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
```

# 今すぐサーバー起動する。
```bash
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
```

# redis設定ファイルの場所
```bash:/usr/local/etc/redis.conf
# Redis configuration file example.
#
# Note that in order to read the configuration file, Redis must be
# started with the file path as first argument:
#
# ./redis-server /path/to/redis.conf
...
```

# 起動して確認
```bash
$ redis-cli
127.0.0.1:6379> set 'a' 111
OK
127.0.0.1:6379> get 'a'
"111"
127.0.0.1:6379> exit
$ 
```
チネル on EC2 フェイルオーバ (ENIなし)

# 基本知識
http://c9katayama.hatenablog.com/entry/20111225/1324837509

# やること
- ~~Redisどもは、別のsubnetにぶち込む。~~ 同じsubnetでもループはしない、NATと違うから。AZは複数でもいい
- ~~Redisを使う奴らは、Redisどもと別のsubnetにいる~~ 同じsubnetでOK
- Redisどもは `Src/Destのチェックを切っておく`
- Redisども(sentinelと分離するなら sentinelども)にEC2-Role を振っておく、RoteTableのDel/Creができる権限があればいい
- Redisどもに、lo0:vipを振っておく、ここで使うIPは `VPCのレンジの中のIPではいけない`
- Redisを使う奴らの subnetに紐づく routetable に、VIP/32のエントリを追加、経路は redisのmasterのインスタンスID (上記リンクが詳しい解説)

# 詳細
## RedisどもにふるVIP用 network-script
```bash:/etc/sysconfig/network-scripts/ifcfg-lo-vip
DEVICE=lo:vip
IPADDR=<使いたいVIP>
NETMASK=255.255.255.255
ONBOOT=yes
```

## チネル切替スクリプト(抜粋)
やることは、元のルートテーブルエントリを潰して、自分のインスタンスIDで書き換え

```bash:
#!/bin/bash
  aws --region ${REGION} ec2 delete-route --destination-cidr-block $VIP/32 --route-table-id ${ROUTE_TABLE_ID}
  aws --region ${REGION} ec2 create-route --destination-cidr-block $VIP/32 --route-table-id ${ROUTE_TABLE_ID} --instance-id ${INSTANCE_ID}
```

## 細かい話
その場限りでVIP振りたい、事前に全redisにVIP振るのがキモいなら

```
#add
ip addr add local <your vip>/32 dev lo label lo:vip
#del
ip addr delete local <your vip>/32 dev lo label lo:vip
```
ジーズアカデミー2016年展望①

#ジーズアカデミー2016年展望①

![1_960_504.jpg](https://qiita-image-store.s3.amazonaws.com/0/103486/b056f890-8f88-b6f7-3385-e8ef13ef06e4.jpeg)

はやいもので、もう年末ですか。
ジーズアカデミーの最終準備していたのがちょうど1年前の年末なので、あれから1年経つのですねぇ・・・
去年の今頃はまだ学校のシステムもあやふやな中、山崎先生と２人きりで、CIやらWebサイトやらプレスリリースやら、メンター候補を探したりとしていたころです。
そこから考えるとすでに150名のメンバーがいて、メンターもチューターもたくさんいるってのは幸せだ。山崎先生の娘さんは合格するし、准教授になったし。いやぁいい年でした。


ということで、来年のジーズアカデミーは･･･

##①卒業生向け講座『G's Premiere』をどんどんやります！
![Gonrails.png](https://qiita-image-store.s3.amazonaws.com/0/103486/5f684e02-d7a5-c16f-6d45-88fc4a06ed66.png)

年間50講座を実施する！（つもり）です。卒業生のみなさん、リクエストをどんどんお願いします！
スキルアップは継続的に実施していただき、ご自身の付加価値を高め、ついでにジーズの評判も高めておいてくださいｗ受講料はいりませんが、1講座受講したら新入生を1人紹介ですｗ（嘘）

##②スタッフ増やします！
![tuters.jpg](https://qiita-image-store.s3.amazonaws.com/0/103486/d1af1735-fc80-3b88-1e68-cdb4cbfbb512.jpeg)

ジーズアカデミーという学校はみなさんと同じ「スタートアップ」です。デジハリが会社としては後ろ立てではありますが、学校としては別もの。ただのスタートアップ企業です。
なので一番大切なのは仲間ですね。武井さんやデジハリ卒業生だった1期チューターのみなさんの力添えがあってここまで来れました。山崎先生やメンターののびすけさんも影に日なたにサポートしていただいたことを感謝しています。

「GEEKを養成して日本からセカイを変えるようなサービスを産み出す」という理念は変わりませんので、ご一緒いただけるような仲間はもっと増やして行こうと思っています。ステキな方がいたらぜひご紹介をお願いします。

##③そして･･･2016年4月、全日集中コースを新規開講します！
![flags.jpg](https://qiita-image-store.s3.amazonaws.com/0/103486/83143b39-7303-b4ac-01df-11b024cb284f.jpeg)

ビジネスよりの週末コースに対し、全日集中コースは平日の日中朝から夕方まで毎日通学してもらう新コースができます。中身としては「栗林さん養成コース」という言い方が一番わかりやすいかも。技術に振り切って学んでいただくコースで12月15日ごろ公開になります。
こちらは授業料後払いではありませんが、代わりに「スキル保証制度（何度でも受講できる制度）」がつきます。
年明けから新入生募集ですので、ぜひお近くにいたらご紹介ください。謝礼もしますｗ


**###そして！！！あと、３つ皆さんにお伝えしたいBIG　NEWSがありますが･･･それはまた次回に。** :laughing:
[メモ]phpenvとphp-buildを用いたPHPバージョンアップ

# 前もこんな記事書いてました

[メモ]GentooにH2O+PHP7.0.0RC4をインストールする。
http://qiita.com/igara/items/1b7cd8e714844440795d

今回はアップデートについて記載

# 起動中のphp-fpmを停止させる

```
# php-fpmプロセスを調べる
ps -ef

php-fpm: master process (/root/.
nobody   23272 23271  0 16:09 ?        00:00:00 
↑これがphp-fpmのプロセスで23272がプロセスID
php-fpm: pool www
nobody   23273 23271  0 16:09 ?        00:00:00 php-fpm: pool www
root     23274     2  0 16:09 ?        00:00:00 [kworker/0:2]
root     23322     2  0 16:14 ?        00:00:00 [kworker/0:0]

kill 23271

```

# php-buildを更新する

以前、phpのソースをビルドした場合コンフリクトを発生させるためresetする必要がある。

```

cd .phpenv/plugins/php-build/
git reset --hard
git pull

```

# php7.0.0をビルドする

```

phpenv install 7.0.0
phpenv global 7.0.0
phpenv local 7.0.0
phpenv rehash

```

```

# 設定ファイルの適応
cd /root/.phpenv/versions/7.0.0/etc/
cp php-fpm.conf.default php-fpm.conf
cd /root/.phpenv/versions/7.0.0/etc/php-fpm.d/
cp www.conf.default www.conf

```


#php7.0.0のphp-fpmを起動する

```

~/.phpenv/versions/7.0.0/sbin/php-fpm &

```

# 完了!
![スクリーンショット 2015-12-05 16.23.34.png](https://qiita-image-store.s3.amazonaws.com/0/89599/cf82822c-448b-e30e-3b34-78d2eb1c64c2.png)
line monitor > 付随Tool > shutdownボタン機能 (v0.1)

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

```txt:動作確認
Raspberry Pi2 + raspbian
```

## shutdownボタン

line monitorをスタンドアローン(ネット未接続)で使用する時、終了処理をきちんと行いたい。

GPIOでスイッチ入力をとらえて、スイッチが押されたらshutdow -hを行うことにした。

参考
http://tomoyukim.hatenablog.com/entry/2015/05/27/131500
http://d.hatena.ne.jp/penkoba/20130925/1380129824

### 基盤
スイッチだけの基盤を作成した。材料は以下の通り。

- ROCタクトスイッチ PT-6301A-3 : 20円
- ユニーバサル基盤 : 100円
- AWG28のケーブル

スイッチの一方はPin#39(GND)に接続して、もう一方はPin#37に接続した。
プルアップにしておいて、スイッチがおされたらGPIO.LOWになる。

以下の写真の左側がスイッチのみの基板 (右側はIPアドレス表示用基板)。

![Qiita.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/120a4a07-9f6d-d694-1c6e-0c470e9979b7.jpeg)


以下のように実装した。

[v0.1 @ github](https://github.com/yasokada/python-151205-shutdownButton/releases/tag/v0.1)

```shutdownButton.py
#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
import os

swio=37
GPIO.setmode(GPIO.BOARD)
GPIO.setup(swio, GPIO.IN, pull_up_down=GPIO.PUD_UP)

chk1=GPIO.HIGH
chk2=GPIO.HIGH
chk3=GPIO.HIGH
while True:
	chk1=chk2
	chk2=chk3
	chk3=GPIO.input(swio)
	#print GPIO.input(swio)
	if chk1==GPIO.HIGH and chk2==GPIO.LOW and chk3==GPIO.LOW:
		print "start shutdown"
		os.system("/sbin/shutdown -h now")

	time.sleep(0.3)
```

上記の判断でチャタリングによる誤動作が起きないかは未確認。

これを/etc/rc.localに登録しておくことで、shutdownボタンが有効になる。
R Markdownで生成するhtml内に画像データなどを組み込まない

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## `self-contained`
R Markdownのデフォルトでは、出力された画像などは自動的にbase64でhtmlファイルに組み込まれます。単一ファイルで完結するので持ち運びや公開が便利です。

ですが、**すっごい量のテキストデータ(しかもhtml本体ではない)**になります。こうなると、あとからhtmlを確認しようとするときに大変です。苦痛です。面倒です。場合によっては解除したくなります。

これは`pandoc`の`--self-contained`で実現しています。したがってpandocにこのスイッチを入れないようにすればいいです。R MarkdownでこれをOFFにするには、Rmdのyamlチャンク部分を編集してください:

```
---
title: "hogehoge"
output:
  html_document:
    self_contained: false
---
```
```

この場合、生成された出力などは作業ディレクトリ内にfig用ディレクトリが作成されて保存されます。htmlはすっきりしますが相対パスに気をつけるようにしてください。

Enjoy!
Gmailをメーラーとして使う

#**なんで？**
Windowsでメールアカウントをメーラに設定していたが、OSを再インストールした際にアカウントの以降ができなく、オンラインですべて済ませたくなってしまったので。

#**環境**
CentOS release 6.6 (Final)
postfix-2.6.6-6.el6_5.x86_64

#**参考にさせていただいたサイト**
http://centossrv.com/postfix-tls.shtml

#実施した内容
- サーバー証明書作成
- Postfix設定
- -o smtpd_sasl_auth_enable=yesと、tlsmgrは、既に有効だった。
- Postfix再起動

上記の作業を実施したら、下記のエラーを回避できた。

Unspecified Error (SENT_EHLO): Unable to send AUTH command over non ssl connection code(0) ]
※Gmail → 設定 → アカウントとインポート → 自分のPOP3メールアカウントを追加 → ウィザードに従って、メール送信サーバの設定時にTLSとSSLを選べるが、TLSで下記の問題が出たので、SSLを選択した。

SSLを選択する為に、上記の作業をした。
なんか勉強やる気でないなぁ解決委員会

ぼくは専門学生であり、学校ではITの技術を学んでおります。
ということは、少なからずITに興味が有るということです。
少なからずITに興味が有るということです。
しかしながら、常に興味を持ち続けることは大変なことであります( 世界中のぼくのような人にとっては)。
今回のテーマはこの問題を解決しようと頑張るってな話でございます。

#やる気だすには色々やり方があるはず!

+ とりあえず最新技術の記事を読む( h/w, ガジェット, 技術研究, Spacecraft)

+ IT系の読み物( 小話的な奴, 面白系)

+ SFを嗜む( 映画、 小説、 ゲーム, アニメ)

+ ライブコーディング視聴( ニコニコ生放送, Twitch, Ustream, CaveTube)

+ 音楽聴いて( House, Techno, Electro)電子の海を感じる

+ などなど...

全部消費的である。
「もうちょい人にドヤ顔出来る事がいいなぁ」そう思うのである。
しかし、何かアプリを作ろうとすると途中で投げ出しちゃうのである( 世界中のぼくのような人の場合)。
ただ、何かしら実践したほうが為にはなるはずだしなぁ…

#そうだ、get startedだ!

この「get started」もちろんみなさんご存知とは思いますが。
なにかしらのアプリ、言語、スクリプト、ライブラリ、フレームワークの公式サイトの上の方にある項目である。
この「get started」に書いてあることをやってしまえば、環境が整うというすばらしい発明品である( 全世界のget startedに感謝)。

##大事な題材選び!!

最初に言っておこう。
題材選びが一番大事な事である。
ポイントは3つ

+ 名前( かっこよさ、 かわいさ、 愛しさ)

+ ロゴ( かっこよさ、 かわいいさ、 愛しさ)

+ シンプルさ( あんまり複雑だと手に負えない)

友達にドヤ顔で見せびらかす自分の姿を思い描きながら決めるのだ！
しかし、出きるだけ無理のない題材を選ぼう( ハードルを上げすぎてはダメだぞ)。

##では実際にやってみよう!!

これこそが肝である。
一番大事な事と言っていいだろう。
世界中の人々は千差万別である( 素晴らしい!)。
世界中の「get started」もまた千差万別である( 素晴らしい!!)。
なので今回は割愛させてもらいます。
思う存分楽しみましょう。

##では実際に見せびらかそう!!

忘れてはいけないのが見せびらかすことである。
実はこれが一番大事な事である。
そして一番自分自身の腕が試される「STAGE」なのである。

知りうる限りの単語を使い。
知りうる限りのたとえ話をし。
知りうる限りのコマンドを使うのである。

満足するリアクションが得られるまで繰り返し見せびらかそう( 相手選びも大事である)。

#伝えたかった気持ち…

人間は完成には程遠いものである( 世界中のぼくのような人はそう思う)。
ある時は希望に満ち溢れ空高く舞い上がれる。
ある時は絶望に浸りどこまでも泥沼に沈んでいく。
人間は完成には程遠いものである。

果たして、未完成とはかくも醜いのか
果たして、未完成とはかくも美しいのか
果たして、未完成とはかくも魅力的なのか

さぁ、答えを探しにいこう

Let's get started now...
Py2appオプションを日本語訳しただけのやつ

オプションは，ビルド手順は3種類の方法で効果をpy2appに指定することができる：

コマンドラインにおいて  

```bash
$ python setup.py py2app --argv-emulation
```

```setup.py
setup(
  app=['MyApplication.py'],
  options-dict(py2app=dict(
    argv-emulation=1,
    )),
  )
```

```setup.cfg
[py2app]
argv-emulation=1
```

なおsetup.pyで変換コマンドラインオプションを使用するとき，アンダースコア(_)をハイフン(-)に置き換えなければならない．
setup.cfgファイルには、ハイフンまたはアンダースコアのいずれかを使用することができるが，
コマンドラインオプションでは，常にハイフンを使用する必要がある．

## オプションリファレンス

サポートしているpy2appオプションを列挙するために，次のコマンドを使用する．  

```bash
$ python setup.up py2app --help
```

py2appコマンドのオプション  

|コマンド|内容|
|:-----------|:-----------|
|--optimize (-O)|最適化レベル: -O1 for "python -O", -O2 for "python -OO", そして -O0は無効にします． [デフォルト値: -O0]"|
|--include (-i)|モジュールのコンマ区切りのリストが含まれるようにする．|
|--package (-p)|パッケージのコンマ区切りのリストが含まれるようにする．| 
|--iconfile|アイコンファイルを使う．|
|--excludes (-e)|モジュールのコンマ区切りのリストを除外する．|
|--dylib-excudes (-E)|フレームワークのコンマ区切りのリストまたはdylibを除外する．|
|--datamodels|xcdatamodelをコンパイルされたリResourcesにコピーする．|
|--resources (-r)|追加されたデータファイルのコンマ区切りのリストやフォルダを含まれるようにする(コードではない！)|
|--frameworks (-f)|追加されたフレームワークのコンマ区切りのリストやdylibを含まれるようにする．|
|--plist (-P)|Info.plistのテンプレートファイル，辞書またはplistlib.Plist|
|--extension|	バンドル拡張 [デフォルト値: アプリケーションのための.app, プラグインのための.plugin]|
|--graph (-g)|出力モジュールの依存関係グラフ|
|--xref (-x)|HTMLとしての出力モジュールクロスリファレンス|
|--no-strip|デバッグ及び出力からのローカルシンボルを削除しない．|
|--no-chdir (-C)|データディレクトリに変更しない．(Contents/Resources) [プラグインを強制]|
|--semi-standalone (-s)|Pythonの既存インストールモジュールに依存させる．|
|--alias (-A)|現在のソースファイルをエイリアスとして使用する．(開発のみ！)|
|--argv-emulation (-a)|argvエミュレーションを使用する．|
|--argv-inject|argvにいくつかのコマンドを導入する．|
|--use-pythonpath|PythonのPATHがインタプリタの環境に影響を与えることを可能にする．|
|--use-faulthandler|faulthandlerを有効にする．(Python 3.3以上)|
|--verbose-interpreter|verboseモードでPythonを開始する．|
|--bdist-base (-b)|ビルドライブラリのベースディストリビューションは，最終的に配布するビルドを置く．(デフォルトはdist)|
|--site-packages (-d)|site.pathにシステムとユーザのsite-packagesを含まれるようにする．|
|--strip (-S)|出力からデバッグとローカルシンボルをストリップする．(デフォルトでは，互換性のためオン)|
|--prefer-ppc|Force applicationは翻訳してi386で実行する．(LSPrefersPPC=True)|
|--debug-modulegraph|モジュール発見フェーズが完了したあとPDBコンソールにドロップする．|
|--debug-skip-macholib|macholibフェーズをスキップする．(アプリケーションは孤立しない！)|
|--emulate-shell-environment|ターミナルウィンドウでシェル環境をエミュレートする．|
|--qt-plugins|Qtのプラグインのコンマ区切りのリストをPyQt4を使用してアプリケーションに含まれるようにする．|
|--matplotlib-backends|matplotlibバックエンドのコンマ区切りのリストは，そのライブラリを使用してアプリケーションに含まれるようにする．デフォルトでは，matplotlibの全てを含むようになっている．「`*`」を使用すると全てのバックエンドを含め，「`_`」にのみ明示的にインポートされているバックエンドを含まれるようにする．|
|--extra-script|追加されたスクリプトのコンマ区切りのリストをアプリケーションに含まれるようにする．|
|--include-plugins|追加プラグインのコンマ区切りのリストをアプリケーションに含まれるようにする．|
|--arch=ARCH|アーキテクチャが含まれるようにする．(Intel, Fat, Universal, 注: ARCHは，Pythonインタプリタによってサポートされるアーキテクチャのサブセットである必要がある．)|
zshってどう発音すればいいの

# 聞かせてくれたまえ。君はzshをなんと呼んでいるかね

zshをどう発音するかは、なかなか難しい問題です。

これはzshに限った話ではありませんが、ずっと書籍などで独学していた人が、いざ勉強会で発表しようというときにトンチンカンな発音をしてしまって恥をかく……というのはありがちな光景です。

そこで本日は、よく見られるzshの呼び方を確認し、もっとも無難な読み方を考察してみたいと思います。

# 発音の候補

## ずぃーしぇる

もっとも正統的と言って良い発音です。"Z-Shell"をそのまま素直に発音すればこうなりますし、国内のみならず海外でもこの呼び方を聞くことが多いです。

zshのご先祖である(?)cshの時代には、ほぼ100%の人がcshのことを「しーしぇる (C-Shell [síːʃél])」と発音していたことからも、zshを「ずぃーしぇる」と呼ぶのは最有力候補と言って良いでしょう。

## ぜっとしぇる

Zなんだからゼットだろう、という呼び方です。時々、「Zをゼットと言うのは日本人だけで、本当はズィーと発音するんですよ、ぷぷぷ」君が登場するのですが、Zをずぃー[zíː]と発音するのはアメリカ英語で、イギリス英語では普通にゼッド[zéd]と言いますし、ドイツ語でもZは「ツェット」のような発音ですから問題ありません。むしろズィーがアメリカ訛りです(話がそれました)。

この呼び方も比較的多いようですが、さらに一歩進めて「ぜーたしぇる」と呼ぶ人は見たことがありません。お前らのガンダム好きを考えれば、もっといてもいいと思うのだが。

## ぜっとえすえいち

zshを順にアルファベット読みしたものです。几帳面な性格の人によく見られる呼び方です。

しかし日本語としてこう発音すると長ったらしく感じてしまうことから(?)、この読み方をする人はあまりいないようです。

## ぜっしぇ

今から20年ほど前、FreeBSD 2.x系の頃は、tcshの全盛期でした(偏見)。そこで、tcshのことを「てぃーしーしぇ」と呼んでいた私は、自然の流れでzshのことをこう発音しています。

しかしtcshの時代には同士も多かったというのに、zshの時代になってなぜかみんなどこかに言ってしまい、この呼び方をしている人は他に出会ったことがありません。求む同士!

## ぜっしゅ

bash信者がzshを使い始めると、こう呼びます。積極的に使う理由はありませんが、必要最低限のシンプルな呼び方は好感が持てます。

## ぜっしぇる

「ぜっとしぇる」を早口で言っているとこうなります。最近、この発音もいいなと思い始めました。いかにも和製英語的で、語感もカワイイので今後流行らせてみたい呼び方です。

# 結論

好きにしましょう。
【備忘録】rails_helperとspec_helperの違いについて




> spec/rails_helper.rb に Rails 特有の設定を書き、spec/spec_helper.rbには RSpec の全体的な設定を書く、というようにお作法が変わるそうです。これによって、Railsを必要としないテストを書きやすくなるんだとか。


参照先：http://blog.willnet.in/entry/2014/06/10/142341
Markdownのリンク形式で現在のページのタイトルとURLを表示するブックマークレットを登録(Qiitaの記事作成補助)

Qiitaの記事を書くときに、参考URLを書くのがいつも面倒なのでブックマークレットを作った。
ブックマークレットの使い方も含めた方法メモ。

# 実装
適当に文字列加工してダイアログボックスで表示させるだけ。

```js:Markdownのリンク形式で現在のページのタイトルとURLを表示
javascript:(function(){window.prompt("以下をコピーして下さい","["+document.title+"]("+location.href+")");})();
```

# 使い方
+ ブックマークバーを右クリックして「ページの追加」を押す。
+ 適当な名前を着けて、URLに `javascript: ` から始まるスクリプトを書く。(今回は上に書いたスクリプト) 

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/e880bb5a-372a-7aec-7473-3815e52efb12.png)

+ 作成されたブックマークレットを押すと実行される。今回はダイアログボックスが表示される。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/e1319aae-5d46-be31-60f8-c2affb79b43f.png)

+ 表示されたフォームからコピペする。

# Qiitaに欲しい機能
Qiitaで画像の追加みたいにドラッグアンドドロップでリンク追加できると便利だと思う。

# 参考
[現在のページのURLを取得する](http://www.openspc2.org/reibun/javascript/link/011/)
[[O] Google Chrome にブックマークレットを追加してみる](http://diary.overlasting.net/2009-10-08-2.html)
[Javascriptでメッセージボックスを表示する](http://lightgauge.net/javascript/javascript-tech/1731/)
Solidusでデフォルト通貨を日本円にする

Solidusの前身であるSpreeでは、デフォルト通貨の設定はGUIのAdminコンソールから自由に設定することができました。

しかし、通貨の設定を"Spree::Money preferences"から[RubyMoney/monetize](https://github.com/RubyMoney/monetize)に移行すると同時に管理画面からその設定を取り除いてしまったようです。該当のコミットとその理由は以下のリンクからどうぞ。

[Remove Spree::Money preferences](https://github.com/solidusio/solidus/commit/4f2005d461c2a532f826bb049e0ba770db41eb15)

その後通貨を日本円にする方法がわからず困っていたのですが、以下の方法で簡単に設定できることを発見しました。

```rb:config/initializers/spree.rb
#config.currency = "USD" ここをコメントアウトか消す
config.currency = "JPY" # 新規追加
```

Solidusは英語のドキュメントすらまだ少ないのでちょっとした問題でも一苦労ですね、、、
iMovieでエンドロールを左寄せ文字にする

## ことはじめ

iMovieでエンドロールを作りたかった。
しかし、iMovieのTitleテンプレートのエンドロールは、中央寄せしかない。
どうにかして左寄せにしたい。

## 解決策

一定数になるまでスペースを追加し、最後に制御文字(例えばENQ)を入れると左寄せになったように見える。

+ ポイント
    + 中央寄せだが、文字を入れると左にずれる
    + スペースを入れても左にずれない
    + 制御文字は目には見えないが左にずれる

vim の矩形選択を使って一定数になるまでスペースを追加し、最後に制御文字を追加することで対処することができた。

しかし、一定文字数を超えるとiMovieが自動的に改行してしまうため、注意が必要。
その一定文字数は、フォントの大きさに依存するため、

1. フォントの大きさを決める
2. 一定文字数を確認
3. スペースと制御文字で文字の右側を埋める

の手順で対処すると良さそう。


と思ったが・・、正常に出力されていない・・

やっぱ、制御文字とか理解していないのに使っちゃだめだな。
Linux で計算機クラスタを作る (2. 分散ファイルシステム NFS 導入)

[Linux で計算機クラスタを作る (1. ネットワーク構築)](http://qiita.com/yubais/items/7c40227a17569dc9d412) の続き。

今回つくったクラスタの構成図（再掲）。
![futon.png](https://qiita-image-store.s3.amazonaws.com/0/40166/d362081b-5c23-3bbd-f8f4-ce7e2744d4aa.png)

計算機クラスタにおいては、計算の実行は各ノードで行いますが、データは一箇所に集約されている必要があります。そこで今回はヘッドノード FutonHead に全てのデータを置き、他のノードは FutonHead の必要なディレクトリをマウントするという形にします。
（将来的には NAS とか付ける可能性がありますが、とりあえずはこの形で。）

分散ファイルシステムには NFS を使います。UNIX 系では NFS が一般的なようです。Windows だと CIFS とか。

# 共有すべきディレクトリ

* `/home` 各ユーザーのデータ
* `/usr/local` ユーザー全員が使えるプログラム等

このへんは用途や流儀によって色々あるらしいですが、とりあえずこれで行きます。

# ヘッドノード設定
まず NFS サーバーとなるヘッドノードには nfs-kernel-server をインストール。

```bash:
FutonHead $ sudo apg-get install nfs-kernel-server
```

次に `/etc/exports` を開いて、NFSサーバーとして公開するディレクトリを明記します。

```bash:/etc/exports
# この2行追加を追加
/home 192.168.2.0/255.255.255.0(rw,async,no_root_squash)
/usr/local 192.168.2.0/255.255.255.0(rw,async,no_root_squash)
```

フォルダ名、公開するネットワークの範囲、およびオプションとなります。なお **255.255.255.0 と (rw,...) の間にスペースを入れてはいけません。** 僕はこれで1日を潰しました。

オプションの意味は以下のとおり

* `rw` 読み書き可能。(読込専用ならば `ro`)
* `async` 非同期書き込み。パフォーマンスが向上するが、途中でクラッシュした時に検出不可能なエラーが発生するなど信頼性を損ねる。今回はパフォーマンス重視なので非同期に設定。同期にしたい場合は `sync`。
* `no_root_squash` クライアントが root 権限での書き込みを可能にする。

# 計算ノード設定

NFS クライアントである計算ノードには nfs-common をインストールします。

```bash:
Futon01 $ sudo apt-get install nfs-common
```

設定は `/etc/fstab` に書き込みます。

```bash:/etc/fstab
# この2行を追加
FutonHead:/home       /home       nfs   defaults 0 0
FutonHead:/usr/local  /usr/local  nfs   defaults 0 0
```

設定した後は以下のコマンドでマウントが実行されます。

```bash:
Futon01 $ mount -a
```

マウントされたかどうかは以下のコマンドで確認可能。

```bash:
Futon01 $ df -h
Filesystem        Size  Used Avail Use% Mounted on
/dev/sda1         443G  4.0G  417G   1% /
none              4.0K     0  4.0K   0% /sys/fs/cgroup
udev               32G  4.0K   32G   1% /dev
tmpfs             6.3G  1.5M  6.3G   1% /run
none              5.0M     0  5.0M   0% /run/lock
none               32G     0   32G   0% /run/shm
none              100M     0  100M   0% /run/user
FutonHead:/home   2.7T  1.4T  1.2T  54% /home
```

一番下の行を見ると、ヘッドノードの /home が計算ノードの /home にマウントされていることが確認できます[^usr] 。/etc/fstab に書き込んだ内容は再起動時にも反映されます。

[^usr]: `/usr/local` は表示されないけど cd で移動するとちゃんとマウントされている。同じ場所をマウントした場合片方しか書かれないとかかな。

# 互換性の問題

今回は /home と /usr/local を共有したので、これらのディレクトリに実行ファイルを置いておけば、どの計算ノードでも実行することが出来ます。しかし、そのために互換性の問題が発生することがあります。

たとえば今回僕が作ったクラスタの CPU には各世代の CPU が入り交じっているため Nehalem 世代でコンパイルしたバイナリを Haswell 上で実行すると「このハードは AVX2 対応[^avx2]なのでそれ用のバイナリ使ったほうがいいっすよ」という警告が出たりしました。

なので、アーキテクチャに直接触りそうなプログラム（CUDA とか）は /usr/local に置かず、各ノードでコンパイルしたものを使ったほうがいいと思います。

[^avx2]: Haswell から導入された拡張命令セット。
Swiftがオープンソース化されたので標準ライブラリにメソッド追加してみる

先日、ついにSwiftがオープンソース化されました。
早速Macに入れて遊んでみたのでその事を書いてみようと思います。

## 今回やった事
配列にuniq()というメソッドを追加してみました。
[1, 2, 3, 1]と言った配列を[1, 2, 3]にしてくれます。

## 追加手順
### Swiftのインストール
インストールはこちらの記事を参考にさせて頂きました。

[オープンソースになったSwiftをビルドしてみる](http://qiita.com/shu223/items/99b5ecc0ac5af2566c9c)

下コマンドでインストールできました。
元記事にはなかったのですが、cmakeが必要と言われたのでいれました。

```
git clone git@github.com:apple/swift.git swift
git clone git@github.com:apple/swift-clang.git clang
git clone git@github.com:apple/swift-llvm.git llvm
git clone git@github.com:martine/ninja.git

brew install cmake

swift/utils/build-script # 1時間くらいかかる
```

### Swiftを動かしてみる
buildフォルダ以下にSwiftがあるのでそれを実行してみます。

```
build/Ninja-DebugAssert/swift-macosx-x86_64/bin/swift 
```

これでコマンドラインで動かす事ができました。

![20151204234205.png](https://qiita-image-store.s3.amazonaws.com/0/61598/760d3442-0893-9636-5fc6-8f755408de02.png)

### 配列にuniq()メソッドを追加する
swift/stdlib/public/core/Sequence.swiftファイルを開いて以下の処理をどこかに追加します。
SequenceTypeとは配列が実装しているプロトコルで、filter/map等の有名なメソッドはこのプロトコルにメソッドがあります。

```swift
extension SequenceType where Generator.Element : Equatable {
  @warn_unused_result
  public func uniq() -> [Generator.Element] {
    return reduce(Array<Generator.Element>()) { (arr, element) -> [Generator.Element] in
      if arr.contains({ $0 == element }) { return arr }

      var newArr = arr
      newArr.append(element)
      return newArr
    }
  }
}
```

再度ビルドします。
差分だけビルドするので10分程で終わります。

```
swift/utils/build-script
```

Swiftを起動し直すとuniqメソッドが動くようになりました。

```
build/Ninja-DebugAssert/swift-macosx-x86_64/bin/swift 
```

![スクリーンショット 2015-12-05 14.27.52.png](https://qiita-image-store.s3.amazonaws.com/0/61598/23116453-1012-82ce-7290-bc482ba24377.png)
ATOMのSencha用パッケージを作る1


この記事は [Sencha Advent Calendar 2015](http://www.adventar.org/calendars/1041) 5日目の記事です。

--

Senchaを使っての開発をするにあたり、どのエディターを使ってますか？
僕の周りではVimかSublimeTextあたりが多かったのですが、最近はJetBrains プラグインが出たおかげでPHPStormに変えている方もいらっしゃいます（JetBrainsプラグインについては[@martini3ozさんの記事](http://extjs.sunvisor.net/872)で紹介されています）。

そんななか僕はATOMを使っています。
まだまだ発展途上感はありますが、将来性に期待して。。

ところがATOMにはSenchaのパッケージが一切ありません（探し方が悪いだけだったらすみません）。
ないなら作ろうというわけで、これから何回かにわけてパッケージを作っていきたいと思います。
微妙にSenchaの話題からずれてしまうような気もしますが、
パッケージを作る過程でクラスシステムとかは避けて通れないでしょうし、それでなんとか。。。



ATOMのパッケージはCoffeeScriptで作られるのですが、
CoffeeScriptを書くのも、パッケージを作るのも初めてのことなので、
拙い部分は多いと思いますが、ご容赦ください。
うまくできたら公開するかも。

## 要件定義

自分がSenchaでの開発をするにあたってほしい機能を入れたいと思います。

+ コード補完
+ SenchaCmdの実行
+ コードジャンプ

ひとまずこんなところかな。

対象バージョンは

+ ExtJS5
+ ExtJS6

としておきます。


## パッケージの作成

### 雛形の作成

ATOMのパッケージは、
*Packages > Package Generator > Create Atom Package*
を実行すると雛形を作成することができます。

![tree1.png](https://qiita-image-store.s3.amazonaws.com/0/30646/55bc0bdc-2ba8-baab-443a-f6a487dd71c1.png "tree1.png")

## Snippetの作成

Snippetは、snippetsというディレクトリを作り、
jsonもしくはcson形式で記述します。

![tree3.png](https://qiita-image-store.s3.amazonaws.com/0/30646/b89aeb69-290e-1ae0-d1dc-17dc981aa131.png "tree3.png")


とりあえず試しにひとつ作ってみます。


``` sencha.cson

'.source.js':
    'define':
        'prefix' : 'define'
        'body': """
        /**
         * @class ${1:className}
         * @extend ${2:extendClassName}
         * @description
         */
        Ext.define('${1:className}', {

            // {{{ extend

            extend: '${2:extendClassName}',

            // }}}
            // {{{ requires

            requires: [
            	${3:}
            ]

            // }}}

        });
        """

```


![define.gif](https://qiita-image-store.s3.amazonaws.com/0/30646/e2440567-a8e3-13c4-a129-8d1a1daa4ba3.gif "define.gif")


動いた動いた。まぁSninppetについては順次必要なもの追加していきます。

---

短いですが今回はここまでで。。次回に続きます。

PS. パッケージの修正反映させるのにATOMを再起動する以外の方法ご存知の方いたら教えてください。。

--
コメントは将来の自分へのメッセージ

# 背景
先日先輩から「お前のコメントで解決って書いてあるんだけど、これどうやってやるの？」という問い合わせがあり、1年前ってこともあり全然思い出せない悲しみを味わった。。。


# 思ったこと
過去の俺どうやって解決したんだ！！！！！！！！
どうやってもそのconfigファイル書かないと動かないぞ？？？
過去の俺はどうやってそのconfigファイル書かないで動かしたんだ！！！！！
あん時めんどくさがらずにコメントちゃんと書いておけばよかったorz

# 今回のことでの教訓
結構前からお前のコメントは簡略化しすぎと指摘を受けていた。
自分でもそれなりにその言葉を理解し長くならない程度でコメントを書いていたつもりだった。
これからはredmineのコメントなどは少なくとも記憶喪失になった自分が将来見てもわかるように書こうと思った。

### 今回の失敗の原因
解決と書いてあって、解決した理由は過去の自分曰くそのconfigファイルを使わないことだったらしい。
しかし！
そのconfigファイルを使わないでどうやって動かしていたのかが全く書いていない！
過去の俺どうやってこの問題解決したの？？？
今となっては誰もわからずorz

普段からコメントを書くことについて軽視していた傾向があった。
どうせこのタスク終わったら誰も見ないでしょという油断。。。

### 今回のことを生かして
これからは以下のことに注意してコメントを書いていこうと思う。

- 誰と
- どんなやり取りがあったか
- 対策
- やり方

コメントを書くときは将来の自分へ向けて
「お前こんなことやってたぜ！」っていう気持ちで書こうと思う。
ubilinux - edisonをアクセスポイント化しよう その2

※ [**ubilinux - edisonをアクセスポイント化しよう その1**](http://qiita.com/musubi05/items/4d28ec60d0ba4cdea00c "その1")の続き
# Overview
* ユーザが固定IPアドレス設定なしにedisonへ接続できるようにする．
* edisonをdhcpサーバ化する．

その1では，edisonをアクセスポイント化することには成功しましたが，ユーザが固定IPアドレスを設定する必要がありました．
本稿では，edisonをdhcpサーバ化させ，edisonに接続した端末に対し自動でIPアドレスを振れるようにします．

# Step 1 : **hostapd用の**udhcpdの設定をする
ubilinuxには，あらかじめudhcpdという軽量なdhcpサーバがインストールされてます．
今回はこのアプリケーションを使用して，edisonをdhcpサーバ化します．

ここで重要なのが，**hostapd用の**udhcpdを設定することです．
実はhostapdを立ち上げた段階で，**2つ**udhcpdが立ち上がっています．

```shell-session
# ps aux | grep -i udhcp
root      1880  0.0  0.0   2576   596 ?        Ss   14:53   0:00 /usr/sbin/udhcpd -S
root      1993  0.0  0.0   2576   608 ?        Ss   14:53   0:00 udhcpd -S /etc/hostapd/udhcpd-for-hostapd.conf
root      2066  0.0  0.0   2100   672 ttyMFD2  S+   15:04   0:00 grep -i udhcp
```

1つ目の`/usr/sbin/udhcpd`は，いわゆる標準のudhcpdです．
こちらはデフォルトで**usb0**上で動いています．
2つ目の`udhcpd -S /etc/hostapd/udhcpd-for-hostapd.conf`は，hostapdが立ち上げた（であろう）udhcpdです．
こちらはデフォルトで**wlan0**上で動いています．
今回は2つ目のudhcpdの設定を変更していくことにします．


さて，ここからudhcpdの設定を変更していきます．
まず，初期設定ファイルのバックアップを一応とっておきます．
`mv /etc/hostapd/udhcpd-for-hostapd.conf /etc/hostapd/udhcpd-for-hostapd.conf.org`

次に，udhcpdの設定を行います．
※/etc/network/interfacesの設定と矛盾がないようにします．

    - 各種アドレスのネットワーク部が間違ってないか．
    - サブネットマスクが一致しているか．
    - routerのアドレスが自固定IPアドレスと一致するか．
```sh:/etc/hostapd/udhcpd-for-hostapd.conf
start	192.168.42.100
end	192.168.42.199

interface wlan0

option  subnet  255.255.255.0
opt     router  192.168.42.1
option  domain  edison-local
option  lease   864000
```

# Step 2 : ubilinuxの再起動
設定完了後，ubilinuxを再起動します．
（サービスの再起動では，標準のudhcpdが再起動するだけですので，OSごと立ち上げなおします．）
`# reboot`

再起動完了後，アクセスポイントに接続すると，自動的にIPアドレスが振られるようになります．
![connected.png](https://qiita-image-store.s3.amazonaws.com/0/81808/cd5cf97f-74c8-02d6-c0db-6d7783492a9f.png)

# メモ
* 当初isc-dhcp-serverを使用しようとしていました．しかしubilinux起動時，isc-dhcp-serverのサービス立ち上げにこけてしまうことがわかり（ログイン後に手動で立ち上げるとうまくいきます），udhcpdを使用することにしました．
* 途中までhostapd用のudhcpdが自動で立ち上がっていることに気付かず，標準のudhcpdの設定ファイル（/etc/udhcpd.conf）をいじっていました．標準，hostapd用，2つのudhcpdで同じインターフェース上(wlan0)を使用しようとしていたため，もちろんうまく動きませんでした．

# 参照
[1] http://blog.ws9.org/?page_id=1000
yumでphp7.0をCentOS6.7にインストール


先日PHP7.0.0GA版がリリースされたのでインストールしてみた。

php7.0での変更点は公式で。
[PHP 5.6.x から PHP 7.0.x への移行](http://php.net/manual/ja/migration70.php)

qiitaだとこの記事によくまとまっている。
[PHP 7 リリース内容の確認](http://qiita.com/ken880guchi/items/1d6478f8f11bc5b6ea2c)



vagrantでbento/centos-6.7を立ち上げて実験。
それにかんしては[ドットインストール](http://dotinstall.com/lessons/basic_localdev_mac)でも参考にしてください。

## インストール

```shell
sudo yum -y install epel-release
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6*.rpm
sudo yum -y install  --enablerepo=remi --enablerepo=remi-php70 php
```

最低限ならこれだけです。
## 実行結果

```shell
php -v
PHP 7.0.0 (cli) (built: Dec  3 2015 18:05:30) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
```
djangoアプリ内でプロファイルをさくっと見る

なにかひとかたまりの手続きを実装した際には、テストを書くだけでなくプロファイルもちょっと見ておくのは良い習慣だと思います。早すぎる最適化はよくありませんが、ちょっとしたボトルネックをパフォーマンス問題が顕在化する前に認識だけしておくのは「いつでもチューニングできる」という心の余裕になります。

```python
# coding:utf-8

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

import django
django.setup()


if __name__ == "__main__":
    """
    $ cd /path/to/project
    $ python -m project.profile
    """
    import cProfile
    import pstats

    # プロファイルが見たい関数 
    from app.models import func_to_profile

    prf = cProfile.Profile()
    prf.runcall(func_to_profile)
    pstats.Stats(prf
        ).sort_stats('time'  # 内部時間 重い順にsort
        ).print_stats(.03)   # 上位3%だけ表示
```

結果表示はこんな感じ

```python
$ python -m project.profile
         9109096 function calls (8991335 primitive calls) in 8.224 seconds

   Ordered by: internal time
   List reduced from 463 to 14 due to restriction <0.03>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   125620    0.723    0.000    0.723    0.000 /path/to/django/utils/dateparse.py:107(<dictcomp>)
    62810    0.631    0.000    0.805    0.000 /path/to/django/db/models/base.py:388(__init__)
   125620    0.435    0.000    1.702    0.000 /path/to/django/utils/dateparse.py:84(parse_datetime)
   265490    0.395    0.000    0.640    0.000 /path/to/django/db/models/fields/related.py:1619(local_related_fields)
      670    0.339    0.001    3.027    0.005 {method 'fetchmany' of 'sqlite3.Cursor' objects}
   125620    0.292    0.000    2.242    0.000 /path/to/django/db/backends/sqlite3/utils.py:6(parse_datetime_with_timezone_support)
   279460    0.291    0.000    0.474    0.000 /path/to/django/db/models/fields/related.py:1633(get_instance_value_for_fields)
   265490    0.205    0.000    1.209    0.000 /path/to/django/db/models/fields/related.py:1627(get_local_related_value)
   549522    0.199    0.000    0.199    0.000 {hasattr}
   127330    0.198    0.000    0.198    0.000 {method 'match' of '_sre.SRE_Pattern' objects}
672800/561660    0.194    0.000    0.423    0.000 {setattr}
   127330    0.175    0.000    0.175    0.000 {method 'groupdict' of '_sre.SRE_Match' objects}
    55570    0.157    0.000    0.263    0.000 /path/to/django/db/models/fields/related.py:615(__set__)
   376960    0.154    0.000    0.254    0.000 /path/to/django/db/models/fields/related.py:1609(related_fields)(app)


```

結果を見たところだとsqliteのデータを`datetime`にパースするところが大変なようです。
いざというときにはパースするカラムを絞るなどの対処が可能なことがわかります。