OmniAICreator/Qiita-1.07M huggingface dataset:
CUIコマンドライン上でRubyドキュメントで検索を行うことができるGemを作成（るりまサーチ利用）


### インストール

```
$ gem install ruremasearcher 
```

### 使用方法

$ ruremasercher search <検索したい文字列>
(検索文字列が複数の場合はクォーテーションで囲ってください）
最大5件まで検索結果が表示されます。
例:
$ ruremasercher search "http post"

### 検索を行う

```
$ ruremasearcher search "each with index"
---検索結果：1件目------------------------------
タイトル： Prime::PseudoPrimeGenerator#each_with_index {|prime, index| ... } -> self
分類：インスタンスメソッド
要約：与えられたブロックに対して、素数を0起点の連番を渡して評価します。
説明：...れた場合は self を返します。 ブロックを与えられなかった場合は Enumerator を返します。例:  Prime::EratosthenesGenerator.new(10).each_with_index do |prime, index|    p [prime, index]  end  # [2, 0]  # [3, 1]  # [5, 2]  # [7, 3]@see Enumerator#with_index...
---検索結果：2件目------------------------------
タイトル： Enumerable#each_with_index {|item, index| ... } -> self
分類：インスタンスメソッド
要約：要素とそのインデックスをブロックに渡して繰り返します。
説明：...す。self を返します。ブロックを省略した場合は、要素とそのインデックスを繰り返すようなEnumerator を返します。例:    [5, 10, 15].each_with_index do |n, idx|      p [n, idx]    end        # => [5, 0]        #    [10, 1]        #    [15, 2]...
---検索結果：3件目------------------------------
タイトル： Prime::PseudoPrimeGenerator#each_with_index -> Enumerator
分類：インスタンスメソッド
要約：与えられたブロックに対して、素数を0起点の連番を渡して評価します。
説明：...れた場合は self を返します。 ブロックを与えられなかった場合は Enumerator を返します。例:  Prime::EratosthenesGenerator.new(10).each_with_index do |prime, index|    p [prime, index]  end  # [2, 0]  # [3, 1]  # [5, 2]  # [7, 3]@see Enumerator#with_index...
---検索結果：4件目------------------------------
タイトル： Matrix#each_with_index(which = :all) -> Enumerator
分類：インスタンスメソッド
要約：行列の各要素をその位置とともに引数としてブロックを呼び出します。
説明：...要素の範囲を指定することができます。Matrix#each と同じなのでそちらを参照してください。ブロックを省略した場合、 Enumerator を返します。  Matrix[ [1,2], [3,4] ].each_with_index do |e, row, col|    puts "#{e} at #{row}, #{col}"  end    # =>...                          ...1 at 0, 0    # => 2 at 0, 1    # => 3 at 1, 0    # => 4 at 1, 1@param which どの要素に対してブロックを呼び出すのかを Symbol で指定します@see Matrix#each...
---検索結果：5件目------------------------------
タイトル： Matrix#each_with_index(which = :all) {|e, row, col| ... } -> self
分類：インスタンスメソッド
要約：行列の各要素をその位置とともに引数としてブロックを呼び出します。
説明：...要素の範囲を指定することができます。Matrix#each と同じなのでそちらを参照してください。ブロックを省略した場合、 Enumerator を返します。  Matrix[ [1,2], [3,4] ].each_with_index do |e, row, col|    puts "#{e} at #{row}, #{col}"  end    # =>...                          ...1 at 0, 0    # => 2 at 0, 1    # => 3 at 1, 0    # => 4 at 1, 1@param which どの要素に対してブロックを呼び出すのかを Symbol で指定します@see Matrix#each...
```

### リンク
■ るりまサーチ： http://docs.ruby-lang.org/ja/search/

■ Gem「RuremaSearcher」:

* GitHub: https://github.com/ryosy383/ruremasearcher

* RubyGems: https://rubygems.org/gems/ruremasearcher
ナイーブベイズでツンデレ判定してみた

#はじめに
デモです。

```
input=>ちょっと、何！？　びっくりすんじゃん……。
category: tsundere

input=>君が大好きで。すっごく大好きでね。
category: not_tsundere

input=>……気安く触んないでよ、バカ。
category: tsundere

input=>人ラブ！俺は人間が好きだ！愛してる！
category: not_tsundere
```

よい...。

#やったこと
##ふつうのスパム判定の場合
スパムのテキストとそうでないテキストをそれぞれコンピュータに学習させて、新しく入力されたテキストがスパムかどうかを判定します。
![spam.png](https://qiita-image-store.s3.amazonaws.com/0/46932/d8128ce3-85ba-3a1d-e588-2054fbead670.png)
...つまらん

##ツンデレ判定の場合
ツンデレのテキストとそうでないテキストをそれぞれコンピュータに学習させて、新しく入力されたテキストがツンデレかどうかを判定します。
![tsundere.png](https://qiita-image-store.s3.amazonaws.com/0/46932/6a815c7c-f312-6000-b34e-acf6a59d6c9a.png)

楽しい！！

#データの用意
学習を行うためには当然学習データが必要です。ツンデレがいっぱい詰まったテキストをどうにかして用意しなければなりません。
今回はデータを集めるのにtwitterを使いました。「ツンデレbot」みたいなアカウントのツイートを取得して学習データとしています。

#コード
コードは[GitHub](https://github.com/IshitaTakeshi/NaiveBayes)にあります。詳しいつかいかたはREADMEを見てください。
ナイーブベイズのコードは[katryoさんの記事](http://qiita.com/katryo/items/6a2266ffafb7efa9a46c)のものを使用しました。

動作させるにはpython-twitter(pipでインストールできる)が必要です。
また、twitterのアプリケーション用のキーとyahooの形態素解析のアプリケーションIDを発行する必要があります。
それぞれ以下で取得できます。

https://dev.twitter.com/
https://e.developer.yahoo.co.jp/register 

なおYahooのアプリケーションIDを発行する際には「クライアントサイド」を選択してください。
発行した各IDを[settings.cfg](https://github.com/IshitaTakeshi/NaiveBayes/blob/master/src/settings.cfg)に貼り付け、適当なアカウントを```true_accounts```と```false_accounts```に設定するとつかえます。

アカウント1つあたり200ツイート取得して学習させているため、たくさんアカウントを指定するとそれだけ学習に時間がかかります。指定するアカウントの数は時間と精度のトレードオフを見て適切に決めてください。

#最後に
別のデータを学習させれば自分のオリジナルの学習器を作ることができます。
ツンデレ判定以外にも、ヤンデレ判定やイケメン判定などもやってみると面白いかもしれません。
GOでgo getしたパッケージの更新

# 背景

goでOpenGLやってみようと、go-glを試すも、exampleのtriangle.goがちっとも動かない。しかも

```
```

よく見ると、ログ吐くのに失敗しているように見える。

```
go version
```

で調べてみると、最新版でないGoだったので、Go本体をアップデートした。

# 自前で入れたパッケージがバージョンエラー

```
go run triangle.go 
# command-line-arguments
./triangle.go:10: import /Users/kjw_junichi/gocode/pkg/darwin_amd64/github.com/andrebq/gas.a: object is [darwin amd64 go1.3 X:precisestack] expected [darwin amd64 go1.3.3 X:precisestack]
```

# Stackoverflowで回答見つけるも

- [How does Go update third-party packages? - Stack Overflow](http://stackoverflow.com/questions/10383498/how-does-go-update-third-party-packages)

```
go get -u all
```

で行けるように、思われたが、ダメだった。

# Workaround

文句言われてる、xx.aファイルを削除しては、go runを繰り返すことで解決した。

```
rm /Users/kjunichi/gocode/pkg/darwin_amd64/github.com/andrebq/gas.a
go run triangle.go
# command-line-arguments
./triangle.go:11: import /Users/kjunichi/gocode/pkg/darwin_amd64/github.com/go-gl/gl.a: object is [darwin amd64 go1.3 X:precisestack] expected [darwin amd64 go1.3.3 X:precisestack]
rm  /Users/kjunichi/gocode/pkg/darwin_amd64/github.com/go-gl/gl.a
go run triangle.go 
```

# まとめ

結局、目的のtriangle.goはエラーが解消しなかったが、
Goで、本体を更新した際のローカルに入れたパッケージのスマートな更新方法は
どうやるのだろう？

Goは入れっぱなしで放置していた為、
この疑問すら、今回の作業まで持たずにいた。やはり、何事も手を動かすことが大事だ。

# link

- https://github.com/go-gl/examples

# 関連記事

- [node-ffiをGoで入門してElectronを使って応用してみる](http://abrakatabura.hatenablog.com/entry/2015/12/11/000722)
- [mrubyのHTTP2サーバーでWebGLでGopherを出そうとした](http://abrakatabura.hatenablog.com/entry/2015/12/19/215822)
- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](http://abrakatabura.hatenablog.com/entry/2016/01/09/134348)
- [Goの学習メモ～ファイルの存在チェックとWindowsでのファイルパスの扱い～](http://abrakatabura.hatenablog.com/entry/2017/04/03/192539)
- [Go言語でコマンドプロンプトに画像を表示するコマンドを作って、Vimの:terminalで表示させた](http://abrakatabura.hatenablog.com/entry/2017/08/19/093906)
- [Goの符号なし整数の計算でハマった件](http://abrakatabura.hatenablog.com/entry/2017/08/26/153528)
Apple のリリースした、Bash の更新が不完全だったので、パッチをあてなおした。

# Apple の Bash の更新が不完全だったらしい

セキュリティホールメモの[Bash ShellShock バグ (CVE-2014-6271, CVE-2014-7169, CVE-2014-6277, CVE-2014-6278, CVE-2014-7186, CVE-2014-7187) 修正情報まとめ
(various) ](https://www.st.ryukoku.ac.jp/~kjm/security/memo/2014/10.html#20141003_Bash)によると、Appleの修正は不完全だそうだ。

## パッチが五月雨式だったから?

ShellShock の 問題は修正パッチリリース後にそのパッチが不完全でさらにパッチがでるという状況だったので、パッチがリリースされた直後の更新方法では不完全なパッチだけしか対応していないことがある。この記事もそうかもしれない。

また後発でパッチがリリースされる可能性は否定できないので注意が必要である。

# ビルド

今回は、Appleの公開しているソースに GNUがリリースしている、052 から ~~056~~ 057のパッチをあててビルドすることにした。他に必要なパッチがあれば、同様の方法で適用してほしい。

[Every Mac Is Vulnerble shellshock bash exploit heres patch os x](http://mac-how-to.wonderhowto.com/how-to/every-mac-is-vulnerable-shellshock-bash-exploit-heres-patch-os-x-0157606/) を参考にしている。

## 必要なもの

Xcode (Command Line Tools)

# ビルド方法
```bash
mkdir bash-fix
cd bash-fix
curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
cd bash-92/bash-3.2
for i in $(seq -f "%03g" 52 57);do curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-$i | patch -p0; done
cd ..
xcodebuild
build/Release/bash --version
build/Release/sh --version
```

なんらかの事情でcurlで httpsを扱えない場合には、しかたがないので、curl -kに置きかえるとダウンロードはできるが、信頼性は減少する。

最後の bash --version でVersionが確認できる。 

# いれかえ

Appleのリリースしたバージョンも念のために削除せずにおいておいたほうがいいかもしれないので、以下のようにすることにした。

```bash
sudo cp -p /bin/bash /bin/bash.org
sudo cp -p /bin/sh /bin/sh.org
sudo cp -p build/Release/bash /bin/bash
sudo cp -p build/Release/sh /bin/sh
```
ActiveRecordでunion使いたい

# やりたいこと
ActiveRecordでunion使いたい

# どうやるか

調べてもよくわからなかったので、下記を追加した

```rb:config/initializer/model_customizer.rb
ActiveRecord::Base.send(:define_singleton_method , "union", proc { |*queries|
  from "(#{ queries.map { |q| q.ast.to_sql }.join(' UNION ') }) AS #{self.table_name}"
})
```

# つかいかた
```rb:app/model/post.rb

    self.union(query1, query2, query3)

```

# 注意
scopeでorder定義しているときはunscopeしないとSQLExceptionになる。
unionメソッド定義の中でunscopedするとsqlが変わってしまうので、渡す前にunscopedすることにした。

例：

```rb:app/model/post.rb

  default_scope -> { order('created_at DESC') }

  def self.from_users_followed_by(user)
    followed_user_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id"
    where("user_id IN (#{followed_user_ids}) OR user_id = :user_id", user_id: user.id)
  end
  
  def self.from_tags_followed_by(user)
    subquery1 = "SELECT tag_id FROM tag_follows WHERE user_id = :user_id"
    subquery2 = "SELECT post_id FROM taggings WHERE tag_id IN (#{subquery1})"
    where("id IN (#{subquery2}) ", user_id: user.id)
  end
  
  def self.feed(user)
    self.union(
      self.unscoped.from_users_followed_by(user),
      self.unscoped.from_tags_followed_by(user)
    ).order('created_at DESC')
  end
```
PIDからマネージャのUnitを得る

systemdには`manager_get_unit_by_pid`というユーティリティ関数がある。これはPIDからマネージャ(systemdのデーモンプロセス)のUnit(に対応するデータ構造)を得るための関数だが、この実装方法が少し変わっている。

単純にPIDをキーUnitをバリューとするハッシュデータ構造を持っていても良さそうだが、そうはなっていない。systemdではcgroupのパスをキーとするハッシュを使っている。PIDからcgroupのパスを取得し、それをキーにUnitを取得している。

コードは大体こんな感じ。

```c:src/core/cgroup.c
Unit *manager_get_unit_by_pid(Manager *m, pid_t pid) {
        _cleanup_free_ char *cgroup = NULL;
        int r;

        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cgroup);
        return manager_get_unit_by_cgroup(m, cgroup);
}

Unit* manager_get_unit_by_cgroup(Manager *m, const char *cgroup) {
        char *p;
        Unit *u;

        u = hashmap_get(m->cgroup_unit, cgroup);
        if (u)
                return u;
}
```

`cg_pid_get_path`は、/proc/pid/cgroupから`name=systemd`という名前のコントローラのエントリを見つけ出し、そのパスを得るというもの。

`name=systemd`のコントローラはこんな形で使われているらしい。
読みやすいコードを書くためのTips


## パラグラフについて
* できるだけ意味合いに基づいてコードをパラグラフに分割せよ

## コメントの書き方
* コード自体に既に含まれている、新しい情報のないコメントは書かれるべきでない

* 自分自身がそのコードを書いた際に考えたことの記録のようなものだと思え 
	* 例えば、同じ目的を満たすためにコードの書き方が複数考えられる際、なぜその中からそのコードをチョイスしたのかをメモしておくべき

* 関数の引数にはインラインでコメントを書くと良い

例) function test(/* num of people * / 10, / * sex */ 'woman');

* boolean型の引数を渡すときはコメントをできるだけ書くべし

* itやthisといった代名詞をコメントに使うのは避けよう

* とにかく短く

### コメントに書かれるマーカーの例
* TODO
* FIXME
	* known-broken code here
* HACK 
	* Admittedly inelegant solution to a problem
* XXX
	* danger!


### 定数につけられるコメント
* 定数を定義する際は、なぜその数値にしたのかをできるだけ書くべき
	* 第三者が読んだとき、疑問になりやすい

* Explain Big Picture
	* 細かいところに焦点を当てる前に、まず俯瞰的な部分から説明するべき。このクラスは何をするものなのか？など
	* GithubのREADMEでよくある「これはなに？」のようなもの

### 変数について
* 一度に頭にストックされる変数は３つまでと心得よ

* ごちゃごちゃしたコードは避けよ。複数回使われる長い単語は短い変数に代入すべき

* テンポラリーすぎる使用目的の変数使用は控えよ。そういったケースは変数を使用しない方法を考えるべき。


* 変数の数はできるだけ少なく
	- とにかく変数は少ない方が読みやすい

* スコープの範囲は狭く
	- 視野の外は脳の外

* 一度しか書かれない変数は読みやすい
	- const, finalといったimmutableな変数の使用はコードを読みやすくする。


### その他 メモ

* saying things in plain English
* Rubber ducking -> あひるにプログラムの処理内容をひとつひとつ説明してみるだけで問題が洗い出されるというデバッグ手法
* keep your codebase as small and lightweight as possible
* いらないコードはバンバン消していくことが大事！消すことを惜しむな！
* 統計によるとエンジニアは平均で１日約10行の再利用可能なコードを書いている。-> こういうときはライブラリを使うべき。
**ライブラリは保守性が正しく、多くのテストをくぐり抜けてきている！**
RubyMotionでテーブルビューのページング


UITableViewの一番下のセルまでスクロールしたら、次のX件読み込む、っていうやつ。



```ruby:items_controller.rb
class ItemsController < UITableViewController
  READ_COUNT = 20
  ITEM_CELL_ID = 'Item'
  
  def viewDidLoad
    super

    self.title = 'hoge'
    @items = []
    @page = 0
    @last_items_size = 0

    @indicator = UIActivityIndicatorView.alloc.initWithActivityIndicatorStyle(UIActivityIndicatorViewStyleGray)
    @indicator.stopAnimating

    load_items
  end

  def load_items
    Item.fetch(READ_COUNT, @page * READ_COUNT) do |items, error_message|
      @items += items
      @last_items_size += items.size
      self.tableView.reloadData
    end
  end

  def load_more_items
    @page += 1
    load_items
    end_indicator
  end

  def tableView(tableView, numberOfRowsInSection: section)
    @items.size
  end

  def tableView(tableView, cellForRowAtIndexPath: indexPath)
    cell = tableView.dequeueReusableCellWithIdentifier(ITEM_CELL_ID) ||
      UITableViewCell.alloc.initWithStyle(UITableViewCellStyleSubtitle, reuseIdentifier: ITEM_CELL_ID)

    item = @items[indexPath.row]
    cell.textLabel.text = item.title
    cell.detailTextLabel.text = item.url
    cell
  end

  def scrollViewDidScroll(scrollView)
    if self.tableView.contentOffset.y >= self.tableView.contentSize.height - self.tableView.bounds.size.height
      return if @indicator.isAnimating

      if @last_items_size >= (@page + 1) * READ_COUNT
        start_indicator
        self.performSelector('load_more_items', withObject: nil, afterDelay: 1.0)
      end
    end
  end

  def start_indicator
    @indicator.startAnimating
    @indicator.frame = [[0, 0], [self.view.frame.size.width / 2, self.view.frame.size.height / 8]]  # このへんは適当に
    self.tableView.setTableFooterView @indicator
  end

  def end_indicator
    @indicator.stopAnimating
  end
end
```

```ruby:item.rb
class Item
  attr_accessor :title, :url

  BASE_URL = 'https://example.com/'

  def initialize(data)
    @title = data['title']
    @url = data['url']
  end


  def self.fetch(fetch_count, offset, &block)
    url = "#{BASE_URL}?count=#{fetch_count}&offset=#{offset}"

    AFMotion::JSON.get(url) do |result|
      items = []
      error_message = nil

      if result.success?
        items = result.object.map{|data| self.new(data) }
      end
      block.call(items, error_message)
    end
  end
end

```
d3.jsで東京メトロの地下鉄路線図を作成する

d3.jsのおべんきょうのためにやる。

# データの取得
## ベースとなる東京都の地図
http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03.html から取得。チェックボックスで東京だけを指定する。

## 路線図
http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v2_2.html

# ツールの取得
QGISを落とす。
http://qgis.org/ja/site/

# データの加工
## GeoJSONへの変換
### 23区地図
地図データはshpファイルとなっているので、これをGeoJsonに変換する。ogr2ogrコマンドでやる方法もあるが、せっかくなのでツールを使う。

QGISを起動して、「レイヤ -> ベクタレイヤの追加」を選択し、ダウンロードした地図データのshpファイルを読み込ませる。すると、東京都の地図が表示される（小笠原諸島も表示されるので小さくみえる

東京メトロは23区が表示できればだいたいこと足りるので、23区のみをフィルターする。

レイヤパネルで今読み込んだレイヤを右クリックして「フィルタ」を選ぶ。
で、「プロバイダ特有フィルタ式」に

```
"N03_003" LIKE "%区%"
```
と指定する。"N03_003"には行政区域名が入っているので、これで23区に絞り込める。

最後に、レイヤパネルで今読み込んだレイヤを選択した状態で、「レイヤ -> 名前をつけて保存」で、エンコーディングをUTF-8にして、GeoJSON形式で保存する。

### 路線図
読み込む際に形式を空間参照システムを聞かれたら、`JGD2000`を選択。

フィルタの条件は

```
"N02_004" = '東京地下鉄'
```

フィルタをかけたら、地図のときと同様に、GeoJSONとして保存する。

## GeoJSONをTopoJSONに変換
GeoJSONに http://www.pasco.co.jp/recommend/word/word040/ にあるようなトポロジー情報をエンコードしたもの（たぶん）

必要なツールは
http://ja.d3js.node.ws/blocks/mike/map/
ここを参考に。

```
topojson -p name=N03_003 -o tokyo.json tokyo.geojson
topojson -p name=N02_003 -o metro_road.json metro_road.geojson
```

N03_003に記載されている区/路線名を`name`属性に変換して出力します。

# 地図への出力
HTMLは以下のとおり。

```html:index.html
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.subunit-boundary {
  fill: none;
  stroke: #777;
  stroke-dasharray: 2,2;
  stroke-linejoin: round;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://d3js.org/topojson.v0.min.js"></script>
<script>
var width = 400,
    height = 400;
 
var svg = d3.select("body").append("svg")
          .attr("width", width)
          .attr("height", height);
 
d3.json("tokyo.json", function(error, json) {
    var tokyo = topojson.object(json, json.objects.tokyo);
    // 2Dへのマッピング方法を定義
    var projection = d3.geo.mercator()
                       .center([139.7531, 35.6859])
                       .scale(50000)
                       .translate([width / 2, height / 2]);
 
    // path生成
    var path = d3.geo.path().projection(projection);
    svg.append("path")
        .datum(tokyo)
        .attr("d", path);
 
    // 境界線
    svg.append("path")
        .datum(topojson.mesh(tjson, json.objects.tokyo, function(a, b) { return a !== b; }))
        .attr("d", path)
        .attr("class", "subunit-boundary");

    // 路線図
    // 描画順の保障のために、地図表示後に実施
    d3.json("metro_road.json", function(error, json) {
        var path = d3.geo.path().projection(projection);
        var road = topojson.object(json, json.objects.metro_road).geometries;
        svg.selectAll("path")
            .data(road)
            .enter()
            .append('path')
            .attr('d', path)
            .attr('fill-opacity', 0)
            .attr('stroke', "#777")
            .attr('stroke-opacity', 1)
            .attr('stroke-width', '1px');
    });
});
</script>
</body>
</html>
```

とりあえず表示できた。

# 感想
- 各メソッドをとてもふわったとした理解でやっているので、d3.jsの仕様をちゃんと理解したい。
- 路線ごとに色分けとかもやりたい。
- メトロAPIから取れる情報をのっけたい。
Elixir Import / Require

# Elixir Import / Require

## 概要
Elixir の Import / Require について。

## Require

### サンプルコード

~~~
defmodule ImportSamples do
  require Integer
  def is_even(x) do
    IO.puts Integer.is_even(x)
  end

  def is_odd(x) do
    IO.puts Integer.is_odd(x)
  end
end

ImportSamples.is_even(1)
ImportSamples.is_even(2)
ImportSamples.is_odd(1)
ImportSamples.is_odd(2)
~~~

### 出力

~~~
false
true
true
false
~~~

## Import
import で macro や function を import し, スコープ内で
モジュール名を省略して呼び出すことが出来ます。

Integer を対象に試してみます。
http://elixir-lang.org/docs/stable/elixir/Integer.html

### サンプルコード

~~~
defmodule ImportSamples do
  def only_is_even(x) do
    import Integer, only: [is_even: 1]
    IO.puts is_even(x)
  end

  def is_even_and_odd(x) do
    import Integer, only: [is_even: 1, is_odd: 1]
    IO.puts is_even(x)
    IO.puts is_odd(x)
  end

  def is_even_and_odd_import_macros(x) do
    import Integer, only: :macros
    IO.puts is_even(x)
    IO.puts is_odd(x)
  end
end

ImportSamples.only_is_even(1)
ImportSamples.only_is_even(2)
ImportSamples.is_even_and_odd(1)
ImportSamples.is_even_and_odd(2)
ImportSamples.is_even_and_odd_import_macros(1)
ImportSamples.is_even_and_odd_import_macros(2)
~~~

### 出力

~~~
false
true
false
true
true
false
false
true
true
false
~~~

## 参照
* http://elixir-lang.org/docs/stable/elixir/Integer.html
* http://elixir-lang.org/getting_started/13.html
tmuxメモ

# 操作方法

ペインを縦に分割

```
<c-b> %
```

ペインを横に分割

```
<c-b> "
```

スクロール

```
<c-b> [
```

ペイン切り替え

```
<c-b> o
```

ペインの表示場所切り替え

```
<c-b> <c-o>
```

ペインのID表示

```
<c-b> p
```

# .tmux.conf

```
# マウス関連
set -g mode-mouse on                    # マウスで画面選択でコピーモード
set -g mouse-resize-pane on             # マウスでpaneリサイズ
set -g mouse-select-pane on             # マウスでpane選択
set -g mouse-select-window on           # マウスでウィンドウ選択
```
ビットコインを勉強するためのサイトや本 まとめ 

以下に移行しました<br><a href="http://block-chain.jp/tech/learning-bitcoin/" title="ビットコインを勉強するためのサイトや本 まとめ">ビットコインを勉強するためのサイトや本 まとめ</a>
PythonでChatWork APIとQiita APIを使ってみる

最近JetBrains製品って学生なら無料でとれるということに気づいた。で、Python触ってみたいな〜って思ってたから、PyCharmとってみました。まあコミュニティエディションもあるんですが。

で、チャットワークとQiitaのAPI使ってみたのでメモ程度に。

（作りはちょっと雑かも）

## ChatWork API

```py:chatwork.py
#coding: UTF-8
print "Content-Type: application/json"

import pycurl
import urllib

c = pycurl.Curl()
api_token = 'Your API Key'
me = 'https://api.chatwork.com/v1/me'
status = 'https://api.chatwork.com/v1/my/status'
tasks = 'https://api.chatwork.com/v1/my/tasks'
room_message = 'https://api.chatwork.com/v1/rooms/{room_id}/messages'

# ===== GET =====
print "GET"
print "============="

c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken:' + api_token])

print "----- 私 -----"
c.setopt(pycurl.URL, me)
c.perform()

print()
print "----- ステータス -----"
c.setopt(pycurl.URL, status)
c.perform()

print()
print "----- タスク -----"
c.setopt(pycurl.URL, 'https://api.chatwork.com/v1/my/tasks')
c.perform()

print()

# ===== POST =====

option = {'body': 'Python ChatWork API Test'}
c.setopt(pycurl.URL, room_message)
c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken:' + api_token])
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, urllib.urlencode(option))
c.perform()

# アップデートは特に使う予定ないから書かない。

```

## Qiita API

```py:qiita.py
#coding: UTF-8
import pycurl
import urllib
import urllib2
import cookielib
import json

def get_user(username):
    """
    指定したユーザ情報を取得する
    :param username:
    :return:
    """
    url = "https://qiita.com/api/v1/users/" + username
    c = pycurl.Curl()
    c.setopt(pycurl.URL, url)
    c.perform()

def get_my_stock(token):
    """
    自分のストック投稿を取得する
    :return:
    """
    url = "https://qiita.com/api/v1/stocks" + "?token=" + token
    c = pycurl.Curl()
    c.setopt(pycurl.URL, url)
    c.perform()

# http is urllib2.HTTPHandler(debuglevel=1)
opener = urllib2.build_opener(urllib2.HTTPSHandler(debuglevel=1),
                          urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
urllib2.install_opener(opener)

# 認証
login_post = {'url_name': 'Your User Name', 'password': 'Your Password'}
params = urllib.urlencode(login_post)
request = urllib2.Request('https://qiita.com/api/v1/auth', params)
request_read = urllib2.urlopen(request)
token = json.loads(request_read.read())
token = token['token']

# 自分のストック投稿を取得する
print get_my_stock(token)

# 自分の情報を取得する
print get_user('UserName')
```

Pythonのフレームワークって何がいいんだろう。。。
Pyramidはちょっと触ってみたけど。
SIerのTwitter事情

# 前置き
SIer は大抵Excelを開いて画面とにらめっこをしていると

周囲にきちんと仕事しているように評価される。

つまりExcelさえ開いていればなんでもいいのだ。

そう、それがTwitterでもね。

だからSIerのSEは、自分の好きな言語を駆使してExcelでTwitterをやっているようだ。

# 使用するもの
- apache poi
- twitter4j

# 説明
さて、それっぽくするためにはファイル名は「外部インターフェース設計書」とでもしておこう。

SIerでよくあるバージョン管理っぽく後ろになんか日付っぽいものでもつけておくと、なおGood！

今回はめんどくさいから単純に `System/currentTimeMillis`で済ませてしまおう。

# ソースコード
```clj:project.clj
(defproject sier-twitter-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.twitter4j/twitter4j-core "3.0.5"]
                 [org.apache.poi/poi "3.10.1"]
                 [org.apache.poi/poi-ooxml "3.10.1"]]
  :main sier-twitter-clj.core)
```

```clj:core.clj
(ns sier-twitter-clj.core
  (:import [org.apache.poi.xssf.usermodel XSSFWorkbook]
           [java.io FileOutputStream]
           
           [twitter4j TwitterFactory Query TwitterException])
  (:require [clojure.java.io :as io]))

(def wb (XSSFWorkbook.))
(def twitter (. (TwitterFactory.) getInstance))

(defn save [content]
  (with-open [w (io/output-stream (str "外部インターフェース設計書_" (System/currentTimeMillis) ".xls"))]
    (.write content w)))

;; get twitter time line
;; return map
(defn get-timeline []
  (def x (.getHomeTimeline twitter))
  (map #(zipmap [:screenName :name :text] [(.. % getUser getScreenName)
                                           (.. % getUser getName)
                                           (.getText %)
                                           ]) x))

(defn -main []
  (def timeline (get-timeline))
  (def tweets-size (count timeline))
  (def sheet (.createSheet wb))
  (dotimes [i tweets-size]
    (def tweet (first (drop (- tweets-size (inc i)) timeline)))
    (def row (.createRow sheet i))
    (let [cell (. row createCell 0)]
      (.setCellValue cell (str (:name tweet) "@" (:screenName tweet))))
    (let [cell (. row createCell 1)]
      (.setCellValue cell (:text tweet))))
  (save wb))
```

# github
https://github.com/FScoward/sier-twitter-clj

# 終わりに
これではまだまだツイッターを楽しめない。

さらに進化させなければ。

…つづく？

※この物語はすべてフィクションです。
RHGをKindleで読めるようにした。


「[Ruby Hacking Guide を Kindle で読めるようにする](http://goo.gl/Wt8kEf) 」をやってみました。　

## homebrewで`kindlegen`のインストール

まず、brewの`search`で`kindlegen`を探してみた。

```:bash
$ brew search kindle
homebrew/binary/kindlegen
```

homebrew/binary に kindlegen あるそうです。tapして追加します。

```:bash
$ brew tap homebrew/binary
```

で、インストール

```:bash
$ brew install kindlegen
$ kindlegen

****************************************************
 Amazon kindlegen(MAC OSX) V2.9 build 0730-890adc2 
 A command line e-book compiler 
 Copyright Amazon.com and its Affiliates 2013 
****************************************************
```

（`-version`とか`-help`とかオプションは無いみたいです。）

## 材料を用意

###材料1
 [『Rubyソースコード完全解説』サポートページ](http://i.loveruby.net/ja/rhg/)よりHTML版をダウンロードしてくる。

###材料 2
エンコードを変換してくれるスクリプトファイル[「rhg-mobi.rb」](https://gist.github.com/makimoto/7064473)をもらってくる。（ありがたく使わせていただきます！）

## 変換処理

「[Ruby Hacking Guide を Kindle で読めるようにする](http://goo.gl/Wt8kEf) 」に書かれている通り、変換処理を行う。


```ruby:bash
$ ruby rhg-mobi.rb > all.html
$ kindleGen all.html -c2 -verbose -locale ja -o rhg.mobi
```


## Kindleにつっこむ

iTunes経由で、Appのファイル共有機能をつかって、Kindleアプリに作成したmobiファイルをつっこんでiPhoneと同期

## 完成

iPhoneのKindleアプリからこんな感じで読めます。

![October_05__2014_at_0444PM.png](https://qiita-image-store.s3.amazonaws.com/0/31659/03c15305-b1cd-0d08-3271-6274ff96695b.png "October_05__2014_at_0444PM.png")


## 参考
参考になりました。ありがとうございます。

- [Ruby Hacking Guide を Kindle で読めるようにする](http://goo.gl/Wt8kEf) 
- [『Upgrading to Rails 4』をKindleとiBookで読めるようにした] (http://masutaka.net/chalow/cat_kindle.html)
- [これは便利！Homebrewに追加されたtapコマンドはリポジトリを追加して簡単にフォーミュラを増やせる](http://tukaikta.blog135.fc2.com/blog-entry-204.html)
多次元配列を等価な一次元配列（ベクトル）にするには vec関数を使うとよい

当たり前でしょとか言わずに…　多次元配列をベクトルにしたい場合、例えば `x[:]` のように書くこともできるのですが、 `vec(x)` とした方が効率が良いという話です。

```jl
x = rand(100000,100)

# コピーを作らないので速い
y = vec(x)

# コピーを作ってしまうので遅い
y = x[:]
```
注意として、

```jl
y = vec(x)
```

としたあとにyに変更を加えると、元のxにも反映されます。逆に、

```
y = x[:]
```

としたあとにyに変更を加えても、元のxには変更は反映されません

いじょう
shellshockのテストスクリプトがUnix的でないので改善してみた。

bashのshellshockの件で、脆弱性の有無をテストするスクリプトが出回っていましたが、これは非常にわかりにくいと思いました。

https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/

端的にいうとUnix的でないこと、ユーザビリティ的にわかりにくいことが問題だと思いました。

## オリジナルコードの問題点

```
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
```

出力
```
vulnerable
this is a test
```

* 出力の１行目と２行目の関係がよくわからない。
* 脆弱性がない場合にも出力が行われる。
* 出力結果を見たときに、「自分が今使っているbashが脆弱である」と一瞬ではわからない。
* これを見たユーザが、次に何をすればよいのか（もしくは、何か行動しなければいけないこと)が伝わらない。
* "this is a test"というメッセージが無意味かつ無駄である。

## よりよいテストコード

```
$ env x='() { :;}; echo this bash is vulnerable' bash -c :
```

出力
```
this bash is vulnerable
```


ポイント

* 脆弱性がある場合のみ出力が行われ、脆弱性がない場合は何も出力されない。(沈黙は金)
* メッセージが"this bash is vulnerable" なので意味が明快である。
* いま脆弱性があることと、bashが問題であることが伝わる。 

たった１行のコードだとしても、広く使われるサンプルを提供する場合は、より良いユーザビリティを心がけたいものですね。
Twitter4j で取得した情報をMapに落としこむ

# ポイント
[zipmap](http://rd.clojure-users.org/entry/view/62001) を使用してMapを生成

# ソースコード
```clj:xxx.clj
(ns sier-twitter-clj.core
  (:import [twitter4j TwitterFactory Query TwitterException])
  (:require [clojure.java.io :as io]))

(def twitter (. (TwitterFactory.) getInstance))

;; get twitter time line
;; return map
(defn get-timeline []
  (def x (.getHomeTimeline twitter))
  (map #(zipmap [:screenName :name :text] [(.. % getUser getScreenName)
                                           (.. % getUser getName)
                                           (.getText %)
                                           ]) x))

(defn -main []
  (def x (get-timeline))
  (println (class x))
  (println (first x))
  (println (second x)))
```

# 終わりに
もっと上手いやり方あるけど？
っていうのがあれば教えて下さい。
nodebrewでNode.jsのインストール

最新版と安定版のNode.jsをそれぞれ使いたくなったので、nodebrewで管理することにしました。

## nodebrewのインストール
[nodebrewのGitHubサイト](https://github.com/hokaccha/nodebrew)に記載がある通り、以下のようにコマンドを実行してインストールします。

```bash:nodebrewのインストール
$ curl -L git.io/nodebrew | perl - setup
```

```bash:実行例
$ curl -L git.io/nodebrew | perl - setup
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
100 20027  100 20027    0     0   5846      0  0:00:03  0:00:03 --:--:-- 77324
fetching nodebrew...
install nodebrew in $HOME/.nodebrew

========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```


## ~/.zshrcにPATHの追記(zsh使用の場合)
~/.nodebrew配下にインストールされるので、コマンド実行できるようにするため、インストール時に出力されている通り、PATHを追加します。
zshを使用している場合は~/.zshrcに、bashを使用している場合は~/.bashrcに追記してください。

```bash:.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
```bash:設定の読み込み
$ source ~/.zshrc
```

## Node.jsのインストール
最新版と安定版をそれぞれインストールします。
ここではlatestとstableで指定していますが、もちろんバージョン指定でのインストールもできます。

```bash:最新版インストール
$ nodebrew install-binary latest
```

```bash:安定版インストール
$ nodebrew install-binary stable
```

## 使用するバージョンの指定
使用するNode.jsのバージョンを指定します。
ここでは最新版を使用するように指定します。

```bash:使用するバージョンの指定
$ nodebrew use latest
use v0.11.14
```

```bash:バージョンの確認
$ node -v
v0.11.14
```
LinkStation LS420Dにs3cmdとawscliを入れてみた


[以前](http://qiita.com/ikeisuke/items/aafd96e69c2c5feb23d8)、動画のs3バックアップ用にディレクトリ分けをやったけど、Macで毎回s3cmdでアップロードするのめんどくさかったので、
まずはssh接続でいろいろできるLinkStationを買ってみた。

うれしいことにpython 2.7.2が入っていたので、s3cmd/awscliをインストール。

今回の作業はfabricのタスクとして、[linkstation_setup](https://github.com/ikeisuke/linkstation_setup)にアップロードしてあります。

## 下準備(rootでsshログインできるようにする)

[こちらのブログ](http://blog.livedoor.jp/hiroumauma/archives/1521258.html)を参考にさせてもらった。

* 入っていない場合はクライアントPCにjavaのインストール
* [ここ](http://downloads.buffalo.nas-central.org/TOOLS/ALL_LS_KB_ARM9/ACP_COMMANDER/)からacp_commander.jarをダウンロードして適当なディレクトリに保存
* 以下のコマンドを実行
 * [LinkStationのIPアドレス]は設定対象のLinkStationのIPアドレスに書き換える
 * [LinkStationのadminのパスワード]はLinkStationのWebアクセス時のadminのパスワードを設定する
 * [設定したいrootのパスワード]はsshでログインする際に利用するrootのパスワードを設定する

```bash:shell
% java -jar acp_commander.jar -t [LinkStationのIPアドレス] -ip [LinkStationのIPアドレス] -pw [LinkStationのadminのパスワード] -c "sed -i 's/UsePAM yes/UsePAM no/g' /etc/sshd_config"
% java -jar acp_commander.jar -t [LinkStationのIPアドレス] -ip [LinkStationのIPアドレス] -pw [LinkStationのadminのパスワード] -c "sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/sshd_config"
% java -jar acp_commander.jar -t [LinkStationのIPアドレス] -ip [LinkStationのIPアドレス] -pw [LinkStationのadminのパスワード] -c "(echo [設定したいrootのパスワード]; echo [設定したいrootのパスワード])| passwd"
% java -jar acp_commander.jar -t [LinkStationのIPアドレス] -ip [LinkStationのIPアドレス] -pw [LinkStationのadminのパスワード] -c "sed -i 's/SUPPORT_SFTP=0/SUPPORT_SFTP=1/g' /etc/nas_feature"
% java -jar acp_commander.jar -t [LinkStationのIPアドレス] -ip [LinkStationのIPアドレス] -pw [LinkStationのadminのパスワード] -c "/etc/init.d/sshd.sh restart"
```

## pipのインストール
本当は以下でいいみたいだけど、うまく行かないのでアーカイブ落として来てインストールした
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python


pypi.python.orgのルート証明書が古い所為かHTTPSのエラーが出たけど、今回だけなので無視してダウンロード

```bash:setuptools
% wget https://pypi.python.org/packages/source/s/setuptools/setuptools-6.0.2.tar.gz --no-check-certificate
% tar zxfv setuptools-6.0.2.tar.gz
% cd setuptools-6.0.2
% python setup.py install
```

```bash:pip
% wget https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz --no-check-certificate
% tar zxfv pip-1.5.6.tar.gz
% cd pip-1.5.6
% python setup.py install
```

## s3cmdのインストール
pipで入れると1.0.1になるのでアーカイブURL指定でインストール

```bash:s3cmd
% pip install python-dateutil
% pip install http://sourceforge.net/projects/s3tools/files/s3cmd/1.5.0-rc1/s3cmd-1.5.0-rc1.tar.gz/download
```

## awscliのインストール
```bash:awscli
% pip install awscli
```

## 今後必要な対応
cron登録
ビルド環境の構築
ffmpegインストール
[以前](http://qiita.com/ikeisuke/items/aafd96e69c2c5feb23d8)の処理のpython移植
人月の神話について調べてみたので備忘録

一緒に仕事しているエンジニアに、「管理やるなら最低これは読んどけっ」と毎月言われ続け、本も貸してもらっているけどまだ読めてない。。
難しそうな書籍のイメージが高いので一旦webでどんな事を言ってるのか理解しようとまとめてみた。まだ途中なので、随時アップデートできればと。
(注意)自分の脳では理解不足、誤解しているところあるかもしれないです。

# 人月の神話
## 概要
1975年に刊行された、ソフトウェアプロジェクト管理の書籍。
IBMでの経験が元に、ブルックスが考案した。
「遅れているソフトウェアプロジェクトへの追加要因は更に遅らせるだけ」と説いている。
「ソフトウェア工学のバイブル」と呼ばれている。
プロトタイピングを支持している。

## タールの沼
プロジェクトは底なし沼のように、一度入ってしまうと抜け出せない。
遅れているシステム開発もこのようなもので、もがけがもがくほど、遅れてしまう。

## 人月の神話
### 人月とは
ソフトフェア実装にかかる工数を人と時間の掛け算で表したもの。

```
5人が3ヶ月かかって作れるシステムの工数
5人 * 3ヶ月 = 15人月
```

「コストは実際に人月と月数の積に比例する。が、進捗はそうでない。したがって、仕事の大きさを測る単位としての人月は、疑うべき危険な神話なのだ。人月とは、人と月とが互いに交換できるという意味だからである」。

### ブルックスの法則
遅れているプロジェクトに人員を追加すると、さらに遅れてしまうという見解。
プロジェクト管理者は何度も繰り返しこのような過ちをおかしてしまう。

### 追加人員がなぜ遅れるのか？
* プログラマの学習コスト
* コミュニケーションのオーバーヘッド
* グループ内のコミュニケーション量の公式：n(n - 1) / 2
 * 例: 50人のプログラマ -> 50(50 - 1) / 2 = 1225のコミュニケーション経路

### どうするべきか？
* スケジュールを立て直す(たっぷり時間をとって、仕事が慎重に、完全にできるようにする)。
* 仕事を縮小する。遅延による二次コストは非常に高い。

## セカンドシステム症候群
ソフトウェア開発者が設計するセカンドシステムは、そのソフトウェア開発者がそれまで設計したもののうち最も危険なシステム。

時間などの制約によって実現不可だった機能をセカンドシステムで盛り込もうとする。
ファーストシステムでは現実的だった技術が時代遅れになってしまった事に気づかず、無駄に作ってしまう。
最終的には本筋が見えなくなってしまう。

## 参考
人月の神話 wikipedia
http://ja.wikipedia.org/wiki/%E4%BA%BA%E6%9C%88%E3%81%AE%E7%A5%9E%E8%A9%B1
セカンドシステム症候群 - Plan9日記
http://d.hatena.ne.jp/oraccha/20090422/1240407037
なーした日記: セカンドシステム症候群
http://suto3.mo-blog.jp/nashita/2006/03/second_system_s_ca7a.html
すべてはタスクの再利用性を高めるために - gulp.js


結果として三部作になってしまったので、全体像と位置づけをここにまとめてみます。

- [gulpfile スタイルガイド - v0.5.0](http://qiita.com/cognitom/items/045c8596a30aa5ab8a47)
- [gulpfiles](https://github.com/cognitom/gulpfiles) ([日本語訳](http://qiita.com/cognitom/items/dfbac22c02a7ffa957aa)) - ドットファイル的なやつ
- [gulp-straw](https://github.com/cognitom/gulp-straw) - コマンドラインツール

![logo.png](https://qiita-image-store.s3.amazonaws.com/0/1858/768ec507-16c1-15ac-213c-f11fa3f6a3b2.png "logo.png")

## 基本、自由に (再利用しないなら)

[スタイルガイド](http://qiita.com/cognitom/items/045c8596a30aa5ab8a47)なんて堅苦しいものをつくるつもりはさらさらなかったのですが、プロジェクト間で表記にブレがあると共通化しにくいのは面倒だなと思っていました。そして、「オレオレルール」を整理して行くうちにスタイルガイドっぽいものに。基本的には好き勝手書けば良いと思うので、参考程度にどうぞ。

## gulpfileを晒してみる

「オレオレDotfiles」や「オレオレGruntfile」を公開しているのを見てなんか楽しそうだなと思っていました。もとい、学習時に助けられました。解説も大事ですが、実例を見るのが一番分かりやすいですよね。参考になるかはともかく、「[gulpfiles](https://github.com/cognitom/gulpfiles)」としてgulpfileを晒してみます。

## ゴクゴク(gulp)飲むために、ストロー付けました

GitHubに置いたタスクファイルを、必要に応じてプロジェクトに導入するためのツールとして[gulp-straw](https://github.com/cognitom/gulp-straw)を作りました。(というか作り中...)

GitHubの公開/非公開のレポジトリに置いておけば、`straw`コマンドでこんなことができます。

```bash
$ straw install gulpfile
[OK] cognitom:gulpfile > gulpfile
installing required modules in taskfiles...
[OK] installation completed
$ ls
gulpfile.js node_modules    package.json
````

ポイントとしては...

- タスクのファイル名を指定してダウンロード (gulpfile, task/css, ...)
- タスクの依存モジュールを自動インストール

細かい話としては...

- `package.json`に記録するので、復元、更新が可能 (更新は実装途中)
- 依存モジュールも`package.json`に記録される
- ダウロンード先の相対パスは自由に設定可
- 他の人のリポジトリも指定できる

など。

## まとめ

gulpfileを整理しているうちに、気づいたら三部作になってしまいましたが、しばらくの方向性としてはこんなところかなと思います。

Gruntであれば、[yo](https://github.com/yeoman/yo)を使うのがスジですが、テンプレートを作るのが作業として重く、プロジェクト全体の定義にもなるため、動きが取りにくくなるのも「重い」...。身軽が信条なgulp.jsで、あまり[Yeoman](http://yeoman.io/)の話が出ないのも、このあたりにモチベーションが上がらないからかもしれません。

とはいえ、複数プロジェクトで使っていくと、再利用性は常に課題になります。そこで、身軽なままに、なんとか出来ないかと考えたのがこの三部作です。

- スタイルガイドにある程度沿えば、再利用できる
- 小さいタスクの単位でgulpfileをどんどんGitHubに (yoと逆の発想で)
- ストロー(gulp-straw)で、自分/他人の作ったタスクをつまみ食い(飲み?)

くらいの、ゆるい感じで、参考しにしていただければ幸いです。
【質問】objective-c UITableViewのページングについて


#import "TableViewController.h"

@interface TableViewController () {
    
    NSDictionary *item;
    NSString *blgtitle;
    NSString *link;
    
}

@end

@implementation TableViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    
    // 空の配列を用意
    self.items = [NSArray array];
    
    [self getJSON];
    
}

- (void)getJSON
{
    
    NSURL *url = [NSURL URLWithString:@"http://domaim/wp-json/posts"];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        
        NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        
        // アプリデータの配列をプロパティに保持
        //NSArray * values = [jsonDictionary allValues];
        self.items = jsonDictionary;
        // TableView をリロード
        [self.tableView reloadData];
    }];
}

// セルの数を設定
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.items count];
}

// テーブルセルの内容を設定
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    
    item = [self.items objectAtIndex:indexPath.row];
    
    cell.textLabel.text = [item objectForKey:@"title"];
    
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath*) indexPath{
    item = [self.items objectAtIndex:indexPath.row];
    blgtitle = [item objectForKey:@"title"];
    link = [item objectForKey:@"link"];
    // toViewController
    [self performSegueWithIdentifier:@"toViewController" sender:self];
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    // identifier が toViewController であることの確認
    if ([[segue identifier] isEqualToString:@"toViewController"]) {
        ViewController *vc = (ViewController*)[segue destinationViewController];
        // 移行先の ViewController に画像名を渡す
        vc.blgtitle = blgtitle;
        vc.link = link;
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //一番下までスクロールしたかどうか
    if(self.tableView.contentOffset.y >= (self.tableView.contentSize.height - self.tableView.bounds.size.height))
    {
        //ここで次に表示する件数を取得して表示更新の処理を書けばOK
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
sharedPreferenceにArraylistのデータを保存する

AndroidのsharedPreferenceに保存できるのはint,long,String,boolean,setなどがあります。
が、場合によっては色々な型のArraylistを保存したい場合もあると思います。その方法について書きました。

##やりかた
JSONArrayに保存し、シリアライズ化します。

###データの保存

```java

JSONArray array = new JSONArray();
for (int i = 0, length = list.size(); i < length; i++) {
    try {
        array.put(i, list.get(i));
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

Editor editor = getApplicationContext().getSharedPreferences("shared_preference", Context.MODE_PRIVATE).edit();

editor.putString("list", array.toString());  //key名を"list"としてシリアライズ化したデータを保存
editor.commit();
```

####データの取り出し
他の値が保存されている場合も考慮して、一旦Bundleにプリファレンスのデータを移すのがミソです。

```java

String list;
Bundle bundle = new Bundle();  //保存用のバンドル
Map<String, ?> prefKV = getApplicationContext().getSharedPreferences("shared_preference", Context.MODE_PRIVATE).getAll();
Set<String> keys = prefKV.keySet();
    for(String key : keys){
        Object value = prefKV.get(key);
        if(value instanceof String){
              bundle.putString(key, (String) value);  
        }else if(value instanceof Integer){
        // …略
        }
    }

String stringList = bundle.getString("list");  //key名が"list"のものを取り出す
ArrayList<String> list = new ArrayList<String>();
    try {
        JSONArray array = new JSONArray(stringList);
        for(int i = 0, length = array.length(); i < length; i++){
            list.add(array.optString(i));
        }
    } catch (JSONException e1) {
        e1.printStackTrace();
    }

//あとはlistを良きに利用する
```
mscgen_jsでブラウザからお手軽にシーケンス図を作成する

こんないいものがこの世にあったとは、、

イベントドリブンなJSや組み込み開発などだと、処理が複雑化することがあるので、複数人での開発などは意思疎通が大変です。

そこでシーケンス図を作成しようと思っていたらものすごくいいものを発見しました。

おすすめです。

## ソース

https://github.com/sverweij/mscgen_js

## デモ用Webページ

http://sverweij.github.io/mscgen_js/

## 実際の操作

![mscgen_js](http://gifzo.net/BGC2QwoNeVz.gif)

日本語も使えるし、かなりリアルタイムにシーケンス図を作成してくれていることがわかります。

問題は作成したソースを保存とかできないことですかね。やりたい場合はコピってgit管理ですかねー。
GoogleAppsScriptで日本の祝日を取得する

ざっくりいうと、日本の祝日のカレンダーを取得してきて。今から10分後までにイベントがあるかを調べる感じです。

ちなみにholidaysはCalendarEvent型の配列、CalendarEventが持ってるメソッドとかは以下参照
https://developers.google.com/apps-script/reference/calendar/calendar-event?hl=ja

```js
// 2つ目の引数のmonthは0始まりなので4は5月
function main() {
  Logger.log(isJapaneseHoliday(new Date(2020, 4, 1, 12, 0, 0)));
  Logger.log(isJapaneseHoliday(new Date(2020, 4, 2, 12, 0, 0)));
  Logger.log(isJapaneseHoliday(new Date(2020, 4, 3, 12, 0, 0)));
  Logger.log(isJapaneseHoliday(new Date(2020, 4, 4, 12, 0, 0)));
  Logger.log(isJapaneseHoliday(new Date(2020, 4, 5, 12, 0, 0)));
  Logger.log(isJapaneseHoliday(new Date(2020, 4, 6, 12, 0, 0)));
}

/*
 * 今日が日本の祝日かどうか判定
 */
function isJapaneseHoliday(date) {
  // 今から10分後までで検索 (もっと短くてもいいかも)
  var startDate = new Date(date.getTime());
  var endDate = new Date(date.getTime() + (10*60*1000));

  var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays =  cal.getEvents(startDate, endDate);

  return holidays.length != 0;
}
```

mainを実行した結果ログ。
ちゃんと2020/05/01と2020/05/02だけfalseになっている。

```
[20-05-02 19:32:40:332 JST] false
[20-05-02 19:32:40:407 JST] false
[20-05-02 19:32:40:480 JST] true
[20-05-02 19:32:40:544 JST] true
[20-05-02 19:32:40:583 JST] true
[20-05-02 19:32:40:646 JST] true
```
awesomeでキー入力を高速化する

Ubuntuのキーボード設定で設定とawesomeのキーボード設定は別？らしく、Ubuntuのキーボード設定（キーリピートの速度など）を変えてもawesomeに反映されなかった。

awesomeで変更する方法があったのでメモする。

#環境
* awesome v3.4.15
* Windows7：ホスト
* Ubuntu14.04：ゲスト
* VirtualBox

#設定方法
このページを参考にした。
[Change repeat rate in awesome WM - A window](http://intosimple.blogspot.in/2013/06/change-repeat-rate-in-awesome-wm.html)

awesomeの設定ファイルrc.luaの末尾に以下のコードを追加する。

    os.execute("xset r rate 200 50")

"200"が連続入力開始までの遅延時間、"50"がリピート速度である。
RubyMotion for Android (beta) で HelloWorld

[rebuild.fm](http://rebuild.fm/) で取り上げていたのでちょっとやってみました。

* https://github.com/gfx/Android-Hello-RubyMotion

## コード

コードはこんな感じ。まんまAndroid frameworkをRubyから呼んでいるだけですね。

```rb
class MainActivity < Android::App::Activity
  def onCreate(savedInstanceState)
    super

    # R.layout.hello
    layoutId = resources.getIdentifier('hello', 'layout', packageName)
    self.contentView = layoutId

    # R.id.text
    viewId = resources.getIdentifier('text', 'id', packageName)
    textView = findViewById(viewId)
    textView.text = "Hello, RubyMotion!"
  end
end
```

## 環境構築

セットアップについて [Getting Started](http://www.rubymotion.com/developer-center/guides/getting-started/#_android) にはADTが必要とありますが、android-sdkとandroid-ndkだけで十分です。通常のAndroid開発とおなじようにandroid sdk managerで適当にSDKやビルドツールをインストールしておきましょう。Homebrewでいれてあればこんな感じ。

```sh
BREW_PREFIX=`brew --prefix`

export ANDROID_SDK="$BREW_PREFIX/opt/android-sdk"
export ANDROID_NDK="$BREW_PREFIX/opt/android-ndk"
export ANDROID_HOME="$ANDROID_SDK"

export RUBYMOTION_ANDROID_SDK="$ANDROID_SDK" # for RubyMotion
export RUBYMOTION_ANDROID_NDK="$ANDROID_NDK" # for RubyMotion
```

あとは `motion device` でアプリを起動してREPL待機になります。Nexus 4 / Android 4.4 / ART な環境で一応うごきました。

## 疑問

まだよくわかってません。

* AndroidManifestはどうやって書くのか？
* resource idへのアクセスが煩雑すぎる。しかし `R::id.text` などは無理
* ライブラリはどうやって使うのか？Android用ライブラリは使えるのか？

## まとめ

まだβ版ということを差し引いたとしても、IDEがないとアプリを書くのは正直つらいです。これからIDEを作っていくんでしょうね。RubyMine / IntelliJ IDEAにうまく乗ればかなり快適になる可能性はあります。

何をすれば面白いかなあ。実行可能ファイルがプラガブルならあとから一部機能をダウンロードしたりできればちょっと面白いかもしれないですが、それができるかどうか。

ちょっと遊ぶ分にはわりと面白いんですが、インストールするためにまず $199 払わないといけないのでハードル高いんですよね。
Nginx バーチャルホスト とか proxy などの設定まとめ

# 最近、お勉強がさぼり気味…。ブックマークしているNginxのまとめを作っておく。きっとそのうち…

## バーチャルホストの設定
> [nginxによる簡単なバーチャルホストの設定方法。](http://d.hatena.ne.jp/hogesky/20120416/1334588838)
> [サーバー名](http://nginx.org/ja/docs/http/server_names.html)
> [nginx基本設定](http://www.castleman-blog.com/entry/2013/03/04/173129)
> [nginxでデフォルトのバーチャルホストを設定する方法](http://webkaru.net/linux/nginx-default-server/)
> [nginx のバーチャルホストでキャッシュを取ることができない場合は header を確認してみる](http://weble.org/2012/05/19/nginx-virtualhost-cache)

## proxy
> [nginx+squidで画像キャッシュサーバーの作り方](http://d.hatena.ne.jp/hideden/20091101/1257061316)
> [ぼくんちのWordPress用のNginxの設定 〜 まるっとのせておいた](http://devslog.com/article/20120318094940.html)
> [nginxでproxy_cache_pathに指定するkey_zoneのサイズはどのくらいにすれば良いのか](http://qiita.com/harukasan/items/80061c7429a39c0b2dab)
> [Nginx をリバースプロキシ(キャッシュ) として使ってみた](http://server-setting.info/centos/apache-nginx-10-proxy.html)

## その他
> [nginxのupstreamのserverの記述が効かない](http://tboffice.hatenablog.jp/entry/2014/05/17/012505)
> [nginx で接続状態を確認する(stub_status を使ってみる)](http://server-setting.info/centos/nginx-stub_status-setting.html)
> [簡単！リアルタイム画像変換をNginxだけで行う方法](http://cloudrop.jp/labs/nginx_image_filter)
xcode デバッグ時に変数の値を変更する、とメソッドの実行

デバッグ時に変数の値を変更する方法です。

## intなどの非オブジェクトの値を変更する

```objc
-(void)func {
  int tag = 1;  
  if( tag == 0 ) {          // ここでブレークポイント
  ...
}
```

```objc
(lldb) p tag = 0
```

## オブジェクトの値を変更する

```objc
-(void)func {
  NSString* str = @"original message"
  [self.label setText:str]; // ここにブレークポイント
}
```

```objc
(lldb) po str = @"debug message"
(lldb) po str = @"デバッグ" // Unicodeは、直接代入できないっぽい。恐らくエスケープシーケンスが必要.
```

## メソッドを呼び出す

```objc
-(void)func {
  NSString* str = @"original message"
  [self.label setText:str]; // ここにブレークポイント
}
```

```objc
(lldb) po [self.label setFrame:CGRectMake(0, 0, 100, 200)]
```
Redis Install


## Download 
http://redis.io/download

```
cd /usr/local/src
wget http://redis.googlecode.com/files/redis-2.6.9.tar.gz
tar zxvf redis-2.6.9.tar.gz
cd redis-2.6.9
make test
make
make install
```

make testで下記エラーが出たら

```
You need 'tclsh8.5' in order to run the Redis test
```

```
yum install -y tcl
```

## Config
```
mkdir /etc/redis
cp redis.conf /etc/redis/redis_6379.conf
vi /etc/redis/redis_6379.conf

#デーモンとして起動する。
#daemonize no
daemonize yes

#使用するメモリサイズ
#maxmemory
maxmemory  10240000

#working dir変更
#dir ./
dir /etc/redis/

# 起動スクリプトと同じ ファイル名に変更
# pidfile /var/run/redis.pid
pidfile /var/run/redis_6379.pid
```

## Deamon
```
cp utils/redis_init_script /etc/init.d/redis

vi /etc/init.d/redis

# 追加
# chkconfig:   - 85 15
# description:  redis-server
# processname: redis
```

```
chkconfig --add redis
chkconfig redis on
```

参考:
http://www.seeds-std.co.jp/seedsblog/792.html
http://redis.io/topics/quickstart
Windows IE メモ

# Windows のバージョンと対応IE一覧 #
| Windows        | IE6 | IE7 | IE8 | IE9 | IE10 | IE11 |
|:---------------|:---:|:---:|:---:|:----|:----:|:----:|
| XP             | ◎  | ○   | ○   | ×   | ×    | ×    |
| Server 2003    | ◎  | ○   | ○   | ×   | ×    | ×    |
| Vista          | ×   | ◎  | ○   | ○   | ×    | ×    |
| Server 2008    | ×   | ◎  | ○   | ○   | ×    | ×    |
| 7              | ×   | ×   | ◎  | ○   | ○    | ○    |
| Server 2008 R2 | ×   | ×   | ◎  | ○   | ○    | ○    |
| 8              | ×   | ×   | ×   | ×   | ◎   | ×    |
| Server 2012    | ×   | ×   | ×   | ×   | ◎   | ×    |
| 8.1            | ×   | ×   | ×   | ×   | ×    | ◎   |
| Server 2012 R2 | ×   | ×   | ×   | ×   | ×    | ◎   |


# 対応すべき OS と IE 古いの範囲 #
| Windows        | 標準 |  | バージョンアップ限界 |
|:---------------|:----:|:-:|:----:|
| Server 2003    | IE6  | ~ | IE8  |
| Vista          | IE7  | ~ | IE9  |
| Server 2008    | IE7  | ~ | IE9  |
| 7              | IE8  | ~ | IE11 |
| Server 2008 R2 | IE8  | ~ | IE11 |
| 8              | IE10 | ~ | IE11 |
| Server 2012    | IE10 | ~ | IE11 |
| 8.1            | IE11 | ~ | IE11 |
| Server 2012 R2 | IE11 | ~ | IE11 |