OmniAICreator/Qiita-1.07M huggingface dataset:
(deprecated) トップゲート社 開発環境構築


2017年度向けに改訂済
2019/10/17 筆者のvvakameが転職などしたので現在このドキュメントはメンテされていません。

Mac以外の環境は悩みながら頑張って似たような環境作ってください。
特に断りのない場合は最新の安定版を入れること。

## Homebrew

[適当に入れる](http://brew.sh/)
わかめがHomebrewで入れるものを[まとめた](https://github.com/vvakame/dotfiles/blob/master/brew.sh)。
MacTeXとか一般ではいらないものも入ってるので注意。まぁTG社社員ならいれといてもいいかも。

## 共通

### 各種サービスにアカウント作ってJOINする

GitHub, Slack が見られるようになるまで。
xxxx さんあたりに言う。

SlackとGitHubのアカウント名はできれば統一し、社内で呼ばれるであろう名前に近いアカウント名にしたほうが後でみんなが困らずに慈愛が得られます。
ハンドルがある場合ハンドルで呼ばれると思うのでそれでいいんじゃないでしょうか。
Slackはブラウザで開くのではなくて、Slackアプリを導入したほうが便利です。

あとは[Gravatar](https://ja.gravatar.com/)設定しておいたほうがよいでしょう。

### コマンドラインツール

[Xcode](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12)を入れる。
XcodeのCommand Line Toolsも入れる(入れなくてもいいという噂もある)。

`brew install git zsh curl wget tree ag jq peco gcc llvm go` ぐらいはやっといたほうがいいと思う。

自分のお気に入りシェル環境が特に無いマンは[他人のdotfiles](https://github.com/vvakame/dotfiles)を漁ったりして良さそうな環境を作ってみましょう。

### GUIツール

[SourceTree](http://www.sourcetreeapp.com/)とかそのへん入れる。
[Alfred](http://www.alfredapp.com/), [Atom](https://atom.io/), [Visual Studio Code](http://code.visualstudio.com/), [Google Chrome](http://www.google.co.jp/intl/ja/chrome/browser/) あたりはあってもいいと思う。

## GAE系開発者

### IntelliJ IDEA or Gogland

* https://www.jetbrains.com/idea/
* https://www.jetbrains.com/go/

どっちか入れる。
業務で使う前にライセンスを要求しましょう。

### Node.js

[nodebrew](https://github.com/hokaccha/nodebrew)入れる
`nodebrew ls-remote`して最新の安定版を入れる。
安定版は偶数系なので、今だとv6.x系の最新。
`nodebrew install-binary v6`とか。
パス通すのはnodebrew入れた時になんかメッセージでた気がするのでそれに従う。

#### Node.js周辺環境

無くてもいいけど有ったほうがいいものは`npm install -g typescript typescript-formatter yarn @angular/cli` あたり

## プロジェクトのビルド

./setup.sh 叩くとnpmとか必要なものを適当に入れてくれるようにプロジェクト作る。
まぁ適当にREADMEに従う。

## Android系開発者


### Android Studio

[入れる](http://developer.android.com/sdk/installing/studio.html)。
SDK Managerで適当に必要なもの入れとく。

## 豆知識

SourceTreeとかGoglandとかVSCodeとかはコマンドラインから呼び出せるようにできるので、やっとくといいです。`stree`とか`code .`コマンドでさくーっと現在の作業ディレクトリで立ち上がるので便利。

Windowsマンは環境変数SHELLOPTSにigncrを入れたり、`git config --global core.autocrlf true`しておくと、マカーからdisられにくくなるのでマジおすすめ。

## 参考資料・書籍

まだまだ編集リクエスト待ってます。

[node.jsのversionを管理するためにnodebrewを利用する
](http://qiita.com/sinmetal/items/154e81823f386279b33c)

[npmでnode.jsのpackageを管理する
](http://qiita.com/sinmetal/items/395edf1d195382cfd8bc)
Nginxで複数条件のIF文を書く方法がすごいｗ

NginxでIf文を `if ($host = 'www.example.com' && $request_uri ~ "/admin")`　という風には書けない。
入れ子にもできません。(ディレクティブなので？）

そこで逃げ道は　`文字列結合で判定`。

```
    if ($request_uri = /) { 
      set $test  A; 
    } 
  
    if ($host ~* teambox.com) { 
      set $test  "${test}B"; 
    } 
  
    if ($http_cookie !~* "auth_token") { 
      set $test  "${test}C"; 
    } 
    
    if ($test = ABC) { 
      proxy_pass http://teambox-cms.heroku.com; 
      break; 
    } 
```

参考（というかそのものですが）
https://gist.github.com/jrom/1760790

ちなみに`ifisevil`と公式ドキュメントにあります。`使わないほうが良さそう。`
http://wiki.nginx.org/IfIsEvil
gitの用語とコマンドまとめ

# git用語

## origin
* リモートレポジトリの場所(URL)の別名

## HEAD
* 今いるブランチの最新のコミットへのポインタ

## インデックス(ステージング)
* Subversionには存在しない領域で、ワーキングツリーとリポジトリ間にある一時領域
* ステージングエリアとも呼ぶ

## ステージ
* 作業ツリーの変更をインデックスに登録(`$ git add`)すること

## ブランチ
1. ローカルブランチ
    * ローカルリポジトリで管理されるブランチ
1. リモートトラッキングブランチ（追跡ブランチ）
    * リモートブランチの情報を持っているローカルリポジトリの中の特殊なブランチ
    * リモートブランチを、ローカルリポジトリでトラッキングするためのブランチ
    * リモートブランチを参照するため"だけ"に利用する
    * このブランチは変更できない
    * 「origin/master」というのは、originという名前のリモートリポジトリにあるmasterブランチをトラッキングしていることを意味する
1. リモートブランチ
    * リモートリポジトリにあるブランチ

## トピックブランチ
* 何か特定の機能に関する作業を行うための場所としてのブランチ  

    >    トピックブランチを使った作業の流れは、  
        1. ブランチを作成する
        2. ブランチで作業する
        3. マージする
        4. ブランチを削除する
    となる  



************************************************************
# gitコマンド

## `git add`
* 新しいファイルや修正したファイルをインデックスに追加する
* コンテンツをステージする (次回のコミットに含めるようgitに指示する)

## `git push`
* リモートリポジトリに自分のリポジトリの内容を送信する
* `git push <repository> <refspec>`  

    > \<refspec>を省略すると、デフォルトではリモートリポジトリとローカルリポジトリの双方に存在するブランチが対象となる  

* `git push <リモート送信先リポジトリ> <ローカル送信元ブランチ>:<リモート送信先ブランチ>`

    >例）topic-branch ブランチの内容を origin サーバーにプッシュしたい場合  
`$ git push origin topic-branch`

## `git branch`
* `git branch [topic-branch]`
> 現在のブランチを元に新しいブランチが作られる

* `git branch [topic-branch] develop`
> ローカルのdevelopを起点に新しいブランチが作られる

* `git branch [topic-branch] origin/develop`
> リモートのorigin/developを起点に新しいブランチが作られる
   ※自動でorigin/develp追跡ブランチの設定も行われる

* `git branch -vv`
> 追跡しているブランチ名を表示する方法
追跡ブランチの設定を行うと、
引数なしで git push を実行するだけでフィーチャーのプッシュを行うことができる

## `git checkout`
* 操作対象とするブランチの切り替え（移動）
* リポジトリに存在するブランチをワーキングツリーに展開する
* ステージエリアも切り替わる
* -bオプションを付けた場合、新たにブランチを作成し、そのブランチに切り替える。ということになる。  

    > 例)ローカルブランチ名を指定してリモートブランチをチェックアウトする  
`$ git checkout -b [other_branch] [origin/other_branch]`

## `git fetch`
* ローカルのリモート追跡ブランチをリモートのブランチと同期させること
* リモートリポジトリにあるブランチの最新情報をローカルリポジトリに取得すること
* pullのようにファイルが更新されるわけではなく、ローカルリポジトリが更新されるだけ

    > 例)ローカルリポジトリをリモートリポジトリと同期する  
`$ git fetch origin`

## `git merge`
* 現在の作業ブランチに別のブランチで行われた変更点を取り込む

    > 例）リモートブランチと同期したデータ、追跡ブランチをローカルリポジトリに取り込む
`$ git merge origin/other_branch`

## `git rebase`
* ブランチの派生元(上流)を変更する  
* `git rebase ＜派生元ブランチ＞`
カレントブランチの履歴が派生元ブランチの後ろに付け替えられ、履歴が一本化される  

    > コンフリクトした場合、解消後に以下コマンド
`$ git rebase --continue`

## `git pull`
* git fetchでローカルの追跡ブランチにリモートブランチのデータを反映し、トピックブランチにmergeする
Windows版Sublime Text3のVintage Modeでnormal modeに戻ったらIMEを無効にする

##ソース

```py3
import sublime, sublime_plugin
import ctypes
    
class DisabledImeCommand(sublime_plugin.EventListener):
    def on_text_command(self, view, command_name, args):
        name = command_name.lower()
        # _enter_normal_modeはesc、exit_insert_modeはCtrl + [
        # Ctrl + [ も処理したいけど何だか挙動がおかしいのでやらない
        # if (name == '_enter_normal_mode' or name == 'exit_insert_mode'):
        if (name == '_enter_normal_mode'):
            # 29は無変換、IMEの設定にもとづき適宜置き換える
            ctypes.windll.user32.keybd_event(29, 0, 0, 0)
```

##使い方


`%USERPROFILE%\AppData\Roaming\Sublime Text 3\Packages\User`配下に適当な名前をつけて保存。


##参考
- [SublimeText2 - Windows版Sublime Text 2のvintageモード、Escでコマンドモードに戻った時にIMEを切る - Qiita](http://qiita.com/K2Da/items/214b9a7d40a24fcd9bd4)
- [API Reference - Sublime Text 3 Documentation](http://www.sublimetext.com/docs/3/api_reference.html#sublime_plugin.EventListener)
PhoneGap(iOS)でカスタムURLスキームを実装する


## (App)-Info.plistでURL Typesを追加

InfoタブのURL Typesを、準備するURLスキームの分だけ追加する。

* Identifier：アプリのBundle Identifier　例：com.bar.foo.HelloWorld
* URL Schemes：用意するURLスキーム　例：SayHello
* Iconはセットしなくても良い
* RoleはEditor、Viewer、Noneから選べる。（iOSの方でも特に使っていないらしいので、とりあえずEditorにしておけば無難？）

この例では、「SayHello://」のようなURLスキームが出来たことになる。

## PhoneGap (Cordova)

PhoneGapでは、特にカスタムURLスキームの設定は必要ない。
最初から、AppDelegate.mに下記のような実装が行われている。

```objectivec:AppDelegate.m
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
{
    if (!url) {
        return NO;
    }

    // calls into javascript global function 'handleOpenURL'
    NSString* jsString = [NSString stringWithFormat:@"handleOpenURL(\"%@\");", url];
    NSLog(@"catch custome url scheme: %@", jsString);
    [self.viewController.webView stringByEvaluatingJavaScriptFromString:jsString];

    // all plugins will get the notification, and their handlers will be called
    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]];

    return YES;
}
```

つまり、呼び出されたURLをそのまま、handleOpenURLというJavaScriptのグローバル関数に渡すので、それをJavaScript側で実装すれば良い。

例えば、こんな感じ。（CoffeeScriptだけど）

```coffeescript:custom.coffee
window.handleOpenURL = (param) ->
	window.debug "handleOpenURL #{param}"
	[scheme, param] = param.toLowerCase().split("://")

	if scheme == "sayhello"
		alert "Hello, #{param}!"
```

アプリに複数のカスタムURLスキームを定義した場合でも、すべてのカスタムURLスキーム経由のアプリ起動がhandleOpenURLに来るので、ここでURLスキームを見て処理を振り分けてやると良さそう。

ちなみに、この例ではhandleOpenURLを、window.handleOpenURLにしているので、AppDelegate.mも下記のようにしておく。

```objectivec:AppDelegate.m
    NSString* jsString = [NSString stringWithFormat:@"window.handleOpenURL(\"%@\");", url];
```

あとは、Safariのアドレスバーに「SayHello://Ken」と入力して開くと、アプリが開き「Hello, Ken!」というアラートが表示されるだろう。
sensu からメールhandler 

### 背景

* sensu は基本 json で値を返す。
* そのままメールコマンド実行すると結構ウケる内容で来る。
* 内容を見やすくして送信したいよね。
* ってなわけで自作

### Code
```json:/etc/sensu/conf.d/handler_email.json
{
        "handlers": {
        "email": {
                "type": "pipe",
                "command": "/etc/sensu/plugins/mail_send_sensu.rb"
                }
        }
}
```

でコマンド指定する。

```rb:/etc/sensu/plugins/mail_send_sensu.rb
#! /usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'json'
require 'nkf'
require 'mail'

from_addr = "alert@"+`hostname`.chomp
to_addr = %w{mail@address}

while line = STDIN.gets
        json_data = JSON.parse(line)

        client_data = json_data["client"]
        check_data = json_data["check"]

        status = check_data["output"].split(" ")

        case status[1]
        when "OK:"
                status_flg = "Recovery"
        when "CRITICAL:"
                status_flg = "Critical"
        when "WARNING:"
                status_flg = "Warning"
        else
                status_flg = "Unknown"
        end

        send_subject = "ALERT ON #{status_flg}"
        mail_body = "##### Notifficate #{status_flg} ####\n"

        client_data.merge(check_data).each do |issue,data|
                mail_body << "#{issue}".ljust(20)+": #{data}".ljust(100)+"\n"
        end

        mail = Mail.new do
                to "#{to_addr.to_a.join(",")}"
                from "#{from_addr}"
                subject "#{send_subject}"
                body "#{NKF.nkf("-Wwm0", mail_body)}"
        end

        mail.deliver!

end
__END__

アラートをパイプで受け取り、ステータスチェック後mailする
```

とりあえず、晒すまでもないことだけど備忘録として置いてく。
[非推奨] UITableViewController 以外で UIRefreshControl を使う方法 [リスクあり]

Tweetie で有名になった **Pull to refresh** ですが iOS 6 から `UIRefreshControl` として OS 標準で追加されました。残念ながら `UIRefreshControl` は `UITableViewController` と一緒に使うしかまっとうな方法はありません。`UIViewController` + `UITableView` のような構成で **無理矢理** 使う方法を書いてみます。

## 重要

個人的におすすめしません。素直に `UITableViewController` で使うような方向でまず実装を検討してください。これから紹介する方法は OS バージョン等の要因に左右されて期待するような動きをしない危険性があります。

## 方法

`UIRefreshControl` を生成して `UITableView` のインスタンスに addSubview するだけです。

ただし、これだけではアプリが Background から Foreground に戻ってきた時やタブの切り替え等で viewWillAppear などが呼ばれたあとに `UIRefreshControl` が `UITableView` よりも前面に出てくることがあります。

### 最前面に出てくるのをねじ伏せる方法

viewWillAppear で

```Objective-C
[self fixRefreshControlLayout];
if (self.refreshControl.isRefreshing) {
    [self.tableView setContentOffset:self.scrollOffsetToRestore animated:NO];
}
```    

というような感じにします。

* 1行目で `UIRefreshControl` のレイアウトを調整
* 2行目以降で refreshing 状態の時のために保持しておいた `UITableView` の `contentOffset` を復元させています。

1行目の `fixRefreshControlLayout` はこんな感じ。

```Objective-C
- (void)fixRefreshControlLayout
{
    if ([self isViewLoaded] == NO) {
        return ;
    }

    BOOL isRefreshing = self.refreshControl.isRefreshing;
    if (isRefreshing) {
        [self.refreshControl endRefreshing];
    }
    [self.refreshControl removeFromSuperview];
    self.refreshControl = nil;
    [self.tableView addSubview:self.refreshControl];
    if (isRefreshing) {
        [self.refreshControl beginRefreshing];
    }
}
```

最前面に出てきても再度 addSubview すれば期待する位置に出てきてくれるので念のため都度都度張り直しをしています。特にパフォーマンス上は大きな足かせにはなっていない印象です。

`self.scrollOffsetToRestore` は `viewWillDisappear:` のタイミングで現在の contentOffset を保持しておくようにしています。

## まとめ

このような無理矢理な実装をしてねじ伏せるような実装を追加してもそんなに綺麗な感じじゃないです。ですので繰り返しになりますが素直な実装をとることを激しくおすすめします。Apple にはバグレポを通じて `UIRefreshControl` が `UITableViewController` に限定されずに使えるように要望しましょう。
Readable Xmodmap

Xmodmap の設定ファイルで `keycode` と `keysym` を併用すると混乱するのでどちらか片方だけを使うほうがよいと思う。
`keycode` は番号で書くため読みにくくなるが、事項順序依存は発生しないため、長い設定ファイルを書く場合は番号の方が良い。

また、モディファイヤーキーを変更する場合は、次の順番で行うと失敗しない。

- 変更しようとする全ての keysym と MODIFIERNAME との結びつきを外す (clear か remove を使用)
- 物理的なキーコードに keysym を割り当てる  ( keycode を使用)
- MODIFIERNAME に keysym を追加する ( add を使用 )

例:

```
clear lock
clear control
keycode 66 = Control_L
keycode 37 = Caps_Lock
add Control = Control_L
add Lock = Caps_Lock
```

次の例は失敗するので注意すること。

```
! キーコード
! CapsLock  66
! Control_L 37

clear lock
keycode 66 = Control_L
add Control = Control_L

clear control
keycode 37 = Caps_Lock
add Lock = Caps_Lock
```
gemの管理者を追加する

## *.gemspec と RubyGems.org API

RubyのgemはRubyGems.orgで集中管理されています。

通常gemの設定自体は`*.gemspec`ファイルに記述しますが、これはあくまでgemそのものの設定であって、RubyGems.orgでの管理については`*.gemspec`で設定しているわけではありません。これは、RubyGems.orgの方で別途管理されています。RubyGems.orgのAPIを使います

## gem ownerコマンド

RubyGems.orgへの登録や更新には、最近ではbundle gemコマンドを使ったりしますが、RubyGems.orgでのgemの管理者を追加するにはgem ownerコマンドを使います。

管理者の指定方法にはメールアドレスを使います。fooというgemに`another@example.com`を追加するには以下のようにします。

```shell-session
$ gem owner foo -a another@example.com
```

## 参考

 * http://guides.rubygems.org/command-reference/#gem_owner
PowerShellでzipファイルを解凍する

ところで、PowerShell v5 からは zip ファイルの操作が可能になったらしいので、可能ならば v5 を入れて操作した方が安全そうです。  

使い方を紹介しているブログがありましたので、参考までに  
[PowerShell v5 の新機能紹介 - Zipファイルの操作が可能に](http://tech.guitarrapc.com/entry/2014/09/08/062313)

PowerShellのコマンドラインからzipファイルを解凍したかったので$PROFILEに関数を追加しました。
特別な外部ライブラリを使わずにエクスプローラーのzipファイルアクセス機能を利用しています。

```ps1
function psunzip {
   #エクスプローラーのオブジェクトを作成する
   $Expcom = New-Object -ComObject Shell.Application

   #第一引数のzipファイルパスを登録
   $zipFile = $Expcom.NameSpace($args[0])

   #第二引数の出力先ディレクトリパスを登録
   $tgtDir = $Expcom.NameSpace($args[1])

   #zipファイル内のオブジェクト(ファイル)一覧を取得してForEach-Objectに渡す
   $zipFile.Items() | ForEach-Object {

      #ファイルを一つずつ出力先ディレクトリにコピー
      $tgtDir.CopyHere($_.path)
   }
}
```

$PROFILEを編集して再読込をした後に下記のようなコマンドを叩くとzipファイルをコピーできます。

```
> psunzip %ZIPファイルパス% %出力先ディレクトリパス%
```

どちらのパスもフルパスでしか試したことはありません。
Ruby on Rails チュートリアル メモ抜粋

■railsプロジェクト生成時
①プロジェクト生成
$ cd rails_projects
$ rails new app001
$ cd app001

②Gemfile更新

③バンドル設定
$ bundle install --without production
$ bundle update
$ bundle install

④GIT初期化
$ git init
$ git add .
$ git commit -m "Initial commit"

⑤githubプッシュ
$ git remote add origin https://github.com/<username>/app001.git
$ git push -u origin master

■DBテーブル生成
$ rails generate scaffold User name:string email:string
$ bundle exec rake db:migrate

■静的ページの作成
$ rails generate controller StaticPages home help --no-test-framework
（コントローラ名はキャメルで）

■トピックブランチの作成
$ git checkout -b static-pages

■マスターブランチへ移動してトピックブランチをマージ
$ git checkout master
$ git merge static-pages

■コントローラ、モデルの削除
  $ rails generate controller FooBars baz quux
  $ rails destroy  controller FooBars baz quux

  $ rails generate model Foo bar:string baz:integer
  $ rails destroy model Foo

■マイグレーションを元に戻す

  $ rake db:migrate

以下のコマンドで1つ前の状態に戻すことができます。

  $ rake db:rollback

最初の状態に戻したい場合は、以下のコマンドを使います。

  $ rake db:migrate VERSION=0

■git push heroku master で失敗する

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

↑のようなエラーが出る場合は、sshの設定がおかしい可能性大。
①~/.ssh に「id_rsa」と「id_rsa.pub」があるかを確認して、もし無ければ作る
　1. 「ssh-keygen -t rsa」をターミナルで実行
　2. 「Enter file in which to save the key (/Users/username/.ssh/id_rsa): 」と聞かれるのでそのままEnter
　3. 「Enter passphrase (empty for no passphrase): 」と聞かれるのでとりあえず何か打ち込んでおく（あとから聞かれるので覚えておく）。
　4. id_rsaとid_rsa.pubが生成されるので、「heroku keys:add」で公開鍵を登録。先ほどのパスフレーズを入力。
　5. git push heroku masterを実行
[Grunt] 指定ディレクトリ以下の*.lessファイルをまとめてmain.cssとして出力させるには

(前提: yeomanにて[generator bootstrap less](https://github.com/Thomas-Lebeau/generator-bootstrap-less)を利用し、初期セットアップ終了後)

Gruntfile.jsに以下のような記述を行う

```js:Gruntfile.js

    less: {
      dist: {
        files: {
          //変数yeoman.appはGruntfile内で別途指定
          '<%= yeoman.app %>/styles/main.css': ['<%= yeoman.app %>/styles/*.less']
        },
        options: {
          sourceMap: true,
          sourceMapFilename: '<%= yeoman.app %>/styles/main.css.map',
          sourceMapBasepath: '<%= yeoman.app %>/',
          sourceMapRootpath: '/'
        }
      }
    },
```

上記の指定を行うと、/styles/フォルダ以下の*.lessファイルがすべてmain.cssとしてコンパイルされる。
grunt serverでライブリロード時にも有効。

全文は以下。https://gist.github.com/mekkoo/9927265
JSerだけどC++のvectorで配列を扱ってみた

下書きのまま残ってたので放出:

勉強中。

```js
// JavaScript

var arr = [];
arr.push(101);
arr.push(-1);
arr.push(999);
for (var i=0, l=arr.length; i<l; i++) {
  var n = arr[i];
  console.log(i, n);
}
```

```cpp
// C++

#include <vector>

std::vector<int> arr;
arr.push_back(101);
arr.push_back(-1);
arr.push_back(999);
for (int i=0, l=arr.size(); i<l; i++) {
  int n = arr[i];
  printf("%d, %d\n", i, n);
}
```

`push_back()`の逆は`pop_back()`だが、これは末尾を削除するだけで、値を返さない。(戻り値は`void`。）　"_back"て何だろう？

参考:

* [配列よりSTL](http://www.geocities.co.jp/bleis_tift/cpp/stl.html)
[SyncStitch]プロセスの逐次合成

[プロセスの逐次合成](http://www.principia-m.com/ts/0000/index-jp.html)

少しずつ勉強を進める。
まずは完全に動作するモデルを書くところから。

```scm:Definition
(define-event a)
(define-event b)
(define-event c)
```

```scm:SYS
(define-process S
  (seq P Q))

(define-process P
  (alt (! a SKIP)
	   (! b STOP)))

(define-process Q
  (! c SKIP))
```
JsRender での for と props の違い

JsRender のメモ。

■目的（こんな感じで出力する）
user list

| 名前 | 年齢 | 一番好きな本 |
|:-----------|:------------:|:------------|
| 太郎 | 30歳 | title - ONE PIECE <br>author - 尾田 栄一郎 |
| 花子 | 20歳 | title - 日経新聞の数字がわかる本 <br>author - 小宮 一慶 |

■データ構造

```js
var data = {
  "title" : "user list",
  "users" : [
    {
      "name": "太郎",
      "age": "30",
      "favoriteBook": {
        "title" : "ONE PIECE",
        "author" : "尾田 栄一郎"
      }
    },
    {
      "name": "花子",
      "age": "20",
      "favoriteBook": {
        "title" : "日経新聞の数字がわかる本",
        "author" : "小宮 一慶"
      }
    }
  ]
};
```

■テンプレート

```html
<script id="users" type="text/x-jsrender">
     {{if users.length > 0}}
          {{:title}}
          <table border="1">
               <tr>
                    <th>名前</th>
                    <th>年齢</th>
                    <th>一番好きな本</th>
               </tr>
               {{for users}}
               <tr>
                    <td>{{:name}}</td>
                    <td>{{:age}}歳</td>
                    <td>
                         {{props favoriteBook}}
                             {{:key}} - {{:prop}}<br />
                         {{/props}}
                    </td>
               </tr>
               {{/for}}
          </table>
     {{/if}}
</script>
```

※この程度の出力なら for も props も要らないのでは？というツッコミはなしで…(；´Д｀)

で、なにをメモしておきたいかというと、

* for
* props

の違いです。
for は配列の要素をループするけど、
props はオブジェクトの属性をループします。

上記の例で行くと、

* users は配列で、その中に各ユーザ情報がある
 * 各ユーザの情報を取得するには for を使う

* favoriteBook はオブジェクト
 * オブジェクトの各属性（キーと値）を表示するには props を使う

てな感じで使い分ける必要があるってことです。
まぁ、ドキュメントをよく見ればいいだけのことなんですけどね…(；´Д｀)

なので、詳細は本家のドキュメントを参照すること。
http://www.jsviews.com/#jsrapi
Linuxでjdkをwgetする方法


JDKのダウンロードは、普段[ここ](http://www.oracle.com/technetwork/java/javase/downloads/index.html)から行いますが、ダウンロードにはOracleの[Licence](http://www.oracle.com/technetwork/java/javase/terms/license/index.html)の同意にチェックする必要があります。

同意はしているのですが、ansibleやchefなどで同意チェックを画面からせずに直接wgetしたい時の方法です。
仕組みは単純でAcceptしたというCookieがリクエストに含まれていれば同意したとみなされ、URL直指定でもダウンロードできます。

以下のコマンドはそのCookieを含むリクエストを送りますので、利用する場合はOracleのLicenseに同意した上で利用して下さい。
下記にないURLは、サイト上で"Accept"した後、ダウンロードしたいファイルを右クリックして確認できます。

コピペして実行出来るものを置いておきます。

(※ダウンロードは自己責任でお願いします)
(※2015/11/2変更:最新バージョンに変更)
※注意: 古いバージョンはアーカイブされMyOracle等にログインしないとダウンロードできなくなったりしますので、この記事が古くなるとコピペしても動かなくなる場合があります。ご了承ください。

### Java8(2015/11/2時点)
* Linux 64bit版 RPM jdk-8u65

```bash
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm
```

* Linux 64bit版 tgz jdk-8u65

```bash
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.tar.gz
```

* Linux 64bit版 RPM jdk-8u66

```bash
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.rpm
```

* Linux 64bit版 tgz jdk-8u66

```bash
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.tar.gz
```

### Java7(2015/11/02時点)
※Java7はEOLになっており、サポートやパッチを受け取るためにはOracleSupportに加入する必要があります。Java8へアップグレードすることをおすすめします。
※何故かまだダウンロードできる・・・

サポートロードマップ: http://www.oracle.com/technetwork/java/javase/downloads/eol-135779.html?ssSourceSiteId=otnjp

* バージョン：jdk-7u80
* 64bit版

```bash
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u80-b15/jdk-7u80-linux-x64.rpm
```

### jdk6
JDK6のダウンロードはOracleへのアカウント登録が必要です。

### 過去のURL

* jdk-8u25

```bash
wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.rpm
```

* jdk-7u72

```bash
wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u72-b14/jdk-7u72-linux-x64.rpm
```
3コマンドでCentOS5にgitを入れる

3コマンドでCentOS5にgitを入れる
===

* デフォルトだとyumで入らない
* 自力makeかリポジトリ追加か（今回は後者）
* 毎回検索し直してるので私的なメモ

コマンド
---
* 下記でOK (32bitの場合。64bitは[それ用のRPM](http://repoforge.org/use/)を使う。)

```
# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
# rpm -Uvh ./rpmforge-release-0.5.2-2.el5.rf.i386.rpm
# yum install -y git
```

終わりに
---
* 何も考えていないので使用には注意

追記
---
* 2コマンドで行けるという情報いただきました

```
# rpm -Uvh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
# yum install -y git
```

* ただし、rpmコマンドがあまり賢くないようで、下記を考慮する必要があります
  * HTTPのリダイレクトに対応していないので、場所が移動している場合は使えない
  * Proxyの中にいる場合はrpmコマンドに「--httpproxy proxy.example.com --httpport 8080」といったオプションを付ける必要がある (http_proxy環境変数は見てくれません)
AppDelegateを肥大化させてはいけない


AppDelegateをシングルトンとして使うとメンテできないコードになります。

AppDelegateをどこからでも呼べる便利なシングルトンとして用いてしまうと、AppDelegateがアプリケーションの状態が通知された際の役割以外をもたせることになります。その結果、複数の機能が一つのクラスで表現されてしまうことになります。importの依存関係の意味も不明確になります。

これらの諸々の事情によりAppDelegateに状態が追加されその処理が埋め込まれることでAppDelegateが肥大化していき、メンテ不可能な雪だるまができていきます。

また、テストが困難になるという問題もあります。


以下は関連する議論のリンクです。

[Singletons, AppDelegates and top-level data.](http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html)

[Don’t Abuse the App Delegate ](http://www.hollance.com/2012/02/dont-abuse-the-app-delegate/)
boto を使って、S3 からファイルをダウンロードする。

boto.connect_s3 から connection とれて、そこからバケットとれて、key までとれる、便利。

バージョン
==========

* Python 2.7.2
* boto (2.27.0)

コード
======

```python
from cStringIO import StringI

from boto import connect_s3

# token
access_key = ''
secret_key = ''

# bucket, key
bucket_name = ''
file_key = ''

# S3 からファイルを取得
conn = connect_s3(access_key, secret_key)
bucket = conn.get_bucket(bucket_name)
key = bucket.get_key(file_key)

# key_name で取得できなかった場合 None が返る
if not key:
    return u'ないよー'

# ファイルダウンローして、 StgingIO に書き込み
fp = StringIO()
key.get_contents_to_file(fp)
fp.seek(0)
```
Rails4 列名の変更


1.マイグレーションファイル作成
`rails g migration changecol_columnname`

2.マイグレーションファイル編集

```ruby
class ChangecolColumnname < ActiveRecord::Migration
  def change
    rename_column :target_table, :old_column, :new_column
  end
end
```


例：


```rb
class RenameColumnToUsers < ActiveRecord::Migration
  def change
    rename_column :users, :plan, :plan_type
  end
end
```

3.マイグレーション実行

`rake db:migrate`
MongoDBで外部JavaScriptを実行する際に引数を渡す方法など

MongoDBで外部ファイル化したJavaScriptを実行する際に、引数を渡して実行したいことが
多かったのですが、色々調べても正式なやり方が見つからなかったので、工夫して実現してみました。

その他にも、個人的に便利な実行方法をまとめて記載してみます。


# 方針
外部JavaScriptに引数を直接渡せないようなので、仕方ないので適当なシェルを作り、
シェルに渡された引数を出力し、外部JavaScriptへ渡すことにします。

# シェルからJSへの引数の渡し方

まずは

```
mongo --quiet << EOS
	var result = load("/xxx/mapreduce.js")
EOS
```

などとすると、外部JSを実行できるので、その前に
var arg1 = "$1"
のように記載して、シェルの引数を出力してJSに渡します。


```シェル内の記述例
mongo --quiet << EOS

	var arg1 = "$1"

	var result = load("/xxx/mapreduce.js")

EOS
```

$1の部分が、シェルに渡された引数の出力になります。
実行する際は、

```
sh /xxx/mapreduce_with_args.sh hoge
```

などとすると、arg1の値が"hoge"となり、外部JS内で使えるようになります。


# ついでにJavaScriptをutil化してMapReduce内で使う

ついでですが、JavaScriptの内容をUtil化し、再利用したい場合も多いです。
普通のやり方ではMapReduce内にUtil関数を渡せないので、
一度

```
var util = new function(){
    this.hogeFunc = function(xxx){・・・}
}
```

などとしてUtil関数をまとめた後、

```
db.system.js.save({"_id": "util", "value": util});
```

として system.js　に保存しておきます。

参考にさせていただいたページ：
http://muddydixon.hatenablog.com/entry/20110325/1301076643


# 実行例まとめ

エラーチェックなどを付け足しつつまとめると、例えば以下のようなやり方になります。


``` シェル実行
sh /xxx/mapreduce_with_args.sh hogeDb hugaName
```


```mapreduce_with_args.sh
mongo --quiet << EOS

try{
	// シェルの引数を出力してJavaScriptに渡す
	var dbName = "$1"

	if(!dbName){
	  // 引数チェック
	  throw new Error("Validation Error")
	}
	// 対象のdbを引数にしたがって変更
	var db = new Mongo().getDB(dbName);

	// その他のパラメータ(対象dbの変更後に設定しないとダメみたい)
	var targetName = "$2"


	// utilの内容を読み込み、保存
	var result1 = load("/xxx/util.js");

	// mapreduce実行
	var result2 = load("/xxx/mapreduce.js")

}catch(e){
	print(e.stack);
}

EOS
```


```util.js
// util定義
var util = new function(){

    this.hogeFunc = function(xxx){
        return yyy;
    }
}
// utilの内容を system.js に保存
db.system.js.save({"_id": "util", "value": util});
```


```mapreduce.js
// 引数の内容を使ってクエリを組み立てるなど
var query = {name : targetName}

var map = function() {
	// utilの内容を使って処理を行う
	var yyy = util.hogeFunc(xxx);
    ...
}
mapreduce実行

```
フラグを反転させる方法


Javascriptなんかだと、DOMの状態をフラグで管理することが多いです。
そういうときに、ちょっとしたテクニックでコードをすっきりすることができます。
フラグの反転方法を例にやってみたいと思います。

##Ifによる条件分岐

ボタンが押され、処理を行った後にあるフラグを反転させる

```javascript
	var isClosed = 0;
    $('#someButton').click(function(){

	  // ...... do something	

  	  if (isClosed === 1){
		  isClosed = 0;
	  }else if (isClosed === 0){
         isClosed = 1;
	  }
    });
```

##三項演算子を使ってみる
```javascript
	var isClosed = 0;
    $('#someButton').click(function(){

	  // ...... do something	

  	  isClosed = (isClosed === 1) ? 0 : 1;
    });
```
一行ですが、わかりにくくなった上に1とそれ以外で分岐してしまってます。

##1と0じゃなくて1と-1で管理する
```javascript
	var isClosed = 0;
    $('#someButton').click(function(){

	  // ...... do something	

	  isClosed *= -1
    });
```
1と-1でフラグを持つようにすれば、-1を掛けることによってフラグの反転が可能です。
これはかなりわかりやすく、すっきりしています。

##ビット演算子を使う
```javascript
	var isClosed = 0;
    $('#someButton').click(function(){

	  // ...... do something	

	  isClosed = ~isClosed
    });
```
「~」はNOT演算子ですので、0はビット反転して-1になります。
0と-1で管理する形になりますが、こういう方法もあります。
テキストをノコギリと正規表現でやんわり引っこ抜きながらHashにまとめるイディオム


なんか他に再利用できそうなイディオムなのでメモ。

### コード

``` ruby
Nokogiri::HTML(open(url)).xpath('//hogehoge').children.map{ |e|
  case e.text.strip
  when /データ年次.*?：(.*)$/
    {year:$1.strip}
  when /情報.*?：(.*)/
    {tag:$1.strip}
  when /再配布可否.*?：(.*)$/
    {redistribution_allowed:$1.strip}
  when /商用利用可否.*?：(.*)$/
    {commercial_use_allowed:$1.strip}
  when /テータ提供.*?：(.*)$/
    {provider:$1.strip}
  when /問い合わせ先電話番号.*?：(.*)$/
    {tel:$1.strip}
  when /内容.*?：(.*)$/
    {description:$1.strip}
  when /コメント.*?：(.*)$/
    {comment:$1.strip}
  end
}.compact.inject(&:merge)
```

### 簡単な手順

1. ノコギリで`のっとうぇるすとらくちゃあど`なテキストを要素単位へギコギコして配列を作る。
2. `case`の`when`で正規表現にマッチさせたのを`Hash`にして`map`する。（ちなみに、マッチした内容は`$1`とかで取れる。あとゴミが混じるのでついでに`strip`も。）
3. `case`でマッチしない場合は`nil`になるので`compact`する。
4. それを`inject(&:merge)`して1つの`Hash`へ結合する。
5. できた！

### ポイント

* やんわり。
* お手軽。
* マッチさせたい対象と`Hash`のキーの対応が見やすい。
* 条件追加しやすい。
* `map.compact.inject(&:merge) `が楽しい。
iptablesの設定メモ


以下の通りの方針に従って設定を行う

* 入力(INPUT),転送(FORWARD)は許可したもの以外は破棄(DROP)
* 出力(OUTPUT)は基本的に許可(ACCEPT)

入力で許可するもの以下のとおり

* sshサーバへの接続は許可
* ローカルループバックインターフェースからの接続は許可
* pingなどICMPパケットを許可
* 自サーバから接続済みの通信に関するパケットを許可

ip偽装攻撃対策

* プライベートIPアドレスからの接続は破棄
* ローカルループバックからの接続は拒否
* 特殊なアドレス（リンクローカル,TEST-NET,クラスD,クラスE）からの接続は拒否

Smarf攻撃対策

* ブロードキャストのパケットを破棄

上記に対応する iptables の設定は以下

```:/etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Wed Apr  2 03:07:56 2014
*filter

# 入力(INPUT),転送(FORWARD)は許可したもの以外は破棄(DROP)
:INPUT DROP [26:2578]
:FORWARD DROP [0:0]

# 出力(OUTPUT)は基本的に許可(ACCEPT)
:OUTPUT ACCEPT [4:432]

# sshサーバへの接続は許可(xxxxxxは実際はsshのポート番号)
-A INPUT -p tcp -m tcp --dport xxxxxx -j ACCEPT

# 自サーバから接続済みの通信に関するパケットを許可
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# ローカルループバックインターフェースからのパケットは許可
-A INPUT -i lo -j ACCEPT

# icmpパケットを許可
-A INPUT -p icmp -j ACCEPT

# ip偽装対策1(プライベートアドレスからのパケットは破棄)
-A INPUT -s 10.0.0.0/8 -j DROP
-A INPUT -s 172.16.0.0/12 -j DROP
-A INPUT -s 192.168.0.0/16 -j DROP

# ip偽装対策2(特殊なアドレスからのパケットを拒否)
-A INPUT -s 127.0.0.0/8 -j DROP     # ローカルループバックアドレス
-A INPUT -s 169.254.0.0/16 -j DROP  # ローカルアドレス
-A INPUT -s 192.0.2.0/24 -j DROP    # TEST-NET
-A INPUT -s 224.0.0.0/4 -j DROP     # クラスD
-A INPUT -s 240.0.0.0/5 -j DROP     # クラスE

# Smarf攻撃対策(ブロードキャストパケットの破棄)
-A INPUT -d 0.0.0.0/8 -j DROP
-A INPUT -d 255.255.255.255/32 -j DROP
COMMIT

```

サービスの起動/停止

```bash:起動
$ sudo /etc/init.d/iptables start
```

```bash:停止
$ sudo /etc/init.d/iptables stop
```

```bash:再起動
$ sudo /etc/init.d/iptables restart
```
i18n-tasks | Rails のロケールファイルを整理整頓する


`i18n-tasks` は、Rails で利用しているロケールファイルで不足している翻訳や未使用の翻訳を検出してくれる便利な Gem です。

## リソース

* [GitHub](https://github.com/glebm/i18n-tasks)
* [RubyGems.org](https://rubygems.org/gems/i18n-tasks)
* [The Ruby Toolbox](https://www.ruby-toolbox.com/projects/i18n-tasks)

## インストール

`Gemfile` に `i18n-tasks` を追記します。

```ruby:Gemfile
group :development do
  gem 'i18n-tasks'
end
```

インストールします。

```bash:console
$ bundle install
```

## 利用方法

### ヘルプを表示する

```bash:console
$ i18n-tasks

Usage: i18n-tasks [command] [options]
    -v, --version      Print the version
    -h, --help         Display this help message.

Available commands:

  missing             show missing translations
  unused              show unused translations
  translate-missing   translate missing keys with Google Translate
  add-missing         add missing keys to the locales
  find                show where the keys are used in the code
  normalize           normalize translation data: sort and move to the right files
  remove-unused       remove unused keys
  config              display i18n-tasks configuration
  xlsx-report         save missing and unused translations to an Excel file

See `<command> --help` for more information on a specific command.
```

### 不足している翻訳を検出する: `i18n-tasks missing`

ビューで i18n の読み込みを定義しているにも関わらず、ロケールファイルには、まだ定義されていない翻訳を検出します。

```bash:console
$ i18n-tasks missing

Missing translations (1) | i18n-tasks v0.3.9
Types: ✗ missing from base locale, ∅ missing from locale but present in base locale, = value equals base value
+--------+------+------------------+-----------------+
| Locale | Type | i18n Key         | Base value (en) |
+--------+------+------------------+-----------------+
|   en   |  ✗   | sites.index.desc |                 |
+--------+------+------------------+-----------------+
```

ビューで `sites.index.desc` というキーで i18n の読み込みを定義しているにも関わらず、ロケールファイルには、まだ定義されていないということが分かります。

### 特定の翻訳が使用されているビューを検出する: `i18n-tasks find --p [pattern]`

特定の翻訳がどのビューのどこで使用されているか検出します。
検出したい翻訳のキーをパラメータとして渡します。

```bash:console
$ i18n-tasks find --p sites.index.desc

1 key ~ 'sites.index.desc' (1 usage) | i18n-tasks v0.3.9
sites.index.desc
  app/views/sites/index.html.erb:2 <p><%= t('.desc') %></p>
```

`app/views/sites/index.html.erb` の2行目で使用されていることが分かります。

### 未使用の翻訳を検出する: `i18n-tasks unused`

ロケールファイルに定義されているにも関わらず、ビューで使用されていない翻訳を検出します。

```bash:console
$ i18n-tasks unused

Unused keys (1) | i18n-tasks v0.3.9
+-------------------------+-------------------------------------------+
| i18n Key                | Base value (en)                           |
+-------------------------+-------------------------------------------+
| sites.index.description | Find me in app/views/sites/index.html.erb |
+-------------------------+-------------------------------------------+
```

`sites.index.description` というキーがロケールファイルに定義されているにも関わらず、使用されるはずである `app/views/sites/index.html.erb` で未使用となっていることが分かります。

### その他

* 不足している翻訳を自動的にロケールファイルに追加する: `i18n-tasks add-missing`
* 未使用の翻訳を自動的にロケールファイルから削除する: `i18n-tasks remove-unused`
* 定義されている翻訳をキーでソートしたり、適切な位置へ移動する: `i18n-tasks normalize`

などなど、便利そうなコマンドが用意されていますが、これらはロケールファイルの上書きを行うのと、強制的にキーのソートがされてしまうので注意が必要そうです。
AngularJS with Rails

\#tqrk07でのLTの一部です。
AngularJSとRailsを組み合わせてWEBアプリケーションを作りたい人のために書きました。

## AnuglarJSをどのようにして管理するか

### Bundler
Railsの中でAngularJSを扱います。
そのための準備は ` gem 'angularjs-rails'` これだけです。
この時の主従関係は Rails が主であり、AngularJS が従であると言えます。
普段と同じように jsファイルは assets 以下に配置するので、Railsに元々備わっている asset pipeline が有効です。
Googleで"AngularJS Rails"と検索すると、こちらのやり方ばかり引っかかるので恐らくBundlerで管理するのがポピュラーなんだと思います。

ちなみに、 [egghead.io](https://egghead.io/lessons/angularjs-rails-todo-api-part-2) では、bower-railsを使ってAngularJSを管理する方法を紹介しています。
package.jsonでAngularJSを管理するということ以外、Bundlerで管理するのと大した違いは無さそうです。


### Bower
Railsとは別にAngularJS Appを構築します。
つまり、AngularJS(クライアントサイド)とRails(サーバーサイド)の役割を完全に切り離し、RailsにはAPI ServerとしてJSONをレンダリングする仕事だけを与えます。
クライアントサイドの構築にはBower, Grunt, Yeomanというようなエコシステムを利用します。

ちなみに、僕はこちらの方法を採用しています。
理由としては

+ erbの中にAngularJSのDSLが混入するのは見栄えが良くないと感じたから
+ AngularJSとRailsの境界線が曖昧だと具合が悪くなりそうだから
+ サーバーサイドのフレームワークの変更にも柔軟に対応出来るから


です。
詳細はGithubをご覧下さい。
https://github.com/nekova/animatch

## Tips
このTipsは既にAngulaJS Appをbuildする段階まで来ている人向けです。
フロントエンドのエコシステムを利用してAngularJS Appの開発をする場合、Railsのasset pipelineに頼ることは出来ません。
ですから、buildをする際には、` $ grunt build` というタスクを実行してjsやcssをminifyします。
しかし、grunt buildでは親ディレクトリをminifyファイルの生成先に指定することは出来ないので、Rails Appのrootディレクトリにあるpublic/に直接渡すことは出来ません。
つまり、minifyしたファイルをpublicディレクトリに自分でcopyする必要があるのです。
この問題を解決するためのRake taskを用意しましょう。

``` build_ngapp.rake
namespace :ngapp do
  desc "run 'grunt build' and copy the dist to public dir"
  task :build do
    system('grunt build --gruntfile ngapp/Gruntfile.js')
    system('rm -rf public/*')
    system('cp -r ngapp/dist/ public/')
  end
end
```

まず、通常通りgrunt buildでminifyした後に、publicディレクトリを掃除します。
最後にngapp/distにあるminifyされたファイルをpublicディレクトリにコピーするというタスクです。

## AngularJS, Rails and You?
AngularJSの学習コストの高さに面食らって、なかなかスピードに乗った開発が出来ませんでしたが、1ヶ月ほど触っていると徐々に感覚が掴めてきました。
僕はAngularのDSLが嫌いではないので今後も使い続けたいと思っています。
このポストが誰かの助けになれば幸いです。
[Objective-C] GCDについての備忘録


色々やっていると、やはりGCDの機能をしっかり使いたくなってくる。
ので、調べたりしたものの備忘録をまとめておこうと思います。

##GCD（Grand Central Dispatch）とは

カーネルレベルで最適化してくれる、スレッド処理機能、といえばいいのかな。

##dispatchキューを作成する

```objc
dispatch_queue_t queue = dispatch_queue_create("com.hoge.queue", [attribute]);
```

create関数を使って新規にキューを作成します。
第2引数の`attribute`は、シリアルキューの場合は`NULL`を、ConCurrentキューの場合は`DISPATCH_QUEUE_CONCURRENT`を指定します。

###メモリ管理

<del>GCDはARC有効時でもメモリ管理をしてくれません。</del>
GCD自体はメモリ管理してくれますが、メモ自体の意味を忘れているのでとりあえず消しておきます・・。（読んだ本が古かったからそのメモかもしれませんｗ）

-----------------------------------------------------

##dispatchキューを取得する

新規で生成しなくとも、いくつかのスレッドが最初から生成されているのでそれを使ったほうが色々と楽です。

* dispatch_get_main_queue() … メインスレッドのキューを取得
* dispatch_get_global_queue([type], 0) … 優先度別のキューを取得

| タイプ | 優先度 |
|-------|-------|
| DISPATCH_QUEUE_PRIORITY_HIGH | 優先度・高 |
| DISPATCH_QUEUE_PRIORITY_DEFAULT | 優先度・中 |
| DISPATCH_QUEUE_PRIORITY_LOW | 優先度・低 |
| DISPATCH_QUEUE_PRIORITY_BACKGROUND | バックグラウンド |

-----------------------------------------------------

##`dispatch_after`関数を使って指定時間後にブロックを実行する

一定時間後に処理を実行したい、と思うことは結構あります。
`dispatch_after`関数を使えば、とても簡単にそれを実装することができます。
（Xcodeであれば、補完でだいたいの部分を埋めてくれるので、処理と遅延時間だけを入れるだけですぐに実装できます）

```objc
// 3秒後に処理を実行
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC));

dispatch_after(time, dispatch_get_main_queue(), ^{
	// do something.
});
```

-----------------------------------------------------

##`dispatch_apply`関数を使って反復処理を並列に実行する

`dispatch_apply`関数は、並列処理を指定回数繰り返す場合に使えます。
具体的なコードは以下。

```objc
size_t iterations = 10;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITIY_DEFAULT, 0);
dispatch_apply(iterations, queue, ^(size_t i) {
	NSLog(@"Current i: %lu", i);
});
```

for文でやっているようなことをブロックを使って実現しています。
また、`dispatch_apply`はスレッドをブロックします。
つまり、iterations回数分処理が終わらないとその先に処理が進みません。
HomebrewでMacVim-Kaoriyaのビルド 〜luaを添えて〜

## 苦労したくない方へ
[MacVim-KaoriYa GitHubリリースページ](https://github.com/splhack/macvim/releases/tag/20140107)


## ビルドにあたって
まず、MacVim-Kaoriya版を配布しているsplhackさんの、homebrewでtapできるリポジトリ[(splhack/homebrew-splhack)](https://github.com/splhack/homebrew-splhack)からは **ビルドできません** ヾ(❀╹◡╹)ﾉﾞ
supermomongaさんのforkしたリポジトリ[supermomonga/homebrew-splhack](https://github.com/supermomonga/homebrew-splhack)だとビルドできるので、こっちをtapします。

あと、luaつけてビルドと言うよりは、 **[Shougo/neocomplete.vim](https://github.com/Shougo/neocomplete.vim)のためにやってる** ので、luaだけじゃなくてcscopeも入れます。

## luaつけてビルド
```bash
 $ brew tap supermomonga/homebrew-splhack
 $ brew install cscope
 $ brew install lua
 $ brew install --HEAD cmigemo-mk
 $ brew install --HEAD ctags-objc-ja
 $ brew install macvim-kaoriya --HEAD --with-lua　--with-cscope
 $ brew linkapps
```
gettext-mkに関してはmacvim-kaoriyaと一緒に入りました。`brew info macvim`で他のオプションが出ます。ここでオプションを付けても、インストールされていないものについてはダメっぽい(はじめ、`brew install lua`せずに`brew install macvim-kaoriya --HEAD --with-lua`してもluaが入らなかった)。

あと、supermomongaさんが、[Lingr](http://lingr.com/room/vim/archives/2013/05/30)で
>luaはデフォルトでonにしておいたのでbrew install macvim-kaoriyaすればlua入りますです

って言ってたけどダメでした（˶′◡‵˶）

## まとめ
```bash
 $ brew tap supermomonga/homebrew-splhack
 $ brew install cscope
 $ brew install lua
 $ brew install --HEAD cmigemo-mk
 $ brew install --HEAD ctags-objc-ja
 $ brew install macvim-kaoriya --HEAD --with-lua --with-cscope
 $ brew linkapps
```
MySQL：UNIX_TIMESTAMPの挿入

UNIX_TIMESTAMPの挿入

```

mysql> INSERT INTO abc (id, timestamp) VALUES ('', UNIX_TIMESTAMP());
```

MySQLでタイムスタンプ確認方法

```
mysql> SELECT NOW() AS DATETIME;
+---------------------+
| DATETIME            |
+---------------------+
| 2014-01-20 17:25:27 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT UNIX_TIMESTAMP() AS TIMESTAMP;
+------------+
| TIMESTAMP  |
+------------+
| 1390206355 |
+------------+
1 row in set (0.00 sec)

mysql> SELECT UNIX_TIMESTAMP('2013-06-15 19:37:33') AS TIMESTAMP;
+------------+
| TIMESTAMP  |
+------------+
| 1371292653 |
+------------+
1 row in set (0.00 sec)

mysql> SELECT FROM_UNIXTIME(1371292653) AS DATETIME;
+---------------------+
| DATETIME            |
+---------------------+
| 2013-06-15 19:37:33 |
+---------------------+
1 row in set (0.00 sec)
```
ScalaでPlay Frameworkによる簡単Webアプリケーション作成

# ScalaでPlay Frameworkによる簡単Webアプリケーション作成

実行環境: Ubuntu 13.10

## Play Frameworkのダウンロード

以下のURLから「Play Framework」をダウンロードします。
http://www.playframework.com/download
ファイル名: play-x.x.x.zip (xはバージョン）

ダウンロードしたzipファイルを解答します。

```
$ unzip play-2.2.2.zip
```

.bashrcでPATHを通します。

```
$ cd ~
$ vim .bashrc
```

ファイルに以下を加えます。

```bash
export PATH="＜zipファイルを展開したディレクトリ＞:$PATH"
```

変更を反映します。

```
$ source .bashrc
```

## アプリケーションを作成する

hoge_appという名前のアプリケーションを作成します。
「play new hoge_app」とコマンドを実行すると、
1回目にアプリケーション名を聞かれるので、空白を入力して、デフォルト名にします。（デフォルト「hoge_app」）
2回目にScalaかJavaアプリケーションどちらを作成するか聞かれるので「1」と入力します。

```
$ play new hoge_app
       _
 _ __ | | __ _ _  _
| '_ \| |/ _' | || |
|  __/|_|\____|\__ /
|_|            |__/

play 2.2.2 built with Scala 2.10.3 (running Java 1.7.0_51), http://www.playframework.com

The new application will be created in /home/user/work/hoge_app

What is the application name? [hoge_app]
> 

Which template do you want to use for this new application? 

  1             - Create a simple Scala application
  2             - Create a simple Java application

> 1
OK, application hoge_app is created.

Have fun!

```

## アプリケーションの起動

アプリケーションのディレクトリが作成されるので、そこで「play run」とコマンドを実行します。
（しばらく時間がかかる場合があります）

```
$ cd hoge_app
$ play run
[info] Loading project definition from /home/user/work/hoge_app/project
[info] Set current project to hoge_app (in build file:/home/user/work/hoge_app/)
[info] Updating {file:/home/user/work/hoge_app/}hoge_app...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

```

この状態でlocalhostの9000ポートにブラウザでアクセスすると無事にWebアプリケーションが起動していることが確認できます。
http://localhost:9000/

![playframework.png](https://qiita-image-store.s3.amazonaws.com/0/34365/43955471-8299-8e52-63ff-d6fa99cbdee7.png)
HHVM Hackをすぐに試す方法(AWS AMI公開しました)

# Hack本書きました
エイプリールフールネタかと言われましたが、Hack本を執筆しました。
[Facebook発 新プログラミング言語「Hack」スタートアップガイド](http://www.amazon.co.jp/o/ASIN/B00JE4PMMO)

![Hack](http://ecx.images-amazon.com/images/I/51theIShoFL._AA278_PIkin4,BottomRight,-41,22_AA300_SH20_OU09_.jpg)

# AWS AMI公開しました
nginx, apache2, hhvm fastcgiの設定をしたAMIをAWSで公開しました。
AWS management consoleにログインして以下のリンクで公開AMIをLaunchしてください。

https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#LaunchInstanceWizard:ami=ami-01332368

# HHVM Hackで遊ぶ

apacheかnginxを起動させてからhhvmを起動してAWSの公開されているURLにアクセスしてみてください。
画面にHipHopと表示されれば、`/var/www/index.php`がHHVMで正常に動作しています。

## 起動方法

> nginx fastcgi hhvm

```
sudo service nginx start
sudo /etc/init.d/hhvm start
```

> apache2 fastcgi hhvm

```
sudo service apache2 start
sudo /etc/init.d/hhvm start
```

## HHVMを止める
`sudo /etc/init.d/hhvm stop`
でhhvmを止めてから
`/etc/apache2/mods-enabled/hhvm_proxy_fcgi.conf`
のProxy設定をコメントアウトしてapacheおよびnginxを再起動してから先程と同じURLにアクセスしてください。
いつも見慣れたphpinfo()の出力が見られると思います。


## Hackで遊ぶ

`/var/www/`配下に hack.php を作ってHackを満喫してください。

```php:hack.php
<?hh
echo "Hello Hack!";
```


インストールとか面倒ですよね！
AWSさん、ありがとう！
cgroupsによるメモリ使用量制限


cgroupsのmemoryサブシステムを使用して、コントロールグループのメモリ使用量の上限を設定します。

## コントロールグループにタスクを登録
メモリ使用量の上限となるmemory.max_usage_in_bytesはroot groupには設定できないので、
下階層にコントロールグループを作成し、現在のシェルから実行されるタスクが登録されるようにします。

```
# mount -t cgroup -o memory none /cgroup/
# mkdir /cgroup/hoge
# echo $$ > /cgroup/hoge/tasks
```

## メモリを消費するタスクの作成
下記のようなメモリを消費するテストプログラムを作成します。


``` mem_leak.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define MB 1024*1024

int main(int argc, char *argv[])
{
	char *p;
	int malloc_size = 10 * MB;

	while(1)
	{
		p = (char *)malloc(malloc_size);
		memset(p, 0, malloc_size);
		sleep(1);
	}


	return 0;
}
```


## メモリ使用量制限しない場合
テストプログラムを実行し、メモリ使用量を確認します。

![cg_mem1.png](https://qiita-image-store.s3.amazonaws.com/0/13343/b1f93550-cd03-d523-862c-2341bc3ffb06.png "cg_mem1.png")

どんどんメモリ使用量が増え続けて、最終的にはOoM Killerによって殺されました。


## メモリ使用量制限する場合

memory.max_usage_in_byteにメモリ使用量の上限を設定します。
単位はバイト数または*Mや*Gで指定できます。

今回は200MBを上限に設定します。

```
# echo 200M > /cgroup/hoge/memory.limit_in_bytes
```

テストプログラムを実行し、メモリ使用量を確認します。

![cgmem2.png](https://qiita-image-store.s3.amazonaws.com/0/13343/cfb3b060-1b80-47a3-9d89-a500645e6831.png "cgmem2.png")


設定した上限に達した辺りでテストプログラムがOoM Killerによって殺されました.


## OoM Killerの有効化/無効化

先ほどはメモリ使用量上限に達した際にタスクはOoM Killerによって殺さましたが、
memory.oom_controlにてOoM Killerの有効化(0)/無効化(1)が設定できます。

デフォルトはOoM Killer有効化されています。
無効化した場合、メモリーを使用しようとするタスクは追加のメモリーが解放されるまで一時停止されます。

実際に無効化して場合を確認してみます。

`# echo 1 > /cgroup/hoge/memory.oom_control`

テストプログラムを実行し、メモリ使用量を確認します。

![cgmem3.png](https://qiita-image-store.s3.amazonaws.com/0/13343/aeb37a4a-435f-89f2-b73d-e40ac7d88f81.png "cgmem3.png")


上限辺りのままタスクが停止していることが確認できました。
運用開発においての振り返りでよく出てくるキーワードと考察をつらつら書いてみた

振り返りを行うにあたりよく出てくる単語を集めてみた。
最終的にはチェックリストみたいにしたいという野望。
またそのキーワードがでた場合に「こうしたらいいんじゃないか？」という説明をつらつらと並べていく。
(答えはないのでコメントで議論したいです)

単語リストは他にもありましたら気軽に編集リクエストください。

## 単語リスト

### □ 共有

* □ 共有不足
* □ 共有を増やす
* □ 無駄な共有会が多い

### □ 期限(納期)

* □ 期限が短い
* □ 期限が決められていない
* □ 期限の設定がおかしい
* □ 期限の軌道修正がない


### □ ビジネス

* □ 売上がない
* □ 目標値が設定されていない

### □ 目的

* □ 目的が見えない
* □ 目的の意図がわからない

### □ スキル

* □ スキル不足
* □ スキルアップ

### □ 作業時間が足りない

* □ 作業中に頻繁に声をかけられて作業が捗らない
* □ タスクが積まれすぎる

### □ 優先度

* □ タスクの優先度が決まっていない
* □ 全部優先度Sでくる


### □ 属人化

* □ ある特定の人にタスクがよる
* □ 属人化が進んでいてある特定の人でしかわからない


## 単語の項目別「こうしたらいいんじゃないか？」という説明

### 共有

* 【課題】共有不足
 * 【説明】なぜ共有不足になるかをみんなに問いかける
 * 【説明】共有する場を作ろうと提案する
* 【課題】共有を増やす
 * 【説明】どう増やすか？をみんなに問いかける(共有ツール？、wiki,コミュニケーション)
 * 【説明】(特定の人のみドキュメント等で残している場合)はそもそも読んでいるか？を確認する
* 【課題】無駄な共有会が多い
 * 【説明】プロジェクトで行われている会議を全て書き出す。そして重複している、又はもう実は(時が経ち)意味がない会議を探す

### 期限(納期)

* 【議題】期限が短い
 * 【説明】開発プロセスの見直しを促す
 * 【説明】理由を決定者に聞く
 * 【説明】短納期の背景が特定のメンバーでしか話せない場合は、その情報を探しだして、そっとメンバー間に教える
* 【議題】期限が決められていない
 * 【説明】「新聞記者は締め切りがないと原稿を書かない」という比喩文句をだして期限の設定を促す
 * 【説明】期限とタスクの粒度が適切ではない場合は１周間単位で区切る等して、期限(見積もりの粒度)を見直すように促す
* 【議題】期限の設定がおかしい
 * 【説明】ひたすら設定についてみんなで議論するように促す
* □ 期限の軌道修正がない
 * 【説明】【理由】を探る
 * 【説明】淡々と期限破綻のバッドケースを述べていく


### ビジネス

* 【議題】 売上がない
 * 【説明】売上向上の為の施策の分類を行う
 * 【説明】売上に対する意識がない場合は、最終は人を切らなくてはいけない話をする
* 【議題】目標値が設定されていない
 * 【説明】つけるように促す

### 目的

* 【議題】目的が見えない
 * 【説明】社内における情報不足の場合があるので、「情報戦に負けたら勝てない」話をする
 * 【説明】そもそも意図をメンバーが汲み取っているか？否か？を確認する
* 【説明】目的の意図がわからない
 * 【説明】目的の意図を決定者に投げかける
 

### スキル

* 【議題】スキル不足
 * 【説明】プロジェクト全体としてのスキルについて考える(スキル不足の話はすぐに個人攻撃に移りやすいので)
 * 【説明】どんなスキルがプロジェクトとして必要かを書き出す
* 【議題】スキルアップ
 * 【説明】スキルが身につかないプロジェクトに人は長居しない話をする(素養が高い人ほど見切りが早い話をする)
 * 【説明】勉強会等を促す

### 作業時間が足りない

* 【議題】作業中に頻繁に声をかけられて作業が捗らない
 * 【説明】イヤホンを推奨する
 * 【説明】フリースペース等従業員が自由に使えるスペースに退避するように促す
 * 【説明】みんなでどこか集中時間等を設定して話しかけるの禁止時間を設けるようにする
* 【議題】タスクが積まれすぎる
 * 【説明】際立っている人のタスクの洗い出しを行う(それによって実は忙しそうに見えるが仕事をしていない事がわかる事もある)

### 優先度

* 【議題】タスクの優先度が決まっていない
 * 【説明】どれから片付けていいかわからんでしょ。。。って話に持っていく
* 【議論】全部優先度Sでくる
 * 【説明】それ優先度つけていないよね。。。。。。って話に持っていく

### 属人化

* 【議題】ある特定の人にタスクがよる
 * 【説明】タスクをホワイトボードに書いて手伝える人を公開の場で決める
* 【議題】属人化が進んでいてある特定の人でしかわからない
 * 【説明】抜けた瞬間のリスクを説明する
jsによるCSSの動的定義

===========

※2012年に書いたものを移植。


styleタグをDOMに追加すると、そのたび全要素レンダリングが発生するので実用的ではない。
DOMにCSS追加用のAPIが用意されているのでそれを使いましょう。

[参考 mozilla::insertRule サンプル](https://www.google.com/url?q=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FDOM%2FCSSStyleSheet%2FinsertRule&sa=D&sntz=1&usg=AFrqEzd_nb2tXNhtUIP4z68z2RdHWbZXAA)


フロー
-----

1. スクリプト操作用のstyle要素を生成し、headに入れておく

```
var style = document.createElement("style");
document.head.appendChild( style );
```

2. style.sheetからCSSStyleSheetオブジェクトが参照できるので、それを取得。

```
var sheet = style.sheet;
```

3. 取得したオブジェクトにinsertRule("css文字列", index )

```
sheet.insertRule( "#container { margin:0;padding:0; }", 0 );
```

尚、CSSStyleSheetには

* instertRule(cssString,index)
* deleteRule(index)
* addRule(元々IE独自っぽい)

が用意されてる。
[Ruby][解答募集]文字列に出現する単語の個数を数えてみよう


先日参加した[Ruby/Rails勉強会@関西 60th](http://rubykansai.doorkeeper.jp/events/9215)の「Ruby初級者向けレッスン」でこんな問題が出題されていたので紹介します。

## 問題

文字列中に含まれる単語の個数を単語ごとにカウントして、ハッシュとして表現してください。

### 実行例

- 入力: `"no ruby no life"`
- 出力: `{"no" => 2, "ruby" => 1, "life" => 1}`

## 自分なりの実装方法を考えてみよう

Rubyに慣れた人なら、おそらくかなり簡単な部類に入るプログラミング問題だと思います。

しかし、こんな簡単な問題でも意外と実装方法は人によって異なるものです。

実際、僕が関わっている[西脇.rb & 東灘.rb](http://nishiwaki-higashinadarb.doorkeeper.jp/)のコミュニティで出題したときも、解答例は人それぞれ異なっていました。

各人の知識やこだわりの違いがコードに現れてくるので、コードを見るだけでも面白いですし、お互い勉強にもなります。

## あなたも解答例をぜひコメント欄に！

そこであなたもぜひこの問題の解答例を考えてみてください！

考えたコードは直接コメント欄に記入してもらっても良いですし、gistのリンクを載せたりするのもOKです。

特に順位を決めたり景品を出したりするわけではありませんが、軽い腕試し問題としてチャレンジしてもらえればと思います。

## 西脇.rb & 東灘.rbではこんな感じの勉強会を開きます

今週の土曜日、2014年4月5日に開催される西脇.rb & 東灘.rbの「[Rubyプログラミング Dojo](http://nishiwaki-higashinadarb.doorkeeper.jp/events/10097)」ではこんな感じで共通のプログラミング問題をみんなで解いて、最後にコードレビューをする予定です。

すでに満席になっているため、今月の勉強会に参加するのは厳しいかもしれません。
しかし、毎月神戸近辺で勉強会を開催しているので、自分でコードを書いたり他の人の書いたコードを読んだりして勉強したいというRubyistの方は、ぜひ一度遊びに来てください。

Doorkeeperでコミュニティのメンバー登録をしてもらうと、イベントの開催通知を受け取ることができます。

- http://nishiwaki-higashinadarb.doorkeeper.jp/

## さいごに: 僕の解答例はこちら

僕も解答例を考えてgistに上げてみました。

- https://gist.github.com/JunichiIto/9914269

僕はちょっと関数型プログラミングっぽく書くのが好きです。
あと、Ruby 2.1以降でしか使えない便利メソッドも使っています。

`each_with_object`を使ってみるのもアリです。

- https://gist.github.com/JunichiIto/9926346

`each_with_object`の行だけ妙に長くなってしまうので、ムダにラムダを使ってみても面白いかも。

- https://gist.github.com/JunichiIto/9926358

などなど、一人で考えてもやり方は様々です。

## おまけ: RSpecを使って書いてみたい人向けのテンプレート

RSpecを使ってテストを自動化してみたい人はこんな感じのテンプレートを使えばテスト駆動開発ができます。
僕の解答例もこのスタイルで書いています。

````ruby
# count_by_word_spec.rb

def count_by_word(string)
  # Write your code here.
end
 
describe "count by word" do
  it "counts by word" do
    expect(count_by_word("no ruby no life")).to eq("no" => 2, "life" => 1, "ruby" => 1)
  end
end
````

実行する際はターミナルから以下のように実行すればOKです。
(`-c`は出力結果に赤や緑の色を付けるオプション)

````
gem install rspec
rspec -c count_by_word_spec.rb
````

## あわせて読みたい

前述の[Ruby/Rails勉強会@関西 60th](http://rubykansai.doorkeeper.jp/events/9215)では、「How to upgrade your Rails application to RSpec 3」というタイトルで「RSpec 2で書かれたRailsのテストをRSpec 3に移行する手順」を説明(実演)してみました。

このときの内容やスライドをブログやSlideShareに上げていますので、RSpecに興味がある人は読んでみてください。

- [「RSpec 2からRSpec 3へ移行する方法」を発表してきました - give IT a try](http://blog.jnito.com/entry/2014/03/30/082620)
- [How to upgrade your rails application to rspec3 - SlideShare](https://www.slideshare.net/JunichiIto/how-toupgradeyourrailsapplicationtor-spec3)