OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonの内包表記（リストとジェネレータ式について）【追記あり】

## はじめに
Pythonの内包表記は、Python独特の書き方として有名（？）だと思います。
今回は、そんな内包表記の基本的な部分についてまとめていきます。
具体的には、リスト内包表記、ジェネレータ式についてです。

## リスト内包表記
リスト内包表記は特に有名かと思います。

```py3:
print([i for i in range(0, 10)])
```
たったこれだけで0から9までの数字が格納されたリストが出力されます。

```py3
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```
とても簡単に作れちゃいますね。
もちろん、もっと色々なことが可能です。

```py3:
print('¥n'.join(['FizzBuzz' if i%15 == 0 else
                 'Fizz' if i%3 == 0 else
                 'Buzz' if i%5 == 0 else
                 str(i) for i in range(1, 101)]))
```
これはFizzBuzzですね。新しい言語を勉強し始めたら最初にやるやつ。
1から100までの数字を順に表示していき、3の倍数ならFizz、5の倍数ならBuzz、3の倍数かつ5の倍数ならFizzBuzzを数字の代わりに表示するものです。
ちなみに実行すると、1から100までを一つひとつ改行して表示します。
'¥n'.joinの部分がそれにあたりますね。

というか、自分で書いておいていうのも何ですが、かなり強引なコードですね……。
これはですね、次にもっと良い書き方を紹介するので、あえてこんな感じで書いています。
それでは次に行きましょう。

## ジェネレータ式
ジェネレータ式……難しそうな言葉が登場しましたね……。
ジェネレータ式が何なのかを詳しく説明するには、ジェネレータとは何かを説明しなければならず、さらにジェネラータを説明するためにはイテレータについて説明しなければならなず、さらにイテレータを説明すｑｓうぇｄｒｆｔｇｙふじこｌｐ；＠：（今度別の記事として投稿するかもです）

簡単に言うと、括弧内でさっと関数をつくってさっと使えちゃう便利なやつです。

```py3:
print(i for i in range(0,10))
```
さっきのリスト内包表記とほぼ同じように感じますね。
違いは[ ]がないことですね。
この時、一体どのようにして出力されるのでしょうか？

```py3
<generator object <genexpr> at 0x10d747b48>
```
出力はこちら。
さっきのリストとは全然違いますね！
これでは意味が全くわかりませんので、内包表記で書くときは[ ]を忘れないようにしてくださいね。

しかしながら、このジェネレータ式が便利な時も結構多いのです。

```py3
print('¥n'.join((i%3 == 0)*'Fizz' + (i%5 == 0)*'Buzz' or str(i) for i in range(1, 101)))
```
はい。一行の情報量がかなり多い気がしますが、一行で何かのコードが書かれましたね。
お察しの通り、これはFizzBuzzです。
出力も、先ほどと全く同じ形式で出力されます。

こんな書き方、リスト内包表記ではできませんね！（ですよね？）
リスト内包表記の上のコードでも無理やり1行にできますが……見にくいのは嫌ですよね。
（リスト内包表記もジェネレータ式も80文字超えちゃうので実際には改行が必要です）

## 感想
今回は2種類のみの紹介になりましたが、これだけもかなり色々できそうですよね！
何より内包表記を使うとPythonicなコードっぽくて好きです。
あとは、ジェネレータ式が使えそうなところは積極的に使ったほうがいいと思います。リスト内包表記だといちいちリスト作っちゃうので。

以上です。

## 追記（2015/12/2）

> ```py3
> print('¥n'.join((i%3 == 0)*'Fizz' + (i%5 == 0)*'Buzz' or str(i) for i in range(1, 101)))
> ```
> こんな書き方、リスト内包表記ではできませんね！（ですよね？）

申し訳ありません、できます。

```py3
print('¥n'.join([(i%3 == 0)*'Fizz' + (i%5 == 0)*'Buzz' or str(i) for i in range(1, 101)]))
```

これでも全く同じ出力が得られます。

ここ間違えちゃいけないだろってところを盛大に間違えてしまい、この記事の目的が完全に失われたような気さえしますね……。
以後気をつけます。
tableの左上の斜め線を書く

# 左上の斜め線？
表の上のタイトルと、左のタイトルそれぞれに対しての見出しのようなものをつけたいことはまぁなくはないと思います。

