OmniAICreator/Qiita-1.07M huggingface dataset:
[C言語] ファイルを BASE64 に変換する


## GLib の `g_base64_encode()` を使う

```c:file2base64.c
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>

int main(int argc, char *argv[]) {
  // 変数宣言
  FILE* fp;
  long filesize;
  unsigned char* buffer;
  gchar* base64;
  
  // ファイル名が渡されなかったら終了
  if (argc < 2) {
    fprintf (stderr, "usage: %s filename\n", argv[0] );
    return 1;
  }
  
  // ファイルを開く
  fp = fopen(argv[1], "rb");

  // ファイルを開けなかったら終了
  if (fp == NULL) {
    printf("ファイルを開けませんでした\n");
    return 1;
  }

  // ファイルサイズ取得 
  fseek(fp, 0, SEEK_END);
  filesize = ftell(fp);
  fseek(fp, 0, SEEK_SET);

  // 読み込み用のバッファーを作成
  buffer = calloc(filesize, sizeof(unsigned char));
  
  // ファイルデータをメモリに読み込む
  if (fread(buffer, sizeof(unsigned char), filesize, fp)) {

    // BASE64 に変換
    base64 = g_base64_encode(buffer, filesize);

    // 出力
    printf("%s\n", base64);
    g_free(base64);
  }

  // 終了処理
  free(buffer);
  fclose(fp);

  return 0;
}
```


## GLib に頼りきったバージョン

```c:file2base64_by_gmappedfile.c
#include <glib.h>
#include <glib/gstdio.h>

int main(int argc, char *argv[]) {
  // 変数宣言
  GError** error;
  GMappedFile* fp;
  gsize filesize;
  gchar* buffer;
  gchar* base64;

  // ファイル名が渡されなかったら終了
  if (argc < 2) {
    fprintf (stderr, "usage: %s filename\n", argv[0] );
    return 1;
  }

  // ファイルを開く
  error = NULL;
  fp = g_mapped_file_new(argv[1], FALSE, error);

  // ファイルを開けなかったら終了
  if (fp == NULL) {
    printf("ファイルを開けませんでした\n");
    return 1;
  }

  // ファイルサイズ取得 
  filesize = g_mapped_file_get_length(fp);
  
  // ファイルデータをメモリに読み込む
  buffer = g_mapped_file_get_contents(fp);
  if (buffer) {

    // BASE64 に変換
    base64 = g_base64_encode((guchar *)buffer, filesize);

    // 出力
    printf("%s\n", base64);
    g_free(base64);
  }

  // 終了処理
  g_mapped_file_unref(fp);

  return 0;
}
```

GLib って便利ですね。

##参考

