OmniAICreator/Qiita-1.07M huggingface dataset:
SEO対策　HTMLコードを軽くする

SEOでHTMLの無駄なスペースや、改行を除去することは効果アリと言われている。
しかし、無駄を省くとコード修正の際に、非常に見難くなる。

http://www.digitalcoding.com/tools/compress-html.html

こちらのサービスから、無駄を省きたいHTMLコードを入れると、自動で無駄を省いてくれる。

こんな感じ
![Compress HTML Source Code.png](https://qiita-image-store.s3.amazonaws.com/0/19187/88dd7bd5-094e-053a-f792-030f080aab58.png)

試しにQiitaのトップページで試してみました。
確かに少し軽くなってます！
多重ループを一気に抜ける

pythonには多重ループを抜ける簡単な方法が用意されてない。
フラグを用意すればいいけどあんまりきれいじゃない

```py:
flag = False
for i in range(100):
    for j in range(100):
        if i > j > 70:
            flag = True
            break
        print i, j
    if flag:
        break
```
そんなforループは構造から見直せってことなのだと思うけど。どうしてもbreakで多重ループを抜けてほしいときがある。
そんな時は

+ for-else句を使う
+ try-except構文を使う
+ gotoモジュールを使う
とかがあるっぽい。

#for-else句を使う

```py:
for i in range(100):
    for j in range(100):
        if i > j > 70:
            break
        print i, j
    else:
        continue
    break
````
あんまきれいじゃない

#try-except構文を使う

```py:
try:
    for i in range(100):
        for j in range(100):
            if i > j > 70:
                raise Exception
            print i, j
except Exception:
    pass
```
本来の使い方と違うしあんま好きになれないな～

#gotoをつかう
[goto for Python](http://entrian.com/goto/download.html)

```py:
from goto import goto, label

for i in range(100):
    for j in range(100):
        if i > j > 70:
            goto .END
        print i, j
label .END
```
わかりやすいけど外部モジュールのインストールが必要

どれもいまいちだしやっぱ関数化しろってことですね。
はい。
oh-my-zshの言語問題

zshでoh-my-zshをインストールした後、言語情報（locale)が書き込まれて、空白になってしまい、US-ASCIIをデフォルトになる。そのため、UTFのドキュメントを活用する際にエラーがでる、そのため、再設定しないといけない：

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8

(というかoh-my-zshをプルリクエストしよう）
neocomplcache.vim まとめ


# neocomplcache.vim とは
入力補完機能を提供する Vim のプラグイン。

GitHub で公開されている。
[Shougo/neocomplcache.vim](https://github.com/Shougo/neocomplcache.vim)

なお、 neocomplcache は "neo-completion with cache" の略。

# 操作イメージ
文字を入力すると、自動で補完候補が表示される。
(下の絵の水色の文字が補完候補。)

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/12286/f2e30e2b-f08b-b4c0-b1d3-83f472fd3a71.png "image1.png")

文字を入力する毎に、補完候補が絞られていく。

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/12286/721df8cf-1507-44a4-ac0f-e2d458f0b2d8.png "image2.png")

そして補完候補を選択すると、 neocomplacache が残りの文字を自動で入力してくれる。

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/12286/6142164b-751c-0e6b-52fb-5a229d5b8f57.png "image3.png")


# 導入方法
NeoBundle を導入済みの場合は、まずは以下を .vimrc に記述し、 Vim を起動する。

    NeoBundle 'Shougo/neocomplcache'

そしてノーマルモードで以下のコマンドを実行すると、 neocomplcache.vim をインストールできる。

    :NeoBundleInstall

# 設定

以下は、私の .vimrc に書いてある neocomplcache.vim の設定。
neocomplcache.vim の README に書いてある設定をほぼそのまま利用した。

[Shougo/neocomplcache.vim](https://github.com/Shougo/neocomplcache.vim)

```vim:.vimrc
"" neocomplcache
NeoBundle 'Shougo/neocomplcache'
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplcache.
let g:neocomplcache_enable_at_startup = 1
" Use smartcase.
let g:neocomplcache_enable_smart_case = 1
" Set minimum syntax keyword length.
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'

" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default' : ''
    \ }

" Plugin key-mappings.
inoremap <expr><C-g>     neocomplcache#undo_completion()
inoremap <expr><C-l>     neocomplcache#complete_common_string()

" Recommended key-mappings.
" <CR>: close popup and save indent.
inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
  return neocomplcache#smart_close_popup() . "\<CR>"
endfunction
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><C-y>  neocomplcache#close_popup()
inoremap <expr><C-e>  neocomplcache#cancel_popup()
```

上記設定の場合、 insert モードで以下の操作ができる。

| キー     |  操作 |
|----------|-------|
| \<Tab\>    | 補完候補の選択。
| Ctrl + g | 前回行われた補完をキャンセル。補完した文字を消す。
| Ctrl + l | 補完候補の中から、共通する部分を補完。

各設定の意味は、以下のページで詳しく説明されている。

[Vim-users.jp - Hack #177: neocomplcacheの設定について知る　前編](http://vim-jp.org/vim-users-jp/2010/10/17/Hack-177.html)
[Vim-users.jp - Hack #185: neocomplcacheの設定について知る　中編](http://vim-jp.org/vim-users-jp/2010/11/27/Hack-185.html)
[Vim-users.jp - Hack #193: neocomplcacheの設定について知る　後編](http://vim-jp.org/vim-users-jp/2011/01/06/Hack-193.html)

# 参考

 * [Vim初心者によるVim導入記録（neocomplcache設定編） | Code Life](http://code-life.net/?p=2308)
   * 設定(.vimrc) の説明が分かりやすい
Get your gravatar in Ruby


## Get your gravatar in Ruby

```ruby
require 'Digest/md5'

def get_gravatar_by_email(email, size=420)
  gravatar_id = Digest::MD5::hexdigest(email)
  gravatar_url = "http://gravatar.com/avatar/#{gravatar_id}?s=#{size}"
end
```

My lovely gravatar (size 420 x 420):

![](http://gravatar.com/avatar/771951f55ed37335f238e1a80dfda9cd?s=420)
ChefSolo開発手順

2013.07.10版

[ChefSolo環境構築 - Qiita](http://qiita.com/amidaku@github/items/39196eaccbcdaf731747)の続き。

## カレントディレクトリを作業用のディレクトリに移動する。

```
$ cd hogehoge
```

## Vagrant設定ファイルの配置

```
$ vagrant init
```

## Vagrant設定
カレントディレクトリにある**Vagrantfile**を編集する。

```bash:Vagrantfile
config.vm.box = "base"
```

の `"base"` を、**vagrant box add**で登録したBOX名称に変更する。

VitrualBoxの設定で、作業PC（ホストOS）との通信用に**hostonly**を追加しているのなら、 `config.vm.network :private_network, ip:` のIPアドレスを適当なアドレスに書き換え、行頭の**#**を外して有効化する。

```bash:Vagrantfile
config.vm.network :private_network, ip: "192.168.56.10"
```


## 仮想マシン起動＆接続設定
Vagrantを使用して、仮想マシンを起動する。

```
$ vagrant up
```

自動ログインの設定を登録する

```
$ vagrant ssh-config --host hogehost >> ~/.ssh/config
```

*hogehostは仮想マシンに対する通称。*

何をやっているかというと、作業PCの使用中のアカウントの**.ssh/config**に立ち上げた仮想マシンへのログイン情報追加記載している。
`>>`が`>`になると書き換えてしまうので要注意。
よって**hogehost**の様な通称は、今まで使ったことも使う予定も無いもので無いといけない。
この作業で`$ ssh hogehost`で仮想マシンにログイン出来るようになる。
ただし、普通は**`$vagrant ssh`**でログインする。

## 作業準備
リポジトリ（hogerepとした場合）作成

```
$ knife solo init hogerep
$ cd hogerep
```

仮想マシン上へのcookbookの展開やChefSolo実行の準備をする。

```
$ knife solo prepare hogehost
```

## Sandbox onにする
起動と準備が完了した状態でSandbox onしておく。

```
$ vagrant sandbox on
```

## cookbook作成
hoge1appのcookbookを./site-cookbooksに作る場合

```
$ knife cookbook create hoge1app -o site-cookbooks
```

## cookbook編集
/site-cookbooks/hoge1app/内のrecipeやtemplateなど編集

## 適用cookbookを指定
./nodes/hogehost.jsonに適用するcookbookを指定

hoge1appのみ適用の場合は、

```json:hogehost.json
{"run_list":["hoge1app"]}
```

hoge1appとhoge2appとhoge3appを適用する場合は、

```json:hogehost.json
{"run_list":["hoge1app", "hoge2app", "hoge3app"]}
```

と記載。

## cookbook適用

```
$ knife solo cook hogehost
```

## 適用cookbookを修正する場合
動作が思った物では無く、cookbookを修正する場合は、vagrantで`sandbox on`のところまで戻る。

```
$ vagrant sandbox rollback
```

cookbook編集に戻って、やり直し。

## 適用cookbookが問題無く、続いて開発を進める場合
vagrant sandboxの状態を現時点まで進めるので、`sandbox commit`を実行する。
動作したままcommitすると非常に時間がかかるのでサスペンドして行う。

```
$ vagrant suspend
$ vagrant sandbox commit
$ vagrant resume
```

次のcookbook作成に進み、検証を繰り返す。
GHTestなんかでユニットテストする時にCoreDataのmanagedObjectModelが初期化できなくて困ったら

下記なんかを見ると幸せになれるかも。
http://blog.f60k.com/xcode4_coredata_logic_unittest/
http://stackoverflow.com/questions/5662947/unit-test-cant-find-core-data-model-file

```objc:
      NSBundle* bundle = [NSBundle bundleWithIdentifier:@"xxx.aaa.yyy"];
      modelURL = [bundle URLForResource:@"MyResource" withExtension:@"momd"];
      Log(@"modelURL : %@",modelURL);
