OmniAICreator/Qiita-1.07M huggingface dataset:
Rails on Tiles(2012.10.20の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの12日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord5railsontiles/ にあります。

```hs
{-# LANGUAGE TupleSections #-}
module Doukaku.Rails (solve) where
import Data.Char (ord, chr)

solve :: String -> String
solve input = go 1 0
  where
    go p d = label p : case move p d of
      Just (p', d') -> go p' d'
      Nothing       -> []
    move p d = fmap (, direct .@. d') (conn p .@. d')
      where
        d'  = panel (input !! p) .@. d

label :: Int -> Char
label = chr . (+ ord 'A')

conn :: Int -> (Maybe Int, Maybe Int, Maybe Int, Maybe Int)
conn n = (wrap x (y - 1), wrap (x + 1) y, wrap x (y + 1), wrap (x - 1) y)
  where
    (y, x) = divMod n 3
    wrap x' y'
      | x' < 0 || 3 <= x' || y' < 0 || 3 <= y' = Nothing
      | otherwise = Just (x' + y' * 3)

direct :: (Int, Int, Int, Int)
direct = (2, 3, 0, 1)

panel :: Char -> (Int, Int, Int, Int)
panel '0' = (2, 3, 0, 1)
panel '1' = (1, 0, 3, 2)
panel '2' = (3, 2, 1, 0)

(.@.) :: (a, a, a, a) -> Int -> a
(n, _, _, _) .@. 0 = n
(_, n, _, _) .@. 1 = n
(_, _, n, _) .@. 2 = n
(_, _, _, n) .@. 3 = n
```

パネルの位置×上下左右で状態を表現し、伴う遷移関数を用意しました。
パネルの位置はアルファベットに対応した整数値で表しており、`conn`は各パネルの上下左右がどこにつながっているか、
`panel`は各パネルの上下左右がそのパネル内のどこにつながっているか、
`direct`は各パネルの上下左右から次のパネルに移ると次のパネルの上下左右のいずれの方向に着くかをそれぞれ表します。
`direct`はほぼ自明なので要らないかもしれないですが、一応定義しました。
`go`の再帰でパネルからはみ出で`Nothing`になるまで回し続けてます。

http://qiita.com/Nabetani/items/0ddde0164a745cd09c34 に他の方の回答もありますので、見ると参考になるでしょう。
RHEL7betaのインストーラーが変わりすぎてて辛い

[download](http://distrowatch.com/?newsid=08203)

RHEL7変更点(未確認)

* kernel 3.x
* ファイルシステムに btrfsが標準対応
* php5.4,ruby2.0,MariaDB,gnome3
* Linux Container対応ということはLXC対応？

![スクリーンショット 2013-12-12 8.05.41.png](https://qiita-image-store.s3.amazonaws.com/0/25728/18908c01-35fe-1b5f-b36f-b52d141e0617.png)

* 最初の画面

![スクリーンショット 2013-12-12 8.06.12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c34a7c8a-ada3-a22a-578b-816c66bb7b69.png)

* Tabキーを押すことでBootオプションを編集できます。`ks`を指定してみました。

![スクリーンショット 2013-12-12 8.07.02.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0dd78153-97a7-443c-ae38-5a21b857a558.png)

* DVDのチェックが始まります。待てない時は`Esc`を押して飛ばしましょう。

![スクリーンショット 2013-12-12 8.07.35.png](https://qiita-image-store.s3.amazonaws.com/0/25728/989bff43-ee23-ba19-ef4e-f758078f8dff.png)

* GUIインストーラー！は好きではないのでここで再起動。`ks`も`kickstart`オプションもありませんでした。


テキストモードインストーラー
-----------

![スクリーンショット 2013-12-12 8.08.26.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6b1cb193-c5a3-974d-8a33-ffd51da6dcb9.png)

* おもむろに`text`を追加して起動

![スクリーンショット 2013-12-12 8.09.11.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2cd24fd2-3a10-c521-dbac-30b6eb747e02.png)

* VNCサーバーかtextmodeか選択が出ました。

![スクリーンショット 2013-12-12 8.10.11.png](https://qiita-image-store.s3.amazonaws.com/0/25728/31719b5f-3f79-4285-4635-08c8dae43bbd.png)

* メニューが出てきた・・・

anaconda-ks.cfg
-----------------

* rootのpass = vagrant
* user/pass = vagrant/vagrant
* フォーマット = btrfs

```bash:
#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512

# Use CDROM installation media
text
cdrom
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=jp106 --xlayouts='jp'
# System language
lang ja_JP.UTF-8

# Network information
network  --bootproto=dhcp --device=p2p1 --onboot=off --ipv6=auto --activate
network  --hostname=localhost.localdomain
# Root password = vagrant
rootpw --iscrypted $6$dAG/OzfhNwLgFXR1$uyNWOxBSvhq3/pwcSWN6VFxws2DzUVtyO9cb.BjLJ44WhH9dc/Bd9rxHhVbIfHwkcUNMBxAmTtn62YGfNLA/5/
# System timezone
timezone Asia/Tokyo --isUtc
user --groups=wheel --name=vagrant --password=$6$TfckZW8ezCdpV/B7$DVdWkh72hvP8AAhaiKqJQbKmkoeveTW7bYVMm7SITKqDR9YFY3Rsgc94v0MUlZZdP33iP026FW6xBUGEUYWOt. --iscrypted --gecos="vagrant"
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
autopart --type=btrfs
# Partition clearing information
clearpart --none --initlabel

%packages
@core

%end
```

あと、[VirtualBoxのkernel moduleの作成に失敗](https://forums.virtualbox.org/viewtopic.php?f=3&t=59094)します。
Mojo::Homeの挙動を探る

今朝、といってもこれを書いているのは12日の早朝なのですが.. Mojolicious **4.60** がリリースされ **CPANにおいてのリリースオーサーがMarcus Ramberg氏** になっていてちょいと驚いている僕です。まーPOD見るとProject Founderのはいつも通りのSebastian Riedel氏なので特に内紛があったとかそういうのじゃないでしょうねｗ そこらの事情に詳しい人いましたら是非Advent Calendarを書いていただきたいです。

**追記**

miyagawaさんからこんなツイートを頂きまして... ようはリリースオーサーが変わることは特に目新しいことじゃない！とのことですね。

> @yusukebe there were released made by one of core developers in the past, nothing new.

===

さて、MojoliciousのWebアプリに限らず **そのプロジェクトのトップ＝いわゆるホームディレクトリ** へのパスを取得して *ごにょごにょ* したいという要望は結構あります。例えば、前日・前々日と

- [Mojolicious - 設定ファイルがない場合の代替手段と簡易メンテページ](http://qiita.com/azumakuniyuki/items/23cc6b090fc72cc0eb10)
- [Mojolicious - 250万ダウンロードアプリを支えるBokete.pmを覗く](http://qiita.com/yusukebe/items/c4d67b49f1deac5a4a80)

という記事が本Advent Calendarで投稿されたのですが、本文中のコード中にそれぞれ違うやり方でプロジェクト・ホームへのパスを探っています。前者はPath::Classを使った方法、もう後者はAmon2::Utilを模倣しFile::Specを内部で利用しています。こうしたやり方はMojo/Mojoliciousネームスペースに依存しないという意味ではよいかと思われます。が、ある程度自作しているので、もしカジュアルに使うとかMojo/Mojoliciousの機能をフルに使いこなしたい場合は **Mojo::Home** というその名もズバリなモジュールがMojoliciousディストリビューションの中に同封されMojolicious.pmなどで使われています。その挙動に興味があったのでソースコード見ながら使ってみました。

例えば、LiteでないMojoliciousアプリをつくってControllerの中で呼んでみましょう。プロジェクト・ホーム直下の **log** ディレクトリのへのパスを取得するには以下のコードでまかなえます。

```pl:lib/MyApp/Web/Example.pm
package MyApp::Web::Example;
use Mojo::Base 'Mojolicious::Controller';
use Mojo::Home;

sub welcome {
    my $self = shift;
    my $home = Mojo::Home->new();
    $home->detect( ref $self );
    my $log_dir = $home->rel_dir('log');
    $self->render( text => "project directory is '$log_dir'" );
}

1;
```

Mojo::Homeモジュールのインスタンスで `detect` メソッドを一度発行するのですが、その際に呼び出し元のパッケージ名を `ref` 関数で取得して渡しているのがポイントですね。一度 `detect` メソッドを実行したら `rel_dir` などで相対パスをこの場合「log」と指定して `log` ディレクトリへのパスを **キチンと** 取得しています。

ちなみにController以外の場所でも `use Mojo::Home` してパス解決をさせることは可能です。

```pl:lib/MyApp/Logic/SomeThing.pm
package MyApp::Logic::SomeThing;
use Mouse;
use Mojo::Home;
use Cwd qw/abs_path/;

sub project_dir {
    my $self = shift;
    my $home = Mojo::Home->new;
    $home->detect( ref $self );
    my $project_dir = $home->rel_dir('.');
    return $project_dir;
}

__PACKAGE__->meta->make_immutable();
```

無駄にMouseを使っていますがｗ `project_dir` メソッドを実行すると今回はプロジェクト・ホームへの絶対パスを文字列で得ることが出来ます。

ちなみに、と、いいますが… **もっと早く言ってくれよ！** って感じかも知れませんが、 **Mojolicious.pm** のメソッドに `home` というのものがありそれを使うのが一番短く楽に書けるので、実際はそうしましょう。Controllerから呼び出す場合は

```pl:lib/MyApp/Web/Example.pm
package MyApp::Web::Example;
use Mojo::Base 'Mojolicious::Controller';

sub welcome {
    my $self = shift;
    my $log_dir = $self->app->home->rel_dir('log');
    $self->render( text => "log directory is '$log_dir'" );
}

1;
```

これだけでOK！

で、本来ならソースコード見たのでもう少しネタはありますが、内部実装の話になっちゃうのでこの程度にとどめておきます。まーControllerや `MyApp::Web` からならば使う機会はありそうですよね！！
unixコマンドの戻り値は

unixコマンドの戻り値は、`$?`変数に入る。
これを、スクリプトでの条件分岐に使えます。

    # 行頭が'E'+数値で始まる行があるかをgrepで調べる
    grep -E '^E[0-9]+' test.txt

    # grepの戻り値$?の評価。 grep戻り値 0:一致した 1:一致しなかった
    if [ $? -eq 0 ]; then
     一致したときの処理
    else
     一致しなかった時の処理
    fi
Macでwindowを切り替える


Macでタブを切り替えるのは`cmd+tab`ですが、開発とかをしてるときに同じアプリでもwindowがいくつも開いていて、切り替えたい、なんてこともあると思います。

そのためのアプリなどもあるのですが、実はデフォルトの機能でできます。


`Preference`からキーボード→キーボードショートカット

<img src="https://qiita-image-store.s3.amazonaws.com/0/5767/d0ed11de-e1b2-8469-c4ec-030531b27f42.png" width="600px">


このなかの、`次のウィンドウを操作対象にする`というやつですね。

ボクは`option+tab`にしています、`cmd+tab`と近くて操作しやすいので。
jsx-linker

`jsx-linker` というのは、JSXが生成するJavaScriptを後処理して、いろいろごにょごにょするツールです。将来的には他に吸収されて消えてなくなるかもしれないけど、安定するまではガンガン変更できるように独立したツールとして作りました。「コンパイルの後はリンカーだよねjk」ということでlinkerという名前にしたけど、何もリンクはしません。できることは、いろいろな環境用の起動用コードを追加したり、export部を拡張したり、といった感じです。

内部的には[esprima](http://esprima.org/)を使ってJSXコンパイラで生成されたJSをパースして情報を収集し、JSXの出力したJSコードや収集した情報を[hogan.jsx](https://npmjs.org/package/hogan.jsx)のテンプレートに渡すという仕組みになっています。テンプレートを書けばいろんな処理を追加できるようになっています。JSXで `--minify` をしていても問題なく動くようになっています。

# export強化系テンプレート

commonJS, AMD, Closure Compilerに対応したモジュールを生成するテンプレートがそれぞれ用意されています。あとは、小規模開発で、 `JSX.require` でアクセスするのもめんどいみたいなケースで使えるような「全部Global名前空間に登録」というのもあります。

こんな感じの超絶複雑なロジックが実装されたJSXコードがあったとします。超絶複雑なため、型情報を使って安全にプログラミングできるJSXを使って実装しました。

```js:fib.jsx
__export__ class Fib {
    static function calc(value : int) : int {
        if (value < 3) {
            return 1;
        }
        return Fib.calc(value - 1) + Fib.calc(value - 2);
    }
}
```

コンパイルして `fib.js` を作ってみましょう。

```shell-session
$ jsx --release --minify --output fib.js fib.jsx
```

つぎに、node.jsからこの超絶複雑なロジックを利用できるようにcommonJS形式に変換してみます。

```shell-session
$ npm install -g jsx-linker
$ jsx-linker -t commonjs-lib -o fib-node.js
```

これで、node.jsからも使えるようになります。

```js
var Fib = require('./fib-node').Fib;

console.log(Fib.calc(10));
```

JSXの標準入力とくっつけて一行で実行することもできます。

```shell-session
$ jsx --release --minify fib.jsx | jsx-linker --stdin -o fib-node.js
```

export強化系で使えるテンプレート名は以下のとおりです。

* `commonjs-lib`
* `closure-lib`
* `amd-lib`
* `export-global`

イケイケなビルドツールのgrunt-jsxを使っている場合は、 `linker`というオプションに `commonjs-lib` などの文字列を渡すと、jsx-linkerも一緒に実行します。

# WebWorker

[今後JavaScriptのモジュール化はWebWorkerになっていく](https://gist.github.com/uupaa/6290853)という意見もあるように、今後有望なのがWebWorkerでしょう。ただし、Chromeの開発者ツールを使っても値が見られなかったりデバッグが難しいということもあり、JSXで開発すると多くのバグをコンパイル段階で潰せて幸せになれます。それにくわえて、フロントエンドのライブラリがあまり充実していないというJSXの欠点も、WebWorkerでは問題になりません。

先ほど作った超絶複雑なロジックをWebWorker側に持ってきて、ブラウザの負担を軽減しましょう。

```js:fib-worker.jsx
import "js/web.jsx";
import "webworker.jsx";
import "fib.jsx";

class _Main
{
    static function main(argv : string[]) : void
    {
        // called when loading.
    }

    __export__ static function onmessage (event : MessageEvent) : void
    {
        self.postMessage(Fib.calc(event.data as int));
    }
}
```

このコードをビルドする時は、[JSXのプロジェクトをすばやく作る 〜 jsx-init](http://qiita.com/shibukawa/items/0856463c313894d59b0a)で紹介したjsx-initでWebWorkerプロジェクトを作るのをおすすめします。WebWorkerプロジェクトであれば、`$ grunt build` でビルドできます。

自前でやる場合は、npmで `webworker.jsx` をインストールしてください。あとビルド時に`webworker.jsx` というファイルが読めるように `--add-search-path` を追加する必要があると思います。jsx-linkerの `-t` に渡す文字列は `webworker` です。

# それ以外

ngcore(mainという関数がシステムから呼ばれる→_Main.mainにフォワード)、extjs-app(Ext.deferを使ってExt.jsの初期化が終わったら_Main.mainを起動)がすでにあります。

そのうち、Chrome Appsを追加しようと思っていますが、特定のハンドラがシステムから呼ばれる系はテンプレートをちょっと書くだけですぐに対応できます。

最近はマクロ言語としてJavaScriptやECMAScriptが使われることが多くなっていますが、どのような環境がきてもjsx-linkerがあればJSXが使えるようになります。
同期FIFOと非同期FIFO

#同期FIFOと非同期FIFO
やっつけ仕事ですみませんが、FPGAの部屋のブログ記事の中から”同期FIFOと非同期FIFO”の記事を紹介します。
この記事は、Spartan3A Starter KitのDDR2 SDRAMコントローラを作っている時に、DDR SDRAMのCASをWriteクロックとして使用する非同期FIFOを使いたいという要求が発端でした。XilinxのCoregenで生成できる非同期FIFOは非同期リセットが出来なかったので、自分でHDLで作ることにしました。その時に構造を考えていまして、ブロック図の覚書として書いたのがこのブログ記事です。
http://marsee101.blog19.fc2.com/blog-entry-1085.html
laravel4でモデルクラスのコンストラクタを拡張したいとき

# 書き方
```php:MyModel.php
   public function __construct($attributes = array(), $exists = false)
   {
      parent::__construct($attributes, $exists);

      // ここに自分のコードを書く
   } 
```


# 補足
継承する実際の処理は
https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php
の下記の部分。

``` php:Model.php
public function newInstance($attributes = array(), $exists = false)
```
hotmail系をPOP受信するのにMS公式情報で上手くいかない場合メモ


はい。
どうしてもandroidスマホのEメールアプリでhotmail系をPOP受信しなければならない事情があったのですが、MS公式情報では上手く行かなかったので色々試して成功した登録内容のメモを

[http://windows.microsoft.com/ja-jp/windows/outlook/send-receive-from-app](http://windows.microsoft.com/ja-jp/windows/outlook/send-receive-from-app)
・・・MS公式情報の転載・・・
受信 (POP3) サーバー

サーバー アドレス: pop-mail.outlook.com

ポート: 995

暗号化された接続: SSL

送信 (SMTP) サーバー

サーバー アドレス: smtp-mail.outlook.com

ポート: 25 (25 がブロックされている場合は 587)

認証: はい

暗号化された接続: TLS

ユーザー名: メール アドレス

パスワード: パスワード

メールをメール アプリにダウンロードした後も、Outlook.com の受信トレイからメールが削除されないようにする場合は、[サーバーにメッセージのコピーを置く] オプションをオンにします。

・・・転載ここまで・・・

はい。アカウントの設定でPOP受信可にしてることは大前提です。はい。

多分上手くいかない(いかなかった)のはSMTPの方の設定です。
サーバーアドレス：smtp.live.com
ポート：587
セキュリティ：STARTTLS
ログイン必要：ON
下の欄はメアドとpassword

を試すとうまくいくかもしれないです。
smtp.live.com は表向き？は動いてないはずっぽいので、この設定を行うことでメール消失などの不具合も起きる可能性あります。
大事なメールが来るアドレスなどではこの設定は止めたほうが良いと思います。
Git でリモートのいらないブランチとタグを丸ごと消し去る

例えば GitHub でそれなりに大きなリポジトリを Fork して master のコードをちょちょっと弄りたいとします。

Fork で元のリポジトリのすべてのブランチとタグがコピーされますが、私が欲しいのは master だけでそれ以外のブランチもタグも必要ありません。

## Clone する

GitHub で Fork したリポジトリを clone します。私はいわゆる PHPer なので php-src の Fork を使います。

```console
$ git clone git@github.com:ngyuki/php-src.git -b master --single-branch
```

master 以外は要らないので `-b master --single-branch` で master だけ clone します。


この時点でローカルブランチは master しかありません。

```console
$ git branch
* master
```

タグは master ブランチまでの経路上にあるものが clone のときに付いてきます。

```console
$ git tag
NEWS
php-5.3.23RC1
php-5.4.4RC2
```

## リモートのブランチを消し去る

`git push --prune <remote> <refspec>:<refspec>` で、ローカルに存在しないリモートのブランチを消し去ります。

```console
$ git push --prune origin "refs/heads/*:refs/heads/*"
```

`--prune` は、ローカルにあってリモートに存在しないブランチを削除するオプションです。

`<refspec>:<refspec>` は `<local>:<remote>` の形式です、ローカルの `refs/heads/*` をリモートの `refs/heads/*` に push する、という意味です。

refspec の代わりに `--mirror` を指定しても概ね同じですが、`--mirror` だと `refs/remotes/origin/*` まで push されてしまって不都合です。

## リモートのタグを消し去る

次はタグを消し去ります。

master にくっついて幾つかのタグがローカルに作られているので、ブランチを消したときと同じ手順だとそれらのタグが残ってしまいます。

なので、存在しない ref を指定してリモートのタグをすべて消し去ります。

```console
$ git push --prune origin "refs/dummy/*:refs/tags/*"
```

ローカルのタグはそのまま残っているので、`git fetch --prune --tags` で消し去ります。

```console
$ git fetch --prune --tags origin
```

## タグを消し去る（別の方法）

ローカルのタグをすべて消してから `git push --prune --tags` の方が手っ取り早いかもしれません。

```console
$ git tag | xargs git tag -d
$ git push --prune --tags origin
```

`--tags` は次のように指定しているのと大体同じです。

```console
$ git push --prune origin "refs/tags/*:refs/tags/*"
```

## やっぱ戻したい

upstream からブランチやタグを引っ張ってきて、追跡ブランチやタグを自分のリモートリポジトリに push すれば OK です。

```console
$ git remote add upstream https://github.com/php/php-src.git
$ git fetch upstream
$ git fetch upstream --tags
$ git push origin "refs/remotes/upstream/*:refs/heads/*"
$ git push origin --tags 
```

## さいごに

push する前に `-n` で何が起こるかを確かめてからやった方が良いです。
Xamarin に Reactive Extensions を導入する


昨日の [ポスト](http://qiita.com/amay077/items/49681b2de5d8cf208112) を使ったのに、肝心の導入部分を説明するのを忘れていました。まあ Components から追加するだけなのですが。他のアドベントカレンダーとの掛け持ちで疲れたので、今日は軽く書いて済ませます。

## Reactive Extensions を導入する

Components で右クリック → Get more components → Reactive とかで検索 → 見つけたら Add to App で OK です。あ、この手順は .iOS でも .Android でも同じです。

![](http://blog.amay077.net/assets/images/posts/install_rx_to_xamarin_ios_01.gif)

## 使ってみましょうか

イベントを Stream に変換する例を示してお茶を濁します。

まずこんな感じのどうでもいい画面を用意しまして、

![](http://blog.amay077.net/assets/images/posts/install_rx_to_xamarin_ios_02.png)

``UIButton.TouchUpInside`` を ``IObservable`` に変換する拡張メソッドを用意します。

```csharp:UIButtonExtensions.cs
public static class UIButtonExtensions
{
    public static IObservable<string> ClickAsObservable(this UIButton button)
    {
        return Observable.FromEventPattern(
            h => button.TouchUpInside+=h, 
            h => button.TouchUpInside-=h)
        .Select(e => ((UIButton)e.Sender).TitleLabel.Text);
    }
}
```

### 2014.5.14 追記

``Observable.FromEventPattern<EventArgs>(button, "TouchUpInside")`` このメソッドは、iOS の実機で動作しません。詳しくは、[Xamarin.iOS で FromEventPattern を使うときの注意点](http://qiita.com/amay077/items/3a6f50cede3425fc9f3f) で書きましたが、実機では AOT のためリフレクションが使えないからです。
代わりに、 += と -= の delegate を引数に取るオーバーロードを使います。

### 追記ここまで

で、こんなコードを書きます。

```csharp:MainViewController_amb.cs
public override void ViewDidLoad()
{
    base.ViewDidLoad();

    Button1.ClickAsObservable()
        .Publish(_ => 
            Button2.ClickAsObservable()
            .Amb(
                Button3.ClickAsObservable()))
        .Subscribe(btnName => InvokeOnMainThread(() => 
            Label1.Text = btnName + " Clicked"));
}
```

### Observable.Amb (先にきた値を流す)

Button1 を押すと処理の開始です。
Publish で分配して **Amb** は Button2 のクリックと Button3 のクリックで先に行われた方を Label1 に表示します。

### Observable.Zip (どちらの値も待つ)

Amb を Zip に変えてみます。

```csharp:MainViewController_zip.cs
    Button1.ClickAsObservable()
        .Publish(_ => 
            Button2.ClickAsObservable()
            .Zip(
                Button3.ClickAsObservable(), (l,r) => new {l, r}))
        .Subscribe(p => InvokeOnMainThread(() => 
            Label1.Text = p.l + " and " + p.r + "Clicked"));
```

Zip は2つのシーケンスの結果を待ってから後続へ流します。
なので、Button2 と Button3 の両方が押されると、Label1 に表示されます。

どちらもフツーに書くとフラグ変数なんか使って実現すると思うんですけど、Rx を使うと読みやすいコードになると思います。

あと、私は Android-Java の開発では [reactive4Java](https://code.google.com/p/reactive4java/) を使ってるんですが、あれには ``Observable.FromEventPattern`` が無い(Java のイベントの Listener はイベントのマルチキャストに対応してないから仕方ない)ので、Xamarin にすることで「完全な」Rx を使うことができて、こりゃ勉強のしがいがあるなあと思ったのでした。

何の記事でしたっけ？という感じですけど Xamarin なら Linq も Rx も使えてハッピーという事で、今日は以上です。
iOSでアプリを削除してもデータを保持する方法


## 概要
`Keychain Services`というとパスワードを保存する仕組みだと思われる方が多いと思います。
実際にそうなのですが、Keychainに保存した情報は`NSUserDefaults`と違ってアプリを削除した後もデータを保持することができるという別のメリットがあります。
(Keychainの事を知らない人は[こちら](http://cocoadays.blogspot.jp/2011/02/ios-keychain-services.html)にとても分かりやすい説明が書いてあります)

そういった要件があるときに`NSUserDefaults`のように簡単にデータを保存するライブラリがあったらいいなと思ったら既に作ってる人がいました。
[LUKeychainAccess](https://github.com/TheLevelUp/LUKeychainAccess)という名前のライブラリです。

`Keychain Services`は`NSUserDefaults`と違い、気軽に使うにはちょっと面倒な仕組みなのでとてもありがたいです。

#### 追記：
iOSのバックアップを暗号化していない場合はキーチェーンの内容はバックアップされません。
機種変更の時などに初期化されてしまう環境もありますので、その辺も踏まえて利用しましょう。
> [takayamaさん](http://qiita.com/takayama)、ご指摘いただきありがとうございます。

## 使い方

`Security.framework`をターゲットに追加してください。
次にソースをダウンロードしましょう。

https://github.com/TheLevelUp/LUKeychainAccess

ダウンロードしたソースコード内の`LUKeychainAccess`ディレクトリごとプロジェクトにコピーして、
`LUKeychainAccess.h`ファイルをインポートしましょう。

使い方もとてもシンプルで`NSUserDefaults`とほぼ同様の使い方でデータを扱えます。

#### データの保存
```objc
// integer
[[LUKeychainAccess standardKeychainAccess] setInteger:1 forKey:@"integerKey"];
// float
[[LUKeychainAccess standardKeychainAccess] setFloat:1.0 forKey:@"floatKey"];
// double
[[LUKeychainAccess standardKeychainAccess] setDouble:1.0 forKey:@"doubleKey"];
// BOOL
[[LUKeychainAccess standardKeychainAccess] setBool:YES forKey:@"boolKey"];
// NSString
[[LUKeychainAccess standardKeychainAccess] setString:@"string" forKey:@"stringKey"];
// NSObject
[[LUKeychainAccess standardKeychainAccess] setObject:@"object" forKey:@"objectKey"];
```
セットした値はすぐに保存されます。

#### 保存したデータの読み込み
```objc
// integer
NSInteger integerValue = [[LUKeychainAccess standardKeychainAccess] integerForKey:@"integerKey"];
// float
float floatValue = [[LUKeychainAccess standardKeychainAccess] floatForKey:@"floatKey"];
// double
float doubleValue = [[LUKeychainAccess standardKeychainAccess] doubleForKey:@"doubleKey"];
// BOOL
BOOL boolValue = [[LUKeychainAccess standardKeychainAccess] boolForKey:@"boolKey"];
// NSString
NSString *stringValue = [[LUKeychainAccess standardKeychainAccess] stringForKey:@"stringKey"];
// NSObject
NSString *objectValue = [[LUKeychainAccess standardKeychainAccess] objectForKey:@"objectKey"];
```
と正に`NSUserDefaults`と同じ使い勝手でした。
エクスプローラーでgit! (windows 7)

## こんなときに(｀・ω・´)
+ 普段はGUIでgit使ってるんだけど、バカにしないでくれる？ `git init` くらい知ってるわよ!
+ windowsで`.gitignore` ファイル作るの超めんどくさい・・・

## 準備
+ `git` コマンドのパスを通す

## やり方
+ エクスプローラーを立ち上げる
+ git で管理したいフォルダを開く
+ アドレスバーに移動する
+ アドレスバーにおもむろにコマンドをうつ
    + `git init`
    + `cmd /c type nul > .gitignore`
        + .gitignore を編集する
    + `git add .`
    + `git commit -m "ふぁーすとこみっと"`

## 補足
もう少し細かいことをやりたいときは、アドレスバーにうつコマンドを
`cmd`
にして普通にコマンドプロンプトから色々やるといいかと思います！

以上、簡単ですが1分で実現できる有用な技術のご紹介でした！

## この技が使えるOS
windows7 64bit でしか確認していませんが、おそらくXP以降ならできるのではないかと思います。
tc2.3.1 で Windows でネットワークなしだったりpackage.el通らないproxyがはだかる環境でのTCインストール失敗篇

せっかく作ったけどちゃんと動いてない。
bushu.index2 と bushu.expand の扱いあたりが変だけど原因が分からない。

あと作っていて気付いたが tcode-init-file-name のファイルが存在していないとダメみたい。
`emacs.exe -q -batch -l foo`
だと foo が emacs の HOME にないと動かないとか何それ! 動きちがくない? (*1)

使い方:
1. githubからzipでダウンロードする。
2. tc-master.zip を展開
3. https://gist.github.com/naghbIQtIqHom/7911699 の中の3ファイルをtc-masterのフォルダトップに作る。
4. んで次を実行する。
 gnupack を C:\gnupack_basic-11.00 に入れて使う場合。
 Emacs for Windows でもフォルダ位置ぐらいしか気にする所はないので、インストール先に合せて変更する。
 何も設定しないとC:\Users\youraccount\tc に作っちゃう。

```
cd tc-master
set EMACS=C:\gnupack_basic-11.00\emacs.exe
set LISPDIR=C:\gnupack_devel-11.00\app\emacs\site-lisp\tc\lisp
set DATADIR=C:\gnupack_devel-11.00\app\emacs\site-lisp\tc\tcode
install.bat
```

これでWindowsで楽々tcode設定のはずが、もくろみははずれ、時間ばかりが過ぎる。
部首辞書作ってるの失敗したり、部首合成するたびに再構成始めたり。 orz

手でコピーして .tc も手で入れた最初のやつはちゃんと動いているんだが、何が違うのかさっぱり分からない。それも半年以上前なので手順とか思い出せない。

--------
(*1)
どうやらこれはgnupackの
<インストールフォルダ>\emacs.exe
<インストールフォルダ>\app\emacs\emacs\bin\emacs.exe
どっちを呼ぶかによって異なる。
`~/`が異なるし `princ` の動作も異なる。
アプリからGalalleyに行くためだけのIntent

androidで画像を保存してから
Galalleyに行く **だけ** なんですが、どれを見ても画像を取得する処理をしてる
記事しかなかったです
3時間くらい探したんですが一切見つからずorz

あんまりやる人いないんですかね…

``java
Intent intent=new Intent();
intent.setAction(INTENT.ACTION_VIEW);
intent.setData(Uri.parse(MediaStore.EXTRA_OUTPUT));
``

こんな感じで行けました。
多分これで行けるはず
PhpStormで画面分割しまくる


VimやEmacsの文化の人や乗り換えてきた人は、エディタ内で画面を分割したい場合も多いと思います。
PhpStormにも同様にデフォルトで画面分割があります。

![KeywordFetchShell__vexus2_の競合コピー_2013-12-07_.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/cea86162-c9c1-ac51-1c3b-55fb4e5464e2.png "KeywordFetchShell__vexus2_の競合コピー_2013-12-07_.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png")

こんな感じで、際限なくエディタ内で画面を分割出来ます。

ショートカットはここらへんです。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/222/20074/7600cc06-acfe-6f06-aafd-20f6d2c47291.png "Preferences.png")

- Split Vertically
現在カーソルの位置がある画面を縦に分割して開く

- Split Horizontally
現在カーソルの位置がある画面を横に分割して開く

- Change Splitter Orientation
現在カーソルの位置がある画面に隣接した画面の縦横を入れ替える

- Unsplit
現在カーソルの位置がある画面の"次の画面"を閉じる

- Unsplit All
現在カーソルの位置がある画面以外をすべて閉じる

- Goto Next Splitter
現在カーソルがある画面の次の画面にカーソルを移動する

- Goto Previous Splitter
現在カーソルがある画面の前の画面にカーソルを移動する

こんな感じの機能があります。使いそうだなと思った機能には個別でショートカットを割り振ると良いと思います。自分はUnsplit All以外はすべて使ってます。

ショートカットを見ての通り、「今開いているファイルを別の画面に移動する」というようなショートカットがありません。別の画面に移動するには別の画面までD&Dする必要があります。
個人的にはエディタを開いている間はあまりマウスやトラックパッドを使いたくないので、ちょっと不便です。

そんな時は[Tab to Next Splitter](http://plugins.jetbrains.com/plugin/7240)というプラグインを使います。
これを入れてショートカットを割り当てておくと"現在開いているファイルを次の画面に送る"ということが出来るようになります。ちょっとだけ便利になりますね。

ただ、これ以外にも画面分割はちょっとかゆいところに手が届かない感があって

- 各画面の幅をキーボードで変えられない(マウス操作必須)
- 新しいファイルを開いた時に常に画面1(基本的に左上)で開く

など、ちょっと機能的にむず痒い箇所がところどころあったりします。
今後のバージョンアップに期待します。

明日の12日目も私です。お楽しみに！
yo angularのエラー回避Tips(yeoman)

CentOS（自身の環境では6.3）で

```
$ yo angular 
```

とすると、gifsicleのダウンロードが無限に続いてしまう場合。

https://github.com/yeoman/node-gifsicle/issues/11

にあるように、該当のディレクトリで yo angular する前に

```
$ npm install gifsicle@0.1.3
```

として gifsicle をインストールしておく。

その後 `$ yo angular` とすることで回避する事ができる。
※上記issueのバグフィックスがなされるまでの暫定メモ。
White を使って Windows の GUI操作して別のプログラムを立ち上げる…

Windows の GUI操作に White というライブラリを使う。
ググりやすい名前で、目的のものに達するのに時間がかかる。 site: とか付けて探すことが多い。

http://teststack.azurewebsites.net/white/index.html
https://github.com/TestStack/White
旧
http://white.codeplex.com/

nuget で White を入れて参照して次のようなのを使っている。
サンプルとして、スタートメニューからcmd.exeを立ち上げてなんかコマンドを入力して実行するソース(C#)を載せる。

これは Jenkins のWindowsバッチから vmrun を使って VMware Player を立ち上げると、そのJOBが終ると同時にVMware Playerも死ぬので、こうやってムリやり vmrun している。
タスクバー隠すようにしている場合は、マウスカーソルを一番下とかに一度持っていって Sleepを入れる…。

```
var desktop = Desktop.Instance;
var startButton = desktop.Get(SearchCriteria.ByText("スタート"));
startButton.Click();
var startMenu = desktop.Get(SearchCriteria.ByText("スタート メニュー"));
var run = startMenu.Get(SearchCriteria.ByText("ファイル名を指定して実行..."));
run.Click();
var ws = desktop.Windows();
var w = ws.Find(x => x.Name == "ファイル名を指定して実行");
Thread.Sleep(1000);
var edit = w.Get(SearchCriteria.ByText("名前(O):").AndControlType(ControlType.Edit));
edit.Enter("cmd.exe");
w.Get(SearchCriteria.ByText("OK")).Click();
Thread.Sleep(1000);
var keyboard = Keyboard.Instance;
keyboard.Enter("echo Hello World!");
```

White は GUI色々動かせて便利。Silverlightの中も見れて動かせる。

ところでESXi 使いたい。
Chrome開発ツールよる描画パフォーマンスの調査

# ChromeのRnderingオプション

Chromeの開発ツールには「Show paint rectangles」なる機能がありまして、以下順序で有効にできる。
環境：Windows版Chrome

* [F12]キー -> 歯車クリック -> Setting -> General -> Rendering -> Show paint rectangles

リアルタイムに描画された要素を視覚的に確認することが可能な機能で、
具体的な使い方は省きますが、Renderingオプションには便利な機能が他にも存在しています。

名称  | ざっくりとした用途
-----|------------
Show paint rectangles  |  再描画が発生している要素と範囲を確認 
Show composited layer borders | GPUレイヤーによる描画を確認
Show FPS meter | FPSを確認
Enable continuous page repainting  |  コストの高い描画要素を調査
Show potential scroll bottlenecks | スクロール処理に影響を与える要素(イベントハンドラ)の確認


# Sencha Touch の画面で実際に調査してみる

Sencha Touch の画面を「Show paint rectangles」で確認すると少し気になる挙動が分かりまして。

## フォームパネル(formpanel) のスクロール

見た目は同じフォームパネルでも、スクロール時に再描画される場合とされない場合があった。


* 左：画面上部の範囲はスクロール中、常に再描画される
* 右：画面下部の範囲はスクロール中も再描画は発生しない

**⇒ 赤い部分が描画処理が発生している範囲**

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/14471/cc5a1ac6-ccc0-3604-2feb-de646ab9eeeb.png)

両者の違いは`scrollable`の指定の違いだけ。

### scrollableを明示的に指定しない

* スクロール中にフォーム全体が常に更新され続ける

```js
{
    xtype: 'formpanel',
}
```

### scrollableを明示的に指定する

* 更新されない

```js
{
    xtype: 'formpanel',
    scrollable: true
}
```

## 出力されるHTMLの比較

* 再描画が発生するフォームには、クラス属性に`x-translatable-container`と`x-translatable`が含まれる
* 再描画発生しないフォームには、`style="-webkit-transform: translate3d(0px, 0px, 0px);"`が含まれる

つまり再描画が発生しないフォームはGPUでレンダリングされており、
実際に「Show paint rectangles」で確認すると確かにオレンジ色で囲まれていることが確認できます。

## なぜこうなった？

フォームパネルで`scrollable`を省略すると、以下のデフォルト値が適用される。

```touch\src\form\Panel.js
    scrollable: {
        translatable: {
            translationMethod: 'scrollposition'
        }
    },
```

`scrollable`に設定可能な値は`true`、`false`、`null`とコメントにあるものの、
何も指定しなかった場合は上記設定にてスクロールは有効状態になります。
ここで`translationMethod`には`scrollposition`が指定されています。
`translationMethod`に指定可能なメソッドはおそらく以下の4種類。 (Ext.util.Translatable 参照)

translationMethodの値 | トランスフォームの実現方法
--------------    | --------
scrollposition    | `scrollLeft`、`scrollTop` を使用
csstransform      | `translate3d`を使用（GPUアクセラーレーション)
cssposition       | `style.left`、`style.top` を使用
auto              | 自動判別。Android と IE の場合は`scrollposition`、それ以外は`csstransform`が適用

よって`scrollable`を設定しない場合必ず`scrollposition`が使用され、
設定した場合は`csstransform`が使用されるようです。(Androidブラウザ と IE を除く)

正直なぜこのような設定になっているのかは不明ですが、
Chromeの開発ツールを使わなかったら絶対に気づかなかっただろうなという訳です。

# 参考

Jank Free: Chrome Rendering Performance
https://developers.google.com/events/io/sessions/325933151
zshのPATHの自動重複削除や余計なPATHの削除

シェルの中から `exec zsh` をしたり、GNU screen や tmux を経由して間接的にシェルの中でシェルを開いたりするときに何も考えずに `PATH` を追加していくとどんどん長くなっていってしまうと思います。

`bash` などでも使えるように汎用的にしようとすると自前で頑張らないといけないのですが、`zsh` では `zsh` 自体の機能で簡単に重複を防げます。

また、パスに望ましくないものが入っていた時に削除する方法も紹介します。

続きは [zshのPATHの自動重複削除や余計なPATHの削除](http://blog.n-z.jp/blog/2013-12-12-zsh-cleanup-path.html) です。
ゲーム制作5日目！×5

#今日のメニュー

・外壁設置

#壁
壁を描いて、衝突判定するところまでやります。
壁はSurfaceというクラスを使って書いてみようと思います。
参考:[Surface を使ってCanvas描画してみよう](http://jsdo.it/phi/rYXM)

surfaceではキャンバスを作って、そこに長方形などを書けるようです。
このsurfaceで作成したものは、画像として、
Spriteに登録することができます。
とりあえず今回は厚さ16pxの壁を四面に設置します。

ソースコードは以下の感じ。
壁は配列を使用することにしました。
位置についてはベタ書きをしているので、
あまり頭が良くないような気がします。

```js
			//水平の壁
			var wallHolSurface=new Surface(WIDTH,16);
			wallHolSurface.context.fillStyle="black";
			wallHolSurface.context.fillRect(0,0,WIDTH,16);
			
			//垂直の壁
			var wallVerSurface=new Surface(16,HEIGHT);
			wallVerSurface.context.fillStyle="black";
			wallVerSurface.context.fillRect(0,0,16,HEIGHT);
			
			var wall=[new Sprite(WIDTH,16),new Sprite(16,HEIGHT),new Sprite(WIDTH,16),new Sprite(16,HEIGHT)];
			//surfaceをセット
			for(var i=0;i<4;i++){
				if(i%2==0){
					wall[i].image=wallHolSurface;
				}else{
					wall[i].image=wallVerSurface;
				}
				scene.addChild(wall[i]);
			}

			//位置
			wall[0].x=0;
			wall[0].y=0;

			wall[1].x=WIDTH-16;
			wall[1].y=0;

			wall[2].x=0;
			wall[2].y=HEIGHT-16;

			wall[3].x=0;
			wall[3].y=0;
```

#衝突判定
壁の衝突判定にはintersect関数を使用します。
これは、壁は長方形の形であるため、
中心点との座標を測るwithin関数では、
正しい判定を行うことができないからです。

貼るほどではないかもしれませんが、衝突判定部分は以下の感じ。

```js
						//壁
						for(var i=0;i<4;i++){
							if(this.intersect(wall[i])){
								game.replaceScene(createGameOverScene());
							}
						}
```

#今日の成果

[今日の成果に飛びます。](https://dl.dropboxusercontent.com/u/35809589/SnakeGame/index.html)
全面青画面がスタート画面です。
画面をクリックすると、ゲームがスタートします。
ゲーム中では左右キーで曲がることができます。
とまることはできません。
下ボタンで増殖します。
自分の体および壁に衝突すると、全面緑色のゲームオーバー画面に飛びます。
ゲームオーバー画面で画面をクリックするとスタート画面に戻ります。

#問題点

どこか計算式が間違っているようで、
曲がっていると体がだんだんずれていく気がします。
どうにかしないと…。
[Ruby] ClassとかInstanceとかの表示

`p Array`とかってしたときの表示について(`inspect`は実装されていない場合)。

クラスのときはクラス名を表示する。

```rb
class Klass
end

p Array
# => Array
p Klass
# => Klass
```

インスタンスのときは#<クラス名:識別子>を表示する。

```rb
klass1 = Klass.new
klass2 = Klass.new

p klass1
# => #<Klass:0xf6c738>
p klass2
# => #<Klass:0xf6c678>
```

特異クラスのときは#\<Class:オブジェクトの情報>を表示する。
例えば対象となるオブジェクトがインスタンスの場合は#\<Class:#<クラス名:識別子>>を表示する。

```rb
p klass1.singleton_class
# => #<Class:#<Klass:0xf6c738>>
p klass2.singleton_class
# => #<Class:#<Klass:0xf6c678>>
p Array.new.singleton_class
# => #<Class:#<Array:0x10cb8e8>>
p String.new.singleton_class
# => #<Class:#<String:0x10cb768>>
```

一方で対象となるオブジェクトがクラスの場合は#\<Class:クラス名>を表示する。

```rb
p String.singleton_class
# => #<Class:String>
p Array.singleton_class
# => #<Class:Array>
```
zypper の紹介

今では多くの派生ディストリビューションで溢れているからか、よく「openSUSE は Redhat 系ですか？Debian系ですか？」と質問を受けますが、どちらでもありません。初期の（といっても10年以上前）の S.u.S.E. は Slackware に独自のソフトウェアを足した物でしたので、Slackware 系とは言えるかもしれません。

とは言いつつも、いくつか Redhat/Fedora と同じ基本システムを採用している部分がいくつかあります。その1つがパッケージマネージャです。openSUSE (SUSE Linux Enterprise でも同様) はパッケージマネージャに RPM を採用しています。

一方、パッケージマネージャのフロントエンドは yum ではなく、zypper と呼ばれるものを採用しています。今では zypper は openSUSE だけではなく、MeeGo にも採用され、その派生の Tizen や Nemo/Sailish OS でも使われています。

# zypper のサブコマンド体系

簡単に zypper のサブコマンド体系について紹介したいと思います。まずパッケージのインストールには `install` サブコマンドを使います。

```
$ zypper install パッケージ名
```

yum や aptitude と変わりませんね。


関連するパッケージ一式をまとめてインストールしたいというような場合は、パターンのインストールを使うと便利です。開発に必要な make などのパッケージをまとめてインストールするには、タイプに `pattern` を指定してインストールします。

```
$ zypper install -t pattern devel_basis
```

パッケージの検索は search です。`--detail` オプションを付けると検索結果にバージョン番号や、どのリポジトリにあるかを表示してくれます。

```
$ zypper se -s fcitx-mozc
リポジトリのデータを読み込んでいます...
インストール済みのパッケージを読み込んでいます...

S | 名前       | 種類       | バージョン          | アーキテクチャ | リポジトリ        
--+------------+------------+---------------------+----------------+-------------------
v | fcitx-mozc | パッケージ | 1.11.1522.102-24.1  | x86_64         | M17N              
i | fcitx-mozc | パッケージ | 1.11.1522.102-2.2.1 | x86_64         | openSUSE-13.1-Oss 
i | fcitx-mozc | パッケージ | 1.11.1522.102-2.2.1 | x86_64         | openSUSE-13.1-1.10
v | fcitx-mozc | パッケージ | 1.11.1522.102-24.1  | i586           | M17N              
v | fcitx-mozc | パッケージ | 1.11.1522.102-2.2.1 | i586           | openSUSE-13.1-Oss 
```

`i` はインストール済み、`v` は他のバージョンやアーキテクチャがインストールされていることを意味します。


いわゆるオンラインアップデートには `patch` コマンドを使います。openSUSE では重要な更新はパッチと呼ばれるいくつかのパッケージをまとめた形で配信されます。`patch` コマンドを使うと、必要なパッチを一括でインストールします。

```
$ zypper patch
```

# 最後に

もう少し詳しい使い方を知りたい方は次のスライドをチェックしてみて下さい:
- [openSUSE におけるパッケージ管理入門](http://www.slideshare.net/ftake/20111120)
- [覚えておきたい！ zypper コマンドの使い方](http://www.slideshare.net/ftake/20110604)

おまけ: 元ネタは apt ですが、ぜひ実際に試してみて下さい。

```
$ zypper moo
```
状況の整理

#状況の整理
いきなりシステム管理者に任命され右往左往としていますが冷静になるためにも状況整理が必要だと判断しました。

会社が求める大きなものは「ｳﾝ万人単位を管理する顧客データベース」の構築です。

その他の細かい仕様は以下のとおり。

 - ｳﾝ万人単位を管理できる顧客データベース
    - 氏名
    - 住所
    - 電話番号(固定)
    - 電話番号(携帯)
    - 販売商品
    - 備考
 - 上記のデータベースへ複数のPCからアクセスできるようにする
    - 各項目は検索しソートすることも可能
    - 内容の編集追記などを簡単にできるようにする
    - 住所からクリック一発でGoogleMapへ該当座標が表示される
  - のちのち会社のホームページも欲しい
  - 独自ドメインのメールアドレスも欲しい
  - 各社員のスケージュールを確認できるようにしたい

書いておいて難ですが笑えるほどどうしたら良いかわかんねえ・・・orz

冷静になるどころか山積みになった問題が可視化された気がします。

#会社のこと
私の務める会社は通信系の営業販売がメインの業務です。

なので進歩状況と営業さんが回りやすいようにGoogleMapで訪問するお家がわかったら便利なのです。

お客様とのアポイントメントは大切にしなければならないのでアポ忘れブッキングとか避けるためにスケジュールも確認できたら嬉しいってわけですね。

さて何から手を付けて良いものか考え無くてはならないです(´・ω・｀)
PHPの$_GETっぽいのをJavaScriptで(配列、連想配列渡し対応してみた)

需要があるかは別にして……。

ここ([PHPの$_POST, $_GET, $_COOKIEの要素に配列を使用する | yohgaki's blog](http://blog.ohgaki.net/phpa_r_post_get_cookiea_reb_cana_le_a_a))によると、PHPの`$_GET`なんかの関数は、次のようなURLだと、

```
http://example.com/?key[]=1&key[]=2
```

こんな値になって、

```php
array(1) {
  ["key"]=>
  array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
  }
}
```

こういうURLだと、

```
http://example.com/?key[aaa]=1&key[bbb]=2
```

こうなるらしい。

```php
array(1) {
  ["key"]=>
  array(2) {
    ["aaa"]=>
    string(1) "1"
    ["bbb"]=>
    string(1) "2"
  }
}
```

で、何を思ったかこれをJavaScriptで実装してみた。

```js
'use strict';


var
$_GET = (function $_GET(param) {
  var
  arrayMethods = Object.getOwnPropertyNames(Array.prototype);
  
  return param.slice(1).split('&').map(function (entry) {
    entry = entry.split('=');
    
    var
    keys = [decodeURIComponent(entry[0])],
    val = decodeURIComponent(entry[1]),
    idx = keys[0].indexOf('[');
    
    if (idx !== -1) {
      Array.prototype.push.apply(keys,
        keys[0].slice(idx).match(/\[[^\[\]]*\]/g).map(function (key) {
          return key.slice(1, -1);
        }));
      keys[0] = keys[0].slice(0, idx);
    }
    
    return [keys, val];
  }).reduce(function ($_GET, keysVal) {
    var
    keys = keysVal[0], val = keysVal[1];
    
    keys.reduce(function (obj, key, idx) {
      //キーが空文字 == 配列の末尾ってことにする
      if (key === '') {
        key = obj.length;
      }
      // 配列のメソッドは上書きしたくないのでダミーのオブジェクトを返す
      return arrayMethods.indexOf(key) !== -1 ? [] :
        obj[key] = idx + 1 === keys.length ?
          val : obj[key] || [];
    }, $_GET);
    return $_GET;
  }, []);
})(this.location && location.search || '');
```

こんな感じのURLに対して、

```
http://example.com/?key[aaa]=1&key[bbb]=2
```

こんな風に値を取れる。

```js
$_GET.key.forEach(function (k) {
  console.log(k);
});
```

一つ注意する点としては、実装を単純にするために配列を使っているので、配列に定義されているメソッドを上書きしないようにしてるところ。色々考えてたらこういう実装になった。
Python でテスト

## doctest

docstring 内に書ける。凡例として使える。

### 使い方

doctest を import し、docstring 内で以下のように書き、``doctest.testmod()`` を呼ぶ。実行する際は ``python ${ファイル名}.py -v`` とする。

### サンプルコード

```py:sample.py
# -*- coding: utf-8 -*-

import doctest

def twice(n):
    """ 引数を 2 倍して返す関数
    >>> twice(8)
    16
    >>> twice(1850923)
    3701846
    """
    return n * 2

if __name__ == "__main__":
    doctest.testmod()
```

実行

```console
python sample.py -v
```

結果

```console
Trying:
    twice(8)
Expecting:
    16
ok
Trying:
    twice(1850923)
Expecting:
    3701846
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.twice
2 tests in 2 items.
2 passed and 0 failed.
Test passed.
```

docstring を読んでみる

```console
python
```

```py
import sample
help(sample.twice)
```

```console
twice(n)
    引数を 2 倍して返す関数
    >>> twice(8)
    16
    >>> twice(1850923)
    3701846
```

これは…ありがたい…

**Instance Method をテストする場合**

- testmod に引数として extraglobs を与える。extraglobs で定義された dictionary の key と値のセットは global 変数にマージされる。

```py:sample.py
# -*- coding: utf-8 -*-

class IntUtil:
    def twice(self, n):
        """ 引数を 2 倍して返す関数
        >>> mine.twice(8)
        16
        >>> mine.twice(1850923)
        3701846
        """
        return n * 2

if __name__ == "__main__":
    import doctest
    doctest.testmod(extraglobs = {'mine': IntUtil()})
```

## unittest

一般的な単体テストおよび結合テストはこちらのモジュールで行う

### 開始処理と終了処理

setUp: 開始時実行
tearDown: 終了時実行

### functions

|関数名|説明|
|:---|:---|
|assertEqual(a, b, msg=None)|a == b|
|assertNotEqual(a, b, msg=None)|a != b|
|assertTrue(expr, msg=None)|bool(x) is True|
|assertFalse(x)|bool(x) is False|
|assertIs(a, b)|a is b|
|assertIsNot(a, b)|a is not b|
|assertIsNone(x)|a is None|
|assertIsNotNone(x)|a is not None|
|assertIn(a, b)|a in b|
|assertNotIn(a, b)|a not in b|
|assertIsInstance(a, b)|isinstance(a, b)|
|assertNotIsInstance(a, b)|not isinstance(a, b)|

```py:sample_test.py
# -*- coding: utf-8 -*-

import unittest
import sample

class SampleTest(unittest.TestCase):
    def setUp(self):
        self.util = sample.IntUtil()
    def test_twice(self):
        # 足した数と同値か
        import random
        roop = 0
        while roop != 10000:
            n = random.randint(0, 100)
            ans = n + n
            self.assertEqual(self.util.twice(n), ans)
            roop += 1

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

## 参考資料

- [25.2. doctest — Test interactive Python examples — Python v2.7.6 documentation](http://docs.python.org/2/library/doctest.html)
AWS Amazon Linuxのユーザプロセス数制限を解除する

AWSでバッチ処理を多数走らせようとしてはまったのでメモ。

CentOS6同様root以外はプロセス数上限がデフォルトで1024になっているためにバッチジョブを平行で走らせすぎるとハングしてしまう。

制限を解除するには/etc/security/limits.d/90-nproc.confファイルに記述されているsoft limitを1024からunlimitedに変更すればいい。無制限で問題がありそうであれば適当な数字に上限をあげる。

```shell-session:/etc/security/limits.d/90-nproc.conf
*          soft    nproc     unlimited
root       soft    nproc     unlimited
```

リアルタイムで変更が必要なら下記コマンドを実行

```shell-session:command
ulimit -u unlimited
```
元船乗りがパソコンが得意という理由でシステム管理者になる

#どうしよう・・・
どう考えても無茶ぶりとしか思えない状況になったのでIT関連で有名なSNSであるQiitaに登録してみました。

早い話が「お前パソコンが得意なんだろ？」という理由でシステム管理することになりました。

もちろんプログラミングのプの字も知りません。職業プログラマさんやシステム管理者さんからするとIT知識ゼロのズブの素人と何ら変わりがない状態です。

当然ながら私は学生時代にプログラミングとか習うような学校へは行ってません。私は船乗りになるための学校を出てます。

現在私が持っている資格は普通自動車免許と海技士免状(船乗りの国家資格)です。システム管理者とか無理があります(´・ω・｀)

#教えてください
もうなりふり構わず恥を捨てて、いわゆる「教えて君」になってなんとか使えるレベルのシステム管理者になろうと思います。

右も左もわからない状態なので、もしかしたらプログラミングとかに興味のある人が私の記録を参考に学習できるかもしれません。もうそれくらいしか私がみなさんへ提供できるものはないんですorz

さてどうなることやら・・・
Go言語でPHPのvar_dumpやJavaScriptのconsole.log的なもの


デバッグするとき値の中身を見たいもの。Go言語にもPHPの `var_dump` やJavaScriptの `console.log` のように、値の中身をプリントすることができる関数がある。


| 関数 | 意味 | 例 |
|---|---|---|
| `fmt.Printf("%v", value)` | デフォルトフォーマットを適用した値 | `&{bar baz}` |
| `fmt.Printf("%+v", value)` | デフォルトフォーマットを適用した値で、構造体のときフィールド名が出る  | `&{Bar:bar Baz:baz}` |
| `fmt.Printf("%#v", value)` | Go言語の構文で表現した値  | `&main.Foo{Bar:"bar", Baz:"baz"}` |
| `fmt.Printf("%T", value)` | Go言語の構文で表現した型  | `*main.Foo` |

ちなみに、`fmt` ではなく `log` パッケージの `Printf` もある。違いは以下:

| 関数 | パッケージ | 日付が | 最後が |
|---|---|---|---|
| `fmt.Printf` | import "fmt" | 出ない | 改行されない |
| `log.Printf` | import "log" | 出る| 改行される |

# 使い方の例

```go:main.go
package main

import (
	"log"
)

type Foo struct {
	Bar string
	Baz string
}

func main() {
	foo := &Foo{"bar", "baz"}
	log.Printf("%v", foo)
	log.Printf("%+v", foo)
	log.Printf("%#v", foo)
	log.Printf("%T", foo)
}

```

出力結果

```
2013/12/11 21:52:10 &{bar baz}
2013/12/11 21:52:10 &{Bar:bar Baz:baz}
2013/12/11 21:52:10 &main.Foo{Bar:"bar", Baz:"baz"}
2013/12/11 21:52:10 *main.Foo
```

# var_dump っぽく実装してみた

```
package main

import (
	"fmt"
)

type Foo struct {
    Bar string
    Baz string
}

func main() {
    foo := &Foo{"bar", "baz"}
	var_dump(1, true, nil, "string", foo)
}

func var_dump(v ...interface{}) {
	for _, vv := range(v) {
		fmt.Printf("%#v\n", vv)
	}
}
```

出力結果

```
1
true
<nil>
"string"
&main.Foo{Bar:"bar", Baz:"baz"}
```

# UPDATE 2013/12/12 spew

[github.com/davecgh/go-spew/spew](https://github.com/davecgh/go-spew/)を使うと改行もしてくれて見やすい

```go:main.go
package main

import (
	"github.com/davecgh/go-spew/spew"
)

type Name struct {
	FirstName string
	LastName string
}

type Address struct {
	Country string
	PostalCode string
	Address string
}

type Person struct {
	Name Name
	Address Address
}

func main() {
	person := &Person{
		Name{"Cynthia", "Stone"},
		Address{"us", "02110", "1091 Lyon Avenue, Boston"},
	}
	spew.Dump(person) // ここ!
}
```

出力結果

```
(*main.Person)(0x2102bd230)({
 Name: (main.Name) {
  FirstName: (string) "Cynthia",
  LastName: (string) "Stone"
 },
 Address: (main.Address) {
  Country: (string) "us",
  PostalCode: (string) "02110",
  Address: (string) "1091 Lyon Avenue, Boston"
 }
})
```
DJangoメモ：はじめから（管理画面をもっと編集編）


引き続きadminページをいじっていきます。

### Choiceを追加 ###
[前回](http://qiita.com/juniskw/items/97b8391352525e302bbf)はPollを登録するところまでやったが、今回はChoiceも登録していく（復習：models.pyにはPollとChoiceの二つが定義してある）。

そのままadmin.site.register(Choice)みたいにしてもいいが、それだとPollとChoiceの登録画面が別々になってしまう。
両者の関係性はPollの中に複数のChoiceが含まれている感じなのでそれに則した画面にしたい。

###### admin.py ######

```py
class ChoiceInline(admin.StackedInline):  # StackedInlineはinlineの形式？
    model = Choice
    extra = 3  # いくつのmodelを中に入れるかという意味？

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]  # inlineは追加領域みたいなもの？

admin.site.register(Poll, PollAdmin)

# コメントの語尾に「？」が付いているのは理解度に自信が無いため
```

Pollの編集画面でChoiceも登録できるようになる。
もっとコンパクトにまとめたい場合は、ChoiceInlineの親クラスをTabularInlineにすれば各Choiceが一行に収まる。

#### これで全てのモデルがadmin画面に登録された。 ####

あともうちょっとだけいじる。

### チェンジリストページをカスタマイズ ###

デフォルトでは一覧表示の画面に表示されるのは保存された各データを文字列にしたものだけだが、ここに他の要素も足すこともできる。

そのためにはPollAdminクラスに以下の一行を追加する。

###### admin.py ######
```py
class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date')  # list_displayで表示を指定
    # たまたま書き間違えたおがげでリスト形式でも動作を確認。当たり前か
```

あとこんな感じで書けば

```py
    list_display = ('question', 'pub_date’,’was_published_recently’)
    # was_published_recentlyはPollに定義された関数（前のドキュメントではrecentlyがtodayだったので注意）
```

関数からの返り値を表示させることもできるらしい。ちなみにアンダースコアは空白に置き換わる。

### オプションを付ける ###

準備段階として、Pollモデルを少し書き加える。

###### models.py ######

```py
from django.utils import timezone

class Poll(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)  # 公開されて一日以内かどうか？
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'
```

そして、PollAdminクラスに以下を追加するとオプションを追加できる。

###### admin.py ######

```py
    list_filter = ['pub_date']  # pub_dateをもとに絞り込む機能
    search_fields = ['question']  # questionをもとに検索する機能
    date_hierarchy = 'pub_date'  # 日付のfilterと機能は似てる
```

あとはテンプレートを使えばもっと細かくカスタマイズできるらしいが、次のチュートリアルで詳しくやるようなので今回は触れない。
そして、
## 次はいよいよ公開用の画面を作るらしい ##
チュートリアル３に突入。楽しみだ。
Codeigniterのmigration


僕も日頃Codeigniterにお世話になっているので参加です。
日本語のユーザーガイドのバージョンが古く、migrationについては英語のユーザーガイドしかありませんので、簡単に説明します。

dbforgeと組み合わせて利用されます。
dbforgeについては日本語ガイドがあるのでそちらを参照。
http://codeigniter.jp/user_guide_ja/database/forge.html


まずmigrationファイルを格納するディレクトリを作成します

```
application/migrations
```
config/migrations.phpで設定できますが上記がデフォルトです。

次に作成したディレクトリにファイルを作成します。

```
application/migrations/001_add_blog.php
```
注意点としては頭に3桁0埋めで数字を入れてください。
これがバージョンの数字になります。

```001_add_blog.php
class Migration_Add_blog extends CI_Migration {

    public function __construct()
    {
        parent::__construct();
    }
	public function up()
	{
		$this->dbforge->add_field(array(
			'blog_id' => array(
				'type' => 'INT',
				'constraint' => 5,
				'unsigned' => TRUE,
				'auto_increment' => TRUE
			),
			'blog_title' => array(
				'type' => 'VARCHAR',
				'constraint' => '100',
			),
			'blog_description' => array(
				'type' => 'TEXT',
				'null' => TRUE,
			),
		));
		$this->dbforge->add_key('blog_id', true);
		$this->dbforge->create_table('blog');
	}

	public function down()
	{
		$this->dbforge->drop_table('blog');
	}
}
```

CI_Migrationのコンストラクタでdbforgeは呼び出されているので、こちらで呼び出す必要はありません。

クラス名はファイル名から推測されるようになっているので注意です。
Migration_[バージョン番号を除いたファイル名の頭大文字]
例）
001_add_blog.php -> Migration_Add_blog

up()にバージョンを上げるときの実行内容、
down()にバージョンを下げるときの実行内容を記述します。


次に現在のmigrationのバージョンを設定します。

``` application/config/migration.php
$config['migration_enabled'] = TRUE;
$config['migration_version'] = 1;
```

最後にmigrationを実行します。
コマンドラインから実行したいのでその用意をします。

``` application/controller/migrate.php
class Migrate extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
		// コマンドラインから実行されていることを確認
        if(!$this->input->is_cli_request()) {
            show_error();
        }
        $this->load->library('migration');
    }

    function current()
    {
        $this->migration->current();
    }

    function rollback($version)
    {
        $this->migration->version($version);
    }

    function latest()
    {
        $this->migration->latest();
    }
                
}
```
コマンドラインからの実行チェックを忘れないようにしましょう。
プロジェクトのルートに移動し、以下を実行します。

```
php index.php migrate current
```

これでconfigファイルで設定したバージョンまで実行されます。
rollback()は引数に指定したバージョンまで戻します。
latest()はconfigに関係なくmigrations/下にあるファイルの最新まで実行されます。

以上ですが簡単な説明になります。
実装が最小限なのでmigrationとはなんぞやというところがわかりやすいですね。
dbforgeを利用していますが、sqlを普通に実行することもできます。
あくまでdbforgeとmigrationは別物です。


英語版ユーザーガイド
http://ellislab.com/codeigniter%20/user-guide/libraries/migration.html
[Ruby] Array.eachが受け付けるもの

Ruby 2.0.0で`Array.each`が受け付けるものを調べてみた。

まずは普通の使いかた。

```rb
ary = [0, 1, 2, 3, 4]

ary.each {|i| p i}
# => 0 1 2 3 4
```

`lambda`とか`proc`

```rb
lam = lambda {|i| p i}
ary.each(&lam)
# => 0 1 2 3 4

pc = proc {|i| p i}
ary.each(&pc)
# => 0 1 2 3 4
```

`lambda`や`proc`を返すメソッド

```rb
def make_lam
	lambda {|i| p i}
end
ary.each(&make_lam)
# => 0 1 2 3 4

def make_proc
	proc {|i| p i}
end
ary.each(&make_proc)
# => 0 1 2 3 4
```

よく考えれば`each`の引数が先に評価されて、戻り値である`lambda`や`proc`が`each`に渡されているだけなんだけど、初見で驚いたのでメモでした。
Go言語でRESTful APIクライアント: Qiita APIを叩いてみよう!


# この記事の目的

Go言語で [Qiita API] のRESTful APIを叩いてトークンを取れるようになる

# Qiita APIの仕様

> ### token取得
> 
> ```
> POST /api/v1/auth
> ```
>
> 認証: ユーザー名+パスワードによる認証
> 
> #### input
> 
> * url_name (必須) String
>   * Qiitaのユーザー名(twittername or githubname@github)
> * password (必須) String
>
> #### response
> 
> Status: 200 OK
> 
> ```json
> {
>   "url_name": "yourname",
>   "token": "yoursecrettoken"
> }
> ```

----

> ###エラー時のレスポンス
>
> APIのリクエストに失敗したときはステータスコード400/403/404でエラーメッセージが以下の形式で返される．
>
> ```json
> {"error": "Required key `url_name` is missing."}
> ```

# 実装してみる

RESTful APIクライアントライブラリは [github.com/jmcvetta/napping] を使う。

```go:main.go
package main

import (
	"log"
	"github.com/jmcvetta/napping"
)

func main() {
	urlName := "suin" // ここは自分のものに
	password := "p@ssW0rd" // ここは自分のものに

	// 入力JSONのフォーマットを定義 & 初期化
	input :=  struct {
		UrlName string `json:"url_name"` // JSONのキーと構造体のキーが一致しないものは、ここでマッピングする 
		Password string `json:"password"` // 同上
	} {
		urlName,
		password,
	}

	// 正常時のJSONのフォーマットを定義 & 初期化
	// Qiitaからのレスポンスには url_name も含まれるが、必要ないのでここでは定義しない
	response := struct {
		Token string
	} {}

	// エラー時のJSONのフォーマットを定義 & 初期化
	error := struct {
		Error string
	} {}
	
	resp, err := napping.Post("https://qiita.com/api/v1/auth", &input, &response, &error) // input, response, errorは参照を渡す
	
	if err != nil {
		panic(err)
	}
	
	log.Printf("status: %#v", resp.Status())
	log.Printf("token: %#v", response.Token)
	log.Printf("error message: %#v", error.Error)
}
```

実行してみる

```
go run main.go
```

結果

```
2013/12/11 21:07:42 status: 200
2013/12/11 21:07:42 token: "d61c32d3f02543b39d61e9b545c58d0c"
2013/12/11 21:07:42 error message: ""
```


[github.com/jmcvetta/napping]: https://github.com/jmcvetta/napping
[Qiita API]:http://qiita.com/docs
EmacsからEclipse、EclipseからEmacsへと駆け抜けるコマンドとプラグインを導入する

現在Eclipseをメインに開発をやっておりますが、生粋のEmacs使いの僕にとって
Eclipseって編集作業するのには本当に苦行です。

なので、Eclipseでファイルを開いているときにEmacsで同じファイルを開き、
Emacsでファイルを開いているときにEclipseで同じファイルを開きたいと思いました。

### EclipseからEmacsへ

[emacs-eclipse](https://github.com/anirudhsasikumar/emacs-eclipse)

Eclipseでファイルを開いていて、Emacsで同じファイルを開くようにする
プラグインを導入します。

手順通りにインストール、EmacsとかEclipseとか再起動すると、
右上にアイコンが出てるので、クリックするとEclipseのエディタで
開いているファイルをそのままEmacsで見ることが出来ます。

emacsclientが立ち上がっているのが必須ですけども。

Eclipse→Emacsのラインは通ったけど、
Emacs→Eclipseのラインをどうにかして通したい。

#### インストール手順

1 git clone

```zsh
git clone https://github.com/anirudhsasikumar/emacs-eclipse.git
```
2 emacs-eclipse-plugin_1.3.0.jar を eclipseの plugins ディレクトリに移す。

3

```el:init.el
(load "~/elisp/eclipse-goto-offset.el")
```

を書く。ディレクトリは適宜修正すること。

4 server-startとかしてemacsclientが使えるようにする。

以上。

[emacs-eclipseで快適なEmacsライフの一助を](http://shigemk2.hatenablog.com/entry/2013/12/10/emacs-eclipse%E3%81%A7%E5%BF%AB%E9%81%A9%E3%81%AAEmacs%E3%83%A9%E3%82%A4%E3%83%95%E3%81%AE%E4%B8%80%E5%8A%A9%E3%82%92)

### EmacsからEclipseへ

Cygwin限定。

Cygwinメインで使っているときは、以下のように書くといい。

```el:init.el
;; open
(defun open ()
  "Let's open file!!"
  (interactive)
  (cond ((eq system-type 'darwin)
         (shell-command (concat "open " (buffer-file-name))))
        ((eq system-type 'windows-nt)
         (shell-command (concat "cygstart " (buffer-file-name))))
        )
  )
(global-set-key "\C-co" 'open)
```

openは予め指定されたアプリケーションでファイルを開くコマンド。

Linuxのopenに相当するコマンドがCygwinにもあって、cygstartという。

Emacsでそれを実行する。Macならopen Windowsならcygstartを
実行するように書き換えてみる。

こんな風にEmacs Lispを書きまして、Finderとかエクスプローラーとかで
ファイルを開くアプリケーションを指定すれば、cygstartやopenを実行すると
そのアプリケーションでファイルを開く。

[Emacsから別アプリケーションでファイルを開く](http://shigemk2.hatenablog.com/entry/2013/12/11/Emacs%E3%81%8B%E3%82%89%E5%88%A5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%96%8B%E3%81%8F%28Eclipse%E3%82%92)