こういう感じの。
![スクリーンショット 2015-12-02 1.16.01.png](https://qiita-image-store.s3.amazonaws.com/0/28309/c87ca545-653c-1106-96e4-dadf1a4e0b2a.png)
（http://www.aslive.biz/blog/747/ からキャプチャさせてもらいました）

# やってみたcodepen
http://codepen.io/eedamame/pen/QjqPbG
以下、やった内容です。

# svg
斜め線を引きたいセルにsvgを入れてそのセルの高さ／幅いっぱいに線を引くように調整します。
斜め線は背景画像的に、position: absolute;で入れる。

## preserveAspectRatio
preserveAspectRatio=“none" で領域を埋めるような感じになるので、縦長／横長に変形してもよしなに調整してくれるみたい。
https://developer.mozilla.org/ja/docs/Web/SVG/Attribute/preserveAspectRatio

## svgタグの viewBox、path
viewBoxはviewportのようなもの。pathのdは線を引く座標だからここは合わせます。
サンプルでは、viewBoxは”0 0 100 100"、pathタグdは”M0,0 l100,100"としています。
100のところは、10000とかで揃えても斜めの線は問題なく引ける。
ただ、現実のpxサイズと違いすぎると、1pxの線のつもりで指定した
`stroke-width="1”` が細くなりすぎたり太くなったりするので、注意。
https://developer.mozilla.org/ja/docs/Web/SVG/Attribute/viewBox

## その他、table cell内で、高さが100%になるように調整
この辺
http://qiita.com/tomato360/items/28ca94ac42e5445e2d0a

# はまったところ
## IEで表示されない／高さが足りない
heightを明示してあげるか、別途セルにコンテンツが入っていないと斜め線が表示されなかった。
heightを明示すると、レスポンシブ的な対応にならないので、 `&nbsp;` を入れて1文字分の高さを確保すればその高さの分は表示される。

サンプルのように、斜め線が入るセルの高さが、列の中で一番高い場合は特に問題ないけど、そうでない場合は、paddingとかで微調整する必要があるかも...

# その他
実際はウェブアプリ内での実装で、ある程度利用者が特定できたので
まぁこれくらいで良いかなという感じだったんですが、
こうすればセマンティクス的に良いとかあれば教えていただきたいです。
就活でMATLABを使おう

　皆さん，MATLABしてますか？？研究で趣味で，MATLABはとっても良いツールですよね！ ~~変数のインデックスが1から始まるところ以外は．~~ 

　こんなに素晴らしいMATLABは，就活にだって存分にその能力を発揮できちゃうんです！
　実際に，私の就活のときに役に立った例をご紹介します．

# 問題例
　以下に示すのは，あるテーマパークの来場者数と飲料の販売量に関するデータである．7月における飲料の販売量を概算せよ．

||来場者数 [千人]|最高気温 [度]|最低気温 [度]|飲料の販売量 [l]|
|:--:|--:|--:|--:|--:|
|4月|402|23.8|6.3|260.5|
|5月|492|31.6|11.2|325|
|6月|286|33.0|17.7|225.5|
|7月|195|35.6|20.1|?|
（上記のデータは架空のものです）

　どこの会社の就活だったかは忘れました．
　ただ，世界にその名を轟かせる超大企業のどこかだったと思います．
　この会社は，こんな問題をバンバン出して来て，MATLABで解いてもギリギリの時間配分でした．とても手計算じゃ間に合わない．むしろこうすることで，計算ツールを使いこなせる人間だけを抽出しようとしている可能性があると感じました．

# 解き方
　テキトーに仮説を立て，方程式を作ります．
　今回は，飲料の販売量が来場者と最高気温と最低気温の関数になっているという仮説を立て，来場者をx，最高気温をy，最低気温をz，飲料の販売量をkとして， **ax+by+cz=k** と方程式を作りました．4月の場合をあてはめると， **402a + 23.8b + 6.3c = 260.5** になります．ここで，明らかになっている4,5,6月の販売データから，a,b,cの係数を算出できれば，7月の飲料の販売量も算出できるはずです．
　さて，4,5,6月の方程式を並べると，以下の行列式ができます．
![eq1](https://pbs.twimg.com/media/CVLOhTbVAAACswi.png)

　線形代数でやったような気がしますね．左端の大きな行列をA，abcの行列をx，右端の行列をbと置くと， **Ax=b**となり，xを求める場合には，両辺に **A^-1** を前からかけて， **A^-1 Ax = A^-1 b** として， **x = A^-1 b** とすることで，Aの逆行列とbのかけ算の形にして解くんでした．
![eq2](https://pbs.twimg.com/media/CVLOhVJUEAEKHIg.png)

# MATLABによる回答例
　まず，以下のようにAとbの行列を入力します．

```txt:MATLAB.in1
>> A = [[402 23.8 6.3];[492 31.6 11.2];[286 33.0 17.7]]

A =
  402.0000   23.8000    6.3000
  492.0000   31.6000   11.2000
  286.0000   33.0000   17.7000

>> b = [260.5;325;225.5;231.5]

b =
  260.5000
  325.0000
  225.5000
```

　そして， **x = A^-1 b** は， A\bと入力します．すると，a,b,cに対応した係数が計算できます．

```txt:MATLAB.in2
>> A\b

ans =
    0.5000
    2.5000
    0.0000
```

　計算結果は以上のようになり，来場者数の0.5倍と最高気温の2.5倍と関係した係数が算出されました．結果によると，最低気温については，飲料の販売数とは全く関係しないということが分かりました．この係数を使用すると，7月の飲料の販売数は， **195*0.5 + 35.6*2.5 + 20.1*0.0** で，186.5と試算できます．
Chef 12.5.1 localmode + Windows 2012R2で困った


- どうなのよ
 
windowsはrwinrmだとlocalmodeに対応してなさそう?
 
https://github.com/chef/chef-provisioning/pull/337

SSH Port Foward対応してなきゃ動かないよな..と今頃気づいた


- 対策

Windowsにssh入れたくないし、CodeDeployなどでターゲットにcookbookばらまいてchef-client -zすりゃよさそう

- 環境

workstation: Mac OSX
target client: Windows 2012R2(Standard Edition)
Chef: 12.5.1
ChefDK: 0.10.0

- コマンド

```
orenomac$ knife bootstrap windows winrm 52.68.56.199 -N 52.68.56.199 -P 'hoge'  -z -VV --winrm-transport plaintext --node-ssl-verify-mode none --no-node-verify-api-cert false
```

- 実行結果

```
..省略..
52.68.56.199 C:\Users\Administrator>chef-client -c c:/chef/client.rb -j c:/chef/first-boot.json
52.68.56.199 [2015-12-01T17:26:30+00:00] INFO: *** Chef 12.5.1 ***
52.68.56.199 [2015-12-01T17:26:30+00:00] INFO: Chef-client pid: 1540
52.68.56.199
52.68.56.199
52.68.56.199 ================================================================================
52.68.56.199 Chef encountered an error attempting to load the node data for "52.68.56.199"
52.68.56.199 ================================================================================
52.68.56.199
52.68.56.199 Unexpected Error:
52.68.56.199 -----------------
52.68.56.199 ChefZero::ServerNotFound: No socketless chef-zero server on given port 8889
52.68.56.199
52.68.56.199 [2015-12-01T17:27:01+00:00] ERROR: Running exception handlers
52.68.56.199 [2015-12-01T17:27:01+00:00] ERROR: Exception handlers complete
52.68.56.199 [2015-12-01T17:27:01+00:00] FATAL: Stacktrace dumped to c:/chef/cache/chef-stacktrace.out
52.68.56.199 [2015-12-01T17:27:01+00:00] FATAL: ChefZero::ServerNotFound: No socketless chef-zero server on given port 8889
DEBUG: 52.68.56.199[8D79F342-BF1B-4ABD-8BA4-B09C2521C066] => :command_cleanup[cmd.exe /C "%TEMP%\bootstrap-47360-1448990760.bat"]
DEBUG: 52.68.56.199[8D79F342-BF1B-4ABD-8BA4-B09C2521C066] => :shell_close
ERROR: Failed to execute command on 52.68.56.199 return code 1
```
amazonの在庫情報をslackに投稿する


amazonに「○○個在庫あり」のような情報が出ている場合下記のような感じで、雑に在庫情報を取得することができます。

```
#!/bin/bash
​
RAW_DATA=`curl http://www.amazon.co.jp/XXXXXX | grep 在庫あり`
SLACK_URL=https://hooks.slack.com/services/XXXXXXXXXXX

## 必要な部分のみを切り出す​
IFS='>'
set -- ${RAW_DATA}
TMP=$2
IFS='<'
set -- ${TMP}
NUM_CURRENT=$1

## 投稿する​
MSG="在庫は残り"${NUM_CURRENT}"です"
CONTENT='payload={"channel": "#hoge", "username": "bot", "text": "'${MSG}'", "icon_emoji": ":fuga:"}'
curl -X POST --data-urlencode ${CONTENT} ${SLACK_URL}
​
​```
PHPでSQLiteのID欠番を寄せて連番に直す方法。

```php
<?php
  $db = new SQLite3("[データベースファイル名]");
  $table = "[テーブル名]";
  $query = "SELECT * FROM $table";
  $result = $db->query($query);
  $new_id = 1;
  while ($row = $result->fetchArray()) {
    $id = $row["id"];
    if ($new_id !== $id){
      echo "$new_id : $id \n";
      $query= "UPDATE $table SET id = $new_id WHERE id = $id";
      $result1 = $db->query($query);
    }
    $new_id += 1;
  }
```
FileMakerを仕事で使うならライセンス購入(年払い)で

[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の2日目

# FileMakerの購入方法
FileMakerを購入方法として

- パッケージ版
- ライセンス版(永続ライセンス)
- ライセンス版(年払いライセンス)

があります

## パッケージ版
店舗やネット通販でFileMakerのパッケージを購入する
ソフトウェアとしては一般的
購入したものは使い続けられる(バージョンアップは所有者の意思で任意)
現在購入できるのはFileMakerProのみ(バージョン12まではFileMakerServerにもパッケージ版があった)

## ライセンス版(永続ライセンス)
FileMaker社と直接契約して購入する(取り扱っている代理店もあります)
法人が購入するソフトウェアとしてはメジャー
ある程度纏まった本数(FileMakerPro：5ライセンス、FileMakerServer：1ライセンス)の購入が必要
購入したものは使い続けられる(バージョンアップは所有者の意思で任意)

## ライセンス版(年払いライセンス)
ここ1-2年くらいで一気にメジャーになってきた購入方法
期間ごと(FileMakerの場合1年)に支払いをする
支払い続ける限り**最新版**の提供が受けられ、それを使用することができる
3年使えば購入するのと同じ位の費用感
→パッケージ版、ライセンス版(永続ライセンス)の3分の1くらいの価格

# どの形で購入するのがお得なのか？
- 個人で購入する場合は**パッケージ版**しかない(5本纏めて購入するようなお大尽は除く)
- FileMakerServerはライセンス版しか購入できなくなった(但し1本から購入可)
- 組織として購入するなら**ライセンス版(年払いライセンス)**

# なぜ組織として購入するならライセンス版(年払いライセンス)なのか
組織におけるFileMaker絡みのお手伝いをさせていただいていると、購入時に永続的なライセンスを選択しがちです
特に購入にあたって稟申が必要な組織では**継続的に費用が発生する**年払いライセンスを好まない傾向にあるような気がします

# ずっと使えることが負債になることも
パッケージ版、ライセンス版(永続ライセンス)は購入すれば、ずっと使えます
使えるんですが、**バージョンアップの予算がなかなか付かず取り残されてしまう可能性**があります
2世代以前のバージョンはバージョンアップ権が失効してしまうこともあるので、特に組織として購入する場合は継続使用していくためのコストも勘案して購入計画を立てましょう
Apache Sparkを勉強して分散処理できますよ！って言えるようになる


# はじめに
そろそろ俺も分散処理かな、と常々考えていたのでこの機会（アドベントカレンダー）にApache Sparkを勉強して、分散処理を始めてみたいと思います。


全４回くらいに分散して進めていきますのでどうぞよろしくおねがいします。

# 1. お勉強とインストール

## Apache Sparkとは

- 大規模データを分散処理をオンメモリで実現するプラットフォーム
- **高速** かつ **汎用的** であることを目標に設計されている
- UC Berkekeyで開発され、今はApacheのトップレベルプロジェクトになっている
- `scala`, `python`, `java`, `SQL`のシンプルなAPIを提供している


## そもそも分散処理とは

- ある計算処理をネットワーク接続された複数のコンピュータを用いて同時並列で処理すること
- ビッグデータを扱う際に、処理時間を短縮するための手法のひとつ
- 安価なサーバを複数台用意して処理を割り振れるので、費用を抑えることが可能
− ただし、複雑なプログラミングが必要になる


## 他の分散処理手法

### MapReduce

- Googleが2004年に発表した独自の分散処理フレームワーク
- Webサイトの文字列検索や、特定のワードを含むページのリスト作成などに使用
- 2004年当時で3PB/monthのデータを処理していた


### Hadoop

- Mapreduceの技術理論に、他にゴニョゴニョ付け加えてオープンソース化したもの
- 分散処理を簡単に実装することが可能にした
- いま一番使われてる分散処理基盤（多分


## HadoopとSparkの違い
- hadoopはデスクIOを並列化してスループットを高める仕組み
- そのためIOコストの高い繰り返し処理に弱い
- リアルタイムでインタラクティブな解析をしたい

このようなニーズの中で、オンメモリでより高速、繰り返し処理などに適したSparkが開発されました[参考](http://spark.apache.org/talks/overview.pdf)


## HadoopとSparkのすみ分け
- メモリに載りきるサイズのデータ量を比較的早く処理したいときはSparkが適している
- それ以上のデータ量で、永続化しつつちょろっとだけ処理したいときはHadoopが適している
- Hadoopで大雑把に処理したものを、ドリルダウンしてSparkで処理などの共存が一番いい使い方かも？？
- ちなみにデータを保持しない分散処理基盤のStormというものもある（これはまた別の機会に勉強したい

## Sparkのインストール to Mac

### ダウンロード
- [ダウンロードページ](http://spark.apache.org/downloads.html)にアクセス
- 赤枠部分の選択肢を変更して、4のダウンロードリンクをクリック

![スクリーンショット 2015-12-02 1.39.33.png](https://qiita-image-store.s3.amazonaws.com/0/18932/e0138309-a617-c967-9343-fcbd2a165c6c.png "スクリーンショット 2015-12-02 1.39.33.png")

- 解凍する

```
$ tar xzf /download/path/spark-1.5.2.tgz
```

- ファイルを移す
 
```
$ mv /download/path/spark-1.5.2 /usr/local/share/spark
```

- 移動して、起動する

```
$ cd /usr/local/share/spark
$ bin/spark-shell
```

- こんな画面が出たら起動完了

```
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.5.2
      /_/
```

上記だと、`scala`の起動方法だと`scala`で書くことになります。
僕は`python`で書きたいので、

```
$ bbin/pyspark
```

を使用します。


### 簡単なテストをしてみる
とりあえずローカル環境で教科書通りに叩いてみた

#### `README.md`ファイルをSparkのコレクション（RDD）を作成する

```
>>> lines = sc.textFile("README.md")
```

`sc`とはSparkのメイン関数に接続するためのオブジェクトで、`SparkContext`のことらしいです。

```
>>> sc
<pyspark.context.SparkContext object at 0x1011f5b90>
```

Spark上での操作はこの`sc`を通して行われます。
`.textFile`は外部データをインプットして、`RDD`を生成するメソッドです。


### 行数をカウントしてみる
```
>>> lines.count()
98
```

### 一行目を取得してみる
```
>>> lines.first()
u'# Apache Spark'
```

- 特定の文字（Python）を含むRDDを抽出して新たにRDDを作成する

```
pythonlines = lines.filter(lambda line: "Python" in line)
```

- そのRDDの抽出がちゃんとできているか確認する

```
>>> pythonlines.first()
u'high-level APIs in Scala, Java, Python, and R, and an optimized engine that'
```

- データを永続化させる

```
>>> pythonlines.persist()
```


### Spark上での処理のサイクル
上記を１サイクルと考えると、

1. 外部のデータを入力してRDDを生成。
2. `filter`などを用いてほしい形に整形したRDDを生成
3. `count()`などを用いて出力
4. 再利用したいデータは`persist()`で永続化
5. 繰り返し

のようにして利用することになりそうです。

Sparkはサーバを増やした状態で上記の様に実行したら勝手に並列処理にしてくれるそうです。簡単！！

### おわり
とりあえず、インストール、起動、叩き方、基本的な流れは何となくわかったので次はもっと突っ込んだ使い方に挑戦してみます！！
Charlesで他社アプリの通信を覗く

この記事は[Speee Advent Calendar](http://qiita.com/advent-calendar/2015/speee) 2日目の記事です。
前日の記事はこちら [Ruby力を高めるためには標準メソッドを学べ（Enumerable編）](http://qiita.com/suthio/items/4753d9589db95d63bc44)

実機のiPhoneで動いているアプリの通信をキャプチャする方法。

自分でアプリを作るときに、他社のアプリがどんな通信をしてるのか参考にするときに使うやり方です。

iPhoneでのやり方ですが、Androidでもプロキシの設定できれば見れるはず。

## Charles導入

[ここ](https://www.charlesproxy.com/download/)から。

フリートライアル版だと起動時に10秒待たされます。

初回はパスワード入力が必要だった気がする。

## Access Control Settings

Wifi経由でアクセスできるようにする。

`Proxy > Access Control Settings...`

![スクリーンショット 2015-12-02 1.14.55.png](https://qiita-image-store.s3.amazonaws.com/0/51267/594fbe90-52c4-4bde-68c1-847eb8b592fb.png)

`0.0.0.0/0`

これでとりあえず全開に。

あとMacのローカルIPを`ifconfig`とかで確認しておく。

## iPhone側の設定

Wifi設定開く。

![20151202015143.jpg](https://qiita-image-store.s3.amazonaws.com/0/51267/838a3f44-ae4e-8d70-934d-dc66d3b59974.jpeg)

MacのIPとポート8888を指定。

![20151202015158.jpg](https://qiita-image-store.s3.amazonaws.com/0/51267/2816f2c4-c496-c223-ae6e-970dd1d4563f.jpeg)

これでSafariで適当なページ開くとCharlesにベロベロ出てくるはず。

![スクリーンショット 2015-12-02 1.29.36.png](https://qiita-image-store.s3.amazonaws.com/0/51267/c64be709-d2ed-4a21-d75c-0ad3e6bab561.png)

## SSL関連の設定

今のままだとクリアテキストな通信しか中身を覗けないので、https通信の中身も見れるように設定する。

iPhoneのSafariで http://charlesproxy.com/getssl にアクセスする。

設定アプリにリダイレクトされるので、プロファイルをインストールする。

![20151202015213.jpg](https://qiita-image-store.s3.amazonaws.com/0/51267/e7072f55-65f7-d518-6e40-7167e71f360d.jpeg)

Charles側の`Proxy > SSL Proxy Settings...`で`*:*`を追加する。

![スクリーンショット 2015-12-02 1.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/51267/c783020e-714e-b530-96e0-811412d51d88.png)

https通信の中も見れるようになる。

## 試しに

AmazonアプリのAPIはこうなってんだなーみたいな。

![スクリーンショット 2015-12-02 1.45.40.png](https://qiita-image-store.s3.amazonaws.com/0/51267/84eb4f70-eee2-c0a8-f1d8-eec0e8c79d74.png)

## 2017/07/03　追記

どこかのiOSバージョン以降、デフォルトでサードパーティの証明書を信頼しないようになっているようです。(プロファイルをインストールしたあと、手動で信頼設定をする必要がある)

[Unable to use SSL Proxy in Charles 4.0.2 on a remote device with iOS 10.3 beta 2 version. Any workaround available?](https://stackoverflow.com/questions/42157551/unable-to-use-ssl-proxy-in-charles-4-0-2-on-a-remote-device-with-ios-10-3-beta-2)

設定アプリから、`一般` > `情報` > `証明書信頼設定` でCharlesの証明書をONにする必要があるらしいです。

## さいごに

フリートライアル版は連続して30分間しか使えない。一度終了してもう一回起動すればまた30分使える。便利だと思ったらライセンス買おう。

Charlesが閉じたあとはiPhoneのプロキシ設定をオフにしないとそのWifiでネット繋がらなくなるので注意。

Charlesが起動してる間はiCalの同期が失敗しまくったりAppleMusicが調子悪かったりするけどCharles閉じれば直るから無視してオッケー。

明日も僕が書くんでよろしく〜
ジーズアカデミーを受講するにあたって意識したい(したほうがよかった)こと

ジーズアカデミー Advent Calendar 2015 2日目の記事です。

ジーズアカデミーに入学してから、卒業制作を作り始めるまでに個人的にもっと意識しておいたほうがよかったなということを書きます。

<small>転職希望の人にはあまり当てはまらないかもしれません。</small>

## 作りたいプロダクトではなく解決したい課題を意識する
[ジーズアカデミー](http://gsacademy.tokyo/)には(今のところ)2通りの入試があります。
- IQ型
- アイデア型

アイデア型は自分の作りたいプロダクトをプレゼンしてそれで合否が決まるため、アイデア型で入学した人は最初から作りたいプロダクトが明確にあります。
私はIQ型で入りましたが、うっすらぼんやりと作りたいものはいくつかありました。入試のプロフィールだったかにそういうものを書く欄があったような気がするので、全員捻り出せば何か出てくる程度には作りたいものはあると思います。

断言してもいいですが、それは**99%以上の人が実現できません**。

足りない言葉を補足しておくと、「作りたいプロダクト」を「卒業制作までの期間内」に「そのままの形」で完成させることはできないということです。

でも、私はそれでいいと思います。
特にアイデア型で入学した人は、入試でプレゼンしたものをそのまま作らなければいけないんだろうかと悩むこともあるようですが、言ったことを翻す面の皮の厚さも必要です(笑)
ちゃんと理由があれば、政治家と違ってそれが致命的になることもない(はず)です。
卒業制作なんて、その後やりたいことの通過点・区切りでしかないのですから、必要以上にそこに縛られないほうがいいです。

ただし、自分の作るプロダクトで解決したい課題は早いうちに明確にしてブレないようにしておいたほうがいいと思います。
そうでないと卒業制作期間に入ってから右往左往することになります。私のように……

## 自分で限界を決めない
ジーズアカデミーでは、毎回授業の後に課題が出ます。
この課題は早い人なら授業後のチュータリングタイムに終わってしまうくらいのものです。
ただし、この課題は最低限でその先は青天井、自由です。

全員がただ同じ課題をやっているだけなら差はあまりつきませんが、青天井なのでここでどれだけ挑戦するかで最終的に大きな差がつきます。
「これくらいなら調べてやればできるかな」というレベルではなく、「これやりたいけどできるのかわからない／どうやればいいのか見当もつかない」くらいのレベルに挑戦したほうがいいです。

作りたいプロダクトのある人は、それをどう作ったらいいのかわからないからジーズアカデミーに来るのだと思います。
課題でそういったプチプロダクトに挑戦していくことは、最終的に卒業制作を完成させたり、その後にもっと大きなプロダクトを作る際に活きるはずです。挑戦しないといつまでたっても作れるものを作るだけで、作りたいものを作れるようにはならない気がします。

何を作りたいかから、どういう順番で作っていき、その過程で何を学べばいいか明確に下ろしていける人は来る場所を間違えているので、お金を払う前に別の方法を検討しましょう(笑)

また、最低限の課題をやってしまった後は自由なので、授業で習ったことを使わなくてもいいと思います。
自分の作りたいプロダクトにいらないと思ったら、自分のプロダクトを作り始めてそれを発表してしまえばいいです。

## 知識ではなく技術を身につける
ジーズアカデミーには優秀な講師や(私以外は)優しいチューターが揃っているので、わからないことや自分では解決できなエラーは聞けば教えてもらえます。
長い時間一人で悶々としてるのは時間の無駄なので、周りの受講生やチューター・講師に聞いていいと思います。ただ、そのときに意識して見たいのは出てきた答えではなく、

- 自分がやりたかったことはどのようにググれば答えが見つかったのか
- エラーメッセージのどこに着目するのか
- エラーが出ていなくても意図したのと挙動が異なる場合、どのようにプログラムが動作中の状態を把握するのか

といったところです。

聞いて出てきた答えは知識でしかなく、違う問題に直面したときには役に立ちません。また聞かないと自分では解決できないままです。
でも、問題への対処の仕方を身につけておけば、それは技術(の習得方法？)となって応用がききます。

## (いい意味で)エスカレートする
ジーズアカデミーの課題は青天井です。スタート地点も人それぞれ異なります。
全く0からのスタートの人は進んでいる人を目標に、進んでいる人は後から追いかけてくる人に追いつかれないように、切磋琢磨して周りが引くくらいエスカレートしていけば色んな意味でセカイは変わってるんじゃないかと思います。

## 最後に
色々と偉そうなこと書きましたが、卒業制作迷走中です……
TensorFlowをIntellij IDEAで使う

Intellij IDEAでTensorFlowを扱うまでの設定について記載。

Python2.7が入っている前提です。
pip virtualenvのインストール
```
$ sudo easy_install pip 
$ sudo pip install --upgrade virtualenv
```

virutalenvで環境を作成
```
$ virtualenv --system-site-packages ~/tensorflow
$ cd ~/tensorflow
```

activate
```
$ source bin/activate  # If using bash
$ source bin/activate.csh  # If using csh
```

activateすると表記が以下にかわります
```
(tensorflow)$ 
```

今回はMAC CPU版のみでインストールします
```
(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
```

pythonを立ち上げて
```
$ python
```

以下のコードが実行できれば取り急ぎ、tensorflowが動いています。
```
import tensorflow as tf
hello = tf.constant('HelloWorld')
sess = tf.Session()
print sess.run(hello)
```

ここからIntellij IDEAの設定

File>New Project>Python Moduleを選択

Configure SDKの画面で「+」ボタンを押す

「Pyhton SDK」を選択する

「select interpreter path」の中から、上記で作成した~/tensorflow...を選択する。

SDKとして追加されるのでOKしてfinishまで進む

pythonファイルを作成して先ほどのimport tensorflow〜
のコードを記述する

Run>Runから先ほど作成したファイルを選択

HelloWorldがコンソールに出ればOK


以上
CentOS 7をインストールしてVagrant boxを作る その１

### 開発環境 Advent Calendar 2015

なんかカレンダーに参加してみたかった。
正しいカレンダーだったのかは分からない。
後悔は……ちょっとしている。

## Vagrant boxを作りたい！！

仲間内で開発環境を統一したい！
[Vagrant](http://vagrantup.com/)だ！！
CentOS 7の環境を作りたい！
[vagrantbox.es](http://www.vagrantbox.es/)のCentOS 7のboxはlocaleが日本語どころか英語ですらないぞ？？？
（注記：後ほど[Atlas](https://atlas.hashicorp.com/boxes/search?utf8=%E2%9C%93&sort=&provider=virtualbox&q=centos)の方で見つけました。自分の検索力の弱さよ……）
ないなら作ればいいじゃないですか！！
よーし[CentOS](https://www.centos.org/)ダウンロードしてboxを作ってみよう！！！

インストールしてみた。
いくつかはまった。
Qiitaにメモっとこ。
というのがこの記事を書く動機。

## 注意！！

書いてる人はアマチュアです。参考にする際には十分検証の上ご参考ください。
（言うまでもないとは思うけれども）

この記事は本当にCentOS 7を**インストールするとき**にはまったことだけ書いてます。
まだVagrantに関することは**書いてありません**。
その後のことについてはまた機会と余裕があれば。

## まとめ

* インストールのときに設定できること
    * ローカリゼーション（タイムゾーン・キーボード・言語）
    * ソフトの選択（MinimalとかBasic Web Serverとか）
    * ネットワークの設定
    * rootのパスワード設定
    * アカウント設定
* JISキーボードを使うときはキーボードの設定をしないと混乱する
* ネットワークの設定をしないとyumが使えなくて爆死する

これだけ分かりゃいいやという方。ここまでお読みくださりありがとうございましたm(__)m

## 本文

まず[CentOSのダウンロードページ](https://www.centos.org/download/)からDVD ISOを落としてくる。
3つボタンが並んでいるけど、特に考えがなければDVD ISOでいいそうで。

次に[VirtualBox](https://www.virtualbox.org/)で新規VMを作る。
[Vagrantのマニュアル](https://docs.vagrantup.com/v2/boxes/base.html)を読むとAudioやUSBなどの周辺機器はデフォルトでオフにしておいた方がいいらしい。
設定 > オーディオからオーディオを有効化するのチェックを外し、
設定 > ポート > USBからUSBコントローラを有効化のチェックを外しておく。

おもむろにVMを立ち上げて、落としてきたISOを選択。

> VMの画面からカーソルを抜くのにはデフォルトのMacでは左のコマンドキーを押すことに注意

最初の画面はインストール時の言語選択なので好みの言語を選択。
（たいした英語じゃないので英語を選択）

次の画面でローカリゼーション、ソフト、システムの設定を行う。
DATE & TIMEはAsia/Tokyoを選択。

KEYBOARDはUSだとレイアウトがJISキーボードと違って、Vimでコロンを打てなくって混乱したりする（した）。
Japaneseを加えて優先順位を上げとく。
USキーボードを使う人もいるかもしれないのでUSキーボードは消さないでおく。
確認のために右側のテキストボックスで記号類を正しく入力できるか確認しておくのも良い。

LANGUAGEは日本語にしてもいいのかもしれないけど、
yumのインストールのときとかに一部だけ日本語で気持ち悪いので英語のまま。

SOFTWARE SELECTIONは後でいろいろ追加していけばいいからMinimal Installで。
ちなみに左側のペーンで大まかな用法を選択して、右側のペーンでアドオンを追加できる。
GNOME入れてGUIで使うのでなければ後でyumでパッケージを入れればいいと思う。

INSTALLATION DESTINATIONは一度確認しておく。
たぶんデフォルトで大丈夫。

NETWORK & HOST NAMEはとりあえず一つあるEthernetをONにしておかないと、
ホスト(Mac)経由でネットに接続できなくてyumがリポジトリを引っ張ってこれなくって爆死する（これもやった）。
SSH接続のためにもうちょっと設定した方がいいような気がするけど未検証。
分かったら加筆します。
追記：ここでは特に設定は必要ありませんでした。[その2](http://qiita.com/marmot1123/items/6b690252ef837a5d1cbf)で詳述。

ここまでできたら右下のBegin Installationでインストール開始。

インストールの途中でルートのパスワードを決める。
これも[マニュアル](https://docs.vagrantup.com/v2/boxes/base.html)読んだら`vagrant`にする方がいいらしい。

インストールが終わったら右下のreboot。
これでとりあえず使えるVMができたはず。

ここまで書いてとんでもなく車輪の再発明な気がしてきた。
勉強になったからいいか。
クリスマスまでに続きをやったら続きをカレンダーに載せるかも。

追記：続きを載せました！⇒[その2](http://qiita.com/marmot1123/items/6b690252ef837a5d1cbf)


### 参考

* [Creating a base docs | Vagrantdocs](https://docs.vagrantup.com/v2/boxes/base.html)
Linuxでも__sync_bool_compare_and_swap_16がしたい！

# __sync_bool_compare_and_swap #とは
Cで計算結果をAtomicに代入したいとき、gccには`__sync_bool_compare_and_swap`という組み込み命令が用意されている。この関数の存在意義については説明しない（ググって）。

`__sync_bool_compare_and_swap(ptr, cmp, swp)`は第一引数で与えたポインタ(`ptr`)の先が`cmp`と等価なら、`ptr`の先に`swp`を代入する、という一連の動作をAtomicに行ってくれる。

実際は`ptr`の大きさに応じて、`__sync_bool_compare_and_swap_2`, `__sync_bool_compare_and_swap_4`, `__sync_bool_compare_and_swap_8`などの命令の中からコンパイラがどれを使うかを判断している。

# 問題
ただ、8bytesの型にはlong longなどがあるので、8bytesまではサポートされているのだけれども、16bytesの型というのはあまりメジャーではない。ところが、どうしても16bytesのデータをAtomicに処理したい場合というのがあったりする(complex doubleとか)。

Mac付属のLLVM Clangだとデフォルトで`__sync_bool_compare_and_swap_16`が用意されているのだが、Ubuntuのgccでこれをコンパイルしようとすると、Undefined Referenceが出てしまう。

# 対処
前置きが長くなったが、これをどうにかするには、gccに次のオプションを指定するだけで良い。

``` gcc -mcx16```

一応、[gnuのドキュメント](https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/i386-and-x86-64-Options.html)も引用しておこう。

> -mcx16
> This option enables GCC to generate CMPXCHG16B instructions. CMPXCHG16B allows for atomic operations on 128-bit double quadword (or oword) data types. This is useful for high-resolution counters that can be updated by multiple processors (or cores). This instruction is generated as part of atomic built-in functions: see __sync Builtins or __atomic Builtins for details. 

# 使用例
例えば、次のように使うことができる。

```c:atomic_add_complex_double.c
complex double tgt[1];
complex double tmp = hoge;
complex double new = fizz;
complex double diff = buzz;

while(!__sync_bool_compare_and_swap_16((__int128_t*)tgt, *((__int128_t*)&tmp), *((__int128_t*)&new))){tmp=*tgt; new=tmp+diff;}
```
脆弱性には番号があるらしい


今まであまり気にしたことがなかったけど、脆弱性には番号がつくらしい。そうすると、今回発見されたこの脆弱性は、過去の◯◯番のと同じだよねーとか、あのカテゴリーに入りそうだよねー、とかの話ができる。

当たり前の話といえばそうなんだけど、どうもセキュリティ界隈には似たようなキーワードがたくさんあって混乱するので、脆弱性番号に限らず整理を試みたよ。


#CWE ([Common Weakness Enumeration](http://cwe.mitre.org/index.html))

1999年頃から米国の非営利団体MITREが中心となって策定した共通脆弱性タイプ一覧のこと。脆弱性の種類を体系化してそれぞれに番号を振っている。


わかりやすい図。[IPAのページ](https://www.ipa.go.jp/security/vuln/CWE.html)に詳しい。

![CWEの図](https://www.ipa.go.jp/files/000017658.png)


#JVNVU#XXXXXXXX
脆弱性レポートのこと。X部分は数字が入る。オリジナルレポートの出処によって、JVN#XXXXXXとなったり、JVNTA#XXXXXXXXとなったりする。詳しくは[こちら](https://jvn.jp/nav/jvnhelp.html)。


#CVE ([Common Vulnerabilities and Exposures](http://cve.mitre.org/))
個別製品中の脆弱性に対して、米国のMITRE社が採番している一位の番号のこと。デファクト。


#JVN ([Japan Vulnerability Notes](http://jvn.jp/))
JPCERT/CCと情報処理推進機構（IPA）が共同で管理している脆弱性情報データベースのこと。
レポートされた個別製品中の脆弱性それぞれに番号がつく。CVEと連携しており、対応が取れるようになっている。中身をみると、複数のCWE番号で示された問題が内在していたりする。




#CVSS (Common Vulverability Scoring System)
情報システムの脆弱性に対するオープンで汎用的な評価手法のこと。
詳しくはIPAの[こちら](https://www.ipa.go.jp/security/vuln/CVSS.html)。

+ (1) 基本評価基準 (Base Metrics)
+ (2) 現状評価基準 (Temporal Metrics)
+ (3) 環境評価基準 (Environmental Metrics)
の３つの数値から

* 基本的にどの程度危ないのか。 (1)
* 今現在、どの程度危ないのか。 (2)
* ２次被害含めてどの程度深刻な問題なのか。 (3)

を数値化する。

(1)のCVSS基本値によって深刻度がレベル分けされる。こんな感じ。詳しくは[こちら](https://www.ipa.go.jp/security/vuln/SeverityLevel2.html)。

| 深刻度      | CVSS基本値 |
|:----------:|:---------:|
|レベル3(危険) | 7.0〜10.0 |
|レベル2(警告) | 4.0〜6.9  |
|レベル1(注意) | 0.0〜3.9  |

[こちら](http://jvndb.jvn.jp/cvss/ScoreCalc2.swf?lang=ja&g=1)にCVSS計算ツールがあるので、触ってみるとイメージがわくと思う。

ちなみに、ちょうど2015/12/1からJVNがCVSS v3表記にも[対応する](https://www.ipa.go.jp/security/vuln/CVSSv3.html)ようだ（これまではv2）。


---

はい。すでに混乱してきましたねー。

具体的な例を挙げてみましょう。

#POODLEの例

昨年、賑わった「SSL 3.0 の脆弱性」通称、POODLEについて

POODLEには、CVE番号として[CVE-2014-3566](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566)が採番されています。
JVNでは[JVNVU#98283300](https://jvn.jp/vu/JVNVU98283300/index.html)として脆弱性レポートが公開され、[JVNDB-2014-004670](http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-004670.html)が採番されています。
CWEによる脆弱性タイプは[CWE-310 暗号の問題](http://jvndb.jvn.jp/ja/cwe/CWE-310.html) [(本家)](http://cwe.mitre.org/data/definitions/310.html)に分類されます。関連するCWEとしてCWE-254, CWE-311など10種類挙げられています。
CVSSによる評価は、基本値4.3(警告)です。
各ベンダは 「CVE-2014-3566への対応策」として情報を提供します。

...といった感じです。

おわり。
psql経由でpg_bigm簡単セットアップ

[PostgreSQL Advent Calendar 2015 Day2](http://qiita.com/fujii_masao/items/067e8e40aec889ecf9fb)のテクニックを応用して、全文検索モジュール[pg_bigm](http://pgbigm.osdn.jp/)をpsql経由でセットアップ(ダウンロードからDB登録まで)します。

```plpgsql
-- シェルのソースを保存するテーブルを作成します。
CREATE TABLE shell (num serial, line TEXT);

-- pg_bigmのダウンロードとコンパイルを行うシェルをテーブルに保存します。
COPY shell (line) FROM stdin;
#!/bin/sh

cd /tmp
wget 'http://osdn.jp/frs/redir.php?m=jaist&f=%2Fpgbigm%2F63792%2Fpg_bigm-1.1-20150910.tar.gz'
tar zxf pg_bigm-1.1-20150910.tar.gz
cd pg_bigm-1.1-20150910
make USE_PGXS=1
make USE_PGXS=1 install
\.

-- テーブルからシェルの実行ファイルを作成して実行します。
-- これにより、pg_bigmのソースがダウンロードされ、コンパイルされます。
COPY (SELECT line FROM shell ORDER BY num) TO PROGRAM 'tee /tmp/inst_bigm.sh; chmod 744 /tmp/inst_bigm.sh; /tmp/inst_bigm.sh';

-- pg_bigmをDBに登録します。
CREATE EXTENSION pg_bigm;

-- ALTER SYSTEM SETで、pg_bigmをshared_preload_librariesに設定します。
ALTER SYSTEM SET shared_preload_libraries TO 'pg_bigm';

-- shared_preload_librariesの設定変更を反映するために、PostgreSQLを再起動します。
-- まずはPostgreSQLを再起動するシェルをテーブルに保存します。
TRUNCATE shell;

COPY shell (line) FROM stdin;
#!/bin/sh

pg_ctl -m f stop
pg_ctl start
\.

-- テーブルからシェルの実行ファイルを作成して実行します。
-- これにより、PostgreSQLが再起動され、shared_preload_librariesのpg_bigmの設定が有効になります。
COPY (SELECT line FROM shell ORDER BY num) TO PROGRAM 'tee /tmp/restart_pg.sh; chmod 744 /tmp/restart_pg.sh; /tmp/restart_pg.sh &';
```
JavaScript入門 ２.変数 <個人メモ>

２. 変数

宣言方法
　`var 変数;`
複数まとめて宣言
　`var 変数,変数;`
初期値を指定して宣言
　`var 変数=10;`
データ型
　文字列
　数値
　真偽値
　　オブジェクト
　　配列
　　関数
　　組み込みオブジェクト
　　undefined
　　null

`<!DOCTYPE html>
<html lang="ja">
<head>
　　　<meta charset="utf-8">
　　　<title>JavaScript</title>
</head>
<body>
　　　<script>
　　　　　　var str = "Hello World";
　　　　　　alert(str);
　　　</script>
</body>
</html>`
Smalltalkを短く（70文字で）伝える方法

#70文字でSmalltalkを伝える方法

昨年の[Smalltalk Advent Calendar 2014](http://qiita.com/advent-calendar/2014/smalltalk)に引き続き今年もSmalltalk Advent Calendarをつくってみました。今年こそはまじめに記事を書けたらいいなと思っております。

初日はSmalltalkについて説明をしようと思います。ただあまり長い説明は読む方も大変と思いますので**短く伝える方法を考えてみます**。


##何を使って伝えるか考える
今回はPharo Smalltalk( http://pharo.org/ )を用います。

##伝える方法を考える

以下の方法がよさそうです。

- メール
- Twitter (140文字)
- SMS (70文字)

短文を目指したいので70文字のSMSを採用します（日本のキャリアの場合70文字を超えたSMSを送信すると文字数超過のため送信ができないことがあるようです）．

##Smalltalkについての説明文を考える
12/1が残りわずかですのでWikipediaのSmalltalkの序文を引用してみます（https://ja.wikipedia.org/wiki/Smalltalk）。

>Smalltalk（スモールトーク）は、Simula のオブジェクト（およびクラス）、LISPの徹底した動的性、LOGO のタートル操作や描画機能に、アラン・ケイの「メッセージング」というアイデアを組み合わせて作られたクラスベースの純粋オブジェクト指向プログラミング言語、および、それによって記述構築された統合化プログラミング環境の呼称。

↑だと169文字でこのままではTwitterでさえ投稿できません。

削ります

>Smalltalkとはクラスベースの純粋オブジェクト指向言語および統合化プログラミング環境の呼称

48文字です。短くなりました。SMSで送信できそうです。

#SMSの送信を方法を考える
Twilio( https://www.twilio.com/ )を使います。

##SmalltalkでSMSを送信する方法を考える
せっかくの短い文なのでプログラムも短く送信したいところです。
twilio-smalltalk( https://github.com/newapplesho/twilio-smalltalk )というパッケージを利用します。

## twilio-smalltalkをPharo Smalltalkにインストール

Workspaceに以下のコードをペーストして実行します。

```smalltalk
Metacello new
    baseline: 'Twilio';
    repository: 'github://newapplesho/twilio-smalltalk:v0.2/pharo-repository';
    load.
```

以上です。


## twilio-smalltalkのセットアップ

Twilioを利用する前にTwilio（ http://twilio.kddi-web.com )からアカウント登録をしてください。
SMSを使うにはアメリカ(+1)の電話番号を取得する必要があります。詳しくはTwilioの公式サイトでご確認ください。

アカウント登録後、以下のものをメモしておきます。

* Twilioで取得したアメリカの電話番号
* Account Sid
* Auth Token

メモしたAccount Sidと Auth TokenをSmalltakに設定します。

以下のコードをWorkspaceにペーストします。

```smalltalk
TwilioSettings default accountSid: 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.
TwilioSettings default authToken: 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'.
````

# Smalltalkを短く伝える

SMSの送信するコード

```smalltalk
client := TwilioRestClient new.
"sendTo: の引数は送信先の電話番号"
"from: の引数はTwilioで取得したアメリカの電話番号"
client sendTo: '+818011112222' from: '+10000000000' message: 'Smalltalkとはクラスベースの純粋オブジェクト指向言語および統合化プログラミング環境の呼称'.
```



SMSの受信確認

![IMG_0602.PNG](https://qiita-image-store.s3.amazonaws.com/0/18287/b1b14e8b-9d2c-68bf-858e-bd462cc1d4d6.png)


これでSmalltalkについて伝えることができました。

# まとめ
短く文かつ短いプログラムでSmalltalkについて伝えることをできた。でも**「Smalltalkとは何か」についてはしっかり伝わっていない気がします・・・**。それについては以下の文献を見てもらったほうが良い気がしますのでこの記事はここまでとします。

- 自由自在 Squeakプログラミング PDF版 http://swikis.ddo.jp/squeak/13
- Pharo by Example http://www.pharobyexample.org/
IISのアーキテクチャ基礎（前編）

この記事は[Windows & Microsoft技術 基礎 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ms)の2日目の記事です。

IISの実装モデルは[2015年Webサーバアーキテクチャ序論](http://yuuki.hatenablog.com/entry/2015-webserver-architecture)に挙げられている中からひとつ選ぶとすればマルチスレッドモデルになりますが、ワーカープロセスによるマルチプロセスも組み合わさっているので、ハイブリッドアーキテクチャとしてもよいかと思います。

プロセスとスレッドの細かい話は明日の後編のほうで扱おうかと思います。今日は概念的なところだけ。

なお、この記事は基本的に（Windows Server 2008の）IIS 7.0から（Windows Server 2012 R2の）IIS 8.5までを想定して書いています。

# 論理構造（Webサイトとアプリケーションとアプリケーションプール）

![website_application.png](https://qiita-image-store.s3.amazonaws.com/0/2079/cb46ce43-1bd1-5392-b3a5-2dfe197d4c8a.png)

WindowsにインストールできるIISは1つだけです。ですが、1つのIISは複数のWebサイトを管理できます。
IISにおけるWebサイトとは、大まかにいうとIPアドレスとポートとホスト名（FQDN）の組み合わせと対応付けられる単位です。IISをインストールすると「Default Web Site」という名前のWebサイトが1つ自動的に設定されます。これは「このマシンのすべてのIPアドレス」「80番ポート」「任意のホスト名」の組に対応づけられています（後で変更できます）。

1つのWebサイトは、1つ以上のアプリケーションを含みます。
IISにおけるアプリケーションとは、Webサイト内の特定ディレクトリ以下に対するHTTP要求を処理する単位です。Webサイトのルートディレクトリはアプリケーションとして構成されるので、1つのWebサイトは1つ以上のアプリケーションを含んでいることになります。

1つのアプリケーションは、どれか1つのアプリケーションプールに対応付けられます。
IISにおけるアプリケーションプールとは、アプリケーションをホストするワーカープロセスの論理的なグループです。アプリケーションプールとワーカープロセスの関係は、一言でいえば「アプリケーションプールはワーカープロセスのひな型」です。ワーカープロセスは、アプリケーションプールの設定に従って生成されたり破棄されたりします。細かい話は明日の後編のほうで扱う予定です。

# 論理構造（アプリケーションとHTTPモジュールとHTTPハンドラー）

ざっくりイメージを書くとこんな感じ。

要求を実際に処理して応答を作るのはHTTPハンドラーが担当します。どの要求をどのハンドラーが担当するかはURLのパスや拡張子などをもとにのマッピングします。

HTTPハンドラーが処理をする前後に共通的な追加処理を行うのがHTTPモジュールです。

![handler_module1.png](https://qiita-image-store.s3.amazonaws.com/0/2079/a3b7e1f5-e92a-e206-e1fa-97ba46f1bd4f.png)

「あれ？IISってISAPIフィルターとISAPI拡張が動くんじゃなかったっけ？」とお思いの方へ。その動作はIIS6以前のモデルです。現在のIISでは「クラシックモード」と呼ばれていますがデフォルトの動作モデルではありません。デフォルトは、ここで書いている「統合モード」というものに変わっています。

統合モードでは、HTTPハンドラーもHTTPモジュールも、ネイティブ(C++で実装する）とマネージド（.NET言語で実装する）を混在させることができます(厳密には、ネイティブの場合はHTTPハンドラーもHTTPモジュールとして実装します。）

統合モードをもう少し細かく書くとこんな感じ。

![handler_module2.png](https://qiita-image-store.s3.amazonaws.com/0/2079/9774a538-3a8d-0e11-9fdf-56649e14ca84.png)

IISのアプリケーションにはHTTP要求を処理するパイプラインが定義されています。グレーの箱については上から順にイベントが発火します。で、イベントハンドラを登録しているHTTPモジュールがコールバックされ、それぞれの処理を行います。ハンドラー呼び出しのところは、マネージドHTTPハンドラーについては、選択されたHTTPハンドラーが普通に呼び出されます。ネイティブHTTPハンドラーについては、実際にはHTTPモジュールとして実装されますので、イベント発火⇒コールバックの流れになりますが、登録されているモジュールの中でHTTPハンドラーとして選択されたモジュールだけがコールバックされる感じです。

HTTPモジュールやHTTPハンドラーは、HTTP要求とHTTP応答を抽象化したオブジェクトであるHTTPコンテキストというものにアクセスして、それを操作できます。ただし、実際にHTTP応答を送信するのはパイプラインの最後に達した時になります。

# いろいろなHTTPハンドラー

注：ここに書いてるHTTPハンドラーは、ネイティブ実装のものが多いです。そして、ネイティブのHTTPハンドラーは、実際にはHTTPモジュールとして実装されます。あしからず。

ざっくり書くと、IISのワーカープロセス内で全てを処理する（インプロセス）ものと、外部のプロセスで処理するもの（アウトプロセス）の2つに分けられます。

## インプロセス

* 静的ファイルハンドラー
* ASP.NETのハンドラー
  * Web FormsとかMVCとか
  * ASP.NET 5では使わない

## アウトプロセス

* CGIハンドラー
  * 要求が来るたびにプロセスを起動する形。もう誰も使わんだろ……
* FastCGIハンドラー
  * IISでPHPをホストするときの公式なやつ
  * 昔はクラシックモードのISAPI拡張でPHPをインプロセス処理するという、Apacheのmod_phpっぽいものがあったがオワコン。IISのインプロセス、それはすなわちマルチスレッド。スレッドセーフPHPの闇
* HttpPlatformHandler
  * HTTPプロトコルでプロセス間通信
  * 外部サーバープロセス起動＋簡易リバースプロキシ（ラウンドロビン）
  * その他さまざまな言語のアプリを動かすなら今はこれ
  * 2015年になってはじめて正式リリース（なぜこれまでなかったのか……慢心、環境の違い）

# 参考リンク

* https://msdn.microsoft.com/ja-jp/library/bb470252.aspx
* http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture
FreeBSD で Raspberry Pi インストール

![RaspiWithLCD.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/7461d940-d089-298e-4636-0061207d07bc.jpeg)

RaspberryPi2 上の FreeBSD で I2C 接続の LCD を表示させているところ。

# FreeBSD をRaspberry Pi に入れて何が出来るか

FreeBSD のARM 対応が進んで、Raspberry Pi でかなり Raspberry Pi が動くようになりました。
機能的に現状何が出来るかは、FreeBSD のwiki

[FreeBSD/ARM on Raspberry Pi] (https://wiki.freebsd.org/FreeBSD/arm/Raspberry%20Pi)

の簡単な表にまとまっています。
最近ですと、[純正のカメラモジュール](https://www.raspberrypi.org/products/camera-module/)が使えるようになりました。

とはいってもまだまだな部分は多く、「Raspberry Piの機能を余すこと無く使いたい」といった向きは素直に Raspbian を使ったほうがいいでしょう。
ただ、FreeBSD に慣れ親しんだ人ならば、OSの部分で見通しが効く FreeBSD を使って、そこに Raspberry Pi 的な要素(ハードをちょこちょこ叩いたり)を入れこんでいくことで、お手軽に今までとは違ったコンピューティングが味わえるのではないかと思います。

# インストール

前置きが長くなりましたがはじめの一歩としてはまずはインストール。

インストールはイメージをダウンロードして dd で SD(microSD)に書き込みます。

### ダウンロード
イメージは RaspBSD プロジェクトが配布しているイメージ

http://raspbsd.org/raspberrypi.html

もしくは FreeBSD公式がftpで配ってる 11-CURRENT の snapshot

ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/arm/armv6/ISO-IMAGES/11.0/
(ファイル名に*RPI-B-*.img.xz と入ってるのが無印Pi用、*RPI2-*.img.xzと入っているのがPi2用です)
をダウンロードします。どちらもそれほど現状違いは無いです。
10 のイメージもありますが、Pi2 用イメージは11-CURRENT のみですし、FreeBSDのARM対応の日進月歩っぷりを考えると、現状で 10を使う理由はあまりないと思います。

### dd焼き
1G以上のSD(microSD)を用意します。イメージサイズは1Gですが、SDの容量が大きければ、起動直後に領域が自動拡張されますので、大きいサイズのSDに焼けば自動的に幸せになれます。
ダウンロードしたイメージは sd カードが /dev/da0 ならば、
zcat FreeBSD-armv6-11.0-RPI2-290555.img.gz | dd of=/dev/da0 bs=2m
とかやれば書き込めます。当然ながら書き込み先を間違うと HDD 全消しとかの悲惨なことになるので注意してください。
Mac でも dd で焼けますが、買ったばかりの SD カードをMacに挿すと自動的にマウントされて dd できなくなるので、diskutil コマンドで unmount してから実行します。

### 起動
USBでキーボード、HDMI でディスプレイにつないで起動します。
焼いたSDを挿して電源を入れれば起動してそのまましばらくするとログインプロンプトが表示されます。root のパスワードは RaspBSD版のイメージはパスワード無し、公式 snapshot版は root です。
あとは普通の FreeBSD と同じです。有線 LAN につなげば DHCP 環境ならばネットワークにつながります。 pkgも最近使えるようになったので、ツールのインストールも簡単です。
とりあえず普通の FreeBSD として使えるようになったので次は GPIO の使い方（予定）です。
Ext JSでレスポンシブを試してみる

####前置き

昨年に続き2015年もSencha Advent Calenderに参加します、佐藤です。北海道はとうとう長い冬が到来し、これから半年間は寒さとの戦いです。自分のMac BookをEl Captitanに上げたんですがまだ入力時の予測変換に慣れません。。
仕事用のPCはMac OS Xだからこっちに慣れてもあっちに慣れずって感じなんですけどね。

今年のSencha  Advent CalenderはSenchaに関するすべての話題を初歩的な情報からマニアックな手法まで何でもOKという事で何にしようか考えたんですが、個人的にインパクトを受けたのはやはりデスクトップ・モバイル両対応という点だと感じまして、これからどんどん出番が増えてくるのではないかと思い、サクッと簡単にレスポンシブについて書きたいと思います。
今更って思われるかもしれませんがお付き合いくださいm<_ _>m

####レスポンシブ
レスポンシブとは色々なブラウザもあるしデバイスもあるのでそれぞれを個別に対応して作るのではなく、1つのコードでそれぞれのブラウザ、デバイス用のレイアウトを柔軟に対応させるための手法です。
webデザインをレスポンシブで実現するためにはHTMLファイルとCSS3を使って異なる画面サイズに応じたスタイルを適用したりしてページのレイアウトを作ると思いますが、Senchaではどう実現させるかという点が今回紹介したい所になります。
実際に試していきますが、Sencha Cmdとextjs6のsdkは、自身の環境に揃っている前提で話を進めます。  
新しくプロジェクトを作る場合はgenerateからですが、もうお馴染みなので
generateの手順は[Sencha cmd Generate](https://docs.sencha.com/cmd/6.x/extjs/cmd_app.html)を参照してください。  

####コード
レスポンシブはプラグインになっているのでdefaultでは使用できません。なので定義したクラス下に「 plugins: 'responsive'」と記載します。

    Ext.define('MyApp.view.chart.Chart', {
    extend: 'Ext.Panel',
    xtype: 'pie3d',
    plugins: 'responsive',
    controller: 'pie-3d',
    〜省略〜
宣言はこんな感じですね。
後はどういう条件でレスポンシブさせたいかという設定が必要になります。
これには<b>「responsiveConfig」</b>を使って設定します。

    responsiveConfig: {
        'width < 768': {
            visible: true
        },
        'width >= 768': {
            visible: false
        }
    },
構文は慣れて頂くとして、このように設定を記載します。上の設定ですと、幅が768未満であれば画面上に表示し768以上であれば表示させないといった動きをさせることができます。(※visibleは表示/非表示のプロパティです）デバイスでは表示させたいけどPCでは表示させたくない場合に使えそうです！

もちろん条件のwidthをheightにすることも可能ですし、表示/非表示ではなく、regionを指定してレイアウトを変更させることもできます。
responsiveConfigにどういう設定が可能かは[responsive Rule](http://docs.sencha.com/extjs/6.0/6.0.1-classic/#!/api/Ext.plugin.Responsive)を参照して下さい。

generateしてできたプロジェクトの機能に対してレスポンシブのデモをするのは寂しいので以前、サンプルで作ったExt Js6の新機能であるPie3Dをさりげなく見せながらデモを作りました。
git上に公開してますので興味がある方はcloneしてみて下さい。

git clone https://github.com/toshimitsu-sato/extjs6-sample.git  

<b>[実行手順]</b>
<li>
sdkをcloneしたディレクトリ直下にコピー
<li>sencha app build
<li>sencha web startでwebサーバ起動しアクセス

これでデモページが表示されるはずです。

このレスポンシブは実際に自分の環境で色々な設定値やパターンを試してみてブラウザやデバイスでサイズ変更させながら動きを確認すると面白いと思います。動きが出るものはやっぱり達成感じゃないですけどオォーって感じになります、僕は。

以上でざっくりでしたがレスポンシブの説明を終わります。超サラッと書きましたが、比較的簡単ですresponsiveConfigは。Senchaのweb docsにも記事がありますので見てみてください。

次は12月9日に再登場する予定です。
以上、佐藤でした。
Sublime Textでcodicパッケージ（翻訳アシスト）が便利

[codeic](https://codic.jp)はクラス名やメソッド名をいい感じに翻訳してくれるネーミングツールです。
Sublime TextのパッケージがリリースされSublime内で翻訳ができ便利です。


<img width="490" alt="Codicパッケージ" src="https://qiita-image-store.s3.amazonaws.com/0/16548/1688b2be-812e-331b-d0ec-25f443cb6726.png">


## インストール

codicのパッケージは3つほどあるのですが、シンプルで単語の変換もできる純正プラグインが良いと感じました。

インストールは[Githubリポジトリ](https://github.com/codic-project/codic-sublime-plugin)を参考に…

1.
> コマンドパレット Ctrl+Shift+P → "Package Control: Add Repository" を選択し、以下のURLを追加。

`https://github.com/codic-project/codic-sublime-plugin`

2.
> コマンドパレット Ctrl+Shift+P → "Package Control: Install Package" を選択し、「codic-sublime-text」を選択し、インストール。

3.
> コマンドパレット Ctrl+Shift+P → "Codic: Set Access Token" でAccess tokenを設定。Access tokenは、codicにサインアップ後、APIステータスのページより取得できます。

APIを使うのでサインアップが必要になります。
今後はサイトで、マイ単語データを登録できるようになるようです。


## 設定

### キーバインドを変更

パッケージのキーバインドに<kbd>⌘+shift+D</kbd>が設定されており、行の複製ができなくなりますので、デフォルトキーバインドを奪い返しましょう。

ユーザー.sublime-keymapファイルに、

```Default.sublime-keymap
{ "keys": ["任意のキーバインド"], "command": "generate_naming" },
{ "keys": ["super+shift+d"], "command": "duplicate_line" },
```

で、キーバインドを上書きします。

テキストを選択しキーバインドを実行すると、翻訳候補が出ます。

### キャメルケースなどにする
> 生成されるネーミングのケースの変更 - コマンドパレット → "Codic: Select Letter Case"
uGUIのRaw Image、Image、Panel、Mask

#概要
Unityのバージョンは5.2.3f1

uGUIのRaw ImageとImageとPanelについてのメモです。
この３つはほぼ似たような機能なのでまとめて解説します。(ImageとPanelは初期値が違うがコンポーネントは同じもの）

内容はマニュアルを見ると詳しく載っています。
Raw Image http://docs.unity3d.com/ja/current/Manual/script-RawImage.html
Image http://docs.unity3d.com/ja/current/Manual/script-Image.html

Set Native Sizeボタンを押すと画像ファイルの大きさにリサイズされる。
縦横比を変えたくない場合は、Preserve Aspectにチェックを入れる。

画像ファイルの設定方法も覚える必要がある
http://docs.unity3d.com/ja/current/Manual/class-TextureImporter.html
http://docs.unity3d.com/ja/current/Manual/SpriteEditor.html

#それぞれの使い道
Raw Image

- Raw Imageは.pngや.jpgのファイルをTextureとしてそのまま表示する。
- UV Rectを変更して画像データの表示箇所を調整できる。（特定の場所をズームするなど）
- タイルのテクスチャをならべて模様を作れる。

Image、Panel

- Panelは最初からサイズが自動でフィットするようになっているので背景設定などに使う。
- 画像ファイルの設定でTexture TypeをSpriteに設定したファイルを使ってサイズの違うボタンを１つの画像で作れる。(Sprite Editorにて設定）
http://unitygeek.hatenablog.com/entry/2015/03/07/182606
- Image Typeを変えることで画像の表示方法を変えたり画像の一部を非表示にできる。(タイプ別の表示は以下のサイトを参照）
http://www.metalbrage.com/UnityTutorials/uGUI/ImageElement.html
http://bribser.co.jp/blog/create-circle-shaped-gauge-for-game-using-unity-and-ugui/
（Scriptで制御すると体力ゲージやインジケータなどの演出に使えそう）


#Maskを使った表現
1.Imageを2つ作って片方を子オブジェクトにする。
2.親オブジェクトの方にAdd Component>UI>Maskを追加する。
3.MaskのShow Mask Graphicのチェックをはずす。
以上のことをやると子オブジェクトの形に親オブジェクトが切り抜かれる。
http://docs.unity3d.com/ja/current/Manual/script-Mask.html

- MaskにはRect Mask 2Dもある。こちらはマスクのオブジェクトを透明にできないなどの制限があるがパフォーマンス上の利点があるらしい。http://docs.unity3d.com/ja/current/Manual/script-RectMask2D.html
- TextにMaskを追加して、子オブジェクトにグラデーションをかけたテクスチャを設定すると、グラデーションがかかった文字が作成できる。

#Raw Image、Image、PanelのSprict制御
```lang:ImageTest
  using UnityEngine.UI;

  RawImage image1;
  image1 = GetComponent<RawImage>();  // コンポーネントを取得
  image1.uvRect = new Rect(0,0,0,0);  // UV Rectを指定
  image1.enabled = false;         　　 // Imageを非表示

  Image image2;
  image2 = GetComponent<Image>();     // コンポーネントを取得
  image2.fillAmount += 0.01f;         // Fill Amountを指定
  image2.enabled = false;         　　 // Imageを非表示
```

#その他のメモ
- スマホのUIデザインのノウハウを参考にする。
- Textと同様、ShadowやOutlineを使って分裂した画像を分裂させたり、縁をつけたりすることができる。
- Maskを使った表現はいろいろなことができるのでいろいろ試すのが良い。（テキストでマスクしたり、リストをつくるのに使ったり）
- Raw Imageで模様を作って特定方向にスクロールさせるとゲームの背景に使えそう。
- UnityのSprite Pakerをつかってメモリ消費を抑える。http://docs.unity3d.com/ja/current/Manual/SpritePacker.html


#参考になりそうなサイトやAsset
- マテリアルを使った表現の参考サイト
http://www.metalbrage.com/UnityTutorials/uGUI/ImageElement.html
- 体力ゲージ作成の参考サイト
http://qiita.com/T_2/items/fcbcbf4a5cb816330263
- Imageにクラデーションをつける参考サイトhttp://westhillapps.blog.jp/archives/42946739.html

#今後の課題
Materialを使ったいい表現が思いつかない。
Spriteアニメーションについてはanimatorの記事で書く予定。
なぜzshを使うのか

さて、われわれは毎日シェルを使っているわけですが、みなさんはどうやって今のシェルを選んだのでしょうか。

初期設定のままとか、なんとなくとかいう理由の人もいるでしょう。逆に、色々とシェルを渡り歩いて今の結果に行き着いたという人もいるでしょう。

僕の場合、初めはbashを使っていました。どのシェルを使ってもだいたい同じことができるだろうという考えのもと、普通にデフォルトのログインシェルを使っていました。特に困ることもなく、使いこなすということもなく、なんとなく使っていました。

ある日、他の人が使っているtcshの設定ファイルを見る機会がありました。確かそのときの職場に伝わっていた秘伝のtcshrcだったと思います。それはaliasやらなんやら激しくカスタマイズされていました。「おお、こういう世界もあるのか」と、感心しました。

しかし、それを真似しようと調べてみたところ、どうやらtcshには欠陥があるようです。特にtcshには関数がないというではありませんか。関数がない言語で何かをやろうというのは、これはもうアホと言う他ないでしょう。そう思った僕は、今使っているbashで同じようにカスタマイズできないか調べてみました。

そして、「[入門bash](http://www.amazon.co.jp/gp/product/4873112540)」という本にたどり着きました。この本にはbashのすべてが書かれていました。本を参考にして、自分の思った通りにbashをカスタマイズしました。そうやって作った環境は大変快適でした。その作った環境に一通り慣れて、シェルの設定はこんなもんだろうと思っていました。

そんなある日、zshに出会いました。きっかけはWebサイトの紹介記事でした。「とりあえず補完機能だけでも試してみろ」という記事につられて使ってみたところ、衝撃を受けました。Tabキーを押すだけで、ここまでのことができるのか。コマンドのオプションやらなんやら、何でも補完するではありませんか。tarコマンドの補完にいたっては、Tabキーを押すとtarボールの中身を展開して中に含まれているファイル名まで補完してくれます。

コマンドラインの操作でここまでのことをやるのか。Tabを押すたびに外部のコマンドをいくつも呼ぶという、そんなマシンを酷使するようなことをやっていいのか。zshには妥協とか節約とか、そういう後ろ向きなセコい発想は一切ありません。コンピュータは人間に使われるためにあるのです。何も使わずに資源を余らせておくのは無駄です。便利にできることがあればすべてやります。zshは後退のネジが壊れています。

これは革命だ。その日から僕のzsh生活は始まりました。

zshの機能は非常に豊富で、何年たっても終わりが見えませんでした。毎日夢中になってカスタマイズしていました。そのたびに僕の環境は便利に、快適になっていきました。

しかし、そんな日々も少しずつ終わりが近づいてきていました。だいたい思いつくところで一通りカスタマイズができました。十分カスタマイズできたという喜びと、もうカスタマイズできないという悲しみと、両方の気持ちが湧いてきました。

今、僕のzsh環境は安定しています。ちょうどzshを知る前のbash環境が安定していたのと同じです。もし将来zshを上回る衝撃的なシェルがあれば、僕は乗り換えます。いつでも一番良いシェルを使っていたいと思っています。そして、僕にとって現在一番良いシェルはzsh以外にありません。僕にとってのシェルは、そしてzshとは、そういうものです。
init.elから設定を追い出してパッケージ化しよう

init.elの自慢ではないですが, 設定をパッケージから追い出すことについて述べていきたいと思います.

私は以前設定ファイルに自作のユーティリティ関数やら各種色(face)の設定を書いていましたが, 最近それらの多くはパッケージとして独立させています. 主に使っているのは以下の 2つです.

- [editutil](https://github.com/syohex/emacs-editutil/) 編集機能関連をまとめたもの
- [syohex-theme](https://github.com/syohex/emacs-syohex-theme) 自分独自のテーマ. [reverse-theme](https://github.com/syohex/emacs-reverse-theme)をベースにカスタマイズ

editutilは移動系, 削除系などの編集系のコマンドから構成されます. 同リポジトリの helm-editutilは helm関連の独自ユーティリティを集めたものです.

syohex-themeは名前がこっ恥ずかしいですが, 自分独自のテーマです. ほとんど reverse-themeと一緒ですが, その中で気に入らなかった部分の変更, 対応faceの追加を行っています.


## パッケージ化することのメリット

1. たくさん書いても気にならない
2. テストしやすい
3. インストールしやすい
4. init.elの見通しがよくなる

init.elが長くなってくると短くしたいと感じることがあります. 特に他の人の行数を聞いて自分おがあまりに多いと「私のinit.el長すぎ!!」となってしまいます. しかしパッケージとして独立させておくとその気持ちが薄れて躊躇なく機能を追加することができます(私だけかもしれないですが...). 私は Emacsの魅力はプログラムを書いて簡単に拡張できることと考えています. なんでガンガン拡張するのが正しいあり方だと思っています. なんで気兼ねなくガンガン増やすためにも init.elからそのような設定を追い出し, パッケージするのがいいと考えます.

dotfilesリポジトリでもテストできないことはないですが, やはり独立していた方がテストをしやすいです.

後述するようにパッケージとして定義しておけば Caskファイルや el-getの設定に 1行足すだけでそれをインストールすることができます. また依存パッケージのインストール, 遅延ロードといった利点も活かすことができます.

init.elが設定中心になり見通しがよくなります(私はそう感じます).


## パッケージとしてインストール

Caskや el-getを使えば, MELPAや Marmalade等に登録していなくても簡単にパッケージとしてインストールすることができます(hpackage.elだけでもできないことはありませんが, 若干面倒くさいです). 以下に Cask, el-getそれぞれについて示します.

### Cask

```lisp
(depends-on "editutil" :git "https://github.com/syohex/emacs-editutil.git")
```

### el-get

```lisp
(el-get-bundle syohex/emacs-editutil :name editutil)
```

## 自分独自のテーマを作る

MELPA等を見てもらえれば様々なテーマがあることがわかります. 私も 100種類以上作成しています(主に colorthemeの移植ですが). それだけ様々なテーマがあっても完全に自分に合うものというのはめったにありません. この faceが気にくわない, あの faceが気にくわないなどの不満が出てきます. そのような場合は設定ファイルで細々変更するのではなく, それを forkして自分好みの設定にカスタマイズしてみるのがいいと思います. もちろん 1から書いてみるというのもありかと思います.


## おわりに

init.elから設定を追い出しパッケージ化することのメリット及び方法について示しました. 興味を持った方は一度試してみていただければと思います.

明日は @kai2nenobu さんです.
開発中のrailsにおけるモデル名変更を楽に行う

開発中のrailsプロダクトの話。


モデル名変更しようとするとルーティングの変更やコントローラ名の変更なども発生して、結構めんどくさいのでコマンドで楽できないかと模索した結果を記す。
ファイル名とファイル内の文字列をひたすら置換するかなり乱暴な方法なので、実行するときは注意。
バックアップなどは忘れずに。



**手順1.ディレクトリ名やファイル名の置換**
ディレクトリ名やファイル名で変更前のモデル名を含むものを全て置換する。
下記コマンドはエラーが出てこなくなるまで何回か実行する。
ディレクトリ名を変更後に、そのディレクトリ内にあるファイルのリネームも必要だからである。

`find ./|grep 置換前の文字列|xargs rename 's/置換前の文字列/置換後の文字列/'`

ちなみにmacの方はrenameコマンドをインストールする必要がある。
http://qiita.com/shuhei/items/cf1ddf373d1f83d5d667



**手順2.ファイル内の文字列の置換**
ファイル内に存在する置換対象の文字列を全て変更する。
tmpやlog、gitなどは除外する

`find ./ |xargs grep -l -s "置換前の文字列"|grep -v log|grep -v tmp|grep -v git|xargs sed -i.rename_suffix  -e 's/置換前の文字列/置換後の文字列/g'`

大文字で始まるモデル名なども置換する

`find ./ |xargs grep -l -s "置換前の文字列"|grep -v log|grep -v tmp|grep -v git|xargs sed -i.rename_suffix  -e 's/置換前の文字列/置換後の文字列/g'`


**手順3.掃除**
上記コマンドでrename_suffixというサフィックスを持ったファイルが大量に生成されるため、下記コマンドでそれらをすべて消す。

`find ./ -name "*.rename_suffix"|xargs rm `



**手順4.DBの再構築**
モデル名が変わっていると、マイグレーションファイルなども変更されているため、DBを再構築する必要がある。

```
rake db:drop 
rake db:create  
rake db:migrate
```

必要であればテスト用DBも再構築する

```
RAILS_ENV=test rake db:drop
RAILS_ENV=test rake db:create
RAILS_ENV=test rake db:migrate
```

これで完了。


**よくわかってない箇所**
手順2のファイル内の文字列を置換する際、-iのサフィックスとして何も指定しなくても、サフィックスがあるものとして認識されてしまったため、それっぽいサフィックスをつけて手順3で掃除しやすくする必要があった。
なぜそうなるかは調査が必要。





参考
http://qiita.com/kkyouhei/items/b4ff839a2f36ba194df3
CygwinのcurlでSSL certificate problemとなる。


# 事象
Cygwinでcurlを使って、httpsで通信しようとした場合にエラーとなる。

```bash
$ curl https://google.co.jp
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
```

# 実施したこと

## サーバ証明書をダウンロードする

http://curl.haxx.se/docs/caextract.html からca-bundle.crtをホームディレクトリにコピーする。
ファイル名を「curl-ca-bundle.crt 」に変更する。
ただし、カレントディレクトリを移動するとうまくいかない。

```bash
$ ls
ca-bundle.crt
$ mv ca-bundle.crt curl-ca-bundle.crt
$ curl https://google.co.jp
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   222  100   222    0     0    395      0 --:--:-- --:--:-- --:--:--   395<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.co.jp/">here</A>.
</BODY></HTML>

$ cd /
$ curl https://google.co.jp
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.


```

curlの日本語マニュアルに以下の記述を発見。とりあえずcurl-ca-bundle.crtをPATH内に配置する。

>curl の windows 版は、自動的に， curl.exe と同じディレクトリ内, カレントディレクトリ内, あるいはユーザの PATH 以下のフォルダから、 curl-ca-bundle.crt というファイル名の CA 証明書を探し出します。
http://www.hcn.zaq.ne.jp/___/unix/curl_manpage.html