OmniAICreator/Qiita-1.07M huggingface dataset:
AWS　安価な外形監視の構築（URL監視をする方法）


AWSはコストを最小構成であれば、月額数千円で
仮想サーバーが建てられるので、簡単な用途にも使えますね。
特に、オンプレでデータセンター構築したサーバー群をインターネット経由で外形監視にも使えます。万一のオンプレのセンター障害を検知するのに使用できます。
外形監視に特化したシェルを作りました。

# 特徴
* URL監視でエラー時にメールを出す。
* 複数の宛先に同時に送る。
* モードを分けられる
 * 障害発生後も毎回　障害通知を出すモード
 * 障害発生した初回のみ送って、復旧後は復旧通知を出すモード

# 環境準備
## AWS EC2のインスタンスを作成

  t2.microを想定
 
## メールコマンドを設定。


```
sudo yum install mailx -y

```


実行結果

```
[ec2-user@ip-172-30-0-36 ~]$ sudo yum install mailx -y

途中略

インストール:
  mailx.x86_64 0:12.4-8.8.amzn1                                                 

完了しました!
```


## nkfのインストール

```
cd /tmp
wget http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86_64.rpm
sudo rpm -ivh nkf-2.0.8b-6.2.el6.x86_64.rpm
```

実行結果

```
[ec2-user@ip-172-30-0-36 ~]$ wget http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86_64.rpm

途中略
 

2016-04-29 12:59:07 (661 KB/s) - `nkf-2.0.8b-6.2.el6.x86_64.rpm' へ保存完了 [112856/112856]


[ec2-user@ip-172-30-0-36 ~]$ sudo rpm -ivh nkf-2.0.8b-6.2.el6.x86_64.rpm 

途中略
 
更新中 / インストール中...
   1:nkf-1:2.0.8b-6.2.el6             ################################# [100%]
```



## postfixのインストール、設定

```
sudo yum install postfix -y
sudo rm /etc/postfix/main.cf
```

/etc/postfix/main.cfを作成して編集

```
myhostname = hogehoge.jp
mydomain = hogehoge.jp
myorigin = hogehoge.jp
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown
message_size_limit = 10485760
mynetworks = 10.0.0.0/16, 127.0.0.0/8
```

## sendmailを停止して、postfixを立ち上がるように

```
sudo service sendmail stop
chkconfig sendmail off
sudo chkconfig postfix on
sudo service postfix start
```

# 監視用のシェルの導入
作成しました公開中です。

[https://takao_yasuhiro@bitbucket.org/takao_yasuhiro/urlmonitor.git]
(https://takao_yasuhiro@bitbucket.org/takao_yasuhiro/urlmonitor.git)

## インストール
```
git clone https://takao_yasuhiro@bitbucket.org/takao_yasuhiro/urlmonitor.git
```

##設定ファイル情報


### 重要な項目を抜粋
```
#サービスID（英数字8文字以内）
SERVICE_ID=HOGEHOGE

#監視対象のURL
URL="https://www.facebook.com/“

#モニターモード MONITOR_MODE
#0:障害が継続している限りは毎回,障害通知を出す。
#  復旧した場合は、何も通知を出さない。
#1:障害が継続しても初回のみ障害通知を行う。
#  復旧した場合は、復旧の通知を出す。
MONITOR_MODE=0

#送信先のアドレスのリストファイル
ADDRESS_LIST_FILE=/home/ec2-user/urlmonitor/conf/mail.list

```

##送信先のアドレスのリストファイル
/home/ec2-user/urlmonitor/conf/mail.list

改行で複数のメールアドレスを記載する。

```
aaaaa@bbbb.com
aaaaa@bbbb.com

```


## 実行方法

```
/home/ec2-user/urlmonitor/bin/urlmonitor.sh 設定ファイル
/home/ec2-user/urlmonitor/bin/urlmonitor.sh /home/ec2-user/urlmonitor/conf/sample.conf 
```

障害通知メールサンプル

```
https://www.facebook.com/との通信でエラーが発生しました
 5分周期で監視しています
 障害が復旧するまで毎回通知します
 障害発生確認: 04/29 12:20:33
 再実行回数=3
 タイムアウト秒=8
 ----------------------------
 wgetの実行結果
 ----------------------------
 スパイダーモードが有効です。リモートファイルが存在してるか確認します。 --2016-04-29 12:20:33-- https://www.facebook.com/ve リモートファイルが存在していません -- リンクが壊れています!!!
```

復旧通知メールサンプル

```
https://www.facebook.com/ が復旧しました。
 障害発生確認: 04/29 11:06:11
 障害復旧確認: 04/29 11:10:25
```

## crontab に登録して5分周期で動くように調整
Dockerホストティングサービス

# Amazon ECS
https://aws.amazon.com/jp/ecs/details/

# Google Container Engine
https://cloud.google.com/container-engine/

# Docker Cloud (Tutum)
https://cloud.docker.com/ (https://www.tutum.co/)

# IBM Containers
https://console.ng.bluemix.net/docs/containers/container_index.html


# Arukasu
https://arukas.io/

# moCloud
https://mocloud.io
plantUMLの描画がバグる

plantUMLでpartitionを使って記述すると描画がやたら縦に伸びてしまうという不具合にぶつかった時の対処法。

# 原因

GraphVizのバグの模様。
http://plantuml.sourceforge.net/qa/?qa=4449/unstable-height-using-partition-sequence-activity-diagram&show=4450#a4450
GraphVizが2.39.0だとバグります。

# 解決方法

GraphVizのバージョンを2.38.0にする。
brewでインストールすると2.38.0が入るので、環境変数としてGRAPHVIZ_DOTにdotコマンドのインストール先のパスを指定すればOK。
大量の画像ファイル (.gif) を (.png) に変換したコマンド

# 1.この記事で学べること

- 少なくともタイトル通りのことはできる
- 単純に拡張子を変換するときにも応用できそう

# 2.コード例

```
$for file in *.gif; do
>  convert $file ${file%.gif}.png
>done
```
こんな感じ。

```
$for file in *.txt; do
>  mv $file ${file%.txt}.foo
>done
```

こんなこともできそう。
Corona SDKでAndroid用ビルドをした時にインストールエラー103が出た時の対応

とりあえず自分がハマった問題のメモ。

# 経緯
1. 今までCoronaSDKでAndroidアプリを作成していた
2. ある時MacOSXを再インストールして開発環境をイチから再構築した。
3. その後、CoronaSDKでアプリのアップデートを作成して公開した
4. しかし、古いAndroid端末（Android4.0）でインストールエラー103が出るとの報告がきた。

# 原因の推測

OSX El Capitanをクリーンインストールした時にJava1.7をインストールしていた。古いAndroidをサポートするためにはJava1.6でビルドしないと問題になることが多いっぽい。

# 対応１

とりあえずJava1.6にダウングレードすることにした。

1.まず、以下のページを参考にJava1.7以降をアンインストール
https://machow2.com/how-to-uninstall-java-from-el-capitan/

```lang:OSX_Terminal
$sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
$sudo rm -fr /Library/PreferencePanes/JavaControlPanel.prefpane

$sudo rm -fr /System/Library/Java/JavaVirtualMachines/jdk1.x.x_xx.jdk
or
$sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.x.x_xx.jdk
```

2.次に、以下からOSX用のJava1.6をダウンロードしてインストール
https://support.apple.com/kb/dl1572?locale=en_US

これで解決すると思ったら・・・

# Android build failed (256)！？

CoronaSDKでリリース用のAndroid用ビルドをしようとしたところ「Android build failed (256)」が発生。Corona Terminalのログを見るとどうやら「jarsigner returned: 1」が原因らしい。いろいろ調べたところ、jarsignerは1.6と1.7以降で処理が違うらしく、この辺の処理を考慮する必要があるらしい。

# 対応２

いろいろ試行錯誤した結果、以下の手順でエラーが消えた・・・？

1. Corona SimulatorでAndroid用ビルドをするときにbrowseボタンからkeystoreを再度選択。
2. パスワードを入力
3. ビルド

なんだかよくわかりませんがパスワードを入力した時のJDKとビルドをするときのJDKのバージョンが異なるとjarsignerがうまく動かないっぽいです。なので、JDKを変更した時は一度keystoreを再選択してパスワードを入力し直しましょう。たぶん。

# 対応３

上記でOKかとおもいきや、いつの間にかエラー256が復活するようになり、今度はパスワードを入れなおしてもうまくいかない現象に当たりました・・・。

jarsignerがエラーを返すというのまでは同じなので、Corona Simulatorが呼んでいるビルドスクリプトを少し追ってみました。自分の場合は、どうもkeysotoreで使用した暗号化アルゴリズムとbuild.xmlで指定しているアルゴリズムが異なるのが問題っぽいです。JDK1.7のjarsignerだとこの辺を上手く捌いてくれるっぽいのですが、JDK1.6だとなんかエラーになるっぽい？でも昔は上手くビルドできてたような気がするのだが・・・謎。

```
$keytool -v -list -keystore <アプリのキーストアファイル名>
（略）
	 署名アルゴリズム名: SHA1withDSA
