OmniAICreator/Qiita-1.07M huggingface dataset:
Bitnami Redmine を CentOS7 Minimal にインストールしようとして七転八倒

# 環境

- CentOS-7-x86_64-Minimal (GUIなし)
- bitnami-redmine-3.2.0-2-linux-x64

# 現象
インストール成功…と思ったら、Redmineが起動してくれませんでした。。。

## インストール手順
bitnami-redmineのインストーラを実行し、インストールプロセスを進めていく。

```shell-session:
# cd
# chmod +x bitnami-redmine-3.2.0-2-linux-x64-installer.run
# ./bitnami-redmine-3.2.0-2-linux-x64-installer.run

(略)

エラー: 実行中にエラーが起きました /opt/redmine-3.2.0-2/mysql/scripts/myscript.sh 
/opt/redmine-3.2.0-2/mysql **** : 
/opt/redmine-3.2.0-2/mysql/scripts/myscript.sh: scripts/mysql_install_db: 
/usr/bin/perl: 誤ったインタプリタです: そのようなファイルやディレクトリはありません

(略)

----------------------------------------------------------------------------
セットアップウィザードによる Bitnami Redmine Stack のインストールが完了しました。

(略)

情報: Bitnami Redmine Stack については、ブラウザで 
http://127.0.0.1:80 にアクセスしてください。
```

なんかmysqlセットアップでエラーが発生したっぽい。が、インストールは進行していく。この後、ブラウザからRedmineにアクセスしたところ(```http://server-ip/redmine```)、404エラー。apacheは立ち上がっているが、Redmineが稼働していない。。。

# 解決方法

インストールは不完全ながらも、```/opt/redmine-3.2.0-2/```以下にモジュール(ruby, mysqlなど)はコピーされていた。この中にperlもあったので、これを```/tmp```にコピーして```/usr/bin/perl```のシンボリックリンクを貼り、bitnami-redmineのアンインストーラ実行後、再度インストールした。

```shell-session:
# cd /tmp
# cp -r /opt/redmine-3.2.0-2/perl ./
# ln -s /tmp/perl/bin/perl /usr/bin/perl
# /opt/redmine-3.2.0-2/uninstall
# cd
# ./bitnami-redmine-3.2.0-2-linux-x64-installer.run
```

これでインストールはエラーなしで成功し、Redmineも無事に起動した。あとは不要になったファイル/リンクを削除。

```shell-session
# unlink /usr/bin/perl
# rm -rf /tmp/perl
```

# 解説

今回発生した問題は、恐らく下記の通り。

- mysqlのセットアップにperlが必要
- Bitnami Redmine にはmysqlセットアップの為(多分)のperlが同梱されているが、インストールプロセスでは当該perlではなく```/usr/bin/perl```を見に行ってしまう
- CentOS7 Minimal にはperlが入っておらず、mysqlセットアップに失敗。

そこで、ちょっと強引にBitnami Redmine同梱のperlを取り出し、インストーラに```/usr/bin/perl```と認識させてmysqlのセットアップをさせました。あまりスマートなやり方とは言えませんが。。。

# さらにエラー解析

最初にインストーラを実行した際に表示されたエラーメッセージを見なおしてみると、```/opt/redmine-3.2.0-2/mysql/scripts/myscript.sh```実行時にエラーが発生していることが分かります。

```shell-session
エラー: 実行中にエラーが起きました /opt/redmine-3.2.0-2/mysql/scripts/myscript.sh 
/opt/redmine-3.2.0-2/mysql **** : 
/opt/redmine-3.2.0-2/mysql/scripts/myscript.sh: scripts/mysql_install_db: 
/usr/bin/perl: 誤ったインタプリタです: そのようなファイルやディレクトリはありません
```

この```myscript.sh```から、同じディレクトリにある```mysql_install_db```を呼び出しています。こいつの実態はperlスクリプトなのですが、中身を見てみると…

```pl:mysql_install_db
#!/usr/bin/perl
```

そりゃ失敗するだろ。。。perl同梱するなら、この辺もちゃんとやっといて欲しい。。。

# 追記

## MySQL5.6より、mysql_install_dbがシェルスクリプト→Perlスクリプトになったようです

[MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/mysql-install-db.html)
>**MySQL 5.6.8 では、mysql_install_db は Perl スクリプト**で、Perl がインストールされた任意のシステムで使用できます。**5.6.8 より前ではシェルスクリプト**で、Unix プラットフォームでのみ使用可能です。

この変更にBitnamiが対処しきれてなかったのかな？

## Bitnami側でも既知の問題だと認識しているようです

