OmniAICreator/Qiita-1.07M huggingface dataset:
Ansible忘備録 -起動したはずのプロセスが死んでいる-

とても初歩的なことでハマってしまったので、今後忘れないためにもしっかり書いておく。
目指せ30分以内編集

## 今回の事象
### ハマったこと
* Ansibleでtomcatを起動するスクリプトを実行。
okの確認、pidファイルの作成も確認できていたが、ログインしてみると起動できていなかった。

* ログインしたサーバーで起動スクリプトを叩くと起動できる。

* debugで出力した結果も、環境変数が指定できていない等の問題はなさそう。

### 原因
* 起動コマンドに"&"をつけてバックグラウンドで起動していたが、
sshのコネクションが切れたため、プロセスも終了していた。
* Ansibleはsshでコネクションを張り、命令を実行という基本的な流れを忘れていた/(^o^)\

### 解決策
* nohupつけて起動

## もう少し詳しく
実際にはただこれだけの無知なお話ですが、流れを詳細に。
### 実行命令
AnsibleのPlaybook内で以下のように記述
※{{ standby_deploy.stdout }}にはtomcatのパスが入る

```start_tomcat.yml
- name: standby tomcat start
  shell: |
    {{ standby_deploy.stdout }}/bin/startup.sh
  register: stadby_check
  tags: tomcat
- debug: var=stadby_check
```

サーバー側
startup.sh →　catarina.sh start
という流れを実行することになる。
catarina.shの起動部分は以下のように書かれていた。

```${CATALINA_HOME}/bin/catalina.sh
eval \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
      -Dcatalina.base=\"$CATALINA_BASE\" \
      -Dcatalina.home=\"$CATALINA_HOME\" \
      -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"
```

startで実行される部分まで追っていくと、

* javaコマンドで起動
* ログは"$CATALINA_OUT"に全て記述
* "&"が付いているのでバックグラウンドで実行

となっていることがわかる。
プロセスをバックグランドで実行させていた場合、sshコネクションの切断とともにkillされてしまう。
コネクションが切れても実行し続けるためにはdaemon化しとくか、
"nohup"をつけてログアウトしてもkillされないようにする必要がある。

以下のように変更

```${CATALINA_HOME}/bin/catalina.sh
eval nohup \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
      -Dcatalina.base=\"$CATALINA_BASE\" \
      -Dcatalina.home=\"$CATALINA_HOME\" \
      -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"
```
nohupを入れただけ

## まとめ
Ansibleの処理後はsshコネクションが切られる
→yml内で実行命令出していたプロセスも切られる
ということを意識するというお話でした。

短時間まとめを意識したが難しい…

## 追記
@r_rudi さんよりコメントを頂いたとおり、
 Ansibleの`async`オプションを使うことでnohupをつける必要なく行けました。
`async`:http://docs.ansible.com/playbooks_async.html
> Alternatively, if you do not need to wait on the task to complete, you may “fire and forget” by specifying a poll value of 0

pollを0に指定することで、タスクの完了を待機しないとの事。
ymlファイルを下記のように変更。

```start_tomcat.yml
- name: standby tomcat start
  shell: |
    {{ standby_deploy.stdout }}/bin/startup.sh
  register: stadby_check
  async: 15
  poll: 0
  tags: tomcat
- debug: var=stadby_check
```

実行した所、表示はokではなく下記のようになっていた。

```
TASK: [api_deploy | standby tomcat start] *************************************
<job 434049680585> finished on 54.**.**.**
```

ok,changedではなくfinished

情報頂きありがとうございましたm(__)m
パスワードを忘れたときの操作（Google編）

パスワードを忘れたときの操作について、Googleではどのような動きをするのかについてメモします。

* Gmailのサービスがあるためか「予備のメールアドレス」という概念がある
* 言葉がわかりにくく感じる（覚えている最後のパスワードとはどういう意味なのか・・）
* パスワードを変更したあと、確認のメールが予備のメールアドレスに来る

# Googleにてパスワードを忘れたときの操作

## ログイン画面にて

パスワードを忘れたユーザーのために、ログインボタンの右下に「お困りの場合」というリンクがある