```

```lang:build.xml
/Applications/CoronaSDK/Corona Simulator.app/Contents/Resources/build.xml

		<exec executable="jarsigner"
			  dir="${TEMP_DIR}"
			  failonerror="false"
			  resultproperty="sign.apk.via.command.line.result">
			<arg value="-signedjar"/>
			<arg value="${APK_APP_NAME}-signed.apk"/>
			<arg value="-keystore"/>
			<arg value="${KS}"/>
			<arg value="-storepass"/>
			<arg value="${KP}"/>
			<arg value="-sigalg"/>
			<arg value="MD5withRSA"/> <!-- ここ -->
			<arg value="-digestalg"/>
			<arg value="SHA1"/>
			<arg value="${APK_APP_NAME}-unsigned.apk"/>
			<arg value="${KA}"/>
		</exec>

```

とりあえず、いいのかどうかわかりませんが、上記build.xmlの-sigalgの引数を署名アルゴリズム名と同じにしてみました（自分の場合はSHA1withDSAで）。そうしたところようやくエラーも消え、古いAndroidでも動くようになりました。ただし、Corona Simulatorではなく、Corona Terminalでないとなぜか上手くいきません・・・。まあ、でも動いたからいいや。ふぅ。
CC3200 RedBareLab WiFi MicroをMacで設定してみた

## はじめに
RedBareLabから発売されているIoT向けのWiFiボードをmacで使ってみます。適当なので間違ってたらすみません。windows向けには大平氏の[Check! WiFiモジュール RedBearLab WiFi Micro (CC3200) を使い始める](http://qiita.com/dz_/items/b9ee46ff08e6a15e59d0)がわかりやすいです。

## 半田付け
最初にソケットとピンヘッダを半田付けします。写真を参照ください。基盤に垂直になるように注意しましょう。
![20160429_190235_720.jpg](https://qiita-image-store.s3.amazonaws.com/0/94721/ded03e45-d397-a1b0-d5a4-af539496f6df.jpeg "20160429_190235_720.jpg")
![20160429_190227_720.jpg](https://qiita-image-store.s3.amazonaws.com/0/94721/f2767984-a857-e523-098a-e460ad7c0f75.jpeg "20160429_190227_720.jpg")
![20160429_190215_720.jpg](https://qiita-image-store.s3.amazonaws.com/0/94721/90e3022c-fc3d-ac3f-65a2-1e470549b216.jpeg "20160429_190215_720.jpg")
![20160429_190207_720.jpg](https://qiita-image-store.s3.amazonaws.com/0/94721/e8b8caff-0ca2-a6e1-ca51-6a49bfc068c8.jpeg "20160429_190207_720.jpg")
## ファームアップデート
ファーム [[4]](https://github.com/RedBearLab/RBL_CC3200/tree/master/MK20)をダウンロードします。ファイル名は「WiFi-Micro_MK20.bin」です。
ファームを書き換えるために、ボタンを押しながらUSBを接続します。
![20160429_192156_721.jpg](https://qiita-image-store.s3.amazonaws.com/0/94721/a9cf15bb-ce6a-b014-0581-7ba04b92b27c.jpeg "20160429_192156_721.jpg")
うまく接続できると、ゆっくりLEDが点滅します。
![20160429_192132_720.jpg](https://qiita-image-store.s3.amazonaws.com/0/94721/608bb286-4746-9c05-4a6d-d62edc939982.jpeg "20160429_192132_720.jpg")

デスクトップにBOOTLOADERというドライブがマウントされます。
ターミナルを開いて以下のコマンドを打ちます。コピー元は正しく修正してください。

```bash:command
cp -X ~/Downloads/CC3200_MK20.bin /Volumes/BOOTLOADER/
```
成功すると点滅が早くなれば良いです。マウント解除して一度USBを取り除きましょう。
## wifiでの操作テスト
USBをPCに刺して、ボードも合体させます。
![20160429_192156_720.jpg](https://qiita-image-store.s3.amazonaws.com/0/94721/d7c3ff69-0ca4-8b54-2ee2-a2af394d86e0.jpeg "20160429_192156_720.jpg")
iPhoneでwifiの「RedBearLab CC3200」に接続します。
ブラウザで192.168.1.1にアクセスし、on,offによってLEDが動作すれば良いです。

## プログラムの書き込みアプリのインストール
- energia[[5]](http://energia.nu/download/)をダウンロードします。「Mac OS X: Signed Binary release version 0101E0017 (12/9/2015) 」にある「energia-0101E0017-macosx-signed.dmg」を使いました。
- マウントされたら、実行ファイルをアプリケーションにドロップします。
- ドライバ等もありますが使いませんでした。

## プログラムの書き込み
- energiaを起動します。
- javaが必要と警告されたら、警告に従ってダウンロードしてインストール。
- ツールからマイコンボードで「RedBareLab WiFi Micro EMT(80MHz)」を選択しました。
- ツール・シリアルポートから正しいポートを選択します。
- Window内の↑ボタンを押してExamples -> Basic -> Blinkを選択します。
- Window内の→ボタンを押して実行します。
- ボードが点滅すれば成功です。

## リンク
製品ページ [[1]](http://redbear.cc/wifi-micro/)
スイッチサイエンス [[2]](https://www.switch-science.com/catalog/2360/)
github [[3]](https://github.com/RedBearLab/RBL_CC3200)
ファーム [[4]](https://github.com/RedBearLab/RBL_CC3200/tree/master/MK20)
energia [[5]](http://energia.nu/download/)
vimのプラグイン（NeoBundleで管理）が効いてない？


プラグインをインストールしたつもりだが、
どうもプラグインが効いてなさそうだったので、

1. そもそもプラグインがインストールされているかを確認して、
2.  インストールするまで

の流れをまとめました。


### help

```vim
:help NeoBundle
```

### プラグインの一覧を表示

```vim
:NeoBundleList
```

![NeoBundleList.png](https://qiita-image-store.s3.amazonaws.com/0/118590/e92ce248-8220-ad5d-5239-2cbf59c13b9a.png "NeoBundleList.png")

#### #: not sourced

updateしてvimを再起動すると#がなくなりました。
updateした後でvimを再起動したので、再起動は必須かはわかりません。

```vim
:NeoBundleUpdate
```

#### X: not installed

文字通り、プラグインをinstallすれば大丈夫です。

```vim
:NeoBundleInstall
```
キーボードを選んでみよう

デスクトップパソコンの場合、プログラムにしても文章にしても、入力するにはキーボードが必要となります。「とりあえず付いているものを使う」ということもできなくはないですが、こだわって選んでみると世界が変わるかもしれません。

# 自分の事情
自分の場合、子供の頃から筆圧が強く、鉛筆やシャーペンの芯は、使った量より折った量のほうが確実に多い、そんな状態でした。パソコンを使い出してもキーボード圧が強いのは相変わらずで、以下のような数々の武勇伝を生み出していました。

* 強く使いすぎた結果、エンターキーが半分に割れてしまう
* 大学時代、研究室に配属になった時に、標準的なキーボードの打鍵音がうるさく、パンタグラフのものに入れ替えられてしまう
* 会社では同様の理由で**ゴムシートのキーボード**が割り当てられる
 * でも、1年するかしないかのうちにまともに入力できなくなってしまう

ということで、会社で使うマシンの場合は「静音第一」で選ばざるを得ませんでした。

# ふつうのキーボードと、高価なキーボードの違い

ただ使いたいだけなら、1000円も出せばキーボードは手に入ります。それでは、値段が1桁違うようなキーボードは、何が違ってくるのでしょうか。

安価なキーボードでは、スイッチ部分がゴムシートでまとめて整形してあります（「メンブレンスイッチ」と呼ばれます）。これに対し、高級なキーボードの多くでは、キースイッチにもっと複雑（で高価）な仕組みを使っています。

* 静電容量方式…キーの検知を物理的な接触で行うのではなく、非接触で行う方式。スイッチ機構とまったく無関係にキー荷重を設計できる。
* メカニカルスイッチ…キー1つ1つにスイッチを取り付けた方式。スイッチの種類によってキータッチが大きく違ってくる。

あと、構造が複雑になることや、内部を補強してあることもあって、これらのキーボードはふつうのより（キーボード自体の）重さがあります。ノートパソコンでもない限りキーボードはあまり持ち歩くものではないので[^1]、重いことによるデメリットはあまりありません。逆に、重さがあるので安定する、キーの音がキーボードで反響することが少ないなど、むしろメリットになります。

# 試し打ちしてみて

ちょうど出かけた機会に、いろいろなキーボードを試し打ちしてみました。

## 静電容量方式
これは東プレのRealForceと、それのOEMになるHHKB Proというように採用メーカーが限られています。東プレは業務用キーボードも作っていて、誰でも触れるような所ではセブン銀行ATMのテンキーにも採用されています。

業務用がメインということもあって信頼性は高く、また機械的に触れる部分がないので打鍵音も静かです。打った感触としては、「すっと吸い込まれるような」感じでした。

これも悪くはないのですが、機構の複雑さか、はたまた競合がないからか、メカニカルよりさらにひとまわり高価なキーボードとなっています。

## メカニカルスイッチ
スイッチにも何種類かあって、Cherry MXという種類のスイッチがよく使われています。そして、このスイッチの中でも押し心地が違うものが何種類かあって、色の違いで「茶軸」・「青軸」・「赤軸」・「黒軸」というように呼び分けられています。それぞれのスイッチは[このあたり](http://www.diatec.co.jp/products/CHERRY/)に違いが書かれていますが、自分が打ってみたところ、茶軸・赤軸では軽すぎて下まで当たってしまうような感じでした。青軸と黒軸はそこそこ打ちやすかったのですが、会社で静音を求められたことへの反動もあって、クリック音がする青軸キーボードを選んでみました。

# 最後に
PC関連の機器は、「高いもののほうが性能がいい」ですが、ことキーボードについてはそれ自体の性能[^2]というより、「自分との相性」のほうが重要となってきます。打ちやすいキーボードで、快適なプログラミングライフを送って行ってください。


[^1]: キーを極限まで削ったHHKBの生みの親である和田英一先生は、「カウボーイにとっての馬の鞍のごとく、キーボードもどこにでも運んで使うものだ」という考えだったとのことです。
[^2]: ゲーム用などで同時入力数が重要になるなど、性能が必要になることもなくはないです。
僕の考えた最強のsketchで便利なカスタムショートカットの作成方法

#背景
sketchはWEBデザインを作成する上で非常に便利なツールですね。
痒いところに手の届く機能や、豊富なプラグインでほとんどのことは実現可能かと思います。

ですが、意外と困るのが一部のアクションに対するショートカットです。

例えば、「オブジェクトの整列」とかです。

この記事では、macの設定を利用して、カスタムショートカットを設定する方法と、設定して便利だった物を備忘録的にご紹介します。

##カスタムショートカットの設定方法

1.macの設定を開く
2.「キーボード」を選択
3.「ショートカット」を選択
4.「アプリケーション」を選択
5.「追加」ボタンよりsketchを選択
6.メニュータイトルにはそのアプリケーション内のメニューコマンドの位置を記入します。
7.キーボードショートカットには、どのコマンドでショートカットを起動させるかを入力します。
＊既存のショートカットとバッティングしないように注意しましょう。
8.設定が完了した、アプリで動作を確認しましょう。

![スクリーンショット 2016-04-30 10.22.34.png](https://qiita-image-store.s3.amazonaws.com/0/63060/c4a7b02b-d537-3e4a-2061-c97c6e45fdc0.png)


##ショートカットの設定事例

|ショートカットの内容　|メニュータイトル|ショートカットコマンド(例)| 
|:--|:--|:--:|
|整列：中央揃え|Arrange->Align->Horizontally|command+]|
|IconFontを一覧から選ぶ|Plugins->Icon Font->Grid Insert->FontAwesome|option+F|
|Run|Plugins->🏃🏿 Runner->Run...|command+@|


##おすすめプラグイン

###■🏃🏿Runner：一言で言うと→sketch版のAlfred
https://sketchrunner.com/

###■sketch-iconfont：一言で言うと→簡単にiconfontを一覧から挿入できる
https://github.com/keremciu/sketch-iconfont

##追記
随時、更新していきます。
TeXでPDFを入れるときにno BoundingBoxと怒られる

## 症状
TeXでPDFをgraphicxを用いてコンパイルするときに

```
! LaTeX Error: Cannot determine size of graphic in filename (no BoundingBox).
```

というエラーが出ることがある．出ないときもある．

古いTeX Liveを使っているのならばbbファイルができていないのかなと思って`extractbb`などを実行して`.xbb`ファイルを作ると解決することもあったが，
TeX Live 2015からは自動で`extractbb`が実行されるので，最近出てくるエラーは解決しないことが多い．

単純な解決策としては，TeXファイルの`includegraphics`のオプションで`bb`の値を設定することである．
たとえば，

```
\includegraphics[width=90mm,bb=9 9 358 434]{filename.pdf}
```

のように設定すれば良い．設定する値は`.xbb`ファイルに書いてある．


## 原因と対策

原因は簡単で，PDFのバージョンが1.4以上だとこのエラーが吐かれるようである．
Illustratorなどを用いてバージョンを1.3に落としたらコンパイルが通った．

## 追記

その後，ファイル名に拡張子直前以外のコンマが入っているのが良くないという指摘をうけ，
ファイル名を変更したらPDFのバージョンが1.4以上でも通った．
原因不明．何か分かったらまた追記します．
MDwiki と apache


自分の Mac で、久しぶりに、 `apache` 起動するハメになったので、そのメモも兼ねて。

##MDwiki

- [MDwiki](http://dynalon.github.io/mdwiki/)
イントラ公開メモなるものを作らなきゃならんくなって、仕方無く使う事に。

###設置

[ここ](https://github.com/Dynalon/mdwiki/releases)からリリース（一番上にある zip ）をダウンロードして展開

```
$ mkdir -p ~/Sites/md
$ cd mdwiki-0.6.2
$ mv mdwiki.html ~/Sites/md/index.html
$ mv README.md   ~/Sites/md/index.md
```

http://localhost/~bunzaemon/md/

にアクセスすれば、勝手に `#!index.md` が追加されて、内容が表示される、と。

