OmniAICreator/Qiita-1.07M huggingface dataset:
javascript - bind関数について


- ある関数が呼ばれた時のthisの値を固定する
- 返り値は(thisが固定された)`元の関数`と同じ新しい関数
- 引数の固定とかもできる

### 実行環境
- node.js v0.11.13

### thisの値を固定

```js:bind.js
function hoge() {
  console.log(this);
};

var bindAri  = hoge.bind('ringo');
var bindNasi = hoge;

console.log(bindAri);
console.log(bindNasi);

bindAri();
console.log('\n===========\n');
bindNasi();
```

```zsh:実行結果
$ node bind.js
[Function]
[Function: hoge]
[String: 'ringo']

===========

{ DTRACE_NET_SERVER_CONNECTION: [Function],
  DTRACE_NET_STREAM_END: [Function],
…(以下略
```

### 引数を固定

```js:bind2.js
function sum(a,b,c) {
  console.log(this);
  console.log(arguments);
  return a+b+c;
};

var hoge = sum.bind(20, 100, 2);

console.log('a+b+c = ' + hoge(5,11));
```

```zsh:実行結果
$ node bind2.js
[Number: 20]
{ '0': 100, '1': 2, '2': 5, '3': 11 }
a+b+c = 107
```




## 参考
- [JavaScript初級者から中級者になろう 十一章第二回](http://uhyohyohyo.sakura.ne.jp/javascript/11_2.html)
USB Ubuntu


東芝のdynabookで，USB bootのUbuntuを利用しようとした記録．

## Installation
[UNetbootin](http://unetbootin.sourceforge.net/)というソフトウェアで簡単にUSBにLinux OSをインストールできる．
しかし，これは何かしらのLinuxOSをUSBにインストールしてくれる仲介ツールのようなものなので，どのLinux OSをインストールするかは自分で決めて，それを自分でダウンロードしなくてはいけない．
ここでは，Ubuntu 14.04LTSを入れる例を記述する．


### Ubunto 14.04LTSのダウンロード
[UNetbootin](http://unetbootin.sourceforge.net/)サイトの中盤くらいにある「Ubuntu (and official derivatives)」というところから，Ubuntuウェブサイトに行く．
タブのなかに「Download」があるのでそこから「Desktop」を選択．
ダウンロードページで`32-bit`か`64-bit`かを選択．最近のマシンならば`64-bit`で良いと思う．
かなりデータが大きいので時間がかかるだろうが，ダウンロードして保存する．

### UNetbootin
1. UNetbootinをダウンロードしてきて，起動する．
「ディスクイメージ」の方にチェックを入れて，先程ダウンロードしてきたUbuntuのイメージを選択する．
2. これだけで基本的にはOKだが，このままだとUbuntu内で何も保存できないことになるので，「スペースは，リブートしてもファイルを維持するために使用(Ubuntuのみ)：」のところを4096MBくらい設定しておく．(そのためにはUSBの容量は最低でも8GBくらいは欲しい．)
3. あとは「OK」ボタンを押せばよし．時間はかかるが待つ．

### 起動

TOSHIBA dynabookでUSB起動するには，
F2押しながら起動，BIOSでBoot order (起動するデバイスの順序) をUSBを最初にする．



## gnuplotのインストール
Ubuntuでは，apt-getを用いてソフトウェアをインストールするが，デフォルトでは，

```bash
$ sudo apt-get install gnuplot-x11
```

としても，インストールされない．

OS標準の検索ソフトで，OS内で「Software」を検索すると，「Software & Updates」というソフトが見つかるので，それを開き，「Ubuntu Software」タブで，上から4つのチェックを入れる．こうしないと，apt-getがgnuplotなどの検索を行うサーバを見に行かない！

```bash
$ sudo apt-get update
$ sudo apt-get install gnuplot-x11
```

とすれば，gnuplot-x11がインストールされる．


## keyboardの変更
ウィンドウズパソコンにUSBを差して使用することが多いわけだが，keyboard配列がUS keyboard設定になっていて使いずらい．変更するには，

```bash
$ sudo dpkg-reconfigure keyboard-configuration
```

として設定すれば良いが，再起動後に元に戻ってしまう．

そこで，`.bashrc`に

```bash
setxkbmap -model jp106 -layout jp
```

と記述しておくと，terminalを使用する際にkeyboardが日本語配列になるからタイプしやすくなる．
ここに「-rules xfree86」を加えてしまうと，矢印キーが変な動作になるので止めた方がよい．
SublimeText3 + RubyTest で"rspec command not found" が発生する


rbenvを使ってRubyを入れた場合にrspecのパスが通ってなくて発生する様子。
ちなみにrbenvのバージョンは0.4.0。
rbenvのバージョンによってgemの格納場所が異なるようなので、適宜whereで調べてください。
あとは、

PreferencesのRubyTestの設定ファイル（RubyTest.sublime-settings）を開いて、

```JSON
{
  "run_rspec_command": "$HOME/.rbenv/shims/rspec exec rspec {relative_path}",
  "run_single_rspec_command": "$HOME/.rbenv/shims/rspec exec rspec {relative_path} -l{line_number}"
}
```

とすればOKでした。




### こちらを参考にしました

[Sublime Text 2 + RubyTestでrspecが動かない時の対処法](http://quattro4.hatenablog.com/entry/2013/01/06/220929)
Eclipse Android Application Project でエラー "Description Resource Path Location Type The container 'Android Dependencies' references non existing library appcompat_v7.jar"

## 問題  
下記のエラーが出てAndroid Application Projectがbuildができない。
<pre>Description Resource Path Location Type The container'Android Dependencies' references non existing library appcompat_v7.jar</pre>

## 解決策
1. Eclipse上でAndroid Application Projectを作成した時に一緒に出来るappcompat_v7のフォルダを右クリック 
2. Build Projectをクリック  
3. 作成したProjectをclean&build
指定した名前のフォルダまでのパスを抽出する

よく使うのに忘れてしまうのでメモしときます。

```csharp
var fullPath = @"C:\Users\user\Dir\Folder\hoge.txt";
var extractingDirName = "Dir";
var extractingStr = Path.DirectorySeparatorChar + extractingDirName + Path.DirectorySeparatorChar;
var idx = fullPath.LastIndexOf(extractingStr);
var extractedPath = fullPath.Substring(0, idx + extractingStr.Length);
Console.WriteLine(extractedPath); // => "C:\Users\user\Dir\"
```

*＠kuchikios さんが指摘くださった問題に対応しました。

--
2015/12/15 追記
プロジェクトフォルダの取得に用いるのが便利だと思います．
（ソリューション名やパスの他の箇所などと重なる場合は[こちら](http://qiita.com/Go-zen-chu/items/56409a77976d05d5bf61)の方法が確実です．設定が面倒なのが難点ですが）

```csharp
public static string GetProjectDirPath()
{
    var execPath = Environment.CurrentDirectory; // 実行ファイルのパス 
    var extractingDirName = "YourProjectName"; // プロジェクト名
    var extractingStr = Path.DirectorySeparatorChar + extractingDirName + Path.DirectorySeparatorChar;
    var idx = execPath.LastIndexOf(extractingStr);
    var projectPath = execPath.Substring(0, idx + extractingStr.Length);
    //Console.WriteLine(projectPath); // => "C:\Users\user\Desktop\SolutionName\YourProjectName\"
    return projectPath;
}
```
いまさらRubyOnRailsを始めた

Windows版の話です。対象：Rubyについて2日くらいでキャッチアップをしなければならないJava使いの方々。

# Ruby および Railsのインストール
[Ruby公式サイト](https://www.ruby-lang.org/ja/)より[RailsInstaller](http://railsinstaller.org/en)のリンクをクリック **Windows Ruby 1.9**よりRubyとかRailsとかをインストールした

1. local gitのuser.name, user.emailを登録
2. $Users\.ssh\id_rsa.pubにssh のpublicキーが生成され、クリップボードにコピーされたと起動されたcmd.exeにアナウンスされる
3. 試しに、ruby, sqlite3, railsのversionを確認した ( ```ruby -v``` ```sqlite3 --version``` ```rails -version```
4. 引き続き<http://guides.rubyonrails.org/getting_started.html>に従ってblogサイトを作成してみる
5. 特にディレクトリを変更していない場合は、```c:\Site```直下にblogディレクトリが生成される。さらにその下には必要なファイルが生成されている
6. さらに ```bundle install```というコマンドが走り、gem に定義してある依存関係に従ってファイルが作成される
7. 自動で生成されたblogフォルダに移動し、Web Serverを立ち上げてみる ```rails server```　その後 ```http://localhost:3000```でアクセスできることを確認
8. ここでやっとcontrollerとviewを作ることになる。
    9. rails generate controller welcome index
    10. 結果としてapp/controllers/welcome_controller.rb, app/views/welcome/index.html.erb ができる
10. Home Pageを設定する
    11. config/routes.rb
12. その他を定義 

# Rubyについて調べた

とはいいながらも、Hello worldから先に進むのがなかなかうまくいかないのが常です。Ruby＋入門で調べても、変数はオブジェクトが入りますとかif分の書き方とか、そんなに実用的ではないなと。という、既存のRoRのコードを読むにはかけているピースがある。。

ということで行き着いたのが[Java開発者のためのRuby / Ruby on Rails入門](http://news.mynavi.jp/series/ruby/003/)

## Rubyに合ったJavaにないもの

* ブロック付きメソッド
    * メソッド呼び出し時にコードブロックを渡すことでクラスメソッドの中からそのブロックを再呼び出しする

``` 
def testMethod(param1)
   puts("Here call received block")
   yield("blockParam1","blockParam2")
end


def main
   puts("start")
   testMethod do |param1, param2|
       puts param1
       puts param2
    end
end
```

* モジュール

```
module Modulesample 
 def self.hoge
   puts "hoge"
 end
end


```

* mix-in
    * クラスに取り込んだモジュール

# 以上の知識を元にリファランスマニュアルで補足

* シンボル
    * コロン:+文字列　例 `:buf` `:firstName`
    * 生成後は変更できない
    * ハッシュで記述するときは、文字列＋コロンでも表記される
        * `param1: "Chops", param2: "Sticks"`
        * これは `:param1 => "Chops", :param2 => "Sticks"`と同じ
* ハッシュ
    * hash1 = {key1: "first", "key2" => "Second", :key3 => "Three"}


* [変数と定数 命名規則](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fvariables.html)
	* ローカル変数・またはメソッド呼び出し：小文字または'_'で始まる識別子
	* 宣言されていない識別子の参照 = 引数のないメソッド呼び出し
	* インスタンス変数 = @で始まる変数
	* クラス変数 = @@で始まる変数
	* グローバル変数 = $で始まる変数
	* 擬似変数：self, nil, true, false, ___FILE__, __LINE__, __ENCODING__
	* 定数 = アルファベット大文字で始まる識別子。定数はメソッドの中では定義できない


* [終了処理](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fterminate.html)
	* SystemExit例外発生、もしくはスクリプト終端で終了
		* SystemExit例外 <= Kernel.#exit, Kernel.#abort, Thread.kill(メインスレッドに対する)
		* Kernel.#exit!による終了は_exit(2)を実行するだけで、ファイナライザ等は実行されない
* [Thread](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fterminate.html)
	* スレッドの起動時に指定したブロックの実行が終了するとスレッドの実行も終了する
	* スレッド内でrescueで捕捉されない例外が発生した場合、Thread#joinで待っている他のスレッドに対しても同じ例外が発生する
	* スレッド終了時にensure節が実行される
mongoDBのスロークエリ検出

mongodコマンドに--slowmsオプションを付けて起動する。
オプションの後に数字を与えると、しきい値を変更できる。デフォルトは100(ms)。

```bash
$ mongod --slowms <millisec>
```

スロークエリがある場合はログに出力される。

ログに出力されたクエリをmongo shellでexplain()してみると、indexを使わないで検索してたりすることが分かる。

```bash
$ mongo
> db.collection.find().explain()
```
mongoDBでindexを使っていないクエリをエラーにする

mongodコマンドに--notablescanオプションを付けて起動する。

```bash
$ mongod --notablescan
```

indexを使ってない検索のことを、(フル)テーブルスキャンと言うらしい。
そのようなクエリが発行された場合は以下のようなエラーが出るようになる。

```bash
failed with error 10111: "exception: table scans not allowed <collection>"
```
SwiftがRubyMotionを駆逐することは無い



Swift祭りに乗じて、個人的に気になったトピックを。
超意訳ですがご容赦ください&推敲あればツッコミよろしくお願い致します！

原文：
Why Swift Will Never Replace RubyMotion
http://blog.motioninmotion.tv/why-swift-will-never-replace-rubymotion


※ 著者はRubyMotionのScreenCastを運営されている方のようです。
MotionInMotion
https://motioninmotion.tv/


# 翻訳

SwiftがRubyMotionを消し去るという、真実からかけ離れたツイートがたくさん流れているね。
みんなもう少し自分の頭で考えてみようよ。ちょっと説明するからさ。

## RubyMotionのメリットは一連のツールチェインである（シンタックスのみではない）

まず多くの人が言っているのが、「SwiftはObjective-Cと比べて圧倒的にシンタックスがイケてる（からもはやRubyでiOSを書く必要はない）」ってこと。
でも、それはRubyMotionの他のメリットを打ち消す説明にはならないよ。

RubyMotionには他にもこんなメリットがあるんだ。

1. コマンドラインベースのツールチェイン（君好みのエディタ/IDE/ターミナルを含む）
- Rubyであること（つまり他のプロジェクトのgem（※）やコード群が活かせるってこと）
3. 成長し続けている活発なコミュニティ

これらはもはやシンタックスレベルの話じゃない。

（※注 正確に言うと、gemは「RubyMotion用に作られた専用gem」のみ利用可能です。）

## RubyMotionは進化し続けている

RubyMotionは間もなくAndroidにも対応する。
プラットフォームの制限を取払い、事業立ち上げの観点でも大きなメリットを生むんだ。


SwiftはあくまでAppleのプロダクトだ。Appleのために作られ、Appleプラットフォーム上でのみ動く。


## 君はまだSwiftについて何も知らない

しばらくの間、大半のプロダクトはSwiftで書かれはしないだろう。
ドキュメントやガイド程には、我々はSwiftのことをよく知らないのだから。

相当尖っていて、向こう見ずなチームでない限り、まだSwiftをプロジェクトに導入することはないだろう。


## ムダに敵対関係を作ろうとしてないかな

言語の好き嫌いに関する強い宗教観を持っていることは、僕たち"開発者"の悲しい性だね。
Rubyやそれにまつわるものについて、それは特に顕著だ。

でも、Swiftが登場したこのタイミングになって、RubyMotionをディスり、否定し、
RubyMotionは死んだと叫ぶ（DHHが言いそうな冗談だ）前に、いくつか覚えておいて欲しい。

RubyMotionは驚くほど優秀な開発者に作られた。
彼らは事業を立ち上げ、人々に驚くべきプロダクトを提供し、収益的に優れていてかつ継続的な事業モデルを構築した。
そして、RubyMotion登場前にはとても叶わなかったことを可能にするツール・手段を世界中の人々に提供した。

RubyやObjective-Cの良し悪しに関する議論は、その背後にあるプロダクトやチーム、投資や支持者、コミュニティに対する非難とは根本的に別ものだ。

既に恊働するための手段は揃っている。
もっとも適した方法で問題を解決でき、開発者が最も良い方法でタスクをこなせるようになっているんだ。
ムダなプログラミング言語談義はもう止めよう。


# （追記）RubyMotionの公式見解

![スクリーンショット_2014_06_04_17_55.png](https://qiita-image-store.s3.amazonaws.com/0/8790/153c8505-854d-5746-f671-6d9d95ecba61.png "スクリーンショット_2014_06_04_17_55.png")

同じことを言っていますね！
REST APIドキュメント作成ツールはapiary.ioが決定版かもしれない


背景

- [APIドキュメントを書くのが楽になるツールまとめ - Qiita](http://qiita.com/horimislime/items/32acf0f1be33a269a309)
- [iodocsで便利なREST APIドキュメントを作成する - Qiita](http://qiita.com/horimislime/items/ed13637c070b99dae959)



これまでずっとREST APIドキュメントをwiki上で管理していて、重たいページ上で特殊記法使ったり、スタイルの調整に時間を取られるのが辛かった。そこで良さげなドキュメントツールを色々調べてたんだけど、最終的に[apiary.io](http://apiary.io)が一番良さそうという結論になってきた。

このサービスの主な特徴。

- markdown記法でAPIドキュメントを記述できる
- ドキュメントの生成と同時にAPIのモックサーバを用意してくれる
- サインアップから5分くらいあればドキュメント公開できる。ドキュメントのホスト先を気にしなくてもいい。

特にドキュメントと一緒にモックを作ってくれるのは他にはないポイントでかなり便利。

# 使ってみる
サインアップはGithubアカウントで [http://apiary.io](http://apiary.io) から。ログインしたら↓のようなサンプルのAPIドキュメントが用意されていて、ページ上のエディタですぐに弄って見た目をプレビューできる。

![Screen Shot 0026-05-28 at 21.01.37.png](https://qiita-image-store.s3.amazonaws.com/0/7325/8c120ac4-6b3a-fd52-9d3f-0b197d8d6c8f.png "Screen Shot 0026-05-28 at 21.01.37.png")

ドキュメントの記述はMarkdownライクな記法が使える。試しに1個APIを追加してみる。

```
# ユーザ情報API
## ユーザ情報へのアクセス [/user/{id}]

### ユーザ情報を取得する [GET]
+ Response 200 (application/json)

        {
          "nickname": "horimislime",
          "livetown": "tokyo"
        }

```

H1で一つのAPIグループを定義して、H2でそのAPIに属するエンドポイントを記述する。更にH3でエンドポイントがサポートしているHTTPメソッド毎のレスポンス例が書ける。上の例だと/user/{id}へのGETリクエストがstatus 200の場合に返ってくるjsonのbodyを記述している。

これだけ書いて保存すれば、即座にAPIドキュメントがグローバル公開される。
[horimislimeのてすと API—by apiary.io](http://docs.horimislime.apiary.io/)

更に便利なことに、 **ここで書いたリクエストやレスポンス形式を元にAPIのモックサーバまで生成してくれる！**上の例だと `http://horimislime.apiary-mock.com/user/{任意のID}` にリクエストを飛ばせば定義しておいたサンプルレスポンスが返ってくる。

![Screen Shot 0026-05-28 at 21.21.54.png](https://qiita-image-store.s3.amazonaws.com/0/7325/27251f51-d6d3-fada-7973-2e4df813abb8.png "Screen Shot 0026-05-28 at 21.21.54.png")

わざわざcurlとか叩かなくても、ドキュメントページ上の`Try It`からリクエストを投げてレスポンスを確認することもできる。便利！

![Screen Shot 0026-05-28 at 21.25.18.png](https://qiita-image-store.s3.amazonaws.com/0/7325/91ea398d-cf6c-e810-b493-1773a981fd28.png "Screen Shot 0026-05-28 at 21.25.18.png")

# おわり
使ってみた印象、サインアップしてすぐ使えるのが楽で、しかもmarkdownベースな記法ですんなり書けるのがとにかく大きいと思った。チーム開発現場で新しいツール入れる時、導入とか学習のコストが悩みの種だけどこれなら入れる敷居も高くない気がする。

モックの自動生成も魅力的で、サーバサイドのAPI実装がなかなか進まない時クライアント側がAPI待ち状態になって申し訳ない感じになるけど、apiaryで書いておけば仕様決めてドキュメント渡すと同時にモックでテスト進めてもらえるから効率良さそう。
GNU screen のバージョンをあげたら、踏み台サーバ経由の ssh 接続ができなくなった

## 先に結論

~/.screenrc の shell はフルパスにしましょう

```~/.screenrc
shell /bin/zsh
```

## 環境

fumidai を経由して、server に接続していた

```
local -> fumidai -> server
```

~/.ssh/cofig はこんな感じ

```~/.ssh/cofig
Host fumidai
  Hostname xx.xx.xx.xx

Host server
  HostName yy.yy.yy.yy
  ForwardAgent yes
  ProxyCommand ssh fumidai -W %h:%p
```

## ある日から、急にこんなエラーが...

```
$ ssh server
zsh: No such file or directory
ssh_exchange_identification: Connection closed by remote host
```

最初、zsh が、何かを探して、"No such file or directory" を出したのかと思っていたけれど、
zsh そのものが、"No such file or directory" だった

- [Bug 1494 – doesn't look on path for $SHELL](https://bugzilla.mindrot.org/show_bug.cgi?id=1494)

openssh では、環境変数 SHELL を参照するが、そこの値が絶対パス で無いため、問題になったらしい
確かにローカル環境で、環境変数 SHELL を確認すると、コマンド名のみになっている

```
$ echo $SHELL
zsh
```

- $PATH は参照しないのね


## GNU screen のバージョンで、$SHELL の値が変わる

とはいえ、最近そんな環境変数をいじった覚えもないし...
そもそも、環境変数 $SHELL は自前でいじらないで、screen に任せてるし...

```~/.screenrc
shell zsh
```

screen も最近、Mac のデフォルトのやつから、Homebrew で最新のにしたばかりだし...

**まさか...**


### Mac のデフォルトの screen

```
$ /usr/bin/screen -v
Screen version 4.00.03 (FAU) 23-Oct-06
$ /usr/bin/screen
$ echo $SHELL
/bin/zsh
$ ls /bin/zsh
/bin/zsh*
$ ssh server
```

正常に踏み台 ssh 接続できる


### Homebrew で入れた screen

```
$ /usr/local/bin/screen -v
Screen version 4.02.01 (GNU) 28-Apr-14
$ /usr/local/bin/screen
$ echo $SHELL
zsh
$ ls zsh
ls: zsh: No such file or directory
$ ssh server
zsh: No such file or directory
ssh_exchange_identification: Connection closed by remote host
```

orz

## ~/.screenrc の shell はフルパスに変更

```~/.screenrc
shell /bin/zsh
```

```
$ screen -v
Screen version 4.02.01 (GNU) 28-Apr-14
$ screen
$ echo $SHELL
/bin/zsh
$ ls /bin/zsh
/bin/zsh*
$ ssh server
```

踏み台 ssh 接続できた!!

## 参考

- [Bug 1494 – doesn't look on path for $SHELL](https://bugzilla.mindrot.org/show_bug.cgi?id=1494)
- [ncある限りぼくはどこまででもいけるッ！ - (ひ)メモ](http://d.hatena.ne.jp/hirose31/20070419/1176968993)
ユニークな数値をいっぱい作ってみた

#はじめに
ユニークな数値、かつチェックサムがあるもの
というお題があったので関わってみました。

##objective-c
Xcodeから新規でプロジェクトを作成します。
![スクリーンショット 2014-06-03 19.46.16.png](https://qiita-image-store.s3.amazonaws.com/0/12362/6991305e-c216-3e51-239d-3a5d353a8390.png)

```objc:main.m
//
//  main.m
//  fourNumber
//
//  Created by f-y on 2014/05/26.
//  Copyright (c) 2014年 f-y. All rights reserved.
//

#import <Cocoa/Cocoa.h>

//#define MODE_DEBUG

int main(int argc, const char * argv[])
{
    //計測用
    NSDate *startDate;
    NSDate *endDate;
    
    // 現在時間を代入
    startDate = [NSDate date];
    int i, n;
    NSMutableDictionary * mdic = [[NSMutableDictionary alloc]init];
    
    i=0;
    do {
        n = arc4random_uniform(1000) ;
        if (n==0) continue; //0は使わない
        
        //セットしているobjectは適当
        [mdic setObject:@"1" forKey:[NSString stringWithFormat:@"%03d", n]];
#ifdef MODE_DEBUG
        i++;
        NSLog(@"%3d回目 = %03d", i, n);
#endif
    } while ([mdic count]<500);
    
#ifdef MODE_DEBUG
    NSLog(@"count %lu",(unsigned long)[mdic count]);
#endif
    i=0;
    NSMutableArray * array = [[NSMutableArray alloc]init];
    for (NSString * key in mdic) {
        //------- CheckSum
        int oddSum = [[key substringWithRange:NSMakeRange(0,1)] intValue] + [[key substringWithRange:NSMakeRange(2,1)] intValue];
        int evenSum = [[key substringWithRange:NSMakeRange(1,1)] intValue];
        int checkNO = (oddSum * 3 + evenSum)%10;
#ifdef MODE_DEBUG
        NSLog(@"oddSum * 7 + evenSum: %d,  checkNO %d", oddSum * 3 + evenSum,checkNO);
#endif
        [array addObject:[NSString stringWithFormat:@"%@%d",key ,checkNO]];
        
#ifdef MODE_DEBUG
        //------- Result
        i++;
        NSLog(@"%4d回目 = %@ checkNO: %d",i,key,checkNO);
#endif
    }
    // 処理終了位置で現在時間を代入
    endDate = [NSDate date];
    NSArray * a = [array copy];
    
    // 開始時間と終了時間の差を表示
    NSTimeInterval interval = [endDate timeIntervalSinceDate:startDate];
    
    // 日付フォーマットオブジェクトの生成
    NSDateFormatter *dateFormatter = [NSDateFormatter new];
    // フォーマットを指定の日付フォーマットに設定
    [dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss.SSS"];
    // 日付の文字列を生成
    
    NSLog(@"開始時間 = %@",[dateFormatter stringFromDate:startDate]);
    NSLog(@"終了時間 = %@",[dateFormatter stringFromDate:endDate]);
    NSLog(@"経過時間 = %.3f秒",interval);
    NSLog(@"-------------------------------");
    NSLog(@"配列の数 = %lu",[a count]);
    NSLog(@"%@",[a componentsJoinedByString:@","]);
}
```
デバッグ時には#define MODE_DEBUGのコメントを外します。
NSLogをつけているとだいぶ時間がかかるのが分かります。

##mysql
XAMPPがあったので、mysqlAdminから確認しつつ、です。

先に

```mysql
> CREATE TABLE t (i INT);
> INSERT INTO t VALUES(1),(2),(3), ... , (1000);#ここは...の部分も1000個値を記述します
```
INSERTする値はExcelで横にだーっ！と1000列値をつくって
テキストに貼付けて成形しました。


```mysql:tekito.sql
SELECT distinct value FROM 
(
SELECT randNO,
( (substring(randNO,1,1) +  substring(randNO,3,1))*3 + substring(randNO,2,1)) % 10 as checksum ,
concat(randNO,( (substring(randNO,1,1) +  substring(randNO,3,1))*3 + substring(randNO,2,1)) % 10) as value
 FROM(
SELECT t.i, lpad(FLOOR(1 + (RAND() * 998)),3,'0') as randNO
 FROM t
) tmp

) randValues
LIMIT 500
```
#さいごに
普段あまり調べない領域を復習できてよかったなと
自己満足ついでにアップしただけです。ごめんなさい
Haskellの関数の動作チェック4

# 関数の使い方メモ

動作環境
GHCi, version 7.6.3

## concat関数
```
Prelude Data.List> concat ["a", "b", "c", "d"]
"abcd"
Prelude Data.List> concat [[1,5], [2,6], [3,7], [4,8]]
[1,5,2,6,3,7,4,8]
```

## concatMap関数
```
Prelude Data.List> concat $ (map (\x -> show x) [1, 2, 3, 4])
"1234"
Prelude Data.List> concatMap(\x -> show x) [1,2,3,4] == concat((map(\x -> show x) [1,2,3,4]))
True
```

## and関数
```
Prelude Data.List> and [True, True, False]
False
Prelude Data.List> and [True, True, True]
True
Prelude Data.List> and $ map even [2, 4, 6, 8]
True
```

## or関数
```
Prelude Data.List> or [False, False, False]
False
Prelude Data.List> or [False, False, True]
True
Prelude Data.List> or $ map odd [2,4,6,8]
False
Prelude Data.List> or $ map odd [2,4,6,8,9]
True
```

## any関数
```
Prelude Data.List> any (==0) [1..10]
False
Prelude Data.List> any (==0) [-1..10]
True
```

## all関数
```
Prelude Data.List> all (/=0) [-1..10]
False
Prelude Data.List> all (/=0) [1..10]
True
```
Linux/UNIXサーバは立てたらまず時刻同期の設定

信頼できるタイムスタンプがログに残っていることが障害調査の重要な手がかりとなります。
正確な時刻の確保はサーバ管理の根本ですので、時刻同期の設定はOSをインストール後に最優先で行う作業と位置づけられるものです。

基礎知識として
==
* 時刻は **ハードウェアクロック** とOS上の **ソフトウェアクロック** がともに刻んでいます。
稼働中はソフトウェアクロックだけが参照されますが、ハードウェアクロックはマシン停止時にも動き続けているので
起動時にはハードウェアクロックがソフトウェアクロックへ読み込まれます。
* ネットワークから現在時刻を提供するサービス(NTP)により時刻合わせをします。
このとき、特に時刻を遅らす場合、急に遅らせる操作はしません。時刻が後ろへ飛ぶことによりログの時刻の前後関係がひっくり返る可能性があるからです。
（ログ以外のソフトウェア動作も異常を来すかも知れません）
ソフトウェアクロックのテンポを微妙に落とすことでゆっくりと時計を遅らす操作を **SLEWモード** の時刻設定と呼びます。

稼働中には

* 定期的にNTPサーバを参照してソフトウェアクロックをSLEWモードで正確に保つ
* 定期的にソフトウェアクロックをハードウェアクロックへ反映する

ことにより稼働中・再起動後とも正確な時刻を保てます。


設定
==
1. **ntpd（NTPクライアント・サーバ）のインストール**
<pre># chkconfig</pre>で出てくるリスト内にntpdがあればインストール済みです。
インストールはRedhat系のLinuxなら<pre># yum install ntp</pre>で。Debian系なら<pre># apt-get install ntp</pre>ですね。
chkconfigの結果でntpがランレベル3,4,5でonになっていなければ<pre># chkconfig ntpd on</pre>で自動起動を設定します。
1. **ntpdの設定**
純粋にクライアントとして動作するように設定します。
参照先として、日本国内のサーバならNICTの設置するntp.nict.jpを指定します。社内サーバなら社内NTPが指示されているかも知れません。
ntpdの設定ファイルはOSにもよりますが /etc/ntp.conf などです。以下はNICT接続の設定例です。<div class='highlight'><pre>\# 時刻の狂いがどんなに大きくても動作停止はしないが、300秒以上狂っていたらSLEWせず一気にあわせる。
tinker panic 0 step 300
\# 時刻の狂う傾向を統計して以下のファイルに記録する
driftfile /var/lib/ntp/drift
\# サーバとしての動作は全面禁止
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
\# ただしローカルホストからのアクセスは許可
restrict 127.0.0.1
restrict -6 ::1
\# NICTからのアクセス（返答パケット）を許可する
restrict 133.243.238.163 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.164 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.243 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.244 mask 255.255.255.255 nomodify notrap noquery
\# 同期先はNICT
server ntp.nict.jp</pre></div>

1. **ntpdを再起動** <pre># service ntpd restart</pre>
1. **時刻同期ができていることを確認**
ntpd起動後しばらくしてから<pre># ntpq -p</pre>を実行して同期状況を表示させます。結果のサーバ名の左端に'*'が出ていれば同期中であることがわかります。
1. **ハードウェアクロックへの定期反映の設定**
/etc/crontab ファイルに次の行を追加します。<pre>0 5 * * 0 root /sbin/hwclock -w > /dev/null 2>&1</pre>これにより、毎朝5時にソフトウェアクロックがハードウェアクロックに反映されます。

ntpdを起動した時点で時刻が5分以上狂っていた場合、上記の設定ではSLEWでなく一気に合わさりますのでご注意ください。
Android 2.x系の充電について

いまさらですが、検証端末とかで2.x系のAndroidはまだまだ使われてると思うので、充電のハマりどころについてです。

「 **Android USB 短絡** 」とかでググると実はUSBの構造や改造系のネタで出てくるんですが、周りで結構ハマっていた人が多かったので、書いてみました。

何かっていうと...

# Android2.x以前には普通のUSBケーブルで充電できないやつがいる！！

なんで、こんなことが起きるかっていうと、市販のUSB microのケーブル買ったことがある人やメカに強い人だったら知ってると思いますが、USB microには"充電専用"と"通信用"の2種類あるからです。

最近発売されている端末でしたら、通信用も充電で使えます。

## 充電用と通信用って何が違うの？

USBのコネクタを開いてみると一番わかり易いんですが...
(やらないでください)
端末によってはUSBつないだ時に下記のような表記が出てわかったりもします。
充電用: AC
通信用: USB

USBは4本のラインで構成されていて、外側が給電に内側が通信に使用されます。
それで、4本すべてが結線されているものが通信用となり、通信を行わないようにするために中の2本を結線せずに短絡(ショート)させたものが充電用となります。

![o0348024412245525994.jpg](https://qiita-image-store.s3.amazonaws.com/0/9094/12e36101-e4d8-8677-1207-446175d54cdc.jpeg)
(↑ググったらいい感じのが出てきたんで使わせてもらいました。)

つまり、古い端末ではある意味で"素直"な作りになっているため、

 **充電するときは充電用を、データ通信を行うときは通信用を使わなければいけないようになっていた。** 

というわけです。

先ほど、"普通のUSBケーブル"といいましたが、ここ最近出回っている、もしくは端末を買った時にオプションでついてくるのは通信用ケーブルなので、充電用じゃなければ充電出来ないやつには対応できないということです。

## 最後に
構造がわかってしまえば、自作できなくもないですが、保証できないので充電用を購入されることをおすすめします。

## 追記

もしこれでもダメだったら、電流・電圧の関係だと思うんで、

* PCにつないで充電してダメな場合はコンセントで
* コンセントで充電してダメな場合はPCで

充電してみてください。

あとあるとしたら過充電・過放電で電池がダメになってるパターンかなぁ。
ここまで言ったらキャリアのショップとかサポートセンターとかにいって充電できるか確認してもらったほうがいいけど
UiAutomatorのプロジェクト作成→実行までメモ.

AndroidにはUIをテストする目的でGoogle神からUiAutomatorというツールが配布されています.API Level 17ぐらいから使えるみたいなので主にKitKat以降の対応になりそうですが.

* [uiautomator](http://developer.android.com/tools/help/uiautomator/index.html)

せっかくツールがあるのだから,今回はそのツールを悪用する方法をメモっていきます.

# 目的

UiAutomatorの仕組みを利用してUiAutomatorをテスト以外のことに利用する.

# 手順

## Projectの作成

Android SDKのインストールとか知りません.ググって参考にしてください.UiAutomatorのProjectは基本的にはJUnitベースになります.Java＝EclipseなのでEclipseのJava Projectを作成しましょう.


1. Eclipse を起動し、[File] > [New] > [Java Project] からProjectを作成する.
2. 作成したProjectを右クリックし, [Build Path] -> [Add Library...] -> [JUnit]を選択, [JUnit3] を選択して終了.
3. 同じく [Build Path] -> [Add External Archives..] を選択し,対象となるAndroid SDKのplatformフォルダ以下から, android.jar、uiautomator.jar を選択

API Level 16にuiautomator.jarがあったのでそこから使えるかも？

## build.xmlの作成

UiAutomator用のBuildをするためにbuild.xmlを生成します.

```bash
$ cd <project path>
$ android create uitest-project -n <project name> -t <Target SDK No.> -p .
```

ここで,SDKのNoはAdd External Archivesで追加したNoと同じものを指定します.

## Project 作って Build

とりあえず私が今回作ったソースコード置いておきます.

* [setsulla/pappet](https://github.com/setsulla/pappet)

こいつをBuildするのですが,Eclipseからの場合, 右クリック -> [Run As] -> [Ant Build]の下の方を選択し, [build]を選択してください.そうしないとhelp が流れるだけですし.

正常に動作すれば,Project Path以下に<Project名>.jarというファイルが出来上がります.

## Android 端末で実行
まずは先ほど作ったjarファイルをAndroid端末に打ち込む.

```bash
$ adb -s <Device ID> shell push <Project名>.jar /data/local/tmp
```

その後,実行コマンドを投げる.今回は[前回](http://qiita.com/setsulla/items/177b90d77c14a93631f9)作ったswipe部分.

```bash
$ adb -s <Device ID> shell uiautomator runtest <Project名>.jar -c <Package名>.<Class名>#swipe -e "x" "100,200,300" -e "y" "400,500,400"
```

# 結論

Java書けなくなってる.

# 参考
* [[Android] はじめてのuiautomator](http://www.adakoda.com/adakoda/2012/12/android-uiautomator-2.html)
* [uiautomatorを試してみた #android_tec](http://nowsprinting.hatenablog.com/entry/2012/11/22/235609)
文字列(string)から特定の文字を削除する方法

文字列(string)から空白や特定の文字を削除する方法。

```cpp

//空白を削除する場合
string testString = " a b c d ";
for(size_t c = testString.find_first_of(" "); c != string::npos; c = c = testString.find_first_of(" ")){
	testString.erase(c,1);
}
printf("%s\n",testString.c_str());

//空白とeを削除する場合
testString = " a eb c ed ";
for(size_t c = testString.find_first_of(" e"); c != string::npos; c = c = testString.find_first_of(" e")){
	testString.erase(c,1);
}
printf("%s\n",testString.c_str());
```

printfは両方とも
`abcd`
と出力されるはず。for文の所はwhileで書いた方が見やすいかも（変数cが外に出るのは嫌だけど）。

```cpp
size_t c;
while((c = testString.find_first_of(" ")) != string::npos){
  testString.erase(c,1);
}
```
socket.ioでのセッション認証(connect.utils.parseSignedCookiesからの変更)


いままでこんな感じでセッション認証行ってたところ

```Javascript
var cookie = require('cookie').cookie.parse(handshake.headers.cookie);
cookie = connect.utils.parseSignedCookies(cookie, 'secret_key');
var sessionId = cookie['cookie_key']
```

connectがこんなwarning出してるのに気づいた。

`connect: utils.parseSignedCookies: this private api moved with cookie-parser`


cookie-parser使えってことらしい。なので、こんな感じに変更したらうまくいった

```Javascript
var cookieParser = require('cookie-parser')
var parseCookie = cookieParser('secret_key');

parseCookie(handshake, null, function(err) {
    if (err) {
        return accept('Error parseCookie.', false);
    }

    var sessionId = handshake.signedCookies['cookie_key'];

	// sessionIdを使用してチェック
});


```
@id/hoge と @+id/hoge の違い(プラス記号の有無)について

Android でレイアウトを作成するとき、XMLファイルで

```xml
<TextView android:id="@+id/hoge" />
```

のように指定をしますが、`android:id="@[+]id/hoge"` と指定するプラス記号に意味があるのかどうか気になったので調べてみました。

## ID 指定でプラス記号[+]があると新規リソースIDが作成され R.java に追加される

Android の公式ガイドに回答が載っていました。

> Value for android:id
> 
> For the ID value, you should usually use this syntax form: .  "@+id/name".
> The plus symbol, +, indicates that this is a new resource ID and the aapt tool will create a new resource integer in the R.java class, if it doesn't already exist.
>
> ( [Layout Resource | Android Developers](http://developer.android.com/guide/topics/resources/layout-resource.html) )

超意訳すると、

```
android:id は "@+id/name" のように指定してね。
このプラス記号[+]は、新規リソースIDを作成することを表していて、プラス記号付きのIDがもし R.java クラスにない場合は、aapt ツールが R.java クラスに新規リソースを作成するよ。
```

とのことです。
他にも、StackOverflow で、

> "@+id/add_button" : for add new id
>
>  "@id/add_button" : to refer existing id
>
> you should use "@id/add_button" only when "add_button" is already added 
> to R.java class using  "@+id/add_button" 
>
> ( [what is the difference betwenn @id/ and @+id/ in android? - Stack Overflow](http://stackoverflow.com/questions/5731414/what-is-the-difference-betwenn-id-and-id-in-android) )

のような回答もありました。
プラス記号付きIDは追加、プラス記号無しIDは参照とのことです。

なので、通常はレイアウトの android:id の値にはプラス記号[+]付きIDを指定するのが良いみたいです。

## 参考URL

* [what is the difference betwenn @id/ and @+id/ in android? - Stack Overflow](http://stackoverflow.com/questions/5731414/what-is-the-difference-betwenn-id-and-id-in-android)
* [android:id what is the plus sign for - Stack Overflow](http://stackoverflow.com/questions/2059693/androidid-what-is-the-plus-sign-for)
* [Layout Resource | Android Developers](http://developer.android.com/guide/topics/resources/layout-resource.html)
MySQLのSHOW TABLE STATUSに騙された

## rowsが違うんですが・・・

テストしてて気付きました。
rowsを早く知りたくて show table status を使っていたのですが、実は適当な値だったのです。
膝から崩れ落ちそうになりました。

### コンソール

※ 固有名などはマスクしています

```mysql
[root@hoge batch]# mysql -uroot -proot --database=my_work
mysql> show table status;
+-----------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| Name      | Engine | Version | Row_format | Rows    | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment       |
+-----------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| hogehoge  | InnoDB |      10 | Compact    | 2502081 |          20164 | 50454331392 |               0 |   1566572544 |   7340032 |           NULL | 2014-06-02 03:17:08 | NULL        | NULL       | utf8_general_ci |     NULL |                |               |
+-----------+--------+---------+------------+---------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
mysql> select count(*) from hogehoge;
+----------+
| count(*) |
+----------+
|  4925548 |
+----------+
1 row in set (8.27 sec)
```

select count(*)の値が正しくて show table status; のrowsは正しくないです。
4925548 - 2502081 = 2423467 の差が出ています。倍近い差です。

### ドキュメントを見ました

おじさん、ちょっとがっかりしちゃったな…

> + Rows
> 
> 行数MyISAM のようないくつかのストレージ エンジンは、正確なカウントを格納します。InnoDB のような別のストレージ エンジンにとっては、この値はおおよその物であり、実際の値とは40から50％くらい異なります。そのような場合は、正確なカウントを得る為に SELECT COUNT(*) を利用してください。 

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.27 SHOW TABLE STATUS 構文 http://dev.mysql.com/doc/refman/5.1/ja/show-table-status.html

### 気を付けます。。。

select count(xxx) のxxxはインデクスを張っているフィールドを指定するとちょっとは早いので頑張ります。
※ 正確にはNULLを許容しないフィールドを指定すると早いです
Slim3 on Eclipseで○○Modelをコンパイルしても○○Metaが出来ない時の対処方

### 前提

EclipseのFile NewからSlim3プロジェクトを作成すると、slim3-1.0.15.jarが入ってしまい、Jsonオブジェクトが返せなくて困ったので、zipアーカイブ1.0.16のblank projectからEclipseにインポートした。

# 問題
## AntタスクでModelを作ったのに、Metaが自動生成されない

gen-modelで○○Modelを作った。
Eclipseが作ってくれたSlim3プロジェクトの場合、いつの間にか○○ModelMetaが出来ていたハズだったのに、待てど暮らせど出来ない。。

ControllerからJsonを返したかったのに、○○Metaが無いとそれが出来ない。。

# 解決
## Eclipseのプロジェクト設定を追加する

Project property -> Java Compiler -> Annotation Processing -> Factory Pathで、[Add JARs...]ボタンをクリック。

- lib/slim3-gen-1.0.16.jar

を追加する。

![Slim3EclipseAnnotationSettings.png](https://qiita-image-store.s3.amazonaws.com/0/5691/ae1bea5d-7ae9-a76f-4577-e3adfd903bec.png)

（build pathに入ってないjarはどこで使われてるんだろう・・と思ってた疑問が解決された）

設定を変更すると、リコンパイルする？と聞いてくるので、Yesと答えると、○○Metaが作られる。
（いつの間にか作られてたわけじゃなくて、コンパイル時だった・・）

参考URL: [ModelのMeta Modelが作成されない場合のチェック項目 - 短い節目を重ねるアジャイル開発手法とJavaEE6でムリ・ムラ・ムダを無くすブログ](http://d.hatena.ne.jp/m-prog/20100425/1272212615)
Groonga読書会2 参加レポート

# 概要

2014-06-03 に開催された[Groonga読書会2](http://groonga.doorkeeper.jp/events/11834)の参加レポートです。

[Groongaの公式ドキュメント](http://groonga.org/ja/docs/)を輪読形式で進めていき、Groongaに対する理解を深めるのが目的です。

# 内容

今回はドキュメントの「2. インストール」〜 「4.1.15. 検索結果の並べ替え」の範囲でした。

## 2. インストール

各OSへのインストール方法が記載されています。
それぞれのOSでインストール方法が微妙に異なったり、ソースからビルドする際のパラメータの紹介もあったりと、普段気に留めない内容を見ることができました。

### 当日出ていた質問や解説があった部分は以下になります。

#### 2.3. Debian GNU/Linux
- 簡易HTTPサーバは変なリクエストが来たら応答しなくなる
    - nginxはその辺をカバーしてくれる
        - nginxのモジュール
- Munin では レコード数とかディスク容量とか8種類みれる
- ノーマライザーについて
    - 大文字小文字などの正規化処理を行う
    - モジュール化されているので追加などができる
    - インストールして指定することで使用可能

#### 2.5. CentOS
- ~~Juman辞書 はchasenの元になっていて、chasenはmecabの元になったもの らしい~~  
開発時期がJuman→Chasen→MeCab（右にいくほど新しい）となっている。
- Cent6 では MeCab を入れると ipadic も入ったらしい

#### 2.8. その他
- yum 等でインストールする場合は、各ライブラリ全部入り
- libevent （ サジェスト 用）
    - Groongaとは別にHTTPサーバを立ててる（別ポートで通信している）
- zlib （カラム値の圧縮用）、LZO （カラム値の圧縮用）
    - メモリリークするので使わないで
- マッチ演算とは
    - 検索してHITしない場合に、救済するためのもの
        - 検索条件を緩めて再検索を行う

## 3. コミュニティ

特筆することはありませんが、「英語圏向けMLもあったんだー」と1人プチ発見をしていました。

## 4. チュートリアル

Groonga DBの作成方法やテーブル・インデックスの作成、検索の初歩的な部分まで進みました。

### 当日出ていた質問や解説があった部分は以下になります。

#### 4.1.10. 全文検索用の語彙表の作成
- KEY_NORMALIZEフラグ は使わない方がいい
    - 代わりに NORMALIZERというパラメータを指定する必要がある
        - パラメータについては [8.3.29.4.6. normalizer](http://groonga.org/ja/docs/reference/commands/table_create.html#normalizer) 参照のこと。
- 普段は語彙表を意識して直接触らなくて大丈夫。
    - このINDEXならスコア高め、このINDEXならスコア低めとかを変えられる。
    - 通常は、カラム指定で検索すればGroongaが適宜INDEXを見てくれる。

#### 4.1.6. テーブルの表示

検索結果で返却される情報の中で、データとは別に情報が得られます。それぞれ以下のようになっています。

```
#   [
#     0, <- ステータスコード
#     1337566253.89858, <- クエリを開始した時間
#     0.000355720520019531 <- クエリの実行にかかった時間
#   ],
```

# 振り返り
- 全体的に、理解は深まったようで、会としては成功であったようです。
- インターネット環境についても、各自環境が用意出来ていたので、問題ありませんでした。
- 課題としては、進行が早く、メモをする時間や実際に動作させる時間があまり取れませんでした。

次回以降は、

- メモをする時間を取る（声をかけて進行を止める事をやりやすくする）
- 各自が実行する時間を取る or 代表者がスクリーンに映しながら実行してみる

あたりで改善していきましょうとの事でした。


# 所感
前回の読書会1には、終わりの10分程度しか参加できなかったため、実質今回が初参加でした。

読書会ということで、賑やかなイベントではありませんが、輪読の途中で思わぬ裏話的な事が聞けたりととても為になるイベントでした。

内容はGroongaのインストールからチュートリアルのさわりぐらいまででしたが、普段見る事の無い様々なOSへのインストール方法や、既にプログラムで行ってしまっているコマンド発行を改めて見直す良い機会となりました。

今回はドキュメントを読むのみで終わってしまいましたが、チュートリアルなどは実際に動かして結果を目で見ながら進められると、なお理解が深まるのかなと思いました。

次回がありましたら、また参加させていただこうと思います。

最後に、主催者であるクリアコードの皆さん、会場提供者であるぐるなびの皆さん、有意義な時間をありがとうございました。
エラトステネスの篩（Python編）

指定された整数以下に存在する素数を見つけるアルゴリズム

# 手順

1. 連番リストの先頭を取得
2. 連番を倍数リストに格納
3. 連番リストから連番の倍数を除去
4. 3を連番リストの末端まで繰り返す
5. 1-4を、連番リストの先頭が入力値の平方根以上になるまで繰り返す
6. 連番リストと倍数リストに残った数値が素数

# 通常コード

```py
# coding: utf-8

import sys
import math


if __name__ == '__main__':
    # 標準入力
    # 1行に数値を1つ入力
    # 入力終了は Ctrl + Z を押して Enter (for Windows)
    input_list = sys.stdin.readlines()

    for num in input_list:
        num = int(num.replace('\n', ''))

        if 2 > num:
            continue

        # 1. 入力値の連番リストを作成
        # 2, 3, 5の倍数はあらかじめ除去
        multiple_list = [2, 3, 5]
        serial_number_list = [r for r in range(2, num + 1) if r % 2 != 0 and r % 3 != 0 and r % 5]
                
        # 5. 連番リストの先頭が、入力値の平方根以上で終了
        while math.sqrt(num) >= serial_number_list[0]:

            # 2. 連番を倍数リストに格納
            multiple_list.append(serial_number_list[0])
                        
            # 4. 連番リストの末端まで繰り返す
            for serial_number in range(serial_number_list[0], serial_number_list[- 1] + 1,  serial_number_list[0]):
        
                if serial_number in serial_number_list:
                    
                    # 3. 連番リストから連番の倍数を除去
                    serial_number_list.remove(serial_number)

        # 6. 連番リストと倍数リストに残った数値が素数
        print(multiple_list + serial_number_list)
```

# 高速バージョン

- 連番はインデックスで管理
- 素数かどうかをbooleanで管理

```py
import math


def sieve_of_erastosthenes(num):
    input_list = [False if i % 2 == 0 or i % 3 == 0 or i % 5 == 0 else True for i in range(num)]
    input_list[0] = input_list[1] = False
    input_list[2] = input_list[3] = input_list[5] = True
    sqrt = math.sqrt(num)

    for serial in range(3, num, 2):
        
        if serial >= sqrt:
            return input_list

        for s in range(serial ** 2, num, serial): 
            input_list[s] = False


if __name__ == '__main__':
    while True:
        try:
            n = int(input())
        except:
            break
        
        input_list = sieve_of_erastosthenes(n)
        prime_list = [i for i, b in enumerate(input_list) if b == True]
        print(prime_list)
        print(sum(prime_list))
```
# 参考
[Wikipedia - エラトステネスの篩](http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)
[peria.jp - エラトステネスの篩](http://peria.jp/factor/prime/eratosthenes.html)
[エラトステネスの篩を頑張って高速化する](https://gist.github.com/sota1235/10620698)
Railsでdebug


固定の文字列を出力する場合

```
logger.debug("test")
```

@shopというオブジェクトの内容を出力する場合


```
logger.debug(@shop.inspect)
```

コントローラ、モデル以外から出力したい場合

```
Rails.logger.debug("test")
```

developmentのログレベルを変更したい場合
```
config/environments/development.rb
以下を上記ファイルに追加
config.log_level = :info
```
画面遷移後に遷移前のViewController.undoManagerが発動する

登場人物：
undoManagerを使っているViewController1
シェイクジェスチャーを検出しているViewController2

現象：
ViewController1からViewController2にpushした後、シェイクするとなぜかViewController1.undoManagerのAlertViewが出る
（ViewController2もシェイクジェスチャーは検出している）

原因：
ViewController2にmotionCanceled, motionEndedを実装していないことが原因だった。
（シェイクジェスチャーの検出にはmotionBeganを使っていて、実装もそれのみ）
おそらく、undoManagerはmotionEndedをトリガにしていて、ViewController2にmotionEndedがなかったためデフォルトの挙動としてnextResponder（ViewController1）に渡したのだと思う

よく考えたらViewController1.viewWillDisappearでresignFirstResponderをしていなかったからこんなことを考えなければいけなくなったのか
ubuntuにnVidiaドライバを入れたらUnityが起動しない場合の対処


- ubuntu 14.04 LTS x86_64
- nVidia linux driver 331.79 & 337.25 x86_64


## 症状
- lighdm（ログイン画面）はOK
- ログインするとUnityの背景だけ表示されて，何も操作できない

image from [Unity doesn't load, no Launcher, no Dash appears](http://askubuntu.com/questions/17381/unity-doesnt-load-no-launcher-no-dash-appears)
![](http://i.stack.imgur.com/9JClV.png)


## 再現性
あり．以下のいずれでも発生．

- ubuntu system settingのsoftware & update -> Addtional Drivers で外部ドライバ(nVidia)を入れて再起動する
- nVidiaドライバ(*.sh)を実行してインストールして再起動する




## 対処
- apt-getで対処：ダメ
[Unity doesn't appear after installing Nvidia drivers](http://askubuntu.com/questions/215016/unity-doesnt-appear-after-installing-nvidia-drivers)

- マザーボードから全部外して付け直したら治った人も．
[Unity does not appear after installing proprietary Nvidia drivers (GPU has fallen of the Bus / ACPI Failed)](http://askubuntu.com/questions/235760/unity-does-not-appear-after-installing-proprietary-nvidia-drivers-gpu-has-falle)



- nvidiaドライバを削除して，いろいろしたら，なんとか元には戻った
[Unity doesn't load, no Launcher, no Dash appears](http://askubuntu.com/questions/17381/unity-doesnt-load-no-launcher-no-dash-appears)
 - `Ctl`+`Alt`+`F1`でコンソールに行って下記などなどを実行

```sh
sudo service lightdm stop
sudo apt-get remove nvidia*
sudo apt-get install --reinstall linux-source linux-headers-generic unity ubuntu-desktop 
sudo apt-get install compizconfig-settings-manager
dconf reset -f /org/compiz/
unity --reset-icons &disown
unity --replace
sudo reboot
```
でもnVidiaドライバではない．


## 結果
グラフィックカードを入れ替えたら直った．．．．

```sh
sudo apt-get install nvidia-331-updates
sudo reboot
```

## 後日談
グラフィックカードを元に戻しても，問題なく動作した．
ただしグラフィックカードを挿すPCIスロットを変更してみた．

おそらく，ハードウェアの問題？　グラフィックカードを抜いて挿してみれば，接触不良か何かしら改善したと思われる．
NSStepperのボタンを離した時に処理を実行する

# 課題
![スクリーンショット 2014-06-04 9.07.51.png](https://qiita-image-store.s3.amazonaws.com/0/3847/d21243f7-2e52-91a6-2af9-99f3e7e897ba.png)

NSStepperで連続的に値を変更したあと、ボタンを離した時に何か処理をさせたいという時にどうするか。

# 方法
 * Stepperのカスタムクラスをつくる
 * mouseDownメソッドを変更

この2つ。

```objc:MyStepper:m
-(void)mouseDown:(NSEvent *)theEvent
{
    [super mouseDown:theEvent];
    NSLog(@"(ﾟ∀ﾟ)");
}
```
NSStepperはマウスのボタン押下から離すまで mouseDownメソッドの中でぐるぐる回っているので、カスタムクラスでは先にそれを処理させて、そのあとで自分のしたい処理を書けばいい。
Scala: パーサコンビネータで行数・文字数を取得しながらパースする


Scalaパーサコンビネータのデフォルトの振る舞いでは、パースしたトークンの何行目・何文字目といった位置情報は捨てられてしまいます。この記事では、`Positional` trait を使って位置情報を含んだトークンの取得方法を解説します。

パーサコンビネータの基本的な使い方は、[面倒くさいパーサの実装もDSLで書くだけ！そう、Scalaならね - Qiita](http://qiita.com/suin/items/35bc4afe618cb77f80f6)をご覧ください。

# 実装のポイント

## 1. `Positonal` traitをインポートしておく

位置情報をトークンに持たせるには `Positonal` traitが必要になるので、インポートしておきます。

```scala
import scala.util.parsing.input.Positional
```

## 2. トークンのcase classを作っておく

トークンのcase classを作るのですが、その際ベースとなる sealed trait を作り `Positonal` trait を継承しておきます。更に、case classはベースとなるそのtraitを継承するようにします。こうすることで、パターンマッチングの漏れが無くなります。

```scala
sealed trait Nucleobase extends Positional
case class G() extends Nucleobase
case class A() extends Nucleobase
case class T() extends Nucleobase
case class C() extends Nucleobase
```

## 3. `positioned` メソッドでパース結果を囲む

位置情報を必要としないパーサでは、次のコードのように `def パターン ^^ 関数` のように定義していきますが、位置情報を含む場合は `positioned` メソッドで各定義を囲む必要があります。

```scala
object DNAParser extends RegexParsers {
  def g = "G" ^^ { case _ => G() }
  …
}
```

次のコードが定義を `positoned` で囲んだコードの例です。この `positoned` は `def パターン ^^ 関数` の戻り値である `Parser` オブジェクトに位置情報を付加します。

```scala
object DNAParser extends RegexParsers {
  def g = positioned("G" ^^ { case _ => G() })
  ...
}
```

以上が実装のポイントです。


# コードの全体像

このポイントを踏まえて実装したコードの全体像は次に示すようになります。

```scala
import scala.util.parsing.combinator._
import scala.util.parsing.input.Positional

sealed trait Nucleobase extends Positional
case class G() extends Nucleobase
case class A() extends Nucleobase
case class T() extends Nucleobase
case class C() extends Nucleobase

object DNAParser extends RegexParsers {
  def g = positioned("G" ^^ { case _ => G() })
  def a = positioned("A" ^^ { case _ => A() })
  def t = positioned("T" ^^ { case _ => T() })
  def c = positioned("C" ^^ { case _ => C() })
  def expr = (g | a | t | c).*
  def apply(input: String): Either[String, List[Nucleobase]] = parseAll(expr, input) match {
    case Success(nucleobases, _) => Right(nucleobases)
    case NoSuccess(msg, next)    => Left(s"$msg on line ${next.pos.line} on column ${next.pos.column}")
  }
}

DNAParser("AAGA\nCGAT") match {
  case Right(nucleobases) => nucleobases.foreach(n => println(s"$n line: ${n.pos.line}, column: ${n.pos.column}"))
  case Left(errorMessage) => println(errorMessage)
}                                               //> A() line: 1, column: 1
                                                //| A() line: 1, column: 2
                                                //| G() line: 1, column: 3
                                                //| A() line: 1, column: 4
                                                //| C() line: 2, column: 1
                                                //| G() line: 2, column: 2
                                                //| A() line: 2, column: 3
                                                //| T() line: 2, column: 4
```

# 参考文献

* [Scaladoc 2.10.3 - scala.util.parsing.input.Positional](http://www.scala-lang.org/api/2.10.3/index.html#scala.util.parsing.input.Positional)
Objective-C で書いたアプリを Swift で書き換える5ステップ

昨日発表されたばかりの Swift ですが、言語仕様的な解説記事は早くもいろいろな方が書かれているので、実践的なところとして、「<b>Objective-Cで書いた既存アプリをSwiftで書き換える</b>」手順をまとめてみます。


アプリ全体、となると壮大なテーマになってしまうので、まずは AppDelegate だけ。


実際に移植する予定がなくても、Swiftのお試しがてらこの手順をやってみると、Objective-C と Swift の違いがよくわかり、「なるほど、このあたりのおかげで LLVM がグッと最適化できて高速化につながってるのか」とか実感できるのでおすすめです。


なお、NDA 下にある Xcode 6 については書けないので、ビルド設定等については割愛しています。


##1. 拡張子を .swift にする

例えば AppDelegate.m なら、AppDeleagate.swift にします。


##2. import の書き換え

ヘッダの import も移してきて、

```
#import <UIKit/UIKit.h>
```

だったのを

```
import UIKit
```

にします。


##3. クラス宣言の書き換え

これもヘッダから移してきて（実装ファイルに無名カテゴリで宣言しているメンバ変数やプロパティがあればそれもマージする）、

```
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end
```

だったのを、

```
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
}
```

にします。


ただし

```
@UIApplicationMain
```
は AppDelegate.swift のみ。


また上記のプロパティ宣言部分

```
var window: UIWindow?
```

にある `?` は、 **nilを許容するかどうか** を明示的に指定するものです。


##4. メソッド定義の書き換え

```
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}
```

だったのを、

```
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    // Override point for customization after application launch.
    return true
}
```

にします。


どこがどう書き換わっているかは、上記の例で一目瞭然で、説明不要かと思います。


##5. main.mを削除

あまりいじる機会の少ない main.m では、

```
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
```

と、UIApplicationMain 関数に AppDelegate のクラスを渡していました。


Swift では上述したように AppDelegate.swift に同等のことを書いてしまってるので、main.m は不要となるので削除してしまいます。



以上の手順で（とくに中身のないAppDelegateの場合は）ビルドが通って動作するようになります。
Scala: パーサコンビネータの | と ^^ の組み合わせは注意


昨日 [面倒くさいパーサの実装もDSLで書くだけ！そう、Scalaならね - Qiita](http://qiita.com/suin/items/35bc4afe618cb77f80f6) という記事を書いたが、パーサコンビネータではまった点があった。

パーサコンビネータの `|` (alternative) と `^^` (eye brows)の組み合わせで、最後の alternative にしか eye brows の関数が適用されないという問題です。


このサンプルコードを御覧ください。入力 `"1"` は `Number(1)` に変換されますが、入力 `"0"` は変換されません。 

```scala
import scala.util.parsing.combinator._

case class Number(number: String)

object Tokenize extends RegexParsers {
	def number = "0" | "1" ^^ { Number(_) }
	def apply(input: String) = parseAll(number, input)
}

println(Tokenize("0"))                            //> [1.2] parsed: 0
println(Tokenize("1"))                            //> [1.2] parsed: Number(1)
```

これは、`^^` オペレータが `"1"` のメソッドであるためのようです。カッコを補って表現すると次のような解釈になるわけですね。

```
def number = "0" | "1".^^({ Number(_) })
```

この解釈を回避するには2つ方法があります。

1. alternativeそれぞれに `^^` をつける
2. alternativeをすべて `( )` で囲んで評価の順番を変える

1の例

```scala
import scala.util.parsing.combinator._

case class Number(number: String)

object Tokenize extends RegexParsers {
	def number = "0" ^^ { Number(_) } | "1" ^^ { Number(_) }
	def apply(input: String) = parseAll(number, input)
}

println(Tokenize("0"))                            //> [1.2] parsed: Number(0)
println(Tokenize("1"))                            //> [1.2] parsed: Number(1)
```


2の例

```scala
import scala.util.parsing.combinator._

case class Number(number: String)

object Tokenize extends RegexParsers {
	def number = ("0" | "1") ^^ { Number(_) }
	def apply(input: String) = parseAll(number, input)
}

println(Tokenize("0"))                            //> [1.2] parsed: Number(0)
println(Tokenize("1"))                            //> [1.2] parsed: Number(1)
```

`|` と `^^` の評価の順番を常に意識していないとはまるので、`|`を使うときはいつもカッコをつけるようにしておいたほうが考えなくていいので楽かもしれませんね。
Oracle sqlplus などで出力の横幅調整

クライアントによっては、固定文字列長データをそのままの長さで出力するものがあるようです。
このせいで単純な出力が読みづらい・時間かかる等の場合への対応

## 使用例


```:長い固定長文字型hogehogeを20文字に切り詰めて表示
SQL> COLUMN hogehoge FORMAT a10;
SQL> SELECT hogehoge FROM ...
```

## 代替手法
そもそも `SQL Developer` とか使えば不要でした。
超初心者の Oracle データベース開発環境導入

Oracle 使ってるプロジェクトで、試行錯誤のためにローカルにデータベース用意たいよー
という時の作業メモ。

__※トライアンドエラーしまくったメモなので、このとおりの順序で作業できない可能性高いです。__

# 環境
* Windows 7 SP1 32bit

# インストールしたもの
* Oracle 11g Express Edition
    * 11.2.0
* Oracle SQL Developer

## 固有環境
* Oracle 11g Express Edition
    * インストールディレクトリ： `C:\oraclexe\`
    * データ用ディレクトリ： `c:\oraclexe\data\`

固有パスをあわせる必要はないですが、必要であれば以下読み替えてくださ
い。


# インストール
* Oracle 公式にユーザ登録し、必要なファイルをDL
* 手順は省略
* システムのパスワードは覚えておく


# 初期作業

## 接続設定(サービス名およびSID)確認
`C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN\tnsnames.ora` を確認
(一般的には `XE` らしい)

## 接続確認
`powershell` などから

```
> sqlplus system/システムのパスワード
SQL>
```

## 表領域作成
※ユーザ名などは適当です。

```
SQL> CREATE TABLESPACE MY_DATA
  2> DATAFILE `c:\oraclexe\data\MY_DATA.dbf` SIZE 200M
  3> SEGMENT SPACE MANAGEMENT AUTO;
     表領域が作成されました。
```

## ユーザ作成、権限付与
```
SQL> CREATE USER orauser
   2 IDENTIFIED BY orapass
   3 DEFAULT TABLESPACE MY_DATA;
     ユーザーが作成されました。
```

```
SQL> GRANT connect,dba TO orauser;
     権限付与が成功しました
```
実は権限付与作業は不要かも！？

# Oracle SQL Developer で開発作業
## 接続を登録

1. 表示(V) メニュー
1. 接続(C)
1. 接続の作成
1. 作成/選択ウィザード
    * 接続名(任意)
    * 登録済みの ユーザ名/パスワード 入力
    * ホスト名、ポート名、SID を指定

## 別 DB からインポート
Oracle SQL Developer の複製機能を使う。
Oracle データベースのバージョンが異なっても大丈夫！？

1. ツール(T) メニュー
2. データベース・コピー(C)
3. ウィザード
    4. ソース/宛先
        1. ソース、宛先を選択 (接続は登録済みとする)
        1. オプションのコピー： `オブジェクトのコピー` (デフォルト)
        2. DDL のコピー： `既存の宛先オブジェクトを置換しない` (デフォルト)
        3.  データのコピー： `コピー前に宛先データを切り捨て` (宛先にデータがあるなら、チェックオン)
    4.  オブジェクト型
        1.  全選択(デフォルト)
    5.  表領域の選択
        6. 参照(K) 押下
        7. `>>` で全てを対象にいれる
        8. 一覧から、`BIN$xxxxxx...` を選択し、`<` で対象から外す (2項目)
    9. データの指定
        10. 全選択 (デフォルト)
    11. コピーのサマリー
        12. 問題なければ、終了(F) でコピー開始。

## 同DBからインポート/エクスポート
とりあえず古いツール (exp/imp コマンド) を用いる。
powershell から操作

### exp
```
> cd 作業ディレクトリ
> $now = (Get-Date).ToString('yyyyMMdd-HHmmss'); exp orauser/orapass@XE  FILE=mydb.$now.sql  LOG=exp.$now.log
```

### imp
表領域を削除して作りなおす方針

```sql:dropTablespace.sql
drop tablespace MY_DATA including contents and datafiles;
create tablespace MY_DATA datafile 'C:\oraclexe\data\MY_DATA.dbf' size 200M segment space management auto;
quit;
```

```ps1:imp.ps1
sqlplus system/システムのパスワード @dropTablespace.sql

$now = (Get-Date).ToString('yyyyMMdd-HHmmss');  imp orauser/orapass@XE FROMUSER=orauser TOUSER=orauser  FILE=$args[0]  LOG=imp.$now.log
```
山本山（回文）

今回は回文です。与えられた文字列から、最短の回文を導き出し、その文字列長を返すという問題ですね。序盤悩んでよーやく出来たんですが、かなりゴリ押し的に解いたのでコードがきったないです（泣）
問題元：SRM428 Div2 Level1

```java:
import java.util.*;
public class Circular {
	public static int find(String s) {
		int size = s.length();
		boolean flag = true;
		char[] str = s.toCharArray();
		ArrayList<Character> list = new ArrayList<Character>(10);
		for(int r = 0; r < str.length; r++) { //ArrayListに文字列を叩き込む
			list.add(str[r]);
		}
		int idx = 0;
		while(flag) { //回文になっている箇所が文字列内にある時
			for(int r = 0; r < list.size(); r++) { //既に回文か判定
				//System.out.println(list.get(r) + " " + list.get(size - 1 - r));
				if(list.get(r) != list.get(list.size() - 1 - r)) {
					flag = false;
					break;
				}
			}
			if(flag) return(list.size()); //そうならば現在のサイズを返却
			list.add(size, str[idx++]);
			if(idx > list.size()) break;
			for(int r = 0; r < list.size(); r++) {
				System.out.print(list.get(r));
			}
			System.out.println();
			flag = true;
		}
		//回文が文字列内に一切無い時
		return(size * 2 - 1);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s = "abdfhdyrbdbsdfghjkllkjhgfds";
		String s2 = "abab";
		String s3 = "abacaba";
		String s4 = "qwerty";
		System.out.println(find(s4));
	}
}
```

せっかく全探索の練習をしているのに、なんかこのコード全探索では無い気がするんですよね・・・
何やってんだろ俺('・ω・`)
全探索のコードを最初書いたんですが（２重　＊　２重ループ）こんがらがって一切機能してなかったので、こっちに切り替えちゃいました。