OmniAICreator/Qiita-1.07M huggingface dataset:
JIS配列のMacBookAirをUS配列として使う

会社ではUS配列のキーボードを利用しているのですが、元々JIS配列を使っていたので私物のMacBookAirはJIS配列。

会社でUS配列でコードを書いて、家でMacBookでコードを書こうとすると違和感が…
特にVimを使っていると、`:w`とやるところを`+w`とかやってて(´・ω・｀)って感じになります。

ってことでJIS配列のMacBookをUS配列に出来ないかなーって調べてました。

で、見つかったのが以下のブログです。

* [kenie 33 - JANSI: JANSI : Mac OS X 10.4 - 10.7](http://kenie33-jansi.blogspot.jp/p/mac-os-x-104-107-jisascii.html)

ブログではOS X 10.7まで動いていると書いてありますが、10.9でも動きました。感謝です。
手順もほぼブログの通りで出来ました。（むしろ手順削ったくらい）

```zsh
$ wget http://dl.dropbox.com/u/43721500/JANSI-MacOSX10.4.zip
$ unzip JANSI-MacOSX10.4.zip
$ cp JANSI-MacOSX10.4/JANSI.* ~/Library/Keyboard\ Layouts/
$ rm -rf JANSI-MacOSX10.4*
```

次にSystem Preferences - Keyboard - Input Sources から JANSIを追加します。
もともとはAlphanumeric(Google)に設定していたのですが、JANSIを使うので削除しておいた方が良いでしょう。

![JANSI_settings.png](https://qiita-image-store.s3.amazonaws.com/0/6092/508fd3f9-70f6-dab8-e262-c39f84c77300.png)

最後にKeyBoardの Input SourceでJANSIを選択します。

![set_JANSI.png](https://qiita-image-store.s3.amazonaws.com/0/6092/ac2b96fd-1da8-17dc-2bc2-e5e446c6126e.png)

これでJIS配列のMacBookをUS配列で利用することが出来ます！
キーボードを見ると混乱するのでブラインドタッチ必須です。
MacBookのJISキーボードに被せるUS配列のキーボードカバーとか売ってないかなー…

## 入力ソースのU.S.を消す
上の画像の状態だとU.S.を削除出来なくて、たまにU.S.になるのがうっとうしい。
入力ソースにことえりを追加した後だと削除できるので、一旦ことえりを追加し、U.S.とことえりを削除すると幸せになれる。

* 参考:[Macの入力ソースからUSを消す方法 | iTea4.0](http://itea40.jp/technic/ime/us-source-delete/)
Xcode5でiOS5.1対応のアプリを作る

初代iPadでも動くアプリを作る必要があり、なかなか苦戦したのでメモ。

##手順
1.プロジェクトナビゲーターでプロジェクトを選択
2.「Target」「Build Settings」「Architecture」を「ARCHS_STANDARD_32_BIT」へ変更
3.「Target」「General」「Deployment Info」「Deployment Target」が「5.1」へ変更できるようになるので変更
4.「Project」「Info」の「iOS Deployment Target」も「5.1」へ変更
5.「Project」「Info」下部にある「Use Base Internationalization」のチェックをはずす
　チェックをはずすと「Do you want to remove the Base localization」と出てくるので
　「Delete localized resources files from disk」にチェックを入れず「Remove」を選択
　＊国際化したStoryboardをまとめられるのはiOS6からのため
6.「Finder」を開いて対象プロジェクトフォルダの中にある「Base.lproj/Main.storyboard」を「en.lproj」へ移動する
7.6で移動させた「Main.storyboard」をプロジェクトへ追加する
8.「Main.storyboard」を開き「ファイルインスペクタ」にある「Use Autolayout」のチェックをはずす。
　＊AutolayoutはiOS6からのため

##その他注意点など
・Marvericksの場合はシミュレーターがインストールできないので実機でしか実行できずorz
・iOS5以降でしか使えない機能に注意、バージョン判定して分岐させるなどの対応が必要
　UITableViewController の preferredContentSize や UITableView の dequeueReusableCellWithIdentifier など

##2014/05/05 追記
・MasterView に TabBarController を追加した場合は TabBarController の shouldAutorotateToInterfaceOrientation: も実装しないと回転してくれない。
オンラインでプログラミング学習できるサイトまとめ

メモ帳に書いてたのをまとめときます。まだたくさんあると思いますが、とりあえず。

----
リンク

プログラミングもクラウドへ―― 学習＆開発環境Webサービス23選まとめ
http://www.atmarkit.co.jp/ait/articles/1402/24/news026.html
2014/02/26追加、すばらしい。すでにこのエントリー不要？ｗ

----
初心者向け

プログラミン
http://www.mext.go.jp/programin/
文部科学省

スクラッチ
http://scratch.mit.edu/
以前、Android向けに似たようなのがありました。

プログラミングベーシックス
http://www.programmingbasics.org/ja/
入り口だけ日本語にできます。あとは謎のマンガで説明ｗ

----
日本語

ドットインストール
http://dotinstall.com/
わかった気にはなる。

Study Tech
http://www.studytech.jp/
iPhoneアプリを作る、PHPでWebサービスを作る、WebサービスをRubyで作る。

Paiza
http://paiza.jp/
コーディングして転職しよう

Code Academy (部分的に日本語)
http://www.codecademy.com/
JavaScript,HTML/CSS,PHP,Python,Ruby,APIs

ミニツク
http://www.minituku.net/
あなたのRubyの技術に関するより詳しい知識と理解を増やします。

2016/05/12 追加
CodeIQ
https://codeiq.jp/

----
外国語

Code School
https://www.codeschool.com/
Ruby,JavaScript,HTML/CSS,iOS
あまり試せてませんが、node.jsを少しやってみたところインタラクティブで面白そう。

Coding Bat
http://codingbat.com/
JavaとPython、地味な画面ですが、練習問題たくさんあります。基礎力付けるには持ってこい

TopCoder
http://www.topcoder.com/
目指せレッドコーダー

----
おまけ

http://codepad.org/
ブラウザでコーディングできる
C,C++,D,Haskell,Lua,OCaml,PHP,Perl,Plain Text,Python,Ruby,Scheme,Tcl

Compile Online
http://compileonline.com/
あらゆる言語のオンラインコンパイラ

The Hello World Collection
http://www.roesler-ac.de/wolfram/hello.htm
あらゆる言語のHello Worldコレクション

クラウドのIDE
https://c9.io/

2016/05/12 追加
LearnGitBranching
http://k.swd.cc/learnGitBranching-ja/
Gitの使い方をインタラクティブに学習できる。

----

また見つけたら随時追加します。
Emacsで行番号表示をトグルする


```cl:.emacs
; 行番号表示をトグル
(defun toggle-linum-lines ()
  "toggle display line number"
  (interactive)
  (setq linum-format "%4d ")
  (linum-mode
   (if linum-mode -1 1)))
(define-key global-map (kbd "C-x C-l") 'toggle-linum-lines)
```
ansibleのBest Practiceなディレクトリをshellで作る


#課題

[anslible](http://docs.ansible.com/playbooks_best_practices.html#directory-layout)の公式サイトでBest Practiceな構成が公開されているが、１回作ればそんなに変えるもんじゃないから頑張ってディレクトリ作りそう。。だけど、しばらくは変わらないだろうということでベースのディレクトリをただただ作るshellを作成してみた。

#仕様

- BestPracticeをコピペなのでディレクトリ名はほぼ使用できると思いますが、ファイル名は適宜修正してください。
- web/dbはおおよそ必要なのではないかと用意したが適宜追加してください

#作成されるディレクトリ構成
[anslible](http://docs.ansible.com/playbooks_best_practices.html#directory-layout)の公式サイトのままですが、念のため

```dir
.
├── stage
├── production
├── group_vars
│   └── group1
├── host_vars
│   └── hostname1
├── roles
│   ├── common
│   │   ├── files
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   └── templates.j2
│   │   └── vars
│   │       └── main.yml
│   ├── dbtier
│   │   ├── files
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   └── templates.j2
│   │   └── vars
│   │       └── main.yml
│   └── webtier
│       ├── files
│       ├── handlers
│       │   └── main.yml
│       ├── tasks
│       │   └── main.yml
│       ├── templates
│       │   └── templates.j2
│       └── vars
│           └── main.yml
├── site.yml
├── dbservers.yml
└── webservers.yml
```

#スクリプト

```bash:create_ansible_file.sh
#!/bin/bash

# Create ansible Best Practice directory
# http://docs.ansible.com/playbooks_best_practices.html#directory-layout
# 2014/02/19
# version 0.1

CREATE_ROLES_DIR="common webtier dbtier"

echo "# inventory file for production servers" > production
echo "# inventory file for stage environment" > stage
mkdir group_vars
echo "# here we assign variables to particular groups" > group_vars/group1
mkdir host_vars
echo "# if systems need specific variables, put them here" > host_vars/hostname1
echo "# master playbook" > site.yml
echo "# playbook for webserver tier" > webservers.yml
echo "# playbook for dbserver tier" > dbservers.yml

# this hierarchy represents a "role"
for ROLES_DIR in ${CREATE_ROLES_DIR}
do
  mkdir -p roles/${ROLES_DIR}/{tasks,handlers,templates,files,vars}
  echo "# tasks file can include smaller files if warranted" > roles/${ROLES_DIR}/tasks/main.yml
  echo "# handlers file" > roles/${ROLES_DIR}/handlers/main.yml
  echo "# templates end in .j2" > roles/${ROLES_DIR}/templates/templates.j2
  echo "# variables associated with this role" > roles/${ROLES_DIR}/vars/main.yml
done

exit
```

#まとめ

もう少しやりようがあった気がするが。。。ちょっとした手間は省けるかもしれないです。徐々に直していきます。
CentOS: mysql2 gem の install でこけるときの解決法

Rails の Gemfile に mysql2 を指定していたら以下のエラーを発して bundle install がこけた.

```bash
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /var/lib/jenkins/.rvm/rubies/ruby-2.1.0/bin/ruby extconf.rb 
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lmygcc... no
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

## 解決法

mysql-devel をインストールしておく.

```bash
sudo yum install mysql-devel
```

## References

[mysql - Error installing mysql2: Failed to build gem native extension - Stack Overflow](http://stackoverflow.com/questions/3608287/error-installing-mysql2-failed-to-build-gem-native-extension?lq=1)
MS Word で C-l

# Microsoft Word でも Emacs キーバインドを使いたい

普段から Emacs と Microsoft Word を `ALT + TAB` で切り替えて使っています。
Emacs のキーバインドに慣れ親しんでしまっているため、Microsoft Word では
`C-n` に `Selection.MoveDown Unit:=wdLine, Count:=1` と、
`C-p` に `Selection.MoveUp   Unit:=wdLine, Count:=1` と、
簡素な VBA を割り当てています。
本格的には XKeymacs などをインストールすべきでしょうけれども、Microsoft Word 内だけで完結したいこともあって、この程度で済ませています。

# recenter
長らく Emacs の `C-l` (recenter) を再現する VBA が作れずにいましたが、
ふと `Shift + PageDown` `left` `right` の順に打鍵することで recenter に近い動作となるのではと思い立ち、下記の VBA を `C-l` に割り当てました。

```vbnet
Sub recenter()
    Selection.MoveDown  Unit:=wdScreen,    Count:=1, Extend:=wdExtend
    Selection.MoveLeft  Unit:=wdCharacter, Count:=1
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

これで Microsoft Word においても `ctrl` 押しっぱなしの `n` と `l` で文書を眺めることができるようになり、個人的にはずいぶん快適になりました。
[Ruby] %W記法で空文字を入れる


時に便利な%w。

```ruby
x = %w(a b c)
#=> ["a", "b", "c"]
```

空文字が表現できないのかなと思って少し試したら、無理矢理だけど一応できた。

```ruby
x = %W(a b #{} c)
#=> ["a", "b", "", "c"]
```

こっそり%Wが大文字になってるのが反則。
いや、無理にこんな風に書く必要は無いのですが。

ちなみに空白一文字なら、もう少しマシに書けなくもない。

```ruby
x = %w(a b \  c)
#=> ["a", "b", " ", "c"]
```
Pythonで文字列からdatetimeオブジェクトを生成する(Python3.3)


#参考
[8.1 datetime 基本的な日付型および時間型(Python3.3)](http://docs.python.jp/3/library/datetime.html)

#strptime()を使う
文字列からdatetimeオブジェクトを生成するには、strptime()を使う。

##文字列からdatetimeオブジェクトを生成する
```python
from datetime import datetime
>>> t = datetime.strptime('2014/01/01 00:01:02', '%Y/%m/%d %H:%M:%S')
>>> t.strftime('%Y/%m/%d %H:%M:%S')
'2014/01/01 00:01:02'
```

##文字列からdateオブジェクトを生成する
参考URLにもあるように、dateオブジェクトにはstrptime()メソッドがない。よって、**以下の様な方法はだめ。**

```python:これはエラー
>>> from datetime import date
>>> t = date.strptime('2014/01/01', '%Y/%m/%d')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'datetime.date' has no attribute 'strptime'
```

文字列からdateオブジェクトを生成するには、

1. datetimeのstrptime()でdatetimeオブジェクトを生成

2. 生成したdatetimeオブジェクトからdateオブジェクトを生成

という方法をとるのが良さそう。

```python
>>> from datetime import datetime
>>> t = datetime.strptime('2014/01/01', '%Y/%m/%d')
>>> t.isoformat() #この段階では、timeの部分が0で初期化されている
'2014-01-01T00:00:00'
>>> date = t.date()
>>> date.isoformat()
'2014-01-01'
```

##文字列からtimeオブジェクトを生成する
文字列からtimeオブジェクトを生成するのも、文字列からdateオブジェクトを生成するときと同様の方法でできる。

```python
>>> from datetime import datetime
>>> t = datetime.strptime('13:14:15', '%H:%M:%S')
>>> t.isoformat() #この段階では、dateの部分が1900年1月1日で初期化されている
'1900-01-01T13:14:15'
>>> t = t.time()
>>> t.isoformat()
'13:14:15'
```
HipChatとGithub連携

HipChatとGithub連携
http://qiita.com/bohnen/items/0be0a1fff19d51fbceeb

内容が古かったので、一部Updateしました～
2014/02/19時点です(๑╹ڡ╹๑)

## HipChat Auth Tokenの生成
1. HipChatの "Group admin" > "API" を表示
1. Create new token. 
1. 生成されたTokenをコピー

## Github連携（ここが古かった）

### 設定ページに移動

自分のhelloworldページだと以下リンク
https://github.com/sisijumi/helloworld/settings/hooks

![1.png](https://qiita-image-store.s3.amazonaws.com/0/2869/314e039a-9591-bc84-ee75-34c674002ce7.png)

hipchatを選択（アルファベット順）
![2.png](https://qiita-image-store.s3.amazonaws.com/0/2869/4d5ce98a-012b-6795-1f69-fb8f6611a624.png)

選択して、自分が望む通知にチェック
![3.png](https://qiita-image-store.s3.amazonaws.com/0/2869/0043d24d-1b8c-7ebe-fdc8-1d49031cfec9.png)

ここからテスト通知もできますよ～
HomebrewのPHP5.3からRedisに接続してみる。


phpredisのインストール

```
brew install php53-redis
```

```
==> Downloading https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz
######################################################################## 100.0%
==> PHP_AUTOCONF="/usr/local/opt/autoconf/bin/autoconf" PHP_AUTOHEADER="/usr/local/opt/autoconf/bin/autoheader" /usr/local/Cellar/php53/5.3.28/bin/phpize
==> ./configure --prefix=/usr/local/Cellar/php53-redis/2.2.4 --with-php-config=/usr/local/Cellar/php53/5.3.28/bin/php-config
==> make
==> Caveats
To finish installing redis for PHP 5.3:
  * /usr/local/etc/php/5.3/conf.d/ext-redis.ini was created,
    do not forget to remove it upon extension removal.
  * Validate installation via one of the following methods:
  *
  * Using PHP from a webserver:
  * - Restart your webserver.
  * - Write a PHP page that calls "phpinfo();"
  * - Load it in a browser and look for the info on the redis module.
  * - If you see it, you have been successful!
  *
  * Using PHP from the command line:
  * - Run "php -i" (command-line "phpinfo()")
  * - Look for the info on the redis module.
  * - If you see it, you have been successful!
==> Summary

```

インタラクティブシェルを起動

```
php -a
```

確認

```
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->set('hello', 'world');
var_dump($redis->get('hello'));
string(5) "world"
```

インタラクティブシェルを終了

```
quit
```
ストックしてくれる人は偉大という話


##はじめに

`Qiita`というものが流行しているようです。

ちなみに、Qiitaというのは、ココのことです。

私も、たまにQiitaに記事を投稿することがあります｡

コメントはあまり来ませんが､記事をストックされたことはあります。

少しばかりQiitaを使ってきて､今回は､Qiitaについて思っていることを書いていきたいと思います｡

##記事をストックしてくれる人が作るQiita

私が記事をQiitaに投稿するのは、記事をストックしてくれる人がいるからです｡

記事を書いても全くストックされないなら､私は､多分、記事を書いてないと思います｡

ここで、私のような人も一定数Qiitaには存在しているのではないかと推測します。

その意味で､記事をストックしてくれる人がQiitaを作っていると言っても過言ではありません。いや、過言ではないでしょう。

ふとそんなことを考えていると､利益を受け取ってもストックしない人の方が多い中、素直にストックしてくれる人は偉大だなーと思いました｡

自分も､記事を読んだり､役に立ったら素直にストックしていきたい…。

##Qiitaのフォロー

Qiitaには、フォローというシステムが存在します｡Twitterみたいな感じですね。

私の場合､フォローしてくれた人は、できるだけフォローするように心がけています。

なぜなのかというと､私の中では､プログラマの方やQiitaを使っている人というのは､「パソコンができるすごい人」という認識があるからです｡

このようなすごい人達からフォローされたのに､フォローを返さないという選択肢は自分の中にはありません。

そんなこともあり､私の場合､Qiitaでフォローしてくれた人には、フォロー返しするようにしています。

もちろん、フォローについても色々な考えがあり､好きな様にやればいいと思います｡

私のやり方が正しいというわけではなく、Qiitaにも自分に合った使い方がそれぞれにあるはずです。

これは、ストックについても同じことが言えるでしょう｡

しかし、私は今のところ、こんな感じでQiitaを使っています、という話でした｡

##Qiita関連の記事

[プログラマは失敗すべき｜『Qiita』開発者・海野弘成氏と考えるプログラマの幸せ。](http://careerhack.en-japan.com/report/detail/235)

[Qiita「成果が出るチーム思考」の秘密――「飲みでも敬語は崩さない」「議論ありきのリーン開発」](http://team-work.jp/feature/2662.html)
laravel4 websocket実装で注意するポイント

laravel4に限らない話ですが、websocket関連の実装を行うときに
一番はまりやすい問題がロングポーリングではないでしょうか。
websocketを使って何かを実装する場合は、Redisはほぼ必須なのではないかと思いますが、
環境によってはRedisが使えなかったり(物理的に使えないサーバなんてあるんですかね？)
企業にお勤めの方は導入そのものがされていないので使えない！って方も居るかもしれません。
その場合は既存のDBを使用したりすると思いますが、
websocketはリアルタイムでイベントを拾っていくので、
php的には終了させるまで無限ループになっている中で処理を実装する、
とイメージしてみるといいかもしれません。

つまりどういう事かと言いますと、
Databaseを利用する場合は、明確に接続を終了させなければDBが1クエリーずつwaitとなって溜まるので、
あっという間に **Too many connections** になります。

ここでlaravel4で実際に実装していくと気になる点が1つ
disconnect

公式リファレンスにもtoo manyでたらdisconnectしましょう、とあります。

websocketはループで実装するので、disconnectを記載しますが、
実はQueryBuilderだとsleepになって残る様です。

ですのでシンプルなSQLでここは一つ

```php
DB::connection('foo')->select('select * from users where id = ?', array(1));
```

とします。
modelをwebsocket関連でまとめているのであれば、

```php
public function __destruct()
{
    DB::disconnect('foo');
}
```

関係ありませんがweblioによると、わくわくする日本語訳になりますね！
UIWebViewでテキストの矩形選択を無効化する方法

矩形選択を無効化する方法。コピー等のコンテクストメニューも出なくなる。

## CSS

CSSに `-webkit-touch-callout` `-webkit-user-select` をぶち込んでおくだけ。

```html
<style type="text/css">
<!--
* {
	-webkit-user-select: none;
	-webkit-touch-callout: none;
}
-->
</style>
```

## Objective-C+JavaScript

`-stringByEvaluatingJavaScriptFromString:` メソッドによる制御。

```objc
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
```
GitHubでOrganization毎にメールの届け先を変更する

プライベートメールでGitHubに登録しているとOrganizationにアサインされた時にプライベートメールの方にガンガンメールが来てたので調べてみたらオフィシャルにドキュメントがあった。

https://help.github.com/articles/notifications#per-organization-email-routing
実行可能 jar をコマンドっぽく実行するために（java -jar 使いたくない）

実行可能 jar を `java -jar foo.jar` 叩かないで実行する方法の紹介です。

ダルイ点
------------

実行可能 jar を実行する場合こんな感じで実行することが多いと思います:

```bash:sbt_の実行例.sh
$ java -jar sbt-launch.jar
```

* [sbt](http://www.scala-sbt.org/)

これはダルイので、こういうキッカースクリプトを書く:

```bash
$ cat sbt
#!/bin/sh
SBT_OPTS='-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M'
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

$ chmod +x sbt

$ ./sbt
```

* これが sbt 公式が紹介してる方法だったりする: [Setup — sbt Documentation](http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html#unix)

でもこれだと:

```bash
$ ls
sbt  sbt-launch.jar
```

強く依存してる2つの別ファイルができて、どっちか移動したら動かなくなるし、心が不安定になる。

解決方法
-----------

基本は、[シェルスクリプトにファイルを添付する](http://qiita.com/k_ui/items/7ac8f6377740ef3a1ee1) と同じ発想。ただし、`java -jar` が少し賢いので、かなりシンプルにできる。

```bash
$ cat bootstrap.sh
#!/bin/sh
SBT_OPTS='-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M'
java $SBT_OPTS -jar "$0" "$@"
exit $?

$ cat bootstrap.sh sbt-launch.jar > sbt
$ chmod +x sbt

$ ./sbt
$ ./sbt help
```

jar もキッカースクリプトも 1 ファイルに梱包してる `sbt` というファイルができる。`bootstrap.sh` の 4 行目の `exit` もファイル末尾の空行も大切です。 

ちなみにコレは、[jgit](http://www.eclipse.org/jgit/ "JGit") もやっている方法だったりする。

まとめ
---------

個人的に使うなら、ここまでせずとも、別ファイルのキッカースクリプトがあれば十分。

ただ、実行可能 jar を配布する機会がある場合は、こういう形式のファイルも配布すると使い手も快適に使えそう。
CakePHPでモデルの共通処理作成

共通の処理を書くモデルを別途用意して、それを各モデルからインポートする。

```
<?php
App::uses('AppModel', 'Model');

class DrinkModel extends AppModel {
	// 共通の処理
}
```

各モデル

```
<?php
App::import('Model', 'DrinkModel');

class Coffee extends DrinkModel {
	// 個別の処理
}
```

基本的にはこれだけ。
まずは共通の処理を書いていく。
例えば、どのモデルに対しても登録日時createdで降順にfindしたいってことだったら、共通モデルの方に、

```
	public function beforeFind($queryData) {
		$queryData['order'][] = 'created DESC';

		return $queryData;
	}
```

といれておく。Coffeeモデルについてだけは、追加でidで昇順にしたかったら、Coffee.phpの方に

```
	public function beforeFind($queryData) {
		$queryData = parent::beforeFind($queryData);
		$queryData['order'][] = 'id';
		return $queryData;
	}
```

と追加すればいい。コントローラ側からソート順を指定したい、とかだったら、共通モデルの方に、

```
	public $sort = '';
	public function beforeFind($queryData) {
		$queryData['order'][] = 'created　 ' . $this->sort;

		return $queryData;
	}
```

として、コントローラで、

```
	$this->Coffee->sort = 'DESC';
```

とセットしてやればよい。
TextExpander JS（jQuery）の時短


![スクリーンショット 2014-02-19 3.52.40.png](https://qiita-image-store.s3.amazonaws.com/0/5472/782452f5-52b5-7098-baa0-dea046a133b0.png "スクリーンショット 2014-02-19 3.52.40.png")


##ID指定 これが一番良く使うかも
ショートカット → jid

```javascript:jQuery
$(document.getElementById('%|'))
```

##JS書き始め指定
ショートカット → ;jsfunc

```javascript:jQuery
(function(w, $) {
    "use strict";

})(window, jQuery);
```

##jQuery readyイベント
ショートカット → ;jqs

```javascript:jQuery
$(function(){
	%|
});
```




## jQuery読み込み CDN呼び出しのバージョン指定ポップアップ
ショートカット → ;jsjquery 

```javascript:jQuery
<script src="https://ajax.googleapis.com/ajax/libs/jquery/%filltext:name=version:default=1.10.2%/jquery.min.js" type="text/javascript" charset="UTF-8"></script>
<script type="text/javascript">
<!--

-->
</script>
```




##JSフロント書くときによく使う関数
;jsinit 

```javascript:jQuery
%filltext:name=オブジェクト名%.init = function () {

    %filltext:name=オブジェクト名%.setParam();

    %filltext:name=オブジェクト名%.setDom();
    
    %filltext:name=オブジェクト名%.setEvent();

};

%filltext:name=オブジェクト名%.setEvent = function () {
};

%filltext:name=オブジェクト名%.setDom = function () {
};

%filltext:name=オブジェクト名%.setParam = function () {
};

```


・ TextExpanderでFlash埋め込み一発コマンド（SWFObjectCDN付）
http://qiita.com/GENYA/items/2218225e28c5938c6338

・ JSログ吐く用ショートカット
http://qiita.com/GENYA/items/3f4fce544e302a521167
NSThreadで処理を止めると、NSConnectionも止まる

スクリプト言語ばかり触っていたので気づかなかったのですが、NSThreadを使うときの注意をまとめます。

もはやタイトルどおりなのですが、NSThreadを使うとメインのスレッド処理を止めてしまいます。

そこで通信などをメインスレッドで行っているときの処理を待たせる場合は、

```objc
[NSThread sleepForTimeInterval:3];
```

ではなく、

```objc
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
```

で処理を止めると、通信を滞り無く進めつつ、処理待ちができます。
HTMLで縦書きは実現できるか - CSSでの実装とライブラリの活用

# CSSでの実装

## [CSS Writing Modes Level 3](http://dev.w3.org/csswg/css-writing-modes-3/)

さまざまな言語表記法をサポートする仕様。
``writing-mode``プロパティで縦書きを指定できる。


```css
writing-mode: tb-rl; /* IE独自仕様 */
writing-mode: vertical-rl;
-moz-writing-mode: vertical-rl;
-o-writing-mode: vertical-rl;
-webkit-writing-mode: vertical-rl;
```

### 注意点
- IE5.5以降（ただしプロパティ値が独自）
- Google Chrome, Safariは要ベンダープレフィックス
- ``text-decoration:underline``が左側に引かれ、一般的な傍線にならない

※ Opera未確認

### 問題点
- Firefoxでは未だ実装されていない
- 横幅固定のブロック要素でテキスト量に応じた適切な縦幅が確保されない

二点目は分かりにくいので補足して説明する。
通常のウェブサイトでは、ブロック要素の横幅は予め決められていることが大半かと思う。所謂レスポンシブデザインであっても、ブラウザウインドウの横幅以上にはしないはずだ。
ところが、縦書きテキスト量が十分に多い場合、親ブロック要素の左側にはみ出していく。（下図左）

左端まで行が埋まった場合は、ブロックの右端に戻って二段目が始まるというのが、一般的に期待される挙動だろうと思う。そのためには、``column-width``プロパティを使って段組みを指定してやる必要があり、これによって確かに左端まで達した次の行は二段目として右端から開始されるようになる。（下図中央）
だが、親ブロックの高さは段組みされたテキスト全体の縦幅に追随してはくれない。そのために、テキストを格納したブロックの次の要素が、テキストと重なったり無駄な空白を取って配置されるなど、うまくレイアウトされないのだ。

かといって、``height:auto``と設定すると、ブロックの縦幅は中の一文の長さもしくはウインドウ縦幅に依存してしまい、レイアウトしずらくなる。（下図右）

![スクリーンショット 2014-02-26 12.55.05.png](https://qiita-image-store.s3.amazonaws.com/0/31785/f61a922a-75eb-e3dc-ec32-ad38109d90ac.png)

2014/02/26 文章だけでは分かりづらいので図を挿入した。


# JavaScriptライブラリでの実装

## [h2v.js](http://tategaki.info/h2v/)

一行ごとに、一文字分だけの横幅を持つ縦長のブロックに分割して、縦書きを実装。

- ルビ、段組みに対応
- 行の右側に傍線が引ける
- 非営利利用であれば無償、それ以外は有償ライセンス

### デメリット

- 回り込み(float)に対応していない

## [竹取.js](http://taketori.org/js.html)

``writing-mode``プロパティが有効なブラウザはCSSを使用し、
それ以外のブラウザは``transform:rotate``でテキスト全体および一文字ずつを回転させて縦書きを実装。

- Adobe Musa CC に搭載されている
- ルビ、段組みに対応
- 回り込みにも対応
- MITライセンス

### デメリット
- firefoxで余白が出てしまう

## [nehan.js](http://blog.antiscroll.com/nehan.js/)

一文字ごとに``<br>``で区切って実装している

- ルビ、段組みに対応
- 回り込みにも対応
- ページ切り替え機能がつけられる
- 縦書きと横書きを共存させてレイアウトできる
- MITライセンス

### デメリット
- ページ内検索ができない


# 所感
テキスト量が決まっていて、全ブラウザで縦書き表現できなくても良いのであれば、CSSでの実装でも良いかもしれないが、現時点ではライブラリを利用した方が無難。
ライブラリを利用すれば思いのほか手軽に実装できる。
自分用SublimeText2のパッケージメモ

+ BracketHighlighter
 + 開始と終了記号のハイライト

* * *

+ ConvertToUTF8
+ EncodingHelper
	+ SHIFTJISとEUCのため

* * *

+ Goto CSS Declaration
	+ htmlのカーソル位置のIDやclassからcssの位置を検索

* * *

+ Emmet
	+ Emmet

* * *

+ hayaku
	+ cssをさらに補完

* * *

+ InputSequence
	+ 連番
	+ [https://github.com/airosB/sublime-multi-number-input](https://github.com/airosB/sublime-multi-number-input "https://github.com/airosB/sublime-multi-number-input")

* * *

+ Hex-to-RGBA
	+ HEXをRGBAに変換

* * *

+ IMESupport
	+ WindowsのIMEの入力位置を修正(不完全)

* * *

+ Inc-Dec-Value
	+ テキスト中に含まれる数字などを増減する
		ctrl+↑ or ctrl+↓

* * *

+ IndentGuides
	+ インデントに合わせてガイド線を表示

* * *

+ SideBarEnhancements
	+ サイドバーの拡張

* * *

+ SublimeCodeIntel
	+ コードのバリデート

* * *

+ View In Browser
	+ htmlをブラウザで確認する用

* * *

+ SCSS , jQuery , Wordpress
	+ それぞれの言語のシンタックスハイライトやスニペット。

* * *

+ Theme - Nexus

* * *

+ SublimeServer
	+ ローカルサーバをこれだけで起動

* * *

+ GitGutter
	+ 前回のコミットからの編集ポイントを表示
2/19日のJavaScript学習内容

本日の学習内容P96-135

様々なビルトインオブジェクトについて学習しました。
ある程度オブジェクトについて学び、途中からは
Mathオブジェクトの乱数取得メソッドであるrandomと、前回までに学習した
if文等を用いて、
くじ引きのプログラムを作ってみました。
50%でラッシュ（当たり）に入り、その抽選は画面に表示されたボタンを押すことで行われます。
50%の内の13%を引くとカウントダウンが発生します。

まだ途中までしか作成できていないので、もう少し改良して完成させたいです。

一応プログラムはこのような感じになりました。

<!DOCTYPE html>
<html>
<BODY>
 <p><input type = "button" value = "ラッシュ抽選開始" id = "myButton"></p>
 <script>
 var e =document.getElementById("myButton");
     e.onclick = function(){

 var ransuu = Math.random();
   var ran = ransuu*100;
      var ran2 = Math.floor(ran);
    
    
   if(50 >= ran2){document.body.bgColor = 'blue';
     document.write('アンコールモード突入'+ '<br/>'+ '<br/>' + '通常50%');
      }else if(ran2 >50 && ran2 <= 63){
     var i = 16;
         setInterval(function(){
     document.write('ミュージックラッシュまであと'+ i +'秒！おめでとう'+'<br/>'+ '<br/>'+ '突Rush13%');
         i--;
         },1000);
      }else{
     document.write('ミュージックラッシュ突入！'+'<br/>'+ '<br/>' + 'Rush37%');
   }
 }
 
 
 document.write('Rush37%:突Rush13%:通常50%');
    
 </script>
</BODY>
</html>


次回は残りのオブジェクトを終了させ、５章の関数に入っていきたいと思います。
第1回オフラインリアルタイムどう書くJavaでの解答

[Tick-Tack-Toe](http://nabetani.sakura.ne.jp/hena/1/)の解答
実行方法: `java tictactoe/Main < input.txt`

```java:Main.java
package tictactoe;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	//反則だったり、どちらかが勝ったらtrueを返す。
	private static String finished(int[] stage, int i, int pos) {
		if(!isRegal(stage, pos)) {
			return String.format("Foul : %s won.", (i % 2 == 1)?"o": "x");
		} else {
			stage[pos] = (i % 2 == 0)? 1 : 2;
			if(isFill(stage, pos)) {
				return String.format("%s won.", (i % 2 == 0)? "o" : "x");
			}
		}
		return null;
	}
	private static boolean isFill(int[] stage, int pos) {
		int v = stage[pos];
		int x = pos % 3;
		int y = pos / 3;
		boolean a = (stage[position((x + 1) % 3, y)] == v && stage[position((x + 2) % 3, y)] == v) ||
		            (stage[position(x, (y + 1) % 3)] == v && stage[position(x, (y + 2) % 3)] == v);
		boolean b = (stage[0] == stage[4] && stage[4] == stage[8] && stage[4] != 0) ||
				    (stage[2] == stage[4] && stage[4] == stage[6] && stage[4] != 0);
		return a || b;
	}
	private static int position(int x, int y) {
		return x + y * 3;
	}
	private static boolean isRegal(int[] stage, int pos) {
		return stage[pos] == 0;
	}
	private static String game(String inp) {
		// ○: 1, ×: 2
		int[] stage = new int[9];
		char[] chs = inp.toCharArray();
		String msg = null;
		for(int i = 0; i < 9; i++) {
			if((msg = finished(stage, i, (int)(chs[i] - '0')-1)) != null) return msg;
		}
		return "Draw game.";
	}
	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			String line = null;
			while ((line = br.readLine()) != null) {
				String[] a = line.split("\\t");
				if(game(a[1]).equals(a[2])) {
					System.out.println(a[0] + ":" + game(a[1]));
				} else {
					System.out.println(a[0] + ":" + a[1]);
					System.out.println("actual  :\"" + game(a[1]) +"\"");
					System.out.println("expected:\"" + a[2] +"\"");
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

```txt:input.txt
1	79538246	x won.
2	35497162193	x won.
3	61978543	x won.
4	254961323121	x won.
5	6134278187	x won.
6	4319581	Foul : x won.
7	9625663381	Foul : x won.
8	7975662	Foul : x won.
9	2368799597	Foul : x won.
10	18652368566	Foul : x won.
11	965715	o won.
12	38745796	o won.
13	371929	o won.
14	758698769	o won.
15	42683953	o won.
16	618843927	Foul : o won.
17	36535224	Foul : o won.
18	882973	Foul : o won.
19	653675681	Foul : o won.
20	9729934662	Foul : o won.
21	972651483927	Draw game.
22	5439126787	Draw game.
23	142583697	Draw game.
24	42198637563	Draw game.
25	657391482	Draw game.
```
PadrinoでJbuilderを使う


##Jbuilder

JbuilderはJSON用のテンプレートエンジン。
Railsでは標準でインストールされる。

## Padrinoで使う

### インストール
```Gemfile
gem "tilt-jbuilder", ">= 0.4.0", :require => "sinatra/jbuilder"
```

```
$ bundle install
```

### コントローラ編集

```app/controllers/api.rb
 get :match_result do
   @match_result = MatchResult.first
   jbuilder :match_result
 end
```

### jbuilderファイルの作成

```views/match_result.jbuilder
json.teams @match_result.teams
json.score @match_result.score
```

### 出力確認

`http://localhost:3000/api/match_result`にアクセス。

```
{"teams":["シャルケ04","FCバーゼル"],"score":["2","0"]}
```

##参照
* [iub Gist - a2ikm/Gemfile](https://gist.github.com/a2ikm/5072882 'a2ikm/Gemfile')
Capistranoでsudo実行時にttyエラー

Capistranoでデプロイ時にsudoを実行させたいときがある。

その時

```
sudo: sorry,you must have a tty to run sudo.
```

こんなエラーがでてしまってうまくいかない。

これはtty（端末）を持っていない状態でsudoしてるため。
そんな時は/etc/sudoersを編集。

```
$sudo visudo
```

```rb:/etc/sudoers
Defaults requiretty
```

この部分を以下のようにコメントアウト

```rb:/etc/sudoers
#Defaults requiretty
```

もしくは

```rb:/etc/sudoers
Defaults !requiretty
```

しかし特定のユーザーに対して許可することが望ましいので

```rb:/etc/sudoers
Defaults:'対象のユーザID' !requiretty
```
ssh config

個人用メモ。

~/.ssh/config ファイルの設定をしておくと、
SSHログイン時に毎回接続するサーバーの情報を打ち込む手間が省ける。

例えば、こんな感じで書いておくと

```~/.ssh/config
Host server01
    HostName 192.168.1.2
    Port 22
    User username
    IdentityFile ~/.ssh/id_rsa
```

ホスト名だけでSSHログイン可能。

```
$ ssh server01
```

SFTPクライアントでもこの設定のホスト名がそのまま使えたりと便利
Wordpressのフック

忘れないようにメモ

記事公開時の処理を実装
add_action( 'new_to_publish', 'my_function' );
add_action( 'pending_to_publish', 'my_function' );
add_action( 'draft_to_publish', 'my_function' );
add_action( 'auto-draft_to_publish', 'my_function' );
add_action( 'future_to_publish', 'my_function' );
add_action( 'private_to_publish', 'my_function' );
CADisplayLinkを使ったUILabelのアニメーション  


# はじめに  
UILabelで数値をアニメーションしてカウントしたい場合の処理を
CADisplayLinkを使用して実装してみます。

## UILabelサブクラスの作成  

UILabelのサブクラスを作成します。例ではPMAnimationLabelという名前にしました。
そしてアニメーションを実行するメソッド(animationFrom:to:withDuration:)を追加します。  


```objectivec:PMAnimationLabel.h  
@interface PMAnimationLabel : UILabel

-(void)animationFrom:(float)fromValue to:(float)toValue withDuration:(NSTimeInterval)duration;

@end
```

## アニメーション処理の実装

PMAnimationLabel.mファイルにアニメーション処理を実装していきます。

```objectivec:PMAnimationLabel.m  

//プロパティ
@interface PMAnimationLabel()
@property (nonatomic, assign) float startValue,endValue,rate,totaltime;
@property (nonatomic, assign) CFTimeInterval startTime;
@end

@implementation PMAnimationLabel

#pragma mark -- Class Method --

-(void)animationFrom:(float)fromValue to:(float)toValue withDuration:(NSTimeInterval)duration{
    self.startValue = fromValue; //アニメーション開始時の値
    self.endValue = toValue; //アニメーション終了時の値
    self.totaltime = duration; //アニメーションの時間
    
    self.text = [self getTextFromProgress:self.startValue];
    
    //CADisplayLinkの生成とコールバックの登録
    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateValue:)];
    self.startTime = CACurrentMediaTime();
    [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}

#pragma mark -- Private Method --

-(void)updateValue:(CADisplayLink *)link{
    float dt = ([link timestamp] - self.startTime) / self.totaltime;
    if (dt >= 1.0) {
        self.text = [self getTextFromProgress:self.endValue];
        [link removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
        return;
    }
    
    float current = (self.endValue - self.startValue) * dt + self.startValue;
    self.text = [self getTextFromProgress:current];
}

-(NSString *)getTextFromProgress:(CGFloat)progress{
    return [NSString stringWithFormat:@"%i",percentage];
}

@end
```

##アニメーションの実行

PMAnimationLabelを使用したいViewなどに追加してアニメーション用のメソッドを呼び出します。
(frameの設定、addSubView:などの処理は割愛します。)

```objectivec:
PMAnimationLabel *animationLabel = [PMAnimationLabel new];
[animationLabel animationFrom:0 to:100 withDuration:3.0];
```

#終わりに
CADisplayLinkはディスプレイのリフレッシュに同期してRunLoopを発生させるもののようで、
NSTimerと似たような実装が可能ですが、定期的な処理を実行する場合はCADisplayLinkの方が適切なようです。
(ここは自分もよく調べられてないので自信があまりないですが。。。)

#参考資料
* [CADisplayLink Class Reference](https://developer.apple.com/library/ios/documentation/QuartzCore/Reference/CADisplayLink_ClassRef/Reference/Reference.html)
MySQLが突然の死を迎えた時の対処法


まえがき
===

これは、とあるウェブプログラマーがやらかした事件の手記である。

返事がない
===

ある日、Railsでmigrationを書いて、デプロイしたときに、ブラウザ氏からこう言われた。

**502 Bad Gateway**
nginx/1.4.3

**＿人人人人人人＿**
**＞　突然の死　＜**
**￣Y^Y^Y^Y^Y￣**

まったくシャレにならないので、なんとかしよう。

原因を究明しよう
===

まず、原因を探ろう。


よくよく思い出してみると、マイグレーションが重すぎて途中停止してるっぽかった。その頃からアクセスが死んだようにも思える。
ということは、何かの拍子にDBをロックしてしまった可能性が高い。
ロック、聴くぶんには大好きだけどハメられるとすごく辛い。しかも死んでるし。

で、mysqlの`processlist`を確認する。原因となる作業プロセスがいるはずだ。

processlistの探り方
===

基本はUNIXのpsとかとだいたい同じ。アレのSQL版。

```mysql
> show processlist;
| 284788 | tbaba | localhost:33573 | forkwell_dev | Sleep   |    1 |                                 | NULL                                                                                                 |
| 285029 | tbaba | localhost:37715 | forkwell_dev | Query   | 3595 | Waiting for table metadata lock | SELECT  DISTINCT `job_endorsements`.`id` AS t0_r0, `job_endorsements`.`job_id` AS t0_r1, `job_endors |
| 285342 | tbaba | localhost:43623 | forkwell_dev | Query   | 3654 | Waiting for table metadata lock | ALTER TABLE `users` DROP `facebook_identifier`                                                       |
| 285347 | tbaba | localhost:43685 | forkwell_dev | Query   | 3599 | Waiting for table metadata lock | SELECT `users`.* FROM `users`  WHERE `users`.`id` IN (9987, 5353, 8381, 9298, 8885, 9979, 519, 5805, |
| 285350 | tbaba | localhost:43717 | forkwell_dev | Query   | 3566 | Waiting for table metadata lock | SELECT  `users`.* FROM `users`  WHERE `users`.`id` = 298 LIMIT 1                                     |
| 285351 | tbaba | localhost:43725 | forkwell_dev | Query   | 3555 | Waiting for table metadata lock | SELECT  `users`.* FROM `users`  WHERE `users`.`id` = 9920 LIMIT 1                                    |
| 285352 | tbaba | localhost:43726 | forkwell_dev | Query   | 3558 | Waiting for table metadata lock | SELECT  `users`.* FROM `users`  WHERE `users`.`id` = 298 LIMIT 1                                     |
| 285353 | tbaba | localhost:43729 | forkwell_dev | Query   | 3555 | Waiting for table metadata lock | SELECT  `users`.* FROM `users`  WHERE `users`.`id` = 298 LIMIT 1                                     |
| 285354 | tbaba | localhost:43731 | forkwell_dev | Query   | 3553 | Waiting for table metadata lock | SELECT  `users`.* FROM `users`  WHERE `users`.`id` = 9545 LIMIT 1                                    |
| 285355 | tbaba | localhost:43736 | forkwell_dev | Query   | 3544 | Waiting for table metadata lock | SELECT  DISTINCT `job_endorsements`.`id` AS t0_r0, `job_endorsements`.`job_id` AS t0_r1, `job_endors |
```

2行目を見て欲しい。"Waiting for table metadata lock"と書いてある。
metadata lobkについては[ここ](http://dev.mysql.com/doc/refman/5.5/en/metadata-locking.html)を見てもらうことにして、とにかくこいつらをどうにか動くようにしたい。
さっきUNIXのpsとだいたい同じ、と書いたが、まぁ消すときもだいたい同じだ。

```mysql
> kill 284788
Query OK, 0 rows affected (0.00 sec)
```

で、消える。
こいつが原因だったらしく、こいつを消したらその他のロック解除待ちプロセスは一斉に解決されて、待ちプロセスはゼロになった。

あとがき
===

一番良いのはmetadata lockを引き起こさないようなコードを書くことだと思うので、ちゃんとトランザクションとかを意識して書けば良いと思う。
あと、ALTER TABLEには気をつけよう。
titanium でドライなエラーがでたら

Titanium Studio でドライでそっけないエラーがでたら
コマンドラインで

```js
titanium build -p <platform> --legacy
```

とすると、python 版でビルドしようとしてくれて、ログがちゃんとでたりする。
いまの最新は node 版になっててなぜかログがでないようだ。

ちなみに、自分がドライなエラーに出くわした時のエラー原因は、展開したサードパーティーのパッケージのmanifestにあるappidが大文字小文字混じりのものだった時。@ mac os x
複数条件のfor文

C言語のfor文は複数条件で指定できる

条件式が複数の場合
- `||`でつなぐ　→　`or条件`　=> カンマ区切りで指定すると、カンマの左側の条件は無視されるので注意
- `&&`でつなぐ　→　`and条件`

再初期化式でカンマ区切りで指定されている場合は、それぞれの条件が適用される
GroovyのClosureを使ってみる

##はじめに

Groovyは<a href="http://groovy.codehaus.org/Japanese+Closures">クロージャ(Closure)</a>が使える。<br />
クロージャが使えると、RubyとかjQueryでよくやるあの感じ(笑)のコーディングが出来る!

##つかってみる

###スコープ

クロージャはブロックの外側の変数にアクセスすることができる。<br />

```groovy:closure1.groovy
package co.jp.e2info.groovy

a = "xxx"
 
c = {
		a = it
		b = it
		println a
	}
 
 
c("o_o")
 
println a
println b
 
/*
o_o
o_o
o_o
*/
```

###レキシカルスコープ

クロージャが呼び出された場所ではなく、クロージャが宣言されている場所からみたスコープが有効

```groovy:closure2.groovy
package co.jp.e2info.groovy
 
a = "xxx"
 
def c = {
		def a = "x_x"
		return { println a }
	}()
 
a = "xxx"
println a
 
c()
 
/*
xxx
x_x
*/
```

###変数の束縛

クロージャ内で宣言した変数のスコープはクロージャ内のみとなる

```groovy:closure3.groovy
package jp.co.e2info.groovy
 
a = "xxx"
 
def c = {
		def a = "x_x"
		return { println a }
	}()
 
a = "xxx"
println a
 
c()
 
/*
xxx
x_x
*/
```

###本領発揮

必殺！この記法で書くことができると、イテレーションの条件と実際の処理を分離することができる。

```groovy:closure4.groovy
package co.jp.e2info.groovy
 
[1, 2, 3, 4].each({x -> println x})
 
/*
1
2
3
4
*/
```

###総括
便利な機能はどんどん使いましょう
要素のクリックイベントで一部だけ別の動作をさせたいとき

覚え書きがどこに行ったかわからなくなったのでメモ。

##2014.02.20変更しました

- クラス名での指定をattrからhasClassに変更。
- idなど属性を使いたいときを追加。
- 要素名を使いたいときを追加。

##2014.02.21追加しました

- 色々方法があるけど、覚えんのめんどいなら.is(要素)でおk

#クラス名で

```html
<p><span class="icon">ここは別の動作をさせる</span>ここは普通の動作をさせる</p>
```

```js
$("p").click(function(e){
	if($(e.target).hasClass("icon")) {
		//.iconだけ別の動作
		//attr("class")だと複数のクラスのときに動作しないので変更。
	} else {
		//普通の動作
	}
});
```

#属性で

```html
<p><span id="icon">ここは別の動作をさせる</span>ここは普通の動作をさせる</p>
```

```js
$("p").click(function(e){
	if($(e.target).attr("id") == "icon") {
		//#iconだけ別の動作
	} else {
		//普通の動作
	}
});
```

#要素名で

```html
<p><span>ここは別の動作をさせる</span>ここは普通の動作をさせる</p>
```

```js
$("p").click(function(e){
	if($(e.target).get(0).tagName == "span") {
		//spanだけ別の動作
	} else {
		//普通の動作
	}
});
```

#色々方法があるけど、覚えんのめんどい
.is(要素)でおk

```js
$("p").click(function(e){
	if($(e.target).is(要素)) {
		//要素（クラスでも属性でも、要素名でも）だけ別の動作
	} else {
		//普通の動作
	}
});
```
デモ：http://jsdo.it/Ituki/c7k9
OSXに256color対応Screenをインストールする


対象OS：OSX 10.9.1

もともとOSに入っている`screen`はバージョンが`4.00.3`で256色表示に対応していない。



`homebrew`で普通にインストールできるものも`4.00.3`なので変わらず。

fomulaにもよるが`--HEAD`オプションをつけてインストールすることで最新版をインストールすることができる。

```bash
# osに標準で入っているアプリもインストール可能にする
brew tap homebrew/dupes
# `--HEAD`を指定してインストール
brew install --HEAD screen
```

普通は`url`の部分がインストールされるが`--HEAD`オプションがあると`head`がインストールされる。

```screen.rb
require 'formula' 

class Screen < Formula
  homepage 'http://www.gnu.org/software/screen'
  url 'http://ftpmirror.gnu.org/screen/screen-4.0.3.tar.gz'
  mirror 'http://ftp.gnu.org/gnu/screen/screen-4.0.3.tar.gz'
  version '4.00.03'
  sha1 '7bc6e2f0959ffaae6f52d698c26c774e7dec3545'

  head 'git://git.savannah.gnu.org/screen.git', :branch => 'master'

end
```

# 4.2.0にアップグレードする

2014/04/17 v.4.2.0のリリースがアナウンスされました。
http://lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html

前回のインストールでscreenのgitリポジトリは`/Library/Caches/Homebrew/screen--git`に保存されているので、`git pull`でアップデートの上、`brew upgrade`などしてみたけど反映されないので、`brew uninstall screen`して再度インストールしなおしました。
DockerのVolumeのアクセス権限の問題について

Dockerでは -v オプションを用いて、ホストディレクトリをマウントすることができる。

```bash
$ docker run -t -i -v /path/to/host-dir:/path/to/guest-dir your/image /bin/bash
```

ここで、マウントしたディレクトリのアクセス権限は、`uid=1000, gid=1000, 755` となっており、
変更することはできない。

```bash
$ ls -l /path/to/
drwxr-xr-x   1 1000 1000      544 Feb 19 02:23 guest-dir
```
```bash
$ chown root /path/to/guest-dir
$ ls -l /path/to/
drwxr-xr-x   1 1000 1000      544 Feb 19 02:23 guest-dir
```
```bash
$ chmod 777 /path/to/guest-dir
$ ls -l /path/to/
drwxr-xr-x   1 1000 1000      544 Feb 19 02:23 guest-dir
```

つまり、マウントしたディレクトリに書き込めるのは、`root` か `uid=1000` のユーザだけである。

これによって問題になるのは、例えば次のケースである。

* Dockerコンテナ上にMySQLサーバーを構築し、かつデータを永続化する為に、ホストディレクトリを `/var/lib/mysql` にマウントする

ここで、デフォルトの設定のままだと、デーモンの動作ユーザが `mysql` なので `root` か `uid=1000` のユーザに変更する必要がある。

```ini:my.cnf
[mysqld]
# user = mysql
user = 1000 # or root
```
DeployGateでiOSアプリを配布する方法

Androidアプリ配布プラットフォームのDeployGateが、ついにiOSアプリ配布対応されました！
早速使ってみたのでその流れをメモしておきます。
<br/>
まずは[DeployGateのページ](https://deploygate.com/beta_program)でアカウント作成。
Githubアカウントでアカウント作成できるのがcoolでgeekですね。
![スクリーンショット 2014-02-19 12.36.15.png](https://qiita-image-store.s3.amazonaws.com/0/8748/88f503f7-945b-20e7-8c9a-8cfdb91e9cac.png)
<br />
ログインするとダッシュボード画面が表示されるので、左下の「アップロード」ボタンからおもむろにipaファイルをアップロードします。
アップロードボタンはAndroid版と共通なのですね。
![スクリーンショット 2014-02-19 12.34.22.png](https://qiita-image-store.s3.amazonaws.com/0/8748/116de9ed-d917-9371-6ea7-3690fffd26a3.png)
<br />  
すると、登録したメールアドレスにメールが届くので、開発端末でメールを開きます。
メールの中にリンクがあるので、このリンクをsafariで開くと、アプリのインストール画面が開きます。
この時、端末とアプリの配布管理のための構成プロファイルがインストールされていないのでインストールされます。
構成プロファイルインストール後、このリンクもしくは構成プロファイルがインストールされるときに作成されるiPhone上のDeployGateアプリから、先ほどアップロードしたipaファイルがインストールできるようになります。
|![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/8748/8bb49495-5094-11fb-347b-363c4c5bcbad.png)| ![IMG_2715.PNG](https://qiita-image-store.s3.amazonaws.com/0/8748/f70e7d41-42c4-dd3d-41d0-749e3d140434.png) | ![IMG_2716.PNG](https://qiita-image-store.s3.amazonaws.com/0/8748/78f5b586-f00c-9237-29f4-89f8cca64b26.png) |
<br/>
簡単ですね！
<br/>
後は共同開発者を招待し、ガンガン配布しまくりましょう。
[シンプルなコマンドラインツールも提供されており](https://deploygate.com/docs)、Jenkinsから使うのも簡単そうです。

```bash
#dgateコマンドインストール
$curl https://deploygate.com/install.sh | /bin/sh
#ipaのアップロード
$ dgate push k_kinukawa dokusyokanri.ipa 
```

<br/>
多分ハマるところはipaファイルの作成だと思います。
これはGoogle検索すれば色々出てくるのでそちらを参照してください。
ポイントとしては、

- AdHocのprovisioning profileを作成し、Xcodeでアーカイブする際にそれを指定しておくこと
- 作成されたアーカイブをオーガナイザーから「Distribute > Save for Enterprise or Ad Hoc Deployment」でipaファイル作成する

ってところでしょうか。
![スクリーンショット 2014-02-19 13.03.15.png](https://qiita-image-store.s3.amazonaws.com/0/8748/accdc3ac-602c-ce0c-55fa-c9f64a5d98e9.png)
![スクリーンショット 2014-02-19 13.04.07.png](https://qiita-image-store.s3.amazonaws.com/0/8748/33af5891-6ac5-fb99-73cb-e7f677e53081.png)
<br/>
個人的にDeployGateのiOS版は待ち望んでいたので、とても嬉しいです。
個人プロジェクトや次に仕事で立ち上げるプロジェクトでは積極的に使っていこうと思います。

2014/2/27追記
makeコマンド一発でビルド > アーカイブ > deploygateで自動配信　までできたので、[別エントリーに書きました](http://qiita.com/k_kinukawa/items/42c240a9e9e8b6cb4923)。
合わせて読みたい。
git commit --allow-empty を使った WIP PR ワークフロー

先日とある方と開発ワークフローについてお話していて初めて知ったのですが``git-commit``には``--allow-empty``という空の（親コミットと差分がない）コミットを作成できるらしいですね。

僕が今関わっているプロジェクトでは WIP PR を用いたワークフローを取り入れているのですが、この``git commit --allow-empty``を用いるともう一段階快適なワークフローになるかと思ったのでメモがてら書き留めておきます。

## WIP PR って何？

Work In Progress Pull Request の略です。

Github に Pull Request （以下、PR と表記）という機能があるのは皆さんご存知だと思います（知らない方はググってください）し、業務で取り入れている方も多いと思いますが、それを作業途中の状態で出すことを WIP PR と呼びます。

作業途中のトピックブランチを PR することによって

- 早期にコードレビューのプロセスをまわせるので仕様誤認や設計不備があった場合の修正コストが比較的低い
- 修正コストが低いため、レビュワーも気兼ねなく指摘することができる
    - 実装完了後のコードレビューだと「ここはもう少しこうしたほうがいいけど、スケジュールも詰まってるしすぐに問題になることはなさそうだから今回はこれでいいや…」となりがちです
- 作業に着手した段階で PR が作成されるので進捗を追いやすい / 他のメンバーが何をやっているか可視化される

といったメリットがあります。

これについては以前 LT をしたことがありますので（ほとんど同じことしか言っていませんが）そのときの資料をはっておきます。

<iframe src="http://www.slideshare.net/slideshow/embed_code/28061575" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/asuenami/wip-pr" title="Wip prをやってみた" target="_blank">Wip prをやってみた</a> </strong> from <strong><a href="http://www.slideshare.net/asuenami" target="_blank">Akira Suenami</a></strong> </div>

## WIP PR に感じていたモヤモヤ感

WIP PR の説明で「作業に着手した段階で PR が作成される」と書きましたが、これはすごく厳密には正しくなくて実際には「作業に着手した後最初のコミット作成された段階で PR が作成される」が正しいです。コミットがなければ PR は作成できませんので。

これが結構今までモヤモヤしていたことで、

- 最初のコミットまで時間がかかる（詳細設計が必要、等）場合、なかなか PR が作成されない
- （少なくとも最初の）コミットに関連付ける Issue が別途必要になる
    - PR の番号を関連付けたいけど、最初のコミット時点では PR が存在していないためそれはできない

という問題がありました。

もしすべてのコミットが PR に紐づいていればそれ以外の Issue って必要ないなぁと思っていて、PR にコードが関連付いているので議論がしやすいですし、仕様の確認等も WIP PR が作成された後はそちらで行われ、もともとの Issue は形骸化してしまってました。

## 空のコミットで WIP PR を作成する

上記のようなモヤモヤが先日のお話の中で解決してしまいました。たった一言「あれ？Gitって --allow-empty オプションってありましたよね？」と。

空のコミットで WIP PR を作成すればそれ以降のコミットに WIP PR の番号を関連付けることができるため、事実上すべてのコミットが PR に関連付くことになります。これはあとからコミットログを追うことになった場合に大変便利ですね！

まだ実プロジェクトで導入はしてないのですがぜひ試してみたいと思います。
Vimでキーワードにマッチした数を表示

## vim 8.1以降 ([patch 8.1.1270](https://github.com/vim/vim/commit/9dfa3139198b38b28673e251a3756430065914e9)以降)

下記のように[shortmessオプション](https://vimhelp.org/options.txt.html#%27shortmess%27)からSフラグを削除すると、 `/`, `,`, `*`などで検索した際にコマンドラインウィンドウの右隅に`[2/20]`というように`[現在フォーカスしている番号/マッチした件数]`が表示される。

```vim
set shortmess-=S
```

- [shortmessオプションのhelp](https://vimhelp.org/options.txt.html#%27shortmess%27)
- [Sフラグが追加された patch 8.1.1270](https://github.com/vim/vim/commit/9dfa3139198b38b28673e251a3756430065914e9)

## vim 8.0以前

vim8.0以前ではshortmessオプションにSフラグがないようなので、vimでは普通に/で検索してもキーワードマッチした数はわからない。

調べると、以下のコマンドならhogeにマッチした数を表示できる。

```vim
:%s/hoge//gn
```

毎回これを入力するのはめんどうなので、以下を設定すればノーマルモードで/入力時に
\<Cursor>の部分にカーソルがセットされた状態で検索開始できる。

```vim
nnoremap <expr> / _(":%s/<Cursor>//gn")

function! s:move_cursor_pos_mapping(str, ...)
    let left = get(a:, 1, "<Left>")
    let lefts = join(map(split(matchstr(a:str, '.*<Cursor>\zs.*\ze'), '.\zs'), 'left'), "")
    return substitute(a:str, '<Cursor>', '', '') . lefts
endfunction

function! _(str)
    return s:move_cursor_pos_mapping(a:str, "\<Left>")
endfunction
```

http://d.hatena.ne.jp/osyo-manga/20130424/1366800441
http://d.hatena.ne.jp/miho36/20100621/1277092415
「第1回オフラインリアルタイムどう書くの参考問題」をJavaで解く

『[参考問題](http://qiita.com/Nabetani/items/cbc3af152ee3f50a822f)』に対する解答。

- スートは役とは関係ない
- 3Kで4Kになることはない
- 1のときは10

```java:Main.java
package poker;

public class Main {
	private static int toInt(char ch) {
		switch(ch) {
		case '1' : return 10;
		case 'J' : return 11;
		case 'Q' : return 12;
		case 'K' : return 13;
		case 'A' : return  1;
		default:
			return (int)(ch - '0');
		}
	}
	private static int[] toCards(char[] str) {
		int n = str.length;
		int[] cards = new int[n];
		int j = 0;
		for(int i = 1; i < n; i+=2) {
			cards[j++] = toInt(str[i]);
			if(str[i] == '1') i++;
		}
		return cards;
	}
	public static String judge(String str) {
		int[] cards = toCards(str.toCharArray());
		int[] d = new int[14];
		for(int c: cards) {
			d[c]++;
		}
		int[] cnt = count(d);
		int nk = cnt[1];
		int np = cnt[0];
		boolean is3K = nk == 3;
		boolean is4K = nk == 4;
		boolean is1P = np == 1;
		boolean is2P = np == 2;
		if      (is4K)          return "4K";
		else if (is3K &&  is1P) return "FH";
		else if (is3K)          return "3K";
		else if (is2P)          return "2P";
		else if (is1P)          return "1P";
		else                    return "--";
	}
	private static int[] count(int[] d) {
		int n = 0;
		int n3or4 = -1;
		for(int v: d) {
			if      (v     ==  2) n++;
			else if (n3or4 == -1) {
			  if      (v == 3) n3or4 = 3;
			  else if (v == 4) n3or4 = 4;
			}
		}
		int[] r = {n, n3or4};
		return r;
	}
	public static void main(String[] args) {
		System.out.println(judge("D3C3C10D10S3"));// FH
		System.out.println(judge("S8D10HJS10CJ"));// 2P
		String[] Q =
			{"DASAD10CAHA", 
			 "S10HJDJCJSJ",
		     "S10HAD10DAC10",
		     "HJDJC3SJS3",
		      "S3S4H3D3DA", 
		      "S2HADKCKSK",
		      "SASJDACJS10", 
		      "S2S10H10HKD2",
		      "CKH10D10H3HJ", 
		      "C3D3S10SKS2",
		      "S3SJDAC10SQ", 
		      "C3C9SAS10D2"};
		for(String q: Q) {
			System.out.println(judge(q));
		}
		
	}
}
```

スートは関係ないので、カードの種類を整数で区別するようにして、長さ14の配列を使って役を判定。入力の長さがnだったら、たぶんO(n)で判定できる。でも今回はカードは5枚固定なので、ソートを使って、可読性を上げるべきだったかもしれない。
foreignerメモ

使い方がわからなかったのでメモ

## add_foreign_key(from_table, to_table, options)
* options = ハッシュ

|key |説明 |
|:-----------|:------------|
|:name       |キー名        |
|:column     |対象カラム     |
|:depend     | when :nullify then "ON DELETE SET NULL"            when :delete  then "ON DELETE CASCADE"            when :restrict then "ON DELETE RESTRICT"|
|:options|自由入力っぽい|

例）

```migration
def change
  add_foreing_key :table1, :table2, name: :table1_to_table2_fk
end
```

## remove_foreign_key(table, options)
* options = ハッシュのとき

|key |外部キー名 |
|:-----------|:------------|
|:name       |外部キー名（こっちが優先）    |
|:column     |"#{table}_#{column}_fk" |

* options = ハッシュ以外
外部キーがtableとoptionsからきまる。

```
"#{table}_#{table.to_s.singularize}_id_fk"
```

例）

```migration
def change
  remove_foreing_key :table, name: :table1_to_table2_fk
end
```
MySQLでプロセスすべて切る(KILL)

#MySQLでプロセスすべて切る(KILL)

どうしてもプロセスが残って消えない場合。
プロセスをすべて削除したい場合にお使いください。

```
mysql  -e "select concat('KILL ',id,';') from information_schema.processlist where time > 0;" | sed -e '1,1d' | mysql
```
iOSアプリの64bit化について

iOS7で64bit対応したけども、アプリケーション側も64bit対応が今後必須になるのでしょうか？

※現状のappleのガイドラインには特に64bit対応必須の話は記載されてないけど、2014年になってからはまだ更新されてなさそうだし。。
githubをブラウザでフル活用する方法

### commitに移動する
* https://github.com/wantedly/wantedly/tree/****
* branck名でもcommit番号でもtag番号でも大丈夫

### ディレクトリに移動する
* https://github.com/wantedly/wantedly/tree/master/directory_path
* masterをcommit番号などに変更する

### ファイルを表示する
* https://github.com/wantedly/wantedly/blob/master/file_path
* masterをcommit番号などに変更する

### historyを見る
* https://github.com/wantedly/wantedly/commits/master/file_path
* blobをcommitsに変更
* masterをcommit番号などに変更する

### git blameする
* https://github.com/wantedly/wantedly/blame/master/file_path
* blobをblameに変更
* masterをcommit番号などに変更する

### ★commitに関連するissueとpull requestを見つける
* https://github.com/wantedly/wantedly/search?type=Issues&q=query
* queryにcommit番号を指定する
* code画面から/でショートカット

### version間のdiffを見る
* https://github.com/wantedly/wantedly/compare/master...master
* masterはcommit番号を指定する
* https://github.com/rails/rails/compare/master@{1.day.ago}...master
* 日付の指定もできる

### commit historyを人で検索
* https://github.com/rails/rails/commits/master?author=dhh

### ★ショートカットを活用してページ移動
* gc codeの画面に移動
* gi issue画面に移動
* gp pull request画面に移動
* gc + w code画面からbranchを探せる
* s 全レポジトリから検索
* gi + c issueを作成

### ★インクリメンタルファイルサーチ
* https://github.com/wantedly/wantedly/find/master
* code画面で、tでショートカット移動
* masterをcommit番号に変更する

![スクリーンショット 2014-02-19 11.07.39.png](https://qiita-image-store.s3.amazonaws.com/0/4585/ec7901f3-448d-04e6-c880-be6f04de4144.png "スクリーンショット 2014-02-19 11.07.39.png")

### hubを使う
* https://github.com/github/hub
* コマンドラインからgithubにアクセスできる
* git browserとか便利
* commandlineからbrowserのcurrent repogitoryに移動できる

### github-cheat-sheet
* すごく詳しく載っている！
* https://github.com/tiimgreen/github-cheat-sheet

### 最後に
* ショートカットとブラウザのurlの構成を覚えて移動するのは便利！
* blameとcommitsとtreeとblobの4つ覚えれば、どのバージョンのコードでも追えるので、cloneしてコード見なくてもgithubだけで、コード追いやすいです。
* 問題のコードを発見した後に、issueを問題のあったcommit番号でsearchしてどのpull requestでmergeされたか確認。