あとは、md 放り込んで、`#!` 以下にファイル名繋げればいいだけ。

で、

```
$ cat > ~/Sites/navigation.md
#bunzaemon

[top](index.md)
[foo](foo.md)
[bar](bar.md)
```

control + D 押下

くらいはしとく。

###注意

Qiita 関連で。たぶん、きちんと FAQ とか読めば対処法なんかが載ってるんだろうけど。

- 会社のでは、「バッククォート三連+文字列」は解釈してくれない。真っ白になる。
- 引用は効かない。

後者は、自宅では、md へのリンクとみなされる。会社では注意して見てなかったが、引用文は無視された。

## apache

@10.11

###起動
```
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```

これで、http://localhost にアクセスして

```perl
It Works!
```

で、起動確認。

###httpd.conf の編集

```
$ cd /etc/apache2
$ sudo cp httpd.conf httpd.conf.bak_20160429 
$ sudo vi /etc/apache2/httpd.conf
$ diff httpd.conf.bak_20160429 httpd.conf
166c166
< #LoadModule userdir_module libexec/apache2/mod_userdir.so
---
> LoadModule userdir_module libexec/apache2/mod_userdir.so
493c493
< #Include /private/etc/apache2/extra/httpd-userdir.conf
---
> Include /private/etc/apache2/extra/httpd-userdir.conf
527a528
> Include /private/etc/apache2/users/*.conf
```

###ユーザー.conf の編集

```
$ cat /etc/apache2/users/bunzaemon.conf
<Directory "/Users/bunzaemon/Sites/">
AllowOverride All
Options Indexes MultiViews
Options +FollowSymLinks
Require all granted
</Directory>
```

```
$ mkdir -p ~/Sites
```

適当な index.html を作っとく。

###apache リスタート

```
$ sudo apachectl restart
```

http://localhost/~bunzaemon

にアクセス。
SphinxをLinuxで使う

Python製ドキュメンテーションビルダーsphinxをlinuxで使ってみようという話。

http://sphinx-users.jp/index.html


# 環境

- OS: Debian8

# インストール

```
python -V
```
2.7以上なら特に問題ないはず。

```bash
sudo apt-get install python-sphinx
```

# 初期設定

あとはこっち見ればOK

http://sphinx-users.jp/gettingstarted/make_project.html
Pretzelで静的サイト生成

## Pretzelとは