![login_google.png](https://qiita-image-store.s3.amazonaws.com/0/43593/c8c68f89-0486-72b4-3002-34979496fa1f.png)

## ログインできない場合に3通りの選択肢

「お困りの場合」というリンクをクリックすると、ログインできない場合、という画面になる。そこでは下記が選べるようになっている。「パスワードがわからない」を選ぶとメールアドレスを入力する欄が出てくる。

* パスワードがわからない
* ユーザー名がわからない
* ログインに関して別の問題が発生している

![ログインできない場合](https://qiita-image-store.s3.amazonaws.com/0/43593/9d4f0153-7215-5167-a836-903564d7b5f7.png)

## 覚えている最後のパスワード？

メールアドレスを入力して「続行」をクリックすると、覚えている最後のパスワードを入力してください、と言われる。覚えている最後のパスワード、という意味がよくわからない。

![example@examle.comのパスワードアシスタンス](https://qiita-image-store.s3.amazonaws.com/0/43593/67316202-bc5c-5bc3-d989-004e1b320a33.png)

「ご不明な場合」をクリックすると下記のような画面になったので「続行」をクリック。gmailを使っている人は違う画面になるのかもしれない。

![example@examle.comのパスワードアシスタンス](https://qiita-image-store.s3.amazonaws.com/0/43593/b703355c-5581-7293-b968-a08440cadce3.png)

「続行」を押すと予備のメールアドレス宛てにメールが送信される。

![example@examle.comのパスワードアシスタンス](https://qiita-image-store.s3.amazonaws.com/0/43593/a39f500e-5d7c-3003-268d-9e6deb70b1b6.png)

## 送信されたメールの文面

```
件名：Google パスワード アシスタンス

example@examlpe.com の Google アカウント パスワードを リセットするには、次のリンクをクリックしてください。

https://www.google.com/accounts/recovery/srp?est=なんとかかんとか

このリンクをクリックしても機能しない場合は、URL をコピーして新しいブラウザ ウィンドウに貼り付けてください。

このメールに心当たりがない場合、他の方がパスワードをリセットする際に誤ってお客様のメール アドレスを入力した可能性があります。リクエストした覚えがない場合は、何も行わずにこのメールを破棄してください。

よろしくお願いいたします。
Google アカウント チーム

注: このメール アドレスには返信しないでください。問題の修正やアカウントの詳細に
ついては、ヘルプセンターをご覧ください。URL は次のとおりです。
http://www.google.com/support/accounts/ 
```

## パスワードの再設定

パスワードリセット用のメール内のリンクをクリックすると、パスワードの再設定画面が表示される。

![パスワードの再設定](https://qiita-image-store.s3.amazonaws.com/0/43593/7d029038-d05a-ef30-0047-36f39602c9b1.png)

パスワードの設定が完了し、ログインされた状態になる。

![パスワードの再設定完了](https://qiita-image-store.s3.amazonaws.com/0/43593/0d759ba7-8cd6-578b-e377-5aa0c51f7ab0.png)

## パスワード変更の確認メール

パスワードが変更されたことを伝えるメールが来る。
件名：Google アカウントのパスワードが変更されました

![確認メール](https://qiita-image-store.s3.amazonaws.com/0/43593/0dc06d38-d3b5-ee42-0d50-afe3a35bc177.jpeg)


## 番外：ユーザー名を忘れた場合

ユーザー名を忘れた場合は「予備のメールアドレス」か「予備の電話番号」の入力が必要。

![Google アカウント復旧yu.png](https://qiita-image-store.s3.amazonaws.com/0/43593/02ea706f-3c21-b056-1777-f22f27091f3a.png)
LESSで配列(?)を使う

変数にカンマ区切りで入れて、 extract で取り出す

これが

```:list.less
@list: #111, #222, #333;
@name: hoge, fuga, piyo;

.loop(@i) when (@i > 0) {
  @s: extract(@name, @i);
  .@{s} {
    color: extract(@list, @i);
  }
  .loop(@i - 1);
}

.loop(length(@list));
```

こうなる

```css:list.css
.piyo {
  color: #333333;
}
.fuga {
  color: #222222;
}
.hoge {
  color: #111111;
}
```


二次元配列っぽいこともできる

```:2dlist.less
@list: hoge #111, fuga #222, piyo #333;

.loop(@i) when (@i > 0) {
  @s: extract(extract(@list, @i), 1);
  .@{s} {
    color: extract(extract(@list, @i), 2);
  }
  .loop(@i - 1);
}

.loop(length(@list));
```

出力はさっきと同じ
RuboCop | Style/MethodLength

# RuboCop | Style/MethodLength

## 概要

RuboCopの「Style/MethodLength」警告について。

メソッドの行数をチェックします。
デフォルトは10行で、コメントは対象外とします。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|CountComments|false|コメントを警告対象外にする|○|
|CountComments|true|コメントを警告対象にする|--|
|Max|10|警告行数|○|

## MethodLength

各設定値での検証結果をまとめます。

### 検証プログラム

non_nil_check.rb

~~~ruby
def hoge1
  # commnet
  puts '1'
  puts '2'
  puts '3'
  puts '4'
  puts '5'
  puts '6'
  puts '7'
  puts '8'
  puts '9'
  puts '10'
end

def hoge2
  puts '1'
  puts '2'
  puts '3'
  puts '4'
  puts '5'
  puts '6'
  puts '7'
  puts '8'
  puts '9'
  puts '10'
end

def hoge3
  puts '1'
  puts '2'
  puts '3'
  puts '4'
  puts '5'
  puts '6'
  puts '7'
  puts '8'
  puts '9'
  puts '10'
  puts '11'
end
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

~~~yaml
MethodLength:
  CountComments: false  # count full line comments?
  Max: 10
~~~

~~~bash
$ rubocop method_length.rb
Inspecting 1 file
C

Offenses:

method_length.rb:28:1: C: Method has too many lines. [11/10]
def hoge3
^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 CountComments を true に設定します

.rubocop.yml

~~~yaml
MethodLength:
  CountComments: true  # count full line comments?
  Max: 10
~~~

~~~bash
$ rubocop method_length.rb
Inspecting 1 file
C

Offenses:

method_length.rb:1:1: C: Method has too many lines. [11/10]
def hoge1
^^^
method_length.rb:28:1: C: Method has too many lines. [11/10]
def hoge3
^^^

1 file inspected, 2 offenses detected
~~~

### 実行結果 CountComments を true, Max を 11 に設定します

.rubocop.yml

~~~yaml
MethodLength:
  CountComments: true  # count full line comments?
  Max: 11
~~~

~~~bash
$ rubocop method_length.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
Xcodeで一行削除ショートカットを使う

普段SublimeTextで一行削除ショートカットを使用していたのでXcodeでもできないかと調べていたら

> http://www.funky-monkey.nl/blog/2014/02/adding-keybindings-in-xcode-5/

という記事を見つけたので、ほぼ一緒の内容ですが手順を説明します。



## 1. Xcodeを終了する
Xcodeを終了しないまま作業を行うとうまく行かない事があるようです。

## 2. ターミナルでResourcesフォルダを開く
```
open /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources
```

## 3. Finderの検索で `IDETextKeyBindingSet.plist` ファイルを検索
```
IDETextKeyBindingSet.plist
```

## 4. ファイルと親フォルダの権限の修正
ファイルと親フォルダがロックされているため、右クリックでファイルと親フォルダの情報を開き「everyone」の権限を「読み/書き」にします。

## 5. キー設定の追加
Rootに `customized` キーをDictionaryタイプで追加します。

続いて `customized` キーの中に

```:Key
Delete Current Line
```

```:Value
deleteToBeginningOfLine:, moveToEndOfLine:, deleteToBeginningOfLine:, deleteBackward:, moveDown:, moveToBeginningOfLine:
```

をStringタイプで追加して、ファイルを閉じます。

もしくは、`IDETextKeyBindingSet.plist` を直接 OSX標準のテキストエディットで開いて、

```xml
<plist version="1.0">
<dict>
...

<key>customized</key>
	<dict>
		<key>Delete Current Line</key>
		<string>deleteToBeginningOfLine:, moveToEndOfLine:, deleteToBeginningOfLine:, deleteBackward:, moveDown:, moveToBeginningOfLine:</string>
	</dict>

...
</dict>
```

のように変更したあと上書き保存します。
※ `...` は省略を表しています。

## 6. XCodeを開く
XCodeを開きます。

## 7. キー設定
`Preferences` から `Key Bindings` を選択し、範囲が `All` となっていることを確認して検索バーから `Delete Current Line` と入力し検索し、好きなショートカットを設定したら完了です。
Git で管理しているファイルのリネームを git mv でなく mv してしまったときにどうなるのか調べてみた

Git で管理しているファイルをリネームする場合は `git mv` しなさいと様々なところで説明されているのですが、私は忘れそうで怖い…。

そう思って、`git mv` でなく `mv` したらどうなってしまうのか調べてみました。

適当なディレクトリを作って、 2 つのファイルをコミットしてみます。

```
$ mkdir gittest && cd gittest
$ git init
$ echo "This is a.txt" > a.txt
$ echo "This is b.txt" > b.txt
$ git add .
$ git commit -m " Commit a.txt and b.txt"

[master (root-commit) 7d4508b] Commit a.txt and b.txt
 2 files changed, 2 insertions (+)
 create mode 100644 a.txt
 create mode 100644 b.txt
```

ではそれぞれ異なる方法でリネームしてみましょう。

まずは a.txt から。こちらは `git mv` します。

```
$ git mv a.txt new_a.txt
$ git status

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    a.txt -> new_a.txt
```

はい、ちゃんとリネームが認識されました。

次は b.txt 。こちらは `mv` でリネームします。

```
$ mv b.txt new_b.txt
$ git status

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    a.txt -> new_a.txt

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    b.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        new_b.txt
```

はい、このとおり、 b.txt が削除され、 new_b.txt がトラックされていないという状態です。

本題はここからです。 mv で移動した new_b.txt を `git add .` で add してみます。

```
$ git add .
$ git status

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    a.txt -> new_a.txt
        renamed:    b.txt -> new_b.txt
```

なんと! `mv` でリネームした new_b.txt が Git 上でリネームだと判断されています。

もちろん、リネーム前のログも追跡できます。

```
$ git commit -m "Rename a.txt and b.txt"

[master c17eb16] Rename a.txt and b.txt
 2 files changed, 0 insertions (+), 0 deletions (-)
 rename a.txt => new_a.txt (100%)
 rename b.txt => new_b.txt (100%)

$ git log --follow new_b.txt

commit c17eb16667b55b6a7162fee3bc4d49faff5cbfe6
Author: akisute3 <akisute3@gmail.com>
Date:   Sat Jul 12 23:43:15 2014 +0900

    Rename a.txt and b.txt

commit 096440681e92db669bd83e126db4be903c9f79b3
Author: akisute3 <akisute3@gmail.com>
Date:   Sat Jul 12 23:34:17 2014 +0900

    Commit a.txt and b.txt
```

理由は、`git mv` が

```
$ mv oldname newname
$ git add newname
$ git rm oldname
```

が省略形だからなんですね。

つまり `mv` の後に `git add .` をすると、

- 消失している `b.txt` が削除対象となり
- 新規作成されている `new_b.txt` がトラックされる

ため、結局 `git mv` とやってることは変わらないということです。

(ちなみに `git add .` は Git 2.0 から `git add -A .` と同じ意味になりました) 。

なので、普段から `git add -A .` をする人は、安心して `mv` 使っちゃって大丈夫です。
スムーズにスクロールするjQuery プラグイン


新しく今プラグインを作りなおしました。
http://qiita.com/kamem/items/c94c4dc75516b36f3766


* site: http://develo.org/jquery.smoothAnchor
* Github: https://github.com/kamem/jquery.smoothAnchor

[blogEntry]: http://develo.org/2010/09/05/1301.html "jQueryでスムーズスクロールプラグイン"

[DEMO](http://github.develo.org/jquery.smoothAnchor/)

スムーズスクロールを実装したいときに、この機能はないのかなぁ・・。とか探したりするのが大変だったので、自分のなかで必要なきのうを切り替えて使えるスムーズルクロールをjQueryのanimateのscrollTop,scrollLeftをつかってjQuery Pluginを作ってみました！

前々からつくってはいたのですが、昔つくっていた拙いコードが残っていたので少し整理しました。


仕様
------
1. アンカーで飛んだあとアドレスもちゃんと変更。
2. 座標を指定してのページ内リンク。
3. アクセス時、座標アンカーがついている場合その位置に移動します。
4. アクセス時ページの先頭からその場所までスムーズに移動できるようにすることもできます。
5. 移動後の関数実行
6. スクロール途中、マウススクロールしたときにカクカクした動きをする問題をスクロールをストップすることで回避。



使い方
------
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/smoothAnchor.js"></script>

### 初期設定 ###
    $(window).smoothAnchorInit();
    $('a[href^="#"]').smoothAnchor();


### a要素以外につけたい場合 ###
    $('h1').smoothAnchor({easing : 'easeOutQuart',speed : 1000,target: '#header'});


### Flashから実行する場合 ###
    ExternalInterface.call("smoothAnchor",{easing : "easeOutElastic",speed : 1000,target : "#header"});
引数がない場合は初期設定になります。

### 移動後に関数実行 ###
    $('a[href^="#"]').smoothAnchor({
    	easing: 'easeOutQuart',
    	speed: 1000,
    	target: '#header',
    	complate:'test'
    });


### <a name="zahyou">座標を指定してリンク ###
 	#1000,1000（x, y）

Options
------
### 初期設定 ###
	//ロード時の処理
    $(window).smoothAnchorInit({
        easing: 'easeOutQuart',
        speed: 1000,
        complate:'',
        isLoadedSmooth: true,
        isLoadedSmoothQuestionMark: true,
        isClickStop: false,
        isTopScroll: true,
        isLeftScroll: true
    });

	//クリック時の処理
    $('a[href^="#"]').smoothAnchor({
        easing: 'easeOutQuart',
        speed: 1000,
        delay: 0,
        target: '#header',
        complate: '',
        isAddHash: true,
        isTopScroll: true,
        isLeftScroll: true
    });


* easing: {String} イージングの種類,
* speed: {Number} speed,
* delay: {Number} delay,
* target: {String} hrefがないタグの場合の直接指定
* complate: {Function} スクロール後の関数名
* isAddHash: {Boolean} スクロール後にhashを追加するか
* isTopScroll: {Boolean} 縦方向にスクロールするか
* isLeftScroll: {Boolean} 横方向にスクロールするか
* isLoadedSmooth: {Boolean} ロード時にトップからスムーズスクロールするか
* isLoadedSmoothQuestionMark: ?を使っての座標指定での移動を許可するか（?100,100）
* isClickStop: {Boolean} スムーズスクロール時にクリックした場合に処理を停止するか
Promiseを直列で実行する

並列で実行したい場合は `Promise.all([promise...])` すれば事足りるんだけど、直列で実行しようとするとちょっとややこしい。

```coffee
# 実行すると1秒後に実行回数をprintするPromise化された関数
cnt = 0
f = -> new Promise (done) ->
  setTimeout (->
    console.log 'done', cnt++
    done()
  ), 1000

# fを直列に4回実行する
promises = [f, f, f, f]
seq = promises.reduce ((ret, p) ->
  ret.then p
), promises.shift()()

seq.then => console.log 'finish'
```

実行結果

```
done 0
done 1
done 2
done 3
finish 
```

Array.prototype.reduceでthenを繋ぐのが肝
バッファの一部だけ read-only にする

バッファ全体を read-only にするときは `buffer-read-only` を使いますが，これでは一部だけを編集から保護することができません．


## 材料

* `inhibit-read-only`
  - この変数が `nil` だと read-only の設定・解除ができません．
* `put-text-property`
  - この関数である範囲の属性を変更できます．

詳しくは describe variable/function でお調べください．


## サンプル

```emacs-lisp
;; Example: from バッファの一部だけ read-only to

(let ((inhibit-read-only t))
  (put-text-property (progn
                       (search-backward "Example:")
                       (search-forward "from")
                       (backward-word)
                       (point))
                     (progn
                       (search-forward "to")
                       (point))
                     'read-only
                     t))
```

上のサンプルを `*scratch*` などの Emacs Lisp モードのバッファにコピーして，`(let ...` で始まる式を C-x C-e (`eval-last-sexp`) などで評価すると，一行目コメントの `from` から `to` までが read-only になります．

Read-only を解除するには，`(let ...` で始まる式の一番最後の `t` を `nil` にしてからもう一度 C-x C-e します．
GDでWebPを扱うには

ngx_small_lightにWebPのサポートを追加するにあたってGDでWebPを扱うための方法について調べたので、軽くまとめる。

まぁ、方法は至って簡単でGDをビルドする際にlibvpxを組み込むようにすればよい(逆に言うとデフォルトでは組み込まれない)。homebrewなら↓でOK。

```bash
$ brew install gd --with-libvpx
```

すでにインストール済みなら`gdlib-config --libs`の出力に`-lvpx`が含まれているかどうかで確認できる。

```
$ gdlib-config --libs
```
Debianでユーザー追加を追加して権限を付与などをするメモ


今更感あるけど、いつもCentOSで作業していて今回はDebianを利用したのでメモします。
違いはそんなに無い...はず(?)なんだけど CentOSとはまた違ってクセがありますね汗

##項目
* 追加するユーザー名: morioka
* 追加するユーザーが所属するグループ: iwate
* 追加するユーザーのホームディレクトリ: /home/morioka

##ユーザー追加手順
```
#ユーザー用のホームディレクトリを作成
$ sudo mkdir /home/morioka

#ユーザーが所属するグループを作成 offside_nowがグループ名
$ sudo groupadd iwate

#グループとホームディレクトリを設定してユーザー追加
$ sudo useradd -g iwate -d /home/morioka morioka

#ユーザーにパスワード設定
$ sudo passwd morioka
Enter new UNIX password: ←パスワード入力
Retype new UNIX password: ←パスワード再入力 
passwd: password updated successfully
```

##ユーザーに権限を付与

```
$ sudo visudo
```

エディタが立ち上がるので `# User privilege specification`ってところに追記しましょう。

```
# User privilege specification
root    ALL=(ALL) ALL
morioka        ALL=(ALL) ALL
```

##ユーザーがSSHでログイン出来るようにする
```
$ sudo vim /etc/ssh/sshd_config
```
エディタで最終行に追記しました

```
#ユーザーmsendaiとmoriokaのssh接続許可
AllowUsers sendai morioka
```

SSHを再起動

```
$ /etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.
```

技術ブログ調べると`$ /etc/init.d/sshd restart`で書いてありますが
私の環境では `$ /etc/init.d/ssh restart`でした。なんでだろ。

##ローカルマシンからアクセスしてみる
sshでアクセス出来ればOKです。

```
$ ssh morioka@hostname
```

##ホームディレクトリの所有者を変更

```
$ sudo chown morioka:iwate /home/morioka
```

sudo付けるの面倒いですし、追加したユーザーを所有者にしておきます。

これで一通り使えるようになったと思います!


参考: [Debianでuser追加、group追加 - $shibayu36->blog;](http://go.shr.lc/1oQnT9m)
参考: [Debian etch で自宅サーバ | ユーザアカウントと管理者権限の設定](http://go.shr.lc/1kgWg53)
参考: [ぱち ブログ - ](http://go.shr.lc/W6F3WS)
参考: [sshdを再起動する時は](http://open-groove.net/linux/sshd-restart/)
git clone -> git submodule init -> git submodule updateがだるいとき

submoduleがあるリポジトリをcloneするときは普通こんな感じの流れになる。

```
$ git clone [url]
$ git submodule init
$ git submodule update
```

でも、毎度毎度cloneし直したりするときにこれを打つのはだるい。
そんなときはこれ！

```
$ git clone --recursive [url]
```

clone→submodule init→submodule updateの流れをコマンド一発でやってくれて糞便利だった。
SwiftでPerl

むしゃくしゃしてやった。後悔はしてないけど公開はした。

* https://github.com/dankogai/swift-perl

## Install

Yosemite DP3 + Xcode6-beta3 で動きます。

```shell-session
% git clone https://github.com/dankogai/swift-perl.git
% open swift-perl/swiftperl.xcodeproj
```

あとはmain.swiftを適当にいじって遊んでね。

## Synopsis

こんな感じで使えます

````swift
Perl.sysInit()

func run(script:String) {
    let pl = Perl()
    let sv = pl.eval(script)
    println("eval \"\(script)\"")
    if !pl.evalok {
        println(" err:   \(pl.errstr)")
    } else {
        println("  !!:   \(sv.asBool)")
        println("  int:  \(sv.asInt)")
        println("  +0.0: \(sv.asDouble)")
        println("  q{}.: \(sv.asString)")
    }
}
run("reverse q(rekcaH lreP rehtonA tsuJ)")
run("atan2(0,-1)")
run("q{0 but true}")
run("my @a = (0,1,2,3)")
run("my %h = (zero => 0, one => 1)")
run("sub{ @_ }")
run("phpinfo()")

let pl = Perl()
pl.eval("our $swift = q(0.0 but rocks)")
println(pl.$("swift"))
println(pl.$("swift")?.asBool)
println(pl.$("swift")?.asDouble)
println(pl.$("objC"))
pl.eval("use Data::Dumper")
println(pl.eval("Dumper(\\%ENV)"))

Perl.sysTerm()
````

## Making thereof

コード部分は楽勝でした。

* http://perldoc.perl.org/perlembed.html

に素直に従っただけ。むしろ大変だったのはXcodeの設定の方ですが、これも基本的にサーチパスとリンカーオプションを perlembed に従って設定するだけでした。

「[PerlでJavaScript]」のJavaScriptCoreを使った事例と異なり、現状ではシングルインスタンスです。一応initとdeinitは繰り返しできるようにはしているので、スコープごとにcontextは新鮮にはなります。

[PerlでJavaScript]: http://qiita.com/dankogai/items/052a3ad6f32d114a33fc

なお、ここで利用しているPerlは、Yosemite DP3付属のものです。実際に組み込んで利用する場合はPerl自体をプロジェクトに同封するなりするようにした方がいいと思います。

これで[YAPC::Asia::2014]の[トーク]もばっちこい…ん、まてよ、まだ採択されたと決まったわけじゃないよな。というわけで、動くの見たいかたはソーシャルメディアで(リツイート|いいね|ブクマ)などして下さると幸いです。

[YAPC::Asia::2014]: http://yapcasia.org/2014/
[トーク]: http://yapcasia.org/2014/talk/show/4a5af014-ebad-11e3-bd6d-c7a06aeab6a4

Enjoy!

Dan the Swift Perl Hacker
Sequel ProのC-hをKarabiner(KeyRemap4MacBook)で置き換える

[Sequel Pro](http://www.sequelpro.com/)を使っているが、`C-h`でヘルプが開くのがつらすぎるので[Karabiner](https://pqrs.org/osx/karabiner/) (formally known as KeyRemap4MacBook)を使って置き換えてみた。

```private.xml
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>SEQUEL_PRO</appname>
    <equal>com.sequelpro.SequelPro</equal>
  </appdef>

  <item>
    <name>Sequel Pro C-h to backspace</name>
    <identifier>private.app_sequel_pro_c_h_to_backspace</identifier>
    <only>SEQUEL_PRO</only>
    <autogen>
      __KeyToKey__
      KeyCode::H, ModifierFlag::CONTROL_L,
      KeyCode::DELETE
    </autogen>
  </item>
</root>
```


## メモ

* ちょうどこれ書いてるときにアップデートかかって[Karabiner](https://pqrs.org/osx/karabiner/)という名前に変わった。ググラビリティ低いし、Alfredで呼び出すときにも迷う。
* 参考にしたのは[private.xml Reference Manual](https://pqrs.org/osx/karabiner/xml.html.ja)。
* `EventViewer`で`Application Bundle Identifier`を調べるのがポイント。コピペしにくいのがつらい。
Node.jsでIpv6を取り扱う方法

ここではNode.jsにおいてIpv6をどのように取り扱うか説明する。

#ExpressのサーバーでIPv6を受け付けるようにする。
既定の設定でNode.js+Expressでサーバーを立ち上げた場合、下記のようにipv6のアドレスで接続しようとすると失敗する。

```
http://[fe80::20c:29ff:feb8:6dd1]:3000/
```

この回避策としてIPを明示する方法が提示されている。
http://code.danyork.com/2011/01/21/how-to-use-node-js-with-ipv6/

```js
var http = require('http');
 
var handler = function (request, response) {
   response.writeHead(200, {"Content-Type":"text/plain"});
   response.end ("Hello World!n");
   console.log("Got a connection");
};
 
var server6= http.createServer();
server6.addListener("request",handler);
server6.listen(80,"2001:db8:1111:2222:3333::51");
 
var server= http.createServer();
server.addListener("request",handler);
server.listen(80,"192.0.2.23");
 
console.log("Server running on localhost at port 80");
```

この方法はイーサーネットを複数保持している場合は動作しない。
たとえば、上記でlistenしているアドレスのほかに2001::52のイーサーネットを保持していた場合、2001::52からのアクセスがみとめられない。

保持するIpv6すべてでlistenするには以下のようにする。


```js
    var server = app.listen(app.get('port'), '::0', function() {
      debug('Express server listening on port ' + server.address().port);
    });
```

Ipv6形式で記述してあるが、ipv4のアドレスも受け付ける。

#IPv6の操作
Node.jsでIpv6の有効チェックや数字化、範囲チェックを行うには以下のライブラリを使用するとよい。

https://github.com/beaugunderson/javascript-ipv6

IPv6を数値に変換した場合、JavaScriptの仕様上、double型と扱われ、精度が落ちる。
このライブラリではbigIntegerというライブラリを用い、それを回避している。
もし、IPの範囲の検査で大小を比較する場合は、bigIntegerが提供しているcompairToを用いて行う。
まちがっても自分ですべての配列の大小を比較する車輪の再開発みたいなことはしてはいけない。


以下にその使用例を示す。

```js
var v6 = require('ipv6').v6;
var address1 = new v6.Address('2001:0:ce49:7601:e866:efff:62c3:fffe');
var address2 = new v6.Address('2001:0:ce49:7601:e866:efff:61c3:0002');

// 値がipv6かチェックする
console.log(address1.isValid());

var ngAddress = new v6.Address('1.2.3.4');
console.log(ngAddress.isValid());

var ngAddress = new v6.Address('test.co.jp');
console.log(ngAddress.isValid());

// アドレスの比較をする場合はbigIntegerに変換して、compareToで比較すること
var bi1 = address1.bigInteger();
var bi2 = address2.bigInteger();

// thisがでかければ+
console.log(bi1.compareTo(bi2));
// ひとしければ 0
console.log(bi1.compareTo(bi1));
// 引数のほうが大きければ-
console.log(bi2.compareTo(bi1));

// サブネットマスクを指定して、開始アドレス、終了アドレスも取得できる。
address1.subnetMask = 64;
console.log(address1.startAddress());
console.log(address2.endAddress());


// 省略形で表示も可能
address1 = new v6.Address('2001:0:0:0:0:0:0:1');
// 2001::1 と省略形で
console.log(address1.correctForm());

```
AWS MarketPlaceのCentOS公式イメージをいつものインスタンスっぽくしてPackerで保存

<!-- permanent -->


Amazon EC2でCentOSを使いたい場合、CentOSコミュニティがAWS MarketPlaceに公開しているイメージが一応ある。


![CentOS_6__x86_64__-_with_Updates_on_AWS_Marketplace.png](https://qiita-image-store.s3.amazonaws.com/0/7454/30cb71f0-b992-8ca7-1eb2-75afea9ffb68.png "CentOS_6__x86_64__-_with_Updates_on_AWS_Marketplace.png")


かなり素の状態で置いてあり、例えば次のような点でAmazon Linuxなどと異なっている。

- ログインユーザがroot
    - ついでにランダムパスワード
- Iptables, Selinuxが有効
- `ec2metadata`や`aws`コマンドがない (curlで取るのはOK)
- cloud-initが入ってない

## Packerで調整して保存

詳しくはこちら。

[https://github.com/OpsRockin/centos6_ami_from_official](https://github.com/OpsRockin/centos6_ami_from_official)

これにより、次のように調整したAMIを作れる。

- - Iptables, Selinux無効
- ログインユーザは`cloud-user`に、sudo対応
    - `Please login as the user "cloud-user" rather than the user "root".`
- `aws`コマンド標準装備、Roleも対応

PackerのShell-Provisionerはこんな感じ。

```shell:bootstrap.sh
#!/usr/bin/env bash

set -ex

# Disable Selinux and Iptables
sed s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config -i
chkconfig iptables off
chkconfig ip6tables off

yum update -y


## Install AWS Tools and Git
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install -y cloud-init git jq cloud-utils python-pip
pip install awscli


## Remove Password from root
passwd -d root
sed -e '9,$d' /etc/rc.local -i


## Set sudo rule for cloud-user
cat <<EOL > cloud-init
cloud-user ALL = NOPASSWD: ALL

# User rules for cloud-user
cloud-user ALL=(ALL) NOPASSWD:ALL
Defaults:cloud-user !requiretty
EOL

install -o root -g root -m 0440 cloud-init /etc/sudoers.d/cloud-init
rm -f cloud-init
```

これで作っておいたAMIに対しては、通常のAmazon公式イメージとほぼ同様の扱いが可能になる。

```
$ ssh cloud-user@ec2-xx-xx-xxx-xxx.compute-1.amazonaws.com sudo echo 'hogehoge'
hogehoge
```

元がAWS MarketPlaceのイメージなので、これを更にPublicにする事はできないけど。
[baserCMS]Errorページの手軽な準備方法


存在しないURLにアクセスがあった場合やコントローラやアクションのエラーが起きた場合に表示されるエラーページを用意する際は、以下のようにするとお手軽です。

## 環境

- baserCMS 3.0.6.1
- PHP 5.4.19


## ファイルの作成

* /theme/THEME_NAME/Errors/error404.php を作成する

```php:error404.php
<?php
/**
 * [PUBLISH] 404エラー
 *
 */
//if (strpos($message, '.html') !== false)
//	$message = str_replace('pages/', '', $message);
$messageText = $this->response->statusCode() . ' ' . $message;
?>
<div id="errorPage">
	<h2><?php echo $messageText; ?></h2>
	<p class="error">
		<?php printf(
			__d('cake', 'The request sent to the address %s was invalid.'),
			"<strong>'{$url}'</strong>"
		); ?>
	</p>
</div>

<?php if (Configure::read('debug') > 0): ?>
	<?php echo $this->element('exception_stack_trace'); ?>
<?php endif; ?>
```

次に、以下のようにファイルを作成します。

* /theme/THEME_NAME/Errors/error400.php
* /theme/THEME_NAME/Errors/error500.php
* /theme/THEME_NAME/Errors/missing_action.php
* /theme/THEME_NAME/Errors/missing_class.php
* /theme/THEME_NAME/Errors/missing_controller.php

中身はこんな感じ。全部同じで良いです。

```php:error500.php
<?php
/**
 * Error
 */
?>
<?php
include BASER_THEMES . $this->theme . DS . 'Errors' . DS . 'error404' . $this->ext;
```

エラー時に表示されるのは 404.php に統一。
表示はこのファイルを調整するだけでOKです。

~~閲覧している一般のユーザー側にController Errorとか出しても困惑しちゃうだろうし。。。って感じです。~~
正しいステータスコードを返すように変更しました。
エラー出たら /app/tmp/logs の中身を見たりしてガンバって解決しましょー。

ちなみに、大元のビューは以下に在ります。

* /lib/Baser/View/Errors


## 併せて使うときがある情報

エラー出たらトップに飛ばすとか。

```php
<?php
header('location: /', true, 301);
exit();
```

同じだけど違う書き方。

```php
header('HTTP/1.1 301 Moved Permanently');
header('Location: /');
exit();
```
【PHP】半角カタカナがメールで文字化けしたときの対処法


#やりたかったこと
半角カナをメール送信したら文字化けした（????になった）！
文字化けしないようにしたかった。


#解決策
メール送信する前に、半角カタカナから全角カタカナに変換するという解決策をとりました。

##mb_convert_kana を利用
phpのマニュアルを見ると、こんな書き方をされている。
http://php.net/manual/ja/function.mb-convert-kana.php

```
$str = "ﾊﾝｶｸｷﾗｲ";
echo mb_convert_kana($str, "KV”);
```

ただし、この通りに書いても動かないときがある。
そんなときは、文字コードを指定しましょう。

```
$str = "ﾊﾝｶｸｷﾗｲ";
echo mb_convert_kana($str, "KV", "utf-8");
```

実行結果「ハンカクキライ」となりました！

#参考
http://www.cross-dimension.com/%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E5%8D%8A%E8%A7%92%E3%82%AB%E3%83%8A%E3%81%8Cmb_convert_encoding%E3%81%A7%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%99%E3%82%8B/38

http://php.net/manual/ja/function.mb-convert-kana.php

#捕捉

機種依存文字が文字化けする場合にどう対処するか、は下記が参考になるかも。もうちょっと調べて、試してみます。
http://memo.xight.org/2006-06-19-13
http://php.nekosuke.com/000056.htm
yokohama.rb 7/12


##ファイルの削除

File と FileUtils でできるけど、いろいろ違う。

||File|FileUtils|
|:---|:---|:---|
|メソッド名|unlink|rm|
|メソッド名の由来|symbolic link を削除する|ReMove|
|複数指定するとき|引数に並べる|配列を渡す|
|複数指定の例|`File.unlink( "a", "b", "c" )`|`FileUtils.rm( %w( a b c ))`|
|オプション指定|なし|:force=>true とか|
|返戻値|削除したファイルの数|削除したファイルのファイル名の配列|

それと、失敗した時の挙動。

失敗した動作はちょっと不穏なんだけど、`File.unlink` と `FileUtils.rm` は同じ。
先頭から順に削除するので、
c というファイルがない場合、
`File.unlink( "a", "b", "c", "d" )`
を実行すると、 a と b が削除されて、c を削除しようとして失敗、d はそのまま。

## Windows で rbenv したい

pik と uru があるらしい。

uru が良さそうな感じ？

## Windows の `File.sticky?`

`nil` を返してきた。
もちろん Mac や Linux では `true` や `false` を返す。

ちなみに `File.sticky? "存在しないファイル"` は 例外ではなく false。

## OpenSolaris

OpenSolaris は死んだらしい。
屍は OpenIndiana が拾って、zfs を使いたい人が使うらしい。

## 文字列の連接

C言語由来( BCPL由来? )と思われる文字列の連接が、ruby にもある。
ということを、yokohama.rb で知った。

文字列の連接とは、

```c
char const * hoge = "H" "O" /*コメント書いたり*/ "G" "E";
wchar_t const * fuga = L"HO" /* L を両方につける */ L"GE";
```

こういうもので、文字列リテラルを並べると、コンパイル時にひとまとまりになるというもの。

ruby では以下のとおり：

```ruby
"a" "b".size #=> 2
"a" "b"*3 #=> "ababab"
[1,2,3] * "_" "#" #=> "1_#2_#3"
?a "b" 'c' #=> "abc"
"a" 'b' "c" #=> "abc"
"a" %Q!b! #=> エラー
```

* 文字列の連接の結合順位はたぶん最強で、メソッド呼び出しのピリオドよりも強い。
* `'a'` と `"b"` を混ぜても良いが、`%Q!c!` は連接しない。
* `?a` も、普通に連接される。
* ヒアドキュメントは、左側にある場合のみ連接される。下記の通り：

```ruby
p <<HEREDOC  "[concat]" # ヒアドキュメントも連接される！
here document
HEREDOC
#=> "here document\n[concat]" 順序に注意。

p  "[concat]"  <<HOGE # エラー。ヒアドキュメントが右だとだめ。
here document
HOGE
```

追記 : 
文字列の連接についてさらに調べた記事
http://qiita.com/Nabetani/items/29a82811e95f80edbb27
を、書いた。
array_unique()で値の重複は削除できるけど、キーが飛び飛びになる。array_values()で解決

#array_unique()で値の重複は削除できるけど、キーが飛び飛びになる
##array_unique()で値の重複は削除できたが、キーが飛び飛びのままで、嵌った。array_values()を使用してキーを振り直し解決。

```php

<?php

//テスト配列
$array = array('test1', 'test2', 'test1', 'test3', 'test2', 'test');

//配列で重複している物を削除する
$unique = array_unique($array);

//キーが飛び飛びになっているので、キーを振り直す
$alignedUnique = array_values($unique);

?>

<?php echo("<pre>"); ?>
<div>
	<p>・テスト配列</p>
	<?php var_dump($array); ?>
</div>
<div>
	<p>・重複を削除しただけの配列</p>
	<?php var_dump($unique); ?>
</div>
<div>
	<p>・キーを振りなおした配列</p>
	<?php var_dump($alignedUnique); ?>
</div>
<?php echo("</pre>"); ?>


```

表示は下記
・テスト配列
array(6) {
  [0]=>
  string(5) "test1"
  [1]=>
  string(5) "test2"
  [2]=>
  string(5) "test1"
  [3]=>
  string(5) "test3"
  [4]=>
  string(5) "test2"
  [5]=>
  string(4) "test"
}

・重複を削除しただけの配列
array(4) {
  **[0]=>**
  string(5) "test1"
  **[1]=>**
  string(5) "test2"
  **[3]=>**
  string(5) "test3"
  **[5]=>**
  string(4) "test"
}

・キーを振りなおした配列
array(4) {
  **[0]=>**
  string(5) "test1"
  **[1]=>**
  string(5) "test2"
  **[2]=>**
  string(5) "test3"
  **[3]=>**
  string(4) "test"
}
SAPのテーブル/クエリのデータを抽出する(SAP .NET Connector)

以前[.NETからSAPへ接続する方法](http://qiita.com/icoxfog417/items/2b9aef066c28cf8e9fa0)を紹介したが、それを一歩進め、テーブルやクエリのデータを抽出できるようにしたライブラリを開発した。

[SAPExtractorDotNET](https://github.com/icoxfog417/SAPExtractorDotNET)

開発せず単純にデータを抜きたい場合に備え、コマンドラインのツールも搭載した。

[SAPExtractorDotNET/saploader](https://github.com/icoxfog417/SAPExtractorDotNET/tree/master/saploader)

SAPでは会社のマスタデータが`T001`というテーブルに入っているが、そのデータを抽出し`table.txt`に書き出す場合以下のように実行する。

```
saploader MY_SAP T001 table.txt
```

`MY_SAP`は接続先のインスタンスで、exeと同じフォルダにあるconfigファイルで設定を行う(詳細は[こちら](https://github.com/icoxfog417/SAPExtractorDotNET/wiki/Configuration-file-sample))。
また、抽出元がクエリの場合は以下のように行う。

```
saploader MY_SAP ZQUERY01/ZGROUP query.txt /q /v MY_VARIANT
```

これは、ユーザーグループが`ZGROUP`、クエリ名が`ZQUERY01`であるクエリについて、クエリバリアント`MY_VARIANT`を利用しクエリを抽出する例となる。

クエリで特に便利なのは、クエリバリアントの条件に現在日付などの条件(もしくはTVARV変数)を設定しておくことで、差分抽出が可能な点だ。
これを利用すれば、面倒な開発なくバッチファイルのみでマスタやトランザクションデータのI/Fが可能になる。

数万件のデータでも割とすぐ返ってくるので、既存プログラムに組み込みリアルタイムで使うもよし、バッチ実行でBIツールのデータとして貯めるもよし、である。

**開発の背景**
SAPはいわゆるERPであり、そこには業務に関する様々なデータが入っている(受注伝票、請求伝票、出荷伝票、会計伝票etc・・・)。

これはSAPがデータ分析のための宝の山ということを意味しているが、SAPからのデータ抽出は非常に手間がかかるというのもまた事実。

SAPから他システムへデータを飛ばす場合、通常はABAPと呼ばれるSAPのプログラム言語でファイルを出力するプログラムを開発し、出力したファイルを転送する。
当然ABAPなんていう謎言語を扱える人はそういないので、開発者を集めにくかったり高くなったりしてしまうのだ。

* IDoc/ALEといったデータ転送用の仕組みもあるにはあるが、これに精通している人はABAPを知っている人の10倍くらいレアなので(会ったことない)話にならない。
* 「SAPからデータを取り出せる」とうたうEAIやETLツールが山ほどあるが、どれもライセンス料が高くつくので厳しい(それでも開発するよりましなことは多い。[DataSpider](http://dataspider.appresso.com/adapter/detail/sap-adapter.html)などは知らなければ試してみる価値はある)。
* BW(今はBO)というSAP製のBIツールを使うとさすがにデータ連携は可能になるが、これはEAI/ETLツール以上にライセンスが高くつく。


要はSAPからデータを取り出すには、

1.開発、またその後の運用保守料を献上する(特殊技術なのでベンダロックイン覚悟)
2.EAI/ETLツール会社、もしくはSAP様に高額ライセンス料を献上する
3.あきらめる

の3択状態だったので、それを解消すべく開発した次第である。

なお、SAPもいつまでも殿様商売をしているわけではない。
最近は[SAP NetWeaver Gateway](http://scn.sap.com/docs/DOC-35472)というデータI/Fのための仕組みが発表されており、この導入によりSAP内のデータをREST形式などで飛ばすことができるようになった(こちらは[活用事例](http://www.sapjp.com/blog/archives/890))。
心配な[追加のライセンスコストはかけずに導入できる](http://scn.sap.com/thread/3382451)ようなので安心だ(逆に不安になるが)。

試してみたい方はSAPがデモ環境を提供してくれているので、[こちら](http://scn.sap.com/docs/DOC-31221#section6)で試すことができる(SAPのデベロッパーサイトであるSCNへの登録が必要)。なお、ABAPを試してみたい方は[こちら](http://scn.sap.com/community/developer-center/abap)からどうぞ。最近はEclipseで開発できるようになった。
Vimで行末の余分なスペースを取り除く

Rails Best Practicesでコードをチェックすると、[remove trailing whitespace](http://rails-bestpractices.com/posts/60-remove-trailing-whitespace)なんて言われたりしますよね。

行末に無駄なスペースがあると怒られてしまうようです。
手動でやるのはなかなか面倒くさいので、自動でやるように設定してしまいましょう。

.vimrc に以下の一行を追記しましょう。

```
autocmd BufWritePre * :%s/\s\+$//ge
```

こうすると、保存時に行末の空白を自動で削除してくれます。
特定のURLをRailsのconfig/route.rbでリダイレクトさせる方法

特定のURLにリダイレクトさせたい時の方法をご紹介。


moss.com/**moss1**/interview/23455 できたアクセスを 
moss.com/**moss2**/interview/23455 にリダイレクトさせたい場合。


```lang:config/routes.rb
Moss::Application.routes.draw do

root "home#index", as: :root
get  "/moss1/interview/:id" => redirect("/moss2/interview/%{id}")
get  "/moss2/interview/:id", to: "interview#show"
........

end

```

と書くだけ。moss.com/moss1/interview/:idにユーザーが訪れたときに、moss.com/moss2/interview/:idに自動でリダイレクトされます。
Facebook SDKで日本語の名前を取得する

```lang=objective-c

        [FBRequestConnection startWithGraphPath:@"me"
                                     parameters:@{
                                                  @"fields":@"id,birthday,name”,  // 取得したいFieldを選択する
                                                  @"locale":@“ja_JP”              // 言語選択
                                                  }
                                     HTTPMethod:@“GET” // POSTだとエラーになる
                              completionHandler:
         ^(
           FBRequestConnection *connection,
           id result,
           NSError *error
         ){
             if (error) {
                 NSLog(@"Error: %@", error);
             } else {
                 // 取得が成功したら、DictinaryのKEYにFieldの値を指定して取得する
                 NSDictionary* resultDict = (NSDictionary*)result;
                 NSString *name = resultDict[@"name”];



                 // 他で使えるように、プロパティに入れる
                 self.name = name;
                 NSLog(@"Result: %@", self.name);
             }
         }];
```
BitbucketのWikiでページを階層化する


BitbucketのWikiページをディレクトリ階層のようにカテゴリで分けすることができる機能を探してみたのですが、見つからず、適当に遊んでいたら見つけたのでメモしておきます。

![スクリーンショット 2014-07-11 11.56.56.png](https://qiita-image-store.s3.amazonaws.com/0/3153/d391eefe-db50-80a3-ba93-faab79105412.png)

タイトルを「階層1/階層2/ページ名」のように付けると、 階層構造を構築してくれるようで、Wikiページを整理することができるようになります。

タイトルを階層構造にして保存すると以下のようにフォルダを作成してくれて、階層構造になりました。

![スクリーンショット 2014-07-11 11.59.47.png](https://qiita-image-store.s3.amazonaws.com/0/3153/204f4c5e-f70a-8367-4c21-472e1ed47d6a.png)

おしまい
Canvasで画像の明るさを調整する(γ補正)


## γ値
簡単にいえば、ディスプレイの画像の階調（色の明るさの段階）の特性を示す値である。
以下の計算式で表すことができる。

````math
出力 = (入力)^{\frac{1}{γ}}
````


## γ補正
ディスプレイの特性のよって、画像が暗く見えてしまったりするので、γ値を調整して、元々の画像に近いが明るさを調整する方法

## 補正で明るさを調整してみる
RGBそれぞれ、0から255までの値なので

````math
出力 = 255\times(入力 \div 255)^{\frac{1}{γ}}
````

でγ値を変更数することで明るさを調整してみます。


以下がそのサンプルです。

````gamma.html
<!DOCTYPE html>
<html>
<head>
<title>γ補正</title>
<script type="text/javascript">
window.onload = function() {
    var gamma = 10;
    var canvas = document.getElementById("c1");
    var ctx = canvas.getContext("2d");
    var img = new Image();
    img.src = "test.jpg";
    img.onload = function() {
        ctx.drawImage(img, 0, 0);
        var src = ctx.getImageData(0, 0, canvas.width, canvas.height);
        var dst = ctx.createImageData(canvas.width, canvas.height);

        for (var i = 0; i < src.data.length; i=i+4) {
            dst.data[i]   = ~~(255 * Math.pow((src.data[i] / 255), 1 / gamma));    //R
            dst.data[i+1] = ~~(255 * Math.pow((src.data[i+1] / 255), 1 / gamma));  //G
            dst.data[i+2] = ~~(255 * Math.pow((src.data[i+2] / 255), 1 / gamma));  //B
            dst.data[i+3] = src.data[i+3];    //A
        }

        ctx.putImageData(dst, 0, 0);
    };
};
</script>
</head>
<body>
  <canvas id="c1" width="300" height="300">
</body>
</html>
````

下記がγ値が2のときです。オリジナルの画像とならべてます。
![gamma1.png](https://qiita-image-store.s3.amazonaws.com/0/4044/d427c89c-6221-51d5-07b8-eed9f690390f.png "gamma1.png")

下記がγ値が5のときです。

![gama2.png](https://qiita-image-store.s3.amazonaws.com/0/4044/7346d9b5-9f76-d8a9-29d1-63934483abd1.png "gama2.png")

(理解が浅いのでなにか不正確なところがありましたら、コメントや編集リクエストお願いします。)
Excel VBA 奮闘記 カレンダー(Write Only Code)

ほとんど書捨て(Write Only)に近いけれどカレンダーらしきものを書いた。
かなり完成度は低い(-＿-；)

実行結果
![cal.PNG](https://qiita-image-store.s3.amazonaws.com/0/36817/dc145ee4-49bd-a767-ded8-ad3a3e34a1e0.png)


```vbnet
Option Explicit

Dim dt As Date
Dim last As Integer
Const start_day As Integer = 1
Const limit As Integer = 8

Private Static Sub main()
    
    Dim tmp As Range
    Set tmp = Worksheets(Me.name).Range("A1")
    Dim remain As Integer

    remain = 0

    Call init
    Call this_month_end

    remain = print_week(tmp, 1, first_weekday(), limit - first_weekday(), 0)
    remain = print_week(tmp, 3, vbSunday, vbSaturday, remain)
    remain = print_week(tmp, 5, vbSunday, vbSaturday, remain)
    remain = print_week(tmp, 7, vbSunday, vbSaturday, remain)
    remain = print_week(tmp, 9, vbSunday, vbSaturday, remain)
   
End Sub

Private Sub init()
    dt = 0
    last = 0

End Sub

Private Sub this_month_end()
    Const pre As Double = -1
    ' 次月の末日
    dt = DateSerial(Year(Date), Month(Date) + 1, start_day)
    ' 今月の月末の日付
    dt = DateAdd("d", pre, dt)
    ' 日のみ抽出
    last = day(dt)
End Sub

Function first_weekday() As Integer
    Dim wk As Date

    ' 月初の曜日取得
    wk = DateSerial(Year(Date), Month(Date), start_day)

    ' 日のみ抽出して返す
    first_weekday = Weekday(wk)
    
End Function

' 第n週を表示
Function print_week(ByVal place As Range, ByVal row_step As Integer, ByRef start_pos As Integer, ByRef end_pos As Integer, ByVal day_val As Integer) As Integer
    Dim i As Integer
    Dim day_remain As Integer

    day_remain = day_val

    i = 0
    Do While i < end_pos
        place(row_step, start_pos + i).Value = incr(day_remain)
        i = i + 1
    Loop

     print_week = day_remain

End Function

' 値のインクリメント
Function incr(ByRef dd As Integer)
    dd = dd + 1
    
    If dd > last Then
        Exit Function
    End If

    incr = dd
End Function
```
elementとwindowサイズの取得

## サイズの取得
![window_size.png](https://qiita-image-store.s3.amazonaws.com/0/46169/54841e8e-2f72-8053-f783-4fba3edd1081.png){: style=”width: 200px; vertical-align:middle;”}

[offsetTop](https://developer.mozilla.org/ja/docs/Web/API/element.offsetTop)：要素が始まる場所と上の要素の位置

[offsetHeight](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.offsetHeight)：指定した要素の高さ

[document.body.scrollTop](https://developer.mozilla.org/en-US/docs/Web/API/Element.scrollTop)：windowのtopから、要素のtopまでの位置

[window.innerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window.innerHeight)：ウィンドウの高さ

## getBoundingClientRect

![getBoundingClientRect.png](https://qiita-image-store.s3.amazonaws.com/0/46169/92cdc766-7791-380f-b08b-82468e689680.png)

[getBoundingClientRect(This is an experimental technology)](https://developer.mozilla.org/en-US/docs/Web/API/range.getBoundingClientRect)

```js:example
$('div')[1].getBoundingClientRect()
ClientRect {height: 1338, width: 320, left: 0, bottom: 1241, right: 320…}
bottom: 1241
height: 1338
left: 0
right: 320
top: -97
width: 320
```
xcode6+swiftでtwitterアプリ作成


## 関連資料

[作成ソース](https://github.com/kilhyungdoo/swift-twitter-app/tree/add-social-framework)
[SLComposeViewControllerドキュメント](https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Reference/SLComposeViewController_Class/index.html#//apple_ref/c/tdef/SLComposeViewControllerResult)


## UI(Main.storyboard)

シンプルにtextviweとbuttonを利用して作成しました。

![スクリーンショット_2014_07_06_17_33.png](https://qiita-image-store.s3.amazonaws.com/0/46268/ccc7da4d-2d68-e93b-19b4-e13f5575c1bf.png "スクリーンショット_2014_07_06_17_33.png")

```swift
@IBOutlet var twitter_content: UITextView //入力フォーム
@IBAction func twitter_btn(sender: AnyObject) // ボタン
```

## 処理内容(viewController.swift)

+ 使用フレームワークをインポートする

```swift
import UIKit
import QuartzCore
import Social
```

UIKit: テキスト入力フォームやボタン実装
QuartzCore: テキストフォームのスタイルを調整
Social: twitterに投稿

[xcodeにiosフレームワークを追加する方法はこちら>>](http://qiita.com/kilhyungdoo/items/93662c81751b669b1e3d)

+ viewDidLoad()にtextviewのスタイル設定

枠線表示と太さ

```swift
twitter_content.layer.borderWidth = 0.5
```

枠線の角を丸く

```swift
twitter_content.layer.cornerRadius = 3
```

枠線の色

```swift
twitter_content.layer.borderColor = UIColor.lightGrayColor().CGColor
```

+ twitterボタンがクリックされた場合のアクション(func twitter_btn)

twitter機能が使えるか

```swift
if SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter) {
```

twitter用ソーシャル構成ビューコントローラオブジェクトを生成する

```swift
    var composectl:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter)     
```

textviewに入力した値をソーシャル構成ビューコントローラオブジェクトに設定

```swift
    composectl.setInitialText(twitter_content.text)
```

twitter投稿した時に呼ばれるハンドラ設定
投稿結果(SLComposeViewControllerResult)をパラメータで渡してDoneボタン、Cancelボタンが押された場合にログを出力する。

```swift
    composectl.completionHandler = {
        (result:SLComposeViewControllerResult) -> () in
            switch (result) {
                case SLComposeViewControllerResult.Done:
                    println("SLComposeViewControllerResult.Done")
                case SLComposeViewControllerResult.Cancelled:
                    println("SLComposeViewControllerResult.Cancelled")
            }
        }
```

twitterモーダルを表示する

```swift
        self.presentViewController(composectl, animated: true, completion: nil
```


## 補足

実行前、シミュレータの設定からtwitter認証を行う必要があります。
しかし、IOS8シミュレータにまだ認証機能が対応していないか不具合かは判断できないが認証が正しく行えません。対応策を知っている方、教えてください！！
進捗どうですか? - 時間のかかる処理の進捗を確認

## `pv` を使ってパイプ中を流れたデータ量を確認する

`pv` を使えば、パイプをどれだけのデータが流れたのかを確認することができる。

```shell-session:pvでデータ量を確認
$ cat 1024MB.img | pv | gzip > 1024MB.img.gz
22.2MB 0:00:08 [2.78MB/s] [       <=>                                          ]
```

`-s` オプションでデータ量の指定も可能。

```shell-session:-sオプションでデータ量(1024m)を指定
$ cat 1024MB.img | pv -s 1024m | gzip > 1024MB.img.gz
25.1MB 0:00:09 [2.78MB/s] [>                                   ]  2% ETA 0:05:58
```

`pv` の引数としてファイルを指定すれば、 `pv` 自体が `cat` のように振る舞い、データ量なども自動的に設定してくれる。

```shell-session:pvをcatのように利用
$ pv 1024MB.img | gzip > 1024MB.img.gz
32.2MB 0:00:12 [2.67MB/s] [>                                   ]  3% ETA 0:06:09
```

複数の `pv` に名前をつけて、同時に利用することも可能。

```shell-session:source,gzipという名前つきのpvを組み合わせて実行
$ pv -cN source 1024MB.img | gzip | pv -cN gzip > 1024MB.img.gzip
   source:  118MB 0:00:02 [85.9MB/s] [=>                       ] 11% ETA 0:00:15
     gzip: 30.9MB 0:00:02 [4.46MB/s] [ <=>                                     ]
```

### 参考文献

* `man pv`
* [A Unix Utility You Should Know About: Pipe Viewer](http://www.catonmat.net/blog/unix-utilities-pipe-viewer/)



## `dd` の進捗状況を確認

まず `dd` を実行する。

```shell-session:ddを実行
# dd if=FILE1 of=FILE2
```

続いて、別のターミナルで `pkill -USR1 dd` を実行する。

```shell-session:別ターミナルでpkillを実行
# pkill -USR1 dd
```

すると、 `dd` を実行していたターミナルに進捗状況が表示される。

```shell-session:ddを実行したターミナルに進捗状況が表示される
# dd if=FILE1 of=FILE2
22628489+0 レコード入力
22628489+0 レコード出力
23171572736 バイト (23 GB) コピーされました、 5.8137 秒、 4.0 GB/秒
```

`watch` と組み合わせれば、定期的に進捗状況を表示させることもできる。

```shell-session:watchを使って1秒ごとにpkillする
# watch -n 1 pkill -USR1 dd
```

### 参考文献

* `man dd`
PythonでUI Automation

PythonでWindowsのGUI操作を自動化するのにUI Automationを使ってみる。
UI Automationは.NET版とCOM版があるが、CPythonから使いたいので、COM版で。
とりあえず、呼び出し方を調べたのでメモ。

## UI Automationって？
UI Automationのススメ
http://blogs.msdn.com/b/japan_platform_sdkwindows_sdk_support_team_blog/archive/2011/05/26/ui-automation.aspx

UI Automation
http://msdn.microsoft.com/en-us/library/ee684009.aspx

## 前準備
まず、pip で comtypesを入れて、

```
pip install comtypes
```

次に、UI Automationのラッパーを生成しておく。

```py
import comtypes
from comtypes.client import GetModule
GetModule('UIAutomationCore.dll')
```

Lib\site-packages\comtypes\gen にラッパーモジュールが生成される。
あとは UI Automation の MSDNリファレンスと _944DE083_8FB8_45CF_BCB7_C477ACB2F897_0_1_0.py を見比べて使い方を調べる。
（環境によってファイル名は違う場合があるかも）

## UI Automationオブジェクトの取得
comtypes.gen.UIAutomationClientをインポートし、UI Automationオブジェクトを取得してあれこれする。

```py
from comtypes.gen.UIAutomationClient import *
uia = CoCreateInstance(CUIAutomation._reg_clsid_,interface=IUIAutomation,clsctx=CLSCTX_INPROC_SERVER)

re = uia.GetRootElement()  # デスクトップの最上位要素の取得
print re.CurrentName       # 'デスクトップ'
```

## 電卓の例
UI Automation 経由で電卓(calc.exe)にアクセスしてみる。
上からの続きで。

```py
import subprocess
calc = subprocess.Popen('calc.exe')    # 電卓起動
# pid指定でデスクトップの子要素から電卓を特定
cond = uia.CreatePropertyCondition(UIA_ProcessIdPropertyId, calc.pid)
calc_win = re.FindFirst(TreeScope_Children, cond)
print calc_win.CurrentName    # '電卓'
```


とりあえず、今回はここまで。
GUI操作の自動化までたどり着いてないので、次回に続く、かも。
nsenterでコンテナに接続するのに便利なコマンド

[docker - Failed to get D-Bus connection: No connection to service manager.の対処 - Qiita](http://qiita.com/tukiyo3/items/b24e4dc62de59d4a7570)

# nsenterとは

* nsenterを使えば`docker run`した後にそのコンテナにattachして他のプログラムを起動できる。
* なお、コンテナが`stop`状態ではPidが0なので接続出来ない。

# やり方

```bash:コンテナIDを確認
# docker ps -a
CONTAINER ID        IMAGE             
7c50b96fccd0        tukiyo3/centos7-ja
```

* 直近のは`docker ps -q`でもわかる

```bash:コンテナのPidを調べる
# docker inspect 7 | grep -i pid
        "Pid": 9240,
```

```bash:接続してbash起動
# nsenter -t 9240 -m -u -i -n -p -- /bin/bash
```

```bash:nsenter
/bin/bash
bash-4.2# pwd
/
bash-4.2# exit
```

# .bashrcに書くと便利

```bash:Pid取得
docker inspect $(d ps -q) | awk '/Pid/{print int($2)}'
```

```bash:上記をalias設定
alias dpid='docker inspect $(d ps -q) | awk "/Pid/{print int(\$2)}"'
```

```bash:aliasを使って接続
nsenter -t $(dpid) -m -u -i -n -p -- /bin/bash
```

```bash:コマンド一つで接続したい場合
$ alias nconnect='sudo nsenter -t $(dpid) -m -u -i -n -p -- /bin/bash'
$ nconnect
bash-4.2#
```

# サクッとnsenterで接続したい

```bash:
nsconnect() {
    DOCKER_PID=$(docker inspect --format '{{.State.Pid}}' $(docker ps -ql))
    sudo nsenter -t ${DOCKER_PID} -m -u -i -n -p /bin/sh
}
```
ntfsclone を使ったNTFSパーティションの効率的なバックアップとリストア

## はじめに

* `ntfsprogs` パッケージに含まれているツール `ntfsclone` を使い、特殊イメージ型式でイメージファイルを保存することで、NTFSパーティションを効率的にバックアップすることができる。
* 特殊イメージ型式 (special image format) とは、未使用のディスク領域を専用の制御コードで圧縮した型式のこと。特殊イメージ型式を利用すれば、 `gzip` などによる圧縮を行わなくても、イメージファイルをある程度圧縮することができる。
* ただし特殊イメージ型式のファイルは、そのままではマウントできず、あらかじめ通常 (?) の型式に復元する必要がある。

## 使い方

(あらかじめ `apt` などで `ntfsprogs` パッケージをインストールしておく。)

### `/dev/sda1` を特殊イメージ型式のファイル `ntfs_special.img` に保存

```
# ntfsclone --save-image --output ntfs_special.img /dev/sda1
```

### 特殊イメージ型式のファイル `ntfs_special.img` を `/dev/sda1` に復元

```
# ntfsclone --restore-image --overwrite /dev/sda1 ntfs_special.img
```

### 特殊イメージ型式のファイル `ntfs_special.img` を通常 (?) の型式のファイル `ntfs.img` に展開してマウントする

```
# ntfsclone --restore-image --output ntfs.img ntfs_special.img
# mount -t ntfs -o loop ntfs.img
```

## 参考文献
* [ntfsclone - NTFS のクローン作成、イメージ作成、復元、またはレスキュー](http://docs.oracle.com/cd/E26924_01/html/E29114/ntfsclone-1m.html)
【Angular】jsonを受け取りたいとき


こんな感じ。

```angular.js
function Ctrl($scope,$http){
  var jsonUrl = "./data.json";
  $http({method: "GET", url: jsonUrl}).success(function(data,status){
    console.log(data);
  });
});
```

- [angularjs](https://docs.angularjs.org/api/ng/service/$http#get)
【PHP】日付比較


いつも忘れちゃうのでメモ。

```php:date.php
$today = date("Y/m/d");
$target_day = "2014/06/10";
if(strtotime($today) === strtotime($target_day)){
  echo "ターゲット日付は今日です";
}else if(strtotime($today) > strtotime($target_day)){
  echo "ターゲット日付は過去です";
}else{
  echo "ターゲット日付は未来です";
}
```
【WordPress】データベースアクセス方法


##値を取得(一行)
```php:hoge.php
$wpdb->get_row("SELECT * FROM table WHERE key = 'value' AND key = 'value'");
```

##値を取得(すべて)
```php:hoge.php
$wpdb->get_results("SELECT * FROM table WHERE key = 'value' AND key = 'value'");
```

##値を更新
```php:hoge.php
$wpdb->get_results( "UPDATE table SET key = key+1 WHERE key = 'value' AND key = 'value'" );
```

##値を追加
```php:hoge.php
$wpdb->insert( 'table', array( 'key' => 'value', 'key' => 'value', 'meta_value' => value ), array( '%s', '%s', '%d' ) );

// %s -> (文字列)
// %d -> (文字列)
// %f -> (浮動小数点数)
```
【WordPress】アドバンスカスタムフィールドでチェックボックスなどの複数の値を検索するとき


コード

```php:hoge.php
foreach($borrow as $val){
  $borrow_set = array(
    'key' => 'search_0_borrow',
    'value' => '"'.$val.'"',
    'compare' => 'LIKE'
  );
}

if (count($borrow) > 1) {$borrow_set['relation'] = 'AND';}
```
複数の値はDBにa:3:{i:0;s:1:”1”;i:1;s:3:”155”;i:2;s:3:”156”;}こんな感じで送られてしまうらしい。
```'compare' => 'LIKE'```でキーワード検索をかけるといいみたい。
値が複数の時はANDを追加する。

- [Advanced Custom Fieldsプラグインを使う際の注意点など](http://notnil-creative.com/blog/archives/1752)
【jQuery】attrでcheckedが効かない時の対処法


これだとだめONにできない

```jquery.js
$('#checkbox').attr('checked', true); // ON にする
$('#checkbox').attr('checked', false); // OFF にする
```

propを使うとできる

```jquery.js
$('#checkbox').prop('checked', true); // ON にする
$('#checkbox').prop('checked', false); // OFF にする
```
【PHP】配列で重複しているもの意外を取り出す方法


こんな感じ

```php:hoge.php
$arr = array('hoge', 1, 'hoge', 3, 'fuga', 1, 'piyo', 2, 'piyo');
$cnt_list = array_count_values($arr);
foreach($cnt_list as $key => $val){
  if($val == 1){
    $result[] = $key;
  }
}
print_r($result);//$result => 3, fuga, 2
```

- [【PHP】配列から、値が重複していないものだけを取り出す](http://d.hatena.ne.jp/sutara_lumpur/20101023/1287850145)