* [GLib Reference Manual: g_base64_encode()](https://developer.gnome.org/glib/stable/glib-Base64-Encoding.html#g-base64-encode)
* [GLib Reference Manual: File Utilities](https://developer.gnome.org/glib/2.38/glib-File-Utilities.html#GMappedFile)
Docker のプラベートレポジトリで s3 の代わりに 「さくらの BASE Storage」を利用してみる


せっかく「さくらの BASE Storage」が無料期間なので使ってみることにした。
まだ完全ではない。

## 対応方法

イメージは [dotcloud/docker-registry](https://github.com/dotcloud/docker-registry) を利用。
config を s3 を使うようにして、boto が「さくらの BASE Storage」を見るように制御する（今回はキャッシュとして使われる Redis は使わないようにしてる）。
なんか相変わらず HOME とか変だから ```/``` を HOME とみなして登録。

```
RUN echo "[s3]\nhost = b.storage.sakura.ad.jp" >/.boto
```

これだけ。

[boto でさくらのBASE Storageを弄る « 不定期な記録](http://borg4.vdomains.jp/~goro/diary/2014/2576)を参考にさせて頂いた。

現在は以下のエラーが出ることがあるので回避策を検討中

```
Your proposed upload is smaller than the minimum allowed object size. Each part must be at least 5 MB in size, except the last part.
```

あと、「さくらの BASE Storage」へのアクセスがたまに詰まる気がする
json形式のログを手軽に確認したい時のperlのコマンド

fluentdなどに取り込む際にJSON形式のログを利用することがあるが、
テストでちゃんと送れているのかちょっと確認するときにtailしたログがやたら見づらかった。

##第一段階

```pl
tail -f application_log | perl -F, -lane 'print $F[3],"\t",$F[5],"\t",$F[7],"\t",$F[9]'
```

のような感じで、”,”区切りで見たい情報がありそうなカラムの要素を指定していた。
出力するによって項目がずれたりしてかなり微妙な感じだった。

しかも確認したいカラムを先頭から数えてやんなきゃならない。
とりあえずの一時しのぎ。

##第ニ段階

```pl
tail -f application_log | perl -MJSON -MData::Dumper -lne 'print Dumper(decode_json($_));'
```

perl脳なので、perlを使うというところから進歩していないが、-Mというオプションでモジュールをロードできることを知った。
読み込みたいモジュールが複数ある場合は、-Mをその分書くことで複数指定できる。
※当然だが、perlと使うモジュールがサーバーにインストールされていなければ利用できない。

JSONを配列形式にしてダンプすれば見やすいのではないかと考えたのがこれ。
見やすいは見やすいが、第一段階より情報量が多くてやっぱり扱いづらい。

##第三段階

```pl
tail -f application_log | perl -MJSON -lne '$json=decode_json($_);@key=('id','sex','country','age');foreach $value(@key){if(defined $json->{$value}){print "$value >> ".$json->{$value}}} print "############END############\n"'
```

コマンドラインなので、だいぶごちゃごちゃしている＆もはや手軽じゃないが、
内容はforeachで回してキーの存在確認をしているだけである。
予め欲しいキーを@keyに入れておいて、そのキーがJSON中に含まれていれば、キーと値をセットで出力。
綺麗じゃないけど、1行終わったら区切り線のようなものを出力。

とりあえず、ここまできてこれで出力内容に満足した。

##補足
ちなみに日本語の値を含む要素などをprintしようとすると、

```
Wide character in print at -e
```

と表示されて怒られることがあるが、これはUTF-8フラグが付いているためなので、

```pl
binmode(STDOUT, ":utf8");
```

を付けてフラグを剥がすとよい
とってもシンプルなconfigure.ac

configure.acは世の中にいくらでもあるけど、複雑なのが多いのでシンプルなサンプルをつくってみた。

#使い方

```shell-session
$ autoconf     # configure.acと同じディレクトリで実行する。
               # マクロを展開して移植性の高いconfigureスクリプトを作り出してくれる。
$ ./configure
```

#とってもシンプルなconfigure.ac

```shell-session:configure.ac
AC_INIT([test_package_name],[0.0.1])   # 初期化と、対象のパッケージのメタデータの設定。必須。

AC_SUBST([variable], value)            # configure時に@variable@をvariableの値で置換。
                                       # 今回はvariableが設定されていないので、
                                       # 第二引数のvalueに置換。

AC_CONFIG_FILES([output])              # configureの対象となるファイルを設定。

AC_OUTPUT                              # AC_CONFIG_FILESで設定したファイルを出力
                                       # 今回は'output.in'から'output'を生成
```

#入力ファイル

```shell-session:output.in
@variable@
```

#出力ファイル

```shell-session:output
value
```

めでたしめでたし。
gitで特定のタグのshallow repositoryを作る

最新のコミットだけcloneしてくるときに`git clone --depth=1`としてshallow repositoryを作ったりしますが、最新ではなく特定のタグを取ってきたいときに。

# 追記2/27

コメントでこんな方法もあるという情報が。

```bash
$ git clone --depth=1 -b v1.2 git://github.com/foo/bar
```

> --branch <name>
> -b <name>
> Instead of pointing the newly created HEAD to the branch pointed to by the cloned repository’s HEAD, point to <name> branch instead. In a non-bare repository, this is the branch that will be checked out. __--branch can also take tags and detaches the HEAD at that commit in the resulting repository.__
> https://www.kernel.org/pub/software/scm/git/docs/git-clone.html

簡単じゃないかー。ngyukiさんありがとうございます。

バリエーションまとめ

* `git clone` 全部fetchしてmasterをチェックアウト
* `git clone -b refspec` 全部fetchして特定ブランチ・タグをチェックアウト
* `git clone [-b refspec] --single-branch` 指定したブランチ・タグのみfetchして（略）
* `git clone [-b refspec] --depth=n` 指定したブランチ・タグの最新nコミットのみ（略）

# 以下元の記事

```bash
$ git init
$ git fetch --depth=1 git://github.com/foo/bar　v1.2
$ git checkout FETCH_HEAD
```

参考にしたエントリではpullを使っていますが、この場合以下のようなエラーが出てしまいます。

```
error: Trying to write non-commit object 99700ffadab431edc6cf0c9d6a78d4a9ea5c18d6 to branch refs/heads/master
fatal: Cannot update the ref 'HEAD'.
```

pullなのでmasterをマージしようとするものの、一つもコミットしてないのでエラーになるのかなと。

なおpull/fetchに指定できるのはrefspecなので、コミットハッシュを指定することはできません。この場合はあきらめて全体をcloneするしかないようです。

# 参考
http://d.hatena.ne.jp/PvP/20080823/1219475545
http://stackoverflow.com/questions/8932389/git-shallow-clone-to-specific-tag
ポインタの話


#&とか*の意味
わかりやすいかわかりませんがたとえ話を思いつきました
一郎君と次郎君が、それぞれかごxとかごyを持っています
**一郎君の持つかごxにはりんごが3個** 、 **次郎君の持つかごyにはりんごが5個** 入っています
このとき、 **x=3** **y=5** もしくは、 **一郎のかご=3** **次郎のかご=5** と表すことができますよね？
この2つ目の表現がポインタによる表現に似ています
こうじゃ

| かご | 持つ人 | 数 | 表現1 |    表現2    |
|:---:|:------:|:-:|:-----:|:----------:|
|  x  |  一郎  | 3 |  x=3  | 一郎のかご=3 |
|  y  |  次郎  | 5 |  y=5  | 次郎のかご=5 |

この表の、 **持つ人をメモリ上の位置と考える** とポインタの話になります
C言語では、 **xの位置を、 `&x` と書きます** （上のたとえだと、 `&x=一郎` のようになります）
そして、逆に **メモリのある位置に入っているデータの中身を知る** こともできます
`*（メモリ上の位置）` と書きます
たとえば、 `p=&x`のとき `*p` とすることができます（ `*一郎=3` ）
(このメモリ上での位置を、 **アドレス** 、と言います)
（ `p` のようにアドレスを入れる変数を **ポインタ** と言います）
こうです

| 変数 | アドレス  | 値 | 表現1 | 表現2(ポインタ) |
|:---:|:--------:|:--:|:-----:|:-------------:|
|  x  |    &x    |  3 |  x=3  |    *(&x)=3    |
|  y  |    &y    |  5 |  y=5  |    *(&y)=5    |

これらを使い、このような表現ができます
( **だいぶいまさらですがコンパイル通りませんでした.あとで書き直します.** )

```c
int x = 1;
int *y;           // *yは、y（←ポインタ）がさすデータ
y = &x;           // yをxのアドレス（そこには1が入っている）に変える
printf("%d", *y); // y（xのアドレス）の場所のデータを表示（1を表示する）
// つまり*yは*(&x)となる
x = 2;
printf("%d", *y); // y（xのアドレス）の場所のデータを表示（2を表示する）
// これも*yは*(&x)
```

このままではなにが便利なのか分かりません
#使い道
関数内で引数となった変数の値を変えるとき
構造体と動的確保をつかってデータを扱うとき（後で出てくるよっ）

```c:sample1.c
void func1(int x){
  x = 1;
}
void func2(int *x){ // 参照渡し
  *x = 1;
}

int main(void){
  int n1 = 0;
  int n2 = 0;
  func1(n1);
  finc2(&n2);
  printf("%d", n1); // 0
  printf("%d", n2); // 1
}
```


#2重ポインタ（ポインタのポインタ）
配列、文字列を扱うときに使う

```c
char str[] = "abcde";
// strは1文字目のアドレスを指す（中身は'a'）
// 配列or文字列で、strと&str[0]は同じ意味
char *p;   // ポインタ
char **pp; // ポインタのポインタ

p = str; // *pは'a'
```

寝ます
続きは明日
explode()の挙動がキモい

explode()で空文字列`""`を分解しようとすると、「空文字を要素として含む配列」が返ってくる。

```php
var_dump(explode(' ', ''));

//array("")
```

この挙動がキモイというか、不便。。個人的には「空配列」になってほしいと思う。
implode()とexplode()を重ねると、元の配列に戻らない。。

```php
$arr = array();
$str = implode(' ', $arr);
var_dump($str); //(空文字)

$arr = explode(' ', $str);
var_dump($arr); //[''] ←ちょｗｗｗｗ
```

面倒くさいけど３項演算子を合わせて防ぐ感じかな。

```php
$arr = array();
$str = implode(' ', $arr);
var_dump($str); //(空文字)

$arr = ($str==='') ? array() : explode(' ', $str);
var_dump($arr); //(空配列)
```

`$str ?` で条件判定に手抜きをすると、$str==='0'だったときに判定が逆転しておかしくなります。
ListViewのアイテムをアニメーションさせる

## 概要

Google NowのようなカードUIでアニメーションとか当初どうやるのか分からなかったのですが

思っていた以上に簡単だったので書いておきます。

## アニメーションを定義したXMLを用意
`res/anim/`以下に`item_motion.xml`としてファイルを作成します。

ファイルの中身はこんな感じ

```
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="700" >
 
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1.0" />
 
    <translate
        android:fromXDelta="0"
        android:fromYDelta="100%"
        android:toXDelta="0"
        android:toYDelta="0" />
 
</set>
```
やっていることは、

* 700ミリ秒かけてアニメーションさせる(`android:duration`)
* アニメーション開始時に透過させる(`android:fromAlpha`)
* アニメーション終了時は透過させない(`andorid:toAlpha`)
* アニメーション開始時に下から移動させる(`fromYDelta`)
* アニメーション終了時に定位置にいる(`toYDelta`)

なので、このアニメーションは
`下から上に少しずつ表示されるアニメーション`になります。

## Adapterの実装

ここが肝です。といってもすごく簡単

ようはXXAdapter#getView()でViewを返す時にアニメーションを実行すればいいだけ。


```
@Override
public View getView(int position, View convertView, ViewGroup parent) {
.....省略
	
	// アニメーションをロードする
	Animation anim = AnimationUtils.loadAnimation(getContext(), R.anim.item_motion);
	// ListViewのアイテム要素にロードしたアニメーションを実行する
	convertView.startAnimation(anim);

	return convertView;
}
```

これで以下のようなアニメーションになります。

[ListViewでアニメーションさせるデモ](http://mofumofu3n.tumblr.com/post/77910179047/listview)

以上！
ガラケーサイトで端末バイブレーションさせる

いまさらガラケーのノウハウは需要ないだろなあと思いつつ、とは言えガラケーも無くなりはしないだろうと気持ちを奮い立たせて投稿^^;
ガラケー向けのWEBサイトで、端末機能(今回はバイブレーション)を利用するデモです。
このデモは GitHub Pages に載せてます。静的サイトならホスティングサーバとして利用できるので便利ですね。

https://github.com/hkusu/jp_featurephone_fash_vibration_demo

以下、GitHubから転記

***

日本国内で発売されているフィーチャーフォン（通称：ガラケー）向けのWEBサイト（HTMLサイト）で、端末のバイブレーションを鳴らすデモです。全画面FlashでなくWEBページの一部としてのFlash適用（インラインモード）であっても、端末の機能が `fscommand2` コマンドで利用できます。
スマホサイトでも端末コア機能にアクセスできると面白いんですけどね^^;

### デモページ：

http://hkusu.github.io/jp_featurephone_fash_vibration_demo/

※フィーチャーフォンで閲覧してください。あとFlashなのでiPhone系端末はFlash自体が表示されません。

ここで利用しているFlashのflaファイルは、このリポジトリの `vibration-after10sec.fla` です。上原くんサンクス！

### 参考URL：

[fscommand2コマンド](http://help.adobe.com/ja_JP/FlashLite/2.0_FlashLiteAPIReference2/WS5b3ccc516d4fbf351e63e3d118d1ff2a53-7c4e.html)
ランダムな文字列生成

Qiita登録したのでテスト投稿も兼ねて

シンプルにRubyっぽく、ランダムな文字列生成

```rb
[*:a..:z,*0..9].sample(8).join
```



----
追記

Array#sample は、同じ要素は重複して拾ってこないんですね。
勘違いしてました。
(size以上の数はsampleされない)

なので同じ文字の重複を許して、ランダムな文字列を生成するなら、

```rb
Array.new(8){[*:a..:z,*0..9].sample}.join
```

こんな感じ？
WindowsのYeomanでAngularJSとPHPアプリのひな形を作る


ChocolateyパッケージのYeomanをインストールして、AngularJSとPHPアプリのひな形を作成するメモです。
Windowsのvagrantにて、synched_folder上でYeomanを使用するとファイルシステムの都合によるのかエラーを吐きます。
そのためWindows環境で用意することにしました。

## Chocolateyのインストール

http://chocolatey.org の「Easy Install」に従い、以下をコマンドプロントに貼り付けて実行するとインストール完了です。

```
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```

## Yeomanのインストール

Yeomanのインストールは次をコマンドプロントで実行。

```
$ cinst yeoman
```

依存するパッケージも全てインストールされます。
参考 http://chocolatey.org/packages?q=yeoman

## generator-angular-phpのインストール

AngularJSとPHP連携のgeneratorをインストール。

```
$ npm install -g generator-angular-php
```

## yoの実行失敗…Node.jsのバージョンを上げて回避

```
$ yo angular-php
```

yoを実行すると「Object has no method 'tmpdir' 」なエラーが出力され、ググると次のページにたどり着きました。
https://github.com/gruntjs/grunt-contrib-imagemin/issues/142
「Node >= 0.10」というコメントがあったので、http://nodejs.org/ から0.10系をインストールしてyoのエラーを回避。
ちなみにChocolateyは0.8系をインストールしていました。

## composerの実行

yoは最後まで実行されましたが、途中でcomposerが失敗していました。
ディレクトリを一時的に移動して手動実行。

```
$ cd app¥api
$ php composer.phar update
```

## npm install

gruntが入っていないのでnpmでインストール。yoを実行したディレクトリで次を実行します。

```
$ npm install
```

webappとかのgenerateだと自動でインストールしてくれるのですが。。

## grunt serveの実行

```
$ grunt serve
```

「compassが無い」と怒られます。
依存関係によりcompassもインストールされているはずですが入っていません。
また```$ cinst compass```してもインストール済みと出力されます。
なので再インストール。

```
$ cinst -force compass
```

compassのパスが通り、```grunt serve```が実行可能になります。

## phpソースをいじってみる

次の変数$resourcesがangularのリクエストに対するレスポンスです。

```app¥api¥public¥resource.php
    $resources = array(
        'html5-boilerplate' => array(
            'name' => 'HTML5 Boilerplate',
            'description' => 'HTML5 Boilerplate is a professional front-end template'
                . ' for building fast, robust, and adaptable web apps or sites.',
        ),
        'angular' => array(
            'name' => 'Angular',
            'description' => 'AngularJS is a toolset for building the framework most'
                . ' suited to your application development.',
        ),
        'karma' => array(
            'name' => 'Karma',
            'description' => 'Spectacular Test Runner for JavaScript.',
        ),
    );
```

変数の中身をいじくると表示が変わります。

## gruntでビルド

karmaのテストが無く、ビルドが途中で止まるのでforceオプションを付けます。

```
$ grunt --force
```

distディレクトリに配布物が生成されます。

途中つまずきましたが、Windowsでインストールを簡単にしてくれるChocolateyはとても便利ですね。
Vimのカーソル移動が遅い時にやった事

最近`Vim`のプラグインを入れたり設定を頻繁に変えていたら、いつの間にかカーソル移動が異常に重くなっていました。

自分の場合、原因だったのはシンタックスハイライトとカーソル行の可視化設定だったようで、

    " シンタックスハイライトON
    syntax on
    " カーソル行可視化
    set cursorline

行可視化を無効にしたらかなり早くなりました。

この他に`set cursorcolumn`（列可視化）なる設定をしていても重くなるようなので、
移動が重い人はこの辺りを調節してみて下さい。
本当は怖いTARGET_OS_MAC


本日二回目の怖いシリーズ。
まずは落ち着いて以下の表を見て欲しい。

参考）
http://stackoverflow.com/questions/15323109/creating-an-ios-os-x-cross-platform-class
http://sealiesoftware.com/blog/archive/2010/8/16/TargetConditionalsh.html

![スクリーンショット 2014-02-26 23.16.25.png](https://qiita-image-store.s3.amazonaws.com/0/3209/10f0c434-769e-0c0a-9b6c-d7f1da18485e.png "スクリーンショット 2014-02-26 23.16.25.png")

[![MMR どういうこと](http://tiqav.com/1Bv.th.jpg)](http://tiqav.com/1Bv)

**なんでiOSデバイスでもTARGET_OS_MACが1なんだよ！！！！**

とはいえ、実は以下のように書いても動作します。

```
#if TARGET_OS_IPHONE
// iOS用
#import <UIKit/UIKit.h>
#elif TARGET_OS_MAC
// OSX用
#import <Cococa/Cococa.h>
#endif
```

ですがこれは通りません。

```
#if TARGET_OS_MAC
// OSX用
#import <Cococa/Cococa.h>
#endif
```
なんでかなーと思ったら、iOS最初の分岐で分かれていたからですね。
**((((；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ**
Packstack --allinone with Fedora 20 (2014/02/26)


2014/02/26現在、そのままではインストールできないのでメモ。

```Bash:packstack_allinone_fedora20_20140226.sh
#!/bin/sh

# disable selinux
sed -i -e '/^SELINUX=/c\SELINUX=permissive' /etc/selinux/config
setenforce Permissive

# disable firewalld
systemctl disable firewalld

# ensure up to date
yum -y update

# install mariadb prior to packstack
yum -y install mariadb-server

# and create the missing log file
touch /var/log/mysqld.log
chown mysql:mysql /var/log/mysqld.log
chmod 640 /var/log/mysqld.log

# install packstack
yum -y install openstack-packstack

packstack --allinone
```

実行

```
$ sudo sh packstack_allinone_fedora20_20140226.sh
```
JSFで『1 つまたは複数のリソースに 'head' のターゲットがありますが、'head' コンポーネントがビューで定義されていません。』


ちょっとぱっと見分かりづらいエラーですが、要するにheadがJSFとして定義されていないためこういう警告になるようです。

解決策は参考サイトと同じように、`<head jsfc="h:head">`と設定すればOKでした。

感謝。



### 参考
* [JSF2.0のAJAX使用注意点](http://d.hatena.ne.jp/gu_dara/20100421)
日本の伝統文化をハックしてみた


![ambient noren		](https://31.media.tumblr.com/60e463bcd03a6874a8c061802a63bb39/tumblr_inline_mz4qtwzxsN1sr7rg0.jpg)

http://smallhackcafe.tumblr.com/ambient-noren

日本の伝統品である「のれん」をデザインし直してみました。
人や風が通り抜けたときに音が鳴るというシンプルなアイディアです。

のれんに加速度センサ縫い付け、そのデータをパソコンに無線送信しています。
パソコン側では SuperCollider という音声生成用のソフトウェアで、音が鳴るようプログラミングしておきます。
音は、のれんが揺れる大きさによって変化します。

## 作ってみよう

簡単に手順を載せておきます。
細かいところはフィーリングでお願いします。

### 準備

使用した材料や工具は、だいたい下記のようなものです。

* 布
* のれん棒
* 導電糸
* 導線
* LilyPad Arduino
* 加速度センサ
* XBee
* LilyPad XBee
* 単3乾電池
* 電池ボックス
* 裁縫道具
* ハンダ
* ハンダごて

### ソフトウェア

Arduino や SuperCollider のプログラムを書きます。
ソースコードは Gist に置いておきましたので、ご参考ください。

https://gist.github.com/emsk/8393953


### ハードウェア

#### 縫う

電気を通す糸を使って、のれんに Arduino やセンサ、電池ボックスを縫い付けていきます。
配線が難しい場合は普通の導線を使っても良いかと思います。

#### 補強する

さらに接触不良にならないようハンダで補強します。
逆に絶縁したい箇所は、手芸用のボンドを使います。

#### 仕上げる

縫い付けた Arduino 等の基板が隠れるような形で、のれんの布を2枚重ねにして縫います。
電池を入れられるよう、一部は縫い合わせないまま隙間を開けておきます。
棒を通す輪（ちぎれ）を上部に縫い付け、できあがりです。

#### 動かす
電池を入れます。
SuperCollider サーバを起動します。
のれんを揺らします。
音が鳴ります。

## なぜ作ったか
日本に古くからある伝統文化と現代のテクノロジーを掛け合わせることで、新たな価値を生み出せるのではないか。
そんなことを最近考えていて、とりあえず手を動かしてみようと思って、同僚と2人で作りました。

## プロトタイピング大事
大したことないアイディアですが、実際に作るとなると慣れないことばかりでした。
普段は Web プログラマですので、特にハードウェアに関しては、試行錯誤しながら多くの時間を費やしました。
また、業務時間外での製作ということもあり、いろいろと苦労はありましたが、それでも完成した時には作って良かったと思えました。

やってみること、大事だと思います。
今まで見えなかったものが見えてくる。
モノづくりとは、その繰り返しだと思うのです。

皆さんも何か作って公開してみませんか。
アニメの放送時間変更を見逃さないためのChrome拡張を作った「アニメあんてな」

# いもちょを撮り逃してしまった！
今期アニメの中でも楽しみにしていた[いもちょ](http://imocyo-anime.com/)を撮り逃してしまった！

どうやら2月から放送時間が変更されていたらしく、トルネがそこらへんなんとかしてくれたりするのかなとか思ってたけどそんなことなかった。

気づいたのは割りと最近で、どれくらい録画されてるのか軽く確認してみようと思ってトルネを起動した時に発覚した。

基本的にそのシリーズが放送しきってからまとめて観るようにしているため、撮り逃したり等で録画しているシリーズ内に抜けが発生するとその時点で視聴を諦めないといけないのでこの問題は僕にとって致命的だ。

# 結果
この悲しみを二度と繰り返さないために生まれてきたのがこれ
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/20629/4c014257-02b4-f771-8f59-d1c584a465ed.jpeg)

- github
 - https://github.com/chuross/anime-antena-extension

# 紹介
## 機能
- 現在の日付から2週間で放送時間が変更されている可能性のある番組を一覧で表示する
 - 可能性という表記にしているのは、先週放送がなかった番組もレスポンスにのってくるので正確な情報ではないため
- バッググラウンドで30分毎に情報を更新しに行く
 - 変更された可能性のある番組がある場合はバッジに数を表示する

## 使い方
### 必要なもの
- Google Chrome
- アニメあんてな([download](https://github.com/chuross/anime-antena-extension/blob/master/anime-antena.crx))

### 手順
1. crxをダウンロードしてくる
`https://github.com/chuross/anime-antena-extension/blob/master/anime-antena.crx`
1. アドレスバーにchrome://chrome/extensions/と入力してエンターキーを押す
1. ダウンロードしてきたcrxを拡張機能の画面にドラッグ&ドロップ
1. 拡張を追加しますかみたいなこと聞かれるのでそのまま追加する

### 実際に使ってみる
1. [ちょうだいExtension](http://qiita.com/chuross/items/1e194639910908dd47d1)と同じように右上にアイコンが表示されてるはずなので押すだけ

## 技術的な話題とかその他
- 今回アニメの情報取得は[しょぼいカレンダー](http://cal.syoboi.jp/)のrss2.phpを利用した
- 見栄えは[Twitter Bootstrap](http://getbootstrap.com/2.3.2/)を使った。とにかく思いついたもの素早く作りたい時みたいな脳筋開発時にはすごい助かる。
- javascriptってJavaでいう[Apache Commons](http://commons.apache.org/)みたいな汎用的に使えるライブラリないのかな。気が向いたら探す。

# 反省会会場
## 改善点
- より確実に放送時間が変更されている番組を取得するようにする
 - 一応コメントの項目に「放送枠移動」が入ってくるので正規表現などで判別できそうではある
 - やろうとは思いつつ結局やらなかった理由は、もしコメントに時間変更が書かれてなかった場合に漏れが発生するため
- アイコン作りたい
 - 全くイメージ湧いてないかなしい

## 今後追加するかもしれない機能
気が向いた時か自分が必要になった時に実装するかも

- 新番組通知
 - 気づいたら放送されてる事が起きないようにこの機能は追加するかもしれない
- 放送休止通知
 - ここらへんは割りと機能しているようなので、あんまし必要ないけどあると嬉しいよね程度
- ページ送り
 - 10日以降のデータも見たい時はありそう(トルネの番組表が1週間単位なのでそんなに重視してない)
- チェックしたらアイコンバッジを消して、新しいのが来たらそれだけカウントして表示する
 - バッジに表示されてる数が一度確認したものなのかまだ確認してないのか分からないのは微妙だよね
- 自分が住んでる地域で絞り込めるようにしたい
 - 別の地方の通知されても正直いらないよね
（メモ）Vagrant環境でPostgreSQL

SQL分の書き方が分からず恐いのでドットインストールで勉強しようと思ったのだが、使えるようにするまでにものすごく手こずったので手順をメモしとく。

#### Vagrantを起動して入る

```
vagrant up
```

```
vagrant ssh
```

#### インストール〜起動

```
sudo yum install postgresql-server
```

yumでインストール。

```
sudo mkdir -p /var/lib/pgsql
```

これと

```
chown -R postgres:postgres /var/lib/pgsql
```

これはよく分からないまま実行した。

```
sudo service postgresql initdb
```

データベースクラスタの生成（自分の環境では/var/lib/pgsql/dataみたい）。正直これも「？」。

```
sudo service postgresql start
```

起動。あとは毎回 **start** は面倒くさいので```sudo chkconfig postgresql on```する。

#### ログイン

```
sudo -u postgres psql
```

この時点で、 **postgres** というユーザー名でPostgreSQLにログインできた。 **\q** で抜けることができる。

同様にデータベースの作成は

```
sudo -u postgres createdb [DBname]
```

削除だったらcreatedbを **dropdb** に置き換える。

使用は

```
sudo -u postgres psql [DBname]
```

これでとりあえずデータベースを作ったり消したり遊べるようにはなった。

ただいちいち```sudo -u postgres```でユーザー指定しているのは非常に格好わるいので新しくユーザーを追加すべき。

```
sudo -u postgres createuser
```

すると色々と聞かれた。

>作成するロール名を入力してください: 
新しいロールをスーパーユーザとしますか?  (y/n)
新しいロールにデータベース作成権限を与えますか? (y/n)
新しいロールにロールを作成する権限を与えますか? (y/n)

ロールというのはユーザーとほぼ同じ意味だと思われる。
自分の場合は **vagrant** というユーザー名にし、データベースの作成権限のみを与えた。プロンプトが **vagrant@localhost** となっているなら上記のアクションは```sudo -u postgres```を書かずに実行できるようになるはず（ここら辺の知識がちょっと曖昧だったりする）。 **createuser** のみ権限が無いため不可。

### 本当はパスワードの設定とかもやるべきなのだろうが、それはまた今度にしよう。
CALayerでNSResponderのイベントをキャプチャする


CALayerはNSViewに比べてとても便利でUIViewに近い機能を持っていますが、イベントハンドラがありません。そのため、いろいろなイベントは自由に取得できませんが、CALayerが元をたどれば何かのNSViewのlayerにaddSublayer:されるという前提があれば、イベントを自由にキャプチャできます。

Cocoaでは（というか、普通のウィンドウシステムなら？）イベントハンドリングはレスポンダチェーンを辿って最終的にrootのNSwindowオブジェクトにバブルアップします。NSResponderにはsetNextResponder:というメソッドがあるので、これを使うと普通にイベントチェーンを全く無関係のオブジェクトからキャプチャできます。

そこでこんなクラスを作りました。

```objectivec:ResponderProxy

typedef void (^ResponderHandler)(NSEvent *e);

@interface ResponderProxy : NSResponder

- (instancetype)initWithHandler:(ResponderHandler)hander;
- (instancetype)initWithDelegate:(id)delegate selector:(SEL)selector;

@property (nonatomic, weak) id delegate;
@property (nonatomic) SEL selector;
@property (nonatomic, copy) ResponderHandler eventandler;

@end

@implementation ResponderProxy

- (instancetype)initWithHandler:(ResponderHandler)hander
{
    self = [self init];
    self.eventandler = hander;
    return self ?: nil;
}

- (instancetype)initWithDelegate:(id)delegate selector:(SEL)selector
{
    self = [self init];
    self.delegate = delegate;
    self.selector = selector;
    return self ?: nil;
}

- (void)mouseDown:(NSEvent *)theEvent
{
    if (self.eventandler) {
        self.eventandler(theEvent);
    }else if (self.delegate && self.selector) {
        if ([self.delegate respondsToSelector:self.selector]) {
            objc_msgSend(self.delegate, self.selector, theEvent);
        }
    }
}

@end
```

```objectivec

@interface SomeLayer : CALayer

// レイヤーが所属するrootのNSView
@property (nonatomic, weak) NSView *rootView;

@end

@implementation SomeLayer
{
  ResponderProxy *_responderProxy;
}

- (instancetype)initWithRootView:(NSView*)rootView
{
    self = [self init];
	// レスポンダプロクシを挟んでこのクラスでキャプチャする
    _responderProxy = [[ResponderProxy alloc] initWithDelegate:self selector:@selector(handleNSEvent:)];
    NSResponder *next = rootView.nextResponder;
    [rootView setNextResponder:_responderProxy];
    [_responderProxy setNextResponder:next];
	_rootView = rootView;
    return self ?: nil;
}

- (void)handleNSEvent:(NSEvent*)event
{
    NSLog(@"%@",event);
}

```

これでrootViewの上でクリックするとログが出力されます。用途に合わせてハンドラを変えると便利だと思います。
UIResponderにはsetNextResponder:がありませんが、UIGestureRecognizerを使えば同じことが出来ると思います。
Internet Explorer 9 以前のCSSスタイルの制限


IE9以前のIEではCSSスタイルの記述に制限がある。
以下の制限を超えると、超えた分の記述したスタイルは適用されない。

* ファイルもしくは```<style>```タグあたりのルール(中括弧ひとつ。```div.class { }```など)は4095個まで。
* ```<style>```タグは31個まで。
* ```@import```のネストは3階層まで。
* ```@import```で読み込むファイルは31個まで。

下2つの```@import```については今はもうあまり使われないからいいとしても、
複数のスタイルシートを圧縮したときの1ファイルあたりのセレクタ数には気をつけたいところ。

[参考]
http://support.microsoft.com/kb/262161
http://blogs.msdn.com/b/ieinternals/archive/2011/05/14/internet-explorer-stylesheet-rule-selector-import-sheet-limit-maximum.aspx
pluckみたくNSArrayに入ってるNSManagedObjectから特定のプロパティの配列を作りたい時

普段Androidな開発友達から質問が来たので。


HogeをNSManagedObjectの派生クラスとします。

```
@interface Hoge : NSManagedObject
  NSNumber *hoge_id;
  NSNumber *name;
  NSNumber *status;
  Poyo *poyo;
@end
```

このnameだけの配列が欲しい時どうするか?
ずばり`valueForKeyPath:`を使います。

```
- (NSArray *)namesByStatus:( NSInteger status ){
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status = %d", status ];
  NSArray *records = [Hoge findAllByPredicate:predicate];

  return [records valueForKeyPath:@"name"]; // こんだけ
}
```

さらにHogeに入ったPoyoのnameも欲しい時は?


```
[records valueForKeyPath:@"poyo.name"]; // こんだけ
```
「.」で繋げると深いところも取ってこれます。

underscore.js/.phpでいうところのpluckとかそういうのですね。
単純すぎてググりにくいネタなので。

なぜこれで取ってこれるか知りたい人はKVC(Key-Value Coding)辺りを調べるといいかも。
Gem作成手順覚書


[パーフェクトRuby](http://amzn.to/1cmvDI1)の15章の覚書

# 前提

bundler インストール済み

```
gem install bundler
```

# プロジェクト作成

下記を実行すれば *ディレクトリが作られ* て、その中にgemのテンプレートが作成される。


```
bundle gem {gem名} -b
```


# bundle経由で実行

```
bundle exec ruby bin/{any_file}
```

# rakeタスクの確認

```
bundle exec rake -T
```

## gem の作成

```
bundle exec rake build
```

./pkg ディレクトリ以下にgemが作成される


## gem のインストール

```
bundle exec rake install
```

作成したgemをインストールする
SeleniumでFirefoxのプラグインを使う

プロファイルの設定をすることで、Firefoxのプラグイン（アドオン）を有効にした状態でテストを走らせる事ができる

ユースケースとしては、
最近は需要が減っているとは思うが、FireMobileSimulatorで携帯ブラウザのテストをしたり、
Firebugを有効にしたりがあると思う。

方法としては、
必要なプラグインをすでにインストール済みのプロファイルを用意する方法や
新しいプロファイルでテスト起動の度に毎回プラグインのインストールをする方法がある
（プラグインの開発者などはこの方法だったりする）

前提として
[複数バージョンのFirefoxをSeleniumでテストする](http://qiita.com/quattro_4/items/8e14bcbd3e6901ae69a2)
のプロファイルの追加を参照

上記記事で`profile`を初期化した後で、プラグインのインストールや設定を追加すれば良い

一例としてFireMobileSimulatorを有効にする方法（例では5番目の端末が有効になる）

```ruby:
profile = Selenium::WebDriver::Firefox::Profile.from_name(ENV['FIREFOX_PROFILE_NAME'])
profile["msim.current.id"] = '5'

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, :browser => :firefox, :profile => profile)
end
```

`Selenium::WebDriver::Firefox::Profile.new`した場合はインストールも必要

以下の記事を参照

[参考:watir-webdriver でFireMobileSimulatorを使用する](http://memolog.org/2010/12/watir-webdriver_with_firemobilesimulator.html)

情報はあまり多くはないが、意外と情報は見つけやすいはず
必ずしもRubyの情報である必要はなくJavaとかSeleniumそのものの書き方から情報は得られると思う

例えば `msim.current.carrier` とか `add_extension xpi` のようなキーワードでググると良い
複数バージョンのFirefoxをSeleniumでテストする

FirefoxがNew IEへの道をたどりつつある昨今いかがお過ごしでしょうか？

古いFirefoxを使って、テスト(CI)を走らせる必要があったのでその方法をまとめる
今回の環境はMacOSX上でのRailsのプロジェクトでCapyabra(Selenium)を使ってテストを動かす

## 古いFirefoxのインストール

過去のFirefoxダウンロード一覧
https://ftp.mozilla.org/pub/firefox/releases/
(今回必要だったのはバージョン25)

いったんデスクトップなどにコピーし`Firefox25.app`などにリネームし`/Applications/`に移動

## Seleniumの設定変更

設定を書くファイルは`spec/spec_helper.rb`, `spec/support/env.rb`, `spec/support/selenium.rb`などで良いと思う

```ruby:spec/support/env.rb
require 'selenium-webdriver'
firefox_path = '/Applications/Firefox25.app/Contents/MacOS/firefox-bin'
Selenium::WebDriver::Firefox::Binary.path = firefox_path
```

### 環境変数で切り替えられるようにする場合（例）

```ruby:
if ENV['FIREFOX25']
  ...
end
```

## 問題点

### 環境設定の自動更新をオフにする必要がある

メニュー ＞ Firefox ＞ 環境設定 ＞ 詳細 ＞ [更新] ＞ 更新の確認は行わない

環境設定の自動更新をオフにしないと、次回以降の起動でいつのまにか更新されてたりするので要確認
テスト実行時もバージョンを良く確認するようにする

メニュー ＞ Firefox ＞ Firefoxについて

自動更新されてしまったら再度上書きでインストールし直す
（この辺の挙動は良くわからなくて、もともと入っている`/Applications/Firefox.app`と環境設定を共有している？かもしれない）

### Firefoxの同時起動と警告

最新のFirefoxと古いものを同時に起動すると、警告が出たが、出ない時もあった
この辺の挙動も良くわからない

今は古いバージョンのFirefoxで走らせるプロジェクトは1つのみなので、Jenkinsのビルドがかぶらないように気をつけているだけ

## プロファイルの切り替え

上記の問題点がプロファイルの切り替えで解決するかもしれないと考えて、やってみたが実際解決したかどうか良くわかっていない

デフォルトでSeleniumは毎回新しいプロファイルを使っている

### プロファイルの追加

`$ /Applications/Firefox.app/Contents/MacOS/firefox-bin -profilemanager`

→ 新規プロファイルの作成...

もともと`default`があるはずで、これは普通に使っていてDockなどから`Firefox.app`を起動した場合のプロファイル

※ `$ /Applications/Firefox25.app/Contents/MacOS/firefox-bin -profilemanager` でも同じダイアログが出たので、プロファイルはFirefox間で共有しているっぽい

### プロファイルを切り替える

環境変数で指定できるようにしている。無い場合はデフォルトの新しいプロファイル

```ruby:spec/support/env.rb
firefox_path = '/Applications/Firefox25.app/Contents/MacOS/firefox-bin'
Selenium::WebDriver::Firefox::Binary.path = firefox_path
profile = if ENV['FIREFOX_PROFILE_NAME']
  Selenium::WebDriver::Firefox::Profile.from_name(ENV['FIREFOX_PROFILE_NAME'])
else
  Selenium::WebDriver::Firefox::Profile.new
end

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, :browser => :firefox, :profile => profile)
end
```

実行のコマンドは例えば

```bash:
$ FIREFOX_PROFILE_NAME=selenium rspec
```

`FIREFOX_PROFILE_NAME=default`で通常使っているプロファイルも指定できる

## その他

### bundle update selenium-webdriver

Firefoxを常に最新にしている場合は、定期的にSeleniumが動かなくなる
Seleniumも最新にすることで直ることが多い

`$ bundle update selenium-webdriver`

### firefoxとfirefox-binの違い

`ls -al /Applications/Firefox.app/Contents/MacOS/firefox*`
するとfirefoxとfirefox-binでファイルサイズが違うが調べても違いはあまり良く分からなかった

とりあえず動いているのでOK

### -no-remote

コマンドラインでFirefoxを起動している例で、多くの場合`-no-remote`オプションをつけている
ソース見るとSeleniumでは内部で自動的に付加されているっぽい
警告特盛りにしてたらBoost.Pythonのサンプルコードが通らなかった話


C++サイドで何か例外的な状態になったら、さくっと例外を投げて通知したい。とはいえプロトタイプづくりの段階でいちいち個別の例外クラスを作ったりするのは面倒。

そこで<a href='http://www.boost.org/doc/libs/1_55_0/libs/python/doc/v2/exception_translator.html'>Header &lt;boost/python/exception_translator.hpp&gt;</a>のサンプルコードを流用して、コンストラクタが文字列を取るようにしようとおもった。

    struct my_exception : std::exception
    {
        char const* what() throw() { return "One of my exceptions"; }
    };

    void translate(my_exception const& e)
    {
        PyErr_SetString(PyExc_RuntimeError, e.what());
    }

    void something_which_throws()
    {
        ...
        throw my_exception();
        ...
    }

しかし、このサンプルは下記のコンパイルエラーになってしまう。

    hello.cpp:39:46: error: passing ‘const my_exception’ as ‘this’ argument of ‘const char* my_exception::what()’ discards qualifiers [-fpermissive] 

原因はwhat()がconst methodでないせい。「translateがeをconst参照で受けてるのにwhatメソッド呼んでるけど、これオブジェクトを破壊的に書き換えたりしないの？」と言われている。「whatメソッドはオブジェクトの状態を書き換えたりしないよー」と宣言してやる必要がある。

    char const* what() const throw() { return "One of my exceptions"; } 

めでたしめでたし。
高速化したGNU grepをインストールする

[いまさらgrepが10倍高速化したのはなぜか](http://hamukazu.com/2014/02/24/why-grep-can-be-accelerated/) を見て
MacOSXで使えるかやってみた(Snow Leopardの頃から使っているMacBookPro)

続きで特定の条件下(UTF-8以外)では遅いというのもあった
[10倍速くなったと思ったら今度は200倍遅くなっていた](http://hamukazu.com/2014/02/26/gnu-grep-1-28-fixed-performance-regression/)

### 現在使っているgrepの確認

```sh:
$ which grep
/usr/bin/grep
$ grep --version
grep (BSD grep) 2.5.1-FreeBSD
```

速いらしいバージョンは2.17

## brewでgrepをインストール

普段brewを使っている場合はbrewでインストールする

[参考にした情報](http://memo.sappari.org/mac)

```sh:
# brewを最新にする
$ brew update

# インストールの準備
$ brew tap homebrew/dupes
Cloning into '/usr/local/Library/Taps/homebrew-dupes'...

# grepのインストール
$ brew install homebrew/dupes/grep
==> Installing grep
==> Downloading http://ftpmirror.gnu.org/grep/grep-2.17.tar.xz
...
/usr/local/Cellar/grep/2.17: 14 files, 960K, built in 43 seconds

# インストール後の確認
$ /usr/local/Cellar/grep/2.17/bin/ggrep --version
/usr/local/Cellar/grep/2.17/bin/ggrep (GNU grep) 2.17
$ which ggrep
/usr/local/bin/ggrep
```

コマンドは`ggrep`だった

### エイリアス

コマンドを古いgrepと置き換えたい場合は、エイリアスなり、シンボリックリンクなり、PATHの変更をすると良い

## ベンチマーク（性能比較）

`$ time grep ...` と `$ time ggrep ...`
をある同じ条件で比較したところ数回の試行で
およそ 3min22sec vs 44sec で数倍速かった

### LANG=C

`$ LANG=C grep ...` でも速くなるのは以前試した
併用して速くなったかは良くわからなかった

### 他高速化オプション

`-i` 大文字と小文字の区別をなくす
`-I` でバイナリファイルを無視して検索
`--exclude-dir=PATTERN` で特定のディレクトリを無視

何かおかしかったら元のやつ使って、状況に応じて使い分ければ良いと思う
devise, controllerの継承, ルーティングの設定

# devise

## sign_inの振る舞いを変更
Userモデルのsession_contollerを変更したいので, コントローラを作成して,

```
rails g controller users/sessions
```

DeviseのSessionsContollerを継承しておく.

```users/sessions_controller
class Users::SessionsController < Devise::SessionsController
```

あとはメソッドをオーバーライドして振る舞いを変える.

## sign_upの振る舞いを変更
同様に

```
rails g contoller users/registrations
```

継承元を以下のように変更.

```users/registrations_controller
class Users::RegistrationsController < Devise::RegistrationsController
```

## 作成したコントローラのルーティングを設定
routes.rbに以下の項目を追加する.

```routes.rb
devise_for :users, :controllers => {
    :sessions => 'users/sessions' ,
    :registrations => 'users/registrations'
}
```

## devise側で用意されてるインスタンス

ログインしてないユーザーをログイン画面に飛ばす(controllerで)

```
before_filter :authenticate_user!
```

ログインしてるユーザー(viewで)

```
current_user
```
Railsに手軽にWYSIWYGエディタを組み込みたい


[CKEditor](http://ckeditor.com/)のRails用のバインディング [galetahub/ckeditor](https://github.com/galetahub/ckeditor) が手軽で良かった。

https://github.com/galetahub/ckeditor

良かったところ:

- セットアップが簡単
 - Gemfile に`gem 'ckeditor'`と書いて
 - application.js に`//= require ckeditor/init`と書いて
 - フォーム中のエディタにしたい箇所を `f.text_area` -> `f.cktext_area`とするだけで動く

- ファイルのアップロード機能も良い感じにサポートしてくれている
 - 用意されているgenerateコマンドだけで良い感じに動いてくれる
 - バックエンドもcarrierwaveとかpaperclipを選べて良い感じに動いてくれる

[README.md](https://github.com/galetahub/ckeditor)を見ればだいたいのことがわかる。

オープンソースの場合は無料で使えるのでかなり便利。商用利用の場合はライセンスを買う必要があるけれど、それにしたって[高すぎるということはない](http://cksource.com/ckeditor/buy)ので必要な場合にはだいぶ良い選択肢だと思う。
Windbgを用いたIAT(Import Address Table)のダンプ


### 1. プロセスにデバッガをアタッチする

試してないですが、ダンプファイルの解析でも出来るんじゃないかな?
ダンプファイルの場合は次のステップからやってみてください。

### 2. IATの中身を見たいモジュールの先頭アドレスを探す

```
0:001> lm
```

### 3. PEヘッダーの中身を確認

```
0:001> !dh <start address> -f
```

- IATテーブルの相対アドレスとサイズが出力結果から確認できるはず 

### 4. IATテーブルの中身を出力(可能なら限りシンボルを解決させながら)

```
0:001> dps <start address+IATテーブルの相対アドレス> <start address+IATテーブルの相対アドレス+IATテーブルのサイズ>
```

IATの中身がシンボル付きで出てくるはず。
IATテーブルが書き換えられてAPI呼び出しがフックされているような場合はIATテーブルの中身が普段と異なる値になってると思う。

参考URL

http://tomsreversing.com/2013/03/11/viewing-imports-table/
DockerをBoot2dockerで動かした際のポートフォワードをCLIから設定する


[boot2docker](https://github.com/boot2docker/boot2docker)、OSXからも気軽に[Docker](http://www.docker.io)が扱えて便利です。

ただ、boot2dockerでは、VirtualBox上にDockerが立ち上がるため、`docker run -p`やDockerfileで`EXPOSE`を設定しただけでは、DockerとVirtualBox上のLinuxとはポートの転送設定が行われるものの、OSXのlocalhostからは、ポートの転送設定が行われず、参照できないという問題というがあり、やや不便です。

正しく接続可能にするには、boot2dockerのVirtualboxイメージに対して、ポートの転送設定をする必要があります。これをCLIから行うには、以下のコマンドを実行して、Virtualboxを設定します。

```
VBoxManage controlvm "boot2docker-vm" natpf1 "nginx,tcp,127.0.0.1,80,,80"
```

上記設定では、VirtualBox上の80番ポートをOSXのlocalhostの80番ポートに転送しています。
Bashで連想配列を使用する

```shell-session
declare -A hash_
```

で定義して

```shell-session
hash_["a"]="test"
```

のように使う

中身を参照するときは

```shell-session
echo ${hash_["a"]}
```

とする。

```shell-session
echo ${hash_}
```

とはできない。

キーの一覧の取得

```shell-session
echo ${!hash_[@]}
```

参考URL: http://stackoverflow.com/questions/3112687/how-to-iterate-over-associative-array-in-bash



# TODO: 連想配列を他の変数に代入する方法を調べる。
infinite scrollの負荷軽減についての参考リンク

http://dannysu.com/2012/07/07/infinite-scroll-memory-optimization/
http://engineering.linkedin.com/linkedin-ipad-5-techniques-smooth-infinite-scrolling-html5
http://googlewebmastercentral-ja.blogspot.jp/2014/02/infinite-scroll-search-friendly.html?m=1
ライセンス表示は宝の山

MIT、BSD、Apacheライセンスのライブラリを使用している場合、かならずどこかにライセンス表示があります。プログラマ的に「いけてる！」って感じるアプリを見つけたら、ライセンス表示から使っているライブラリを調べて行くと良い勉強になります。車輪の再開発をしている場合じゃありません。

こちらは、うちの会社で作っているPoinのライセンス表示。
気になるライブラリはありますか？（基本的にぐぐるとでてくるものです）

![license.png](https://qiita-image-store.s3.amazonaws.com/0/33513/37892856-8abd-e434-765c-547ae4e22a9e.png)
gitリモートリポジトリでの開発の始め方

まずリモートレポジトリにリポジトリを作る。
それをクローンする。

```bash
$ git clone https://username:password@servername/git/someproject
```
空のファイルでよいので作成してコミットする。

```bash
$ touch README
$ ls
$ git add .
$ git commit -m "first commit"
```
プッシュする。

```bash
$ git push origin master
```
developブランチを作成する。

```bash
$ git branch develop
$ git branch
  develop
* master
```

developにチェックアウト

```bash
$ git checkout develop
Switched to branch 'develop'
```

初期状態のファイルを設置した後、コミットしてプッシュ


```bash
$ git push origin develop
```
featureブランチを作成して作業開始。

```bash
$ git branch feature/#111
$ git checkout feature/#111
```
以下のようにやってもいい。

```bash
$ git checkout -b feature/#111
```
終わったらコミットしてdevelopにチェックアウト

```bash
$ git commit -am 'some some some'
$ git checkout develop
```

ファストフォワードしないでマージし、プッシュ


```bash
$ git merge --no-ff feature/#111
$ git push
```

ほっとくと増えてしょうがないので終わったブランチは削除


```bash
$ git branch -d feature/#111
```


途中からリモートにある別のブランチで作業したい時、


```bash
$ git fetch
```

とすると、リモートのブランチ名が全部出てくるので、


```bash
$ git checkout -b feature/#222 origin/feature/#222
```
とする。

作業途中のブランチを一旦リモートにあげときたい時、


```bash
$ git push origin feature/#222
```

mergeしてみたが競合が訳わかんなくてやっぱり元に戻したい時、


```bash
$ git reset --hard HEAD
```

いくつかファイルいじってみたけど、結局だめでコミットする気もないし全部元に戻したい時

```bash
$ git checkout .
```

上記でファイル追加とかしちゃった時、

```bash
$ git clean -fdx
```
mongooseで〜以外の指定(not equal | !=)


node.jsでMongoDBを扱うときに利用するmongooseで，「〜以外」を検索するやり方です．

##「〜以外」を検索

```index.js
//例: nameフィールドがn0bisuke以外を検索
var query = {name: {'$ne':"n0bisuke"}};
	User.find(query,{},{sort:{point: -1}}, function(err, all_data){
		if(err){
			console.log(err);
		}
	});
```

参考:[node.js - nodejs - mongodb - how to find all where a != b? - Stack Overflow](http://stackoverflow.com/questions/6276392/nodejs-mongodb-how-to-find-all-where-a-b)

##複数の条件指定
ANDやORも使えるっぽいので使ってみました．[]で複数指定するみたいです．

```index2.js
//例: 「複数の〜以外」を条件に
var query = {'$and':[
				{name:{'$ne':"n0bisuke"}}, //nameフィールドがn0bisuke以外
				{name:{'$ne':"otukutun"}}, //nameフィールドがotukutun以外
				{email:{'$ne':"hoge@example.com"}}//emailフィールドがhoge@example.com以外
			]};
User.find(query,{},{sort:{point: -1}}, function(err, all_data){
	if(err){
		console.log(err);
	}
});
```


参考:[mongodb - Mongoose's find method with $or condition does not work properly - Stack Overflow](http://stackoverflow.com/questions/7382207/mongooses-find-method-with-or-condition-does-not-work-properly)
開発用サーバmorboを使う


# morboとは

morboは、Mojoliciousに付属している開発用Webサーバです。
シングルプロセスで動作します。
デフォルトでは、以下のディレクトリ/ファイルを監視して、変更があったら再起動します。

- lib/
- templates/
- morboコマンドの第一引数に渡したファイル(script/myapp や myapp.pl)

シングルプロセスで動いているので、
再起動している間はブラウザからアクセスができなくなります。
ファイルを変更して即座にブラウザをリロードすると、
たまにアクセスできない場合があります。
そのときは、ブラウザのリロードを何回か繰り返して下さい。


# morboの起動

以下のようなコマンドで起動します。

```shell
$ morbo script/myapp # Mojoliciousアプリの場合
$ morbo myapp.pl     # Mojolicious::Liteアプリの場合
```


# Listenするポートを変える

-lオプションで指定します。
ポート番号だけではなく、スキーマやIPなども一緒に指定する形になっています。

```shell
$ morbo -l "http://*:5555" script/myapp
```

# httpsも受け付けるようにする

-lオプションで以下のように指定して起動します。

```shell
$ morbo -l "http://*:3000" -l "https://*:3001" script/myapp
```

参考
http://d.hatena.ne.jp/perlcodesample/20110623/1310817314


# アップロードファイルサイズ制限を設定する

Mojoliciousでは、アップロードできるファイルサイズが制限されています。
以下のように、環境変数を指定して制限サイズを変更することができます。

```shell
$ MOJO_MAX_MESSAGE_SIZE=100000000 morbo script/a_m
```


# 監視するディレクトリを変更する

監視するディレクトリを変更する場合は、-wオプションを使用します。

```shell
$ morbo -w conf/ script/myapp
```

例えば、conf/development.plを変更すると、morboが再起動するようになります。

# モードを変更する

morboを起動すると、デフォルトでdevelopmentモードになります。
本番と同じモードproductionで動かしてみたい場合は、
MOJO_MODE環境変数で指定します。

```shell
$ MOJO_MODE=production morbo script/myapp
```

-----

あとは公式のドキュメントをご参照ください。
(今のバージョンでは-mオプションがあるのですね)

https://metacpan.org/pod/morbo
gitでlocalにbranchを作成し、それをremoteにpushして、remoteにbranchを作成する

```bash:
$ git branch test-1
$ git chekout test-1
Switched to branch 'test-1'
$ git branch
* test-1
  master
$ git push origin test-1
Warning: Permanently added the RSA host key for IP address '000.000.000.000' to the list of known hosts.

Total 0 (delta 0), reused 0 (delta 0)
To user@some.domain.com:project/sandbox.git
 * [new branch]      test-1 -> test-1
$
```
Gumbyのメニューバーのリンクがスマホで上手く動かなかった件


　最近よく[Gumby](http://gumbyframework.com/)というCSSフレームワークを利用しています．理由はBootstrapが普及してきてBootstrapサイトが多過ぎてて，違うライブラリを使いたいからです．
　
##Gumbyのメニューバー
Gumbyのメニューバーはレスポンシブ対応を自動でやってくれて

####PCから見たときのメニュー
![](http://gyazo.com/e750dce7efd2b1634201d71ddf0306ce.png)

####スマホから見たときのメニュー
項目がボタン１つにまとまって、
![](http://gyazo.com/2f5d11891a993ae7d8e6dbb2cef15061.png)
↓↓↓
タップ(クリック)すると
↓↓↓
![](http://gyazo.com/edf686820fb516807ca174acd958648b.png)
メニューの項目が表示されます．

##メニューバーリンクをページ外リンクにした時の挙動
Gumbyのメニューバーのリンクはスマホからのtapイベントに上手く対応できていないのか、ページ内リンクは問題無いのですが、通常のリンク項目を押すとメニューが閉じてしまいリンクが押せないという現象がありました．

##jQueryでtouchイベントを制御して改善
 私が作ったメニューの場合はメニュー全体はnav4というidを指定してあって，その中でメニューの各項目はliで定義されていました．
 touchstartのイベントを使い，liの何番tapしたのかを判断して，location.hrefでリダイレクトさせることで対応できました．

参考 [jQueryを使ってスマートフォン用のイベントを扱ってみた | SUSH-i LOG ](http://blog.sus-happy.net/201112/jquery-smart-phone/)


```my_menu_control.js
$("#nav4 li").bind("touchstart", touchHandler);
function touchHandler( event ){
	var num = $("li").index(this);
	console.log(num);
	if(num === 0){//Featuresへリンク
		location.href = "/features";
	}else if(num === 1){//Documentationへリンク
		location.href = "/documentation";
	}else if(num === 2 ){//Customizeへリンク
		location.href = "/customize";
	}else if(num === 3){//Communityへリンク
		location.href = "/community";
	}
}
```

挙動改善はしたけど、もっと効率の良いやり方があれば知りたいです汗
Cordova(PhoneGap)でのアプリ開発のはじめ方


2014年2月時点の情報です。

##node/npmのインストール

これは、Nodebrewを使う場合。
既にNode.jsとnpmが導入されている場合は、Cordovaのインストールからで可。

```
nodebrew install v0.11.11
nodebrew use v0.11.11
```

##Cordovaのインストール
```
npm -g install cordova
```

##プロジェクトの作成
アプリ名、ドメインは適当に。

```
cordova create haruka_cordova jp.co.artisanedge.cordova.haruka Haruka
cd haruka_cordova
```

##プラットフォームの追加
ここでは、iOSとAndroidを追加する場合。

```
cordova platform add ios
cordova platform add android
```

##プラグインのインストール
最近のCordovaはAPIで提供される機能はプラグインとして別途インストールなので。

```
cordova plugin add org.apache.cordova.device-motion
cordova plugin add org.apache.cordova.camera
cordova plugin add org.apache.cordova.media-capture
cordova plugin add org.apache.cordova.device-orientation
cordova plugin add org.apache.cordova.network-information
cordova plugin add org.apache.cordova.contacts
cordova plugin add org.apache.cordova.device
cordova plugin add org.apache.cordova.battery-status
cordova plugin add org.apache.cordova.file-transfer
cordova plugin add org.apache.cordova.geolocation
cordova plugin add org.apache.cordova.globalization
cordova plugin add org.apache.cordova.inappbrowser
cordova plugin add org.apache.cordova.media 
cordova plugin add org.apache.cordova.dialogs
cordova plugin add org.apache.cordova.vibration
cordova plugin add org.apache.cordova.splashscreen
```

##実行
実機で実行する場合。

```
cordova run android
cordova run ios
```

エミュレータで実行する場合。

```
cordova emulate android
cordova emulate ios
```

localhost:8000とかでWebとしてデバッグする場合。

```
cordova serve
```
読書ノート:RDBととNoSQLどちらを選びますか？

# きっかけ
なんだか題名が香ばしかったので

# 書籍情報
題　名:RDBととNoSQLどちらを選びますか？
掲　載:Software Design 2014/03号 P.17-63
出版社:技術評論社
発行日:2014年2月 発行

# 要点
* 正規化とかデータ設計とか。
* NoSQLもRDBもちゃんと適性を考えた上で使おう

# 感想
* 全体的にどっちかってーと「RDBもやるんやで？」という記事が多い内容
* 「それRDBが悪いんやなくてあんたの使い方が悪いんやで？」という記事も多かった
* 「データベース再入門-RDBとNoSQL」とかのほうが表題として適切な気がする
* 正規化の話が3回くらいされてて正直食傷気味
* でも改めて基礎(正規化とかACID性とか)を復習できたので良かった

# 読書期間
開始:2014/2/25
読了:2014/2/26
nginx + uwsgi でアプリケーションをサブディレクトリで動かす設定


## やりたいこと

複数のアプリケーションを、同一の virtualhost 内で動かす。

http://example.com/app1/hello にアクセスすると、 localhost の uwsgi で動いているアプリの /hello に飛ばすとか。

## 基礎知識

(多分CGI由来の) 3つの重要な変数を理解しましょう。

```
REQUEST_URI: /app/hello
SCRIPT_NAME: /app
PATH_INFO: /hello
```

REQUEST_URI が、ユーザーがアクセスしたホスト名以降のパスです。
SCRIPT_NAME が、アプリが動いている場所です。 CGI だったら `.cgi` とか php だったら `.php` とか拡張子があったりします。
PATH_INFO が、 SCRIPT_NAME 以降のパスです。アプリのURLディスパッチャはこの変数を見たりします。

この3つの変数がきちんと設定できていないと、URLディスパッチやリダイレクトが上手く動かない事になります。

## nginx + uwsgi

デフォルトで用意されている、 include するだけで使える uwsgi_params で、
`uwsgi_param  REQUEST_URI  $request_uri` と書かれているのは、そのまま変更する必要がありません。 `PATH_INFO` は `$document_uri` に設定されているのですが、これを適切に上書きしてやる必要があります。

SCRIPT_NAME と PATH_INFO の設定を、 nginx 側でやる方法と、 uwsgi 側でやる方法があります。


### nginx 側で設定する

このやり方は uwsgi だけじゃなくて http や fastcgi など他のリバースプロキシ方法でアプリケーションを動かすときにも応用できるのでお勧めです。

```nginx.conf
location ~ ^/app/(.*)$ {
    uwsgi_pass unix:/var/run/uwsgi/app.sock;
    include /usr/local/nginx/conf/uwsgi_params;
    uwsgi_param SCRIPT_NAME /app;
    uwsgi_param PATH_INFO /$1;
}
```

### uwsgi 側で設定する

uwsgi の mount を使ってアプリケーションの prefix を設定している場合、 `manage-script-name` オプションを使って SCRIPT_NAME と PATH_INFO を設定することもできます。

アプリ本体とヘルスチェック用の wsgi スクリプトを別に用意しているなどで、　mount を使っている場合はこちらの方法が便利です。

```nginx.conf
location ~ ^/app/(.*)$ {
    uwsgi_pass unix:/var/run/uwsgi/app.sock;
    include /usr/local/nginx/conf/uwsgi_params;
}
```

```uwsgi.ini
[uwsgi]
master = true
lazy-apps = true
socket = /var/run/uwsgi/app.sock
workers = 4
mount = /app=wsgi.py
manage-script-name = true
```
機械技術者及び非コンピュータ技術者のデータ処理手法（導入編2）

前回に引き続き導入編２を記します。
今後の内容については下記になりますので必要な部分だけを読むようにしてください。

1.導入1（前回）
2.導入2（今回）
3.CSVの読み込み、書き込みについて
4.SQLiteについて
5.matplotlibライブラリを用いた作図について

では、今回の内容になります。前回はPythonを導入しました。IDEに組み込んで大規模な開発もできますが、
それは本筋とは離れるでしょう。そこでエディタを導入します。
エディタは個人の好みがありますので、使いやすいモノを使ってください。
特になければ下記をお勧めします。

http://www.hi-ho.ne.jp/jun_miura/jmedit.htm

ここからJｍEditorをダウンロードします。
以上今回は終わりです。
Gitコマンドでのコミット範囲の指定


以下のような履歴があったとして、B から C までのコミットを抽出したい場合「ダブルドット」記法を使用する。

A - B - C - D - E

以下のように指定する

```
git log A..D
```

Aは出力結果に「含まれない」ことに注意。

参考: [Git - リビジョンの選択 - コミットの範囲指定](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%83%AA%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E9%81%B8%E6%8A%9E#%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%AE%E7%AF%84%E5%9B%B2%E6%8C%87%E5%AE%9A)
本当は怖いCGFloat


CoreGraphicsやCoreAnimationなどで頻繁にお世話になるCocoaの浮動小数点系のCGFloatですが、使い方を間違えると思わぬバグを生みます。

というのも、 **CGFloatは32bit/64bit環境によって型が違う** からなんですが。

```objectivec:CGBase.h

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif

/* Definition of the `CGFloat' type and `CGFLOAT_DEFINED'. */

typedef CGFLOAT_TYPE CGFloat;
#define CGFLOAT_DEFINED 1


```

CGFloatの定義をみると、こんな感じになっています。
64bitアーキテクチャではdouble, それ以外（32bit）ではfloatとして定義されています。

これがどういうあれかというと、浮動小数点が表せる精度が異なるというのもそうなんですが、二つ大きな問題があって、まず一つ目。

## NSNumberからCGFloatを取得できない

NSNumberにはintegerValueやunsignedIntegerValueなどの型安全なゲッタがありますが、CoreGraphics特有の型であるCGFloatを安全に取得する方法がありません。なので、NSNumberからCGFloatを取得する際はこんな感じの記述が必要になります。

```objectivec

// 以下のリンクからの参照
#if CGFLOAT_IS_DOUBLE
    CGFloat reverseValue = [aNumber doubleValue];
#else
    CGFloat reverseValue = [aNumber floatValue];
#endif

```
http://quesera2.hatenablog.jp/entry/2013/11/17/134623

とくに、CGFloatを返り値に持つメソッドなどでは注意が必要です。

##CGFLOAT_MAXとCGFLOAT_MINの値が異なる

CGFLOAT_MAXとCGFLOAT_MINは、CGFloatが定義された型によって値が異なります。
32bit環境ではFLT_MIN/FLT_MAX、64bit環境ではDBL_MIN/DBL_MAX。

なので、例えばNSNotFoundのようにCGFloatで無効な値を表したい時に

```objectivec
#define CGFloatNil CGFLOAT_MIN
```

みたいなことをやってしまうと、上記のNSNumberからのCGFloat値の取得を間違えるとこのマクロが効かなくなります。

```objectivec

// numがCGFloatNilの値を持っているとして...
CGFloat f = [num doubleValue];
if (f == CGFloatNil) {
  // ↑の比較は f == CGFLOAT_MIN ⇔ f == DBL_MIN or f == FLT_MIN
  // なので、64bit環境ならここに来るが32bit環境だと来ない
}
```

なので、CGFloatを使う場合は常にこんな感じのカテゴリを作って使ったほうが安全です。

```objectivec

@interface NSNumber (CGFloat)

- (CGFloat)your_class_prefix_CGFloatValue;

@end

@implementation NSNumber (CGFloat)

- (CGFloat)your_class_prefix_CGFloatValue
{
#if CGFLOAT_IS_DOUBLE
    return [self doubleValue];
#else
    return [self floatValue];
#endif
}

@end


```

※2014/02/26 22:43 追記

@AknEp さんから(CGFloat)[num doubleValue]を使っても大丈夫そうだというコメントを頂きましたが、下記の理由から止めたほうが良さそうです。常にdoubleValueを使えば問題なさそうですが、CGFloatというネーミング上floatValueを使いたくなるのでやっぱり危険です。

![スクリーンショット 2014-02-26 22.43.01.png](https://qiita-image-store.s3.amazonaws.com/0/3209/74de6558-d6ee-203d-7346-e2a6c1158d60.png)
Playでファイルダウンロード機能を実装する


PlayFrameworkでテキストファイルやCSVファイルなどをダウンロードできる機能を実装する。

##ルーティングの設定

```routes
GET     /:id/download       controllers.Application.download(id:String)

```

##コントローラの設定

```Application.scala
def download(id: String) = Action {
  val path = Path("temp/csv/" + id + ".csv")
  path.write("１行目")
  path.write("２行目")
  path.write("３行目")
  val file = new File("temp/csv/" + id + ".csv")
  Ok.sendFile(file)
}
```

/XXXXX/downloadのパスにアクセスするとダウンロードが開始される。
※ボタンのリンクなどに設定して使用する
scalaで正規表現を使って文字列を抽出する


①Regexで正規表現のルールを定義する
②findFirstMatchIn()メソッドで一致する文字列を抽出する

```sample.scala
var dateStr = "2013年12月31日"
var monthR : Regex = """[0-9]*月""".r;
var monthRM : Regex.Match = monthR.findFirstMatchIn(dateStr).get

//12月と出力される
println(monthRM.toString)

```
Boost.Pythonで変更可能な文字列を扱ってTypeErrorになる話


char* bufみたいなやつをboost::python::str(buf)すると

    TypeError: No to_python (by-value) converter found for C++ type: char

って怒られる。strのコンストラクタ見たらstr(char const* s)って書いてある。だから

    boost::python::str(const_cast<const char*>(buf))

が正解。なんでコンパイル時にエラーにならないのかと思ったらこんなのがあった。

    template <class T>
    explicit str(T const& other);
Pebbleと連携するiOSアプリの作り方（Xcode設定編）


Pebbleと連携したアプリを作るにはXcodeプロジェクトで適切な設定が必要です。公式サイトに書いてありますが、備忘録も兼ねてここにまとめ。

# Xcodeプロジェクトの設定

## アプリとCapabilityの設定

Pebbleと連携するためにアプリ、Capabilityの設定を行います。

* Background modesに `External accessory communication` を追加
* Project-Info.plistの `Supported external accessory protocols` に `com.getpebble.public` を追加


## 標準フレームワークの追加

`PebbleKit.framework`および`PebbleVendor.framework`（後述）がAppleのフレームワークを必要とするので、以下のフレームワークを追加します。

* CoreBluetooth.framework
* CoreMotion.framework
* MessageUI.framework
* ExternalAccessory.framework


## Pebbleフレームワークの追加

PebbleSDKの本体はframeworkとして提供されています。`~/pebble-dev/PebbleSDK-current/PebbleKit-iOS`に保存されている次のframeworkをプロジェクトに追加します。

* PebbleKit.framework
* PebbleVendor.framework

**注意: CocoaPodsに登録されているPebbleKit 2.0.0.beta7 は正常に動作しませんでした。** 

----

# あわせて読みたい

* [Pebbleアプリの作り方（MacOSX / iOS版導入編）](http://qiita.com/key/items/b23c76312901b9683a10)