OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptでapple-touch-iconを設定

#JavaScriptでapple-touch-iconを設定

**ものすごーく小ネタです。**

iPhoneやiPadなどのWebクリップ用のアイコン設定ですが、いちいち全ページに追記するのは面倒ですよね。
機種や解像度で設定が増えたりしますし。
…ということで、もともと全ページに埋め込んでる共通のJavaScriptで設定タグを埋め込むようにします。

ちなみにアップルのガイドラインはこちらです。
[Specifying a Webpage Icon for Web Clip](https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html)

まぁHeadにLinkタグを挿入するだけなんですが。

```lang:JavaScipt
//apple-touch-icon対応
var icon = document.createElement("link");
icon.setAttribute("rel","apple-touch-icon");
icon.setAttribute("href","/apple-touch-icon.png");
document.head.appendChild(icon);
```

種類が増えた場合はループなりで対応します。

お粗末...
link_to,button_toでcreate, updateを行う


hogeモデルのcreate,updateにformからでなくlink_to、button_toからデータを投げる方法の覚書。

#ルーティングのおさらい
- createはindexと同じhoges_path, method: post
- updateはhoge_path, method: put


## create
```ruby:
= link_to 'Create', hoges_path(hoge: {user_id: current_user.id, body: 'fuga'}), method: :post
= button_to 'Create', hoges_path(hoge: {user_id: current_user.id, body: 'fuga'})
```

##update
```ruby:
= link_to 'Update', hoge_path(@hoge), method: :put, params: { body: 'fuga' }
= button_to 'Update', hoge_path(@hoge), method: :put, params: { body: 'fuga' }
```

##注意点
- getの時と同じようにパラメーターがURLに付与されてしまうのでパラメーターを隠す目的でpostを指定する場合には使えない。
- button_toだとhtmlでは\<button> タグになるが、buttonタグはIE7以下だとバグがあるらしい。button_toではtype="submit"が自動的に付与されているのであまり気にしなくても平気かもしれないけれど一応注意。<br />
[参考]button要素で送信・リセット・汎用ボタンを自由に作ろう http://honttoni.blog74.fc2.com/blog-entry-153.html

##link_to method: :postでパラメータをURLに含めずに送る方法
結論から言うと、railsのみで対応する方法は見つからず、jQueryに頼る他なかった。
自分は↓のを使わせていただきました。この場を借りて多謝。
http://www.techscore.com/blog/2013/10/11/rails-link_to-で-post-したら-request-too-long-と言われたあなたへ/

####疑問点
railsのapi docを見ると、button_toのオプションではparamsを取れることになっていて、以下の説明がついていた。
> Hash of parameters to be rendered as hidden fields within the form

しかし、第２引数にparamsを置いてもhidden fieldにはならず、以下のようにbuttonタグ内に置かれてしまう。

```ruby:
= button_to 'Create', hoges_path, params: {body: 'fuga'}, method: :post
```
　　　↓

```html:
<button params="{:body=>"fuga"}">Create</button>
<input name="authenticity_token" type="hidden" value="r9zz5Bsp1RSm/qhdNzpDai1cdG4OSm2lcPlqyM2txPE=">
```

書き方が悪いのか、なんでなのか。。。わかる人がいたら教えてください。
Kinoma Create 届いた!

Kinoma Create が届いたので、早速使ってみた。

Kinoma Create はハードウェア機能からいうと、以下のような感じになる。
`Kinoma Create = RaspberryPi + タッチディスプレイ + マイク + スピーカ + 無線LAN + Bluetooth 3.0 - 有線LAN`
Bluetooth Low Energy がついていないのは、いまどき残念なんだけど、スマホとの通信は、無線LANでやればいいか。

家には、[TANITA デジタル温湿度計](http://www.amazon.co.jp/dp/B005UJ012I/)があります。冬など、湿度がさがるとインフルエンザが発生しやすくなるが、この温湿度計は温湿度から判断して警告してくれる。

そんな温湿度計が、この Kinoma Create に温湿度センサーをつけることで、簡単にできて、かつ温湿度のデータを記録しておけば、時間変化推移もみることもできる。

Raspberry Pi を使っても同様なことはできるけど、別途小型のディスプレイが必要だし、ディスプレイをPC用のディスプレイで代用するのもなんだか嫌なので、こんな風に全部入りがあると機器としてコンパクトにまとまっていてよい。配線も最小限度で済むしね。湿度が一定以下に下がったら、加湿器のスイッチオンなんてこともできるかも。

まず、はじめに [LEDピカ](http://kinoma.com/create/samples/digital-out-led/)をやってみました。
タッチパネルのボタンを押すと、LEDをつけたり消したりできます。
このプログラムは、PCにつながなくてもできるようになっています。
![IMG_1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/60968/5676cdd2-ad36-bbcc-1018-a5fb5e30962a.jpeg)

コントロールパネルから、ピンのわりあてを設定して、LEDをピンに指すだけです。カソード（足の長い方）を左側に指します。本当は、抵抗を挟まないといけないようですが、果敢に直指ししました。直指しがどれくらいわるいことしてるかはよくわかってません。よいこはマネしないように。

次は、開発環境に挑戦します。
Vue.jsでオブジェクトから同じ要素を何度もリストに拾ってはpushする何か

# 例 オブジェクト``Supermans``の要素を``entries``に任意で何度もpushする

- Supermans
    - キン肉マン（ダメ超人）
    - ロビンマスク（超人博士）

**↓**

- entries
    1. キン肉マン（ダメ超人）
    2. ロビンマスク（超人博士）
    3. キン肉マン（ダメ超人）

これを、Vue.jsを使って実現する場合…

```js:javascript

var Vue = global.Vue = require('vue');
var Supermans = [
  {
    title: 'ダメ超人',
    player: 'キン肉マン'
  },
  {
    title: '超人博士',
    player: 'ロビンマスク'
  },
  {
    title: '善戦超人',
    player: 'ジェロニモ'
  },
  {
    title: 'テキサス・ブロンコ',
    player: 'テリーマン'
  },
  {
    title: '世話係',
    player: 'アレキサンドリア・ミート（ミートくん）'
  },
  {
    title: 'ファイティングコンピューター',
    player: 'ウォーズマン'
  },
  {
    title: '闘将',
    player: 'ラーメンマン'
  },
  {
    title: '完全無欠の完璧超人',
    player: 'ザ・サムライ（ネプチューンマン）'
  }
];
var peopleLength = Supermans.length;

var list = module.exports = new Vue({
  el: '#list',
  data: {
    entries: []
  },
  methods: {
    addEntry: function(){
      var r = Math.floor(Math.random()*peopleLength);
      var entry = Supermans[r];
      this.entries.push(entry);
    }
  }
});

```


```jade:jade
section#list
  h1 キン肉マンチーム
  button.add-entry(v-on="click:addEntry")
  ol.component__entries
    li.list_entry(v-repeat="entries")
      dl.entry_data
        dt.data_player-name(v-text="player")
        dd.data_player-title(v-text="title" v-if="title")
```

とする。しかし、このままではentriesのデータに重複したものをpushしているのでバインディングは行われない。

- entries
    1. キン肉マン（ダメ超人）
    2. ロビンマスク（超人博士）
    3. <del>キン肉マン（ダメ超人）</del>

このように、``entries``には3番目にキン肉マンを再度pushできない。
この場合はpushする際に以下のように``updated``要素を付けてpushすると3番目にキン肉マンが追加できる。
*※Dateオブジェクトではなくても一意のidのようなものでもよい。*

```js:javascript
this.entries.push({
  player: entry.player,
  title: entrye.title,
  updated: new Date().getTime()
});
```

↓

```js:javascript

var Vue = global.Vue = require('vue');
var Supermans = [
  {
    title: 'ダメ超人',
    player: 'キン肉マン'
  },
  {
    title: '超人博士',
    player: 'ロビンマスク'
  },
  {
    title: '善戦超人',
    player: 'ジェロニモ'
  },
  {
    title: 'テキサス・ブロンコ',
    player: 'テリーマン'
  },
  {
    title: '世話係',
    player: 'アレキサンドリア・ミート（ミートくん）'
  },
  {
    title: 'ファイティングコンピューター',
    player: 'ウォーズマン'
  },
  {
    title: '闘将',
    player: 'ラーメンマン'
  },
  {
    title: '完全無欠の完璧超人',
    player: 'ザ・サムライ（ネプチューンマン）'
  }
];
var peopleLength = Supermans.length;

var list = module.exports = new Vue({
  el: '#list',
  data: {
    entries: []
  },
  methods: {
    addEntry: function(){
      var r = Math.floor(Math.random()*peopleLength);
      var entry = Supermans[r];
      this.entries.push({
        player: entry.player,
        title: entrye.title,
        updated: new Date().getTime()
      });
    }
  }
});

```

### itemを参照する場合

尚、Vue.jsのリファレンスにもありますが、ユニークなidなどを定義しておけば、リストのitemを再参照する際に便利です。

```js
{
  items: [
    { _uid: 88f869d, ... },
    { _uid: 7496c10, ... }
  ]
}
```

```html:html
<div v-repeat="items" track-by="_uid">
  <!-- content -->
</div>
```
org-agendaで読み込むorgファイルとその順番を指定する

Emacsのorg-modeでorg-agendaを利用する時は、読み込むorgファイルを設定する必要があります。特定のディレクトリに存在するorgファイルをすべて読み込む時は

```el
(setq org-agenda-files '("~/org"))
```

で良いようです。ただし、この場合、読み込まれる順番は、ファイル名でソートしたものになるようです。この読み込み順は、少なくともTODOリストの順番に影響を与えるようです。

読み込む順番を指定したかったこと、加えて読み込むファイルを限定したかったことから、以下のように設定し直しました。

```el
(setq org-agenda-files '("~/org/f3.org"
                         "~/org/f1.org"
                         "~/org/f2.org"))
```

さらに重複が気に食わなかったので修正。

```el
(setq org-directory "~/org/")
(setq org-agenda-files
      (mapcar (lambda (basename)
                (concat org-directory (symbol-name basename) ".org"))
              '(f3 f1 f2)))
```

コードが長くなった上に、可読性が下がった気がしましたが、見なかったことにしました。
template引数の関数オブジェクトの戻り値を取得する

templateに(ラムダ式)を渡す際にハマったのでメモ


```cpp:meta_function.h

#include <type_traits>
struct result_of_type_impl
{
    // ①関数
    template < class Result, class ... Args >
    static Result Func( Result( *)( Args ... ) );
    // ②メンバ関数ポインタ(非const版)
    template < class T, class Result, class ... Args >
    static Result Func( Result( T::* )( Args ... ) );
    // ③メンバ関数ポインタ(const版)
    template < class T, class Result, class ... Args >
    static Result Func( Result( T::* )( Args ... ) const );
    // ④関数オブジェクト
    template < class T, class FuncType = decltype( &T::operator() ) >
    static decltype( Func( std::declval<FuncType>() ) ) Func( T* );
};

template < class T > struct result_of
{
    using type = decltype( result_of_type_impl::Func( std::declval<std::remove_pointer_t<T>*>() ) );
};

```

上記メタ関数を使って関数・メンバ関数ポインタ・ラムダ式の戻り値の型が取得出来る
下は使用する際のサンプル

```cpp:test1.cpp

template< class Func, class Result = result_of<Func>::type >
Result Test( Func&& func );


int main()
{
    const auto func = [](){ return 0; };
    
    Test( func );
}

```
Squid-3.4.11 を MacOS X 10.9.5 でコンパイルする

configureで、色々エラーが出るが、その対処。

```bash
$ squid-3.4.11/src> ./configure 
 --prefix=/opt/squid 
 --with-krb5-config=no
 --disable-external-acl-helpers

```
Eclipse で Plugin の開発をするときのメモ

# 1. Eclipse Plugin 開発に関する覚え書き
仕事ですでに完成済みの Eclipse Plugin のメンテナンスを行うことがあった[^1]のだが，Plugin 開発そのものはやったことがなかったので，あれこれ調べながらやったときの備忘録。特に覚えておくと便利だろうと思うこと。

## 1.1. Eclipse のデバッグモードと標準出力のコンソール出力
Plugin はデバッグが非常にやりにくい[^2]ので，Eclipse をデバッグモードで起動[^3]する。

```shell:
    $> eclipse -debug -consolelog
```

ちなみに Windows の場合は，ショートカットなどにこのオプションを付与しておく。

## 1.2. Plugin のエクスポート
プログラムを修正した後，実際に Eclipse のプラグインとしてモジュールを出力する場合は，plugin.xml の概要画面で右下の「エクスポート・ウィザード」を実行する。

* ディレクトリーを選択すると，指定した場所に「plugins」フォルダーを作成して *.jar ファイルを格納する。
* アーカイブ・ファイルを選択すると，指定した場所に \*.zip ファイルを作成する。中身が \*.jar ファイルになる。

## 1.3. Plugin 実行時の文字化け
Java プログラムから出力するメッセージ類が文字化けするときは，build.properties ファイルに，

    javacDefaultEncoding.. = UTF-8

を追加すること。

----
**脚注**

[^1]: 世間一般に広まっているプラグインではなく，あくまで参画しているプロジェクト内で使用するもの。だから機能そのものも世間一般に必要とされるものではない。

[^2]: まずログが出ないのが肝。

[^3]: デバッグモードで起動すると，起動時にコンソールが表示される。Windows で言えばコマンドプロンプトが出る。そこに Eclipse 自身のログが出力されるというわけなので，Plugin の中に仕込んだログも出力される。
FASTQ


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4


## trim end
はっきり言ってコレを使う人はいないと思うが、シンプルなトリムの例として。

### コンセプト

* phred quality 15 以下が五連続したら、カットする。

### ワンライナー

```bash:
$ perl -MO=Deparse -Mvars='@d' -F'' -lane 'push @d, $_ ; next if $. % 4 != 0 ; my $o;  L:for my $i ( 0 .. $#F ){ next L if ! defined $F[$i + 4] ;  for ( 0 .. 4){ next L if $F[$i + $_] gt q{0} } $o = $i ; last L } ; $o and $d[$_] = substr $d[$_], 0, $o for 1, 3; print join "\n", @d  ; @d = () ' fastq.fq 
```

### 解説
B::Deparse の結果で解説

```perl:
BEGIN { $/ = "\n"; $\ = "\n"; }
use vars (split(/,/, '@d', 0));
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    our @F = split(//, $_, 0);                     #3
    push @main::d, $_;                             #1
    next if $. % 4 != 0;                           #2
    my $o;
    L: foreach my $i (0 .. $#F) {
        next L unless defined $F[$i + 4];
        foreach $_ (0 .. 4) {                      #4
            next L if $F[$i + $_] gt '0';
        }
        $o = $i;
        last L;
    }
    $o and $main::d[$_] = substr($main::d[$_], 0, $o) foreach (1, 3);    #5
    print join("\n", @main::d);
    @main::d = ();                                 #6
}
-e syntax OK

```

while 文を回して、リード毎に `@d` にストック（#1）。
処理はリード毎なので、 quality 行以外は次の行に（#2）。
quality をチェックするので `@F` へ split（#3）。
quality が五連続で 15 以下になる最初の位置を `$o` にセット（#4）。
トリムの実行（#5）。
リード情報のクリア（#6）。

* phred score 15 は、ascii コード 48 番。即ち文字列 '0'
* 文字列の大小比較をしてしまえば良い。態々 phred score に変換するのはナンセンス。
* ラベルは活用した方が良いんじゃね？ goto は論外だけど
塩基配列


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4


##### 前提

single fasta を

```bash:
$ perl -Mvars='$s' -lne 'next if />/ ; $s .= $_ }{ print $s' SOMETHING.fa 
```
してパイプしたものとする。

## 塩基数カウント

### 総数
```bash:
| perl -lne 'print length'
```

### 特定塩基の数

```bash:
| perl -lne 'my $s = $_ ; print $s =~ tr/Aa// '
```
```bash:
| perl -lne 'my $s = $_ ; print scalar ( () =  $s =~ /A/gi )'
```
下はプログレッシブマッチなので、リストコンテキストで解釈してやらないと云々。

### GC percent

```bash:
| perl -lne 'my $s = $_ ; printf "%.2f",($s =~ tr/GCgc//) / ( length $s ) * 100'
```
FASTA => FASTQ


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4




##### FASTQ と FASTA について
201501 現在 

FASTQ に関しては、リードの配列と qual はそれぞれ一行に表示されています。従って複数行になっている場合は考慮しません。
逆に FASTA に関しては複数行の可能性があるものに関しては、その旨明記の上、コードを書きます。

## FASTA => FASTQ(dummy qual)
qual が無いものをダミー qual 40 で。

### ワンライナー

```bash:改行を考慮せず。
$ perl -Mvars='$n' -lne '$n = ( />(.*?)$/ )[0] and next if $. % 2 == 1 ; print join "\n", "\@$n", $_, "+", q{I} x length' seq.fa > fastq.fq
```

```bash:改行を考慮。
$ perl -F'>' -0777 -lane 'shift @F ; for ( @F ){ my @d =  split /\n/ ;  printf "@%s\n%s\n+\n%s\n", shift @d, $_ = +(join "", @d), q{I} x length } ' seq.fa > fastq.fq
```

前者は至って素直に fastq を作ってるだけです。`q{I} x length` の `x` を知らなくて面倒な事をやってたのは過去の思い出。

### B::Deparse
後者に関して。 B::Deparse 出力をちょっと整形

```perl:
BEGIN { $/ = undef; $\ = ""; }
LINE:
while (defined($_ = <ARGV>)) {
    chomp $_;
    our(@F) = split(/>/, $_, 0);
    shift @F;
    foreach $_ (@F) {
        my(@d) = split(/\n/, $_, 0);
        printf "\@%s\n%s\n+\n%s\n", 
        	shift @d, 
        	$_ = join('', @d), 
        	'I' x length($_)
        	;
    }
}
-e syntax OK
```

* `>` で split すると配列 `@F` の最初の要素は何も入ってないので `shift @F` して捨てる
* @F の各要素、すなわちリード毎に改行で `split` する
* 最初の要素はヘッダ行なので `shift @d` して `printf` に渡す
* 他の要素は塩基配列なので `join` して `$_` を上書きすると同時に、 `printf` に渡す
* `q{I} x length` で更新された `$_` の長さの `q{I}` を出力


## FASTA => FASTQ
こっちは普通に、改行無しの FASTA を想定

### 下準備
丁寧な人は、 seq.fa と seq.qual のヘッダ数と位置が合ってる事くらいは確認。

```bash:
$ perl -Mvars='@d' -lne 'next if $. % 2 == 0 ; my $n = ( />(.*?)$/ )[0] ; push @d, $n and next if $ARGV eq q{seq.fa} ; die $_ if $n ne shift @d }{ die if @d != 0' seq.fa seq.qual
```
現在開いてるファイルのファイル名は、 `$ARGV` で把握出来る
それさえ分かれば、seq.fa のヘッダをストック。seq.qual のヘッダの時に確認のコードを実行。ってのは難しい話ではない。

丁寧じゃない人でも最初と最後のリードヘッダーくらいは確認しておきたい。

```
$ diff <( head -1 seq.fa ) <( head -1 seq.qual)  
$ diff <( tail -2 seq.fa | head -1) <( tail -2 seq.qual | head -1)    
```
bash, zsh のプロセス置換

### ワンライナー

```bash:
$ perl -Mvars='@d,$n' -lne 's/>// if $. % 2 == 1 ; push @d, $_ and next if $ARGV eq q{seq.fa} ; printf "@%s\n%s\n+\n", splice @d, 0, 2 and next if $. % 2 == 1 ; print' seq.fa seq.qual > fastq.fq
```

* ファスタヘッダの '>' は邪魔なだけなので `s/>//` する。
* seq.fa の時は `@d` に追加するだけ。
* seq.qual のヘッダ行の時は、seq.fa の当該リードデータの出力を先にする。当然、ヘッダ行の頭に '@' を追加
* qual のヘッダは `+` のみ
* qual 行は普通にプリント
bash-3.2 のパッチ for Mac OS X

こんにちは。
現時点（2015-01-17）で、Mac OS X で提供されている bash のパッチレベルは 3.2.53 と低いようです（参考：[OS X bash Update 1.0 (2014-09-29)](http://qiita.com/kkdd/items/f3f94f129ae9210c810d)）。

bash-3.2 についてはパッチレベルはすでに 57 まで出ており（出た日は 2014-10-05）、脆弱性状況は下記のように改善されています。

```
- CVE-2014-6271  ✔
- CVE-2014-7169  ✔
- CVE-2014-7186  ✔
- CVE-2014-7187  ？
- CVE-2014-6277  ✔
- CVE-2014-6278  ✔
```

この bash-3.2 のパッチレベルを、Apple 社の提供(?)を待てずに、上げたい人向けの方法を書きました。シェルスクリプトで動かすコマンドを homebrew の formula に仕立てただけですが。

これを動かしたあとの確認は下記のようになるはずで、その後は、現状のコマンド本体の /bin/bash と /bin/sh とを、バックアップを取っておき、ワークディレクトリ内から sudo cp で置き換えれば良いでしょう。

```
$ cat ~/bash32-fix/bashcheck.out.txt
Testing ~/bash32-fix/bash ...
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin13)

Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Not vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Not vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)
Variable function parser inactive, likely safe from unknown parser bugs
```

以降がパッチを当てるための定義（homebrew の formula）です。

```
require 'formula'

class Bash32 < Formula
  homepage 'https://opensource.apple.com/tarballs/bash'
  version 'latest'
  sha1 'c833cdc86aab36bbe5f23911a7bcca0e12f905a5'
  url 'https://opensource.apple.com/tarballs/bash/bash-94.1.2.tar.gz'  # 3.2.53

  def install
    # patch-level: 54 55 56 57
    system 'cd bash-3.2; for i in $(seq -f "%03g" 54 57);do curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-$i | patch -p0; done; cd ..'

    system 'xcodebuild'

    workdir = '~/bash32-fix'  # ワークディレクトリ
    outtxt  = 'bashcheck.out.txt'  # 脆弱性確認結果

    system "mkdir #{workdir}"
    system "cp build/Release/bash #{workdir}"
    system "cp build/Release/sh #{workdir}"

    # 脆弱性確認
    system 'curl -O https://raw.githubusercontent.com/hannob/bashcheck/master/bashcheck'
    system "sh bashcheck #{workdir}/bash > #{workdir}/#{outtxt}"
  end
end
```
[Blender] テクスチャ関係

日本語表記で説明しています.
特に説明がない場合は3Dビューでの操作としています.
Windows版です.

---

####UV展開
EditModeで展開するメッシュを選択し
**u** → *展開*

展開結果はUV/画像エディターに表示されます。

---

####シームをつける
EditModeでシームをつける辺を選択し
**Ctrl + e** → *シームをつける*

---

####UV展開したものをエクスポート(=ファイル出力)
UV/画像エディターでエクスポートするものを選択し、ヘッダーにある
*UV* → *UV配置をエクスポート*
WindowsでGolang開発環境構築　IntelliJ IDEA


#はじめに
今回は次の内容で開発環境を構築する

* Windows7(64-bit)
* Java 1.8.0_11
* Go 1.4.1
* IntelliJ IDEA 14.0.2(Community Edition)
* IntelliJ IDEA google-go-langurage plugin 0.9.16-alpha.9

構築手順を以下に記す

#IntelliJ IDEA 14 インストール
下記ページからインストーラをダウンロード
[IntelliJ IDEA download site](https://www.jetbrains.com/idea/download/)

> **NOTE**

> * 無料のCommunity版をダウンロード

> * 使用するpluginの都合上、IntelliJ IDEAのバージョンは14以上

#Go SDK インストール
下記からインストーラをダウンロード
[Go SDK download site](https://golang.org/dl/)

インストールが完了したら下記の環境変数を設定
``GOROOT：[C:\Go]``
``Path：[;C:\Go\bin]``


下記コマンドを実行してGo SDK のバージョンを確認する
``go version``


> **NOTE**

> * go1.4.1.windows-amd64.msiを使用

> * C:\Goに展開

#go lang pluginをインストール
下記ページからIntelliJ IDEA用のgo lang plugin(google-go-language.jar)をダウンロード
[GitHub - go-lang-plugin-org](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases)

IntelliJ IDEA14を起動し、Welcome画面で[Configure]＞[Plugins]＞[Install plugin from disk]からダウンロードしたgoogle-go-language.jarを指定する
IntelliJ IDEA14を再起動してインストールを完了

#Go SDKを設定
IntelliJ IDEA14を起動し、Welcome画面で[Configure]＞[Project Defaults]＞[Project Structure]を表示

[Project Structure]のWindow左ペインから[SDKs]を表示
[+]を押して[Go SDK]を選択

#Go Projectを作成
[Create New Project]＞[Go]を選択する。
今回はPackage[main]を追加し、Project[gotest]とする

> **NOTE**

> * NoSDKと表示される場合は、[File]＞[Project Structur]を表示し、[Project]から[Project SDK]で[Go SDK]を選択する


#GOROOTとGOPATHを設定
[File]＞[Settings]を選択
[Tools]＞[Google Go]を選択し、GOROOTとGOPATHを設定する
GOROOTはGo SDKのパスを指定する
``GOROOT：C:\Go``

GOPATHは今回作成したProjectのROOTディレクトリを指定する
``GOPATH：[任意のパス]\IdeaProjects\gotest``
> **NOTE**

> * GOPATHはProject毎に指定が必要


#コーディング
今回は下記サンプルコードを実行する。
[src]＞[main]＞[gotest.go]にサンプルコードを記載。

```lang:gotest.go
package main

import "fmt"

func main() {
   fmt.Printf("Hello world!")
}
```

#実行
メニューバーから[Run]＞[Run...]＞[gotest]を選択
コンソールが立ち上がり、「Hello world!」が表示されれば成功。

以上。
Alamofire.swiftをプロジェクトにドラッグアンドドロップして使用する方法

Alamofireの初期バージョンだとドラッグアンドドロップ”だけ”で行けたみたいなのですが、今はだめっぽいですね。

実機転送時にエラーが出て「手間…」って思ったのでこっちを採用。

なんで一手間必要な状態でライブラリが公開されているかわかりませんが、個人的にはまだSwiftで書かれたライブラリはドラッグアンドドロップして追加する方が好きです。

http://stackoverflow.com/questions/27273673/importing-alamofire-in-project-that-targets-ios-7

Alamofireを落としてきて、Alamofire.swiftをドラッグアンドドロップ。

その後上の方に以下のコードを追記すると、

```swift
struct Alamofire {
    static let manager = Manager.sharedInstance
}
```

下の様に使えます。

```swift
Alamofire.manager.request(.GET, videoUrl, parameters: ["foo": "bar"])
            .response { (request, response, data, error) in
                println(request)
                println(response)
                println(error)
        }

```

CocoaPods以前に逆戻りした気もしますが、まだあるiOS7対応も考えると結果的に楽そう？

[README.md](https://github.com/Alamofire/Alamofire#installation)にあるように、submoduleにしていれば最新を追いかけやすいしいいと思いますが、それ以外の理由で`Alamofire.xcodeproj`ごとドラッグアンドドロップして使うような方法ってなんのメリットがありますかね？

知っている方がいたら教えて欲しいですm(_ _)m
iframe内のページのハッシュを親ページで取得するには

# 背景

Atom Shellでちょっと前から使えるようになったwebviewタグを使ってみたが、
どうもIMEが効かず、日本語が入力できない。

仕方がないの、iframeを使った。

で、iframe内のハッシュの取得が必要になった。

# iframe内のページのハッシュの取得方法

```js
frames[0].location.hash
```

# まとめ

Atom ShellのwebviewでIMEが使えるようになると、
今度はwebviewタグ内のコンテンツのハッシュの取得方法を
調べる必要があることがわかった。
[WIP]javascript 関数合成

下記関数
$f(x) = x +3$
$g(x) = x * 2$
から
関数
$h(x) = f(g(x)) = (x * 2) + 3 $
を作る方法

```javascript
>function(x){return x + 3}
>function(x){return x * 2}
//関数を合成するための関数composeを定義
>function compose(f,g){return function(x){return f(g(x))}}
>h = compose(f,g)
>h(2)
< 7
```
git-rpmというサブコマンドを作ってみた

最新のコミットから直接rpmを作成する``git rpm``というコマンドを作ってみた。
``git init``した直下にspecファイルが必要です。

# インストール

githubに上げておいたのでそのままcloneして、ビルドします。

```bash
$ git clone git@github.com:ymko/git-rpm.git
$ cd git-rpm
$ ./git-rpm
書き込み完了: /home/ymko/tmp/git-rpm/rpm/SRPMS/git-rpm-1.00-1.el7.centos.src.rpm
書き込み完了: /home/ymko/tmp/git-rpm/rpm/RPMS/noarch/git-rpm-1.00-1.el7.centos.noarch.rpm
$ sudo su
# rpm -ivh rpm/RPMS/noarch/git-rpm-1.00-1.el7.centos.noarch.rpm
# exit
$ which git-rpm
/usr/bin/git-rpm
```

~/bin にパスが通っているならこちらでも可です。

```bash
$ git clone git@github.com:ymko/git-rpm.git
$ cd git-rpm
$ cp git-rpm ~/bin
```


# rpm作成
このプロジェクト自体がrpmを作成を意図しているので、そのままサンプルになります。

```bash
$ git rpm
書き込み完了: /home/ymko/tmp/git-rpm/rpm/SRPMS/git-rpm-1.00-1.el7.centos.src.rpm
書き込み完了: /home/ymko/tmp/git-rpm/rpm/RPMS/noarch/git-rpm-1.00-1.el7.centos.noarch.rpm
```

# git-rpmの中身

```bash:git-rpm
#!/bin/sh

specfile=`ls -1 | grep .spec | head -n 1`
name=`grep "Name:" $specfile | awk '{print $2}'`
version=`grep "Version:" $specfile | awk '{print $2}'`

pwd=`pwd`
mkdir -p rpm/SOURCES >/dev/null 2>&1

git archive --prefix ${name}-${version}/ HEAD | gzip > rpm/SOURCES/${name}-${version}.tar.gz

rpmbuild -ba $specfile --define "%_topdir $pwd/rpm"
```

# 参考

rpmパッケージをプロジェクト下のディレクトリに作成する方法 - ymkoの日記
http://d.hatena.ne.jp/ymko/20110204/1296827232
CentOS5では--rcfile オプションでできていたが、分離されたようで--defineオプションに変更

rpmbuild --showrc
Macro path: /usr/lib/rpm/macros:/usr/lib/rpm/macros.d/macros.*:/usr/lib/rpm/platform/%{_target}/macros:/usr/lib/rpm/fileattrs/*.attr:/usr/lib/rpm/redhat/macros:/etc/rpm/macros.*:/etc/rpm/macros:/etc/rpm/%{_target}/macros:~/.rpmmacros

オレオレrpmパッケージの作り方(基本編) — ディノオープンラボラトリ
http://openlab.dino.co.jp/2007/11/16/13162254.html
wordpressの自分用メモ

### wordpressを使っている上で出て来た問題への対処メモ


#### サイトアドレスを変更する
サイトアドレスを変更するには管理ページから>一般設定へ
いくことで変更できるが、訳あってそこからの変更が出来ないため別の方法を探してみた。

**DBのsiteurlを書き換える**
サイトアドレスはDB内のwp_optionsテーブル、option_idが'1'のoption_valueに保存されていた。
```
mysql> select * from wp_options where option_id = '1';
+-----------+-------------+-------------------------------+----------+
| option_id | option_name | option_value                  | autoload |
+-----------+-------------+-------------------------------+----------+
|         1 | siteurl     | http://exsample.com | yes      |
+-----------+-------------+-------------------------------+----------+
1 row in set (0.00 sec)
```

UPDATEすることで変更できた。
```
update wp_options set option_value = 'http://hogehoge.com' where option_id = '1';
```
Rubyで2つの配列の組み合わせを調査する

たとえば、２つの配列の組み合わせで一意なものを調査したい場合は、zipを使って配列の配列を作り、その組み合わせをuniqを使って調べる。

```rb:irb
irb(main):001:0> a = %w(1.0 1.0 1.0)
=> ["1.0", "1.0", "1.0"]
irb(main):002:0> b = %w(1.0 1.0 1.0)
=> ["1.0", "1.0", "1.0"]
irb(main):003:0> a.zip(b)
=> [["1.0", "1.0"], ["1.0", "1.0"], ["1.0", "1.0"]]
irb(main):004:0> a.zip(b).uniq
=> [["1.0", "1.0"]]
irb(main):005:0> a = %w(1.0 2.0 3.0)
=> ["1.0", "2.0", "3.0"]
irb(main):006:0> a.zip(b)
=> [["1.0", "1.0"], ["2.0", "1.0"], ["3.0", "1.0"]]
irb(main):007:0> a.zip(b).uniq
=> [["1.0", "1.0"], ["2.0", "1.0"], ["3.0", "1.0"]]
irb(main):008:0>
```

productを使うとすべての組み合わせを試せる。
haxelib newコマンドが追加されていた

haxelibでライブラリを追加するとこれまでグローバルな場所に登録され、追加・削除を繰り返すとゴミ箱のようになっていてそれが嫌だった。
`haxelib setup`コマンドは内部的に書き込み可能なディレクトリかチェックして、そのパスを`~/.haxelib`に書き込んでいるだけなので、ディレクトリの中身を削除するなり`~/.haxelib`を書き換えるなりの方法で掃除することはできた。
それも面倒だなと思ってGitHubのhaxelibリポジトリを調べたら、プロジェクト単位でライブラリを管理できるようになる`haxelib new`コマンドが追加されていた。

## インストール・使い方

まだリリースされていない機能なのでリポジトリからビルドする。OSX, Homebrewであれば`--HEAD`オプション付きで。

```bash
$ brew install haxe --HEAD
```

`haxelib new`コマンドを打つと`.haxelib`ディレクトリが生成され、以降このディレクトリでhaxelibからインストールするライブラリはこのディレクトリの下に入る。

```bash
$ haxelib new

$ ls -a
.        ..       .haxelib

$ haxelib list

$ haxelib install lime > /dev/null

$ haxelib list
lime: [2.0.5]

$ ls .haxelib
lime
```

`haxelib delete`コマンドを使えば再びグローバルなディレクトリを参照するようになる。`.haxelib`ディレクトリを削除しても同様。
標準ライブラリの utf8 を使う

Lua 5.3 で utf8 が標準ライブラリとして導入されたので、練習。

まずはコードポイントから文字列を生成してみよう。次のコードは「あいうえお」を表示する。

```lua
print(utf8.char(0x3042, 0x3044, 0x3046, 0x3048, 0x304A))
```

逆に文字列からコードポイントを求めてみよう

```lua
print(string.format("U+%X", utf8.codepoint("あ")))
```

文字数を求めてみよう。

```lua
str = "あいうえお"
print(utf8.len(str))
```

for ループで1文字ずつコードポイントと先行バイトの位置を求めてみよう。

```lua
str = "あいうえお"

for p, c in utf8.codes(str) do
    print(string.format("%d U+%X", p, c))
end
```

1文字ずつターミナルに表示しては改行してみよう。コードポイントを文字に変換すればよい。

```lua
str = "あいうえお"

for p, c in utf8.codes(str) do
    print(string.format("%s", utf8.char(c)))
end
```

先行バイトの位置を求めて、スライスすることで、1文字ずつ表示させることもできる。

```lua
str = "あいうえお"
length = utf8.len(str)

for i = 1, length do
  lead = utf8.offset(str, i)
  trail = utf8.offset(str, i+1) - 1
  print(string.sub(str, lead, trail))
end
```
Philips Hue + PHPで天気予報

# はじめに
最近はやりのものに触れてみたい。ってことでやってみた。
天気予報APIから降水確率を取ってきて30%以下なら赤く、
それ以上なら青に点滅するPHPプログラムを書いてみた。
(元ネタはWEB + DB)
これで傘を忘れるなんてことはなくなるよねっ

# Philips Hue
プログラマブル電球。
詳細はここでは割愛。
コマンドラインからも操作できるけど各種SDKも豊富にそろってた。
http://www.developers.meethue.com/tools-and-sdks

PHPのSDKも3つ存在。
中でも一番人気のやつをコンポーザーでインストールして使用。

* github https://github.com/sqmk/Phue
* Packagist https://packagist.org/packages/sqmk/phue

# 天気予報API
いっぱいあるけど降水確率をレスポンスに含むものはあんまりないらしい。
http://blog.wszz.org/archives/377

降水確率によってHueの色を変える的なことをやりたいので、
http://www.drk7.jp/weather/
のJapan Weather Forecast xmlを取得してくる

# ソースコード

```php:weather.php
<?php

require_once __DIR__ . '/vendor/autoload.php';

$url         = "http://www.drk7.jp/weather/xml/13.xml"; //13は東京
$xml         = file_get_contents($url, true);
$parsedXml   = new \SimpleXMLElement($xml);
$rain        = "";
$hueHost     = "ブリッジのIP";
$hueUsername = "登録したユーザーネーム";

foreach ($parsedXml->pref->area as $area) {
    if ($area->attributes()["id"] != "東京地方") continue;
    $hour      = date("H");
    $periodAry = get_object_vars($area->info->rainfallchance)["period"];
    switch (true) {
        case $hour < "06": // 00 ~ 06
            $rain = $periodAry[0];
            break;
        case $hour < "12": // 06 ~ 12
            $rain = $periodAry[1];
            break;
        case $hour < "18": // 12 ~ 18
            $rain = $periodAry[2];
            break;
        default:            //18 ~ 24
            $rain = $periodAry[3];
            break;
    }
}

$client     = new \Phue\Client($hueHost, $hueUsername);
$light      = $client->getLights()[4];
$brightness = 50; //輝度 0 ~ 255
$saturation = 255; //彩度 0 ~ 255
$effect     = "none"; //none or colorloop
$alert      = "lselect"; //select, lselect, none

if ($rain < 30) { // 降水確率30%以下
    $hue    = 65000; //赤 色相 0 ~ 65535
    // Send command
    $client->sendCommand(
        (new \Phue\Command\SetLightState($light))
            ->brightness($brightness)
            ->hue($hue)
            ->saturation($saturation)
            ->effect($effect)
            ->alert($alert)
    );

} else {
    $hue    = 47000; //青
    // Send command
    $client->sendCommand(
        (new \Phue\Command\SetLightState($light))
            ->brightness($brightness)
            ->hue($hue)
            ->saturation($saturation)
            ->effect($effect)
            ->alert($alert)
    );
}
```

# まとめ
あとはこいつをCronとかで回してやればOK。
プログラムで電球の色が変わるのが思いの外楽しい。おすすめ。

おわり
Vimで拡張子のないファイルにファイルタイプ設定を反映する

- 環境はMac。

## 動機
- Vimで拡張子なしのシェルスクリプトファイル（要はシェルコマンド）を編集することがよくある。
- 毎回`setf=sh`するのめどい。

## コード
- ~/.vim/ftdetect/sh.vim に書き込む。
	- ~/.vim/ftdetect に (filetype).vim を作ることで、そのfiletypeの定義パターンを拡張できる。

```~/.vim/ftdetect/sh.vim
" Vim起動時に、「バッファ名が空」かつ「の場合はfiletype=sh
autocmd VimEnter * nested if @% == '' && s:GetBufByte() == 0 | set filetype=sh | endif
function! s:GetBufByte()
    let byte = line2byte(line('$') + 1)
    if byte == -1
        return 0
    else
        return byte - 1
    endif
endfunction

" バッファを開いたとき、「バッファ名にドットを含まない」かつ「Shebangがない」場合はfiletype=sh
autocmd BufRead,BufNewFile * nested if @% !~ '\.' && getline(1) !~ '^#!.*' | set filetype=sh | endif
```

- **「拡張子を持たず」「ドットファイルでない」**ファイルは、「バッファ名にドットを含まない 」＝`@% !~ '\.'`として簡潔に記述できる。
- シェルコマンドを他言語でも書けるように、Shebangがある場合に対応
- これで、ファイルタイプに応じた機能（例えばシンタックスハイライトやneosnippet.vim）を利用できる。

## 参考
* [vimを引数なしで起動した場合に◯◯を行う - Make 鮫 noise](http://saihoooooooo.hatenablog.com/entry/2013/05/24/130744)
Android 5.0でPDFビューアを作る

# はじめに
Androoid 5.0でサポートされたPDFドキュメントのレンダリングフレームワークで、これまでできなかった、PDFビューアがアプリで作ることが可能になりました。

[サンプルアプリ](http://developer.android.com/samples/PdfRendererBasic/index.html)と[リファレンス](http://developer.android.com/reference/android/graphics/pdf/PdfRenderer.html)を元に作り方を簡単にまとめました。

# 作り方

5つのステップだけで簡単にPDFビューアが作れます。

１. ファイルディスクリプタからPDFレンダリングオブジェクト生成する。

```.java
FileDescriptor fileDescriptor = context.getAssets().openFd("sample.pdf").getParcelFileDescriptor();
PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor);
```

２. 生成したレンダリングオブジェクトから、表示したいページを取得する。引数に指定。

```.java
PdfRenderer.Page currentPage = pdfRenderer.openPage(index);
```

３. 表示したいページサイズのBitmapを生成し、レンダリングする。

```.java
Bitmap bitmap = Bitmap.createBitmap(currentPage.getWidth(), currentPage.getHeight(),
                Bitmap.Config.ARGB_8888);
currentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
```

４. ImageViewに貼り付ける

```.java
ImageView imageView = (ImageView)findViewById(R.id.imageView);  
imageView.setImageBitmap(bitmap);
```

５. 後始末。

```.java
currentPage.close();
pdfRenderer.close();
fileDescriptor.close();
```

# 補足：
* 生成するBitmapは、RGBではなくARGBということに注意
* レンダリングは、表示モード`RENDER_MODE_FOR_DISPLAY`と印刷モード`RENDER_MODE_FOR_DISPLAY`の２種類がある。印刷モードを使う時は、スケーリングされるか`PdfRenderer#shouldScaleForPrinting()`で確認しておくこと
* PdfRendererはスレッドセーフではありません。困ることはないと思うけど実装時はご注意を


# もっとよくする：
* ページ数は `pdfRenderer.getPageCount()`で取得できるので、全体の何ページを表示しているかUIにも反映可能
* ImageViewに貼り付けたビューは、GestureDetector使ってビンチイン/アウトUXを高めることをおすすめします。
  [chrisbanes/PhotoView · GitHub](https://github.com/chrisbanes/PhotoView) を使えば簡単に実現可能です。

```.java
new PhotoViewAttacher(imageView);
```

# 蛇足：
PdfRendererクラスの中身見ると、nativeコールしてますね。Java層ではI/Fだけ用意して実装はやっぱりC言語なのですね
[graphics/java/android/graphics/pdf/PdfRenderer.java - platform/frameworks/base - Git at Google](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/graphics/java/android/graphics/pdf/PdfRenderer.java)
mackerelをautoscallingで使う（Amazon Linux）


AWSでautoscallingを使用しているとインスタンスが不定期で入れ替わるので、ターミネートされるタイミングでmackerel上で退役扱いにしてあげることが必要なんですが、Amazon Linuxだとなんかうまくいかなくてその時のメモ。

やることは一つでmackerelのAPIをコールする起動スクリプトを作成し、`chkconfig`で登録するだけ。

```sh:/etc/init.d/mackerel-retire
#!/bin/bash

### BEGIN INIT INFO
# Provides: mackerel-retire
# Required-Start: $network $local_fs
# Required-Stop: $network $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# description: mackerel retire
### END INIT INFO

API_KEY="hogehoge"
HOST_ID=$(cat /var/lib/mackerel-agent/id)

LOCKFILE=/var/lock/subsys/mackerel-retire

case "$1" in
    start)
        touch ${LOCKFILE}
        ;;
    stop)
        curl -X POST "https://mackerel.io/api/v0/hosts/${HOST_ID}/retire" \
             -d '{}' \
             -H "Content-Type: application/json" \
             -H "X-Api-Key: ${API_KEY}" 
        rm -f ${LOCKFILE} /var/lib/mackerel-agent/id
        ;;
esac
```

登録する

```sh
$ sudo chmod 755 /etc/init.d/mackerel-retire
$ sudo chkconfig --add mackerel-retire
$ sudo chkconfig mackerel-retire on
$ sudo service mackerel-retire start
```

# 何故ハマったのか

Amazon Linuxは`/var/lock/subsys`配下にロックファイルのあるプログラムのみしかシャットダウン時にキルしてくれないらしく、これに気付かなかった。
Ubuntuとかは`chkconfig`で登録すればOKらしいです。
node.jsによるシステムモニタ / vtop


はじめに
---------
　topコマンドの可視化版"vtop"を見つけたのでreportする。


入れる / install
----

[vtop](https://parall.ax/vtop)

前提.1 : node.jsが使える状態(使えない場合、ndenv等で構築する。
前提.2 : v0.10.25以上(はじめv0.10.15だったが入れる際にerrorで止まる。)

```
$ npm install -g vtop
$ ndenv rehash
$ exec $SHELL -l
```

使う / Do
------

```
$ vtop
```

(おしまい)
Linux historyコマンド履歴から実行したいとき | 検索方法

historyコマンドで履歴を見ることができます。

> history 

→ 1000件のコマンド履歴を表示

> history 100

→ 100件のコマンド履歴を表示

> history | grep graceful

→　gracefulコマンドを含む履歴のみを表示　

> history | less

→　lessでページコントロール。
ファイルの先頭へ移動: gまたは<
ファイルの末尾へ移動: Gまたは>
1ページ上へ移動 : wまたb
1ページ下へ移動 : z・スペース 

検索方法

history実行後[ctrl] + [r] で検索モードに

> (reverse-i-search) : hoge
ErlangとElixirの最新バージョンをソースコードビルド


#概要
v1.0.0が出たり[よさげな本](https://pragprog.com/book/elixir/programming-elixir)が出版されたりと、安定軌道に乗ったかもしれないElixirですが、バージョン関連の混乱がちょっと前までありました。バージョンを上げたり下げたりすると解決するエラーとか。今もあるかもしれません。
現在はとりあえずErlangもElixirも最新バージョンを入れておけば大丈夫です。最新バージョンをソースコードビルドしてインストールしましょう。

#環境
* OS X Yosemite (10.10.1)

Linux環境も基本的には同じだと思うんですが、後述する**準備**が違うものになります。

#入れるバージョン
現在の最新バージョン
####Elrang

* 17.4

####Elixir

* v1.0.2

を入れましょう。他のバージョンでもやり方は同じですが、Elixirには対応しているErlangのバージョンがあるのでそれを確認してください。

# 手順
##Erlangをkerlでバージョン管理
### 準備
_Command Line Tools for Xcode_をインストールしておく。これはErlangをビルドする前にopenssl関連を入れておかないと、ErlangはビルドできてもElixirがビルドできないからです。
Linuxでも同様のことをしないといけませんが条件は追えていません。なんとかしてErlangビルド後に`crypto:start/0`で`ok`が返ってくるようにしてください!!

(追記：LinuxでErlangをビルドするときは、[voluntasさん](http://voluntas.hatenablog.com/about)の記事[「Scientific Linux 6.0 に Erlang をインストールしてみる」](http://voluntas.hatenablog.com/entry/20110604/1307151507)に書かれている

```bash
$ yum install gcc gcc-c++ make openssl-devel ncurses-devel
```

をして必要なソフトを入れるとうまくいくと思います。)

### Erlangのインストール
Erlangのバージョン管理をソースコード・ビルドで行うツールが[kerl](https://github.com/yrashk/kerl)です。
適当なbinディレクトリで

```bash
$ curl -O https://raw.githubusercontent.com/spawngrid/kerl/master/kerl
$ chmod a+x kerl
```

で`kerl`を実行コマンドにします。

```bash
$ kerl list releases
```

で使えるバージョンを確認。最新のもの（ここでは17.4）を、好きなビルド名（ここではbuild17.4)を付けてビルドします。

```bash
$ kerl build 17.4 build17.4
```

ちょっと時間がかかります。

次にインストールを行います。
まずビルドバージョンごとにインストール先のディレクトリを作って、`kerl install`コマンドを叩きます。

```bash
$ mkdir -p ~/bin/erlang/17.4
$ kerl install build17.4 ~/bin/erlang/17.4
```
最後にこのインストールを有効化します。`kerl install`コマンドを実行すると最終行に`activate`コマンドのパスが表示されるのでそれを叩いてください。

```bash
$ . ~/bin/erlang/17.4/activate
```

###確認

Erlangがインストールされているか確認しましょう。

``` bash
$ erl
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V6.3  (abort with ^G)
1> crypto:start().
2> ok
```

最後に`crypto:start/0`を叩いていますが、このモジュールが入っていないとElixirのインストールで失敗するので確認しています。
`crypto:start/0`に失敗したなら、上述の**準備**に書かれた作業をしていない可能性が高いので、`kerl delete`でインストールしたものとビルドしたものを消してから、**準備**してもう一度ビルドしてください。

## Elixirのインストール

Elixirはバージョン管理ソフトがなさそうなのでgitで落としてきます。

```bash
$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir
```

最新のタグを確認して、

```bash
$ git tag
```

タグをチェックアウトしてブランチを作ります。

```bash
$ git checkout -b v1.0.2 refs/tags/v1.0.2
```

最後はドキュメントに書かれている通り、ビルドします。

```bash
$ make clean test
```

`elixir/bin`にパスを通しておきましょう。

#まとめ
面倒臭いですが一度作ってしまうと最新のElixir環境が維持できるようになります。

-------
#### 追記
2015.2.14 **準備**に追記
無料のWEBサーバ(apache, http/https)セキュリティ診断ツール

http://d.hatena.ne.jp/end0tknr/20150102/1420207458
↑こちらの以前のエントリに関連しますが、セキュリティを考慮したWEBサーバに設定したとしても、その設定内容はテスト(チェック)したいですよね?
なので、無償で利用できるネットワーク?セキュリティ診断ツールを調べてみました。

# Nikto2
https://cirt.net/Nikto2
perlで書かれており、apacheのversion , cookieのhttponly , crossdomain.xml , TRACEメソッド 等々、数千の項目をチェックしてくれます。
http://www.atmarkit.co.jp/ait/articles/0803/05/news149.html
利用方法は、@it の記事に記載されている通りですが、次のように実行します。
(ファイルの取得だけで、install自体は不要です)

> $ wget http://www.cirt.net/nikto/nikto-current.tar.gz 
> $ tar -xzvf nikto-current.tar.gz 
> $ cd nikto-2.1.5
> $ perl nikto.pl -update   #最新のテストパターン入手
> $ perl nikto.pl -host https://www.example.com
最後のnikto.plの実行により発見された脆弱性が表示されます

# Qualys SSL LABS の SSL Server Test
https://www.ssllabs.com/ssltest
こちらは、SSLに特化したセキュリティ診断WEBアプリで、url (ホスト名)を指定するだけで、評価してくれます


こんなに簡単に脆弱性を発見できるこので、世の中のWEBサーバの脆弱性が、さらされなければ、良いんですがね
AtCoder コンテストの入力例一覧を取得するPythonスクリプト

##ソースコード
[Gistはこちら https://gist.github.com/029969994cb444bef7ed](https://gist.github.com/029969994cb444bef7ed)

```py3
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from bs4 import BeautifulSoup
import sys
import os
import re
'''
コンテストトップページの URL を渡すと実行ディレクトリ以下に
問題ごとのディレクトリ作成, 問題ページの入力例をファイル出力する
'''

INPUT_FILE_NAME = "input.txt"
DELIMITER = "---"


def main():
    # http://arc001.contest.atcoder.jp/
    try:
        url = sys.argv[1]
    except IndexError:
        print("input contest url:")
        url = input()

    m = re.search('(https?://)(?P<name>.*)\.contest?', url)
    contest_name = m.group('name')
    if not os.path.exists(contest_name):
        os.mkdir(contest_name)
    page = urlopen(url + "assignments")
    soup = BeautifulSoup(page)
    table = soup.find('table', attrs={'class': 'table-wb'}).find('tbody')
    for tr in table.find_all('tr'):
        (sharptd, qlinktd) = tr.find_all('td', limit=2)
        index = sharptd.text
        q_path = contest_name + "/" + index
        if not os.path.exists(q_path):
            os.mkdir(q_path)
        url_tail = qlinktd.find('a').get('href')
        f_path = q_path + "/" + INPUT_FILE_NAME
        if not os.path.exists(f_path):
            f = open(f_path, "w")
            f.write(soup_prets(url + url_tail[1:]))
            f.close()
            print("generate input > " + f_path)
        else:
            print("already exists: f_path")


def soup_prets(url):
    '''
    input テキストを取ってくる
    '''

#    print(url)
    page = urlopen(url)
    soup = BeautifulSoup(page)
    inputs = []
    for pretag in soup.find_all("pre", attrs={"class": "prettyprint"})[::2]:
        inputs.append(pretag.string.strip())
    return ("\n" + DELIMITER + "\n").join(inputs)

if __name__ == '__main__':
    main()
```



##用意
Python3, BeautifulSoup4 が必要

```shell-session
pip install beautifulsoup4 
```

##実行例
http://arc001.contest.atcoder.jp/ のコンテストで試す

```shell-session
> ls
start.py
```

スクリプトを実行

```shell-session
> ./start.py http://arc001.contest.atcoder.jp/
generate input > arc001/A/input.txt
generate input > arc001/B/input.txt
generate input > arc001/C/input.txt
generate input > arc001/D/input.txt
```

実行後のディレクトリ構成

```
> tree
.
├── arc001
│   ├── A
│   │   └── input.txt
│   ├── B
│   │   └── input.txt
│   ├── C
│   │   └── input.txt
│   └── D
│       └── input.txt
└── start.py

5 directories, 5 files
```

生成されたもの確認

```
> cat arc001/A/input.txt
9
131142143
---
20
12341234123412341234
---
4
1111
```
phpマイクロフレームワークSlim導入


slimのインストールと「Hello World!」の表示まで

##slimの導入
作業ディレクトリを作成

```
$ mkdir slim
$ cd slim
```

composerを利用するのでインストール

```
$ sudo curl -s https://getcomposer.org/installer | php
```

composer.jsonを作成して、slimに依存させます

```javascript:composer.json
{
    "require": {
        "slim/slim": "2.*"
    }
}
```

slimのインストール

```
$ php composer.phar install
```

インストール中に下記メッセージが表示された場合は、yumでインストール。

```
slim/slim suggests installing ext-mcrypt (Required for HTTP cookie encryption)
```

php5.5を利用しているので、enablerepoを指定してインストールを叩いてます。

```
$ sudo yum install --enablerepo=remi --enablerepo=remi-php55 php-mcrypt
```

##Hello World!の作成
Hello World!を出力するだけの以下のコードを作成する
（小難しい設定を行わなくても問題なく動く）

```php:index.php
<?php
require 'vendor/autoload.php';

$app = new \Slim\Slim;
$app->get('/', function() {
    echo 'Hello World!';
});
$app->run();
```

あとは、phpのビルドインサーバを立ち上げて、curlコマンドで確認

```
$ php -S localhost:8000

# 別ターミナルで
$ curl http://localhost:8000/
Hello World!
```

Hello World! と出力されればOK。slimの導入完了です
「アンダー60」「オーバー100」とかのテキストを返すワンライナー

PHP

```php
$score = 105;
$score_text = sprintf("%s%d", $score % 10 < 5 ? "オーバー" : "アンダー", round($score, -1));
echo $score_text;
# アンダー110
```

Python3

```py
# -*- coding: utf-8 -*-
score = 105
score_text = "%s%d" % (("オーバー", score // 10 * 10) if score % 10 < 5 else ("アンダー", (score // 10 + 1) * 10))
print(score_text)
# アンダー110
```
ImageMagick のインストール

まず [XQuartz](https://xquartz.macosforge.org/landing/) をインストールします。リンク先のインストーラーで簡単に入れることができます。

XQuartz は OS X 用の X11 サーバとクライアントのライブラリで、特に ImageMagick を GUI で使用しないならいらないみたい。

XQuartz が入ったら、ImageMagick を brew で入れます。

```
brew install imagemagick --with-x11
```

X11 を利用するように `--with-x11` オプションをつけます。
これでインストール完了です！

```
display
```

とやって起動するか確かめて見ましょう。

### 補足
僕は `display` したら

```
unable to open X server `' @ error/display.c/DisplayImageCommand/426.
```

と ERROR になりましたが、Mac 再起動したら直りました。
X11 入れたら再起動しないといけないのかな。
mocha + chai.should で null や undefined をテストする

# 問題点

`chai.should` は `Object` のプロトタイプに `should` というメソッドを追加することで実装されているので、 `Object` のプロトタイプを継承していない `null` や `undefined` は `should` というメソッドを持たない。そのため、普段と同じ語順でテストしようとするとエラーになる。

```coffeescript
null.should.be.null
undefined.should.be.undefined

# TypeError: 'null' is not an object (evaluating 'restDaysText(dest, src).sould')
```

# 解決策

## `chai.should()` の戻り値のオブジェクトを使う方法[^1]

[^1]: [How to assert null with should · Issue #90 · chaijs/chai](https://github.com/chaijs/chai/issues/90#issuecomment-7263749) よりコードを引用（コメント内意訳 + `undefined` のテストを追加）

公式に提供されている方法を使う。普段と語順は違うがチェックできる。

```js
var should = chai.should();

// example が `null` か `undefined` であることをテストする。
should.not.exist(example);

// example が `null` であることをテストする。
should.equal(example, null);

// example が `undefined` であることをテストする。
should.equal(example, undefined);
```


## CoffeeScript の存在演算子を使う方法

CoffeeScript の存在演算子を使うと、普段と同じ語順で短くテストを書くことができる。

```coffeescript
# example が `null` か `undefined` であることをテストする。
example?.should.be.false
```
SQL Server Management Studioで生成したINSERT文をC#のリテラル文字列に変換する手順

もっと良い方法がありそうだが、とりあえず現状の手順をメモ。
Notepad++ の正規表現で整形する。

"テーブルをスクリプト化" のメニューでINSERT文を作成する。

```sql:SQLQuery1.sql
INSERT INTO [TESTDB].[dbo].[TESTTABLE_A]
           ([TESTCOLUMN_A]
           ,[TESTCOLUMN_B])
     VALUES
           (<TESTCOLUMN_A, nchar(10),>
           ,<TESTCOLUMN_B, nchar(10),>)
GO
```

C#で複数行のリテラル文字列を生成するには、2通りの方法がある（[参考](http://msdn.microsoft.com/ja-jp/library/aa287596%28v=vs.71%29.aspx)）
@を利用する場合は、鍵括弧の置換まで手順を飛ばせる。
（algさんにコメント欄で教えて頂きました。ありがとうございました）

なんからの理由で、+記号で文字列を結合したい場合は、以下の置換から作業を行う。

正規表現で、行頭のスペースを削除する。最後の行のGOは不要なので削除。

検索文字列: ^\s
置換文字列: （空）

```sql:SQLQuery1.sql
INSERT INTO [TESTDB].[dbo].[TESTTABLE_A]
([TESTCOLUMN_A]
,[TESTCOLUMN_B])
VALUES
(<TESTCOLUMN_A, nchar(10),>
,<TESTCOLUMN_B, nchar(10),>)
```

行頭に +" を追加する

検索文字列: ^
置換文字列: \+"

```sql:SQLQuery1.sql
+"INSERT INTO [TESTDB].[dbo].[TESTTABLE_A]
+"([TESTCOLUMN_A]
+",[TESTCOLUMN_B])
+"VALUES
+"(<TESTCOLUMN_A, nchar(10),>
+",<TESTCOLUMN_B, nchar(10),>)
```

行末に スペースと " を追加する。スペースは好みで改行文字にしてもいい。

検索文字列: $
置換文字列:  "（スペースと"）

```sql:SQLQuery1.sql
+"INSERT INTO [TESTDB].[dbo].[TESTTABLE_A] "
+"([TESTCOLUMN_A] "
+",[TESTCOLUMN_B]) "
+"VALUES "
+"(<TESTCOLUMN_A, nchar(10),> "
+",<TESTCOLUMN_B, nchar(10),>) "
```

鍵括弧を、string.Formatのフォーマット文字列のパラメータにする

検索文字列: <.*>
置換文字列: '{}'

```csharp:SQLQuery1.sql
+"INSERT INTO [TESTDB].[dbo].[TESTTABLE_A] "
+"([TESTCOLUMN_A] "
+",[TESTCOLUMN_B]) "
+"VALUES "
+"('{}' "
+",'{}') "
```

先頭の+記号を、変数に変える。

検索文字列: +
置換文字列: const string formatString = 
（1行目のみの置換）

```csharp:SQLQuery1.sql
const srting formatString ="INSERT INTO [TESTDB].[dbo].[TESTTABLE_A] "
+"([TESTCOLUMN_A] "
+",[TESTCOLUMN_B]) "
+"VALUES "
+"('{}' "
+",'{}') "
```

Visual Studio のテキストエディタに貼りつけて、末尾に ; を付けて自動整形させる
（自分はReSharperを利用しているため、;の付与が自動整形になります）

```csharp:New1.cs
            const string formatString = + "INSERT INTO [TESTDB].[dbo].[TESTTABLE_A] "
                                        + "([TESTCOLUMN_A] "
                                        + ",[TESTCOLUMN_B]) "
                                        + "VALUES "
                                        + "('{}' "
                                        + ",'{}') ";

```

フォーマット文字列のパラメータに手動で数字を記入

```csharp:New1.cs
            const string formatString = +"INSERT INTO [TESTDB].[dbo].[TESTTABLE_A] "
                                        + "([TESTCOLUMN_A] "
                                        + ",[TESTCOLUMN_B]) "
                                        + "VALUES "
                                        + "('{0}' "
                                        + ",'{1}') ";

```
LINQの活用を踏まえたCSVReaderクラスを作ってみた

最近、ちょっとしたシミュレーションなどでCSVファイルを読み込むことが多いので、CSVReaderクラスを作ってみました。
初投稿ですが、色々と厳しい意見をお願いします。

まず、LineDataという抽象クラスを定義します。
これは、入力したいCSVの1行にどのようなデータが入っているかを定義しておくクラスの基本クラスです。

```csharp:LineData.cs
namespace CSV
{
    public abstract class LineData
    {
        public LineData() { }

        public abstract void SetDataFrom(string[] s);
    }
}
```

次にCSVReaderクラスですが、filepathからCSVファイルを読み込んでLineDataを放出し続けます。このため、LineDataの派生型を型引数とするジェネリックにしてあり、IEnumerableも実装しています。

```csharp:CSVReader.cs
using System;
using System.Collections.Generic;
using System.IO;

namespace CSV
{
    public class CSVReader<T> : IEnumerable<T>, IDisposable
        where T : LineData, new()
    {
        private StreamReader reader;
        private string filepath;
        private bool skip;

        public CSVReader(string filepath, bool skip = true)
        {
            if (!filepath.EndsWith(".csv", StringComparison.CurrentCultureIgnoreCase))
            {
                throw new FormatException("拡張子が.csvではないファイル名が指定されました。");
            }
            this.filepath = filepath;
            this.skip = skip;
            reader = new StreamReader(filepath);
            if (skip) reader.ReadLine();
        }

        public void Dispose()
        {
            reader.Dispose();
        }

        public IEnumerator<T> GetEnumerator()
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                var data = new T();
                data.SetDataFrom(line.Split(','));
                yield return data;
            }
            reader = new StreamReader(filepath);
            if (skip) reader.ReadLine();
            yield break;
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
    }
}
```

利用側では、まずLineDataを派生させSetDataFromを実装してもらいます。

```csharp:実装例
    class IntIntLine : LineData
    {
        public int data1,data2;

        public override void SetDataFrom(string[] s)
        {
            data1 = int.Parse(s[0]);
            data2 = int.Parse(s[1]);
        }
    }
```

そして、この派生型を型引数に用いてCSVReaderをusingするだけです。

```csharp:利用例
    class Program
    {
        static void Main()
        {
            using (var reader = new CSVReader<IntIntLine>(@"example.csv"))
            {
                var s = reader.Where(i => i.data1 > 0).Select(i => i.data2).Sum();
                Console.WriteLine(s);
            }
            return;
        }
    }
```

このCSVReaderの利点としては、IEnumerableを実装しているため、foreachやLinqが使い放題になることでしょう。またLinqの遅延評価を生かし、メモリを節約しながらCSV全体を計算に使用できます。

ちなみにLineDataをインターフェースにしていないのは、常に制約条件new()を満たすためだけにコンストラクタを定義させるのは面倒だろうということで、仕方なくこのような形になりました。何かいいアイデアはありませんか？
zshで属性を考慮してファイル名を展開する

zshのファイル展開は便利でfindが殆ど必要なくなります

## 昔から使える展開

```zsh
ls *
ls *.c
```

で現在のディレクトリ以下のファイル一覧、あるいは拡張子.cを持つファイルを一覧します。
当然`cp`, `rm`等でも使えます。
注意すべきは、zshが`*`を先に展開してから実行コマンドに渡される点です。

## 再帰的にディレクトリを走査する

```zsh
ls **/*
ls **/bin/*
```

`**`をは任意のディレクトリ階層にマッチします。
これで現在のディレクトリから、再帰的に以下のファイルを走査します。

## ファイルの属性を考慮した展開

上述の`**`を使う展開ではマッチするファイルが増えすぎるので、
何かで制限したくなります。

```zsh
ls **/*(.)       # 通常ファイルのみ
ls **/*(/)       # ディレクトリのみ
ls **/bin/*(.*)  # 通常ファイルで実行可能なもの
```

最後の例のように複数の指定子を組みあわせて使う事ができます。
zshの補完機能をonしていれば`(`を入れた段階でTABで候補が説明付きででます。

```output
ls **/*(
%  -- device files
)  -- end of qualifiers
*  -- executable plain files
+  -- + command name
-  -- follow symlinks toggle
.  -- plain files
/  -- directories
:  -- modifier
=  -- sockets
@  -- symbolic links
A  -- group-readable
D  -- glob dots
E  -- group-executable
F  -- non-empty directories
G  -- owned by EGID
I  -- group-writeable
L  -- + size
M  -- mark directories
N  -- use NULL_GLOB
O  -- + sort order, down
P  -- prepend word
R  -- world-readable
S  -- setgid
T  -- mark types
U  -- owned by EUID
W  -- world-writeable
X  -- world-executable
Y  -- + at most ARG matches
[  -- + range of files
^  -- negate qualifiers
a  -- + access time
c  -- + inode change time
d  -- + device
e  -- execute code
f  -- + access rights
g  -- + owning group
l  -- + link count
m  -- + modification time
n  -- numeric glob sort
o  -- + sort order, up
p  -- name pipes (FIFOS)
r  -- owner-readable
s  -- setuid
t  -- sticky bit set
u  -- + owning user
w  -- owner-writeable
x  -- owner-executable
```
Swift で Promise

jQuery や angularJS で実装されている Deferred/Promise を Swift で書いた。

https://github.com/amo12937/amo.Promise

使い方はこんな感じ。

```swift
typealias Result = (request: NSURLRequest, response: NSURLResponse!, data: NSData!)
func asyncRequest(request: NSURLRequest, queue: NSOperationQueue) -> Promise<Result> {
    return Promise<Result>({(deferred) -> () in
        NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler: { (response, data, error) -> () in
            if error == nil {
                let result = (request, response, data)
                deferred.resolve(result)
            } else {
                deferred.reject(error)
            }
        })
    })
}

func anotherFunc() {
    asyncRequest(request, queue).then({(result) -> () in
        // 成功時の挙動
    }).catch({(error) -> () in
        // エラー処理
    })
}
```

これでコールバック地獄から開放される。