[Mysql error when installing Lamp 5.6.18-0 on Centos 7](https://community.bitnami.com/t/mysql-error-when-installing-lamp-5-6-18-0-on-centos-7/39976)
>That is a known issue on Centos 7. **Were you be able to install it after running sudo yum install perl-data-dumper ?**

ということで、正しい対処法はBitnami Redmineインストール前にperl-data-dumperをインストールする、という事のようです。。。
macにPythonの数値演算環境Anacondaを入れる

# やりたいこと

macにAnacondaを入れたい
Anacondaについては[こちら](https://www.continuum.io/why-anaconda)を参照

# やってみた

[Homebrew](http://brew.sh/index_ja.html)を通してインストールしてみる．

まず，Homebrewでpyenvをインストール．

```lang:tarminal
$ brew install pyenv
```

上のコマンド叩いたら，入ってるかを確認．

```lang:tarminal
$ brew list
pyenv
```

上のようにpyenvが入っていたらインストール成功．
pyenv以外も入ってるかもしれないけど，別に問題なし．

次にpyenvでAnacondaをインストール
この時にpyenvコマンドが使えない場合は，$PATHを通してあげる

```lang:tarminal
$ export PATH='.pyenv/shims:$PATH'
```

これで一時的にだけどpyenvのPATHが通ったと思う．

pyenvのコマンドが使えるようになったら，次こそAnacondaのインストールをしてみる．

```lang:tarminal
$ pyenv install anaconda3-4.3.0
```

Anacondaのversionは2017年3月14日現在で3-4.3.0
多分これでAnacondaがインストールされた．
インストールチェック

```lang:tarminal
$ pyenv versions
anaconda3-4.3.0
```

Anacondaのインストールが成功したら，またコマンドが動くかチェックして，
動かなかったらPATH通し．

```lang:tarminal
$ export PATH='.pyenv/versions/anaconda3-3.4.0/bin:$PATH'
```

これでAnacondaが使える．
最後に，Anacondaをアップデートしておく．

```lang:tarminal
$ conda install conda
```

あとはPATH通したやつをちゃんと保存しておけば，condaがこれから使えるはず．
ImageMagickでPDF変換したときのProducer情報を空白にする

#やりたいこと
ImageMagick（のライブラリ）を使用してPDFに変換すると、PDFのプロパティのところの「PDF 変換」にImageMagickのバージョン情報が格納される。自炊していると、これが気になったので、下記の図のように空白にしたい。
![WS000000060.JPG](https://qiita-image-store.s3.amazonaws.com/0/114535/d53169d4-8308-80aa-c77e-3decb30e4f64.jpeg)

#「version.h」を修正
とりあえず、「version.h」の「MagicVersion」の定義を変更したら空白になりました。詳しくは調査していません。

```c:version.h
//#define MagickVersion  \
//  MagickPackageName " " MagickLibVersionText MagickLibAddendum " " \
//  MagickQuantumDepth " " MagickPlatform " " MagickReleaseDate " " \
//  MagickAuthoritativeURL
#define MagickVersion  ""
```
【Swift】CLLocationManagerを使った位置情報取得アプリ

Androidでは試したことのある位置情報取得処理ですが、iOSではどのように書けば良いのか前々から気になってまして、今回やっと重い腰を上げてさらにQiitaに初投稿してみました！

色々な記事を拝見しているとSwiftで書いている記事が多くなってきたのでSwiftで書いてみました。
クラス名やメソッド名はObjective-cと同じだし、すぐ慣れると思ってましたが、オブジェクトの初期化するだけでどうするのかわからずググりました・・・＞＜；

Objective-cでは初期化を下記のように書きましたが

```
NSObject * obj;
obj = [[NSObject alloc] init];
```

Swiftでは下記のように書きます。

```
var obj : NSObject!
obj = NSObject()
```

シンプルになってわかりやすいですね！
これからの新規プロジェクトはSwiftで行く予定です！

話が逸れましたが、今回はCLLocationManagerを使って位置情報取得です。

![Simulator Screen Shot 2016.02.21 17.18.16.png](https://qiita-image-store.s3.amazonaws.com/0/112916/878e0aeb-4ab0-5603-e4cd-0c72424ff136.png)

上記のようなレイアウトで試しました。
「位置取得」ボタンをタップするとTextFieldに緯度経度が表示されます。

ハマリポイントはinfo.plistに下記のKeyを追加する必要がある点です。
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription

![スクリーンショット 2016-02-21 17.48.40.png](https://qiita-image-store.s3.amazonaws.com/0/112916/7a1b1428-b011-8a69-d965-b2451fa6d1b9.png)

左上のプロジェクトをタップしてinfoタブを選択、＋ボタンで追加します。

CoreLocation.frameworkの追加も忘れずに

![スクリーンショット 2016-02-21 17.51.32.png](https://qiita-image-store.s3.amazonaws.com/0/112916/78413faa-28e3-3712-2adf-cfadcb2f285e.png)

一瞬で取得がされるので驚きました！

githubにてサンプルを公開してます。
https://github.com/leegun/cllocationmanagerexsample
Zabbix アラートスクリプトの引数

Zabbix でアラートスクリプト実行時に渡される引数について。

## Zabbix 2.2 / 2.4

Zabbix 2.2 / 2.4 は、`send_to, subject, message` の順。

該当のコードは、以下。この後に`cmd`が実行される。

* Zabbix 2.2


```src/zabbix_server/alerter/alerter.c
			zbx_snprintf_alloc(&cmd, &cmd_alloc, &cmd_offset, " '%s' '%s' '%s'", send_to, subject, message);

```

* Zabbix 2.4

```src/zabbix_server/alerter/alerter.c
			zbx_snprintf_alloc(&cmd, &cmd_alloc, &cmd_offset, " '%s' '%s' '%s'", send_to, subject, message);

```

## Zabbix 3.0

Zabbix 3 では、マクロで引数を指定できる。

https://www.zabbix.com/documentation/3.0/manual/config/notifications/media/script

`Script parameters` に、`{ALERT.SENDTO}`、`{ALERT.SUBJECT}`、`{ALERT.MESSAGE}`を指定すると、2 系と同じ動きになる。

該当コードは、以下。この後に`cmd`が実行される。

```src/zabbix_server/alerter/alerter.c
			for (pstart = mediatype->exec_params; NULL != (pend = strchr(pstart, '\n')); pstart = pend + 1)
			{
				char	*param_esc;

				param_offset = 0;

				zbx_strncpy_alloc(&param, &param_alloc, &param_offset, pstart, pend - pstart);

				substitute_simple_macros(NULL, NULL, NULL, NULL, NULL, NULL, NULL, alert, NULL, &param,
						MACRO_TYPE_ALERT, NULL, 0);

				param_esc = zbx_dyn_escape_shell_single_quote(param);

				zbx_snprintf_alloc(&cmd, &cmd_alloc, &cmd_offset, " '%s'", param_esc);

				zbx_free(param_esc);
			}
```
eclipseでjava開発するときによく使う設定

こないだ設定したのでメモ
※そのうちキャプチャとろうかな。。

# Eclipse設定

## 一般

エディター > AnyEditツール > 末尾の空白を除去→on
エディター > AnyEditツール > 空行を無視→on
エディター > AnyEditツール > スペースをタブに
エディター > テキストエディタ > 表示されるタブ幅→2
開始およびシャットダウン→いらないやつを外す
開始およびシャットダウン→ワークスペース→数を増やす
外観 > 色とフォント→フォント変える(フォントでフィルタして基本だけ変えれば全部かわるはず)

## JStyle

半角スペース→on

## Java保管アクション(Java > エディター > 保管アクション)

ソース・コードのフォーマット→off
インポートの編成→on
追加アクション→on
追加保管アクション > コード・スタイル > if/while/for/doステートメントでブロックを使用→常時
追加保管アクション > コード・スタイル > 式 > 式で括弧を使用→常時
追加保管アクション > コード編成 > フォーマッター > 末尾の空白を除去→on(空行を無視)
追加保管アクション > コード編成 > フォーマッター > インデントの訂正→on
追加保管アクション > メンバー・アクセス > フィールド・アクセスに'this'修飾子を使用→常時
追加保管アクション > メンバー・アクセス > メソッド・アクセスに'this'を使用→常時
追加保管アクション > 不要なコード > 未使用コード > 未使用のインポートの除去→on

## Javaコンテンツ・アシスト(Java > エディター > コンテンツ・アシスト)

Java > エディター > コンテンツ・アシスト > 自動有効化遅延→500（0にしていたが入力途中で固まることが多かったため…）
Java > エディター > コンテンツ・アシスト > Javaの自動有効化トリガー→「.abcdefghijkemnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_」に

## Javaコードスタイル(Java > コード・スタイル)

フィールドの接頭部リストに _ をいれる
※これをいれることでフィールド名のプレフィックスに _ を使用していても、
アクセサメソッドの自動生成にはつかなくなる効果がある

## Javaフォーマッタ(Java > コード・スタイル > フォーマッター)

インデント(D) > 一般設定 > タブ・サイズ(S)を2
行折り返し(G) > 注釈 > 要素-値ペア > すべての要素を折り返し、各要素で改行する
行折り返し(G) > 関数呼び出し > 修飾呼び出し > すべての要素を折り返し、各要素で改行する
行折り返し(G) > 'enum'宣言 > すべての要素を折り返し、各要素で改行する
行折り返し(G) > 一般設定 > 行の最大幅(I)を200
コメント(M) > 行の幅 > コメント業の最大幅(F)を200

## Javaクリーンアップ(Java > コード・スタイル > クリーンアップ)

ちなみにlombokを使用しているとエラーで動作しないので注意。

コード・スタイル > 制御ステートメント > if/while/for/doステートメントでブロックを使用→常時
コード・スタイル > 制御ステートメント > 式 > 式で括弧を使用→常時
コード編成(O) > フォーマッター > ソース・コードのフォーマット→on
コード編成(O) > フォーマッター > インポート > 末尾の空白を除去→on(空行を無視)
コード編成(O) > フォーマッター > インポート > インデントの訂正→on
コード編成(O) > フォーマッター > インポート > インポートの編成→on
メンバー・アクセス(R) > 非性的アクセス > フィールド・アクセスに'this'修飾子を使用→常時
メンバー・アクセス(R) > 非性的アクセス > メソッド・アクセスに'this'修飾子を使用→常時
欠落コード > 注釈 > 欠落している注釈を追加→on(ぜーんぶon)
欠落コード > 潜在的なプログラミングの問題 > シリアル・バージョンIDの追加→on→生成
欠落コード > 未実装コード > 実装されていないメソッドの追加→on
不要なコード > 未使用コード > 未使用のインポートの除去

# Checkstyle

そのうち…

# FindBugs

そのうち…
(初心者向け)MacVimで日本語入力固定モードを設定する方法 

WindowsではKaoriyaさんパッチ適用のGVimを使っています。MacBookで同じようなことをしようとMacVimを導入したところ、MacVimの初期設定では、挿入モード：日本語入力、通常モード：英数入力 を繰り返してしまい、いちいち日本語入力と英数入力を切り替えなければならず困っていました。
以下の設定で解消しましたので共有します。
結論から言うと、日本語入力固定モードを実現するプラグインをインストールして設定すればOKです。

# 環境

OS X El Capitan 10.11
MacBook (Retina, 12-inch, Early 2015)

MacVim

```
:version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Feb  6 2016 05:46:51)
MacOS X (unix) 版
適用済パッチ: 1-1265 
```

# MacVimに設定する方法

以下のサイトからim_control.vimプラグインをダウンロードする。
https://github.com/fuenor/im_control.vim/archive/master.zip

以下のディレクトリ内にファイルを配置する。
私のMacVimはインストール直後で他のプラグインやプラグイン管理ソフトがインストールされていなかったので、手動で.vimフォルダとpluginフォルダを作成しました。

```
~/.vim/plugin/
```

~/.vimrcに以下の内容を貼り付ける。
私のMacVimは.vimrcを作成していなかったので、手動で作成しました。
.gvimrcも必要なのかと思ったのですが、どうやら不要のようなので、.vimrcのみに設定しました。

```
" 「日本語入力固定モード」の動作モード
let IM_CtrlMode = 4
" 「日本語入力固定モード」切替キー
inoremap <silent> <C-j> <C-^><C-r>=IMState('FixMode')<CR>
```
*https://sites.google.com/site/fudist/Home/vim-nihongo-ban/vim-japanese/ime-control/ctrl-hat から引用*

# 有効化/無効化の方法

通常モードではなく挿入モード時に、Ctrl+jを押すと、有効→無効→有効…を繰り返します。日本語入力固定モードの有効/無効を確認するには、Vimの左下を確認すれば判ります。

有効なとき

```
JpFixMode : On
```

無効なとき

```
JpFixMode : Off
```

# 参考

主にこちらのページを参考に設定したのですが、自分が初心者ゆえに情報が足りずに迷ってしまったので、本ページを作ることにした次第です。
https://sites.google.com/site/fudist/Home/vim-nihongo-ban/vim-japanese/ime-control/ctrl-hat

.vimrc/.gvimrcの読み込み順番について。
http://stackoverflow.com/questions/21112972/macvim-gets-all-settings-from-vimrc-but-not-the-colors-and-i-have-to-source
kaminariでページネーションをしながら、降順にする記述方法


gemのkaminariでページネーションするには以下のように記述する。

```Ruby:controller
@hoges = Hoge.page(params[:page]).per(10)
```

さらに降順にしたい場合には以下のように記述する。

```Ruby:controller
@hoges = Hoge.all.order(created_at: :desc).page(params[:page]).per(10)
```

これでkaminariを使って１０件づつの表示をしつつ、降順に並べ替えることができる。
tcpdumpにおけるプロミスキャスモード(promiscuous mode)の注意点

tcpdumpを使用するとプロミスキャスモード(promiscuous mode)になる。
プロミスキャスモードになると、パケットフィルタが解除され、
全てのパケットを受け取ることになる模様。

この事象について解説する。

# ■ tcpdumpとは
ネットワークを流れるパケットを記録し、結果を出力するキャプチャツール。

# ■ プロミスキャスモード(promiscuous mode)とは
ネットワークカードの動作モードの一つで、ネットワークを流れるすべてのパケットを受信して読み込むモード。
promiscuousとは無差別という意味。

tcpdumpを使用すると一時的にプロミスキャスモードに切り替わる↓。

```shell-session
kernel: eth0: Promiscuous mode enabled.
kernel: device eth0 entered promiscuous mode
```

監視ツールで、不正アクセスを検知した際に、
上記のログが出ていれば、tcpdumpが原因ということになる。

* [MACアドレスが不明な端末からの接続を検出](http://okwave.jp/qa/q2456080.html)

# ■ 対策 : プロミスキャスモードにしない

プロミスキャスモードにしなければ、不明なパケットを受けることはないはず。
プロミスキャスモードにしないためには、-pオプションを使用する。

```shell-session
tcpdump -p port 80
```
* [tcpdumpの便利なオプション](http://qiita.com/ngyuki/items/969d1efaddb68acb5313)


# ■ 備考 : iptablesとの関連

iptablesはLinuxにおけるパケットフィルタリングコマンド。
Linuxではパケットフィルタの処理は、NetFilterと呼ばれる機能が担う。
iptablesはnetfilterの呼び出しなど、管理を行うコマンドという位置づけになる。

* http://www.turbolinux.co.jp/products/server/11s/user_guide/iptables.html


/etc/iptables/iptables.rulesに下記のような記述がある場合、接続済みのコネクションは、
許可されることになるので、監視ツールで、不正アクセスを検知されなくなる。

```shell-session
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
```

* [iptablesの設定](http://qiita.com/shimohiko/items/ec672655edb84578a82e)

* [iptablesのオプション](http://www.unix-power.net/linux/iptables.html)
VS2015でImageMagickライブラリをビルド

#ソースコードのダウンロード
下記サイトから「ImageMagick-Windows-<<バージョン>>.zip」をダウンロードする。今回は「ImageMagick-Windows-7.0.0-0.zip」を使用した。
http://www.imagemagick.org/download/binaries/

#VisualStudio2015用ソリューションを作成
回答したファイルの中にある、
　　"ImageMagick-7.0.0-0\VisualMagick\configure\configure.exe"
を実行し、「Static Multi-threaded runtimes」を選択。Visual Studio Versionが「2015」であることを確認。今回はQuantum depthは「Q8」にしている。それ以外は、適当（詳しくは知りません）。
![WS000000059.JPG](https://qiita-image-store.s3.amazonaws.com/0/114535/badc08a3-4aa1-76f6-3c8a-75a5fc6b5e67.jpeg)

「次へ(N)」ボタンをクリックすると、
　　"ImageMagick-7.0.0-0\VisualMagick\VisualStaticMT.sln"
が作成される。

#「pango-language-sample-table.h」の文字コードを変換
VisualStaticMT.slnをビルドすると、文字コードの問題と思われるエラーが発生した。

![WS000000055.JPG](https://qiita-image-store.s3.amazonaws.com/0/114535/6e0a39c4-a396-a394-3024-2055f485cb8b.jpeg)

そのため、次のファイルを、UTF-16で保存しなおすと。ビルドが通った。（元々UTF-8だったが、どうしてエラーに・・・？）
　　"ImageMagick-7.0.0-0\pango\pango\pango-language-sample-table.h"
[Swift]QiitaのAPIを叩いて記事を取得して表示するサンプルアプリを書いてみた


##概要

Swiftビギナーズ勉強会 第13回で登壇者の方のスライドに書いてあった、下記のQiitaの記事を参考にして、Swiftの練習に書いてみた。

参考：[AlamofireとSwiftyJSONでAPIを叩くチュートリアル](http://qiita.com/yuta-t/items/1b6dfe34fa8537cf3329)

##いきなり参考記事と違うことをする

ライブラリ管理ツールはCocoaPodsを使っているので、「Alamofire」と「SwiftyJSON」をCocoaPodsでライブラリを導入。

```vim:PodFile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

target 'QiitaAPISample' do
  pod 'Alamofire'
  pod 'SwiftyJSON'
end

target 'QiitaAPISampleTests' do

end

target 'QiitaAPISampleUITests' do

end
```

```bash:コマンド
pod install
```

参考：[SwiftでCocoaPodsを使い始めようとしてハマったことメモ](http://qiita.com/yokomotod/items/884f624cf17ba4a5ef11)

##実装する

参考にした記事から書き換えたところをピックアップ。

###UIはStoryboard使う

Storyboardも勉強中なので、Storyboardで実装できるところはStoryboardで実装した。
AutoLayoutの勉強にもなるし。
なるし。
なるよ。
…勉強しよ。

###Alamofire関連はViewControllerから分離させる

非同期処理の終了を呼び出し元で判断する方法がわからず、Notificationで書いてしまった。
教えて、できる人。

```swift:APIClient.swift
import Alamofire
import SwiftyJSON

class APIClient {
    var items: [[String: String?]]?  {
        didSet {
            NSNotificationCenter.defaultCenter()
                .postNotificationName("ChangedItemsValue", object: nil, userInfo: nil)
        }
    }

    func getAllUserItems() {
        let urlString: String = "https://qiita.com/api/v2/items"

        Alamofire.request(.GET, urlString)
            .responseJSON { response in
                switch response.result {
                case .Success(let value):
                    let json = JSON(value)
                    var items: [[String: String?]] = []
                    json.forEach { (_, json) in
                        let item: [String: String?] = [
                            "title": json["title"].string,
                            "userId": json["user"]["id"].string
                        ]
                        items.append(item)
                    }
                    self.items = items
                    print(self.items)
                case .Failure(let error):
                    print(error)
                }
        }
    }
}
```

参考：[SwiftでAPIクライアントをつくる (Alamofire+ObjectMapper)](http://qiita.com/ekushida/items/c8cf74fb390bc58388cf)

###間違ってるかもと思ったので直す

> Storyboardの方ではArticleListViewControllerをInitial View Controllerにし、
> ついでにNavigation Controllerをくっつけておきます。

これはNavigationViewControllerをInitialViewControllerにしないといけないね。

##動いた

![スクリーンショット-2016-02-21-17.01.40.png](https://qiita-image-store.s3.amazonaws.com/0/81221/03d3ba66-fc4f-20e2-2cc3-64f36ad8310a.png "スクリーンショット-2016-02-21-17.01.40.png")

##TODO

* 新着記事だけじゃなくて、他のAPIも試す
* APIClientに他のAPIリクエストを処理するメソッドを追加する
* ちゃんと勉強する

##ソースコード

Githubにあげました。
https://github.com/macneko-ayu/SwiftPractice/tree/master/QiitaAPISample

プロジェクトごとにリポジトリ作ったほうがよかったかも。
グローバルIP取得ツールを作ってみた

# はじめに
コマンドラインからグローバルIPを取得したい場合、`curl ifconfig.me`とか`curl ip-net.info`あたりがよく紹介されています。ただ、これらのサイトは（特にifconfig.meは）しばしば繋がりにくい状態で、`cron`での自動実行などを考えるとエラー処理含めいろいろ面倒です。
そこで複数のサイトを順次試行するツールを作ってみました。仮にいくつかのサイトか落ちていても、どこか1つでも繋がれば結果は表示されるようになっています。
念のためですが、あまり高頻度で使用しないようご注意ください。例えばmyexternalip.comの場合、30回/分でアクセス制限されるようです。多くても1回/時間程度が良いかと思います。

# リンク
[Download](https://github.com/dalance/gip/releases/latest)
[Source](https://github.com/dalance/gip)

# 使い方
ダウンロードしたファイルをPATHの通った場所に展開してください。
使い方は以下のような感じです。

```
gip                    //プレーンテキスト出力
gip -s                 //プレーンテキスト出力(改行なし)
gip -j                 //JSON出力
gip -j --json-key addr //JSON出力(キー指定)
```

デフォルトで以下のサイトを使っています。
負荷分散のため試行順序はランダムです。また、ifconfig.meは特に繋がりにくいので外しました。

- [inet-ip.info](http://inet-ip.info)
- [myexternalip.com](http://myexternalip.com)
- [globalip.me](http://globalip.me)
- [ipify.org](http://ipify.org)
- [httpbin.org](http://httpbin.org)

また、接続先をカスタマイズしたい場合、`$HOME/.gip.toml`で上書き可能です。
`$HOME/.gip.toml`がなかった場合のデフォルト値は以下のような感じなので、ここから追加・削除するのが楽です。

```.gip.toml
[[providers]]
    name    = "inet-ip.info"
    ptype   = "Plane"
    timeout = 1000
    url     = "http://inet-ip.info/ip"
[[providers]]
    name    = "myexternalip.com"
    ptype   = "Plane"
    timeout = 1000
    url     = "http://myexternalip.com/raw"
[[providers]]
    name    = "globalip.me"
    ptype   = "Plane"
    timeout = 1000
    url     = "http://globalip.me?ip"
[[providers]]
    name    = "ipify.org"
    ptype   = "Plane"
    timeout = 1000
    url     = "https://api.ipify.org"
[[providers]]
    name    = "httpbin.org"
    ptype   = "Json"
    timeout = 1000
    url     = "http://httpbin.org/ip"
    key     = ["origin"]
```

`name`は適当な名前を、`url`にGETするURLを入れてください。プレーンテキストで返ってくる場合は`ptype`を`Plane`に、JSONで返ってくる場合は`ptype`を`Json`にした上で、`key`にJSONオブジェクトのパスをTOMLの配列で設定できます。`timeout`は各試行のタイムアウトをms単位で指定します。
AWS LambdaでPHPを動かしてRDS(MySQL)へ接続する


以前は、LambdaからRDSへ接続するには、RDSをパブリックアクセス可能に設定し、LambdaのIPアドレスを通すようなセキュリティグループの設定も必要でした。
しかし、LambdaからVPCアクセスが可能となった今、スマートかつセキュアに接続をすることができます。

# LAMP環境を作る
AWS LambdaのVPC対応によって、LAMP環境の構築が容易になりました。
LAMP環境とは、LAmbda, MySQL, PHP で構成されるアプリケーションの実行環境のことです。
(Python?知らない子ですね)

## AWS Lambdaで動かすPHP
AWS LambdaにはPHPが入っていません。
なので、PHPを動かすためには、Node.jsなどのAWS Lambdaでサポートされている言語経由で、自分で用意したPHPの実行ファイルを起動する必要があります。

AWS LambdaでPHPを動かす方法については、[**こちらにまとめてあります。**](http://qiita.com/oh-sky/items/646d326ee23ae640153f#php-cli%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%9F%E8%A9%B1)
以下のPHPのスクリプトなどは、こちらの記事の「PHP CLIを動かした話」で紹介しているものを、一部修正したものです。


### 用意したPHP実行ファイル
MySQLにアクセスするので、そのためのオプションを忘れないようにします。

```
git clone git@github.com:php/php-src.git
cd php-src
git checkout -b php-7.0.3 php-7.0.3
./buildconf --force
./configure \
--prefix=/var/task/php \
--disable-all \
--with-openssl \
--enable-pdo \
--with-mysqli \
--with-pdo-mysql \
--with-mysql 
make
```

### スクリプト
```sh:script.sh
#!/bin/sh
export LD_LIBRARY_PATH=`pwd`'/lib:'$LD_LIBRARY_PATH
./php/php app.php

```

```php:app.php
<?php
$schema = 'test';
$dbhost = 'test.*********.ap-northeast-1.rds.amazonaws.com';
$dbport = 3306;
$charset = 'utf8';
$dbuser = 'test';
$dbpass = 'test';
$dsn = "mysql:dbname={$schema};host={$dbhost};port={$dbport};charset={$charset}";
$pdo = new \PDO($dsn, $dbuser, $dbpass);

$statement = $pdo->query('SELECT id,name FROM gloriana;');

while ($data = $statement->fetch(\PDO::FETCH_ASSOC)) {
    echo "{$data['id']}, {$data['name']}\n";
}
```

## RDS

Aurora, MySQL, MariaDBのいずれかのRDSインスタンスを立てておきます。

テスト用に、下記のテーブル、データを用意しました。

```sql:ddl-dml.sql
CREATE TABLE `gloriana` (
  `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` varchar(10) NOT NULL
  ) ENGINE='InnoDB';

INSERT INTO gloriana (name) values
('ダージリン'),
('アッサム'),
('オレンジペコ'),
('ローズヒップ');
```

## AWS Lambda

### 設定
上記で作成したPHP本体やスクリプトをまとめたファイルをS3経由でLambdaファンクションにコードとしてアップロード。
下記のように設定します。
![Screen Shot 2016-02-21 at 3.59.59 PM.png](https://qiita-image-store.s3.amazonaws.com/0/13038/9216d3d6-c87f-9595-2a30-cc04e8db62a0.png "Screen Shot 2016-02-21 at 3.59.59 PM.png")

### 実行結果
![Screen Shot 2016-02-21 at 2.57.55 PM.png](https://qiita-image-store.s3.amazonaws.com/0/13038/d4d7739a-3b26-419b-c366-3fc770499051.png "Screen Shot 2016-02-21 at 2.57.55 PM.png")

## 参考
[（祝）AWS LambdaのVPC利用が可能になりました](http://dev.classmethod.jp/cloud/aws/aws-lambda-vpc/)
[AWS LambdaのVPCアクセスに関して少しだけ解説](http://qiita.com/Keisuke69/items/1d84684f0511a062e968)
[AWS LambdaでPHPなどを動かした話](http://qiita.com/oh-sky/items/646d326ee23ae640153f)
jqPlotでfillAlpha(透明度)とカラーネームを指定すると、エラーが発生する

たとえば以下のコードは実行すると、コンソールに「Invalid color spec」というエラーが発生します。

```js
var line1 = [['Nissan', 4],['TOYOTA', 3]];
 
$('#chart').jqplot([line1], {
  //カラーネームで指定
  seriesColors:['red','blue'],
  seriesDefaults:{
    renderer:$.jqplot.BarRenderer,
    rendererOptions: {
      varyBarColor: true
    },
    //透明度を指定
    fillAlpha: 0.5 
  },
  axes:{
    xaxis:{
      renderer: $.jqplot.CategoryAxisRenderer
    }
  }
});
```
https://jsfiddle.net/yuji38kwmt/zmuo7xbf/#&togetherjs=k5dOBh2os9

`fillAlpha`を指定しない、または`seriesColors`に16進数のカラーコード(`#ff0000`)で指定すれば動きます。
カラーネームで指定しているサンプルコードもあったのでで、「カラーコードで動くけどカラーネームで動かない」理由が、最初分かりませんでした。

jquery.jqplot.js(v1.09)で`fillAlpha`を検索すると、1375行目付近に以下のコードがありました。

```js:jquery.jqplot.js
        if (this.fillAlpha) {
            var comp = $.jqplot.normalize2rgb(this.fillColor);
            var comp = $.jqplot.getColorComponents(comp);
            this.fillColor = 'rgba('+comp[0]+','+comp[1]+','+comp[2]+','+this.fillAlpha+')';
        }
```
なるほど、`fillAlpha`が有効なときは`rgba`メソッドを使うんですね。だからカラーネームが使えないみたいです。
jqplotが`opacity`を使ってくれれば動いたのかな？
あ、でも`opacity`だと文字まで透過されてしまうので、使えないみたい。
[opacityとRGBaの違い](http://weboook.blog22.fc2.com/blog-entry-282.html)
Null passed to a callee that requires a non-null argumentエラーとは

ちょっとだけ古いコードを触っていたらこんな警告に遭遇しました。

`Null passed to a callee that requires a non-null argument NSMutableDictionary`

実装的にはこんなかんじです。

```objc
NSMutableDictionary * xParams = [NSMutableDictionary dictionaryWithObjectsAndKeys:nil];
```

こんなかんじにしてみても同様です。

```objc
NSMutableDictionary * xParams = [NSMutableDictionary dictionaryWithObjectsAndKeys:nil, nil];
```

option+クリックでdictionaryWithObjectsAndKeysを見てみるとこんなかんじ。
![スクリーンショット 2016-02-21 14.56.12.png](https://qiita-image-store.s3.amazonaws.com/0/100736/c587750d-cf11-a514-facc-4796eda2140a.png)

まだよくわからないので入力補完を見てみます。
![スクリーンショット 2016-02-21 15.03.52.png](https://qiita-image-store.s3.amazonaws.com/0/100736/60ec154b-9648-7077-26ef-b2a05417ae45.png)

ここで「nonnull」という単語が出てきました。
nonnull、及びnullableについては[Swift Blog](https://developer.apple.com/swift/blog/?id=25)に詳しく書かれています。
簡単に言うとnonnullはnil, nullを許容しないものであり、nil, nullを渡した場合は今回のように警告が表示されるということのようです。
なので今回の警告が出た場合はnil, nullではない引数を渡す必要があります。

今回私の場合は引数に渡すものがない(nilを詰めることになってしまう)実装になっていたので、おとなしく普通の初期化を行います。

```objc
NSMutableDictionary * xParams = [NSMutableDictionary dictionary];
```

これで警告が出なくなりました。
directもデスクトップ化してみた

Electronにちょっとハマっている今日このごろですが、デブサミ2016用に作った「AWS IoT Publisher（[元記事](http://qiita.com/yamaryu0508/items/8eca5f3e9bf2f797f78d)）」のWindows64bit版が重すぎて本番耐にえられず、色々反省していたのですが、反省ばかりでは面白く無いので自分用の改善をひとつ実行してみました。

# 本当の背景
うちの社内のコミュニケーションには「[direct](https://direct4b.com/ja/)」を使わせてもらっていますが、**私が通知に気づかないことがよくあるの**です。チャットのリアルタイム性を損なうよろしくない状況です。ElectronでDockに通知バッジがつくようにデスクトップ化できないかなぁと見ていたところ、色々情報が出てきました。

- [Electronアプリをプロダクトとして「正しく」リリースするために必要な3つのこと](https://nulab-inc.com/ja/blog/typetalk/3-points-for-releasing-production-electron-app/)
- [Webページをデスクトップアプリ化 - nativefierを使ってみる](http://qiita.com/taiyoslime/items/98be154455e76710df9d)
- [Facebook Messenger と ChatWork をネイティブアプリ化する (nativefier)](http://qiita.com/katzueno/items/c3abf315648de61c8a37#_reference-76743990d0856dccd51d)

これらを参考にさせて頂き、早速やっていきます。

# 準備
私とその周辺環境がほぼMacなので、Mac用に準備を進めます。

## アイコン作成
`iconutl`コマンドを用いたMac用アイコンの作り方は色々記事が出てきますが、「[Mac用アイコンの作り方。](https://labo-iwasaki.com/design/make-icon-mac.html)」を参考に、`direct.iconset`フォルダに`icon_128x128.png` だけ準備して、`direct.icns` を作りました。

```$ iconutil -c icns direct.iconset
```

## Nativefierのインストール
npmが使えるという前提で、サクッとインストールします。

```$ sudo npm install -g nativefier
```

# パッケージング
またまた、サクッとパッケージングします。

```$ nativefier --honest --badge --app-name "direct" --icon /Users/user/Desktop/direct.icns "https://direct.com/signin" --overwrite
```
## オプション
詳しくは、[npm](https://www.npmjs.com/package/nativefier)や[GitHub](https://github.com/jiahaog/nativefier)のページを見るのがいいですが、今回指定したものをピックアップでご紹介します。

- `--honest`: 認証・ログインが必要なページのパッケージング用
- `--badge`: Dock通知の有効化（MacOS Xのみ）
- `--app-name`: アプリ名の指定
- `--icon`: アイコンの指定
- `--overwrite`: 既存アプリ（フォルダ）の上書き

# ネイティブアプリ起動

パッケージングできると、`direct-darwin-x64`というフォルダに`direct.app`ができますので、早速起動すると、ログイン画面が現れます。

![スクリーンショット 2016-02-21 14.58.12.png](https://qiita-image-store.s3.amazonaws.com/0/43383/4891962b-c229-d68a-2412-e7c66d3ea98a.png)

ログインすると、いつものdirectの画面に遷移します。
![スクリーンショット_2016-02-21_15_00_29.jpg](https://qiita-image-store.s3.amazonaws.com/0/43383/861c10da-2c17-ef3b-780e-fa33434f1232.jpeg)

そして、通知テストを行うと、しっかり「デスクトップ通知」と「アイコンバッジ」が表示されています。
![スクリーンショット_2016-02-21_14_22_47.jpg](https://qiita-image-store.s3.amazonaws.com/0/43383/cc45ccc6-dfe1-eabb-dcca-ddb0b1a4496e.jpeg)
デスクトップ通知は「[direct EXtension](https://chrome.google.com/webstore/detail/direct-extension/hhgghbafnjcfpchdlkcklhckpmjniiia?hl=ja)」としてChrome Extensionが提供されているのですが、その時見ていないといけないんですよね。離席すると、見逃してしまうので、バッジが嬉しいです^^

# まとめ
Electronを使ったチャットツールのネイティブアプリ化は結構有用かもしれません。細かいことを考えなければ、すぐにパッケージング化できて運用に移れます。少なくとも私のレスは速くなる可能性が高いので、自身でしっかり試してみたいと思います。
PostgreSQL ODBC Driver x64 09.03.300をWindows7にインストールする手順

# やりたいこと
* PostgreSQL ODBC Driver x64 09.03.300をWindows7にインストールする。

## 前提環境
* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64

## インストールするソフトウェア
* PostgreSQL ODBC Driver (psqlODBC) (x64): 09.03.300

## 手順
### 圧縮ファイルをダウンロード

[PostgreSQL ODBC Driver](http://www.postgresql.org/ftp/odbc/versions/msi/) で **psqlodbc_09_03_0300-x64-1.zip** を選択し、インストーラをダウンロードします。

### 解凍

**psqlodbc_09_03_0300-x64-1.zip** を解凍します。

1. 解凍先のディレクトリ: C:\psqlodbc_09_03_0300-x64-1

### インストール

**psqlodbc_x64.msi** をダブルクリックしてインストールを実行します。

#### pSQLODBC_x64 Setup

1. I accept the terms in the License Agreement: ON
* インストール先のディレクトリ: C:\Program Files\psqlODBC\

#### インストール後の確認

##### プログラムと機能のエントリを確認

1. explorer を起動し『コントロール パネル\すべてのコントロール パネル項目\プログラムと機能』へ移動します。
* **pSQLODBC_x64** が表示されていればOK

##### ODBCドライバー(x64)を確認

1. ODBC Administrator(C:\Windows\System32\odbcad32.exe)を実行
* **ドライバー** タブに **PostgreSQL ANSI (x64)**、 **PostgreSQL Unicode (x64)** の2点が表示されていればOK

### 完了

## 参考文献

* [PostgreSQL 9.2にクライアントから接続する　PostgreSQL ODBC Driverのインストールと接続確認](http://www.cyber-funnel.com/postgres/index1156.html)
Springを無効にしない方法

Springを無効にするには環境変数 `DISABLE_SPRING` に `"1"` をセットすれば良いというのはよく知られていると思う．

```bash
export DISABLE_SPRING=1
```

ただ，これは別に1にする必要はなく別に2でもaでもYESでも，ていうかほぼ何でもいい．

```bash
export DISABLE_SPRING=2
export DISABLE_SPRING=a
export DISABLE_SPRING=YES
```

Springのコード内で，以下のような判定によりspringを起動するようになっている．(※コードはちょっと簡略化してます．)

```ruby
disable = ENV['DISABLE_SPRING']

if disable.nil? || disable.empty? || disable == "0"
  # ここで起動
end
```

従って，Springを無効にしない(やっぱり有効にしたい)ときには，以下のようにすればいい(これが言いたかっただけ)．

```bash
export DISABLE_SPRING=""
export DISABLE_SPRING=0
```

間違っても

```bash
export DISABLE_SPRING=" "
export DISABLE_SPRING=false
export DISABLE_SPRING=NO
export DISABLE_SPRING=disable
```

などとしてはいけない．意味がない．(二重否定によりそもそもなんだか分かりにくい．)

一番確実なのは

```bash
unset DISABLE_SPRING
```

だと思います．
curlのオプションを覚書


# 概要
curlは動作チェック等でよく使うのだが、毎回このオプションってなんだっけってなったりするので、調べる度にここに追記していこうと思う。

# オプション
| オプション | 説明 |
|--------|--------|
| -s     | ダウンロードの進捗とエラーメッセージを表示しない。このオプションを指定しないと標準エラー出力に進捗を表示する。        |
| --verbose(-v)     | HTTPヘッダの情報を表示できる       |

# 参考
- https://hydrocul.github.io/wiki/commands/curl.html
- http://qiita.com/Hiraku/items/dfda2f8a5353b0742271
coding > Sleep(1 /*sec*); / delay(100/*msec*/);

最近混乱するのが

```
Sleep(1);
```

```
delay(1);
```

などの単位。

Python, Unity/C#, C++ Builder, ArduinoIDEなどを使っているうちに上記の待ち時間の単位がわからなくなる。

その度にヘルプを検索してきたが、時間が無駄である。

ReadableCodeだったかを参考に コーディング時には`Sleep(1/*sec*/);`や`delay(10/*msec*/);`という記載にしようと思った。

ソース内検索はヘルプを探すより短時間で済むというのが一つの理由と、実際にソースリーディング時に振る舞いが頭に入りやすいというのが二つ目の理由。

関数名でわかる場合はあえてつけなくていい。

`delaymicroseconds(1)`
【英語学習効率化】選択範囲を画像検索するブックマークレット

```js
javascript:(function(){open('http://google.com/search?tbm=isch&q='+document.getSelection())})()
```

# 使い方
- 上記のコードをコピってブックマークとして登録
- 知らない単語（英単語を想定しているが日本語だろうと 한글 だろうと اللغة العربية だろうと動く） を範囲選択
- 登録したブックマークを選ぶ
- すると別タブが開き、画像検索結果が表示される。
- 優秀なブラウザだとたまにポップアップをブロックされるがそれはご愛嬌


# 背景
Google の画像検索を使って、知らない英単語を検索すると、英語を勉強するのに便利という話を聞いたので作成。
技術的には全然面白くなくて、 `document.getSelection()` で選択範囲を取得しているくらい。
Nemerle入門Ⅱ ～便利な機能，ループ，関数型言語の世界への第一歩～

#文字列補完
C# 6.0から，文字列補完機能が追加されました．String.Formatと同じようなことを簡単に書けるようになりました．

```csharp:string
int i = 10;
Console.WriteLine($"i={i}"); // "i=10"という文字列になる．
Console.WriteLine(String.Format("i={0}", i); //上と同じ．
```
Nemerleは昔から存在しています．

```nemerle:string
def i : int = 10;
WriteLine($"i=${i}"); // "i=10"という文字列になる．
WriteLine($"i=$i"); // 後ろの文字がスペース，又は，終端だった場合，括弧を省略することができる．
WriteLine($"i=${i / 2}"); // こんなことも可能
```

#繰り返し処理(for,while,再帰関数)
Nemerleの繰り返し処理方法は4つあります．が，そのうちの一つの方法である，Foreachはリストのところで紹介します．
それぞれの例は，同じ処理をします．
##for
C#と同じです．

```nemerle:for
for(mutable n = 0; n < 10; ++n) {
  WriteLine($"n is $n");
}
```
##while
C#と同じです．

```nemerle:while
mutable n = 0;
while(n < 10) {
  WriteLine($"n is $n");
  ++n;
}
```
##do-while
C#と同じです．

```nemerle:while
mutable n = 0;
do {
  WriteLine($"n is $n");
  ++n;
} while(n < 1);
```
##repeat
```nemerle:repeat
repeat (n : long) {
code
}
```
n（整数型）の回数だけcodeをリピートします．

##再帰関数
関数型でお馴染みの再帰関数です．慣れるには時間がかかりますが，コツは，必要な条件と必要な変数を引数にすることだと思います．

```nemerle:rec_func
loopfunc(n : int) : void {
  WriteLine($"n is $n");
  when(n < 10) loopfunc(n + 1);
}

main() : void {
  loopfunc(0);
}
```
Nemerleでは自由に繰り返し処理方法を選択できますし，マクロで，拡張することもできます．
#_
関数型言語では多くの人にとってお馴染みな，”_”がNemerleでも使うことができます．
###戻り値の破棄
Nemerleでは，戻り値ありの関数を戻り値なしの関数のように使うことはできません．

```nemerle:return__
WriteLine("hogehoge"); // OK
ReadLine(); // Compiler Error!
_ = ReadLine(); // OK
```
_に代入することによって，戻り値を破棄する必要があります．
###引数の破棄
引数に，_を使うことにより，どんな値が代入されても，破棄することができます（型は一定）．Overrideな関数などに便利です．

```nemerle:param__
Add(a : int, b : int, _ : int) : int {
  a + b;
}
```
#高階関数＆ラムダ式（匿名関数）
関数型言語ではおなじみ，C#でもLINQ等によって馴染み深くなってきた高階関数とラムダ式（匿名関数をつくる式のこと）です．
C#のラムダがわかることを前提とします．
まず，匿名関数の型の書き方は，
>paramator_type -> return_type

です．ラムダ式の書き方は，
>fun(paramator) { code }

です．具体例を挙げなければわかりませんね．

```csharp:lambda
Func<int,long> intTolong = (n) => (long)n;
Func<int,int,long> Add = (n, m) => (long)(n + m);
```
```nemerle:lambda
mutable intTolong : int -> long = fun(n) {n :> long;};
mutable Add : int * int -> long = fun(n, m) {(n + m) :> long;};
//型推論も効きます
mutable intTolong = fun(n) {n :> long;};
mutable Add = fun(n, m) {(n + m) :> long;};

//C#ライクな書き方もできます（Nemerle.Core.=>）
mutable intTolong = (n) => n :> long;
```
2つの変数は同じ処理をします．丁寧に書くと，こんな感じです．(型推論がきちんとされるので，型を明示的になくてもおｋ)
引数が2つ以上ある場合は，int * intのように，*を間にはさみます．
ちなみに，この場合，下のように短く書くことができます．

```nemerle:lambda_short
def intTolong(n) {n :> long;};
def Add(n, m) {(n + m) :> long;};
```
Nemerleの匿名関数はC#と同じで，静的スコープであるため，匿名関数外で定義された変数を参照・変更することができます．

```nemerle:lexical_scoping
main() : void {
  mutable n = 12
  def WriteAndDouble() {
    WriteLine(n);
    n *= 2;
  }
  WriteAndDouble();
  WriteAndDouble();
}
```
出力結果
>12
24

では，実際に高階関数を作ってみます．

```nemerle:rich_function
DoTwice(fnc : void -> void) : void {
  fnc();
  fnc();
}

Main() : void {
  DoTwice(fun() {WriteLine("Nemerle!");});
}
```

戻り値・引数がない場合は，**void**を使います．
2回`"Nemerle"`が出てくれば，成功です．

#〆
次回からもどんどん関数型の道を進みます．

[入門Ⅲ](http://qiita.com/Gnico/items/cd7f32aa8c973df0711e)へ
Nemerle入門

Nemerleは面白いプログラミング言語ですが，Qiitaでは入門記事ですら上がっていないようです．と，いうことで，Nemerleの入門記事を書いてみました．

# ターゲット
C\#プログラマがターゲットです．F\#の知識があれば，C\#プログラマじゃなくてもいいかもしれません．
VisualBasic.Net向けの解説も必要であれば，入れるかもしれません．
C\#コードの見比べもあるため，C\#の習得をおすすめします．

#筆者の環境
>Windows 10 Creators Update
>Visual Studio 2017 Update 3
>Nemerle v1.2.547.0 (2017-09-01)
>.Net 4.x系

最近のVisual Studioには対応していません．
しかし，コンパイラだけでも動かすことができます．

# 目次
[Ⅰ ～インストール，言語説明，C#に近い機能の説明～](http://qiita.com/Gnico/items/c32185c8900215cd790b)  
>言語説明
変数・定数・代入・プリミティブ型
条件分岐
スクリプト言語風な書き方
アクセス修飾子
メソッド
クラス，構造体，レコード定義
キャスト

[Ⅱ ～便利な機能，ループ，関数型言語の世界への第一歩～](http://qiita.com/Gnico/items/43a84aed8e8d6468ba47)  
>文字列補完
繰り返し
高級関数＆ラムダ式

[Ⅲ ～list，パターンマッチ～](http://qiita.com/Gnico/items/cd7f32aa8c973df0711e)   
>リスト
foreach文
パターンマッチ

[Ⅳ ～tuple，バリアント，もっとパターンマッチ～](http://qiita.com/Gnico/items/72d8f17fef52100963a6)　 
>タプル
バリアント
パターンマッチ

[Ⅴ ～その他の機能～](http://qiita.com/Gnico/items/6168e9aefcf83b5096b0)   
>delegate
event
out/ref
Generic Method
interface
indexer
using
演算子のオーバーロード
try-catch-finally
P/invoke

[Ⅵ～配列，マクロの基本，遅延初期化，契約プログラミング～](http://qiita.com/Gnico/items/19ee4aebcda592947d01)　 
>配列
全ては式である
Option
遅延初期化
契約プログラミング

[Ⅶ ～もっとマクロ紹介～](http://qiita.com/Gnico/items/1327bba77977e716c58d)  
> 匿名型
sizeof
surroundwith
ラベルとGoto文

[Ⅷ ～マクロ(基礎)，マクロ(構文拡張基礎)～](http://qiita.com/Gnico/items/25735e41e21f7ce4098a)　 
>マクロの基礎
構文拡張基礎

# 付録：Nemerleの便利なマクロ集
[デザインパターンマクロ](http://qiita.com/Gnico/items/8447e418aaf295cf387e)

***

わかりにくかったり，間違えがありましたら気軽にコメントをしてください．
podcastのストリーミング配信のバッファサイズを増加させる

iTunesでpodcastをストリーミング配信で聞いてる時によく止まって煩わしかったのですが、先ほど調べてみたらdefaultsコマンドで増加できたようなので、備忘録として。
ただ少し重めの曲などは、この指定でも止まるようなので、参考程度に。

```
defaults write com.apple.iTunes stream-buffer-size 256
defaults write com.apple.iTunes file-buffer-size 256
```

デフォルト値がいくつか分からないのですが、256を指定しています。
値については、実際にpodcastをストリーミングで、聞きながら調整してください。

削除する場合は

```
defaults delete com.apple.iTunes stream-buffer-size
defaults delete com.apple.iTunes file-buffer-size
```

で出来ます。
linuxのファイルの改行変換(削除)メモ

よくあるSQLファイル（改行 LF）

```lang:select.sql
select * from uesr where user_id in (
1,
2,
3,
);
```

Where文の最後の「,」を消したい時に、sedでうまくできなかったので、Perlを使いました。

```
cat select.sql | perl -0pe 's/,\n\);/\n);/g' > select_nocomma.sql
```
日本語で ESLint に issue 報告ができる場所を作りました

@watilde さんの[日本語でnpmにissue報告ができる場所を作りました](http://qiita.com/watilde/items/340b57ef289142b27899)に触発されて、私も同様に ESLint の日本語 Issue 用リポジトリを作成しました。
最初は同じように自分のフォークを使おうと思ったのですが、Nicholas に言ってみたら日本語用リポジトリを作ってくれました! :+1:

https://github.com/eslint/eslint-jp

ESLint に関することなら、何でもお気軽に Issue を作ってみてください。

例えば、

- バグっぽい動作を見つけた
- こんな機能 / ルールがほしい
- この機能を日本語で解説して欲しい
- ○○したいんだけど、どうすればいいの?

> また、Gitter.im にチャット ルームがあります。
>
> [![Gitter](https://badges.gitter.im/eslint/eslint-jp.svg)](https://gitter.im/eslint/eslint-jp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
>
> Issue の代わりにこちらをご利用頂いてもかまいません。

オープンソース プロジェクトにとってユーザーの声は財産です。
どうぞよろしくお願いします。
静的なHTMLジェネレータを探してみる～サービス紹介サイトとCMSの間にある溝

※記事を読んで、もっといい方法があったら、救ってください（切実）

#いま触ってみている静的HTMLジェネレータ
jekyll
-Rubyでできてるけど、ほとんどhtmlの知識だけでPHPテンプレートのようにつかえる静的htmlジェネレータ
[メモ：jekill 静的なHTMLジェネレータを使ってみた](http://qiita.com/ryo3409/items/06dcc45e713f2b477385)

Hugo
-Goでできてるけど、ほとんどhtmlの知識だけでPHPテンプレートのようにつかえる知識だけで使える静的サイトジェネレータ
[メモ：Hugo サイトジェネレータを使ってみた jekyllと比べて](http://qiita.com/ryo3409/items/6263e94c6e059eba10b2)


#なんで、いま静的HTMLジェネレータなのか
##サービス・商材をWeb上で売るということ、と、CMSの関係
私は普段、自社が提供するサービスや商材を紹介するブランドサイトを運営しています。
スペック的には、レスポンシブなHTML・CSS＆JSでフロント、CMSテンプレートカスタマイズ（WordPressなど）、あとは、なんちゃって情報設計です。


##サービス・商材紹介サイト運営で向き合わなければならないこと
市場の変化を踏まえて、サービス・商材の内容は変わります。
広告にもそれなりの費用をかけているので、訪れたお客様＝広告費が発生しています。
しっかりと受注につなげていく＝Webサイトで丁寧に接客する必要があります。

そのため、Webサイトを作ったら終わりではなく、Webサイトを作ってから始まりです。
サービスは動き続け、それゆえに、何かしら継続して更新していく仕組みが必要です。

###1ページ1ページ。ビジュアルも情報も丁寧に
・ユーザーの年齢は40～50代。スマホ6割、PC4割。お金に厳しく、安心や信頼を疑います。

　安心や信頼はどこから来るの？
　・オフィシャル感、アフィリエイトっぽくない
　・他の人にも利用されている。
　・メディアに取り上げられている。
　・サービスについて情報を定期的に発信している専門家であるというアピールが重要になる。

　→記事の更新が必要

　→PCはビジュアルを丁寧に作りあげないとアフィリエイトサイトと思われかねない！
　　→1ページ1ページ独自のCSSが必要になる


###ユーザーの反応に合わせて、訴求の仕方を変えていく必要がある
・ビジュアル表現、コピーライトを定期的に変更する必要がある

　→頻度高く変更が必要。


###お問い合わせにつながらなかったユーザー層をいかにお問い合わせにつなげるか
・ユーザーの反応を分析できる必要がある

　→画像やリンクなどでonClick時にGoogleAnalyticsにイベントを送信するなど、仕掛けを盛り込む必要あり。


###会社の事業の中心がエンジニアリングじゃない
・エンジニアが少ない。というか、いない（涙）

　→エンジニアは新サイト立ち上げに、既存サイトの運営保守はエンジニア以外でもある程度やれるようにしたい

##WordPressで運営してますが…。WordPressを選択した理由と課題点
普段、WordPressでサイト運営しているのですが、色々違和感というか、これじゃない感を感じ始めてます。

###WordPressを選んだ理由
以下の点が割とクリティカルだったのが大きいです。
・記事の更新が必要
・頻度高く変更が必要
・エンジニアは新サイト立ち上げに、既存サイトの運営保守はエンジニア以外でもある程度やれるようにしたい

　→エンジニアの手を介さずに頻度高くサイトを運営できること

そういった中で、利用者も多く（管理画面が使いやすくなっていくことが期待できる）、テンプレートの自由度が高い、WordPressを選択しました。

###WordPressの課題点
・動的生成が遅い
・オープンソースの管理画面→攻撃の心配
・1ページ1ページこだわるには結局テンプレート側をいじったり、ショートコードを作ったり、エンジニアがかまざるを得ない
・デザイン経験がない人がビジュアルエディタを使うと、アフィリエイト感溢れるページが生成される。クオリティはデザイナーが握り、マークアップエンジニアがそれを丁寧に再現する繊細さが必要。
・画像やリンクなどでonClick時にGoogleAnalyticsにイベントを送信するなど、仕掛けを盛り込む必要がある。の部分が肥大化してきたので、エンジニアが記事に手を加える必要がある

当初のエンジニアがかまないという点が現実的ではないとなると、逆にエンジニアにとってwordPressのビジュアルエディタでマークアップを生成するのがすごく手間になってきます。
エディターが記事を編集し、デザイナーがビジュアルを作り、マークアップエンジニアがHTML&CSSを作り、エンジニアがWordPressのテンプレートやショートコードを作成し、エンジニアがWordPressの管理画面に適用する。

ではなく、

エディターが記事を編集し、デザイナーがビジュアルを作り、マークアップエンジニアがHTML&CSSを作り公開する。

にしたいわけです。

そこでHTML&CSSの知識だけで、WordPressでテンプレートやショートコードを使うようなWebサイト制作ができないものかと考えていた中で行きついたのが静的HTMLジェネレータです。

#いま触ってみている静的HTMLジェネレータ
jekyll
-Rubyでできてるけど、ほとんどhtmlの知識だけでPHPテンプレートのようにつかえる静的htmlジェネレータ
[メモ：jekill 静的なHTMLジェネレータを使ってみた](http://qiita.com/ryo3409/items/06dcc45e713f2b477385)

Hugo
-Goでできてるけど、ほとんどhtmlの知識だけでPHPテンプレートのようにつかえる知識だけで使える静的サイトジェネレータ
[メモ：Hugo サイトジェネレータを使ってみた jekyllと比べて](http://qiita.com/ryo3409/items/6263e94c6e059eba10b2)

#この記事書いている人が考えていること
[HTML&CSSでのマークアップをまじめに考える](http://qiita.com/ryo3409/items/783dda28507e44219986)
[実際にHTML&CSSを書きながら考えていること](http://qiita.com/ryo3409/items/35c98e9f0840335bafc7)
[手順書]Ubuntu Server 14.04 LTSへのGitのインストール

# はじめに
この記事は、インストール直後のUbuntu Server 14.04 LTSへGitをインストールする為の手順書です。
私自身が実施した事の記録として、残します。

## ゴール
読者が、「Ubuntu Server 14.04 LTSに、Gitをインストールできる」ようになる。

## 注意
1. Gitがインストールされている場合は、本記事の手順に従ってインストールする前に、インストールされている古いGitをアンインストールする事
1. インストール時に書庫を展開したディレクトリは、Gitをアンインストールするまで削除しない事

## 参考情報 : バージョンについて
インストールするバージョンは、https://www.kernel.org/pub/software/scm/git/ にある*.tar.gzから選択できる。
バージョンを、本記事に記載したバージョンから変える場合に、参考ください。

# 環境
* 実行環境 : [Microsoft Azure](https://azure.microsoft.com/ja-jp/)(A0 Standard)
* OS : [Ubuntu Server 14.04 LTS](http://www.ubuntu.com/download/server)
* [Git](http://www.git-scm.com/) : 2.10.0

# 手順
## 0. 実行前
Gitのバージョンを確認しても、「git入ってないよ」と言われます。
<pre>
$ git --version
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
</pre>

## 1. Gitのmakeとインストール
rootで実行する為に、昇格します。
<pre>
$ sudo su -
</pre>

Gitインストールに必要なモジュールをインストールします。
<pre>
\# cd /
\# apt-get install -y build-essential libssl-dev tcl8.4 tk8.4 gettext curl expat openssl zlibc libcurl4-openssl-dev
</pre>

Gitの書庫ファイルをダウンロードし、インストールします。
<pre>
\# cd /usr/local/src/
\# wget https://www.kernel.org/pub/software/scm/git/git-2.10.0.tar.gz
\# tar zxf git-2.10.0.tar.gz
\# cd git-2.10.0
\# ./configure --prefix=/usr/local --with-curl --with-expat
\# make all
\# make install
</pre>

または、以下の1行で
<pre>
\# cd /usr/local/src/ && wget https://www.kernel.org/pub/software/scm/git/git-2.10.0.tar.gz && tar zxf git-2.10.0.tar.gz && cd git-2.10.0 && ./configure --prefix=/usr/local --with-curl --with-expat && make all && make install
</pre>

## 2. 実行後
バージョン確認とリポジトリから正しく取得できる事を確認します。

### 2-1. Gitのバージョン確認
Gitのバージョンを確認すると、インストールしたバージョンが出力されます。
<pre>
$ git --version
git version 2.10.0
</pre>

インストールしたバージョンが確認できたので、Gitのインストールに成功しています。

### 2-2. Gitリポジトリからのデータ取得
本記事では、GitHubからデータを取得する事で、正しくGitがインストールされたかをテストします。
<pre>
$ git clone https://github.com/{your_account}/{your_repository}.git
Cloning into '{your_repository}'...
remote: Counting objects: 1520, done.
remote: Compressing objects: 100% (1007/1007), done.
remote: Total 1520 (delta 456), reused 1515 (delta 454), pack-reused 0
Receiving objects: 100% (1520/1520), 14.31 MiB | 2.51 MiB/s, done.
Resolving deltas: 100% (456/456), done.
Checking connectivity... done.
</pre>

エラーが表示されずに、リポジトリからデータを取得できたので、Gitのインストールに成功しています。
c++ Builder > vector / TList > 同じようなパフォーマンス > TList:344ms / vector:339ms

```txt:動作確認
C++ Builder XE4
```

XE4においてvectorやTListを使う時の速度について調査。

http://www.pascalgamedevelopment.com/showthread.php?5797-c-vector-delphi

> Lists in Delphi are implemented the same as stl Vectors: they are array-based. And since data structure are the same then also performance should be comparable. 

実際に測定をしたのが

> its an addition of 3000000 records of 16 byte length, in one loop 
>
>Tlist time = 344ms
>Vector time = 339ms 

速度を気にして片方を選択する必要はなさそう。


実は以下で調べていた。
performanceタグをつけてなかったので検索できなかった。
http://qiita.com/7of9/items/722250c96cb20d1b7e2a
void と Unit と


## 【注意】ディスりたいわけではありません

[Unit型の何が偉大なのか説明してみる](http://qiita.com/alucky0707/items/a677e5c9850aa765dd55) を読んで，Unit と void の違いを考えるとっかかりとしてすごくいい記事だと思うし，簡単に説明しようと思うとそうなるのもわかるんだけど，個人的にしっくりこないところがあったので，何がしっくりきていないのか確認しながら void と Unit の違い，Unit の必要性を考えようと思いました．
ちなみに以下はほぼ脳内会議の議事録なので，記事中の言葉遣いは荒めです．

P.S. はじめてポエムタグつけてみました．


# void と Unit の違い

これはもう参考記事でも言及してるし，しっくりきてるから一言で， **違いは値を持つか持たないかの一点**．

- void : 値がないことを示す型．本当に値がない．
- Unit : 値がないことを示す型．値がないという唯一の値を持つ．


# Unit の必要性

#### 要は

関数の汎用性（抽象度？）を考えたときに，すべての関数は何かしら値を返すもの，あるいはすべて値など返さないもの，のどちらかに決まってないとバツが悪いので，どっちかに統一しましょうと．
んで，そりゃすべての関数が値を返さないってのは無理があるから，すべて関数は何かしらの値を返すことにしましょうと．

#### そもそも
void型の関数が存在して問題になるのってどんなとき？ってのが，関数合成の例では自分の中でしっくりこなかった．
参考記事でコメントももらったけど，根性と性格の曲がりきった自分は

- 関数合成の途中で Unit 挟むって，その関数から先はもはや別のプログラムじゃん
- 確かにデータベース操作とか順番に依存して，かつプログラムを分割できないケースもあるとは思うけど，Haskellにだって `do` あるし，それをわざわざ関数合成できるようにして，一つの関数でもってプログラムを構成することに意味はあるのか

などと考えてしまい，いまいち納得しきれずにいた．（何度も言いますが，disってるわけではない）

一方，抽象的な関数の代表例として高階関数を考えたとき，なんだかしっくりきた．

例えば `map`関数 だ．
こいつは何かしら値の入ったリストなり配列なりを受け取って，渡された関数を適用した結果の値をリストなり配列に入れて返すわけだ．

プログラマーはときにリストなり配列なりの中身を確認したくなる生き物である．
このとき，どうせ全要素回してくれるならと，`map` に中身を出力するだけの関数（void型）を渡そうとする．（C言語の `printf` は int型じゃんというツッコミは華麗にスルーさせていただく）
するとどうだ，`map` は中身を出力するだけに飽き足らず，void型のリストを返そうとする．
当然だ，それが本来の仕事なのだから．

値のない型の値をリストに突っ込んで返そうとするのだ．そりゃエラーになる．
この用途に `map` は適さないのだ．

ちなみに，Rubyなんかにはこういう用途向けの `each` という関数が存在する．（もちろんRubyではこれを `map` で代用できるが，それは今どうでもいい）

でも待ってくれ，ほとんど同じ内容の関数を void型向けとそれ以外向けとで２つも用意するなんてクールじゃない．（C++では型に合わせていくらでも特殊化するが，まぁ呼び出し側には無関係だから．．．）
本来，`map` で `each` みたいなことができるべきだし，それが抽象度の高い関数というものだ．

では，どうするべきか
→ 何か値を返せばいいじゃない
→ でもテキトーな値返すのはなぁ
→ 何も値がないことを示す値があればいいんじゃね？
お待たせしました Unit の登場である．

こう考えたら，関数は全て値を返すものとして統一していた方が都合がいいし，特別な型として Unit あった方がいいわ．



# 結論

以上のような脳内会議を経て，参考記事で最初に書いてた部分が結論として納得のいくものになりました．

> 同じように引数を取るものに対して、値を返すものと返さないものの二種類が存在してしまっていたわけです。これだと困ることがあります。


余談ですが，これを考えていたら Lisp の空リストって結構秀逸というか，もう Unit そのものじゃないかと思えてきました．
もしかして 空リスト=最小単位=unit なのかなとも思ったくらい．（要調査）

こんなことを考える機会をくれた参考記事と，その著者さんに感謝．
CentOSにRubyインストール

CentOSにRubyをインストールした時のメモです。

## 環境
MacOSX
Vagrant
CentOS 7.1

## インストール
rbenvインストール<br>
複数のRubyを管理できる、 ruby-buildというプラグインでrubyをインストールできる。
https://github.com/rbenv/rbenv

```
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ cd ~/.rbenv && src/configure && make -C src
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ ~/.rbenv/bin/rbenv init
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile 
$ source ~/.bash_profile
```

ruby-buildインストール
https://github.com/rbenv/ruby-build


```
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  .
  .
  .
   ree-1.8.7-2012.02
  topaz-dev

$ gem install bundler
```

現時点で最新の安定版2.3.0をインストール

```
$ rbenv install 2.3.0
$ rbenv global 2.3.0
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
```

参考)
https://www.ruby-lang.org/ja/documentation/
fluentdのread_from_headでログの欠損が治ったパターン

fluentdでログの欠損に悩んでいたらread_from_headで解決したパターンをメモ。
（fluentdの設定はわりとうろ覚えです）

ユーザーの行動ログを以下の様なフォーマットで保存していた。

```
log-2016-02-01-00.log
log-2016-02-01-01.log
...
log-2016-02-01-22.log
log-2016-02-01-23.log
log-2016-02-02-00.log
```

ようするに、1時間あたり1ファイルができるようにしていた。

これをfluentdのin_tailプラグインで以下のように読んでいた。

```
<source>
  type tail
  path /path/to/log/log-%Y-%m-%d-%H.log
  ... 以下略
</source>
```

こんな日付指定でログを読んでくれて、新しいファイルが生成されると読み始めたとinfo出してくれるので、fluentdは賢いなと喜んでいた。

この先にElasticsearch + Kibanaの環境があるのだが、そちらで見た時のログの数とログファイルを直接`wc -l`したときの数が一致しない。だいたいどのhourも1.3%ぐらいログが欠損してて、困った。

いろいろ探した結果、`read_from_head`というディレクティブがあることを発見。

> tail Input Plugin | Fluentd
> http://docs.fluentd.org/articles/in_tail

デフォルトはfalseなので、もしやと思ってtrueにしたら、見事ログの欠損がなくなった。

```
<source>
  type tail
  path /path/to/log/log-%Y-%m-%d-%H.log
  read_from_head true
  ... 以下略
</source>
```

## どういうこと

次のファイルが生成された際に、そのファイルを読み始めるのに若干のギャップがあって、デフォルトの動作だと新しいファイルの末尾から読み始めるから、読み始めるまでのログの部分が欠損していたみたい。

末尾から読み始めるデフォルト動作は、ログの出力先が常に`error.log`で、定期的に`error.log-20160202`などにmvして新しくerror.logを作るrotate動作が一般的だからかなと。

fluentdさんはバッファリングがとても優秀でほんと助かる。ちょっと再起動したいぐらいのダウンタイムなら全く問題ないので、気を使わなくてすみます。
クックブックを作成してノードに適用する。- その１


## 関連記事

* [Chefを使ってより効率的にサーバを管理しよう。まずは用語から](http://qiita.com/park-jh/items/9e2e358d2e82a7736cf7)
* [Berkshelfを使って外部クックブックをノードに適用する。](http://qiita.com/park-jh/items/751464a4cc6d8abcd6fd)
* クックブックを作成してノードに適用する。- その１
* [クックブックを作成してノードに適用する。- その２](http://qiita.com/park-jh/items/88237342cfd202e6893f)
* [ChefでCentOS 6.7 + rbenv + ruby 2.3.0の環境を構築する。](http://qiita.com/park-jh/items/f249a18793899f2eb4bf)
* [ChefでCentOS 6.7 + Vim 7.4 + luaを設置する。](http://qiita.com/park-jh/items/371d179d5e71618a1f14)
* [ChefでVimプラグインマネージャーNeoBundleを設置する。](http://qiita.com/park-jh/items/ec09e40f9b4aaf9fedfd)
* [Chefのレシピをデバッグしてみよう。](http://qiita.com/park-jh/items/96a076e167327a6a5a39)
* [ChefでCentOS 6.7 + nginxを設置する。- 外部クックブック](http://qiita.com/park-jh/items/3013c49494e524fced31)
* [ChefでCentOS 6.7 + nginxを設置する。- カスタムクックブック](http://qiita.com/park-jh/items/43451cea21ee1724c24b)
* [ChefでCentOS 6.7 + nodejs + npmを設置する。](http://qiita.com/park-jh/items/96089e7e1c97b0fe3a6c)
* [ChefでVimプラグインマネージャーvim-plugを設置する。](http://qiita.com/park-jh/items/ba27ad412ce9926fd94d)
* [ohaiのカスタムプラグインを作ってみよう。](http://qiita.com/park-jh/items/34be55abb7c63b36cddb)
* [Chef SoloからChef Zeroへ](http://qiita.com/park-jh/items/44c249c9de768c53b423)
* [Chefでnginx + php(php-fpm) + mariadb + wordpressを設置する。](http://qiita.com/park-jh/items/7515e47dddc38257a454)

## vagrant plugin saharaについて

* vagrantではsaharaというpluginがある。
* これを使えばsandboxモードでvagrantを実行してレシピの内容を確認しロールバックで元の状態に戻ることができる。
* レシピの中に誤りがありノードへ適用しようとするとき設置が途中で止まる場合が多い。
* そのようなときにsandboxモードを使えば有用だ。

### 設置

* saharaが設置されているのか確認

```sh
  % vagrant plugin list
```

* 設置されていない場合

```sh
  % vagrant plugin install sahara
```

### sandboxモード

* sandboxモードの実行

```sh
  % vagrant sandbox on
```
* sandboxモードの終了
  - onの状態でoffで終了すると設定内容がそのまま適用される。
  - onの状態で設定した内容を適用したくない場合はoffで終了する前にロールバックする。

```sh
  % vagrant sandbox off
```

* ロールバック

```sh
  % vagrant sandbox rollback
```

* sandboxモードの状態を確認

```sh
  % vagrant sandbox status
```

### sandboxモードでmariadbの設置を試してみる。

* 最新のMariaDBをyumで設置するためにはyum repositoryを追加する必要がある。
* repository generatorを使用してMariaDB.repoエントリを作成する。
* https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university
* repository generatorで出た結果をコピーして使う。
* sandboxモードを実行する。
* sandboxモードはvagrant boxが起動されている状態でも大丈夫だ。

```sh
  % vagrant sandbox on
  % vagrant sandbox status
  % ssh dev
```

* 先ほどコピーしたものを次のファイルに貼っておく。

```sh
  $ sudo vi /etc/yum.repos.d/MariaDB.repo

  # MariaDB 10.1 CentOS repository list - created 2016-02-21 00:19 UTC
  # http://mariadb.org/mariadb/repositories/
  [mariadb]
  name = MariaDB
  baseurl = http://yum.mariadb.org/10.1/centos6-amd64
  gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
  gpgcheck=1
```

* yumでMariaDBをインストール

```sh
  $ sudo yum install MariaDB-server MariaDB-client MariaDB-devel
```

* インストールが終わったらホストに戻ってロールバックしてみよう。

```
  % vagrant sandbox rollback
```

* ゲストに接続してインストールしたMariaDBが無くなったことを確認

```sh
  $ yum list installed | grep -i --color mariadb
```

## 参考

* https://mariadb.com/kb/ja/yum/
* Chef実践入門
メモ：Hugo サイトジェネレータを使ってみた jekyllと比べて

jekyllを使ってみたばかりで、速攻移り気。今度はGo言語で作成されたWebサイトジェネレータ「HUGO」。

jekyllなどのRuby製はページ数が多くなってくると静的ファイル生成がどんどん重くなっていくのが難点的な記事を見て、おすすめされていたのがこのツール。

#使ってみた、
jekyllと同じことをしつつ、カテゴリーやタグ周りが便利そう。
ディレクトリ構造が少し気になる部分がある。※後述、困っている参照

#特徴
・GoLangでの動的描画と静的出力の両方を行うことができる
・htmlとMarkdown記法でページを作成できるのはjekyllと同様
・jekyllではhtmlとMarkdownと静的ファイル(CSSやimages)を同じディレクトリに格納できたが、HugoではhtmlとMarkdownと静的ファイルがそれぞれ別のディレクトリとなる。そのため、ローカルでのディレクトリ構造とwebサイトのURL構造が直観的につながらない部分がある。
・標準の設定だと１ページごとにディレクトリが生成されてしまう。
　→uglyURLsという設定でディレクトリ構成がそのまま再現されるようになるが、なぜか空のhtmlも一緒に生成される
・jekyllに比べて静的htmlの生成が高速
・categoryとtagが標準機能で実装可能っぽい

#困っている
標準だと、ファイル名で自動的にディレクトリ/index.htmlという構造になる。

/about.md→/about/index.html

これを

/about.md→/about.html

としたいとなった場合に、
uglyURLsという設定をtrueにすれば実現できる。
で実際にそのような挙動をする。

##問題点

/about/index.mdというファイルを設置すると、

以下が自動生成される。
/about/index.html
/about.html←こいつがいらない
[RubyMine]JetBrains系エディタでキャメルケース<=>スネークケース、大文字<=>小文字を簡単に切り替える

JetBrains系のエディタでタイトルのことができるプラグインがあるので紹介です

## プラグイン
https://plugins.jetbrains.com/plugin/7160?pr=phpStorm

## キャメルケース<=>スネークケース
`Shift` + `option` + `u`
※For Mac

![HEP5ISzYgF.gif](https://qiita-image-store.s3.amazonaws.com/0/22567/b83f0150-3b3c-9ae9-10b1-12d15c406526.gif)

## 大文字小文字
`Shift` + `Command` + `u`
※For Mac

![7j0CE6KA3H.gif](https://qiita-image-store.s3.amazonaws.com/0/22567/8f28d9b6-7e27-b6e3-5385-aefdd143d011.gif)