OmniAICreator/Qiita-1.07M huggingface dataset:
dynamic library の OS Xの補足

前々回にFreeBSDでの静的ライブラリと動的ライブラリについて書いた。
そのときに、OS Xでもほぼ同じ、と書いたのだが、ここでは違いについて書く。

まず、FreeBSDやLinuxでは動的ライブラリのファイル名は `*.so` だが、OS Xでは `*.dylib` である。(試しに`*.so`にしても動いたので、拡張子はなんでも良いようだが)
そして、ライブラリの依存関係を調べるコマンドは `ldd` ではなく `otool -L` を使う。

リンク時のオプションで -L と -l を使うのは同じ。
ldには`-rpath`オプションはあるが `-rpath-link`オプションはない。(リンク時には-Lオプションと標準パスだけで探すらしい)
そして、-rpathオプションの扱いもFreeBSDとは違う。

# 基本
## 動的ライブラリの作成
前々回と同じソースで、libfunc2.dylibを生成してみる

```shell-session
% cc -c -fPIC func2.c
% cc -shared -install_name @rpath/libfunc2.dylib -o libfunc2.dylib func2.o
```
FreeBSDとの違いは、-install_nameオプションでライブラリのinstall nameを指定すること。

## 動的ライブラリのリンク

```shell-session
% cc -o test2 test2.c -L. -lfunc2 -Wl,-rpath,.
```
これで何が起きるかと言うと、実行ファイルのリンク時に指定した-rpathオプションのパス(.)が、ライブラリの`@rpath`と置き換えられる。
このため、実行時には./libfunc2.dylibを見つけて動的リンクしてくれる。

```shell-session
% otool -L test2
test2:
        @rpath/libfunc2.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
% otool -L libfunc2.dylib
libfunc2.dylib:
        @rpath/libfunc2.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
% otool -D libfunc2.dylib
libfunc2.dylib:
@rpath/libfunc2.dylib
```
`otool -D`は、動的ライブラリのid nameを表示するコマンド。

ライブラリが固定のディレクトリにインストールされる場合、わざわざ`@rpath`を使う必要はないので、以下のように書くことができる。

```shell-session
% cc -c -fPIC func2.c
% cc -shared -install_name ./libfunc2.dylib -o libfunc2.dylib func2.o
% cc -o test2 test2.c -L. -lfunc2
```
この場合は実行ファイルのリンク時に-rpathオプションは不要になる。(実際には`./`ではなくインストールディレクトリを指定すること)

たぶん、通常のコマンドラインアプリを作成する分には、ここまでの知識があれば良い。(むしろ、OS Xの場合は-rpathを使わない方が簡単だと思う)

しかし、OS Xの場合は、一般に配布されるアプリケーションは.appと言う形式になる。
.appは、実際にはディレクトリで、中には実行ファイルの他に必要なライブラリや、リソースファイルなどが含まれている。
このようなときに、.appがどこに置かれても動作するためには、ライブラリが/usr/local/libや/opt/local/libにあることが期待できず、.app内の相対パスで指定されなければならない。

`man dyld`すると、`@rpath`の他に、`@executable_path`や`@loader_path`と言うものが見つかる。それぞれ、実行ファイルのパスや、フレームワークのパスに置き換えられる。
ただ、通常.appを作成するときには、XcodeやQt Creatorなどを使用すると思うので、自分でこの辺の細かい指定をすることはあまりないのではないかと思う。
ライブラリを作成するときに、こんなものもあったかな〜と思い出すくらいで良いのでは。(と言うか、現時点であまり理解していない)

# libtool
OS Xも、Xcodeを入れると(？)、/usr/bin/libtoolが入る。
が、このlibtoolがGNUのlibtoolとは違うもののようで、同じ使い方はできない。

OS Xのlibtoolができることは、動的ライブラリを作ることと、静的ライブラリを作ることだけである。
`*.lo` も `*.la` も作らないので、同じ名前の完全な別物と考えた方が良いだろう。

```shell-session
% cc -c -fPIC test4.c
% libtool -dynamic -o libfunc4.dylib -install_name /usr/local/lib/libfunc4.dylib func4.o
ld: warning: -macosx_version_min not specified, assuming 10.10
% cc -o test4 test4.c -L. -lfunc4
```

ここで試した内容は、githubの osx ブランチにcommitしてある。
https://github.com/false-git/libstudy/tree/osx
onCreateView VS onViewCreated 

この二つ似てるけど、しっかり使い分けなきゃいけないので少し調べてみました。
初心者である僕は、この二つを見た時に、「何が違うねん」と思ってしまったので、そう思う初心者も多いのかもと思いながら書き綴ります。

##What is onCreateView

まず
```onCreateView``` から

