OmniAICreator/Qiita-1.07M huggingface dataset:
シェルスクリプトで二重起動防止

## キック用

```bash:kick_allalone.sh
#!/bin/sh

for i in `seq 1 10`
do
    echo -n "[`date '+%Y/%m/%d %T'`] $i kick allalone.sh"
    sh ./allalone.sh &
    sleep 1
done
```

## スクリプト

```bash:allalone.sh
#!/bin/sh

# 自身が起動していたら終了
if [ $$ != `pgrep -fo $0`  ]; then
    echo "[`date '+%Y/%m/%d %T'`] myself is already running. exit myself."
    exit 1
fi

# debug code
echo "[`date '+%Y/%m/%d %T'`] hoge 1st"
sleep 3
exit 0
```

## 実行結果

```shell-session
ekaneko@bibian ~/work/allalone % sh kick_allalone.sh 
[2014/05/29 15:11:55] 1 kick allalone.sh[2014/05/29 15:11:55] hoge 1st
[2014/05/29 15:11:56] 2 kick allalone.sh[2014/05/29 15:11:56] myself is already running. exit myself.
[2014/05/29 15:11:57] 3 kick allalone.sh[2014/05/29 15:11:57] myself is already running. exit myself.
[2014/05/29 15:11:58] 4 kick allalone.sh[2014/05/29 15:11:58] hoge 1st
[2014/05/29 15:11:59] 5 kick allalone.sh[2014/05/29 15:11:59] myself is already running. exit myself.
[2014/05/29 15:12:00] 6 kick allalone.sh[2014/05/29 15:12:00] myself is already running. exit myself.
[2014/05/29 15:12:01] 7 kick allalone.sh[2014/05/29 15:12:01] hoge 1st
[2014/05/29 15:12:02] 8 kick allalone.sh[2014/05/29 15:12:02] myself is already running. exit myself.
[2014/05/29 15:12:03] 9 kick allalone.sh[2014/05/29 15:12:03] myself is already running. exit myself.
[2014/05/29 15:12:04] 10 kick allalone.sh[2014/05/29 15:12:04] hoge 1st
ekaneko@bibian ~/work/allalone % 
```

### 解説

忙しくて泣いてる時に同僚にお願いして作ってもらいました。
どこにでもあるコードだそうです。
かなり重い処理をcronで定期的に起動してる場合、終わらないのに起動しちゃうなんて事を防げます。
お陰で考慮しなきゃいけない大きな事項が一つ減らせたので大変助かりました。
メインのスクリプトに仕込むのではなく、メインスクリプトの起動用スクリプトに仕込むと汎用性が上がります。
IUSのPHP5.5をEPELのApache2.4用にSRPMからビルドした

動作環境は Amazon Linux 上の httpd24 (+ httpd24-devel)を想定。
目的は--enable-fds-setsizeの値を変更したビルドを利用するため。

使用したSRPMは IUS の
php55u-5.5.12-1.ius.centos6.src.rpm

IUS のRPMとEPELのRPMを無理やり混在させているので.rpmmacrosで帳尻を合わせる。

```
$ cat ~/.rpmmacros
%dist .centos6
```

EPELのhttpd24を導入

```
# rpm -e apr-util apr apr-devel httpd httpd-devel httpd-tools apr-util-ldap apr-util-devel
# curl -s http://repos.fedorapeople.org/repos/jkaluza/httpd24/epel-httpd24.repo > /etc/yum.repos.d/epel-httpd24.repo
# yum install -y httpd24-httpd-devel
```

rpmbuildするときにPKG_CONFIG_PATHも調整が必要

```
export PKG_CONFIG_PATH=/opt/rh/httpd24/root/usr/lib64/pkgconfig
```

EPEL+IUSという特殊な組み合わせのため、試行錯誤して生まれたpatch が↓のとおり
(動的に値を取得しているところを直書きにしているのは単なる手抜き)

```patch:php55u-spec.patch
--- php55u.spec.orig	2014-05-23 07:18:03.606275541 +0000
+++ php55u.spec	2014-05-23 08:06:17.001012367 +0000
@@ -35,8 +35,8 @@
 %endif

 # /usr/sbin/apsx with httpd < 2.4 and defined as /usr/bin/apxs with httpd >= 2.4
-%{!?_httpd_apxs:       %{expand: %%global _httpd_apxs       %%{_sbindir}/apxs}}
-%{!?_httpd_mmn:        %{expand: %%global _httpd_mmn        %%(cat %{_includedir}/httpd/.mmn 2>/dev/null || echo missing-httpd-devel)}}
+%{!?_httpd_apxs:       %{expand: %%global _httpd_apxs       /opt/rh/httpd24/root/usr/bin/apxs}}
+%{!?_httpd_mmn:        %{expand: %%global _httpd_mmn        20120211x86-64}}
 %{!?_httpd_confdir:    %{expand: %%global _httpd_confdir    %%{_sysconfdir}/httpd/conf.d}}
 # /etc/httpd/conf.d with httpd < 2.4 and defined as /etc/httpd/conf.modules.d with httpd >= 2.4
 %{!?_httpd_modconfdir: %{expand: %%global _httpd_modconfdir %%{_sysconfdir}/httpd/conf.d}}
@@ -123,7 +123,7 @@
 Patch47: php-5.4.9-phpinfo.patch

 BuildRequires: bzip2-devel, curl-devel >= 7.9
-BuildRequires: httpd-devel >= 2.0.46-1, pam-devel
+BuildRequires: httpd24-httpd-devel >= 2.4, pam-devel
 BuildRequires: libstdc++-devel, openssl-devel
 BuildRequires: sqlite-devel >= 3.6.0
 BuildRequires: zlib-devel, smtpdaemon, libedit-devel
@@ -1020,6 +1020,7 @@

 ln -sf ../configure
 %configure \
+    --enable-fd-setsize=32767 \
     --cache-file=../config.cache \
     --with-libdir=%{_lib} \
     --with-config-file-path=%{_sysconfdir} \
```
Browserify: それはrequire()を使うための魔法の杖


JavaScript界のハリーポッターこと「[Browserify](http://browserify.org/)」が最近元気ですね。Node.js的な `var myModule = require('myModule')`式の記述が、ブラウザのスクリプトでも使えるようになって、ついでに1ファイルにまとめるのもやってくれるツールです。ポスト[RequireJS](http://requirejs.org/)として期待されています。

ただ、[公式ドキュメント](https://github.com/substack/node-browserify#usage)がコマンドラインの説明に重点を置いていて、最初これだけだといまいち分かりにくい...。そこで、実際の開発で使いやすいように、ビルドツール([gulp.js](http://gulpjs.com/))から実行するための最小構成を作ってみようかと思います。(Gruntでも同様のことは可能です)

![Google Chrome.png](https://qiita-image-store.s3.amazonaws.com/0/1858/040d9cfd-d1e1-d280-292f-c5360c3db246.png "Google Chrome.png")


## require!: Bowerも使えます

対象のスクリプトの中身は、例えばこんな感じ。この例では、ModernizrとjQueryと、独自スクリプトを組み込んでいます。外部ファイルを指定するだけでなく、このファイル自体にスクリプトを追記しても構いません。[Debowerify](https://github.com/eugeneware/debowerify)(というBrowserifyのプラグイン)を使うと、npmだけじゃなくて **bower経由のものも扱える** ようになります。←これ重要!

```coffeescript
Modernizr = require 'browsernizr' # npm経由
$ = require 'jquery' # bower経由
require './yourscript' # サイト用のスクリプト

# ここに書き足してもOK
console.log 'This page is ' + $('H1').text()
```

RequireJSみたいに、独自のDSL的な記述を覚える必要はなく、Node使いにはおなじみの`require()`を書くだけです。依存関係は、npm(`package.json`)と bower(`bower.json`)に記述しておけばOK。とにかく、簡単...というか、無理がありません。


## gulpの最小構成に挑戦!

`gulpfile`をシンプルに書こうとすると、こんなところかと。gulpの場合、プラグインではなく、このように直接利用することが推奨されています。`bundle()` の結果は `vinyl` 経由でgulpに渡すことが可能です。

```coffeescript
gulp = require 'gulp'

browserify = require 'browserify'
source = require 'vinyl-source-stream'

gulp.task 'script', ->
  browserify
    entries: ['./js/src/main.coffee']
    extensions: ['.coffee'] # CoffeeScriptも使えるように
  .bundle()
  .pipe source 'main.js' # 出力ファイル名を指定
  .pipe gulp.dest "./js/" # 出力ディレクトリを指定
```

※[watchfy](https://github.com/substack/watchify)を使うとファイル監視もできますが、若干長くなるのでここでは割愛します。


## 設定ファイル

Browserifyのプラグインは、`package.json` に設定できます。`devDependencies`と合わせて記述します。

```json
{
  <略>
  "browserify": {
    "transform": [
      "coffeeify",
      "debowerify"
    ]
  },
  "devDependencies": {
    "coffee-script": "*",
    "vinyl-source-stream": "*",
    "gulp": "*",
    "bower": "*",
    "browserify": "*",
    "coffeeify": "*",
    "debowerify": "*",
    "browsernizr": "*"
  }
}
```

`bower.json` に利用したいモジュールを記述します。

```json
{
  <略>
  "dependencies": {
    "jquery": "*"
  }
}
```


## インストールと実行

事前に、gulp・bowerはグローバルにインストール。

```bash
$ npm install && bower install
```

で、まず必要なモジュールをインストールしておきます。その後は、

```bash
$ gulp script
```

とすれば、Browserifyが呼び出しているモジュールを含めて、1ファイルにまとめ上げてくれます。超絶便利。


## まとめ: 使おう。

今まで、RequireJSを小規模プロジェクトで使わない理由はただひとつ、 **メンドクサかった**から。Browserifyなら、最小限の設定と学習コストで使い始められます。これからは、ブラウザでJavaScript使うときもちゃんと依存関係を管理しようと心に誓った次第です。

RequireJS以外にも、今後の動向が気になるものとして[Component](https://github.com/component/component)もありますが、今の段階だとエコシステムが出来るか不透明という印象を持ちます(Componentは新しいリポジトリシステム自体を作ろうとしています)。その点、npmやBowerがそのまま使える Browserify は今後も人気を延ばしそうですね。


## 補足: グローバルインストールは不要です

[公式サイト](http://browserify.org/)に行くと、

```bash
$ npm install -g browserify
$ browserify main.js -o bundle.js
```

と書かれています。たしかに、これで簡単に動作を試せるのですが、gulp(あるいはgrunt)と使うのであればこのインストールは不要です。プロジェクトの中で使うには、単独ツールではなく、ビルドツールに組み込むほうが使いやすいはず。たぶん。
シェルスクリプトでログローテート

## logrotate を使って下さい

yumでインストールして使って下さい。お願いします。
存在を知らなかったので作っちゃいました。
機能的にはだいたい同じです。

- 再帰的にディレクトリを潜って処理する
- 引数で開始ディレクトリを指定可能
- 引数なしはカレントディレクトリ
- 7日以前の圧縮ファイルは削除

## キック用（cron）

```bash:cron_logrotate
58 23 * * * ekaneko /bin/bash /var/log/hoge_logs/logrotate.sh
```

## スクリプト

```bash:logrotate.sh
#!/bin/bash
#
# ログローテート
#
cd `dirname $0`
# DIR_BASE='/var/log/hoge_logs'
DIR_BASE=`pwd`
# 翌日に実行する場合
# SUFFIX_DATE=`date +%Y%m%d --date '1 day ago'`
# 当日に実行する場合
SUFFIX_DATE=`date +%Y%m%d`
MYSELF_SH=$0

# 引数検査
if [ $# -ge 1 ];
then
    DIR_BASE=$1
    if [ ! -d $DIR_BASE ];
    then
        echo "if require arg1, use only directory."
        exit 1
    fi
fi

# ファイルリスト配列作成
unset ArrayFiles;
unset ArrayDirs;
for LINE in `ls -1 ${DIR_BASE} 2> /dev/null`;
do
    if [ -d $DIR_BASE/$LINE ];
    then
        # ディレクトリの場合
        ArrayDirs+=($LINE)
    else
        # if expr "aaa.log" : ".*\.log$" > /dev/null ; then echo "hit"; fi
        if expr $LINE : ".*\.log$" > /dev/null ;
        then
            # ファイルの場合
            ArrayFiles+=($LINE)
        fi
    fi
done
unset LINE;

for el in ${ArrayFiles[@]};
do
    # ログファイルサイズ0の場合は削除する
    if [ ! -s $el ];
    then
        rm $el >& /dev/null
        continue
    fi

    # ローテーション
    cp ${el} ${el}.${SUFFIX_DATE}
    cp /dev/null ${el}
    gzip -9 ${el}.${SUFFIX_DATE}

    # 圧縮ディレクトリに移動
    DestinationstDir=$DIR_BASE/arc
    if [ ! -d $DestinationstDir ];
    then
        mkdir -p $DestinationstDir
    fi
    mv ${el}.${SUFFIX_DATE}.gz $DestinationstDir
done

# 圧縮ディレクトリの古いファイルを削除
# + 7日以前の圧縮ファイルを削除
pushd $DIR_BASE/arc >& /dev/null
for l in `find ./*.gz -mtime +7`;
do
    if [ -f $l ];
    then
        rm -f $l >& /dev/null
    fi
done
popd >& /dev/null

# サブディレクトリがある場合は再帰的に処理を行う
for el in ${ArrayDirs[@]}; do
    eval "sh $MYSELF_SH $DIR_BASE/$el"
done

exit 0
```

### 困ったこと

ある日ログディレクトリを見ると、このスクリプトファイルが消えていました。
不思議に思いながら再度設置。
翌日確認するとまた消えていました。
xx日以前のファイル削除で拡張子を指定してませんでした。
なんとなく可愛いなコイツって思いました。
他社のコーディングガイドを見る-参考にしたコーディングガイド


今回コーディングガイドを制作するにあたって参考にしたサイトを列挙します。

- [コーディング ガイドライン](http://www.2hmc.com/guideline/)
- [HTML・CSSコーディングガイドライン | d-spica | Web標準準拠のホームページ制作・ウェブサイト制作・Webデザイン](http://www.d-spica.com/document/coding-regulation.html)
- [HTML/XHTMLマークアップ・CSSコーディングガイドライン | enoq(エノーク)](http://enoq.jp/guideline/#guideline-03)
- [コーディングガイドライン - coding lab (コーディング・ラボ)](http://coding-laboratory.com/guideline/index.html)
- [コーディングガイドライン | フリーランス Webデザイン＆WordPress スタイルリンク（東京都中央区日本橋）](http://www.stylelink.net/service/service02.html)
- [HTML関連ルール | HTML & CSS コーディングガイドライン ver.0.9](http://www.sync-d.jp/guideline/coding/html.html)
- [PCサイトガイドライン | moag コーディングガイドライン](http://guideline.moag.co.jp/pc/index.html)


で、これらを参考にして作ったコーディング規約（草案）
[coding-guideline](https://github.com/mrd-takahashi/coding-guideline)
Gitを2.0にupdate　(on OSX)

Git2.0がリリースされました。brewには早くも2.0.0の　Formulaが上がっています。

http://lkml.iu.edu/hypermail/linux/kernel/1405.3/02592.html

brewをupdate。2.0.0が上がっていることを確認。

```
$brew update
$brew versions git
```

```
$brew versions git
Warning: brew-versions is unsupported and may be removed soon.
Please use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions
d2.0.0    git checkout e2e2236 /usr/local/Library/Formula/git.rb
```

brew upgradeでgitを2.0.0へ

```
$brew upgrade git
```

versionを確認

```
$/usr/local/bin/git --version                                                                                                          ruby-2.1.0
git version 2.0.0
```

PATHが通って、`/usr/local/bin/` が優先されていれば、git でok.
bashからzshに乗り換えの手順

# 前置き
Macのリカバリの際、以前より気になっていたbashからzshへの乗り換えを実施してみたので、そのメモ。

## zshの特徴
[Z Shell-Wikipedia](http://ja.wikipedia.org/wiki/Zsh)より引用
> - ユーザーの起動している全ての zsh でコマンド履歴を共有することができる。
> - 様々な互換モードがある。例えば、zshをshとして実行したとき、bashの振りをするようにできる。
> - 殆ど全部のカスタマイズが可能。
> - プロンプトテーマ

個人的にはプロンプトテーマが一番大きいかも。

# インストール方法
Mac標準でも入っているらしいが、バージョンが古いのでHomeBrewで最新版をインストール。

`$ brew install --disable-etcdir zsh`

HomeBrew経由のzshパスを追加。
`$ sudo vi /etc/shells`

```vim
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh #ここに追加
````

# oh-my-zshをインストール
zshに切り替えてみて、gitコマンドが使えなくて困ってたところでoh-my-zshの存在を知ったので使ってみたら、使い勝手が良いのでこちらを利用。

## oh-my-zshとは？
githubの[robbyrussell/oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)で管理されているzshを管理するフレームワーク。

### 特徴

- 豊富な[プロンプトテーマ](https://github.com/robbyrussell/oh-my-zsh/wiki/themes)
- 便利なプラグイン
- 自動アップデート機能

というわけで、便利且つデザイン面でもメリットは高そうなのでインスール。

## インストール手順

[oh-my-zsh / README.textile](https://github.com/robbyrussell/oh-my-zsh/blob/master/README.textile)の「The manual way」に記載されてるが・・・

`.oh-my-zsh`にレポジトリをclone。
`git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh`

すでに既存の`~/.zshrc`があると思うので、一応バックアップ。
`cp ~/.zshrc ~/.zshrc.orig`

テンプレートをコピーして`~/.zshrc`に上書き。
`cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc`

zshへ切り替えで完了。
`chsh -s /usr/local/bin/zsh`

### テーマの編集
デフォルトだと **robbyrussell** になっている。
![687474703a2f2f696d672e736b697463682e636f6d2f32303039313232382d71636b65336b75656e7036316377636e777163643732347072372e6a7067.jpeg](https://qiita-image-store.s3.amazonaws.com/0/26931/b81b64a1-34b3-23c0-dff0-f8cc31cdfba9.jpeg)
個人的にはあまり好きではないので、変更。

`$ vi ~/.zshrc` で`ZSH_THEME`箇所を修正。

```vim
# ZSH_THEME="robbyrussell"
ZSH_THEME="kolo" #ここに好きなthemeを
````

**kolo**はgitのbranch表示とか分かりやすかったのでこちらを選んでみました。
この辺はお好みで。
![687474703a2f2f692e696d6775722e636f6d2f62505a68642e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/26931/caff80ba-9778-38a5-e002-403ec9caad64.png)
zsh を再起動すると新しいテーマへ変更される。

## その他設定等

### プラグイン
デフォルトだとgitコマンドのみなので必要なプラグインを追加。
以下コマンドでプラグインの一覧を確認できる。
`$ ls ~/.oh-my-zsh/plugins/`

19行目あたりに記述がある。
`plugins=(git)`

ここを下記のように必要に応じてプラグインを追加。

```vim
# plugins=(git)
plugins=(git ruby python mysql) #こんな感じに変更
````

### 自動アップデート
githubから自動でpullしてくるように設定が可能

```vim
export DISABLE_AUTO_UPDATE="true" #ここをコメントアウト
````
Mac (Mavericks) に Angular.js + Node 用の Yoman, Grunt の環境を作る

# Mavericks に Node をインストール
from Mac(Mavericks)

```shell-session
$ brew install node
$ sudo brew postinstall node
```

# Node をアップデート

node のバージョンが 0.10.0 以下だと今後の処理で warnings が出るので、更新します。

```shell-session
$ node -v
---
v0.8.14
```

```shell-session
$ sudo npm cache clean -f
$ sudo npm install -g n
$ sudo n stable
$ node -v
---
v0.10.18
```

# Yeomanの設定

## インストール

```shell-session
$ sudo npm install -g yo grunt-cli bower generator-angular generator-karma
```

## ひな形検索

```shell-session
$ npm search yeoman-generator
```

ズラッと列挙されます。

## ひな形適応

webapp のところはひな形名

```shell-session
$ yo angular
```

# Bower

```shell-session
$ bower install jquery --save
```

# Angular.js テンプレートのインストール

```shell-session
$ yo angular
```

変なおっさん？みたいなのが出てきたり、色々質問されたりしますが、面倒臭がらずに正直に答えていくと、おっさんが色々よしなにしてくれます。

私は SASS はNO、他は全部YESにしました。

![Screen Shot 2014-05-28 at 7.59.01 PM.png](https://qiita-image-store.s3.amazonaws.com/0/18705/29d90433-1be7-3a62-6ed2-fb193b2426cf.png)

# Grunt サーバー起動

```shell-session
$ grunt server
```

すると、 http://127.0.0.1:9000/#/ でブラウザが開きます。

![Screen Shot 2014-05-28 at 9.26.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/18705/28205c43-bd1c-0181-ff98-12db66679636.png)

# 

# 参考

http://qiita.com/_shimizu/items/26589028ed3ea7e5b359
http://torub.github.io/blog/yeoman.html
Ruby スクリプトで Dir.chdir するとき

Ruby スクリプト内などで Dir.chdir を使うとカレントディレクトリを変更できますが、
カレントディレクトリの変更は影響が大きいので、なるべく副作用のないようにしたいです。
そういうときはブロックを渡せば、ブロックの処理が終わった際に自動的に元のディレクトリに戻ってくれます。

```ruby
Dir.chdir(dir) do
  # cd 先での処理を書く
end
```

~~まあ私自身は Dir.chdir はあまり使わない派なんですが……。~~

## 参考

* [singleton method Dir.chdir](http://docs.ruby-lang.org/ja/2.1.0/method/Dir/s/chdir.html)
CoffeeScriptで作ったNode.jsサーバーをforeverで起動する場合の指定

JavaScriptをforeverで起動する例

```
sudo forever start /home/pi/node-dht-sensor/sensor.js
sudo forever start /home/pi/webapp/app.js
```

CoffeeScriptをforeverで起動する例

```
sudo forever start -c coffee /home/pi/node-dht-sensor/sensor.coffee
sudo forever start -c coffee /home/pi/webapp/app.coffee
```
【プログラミング入門 - Ruby を使って - 】 練習問題 5 (メソッド)

[プログラミング入門　- Rubyを使って -](http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/Chapter=Contents.html)


練習問題5:

- 「怒ったボス」のプログラムを書いてみましょう。 まず、無作法に何が望みか聞いてきます。 で、何を答えようと「怒ったボス」はそれを叫び返して、あなたを首にします。 たとえば、もし給料上げてくださいとタイプしたとすると なにぃ? "給料上げてください" だとー!! おまえは首だ!! と、叫び返してきます。

- center, ljust, そして rjust を使ってもう少し何かやってみましょう。こんな感じの「目次」を表示する プログラムを書いてみてください。


```lang:filename
#怒ったボス
puts '何が望みだ...'
wish = gets.chomp
puts 'なにぃ?' + wish.to_s + 'だとー!!お前は首だ!!'

#目次
lineWidth = 40
puts '目　次'.center lineWidth
puts '1章: 数'.ljust(lineWidth/2) + 'p.1'.rjust(lineWidth/2)
puts '2章: 文字'.ljust(lineWidth/2) + 'p.72'.rjust(lineWidth/2)
puts '3章: 変数'.ljust(lineWidth/2) + 'p.118'.rjust(lineWidth/2)
```
Finderが-10810で死んだ

---
>アプリケーション Finder.app を開けません。
>-10810
---

西暦2014年5月29日 1:19(JST)それは起こった…。
僕のTLに流れてきた一筋の死亡報告！
動かない！Finderが…動かない！(ざわ…ざわ…)

FUCK YOU…ブチ殺すぞゴミめら…
おまえたちは皆…大きく見誤っている…
Macの実体が見えていない
まるで3歳か4歳の幼児のようにPCを自分中心…
求めれば…OSが自動修復してエラーを治してくれる…
そんなふうにまだ考えてやがるんだ臆面もなく…！
甘えを捨てろお前らの甘え…その最たるは
今起動したFinderだ…
クリックすれば起動するが当たり前か…？
なぜそんなふうに考える…？
バカがっ…！
とんでもない誤解だ…OSというものはとどのつまり…
肝心なことは何一つ修復したりしない
カーネルパニックにおけるセーフブート
ディスクの破損におけるディスクチェック
連中は何か肝心な修復をしたか…？
しちゃいな
((省略されました…全部読むにはMacを窓から投げ捨ててWindowsをインストールしてください…))

---

結論：finderの初期設定ファイルが破損しているようです。
```
cd ~/Library/Preferences/
sudo rm com.apple.finder.plist
```

おしまい。
finderの設定ファイルが消えるからなんか設定してた人はし直さないといけないんだけど、まぁ起動できないよりかはましだよねという話でした。
さくらVPSのCentOSでtomcatがうまく動かなかったのでメモ

タイトル通りだけど、CentOSでtomcatを動かそうとしたら起動しなかった。

- 環境
    - centOS: 6.5
    - tomcat: 7.0.33-3.el6

出力ログを見てたらこんななってたので、ググったら

```bash
$ cat/var/log/tomcat/tomcat-initd.log
/usr/sbin/tomcat: line 21: .: /etc/sysconfig/: is a directory
/usr/sbin/tomcat: line 34: /usr/share/tomcat/logs/catalina.out: Permission denied
```

同じエラーが見つかった
https://bugzilla.redhat.com/show_bug.cgi?id=1080195

スレッドの指摘通り、新しいバージョンを適用したら直った。

```bash
$ sudo yum update --enablerepo=epel-testing tomcat-7.0.33-4.el6
```

---

読むと面白いけどスクリプトの一部が

```bash
if [ -r "/etc/sysconfig/$NAME" ]; then
  . "/etc/sysconfig/$NAME"
fi
```

となっていて`$NAME`が空だったという。
意外と有名なプロジェクトでもひどいコードなんだなーと思った。

----
追記：

どうも全体的に品質が悪いようだ。
異常終了したのにlockファイルを残したままで、lockファイルがあるとrestart出来ない
手動で消す必要がある。

```bash
$ service tomcat status
PID file exists, but process is not running                [WARNING]
tomcat lockfile exists but process is not running          [FAILED]

$ rm /var/run/tomcat.pid
$ rm /var/lock/subsys/tomcat

$ service tomcat status
tomcat is stopped                                          [  OK  ]
```
【プログラミング入門 - Ruby を使って - 】 練習問題 4 (数と文字列)

[プログラミング入門　- Rubyを使って -](http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/Chapter=Contents.html)

練習問題4:

- 最初に姓、次に名前を聞いて、最後にフルネームに対してあいさつを するようなプログラムを書いてみましょう。
- 好きな数を入力してもらい、それに1を加えて、その結果を ベターな 数字として薦めるプログラムを書きましょう。 (機転の利いたサジェスチョンに努めましょう。)

```lang:4.rb
#最初に姓、次に名前を聞いて、最後にフルネームに対してあいさつ
puts '姓を教えて下さい'
last = gets.chomp
puts '名を教えて下さい'
first = gets.chomp

puts 'Hi, ' + last.to_s + first.to_s

#好きな数を入力してもらい、それに1を加えて、その結果を ベターな 数字として薦めるプログラム
puts '好きな数字を教えて下さい。'
num = gets.chomp
luckynum = num.to_i + 1

puts 'なるほどいい数字ですね。'
puts 'しかし、' + luckynum.to_s + ' があなたのラッキーナンバーのようです。'
```
Raspberry Piでmjpg-streamerを自動起動する

```sh:/etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

sudo /home/pi/camera.sh

exit 0
```

## 確認

```
$ netstat -tlpn
```

で8080などの指定したポートが表示されればOK
【プログラミング入門 - Ruby を使って - 】 練習問題 1 (数)

[プログラミング入門　- Rubyを使って -](http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/Chapter=Contents.html)

練習問題1:

- 1年は何時間でしょうか？
- 10年間は何分でしょうか？
- あなたが生まれてから今日まで何秒たっているでしょうか?
- 私が生まれてから10億3400万秒 たっているとしたら、私は今何歳でしょう?

```lang:1.rb
# 1年は何時間でしょうか?
puts 365 * 24
# 10年間は何分でしょうか?
puts 10 * 365 * 24 * 60

# あなたが生まれてから今日まで何秒たっているでしょうか?
puts '誕生した年を入力してください'
year = gets.chomp
puts '誕生した月を入力してください'
month = gets.chomp
puts '誕生した日を入力してください'
day = gets.chomp
birthday = Time.new(year, month, day)
now = Time.now
puts '生まれてから' + (now - birthday).to_i.to_s + '秒たってます'

#私が生まれてから10億3400万秒 たっているとしたら、私は今何歳でしょう?
puts (1034_000_000 / 60 / 60 / 24 / 365).to_i.to_s + '歳です。'
```
CentOS6.4にvim7.4をソースからインストール


度々ググってるので、メモっておく。 ※2014/05/29現在

```
# 必要なパッケージをインストール
yum -y install gcc python python-devel ncurses-devel python-setuptools perl-ExtUtils-Embed

# ソースとってくる
cd /usr/local/src
hg clone https://vim.googlecode.com/hg/ vim

# 更新
hg pull
hg update

./configure \
--prefix=/usr/local/vim \
--enable-fail-if-missing \
--enable-fontset \
--enable-perlinterp \
--enable-pythoninterp \
--enable-cscope \
--enable-multibyte \
--with-x=no \
--disable-gui \
--disable-xim \
--with-features=huge \
--disable-selinux \
--disable-gpm \
--disable-darwin

make && make install

```
MEMO of Dialog System Using Real-Time Crowdsourcing and Twitter Large-Scale Corpus


## Background
* SIGDIAL 2012
* 対話への知識を深めようと。
* わりと軽めで分かりやすい。
* 最近IIRで出てきた知識。

## Abstract
* Twitterから抽出した対話コーパスとリアルタイムクラウドソーシングを用いてDialog Systemを作った。
* 複雑な会話システム（dialog management？）を人手で作るよりも、この研究で使うデータは（実際の会話から取ってきているので）より本当のものに近いと思われる。

## Introduction
* ネット上には莫大なデータが存在し、Twitterにもデータを抽出や検索するためのAPIが多く存在している。
* これらは高い頻度で研究に用いられ、例として以下のようなものがあげられる。
	* 株式市場予測
	* ソーシャルメディアを通しての情報拡散
	* 文章の表現
* というのも、サイズが膨大で、会話的な性質が含まれているからである。

### 使われるデータ
|                | ENG |  JPN  |
|----------------|-----|-------|
| Conversational | 37% | 37.5% |
| AND Two-Length | 69% | 58.3% |

ENG: Kelly(2009)
JPN: 2.5 million

### Chat Bots
* 多くのはルールベース
	* 人手で頑張ってどんどんルールを追加している。
		* A.L.I.C.E <- AIMLというマークアップ言語で書かれた対話戦略？データベース
		* [Jabberwacky](http://www.jabberwacky.com) <- Large-Scale Dialog Corpus
		* [Cleverbot](http://www.cleverbot.com) <- 同上

### In This Paper
* **リアルタイムクラウドソーシングとTwitterの大規模コーパスを用いたChat Bot**
* **ポジネガの例に基づいた反応の選択で評価し、会話同士の類似度が有効かどうかを判断する？**
	* （詳しいことは後述するが）ある発話への反応をシステムに選択させ、それを評価する。

> evaluate response selection methods based on positive/negative example to judge if each feature could be exploited to judge similarity between uterrances.

## Method
### Overview
* 図1にあるような **会話対(Utterance Pair)** のデータベースを作った。
* すべての会話対は **発話(A)** と **それに対する返事(B)** で構成されている。
* 反応の生成は図2を参照。INPUTに最も似ている発話をデータベースから検索しそれに当たる返事を返す。
* なかった場合は、他のユーザに外注する？（<- Real-Time Crowdsourcing？）
* 120万ほどの会話対を、ブログやTwitterなどで集めた。
	* 収集方法としてはStreaming APIやREST APIを用いた。
	* 正規表現でTwitter特有の表現（メンション、引用、ハッシュタグ）を除いた。

### 似た会話対の検索方法
1. Twitter特有の表現（前述）を除いて形態素解析。
* POSタグ付与。
* 名詞、動詞、感嘆詞を抽出。
	* 日本語では感情表現を完全に抜き出すことが難しかった。
* 文章ベクトルに変換。（IIR Chapter.6参照）
* 2つの文章のcos類似度。（式1,2参照）
	* 文章d(i)
	* 単語w(j)
	* tf(i,j): d(i)の中でのw(j)の出現頻度
	* n(j): d(i)の長さ
	* x(i,j) = tf(i,j) / n(j)
	* sim(d(a),d(b)) = **x**(a) ・ **x**(b)

### Real-Time Crowdsourcing
システムが適切な会話対を見つけられなかった場合（＝類似度が基準に満たさなかった場合）、 **システムは入力を他のユーザに譲渡する**。

**\*See the Figure**

## Evaluation
* 90 user input examples
* 20 utterance-pairs / user
* 1800 tripples
* 30 subjects
* versatile answers are difficult to evaluate

### Evaluating Score
* Use P/N learning data
* tripletを学習データで評価（基準を満たせばP、そうでなければN）
* ROC曲線
* 比較手法
	* A or A+B（in figure 1）
	* Use tf or NOT
	* Use idf or NOT
	* Eliminate Twitter-Specific Representations not NOT
	* Normalize by Character or NOT
	* Filter POS or NOT

### Result
* Twitter特有の表現をフィルタリングした時に限りランダム分類（？）に近いパフォーマンスを見せた
* Word Count正規化やPOSフィルタリングは分類パフォーマンスをあげている
* 副詞や接辞は会話においてはあまり効果が無いため、POSフィルタリングがノイズ除去の役割を果たしている。
* tfは効果をもたらしたが、idfは分類を妨げていた

## Future Work
* Two-Length以上のものを扱う
* より大きなデータベースを利用する
Cで作るOSXのキーロガー


	DIO様「今までに打ち込んだキーの数を覚えているのか？」
	俺氏「ログあります！✧＼\٩(‘ω’)و /／✧」
	DIO様「URYYYYYYYYY!!!!!!!!」

という事をしたかったので調査した。ライフログの一環です。

### ポイント

- ApplicationServicesを使う。
- イベントハンドラを書く。
- イベントログをハンドルするには管理者権限が必要っぽい。
- (脱線: ちなみにLinuxでは`/dev/input/`あたりで取れるらしい。)

### サンプルコード

- 動作: キー押下イベントをハンドルして標準出力にタイムスタンプと共にキーコードを出力する。

```keylogger.c
// This program is a simple implementation of a key logger for OS X.
// This key loggger requires sudo and outputs key codes and a time stamp to standard output.
//
// build: cc keylogger.c -o keylogger -framework ApplicationServices
// usage: sudo keylogger > keylogger.log
// author: Masayuki Higashino

#include <stdio.h>
#include <time.h>
#include <ApplicationServices/ApplicationServices.h>

CGEventRef on_tap(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
  CGKeyCode key = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
  time_t now; time(&now);
  printf("%d %d\n", (int)now, key); fflush(stdout);
  return event;
}

int main(int argc, const char * argv[]) {
  CGEventFlags flags = CGEventSourceFlagsState(kCGEventSourceStateCombinedSessionState);
  CGEventMask mask = CGEventMaskBit(kCGEventKeyDown);
  CFMachPortRef tap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, mask, on_tap, &flags);
  if (!tap) {
    fprintf(stderr, "This program requires sudo.");
    return -1;
  }
  CFRunLoopSourceRef runloop = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0);
  CFRunLoopAddSource(CFRunLoopGetCurrent(), runloop, kCFRunLoopCommonModes);
  CGEventTapEnable(tap, true);
  CFRunLoopRun();
  return 0;
}
```

### コンパイル

- `-framwork`オプションを付ける。

```sh
cc keylogger.c -o keylogger -framework ApplicationServices
```

### 実行

- `sudo`を付ける。

```sh
sudo keylogger > keylogger.log
```

### CGKeyCodeの値と意味の対応表

下記ヘッダファイルのenumに定義されている。

```/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/Headers/Events.h
enum {
  kVK_ANSI_A                    = 0x00,
  kVK_ANSI_S                    = 0x01,
  kVK_ANSI_D                    = 0x02,
  // 以下略
};
```

プログラム内で使うにはCarbonをインクルードして使う。

```keylogger.c
#include <Carbon/Carbon.h>
```

コンパイル。

```sh
cc keylogger.c -o keylogger -framework ApplicationServices -framework Carbon
```
[質問]WEB上で録音・追加録音・再生が出来る画面の作成

WEB上で録音・追加録音、再生が出来る画面を作りたく、HTMLとJavaScriptで実現できないか模索中です。
ブラウザやOSの種類に制限されない機能として実現したいのですが、実現方法や参考サイトを教えてください。
追加録音は音声を録音した音声ファイル(wav形式)の最後尾に、続けて録音をしていく機能を実現したいと考えています。
イメージとしては
http://phpjavascriptroom.com/?t=strm&p=jplayer#a_audio1
で実現している音楽プレイヤーに録音、追加録音機能が追加されたものを目指しています。
再生機能は上記のサイトを参考にすればよいと考えていますが、録音・追加録音の実現方法がどうしてもわからずこの場をお借りして質問をさせていただきました。
当方WEB開発の経験がなく、説明不足もあるかと思いますが何卒よろしくお願い致します

－追記－
上記の「ブラウザやOSの種類に制限されない」についてはイメージに挙げたJPlayerがサポートしているブラウザでの動作が可能であることを望んでいます。
最低でもWindows(Chrome, IE), OSX(Safari)はサポートしたいと考えています。 
説明不足でしたので追記させていただきました。
削除したbranchを復活させる


誤って削除してしまったbranchを元に戻す方法

## reflogして過去の作業を一覧する

```bash
git reflog HEAD
```

## 復活させたいbranchとHEADの番号をコピペ

```bash
c939342 HEAD@{0}: pull: Fast-forward
fb488d2 HEAD@{1}: checkout: moving from feature/hogehoge to develop
7f4b273 HEAD@{2}: checkout: moving from feature/hogehoge to feature/fugafuga
```

## 復活させる

```bash
git branch feature/hogehoge HEAD@{2}
```
Firefox Syncにログイン出来ない人へ

Firefox Syncにログインできなかったので調べてみたらFirefox29からFirefox Sync のアカウントは使わなくなって代わりに Firefox Account s が導入されたらしい。

ややこしいことに既にFirefox Syncにログインしてたユーザーが29にアップデートしても何も言ってこないけど、新しくインストールしたFirefoxのバージョンが29だったらFirefox Syncのアカウントではログインできず Firefox Accountを作らないといけないみたい。このことに気づくのにかなりの無駄な時間を費やしました。

頼むからそういう変更があったら「新しくなりました！！」的な見た目の変更をどうか、どうかよろしくお願いします…。

## Attempt limit exceeded.

んで、うまくいかないので色々試した結果、普通に新規登録しようとしても`Attempt limit exceeded.`と出てきてログインできません。ふぁっく。
VBから管理者としてプロセスを起動する

[前回](http://qiita.com/kei75/items/41b059465bff9571d697)の続き的に…。
これまた覚え書き程度のメモです。

# 概要
VisualBasicにて、別プログラムを起動するコードはよく知られていて簡単。
別のユーザーとして起動させる場合も、比較的簡単。[こちら][link-1]
管理者ユーザーで起動させるとなると、[こちら][link-2]のようなやり方が必要になります。

で、今回は、一般ユーザーからアプリケーションを起動させ、管理者ユーザー(Administratorとか)でプロセスを起動し、UAC昇格までさせてしまいます。

前回、フォントのインストールをVBScriptから行うスクリプトについて書きましたが、このサンプルコードと統合することで、一般ユーザーでもWindows7にフォントをインストールできるツールを作ることが出来ます。
(というか作りました…必要に迫られて…)

# サンプルコード
以下のコードは、.NET Framework2.0以上のコードです。

```vbnet
Public Function RunAs(ByVal strExecName As String, ByVal strArguments As String, Optional ByVal strUserName As String = "", Optional ByVal strPassword As String = "") As Boolean

    Dim psi As New System.Diagnostics.ProcessStartInfo()
    Dim p As System.Diagnostics.Process

    psi.UseShellExecute = True
    psi.Verb = "runas"
    psi.FileName = strExecName
    psi.Arguments = strArguments

    If strUserName <> "" Then
        psi.UserName = strUserName

        Dim pw As New System.Security.SecureString
        Dim ch As String
        For Each ch In strPassword.ToCharArray()
            pw.AppendChar(ch)
        Next
        psi.Password = pw
        psi.UseShellExecute = False
    End If


    RunAs = True
    Try
        p = System.Diagnostics.Process.Start(psi)
        p.WaitForExit()

    Catch ex As System.ComponentModel.Win32Exception
        Debug.Print(ex.Message)
        RunAs = False

    End Try

End Function
```

お急ぎの方は、上記サンプルコードを適当なモジュールに貼り付けて、アプリケーションを起動したいところで、以下のように呼び出せばOKです。

```
Dim blnRet As Boolean = False
blnRet = RunAs(起動するプログラムファイル, 引数が必要であればここに, ユーザー名, パスワード)
```
起動に成功すればTrueが返ってきます。
ちなみに、「p.WaitForExit()」としていますので、起動したプログラムが終了するまでは次のコードは実行されません。
ここら辺は、状況に応じて適宜変えた方がよいかと思います。

# 解説
解説するまでもないような気がしますが、ポイントは ProcessStartInfo オブジェクトの Verb プロパティに「runas」という値を設定します。
これにより、管理者として実行(UAC昇格)を行うことが出来ます。
ユーザーパスワードは、平文でセットしても認識してくれない仕様なので、SecureStringオブジェクトで暗号化します。

**と、ここまで書いて気がつきましたが、最初からSecureStringオブジェクトで暗号化した文字列を入れればいいんじゃ…。**
(SecureStringオブジェクトで生成したセキュリティ文字列は結構簡単に復号出来ちゃうようですが)


# 注意点
このやり方は、ソースコード中にパスワードを記載してしまうので、ソースコード管理には細心の注意が必要です。
パスワードを暗号化して外部ファイルに保存するなどしても、ソースコードの中身を見られてしまったら復号できたも同然…。
利便性を取るか、セキュリティを取るかは、きちんと設計する必要があります。


# 参考リンク

別ユーザーで外部アプリケーションを起動する
[http://dobon.net/vb/dotnet/process/startwithusername.html][link-1]
[link-1]:http://dobon.net/vb/dotnet/process/startwithusername.html

管理者としてほかのアプリケーションを実行するには？
[http://www.atmarkit.co.jp/fdotnet/dotnettips/954uacrunas/uacrunas.html
][link-2]
[link-2]:http://www.atmarkit.co.jp/fdotnet/dotnettips/954uacrunas/uacrunas.html
WordPressの勉強5 カスタム投稿（自分用）

#カスタム投稿をプラグインなしで作る
##参考
・『基礎からのWordPress』高橋のり
・http://webdesignrecipes.com/wordpress-conditional-tags-and-custom-post-type/

##表示するページ
・single-カスタム投稿名.php（個別表示）
・taxonomy.php（一覧表示）
→・functions.php, header.php, sidebar.php


##wp.logの設定
・変数についてよくわからなくなってしまったのでfunctions.phpの一番上に

```lang:functions.php
<?php
function p($arg) {
  error_log($arg . "\n" , 3, 'WordPressのディレクトリ/log/wp.log');
}
function d($arg) {
    ob_start();
      var_dump($arg);
      $log = ob_get_contents();
        ob_end_clean();
        return rtrim($log);
}
function pd($arg) {
    p(d($arg));
}
```

・例
`<?php pd($type1); ?>`

##オリジナル関数を使わずに2つのタクソノミーそれぞれ用の画像をサイドバーのメニューに表示する方法（sidebar.phpのtaxonomy.php用タグ）
・画像名をスラッグ名と同じにする

・URLに$term（＝スラッグ名）
http://www.nandani.sakura.ne.jp/web_all/cms/3638/

もしくは
・single_tag_title→$term_name, get_term_byを使う
http://elearn.jp/wpman/function/get_term_by.html

```lang:sidebar.php
  /**
   * 部屋のタイプ、家具の種類（taxonomy.php）
   */
  elseif(is_tax()):

   $term_name = single_tag_title("", false);

    $type1 = get_term_by('name', $term_name, 'タクソノミー1の名前');
    //$type1 = get_term_by('slug', 'タームのスラッグ', 'タクソノミー1の名前');
    if($type1)$org_term = $type1;
    $type2 = get_term_by('name', $term_name, 'タクソノミー2の名前');
    if($type2) $org_term = $type2;

    /* 【重要】画像の名前をスラッグと同じにする！ */ ?>
    <img src="<?php echo get_template_directory_uri(); ?>/images/<?php echo $org_term->slug; ?>.jpg" alt="">
```
Jenkinsのインストール（CentOS)


### 1. ダウンロード

```
$ wget http://pkg.jenkins-ci.org/redhat/jenkins-1.565-1.1.noarch.rpm
```

### 2. インストール

````
# rpm -ivh jenkins-1.565-1.1.noarch.rpm 
```

※ 今回はJavaは入っていたので入れてませんが、まっさらの状態からだと入れる必要あり。


### 3. 設定（Port変更：任意）

デフォルトの8080ポートが埋まっていたので、下記のように8082に変更

```
# cd /etc/sysconfig/
# vi jenkins


JENKINS_PORT="8082"
```

### 4. 起動

```
# service jenkins start
```

（ちょっと時間かかる）

http://localhost:8082/ でアクセス


### 参考：
http://oscasierra.net/2013/05/jenkins-to-redhat/
struts2 での メッセージの日本語化

## Action

```java:Action.java
@Validations(
    requiredStrings={
        @RequiredStringValidator(
            fieldName="userName"
          , key="errors.required")
    }
)
public class Action extends ActionSupport {
    public String userName;
}
```

## package.properties

```properties:package.properties
errors.required=${getText(fieldName)} は必須です。
userName=ユーザー名
```

## output

```text
・ユーザー名 は必須です
```
値が整数かチェックする

メモ


```js
function isInteger(x) {
	return Math.round(x) === x;
}

> isInteger(1)
true
> isInteger(0)
true
> isInteger(1.111)
false
> isInteger("1")
false
> isInteger("")
false
> isInteger(null)
false
> isInteger(NaN)
false
> isInteger(undefined)
false

```


http://www.2ality.com/2014/05/is-integer.html
電話サービスを開発できるTwilio APIをつかってみた


[NHK主催のハッカソン](http://www.nhk.or.jp/kokusaihoudou/hackathon/)に参加してきたんですけども、技術提供されてた電話アプリケーションを開発できる [twilio](http://twilio.kddi-web.com/)、これがすごく面白かったので、そのときの導入メモ。

![twilio.png](https://qiita-image-store.s3.amazonaws.com/0/20773/c6a296f2-21a2-7a35-8592-4c147c5a96d5.png "twilio.png")


アカウントをとる
--------------------
トライアルアカウントとります。
http://twilio.kddi-web.com/

![Twilio___Try_Twilio_Free.png](https://qiita-image-store.s3.amazonaws.com/0/20773/f0d76e0e-9884-b5c8-34b0-4c2d1f60f037.png "Twilio___Try_Twilio_Free.png")

必要項目を記入して

![Twilio___Verify_your_number.png](https://qiita-image-store.s3.amazonaws.com/0/20773/268ff23c-41f3-c2fa-e914-883d1a9b2846.png "Twilio___Verify_your_number.png")

電話番号を登録すると認証コードがSMSで送られてくるので入力します。


![Twilio___Try_Twilio_Free.png](https://qiita-image-store.s3.amazonaws.com/0/20773/0c17252d-b9ea-0f39-a567-ed6f40c3def9.png "Twilio___Try_Twilio_Free.png")

電話番号がひとつ発行されます。

![Twilio_Signup.png](https://qiita-image-store.s3.amazonaws.com/0/20773/26cb608e-51d4-92a5-ba9c-fd1f7a71c0f9.png "Twilio_Signup.png")

この番号をつかって次の4つのテストができます。

* 電話をかける
* 電話をうける
* SMSを送信する
* SMSを受信する

メッセージをいれて電話をかけると、トライアルアカウントの断りが入ったあとに設定したメッセージを機械音声で読み上げてくれます。
テストを終えるて次へすすむボタンをクリックするとダッシュボードへ遷移します。

twiMLで実装する
--------------------
最初ちょっとイメージが湧きにくいのですが、電話番号ごとに発信／受信を制御する [twiML](https://jp.twilio.com/docs/api/twiml) という独自のマークアップ言語で開発するイメージです。

トライアルで発行された電話番号にかけるとメッセージを返す自動応答をつくってみます。といってもめちゃくちゃ簡単でわずか4行でできてしまうのですが。

メニューから「電話番号」へ移動します。

![Phone_Number_815031318861___Dashboard___Twilio.png](https://qiita-image-store.s3.amazonaws.com/0/20773/6283bfb4-0b21-4f12-36c5-e533b6c0fd0c.png "Phone_Number_815031318861___Dashboard___Twilio.png")

適当なサーバにホストした twiML のURLを Request URL 設定します。
twiML はこんな感じ。

````xml:twilio-say.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say voice="woman" language="ja-jp">こんにちわ、こんにちわ。ゆっくりしていってね</Say>
</Response>
````

ちなみにtwiMLの仕様はこちらから https://jp.twilio.com/docs/api/twiml
音声合成でしゃべらせたり、音楽再生させたり、いろいろおもしろいことできそうですね。

これで電話をかけると合成音声が応答しれくれます。

まとめ
--------------------
この twiML を動的に生成したりしてより高度なアプリケーションをつくっていく感じですね。今回はふれていませんが発信用のアプリケーションももちろん開発できるようです。
それにしても電話を開発できるなんてかなり面白いですね。

ちなみに、私はトライアルで発行された番号がアメリカの番号だったんですが、これまでの人生で国際電話なんてほとんどかけたことなんてないので、iPhoneから発信する場合ちょっとハマりました。国際プレフィックス番号なんて知らないって人は次の記事読んでおくと幸せになれると思います。

[iPhoneから国際電話をかける時は「0を長押し」と覚えておこう！](http://gajethouse.blog3.fc2.com/blog-entry-1015.html)
CoreOSのLive ISO作る君 mac対応させた

[ISO](https://coreos.com/docs/running-coreos/platforms/iso/)存在してた・・・


nyarlaさんの成果物をmacでのiso作成に対応させた。

nyarlaさんの成果物
================

* [CoreOSをVPSやベアメタルにインストールする方法 - Qiita](http://qiita.com/nyarla/items/65f0a1396332d529cd10)
* [CoreOSのLive ISO作るbash scriptを書きました - 空繰再繰](http://the.nyarla.net/post/66266272473)
* [yungsang/coreos-live-iso Repository | Docker Index](https://index.docker.io/u/yungsang/coreos-live-iso/)


自分が加筆修正したもの
===================

* https://github.com/tukiyo/coreos-live-iso

CoreOS LiveISO作り方
===================

```bash:macで実行
$ git clone https://github.com/tukiyo/coreos-live-iso.git
$ cd coreos-live-iso
$ ./makeiso.sh
-----> Initialize working directory
-----> CoreOS version
COREOS_BUILD=296
COREOS_BRANCH=0
COREOS_PATCH=0
COREOS_SDK_VERSION=295.1.0
-----> Download CoreOS's kernel
-----> Download CoreOS's initrd
-----> Download syslinux and copy iso directory
-----> Make isolinux.cfg file
-----> Make syslinux.cfg file
-----> Make ISO file
[info] isohybrid not found. skip
-rw-r--r--  1 Owner staff   126M  5 29 11:09 /Users/Owner/coreos-live-iso/CoreOS.master.iso
-----> [Finish]
-----> iso boot then `ssh core@<ip>`
```

ISO起動後の使い方
===============


rootimageをダウンロードしておいて使う方法
------------------------------------

webサーバにてファイルを用意

```bash:DocumentRootを/var/www/html/とする。
$ mkdir /var/www/html/296.0.0/
$ cd /var/www/html/296.0.0/
$ wget http://storage.core-os.net/coreos/amd64-usr/296.0.0/coreos_production_image.bin.bz2
$ wget http://storage.core-os.net/coreos/amd64-usr/296.0.0/coreos_production_image.bin.bz2.DIGESTS.asc
```

インストール開始
--------------

```bash:ISOから起動
$ sed 's@BASE_URL="http://storage.core-os.net/coreos/amd64-usr/${VERSION_ID}"@BASE_URL="http://192.168.11.2/${VERSION_ID}"@' /usr/bin/coreos-install > coreos-install
$ chmod +x coreos-install
$ sudo -s
# ./coreos-install -d /dev/sda
# mount /dev/sda9 /mnt
# cp -a /home/core/.ssh/authorized_keys /mnt/root/home/core/.ssh/
# chown 500:500 /mnt/root/home/core/.ssh/authorized_keys
# reboot
```

HDDから起動。
/のセクタ割り当てサイズが512MBからDISK残り全部に拡張される。
しかしパーティションの論理サイズまでは拡張されないので手動で行う。

```bash:再度ISOから起動
# mount /dev/sda9 /mnt
# tar czf sda9.tar.gz -C /mnt root
# umount /mnt
# mkfs.btrfs -f -LROOT /dev/sda9
# mount /dev/sda9 /mnt
# btrfs subvolume create -i 256 /mnt/root
# tar xzf sda9.tar.gz -C /mnt
# btrfs subvolume list /mnt
ID 257 gen 7 top level 5 path root
# reboot
```


後は[CoreOSのtimezone設定 - Qiita](http://qiita.com/tukiyo3/items/969af2cdbbd0d20ab0fd)とか
'Incorrect MySQL client library version! This gem was compiled for x1.x2.x3 but the client library is y1.y2.y3'と怒られる件への対処

## いろいろなケースがあるようだけど、以下のコマンドで解決する場合あり。

```
gem uninstall mysql2
gem uninstall mysql2-cs-bind

find / -name mysql_config    # ---> <mysql_config_path>

gem install mysql2 -- --with-mysql-config= *mysql_config_path*
gem install mysql2-cs-bind -- --with-mysql-config=<mysql_config_path>
Laravel4で環境によって設定を変えたい時にどうするか

`bootstrap/start.php`でホスト名とその時の環境名を指定。

```php
$env = $app->detectEnvironment(array(

    'staging'    => array('staging-web'),
    'production' => array('production-web*'),
    'local'      => array('local.*', '*.local', '*.lan' ),

));
```

設定の切り替えは`app/config/`下のディレクトリを切り替えることで分けて適用できる。`app/config/`に共通の設定を書き、環境名のディレクトリに固有の設定(部分だけ書いて上書きが可能)。

```
app/config/database.php
app/config/local/database.php
app/config/production/database.php
```

サーバ上でどの環境が適用されるのかは`artisan`でチェックできる。

```bash
% php artisan env
Current application environment: local
```
本当は怖くないCP932

## 先に結論

- CP932 は、Shift_JIS の独自実装
- 符号化文字集合がいろいろ拡張されている
- 拡張文字の有無で、Shift_JIS と判別可能

## CP932ってなあに?

実はいろいろある

- Microsoftコードページ932
- IBMコードページ932
- PC-9800仕様OEMコードページ932
- Windows-31J(MS932)


### Microsoftコードページ932

- Microsoftが、MS-DOS 用に作った Shift_JIS の実装



### IBMコードページ932PC-9800仕様OEMコードページ932

- IBM、NECが作った、Microsoftコードページ932 の拡張



### Windows-31J(MS932)

Microsoftが互換性確保の為に、IBM、NECの拡張を吸収した、Windows 用の CP932

- CP932 といったらほぼほぼこれを指す
- MS932 は、Java での呼称

### まとめ

CP932 ≒ Windows-31J = MS932

## Shift_JIS ってそもそもなにを指すの?

符号化文字集合 JIS X 0208 を使った文字符号化方式

### 符号化文字集合

文字列の集合と1対1で紐付けられたコードの集まり

#### 符号化文字集合 JIS X 0208

- 日本工業規格(JIS)で定められた、日本語の符号化文字集合
- 7ビット or 8ビットで表現できる、94(区) x 94(点) の文字の集まり

#### 分類はこんな感じ

- 1〜2区 : 記号
- 3区 : 数字・ローマ字
- 4区 : ひらがな
- 5区 : カタカナ
- 6〜7区 : ギリシャ・キリル文字
- 8区 : 罫線
- 9〜15区 : 未定義
- 16〜47区 : 第一水準漢字
- 48〜84区 : 第二水準漢字
- 85〜94区 : 未定義


### 文字符号化方式

- 符号化文字集合をコードに変換する仕組み
- Shift_JIS ならば以下のリンクに書かれているルールで、JIS X 0208 をコードに変換している

→ [文字コード（UTF-8,Shift_JIS,EUC-JP,ISO-2022-JP）についての俺的まとめ - 今日もスミマセン。](http://d.hatena.ne.jp/snaka72/20100710/SUMMARY_ABOUT_JAPANESE_CHARACTER_CODE)

- EUC-JP も、文字符号化方式
- Shift_JIS とは別の方法で、JIS X 0208 を符号化している

## CP932 って Shift_JIS とどう違うの?

- 符号化方法は一緒
- ただし、符号化文字集合が異なる

### 符号化文字集合の違い

互換性の為に色んな物を詰め込んでいる

- NEC拡張文字
- IBM拡張文字
- NEC選定IBM拡張文字

#### NEC拡張文字

- PC-9800仕様OEMコードページ932 で追加した、NEC独自の文字集合
- JIS X 0208 の未定義の13区に定義

![tumblr_n60mfuq8UG1qz56lho1_500.png](https://qiita-image-store.s3.amazonaws.com/0/5329/593c91b5-a2dd-b9e9-1e14-82e415689f5c.png)

#### IBM拡張文字

- IBMコードページ932 で追加した、IBM独自の文字集合
- JIS X 0208 の後ろに115区〜119区を勝手に追加して定義(!)

![tumblr_n60mhor9KV1qz56lho1_500.png](https://qiita-image-store.s3.amazonaws.com/0/5329/77392012-aca6-3bba-5e4a-9e67045ead34.png)

#### NEC選定IBM拡張文字

- IBM拡張文字は、JIS X 0208 の範囲外に定義されていたので、それを嫌がった NECが 89区〜92区に再定義

![tumblr_n60mhd8y2x1qz56lho1_500.png](https://qiita-image-store.s3.amazonaws.com/0/5329/1030c6db-846c-ce43-8b42-183cd4ee47be.png)

### カオス

拡張文字内でかぶる文字があったりなかったり

### けど、見分け方はシンプル

拡張文字をつかってれば、CP932、使ってなければ Shift_JIS

## 参考

- [Shift-JIS 文字コード表](http://seiai.ed.jp/sys/text/java/shiftjis_table.html)
- [シフトJIS ‐ 通信用語の基礎知識](http://www.wdic.org/w/WDIC/%E3%82%B7%E3%83%95%E3%83%88JIS)
- [文字コード（UTF-8,Shift_JIS,EUC-JP,ISO-2022-JP）についての俺的まとめ - 今日もスミマセン。](http://d.hatena.ne.jp/snaka72/20100710/SUMMARY_ABOUT_JAPANESE_CHARACTER_CODE)
Objective-C で epoch time を扱う



# epochTime を NSDate に変換

double 型にした epoch time を initWithTimeIntervalSince1970 で変換します。

```
NSString *epochTime = @"1401325412";

double epochDouble = [epochTime doubleValue];
NSTimeInterval seconds = epochDouble;
    
NSDate *epochNSDate = [[NSDate alloc] initWithTimeIntervalSince1970:seconds];
```

# NSDate を文字列として取得する

NSDateFormatter を使用して表示したいフォーマットを指定。

```    
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter setDateFormat:@"MM/dd HH:mm"];
        
cell.dateview.text = [dateFormatter stringFromDate:epochNSDate];

```
カテゴリーでインスタンス変数

Objective-C で既存のクラスを拡張する方法のひとつにカテゴリーを利用する方法があります。

```objc
@interface MyClass (CategoryName)

// 追加したいメソッド

@end
```

カテゴリーですでにあるメソッドと同じ名前のメソッドを追加するとどっちのメソッドが利用されるか分からなくなってしまうという強烈な副作用があるため、利用には注意が必要です。

カテゴリーではインスタンス変数 (メンバー変数) を追加することはできない……と思っていたんですが、私の勘違い？もしかして以前とは動作が変わりました？

```objc
@interface MyClass (CategoryName)
{
  id _newMember; // <= これは無理
}

- (void)newMethod;

@end

@interface MyClass ()
{
  id _newMember; // <= これは OK
}

@end
```

~~というコードはできないと思っていたんですが、どうも勘違いだってみたいで普通にできる様子。~~

やっぱり勘違いでした。カテゴリー名を省略する anonymous categories は「クラス拡張 Class Extensions」とも言って、こっちだとインスタンス変数の宣言ができるようです。

```objc
@interface MyClass (CategoryName)
{
  id _newMember; // <= これは無理
}

- (void)newMethod1;
- (void)newMethod2;

@end

@interface MyClass ()
{
  id _newMember; // <= これは OK
}
@end

@implementation MyClass (CategoryName)

- (void)newMethod1
{
  _newMember = ...; // なんか代入
}

- (void)newMethod2
{
  NSLog(@"%@",_newMember); // newMethod1 に先にアクセスしていれば、その内容がちゃんと見れる
}

@end
```
@tomohisaota さんご指摘の通り、この拡張はコンパイラーによって行われるので、ソースコードにアクセスできるような状態でないといけない模様。

UIKit など既存のフレームワークで宣言されたクラスの拡張にはできないようです。試しにやってみたら、リンカでエラーになりました。

Xcode 5.1.1 / iOS SDK 7.1 & OS X SDK 10.9 で確認。

@tomohisaota さん、ありがとうございます。
npmのグローバルインストールとローカルインストール

##グローバルインストール
こんな感じ

```
npm install -g bower
```

[こちらの記事](http://gihyo.jp/dev/serial/01/nodejs/0002?ard=1401175259)
>npmのインストール場所にパッケージをインストールします。
>付けない場合は，カレントディレクトリのnode_modules内にインストールされます。

グローバルインストールはそうなんですけれど、私の場合はnodebrewでnodeとnpmを入れているので、

```
npm list -g
/Users/teru1/.nodebrew/current/lib
```
ここ配下にnode_modulesがあり、ここにインストールされている様子です。これはよくわかりました。

##ローカルインストール

こちらの[記事](http://gihyo.jp/dev/serial/01/nodejs/0002?ard=1401175259)にはローカルインストールはカレントディレクトリのnode_modules内にインストールと書いてあるので、
ホームディレクトリ配下にディレクトリ作って、そこで`npm install`やったんですけど、
そのディレクトリの親であるホームディレクトリのnode_modulesにインストールされました。どうしてそんなディレクトリがあるのかといいますと、前にここで`npm install`とかやった時に作られたものなのでしょう。


親ディレクトリにnode_modulesディレクトリがある場合はそこにインストールされる？

##試す
####親にnode_modulesディレクトリが無いディレクトリにて

```
$ pwd
/Users/Shared
```
↑この階層内にはnode_modulesディレクトリはありません

↓ディレクトリ作って、移動して、install

```
$ mkdir sample_npm
$ cd sample_npm/
$ npm install bower
```


↓node_modulesが作られて、そこにインストールされた！

```
$ ls
total 0
drwxr-xr-x  3 teru1  wheel  102  5 27 17:01 ./
drwxrwxrwt  8 root   wheel  272  5 27 17:01 ../
drwxr-xr-x  4 teru1  staff  136  5 27 17:02 node_modules/
```


####親にnode_modulesディレクトリを作って
さっきの始まりと同じ状態にして、`/Users/Shared`にnode_modulesディレクトリを作成します。

```
$ pwd
/Users/Shared
$ mkdir node_modules
$ ls
total 16
drwxrwxrwt  8 root   wheel   272  5 28 11:45 ./
drwxr-xr-x  5 root   admin   170 11  9  2013 ../
-rw-r--r--@ 1 teru1  wheel  6148 12 14 01:21 .DS_Store
-rw-r--r--  1 root   wheel     0  8 25  2013 .localized
drwxrwxrwx@ 5 teru1  wheel   170 11 10  2013 SC Info/
drwxr-xr-x  6 root   wheel   204 11 17  2013 SplashtopStreamer/
drwxrwxrwx@ 2 teru1  wheel    68 11  9  2013 adi/
drwxr-xr-x  2 teru1  wheel    68  5 28 11:45 node_modules/
```

↓ディレクトリ作って、移動して、install

```
$ mkdir sample_npm
$ cd sample_npm/
$ npm install bower
```

↓ここにディレクトリは出来ない

```
$ ls
total 0
drwxr-xr-x  2 teru1  wheel   68  5 28 11:47 ./
drwxrwxrwt  9 root   wheel  306  5 28 11:47 ../
```

`mkdir`で作った上の階層のnode_modulesにインストールされたようです。なるほど。

```
$ ls ../node_modules/
total 0
drwxr-xr-x   4 teru1  wheel  136  5 28 11:48 ./
drwxrwxrwt   9 root   wheel  306  5 28 11:47 ../
drwxr-xr-x   3 teru1  wheel  102  5 28 11:48 .bin/
drwxr-xr-x  18 teru1  staff  612  5 28 11:48 bower/
```
DynamoDB AWS CLI


# テーブルの一覧

list-tables を使います。

＜コマンド＞

```
$ aws dynamodb list-tables
```

＜出力＞

```
{
    "TableNames": [
        "table_name_1", 
        "table_name_2", 
        "table_name_3"
    ]
}
```


# テーブルの作成

create-table を使います。

＜コマンド＞

```
$ aws dynamodb create-table  --table-name sample_table \
--attribute-definitions AttributeName=some_id,AttributeType=S AttributeName=some_time,AttributeType=S \
--key-schema AttributeName=some_id,KeyType=HASH AttributeName=some_time,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
```

# テーブルの詳細表示

describe-table を使います。

＜コマンド＞

```
$ aws dynamodb describe-table --table-name=sample_table
```

＜出力＞

```
{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "some_id", 
                "AttributeType": "S"
            }, 
            {
                "AttributeName": "some_time", 
                "AttributeType": "S"
            }
        ], 
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0, 
            "WriteCapacityUnits": 1, 
            "ReadCapacityUnits": 1
        }, 
        "TableSizeBytes": 0, 
        "TableName": "sample_table", 
        "TableStatus": "ACTIVE", 
        "KeySchema": [
            {
                "KeyType": "HASH", 
                "AttributeName": "some_id"
            }, 
            {
                "KeyType": "RANGE", 
                "AttributeName": "some_time"
            }
        ], 
        "ItemCount": 0, 
        "CreationDateTime": 1401293991.7019999
    }
}
```


# コマンド一覧

```
$ aws dynamodb help
```


```
AVAILABLE COMMANDS
       o batch-get-item
       o batch-write-item
       o create-table
       o delete-item
       o delete-table
       o describe-table
       o get-item
       o help
       o list-tables
       o put-item
       o query
       o scan
       o update-item
       o update-table
```



## 参考
1. http://docs.aws.amazon.com/cli/latest/reference/dynamodb/
1. http://blog.cloudpack.jp/2014/04/10/aws-news-sqs-dynamodb-cli/
Chocolatey update するとアプリが動かない？(windows)

## Chocolatey update すると動かない

### Chocolatey のばぐ？
すでにインストールしているパッケージのアップデートを行うと動かないっていう現象の解決策。といっても単純なんだけどねｗ

### およ？うごかない…
VirtualBox がアップデートされていたので新しいのが使いたいとアップデート（PowerShellから実行ね）。で、Vagrant コマンドを実行するとコマンドが見つからないっていうメッセージが出力される。

Chocolatey のパッケージアップデート方法

```
C:\> chocolatey update virtualbox
```

### 環境変数が…おぉい
Chocolatey でupdateすると環境設定値が変になるらしい。コンパネから\[システムのプロパティ\]-\[詳細設設定\] の環境変数を修正すればよろし。あとは、dos窓 or PowerShell を再起動するだけ。

```
C:\PROGRA~2\Oracle\VirtualBox
```

ってなっちゃっているので、ここを下記の様に修正するだけ。

```
C:\Program Files\Oracle\VirtualBox
```

### まぁこれくらいなら許容だよねｗ
VirtualBox に限らず同じ現象になるっぽい。あと困るのは、updateすると物によって強制的に再起動されるところでしょうか（実際、やられました）
Python Twistedで任意の処理を定期的に実行する


メモです。

```python:echo_hoge.py
from twisted.internet import task, reactor

# 実行する関数
def echo():
    print "hoge"

if __name__ == '__main__':
    # 実行間隔
    interval = 1

    # ループに関数を登録して、指定された間隔で実行する
    instance = task.LoopingCall(echo)
    instance.start(interval)

    # twistedのイベントループを開始する
    reactor.run()
```
[ObjC][memo] applicationDidBecomeActive の実行タイミングメモ



`applicationDidBecomeActive` の実行されるタイミングで、ビューの処理がしたかったのだけど、実行されるタイミングがよくわからなかったので「AppDelegateのメソッドと、イニシャルUIViewControllerのメソッドの実行順」を出力したメモ。



#アプリ起動
↓
[AppDelegate]    `application:willFinishLaunchingWithOptions:`
↓
[AppDelegate]    `application:didFinishLaunchingWithOptions:`
↓
[ViewController] `viewDidLoad`
↓
[ViewController] `viewWillAppear:`
↓
[AppDelegate]    **`applicationDidBecomeActive:`**
↓
[ViewController] `viewDidAppear:`
↓
###ホームボタン押下でバックグラウンドに
↓
[AppDelegate]    `applicationWillResignActive:`
↓
[AppDelegate]    `applicationDidEnterBackground:`
↓
###再度アプリをタップしフォアグラウンドに
↓
[AppDelegate]    `applicationWillEnterForeground:`
↓
[AppDelegate]    **`applicationDidBecomeActive:`**
↓
###ホームボタンダブルタップでアプリ一覧表示
↓
[AppDelegate]    `applicationWillResignActive:`
↓
###一覧からアプリをタップし再度フォアグラウンドに
↓
[AppDelegate]    **`applicationDidBecomeActive:`**
↓
###再度ホームボタンダブルタップでアプリ一覧表示
↓
[AppDelegate]    `applicationWillResignActive:`
↓
###アプリ一覧から上にスライドして終了
↓
[AppDelegate]    `applicationDidEnterBackground:`
↓
[AppDelegate]    `applicationDidEnterBackground:` (←これなんか2回呼ばれる)
↓
[ViewController] `viewWillDisappear:`
↓
[ViewController] `viewDidDisappear:`
↓
[AppDelegate]    `applicationWillTerminate:`

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

#バックグラウンド時に通知エリアをタップしてフォアグラウンドに
↓
[AppDelegate]    `applicationWillEnterForeground:`
↓
[AppDelegate]    `application:didReceiveLocalNotification:` 
↓
[AppDelegate]    **`applicationDidBecomeActive:`**


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


#最後に
なにか間違いなどありましたら気軽にコメントいただけると嬉しいです