[pretzel](https://github.com/Code52/pretzel)は .NETプラットフォーム向けの静的サイト生成ツールです。

Jekyll使いたいけど、Windows環境なのでいろいろ面倒くさいとかいう時に使うのだと思います。

## インストール

1. [Code52/pretzel](https://github.com/Code52/pretzel) の releases から最新版のZIPをダウンロードして適当な場所に解凍
2. Pretzel.exe のフォルダにPathを通す（環境変数設定）

## 使い方

下記表の通りコマンドを読み替えて、
[Jekyll入門（ドットインストール）](http://dotinstall.com/lessons/basic_jekyll)で勉強するといいと思います。

| Pretzel | Jekyll | 機能
| ------- | ------ | ---
| create  | new    | サイトの雛形生成
| bake    | build  | サイトの生成（1回）
| taste   | serve  | Webサーバ起動（変更監視）

### コードハイライト

1. [highlight.js](https://highlightjs.org/download/)をダウンロードして解凍
2. プロジェクトフォルダに配置
    - `/styles/default.css` → `/css/highlight/default.css`
    - `highlight.pack.js` → `/js/highlight.pack.js`
3. highlight.jsの呼び出しを記述

```html
<!- ↓headに記述 -->
<link rel="stylesheet" href="/css/highlight/default.css">
<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
```

### 絵文字

1. [emojify.js](http://hassankhan.me/emojify.js/) をダウンロードして解凍
2. プロジェクトフォルダに配置
    - `/dist/css/basic/emojify.min.css` → `/images/emoji`
    - `/dist/images/basic` → `/css/emojify.min.css`
    - `/dist/js/emojify.min.js` → `/js/emojify.min.js`
3. emojify.jsの呼び出しを記述

```html
<!- ↓headに記述 -->
<link rel="stylesheet" href="/css/emojify.min.css">
<script src="/js/emojify.min.js"></script>

<!- ↓bodyの閉じタグの直前に記述 -->
<script>emojify.run();</script>
```
「第９章」XAMPPのインストールとphp.iniの編集

#XAMPPのインストール
[XAMPPのインストール](http://techacademy.jp/magazine/1722)

#php.iniの編集
これからPHPプログラムを作成していくうえで、いくつか設定をしておきたい項目があります。

**C:\xampp\php\php.iniファイルを開いて、**
**次のコードの冒頭にある「；」を削除して次のように記述します。**

◆　`output_handler = mb_output_handler`（バッファを出力する際に文字コード変換が行われるようになります）
【変更前】
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/84707cea-af5e-5ac9-6e07-52cf203e634f.png)
【変更後】
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/1768cfd7-9235-14c6-4263-4eb59a2afef4.png)

◆　`default_charset="UTF-8"`（HTTPヘッダーに出力するデフォルトの文字コードをUTF-8に指定します）
【変更後】
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/cfcc4607-9fb7-3b11-b948-674eb0acbde7.png)

◆　`mbstring.language = Japanese`（デフォルトで使用する言語を日本語に設定します）
【変更後】
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/8eb56b01-881c-55bc-64fb-d8a5adea0272.png)

◆　`mbstring.internal_encoding = UTF-8`（PHPのソースファイルで使用するエンコード方式をUTF-8に指定します）

◆　`mbstring.http_input = auto`（HTTP入力用文字エンコードを自動検出させるように指定します）

◆　`mbstring.http_output = auto`（HTTP出力用文字エンコードを自動検出をパスするようにします）

◆　`mbstring.encoding_translation = Off`（HTTP入力用文字エンコードの自動変換をオフにします）

◆　`mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII`（PHPのソースファイルで使用される文字のエンコード方式の検出順を指定します）

◆　`mbstring.substitute_character = none`（コードとして変換できない文字がある場合に、代替の文字を出力しないように指定します）

◆　`date.timezone = Asia/Tokyo`（タイムゾーンの指定）

設定は、以上です。
tracertコマンドの進化版、pathpingコマンド

ネットワークの調査をする際、目的のホストまでの通信経路を確認したり、経路上のルーターまでのパケットの応答時間を確認するのによく使われるtracertコマンド（UNIXやLinuxでは、tracerouteコマンド）。
古くからある馴染み深いコマンドですが、Windowsであれば、pathpingコマンドを使用するという選択肢もあります。

pathpingコマンドは、tracertとpingを組み合わせたようなコマンドで、前半はtracertの様に、指定したホストまでの経路上にあるルーターの一覧を表示し、後半は見つかったルーターに対してEchoパケットを連続して送信して、その応答時間（RTT＝Round Trip Time）と、パケットの喪失率を測定した結果を表示してくれます。

表示される結果はとても簡潔で、整形されているので、tracertよりも見やすく、パケットの喪失率まで分かる分、利便性も向上しています。

日頃、pingとtracertを組み合わせて使っている、あなた。
tracert と traceroute のコマンド名を間違えがちな、あなた。
そんなあなたに、pathping。
お試しあれ。

詳しくは、こちら↓
・[@IT > Tech TIPS：Windowsのpathpingコマンドでネットワークの経路を調査する](http://www.atmarkit.co.jp/ait/articles/0601/14/news014.html)
・[MSDN > pathping コマンドを使用する](https://msdn.microsoft.com/ja-jp/library/cc787365(v=ws.10).aspx)。
Debianの初回設定

ConohaのDebian8向け。

# ユーザ追加
参考：http://qiita.com/n0bisuke/items/4e4419290d789699cafa
## グループ作成

```bash
groupadd user
```

## ユーザのホームディレクトリ作成

```bash
mkdir /home/issei
```

## ユーザ追加

```bash
USERNAME=issei
useradd -g user -s bash -d /home/${USERNAME} ${USERNAME}
passwd ${USERNAME}
```

## ホームディレクトリの権限設定

```bash
chown ${USERNAME}:user /home/${USERNAME}
```

## sudoers

単にsudo実行したいだけならこれで良い

```bash
usermod -G sudo ${USERNAME}
```

編集する場合はこんな感じ

```bash
EDITOR=vim visudo
```

# rootユーザのSSHログイン禁止

```:/etc/ssh/sshd_config
#PermitRootLogin yes
PermitRootLogin no
```

## sshd再起動

```bash
systemctl restart sshd.service
systemctl status sshd.service
```

参考：http://kazmax.zpp.jp/linux/lin_ssh.html
http://qiita.com/haisaihiroki/items/c38cb3c0a331db9b6f69
$(selector).click()を$(document).on('click', selector...に置き換える正規表現

jQuery。
今までずっと`$('.aaa').click(function(){});`とか使ってたけど、それが非推奨になって`.on()`になったので正規表現で一括置き換え。メモ。

```php:置き換え元
\$\(['"](.+?)['"]\)\.(.+?) ?\( ?function ?\(([ ,A-Za-z0-9]*?)\) ?\{
```
```php:置き換え先
\$(document).on('$2', '$1', function($3){
```
sshでmac miniにログインして複数プロセスを起動

# 背景

リモートのmacサーバにsshでログインして、バックグラウンドで動かし続ける、
っていうのを、数ヶ月に１度くらいの頻度でやるのですが、
shell力が低くていつもやり方を忘れるので方法をまとめました。

## ssh でログイン

```
cd ~/.ssh
ssh -i ./server-id_rsa admin@xxx.xxx.xxx.xxx -p yyyyy
```
xxx = アドレス
yyyy = ポート番号

参考 
http://webkaru.net/linux/ssh-command/

## バックグラウンドで起動

```
nohup redis-server < /dev/null 2>&1 /dev/null &
nohup ./run.sh &
```

参考
http://qiita.com/tsuyoshi_cho/items/bb385304481ea8fd3ce1

## 間違って起動したredis-serverを終了

```
redis-cli
shutdown
```

参考
http://qiita.com/yoh-nak/items/69c26e7d627e2b5a95e2

## 間違って起動したshellを終了

```
ps
kill -SIGINT xxxxx
または
kill -SIGTERM xxxxx
```
xxxxx = プロセスID

参考
http://equj65.net/tech/linuxprocessgroup/

## まとめ

shell力が高いとPCのとこまでに行かなくてすむ
eslint-config-airbnbの導入

## 動機

jslintからeslintに乗り換える。
Airbnb JavaScript Style Guideを使いたい。
https://github.com/airbnb/javascript

強制的に綺麗な規則正しいコードを書けるようにしたい。
導入しようと思って、最初試したら読み込みエラーとかになってしまっていたので、正しく設定できる方法を書いておく。

## 設定

https://www.npmjs.com/package/eslint-config-airbnb

ルートディレクトリでインストール

```
npm init -y

npm install --save-dev eslint-config-airbnb eslint-plugin-import eslint-plugin-react eslint-plugin-jsx-a11y eslint
```

同じディレクトリに .eslintrcを配置する。

```
// Use this file as a starting point for your project's .eslintrc.
// Copy this file, and add rule overrides as needed.
{
  "extends": "airbnb"
}
```

こんな構成

```
├── .eslintrc
├── node_modules
│   ├── eslint
│   ├── eslint-config-airbnb
│   ├── eslint-plugin-import
│   ├── eslint-plugin-jsx-a11y
│   └── eslint-plugin-react
```

変えたかったら上書きする
このへん参考。
https://www.ibuildings.nl/blog/2015/11/using-javascript-style-guide

## コードを綺麗にしよう

Errorでまくりでめげてる。
Robolectric で android.util.Log の出力先を変える


## 標準出力に流す方法

についてはググるとすぐに見つかる

```java
ShadowLog.stream = System.out;
```

参考

 * [Where is log output written to when using Robolectric](http://stackoverflow.com/questions/10219915/where-is-log-output-written-to-when-using-robolectric-roboguice/16376281#16376281)
 * [Robolectricで標準出力にログを出力する](http://horie1024.hatenablog.com/entry/2014/03/03/002147)

のだけど、
テストの出力結果がさっぱり読めなくなるのでこれでは幸せになれない…

## ファイルに出力する方法

については直に FileOutputStream から PrintStream を作れば OK

```scala
ShadowLog.stream = new PrintStream(
  new FileOutputStream("hoge.log"), true)
```

これで tail -f も grep もやりたい放題。
ステキ！

## 備考

よく使うやつを参考までに。

### ERROR と WARN のみを出力

Log.DEBUG や Log.VERBOSE などが邪魔な場合につかう

```sh
tail -f your-project/hoge.log | egrep --line-buffered "(E/|W/)" 
```

### ERROR のみを 10 行出力

たとえばスタックトレースを表示したい場合

```sh
tail -f your-project/hoge.log | egrep -A10 --line-buffered "(E/)" 
```

前後の行が必要であれば `-A10 -B10` のように指定する


## 以上

快適なログ出力ライフを！
「第８章」PHP開発者のためのNotepad++設定


#テキストエディターの用意とPHPの設定ファイルの編集
　Webの世界では、UTF-8と呼ばれる文字エンドーディング方式が主流です。日本語などの文字をコンピューターで扱えるデータにするために符号化を行う方法には、SHIFT-JISなどの様々な方式がありますが、WebではあくまでUTF-8ですので、PHPのソースコードを保存するときはUTF-8として保存しなくてはなりません。
　Windows標準のメモ帳はUTF-8で保存することはできるのですが、BOM(バイト・オーダーマーク)という余計なデータが書き込まれてしまうので、PHPプログラムのソースコードを作成することができないのです。
　そこで、誰でも利用できるフリーの定番テキストエディターを紹介します。
##Notepad++のダウンロードとインストール
[Notepad++のダウンロード](http://www.geocities.jp/npp_euc_jp/)
※インストール不要

##エンコード方式を確認
①　メニューの「設定」をクリックして「環境設定」を選択。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/653c7e81-6b1f-a8c5-4212-27a9715076c6.png)


②　カテゴリの「新規作成」を選択。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/b3d99e43-1f0d-10f0-aad5-6270f9b2dd9a.png)

③　「UTF-8(BOMなし)」をオン、「開いているANSIファイルに適用」にチェック。閉じるボタンをクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/5f7d0e97-fd6d-33d1-3e01-e39533162b57.png)


##Windowsでは改行コードをLFにする
PHPで改行を認識してもらうためにはLFに変える必要があります。

| 環境  | 改行（文字コード） |
|:-----------|------------:|
| Windows    |       CR+LF |
| Mac OS X   |          LF |
| UNIX       |          LF |

①　C:\xampp\htdocs\の中にphpsampleというフォルダーを作成し、この中にPHPファイルを保存します。

```lang:hello.php
<html>
<head>
<title>Sample</title>
</head>
<body>
<?php
print　'PHPの世界へようこそ！';
?>
</body>
</html>
```

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/5297c432-c7fe-9118-f0b3-e8a1d7017b53.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/7900f268-6e48-0c68-b727-29832d79fbe8.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/c3ff8250-4d94-8a11-0dba-6f1df43c0de6.png)

②　「編集」→「改行コードを変更」→「Unixフォーマット(LF)に変換」

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/d539d402-ba10-831d-12ea-9f3571f5195f.png)

【変換後】
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/b2b4fff4-efc9-c0a7-4cfd-9fed24aed58f.png)


以上です。
MySQL の NOT NULL制約 を外す メモ

ここでは **mysql5.6系** をベースにしています。
以下のような users テーブルがあったとします。

```

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
  `name` varchar(255) NOT NULL COMMENT '名前',
  `description` text NOT NULL COMMENT '説明',
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='ユーザー'    
```

ここで `description` についている **`NOT NULL制約`** を外したい場合、以下の ALTER文を実行することで実現できます。

```
ALTER TABLE users MODIFY COLUMN description text COMMENT '説明';

[意味]
ALTER TABLE テーブル名 MODIFY COLUMN カラム名 型名 COMMENT 'コメント';
``` 

逆に **`NOT NULL制約`** を付けたいときは以下のようにします。

```
ALTER TABLE users MODIFY COLUMN description text NOT NULL COMMENT '説明';
```
Mac用のセパレートキーボードを購入した

肩こりがひどくて悩んでいたところ、セパレートタイプのキーボードがよいというのを聞いて買ってみました。(参考:[健康なプログラマーはセパレートキーボードに向かう](http://www.oreilly.co.jp/community/blog/2016/03/helthy-programmers-talk-training-part2.html))

今まではMac純正のJIS配列のキーボードを使っていたのですが、購入したキーボードはUS配列なので、キーのリマップ設定を行いました。

ここでは、その設定をメモしておきます。

# 購入したキーボード

<a  href="http://www.amazon.co.jp/gp/product/B009ZNBJBM/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B009ZNBJBM&linkCode=as2&tag=yamada0405-22">Kinesis Freestyle2 Keyboard [KB800HMB-us-20] 【キネシス フリースタイル2 (20インチ) Mac版】</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=yamada0405-22&l=as2&o=9&a=B009ZNBJBM" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

![41H6mvrjqLL._SX355_.jpg](https://qiita-image-store.s3.amazonaws.com/0/9875/26474462-3577-b3c1-6cd5-6e2a25cb3b7d.jpeg)


# 英かなアプリをインストールする
- ダウンロード: https://ei-kana.appspot.com/
- 左右のコマンドキーを単体で押した時に英数/かなを切り替えるようにするアプリです。
- USキーボードには「英数」「かな」キーが存在しないので、このアプリは絶対必要です。

# キーボードの種類をANSIにする
システム環境設定 > キーボード > キーボードの種類を変更 > ANSI（米国その他)

# Caps lockキーをControlキーに変更する
システム環境設定 > キーボード > 修飾キー > Caps LockキーにControlを割り当てる > OK

![スクリーンショット 2016-04-29 19.00.29.png](https://qiita-image-store.s3.amazonaws.com/0/9875/8e9447f8-f5e0-db72-af25-4892a507b887.png)

# キネシス フリースタイル2の商品レビュー

Amazonに日本語のレビューが一つもないので、買ってみた感想を書いておきます。

### 打鍵音
- 打鍵音は静か。個人的にカチャカチャうるさいキーボードが嫌いなので良かった。さすがにMacの純正キーボードよりは多少音がするが、気にならない程度。

### 価格
- Amazonで￥22,080で購入できます(2年間の保証書付き)。[μTRON](http://www.personal-media.co.jp/utronkb/index.html)(5万)や[ErgoDox](http://kammers.aa0.netvolante.jp/20150928201048/)(3万くらい)と比べれば安い。

### キー配列

- JISキーボードから移行したので最初は手こずったが、上記のキーのリマップを行ったら、一時間くらいで慣れた。
string.xmlで先頭と最後のスペースが無視されてしまう場合の対応

#string.xmlで先頭と最後のスペースが無視されてしまう場合の対応
http://endoidou.hatenablog.com/entry/2016/04/29/183718

##このように指定するとスペースが無視されてしまう
``` xml
<resources>
    <string name="hogeText"> hoge </string>
</resources>
```

##文字列を"ダブルクオート"で囲うことでスペースが適応される
``` xml
<resources>
    <string name="hogeText">" hoge "</string>
</resources>
```
Linux初回設定メモ

いつも忘れるのでメモ。
初回起動後の設定。

# ユーザ追加

```bash
useradd -g users issei
passwd issei
```

参考：http://qiita.com/Tooooomin/items/c063cee80227a5f1d95b

## sudoersへの追加

```bash
usermod -G wheel issei
grep wheel /etc/group
```

sudoersを編集する

```bash
visudo
```

ここのコメントアウトを解除すれば良い
※Conohaのcentos7で試した際は、最初から解除済みだった

```
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
```

# rootユーザのSSHログイン禁止

```:/etc/ssh/sshd_config
#PermitRootLogin yes
PermitRootLogin no
```

## sshd再起動

```bash
systemctl restart sshd.service
systemctl status sshd.service
```

参考：http://kazmax.zpp.jp/linux/lin_ssh.html
http://qiita.com/haisaihiroki/items/c38cb3c0a331db9b6f69
TextViewをコードからBOLDにする方法

#TextViewをコードからBOLDにする
http://endoidou.hatenablog.com/entry/2016/04/29/182452

##xmlから指定するとこんな感じ

```xml
<TextView
    android:id="@+id/hoge_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:text="hogehoge"
/>
```
###これをコードからやりたい
```java
TextView hogeText = (TextView) findViewById(R.id.hoge_text);
hogeText.setTypeface(Typeface.DEFAULT_BOLD);
```
###これでOK
ターミナルから、Atomを起動してみたら便利だった。

普段、Macのターミナルで作業していて、ファイル操作をするときにviやvimでファイルを編集するときがあると思います！
~~でも、普段使っているテキストエディターと違って編集しづらすぎる。。~~
と感じたので、ターミナル上から指定したディレクトリファイルを`Atom`を起動する方法をやってみました!

##方法
Atomを起動して、*Atom->Install Shell Commands*で`atom` と `apm` をインストールします。

> apmとは、atomのパッケージマネージャのコマンドのことです。

![JtmFkq5uTNXn4fRH-9E3CB.png](https://qiita-image-store.s3.amazonaws.com/0/122901/56b67794-dac0-bcfc-a286-9f9bcc5ff2eb.png)

インストール後、再度 *Atom->Install Shell Commands*で、下記のポップアップが出ていればOKです! 
(既にインストール済みの方は、初めからこちらが表示されると思います。)

<img width="687" alt="スクリーンショット 2016-04-29 18.09.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/acf74a30-c1fc-7370-1e8f-a1db4c7923e7.png">

ここまで来れば、atomコマンドとapmコマンドが使えるようになっていると思います。

あとは、お好きなディレクトリで、
`$ atom ./`
とすれば、<Font color="red">自動でAtomが起動し、ディレクトリファイルを開いてくれます。簡単！
</font>

[補足情報]内部的には、/usr/local/bin/atomに対して、~/Atom.app/Contents/Resources/app/atom.shがsymlinkとして貼られています。
`/usr/local/bin/atom -> ~/Atom.app/Contents/Resources/app/atom.sh`
Cygwin のプロンプトに Git のブランチを表示する（シンタックスエラーが発生した場合の対策あり）

Cygwin の Bash プロンプトに Git のブランチの情報を表示させる方法です。手順自体は多くの方が公開してくださっているものと同じなのですが，改行コードにまつわる Cygwin 環境ならでは（？）の問題に遭遇したので，その対策もあわせてメモとして残しておきたいと思います。


## ブランチ名を表示する

### git-prompt.sh を入手する

git の GitHub リポジトリから `git-prompt.sh` を入手し，適当な場所に配置します。わたしは Git for Windows（msysGit）にあわせて `/etc/profile.d/` に置きました。`git-prompt.sh` の冒頭に書いてある説明では `~/.git-prompt.sh` に置くことを想定しているようです。

```shell-session
$ wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
$ mv git-prompt.sh /etc/profile.d/
```

### .bashrc を編集する

`.bashrc` に `git-prompt.sh` を読み込む処理を追加します。`/etc/profile.d/` に配置したのでログイン時には自動的に読み込まれているのですが，非ログインシェルとして起動した場合にも読み込まれるように書いておきます。

```bash:.bashrc
source /etc/profile.d/git-prompt.sh
```

環境変数 `$PS1` に `$(__git_ps1)` を埋め込みます。`__git_ps1` というのは `git-prompt.sh` で定義されている関数です。以下の例では見づらくなるため省略していますが，エスケープシーケンスを使って色をつけることもできます。

```bash:.bashrc
export PS1='\u@\h \w$(__git_ps1)\n\$ '
```

これで Git 管理下のディレクトリに入るとブランチ名が表示されるようになります。


## ブランチの状態を表示する

環境変数を設定するとブランチのさまざまな状態を表示することができます。たとえば以下のような環境変数が利用できるようです。

|環境変数|表示される内容|
|:-------|:---|
|GIT_PS1_SHOWDIRTYSTATE|ステージされていない変更がある場合（unstaged）に "`*`" を表示し，ステージ済みだがコミットされていない変更がある場合（staged）に "`+`" を表示する。|
|GIT_PS1_SHOWUNTRACKEDFILES|追跡されていないファイルがある場合（untracked）に "`%`" を表示する。|
|GIT_PS1_SHOWSTASHSTATE|`git stash` で退避した作業がある場合（stashed）に "`$`" を表示する。|
|GIT_PS1_SHOWUPSTREAM|ブランチと Upstream の差を表示する。ブランチが遅れている場合（behind）に "`<`" を，先行している場合（ahead）に "`>`" を，ブランチと Upstream にそれぞれ独自の更新がある場合（diverged）に "`<>`" を，最新の場合（up-to-date）に "`=`" を表示する。|

`GIT_PS1_SHOWUPSTREAM` 以外は任意の値をセットすればオプションが有効になります。

```bash:.bashrc
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
```

オプションの詳しい使い方は `git-prompt.sh` の最初の方に書いてありますので，興味のある方はご確認ください。


## シンタックスエラーが発生した場合

### 構文解析でエラー

Cygwin 環境では `$PS1` のコマンド置換でシンタックスエラーが出ることがあります。

```shell-session
-bash: command substitution: line 1: syntax error near unexpected token `)'
-bash: command substitution: line 1: `__git_ps1)'
```

これは改行コード `CR` を無視する Cygwin 独自のシェルオプション `igncr` による影響のようです。`igncr` が設定されている場合，`$PS1` 内で `$( )` 形式のコマンド置換の後に `\n` が続くと構文解析に失敗してしまいます。バッククォートによる旧式のコマンド置換ではこの現象は発生しません。

### エラーへの対処法

この問題への対策としては以下のようなものが考えられます。

* `igncr` を off にする
* バッククォート形式のコマンド置換を使う
* `$''` でエスケープシーケンスを評価する

ここでは 3 つ目の方法を紹介します。

文字列のクォートに `$''` を使うと，エスケープシーケンスをデコードして置き換えることができます。この場合，`$PS1` には `'\n'` ではなくて「改行文字」がそのまま含まれることになります。詳しくは `man bash` の QUOTING のセクションをご覧ください。

```bash:.bashrc
export PS1='\u@\h \w$(__git_ps1)'$'\n$ '
```

なお，Git for Windows でも `igncr` が有効になっているようですが，ブランチの表示にはバッククォート形式のコマンド置換を使っているので（自分で環境変数を上書きしない限りは）問題ありません。


## 参考資料

* [最近のCygwinでbashのプロンプトにgitのブランチ名を表示する方法 - bearmini's blog](http://bearmini.hatenablog.com/entry/2015/02/18/113748)
* [git :: bash プロンプトにブランチ名と作業ツリーの状態を表示する [Tipsというかメモ]](http://tm.root-n.com/unix:command:git:bash_prompt)
* [backticks - PS1 command substitution fails when containing newlines on msys bash - Stack Overflow](http://stackoverflow.com/questions/21517281/ps1-command-substitution-fails-when-containing-newlines-on-msys-bash)
Linuxへのssh公開鍵認証設定メモ

公開鍵認証を使ってLinuxへSSH接続する設定をしていて、いろいろとはまったのでメモをしておく。

必要なこととして以下の3つがある。

1. SSH接続を受け付ける側（リモート）のLinuxのsshd_configで、公開鍵接続を許可する設定にする。
1. SSHクライアント側（ローカル）でキーペアを作り、公開鍵ファイルをリモートの適切な位置に配置。
* `~/.ssh`ディレクトリなど鍵情報を置いたディレクトリやファイル、リモート側のユーザのホームディレクトリのパーミッションを適切に設定する。

1つ目、2つ目についてはすぐに情報が見つかったが、3つ目についてネット上になかなか情報が見つからず、なかなか公開鍵を使った接続ができなくて困った。

1つめ、2つめについては以下[1]の記事の通りにやればOK。なお、公開鍵のコピーは[2]の記事にあるようにssh-copy-idを使う方が楽。
[1] http://kazmax.zpp.jp/linux/lin_sshrsa.html#ah_1
[2] http://qiita.com/iruseira/items/af8550fea92b5c5f7fca

そして、3つ目のパーミッションの設定は以下のURLに記載があった。
[3] http://unix.stackexchange.com/questions/36540/why-am-i-still-getting-a-password-prompt-with-ssh-with-public-key-authentication

ここの回答から要約すると

* リモートマシンのホームディレクトリ`~`、鍵ファイルを置く`~/.ssh`ディレクトリ、および公開鍵ファイル`~/.shh/authorized_keys`の書き込み権限は、ディレクトリおよびファイルのオーナーユーザのみが持って良い。
 * すなわち、`rwx------`（700）とか`rwxr-xr-x`（755）はOKだが`rwxrwx---`（770）はダメ。
* ローカルマシン上の秘密鍵ファイルの読み込み権限は、そのファイルのオーナユーザのみとすること。つまり`rw-------`（600）とする。

`~/.ssh`ディレクトリに制約があるのは頷けるが、リモートのホームディレクトリのパーミッションに制約があるのが意外だった。これに気付かずにしばらくはまっていた。
Macのスペック上げたらSwiftビルド時間が5分から1分になりました


株式会社Nanameue(http://nanameue.jp/?lang=ja)
 iOSエンジニアのbatiです


Objective -CからSwiftに乗り変えて2か月。
今は新規プロジェクトをPure Swift でやっている状況で、
**そろそろ、Swift最高じゃんもうObjective-Cには戻れないわ**
と感じている頃です。

Swiftは非常に便利なのですが、プロジェクトが大きくなるとコンパイルに時間がかかる時がかかることがしばしばあることが問題視されています。


##具体的な状況##

・ 環境 Macbook Air メモリ8G
・ Xcode version 7.3 
・ 言語 Swift2.2
・ Swiftファイル200(リリース時期になるとおそらく250くらいにはなるでしょう、今後アップデートも含めると最高300にはなりそうです)

##ググった結果##

こういう時はググりましょう
ということでググった結果以下の記事が出てきました

**型推論をなくそう系**
http://cocopon.me/blog/?p=5447
http://qiita.com/rizumita/items/913b05d799b3712260f6

**複数のmoduleにしてみたら系**
https://developers.eure.jp/ios/advent-calendar-18/

**いやいや全てを一つのSwift.fileで書いてみたら系**
https://speakerdeck.com/mpon/swift-compile-time-is-so-slow

##一通りやってみた結果##

**型推論をなくそう系**
とりあえず、わかりきってる型でも型推論allなしでしてみた結果 20秒短縮

**複数のmoduleにしてみたら系**
これはそもそもめんどくさい

**いやいや全てを一つのSwift.fileで書いてみたら系**
これは全体の1/10くらいで挫折しましたが、ビルド時間3秒でした


まあ、ググってやってみたが、そんなに効果はない

##そもそもなぜObjective-Cに比べて遅いのか##

Swiftにはクラスをimportするという概念がないからです。importするのはmoduleだけで、
publicなクラスを作った時点で、全てのfileからアクセスできます。
つまり、全てのfileからアクセスできるようにするのに、時間がかかるということです。

またSwiftのコンパイラの仕組みは以下の記事が非常に参考になりました

http://qiita.com/demmy/items/f08a65298d2f2caf1360


##ではどうやって解決すればいいのか##

このままでは、Swift.file300に到達してしまいます。

そんな状態でarchiveしたらどうなるでしょう。。。

そこで弊社社長のツルの一声

***Mac Proにしたら良くなると思うよ、買ってあげようか***


なんてホワイトなベンチャー企業でしょうか

会社の金で買っていただいた27万のMac Proで早速試したところ、

***build時間が5分→1分に！！！！！！***


ということで、皆さんもこれを機にMac Proにしてみましょう
cURLはfile://に対応している

何の役に立つのかよく知らないけど、file://なURLを渡すとそのファイルを参照することができる。

例えば以下のコードは実行すると自分自身のソースコードを出力する。

```php
<?php
$ch = curl_init('file://' . __FILE__);
curl_exec($ch);
```

PHPの組み込み関数はSCHEME://がなければfile://を補完してくれるけど、curlの関数はそういった機能はないらしい。file://を明示的に書く必要がある。

これはコマンドラインのcurlでも同じで、file://で動く。

```bash
$ curl -v 'file://hoge.php'
```

読めるけど、書き込みはできないっぽい？
c++ builder XE4, 10.2 Tokyo > String > 複数行Stringを降順にする

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

```
1\r\n
2\r\n
3\r\n
```
という`<CR><LF>`終端の複数行文字列を以下のように降順にする。

```
3\r\n
2\r\n
1\r\n
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <memory>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String res;

	res = res + L"1:\r\n";
	res = res + L"2:\r\n";
	res = res + L"3:\r\n";

	String strrev = getStringInReverseOrder(res);

	ShowMessage(strrev);
}
//---------------------------------------------------------------------------

String __fastcall TForm1::getStringInReverseOrder(String srcstr)
{
	// <CR><LF>終端の複数行文字列を降順にする

	std::unique_ptr<TStringList> sl(new TStringList);
	sl->StrictDelimiter = true;
	sl->Delimiter = L'\n'; // <LF>を改行識別に使う
	String srcstrWithoutCR = StringReplace(srcstr, L"\r", L"", TReplaceFlags()<<rfReplaceAll);
	sl->DelimitedText = srcstrWithoutCR; // 余分な<CR>は除去

	String dststr;
	for(int idx=sl->Count - 1; idx>=0; idx--) {
		dststr = dststr + sl->Strings[idx] + L"\r\n";
	}

	int pos = dststr.Pos(L"\r\n");
	if (dststr.Pos(L"\r\n") == 1) { // 先頭の改行を除去
		dststr = dststr.SubString(3, MAXINT); // MAXINT:最後まで
	}

	return dststr;
}
```

元のString文字列の最後が空行の時の処理がいまいち。
時間が確保できないので、ここまで。
cronの重複実行を防ぐちょっとした処理


cron処理で、メール送信のような普通にやると冪等性がない、またはなにかしらの理由で同時に二度やりたくない処理をする場合があると思います。

その場合

```ruby
module CronHelper
  def process_already_exists?(task_name)
     process_count = `ps -ef | grep #{task_name} | grep -v grep | wc -l`.to_i
     process_count > 1
  end
end
```

のようにprocessの数を見て、すでにあるかどうかをruby側から見れるようにして

```ruby
require "#{Rails.root}/app/helpers/cron_helper"
include CronHelper

namespace :cron do
  namespace :rake_name do
  
    task :greet do |task|
      next if process_already_exists?(task.name)
      
      p 'Hello World!!'
    end
    
  end
end
```

のようにrakeタスクに入れれば防げます。


### 参考

* [[Rails][ruby] rake task の多重起動を禁止する排他処理を行う答えを知りたい | 答えを知りたい](http://programming.ironsand.net/2015/rake-task-%E3%81%AE%E5%A4%9A%E9%87%8D%E8%B5%B7%E5%8B%95%E3%82%92%E7%A6%81%E6%AD%A2%E3%81%99%E3%82%8B%E6%8E%92%E4%BB%96%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86/)
* [ruby on rails - How do I use helpers in rake? - Stack Overflow](http://stackoverflow.com/questions/1450112/how-do-i-use-helpers-in-rake)
iOSデバイスをビーコンとして利用する（CoreBluetooth::CBPeripheralManager.startAdvertising）

# iOSデバイスをiBeaconとして利用する

*iOSデバイスをiBeaconとして利用するためには、アプリケーションが常にフォアグラウンドで動作しなければならない*

## UUID生成

ターミナルから「uuidgen」を実行

*128ビットの値である近接UUID（universally unique identifier）は、特定のタイプまたは特定の組織によって発信されているものとして、1つ以上のビーコンを一意に識別*

## ビーコン領域作成・発信

```swift:ViewController.swift
import UIKit
import CoreLocation
import CoreBluetooth

class ViewController: UIViewController, CBPeripheralManagerDelegate {
    
    var myPeripheralManager: CBPeripheralManager!
    let myProximityUUID = NSUUID.init(UUIDString: "YourUUIDCreatedInTerminal")

    override func viewDidLoad() {
        super.viewDidLoad()
        
        myPeripheralManager = CBPeripheralManager(delegate: self, queue: nil)
        
    }

    func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager) {
        if peripheral.state == CBPeripheralManagerState.PoweredOn {
            let beaconRegion = CLBeaconRegion.init(proximityUUID: myProximityUUID!, major: 0, minor: 0, identifier: "com.mycompany.myregion")
            let beaconPeripheralData = NSDictionary(dictionary: beaconRegion.peripheralDataWithMeasuredPower(nil))
            
            myPeripheralManager.startAdvertising(beaconPeripheralData as? [String : AnyObject])
        }
    }
```

「YourUUIDCreatedInTerminal」はターミナルで生成したUUIDに置換
major値は、16ビットの符号なし整数で、同じUUIDを持つビーコンをグループ化するために使用（省略可）
minor値は、16ビットの符号なし整数で、同じUUIDと同じmajor値を持つビーコンを区別するために使用（省略可）
identifierは、コード中で領域を参照するための一意の文字列で、ビーコンが発信する識別情報とは無関係

*ビーコン領域をUUID値のみで設定するのも珍しくない。この場合、指定されたUUIDのビーコン範囲内にデバイスが入ると、ビーコンまでの距離を測定し、近隣にある個別のビーコンに関する詳細情報を取得する。*

## 参考情報

[位置情報とマッププログラミングガイド](https://developer.apple.com/jp/documentation/LocationAwarenessPG.pdf)
[任意の値でのiBeaconの発信 - 逆引きSwift(iOS編)](https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/06-corelocation/003-ren-yino-zhidenoibeaconno-fa-xin)
[【連載】Bluetooth LE (3) iOS デバイスを Bluetooth LE 機器にする](http://blog.fenrir-inc.com/jp/2013/10/bluetooth-le-ios-2.html)
LInux環境におけるuser追加とsudo管理者権限の付与

忘備録として記載。

#user追加とパスワード設定
以下のコマンドを実行

```
# useradd user_name
# passwd user_name
```

##ユーザに全sudo権限を許可する場合

visudoコマンドにて以下の一行を追記
%user_name ALL=(ALL) ALL


以上
自社ブログを爆速で立ち上げた話

技術の話はほとんどありません。

# 言いたいこと

平常業務と並行して1週間強でちゃんとした自社ブログ開設が可能。
自社サービスを知ってもらうこと、応援してもらうことは大事。
人材不足の昨今、良い人材が集まる下地となる。

# タイムライン
上記の通り、ブログ発信したいなと考えていた。
社長も同じ考えをもっていて、最小人数3名で立ち上げようとなった。

社長は、ポリシーや方向性のジャッジ、一発目の記事。
デザイナは、クリエイティブやユーザー体験のジャッジ。
エンジニアである私は、環境の選定や構築、ディレクション。

## 1,2日目

キックオフMTGで要件とスケジュール確定。

・独自ドメインと独自デザインが良い・広告入るの嫌だ
　→外部の無料ブログは使わない
・デザインを一からやるのは無理、サーバーも面倒なメンテしたくない
　→ホスティングのwordpressでいっか
・GW前に出したいね
　→7営業日しかないけどとりあえずスタートしよう

自社サーバーにwordpress入れて、テーマ選定とCSS修正の着手。
適当なホスティングの無料期間でやってもよかった。

## 3,4日目
テーマ確定。
cssだけじゃなくphpの修正もでてきた、GitHubでコード管理し始めた。
（いずれCIツールでSFTP自動リリースしてやろう）

タスク管理をTrelloで開始、それぞれのスケジュール感を1日単位で明記。
作業終了をDone、それを他者が確認してOKボードに移す運用ルールにした。

ホスティング選定。
自社の紹介をちまちま更新していく、あまりマス向けではない。
重要視：永続性、安定性、応答性、メンテ性、セキュリティ
軽　視：コスト、多機能性、複数アカウント
結果。
xserverが大手みたいだけど、いわゆるレンタルサーバーな感じがなんか。。。
GMOがちょっと前に刷新したz.comにしよう。
ブログが流行ると割高だけど越せばいいし。

## 5,6日目
タイトル決定。
顔となるヘッダー画像の作業。

ホスティング契約。
親ドメインが親会社管轄なので、DNSの調整や設定をする。

## ７,８日目
諸々、作業発生。
会社サイトからの導線も一緒に出しておこう。
GA仕込んでおこう。

晴れて公開。

# 公開後

Facebookで拡散したけど、OGP設定全然してなかった・・・
Ruby on Railsのdevelopment環境でproductionのDBに接続する

## 環境

- Rails 4.2.3
- ruby 2.1.3p242

## 前提
- 本番環境セットアップ済み
- サーバアクセスはssh経由

## 手順

1. database.ymlの設定

※{}は任意の数値です

```
# development:
#   <<: *default
#   database: hoge_development

development:
  <<: *default
  host: 0.0.0.0
  database: hoge_production
  username: {user}
  password: {pass}
  post: {port}
```

2. 以下のコマンドでサーバにssh接続する

```
ssh -L {port}:localhost:{port} {user}@{hostname} -p {sshport}
```

3. ローカルでサーバを立ち上げる

```
bundle exec rails s
```

以上。
匿名型のインスタンスを動的に生成する

[C# Language Specification 5.0](https://www.microsoft.com/en-us/download/details.aspx?id=7029) §7.6.10.6  によれば、匿名型を使うと以下のようなクラスがコンパイル時に自動生成されます。

```csharp
class __Anonymous1
{
	private readonly T1 f1 ;
	private readonly T2 f2 ;
	…
	private readonly Tn fn ;
	public __Anonymous1(T1 a1, T2 a2,…, Tn an) {
		f1 = a1 ;
		f2 = a2 ;
		…
		fn = an ;
	}
	public T1 p1 { get { return f1 ; } }
	public T2 p2 { get { return f2 ; } }
	…
	public Tn pn { get { return fn ; } }
	public override bool Equals(object __o) { … }
	public override int GetHashCode() { … }
}
```

つまり、リフレクション等でパブリックコンストラクタを呼び出すことで、型パラメータやTypeで受け取った匿名型をインスタンス化することができます。

```csharp
var obj = new { Foo = 1, Bar = "hoge" };

var ctor = obj.GetType().GetConstructors()[0];
var obj2 = ctor.Invoke(new object[] { 1, "hoge" });

// obj.Equals(obj2) => true
```

Expressionを組み立てる場合も、上記のように取得した ConstructorInfo と引数群を`Expression.New()` に渡す形になります。

## 引数の順番

特定の型のインスタンスを動的に生成したい、というとシリアライザとかマッピングとかそういった話が多いと思います。この場合プロパティ名を基準にしたいですが、コンストラクタには値の配列で渡さなければいけません。

まず、言語仕様では言及されていませんが、プロパティ `p1` とコンストラクタ引数 `a1` は実際には同じ名前が付けられています。この引数名を `ParameterInfo.Name` で取得することで、プロパティ名と一致させることができます。

```
var obj = new { Foo = 1, Bar = "hoge" };
var dic = new Dictionary<string, object>
{
	{"Foo", 1},
	{"Bar", ""}
};

var type = obj.GetType();
var ctor = type.GetConstructors()[0];
var args = ctor.GetParameters().Select(p => dic[p.Name]).ToArray();
var obj2 = ctor.Invoke(args);
```

Json.NETには [`JsonConvert.DeserializeAnonymousType()`](http://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm)というメソッドがありますが、これも匿名型を特別扱いしているわけではなく、「デフォルトコンストラクタがなければ、コンストラクタの引数名に対応させる」というロジックに乗せているようです。

あるいは、プロパティの定義順とコンストラクタ引数の順番が同じという点に着目します。厳密には[定義順をリフレクションで取得する方法は用意されていない](http://stackoverflow.com/a/8872279/2818869)ものの、単純な型について `Type.GetProperties()` を呼び出す分には定義順で取得できるようです。

```
var obj = new { Foo = 1, Bar = "hoge" };
var dic = new Dictionary<string, object>
{
	{"Foo", 1},
	{"Bar", ""}
};

var type = obj.GetType();
var args = type.GetProperties().Select(prop => dic[prop.Name]).ToArray();
var obj2 = type.GetConstructors()[0].Invoke(args);
```
Rspecでコンソールにログを出力させる方法

# Rspecで、コンソールにログを表示させる方法

## 環境
- ruby 2.2.3p173
- Rails 4.2.6
- Rspec 3.4.4


## rails_helper.rbに追記

Rails.logger のログは下記を追記。
`Rails.logger = Logger.new(STDOUT)`


```lang:spec/rails_helper.rb
(snip)

# logger
Rails.logger = Logger.new(STDOUT) # 追記

RSpec.configure do |config|
(snip)
```

SQLの実行ログは下記を追記。
`ActiveRecord::Base.logger = Logger.new(STDOUT)`

```lang:spec/rails_helper.rb
(snip)

# logger
ActiveRecord::Base.logger = Logger.new(STDOUT) # 追記

RSpec.configure do |config|
(snip)
```

以上

[参考]
http://blog.beaglesoft.net/entry/%3Fp%3D706
AESによる暗号化するためのライブラリ

[暗号技術入門第3版](http://www.amazon.co.jp/%E6%9A%97%E5%8F%B7%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E7%A7%98%E5%AF%86%E3%81%AE%E5%9B%BD%E3%81%AE%E3%82%A2%E3%83%AA%E3%82%B9-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797382228)を読んで、AESで暗号化するためのライブラリを、各言語でちょっと調べてみました。

大抵は標準APIにあるので、それを使うのが良さそうです。

# Java 

http://www.ne.jp/asahi/hishidama/home/tech/java/aes.html

http://www.trustss.co.jp/Java/JEncrypt100.html

http://www.madirish.net/561

# Elixir

Erlangにあるようです。

http://erlang.org/doc/man/crypto.html

http://blog.danielberkompas.com/elixir/security/2015/07/03/encrypting-data-with-ecto.html

# Ruby

http://docs.ruby-lang.org/ja/2.2.0/class/OpenSSL=3a=3aCipher=3a=3aAES.html
rbenvを用いたrubyのインストール手順

rbenvを用いたrubyのインストール手順を忘備録として書いておく。

#環境
CentOS 6.7

#まずはrbenvインストール

```
$ sudo yum -y install git
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

#rbenv環境設定

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
$ rbenv --version
```

#ruby-buildインストール

```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install --list
```

#Rubyインストール(version2.2.2を入れる場合)

$sudo yum -y install gcc make openssl-devel readline-devel

$rbenv install 2.2.2

$rbenv global 2.2.2

$ruby -v


#bundlerインストール

$gem install bundler --no-rdoc --no-ri
WNMP環境を一気に起動/停止するbatファイル

# 動機

`nginx.conf`の記述は（おそらく）間違っていないのに、`index.html`は表示されるが、`phpinfo.php`がタイムアウトする。
原因はfast-cgiが起動していなかったためだった。
毎回それぞれターミナルを立ち上げて（Nginx/php-cgi/mysql）起動するのが面倒だったので、一括で起動/停止するbatファイルがあれば楽だと思った。

# 前提

* NGINX_HOME -> c:\nginx\
* MYSQL_HOME -> c:\"Program Files"\MySQL\"MySQL Server 5.7"\
* PHP_HOME -> c:\php\

なお、今回製造したbatファイルの配置先はNGINX_HOME直下とする。

# 実装

## start.bat

```bat:start.bat
@echo off
rem ログファイルがあるのでホームディレクトリをNGINX_HOMEにする
cd /d %~dp0
rem 各exeファイルの起動
start .\nginx.exe
rem レスポンスが返らないため、バックグラウンドで実行
start /b c:\php\php-cgi.exe -b 127.0.0.1:9000
start C:\"Program Files"\MySQL\"MySQL Server 5.7"\bin\mysqld.exe
echo Starting nginx php-cgi mysql
echo .
```

## stop.bat

```bat:stop.bat
@echo off
cd /d %~dp0
start c:\nginx\nginx.exe -s quit
taskkill /f /IM nginx.exe
taskkill /f /IM php-cgi.exe
c:\"Program Files"\MySQL\"MySQL Server 5.7"\bin\mysqladmin shutdown -u root
echo Stopped nginx php-cgi mysql
echo .
```

# 参考Webページ

* [nginx+php-cgi+mysqlのお手軽起動環境を作成する(Windows) « Php « Prog « Laddy in](http://www.laddy.info/2012/05/18347/)
* [【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ - Qiita](http://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a)
MyBatis 3.4でBLOB/CLOBのTypeHandlerがサポートされた

MyBatis 3.4から、BLOGと`java.io.InputStream`、CLOBと`java.io.Reader`変換用の`TypeHandler`がようやく本家に組み込まれました :smile: 
MyBatis 3.3までは、BLOBと`byte[]`、CLOBと`java.lang.String`変換用の`TypeHandler`はありましたが、大きなデータを扱うことが多いBLOBとCLOBで利用できるケースは稀で、皆さん自作していたのではないでしょうか？
実際に、私は自作していました・・・

特に使い方を説明をする必要はないと思いますが・・・簡単に説明しておきましょう。

# 動作検証バージョン

* MyBatis 3.4.0

# MyBatis 3.4で追加されたBLOG/CLOB用のTypeHandlerについて

追加されたTypeHandlerは、JDBC 4.0 (Java 1.6)で追加されたAPIを使用することで、BLOGと`java.io.InputStream`、CLOBと`java.io.Reader`の変換を実現しています。
そのため、JDBC 4.0の該当メソッドが仕様通りに実装されていないJDBCドライバーでは使うことができません。

> **Note: JDBC 4.0のサポート状況**
> BLOBとCLOBを使う場合は、JDBCドライバーのサポート状況を確認してください。MyBatisが使っているメソッドがサポートされていない場合は、残念ながら`TypeHandler`を自作する必要があります。
> 最近のJDBCドライバーであれば、だいたいサポートしていると思いますが、PostgreSQLでは最近BLOBがサポートされました。（なお、当時はCLOBはサポートされていませんでしたが、最近はサポートされているかもしれません・・・）

# TypeHandlerの適用方法

MyBatis組み込みのBLOB/CLOB用の`TypeHandler`を適用したい場合は、JavaBeanのプロパティを`InputStream`や`Reader`にするだけです。

```java
public class Profile {
    private int id;
    private String name;
    private InputStream faceImage; // BLOB
    private Reader introductionText; // CLOB

    // ... (Other field and setter/getter)

}
```

# まとめ

JDBC 4.0実装のJDBCドライバーを使っている場合は、MyBatis 3.4にバージョンアップしたら自作の`TypeHandler`は不要になります。
私が携わっているプロジェクトでも、自作していた`TypeHandler`は削除しました :v: