OmniAICreator/Qiita-1.07M huggingface dataset:
リリースビルド時のみ自動的に画像を圧縮してパッケージを作る(iOS)

パッケージに含める画像に余分なメタ情報や画質を持たせるとパッケージの容量が大きくなってしまうものの、画像を更新する度にいちいち手動で圧縮をかけるのは面倒なので、リリースビルドのときだけ自動的に圧縮されるようにします。

## imageOptim-CLIのインストール
画像の圧縮にはimageOptim-CLIを使います。これはImageOptimeやImageAlphaをまとめてCLIで操作するスクリプトです。READMEに従い、ImageOptimと必要であればImageAlphaやJPEGminiをインストールします。

* [ImageOptim](https://imageoptim.com/)
* [ImageAlpha](http://pngmini.com/)

imageOptim-CLI自体はnpmでインストールできます。

```shell-session
$ npm install -g imageoptim-cli
```

例えばres/img以下をImageAlpha込みで圧縮したい場合次のようになります。

```shell-session
$ imageOptim -a -q -d res/img
```

各ツールの挙動のを細かく設定することもできます。例えばimageAlphaはデフォルトで```--quality=75=100```オプションがついているので、変更したい場合[この辺](https://github.com/JamieMason/ImageOptim-CLI/blob/e326148cabab7c99cb7d5c5cf465f3755fd333f6/src/imageOptimBashLib#L425)をいじります。

```bash:imageOptimBashLib
function run_image_alpha {
  if [ "true" == $USE_IMAGE_ALPHA ]; then
    if [ "true" == $HAS_IMAGE_ALPHA ]; then
      info "Running ImageAlpha..."
      find "${TEMP_PATH}/png" -type f -print0 | xargs -n10 -P8 -0 \
      $PNGQUANT_PATH --ext=.png --force --speed=1 --quality=75-100 --    # <= ここ
    else
      fatal "ImageAlpha is not installed (http://pngmini.com)"
    fi
  fi
}
```

## ビルドスクリプトに組み込む
```cocos compile```コマンドでiOSのパッケージを作る手順はざっくりと以下のようになります。

1. スクリプトファイル（.luaや.js）のコンパイル
2. ビルドして.appを生成
3. .appからno_resに指定されているリソースを削除
4. .appから.ipaを生成

余分なリソースを削除した後に圧縮をかけるのが良さそうなので、3と4の間でimageOptimを実行します。ビルドスクリプトを次のように編集します。

```diff:${cocos_root}/tools/cocos2d-console/plugins/project_compile/project_compile.py
diff --git a/plugins/project_compile/project_compile.py b/plugins/project_compile/project_compile.py
index 3a2eeb4..199515b 100644
--- a/plugins/project_compile/project_compile.py
+++ b/plugins/project_compile/project_compile.py
@@ -535,6 +535,9 @@ class CCPluginCompile(cocos.CCPlugin):
                 self._remove_res(self._iosapp_path)
 
             if self._mode == 'release':
+                # optimize image
+                self._run_cmd("imageOptim -a -q -d %s/res/img" % self._iosapp_path)
+
                 # generate the ipa
                 app_path = os.path.join(output_dir, "%s.app" % app_name)
                 ipa_path = os.path.join(output_dir, "%s.ipa" % app_name)
```

cocosコマンドでリリースビルドすれば、画像が圧縮されます。

```shell-session
$ cocos compile -p ios -m release
```
Elixir Enumerables and Streams

# Elixir Enumerables and Streams

## 概要
Elixir の Enumerables と Streams について。

### Enumerables
http://elixir-lang.org/docs/stable/elixir/Enum.html

Enumerables の提供する関数はすべて Eager で動作する。

~~~
int_ary = [1, 2, 3, 4, 5]
string_ary = ["a", "b", "c"]
mix_ary = ["a", 2]

defmodule Disp do
  def disp_all(enum) do
    Enum.each(enum, fn x -> IO.puts x end)
  end
end

Disp.disp_all(Enum.map(int_ary, fn x -> x * 4 end))

IO.puts Enum.all?(int_ary, &is_integer/1) # => true
IO.puts Enum.all?(string_ary, &is_integer/1) # => false
IO.puts Enum.all?(mix_ary, &is_integer/1) # => false

IO.puts Enum.any?(int_ary, &is_integer/1) # => true
IO.puts Enum.any?(string_ary, &is_integer/1) # => false
IO.puts Enum.any?(mix_ary, &is_integer/1) # => true

IO.puts Enum.reduce(int_ary, &+/2)
IO.puts Enum.reduce(string_ary, &<>/2)
~~~

* 出力

~~~
4
8
12
16
20
true
false
false
true
false
true
15
cba
~~~

### Streams
http://elixir-lang.org/docs/stable/elixir/Stream.html
Streams の提供する関数はすべて Lazy で動作する。

~~~
int_ary = [1, 2, 3, 4, 5]

defmodule Disp do
  def disp_all(enum_or_stream) do
    Enum.each(enum_or_stream, fn x -> IO.puts x end)
  end
end

Disp.disp_all(Enum.map(int_ary, fn x -> x * 4 end))

stream = Stream.map(int_ary, fn x -> x * 4 end)
Disp.disp_all(Enum.take(stream, 3))
~~~

* 出力

~~~
4
8
12
16
20
4
8
12
~~~

## Pipeline

~~~
iex> ary = 1..100
1..100
iex> Enum.map(ary, &(&1)/1)
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0,
 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0,
 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0,
 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, ...]
iex> Enum.map(ary, &(&1+1)/1)
[2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0,
 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0,
 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0,
 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, ...]
iex> Enum.map(ary, &(&1+1)/1) |> Enum.sum
5150.0
iex> Enum.map(ary, &(&1+1)/1) |> Enum.drop_while(&(&1<10))
[10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0,
 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0,
 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0,
 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, ...]
iex> Enum.map(ary, &(&1+1)/1) |> Enum.drop_while(&(&1<10)) |> Enum.sum
5106.0
iex> Enum.map(ary, &(&1+1)/1) |>Enum.take
[2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
iex> Enum.map(ary, &(&1+1)/1) |>Enum.take |> Enum.sum
44.0
~~~

## 参照
http://elixir-lang.org/getting_started/10.html
ghqでリポジトリ管理とpeco連携で快適git生活

Gitのローカルリポジトリが増えてくるとどういう構成にすればいいか悩むところだけど、ghqとpecoがあれば考える必要がありません。今まで入れてなかった事を後悔するレベル。

##ghqインストール
Goがまだ入ってなければGoをインストール

```
% brew install go
```
お好みのシェルにパスを設定

```.zshrc
export GOPATH=$HOME
export PATH=$PATH:$GOPATH/bin
```
書いたら読み込む（直で打つも良し）

```
% source ~/.zshrc
```
ghqインストール

```
% brew install ghq
```
ghqで管理するrootディレクトリを設定（`~`が展開されないよう`'`で括ってます）

```
% git config --global ghq.root '~/src'
```

##ghqをつかう
```
#cloneする
% ghq get git://github.com/project.git
#ghq管理下のリポジトリを表示
% ghq list
#ghq管理下のリポジトリにcd
% ghq look hoge
        cd /Users/strsk/src/github.com/strsk/dotfiles
```
##pecoと連携
pecoインストール

```
% brew install peco
```
`ghq list -p`で管理しているリポジトリのパスをpecoに渡して`cd`するファンクションを`^]`に登録します。keyはas you likeで。

```.zshrc
function peco-src () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-src
bindkey '^]' peco-src
```
書いたら読み込む！

```
% source ~/.zshrc
```
あとはターミナルで`^]`を打てば快適生活のはじまりです。
![ghq_peco.png](https://qiita-image-store.s3.amazonaws.com/0/16906/66174b8f-abe5-82dd-a992-ab12e3711912.png "0.png")

##Special Thanks
[ghq: リモートリポジトリのローカルクローンをシンプルに管理する - 詩と創作・思索のひろば (Poetry, Writing and Contemplation)](http://motemen.hatenablog.com/entry/2014/06/01/introducing-ghq)
[ghqを使ったローカルリポジトリの統一的・効率的な管理について - delirious thoughts](http://blog.kentarok.org/entry/2014/06/03/135300)
[ghq + peco/percol - Tatsuhiko Miyagawa's blog](http://weblog.bulknews.net/post/89635306479/ghq-peco-percol)
Herokuで同じアプリを複数の環境にデプロイ

同じアプリを複数のHeroku環境にデプロイする手順メモ。
　  
1.コマンドプロンプトから下記コマンドを実行し、アプリを作成する。
--remoteをつけると、リモートリポジトリの名前を付けることができる。指定しない場合はmasterになる。
`> heroku create アプリ名 --remote HerokuRepoName`
　
2.HerokuにPushする
HerokuのリポジトリにmasterブランチをPushする場合は下記。
`> git push HerokuRepoName master`
　  
同じローカルリポジトリに複数アプリを登録するので、herokuコマンドを実行する際には「--app」オプションをつけアプリ名を指定する必要がある。

　  
GithubからPullRequestが送信されたときに、PullRequestのあったブランチをHerokuにデプロイして、レイアウトや動作を確認しながらコードレビューしたいなーっと思ったので調べてみた。

あらかじめいくつかのHerokuアプリを作成しておき、PullRequestがあるたびにJenkinsからその中の1つにデプロイを行う、というような仕様になっている。
同じブランチからのPullRequestなら同じアプリにデプロイするようなロジックにもしてある。
　  
すでに他のブランチがデプロイされている環境にデプロイすることもあるので、
`> git push -f herokuリポジトリ名 master`
のようにpush時には「-f」オプションをつける。
UITableViewControllerの.viewと.tableViewは同じインスタンスだった


以上。今まで知らんかった。

```swift
class ViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        if self.view === self.tableView {
            println("same instance.")
        }
    }
}
```

蛇足：
つまり.tableViewは、以下のようなシンタックスシュガーとも考えることが出来る。

```swift
let t1: UITableView = self.tableView
let t2: UITableView = self.viewAsTableView()

// t1 === t2

func viewAsTableView() -> UITableView {
    return self.view as UITableView
}
```

さらに蛇足：
つまりUITableViewControllerは、UIViewControllerにUITableViewをaddSubviewしたものとUI階層が異なる。
git diff で Office ファイルの差分を見る

入れたくないとは思っていても、止むに止まれぬ事情で Word, Excel, PowerPoint などのファイルを git レポジトリの中で管理することはありませんか？この記事では、Mac で Office ファイルの diff を取る方法を紹介します。Linux でも多分動くはず。

## textconv

普通、バイナリファイルを git diff しても、変更内容がわかりません。ところが、git には [textconv](http://git-scm.com/docs/gitattributes) という、バイナリファイル（別にバイナリじゃなくてもいいんですが）をコマンドに渡した結果を diff に使う機能があります。ドキュメントには、JPEG の Exif 情報の diff を取る例等が載っています。

## Office ファイルからのテキスト抽出

では、Office ファイルからテキストを抽出するにはどうすればいいでしょう？Windows の msysgit には [astextplain](https://github.com/msysgit/msysgit/blob/master/bin/astextplain) というツールがついており、中では antiword, docx2txt, pdftotext などのツールを使っています。しかし、これでは Excel, PowerPoint ファイルに対応できません。

Office 2007 以降では Office Open XML という規格に基づいた .docx, .xlsx, .pptx というファイル形式が採用されています。これらは XML や画像ファイルを zip で固めたものなので、[解凍すれば中身を見ることができます](https://tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/)。

`~/bin/unopenxml` というファイル名で、以下のようなスクリプトを置きます。（Qiita のコードブロックでは、拡張子がないとファイル名として表示されない？）

```
#!/bin/sh
unzip -c -a $1 | iconv -f utf-8 -t utf-8 -c | perl -pe 's/></>\n</g' | perl -p -0777 -e 's/ extracting: .*( inflating: |\Z)/\1/s'
```

こんな感じで `unzip -c -a` で zip の中身を取得し、XML に改行を入れて diff を読みやすくし、バイナリデータは無視するようにしています。`~/bin/unopenxml some.pptx` などとすると、ファイルの中身を見ることができます。

## git diff で使う

これを git diff で使うには、以下のような設定をします。

```~/.gitconfig
[diff "openxml"]
  textconv = ~/bin/unopenxml
```

```your-repo/.gitattributes
*.pptx diff=openxml
*.docx diff=openxml
*.xlsx diff=openxml
```

これで .pptx, .docx, .xlsx ファイルの diff が取れるようになりました。試してませんが .doc には antiword, .docx には docx2txt を使った方が、文字だけ見れて便利かもしれません。

## Apache Tika を使う（2015/2/13 追記）

ajaxsys@github さんにコメントで教えていただきました。実行に少し時間がかかりますが、こっちの方が綺麗に diff が見えます！

ひとまず Mac の場合の手順を書きます。

```
brew install tika
```

`~/bin/unopenxml` というファイル名で、以下のようなスクリプトを置きます。`"$1"` とするのは、変なパス対策です。

```file:~/bin/unopenxml
#!/bin/sh
tika -t "$1"
```

で `.gitconfig` を編集し・・・

```~/.gitconfig
[diff "openxml"]
  textconv = ~/bin/unopenxml
```

レポジトリに `.gitattributes` を追加。

```your-repo/.gitattributes
*.pptx diff=openxml
*.docx diff=openxml
*.xlsx diff=openxml
```
PowerShell スクリプトから DB2 関連コマンドを使用するためのおまじない

# おまじない
必要な理由とかは DB2CLP などでぐぐれば出てくると思うので割愛します。

バッチファイルの解説はあったけど、PowerShell 版はなさそうだったので作成。

## サンプルスクリプト
DB2 関連コマンドを呼ぶ前に、setupDB2Env 関数を呼びださねばなりません

```PowerShell:DB2Sample.ps1
function setupDB2Env($DB2BinPath) {
    $env:DB2PATH = "${DB2BinPath}"
    $env:path += ";${DB2BinPath}"
    $env:DB2CLP = $(db2cmd /c /i /w echo %DB2CLP%)
}

...

setupDB2 'C:\Program Files\IBM\SQLLIB\BIN'
db2 get db cfg for sample #など
```
berkshelfはAWSのmicroインスタンスでビルド出来る


#1

[先日の投稿](http://qiita.com/ymmtmdk/items/94e610388f8a217fef35)で`gem install berkshelf`は罠であると切って捨てたんだけれども、結局ビルド出来ないまま終わったのはなんかちょっと悔しいなあ、と少し引っかかってはいた。

で今日OS Xにberkshelf入れてて、こっちはさすがにメモリあるから大丈夫だろうと`gem install berkshelf`やって、どの位メモリ食うかなあとアクティビティモニタ眺めてたらなんか思ってたより食ってない。
あれって少し考えたらもしかしてgccよりClangの方がメモリ食わないんじゃないかという可能性に辿り着いた。

#2
なのでさっそくAWSに`sudo yum install clang clang-devel`。
んでgemするときに`CC=clang CXX=clang++`ってつければconfigureが勝手にClang使ってくれる。

そしてberkshelfが入らない元凶、メモリ大食らいdep-selector-libgecodeを入れるべく、
`sudo CC=clang CXX=clang++ gem install -V dep-selector-libgecode`
とやってみるも残念ながら失敗。

#3
というのもこのdep-selector-libgecode、ただでさえやたらメモリ食うのにextconf.rb見ればmake -j 5とか富豪なことやってるせいでClangプロセスが並行して5つも立ち上がる。あほか。

なのでこれをどうにかしないとなあと色々考え試した末、makeコマンドを改ざんすることにした。

```ruby:make
#!/bin/env ruby

puts "---this is ikasama make---"
arg = ARGV
arg = [] if arg == ["-j", "5"]
system("/usr/bin/make #{arg.join(' ')}")
```

これをどっか適当なところにおいてmakeって名前にして、```PATH=`pwd`:$PATH```ってやればこれを優先して実行するようなって、make -j 5が来たら握りつぶすようなる。

#4
こうして奴を倒す武器は揃った。満を持して
```sudo PATH=`pwd`:$PATH CC=clang CXX=clang++ gem install -V dep-selector-libgecode```
を実行。topで見ればちゃんとClangプロセスが1つなのが確認できる。

そして割りと長い時間待った所、画面に1 gem installed！
みごとdep-selector-libgecodeに打ち勝ちそのまま`sudo gem install berkshelf`もきっちり成功。こうしてメモリ1G、スワップ0のmicroインスタンスでもberkshelfをビルドすることが出来た。

#おまけ
make詐称とかしてないでdep-selector-libgecodeのmake -j 5外したプルリク投げるのが正道だろ、と思って投げようとしたらすでに同様のプルリクが飛んでた。さっさとマージして欲しいです。
PHPExcelの基本の基本

初投稿なので読みにくかったらごめんなさい。

PHP＋Mysqlで作成してあるWEBシステムがあります。
お客様からデータを入力した物をEXCELに出力して使いたいという話がありました。
C#やVB.NETではかなりよくある話ですわね。（JAVAは業務では使わないのでよくある話かはわからないｗ）
PHP歴もぼちぼち長いのですがPHPでEXCELってやった事無かったので調べてみますかと言うのが今回の話です。

でPHPExcelで行きましょうって言う話で基礎の基礎です。

まずは[ライブラリをダウンロード](http://phpexcel.codeplex.com/)

PHPExcelは1.8を使ってます。
ざっくりとテンプレート用のエクセルを読み込んでセルに内容を書いてダウンロードさせるコードを書いておきます。
このコードだとサーバにファイルを保存しませんので個人的にはこっちがいいかなと思います。
まぁ基本的な事しかやってないので古いバージョンでも今後の新しいバージョンでも動くでしょうね。

EXCEL2007形式（いわゆる拡張子が「xlsx」の物）を前提で書いてます。
EXCEL2003以前は読み込むライブラリが増えるのと、読み込み時の指定が「Excel2007」が「Excel5」になるくらいですかね？（試してない

```php
<?php
//ライブラリの読込
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';

//テンプレート（というかエクセルファイル）の読込
$file = "tmp_excel.xlsx";
$obj = PHPExcel_IOFactory::createReader('Excel2007');
$book = $obj->load($file);

//シートを設定する
$book->setActiveSheetIndex(0);//一番最初のシートを選択
$sheet = $book->getActiveSheet();//選択シートにアクセスを開始
$sheet->setTitle('sheet1'); //シート名を設定する

//セルにデータをセット
$sheet->setCellValue('D5' , 'テスト');//D5セルに「テスト」と書き込む

//Excel2007形式で出力する準備
//「vnd.ms-excel」だとブラウザによってはそのまま開いたりするのでこの方が良いかと
header('Content-Type: application/octet-stream');
//ダウンロードするファイル名を設定
header('Content-Disposition: attachment;filename="download_test.xlsx"');

$writer = PHPExcel_IOFactory::createWriter($book, "Excel2007");//EXCEL2007形式
$writer->save('php://output');//出力開始
```

テンプレート用エクセルを準備せずに新規作成も当然出来るんですが、個人的には空のエクセルを作っておいて、テンプレートエクセルとして読み込ませても一緒なので良いのでは無いかと思いますがｗ（ダメかな？
覚え書き 001[Xcode6 Empty Application]

# Xcode6でのEmpty Application Templete

AppleのStoryBoard押しにより，無くなってしまったEmpty Application Templete．
Xcode6になっても，StoryBoard使わずに作りたいので，それをするための覚え書き．

ぐぐれば，解決策出てくるので，わかりやすいページのURLを貼る．

[Xcode6でもストーリーボードなしのEmpty Applicationから始めたい - あぷすた](http://appstars.jp/archive/243) 

[xcode6-beta4にEmpty Applicationがない](http://www.iyken.me/wordpress/xcode6-beta4%E3%81%ABempty-application%E3%81%8C%E3%81%AA%E3%81%84/)

上のサイト通りにして実行した際に，エラーが出る場合，
Main.Storyboardを追加すれば，無理矢理動かすことが出来る．
どこで，Main.Storyboardを呼んでいるのかはわからないが…．
rbenvでRailsプロジェクト作成メモ

こちらが詳しかったです
http://qiita.com/emadurandal/items/a60886152a4c99ce1017

### rbenvでRailsプロジェクト管理方法

普通にrbenvでインストールしたruby(&gem)にて、そのままgem install railsしちゃうと複数のバージョン違いプロジェクトが走っていた場合に困るので、Railsプロジェクトごとに分ける方法。というかBundler使うといいよね。って話。

#### Bundlerをインストール

Bundlerはインストールしないとできないのでインストールします。

```
$ rbenv exec gem install bundler
$ rbenv rehash
```

#### Railsプロジェクト作成用のガワをつくる

Railsプロジェクト作成用のディレクトリを作成。その中にRailsをローカルインストールするためのGemfileを作る。現在4.1.6が最新だったので4.1.6指定。で、Railsをインストールする。

```
$ mkdir hogehoge
$ cd hogehoge
$ cat << EOS > Gemfile
source "http://rubygems.org"
gem "rails", "4.1.6"
EOS
$ bundler install --path vendor/bundle
```

#### ローカルインストールしたRailsでRailsプロジェクトを作る

vendor/bundleにインストールしたRailsを使ってRailsプロジェクトを作成し、ガワのvendorやGemfileを削除。Railsプロジェクトへ移動し、再度Railsなどをローカルインストールする。

-- skip-bundleは重要

```
$ bundle exec rails new sample --skip-bundle
$ rm -rf vendor/bundle
$ rm -rf .bundle
$ rm -f Gemfile
$ rm -f Gemfile.lock
$ cd sample
$ bundle install --path vendor/bundle
```

Railsプロジェクト内のGemfileをいじって、必要なgemいれる。
ディズニーストアの人気商品を手に入れる方法

# ディズニーストアの人気商品を手に入れる方法

## 前提

奥さんはディズニーの「ラプンツェル」というキャラクターが好きだ。

ある日「ディズニーストアで販売している『ラプンツェルLEDライト』という商品がどうしても欲しいんだけどいつも売り切れてて・・・再入荷したらアラートが来るようにできないか？」という相談を受けた。

## まずは敵を知る

ディズニーストアには[オンラインショップ](http://www.disneystore.co.jp/)があるので、まずは要素を見てみる。

そこでわかった重要なことは以下の3点だ。※2014年10月01日 時点

* 公式には入荷アラートの機能は存在しない。
* 商品にはそれぞれ固定のURLが存在する。
* 在庫がある商品には、購入数を選択するセレクトボックスと購入ボタンが存在する。

ここまでわかればこっちのものだ。

## 攻略法（仕様）を決める

cronで定期的に商品ページをスクレイピングして、在庫があるときにだけでる要素が存在すればメールでアラートすることにする。

* 10分に1回処理を実行。
* 在庫があるかの確認は、購入数を選択するときにだけ表示される「数量」という文字があるかどうかで行う。
* メールが何回も送られてくるのは嫌なので1度だけ送るようにする。
* 深夜のメールは迷惑なので、7時から25時までの間だけメールを送るようにする。
* 今後別の商品でも同じ要望があるかもしれないので、「商品の指定」と「在庫チェック」は分離して実装する。

## 実装

```disneystore_check.php
<?php

$id      = 1;
$url     = "http://www.disneystore.co.jp/shop/ProductDetail.aspx?sku=4936313635065&CD=F3000283&WKCD=";
$name    = "ラプンツェルLEDライト";

$checker = new StockChacker($id, $url, $name);
$checker->run();

class StockChacker {

    const AGENT    = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36";

    const ENC_FROM = "SJIS";
    const ENC_TO   = "UTF-8";

    const KEYWORD  = "数量";

    const PID_DIR  = "/tmp/cron/disneystore";

    private $id;
    private $url;
    private $name;

    public function __construct($id, $url, $name) {
        $this->id   = $id;
        $this->url  = $url;
        $this->name = $name;
    }

    public function existsPid() {
        return file_exists(sprintf(static::PID_DIR . "/%s.pid", $this->id));
    }

    public function makePid() {
        touch(sprintf(static::PID_DIR . "/%s.pid", $this->id));
    }

    public function run() {
        if ($this->existsPid()) {
            return;
        }

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $this->url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_USERAGENT, static::AGENT);
        $res = curl_exec($curl);
        curl_close($curl);

        $res = mb_convert_encoding($res, static::ENC_TO, static::ENC_FROM);

        if (!strpos($res, static::KEYWORD)) {
            return;
        }

        mb_language('ja');
        mb_internal_encoding('UTF-8');
        mb_send_mail(
            "宛先",
            sprintf("%s入荷中", $this->name),
            $this->url,
            "From: 差出人"
        );

        $this->makePid();
    }

}
```

```crontab.txt
*/10 0,7-23 * * * php disneystore_check.php
```

## 結果

無事に購入できました。
※真ん中下にあるやつ。

![IMG_2673.JPG](https://qiita-image-store.s3.amazonaws.com/0/6335/41cbc12c-2b19-b4a4-b416-0c700036dd53.jpeg)
Rでハッシュテーブルをつかう


Rの`list`は名前でのlookupもできるが、リストなのでO(N)の計算量がかかって効率が悪い。

CRANにある`hash`パッケージをインストールすれば本当のハッシュテーブが使える。

http://cran.r-project.org/web/packages/hash/index.html


### install

```
install.packages("hash")
library(hash)
```

現時点での最新版(hash-2.2.6) は R ≥ 2.12.0 を必要とするので、古いバージョンのRで使いたければ、ソースをダウンロードして以下のようにするか、

```
install.packages("path/to/source", repos=NULL, type="source")
```

バージョンを指定してインストールすればよい

```
install.packages("hash", version="2.0.2")
```

### sample

```sample.R
h <- hash()
bh["a"] <- 123
h["b"] <- "str"
h["c"] <- list(a=1, b=2)

print(h)
# <hash> containing 3 key-value pair(s).
#   a : 123
#   b : str
#   c : 1 2

print(h[["b"]])   # => str


h["c"] <- NULL    # remove the entry
has.key("x", h)   # check whether the key exists

h2 <- h           # pass the reference
h2["y"] <- 456
print(h["y"])     # => 456

print(class(keys(h)))    # => character
print(class(values(h)))  # => list

```

#### 補足

* keyに使えるのは文字列のみ
* 通常のRのオブジェクトと違って、hashはpass by referenceのような挙動になる。つまりhashを別の名前の変数に代入してもコピーはされず参照先は同一のオブジェクトになる。

### 簡易速度比較

以下のスクリプトを実行してみる

```hash.R
library(hash)

dat <- hash()
for (i in 1:10000) {
    dat[as.character(i)] <- i
}

sum <- 0
for (i in 1:10000) {
    sum <- sum + dat[[as.character(i)]]
}

print(sum)
```

```list.R
dat <- list()
for (i in 1:10000) {
    dat[as.character(i)] <- i
}

sum <- 0
for (i in 1:10000) {
    sum <- sum + dat[[as.character(i)]]
}

print(sum)
```


#### 結果

```
$ time R --no-save < list.R > /dev/null
R --no-save < list.R > /dev/null  9.70s user 0.07s system 100% cpu 9.772 total
$ time R --no-save < hash.R > /dev/null
hash-2.1.0 provided by Decision Patterns

R --no-save < hash.R > /dev/null  1.85s user 0.03s system 100% cpu 1.880 total
```

期待通り速くなった。
半年くらいずっとMacで開発してたエンジニアが、Windowsを使ってアプリの開発をすることになったときにした環境整備


本当に久しぶりにWindowsで開発をすることになったので、Windowsのストレスになる部分を改善しておきたいという魂胆。

# (2015/2/17 追記)後日談

この話には後日談があります。

* [半年くらいWindowsで開発してみて、使い続けたツールと使うのをやめたツール](http://qiita.com/kikuchy/items/c47624843e1f5431ee69)

# 環境

- Windows 7
- OfficeとChromeしか入ってなかった、ほぼまっさらなPC

# フォント

何はともあれ、Macの画面に慣れてしまうとWindowsのフォントレンダリングの拙さが目立ってしまって仕方ありません。

## ClearTypeの設定

- http://windows.microsoft.com/ja-jp/windows/make-text-easier-read-cleartype

まずはこれ。
この設定をして、この見た目で問題ないならMacTypeは入れなくていいと思います。

## MacTypeの導入

https://code.google.com/p/mactype/

GDI++みたいな、フォントをMacっぽくぼかしてくれるやつです。
ChromeのWebViewやVisualStudioのテキストエディタなど、一部には適用されないので諦めましょう。

## Inconsolataの導入

http://levien.com/type/myfonts/inconsolata.html

コンソールなどに使う英字フォントです。見た目がかわいい。

## 等幅のメイリオフォント作成と、Inconsolataとのフォントリンク

[ごにょごにょすると](http://pc-zero.jp/technic/meiryoke_console.html)等幅のメイリオフォントを作ることができるそうです。
出来上がった等幅メイリオをInconsolataとフォントリンクしておけば、フォント設定をInconsolataにすると全角文字は等幅メイリオで表示されるんでしょうね。
やるかどうかはあなた次第。

# キーボード

## KeySwapでキーをリマップ

http://www.vector.co.jp/soft/winnt/util/se228667.html

レジストリを書き換えて、キーの挙動を変更してくれます。

とりあえず以下の設定を。

- CapsLock → Ctrl
- 再変換 → ひらがな

これで間違えてCapsLockかけることもないし、全角半角の切り替えが簡単になるはず。

## AutoHotKeyの導入

http://www.autohotkey.com/

ホットキーを自分で設定するためのアプリです。

無変換キーが押された時に、確実に半角にしておきたいので使います。
WindowsにはMacの「英数」に相当するキーがないので、以下のスクリプトで半角にするようにしました。

```
vk1Dsc07B::ToHankaku()

ToHankaku() {
	Send {sc070}
	Send {sc029}
}
```

スクリプトはコンパイルして、スタートアップに入れておきました。

あとはお仕事でよく行う処理のマクロを書いておいて実行するとか。

# パッケージ管理ツール

## Chocolateyの導入

https://chocolatey.org/

コマンドからWindowsアプリケーションを導入できるようにするパッケージ管理ツール。
GUIアプリだけでなく、CLIのアプリも導入できます。
Macでは[Homebrew](http://brew.sh/)や[MacPorts](https://www.macports.org/)がこれにあたります。

管理者権限で起動したcmd.exeに、コマンドをコピペするだけで使えるようになります。

お仕事で使うので以下のアプリを導入。

- Evernote
- git
- svn
- Skype

# ターミナル

cmd.exeでは貧弱だし、なんとなくPowerShell使う気にもならないしー、ということでbashかzshが欲しいところ。

## MinGWかCygwinの導入

- http://www.mingw.org/
- https://www.cygwin.com/

どちらもGNUのソフトウェアをWindowsでも使えるようにしてくれるものです。
（Cygwinはそれだけじゃないけれど）

どちらを使うかはお好みで。個人的にMinGWの方が好きなのでそっちを使うことに。
zshを使いたい方はCygwin一択ですね。MinGWだとzsh使えないので。

## minttyの導入

https://code.google.com/p/mintty/

見た目がきれいなターミナルエミュレータ。
以前から使ってるので惰性で使い続けてます。
[MinGWでのインストール方法はこちら。](http://zarari.hatenablog.com/entry/2013/08/22/235819)

フォントをInconsolataに設定しておきました。

## 前の環境からdotfilesを持ってくる

githubなんかに上げておくと便利。
cloneしてくるだけ。
ちなみに私のdotfilesは[こんな感じ](https://github.com/kikuchy/.dotfiles)です。

## opensshとかopensslの導入

MinGWは `mingw-get`で導入できます。
Cygwinは知らない。


# Macで使ったあのソフトが欲しい(2014/10/2 追記)

## MacVimが欲しい

http://www.kaoriya.net/software/vim/

香り屋さんのvimを使います。
有名なカレー屋さんのvim & gvimです。
Macで使っていた`.vimrc`があれば、使い方には困らないでしょう。

## XtraFinderが欲しい

http://ejie.me/

Cloverを使うことにしました。

[XtraFinder](http://www.trankynam.com/xtrafinder/)は、Finderのウィンドウをタブ化してくれるアプリ。
Explorerもタブ化したい。

## Alfredが欲しい

http://www.launchy.net/

launchyを使うことにしました。
プラグインを自分で開発すれば、Alfred並に色々できそうです。

---

これで一応、ストレスなく作業ができそうです。
明日から本気だす。
POSTパラメータの空白はエスケープしないと削除される（MSXML2.ServerXMLHTTP）

# 概要

POSTリクエストを行う際、空白は`+`または`%20`で置換する必要があります。
`MSXML2.ServerXMLHTTP`では、これを忘れると空白が削除され、データの内容が変わってしまいます。

# 問題

下記のコードは、example.comにXML文字列`myxml`をPOSTしています。

```js
var param = 'myxml=<xyz attr="one">...</xyz>'
var objSrvHTTP = Server.CreateObject('Msxml2.ServerXMLHTTP.6.0');
objSrvHTTP.open ('POST', 'http://example.com', false);
objSrvHTTP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
objSrvHTTP.send(param);
```

しかし、このままではパラメータ`myxml`の中の空白が下記のように削除されてしまいました。

```xml
myxml=<xyzattr="one">...</xyz>
```

# 解決方法

すべてのスペースを`+`または`%20`に置換したものを送信します。

```js
...
objSrvHTTP.send(param.replace(/\s/g, '+'));
// or
objSrvHTTP.send(param.replace(/\s/g, '%20'));
```

これで想定通りになります。

```xml
myxml=<xyz attr="one">...</xyz>
```

***追記***
今回のケースでは上記の修正で問題なく動きますが、一般にHTTPリクエストでパラメータを送る場合は`encodeURIComponent`を使います。

```js
objSrvHTTP.send(encodeURIComponent(param));
```

これにより、パラメータ値に&などの文字を含んでいるとケースでも問題なく送ることができます。
# メモ

Classic ASP で再現しました。
DataRow から値を読み書きする

意外と知られていない気がするので。

.NET Framework 3.5 から [`DataRowExtensions`](http://msdn.microsoft.com/ja-jp/library/system.data.datarowextensions%28v=vs.110%29.aspx) というクラスで `DataRow` オブジェクトに対する値の読み書きが強化されました。
使用するためには System.Data.DataSetExtensions を参照に追加してください。

```csharp
DataTable table = GetDataTable();

// 値の読み取り
string value = table.Rows[0].Field<string>("hoge_id");

// 値の書き込み
table.Rows[0].SetField("hoge_name", "ほげほげ");
```

これの何がいいかというと、これまでのインデクサを使用する方法で必要だった [`DBNull`](http://msdn.microsoft.com/ja-jp/library/system.dbnull%28v=vs.110%29.aspx) の考慮が不要になります。

```csharp
DataTable table = GetDataTable();

// DBNull.Value が格納されていた場合 InvalidCastException がスローされる
string value = (string)table.Rows[0]["hoge_id"];
// なので書くならこう↓↓ ダサい！抱かないで！
// string value = (string)(DBNull.Value.Equals(table.Rows[0]["hoge_id"]) ? null : table.Rows[0]["hoge_id"]);

// System.ArgumentException: 列'hoge_name'をNullに設定できません。DBNullを使用してください。 
string hogeName = null;
table.Rows[0]["hoge_name"] = hogeName;
// なので書くならこう↓↓ ダサい！○んで！（object 型へのキャストがないと null 合体演算子が型を解決できない）
// table.Rows[0]["hoge_name"] = hogeName ?? (object)DBNull.Value;
```

また、こちらは割と知られている気がしますが、[`DataTableExtensions`](http://msdn.microsoft.com/ja-jp/library/system.data.datatableextensions%28v=vs.110%29.aspx) というクラスで `Rows` プロパティの列挙がサポートされています。

```csharp
DataTable table = GetDataTable();
var records = from row in table.AsEnumerable()
              select new
              {
                   Id = row.Field<string>("hoge_id"),
                   Name = row.Field<string>("hoge_name") ?? "名無しさん"
              };
```

`DataTable` もこれらのメソッドを使って LINQ で処理すれば少しは付き合いやすくなる…かも？
QiitaAPIv2でQiitaの全タグ情報を取得して内訳を分析してみた

昨晩なかなか眠れなかったので、QiitaAPIv2で遊んでみたまとめです。
（API周りについて誤りがありましたらご指摘ください。）

### QiitaAPIv2について
まずAPIがv1とv2で情報取得に関しては、以下の様な違いがあります。
v2になって、**2倍の範囲から、1時間あたり多くの回数**取得出来るようになっています。

|                             |        v1       |        v2       |
|:---------------------------:|:---------------:|:---------------:|
| 1リクエストで取得可能な件数 |      100件      |      100件      |
|        1リクエストで取得可能な範囲       |      5000件     |     10000件     |
|      利用制限（認証時）     | 150リクエスト/h | 300リクエスト/h |

### タグデータの全体像
上記を踏まえて、今回取得するタグ情報について考えてみます。
まず、Qiitaで登録されているタグの数を調べてみると、**「8987」**です（2014-10-01時点）。

タグ数の調べ方は、Total-Count レスポンスヘッダから確認出来ます（[公式ドキュメント](http://qiita.com/api/v2/docs)参照）。
Chromeであれば、デベロッパーツールを出した状態でAPIをブラウザで叩けば確認出来ます（下図）。

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/4aa2e70c-96ba-8159-94e3-2c14834d41e5.png)

また、取得可能な範囲が10000件であるので、v2であれば、今なら**全てのタグ情報を取得可能**です。

###データ取得
簡単にPHPで以下のように取得してみました。リクエストごとにJSONファイルを出力しています。取得出来た後は自由に加工して分析します。
YourAccessTokenにアクセストークンを取得して代入してください。

```lang:get.php
<?php
$context = stream_context_create(array(
        'http' => array('ignore_errors' => true,
                        'header' => "Authorization:Bearer YourAccessToken")
));
for($i = 1; $i <= 100; $i++){
        $url = 'https://qiita.com/api/v2/tags?page='.$i.'&per_page=100';
        $res = file_get_contents($url, false, $context);
        $filename = './json'.$i.'.txt';
        file_put_contents($filename, $res);
}


```

### 分析（タグが付いている記事の数の比較）
タグが付与されている記事の数が多い順にグラフ化してみました。また、TOP20が全体に占める割合を表にまとめてみました。
普段は自分がフォローしているタグしか見てなかったりするので、上位に食い込んでいるタグが意外なものがあったりして面白かったです。
![タグ分析.png](https://qiita-image-store.s3.amazonaws.com/0/50690/f1a91e52-1390-8855-640f-e19a8ea23fb2.png)

|     タグ    | 全体に占める割合(%) |
|:-----------:|---------------------|
|     Ruby    |        4.97         |
|  JavaScript |        3.57         |
|    Rails    |        2.72         |
|     PHP     |        2.61         |
|     iOS     |        2.54         |
| Objective-C |        2.20         |
|    Python   |        1.93         |
|   Android   |        1.79         |
|     Git     |        1.66         |
|     Java    |        1.65         |
|    Linux    |        1.42         |
|     Mac     |        1.38         |
|     Vim     |        1.04         |
|    Xcode    |        0.96         |
|   Node.js   |        0.94         |
|    iPhone   |        0.91         |
|     AWS     |        0.81         |
|    MySQL    |        0.81         |
|   vagrant   |        0.78         |
|    CentOS   |        0.77         |
|    その他   |        64.53        |
PHP7調査(1)内部的な定数名や型名の整理

https://github.com/php/php-src のmasterの変更で気になるものをリストアップしてみる。

まずは8月末頃の大量のリネーム作業について。

* [master renames phase 1 · c3e3c98 · php/php-src · GitHub](https://github.com/php/php-src/commit/c3e3c98ec666812daaaca896cf5ef758a8a6df14)
* [master renames phase 2 · 6f9f0bf · php/php-src · GitHub](https://github.com/php/php-src/commit/6f9f0bf2056f0dc17d9bcc6dd3b7d28ac878c6fc)
* [master renames phase 3 · 4d997f6 · php/php-src · GitHub](https://github.com/php/php-src/commit/4d997f63d98c663b2d9acccd3655572652f61c7d)
* [master renames phase 4 · 455741f · php/php-src · GitHub](https://github.com/php/php-src/commit/455741fce3c4f4392deb97775cba7a39f6490271)
* [master renamings phase 5 · 28b7a03 · php/php-src · GitHub](https://github.com/php/php-src/commit/28b7a033185478839c511551ce2344e459e7f880)
* [master renames phase 6 · b9514bb · php/php-src · GitHub](https://github.com/php/php-src/commit/b9514bb8fd27e2d841bab3eb256fcbaa613aa049)
* [master renames phase 7 · af59e92 · php/php-src · GitHub](https://github.com/php/php-src/commit/af59e92b24c8f624672720d47ef65bd8457728b9)

たとえば次のような変更が見られます。

* zend_uint → 廃止、uint32_tに統一
* zend_ushort → 廃止

次のような修正も入っていますが、これらはごく最近導入された型や定数で、後方互換性を崩すものではありません。

* zend_size_t → 廃止、size_tに統一
* STR_INITのようなマクロ群 → 廃止
* SIZEOF_ZEND_INT → SIZEOF_ZEND_LONG に変更
* MAX_LENGTH_OF_ZEND_INT → MAX_LENGTH_OF_LONG に変更

これは以下のPHP Internals MLでの議論がもとになっているようです。

* [php.internals: Naming issues, solutions](http://news.php.net/php.internals/76848)
[Java]SLF4J&LogbackでLogging

# SLF4J&LogbackでLogging

## 前提

今のプロジェクトではサーバーサイドはJava（Tomcat）で書いています。
LoggingはSLF4J&Logbackを使っています。

ここを参考にlogback.xmlつくってます。
[コピペで始めるSLF4J & Logback](http://dev.classmethod.jp/server-side/java/slf4j-logback/)

あとはこの辺も参考にしています。
[SLF4J+Logback 運用編](http://www.javazuki.com/archives/cat_1093015.html)
[SLF4J+LOGBackでログレベル別に出力先を切り分けることは出来るの？](http://d.hatena.ne.jp/kimutansk/20131026/1382795653)

## ログレベル

```
TRACE < DEBUG < INFO < WARN < ERROR
```

## Logbackのタグ説明

### appendar
出力のルールを記述する。このタグを書いただけでは、実際にログ出力は行われない。

### logger
特定のパッケージ、クラス、識別名をどの出力ルールで出力するのかを記述する。
* additivity="false"を使うと、指定level以上はappender-ref出力ルールでのみ出力される。
* additivity="true"を使うと、rootタグの出力ルールでも出力される。

### root
loggerで指定されていないものをどの出力ルールで出力するのかを記述する。

### turboFilter
マーカーによって動作を変えることができる（らしい）。

## Logbackを環境ごとに分ける
環境ごとにlogback.xmlを作成して、build時に適切な環境のlogback.xmlをパッケージングするようにしています。

```
config
 L logback.develop.xml
 L logback.stage.xml
 L logback.release.xml
```

```build.xml
<property name="mode" value="develop" />
<property name="classesdir" value="class" />
<property name="configdir" value="config" />
<target name="copy">
    <copy overwrite="true" tofile="${classesdir}/logback.xml" file="${configdir}/logback.${mode}.xml"/>
</target>
```

## その他

### 例外オブジェクトを渡すとトレースが出力される

```java
try {
    // HOGE;
} catch (Exception e) {
    logger.error(e.getMessage(), e);
}
```

### debugは出力されなくても処理はされる

LEVEL=info以上を出力するようにしても、debugの処理は行われる。
で、以下のような処理は無駄なコストを払うことになるので注意。

```java
logger.debug("HOGE:" + hoge.toString());    // 文字連結の処理が無駄になる
```

こういうのはisDebugEnabledで処理させないように書いておくのが吉。

```java
if (logger.isDebugEnabled()) {
    logger.debug("HOGE:" + hoge.toString());
}
```
Logbackでファイルにログを吐く時の基本設定


オレオレ設定だけど、いつも調べて忘れるのでまとめておく。

```xml

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
	<encoder>
		<pattern>%date{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{0} - %msg \(%file:%line\)%n</pattern>
	</encoder>
	<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
		<level>INFO</level>
	</filter>
</appender>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<file>logs/app.log</file>
	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
		<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log.tar.gz</fileNamePattern>
		<maxHistory>7</maxHistory>
	</rollingPolicy>
	<encoder>
		<pattern>%d{yyyy-MM-dd'T'HH:mm:ss'Z'} - %m%n</pattern>
	</encoder>
</appender>

<root level="DEBUG">
	<appender-ref ref="FILE" />
</root>
	
<logger name="FILE" additivity="false">
	<level value="INFO" />
	<appender-ref ref="FILE" />
</logger>
```
## 要素について

* **appendar**
appendarの指定.

* **file**
ファイルの保存先の指定.

* **rollingPolicy**
RollingFileAppendarの時指定する. TimeBasedRollingPolicyはその名の通り時間指定でrollingする。どのタイミングかはその後のfileNamePatternで指定できる.

* **fileNamePattern**
%dオプションで指定した粒度でrollingする. 拡張子に.zipや.tar.gzを指定するとrollingの際に同時に圧縮処理も行われる.

* **maxHistory**
ファイルを保存する最大数。これを越えたファイルはrolling時に削除される.

* **encoder.pattern**
１行の出力内容を指定する.

* **filter**
ログメッセージの出力条件をフィルタする設定.

## PatternLayoutについて

* **%d %date**
日付のフォーマット.%d{ISO8601}のようにも書ける. {pattern, timezone}のように第二引数をとることが出来る. {yyyy-MM-dd HH:mm:ss.SSS'Z',UTC}のように指定する.

* **%m %msg %message**
ログメッセージ. 

* **%n**
改行コード

* **%t %thread**
ログ出力スレッドの名前

* **%p %le %level**
ログレベル

* **%c %lo %logger**
カテゴリ名. {}の中の数字で, パッケージの階層表示の出力を指定する. %c{1}だとcom.example.loggingの「logging」だけの出力になる.

* **%F %file**
ログを生成したソースファイル名

* **%L %line**
ログを生成したソースの行番号
anyenvを使ってる場合のruby-buildの更新方法

# 問題
[anyenv](https://github.com/riywo/anyenv)を使ってるんですが、rubyの特定のverが欲しいのにどうやってもrbenv install -lに出てこなくて困った

# 解決法
普通にruby-buildを更新すればいいのだが、anyenvを使ってる場合はanyenv内のruby-buildを更新してる必要があった
具体的には以下をやればおk

```shell-session
$ cd ~/.anyenv/envs/rbenv/plugins/ruby-build && git pull origin master
```

# 何がいけなかったか
brewでruby-buildがなぜか入ってて、brewで入れた方をupgradeしても更新されないのでハマった
辛い
Rails4.2の新機能についてパート2

#Rails4.2の新機能
Rails4.2から追加される機能について調べているので、そのメモの第2弾です。適宜修正したりします。

##Web Console
web上でrubyのコンソールを立ち上げることができます。viewのソース上に以下のように記述するだけです

```ruby:app/views/users/console.html.erb
<%= console %>
```

上記のようなファイルを作成し、controllerやroutes.rbに必要なコードを追加し実行するとWeb Consoleが立ち上がります。


![スクリーンショット 2014-10-01 18.41.05.png](https://qiita-image-store.s3.amazonaws.com/0/1686/e20b445d-c516-6024-0239-164cd544cc34.png)

<code>rails console</code>のようにmodelの検証などもできます

```ruby
User.create(name: 'test', age: 30)
User.all
```

##その他
他の機能はまた後日
yum を使用して、パッケージをインストールせずにダウンロードだけを行う方法

# yum を使用して、パッケージをインストールせずにダウンロードだけを行う方法

パッケージをインストールせずにダウンロードだけを行うには、yum の "downloadonly" プラグインまたは yumdownloader ユーティリティを使用する二つの方法があります。

## Downloadonly plugin for yum

downloadonly" プラグインを収録したパッケージをインストールします

```bash
(RHEL5 の場合)
# yum install yum-downloadonly

(RHEL6 の場合)
# yum install yum-plugin-downloadonly
```

```bash
# yum install --downloadonly --downloaddir=<directory> <package>
```

## Yumdownloader

インストール済みパッケージをダウンロードするのであれば、yumdownloader を使用

```bash
# yum install yum-utils
```

```bash
# yumdownloader <package>
```

## 参考
https://access.redhat.com/ja/node/395763
UIButtonを動的に作るサンプルコード

ほとんどのアプリで必ず使われるUIButtonですが、swiftでの基本的な使い方を見て行きたいと思います。

```swift
let button = UIButton()
//表示されるテキスト
button.setTitle("Tap Me!", forState: .Normal)
 
//テキストの色
button.setTitleColor(UIColor.blueColor(), forState: .Normal)
 
//タップした状態のテキスト
button.setTitle("Tapped!", forState: .Highlighted)
 
//タップした状態の色
button.setTitleColor(UIColor.redColor(), forState: .Highlighted)
 
//サイズ
button.frame = CGRectMake(0, 0, 300, 50)
 
//タグ番号
button.tag = 1
 
//配置場所
button.layer.position = CGPoint(x: self.view.frame.width/2, y:100)
 
//背景色
button.backgroundColor = UIColor(red: 0.7, green: 0.2, blue: 0.2, alpha: 0.2)
 
//角丸
button.layer.cornerRadius = 10
 
//ボーダー幅
button.layer.borderWidth = 1
 
//ボタンをタップした時に実行するメソッドを指定
button.addTarget(self, action: "tapped:", forControlEvents:.TouchUpInside)
 
//viewにボタンを追加する
self.view.addSubview(button)
```

サンプルコード、詳細の解説はこちらに
http://tech.eversense.co.jp/38
開発ブランチ(master)のPHPをビルドするときの注意点

php-5.?.?.tar.bz2のようなtar ballからビルドするときとリポジトリ最新版をビルドするときとでは手順が違うよ、という話をまとめてみます。

僕は既に必要パッケージ類をインストール済みなので、今度新マシンをセットアップするときにもっと真面目にまとめなおします。

## ./configureを自分で作らないといけない

といっても`./buildconf`するだけですが。

## 必要パッケージが少し違う

tar ballからビルドするときは不要なre2cとかbisonとかが必要です。必要に応じてインストールしましょう。

また、MacOSXでHomebrewを使っている場合、`brew install bison`でbisonをインストールしていると「bisonが新しすぎる」と文句を言われることがあります。（最近のmasterブランチではbison3対応しているので、この問題は起きないようです。やったね！）

```
configure:5267: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 2.3, min: 204, excluded: 3.0).
```

`brew install bison27`すればbison 2.7.xがインストールされますので、configure時に次のように指定してあげましょう。

```
YACC="/usr/local/Cellar/bison27/2.7.1/bin/bison" ./configure
```

不幸なことに、一部のLinuxディストリビューションではbison3以外の選択肢が無いらしいです。その場合、bisonも自力でビルドする必要があるでしょう。


## Xcodeのbisonが古すぎるかも…？

YACC周りでトラブルが起きることがあるかもしれません。たとえば、次のように新しい演算子に対応するトークンが見つからない場合は怪しいですね。

```
.../php-src/ext/tokenizer/tokenizer_data.c:55:71: error: use of undeclared identifier 'T_COALESCE'
```

私の場合、MacOSX上でXcodeに同梱のbisonが思うように動いてくれませんでした。古すぎるのかなあ…？

このような場合、YACCを明示的に指定すると平和になるかもしれません。以下はHomeBrewで入れたbison3を使う場合の例です。CCでccacheも利用していますが、頻繁にコンパイルする場合以外は指定しなくて良いでしょう。

```
YACC=$(brew --prefix bison)/bin/bison CC='ccache gcc' CFLAGS=-O3 LDFLAGS=-s ./configure --prefix=$HOME/tmp/usr --with-config-file-path=$HOME/tmp/usr/etc --enable-mbstring --enable-zip --enable-bcmath --enable-pcntl --enable-ftp --enable-exif --enable-calendar --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-curl --with-mcrypt --with-iconv --with-gmp --with-gd --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-zlib-dir=/usr --with-freetype-dir=/usr/local --with-t1lib=/usr/local --enable-gd-native-ttf --enable-gd-jis-conv --with-openssl --with-mysqli=/usr/local/bin/mysql_config --with-pdo-mysql=/usr/local --with-gettext=$(brew --prefix gettext) --with-zlib=/usr --with-bz2=/usr --with-recode=/usr/local --with-mysqli=/usr/local/bin/mysql_config
```

## php-buildでビルドする

せっかくmasterをビルドしたらエクステンションも使いたいので、なんだかんだphp-build（phpbrewなどでも良いですが）が便利ですね。

```
$ YACC=$(brew --prefix bison)/bin/bison CC='ccache gcc' CFLAGS='-g' phpenv install master
```

上の例はccacheが無いと動きませんが、特にmasterは頻繁にビルドするはずなのでccacheもインストールすることをオススメします。
Microsoft Azure、MSDN日本語版ドキュメントの探し方

小ネタです。

## これは何？
MSDNの日本語版ドキュメントから別のMSDNへのリンクが英語版のまま
ってことよくあるじゃないですか。
ex.
http://msdn.microsoft.com/ja-jp/library/azure/jj155995.aspx
の[「Azure アプリケーションの計画と設計」](http://msdn.microsoft.com/library/azure/hh674495)とか

飛んだ先が英語版だった時、日本語訳前なんだと諦める前に試すこと。
他にもあれば教えて下さいmm

## URLにja-jpを足してみる

http://msdn.microsoft.com/library/azure/hh674495
↓
http://msdn.microsoft.com/ja-jp/library/azure/hh674495
Mac で Yeoman の環境を構築する手順


[Yoeman](http://yeoman.io) を利用すると、手軽にフロントエンドの開発環境を構築できます。
（きちんとやるなら使いづらい部分も出てくるかと思いますが、最初はこれで十分かと。）

## 前提

- OS： `Mac OS X (Mavericks)`

## 手順

- もし **Homebrew** がはいってなければ、[公式ページ](http://brew.sh/index_ja.html)どおり、次のようにインストールします。

	```shell:
	$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
	```

	※ 執筆時とコマンド内容が変わってるかもしれないので、公式ページを確認ください。
	※ 事前に **Xcode** のインストール(および起動して許諾への同意)が必要。ただ他にコンパイル環境があれば不要。

- もし npm コマンドがはいってなければ、Homebrew で **Node.js** をインストールします。

	```shell:
	$ brew install node
	```

	> もし Node.js をきちんとバージョン管理する場合は **NVM** や **nodebrew** を利用した方がよいのですが、これだけの用途であれば Homebrew 経由のインストールで問題ないと思います。
	> また、GUIのインストーラでもインストールできますが、そうすると root権限 でないと動かせなくなってしまうため、のちのち不都合が出てくるのでオススメできません。

- npm コマンドで **Yeoman** をインストールします。

	```shell:
	$ npm install -g yo grunt-cli bower
	```

## ほか

- Yeoman の公式サイト
	- http://yeoman.io
Python dictに対しAttributeでアクセスできるようにする

## 動機

Pythonでは、JavaScriptなどとは異なりディクショナリ要素に対しAttributeでアクセスすることはできない。
つまり、`dict_obj["value"]`はOKだが`dict_obj.value`とはできない。

これで不便を感じるのは、Jsonデータを扱う際だ。なんといってもJavaScript側ではAttributeでアクセスできるので、同じように書きたいというのが人情である。

そんなわけで、dict(今回はJsonオブジェクトを想定)に対しAttributeでアクセスする方法を紹介する。

## 実装
Pythonでは、Jsonをloadすると、ディクショナリになる。

```pycon
>>> import json
>>> json.loads('{"v1":"xxxx", "v2":"vvvv"}')
{'v1': 'vvvv', 'v2': 'xxxx'}
```

前述したとおり、アクセスする際は`obj["v1"]`という形になり`obj.vi`はNGになる。

これを解決する一番簡単な方法は[attrdict](https://pypi.python.org/pypi/attrdict)というライブラリを使ってしまうことだ。

ただ、わざわざインストールするのがちょっと、という場合は以下のような簡易な方法が使える。
`json.loads`を行う際に、`object_hook`を利用し各オブジェクトを属性アクセスを実装(`__getattr__`)したクラスでラップするようにする。これで、Attribute経由で要素にアクセスできるようになる。

```py
import json

class AttributeDict(object):
    def __init__(self, obj):
        self.obj = obj

    def __getstate__(self):
        return self.obj.items()

    def __setstate__(self, items):
        if not hasattr(self, 'obj'):
            self.obj = {}
        for key, val in items:
            self.obj[key] = val

    def __getattr__(self, name):
        if name in self.obj:
            return self.obj.get(name)
        else:
            return None

    def fields(self):
        return self.obj

    def keys(self):
        return self.obj.keys()

if __name__ == "__main__":
    attribute_json = json.loads('{"v1":"xxxx", "v2":"vvvv"}', object_hook=AttributeDict)
    print("attribute_json.v1 = {0}".format(attribute_json.v1))

    json_with_array = json.loads('{"arr":[{"v":"xxxx"}, {"v":"vvvv"}]}', object_hook=AttributeDict)
    print("json_with_array[0].v = {0}".format(json_with_array.arr[0].v))

```

実行結果

```
attribute_json.v1 = xxxx
json_with_array[0].v = xxxx
```

Attributeアクセスができるとコードの補完もきくようになるので、実装しやすくなる。お試しされたし。

## 参考
[attrdict](https://pypi.python.org/pypi/attrdict)
[using JSON keys as python attributes in nested JSON](http://stackoverflow.com/questions/10026797/using-json-keys-as-python-attributes-in-nested-json?lq=1)
[soundcloud-python/resource.py](https://github.com/soundcloud/soundcloud-python/blob/master/soundcloud/resource.py)
[Sample on Gist](https://gist.github.com/icoxfog417/8d19775969b238be413c)
Redmineのメール連携で"Request was denied by your Redmine server. Make sure that 'WS for incoming emails' is enabled in application settings and that you provided the correct API key."

こちらの公式マニュアルのやり方に従ってやってみたら、表題のエラーが出ました。
[メールによるチケットの登録](http://redmine.jp/guide/RedmineReceivingEmails/)


```shell-session

$ echo hello | /usr/local/rbenv/shims/ruby /var/www/redmine/extra/mail_handler/rdm-mailhandler.rb --url https://redmine.example.com/ --key  himitsu --project test
Request was denied by your Redmine server. Make sure that 'WS for incoming emails' is enabled in application settings and that you provided the correct API key.
```


公式サイトによると、エラーの原因は

http://redmine.jp/faq/issue/mail-handler-errors/
> 設定「受信メール用のWebサービスを有効にする」が有効になっていないか、APIキーが誤っています。

とありますが、設定は有効にしてあるし、APIキーも間違ってないし、おかしいなーと。

## 原因はWebサーバのIPアドレス制限だった。

redmineを動かしてるサーバでメールを受信してrdm-mailhandler.rb を起動するアーキテクチャにしていたのですが、

よく考えると URLが`https://redmine.example.com/` となっており、自ホストに対してグローバルIP経由でアクセスしていました。

なので、Webサーバ(この場合はNginx) のIPアドレス制限ではじかれていたようです。

Nginxの設定ファイルを編集して、自ホストのグローバルIPを許可するようにしたら解決しました。

エラーメッセージが不適切なためにハマってしまいましたが、まあフリーソフトウェアなのでしょうがないですね。:(
Bitbucket...無料でGitプライベートレポジトリが作れるツール

<b>Bitbucket</b>
https://bitbucket.org/

* 機能はGitHubと似たような感じ。
* プライベートレポジトリが無料で作れる。
* ユーザー数が5人までなら無料で使用可能。
snakeyamlでYAMLをbeanにロードする

アプリケーションの設定ファイルにプロパティファイルではなくYAMLを使いたくなったので。
注意点としては、Beanをinner classにするとClass Not Foundになること。

```yaml:conf.yml
--- !!Bean
name: ABC
```

```java:bean
public class Bean {
  private String name;

  public Bean() {
  }

  public String getName() {
    return name;
  }

  public void setName(String Name) {
    this.name = Name;
  }
}
```

```java:loader
import java.io.InputStream;
import org.yaml.snakeyaml.Yaml;

public class Loader {
  public Bean load() {
    Yaml yaml = new Yaml();
    InputStream is = getClass().getResourceAsStream("/conf.yml");
    Yaml yaml = new Yaml();
    return (Bean)yaml.load(is);
  }
}
```
jQueryで、表示されているDOMに依存しないイベントを作成する

タイトルで出落ちというか、勘が良い人は分かってしまったと思いますが・・・。

javascriptで、ローカルスコープで有効なイベントが欲しいことがあります。以下のような感じで使えるものがほしいのです。

```js
function foo(){
    var eventManager = new EventManger();
    function bar(){
        eventManger.bind(function(){
            // something to do
        })
    }
    function baz(){
        eventManger.trigger();
    }
}
```

しかし、jQueryのイベントは、通常DOMと関連づけられています。グローバルなイベントもありますが、上のようにローカルスコープで扱いたいときには使えませんし、なにより設計的に良くありません。

では、どうすれば良いのでしょうか。ここで、「表示されていないDOM」を作って、そこにイベントを割り当ててやれば良いということに気づきました。上記のコードは、以下のようになります。

```js
function foo(){
    var eventManager = $('<div></div>');
    function bar(){
        eventManger.bind('loaded', function(){
            // something to do
        })
    }
    function baz(){
        eventManger.trigger('loaded');
    }
}
```

見事、ローカルスコープと関連づけられたイベントができました。
EventMangerの実装とかするまでもないですね。
10/1 本日の共有



### Swift

[[Swift]曇りガラスのかかったサイドバー（blur, Xcode6 beta6) - Qiita](http://qiita.com/kiiita/items/5bed975c3b4fcc55de54)

[iOS 8] Swiftでデザインパターン No.2 Iterator ｜ Developers.IO - http://dev.classmethod.jp/references/ios8-swift-design-pattern-iterator/

### iOS8:code
iOS6のサポートをそろそろ切るので使ってみたい、と思ったがiOS8以上だった
[[iOS 8] UIVisualEffectViewを使ってすりガラス効果を実現する](http://dev.classmethod.jp/references/ios8-uivisualeffectview-ref/)

### iOS8:app
[通知センターから今日やるアニメをサッと確認できる「今日のアニメ」をリリースしました](http://d.hatena.ne.jp/KishikawaKatsumi/20140918/1410997683)

### ライブラリ、ツール
[【Objective-C】かっこいいグラフの比較 - ITごはん](http://hidekit.hatenablog.com/entry/2014/06/03/174211)

[MacOSXのシェルスクリプトだけで、iOS, Android両アプリアイコンの全サイズを生成する - Qiita](http://qiita.com/hibara/items/c25054f336a95d58f591)

### 
CoreDataはいろいろめんどいけど、モデルとコントローラを完全に分離できるから重宝もする。どうしたもんかねー
[Facebook: iOSアプリのアーキテクチャ](http://wazanova.jp/items/1547)

[iOS - スクショを送られてきた時にデバッグを楽にするライブラリを作った - Qiita](http://qiita.com/dealforest/items/6e9f2e228cba71520cf0)

### 実践したいこと
[Pull Request のフォーマットを決めるとレビューの効率が3倍よくなる :: Crocos Engineering Blog](http://engineering.crocos.jp/post/98455177675/pull-request-3)

[メンテナンス - メンテナビリティをあげるには？ - Qiita](http://qiita.com/minminmink/items/02ecba4c11e099dc729a)

[サイボウズ式：「振り返り」は批判大会ではない | サイボウズ式](http://www.huffingtonpost.jp/cybozu/work_b_5847514.html)

### その他
『通常、プレスリリースは製品を開発した後に作成するものですが、Amazonは開発に取り掛かる前にリリースを作成します。そうすることで、製品の魅力や解決する課題が何なのかをチームで確認し合うのです』
[なぜ、アマゾンは超爆速でサービスを進化させられるのか？ AWS Summit Tokyo 2013で中の人に聞いてみた - エンジニアtype](http://engineer.typemag.jp/article/awssummit2013)

[おもしろそう: 第7回モノづくり実践プロジェクト](http://ifdl.ec.t.kanazawa-u.ac.jp/mono/)

[Ruby - 遺伝的アルゴリズム(GA)によるサーバの自動チューニング - Qiita](http://qiita.com/tumf/items/918ef218eeade512012c)

あとで読む
[Rubyソースコード完全解説](http://i.loveruby.net/ja/rhg/book/)
infinite scroll実装メモ２

[環境]
ruby 2.1.0p0
Rails 4.0.2
jquery使用
kaminari使用
bootstrap使用
turbolinks使用
jquery-turbolinksも使用

<a href="http://qiita.com/e_do_san/items/123131967df478d76cfc">前に</a>、次のページの情報をjsonで取得してきて、次のページ読み込むまでのスクロール高さも計算して…ってややこしい方法でやってましたが、アホみたいに簡単なやりかた見つけたのでメモ…

[そもそもjsonで返す必要なかった]
dataTypeに"html"を指定してもiTemSelectorで指定した要素を抜き出して表示してくれる模様。html全部取ってきて埋め込まれるものとばかり思っていたのでhtml使う選択肢が頭になかった。あたまいたい。

<a href="http://qiita.com/e_do_san/items/123131967df478d76cfc">前回</a>と同じように実装する場合は以下のようにすれば実装可能

```talk.html.erb
    <div id="talks">
      <% @talks.each do |talk| %>
        <%= render talk %>
      <% end %>
      <div class="navigation">
        <%= link_to "next page?", talks_path(:page => 2), :class => "hidden" %>
      </div>
    </div>
```

```talk.css.scss
  #talks{
    max-height:お好きなpx;
    overflow-y:scroll;
  }
```

```talk.js
var clo_InfiniteScrollTalk = function(){
  $(function(){
    if($("#talks").length == 0){
      return;
    }

    $("#talks").infinitescroll({
        debug : true,
        loading:{
          finishedMsg: "last comment."
        },
        contentSelector : "#talks",
        itemSelector : "#talks > .comment-line-box",
        navSelector  : "#talks > .navigation",
        nextSelector : "#talks > .navigation > a",
        dataType: "html",
        binder: $("#talks"),
        behavior: "local",//binderに$(window)以外を指定する場合これを指定する。
                          //更に、local.jsをjquery.infinitescroll.min.jsの後に読み込んでおくこと。
                          //公式から落としてきたinfinite-scroll-master/behaviorsフォルダにソースがある。
        bufferPx: 40,
        pixelsFromNavToBottom: 0,
        errorCallback: function(){
          //適宜処理
        }
    });
  });
}();
```

ちなみに、binderオプションは標準では$(window)となるようで、これがturbolinkと相性が最悪で、ページを読み込む度にイベントが生成されてしまう模様。
標準のオプションで実装する場合はイベントの重複を回避するために、

```js
$(function(){
  $(window).off("smartscroll");
});
```

をinfinite scroll生成より先に呼び出せば正常に動くっぽい。
とてつもなくスッキリした…レスポンシブデザインでも全然問題ないし、俺はここ数日いったい何をやっていたのか…OTL
SublimeTextで一つのキーバインドで複数のコマンドを実行させてSidebarの操作をdirex+popwin的にする


# SublimeTextで一つのキーバインドで複数のコマンドを実行

SublimeTextで一つのキーバインドで複数のコマンドを実行するプラグインを見つけました。

[sublime-text-multiple-commands](https://github.com/Just-MadDEN/sublime-text-multiple-commands)

色々応用できて便利そうですね。

# Sidebarの操作をdirex+popwin的にする

emacsではディレクトリをSublimeTextのsidebar的にツリー構造で表示してファイルを選択できるdirexというパッケージがあります。
これとpopwinと組み合わせる事で選択し終えたらそのウィンドウを閉じるという事が出来、非常に便利です。

それっぽい動作をSublimeTextでも出来ないかとmultiple-commandsを使ってやってみました。

単純にキーバインドを追加するだけです。

```json
    {
        "keys": ["ctrl+x", "ctrl+j"],
        "command": "run_multiple_commands",
        "args": {
            "commands": [
                {"command": "toggle_side_bar", "context": "window"},
                {"command": "focus_side_bar", "context": "window"}
            ]
        },
        "context": "window"
    },
    {
        "keys": ["enter"],
        "command": "toggle_side_bar",
        "context": [{"key": "control", "operand": "sidebar_tree"} ]
    },
```

C-x C-jでsidebarが開き、enterで選択し終えたらSidebarが閉じてくれます。便利ですね。