```

xxx.aaa.yyyの名前はGHTest-Info.plistなんかにBundle identifierとして書かれているものを持ってくる。MyResourceのところはxcdatamodeldの名前で良いのかな？かな？そうかな？

自分の所ではResourceの名前の書き換えをやっていたらしく間違った設定が元々書いてあって結構時間を無駄にしてしまったと言う…。

今ちょっと急いでてあれこれ検証できないけど貼っとく！ごめん！
afxres.hの代替ヘッダ

Microsoft Visual Studio Professional以上で作成されたC/C++プロジェクトを、無償公開Express版でビルドしたとき下記エラーメッセージが表示される場合の対処。

```
error RC1015:cannot open include file "afxres.h"
```

**注意：**Express版にはMFC(Microsoft Foundation Class)本体は含まれないため、MFCを利用しているプロジェクトには対応できません。この対処策は「MFCを利用していないプロジェクトをExpress版でビルドする」ケースに限られます。

####対応方法１
リソースファイル(拡張子rc)をテキストエディタで開き、下記2か所を`afxres.h`から`winres.h`に書き換える。

```c:foo.rc
...
#include <winres.h>
...
2 TEXTINCLUDE 
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END
```

####対応方法２
Microsoft Visual StudioのGUI上でリソースファイルを選択し、右クリックメニューから「リソースファイルのインクルード」を選択。表示されたダイアログ中の「読み取り専用ヘッダーファイル」欄にて`#include "afxres.h"`を`#include "winres.h"`に書き換える。
Chef Solo + Knife Solo で暗号化データバッグを使う


参考: http://ed.victavision.co.uk/blog/post/4-8-2012-chef-solo-encrypted-data-bags

# 鍵を作る

Chef リポジトリのルートに data_bag_key という名前で鍵をつくる。

```bash
openssl rand -base64 512 | tr -d '\r\n' > data_bag_key
```

Git リポジトリに入れてしまうとせっかく暗号化する意味が無いので .gitignore に追加しておく。

```.gitignore
/data_bag_key
```

`knife solo cook` を使う場合、Chef Solo を実行するサーバには rsync でコピーされるので Git リポジトリに入ってなくとも問題ない。
そのかわり、この鍵は紛失しないよう注意。


# 暗号化データバッグ (Encrypted data bag) 作成

Chef Server なら下記コマンドでいいんだけど、Chef Solo ではうまくいかない。

```bash
knife data bag create --secret-file data_bag_key [data-bag-name] [entry-name]
```

下記のように Chef のライブラリを使って作成する。

```ruby
require 'chef/encrypted_data_bag_item'
require "fileutils"
 
data = {"id" => "foo", "password" => "foobar"}

secret = Chef::EncryptedDataBagItem.load_secret('data_bag_key')
encrypted_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(data, secret)
 
FileUtils.mkdir_p('data_bags/passwords')
File.open('data_bags/passwords/mysql.json', 'w') do |f|
  f.print encrypted_data.to_json
end
```

私はこれをもとに JSON または YAML からデータバッグを作成するスクリプトを作成して使っている。

このへんをうまくやってくれそうなツールもある (試してない)。
https://github.com/thbishop/knife-solo_data_bag

# 使いかた

レシピ内で `Chef::EncryptedDataBagItem.load` を使う。`data_bags(データバッグ名)` で entry name の配列が取得できるのは通常の data bag と同じ。

```ruby
Chef::EncryptedDataBagItem.load("passwords", "mysql")
```

# 追記 (2013-11-18)

いつからかは詳しく見てないけど、新しく Chef リポジトリ作って上記手順を実行したら `knife solo cook` 時に下記のようなエラーが出た。

```
Errno::ENOENT
-------------
No such file or directory - file not found '/home/chef/chef-solo/data_bag_key'
```

[最新の knife-solo の README.rdoc](https://github.com/matschaffer/knife-solo/blob/master/README.rdoc#cook-command) をみると、`.chef/knife.rb` で鍵のパスを示せとの記述が。みてみるとコメントアウトされてる。

```ruby
# .chef/knife.rb
cookbook_path ["cookbooks", "site-cookbooks"]
node_path     "nodes"
role_path     "roles"
data_bag_path "data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "cookbooks"
```

このコメントを外したら、data_bag_key がアップロードされ、問題なく動作するようになった。
AWSで別のアカウントのセキュリティグループを使う

# やりたいこと：AWSアカウント2つで開発しているときに自分とは別のアカウントのセキュリティグループを設定する！

他のアカウントのセキュリティグループとかからの許可を許すのはどうやるんだろう？
同じアカウントの同じリージョンのものはさくっと選べるのに…というところからの発見メモです。

## 書いてありました！が、分かりにくい。。
![AWS.png](https://qiita-image-store.s3.amazonaws.com/0/19712/97368524-9693-9bbe-1296-6ce7544b485e.png)

* 「1234567890」：AWSのアカウントID（IAMのところのAWS Account AliasのURLで確認できます）
* 「default」：Security Groupの名前


この書き方であっさり他のアカウントのセキュリティグループを許可できました。

----

注意点

* 2つのリージョンはあわせないとうまくいかないようです
* リージョン違うセキュリティグループはどうがんばっても指定できないみたいですね…
WEBブラウザから検索やコマンド実行をする君2

pyramidとmakoの勉強がてら改良していったら
[WEBブラウザからコマンドを実行する君作った](http://qiita.com/tukiyo@github/items/f0c3bb5f14db47b242da) から別物になってきたので別投稿にしました。

## 機能
* 結果をページ内タブに格納するようにしました。
* 各種検索に対応(qiita, alc英和/和英, python, php等)

## 使い方

main.py を実行して http://localhost:8080/ にアクセスしてください。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0919697d-e9a5-350e-8a6d-6d4ef20e350c.png)

![new.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ab8f1463-8db5-8f84-ff41-2e0286c6f739.png)

![php.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b70e910d-48d0-a182-e8e9-f995974231c1.png)

![pydoc.png](https://qiita-image-store.s3.amazonaws.com/0/25728/62198f21-abf7-fb84-ddb0-8a16ed08a3be.png)

![execute.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2af37972-662e-d127-2ebb-f5a4d119a779.png)

* フルスクリーンになる系のコマンドや、結果を逐次出力するコマンドは結果を受け取れません。(例:top,vim,watch)

[download](https://github.com/tukiyo/wshell)
MySQLでNマスタ：1スレーブレプリケーションを実施する

# MySQLでNマスタ：1スレーブレプリケーションを実施する

基本的には通常のレプリケーション設定と同じような処理

```shell-session:
mysqldump --master-data=2 --single-transaction  --no-create-info > xxx.dmp
```

--master-data=2でchange master関連をコメントとして記載します。
--no-create-infoでテーブル定義は出力しません

対象マスタで上記のようなダンプを全て作成して、

**1. create table**
**2. Nマスタインポート**
**3. Nマスタレプリケーション**

で完了。
レプリケーション時には各ダンプファイルにある各マスタのダンプファイルに記載されているbinlog、ポジションを指定して実行すること

レプリケーション設定はNマスタ全てがリアルタイムで行われるわけではないので、ローテーションして実施する必要がある。
そのためローテートに関しては以下のようなツールを利用するのも手である。
https://github.com/do-aki/SwitchMaster
カーソルをでかくする


Mac OS Xの話
System Preferences, Accessibility, Display, Cursor Size

![Large](http://gyazo.com/c5040c8181fd32817a4573809b4a4552.png)

カーソルでかくすると楽しいし、カーソルでかいと多少つらいことがあっても頑張れるので、おすすめです。

なおクリック時の当たり判定は矢印の先端のちょい内側あたり。文章選択やスプレッドシートのカーソルでの操作が滅茶苦茶やりにくくなりますが気にしたら負けです。
Firefoxアドオン「Selenium IDE 1.10.0」はFirefox22で動かないので注意

表題の通り。
Firefoxアドオン「Selenium IDE 1.10.0」はFirefox22で動かないので注意。

[error] Unexpected Exception: fileName -> chrome://selenium-ide/content/selenium-core/scripts/htmlutils.js, lineNumber -> 309, columnNumber -> 8

↑のようなエラーが出て止まる。

こちらのエントリで指摘されていた。
http://blog.anygraphica.com/post/54196481715/firefox-v-22-selenium-ide
visual studioの拡張機能作成 #基本

# VisualStudioの拡張機能を作成する基本

1.プロジェクトの作成
![vs1.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/e5188d8e-8c3b-37ef-d177-91333d189f50.jpeg)

2.VisualStudioアドインを選択
![vs2.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/75c77231-e892-2ace-61e9-d9f77c2777d2.jpeg)

3.Visual C#を使用してアドインを作成を選択
![vs3.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/d7c5a7d6-7808-aad4-0be2-c317a00233b8.jpeg)

4.Microsoft Visual Studio 2010を選択
![vs4.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/d2b4a6d1-c885-3dcd-fff8-1c582c32fea4.jpeg)

5.アドインの名前を決定して次へ
![vs5.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/b820e61a-80c3-42d0-3555-78cbf41135a1.jpeg)

6.アドイン用のコマンドバーUIを作成するを選択
![vs6.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/b9d6c34e-7563-a4f3-c66b-40fe9f4f612a.jpeg)

7.参照の追加で「System.Windows.Form」を行い
　Execに「System.Windows.Form.MessageBox.Show」の行を追加する
![vs7.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/7c3ad932-8784-6a6a-3ce0-64010a8d958b.jpeg)

8.デバッグを開始して「ツール」-「MyAddin1」を選択
![vs8.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/940184cd-fa5f-b2d4-df3d-e4fd6df8f522.jpeg)

9.メッセージが表示される事を確認
![vs10.jpg](https://qiita-image-store.s3.amazonaws.com/0/26588/fb14b42f-f151-d77a-51c5-1ac933a2a6e4.jpeg)
デバック用データ定義とセレクトボックスを使った使用方法

備忘録。
データ定義は別のJSファイルにしておくと管理が楽ですな。

```html:
<select  id="target"></select>
```
```js:

/*
コンテナ用変数「my」の定義及びデバッグ用データ定義
(*)my.debug == 1の時にdebugデータを使用する
*/
var my = {
	"debug" : 1,			// 0:API使用 1:debugデータ使用
};

$(function(){
        my.setList( my.data.TESTDATA ,"target");
});

/* リスト設定
 * json : 渡されるデータ json形式
 *		{ "コード" : "表示データ" } の形式で渡される
 * id : 設定するリストの要素id
 */
my.setList = function( json,id ){
	$.each( json, function( i, v ){
		$( "#"+id ).append( '<option value="' + i + '">' + v + '</option>' );
	});

// debug用データ定義 my.debugが1の時有効にする
// 全て コード:データの組み合わせ
if( my.debug == 1 ){
	my.data = {
		"TESTDATA" : {
		"":"選択してください",
		"0001":"hoge",
		"0002":"moge",
		}
	};
}
```
ChefSolo環境構築

2013.07.10版

KnifeSoloを使用したChefクックブックの作成とVagrantを使用した開発環境の構築手順。
勉強会でまとめたので備忘録として。


## Rubyインストール
（割愛）
CentOSやMacOSX標準の1.8.7でも動作するが、サポート終了してるので、1.9.3か2.0.0を入れられるのがお勧め。

## ChefSoloインストール
これが無いと始まらない。
gemを使用してインストール

```
$ gem install chef
```

## KnifeSoloインストール
どうせknifesolo使用するので入れておく
gemを使用してインストール

```
$ gem install knife-solo
```

## VirtualBoxインストール
2013.07.10現在最新の4.2.16では、Vagrantは問題無く動いたが、4.2.14では動かなかった。ちなみに4.2.12は問題無く動作した。
各OS向けのパッケージをダウンロードしインストール。
[Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Downloads)

## Vagrantインストール
各OS向けのパッケージをダウンロードしインストール。
[Vagrant - Downloads](http://downloads.vagrantup.com/tags/v1.2.2)

## Saharaインストール
開発中に仮想マシンのsandbox（スナップショット機能）を使いたいのでSaharaを入れる。
Vagrantのコマンドでインストール。

```
$ vagrant plugin install sahara
```

## VirtualBox仮想マシンイメージの登録
[A list of base boxes for Vagrant - Vagrantbox.es](http://www.vagrantbox.es/)のboxファイルのurlを指定するか、boxファイルをダウンロードして、今後box名として指定する名称で登録する。
なお、box名は今まで使用した物以外の名称とする。

ダウンロードする場合

```
$ vagrant box add <使用するBOX名称> <boxファイルのフルパス>
```

url指定する場合

```
$ vagrant box add <使用するBOX名称> <boxファイルのurl>
```


開発に関するコマンド類のまとめは、別に書く予定。
ENOENT とか ENOMEM とか errno.h のどこにあるねんってなったのでメモ

#include <errno.h>
するのはいいんだけど
/usr/include/errno.h に見つからない。
じゃあどこにあるねん！ってなったのでメモ

/usr/include/ の中を漁っていると・・・
errno.h
bits/error.h
linux/errno.h
asm/errno.h
asm-generic/errno.h
asm-generic/errno-base.h ← ここにあります。



```
$ vi -R /usr/include/asm-generic/errno-base.h
#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H

#define EPERM            1      /* Operation not permitted */
#define ENOENT           2      /* No such file or directory */
#define ESRCH            3      /* No such process */
#define EINTR            4      /* Interrupted system call */
#define EIO              5      /* I/O error */
#define ENXIO            6      /* No such device or address */
#define E2BIG            7      /* Argument list too long */
#define ENOEXEC          8      /* Exec format error */
#define EBADF            9      /* Bad file number */
#define ECHILD          10      /* No child processes */
#define EAGAIN          11      /* Try again */
#define ENOMEM          12      /* Out of memory */
```

あったあった・・・
malloc(0) すると NULL が返ってくるものだと思い込んでいた

malloc(0) すると NULL が返ってくるものだと思い込んでいた

実行環境（だいぶ古い）
Fedora14 32bit
x86
kernel2.6.35 
libc　2.13

```c:malloc_zero.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int iRet = 0;
	char *pStr = NULL;
	
	// ===== main START =====
	pStr = malloc(0);
	printf("pStr is 0x%x \n", pStr); // DEBUG

	if ( NULL != pStr )
	{
		printf("pStr is not NULL.\n"); // DEBUG
		free(pStr);
		pStr = NULL;
		iRet = 0;
	}
	else
	{
		// pStr is NULL.
		printf("pStr is NULL.\n"); // DEBUG
		iRet = 1;
	}
	// ===== main -END- =====
	
	return iRet;
}
```

```
# Build
$ gcc -o e_malloc_zero malloc_zero.c
$ e_malloc_zero
pStr is 0x8c27008
pStr is not NULL.
```

■manpage
NULL が返ってこないこともあるよーって man にも書いてあるじゃん・・・
malloc() に渡すバイト数はちゃんとチェックしましょう

JP
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/malloc.3.html
size が 0 の場合には、NULL もしくは free() に渡すことができるポインタが返る。

English
http://man7.org/linux/man-pages/man3/malloc.3.html

■malloc(-1) してやると NULL が返ってきた
そりゃそうだ。malloc() の引数は size_t です。
size_t ≒ unsigned int なので
malloc(-1) は malloc(4294967295U) ってことだね。
そりゃ失敗するわ・・・。

```
man malloc より

void *malloc(size_t size);
```

2014/06/27 malloc(-1) したときについての内容を修正
firefoxのハックにおける注意点

firefoxでハックした場合、IE7はfirefoxのハックの値に引っ張られるので注意

例えば

```
#aaa { border:1px solid black; width:200px; padding:20px; margin:40px;}
#aaa, x:-moz-any-link { width:400px; }
```

と書くと

firefoxとIE7
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/26604/051b0992-3474-ad62-19e1-567d0d9fbcd6.png)


その他のブラウザ
![ScreenClip2.png](https://qiita-image-store.s3.amazonaws.com/0/26604/5efab0c0-5520-f965-9aa0-7e6dc2bdd1b6.png)


こうなる。
IE7には、firefoxの値(400px)が適用されているのが分かる。


回避するためにはfirefoxのハック内に*で更にIEハックを入れることで解決。
ちなみにIE7のみで、IE6は大丈夫だった。


```
#aaa { border:1px solid black; width:200px; padding:20px; margin:40px;}
#aaa, x:-moz-any-link { width:400px; *width:200px;}
```
OSXの便利なショートカット集


### ファイルを保存せずに閉じる
下のようなポップアップが出たとき、保存はもちろん`Enter`で良いですが、保存せずに閉じる時。

```
command + D
```
![close_without_save.png](https://qiita-image-store.s3.amazonaws.com/0/19398/cf672367-5b04-5df1-73f7-3375cd816e77.png "close_without_save.png")

### 複数アイテムをまとめてフォルダ作成

ファインダーでフォルダ化したいファイル群を選択して

```
command + control + N

```
![folders.png](https://qiita-image-store.s3.amazonaws.com/0/19398/36e74d1d-3086-d5b8-a05d-9fd2b1524a39.png "folders.png")



### 続く…
CSSの色選びに困ったら参考にするサイト

<h1>
  <a href="http://colourco.de/">
    colourcode
  </a>
</h1>

<a href="http://colourco.de/">
![スクリーンショット 2013-07-10 7.01.55.png](https://qiita-image-store.s3.amazonaws.com/0/26003/6d99ce9b-e383-b7cf-64f9-f2a7442045ca.png)
</a>

<h1>
  <a href="http://colorschemedesigner.com/">
     #Color Scheme Designer
  </a>
</h1>

<a href="http://colorschemedesigner.com/">
![スクリーンショット 2013-07-10 7.02.16.png](https://qiita-image-store.s3.amazonaws.com/0/26003/4b559dc6-7e54-a397-6923-b8611b95905c.png)
</a>

<h1>
  <a href="http://www.147colors.com/">
    147 Colors
  </a>
</h1>

<a href="http://www.147colors.com/">
![スクリーンショット 2013-07-10 7.12.03.png](https://qiita-image-store.s3.amazonaws.com/0/26003/21431154-84d0-bfa9-c1d5-ef51785dfc7c.png)
</a>

<h1>
  <a href="http://www.colordic.org/">
    WEB色見本 原色大辞典
  </a>
</h1>

<a href="http://www.colordic.org/">
![スクリーンショット 2013-07-10 7.01.58.png](https://qiita-image-store.s3.amazonaws.com/0/26003/d0124815-bc1f-3786-ff0a-5e841808f8f5.png)
</a>
parted

```py:create_parted_partitions.py
#!/usr/bin/python

_TARGET_DISK       = '/dev/sdb'
_PARTITION_NUM     = 4

#--- parted _TARGET_DISK -s 'unit s print'

_DISK_SECTOR       = 17511219456
_OFFSET_START      = 2048
_OFFSET_END        = 34
_AVAILABLE_SECTOR  = _DISK_SECTOR - _OFFSET_START - _OFFSET_END
_PARTITION_SECTOR  = _AVAILABLE_SECTOR / _PARTITION_NUM / 2048 * 2048
_PARTED_COMMAND    = "parted %s -s 'unit s mkpart primary ext4 %12ds %12ds'"

for i in xrange(_PARTITION_NUM):
    if i == 0 : sector_start = _OFFSET_START
    else      : sector_start = sector_end + 1
    sector_end = sector_start + _PARTITION_SECTOR - 1
    print _PARTED_COMMAND % (_TARGET_DISK, sector_start, sector_end)
```
GCMBaseIntentServiceを継承したクラスではgetSenderIds()を実装した方がよさげ(もう古いです)


>【注意1】ここで紹介しているのは[GCM Helper Libraries](https://developer.android.com/intl/ja/google/gcm/helper.html)という旧式のライブラリを使用した場合のものです。現在はGCMを使う場合は[Google Play Services SDKを使うやり方](https://developer.android.com/intl/ja/google/gcm/client.html)が一般的ですので新規に実装されるかたはそちらを使ったほうがいいと思います。

> 【注意2】GCM Helper LibraryはC2DM終了に伴い使えなくなる疑いがあります。
> [アナウンス](https://plus.google.com/+AndroidDevelopers/posts/9ui5Ywfgqeh)
> コメントでは中の人がGCM Helper LibraryはGCMを使っているよ(=C2DMではない)とありますがアナウンスと矛盾しているので早めの移行をオススメします。


Push登録をGCMBaseIntentService内部でリトライする際に以下のような例外を吐く事がある. 

```java
E/AndroidRuntime(4227): FATAL EXCEPTION: IntentService[GCMIntentService-DynamicSenderIds-2]
E/AndroidRuntime(4227): java.lang.IllegalStateException: sender id not set on constructor
E/AndroidRuntime(4227): 	at com.google.android.gcm.GCMBaseIntentService.getSenderIds(GCMBaseIntentService.java:125)
E/AndroidRuntime(4227): 	at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:237)
E/AndroidRuntime(4227): 	at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
E/AndroidRuntime(4227): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(4227): 	at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(4227): 	at android.os.HandlerThread.run(HandlerThread.java:60)
```

Googleのチュートリアルを参考に作っていたのでちゃんとjavadocを見てなかったんだけどコンストラクタの説明にちゃんと記述されていました。

```
    /**
     * Constructor that does not set a sender id, useful when the sender id
     * is context-specific.
     * <p>
     * When using this constructor, the subclass <strong>must</strong>
     * override {@link #getSenderIds(Context)}, otherwise methods such as
     * {@link #onHandleIntent(Intent)} will throw an
     * {@link IllegalStateException} on runtime.
     */
    protected GCMBaseIntentService() {
        this(getName("DynamicSenderIds"), null);
    }
```

引数無しのコンストラクタを使う場合はgetSenderIdsをoverrideしないとIllegalStateExceptionが飛ぶって事ですね。

という訳でContextが引数で渡されているのでSharedPreferencesでsenderIdを受け渡しする形に修正

```java:MainActivity.java
public class MainActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		SharedPreferences prefs = getSharedPreferences("push", Context.MODE_PRIVATE);
		prefs.edit().putString("senderId", "ここにSender ID").commit();
	}
}
```

```java:PushIntentService.java
public class PushIntentService extends GCMBaseIntentService {
	@Override
	protected String[] getSenderIds(Context context) {
		SharedPreferences prefs = context.getSharedPreferences("push", Context.MODE_PRIVATE);
		String senderId = prefs.getString("senderId", null);
		if (senderId == null) {
			throw new IllegalStateException("senderId is not set in the SharedPreferences");
		}
		return new String[]{ senderId };
	}
}
```
Pythonでコマンドライン引数にサブコマンドを指定する

## はじめに

自分はよくPythonでコマンドラインで動くスクリプトを作るんですが、よく `git` のようなサブコマンドを作りたいときがあります。

gitの場合

    $ git commit -m "test"

この `commit` がサブコマンド。

このサブコマンドを作ります。

## 実装

Pythonでコマンド引数をパースしたいときは **argparse** モジュールを使用します。

>15.4. argparse
>— コマンドラインオプション、引数、サブコマンドのパーサー —
>http://docs.python.jp/2.7/library/argparse.html?highlight=argparse#argparse

通常時は、argparseモジュールから **ArgumentParser** クラスをimportします。
そしてパーサーを定義し、オプションを追加してく。

通常時 :

```python:normal.py
from argparse import argumentParser

parser = ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)
```

サブコマンドを作成するためには、パーサーをネストすることが必要です。
 **パーサーの中にまたパーサーを設けることでサブコマンドを設定できるんですね。**

```py:subcmd.py
>>> from argparse import ArgumentParser
>>>
>>> # create the top-level parser
>>> parser = ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='sub-command help')
>>>
>>> # create the parser for the "a" command
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>>
>>> # create the parser for the "b" command
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')
>>>
>>> # parse some arg lists
>>> parser.parse_args(['a', '12'])
Namespace(bar=12, foo=False)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(baz='Z', foo=True)
```

``parser.add_subparsers``メソッドでサブパーサーのラッパーを作り、

    subparsers = parser.add_subparsers(help='sub-command help')

ラッパーからサブパーサーを作る。

    parser_a = subparsers.add_parser('a', help='a help')

サブパーサーに引数を与えていく。

    parser_a.add_argument('bar', type=int, help='bar help')

ちなみに、上記のサンプルの場合、ヘルプメッセージはこのようになる。

```
usage: PROG [-h] [--foo] {a,b} ...

positional arguments:
{a,b}       sub-command help
a         a help
b         b help

optional arguments:
-h, --help  show this help message and exit
--foo       foo help
```

これで、サブコマンドの作成が可能だ。
Macbook air 2013に入れたもの


*Xcode*
　とりあえず開発環境
　いつかiPhoneアプリが作れるように

*Xcode command line tools*
　Macport入れるのに必要だったので

*Macport*
　あると便利？

*wget*
　たまに使うことになるから、入れておく

*Java*
　Android開発には必要

*Chrome*
　メインのブラウザ
　ブックマークも勝手に入ってくれた

*夜フクロウ*
　Twitterクライアント

*Kobit*
　メモ用に

*Keynote*
　憧れて買ったから、使うことはあるのだろうか・・・

*Evernote*
　メモ用

*Dropbox*
　なんか写真の保存場所になってる

*Sourcetree*
　Gitクライアント

*Google日本語入力*
　日本語入力

*Magican*
　そのうち出番があるはず

*Gimp*
　お絵描きソフト

*Android SDK*
　Androidアプリ開発に

- - -
*PHP*
 インストールじゃないけど
 PHPを有効にしました

*MySQL*
 DB

*Sequel Pro*
 MySQLクライアント　初めて使うけど使いやすそう

- - -
*VMware Fusion*
  仮想化ソフト
- - -
*eclipse*
統合開発環境
- - -
他にも入れたいものがあるけど
必要になったら入れることにする

Date:2013/07/09
UpDate:2013/07/17
FuelPHPことはじめ

## やること
* FuelPHPが最低限利用できる環境を整える
* Scaffoldを利用して、ごくかんたんなCRUDアプリを作成する

## 環境
* CentOS 6.4
* Apache/2.2.15
* PHP 5.5.5
* FuelPHP 1.6

## 前提条件
* Apache, MySQL, PHPが導入済みであること
* 公開ディレクトリ、その他のセキュリティ設定は考慮しない

## 手順

### Composerのアップデート

```
$ php composer.phar update
```

### oilコマンドを使えるようにする

```
$ curl get.fuelphp.com/oil | sh
```

### Appテンプレートのインストール

```
$ oil create appName
```

### 確認

下記にアクセスする。
http://hostName/appName/public/index.php/welcome/index

※mod_rewriteが利用できる環境であれば、下記でアクセス可能。
※oil createで作成した場合、rewrite設定された.htaccessが既に作成されている。
http://hostName/appName/public/welcome/index

## さらに、DBを利用してみる

### データベース接続設定


```php:appName/fuel/app/config/development/db.php
'dsn'        => 'mysql:host=localhost;dbname=fuel_dev',
'username'   => 'root',
'password'   => 'password',
```

### Scaffoldを利用できるように設定

※コメントをはずして、ORMを有効化する。

```php:appName/fuel/app/config/config.php
'always_load'  => array(
  'packages'  => array(
  'orm',
  ),
),
```

### データベースを作成
```
$ mysql -uroot -ppassword -e "create database fuel_dev character set utf8mb4"
```

### Scaffoldの実行
※アプリケーションのルートで実行する。

```
$ oil generate scaffold post title:string summary:varchar[64] body:text
        Creating migration: /var/www/html/appName/fuel/app/migrations/001_create_posts.php
        Creating model: /var/www/html/appName/fuel/app/classes/model/post.php
        Creating controller: /var/www/html/appName/fuel/app/classes/controller/post.php
        Creating view: /var/www/html/appName/fuel/app/views/post/index.php
        Creating view: /var/www/html/appName/fuel/app/views/post/view.php
        Creating view: /var/www/html/appName/fuel/app/views/post/create.php
        Creating view: /var/www/html/appName/fuel/app/views/post/edit.php
        Creating view: /var/www/html/appName/fuel/app/views/post/_form.php
        Creating view: /var/www/html/appName/fuel/app/views/template.php
```

### Migrationの実行
※アプリケーションのルートで実行する。

```
$ oil refine migrate
Performed migrations for app:default:
001_create_posts
```

### 確認

下記にアクセスすると、CRUDアプリケーションが利用できる。
http://hostName/appName/public/post/

### 参考

自動生成されたテーブル

```
mysql> desc posts;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)     | NO   |     | NULL    |                |
| summary    | varchar(64)      | NO   |     | NULL    |                |
| body       | text             | NO   |     | NULL    |                |
| created_at | int(11)          | YES  |     | NULL    |                |
| updated_at | int(11)          | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
```

※created_at, updated_atにはUNIX Timestampが記録される。

> [FuelPHP » A simple, flexible, community driven PHP5.3 framework.]("http://fuelphp.com/")
RokCommonのXMLバリデーションでPHP Fatalエラーが起きた場合


いつからこうなったかわからないけど、たぶんOSのセキュリティアップをしてから？
joomlaサイトが全く動かなくなった。

エラーログを見ると、rokcommonのXml.phpでエラーが発生している。

```PHP
 //$this->validate($dom);
```

と、validationしている箇所をコメント合うとすると動くようになった。
Heroku に Todo アプリをデプロイ



#### 概要
--------------------------------------
ざっと以下の方針でやってみることに。

- タスクの 登録 ／ 更新 ／ 削除 を可能にする
- タスクは Todo / Doing / Done の３つのステータスを保持する
- フロントエンドは jQuery で実装
- サーバサイドは Rails 3.2.13，Ruby 1.9 で実装
- データストアに Redis を指定


#### 実現したいこと
--------------------------------------
- フォームから「タイトル」と「詳細」を入力されたタスクは Todo へ登録される
- タスクはドラッグ＆ドロップで Todo / Doing / Done のエリアに移動することができる
- タイトルと詳細を編集することができる


#### 開発状況
--------------------------------------
- Todo への登録が可能
- タイトルと詳細の編集が可能
- いまのところデータストアはローカル環境では sqlite3，Heroku 環境が PostgreSQL


#### 今後の課題
--------------------------------------
- ドラッグ＆ドロップしたエリアを保持する
- タスクの登録・更新時にワンタイム認証をかける
- データストアに Redis を使う


#### GitHubのリポジトリ
--------------------------------------
[taskboard-jquery-rails](https://github.com/molteniac/taskboard-jquery-rails)
サブドメイン有り無しドメインにマッチするパターン

## はじめに
`hoge.com`, `www.hoge.com`, `api.hoge.com`, `stg.api.hoge.com`全てにマッチするパターンを書いてみた。

## 作成したパターン

```js:
// パターン
var regexp = new RegExp("^(.+[^.]\.)?hoge\.com$");

// 正常系
console.log("hoge.com".match(regexp) ? "OK" : "NG");
console.log("www.hoge.com".match(regexp) ? "OK" : "NG");
console.log("api.hoge.com".match(regexp) ? "OK" : "NG");
console.log("stg.api.hoge.com".match(regexp) ? "OK" : "NG");

// 異常系
console.log(!" hoge.com".match(regexp) ? "OK" : "NG");
console.log(!".hoge.com".match(regexp) ? "OK" : "NG");
console.log(!"hoge1.com".match(regexp) ? "OK" : "NG");
console.log(!"hoge.jp".match(regexp) ? "OK" : "NG");
console.log(!"hoge.com/".match(regexp) ? "OK" : "NG");
console.log(!"hogecom".match(regexp) ? "OK" : "NG");
console.log(!"..hoge.com".match(regexp) ? "OK" : "NG");
```
JavaScriptで0詰め実装。

メモ。

```js:
//起動した日付を取得
var today = function(){
	var td = new Date();
	var yy = td.getFullYear();
	var mm = toDoubleDigits(td.getMonth() + 1);
	var dd = toDoubleDigits(td.getDate());
	return yy + '-' + mm + '-' + dd;
};
var toDoubleDigits = function(num) {
	num += "";
	if (num.length === 1) {
		num = "0" + num;
	}
	return num;
};
```
Google Feed APIをjQueryのDeferredで使えるようにする

# Google Feed APIとは

>  他のサイトが配信しているATOMやRSSフィードをJavaScriptを使って取得しようとした場合、同一生成元ポリシー(Same-Origin Policy)の制限によって直接他のサーバにあるデータへアクセスできずサーバ側でいったんフィードを受信するなどの処理が必要でした。

> Google AJAX Feed APIを使用すると、Googleがフィードのキャッシュとしての役割を果たしてくれるため、サーバ側のプログラムを必要とせず、クライアント側のスクリプトだけで各種フィードを取得することが出来ます。

[参考](http://www.ajaxtower.jp/googleajaxfeed/ "参考")

ようするに、クライアントサイドだけで外部サイトにあるRSSとかを取得できる代物。

# Googleライブラリを読み込み

```html:
<!-- googleが提供するライブラリを読み込み -->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
```

# 単体での使い方

Google Feed APIを単体で使用しようとすると、下記の様になる。

```js:
// feed ライブラリを読み込み
google.load("feeds", "1");
google.setOnLoadCallback(function () {
    var feed = new google.feeds.Feed(url);
    feed.load(function(results) {
        // feed読み込み後の処理
    });
});
```

# 複数のfeedを読み込んで処理をしたい時

複数のRSSフィードを非同期的に読み込んで、処理をしたい時は上記のやり方ではできないので、jQueryのDefferdに頼る。

```js:
// jQueryのDefferdオブジェクトを返すメソッドの定義
function feed_load(url) {
    var feed = new google.feeds.Feed(url),
        dfd  = $.Deferred();

    feed.load(function(results) {
        return results.error ? dfd.reject(results) : dfd.resolve(results);
    });

    return dfd.promise();
}

google.load("feeds", "1");
google.setOnLoadCallback(function () {
    $.when(feed_load(url1), feed_load(url2), feed_load(url3)).done(function() {
        // 複数のURLを読み込んだ後の処理 
    });
});
```
過去を改ざんして過去のコミットをなかったことにする方法


うっかりセンシティブな情報をリポジトリに入れてしまって、あとで気づいて過去もろとも消したい場合にどうしたらいいか手順を解説します。


## 1. tigとかgit logで消したいコミットを探してリストアップする

```
$ git log --pretty=oneline --abbrev-commit

7217311 やばい <-- 消したい奴
15456c2 だいじょぶ
169d5d2 だいじょぶ
4a398a0  だいじょぶ
```

### 2. git rebaseで消したいコミットまで遡る

```
$ git rebase -i 7217311~1
```

```
pick 7217311 やばい <ーーこの行を消す
pick fe0a9fc XXXXXXXX
pick 9e1ca25 XXXXXXXX
pick ed6e651 XXXXXXXX
pick 2d53f34 XXXXXXXX
pick 4a398a0 XXXXXXXX

# Rebase f40d7bd..cb26656 onto f40d7bd
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

保存する

## 3. git rebase --skip でコミットを飛ばす OR 消したいファイルを削除して git add && git rebase --continue

### 1) コミットに含まれる一部のファイルだけなかったコトにしたい

```
rm -f 消したいファイル
git add -A
git rebase --continue

```

### 2) コミットに含まれるファイルすべてをなかったコトにしたい

```
git rebase --skip
```

あとは、ずっと git rebase --contitnue をやっていくだけ。


## 番外: やっぱ過去改ざんやめよう(ロールバック)

```
git rebase --abort
```
第12回オフラインリアルタイムどう書くの問題をF#で (2)

[問題はこちら。](http://qiita.com/Nabetani/items/f3cca410428f90333e28)

サイコロ6面 [z;y;-z;-y;x;-x] をまるっと回転させる方が簡単だった。
数学っぽくするなら6面の表現は [x;y;z;-x;-y;-z] とか [x;-x;y;-y;z;-z] の順序のほうがきれいかな？

```fsharp:doukaku12-2.fs
let roll xs d =
  match (d,xs) with
  | ('N', [a;b;c;d;e;f]) -> [d;a;b;c;e;f]
  | ('S', [a;b;c;d;e;f]) -> [b;c;d;a;e;f]
  | ('E', [a;b;c;d;e;f]) -> [f;b;e;d;a;c]
  | ('W', [a;b;c;d;e;f]) -> [e;b;f;d;c;a]
  | _                    -> failwith "Invalid Input"

let solve (s:string) =
  s.ToCharArray()
  |> Array.scan roll ['1';'2';'6';'5';'4';'3']
  |> Array.map List.head
  |> fun x -> new string(x)

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "NNESWWS" "15635624"
  test "EEEE" "13641"
  test "WWWW" "14631"
  test "SSSS" "12651"
  test "NNNN" "15621"
  test "EENN" "13651"
  test "WWNN" "14651"
  test "SSNN" "12621"
  test "NENNN" "153641"
  test "NWNNN" "154631"
  test "SWWWSNEEEN" "12453635421"
  test "SENWSWSNSWE" "123123656545"
  test "SSSWNNNE" "126546315"
  test "SWNWSSSWWE" "12415423646"
  test "ENNWWS" "1354135"
  test "ESWNNW" "1321365"
  test "NWSSE" "154135"
  test "SWNWEWSEEN" "12415154135"
  test "EWNWEEEEWN" "13154532426"
  test "WNEWEWWWSNW" "145151562421"
  test "NNEE" "15631"
  test "EEEEWNWSW" "1364145642"
  test "SENNWWES" "123142321"
  test "SWWWSNSNESWW" "1245363635631"
  test "WESSENSE" "141263231"
  test "SWNSSESESSS" "124146231562"
  test "ENS" "1353"
  test "WNN" "1453"
  test "SSEENEEEN" "1263124536"
  test "NWSNNNW" "15414632"
  test "ESSSSSWW" "132453215"
  test "ESE" "1326"
  test "SNWNWWNSSSS" "121456232453"
  test "SWEESEN" "12423653"
  test "NEEWNSSWWW" "15323631562"
  test "WSEW" "14212"
  test "SWSNNNSNWE" "12464131353"
  test "ENWEWSEEW" "1351513545"
  test "WSEWN" "142124"
  test "EWNEESEWE" "1315321414"
  test "NESEEN" "1531263"
  test "WSW" "1426"
  test "ENEWE" "135656"
  0
```
第12回オフラインリアルタイムどう書くの問題をF#で (1)

[問題はこちら。](http://qiita.com/Nabetani/items/f3cca410428f90333e28)

'1' と '2' の向きをベクトルで表した。無駄に複雑かも。1時間ぐらい？

```fsharp:doukaku12.fs
type Vector = X | InvX | Y | InvY | Z | InvZ

let roll = function
  | 'N' -> function X->X | InvX->InvX | Y->InvZ | InvY->Z | Z->Y | InvZ->InvY
  | 'S' -> function X->X | InvX->InvX | Y->Z | InvY->InvZ | Z->InvY | InvZ->Y
  | 'E' -> function X->InvZ | InvX->Z | Y->Y | InvY->InvY | Z->X | InvZ->InvX
  | 'W' -> function X->Z | InvX->InvZ | Y->Y | InvY->InvY | Z->InvX | InvZ->X
  | _   -> failwith "Invalid Input"

let roll2 (p1,p2) d = (roll d p1,roll d p2)

let inline xor a b = (a && not b) || (not a && b)

let top = function
  | (   Z,   _) -> '1'
  | (InvZ,   _) -> '6'
  | (_   ,   Z) -> '2'
  | (_   ,InvZ) -> '5'
  | (   x,   y) -> let p = (x=X || x=Y)
                   let q = (y=Y || y=InvX)
                   if (xor p q) then '4' else '3'

let solve (s:string) =
  s.ToCharArray()
  |> Array.scan roll2 (Z,Y)
  |> Array.map top
  |> fun x -> new string(x)

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "NNESWWS" "15635624"
  test "EEEE" "13641"
  test "WWWW" "14631"
  test "SSSS" "12651"
  test "NNNN" "15621"
  test "EENN" "13651"
  test "WWNN" "14651"
  test "SSNN" "12621"
  test "NENNN" "153641"
  test "NWNNN" "154631"
  test "SWWWSNEEEN" "12453635421"
  test "SENWSWSNSWE" "123123656545"
  test "SSSWNNNE" "126546315"
  test "SWNWSSSWWE" "12415423646"
  test "ENNWWS" "1354135"
  test "ESWNNW" "1321365"
  test "NWSSE" "154135"
  test "SWNWEWSEEN" "12415154135"
  test "EWNWEEEEWN" "13154532426"
  test "WNEWEWWWSNW" "145151562421"
  test "NNEE" "15631"
  test "EEEEWNWSW" "1364145642"
  test "SENNWWES" "123142321"
  test "SWWWSNSNESWW" "1245363635631"
  test "WESSENSE" "141263231"
  test "SWNSSESESSS" "124146231562"
  test "ENS" "1353"
  test "WNN" "1453"
  test "SSEENEEEN" "1263124536"
  test "NWSNNNW" "15414632"
  test "ESSSSSWW" "132453215"
  test "ESE" "1326"
  test "SNWNWWNSSSS" "121456232453"
  test "SWEESEN" "12423653"
  test "NEEWNSSWWW" "15323631562"
  test "WSEW" "14212"
  test "SWSNNNSNWE" "12464131353"
  test "ENWEWSEEW" "1351513545"
  test "WSEWN" "142124"
  test "EWNEESEWE" "1315321414"
  test "NESEEN" "1531263"
  test "WSW" "1426"
  test "ENEWE" "135656"
  0
```
arの表紙の長澤まさみが本当に可愛い


大体の言語でdatetimeの型変換面倒くさい

```r:R
> s <- "2013-07-07 10:00:00 UTC"
> class(s)
# => [1] "character"
> as.Date(s)
# => [1] "2013-07-07"
> as.POSIXct(s)
# => [1] "2013-07-07 10:00:00 JST"
> as.POSIXlt(s)
# => [1] "2013-07-07 10:00:00"
```

timezoneの情報消えとるやんけ

```r:R
> as.POSIXct(s, format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
# => [1] "2013-07-07 10:00:00 UTC"
```

factorでもいける

```r:R
> df <- read.delim("data")
> head(df$date, 1)
# => [1] 2009-06-20 02:41:45 UTC
> class(df$date, 1)
# => [1] "factor"
> as.POSIXct(df$date, tz = "UTC")
# 以下にエラー as.POSIXlt.character(as.character(x), ...) : 
# 文字列は標準的な曖昧さのない書式にはなっていません
# などと怒られるので渡すformatを指定して教えてあげる
> df$date <- as.POSIXct(df$date, format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
> df$date
# => [1] "2009-06-20 02:41:45 UTC" "2009-08-04 07:35:48 UTC"
# ...
> class(df$date)
# => [1] "POSIXct" "POSIXt" 
```

だいたい型変換するとNAになるやつあるから殺す

```r:R
df <- df[!is.na(df$date),]
```

これで時系列データの可視化も超簡単
しかし今回は月別に集計したいので文字列に戻す

*datetimeにした意味とはなんだったのかとか言わないこと*

```r:R
> df$month <- strftime(df$date, format = "%Y/%m")
> ggplot2(df, aes(df$month, df$score)) + geom_boxplot() + stat_summary(fun.y = mean, geom = "line", aes(group = 1))
```

欲しかったボックスプロットに移動平均はこれでできた
POSIXctを丸め込むのに{lubridate}のfloor_date関数を使ってもよさそう
[reference](http://www.inside-r.org/packages/cran/lubridate/docs/floor_date)

ちなみにggplot 0.9.3だとエラーが出てgroupが効かない
0.9.3.1にしたらちゃんと移動平均描けた

```r:R
> ggplot2(df, aes(df$month, df$score)) + geom_boxplot() + stat_summary(fun.y = mean, geom = "line", aes(group = 1))
# geom_path: Each group consist of only one observation. Do you need to　adjust the group aesthetic?
```

でもこれだとX軸がmonthに依存するから折角datetimeなのにもったいなくない？
でもそのままぶち込むとX軸が連続値だし怒られるので公式documentにあるgroupとround_anyを使って丸め込む

```r:R
> library(plyr)
> ggplot(df, aes(df$date, df$normalized_phred_score)) + geom_boxplot(aes(group = round_any(df$date, 60*60*24*30*6, floor)))
```

これで描ける

四半期とかでまとめたい時はformatとかfloor_dateとか使えないのでどうにかならんもんかと思っていたわけです
packageあるやろと
[ジュール・ベルヌもこのように偉大な言葉を残しているわけです](https://twitter.com/inut/status/354508483808342016)
package誰か作っとるやろと

しかし探せどないわけです、round系の関数にいい具合のオプションを渡してあげたら10日とか3ヶ月とかでまるめてくれんものかと
[xtsというpackage](http://cran.r-project.org/web/packages/xts/index.html)に便利な関数がいろいろあると[教えてもらった](https://twitter.com/dritoshi/status/354530095098118144)のだけれど
うまくいかず

ところが

```r:R
> quarters(df$date)
# => [1] "Q2" "Q3" "Q3" "Q3" "Q3" "Q3"
# ...
```

あった…

```r:R
> df$qtr <- paste(format(df$date, "%Y"), quarters(df$date), sep = "/")
```

これでいいやんね
Androidで、カメラのオートフォーカスでハマる


# 問題：オートフォーカスされない

Androidでカメラ機能を使うとき、当然、オートフォーカスしたいですよね。

さて、自分の持っているAndroid端末ではきちんとオートフォーカスされてたのに、
他の人の端末ではオートフォーカス機能が動かない、という事態に陥りました。

何百キロメートルも離れたところの人だったので、実機を借りるわけにもいかず、困りはてて、ネットをうろうろ。
最終的に、辿り着いたのはここ↓

[http://developer.android.com/reference/android/hardware/Camera.html#autoFocus(android.hardware.Camera.AutoFocusCallback)](http://developer.android.com/reference/android/hardware/Camera.html#autoFocus(android.hardware.Camera.AutoFocusCallback))

本家本元のリファレンスでしたとさ…。
いやー、基本って大事ですね。

# 解決編

で、どこが問題だったかというと、上記URLに書いてある

```text
Starts camera auto-focus and registers a callback function to run when the camera is focused. This method is only valid when preview is active (between startPreview() and before stopPreview()).
```

大事とこだけ、もう一度

```text
This method is only valid when preview is active (between startPreview() and before stopPreview()).
```

という文です。

autoFocus()は、
・startPreviewの後
かつ
・stopPreviewの前
に呼ばなければならない、とあります。

自分の書いたソースを念のため確認したところ、
startPreview()を呼ぶ前に、autoFocus()を呼んでました…orz

もう面倒くさいので、startPreview()の直後へautoFocus()を呼ぶように書き換えたところ、無事動きましたとさ…。

# Unity + Android ( + Vuforia)のオートフォーカスでハマったときはこちら

http://win8dev.hatenablog.com/entry/2013/02/27/230905
Play Framework (Java) の fakeApplication を使ったテストをスッキリ書く

fakeApplication を使ったテストを普通に書くと長いですよね。

```java:
running(fakeApplication(), new Runnable() {
    public void run() {
        // ...
    }
});
```

そこで、こんなクラスを用意しておくと……

```java:GreatFakeApp.java
import org.junit.rules.ExternalResource;

import play.test.FakeApplication;
import play.test.Helpers;

public class GreatFakeApp extends ExternalResource {
	private FakeApplication app;
	
	@Override
	protected void before() throws Throwable {
		app = Helpers.fakeApplication();
		Helpers.start(app);
	}
	
	@Override
	protected void after() {
		Helpers.stop(app);
	}
}
```

JUnit の @ClassRule を使ってテストをこのように書けます。

```java:HogeTest
import static org.fest.assertions.Assertions.assertThat;
import static play.test.Helpers.*;

import org.junit.ClassRule;
import org.junit.Test;

public class HogehogeTest {

	@ClassRule public static GreatFakeApp app = new GreatFakeApp();
	
	@Test public void test() {
		Result result = fakeRequest(GET, "/");
		assertThat(status(result)).isEqualTo(OK);
	}

}
```

スッキリ！

この場合は @BeforeClass のように、テストクラスごとに fakeApplication が作られます。


参考:

- [Unit testing tricks for Play 2.0 and Ebean | Web, Bass & Rock'n'Roll](http://blog.matthieuguillermin.fr/2012/03/unit-testing-tricks-for-play-2-0-and-ebean/)
DevToolsの文字サイズを変えるショートカット

プロジェクタにブラウザを表示してなにか説明するときとかに使うのでめも

## 拡大

`ctrl(cmd)` + `+` 

![ss2.jpg](https://qiita-image-store.s3.amazonaws.com/0/17969/b7abba15-9671-7c7b-0777-7925448f864d.jpeg)

## 縮小

`ctrl(cmd)` + `-` 

![ss3.jpg](https://qiita-image-store.s3.amazonaws.com/0/17969/e0ab4515-0be0-da0e-c47d-95be40fefdda.jpeg)

## 拡縮リセット

`ctrl(cmd)` + `0`

![ss1.jpg](https://qiita-image-store.s3.amazonaws.com/0/17969/10cdc7ed-06c1-8887-e1ea-16e4bba8fba2.jpeg)

---

(DevToolsに限らずChromeの表示の拡縮のショートカットがそのまま使えるだけ)

Macのズーム機能でも拡大できるけどこっちのが楽
Animation sample

Animation
[HSGN assimilation](http://vimeo.com/28350537)
[the camera collection](http://vimeo.com/41336551)
[Genius Party Beyond Dimension Bomb apple](https://www.youtube.com/watch?v=CPrYk-IWy2Y)
[After Effects tutorial](http://www.whitedots.net/2013/07/29/tutorial-dancing-particles-reflection/)
[Cuushe - Airy Me](http://vimeo.com/70463623)
[Sincho.tv](http://vimeo.com/46701580)
[Masanobu Hiraoka](http://www.jeregarde.com/member.php?path=data/members/6-masanobu)
[水江未来](http://www.youtube.com/watch?v=Z_reYTZWTBo)
[浮世捌景](http://www.youtube.com/watch?v=WKWuGo6wbKY)
["地下鉄の動態"](http://www.youtube.com/watch?v=ZDykTjFFNIE)
[Looking for a Fight](http://www.bloodyloud.com/looking-for-a-fight-2veinte/)
[自主制作アニメーション『the TV show』](http://www.youtube.com/watch?v=BQ9YtJC-Kd8)
[Cuushe 'Airy Me'](http://www.youtube.com/watch?v=VJ5QvrGxTnQ)

MusicVideo
[Extra](https://www.youtube.com/watch?v=t6maVVFs0As)
[Wonder 'Bout](https://www.youtube.com/watch?v=n__5CguZogw)
[Louis Vuitton SUPERFLAT MONOGRAM](http://www.youtube.com/watch?v=rIhnnQH_GdQ)
[HALFBY](http://www.youtube.com/watch?v=1lMsnj4AT78)
[日本橋高架下R計画](http://vimeo.com/39758142)
[WORLDCALLING](http://vimeo.com/52908595)
[Transfer](http://www.youtube.com/watch?v=ayL4pzictu8)
[HIFANA]（http://www.youtube.com/watch?v=xqina8BSXpM）
[yama-ko.net REEL 2012](http://vimeo.com/54618117)
[荒川アンダーザブリッジ](https://www.youtube.com/watch?v=jQ3IuOuUki0)
[さよなら絶望先生](https://www.youtube.com/watch?v=1mnFMxVqZhY)
[6♥Princess by Takashi Murakami for Shu Uemura](http://www.youtube.com/watch?v=aoTP5Aig-wU)
[神風動画 デモリール2013](http://www.youtube.com/watch?v=D-e0i7Vd-Sw)
[未来光子 播磨サクラ - 神風動画](http://www.youtube.com/watch?v=5G64-xD-mnw)
[HaKU「everything but the love」MV](http://www.youtube.com/watch?v=vx6QyoJGv1g)

Eyecatch
[SPACE SHOWER TV](http://vimeo.com/15095544)
[startup videos](http://startup-videos.com)

UI
[OBLIVION](http://vimeo.com/64377100)
[Huds and Guis](http://hudsandguis.com/)
http://motionographer.com/features/prologue-iron-man-2/

Art
[Aphex Twin × IDOLM@STER](http://www.nicovideo.jp/watch/sm8008667)

Effect
[楽園追放 -Expelled from Paradise』PV](http://www.youtube.com/watch?v=5QPlxbdTfAE)
[Anime Festival Asia Special Video - feat. Inori Aizawa](http://www.youtube.com/watch?v=BHTUlF7NA2o)
[Inori Aizawa - Compositing Process](http://www.youtube.com/watch?v=ECanPk8JYgY)
シーケンステーブルの作成と更新

EC-CUBE2.11系以降は、auto_increment しない仕様なので、インストール時にちょっと困る。
install.php を素直に使わず、シェルで動かす場合、シーケンステーブルを作る必要があるので、メモ。

dtb_plugin
plugin_id がSEQUENCE にする。

##### PostgreSQL の場合

```sql:
CREATE SEQUENCE dtb_plugin_plugin_id_seq;
SELECT SETVAL('dtb_plugin' , (SELECT MAX(plugin_id) + 1 FROM dtb_plugin) , false);
```

##### MySQL の場合

```sql:
CREATE TABLE dtb_plugin_plugin_id_seq (
    sequence int(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (sequence)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
LOCK TABLES dtb_plugin_plugin_id_seq WRITE;
INSERT INTO dtb_plugin_plugin_id_seq VALUES (1);
UNLOCK TABLES;
```

他のDBも考えての汎用性をもたせる措置だと思うんだけど、う～ん。
プラグインとか作る時に気をつけなければ。
jQueryでfadeOutの後にremove

要素をフェードアウトした後に削除しようと、

```js:sample.js
$(this).fadeOut('fast').remove();
```

としてみたところ、
フェードアウトせずにそのまま消えてしまった。

ちょっと調べてみると、処理を待つキューに入る処理と入らない処理があるとのこと。
エフェクト系は概ね入るようだけど、`remove()`はキューに入らない。
キューに入れるには`.queue()`を使う。

```js:sample.js
$(this).fadeOut('fast').queue(function() {
  this.remove();
});
```

これでフェードアウトを待って削除できる。
catでテキストファイルを作る

例えば以下のソースがあります。

```py:
import sys
import time
for num, i in enumerate(range(100)):
    #print "\r%d" % num,
    sys.stdout.write("\r%d" % num)
    sys.stdout.flush()
    time.sleep(0.01)
print
```

これを貼り付けするとき、以下の問題がある。

* vimだと:se pasteして貼り付けるが、面倒
* コメントアウトが含まれていると、vimが良しなにコメントアウトし続けたりする。
* ちょっと貼り付けたいだけなのにvimにフルスクリーン取られるのが嫌

そこでcatコマンドの出番です。

```bash:
cat > a.py
ここに貼り付け

control-d で終了
```

これで書き込みができます。

## 行末の連続スペースを削除する

次のシェルスクリプトを用意。

```bash:trim.sh
sed -i -e 's/\( \+$\)//g' $1
```

```bash:使い方
$ sh ./trim.sh pasted.txt
```

pasted.txtの行末にスペースがなくなっているのを確認。