これは、フラグメントのライフサイクルに出てくるやつですね。
詳細に関しては、[ここ](http://www.techdoctranslator.com/android/guide/activities/fragments)が一番分かり易いでしょう。

簡単に書くとこんな感じ。

```
onAttach()
↓
onCreate()
↓
onCreateView()
↓
onActivityCreated()
↓
onStart()
↓
onResume()
```

その中の１つがonCreateViewでFragment内で表示させたいViewを作成してるといった所でしょうか

##What is onViewCreated

さて、続いて```onViewCreated```です。
パラメーターは、viewとsavedInstanceです。こんな感じですかね。


```
public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
```


onViewCreatedではonCrearedViewが返された事をFragmentに知らせます。
引数にView viewがあるので、findViewByIdで各要素をとって来るみたいな感じでしょうか。


【追記】
これを買って真面目にFragment勉強しようと思います。
http://tatsu-zine.com/books/master-of-fragments
slackで過去のデータを日付で検索する

## + を打つだけ

右上の「Search」窓に`+`打ったらいろいろ条件を設定できました。

![Search.png](https://qiita-image-store.s3.amazonaws.com/0/14975/c110ec98-8d37-f35e-d68c-cde6351a8453.png)

ここに`+`を打つと...

![+.png](https://qiita-image-store.s3.amazonaws.com/0/14975/113da5c0-0004-b079-9bcb-9e361da969ba.png)

フィルターの選択肢が出てくるので好きなものを選べばok。
ちなみに日付で検索するには`on: a date`を選択すればいい。

![date.png](https://qiita-image-store.s3.amazonaws.com/0/14975/4c25f2bd-0dcf-3d3f-4a98-e6bab11e1b79.png)
Rspec の pending と skip って何が違うの？

何が違うか知らなかった時に調べたメモ。ちなみに Rspec 3 の話。

簡単に言うと以下のとおり。外的な要因で一時的に落ちているけど、いずれ通るようになる example は pending にすれば良いと思われる。（[参考資料](https://relishapp.com/rspec/rspec-core/v/3-0/docs/pending-and-skipped-examples)）

- pending: example が失敗したらテストは成功になる
- skip: example は実行されない

pending は何らかの事情で example が失敗する原因を修正できない場合に使えば良い。パッチがマージされるまで example が失敗する場合など。そのような時に pending を使っておけば、example が失敗する原因が修正されたときに（pending な example が成功することで）テストが失敗するようになるので、もう pending にしておく必要がないと気づくことができる。あるいは原因不明だけど example が失敗している場合も pending にしておけば、成功するようになった時に気づけるので良さそう。

一方 skip は example が実行されない。試行錯誤中に落ちる example を skip しておくのに良さそう。ただ、いずれ修正されるのなら pending が良いと思われる。もう通る見込みの無い古い example なら削除すればよいし。


ちなみに、skip するには `it` を `xit` にするだけで良い。便利。

```
RSpec.describe "an example" do
  xit "is skipped using xit" do
  end

  xspecify "is skipped using xspecify" do
  end

  xexample "is skipped using xexample" do
  end
end
```
System Rescue CDでwindowsのパスワードを空にする

## 参考

* [パスワードがわからなくてもWindowsにログインする方法（と対策） ｜ ライフハッカー［日本版］](http://www.lifehacker.jp/2012/10/121019break_into_win.html)
* [How to Reset a Windows Password with the System Rescue CD - YouTube](https://www.youtube.com/watch?v=S2t3Bi-AoB0)

## 準備

* [SystemRescueCd プロジェクト日本語トップページ - SourceForge.JP](http://sourceforge.jp/projects/sfnet_systemrescuecd/)からisoをダウンロード
* CDに書き込みboot

## 書き換え

```bash:
fdisk -l
```

```bash:
ntfs-3g /dev/sda3 /mnt/windows -o force
cd /mnt/windows/Windows/System32/config/
chntpw -l SAM
```

```bash:
chntpw -u "ユーザ名" SAM
1
q
y
```

```bash:
reboot
```
bcpユーティリティでUTF-8なCSVファイルとしてエクスポートする

```lang:GoBCP.cmd
SET YOURSQL      ="sql goes here"
SET YOURFILE     =a:\filename.utf8.txt
SET YOURINSTANCE =instance name goes here
SET YOURPASSWORD =password goes here
bcp %YOURSQL% queryout %YOURFILE% -c -C65001 -t , -r \n -U sa -S localhost\%YOURINSTANCE% -P %YOURPASSWORD%
```
返り値によるオーバーロードとIO

返り値によるオーバーロードができる言語はあまりないような気がしたので書きました。


# 返り値によるオーバーロードが可能なHaskell

Haskellは返り値によるオーバーロードが可能です。例えば`readLn`の型は以下のようになっています:

```hs
readLn :: Read a => IO a
```

`readLn`が返す型は、`Read`クラスのインスタンスの「どれか」、という意味です。
これを適切に使うには、コンパイラが返り値の型をどこかで決定出来るようにする必要があります。開発者が明示的に指定しておくといいでしょう。

```hs
{-# LANGUAGE ScopedTypeVariables #-}
import System.IO (readLn)

main = do
  n :: Int      -- 返り値の型をIntに指定した(この記法は要ScopedTypeVariables)
      <- readLn

  print $ factorial n -- nを使用する

factorial :: Int -> Int
factorial 0 = 1
factorial n = n * factorial (n - 1)
```

このプログラムは、別にIntを明示的に指定せずとも`factorial`によって`n`の型が`Int`に固定されるため、冗長に見えるかもしれません。しかし今後プログラムの`factorial`部分が変更されると、<b>`n`の型が曖昧なままになり、型推論が出来ずにコンパイルが失敗する可能性がある</b>ため、このタイミングで型を指定しておくことをお勧めします。このタイミングとは、<b>入力の値を自分の使いたい文脈上に持ってきたタイミング</b>です。

型推論出来ないパターンも載せておきます。

```hs
import System.IO (readLn)

main = do
  n <- readLn
  print n
```

このプログラムにおいて、`n`の型は曖昧で決定できません。`readLn`も`print`も、`n`の型を決定してくれないためです。
「入力の値を確認したくてprintしてみたけどコンパイラに型がambiguousと言われた」、というのはHaskellerなら大抵経験があるのではないでしょうか。
これを防ぐには、Inputの値の型をすぐ固定する癖をつけることです。


# 一般化

さてHaskellではこの返り値によるオーバーロードが頻出します。
例えば

* ファイルを読み取ってパーズし、なんらかの構造化された型を得る
* JSONから対応する型を得る
* MySQLのクエリの結果をなんらかの型で得る

IOで<b>Input</b>が発生した際に、それを固定の型で返さすに、何かのクラスであるという指定しかされていないパターンです。先ほどの`readLn`の型を思い出してください。`Read`というクラスしか返り値の型は指定されていませんでした。それは「使う人が型を自由に決められます」という意味です。


# まとめ

IOのInputが発生した際は、それを多相のまま扱うことあまりないでしょうし、すぐに明示的に型を指定することをお勧めします。そうすることで型の多相さに振り回されることが減るでしょう。

返り値によるオーバーロードはIOと絡むパターンがよくある、と言いたかっただけです。
wordpressプラグインのcssが読み込まれない時の対処法

シンタックスハイライトのプラグイン、[SyntaxHighlighter Evolved](https://wordpress.org/plugins/syntaxhighlighter/)を使ってみようとしたらCSSが読み込まれなくて困ったのでその対処法。

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

###対処法

``` </head> ``` の直前に ``` <?php wp_head(); ?> ``` を記述して、
``` </body> ```　の直前に ``` <?php wp_footer(); ?> ``` を記述する。

のみです。

-----------------  
これらはプラグインのcssを読み込むためのものらしいです。
いままで知らなかったので一つ一つ独自のCSSを当てていましたが、これを使えばプラグインのデフォルトのCSSが適用されるんですね。

ただ、多くのプラグインを使うと読み込まれるファイルが膨大になってしまうので必要ない時には記述しないほうがよいかと思います。
また、functions.php で不要なプラグインのCSSを削除することもできるそうです。
AndroidのFacebookログイン時に投稿権限をリクエストすると落ちる

Androidいじいじしててはまったところメモ。

# 現象

AndroidでFacebookSDKを使って以下のようなコードを書くとエラーで落ちる。


```java
Session.openActiveSession(activity, true, Arrays.asList("publish_actions"), new Session.StatusCallback() {
    public void call(final Session session, SessionState state, Exception exception) {
    }
}
```

エラーメッセージ

```
com.facebook.FacebookException: Cannot pass a publish or manage permission (publish_actions) to a request for read authorization
```

# 対応方法

エラーメッセージや[こちら](http://stackoverflow.com/questions/15153312/facebook-login-cannot-pass-a-publish-or-manage-permission-email-to-a-request-f)の回答にもあるが基本的な権限がないとpublish_actions権限を取得できない。
[こちら](http://stackoverflow.com/questions/15153312/facebook-login-cannot-pass-a-publish-or-manage-permission-email-to-a-request-f)の回答にあるように、ログイン(基本的な権限の取得)とpublish_actions権限の取得を分ける必要がある。
FacebookSDkのサンプルのHelloFacebookSampleやscrumptiousが同じようなやり方をしている。

```java
Session.openActiveSession(activity, true, new Session.StatusCallback() {
    public void call(final Session session, SessionState state, Exception exception) {
        if (session.isOpend()) {
            Session.NewPermissionsRequest req = new Session.NewPermissionsRequest(activity, Arrays.asList("publish_actions"));
            session.requestNewPublishPermissions(req);
        }
    }
}
```
Eclipseのウィンドウに設定がない

eclipseでjava開発をしています。
今日たまたま気づいたのですが、
<br>
Eclipseのメニューの[ウィンドウ]に[設定]がありませんでした。
<br>
今までこんなことがなかったのでびっくりしています。
調べたけれどわかりませんでした。
フォントを変更しようと思っていたのですが。。

もし分かる方がいればお願いします。
【Hubot】天気APIを叩いて今日・明日・明後日の天気を返すスクリプト

#概要

BOTに今日・明日・明後日の天気を問うと答えてくれるようにする

livedoorが提供するお天気情報「[Weather Hacks](http://weather.livedoor.com/weather_hacks/webservice "Weather Hacks")」を使ってます。

####※ここでは大阪の天気を取得しています

基本URL + 大阪のID（270000）
http://weather.livedoor.com/forecast/webservice/json/v1?city=270000

リクエストする地域とidの対応は 全国の[地点定義表（RSS）](http://weather.livedoor.com/forecast/rss/primary_area.xml "地点定義表（RSS）")で

#全体コード

```ruby:weather.coffee

module.exports = (robot) ->   
  robot.hear /(.*)の天気教えて/i, (msg) ->
   switch msg.match[1]
      when '今日'
        day = 0
      when '明日'
        day = 1
      when '明後日'
        day = 2
      else
        day = 3
        break
    request = msg.http('http://weather.livedoor.com/forecast/webservice/json/v1?city=270000')
    .get()
    request (err, res, body) ->
      json = JSON.parse body
      if day == 3 then forecast = 'わからんす' else forecast = json['forecasts'][day]['telop']
      msg.reply forecast


```
とざっくり書きました。

#結果

![スクリーンショット 2015-03-12 10.36.41.png](https://qiita-image-store.s3.amazonaws.com/0/67591/910a4882-0728-117c-1dcf-3709af070386.png)


#発展

都市名も指定できるように拡張する
rbenv && ruby && railsのupdate


1. `$ brew update && brew upgrade ruby-build`
2. `$ rbenv install 2.2.1`
3. `$ rbenv global 2.2.1`
4. `$ gem install rails --no-ri --no-rdoc`


* 毎度おなじみのnokogiri error で困ったらコチラ
	* http://blog.sailsoftware.co/2014/12/18/rails-4-2-0-rc3-fixing-libiconv-missing-dependency-on-yosemite.html
Appleのステータスボード


備忘録的に。
2015/3/11にApp Store、iTunes Store等に障害が起きていました。

Appleが展開しているサービスに何かあった場合には以下で確認する事ができるようです。
https://www.apple.com/jp/support/systemstatus/

![kobito.1426121231.223162.png](https://qiita-image-store.s3.amazonaws.com/1405/25416/3c746671-0157-a575-de24-daa944b09e4a.png "kobito.1426121231.223162.png")

![kobito.1426121369.832868.png](https://qiita-image-store.s3.amazonaws.com/1405/25416/60b43596-403d-dfef-4ef9-544feaf4fb91.png "kobito.1426121369.832868.png")

障害時にはこんな感じになります。

![kobito.1426121486.027503.png](https://qiita-image-store.s3.amazonaws.com/1405/25416/88763360-8c30-3954-0154-337e1f48f50b.png "kobito.1426121486.027503.png")
git でアーカイブ作成する (git archive)

ソースコードだけを配布したい場合など、svn export みたいなことをしたいときがあります。

下記例は、src フォルダ以下を src.zip でアーカイブする場合です。
-o で、拡張子が zip の場合は zipアーカイブにしてくれます。

``` bash
> git archive -o src.zip HEAD src
```

その他オプションなど、詳しくは、 http://git-scm.com/docs/git-archive で。
C 言語の共用体とビットフィールドの簡単なサンプル

#はじめに

C / C++ では Java などの他の言語では使えない「共用体」と「ビットフィールド」という機能があります。これらは、システム記述言語として C らしい機能です。

#共用体とは

まず、共用体ですが構造体に似ていますが、構造体と異なり１つのメモリ領域を使います。したがって、あるフィールドが変更されると、他のフィールドが影響を受ける場合があります。

共用体の使い道ですが、あるワードの上位バイトと下位バイトを入れ替えるとか、いくつかのバイトからなるデータを１回でクリアしたいとかなどが考えられます。

##共用体のサンプル

```c:union.c
#include 

void main() {
  union LongWord {
    long int lw;
    int iw[2];
    short sw[4];
    unsigned char b[8];
  };
  
  union LongWord ld;
  
  ld.lw = 0;
  ld.sw[3] = 0xffff;
  printf("%lx\n", ld.lw);
  ld.b[7] = 0x80;
  printf("%lx\n", ld.lw);
  ld.b[0] = 0x01;
  printf("%lx\n", ld.lw);
  puts("Done.");
}
```
実行例

`
ffff000000000000
80ff000000000000
80ff000000000001
Done.`


#ビットフィールド

ビットフィールドはあるワードをビット長を指定したフィールドに分けて使用できるという優れものです。

使い道ですが、あるワードで複数のフラグを管理するとかに使用できます。

##ビットフィールドのサンプル

```c:bitfield.c
#include 

void main() {
  struct BF {
    unsigned int a : 10;
    unsigned int b : 8;
    unsigned int c : 12;
    unsigned int d : 2;
  };
  
  union {
    struct BF f;
    unsigned int u;
  } d;
  
  d.u = 0;
  printf("%08x\n", d.u);
  d.f.a = 0x3ff;
  printf("%08x\n", d.u);
  d.f.b = 0xff;
  printf("%08x\n", d.u);
  d.f.c = 0xfff;
  printf("%08x\n", d.u);
  d.f.d = 0x3;
  printf("%08x\n", d.u);
}
```


実行例

`
00000000
000003ff
0003ffff
3fffffff
ffffffff`
Androidアプリ内のViewの階層を調べる


毎回忘れてしまうのでメモ。

1. Android Device Monitorを開く
2. Window → Open Perspective → Hierarchy Viewを選択
3. WindowからView階層を見たいプロセス名をクリック

↓こんな感じで出てきます。

![スクリーンショット 2015-03-12 8.25.26.png](https://qiita-image-store.s3.amazonaws.com/0/6061/53b98ac6-3c63-67fe-e9f7-6bd74f3ad02e.png "スクリーンショット 2015-03-12 8.25.26.png")
Yosemite と Mavericks 間で AirDrop したい

Mac 同士で Wifi / Bluetooth を使ってファイルのやりとりをする AirDrop、Mavericks 同士とか Yosemite 同士というふうに OS のバージョンが一致していれば問題はないのですが、Mavericks <=> Yosemite といふうに OS をまたぐと相手のマシンが表示されません。
さっさと Yosemite に上げるという解決策もありますが、そうも行かない場合はあります。

## 解決策

__Yosemite 側__の AirDrop 画面で「__お探しの相手が表示されませんか？__」を押すと、「__古い機種の Mac を検索__」というボタンが出てきます。

![AirDrop.png](https://qiita-image-store.s3.amazonaws.com/0/17508/75c927d7-4932-6a62-06d3-b30af809f2a1.png)

このボタンを押すと、Mavericks マシンが AirDrop 一覧に出てきます。

![AirDrop.png](https://qiita-image-store.s3.amazonaws.com/0/17508/6598797b-94c0-769c-2b49-30a7081612dc.png)

## REF

- [Airdrop not working between Mavericks and Yosemite | Apple Support Communities](https://discussions.apple.com/thread/6611842)
mrb_funcallでモジュールの中のクラスメソッドを呼び出すには

# mrb_funcallでモジュールの中のクラスメソッドを呼び出す

自分の検索能力が低いせいか苦労したので、メモ。

```c
struct RClass *my_module;

my_module = mrb_module_get(mrb, "SugoiModule");
val = mrb_funcall(mrb,mrb_obj_value(mrb_class_get_under(mrb, my_module, "Util")),"sugoi_classmethod", 0, NULL);
```
BeautifulSoup小技: path指定でTagを決め打ちする

XML/HTMLから抽出したい部分に特徴のあるタグがあれば、BeautifulSoupはそのタグをキーワードに探索できるので大きな威力を発揮します。ですが、その様な特徴のあるタグが無い場合は、ルート・タグから目的のタグまで順にタグを辿っていくしかありません。BeautifulSoupはXPATHをサポートしていないので、この手の探索がちょっと苦手です。

そこで、簡易的なpath指定でタグを決め打ちする機能を作ってみました。

**PATHの指定方法**
(1)基本形 - タグの要素名を'/'で区切って順に並べます
　　html/body/table/tr/td
　　　"bodyの下の最初のtableの下の最初のtrの下の最初のtd"

(2)兄弟タグの選択 - 抽出したいタグが出現する順番n(1～)を'[n]'で指定します
　　html/body/table[1]/tr[3]/td
　　　"bodyの下の一つ目のtableの下の3つ目のtrの下の最初のtd" 


```python:b4_path.py
from bs4 import BeautifulSoup
import re

#<SUBROUTINE>###################################################################
# Function:     任意タグのルートタグを求める
################################################################################
def root(self):
    if self.name == u'[document]':
        return self
    else:
        return [node for node in self.parents][-1]

BeautifulSoup.root = root

#<SUBROUTINE>###################################################################
# Function:     簡易PATHで指定した特定のタグを取り出す
# 
################################################################################
def path(self, path):
    re_siblings = re.compile(r'(\w+)\[(\d+)\]')

    if path[0] == '/':
        node = self.root()
    else:
        node = self

    path = path.strip('/')
    for arrow in path.split('/'):
        if arrow == 'tbody':
            continue

        match = re_siblings.match(arrow)
        if match:
            arrow = match.group(1)
            num   = int(match.group(2))-1
            node  = node.find_all(arrow, recursive=False)[num]
        else:
            node  = getattr(node, arrow)
    return node
    
BeautifulSoup.path = path

#<TEST>#########################################################################
# Function:     テストルーチン
################################################################################
if __name__ == '__main__':
    soup = BeautifulSoup("""
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
""")

    print soup.path('/html/body/p[2]/a[1]').prettify()
```
PDOのwhereでIN句を使う

いつも忘れるので備忘録

PDOのwhere句でIN句を使おうとしても思ったとおりにはいかないので解決策を書いときます。

* 例

```php

$names = array('taro', 'yuta', 'makoto');

$stmt = $pdo->prepare('
select * from user where name in (?)
');

$stmt->execute($names);
$stmt->fetchAll();
```

これだとうまくいきません。
where句のバインドは1:1で行うので、IN句で配列を使う場合には、配列の要素文だけ`?`を作らなければいけません。

そこで現状で、自分が一番簡単だと思う解決索を書いておきます。

```php

$names = array('taro', 'yuta', 'makoto');

$inClause = substr(str_repeat(',?', count($names)), 1);

$stmt = $pdo->prepare(sptinrf('
select * from user where name in (%s)
', $inClause);

$stmt->execute($names);
$stmt->fetchAll();
```

IN句の中が配列の数文だけ`(?,?,?)`になるように作ってます。
$namesの要素文だけ`str_repeat`で`,?`を書いても、最初の`,`は邪魔なので、substrを使って２文字目以降だけ使ってます。

### 他にも条件文がある場合

where句で指定するのが、IN句だけではない場合はちょっとだけ工夫する必要があります。

```php

$names = array('taro', 'yuta', 'makoto');

$inClause = substr(str_repeat(',?', count($names)), 1);

$stmt = $pdo->prepare(sptinrf('
select * from user where age >= ? and name in (%s)
', $inClause);

$stmt->execute(array_merge(
    array(20),
    $names
);
$stmt->fetchAll();
```

年齢が20歳以上みたいな条件を追加した場合は、`execute`する時に、`array_merge`でバインドする値を配列で渡して上げればOKです。
さぁ、お前の罪(git push origin master)を数えろ！


コマンド履歴から `git push origin master` した回数が出力されます。

```
history | grep "git push origin master" | wc -l                                                
```

表示された数だけ腹筋しましょう。（ちなみに、私は53回でした）


Bashの場合、以下によって自身のコマンド履歴を残さずに実行できます。

```
history | grep "git push origin master" | wc -l;history -d $(history 1 | awk '{print $1}')
```

## 参考
Linuxでコマンド履歴を残さない方法 | 十円玉という名のブログ - http://www.10yendama.com/archives/257
PHPで配列の初期化

#議題

配列の初期化が、いつの間にか`[]`でよくなってる！
※5.4以上

#気付きのきっかけ

http://qiita.com/aooni_kun/items/26b80152ce73211ec949
http://leko.jp/archives/737

#テスト

```php

<?php

$test = [];

var_dump($test);

```

#結果

```

array(0) {
}

```

うれしいたのしい
Ubuntu上でNVIDIAのOpenCLドライバを使う

Ubuntu 14.04 LTS (64bit)環境で、NVIDIAのGPUを使ってOpenCLを試そうとしたら案外ハマったので記録。

## 前提

NVIDIAドライバをapt管理するため、xorg-edgersを利用します（NVIDIA本家のインストーラを使ったことがないので、どちらがいいとかはわかりません）。

```
$ sudo add-apt-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-340
```

## ヘッダファイルがない

ヘッダファイルが必要なら（当然必要ですよね）devパッケージを入れる必要があります。

```
$ sudo apt-get install nvidia-340-dev
```

`/usr/include/nvidia-340/`以下に`CL/cl.h`などがインストールされます。

## 一見必要そうだけどインストールしなくて良いパッケージ

`nvidia-libopencl1-340`というパッケージがあるんですが、これはインストールしなくても動きます。`ocl-icd-libopencl1`が気にくわない時だけインストールすれば良いのだと想像しています。

## libOpenCLのlinker nameが無い

libOpenCL.soへのシンボリックリンクが作られているかどうか、念のため確認しましょう。

```
$ ls -la /usr/lib/x86_64-linux-gnu/libOpenCL.so
lrwxrwxrwx 1 root root 18  3月 16  2014 /usr/lib/x86_64-linux-gnu/libOpenCL.so -> libOpenCL.so.1.0.0
```

上記のようなシンボリックリンクが存在すれば正常です。少し前に試したときは、なぜかこのシンボリックリンクを手動で作る必要がありました（`nvidia-libopencl1-340`のバグかもしれません…）。

```
$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libOpenCL.so.1 libOpenCL.so
```

## それでも微妙に動かない…

この状態だと、OpenCLの```clGetPlatformIDs()```が失敗します。

さらに下記パッケージをインストールする必要がありました。

```
$ sudo apt-get install nvidia-modprobe
```

ちなみに、うまく動かない状態で`clGetPlatformIDs()`が返す値はCL_PLATFORM_NOT_FOUND_KHR（-1001）でした。
'%'演算子を使わずに正規表現等でFizzBuzz

はじめに
---
プロジェクトオイラーの51問目などを解いているときにreモジュールを調べたりしたので、その備忘録がわりにFizzBuzzコードを記載する。以下では、(1)できるだけ正規表現を使うこと、(2)正規表現を使わない場合でも%演算子を使わないことを心がけた。

3の倍数の判定
---
3の倍数については、正規表現を利用した判定が思いつかなかった。このため、3の倍数の判定には、3の倍数の各桁の和を足すことを繰り返すと、最終的に3,6,9のいずれかになるということを利用した。具体的には、和が１桁になるまで再帰で呼び出すこととした。我が1桁となった時に、その数が3,6,9のいずれかであれば真を返し、その他であれば偽を返す。

```py
def is_multiple_of_3(n):
  if len(str(n)) == 1:
    if str(n) in ['3', '6', '9']:
      return True
    else:
      return False
  else:
    return is_multiple_of_3( reduce(lambda x,y:int(x)+int(y), str(n)))
```

5の倍数の判定
---
5の倍数の判定は容易である。一桁目が0か5であれば良いからである。簡単なので、単純にreを利用してさくっと作った。
注意点としては、re.compile().match()が、単語レベルでしかヒットしない（単語の先頭からマッチするか否かを判定しているので、re.compile().search()を使うか、ヒットさせたい文字列の前に?*を付けるかのいずれかの必要がありそうである。

```py
def is_multiple_of_5(n):
  #p = re.compile('(5|0)$')
  p = re.compile('\d*(5|0)$')
  if p.match(str(n)):
    return True
  else:
    return False
```

正規表現を使ったreplace
---
「正規表現を使ったreplace」とググったところ、re.sub()に関する記事がトップに表示された。文字置き換ええで多分正規表現を使いたいときは、re.subを使う必要があるのであろう。

15の倍数の判定
---
3の倍数かつ5の倍数であればそれは15の倍数であるので、特別な判定は置かなかった。ただ、"Fizz "の最後に空白を付け加え、当該空白を"Buzz"で置き換えるなどの小ワザを駆使してみた。これが動けば、FizzBuzzが適切に表示されるはずである。

最終的なコード
---

```py
import re

def is_multiple_of_3(n):
  if len(str(n)) == 1:
    if str(n) in ['3', '6', '9']:
      return True
    else:
      return False
  else:
    return is_multiple_of_3( reduce(lambda x,y:int(x)+int(y), str(n)))

def is_multiple_of_5(n):
  #p = re.compile('(5|0)$')
  p = re.compile('\d*(5|0)$')
  if p.match(str(n)):
    return True
  else:
    return False

def main():
  for n in range(1,101):
    ret = str(n)
    if is_multiple_of_3(n):
      ret = re.sub('\d+', 'Fizz ', ret)
    if is_multiple_of_5(n):
      ret = re.sub('(\d+|\ )', 'Buzz', ret)
    ret.strip(' ')
    print ret
    
main()
```
Arduino IDEで日本語フォント豆腐問題への対処

## 起こったこと
特にArduino IDEに限った話ではなく、Javaで作成されたGUIツールを利用する際に度々遭遇する問題で、日本語のフォントが参照できないためにツールのメニュー表示などが□（いわゆる豆腐）で表示されてしまう問題がある。今回も新しい自分のUbuntuの環境でArduino IDEを立ち上げたら、豆腐状態になったので、対処法をメモしておく。

ちなみに手元環境は以下の通り。

* OS: Ubuntu14.01
* JDK: 1.6
* Arduino IDE: 1.6.1

##対処
おそらく対処はいくつかあるはずだが、手っ取り早くJavaがフォントを取得できる場所に日本語フォントのフォントファイルのリンクを置くという手段で行った。

今回の環境のJDKは、aptでインストールしたOpenJDKではなく、Oracle Javaなので、任意の場所に配置されたJDK下のjre/lib/fontsにフォントファイルのリンクを作る。その際に一応Javaのフォントファイルの参照順位的に一番最後になるようにfallbackディレクトリを作成し、その下にリンクを作成する。例はRictyを使用可能にしている。

```bash:実行コマンド
$ mkdir /bar/foo/jdk1.6.0/jre/lib/fonts/fallback
$ ln -s ~/.fonts/Ricty* ./
```

##確認
Arduino IDEを起動してみてメニュー表示が豆腐になっていなければ成功。メニューではなく、エディタで利用するフォントについてはpreferences.txt内の記述を変更する。
Atomが複数rootDirectoryに対応していた


なぜか Sublime にできてなぜかAtomでずっと出来なかったやつ。(正確には1ヶ月ぐらい前から入っていた模様)(追記: ２週間前だった https://github.com/atom/atom/releases/tag/v0.184.0)

![](http://i.gyazo.com/443722877b67a29983c5d8c7fd8ae849.png)




Cmd+Shift+P で `TreeView: Add Root Folder` 呼べば出せる。

ドラッグアンドドロップは対応してない模様。

## 気づいた経緯

拙作atom-git-grepが壊れていて直せと怒られていた

[Use new api calls · Issue #4 · mizchi/atom-git-grep](https://github.com/mizchi/atom-git-grep/issues/4 "Use new api calls · Issue #4 · mizchi/atom-git-grep")

すごい雑な実装で、プロジェクトルートでgit grep叩いて文字列をパースしているだけ。これがなぜ壊れたのか。


風邪引いてて一週間ぐらい後回しにしてたんだけど、今日直そうとしたら、 `atom.project.rootDirectory` が消えて `atom.project.rootDirectories` になっていた。

あ、これやっと対応したんだ、と察して、ついでに複数ルート対応した。

https://github.com/mizchi/atom-git-grep/commit/b37ca52864dbfc5068bc2cee266b8596900f393a


1.0出す前に破壊的に変更急いで入れよう、みたいな流れ、よくある
lambda フォームの使いどころ

Common Lisp には実際に使ってみないと効果がよくわからない謎機能があったりしますが、そのなかでもぶっちぎりのイミフ機能が以外と実用できることがわかったので書いておきます。

lambda form とは、フォームの先頭が、通常のように関数名ではなく [(lambda (...)...) であるようなフォームのことです。](http://www.lispworks.com/documentation/lw61/CLHS/Body/03_a.htm) haskellなんかではよく見ますね。

```lisp

(funcall (lambda (x) (* 2 x)) 10) ;--> 20   lambda 使うならこれがふつう mapcarとか

((lambda (x) (* 2 x))  10)        ;--> 20   (λx.2*x) 10 かな?

(* 2 10)                          ;--> 20

```

これら3つの式が同一であることは、ある程度ほにゃら計算がどーたらってことを聞きかじっていれば、その理論的/歴史的重要性はわかるのですが、clのユーザがコードを書く上での利便性というものはほとんど認識していませんでした。

# Take 1

今回見出した使いドコロは特にこんな時。

``` lisp
(let ((x (if (SUPER-COOL-FUNCTION-WITH-SUPER-LONG-NAME
              'SUPER-CALIFRAGILISTIC-EXPIARI-DOCIOUS
              :lots  'of :keyword '(arguments that extends)
              :even into-the-fourth-line)
             (even-longer-function-with-enough-number-of-arguments
              acc (cdr list) list2)
             (even-longer-function-with-enough-number-of-arguments
              acc list (cdr list2)))
  (if (evenp x)
      `(/ ,x 2)
       x))
```
      
頭でっかちで格好わるい。
しかし、ある意味、分岐はxの値がわからないとできないので、こうなってしまうのは仕方がないといえば仕方がない。

# Take 2

関数型なんだから全部書き下せば....いやだめだろこれ。

``` lisp
  (if (evenp (if (SUPER-COOL-FUNCTION-WITH-SUPER-LONG-NAME
                  'SUPER-CALIFRAGILISTIC-EXPIARI-DOCIOUS
                  :lots  'of :keyword '(arguments that extends)
                  :even into-the-fourth-line)
                  (even-longer-function-with-enough-number-of-arguments
                   acc (cdr list) list2)
                  (even-longer-function-with-enough-number-of-arguments
                   acc list (cdr list2)))
      `(/ ,(if (SUPER-COOL-FUNCTION-WITH-SUPER-LONG-NAME
              'SUPER-CALIFRAGILISTIC-EXPIARI-DOCIOUS
              :lots  'of :keyword '(arguments that extends)
              :even into-the-fourth-line)
             (even-longer-function-with-enough-number-of-arguments
              acc (cdr list) list2)
             (even-longer-function-with-enough-number-of-arguments
              acc list (cdr list2)) 2)
       (if (SUPER-COOL-FUNCTION-WITH-SUPER-LONG-NAME
              'SUPER-CALIFRAGILISTIC-EXPIARI-DOCIOUS
              :lots  'of :keyword '(arguments that extends)
              :even into-the-fourth-line)
             (even-longer-function-with-enough-number-of-arguments
              acc (cdr list) list2)
             (even-longer-function-with-enough-number-of-arguments
              acc list (cdr list2))))
```

本当は、いわゆる後方参照みたいなのが書きたいわけです。
それに、たかがこんなののために遅延評価つかうのは面倒くさいし...

# Take 3 Lambda Form

ということで正解はこれ。

```lisp
((lambda (x)
  (if (evenp x)
      `(/ ,x 2)
       x)))
 (if (SUPER-COOL-FUNCTION-WITH-SUPER-LONG-NAME
              'SUPER-CALIFRAGILISTIC-EXPIARI-DOCIOUS
              :lots  'of :keyword '(arguments that extends)
              :even into-the-fourth-line)
             (even-longer-function-with-enough-number-of-arguments
              acc (cdr list) list2)
             (even-longer-function-with-enough-number-of-arguments
              acc list (cdr list2)))))
```

lambdaとletでできることは本質的には一緒なので、こういうことができるのは当然ですが、lispを書いていると、メインの処理ほど右下に書きたくなりますよね。そんな場合にどうぞ。

書捨て御免!
PHPでメモ化

PHPでメモ化するときの考え方をメモ。

## メモ化とは

> メモ化（英: Memoization）とは、プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの結果を後で再利用するために保持し、そのサブルーチン（関数）の呼び出し毎の再計算を防ぐ手法である。

*Wikipedia - メモ化*より抜粋
*http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E5%8C%96*

## ようするに

プログラム中に**何度も同じ引数で何度も同じ結果を得る**関数または処理があるとしたら、返り値を記憶させておくことで計算コストを減らし高速化するということ。

## コード

計算量の高い処理を思いつかなかったので適当に。

```php:呼ぶ側
<?PHP

  for ($i=1; $i<=100000; $i++) {
    // 適宜
    echo myMemoize1();
    // echo myMemoize2(100);
    // echo myMemoize3(1, 100);
  }
```

```php:引数なしの場合
  // 1から100までの等差数列の和を返す
  function myMemoize1 () {
    static $ret = null;

    if (isset($ret)) {
      return $ret;
    }

    $ret = 0;
    for($i=1; $i<=100; $i++) {
      $ret += $i;
    }

    return $ret;
  }
```

```php:引数1つの場合
  // 1からmaxまでの等差数列の和を返す
  function myMemoize2 ($max) {
    static $ret = array();

    if (isset($ret[$max])) {
      return $ret[$max];
    }

    $series_sum = 0;
    for ($i=1; $i<=$max; $i++) {
      $series_sum += $i;
    }

    $ret[$max] = $series_sum;

    return $ret[$max];
  }
```

```php:引数複数の場合
  // minからmaxまでの等差数列の和を返す
  function myMemoize3 ($min, $max) {
    static $ret = array();

    if (isset($ret[$min][$max])) {
      return $ret[$min][$max];
    }

    $series_sum = 0;
    for ($i=$min; $i<=$max; $i++) {
      $series_sum += $i;
    }

    $ret[$min][$max] = $series_sum;

    return $ret[$min][$max];
  }
```

ベンチマークは省略

## まとめ

myMemoize3のように、同じ組み合わせの引数が何度も頻繁に使われる可能性があるプログラムには使ったほうが良いでしょう。
UbuntuにRuby on Railsの動作環境を作成するためSQLite3をインストール

Ruby on Railsの勉強のために、動作環境を作成している。
rubyに関するライブラリについては、gemコマンドでインストールできるっぽいが、SQLite3に関しては、そうはいかなかったので、メモを残しておく。


OS: Ubuntu 14.04.02 LTS
アーキテクチャ：32bit
※ちなみに、Ubuntuでは以下のコメントでosのバージョンが解るらしい

```
/etc/lsb-release
```

　アーキテクチャにつては、

```
arch
```
　を実行して、X86_64→64bit、i686→32bit


##本題、

まずは、以下のコマンドを実行

```
sudo apt-get install -y sqlite3
```

次に、

```
sudo apt-get install sqlite3 libsqlite3-dev
```

※下段のコマンドの実行を忘れると、プロジェクトの作成時に以下のようなエラーが発生するので注意

```
Gem files will remain installed in /home/xxxx/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/sqlite3-1.3.10 for inspection.
Results logged to /home/xxxx/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/extensions/x86-linux/2.1.0-static/sqlite3-1.3.10/gem_make.out
An error occurred while installing sqlite3 (1.3.10), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.10'` succeeds before bundling.
```

これで、Ruby on Railsを動かす準備ができた。
composer install でタイムアウトする場合の対処法

# composer install でタイムアウトする場合の対処法

`php composer.phar install` 実行時に以下のようなエラーが出ることがあります。


```bash
  [Symfony\Component\Process\Exception\ProcessTimedOutException]
  The process "git clone --no-checkout 'git://git.code.sf.net/p/tcpdf/code' '/home/vagrant/vendors/tecnick.com/tcpdf' && cd '
  /home/vagrant/vendors/tecnick.com/tcpdf' && git remote add composer 'git://git.code.sf.net/p/tcpdf/code' && git fetch compo
  ser" exceeded the timeout of 300 seconds.



Exception trace:
 () at phar:///home/vagrant/vendor/symfony/process/Symfony/Component/Process/Process.php:1208
 Symfony\Component\Process\Process->checkTimeout() at phar:///home/vagrant/composer.phar/vendor/symfony/process/Symfony/Component/Process/Process.php:358
```
composerでインストールしようとしたものがタイムアウトして落としきれなかったようですね。
その時の対処法を書きます。

# タイムアウトを延ばす

単純にタイムアウト秒数を延ばす方法です。デフォルトは300秒なので、それを延ばして対処します。

```bash
export COMPOSER_PROCESS_TIMEOUT=2000
php composer.phar install
```
Babelのasync/await試してみた(+中の処理をちょっと追ってみた)


`npm install babel -g`

experimentalオプション必須なので コンパイルは `babel -e foo.es6 > foo.js` みたいな感じ


適当に試してみた。

```js
import "babel/polyfill";
 
let wait = function(n: number){
  return new Promise(done => setTimeout(() => done(n), n));
};
 
let main = async function(){
  await wait(50);
  console.log('await done');
}
 
// async promise nomally
wait(100).then(() => console.log('promise normaly done'));
 
// await
main();
```

最初awaitブロックがasyncを取るのが必須なことに気づかなくて、普通に呼ぼうとしてちょっとハマった。まあ処理系やポリフィルの都合そうなるのはなんとなくわかる。


これ`async () => {...}` や `await () => {...}`みたいな Arrow Functionでも動くのかなぁと思って次のコード試してみた。



```js
import "babel/polyfill";
(async () => {
  await new Promise(done => setTimeout(() => {console.log('done 1'); done()}, 100));
  await new Promise(done => setTimeout(() => {console.log('done 2'); done()}, 100));
})()
```

じゃあワンライナーもいけるじゃんと試してみたら動いた

```js
import "babel/polyfill";
(async () => await new Promise(done => setTimeout(() => {console.log('wait done'); done()}, 1000)))()
```

吐かれたコード読んでみる。

```js
"use strict";

var _this = this;

require("babel/polyfill");

(function callee$0$0() {
  return regeneratorRuntime.async(function callee$0$0$(context$1$0) {
    while (1) switch (context$1$0.prev = context$1$0.next) {
      case 0:
        context$1$0.next = 2;
        return new Promise(function (done) {
          return setTimeout(function () {
            console.log("wait done");done();
          }, 1000);
        });

      case 2:
        return context$1$0.abrupt("return", context$1$0.sent);

      case 3:
      case "end":
        return context$1$0.stop();
    }
  }, null, _this);
})();
```

あんまり読みたくはないのが出てきたが… とりあえず追っていったところ https://github.com/babel/regenerator-babel/blob/master/runtime.js を使っている。

https://github.com/babel/regenerator-babel/blob/master/runtime.js#L96-L119 をみたところGeneratorってのでwrapしてPromiseをキューにしてさばき終えるのを待ってて、割と素直だった。というかAST読んでからの式変形の実装が強そう。(これCPS変換って言っていいんだろうか)

babel/polyfillがcommonjs requireのままなのでブラウザに持ってくにはbrowserify前提な感じ。

式からawaitの出現数を数えてcase作ってるようにみえたので、forで回すちょっと意地悪なコード書いてみる。

```js
import "babel/polyfill";
(async () => {
 for(var i = 0; i < 10; i++){
   await new Promise(done => setTimeout(() => {console.log('wait done'); done()}, 100));
 }
})();
```

ちゃんと動いた。が、出力みて頭かしげた。

```js
"use strict";

var _this = this;

require("babel/polyfill");

(function callee$0$0() {
  var i;
  return regeneratorRuntime.async(function callee$0$0$(context$1$0) {
    while (1) switch (context$1$0.prev = context$1$0.next) {
      case 0:
        i = 0;

      case 1:
        if (!(i < 10)) {
          context$1$0.next = 7;
          break;
        }

        context$1$0.next = 4;
        return new Promise(function (done) {
          return setTimeout(function () {
            console.log("wait done");done();
          }, 100);
        });

      case 4:
        i++;
        context$1$0.next = 1;
        break;

      case 7:
      case "end":
        return context$1$0.stop();
    }
  }, null, _this);
})();

```

これ、いわゆるswitchによるgoto… なんかllvmがCから出力したIRみたいだ。

なんか納得感あったのでこれで終わり。
ExpectedException ルールで期待した例外のスタックトレースを出力する

# はじめに
JUnit のExpectedException ルールを使用すると例外の発生をテストできます。
(ExpectedExceptionについての記事 : [ExpectedException ルールを使いこなしたい] (http://qiita.com/komiya_atsushi/items/082d6a71e475a613338a))

当記事では、例外を検査すると同時にスタックトレースを標準エラー出力などへ出力する方法について記しています。例外内容を目視でも確認したいようなケースを想定しています。

バージョンは JUnit 4.10以降であれば問題ないと思います。

# before
今までは例外を検査すると同時にログを出力したい場合、このような方法でやっていました。

```java:ExpectedExceptionTest.java(before)
public class ExpectedExceptionTest {
    @Rule
    public ExpectedException thrown = ExpectedException.none();
    
    @Test
    public void testExpectedException() {
        /* Setup */
        thrown.expect(NullPointerException.class);
        /* Exercise */
        try {
            target.execute(); // テスト対象のメソッド
        } catch (NullPointerException e) {
            e.printStackTrace();
            throw e;
        }
    }
    ...
}
```
ただ、これじゃ Rule 使ってる意味がほぼなくなっちゃいますし、テストメソッドごとにtry-catch書くのもだるいです。

# after(解決策)
RuleChainとTestWatcher ルールを使用します。

```java:ExpectedExceptionTest.java(after)
public class ExpectedExceptionTest {
    private ExpectedException thrown = ExpectedException.none();
    
    private TestWatcher watcher = new TestWatcher() {
        @Override
        protected void failed(Throwable e, Description description) {
            e.printStackTrace();
        }
    };
   
    @Rule
    public TestRule chain = RuleChain.outerRule(thrown).around(watcher);

    @Test
    public void testExpectedException() {
        /* Setup */
        thrown.expect(NullPointerException.class);
        /* Exercise */
        target.execute(); // テスト対象のメソッド
    }
    ...
}
```
若干フィールドの記載が増えましたが、各テストメソッドはシンプルに書けるようになりました。
# おわり
もし他にいい方法があれば教えてください！
Titanium studio 3.4ではまったこと

**64bit問題**

SDK3.6からは64bit対応が入ってるいるため
モジュールが対応していない物は利用できない。


**ルートパスの設定**
/から始まるパスを使うと作っているアプリのOSに対応するフォルダ内を参照する

```lang:ファイル読み込みの場合

var AA = require('/aa.js');

```
iOSならiphone
/Resource/iphone/aa.js

android
/Resource/android/aa.js


**androidのアクションバーが勝手に出る**
カスタムテンプレートを作る

```lang:tiapp.xmlの記述

<application android:theme="">

```
マクロの扱いには気を付けろ！ ver.1

[元ブログ、マクロの扱いには気を付けろ！ ver.1 - 技術は熱いうちに打て！](http://blog.dalt.me/1109)

マクロはとても便利だし、使えばソースコードが綺麗にまとまることは多いにあります。
ですが、このマクロに関して二つ気をつけなければいけないことがあるので、
自戒の意味も込めて書きたいと思いました。
<em>
・マクロはテキスト置換である
・マクロにはスコープと言う概念がない
</em>

二項目は明日の記事で説明します。

## マクロはテキスト置換である

このエントリを書こうと思ったのもこれがきっかけです。
使う際、自分で作る際、それぞれ気をつけてほしい事があります。

## 使う際に気をつけること

<strong>何らかの値を変化させるような要素を与えてはいけない</strong>

どういうことでしょうか。

以下のコードを見てください。
※MAXはcocos2d-xのCCStdC-ios.hから引っ張ってきました。

```cpp:testmacro.cpp
#include <stdio.h>

#define MAX(x,y) (((x) < (y)) ? (y) : (x))

int main(void) {
  int a = 1;
  int b = 2;
  int c = MAX(++a, b); // cに大きい方の値を入れる
  printf("a is %d, b is %d", a, b);

  return 0;
}
```

これを実行してみると結果はどうなるでしょうか？
<em>
a is 3, b is 2
</em>
なんとaの値が変わってしまっています。
これはMAXを使ったプログラマが意図した動作ではないはずです。

### 何が起こっているのか

マクロはテキスト置換です。
つまり、MAXは以下の様に置換されます。

MAX(x,y) (((x) < (y)) ? (y) : (x))
-> MAX(x,y) (((++a) < (b)) ? (b) : (++a))
-> 左辺((++a) < (b))の評価
-> (2 < 2)の判定
-> falseである
-> (++a)が選択され、また++aが評価される
-> 3

### そんなアホな事するかよ...

この例だったら簡単なのでそう思うかもしれません。
本当にそう言い切れるでしょうか？

このマクロに渡す要素がメソッドだった場合を考えてみてください。

```cpp
int c = MAX(this->hoge(), 0);
```

hoge内でメンバ変数を変えていた場合。
2度以上評価される事により必要以上にメンバ変数が変更されてしまうと言うこともあるのです。

## 作る際に気をつけること

<strong>各引数は( )で括る</strong>

先ほど例に挙げたMAX。
異常に( )が多くなかったですか？
なぜでしょう。

次のマクロを見てみましょう。
<pre lang="cpp">
 #define DIMENSION(width, height) width * height
</pre>

これはかなり危ないマクロです。
なぜ危ないか分かるでしょうか。
何度も言いますがマクロはテキスト置換です。

```cpp
int dim = DIMENSION(1 + 2, 2 + 3);
```

これは以下の様に置換されます。

DIMENSION(1 + 2, 2 + 3)
-> 1 + 2 * 2 + 3

もうお分かりですね。
本当は3 * 5 = 15が出力されてほしいのに1 + 4 + 3の8が出力されてしまいます。

なので正しく定義するなら以下です。

```cpp
#define DIMENSION(width,height) ((width)*(height))
```
これで

DIMENSION(1 + 2, 2 + 3)
-> (1+2)*(2+3)

となるので予想通りの結果になるでしょう。

思ってるのと違う動作をするのでこのデバッグはとても大変になるでしょう。
ある意味この記事に辿り着けている時点で答えは見えてるって事ですね笑

誰かのお役に立てば。
Raspberry Piで温度計を作る、あとブラウザで見れるようにする　第４回


##読み取り
とりあえず読むんだけども、ソースをgit管理にする。
ワイのリポジトリやから参考までや。
	
```console
$ git clone https://github.com/kaepa3/Thermo_PI.git
```

そーすは、サンプルまんまで以下な感じ。

```input.py
import dhtreader

type = 11
pin = 4

dhtreader.init()
print dhtreader.read(type, pin)
```

ピンの場所とかは前回のマップを見れば二択になるので
実際に動かしてどうにかする。
しかし４という時点で答えはわかると思う。
※この間にgpioを読み取るツールとか入れてます。

で、問題。それはそうとて動かない。
しかし、プルアップ抵抗を外すと記録される。
検討結果、参考サイトとハードウェアの形状が多少違う。
（上から見ると穴なし）
裏面に「加強販」と記録されている。
色々面倒なので、自分が買ったのは抵抗をはさまなくていいバージョンと解釈する。↓をものすごく都合よく解釈する。
http://www.myu.ac.jp/~xkozima/lab/raspTutorial3.html
（ようするによくわからんので、この問題は先送りにする。）

で、温度と湿度の採取完了・。
現時点でのソースは以下のように変化する。

```
import dhtreader
import os
import time

type = 11
pin =26

while True:
  os.system("clear")
  if 0 == dhtreader.init():
    print("init error")

  sensor_val = dhtreader.read(type, pin)
  if sensor_val:
    t,h = sensor_val
    print("{0} {1}".format(t,h))
  else:
    print("error") 

  time.sleep(3)  
```

結構エラーが出るってこってす。
それなりのセンサ買ってたらこんな苦労しなくて済んだのかね？


ここまできたら、あとはDBにどうやって入れていくかだけ
パイラズについては一旦終了。
rails側のアプリをさっさか作った後に考える。

##ラズパイに関するまとめ
単にパソコン。
Multiple collection zipped in Scala

Scalaでは2つのコレクションをまとめてループに回したい場合に`zip`を使うと便利なことがある。

```scala

scala> val l1 = Seq(1, 3, 5)
l1: Seq[Int] = List(1, 3, 5)

scala> val l2 = Seq(2, 4, 6)
l2: Seq[Int] = List(2, 4, 6)

scala> for ((a, b) <- (l1 zip l2)) yield (a, b)
res0: Seq[(Int, Int)] = List((1,2), (3,4), (5,6))

```

でもzipだと2つのコレクションをまとめることしたできないので3つ以上をまとめたい場合はzippedを使う。

```scala

scala> val l3 = Seq("a", "b", "c")
l3: Seq[String] = List(a, b, c)

scala> for ((a, b, c) <- (l1, l2, l3).zipped) yield (a, b, c)
res1: Traversable[(Int, Int, String)] = List((1,2,a), (3,4,b), (5,6,c))

```

参照
[Can I zip more than two lists together in Scala?](http://stackoverflow.com/questions/1664439/can-i-zip-more-than-two-lists-together-in-scala)
Dockerで各containerの初期ディスクサイズを拡張する

CentOS 7.0ホストのDocker 1.3.2で確認。

Dockerはデフォルトでは各コンテナに10GBの(仮想)ディスクを割り当てます。

```lang:Console
[hoge@docker ~]$ sudo docker run -it centos /bin/bash
[root@8e856a8f4666 /]# df -h
Filesystem                                                                                          Size  Used Avail Use% Mounted on
/dev/mapper/docker-8:19-134785216-8e856a8f46660e16e9ce6c1a73e937e9a7366d19bd3ac2a239324f8671642853  9.8G  260M  9.0G   3% /
tmpfs                                                                                               3.6G     0  3.6G   0% /dev
shm                                                                                                  64M     0   64M   0% /dev/shm
/dev/sdb3                                                                                           107G  8.1G   99G   8% /etc/hosts
tmpfs                                                                                               3.6G     0  3.6G   0% /run/secrets
tmpfs                                                                                               3.6G     0  3.6G   0% /proc/kcore


```

10GBでは足りない場合、[docker daemonにオプションを与えて起動する](https://github.com/docker/docker/blob/master/daemon/graphdriver/devmapper/README.md)ことでcontainerの基本ディスクサイズを大きくすることができます。ただし変更を反映させるには /var/lib/dockerのクリアが必要です。(既存のコンテナやイメージは消えます)

20GBにしたい場合、/var/lib/dockerクリア後以下のように--storage-opt オプションを追加して起動します。

`rm -rf /var/lib/docker`
`docker -d --storage-opt dm.basesize=20G`

CentOS 6などsystemdを使ってサービス起動している場合は /etc/sysconfig/docker に同じオプションを追加すればOK。

```lang:Console

# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS=--storage-opt dm.basesize=20G --selinux-enabled -H fd://

[hoge@docker ~]$ sudo service docker start
[hoge@docker ~]$ sudo docker run -it centos /bin/bash
[root@62a3ac2272da /]# df -h
Filesystem                                                                                          Size  Used Avail Use% Mounted on
/dev/mapper/docker-8:19-404124118-62a3ac2272da80c502fa19c10d5bf844859c3d6a63cf5157c391d4978d2352f8   20G  268M   19G   2% /

```

無事ディスクサイズが大きくなりました。
シェルスクリプトの説明文に関するコーディング規約・私案

* 環境はMac前提
* 以下は実行可能ファイルとしてパスを通して利用する場合を想定する

## Usage関数
* シェルスクリプトの`-h`オプションで説明文を表示する際に、内部で関数化されている例がよくある
	* [bashコーディング規約 - Qiita](http://qiita.com/mashumashu/items/f5b5ff62fef8af0859c5#2-4)
* しかし、これは本来**変数的**に扱いたい説明文を関数として扱っているので気分がよろしくない
    * 実際的な問題としては、改行が気持ちよく書けない
	    * [ShellScript - 複数行のechoを、きれいにインデントして書く方法の試案 - Qiita](http://qiita.com/catfist/items/642f14828410f0b9e991)

## whatコマンド用説明文
* 以下のように記述すると、`what`コマンドの引数にスクリプトファイルを取った場合に表示できる
    * `@(#)`の後に記述した文字列が表示される
	    * つまり`echo '@(#)hoge'`とかいうコマンドが含まれていれば`hoge`と表示される
    * 普通はコメントアウトして書く
    * スクリプト内のどこに書いても良い
* これだとコメントを文字列的に扱えるので気分が良い
* 調べてみたが正式な呼び名は見付からなかった。whatのmanでは、`@(#)`は単に「marker」、その後の文字列は単に「description」と書かれていた。

```sample.sh
# @(#)This is sample script.
# @(#)Usage: sample.sh
pwd # @(#)print current working directory.
```

```bash
$ what ~/bin/sample.sh
sample.sh
	This is sample script.
	Usage: sample.sh
	print current working directory.
```

## シェルスクリプト内のオプション解析等で利用する
* Usage関数の代わりに`what`コマンドを利用すれば良い
* `$0`変数はスクリプトファイルの絶対パスに置き換えられる

```sample.sh
#!/bin/bash
# @(#)This is sample script.
# @(#)Usage: sample.sh [-h]
readonly SCRIPTNAME="$(basename "$0")"
while getopts h OPT
do
  case "$OPT" in
    h)# @(#) -h: print help
      what "$0" 1>&2
      exit 0
      ;;
    ?)
      echo "$SCRIPTNAME: ERROR - Undifined option." 1>&2
      what "$0" 1>&2
      exit 1
      ;;
  esac
done
shift $((OPTIND - 1))
pwd # @(#)print current working directory.
```

```bash
$ sample.sh -h
/Users/catfist/bin/sample.sh
	This is sample script.
	Usage: sample.sh [-h]
	 -h: print help
	print current working directory.
```

### 難点
* コメント内で変数が使えない。
    * 従って、スクリプトファイル名を変更した場合、手動で修正しなければならない。
    * プレースホルダを置いておき、出力時にファイル名と置換する方法はある。

```sample.sh
#!/bin/bash
# @(#)This is sample script.
# @(#)Usage: $0 [-h]
readonly SCRIPTNAME="$(basename "$0")"
Usage () {
  what "$0" | sed "s/\$0/$SCRIPTNAME/" 1>&2
}
Notice () {
  echo "$SCRIPTNAME": "$*" 1>&2
}
while getopts h OPT
do
  case "$OPT" in
    h) # @(#) -h: print help
      Usage
      exit 0
      ;;
    ?) # 未定義オプション。getoptsがエラーメッセージを出力する
      Usage
      exit 1
      ;;
  esac
done
shift $((OPTIND - 1))
pwd # @(#)print current working directory.
```

```bash
$ what ~/bin/sample.sh # コメントがそのまま表示される
/Users/catfist/bin/sample.sh
	This is sample script.
	Usage: $0 [-h]
	 -h: print help
	print current working directory.

$ sample.sh -h # コメント内の'$0'をファイル名に置換して表示
/Users/catfist/bin/sample.sh
	This is sample script.
	Usage: sample.sh [-h]
	 -h: print help
	print current working directory.

$ ./sample.sh -z
./sample.sh: illegal option -- z
./sample.sh
	This is sample script.
	Usage: sample.sh [-h]
	 -h: print help
	print current working directory.
```


### 標準エラー出力にリダイレクトすべき
* 上記コードにおいて、`1>&2`によってwhatコマンドの標準出力を標準エラー出力にリダイレクトしている
* 標準出力すると説明文がパイプに渡されたりするので、システムメッセージ的なものは全部標準エラー出力にリダイレクトすべき

```bash
$ echo "hoge" | sed 's/hoge/fuga/'
fuga
$ echo "hoge" 1>&2 | sed 's/hoge/fuga/'
hoge
```
【Rails】Helperを使ってよりDRYなviewを書こう

# HelperでviewをDRYに
Helperとは、viewをよりシンプルにDRYに書くためのモジュール。view以外もhelpできるけど、基本的にはviewをhelpしてくれるものだと抑えましょう。

## 例
<%= form_tag %>とか<%= link_to %>とか...。Railsを書いていてこれらを使ったことがない人はいないでしょう。
こいつらはrailsがデフォで準備してくれてる便利なヘルパーたち。そのシンプルさDRYさは言わずもがな。

## helperを作ろう
デフォで用意されてるhelperは汎用的なもの。自分のアプリで繰り返し登場するコードや、viewのコードを汚くしてるものには、helperを定義してSimpleにDryにしてあげよう。

### 使用例1: 繰り返し出てくる文言
あんまりhtmlに繰り返し使う文言はベタ打ちしたくないよね。変更があったら全ていちいち変えなきゃいけないし。
そんな時にhelperを使おう。

例えば、"〜人"っていう表示をよくするとする。〜の部分に色んな数字がパラメータで入るイメージ。


```app/helpers/application_helper.rb
module ApplicationHelper
  def person(value)
    "#{value}人"
  end 
end
```

```app/view/some.html.erb
...
  <%= person person_count %>
...
```

とかしてやると、person_countという変数の数 + '人'のかたちで、viewで反映されるのがわかる。
これで繰り返し出て来る文言を全ての場所でそれぞれ定義することなく、管理がラクになる。

### 使用例2: viewのロジックをhelperで吸収

例えば、あるコントローラーにactionが3つあったとする。んで、3つのアクションでrenderされるviewが同じだけど、appleの時は、view上のナビバーのappleをactiveに、bananaの時は、view上のナビバーのbananaをactiveに、grapeの時は、view上のgrapeをactiveに、みたいにしたいとする。

```app/controller/fruit_controller.rb
...
def apple
  ...
  render same
end
def banana
  ...
  render same
end
def grape
  ...
  render same
end
...

```

helperを使ってどれをactiveにするかの振り分けをスマートにしたる。

```app/view/same.html.erb
<div class = <%= active_class "apple" %>>
  apple
</div>
<div class = <%= active_class "banana" %>>
  banana
</div>
<div class = <%= active_class "grape" %>>
  grape
</div>
```

```app/helper/application_helper.rb
...
  def active_class(target_action)
    if params[:action] == target_action
      return "active"
    end
  end
...
```

とすると、actionがそれぞれのときに、それぞれの該当するクラスのみにactiveクラスを与えるのが、こんなにシンプルで、柔軟で汎用的にかけると。素晴らし。



***

controllerでもhelperを支えたり、helperが読み込まれるタイミングだったり、helperもnamespace使って管理したりと、いろいろとまだhelperに関して知る余地はあるので、興味のある方はもっと調べてみてください。

### 参考
- http://api.rubyonrails.org/classes/ActionController/Helpers.html
- http://techspry.com/ruby_and_rails/designing-helpers-in-ruby-on-rails/
黒い画面で1秒未満のスリープを行うには

# 追記

## 実はフツーのsleepコマンドで出来た

コメント欄で教えて頂いたように、今どきのLinuxやOSXや他のUnix（自分はNetBSDで確認）でも小数点以下を指定することで１秒未満のスリープが出来ました。

追記ここまで
-----

# やり方

PerlのTime::HiResのスリープを使えば、小数点以下の秒の指定ができる。
これをワンライナーで以下のように書けば、コマンドラインで1秒未満のスリープができる。

```shell-session
perl -MTime::HiRes -e 'Time::HiRes::sleep(0.3)'
```

## 何でこんな必要があったのかは

- [コマンドラインで1秒より短い時間を指定してスリープさせるには](https://abrakatabura.hatenablog.com/entry/2015/03/11/211524)
ダメな技術書の利用法 -- 間違って、ダメな技術書を買ってしまったあなたへ

元ネタ → [ダメな技術書の見定め方 - Qiita](http://qiita.com/nappa/items/24a4e156b84d6f0a0354 "ダメな技術書の見定め方 - Qiita")

ダメな技術書は、買わないことが最善の選択なのですが、何かの間違いでダメな技術書を買ってしまった場合に、せめてもの利用法について書きます。

## ダメな技術書とは

### 良い本を選ぶにはダメな本を知らないといけないこと
良い本、ダメな本というのは個人の価値観（好み）に大きく影響されます。
結局は、ダメな本に多く触れ、どんな本が自分にとってダメな本で、どんな本が自分にとって良い本なのか、自身で経験して学ぶしかありません。

### 良い本と売れる本は違うということ
本を買う人は良い本が欲しいのは当然ですが、出版社の都合としては「売れる本」が欲しいのです。
せっかく良い本を作っても売れなければ、事業の継続ができず、絶版、入手困難となってしまいます。
売るために、やや誇張が入った造りになるのはしかたがないと個人的には思います。

### 技術書の賞味期間は短いということ
出版社の事情として、早く本を出さないと、時期外れになってしまいます。
このため、「早さ」と「内容」のトレードオフになり、「早さ」が優先されると内容、品質が落ちます。
この点は割りきって考えるしか無いでしょう。
（まれに「早さ」と「内容」の揃った名著が生まれたりするので、一概には言えません）

### 人間には相性というものがあるということ
人間には個性があり、好みは人それぞれとしか言いようがありません。
例えば、同じことを説明するにしても、まわりくどいくらい丁寧に説明するのが好きな人もいれば、シンプルに必要最小限の説明が好きな人もいます。
その違いによって、読みやすさ、わかりやすさが、人によって違ってきます。
こればかりはどうしようもありません。

## ダメな技術書のそれなりの利用法

### 1 ダメな技術書を捨てるのに躊躇してはならない
時間は限りのあるの貴重なリソースです。
ダメな本に付き合うよりも、もっと自分にとって有意義なことに自分の時間は使うべきです。

### 2 今の自分には無理でも後で理解できる本もある
定評のある本で、頑張って読んでみたけど分からなかった、という場合など。
スキルが上がると、ある日突然に、「読める」ようになります。

### 3 キーワードを抜き出す
キーワードを抜き出して、インターネットで検索し、解説しているWebサイトを見つけます。
キーワードを知らないと、検索することすらできません。
抜き出したキーワードがバズワードだとしても、バズワードはバズワードなりに利用方法があります。

### 4 期待した内容と、書かれている内容の違いについて考える
なんで、自分はこんな本を買ってしまったのだろうか。その理由を考えてみます。
そうすることで自分の思考のクセ（自分の犯しやすい失敗）を知るわけです。
自分の犯しやすい失敗を把握することは、技術書選びだけでなく、実生活でも役に立ちます。

### 5 著者や出版社をブラックリストにいれる
なるべく、その出版社や、その著者の技術書は買わないようにします。

## 終わりに
えー、すでにお気づきのことと想いますが、私も結構ダメな技術書に引っ掛かっています。
それでもなお。技術書は自分でお金を出して買ったほうが良いと思います。
PHPで配列のキーと要素配列を入れ替える

別のサイトで以下のような問いに答えたのですが、
普段こちらの方をよく利用するので、メモとして残したいと思います。

以下のようなチーム構成があって。

```php

$engineer = [
    'hardware' => ['sakaguchi', 'ohkubo', 'toda'],
    'network' => ['tsuda', 'toda'],
    'software' => ['ishino', 'yamauchi', 'toda', 'hattori'],
    'design' => ['morita', 'ishino', 'yasuhara'],
];

```

逆に、構成員ごとに、どの仕事をしているかの配列にしたい場合。

```php

$result = array_reduce(array_keys($engineer),
	function ($carry, $item) use($engineer) {
		array_walk($engineer[$item], function ($value) use(&$carry, $item) {
			$carry[$value][] = $item;
		});
		return $carry;
	},
[]);

```

結果

```php

array(9) {
  ["sakaguchi"]=>
  array(1) {
    [0]=>
    string(8) "hardware"
  }
  ["ohkubo"]=>
  array(1) {
    [0]=>
    string(8) "hardware"
  }
  ["toda"]=>
  array(3) {
    [0]=>
    string(8) "hardware"
    [1]=>
    string(7) "network"
    [2]=>
    string(8) "software"
  }
  ["tsuda"]=>
  array(1) {
    [0]=>
    string(7) "network"
  }
  ["ishino"]=>
  array(2) {
    [0]=>
    string(8) "software"
    [1]=>
    string(6) "design"
  }
  ["yamauchi"]=>
  array(1) {
    [0]=>
    string(8) "software"
  }
  ["hattori"]=>
  array(1) {
    [0]=>
    string(8) "software"
  }
  ["morita"]=>
  array(1) {
    [0]=>
    string(6) "design"
  }
  ["yasuhara"]=>
  array(1) {
    [0]=>
    string(6) "design"
  }
}


```