OmniAICreator/Qiita-1.07M huggingface dataset:
ソースコードからインストールしたGitをアンインストールできない問題



## 問題

さくらVPSのCentOSのソースコードからインストールしたGit(2.3.1)をアンインストールして最新版のGit(2.4.5)をインストールしようとしたところ、アンインストールできなかった。

```
# cd /usr/local/src/git-2.3.1/
# make uninstall
make: *** ターゲット `uninstall' を make するルールがありません.  中止.
```

```
# find . -type f -name "Makefile"
(前略)
./Makefile
(後略)
```

Makefileはあるけど、Uninstallに関する記述がない？

## 環境

CentOS 6.6

Git 2.3.1  # アンインストールできなかったバージョン
(インストールディレクトリは `$ ./configure --prefix=/usr/local/
`と指定した)

## 解決

適当なディレクトリにもう一度インストールしてみて、その時インストールされたファイルをリストにしてそれを元に消すという方法。

まず、適当なディレクトリを作成し、そこにGitをインストールする。

```
# mkdir /tmp/test_git
# cd /usr/local/src/git-2.3.1/
# make prefix=/tmp/test_git install
```

次に、インストールされたファイルをリストとして出力する。

```
# find /tmp/test_git -type f -print > /tmp/git-installlist.txt
```

そして、出力されたファイルの全行の `/tmp/test_git` を `/usr/local` (元のインストールディレクトリ)に置換する。

```
# vim /tmp/git-installlist.txt
```

```vim
:%s/\/tmp\/test_git/\/usr\/local/g
```

置換した結果

```git-installliset.txt
/tmp/test_git/libexec/git-core/git-send-pack
/tmp/test_git/libexec/git-core/git-am
/tmp/test_git/libexec/git-core/git
(後略)
```

↓↓↓

```git-installliset.txt
/usr/local/libexec/git-core/git-send-pack
/usr/local/libexec/git-core/git-am
/usr/local/libexec/git-core/git
(後略)
```

最後に、`| xargs`でgit-installlist.txtの内容をrmに渡してファイルを消す。

```
# cat /tmp/git-installlist.txt | xargs rm -f
```

アンインストール完了。
これにて一件落着です。


## 参考

[git - ソースからインストールしたGitのアップデートをしたい - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/2424/%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9Fgit%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%82%92%E3%81%97%E3%81%9F%E3%81%84)

[ソースコードからインストールしたGitをアンインストール - Qiita](http://qiita.com/soeda_jp/items/fd7602ecf95db656cb05)
zshのオプション設定の分かりにくいところまとめ

zshには「オプション」というものがある。オプションとは、zshの動作を切り替えるためのオン/オフのフラグのこと。zshを使ってる人は何かしらオプションを設定して、使いやすいようにカスタマイズしてると思う。このオプションを設定したり、設定した値を確認する方法がちょっと分かりにくいので、ここでまとめておく。

## オプションを有効にする
オプションを有効にするには、setoptコマンドを使う。これは次のように、`setopt <オプション名>`という形で使う。

```zsh
# AUTO_CDオプションを有効にする
setopt AUTO_CD
```

## オプションを無効にする
オプションを無効にするには、unsetoptコマンドを使う。これは次のように、`unsetopt <オプション名>`という形で使う。

```zsh
# AUTO_CDオプションを無効にする
unsetopt AUTO_CD
```

または、オプション名の先頭に`NO_`を追加してsetoptコマンドを呼び出してもよい。

```zsh
# AUTO_CDオプションを無効にする
setopt NO_AUTO_CD
```

これでもオプションが無効になる。

## オプション名の基本ルール
setopt, unsetoptでオプション名を指定するときは、オプション名の大文字小文字の違いは区別されないし、オプション名に含まれる`_`はすべて無視される。

例えば、次の例はすべてAUTO\_CDオプションを有効にしている。

```zsh
setopt AUTO_CD
setopt auto_cd
setopt autocd
setopt AutoCd
setopt _AU__TO_CD
```

ちなみに、man zshoptionsでは、オプション名はすべて大文字、`_`区切りの形式で書いてある。

## オプションの設定状態を確認する
setoptコマンドを引数を付けずに呼び出すと、有効に設定しているオプション一覧が表示される。

```
% setopt
autocd
autopushd
nobeep
extendedglob
extendedhistory
... 以下省略 ...
```

unsetoptコマンドを呼び出すと、無効に設定しているオプション一覧が表示される。

```
% unsetopt
noaliases
allexport
noalwayslastprompt
alwaystoend
noappendhistory
... 以下省略 ...
```

ただし、この出力で先頭に「no...」と付いているオプションは有効/無効が逆になっていることに注意。つまり、「noオプションを有効にする」、というのは「オプションを無効にする」という意味になる。

上の例で言うと、setoptの出力にnobeepが含まれているので、「nobeepオプションが有効」になっている。これはつまり、beepというオプションが無効に設定されていることを表している。

同じように「noオプションを無効にする」というのは「オプションを有効にする」のと同じ意味になる。上の例ではunsetoptの出力にnoaliasesが含まれている。これは「noaliasesオプションが無効」、つまり「aliasesオプションが有効」という意味になる。

なんでこんな分かりにくい形式になっているのかは知らない。

有効/無効含めてすべてのオプションの設定を一覧表示したいときは、set -oを使う。

```
set -o
noaliases             off
allexport             off
noalwayslastprompt    off
alwaystoend           off
noappendhistory       off
autocd                on
autocontinue          off
noautolist            off
... 以下省略 ...
```

これですべてのオプションの状態がわかる。setoptコマンドと同じように、先頭にnoが付いているオプションはon/offが逆になる。

on/off逆で分かりにくいという人は、次の記事が参考になる。

- [zshでオプション一覧の出力を分かりやすくする - Qiita](http://qiita.com/mollifier/items/26c67347734f9fcda274)

これぐらい知っておけば設定方法について迷わないと思うので、参考にしてください!
ESP-WROOM-02  の Arduino 環境で I2C 制御

ESP-WROOM-02 は単体で Arduino として使用できます。
Arduino のWireライブラルを使用すると I2C 制御が簡単にできるので紹介します。


### 回路図

![ESP-WROOM-02-I2C-schematic.png](https://qiita-image-store.s3.amazonaws.com/0/26783/eaba8c76-5dc2-80bc-8a1a-75d751609114.png)


### 必要なもの
* ESP-WROOM-02  
 私は926円で買いました。安い！
* FT232RL USBシリアル変換モジュール AE-UM232R  
 http://akizukidenshi.com/catalog/g/gK-01977/  
 ESP-WROOM-02 と Arduino をシリアル通信するために使用します
* I2C接続小型キャラクタLCDモジュール 8x2行 AE-AQM0802  
 http://akizukidenshi.com/catalog/g/gP-06669/  
 このデバイスを I2C で制御します
* I2C接続小型LCDモジュール用ピッチ変換基板  
 http://akizukidenshi.com/catalog/g/gP-06794/  
* 3.3V 3端子レギュレータ  
 出力が 3.3V ならなんでもいいのですが uPC2933B を使いました。
 ちなみに AE-UM232R にも 3.3V の出力端子ありますが、最大定格が 50mA しかないのでこれで 3.3V を作ります。
* 抵抗10kΩ x5
* セラミックコンデンサ 0.1uF x2
* アルミ電解コンデンサ 10uF
* PC  
 Arduino 環境をインストール済みのPC。
 わたしは Mac を使いましたが、Windows, Linux も環境あるようです。
 Arduino 環境のインストール方法は https://github.com/esp8266/Arduino の Installing with Boards Manager に書いてあります。
* ブレッドボード  
 長めなブレッドボードでないと入りきりません

### スケッチ

```c++:esp-wroom-02-i2c.ino
#include <Wire.h>
#define ADDR 0x3e

void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println("");
  Serial.println("Started");
  Wire.begin(4, 14);
  delay(40);

  uint8_t cmd_init[] = {0x38, 0x39, 0x14, 0x70, 0x56, 0x6c, 0x38, 0x0d, 0x01};
  command(cmd_init, sizeof(cmd_init));
  delayMicroseconds(1080);  // 1.08ms

  uint8_t cmd_str1[] = {0x48, 0x65, 0x6c, 0x6c, 0x6f};
  uint8_t cmd_cr[] = {0xc0};
  uint8_t cmd_str2[] = {0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21};
  write(cmd_str1, sizeof(cmd_str1));
  command(cmd_cr, sizeof(cmd_cr));
  write(cmd_str2, sizeof(cmd_str2));
}

void loop() {
}

void command(uint8_t *cmd, size_t len) {
  size_t i;
  for (i=0; i<len; i++) {
    Wire.beginTransmission(ADDR);
    Wire.write(0x00);
    Wire.write(cmd[i]);
    Wire.endTransmission();
    delayMicroseconds(27);    // 26.3us
  }
}

void write(uint8_t *cmd, size_t len) {
  size_t i;
  for (i=0; i<len; i++) {
    Wire.beginTransmission(ADDR);
    Wire.write(0x40);
    Wire.write(cmd[i]);
    Wire.endTransmission();
    delayMicroseconds(27);    // 26.3us
  }
}
```

### ファームウェアの書き込み方

1. sw1 を押しながら sw2 を押します。その後 sw1 を離します。  
 sw2 を離すときに sw1 が押されていればOKです。  
 IO1 を Low にしてリセットすることで、ファームウェア書き込みモードで起動しているのです。
2. Arduino でスケッチを開きます
3. マイコンに書き込むボタンを押すと書き込みが始まります
4. 書き込みが完了すると通常モードで起動します。  
 LCD ディスプレイに文字が表示されているはずです。

![IMG_0874.JPG](https://qiita-image-store.s3.amazonaws.com/0/26783/0c7d36af-800d-6a31-58bf-1a499f8d63c3.jpeg)


回路図で ESP-WROOM-02 の EAGLE ライブラリ書いたので公開しておきます。
https://raw.githubusercontent.com/ikesato/eagle-libraries/master/lbr/esp-wroom-02.lbr
よかったらどうぞー。

ESP-WROOM-02 は WiFi モジュールとして使えますが、単体でここまで出来るとは素晴らしい！
Rails 部分テンプレートの使い方

#部分テンプレートを使う
View内で共通パーツ、繰り返し処理をするパーツは部分テンプレートを使います。
以下、説明の中の例ではArticleモデルがあって、titleというカラムを持つものとして説明します。


##基本形

partialに指定したテンプレートを呼び出します。
テンプレート名の先頭には"_"を付けます。

```erb
<%= render :partial => "(template_name))" %>
```

###例

render部分で_article.html.erbを読み込みます。

```erb:articles/index.html.erb
<%= render :partial => "article" %>
```

```erb:articles/_article.html.erb
<p>articleです</p>
```

##変数を渡す

基本形は単純にテンプレートの表示を行いましたが、部分テンプレートに変数を渡してみたいと思います。

```erb
<%= render :partial => "(template_name))", :locals => { (ローカル変数名): (渡す値) } %>
```

###例

render部分で_article.html.erbを読み込みます。

```erb:articles/index.html.erb
<%= render :partial => "article", :locals => { title: @article.title } %>
```

```erb:articles/_article.html.erb
<p>articleのタイトルは<%= title %>です</p>
```

これで title部分で @article.titleが入ります。

###補足
以下でも表示は同様に実現出来ます。
インスタンス変数を直接部分テンプレート内で使用しています。

```erb:articles/index.html.erb
<%= render :partial => "article" %>
```

```erb:articles/_article.html.erb
<p>articleのタイトルは<%= @article.title %>です</p>
```

しかし、

* 部分テンプレートで使う変数が不明確。
* 再利用性が低い

といった観点からよくない書き方となります。
詳しくは
[Railsの部分テンプレートからインスタンス変数を参照するのはやめよう。](http://kadoppe.com/archives/2013/09/rails-partial-template-instance-variables.html)
が参考になります。

##部分テンプレートを繰り返し表示する
「一つの記事項目をテンプレート化して、それを繰り返し表示することで一覧を表示する」ように部分テンプレートを繰り返し処理したい場合があります。
そのときに、便利な方法があります。

```erb
<%= render :partial => "(template_name))", :collection => (繰り返し表示させるためのインスタンス） %>
```

###例

render部分で_article.html.erbを読み込みます。
```@articles```の要素の数だけ部分テンプレートが繰り返されます。

```erb:articles/index.html.erb
<%= render :partial => "article", :collection => @articles %>
```

```erb:articles/_article.html.erb
<p>articleのタイトルは<%= article.title %>です</p>
```

ここで、ローカル変数は:partialで指定したものになります。(例のarticle)
ただし、ローカル変数を別の名前で使用したい場合はasオプションを使います。

```erb:articles/index.html.erb
<%= render :partial => "article", :collection => @articles, :as => "ele" %>
```

```erb:articles/_article.html.erb
<p>articleのタイトルは<%= ele.title %>です</p>
```

##補足
localsとcollectionは併用出来ます。
Seleniumを使ってクラウドのバーチャルマシンを自動的に作成


Seleniumを使ってIDCFクラウドのバーチャルマシンを自動的に作成するスクリプト
`wait`機能を使って、HTMLの要素がロードされてから操作するようにしています


[chromedriver](https://sites.google.com/a/chromium.org/chromedriver/downloads)が必要で、ダウンロードします

ページの構造が変わりますが、find_element_by_xpath()を使って修正するといいです。

```py3
#!/usr/bin/env python3

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome('./chromedriver')
driver.get("https://account.idcfcloud.com/auth/login?service=https%3A%2F%2Fconsole.idcfcloud.com%2F%3Fcl%3Drn_lgin")
driver.maximize_window()

username = driver.find_element_by_id("username")
# パスワード入力欄のタグを取得
password = driver.find_element_by_id("password")
# ユーザーIDを入力
username.send_keys("YOUR_USERNAME")
# パスワーdを入力
password.send_keys("YOUR_PASSWORD")
# サブミットする
driver.find_element_by_name("submit").click()

driver.find_element_by_partial_link_text('仮想マシン作成').click()
# sshなし
driver.find_element_by_xpath("//*[@id='formVmCreate']/div/div/ul/li[5]/div[2]/div/div/div/div[1]/button[4]").click()

# マシン名
driver.find_element_by_xpath("//*[@id='formVmCreate']/div/div/ul/li[8]/div[2]/div/div/div[3]/table/tbody/tr[2]/td[2]/input").send_keys("test123")
# マシングループ
driver.find_element_by_xpath("//*[@id='groupName3']").send_keys("group111")
driver.find_element_by_id('vmCreateConfirm').click()
# 作成
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[3]/div/div/div[2]/div/form/div/div/ul/li[9]/div[2]/div/div/div[2]/a"))
    )
    print ("OK, page loaded")
except TimeoutException:
    print ("Loading took too much time!")

driver.find_element_by_xpath("/html/body/div[3]/div/div/div[2]/div/form/div/div/ul/li[9]/div[2]/div/div/div[2]/a").click()
```


下のコードはポップアップしたページが完全にロードしてから操作するようにSeleniumの`wait`を使っています。

```py3
# 最後確定するための作成ボタンを押します
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[3]/div/div/div[2]/div/form/div/div/ul/li[9]/div[2]/div/div/div[2]/a"))
    )
    print ("OK, page loaded")
except TimeoutException:
    print ("Loading took too much time!")

driver.find_element_by_xpath("/html/body/div[3]/div/div/div[2]/div/form/div/div/ul/li[9]/div[2]/div/div/div[2]/a").click()
```

参照

- http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html

- http://selenium-python.readthedocs.org/en/latest/waits.html
supervisorのメッセージキューが溜まる

# supervisorのメッセージキューが溜まる

つい先日, supervisorのメッセージキューが溜まり続けていたので教訓として残す.

## start_child, terminate_child, etc...の実装について

[start_child](https://github.com/erlang/otp/blob/745563e98f6993e279703dc1ad1e9a2c38dfac28/lib/stdlib/src/supervisor.erl#L165)を例に取る.
見ての通り, supervisorはgen_server behaviourで定義されており, start_childは内部的には`gen_server:call/3` (timeout: `infinity`) が呼ばれる.

その後, [ここ](https://github.com/erlang/otp/blob/745563e98f6993e279703dc1ad1e9a2c38dfac28/lib/stdlib/src/supervisor.erl#L380)で`ChildSpec`に則り, 起動処理を行う.
[起動処理](https://github.com/erlang/otp/blob/745563e98f6993e279703dc1ad1e9a2c38dfac28/lib/stdlib/src/supervisor.erl#L341)は単純で`erlang:apply/3`の結果を見て, 成功していれば`ChildSpec`を保存・管理する.

## gen_serverの起動処理

子の起動処理として以下の関数をここでは以下を想定しよう.

```erlang
-module(hoge_server).
-behaviour(gen_server).
-compile(export_all).

start_link(Args) ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, Args, []).

init(Args) ->
    {ok, Args}. 

%% 以下略
```

supervisorの`do_start_child`内の`erlang:apply/3`で実行されるのは, `hoge_server:start_link/1`である.

この中の`gen_server:start_link`は`init/1`の処理が終わるまで結果を返さない.
([proc_lib:start_link](https://github.com/erlang/otp/blob/745563e98f6993e279703dc1ad1e9a2c38dfac28/lib/stdlib/src/proc_lib.erl#L316)で`sync_wait`で待っている)

## supervisorのメッセージキューが溜まる条件
以上を踏まると,

`Mod:start_link` + `Mod:init`にかかる時間に呼ばれる`start_child`の回数が1回を超えるとメッセージキューが溜まることが分かる.
あとは, 処理待ち時間が増えていくので`start_child`が減らない限りは溜まり続けるだけだ.

ちなみに, `gen_server` behvaiourの`terminate`処理に時間がかかっても同様の事が実現できる.

つまり, **start_link, init, terminate で通信を行うような重い処理をしてはならない**.

-----

パーツパーツとしては分かっていたつもりだったが...

1. 帯域が埋まり, ラック内のサーバーへのRTTが40msになる.
2. start_link, initで行っていた, 分散KVSへのリクエストに時間がかかる.
3. supervisorのメッセージキューがたまる.
4. `gen_server:call` -> `supervisor:start_child` してたのでtimeoutしまくる.

素晴らしいコンボだった.
httpのドキュメントルートディレクトリを変更する方法

目的：
ドキュメントルートディレクトリを
/var/www/cakephp
に変える
***
/etc/httpd/conf.d
ここに行って
sudo vim virtualhost.conf
を実行する
***
```
<VirtualHost *:80>
        ServerName cakephp.site
        DocumentRoot /var/www/cakephp/
        <Directory /var/www/cakephp/>

                Options All
                Allow from All
                AllowOverride All
        </Directory>
</VirtualHost>
```
***
を書き込み、

```
sudo service httpd restart
```
とすれば完了
Xamarin(C#)で、変数変更時に自動でEventHandlerを呼び出すラッパーを作ったけど絶対これ車輪を再発明している件


[Xamarin(C#)で、メンバ変数変更時に自動で値を表示するような事をやってみたかった。](http://qiita.com/paming/items/0c6bd4e2c889a2e7a4f3)の続きです。

C#にはgenericsがあるので、「値がセットされたらEventHandlerを呼び出すクラス」は作れるなぁと思ったので作ってみました。
ただ、このような仕組みというか考え方は、きっと誰かがすでに考えてるはずなので、C#に組み込まれてるとか、オープンソースで公開されてるとかがあるはずです。あるはずなのですが、それをググるためのキーワードが思い付きませんでした。誰か教えてください。
 
```C#:
namespace HelloDatePicker
{
	// このWrapper<>相当のもの、C#の標準品であってもおかしくない、とは思うけど
	// 何になるのかがわからない
	// Instanceの入れ替えには反応できるけど、Instanceの中内容の変化には事には対応できないので
	// 不完全な実装。
	public class Wrapper<Type>
	{
		private Type _instance;

		public Type Instance {
			get {
				return _instance;
			}
			set {
				_instance = value; 
				if (this.updateHandler != null) {
					this.updateHandler (this, _instance);
				}
			}
		}

		// Instanceが変更されたら、このEventHandlerが呼び出される
		public event EventHandler<Type> updateHandler;
	}

	[Activity (Label = "HelloDatePicker", MainLauncher = true, Icon = "@drawable/icon")]
	public class MainActivity : Activity
	{
		private TextView dateDisplay;
		private Button pickDate;

		private Wrapper<DateTime> dateWrapper; // DateTimeをラップしている

		protected override void OnCreate (Bundle savedInstanceState)
		{
			base.OnCreate (savedInstanceState);
			SetContentView (Resource.Layout.Main);

			// capture our View elements
			dateDisplay = FindViewById<TextView> (Resource.Id.dateDisplay);
			pickDate = FindViewById<Button> (Resource.Id.pickDate);

			// ラッパーをセット
			this.dateWrapper = new Wrapper<DateTime> ();

			// add a click event handler to the button
			pickDate.Click += delegate {
				DateTime date = this.dateWrapper.Instance;
				DatePickerDialog dialog = new DatePickerDialog (this, OnDateSet, date.Year, date.Month - 1, date.Day);
				dialog.Show ();
					
			};

			// this.dateが変更されたらdateDisplayに反映するイベント登録
			this.dateWrapper.updateHandler += delegate(object sender, DateTime e) {
				this.dateDisplay.Text = e.ToString ("d");
			};

			// .Instanceが邪魔だよなぁ。
			this.dateWrapper.Instance = DateTime.Today;
		}

		// the event received when the user "sets" the date in the dialog
		void OnDateSet (object sender, DatePickerDialog.DateSetEventArgs e)
		{
			// DatePickerDelegateで設定おされたら呼び出される
			// this.dateを更新してるだけ。
			this.dateWrapper.Instance = e.Date;
		}
	}
}


```
【pryあるある】binding.pry がどこにあるのかわからなくなる

#またbindin.pryを消し忘れて実行しちゃったよ

Pryがないと生きていけない体のわたくし｡
すごい便利なんですが､長いコードになってくると

binding.pry

がどこにあるのかわからなくなります｡
ちょっと休憩するともうどこにあったか覚えてない｡
で､こういうスニペットを作ってみたという｡


```
<snippet>
  <content><![CDATA[
######################

    binding.pry

######################
]]></content>
  <tabTrigger>bi</tabTrigger>
  <scope>source.ruby</scope>
  <scope>source.erb</scope>
  <description>pry breakpoint</description>
</snippet>
```

まぁここまでデカいと見逃しませんよね｡という｡

ERBファイルの中に無理やり打ち込むのはこちら｡
こちらは動くかどうかわかりませんが

```
<snippet>
  <content><![CDATA[
<!----------------------------->

       <%= binding.pry %>

<!----------------------------->

]]></content>
  <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
  <tabTrigger>bi</tabTrigger>
  <!-- Optional: Set a scope to limit where the snippet will trigger -->
  <description> pry in erb template </description>
  <scope>text.html.ruby</scope>
</snippet>
```

エディタの設定で強調表示とか出来ないんですかねぇ｡
もしくはGemかなんかでbinding.pryを削除するかどうか聞いてきたりとか｡
qrintfをつかってmruby-onig-regexpをビルドするには

# CC=qrintf clangだとエラーが出た

```shell-session
libtool: compile:  clang-qrintf -DHAVE_CONFIG_H -I. -I. -I/usr/local/include -MT regerror.lo -MD -MP -MF .deps/regerror.Tpo -c regerror.c -o regerror.o
In file included from regerror.c:37:
/usr/lib/llvm-3.6/bin/../lib/clang/3.6.0/include/varargs.h:25:4: error: "Please use <stdarg.h> instead of <varargs.h>"
  #error "Please use <stdarg.h> instead of <varargs.h>"
   ^
regerror.c:263:3: error: too few arguments provided to function-like macro invocation
  va_init_list(vargs, code);
  ^
regerror.c:38:37: note: expanded from macro 'va_init_list'
#define va_init_list(a,b) va_start(a)
                                    ^
/usr/lib/llvm-3.6/bin/../lib/clang/3.6.0/include/stdarg.h:33:9: note: macro 'va_start' defined here
#define va_start(ap, param) __builtin_va_start(ap, param)
        ^
regerror.c:335:3: error: too few arguments provided to function-like macro invocation
  va_init_list(args, fmt);
  ^
regerror.c:38:37: note: expanded from macro 'va_init_list'
#define va_init_list(a,b) va_start(a)
                                    ^
/usr/lib/llvm-3.6/bin/../lib/clang/3.6.0/include/stdarg.h:33:9: note: macro 'va_start' defined here
#define va_start(ap, param) __builtin_va_start(ap, param)
        ^
3 errors generated.
make[2]: *** [regerror.lo] Error 1
```

# 暫定対処方法

./configure時はCC=clang
で行い、作成されたMakfefileのCC=の指定を

```mf
CC=qrintf clang
```

と変更して、make

# 何が原因なのか


CC=qrintf clangだと

```
checking for qrintf clang option to accept ISO C89... unsupported
```

CC=clangだと

```
checking for clang option to accept ISO C89... none needed
```

このオプションがunsupportedだとC89以前のコンパイラと判定され、
前述のエラー中のvarargs.hが使われて、va_系の古き良き時代のコードがビルド対象となる模様。


初めは、qrintf clangとスペースが入っているのと、名称が気になり、clang-qrintfなるシェルスクリプトを作って、これをCCに指定したが変わらず。もちろんclang-qrintfコマンドでフツーにコンパルできる事は確認。

autoconfのISO C89関連のオプション検出の処理(ac_cv_prog_cc_c89)になにか問題があるのか、qrintfが何かこの検出処理に影響を与えているのかのいずれかだとは思う。

# 参考資料

- [さよなら varargs.h - 檜山正幸のキマイラ飼育記](http://d.hatena.ne.jp/m-hiyama/20081001/1222831001)

# 関連記事

- [qrintfをclangで使ったらautoconfの事が少し分かった件](https://abrakatabura.hatenablog.com/entry/2015/07/14/070734)
Vagrant up ができなかったバカな僕へ（超初歩的）

いつも通り
vagrant up をやろうと思ったらできなかった。
terminal が言ってきた原因はこう
***
```
Bringing machine 'default' up with 'virtualbox' provider...
Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening
on these ports. The forwarded port to 2222 is already in use
on the host machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:

  config.vm.network :forwarded_port, guest: 22, host: 1234

Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn't allow modifying port forwarding.
Kang-no-MacBook-Air:kang kangyoosam$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening
on these ports. The forwarded port to 2222 is already in use
on the host machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:

  config.vm.network :forwarded_port, guest: 22, host: 1234

Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn't allow modifying port forwarding.
```
***

要約すると、他の場所すでにvagrantが立ち上がってたらしい（vagrant up されてたらしい）。

history で履歴をみると、たしかにvagrant upやってた！（記憶にはない）
僕の場合はホーム画面でvagrant up　してしまってたので、home に行って、vagrant suspend（vagrant をストップする）をしたら解決した。
【Mac】バナー通知の表示時間(秒数)を調整する

Macの通知のうち、バナー通知の表示時間はコマンドで調節できる。

通知で内容をある程度読みたいのにすぐ消えてイライラする場合や、いつまでも消えなくてイライラする場合に調節すると良い。

# 設定方法

Terminal.app を開いて次のコマンドを入力する。

```
defaults write com.apple.notificationcenterui bannerTime 秒数
```

秒数は 1~25 の範囲でしか設定出来ない。

また、デフォルトに戻す場合は秒数を抜いて叩けば良い。

```
defaults write com.apple.notificationcenterui bannerTime
```

以上。
strftime これを見ろ - 引数で使うべき文字が一瞬でわかるチートシート


毎回毎回毎回毎回ググっているので、ひと目でわかるようにしました。

```ruby:

def f(str)
  Time.now.strftime(str)
end

### よくあるやつ
f "%C%y年 %m月%d日 %H時%M分%S秒" #=> "2015年 06月22日 02時33分17秒"

### 12時間表記
f "%I時(%p)" #=> "02時(AM)"

### 曜日、月、午前午後、時差
f "%A %a | %B %b | %P %p | %z %Z" #=> "Monday Mon | June Jun | am AM | +0900 JST"

### %ではなく%-を使うと、0埋めしない
f "%-I時" #=> "2時"
```
【Tips】Mac OS X YosemiteにアップデートしてPhotoshopやRが起動ができないとき


皆さん、こんにちは。

最近、Macにインストールしたアプリケーションがうまく起動できずに困っておりました。
いろいろ調べてみたところ、OSアップデートしたことによるエラーのようでしたので、
こちらの回避策についてご紹介します！！

参考までに私のマシンバージョンは。。。
![2015-07-12-001.png](https://qiita-image-store.s3.amazonaws.com/0/33479/35d9d957-1ac6-fa76-705a-0ae2061660ef.png "2015-07-12-001.png")


-
## ① アプリケーションを実行した際に下記のようなアラートが表示されます
![2015-07-12-002.png](https://qiita-image-store.s3.amazonaws.com/0/33479/3da99e23-c015-759e-e74b-fc8eb7609320.png "2015-07-12-002.png")


Javaが正常にインストールされていても上記アラートが表示されますね。。。

## ② Appleのサイトから修正版パッケージをダウンロードします

ダウンロードサイトは下記になります（2015/07/12時点）。
http://support.apple.com/kb/DL1572?viewlocale=ja_JP

![2015-07-12-003.png](https://qiita-image-store.s3.amazonaws.com/0/33479/54eec79d-f24b-0571-cb6a-9868ab7e85de.png "2015-07-12-003.png")


## ③ ダウンロードしたパッケージをインストールします

![2015-07-12-004.png](https://qiita-image-store.s3.amazonaws.com/0/33479/7ae410c4-17d8-288e-d6fe-1015b3959eec.png "2015-07-12-004.png")

インストールは表示される説明に沿って行います（簡単でした）。

![2015-07-12-005.png](https://qiita-image-store.s3.amazonaws.com/0/33479/e1063b8f-96bc-9c37-859b-45ba065be0f3.png "2015-07-12-005.png")

↓

![2015-07-12-006.png](https://qiita-image-store.s3.amazonaws.com/0/33479/adb82926-a01b-9b3f-e017-08c6b8370723.png "2015-07-12-006.png")

↓

![2015-07-12-007.png](https://qiita-image-store.s3.amazonaws.com/0/33479/c58d4802-0cd1-7454-e208-2f7ce2ee8590.png "2015-07-12-007.png")

↓

![2015-07-12-008.png](https://qiita-image-store.s3.amazonaws.com/0/33479/cf32b185-1f8a-301a-6599-ac916a2b95a7.png "2015-07-12-008.png")

↓

![2015-07-12-009.png](https://qiita-image-store.s3.amazonaws.com/0/33479/609cb0e5-53e3-ce7b-bcdb-73576e541e55.png "2015-07-12-009.png")

↓

![2015-07-12-010.png](https://qiita-image-store.s3.amazonaws.com/0/33479/4580a160-ec90-c09e-f05a-dbec85c3bb49.png "2015-07-12-010.png")



## ④ アプリケーションを再度実行してみる

![2015-07-12-011.png](https://qiita-image-store.s3.amazonaws.com/0/33479/d5e641e3-3eb2-cc94-af76-c8410db6b56c.png "2015-07-12-011.png")

無事にアプリケーションを起動できました( ﾟДﾟﾉﾉ☆ﾊﾟﾁﾊﾟﾁﾊﾟﾁﾊﾟﾁ
OSのバージョンアップはこういうことがあるので、みなさんもバージョンするときは注意してくださいね〜(・∀・)

では！！
if: :devise_controller?がわかった！

```rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  befofe_action :configure_permitted_parameters, if: :devise_controller?
  protect_from_forgery with: :exception

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(sign_up).push(:nickname, :avatar)
  end

  def after_sign_out_path_for(resource)
    '/users/sign_in' # サインアウト後のリダイレクト先URL
  end
end
```
このコードについて以下のことがわかった。

```rb
befofe_action :configure_permitted_parameters, if: :devise_controller?
  protect_from_forgery with: :exception
```

:devise_contoller?とはdeviseを生成した際にできるヘルパーメソッドの一つで、deviseにまつわる画面に行った時に、という意味がある。こうすることで全ての画面でconfigure_permitted_parametersをするのを防いでいるのである。
「宿題-01」九九を表示するプログラムを書いてください。


#JAVA Classの生成

##①　新規Classファイルを作成する。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/cb3a0840-31fa-d65a-740a-0443758b63df.png)

##②　srcを右クリック → 新規 → Class 
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/a0da28fd-1078-734c-e3e9-a8caee46507c.png)

##③　パッケージ名：homework　名前：Kuku
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/8b6d8b9c-2f3f-e185-5cfb-793a078eb412.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/83b52bb7-ee8b-2177-cd97-85dbedd3cad6.png)


#**<font color=orange>【宿題-01】九九を表示するプログラムを書いてください。**

```filename:Kuku.java
package homework;

public class Kuku {
	public static void main(String[] args) {
		System.out.println("九九表示プログラム");
	}
}

```

##**<font color=red>【結果】**
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/7251e93c-19bd-d5d1-b3f9-f4b64b78459c.png)
Chainerで機械学習と戯れる：加算と減算を同時に学習できるか？


はじめに
========

[前回:Chainerで機械学習と戯れる： ２進法を学習できるか？](http://qiita.com/mokemokechicken/items/0c515a60a447d341d1d9) に続いて単純なパターンを試してみます。

今回のお題は 足し算と引き算です。
前回の結果から加算・減算それぞれが学習できるのは容易に想像できますが、
**ある入力がきたら加算、別の入力がきたら減算**というのは学習できるのだろうか、、というのが今回の実験の目的です。

お題：加算と減算を同時に学習できるか？
=======
問題
----
* N Bit で表される２つの２進数x1,x2の加算と減算を学習できるか.
* IN: (x1, x2, add or sub)  # add=0, sub=1
* OUT: x1+x2 or x1-x2
	* ただし x1 >= x2 とする

入力として x1, x2 と 加算なら０、減算なら１ というものが与えられ、
出力として ２進法の時と同じように対応するどこかのNodeを１にする、
というものです。

実験
-----

[実験に使ったソースコードはこちら](https://github.com/mokemokechicken/PlayingChainer/blob/master/src/play2/add_sub.py) です。

評価の仕方は前回と同じような感じなのでソースコードも似たような感じですが、
任意の中間の階層を簡単に指定できるようにしました。
というもの、100％の正答率にすることができなかったので、色々な構造を試したかったからです。

結果
-----
今回の実験では入力が2bitのときですら正答率80~90%を超えることができませんでした。
中間層を「なし、 [10], [10,10], [10,10,10]」とか色々試してみてもダメでした。

加算のみ、減算のみ、であれば正答率100％になりました。

考察
------
ある入力（加算・減算フラグ？）をキーにして、演算をがらっと切り替える、、というのはこういう構造だとダメっぽいです。
よくあるXORが学習できない、的な何かなのかな・・・
何かこうちょっとしたことでなんとかなりそうな気もするのですが、うーむ。

あとそもそもプログラムが間違っている可能性もあるかもしれないです。

さいごに
========

話は変わりますが、前回「DQNってどうなっているのかなー」と書きましたが、
[DQNの生い立ち　＋　Deep Q-NetworkをChainerで書いた](http://qiita.com/Ugo-Nama/items/08c6a5f6a571335972d5)
でまさにそのことについて説明されています！
DQNは「強化学習＋DeepLearning」ということらしいです。
「強化学習」は言葉しか知らなかったのでそういうことだったのか、と感動しました。強化学習についてもちょっと試してみたいと思っています。

[次回:k/Nの実数入力から k を出力できるのか？](http://qiita.com/mokemokechicken/items/fb362343c38c22282bc8)
FuelPHP:アクセス制御機能のOrmauth論理ER図

![論理ER図](https://lh3.googleusercontent.com/welCAv71QG-hyhygtvwTuQhSniurL7Lj-Wsym7YqJ5g=w2444-h1730-no "論理ER図")

[拡大](https://photos.google.com/share/AF1QipPLA6xYhb8Hyg4MDJ41M6hW63vhxjUc5tZC1lJchwSwATk9noD0xYb0iLYuUl36zw/photo/AF1QipORGgzr97GO8c1h2JnN3-VByhkeW2hUCaOsgpq1?key=N002OTQ5RnlHc1NGNldUWFFiX2RXcjd4VmpKdWpn "論理ER図")

[ACCON](https://kurobuta.jp/books/book/manual/accon//?id=19 "ACCONマニュアル")のアクセス制御（認証・認可）機能は、このOrmauthをベースに作成（管理画面を含む）しています。

* [概念モデル](http://qiita.com/maemori/items/3e4773834782b9caf361)

* [ACCONのクラス図](http://qiita.com/maemori/items/179d47e23bc3265f6bdd)

* [FuelPHPとACCONの関連を表現したクラス図](http://qiita.com/maemori/items/6a5b3c9a8b92195550ba)
S2JdbcでpostgreSQLに接続する

doltengで生成した雛形は、h2Databaseなので、
postgreSQLに接続情報を変更する。


## S2Jdbcの設定ファイル
###s2jdbc.dicon
diarectをpostgreSQLに変更する。
これにより、s2jdbcが自動生成するSQLがpostgreSQLのdiarect(方言)が採用される。

```s2jdb.dicon
<property name="dialect">postgre81Dialect</property>	
```

###jdbc.dicon
接続情報を定義する。

```jdbc.dicon	
<!-- for PostgreSQL -->
<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
  <property name="driverClassName">
        "org.postgresql.Driver"
  </property>
  <property name="URL">
        "jdbc:postgresql://localhost/kinmuDB"
  </property>
  <property name="user">"DBユーザー名"</property>
  <property name="password">"password"</property>
</component>
```

### JDBCドライバのダウンロード
S2JDBCでは、PostgreSQLのJDBCドライバは用意されていないPostgreSQL JDBCドライバ公式サイトより、JDBCドライバをダウンロードする。
https://jdbc.postgresql.org/download.html


PostgreSQLとJDKのバージョンによってドライバが異なるので注意。
今回は、「PostgreSQL 9.2」と「JDK 1.7」の為、「9.2-1004 JDBC 41」である。
ダウンロードしたファイルは「postgresql-9.2-1004.jdbc41.jar」。

JDBCバージョンについて
　・JDK 1.6 - JDBC4. Support for JDBC4 methods is not complete, but the majority of methods are implemented.
　・JDK 1.7, 1.8 - JDBC41. Support for JDBC4 methods is not complete, but the majority of methods are implemented.

### プロジェクトへ外部Jar追加

1.libフォルダへダウンロードしたjdbcドライバーをコピー
　　workspace/[prject]/src/main/webapp/WEB-INF/lib

2.「パッケージエクスプローラー」から、プロジェクトを右クリック⇒「プロパティ」を開く。

3.「Javaのビルド・パス」を開く。

4.「ライブラリー」タブで「外部Jar追加」ボタンで、ダウンロードしたJDBCドライバ（Jarファイル）を指定し、追加する。


## 参考サイト
http://itmemo.net-luck.com/s2jdbc-postgresql/
postgreSQLではテーブル名は小文字に統一する

## 問題：S2jdbc-gen-buildタスクを実行したところテーブルが見つからない

sqlstate:42p01が発生していた。


ログ抜粋

/s2jdbc-gen-build.xml:40: Exception in thread "main" org.seasar.extension.jdbc.gen.exception.CommandFailedRuntimeException: [ES2JDBCGen0005]コマンド(org.seasar.extension.jdbc.gen.internal.command.GenerateEntityCommand)の実行に失敗しました。バージョンは S2JDBC-Gen 2.4.46 です。理由はorg.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[], Message=[ERROR: relation "public.mstuser" does not exist

[gen-entity] DEBUG 2015-07-12 11:22:30,396 [main] select user_id from public.mstUser where 1 = 0


## 原因
オペミス。pgAdmin3でテーブル作成する際の名称が不適切だった。
具体的にはpgAdmin3でテーブル名：mstUserを作成していた。
（本来：mst_userとすべき）

pgAdmin3でGUI上で大文字・小文字を混在したテーブルを指示すると、プログラマが指示通りにオブジェクト名は大文字・小文字が混在したものが作成される。（これは自動生成されるDDLがクウォートを付与するためと考えられる）


・エラー
select user_id from public.mstUser where 1 = 0

・正常
select user_id from public."mstUser" where 1 = 0

## postgreSQLの仕様
### オブジェクト名について
大文字・小文字は区別する

### SQL発行時のダブルクウォート有無について

#### ダブルクウォート：なし
大文字は自動的に小文字に内部的に変換して処理される。
public.mstUser　→　public.mstuser
※オブジェクトは大文字・小文字を区別するのでnot existエラーが発生する。

#### ダブルクウォート：あり
大文字を自動的に小文字に変換せず処理される。
"public.mstUser"　→　public.mstUser
従って、テーブルが見つかる。


## 対策
 テーブル名は小文字で統一し、アンダースコアで区切る
（本来：mst_userとすべき）


##参考サイト
https://www.softel.co.jp/blogs/tech/archives/1847
http://faq.smileserver.ne.jp/faq/1060/app/servlet/qadoc?fromid=001&qid=000822
http://takuya-1st.hatenablog.jp/entry/20110907/1315373488
c++ Builder XE4, 10.2 Tokyo > TeeChart > 軸の少数桁数の変更 > Chart1->LeftAxis->AxisValuesFormat = "0.000";

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

軸の表示数値の少数桁数を３桁にするには
```cpp
Chart1->LeftAxis->AxisValuesFormat = "0.000";
```
c++ builder > TeeChart > 凡例に使えない文字列

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

以下は凡例に使えない文字
- ":"
- "-"
- "("
- ")"

以下は凡例に使える文字
- "_"


フォームデザインでは"-"なども使えている。 コードでの代入方法に"\"を使うなど工夫が必要なのかも。
藤原達也変換プログラムをPowerShellで

元ネタの元ネタ：[JavaScriptで藤原竜也変換ツールを作りましたよ゛お゛お゛お゛ - Qiita](http://qiita.com/tonkotsuboy_com/items/f5aecb241b66bb9705e7)
元ネタ：[藤原達也変換プログラムをJavaで組んでみた - Qiita](http://qiita.com/Kentsu_pg/items/6ef213363c23db59c33b)

PowerShell で組んでみた。

```ps1:fujiwara.ps1
Param([string] $in)

$out = ""

$in.ToCharArray() | % {
    if ($_ -notmatch '[、。！？]') {
        $out += "$_゛"
    } else {
        $out += $_
    }
}

echo $out
```

```text:実行
> .\fujiwara.ps1 きんっきんにひえてやがるとおおお
き゛ん゛っ゛き゛ん゛に゛ひ゛え゛て゛や゛が゛る゛と゛お゛お゛お゛
```

これは力強い。

`、` とか `。` の濁点を考慮しなければ、ワンライナーでも。

```ps1:fujiwara.ps1
($args[0].ToCharArray() -join "゛") + "゛"
```
MikeshimuraのDBFlute Web Framework - ほぼ自動生成する業務用Framework

下記Wikiが本家です。
[MikeshimuraのDBFlute Web Framework Wiki](https://github.com/mikeshimura/dfwebfwdoc/wiki/Home)

DB変更に強い現場指向O/Rマッパの[DBFlute](http://dbflute.seasar.org/)をベースに、データベースのテーブルを作成するだけで標準的な機能の画面（FrontendとBakcend共）を数分から数十分で、ほぼ自動生成する業務用Frameworkです。  
例えば下記画面が、データベースのテーブルを作成後、自動生成機能を使う事により、Frontendは僅か９行の追加・修正、BackendはJavaであればRouter部分のコピペと９行の追加・修正、GoであればRouter部分のコピペと６追加・行の修正で出来ます。
![](https://github.com/mikeshimura/dfwebfwdoc/wiki/img/testtable-front.jpg)
##特長##
- メニュー画面でログイン後、ボタン等で指定した画面がブラウザの新しいタブで開きます。


- この為業務では複数画面を同時に参照しながら作業する場合が多いのですが、これが可能です。


- メニュー画面でログオフすると、開いた子画面は自動的に閉じられます。


- 勿論途中で不要になった画面はブラウザのタブを閉じる事が出来ます。


- 自動生成されたFrontendとBackendは、若干の追加修正で通常の機能は果たせます。（普通僅か数分から数十分の作業）


- Frongendは、JAVA版とGO版で共通です。


- Backendは、JAVAとGOの両方が有ります。


- データベースは、JAVA版ではPostgres, MySQL, SqlServer, Oracle等ほぼ主要なものを網羅しています。  
GO版はまだベータなので、今の所Postgres, MySQL, SqlServerをサポートしています。


- JAVA版はJetty Embedded　を想定していますが、他のTOMCAT等のWEBサーバーでも使用可能です。


- GO版は GINを想定していますが、他のWEBサーバーでも使用可能です。

##テーブル追加作業イメージ##
![](https://github.com/mikeshimura/dfwebfwdoc/wiki/ppt/test1.jpg)

##Heroku Sampleシステム##
HerokuにJAVAとGOのサンプルシステムを構築してありますので、見て下さい。  
[Herokuサンプルシステムの使い方](https://github.com/mikeshimura/dfwebfwdoc/wiki/Heroku)
##Eclipse環境の設定##
[Eclipse設定方法](https://github.com/mikeshimura/dfwebfwdoc/wiki/Eclipse)
##Heroku SampleシステムのクローンとEclipseでの表示##
[サンプルシステムのDownlodと設定](https://github.com/mikeshimura/dfwebfwdoc/wiki/Sample)
##Frontendプログラムの説明##
Frontendは、[React](http://facebook.github.io/react/)、[React-Bootstrap](http://react-bootstrap.github.io/components.html)、[Fluxxor](http://fluxxor.com/), [CoffeeScript](http://coffeescript.org/)を使用しており、JAVA版・GO版のBackendに対して共通です。


[Frontendの説明](https://github.com/mikeshimura/dfwebfwdoc/wiki/Front)
##Backendプログラムの説明##
Backendは、JAVA版とGO版の２種類ありますが、機能は同じになる様にしています。
なお論理削除機能については、[論理削除機能の説明](https://github.com/mikeshimura/dfwebfwdoc/wiki/LogDel)参照。

[Java版の説明](https://github.com/mikeshimura/dfwebfwdoc/wiki/Java)


Java版は、[DBFlute](http://dbflute.seasar.org/), [Guice](https://github.com/google/guice), [Resteasy](http://resteasy.jboss.org/)を使用しています。


[Go版の説明](https://github.com/mikeshimura/dfwebfwdoc/wiki/Go)


Go版は、[Go-DBFlute](https://github.com/mikeshimura/dbflute), [GIN](https://github.com/gin-gonic/gin)を使用しています。
##Frontendプログラムの自動生成##
[Frontendプログラムの自動生成](https://github.com/mikeshimura/dfwebfwdoc/wiki/FrontGene)
##Backendプログラムの自動生成##
[Javaの自動生成](https://github.com/mikeshimura/dfwebfwdoc/wiki/JavaGene)  
[Goの自動生成](https://github.com/mikeshimura/dfwebfwdoc/wiki/GoGene)
ES6 と Promise と XMLHttpRequest で json を取るサンプル


## 目的

ES6 で jQuery の $ajax を使わず非同期で json のデータをとりたい

## ファイル構成

```
├── dest
│   └── app.js
├── index.html
├── data.json
├── package.json
└── src
    ├── app.js
    └── utils.js
```

## インストールなど

```package.json
{
  "devDependencies": {
    "babelify": "^6.1.2",
    "browserify": "^10.2.6",
    "watchify": "^3.2.3"
  },
  "scripts": {
    "watch": "watchify -t babelify src/app.js -o dest/app.js -v"
  }
}
```

```
$ npm install
$ npm run watch
```


```src/app.js
import {http} from './utils';


var url = '../data.json';
http.get(url).then(res => {
    let data = JSON.parse(res);
    console.log(data);
}).catch(e => {
    console.error(e);
});
```

```src/utils.js
export default {
    http: {
        get: (url) => {
            return new Promise((resolve, reject) => {
                let xhr = new XMLHttpRequest();
                xhr.open('GET', url, true);
                xhr.onload = () => {
                    if (xhr.readyState === 4 && xhr.status === 200) {
                        resolve(xhr.response);
                    } else {
                        reject(new Error(xhr.statusText));
                    } };
                xhr.onerror = () => {
                    reject(new Error(xhr.statusText));
                };
                xhr.send(null);
            });
        }
    }
};
```

```index.html
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>ES6</title>
    </head>
    <body>
        <script src="dest/app.js"></script>
    </body>
</html>
```

```data.json
{
  "1": "foo",
  "2": "bar"
}
```

## 動作確認

```
python -m SimpleHTTPServer 8000
```

- http://localhost:8000/

Firefox 開発ツールの console などで確認

```
Object { 1: "foo", 2: "bar" }
```

## 参考

- https://developer.mozilla.org/ja/docs/XMLHttpRequest/Synchronous_and_Asynchronous_Requests
- http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0012
- http://gihyo.jp/magazine/wdpress/archive/2015/vol87
シェルスクリプト変数のホームディレクトリ展開

wgetでダウンロードシェル書こうとしてホームディレクトリの展開でハマった。
環境はmac。
homebrewでwgetインストール。

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

# substitution
A=~/.get
B="~/.get"
C='~/.get'
D="$HOME/.get"
E='$HOME/.get'

# result
echo "A="$A
echo "B="$B
echo "C="$C
echo "D="$D
echo "E="$E
```

```shell-session
$ sh var.sh 
A=/Users/user_name/.get
B=~/.get
C=~/.get
D=/Users/user_name/.get
E=$HOME/.get
```

最初Cパターンやっててハマって、
Bパターン試して、Dパターン試して、Aパターンに落ち着いた感じです。
Kotlin + Spark(Web Framework)の組み合わせが良さそうだ

個人プロジェクトでWebAPIサーバーを作るのにどんな技術を使おうかなぁと思い色々と模索していたのですが
Kotlin + Sparkという組み合わせがかなりいけてそうな雰囲気です。

###Kotlin
KotlinはIntelliJのJetBrains社が中心に開発している言語で、JavaよりはモダンでScalaよりは超大ではない、
たぶんこれくらいが丁度良いでしょ、みたいな言語です。Swiftによく似ているそうです。(あんまりSwiftは知らない)

###Spark(Web Framework)
そしてSparkは最近話題の分散アプリケーションフレームワークではなく、それと同名のJavaのウェブフレームワークです。
Sinatra Inspiredなマイクロフレームワークで、ちょっとWebAPIを作るには持ってこいな代物です。

###組み合わせてみる
これらを組み合わせたらかなりイケてるんじゃないかという予感がしたので組み合わせて試してみることにします。

まだハローワールドしてみただけなんで、しっかり使ってみて感想の記事を別途書けたらと思います。

```kotlin:Main.kt
import spark.Spark.*;

fun main(args: Array<String>) {
    get("/hello/:name", { req, res ->
        "Hello, " + req.params(":name")
    })
}
```

どうでしょう？イケてる感？
ビルド時間的にもScalaのような遅さは感じませんし、さくさく開発できそうです。
ちなみにgolangとかも検討したんですが、AWS-SDKがまだPreviewなのとGOのラーニングコストがネックで辞めました。

いざ人柱。
AndroidStudio インストール

手順

1.[公式サイト](http://developer.android.com/sdk/index.html)からDL

2.[Download Android Studio for Mac] を押下

3.「Android Studio」のアイコンを「Applications」にドラッグ&ドロップ

4.Android Studioを起動　

　※java not foundが表示された場合、[java sdk](https://support.apple.com/kb/DL1572?locale=ja_JP&viewlocale=ja_JP)をインストールする。

5.「NEXT」を選択

![スクリーンショット 2015-07-12 7.45.14.png](https://qiita-image-store.s3.amazonaws.com/0/62833/474158d0-2f33-8813-56ae-655c025900f2.png)

6.「NEXT」を選択

![スクリーンショット 2015-07-12 7.45.26.png](https://qiita-image-store.s3.amazonaws.com/0/62833/48aab8f6-2014-82ec-cbb0-6e2202e164cf.png)

7.「Accept」を選択

![スクリーンショット 2015-07-12 7.48.04.png](https://qiita-image-store.s3.amazonaws.com/0/62833/e7c57ce0-16fa-0258-9733-0b8712484123.png)

![スクリーンショット 2015-07-12 7.48.17.png](https://qiita-image-store.s3.amazonaws.com/0/62833/719bf02f-aab5-e3c3-bddc-b893bc6ddd5d.png)

8.「Finish」を選択（インストールが開始される）

![スクリーンショット 2015-07-12 7.54.50.png](https://qiita-image-store.s3.amazonaws.com/0/62833/5ad795da-aa58-f0e6-e312-da0aa92306dc.png)

9.インストールが完了。

![スクリーンショット 2015-07-12 8.32.15.png](https://qiita-image-store.s3.amazonaws.com/0/62833/5b440271-50e8-1864-5bc2-dc9600912d52.png)
2015-07-12 [転載] windows > コマンドプロンプト > エクスプローラでcmd | コマンドプロンプトで start .

以下のサイトにて紹介されている。
http://lacucaracha.hatenablog.com/entry/2015/07/09/125950
その元々の引用はこちら
http://codezine.jp/article/detail/3879


1. エクスプローラで任意のフォルダを開いて上部左のフォルダ階層表示部に `cmd` と入力すると、そのフォルダでコマンドプロンプトが開く
2. コマンドプロンプトで `start .` と入力すると、そのフォルダでエクスプローラが開く。
技術英語 > Things are a lot more clear now. @ q-squared / crystal clear @ ugly betty

@ Q-SQUARED (STAR TREK: THE NEXT GENERATION)

> "Things are a lot more clear now."

<hr>
clear関連で思い出したのが、アグリーベティで使われていた以下のフレーズ。

I would like to <font color=red>make it crystal clear</font>.

Daniel MeadeがBettyに対して使っていたと思う。

Crystalという修飾が面白いと思った。
Arduinoのタイマー割り込みライブラリの調査

Arduinoのタイマー割り込みを使おうとすると若干煩雑なのでライブラリが欲しいですよね。それに、ポータビリティも大事だと思うんです！筆者はATmega32U4しか持っていないので、ATmega328P前提のコードだと動かないことがあるんです…。

でも例によってライブラリ使う人が少ない業界だなーという印象で、これ使っておけば鉄板みたいなライブラリは無いのかも。

## FlexiTimer2

一番メンテされてそうなライブラリで、名前の通りタイマー2を使うもの。後述する`MsTimer2`の改良版で、割り込み間隔を自由に設定できます。

```cpp
#include <FlexiTimer2.h>

void flash() {
  static boolean output = HIGH;

  Serial.println(output);
  output = !output;
}

void setup() {
  Serial.begin(9600);

  FlexiTimer2::set(500, flash); // 500ms period
  FlexiTimer2::start();
}

void loop() {
}
```

上のサンプルだと`MsTimer2`との違いが全くわかりませんが、3引数の`FlexiTimer2::set(units, resolution, f)`を使えば1msより細かい単位での割り込みが指定できます。

 * [wimleers/flexitimer2](https://github.com/wimleers/flexitimer2)
 * [Arduino Playground - FlexiTimer2](http://playground.arduino.cc/Main/FlexiTimer2)
 * [MsTimer2 and FlexiTimer2 Arduino Libraries, Run a Function At Regular Intervals](http://www.pjrc.com/teensy/td_libs_MsTimer2.html)

## MsTimer2

1ms単位で割り込み間隔を指定できます。やはりタイマー2を使います。


```cpp
#include <MsTimer2.h>

void flash() {
  static boolean output = HIGH;
  
  Serial.println(output);
  output = !output;
}

void setup() {
  Serial.begin(9600);

  MsTimer2::set(500, flash); // 500ms period
  MsTimer2::start();
}

void loop() {
}
```

ネット上にはATmega32U4で動かないという記述も見つかりますが、最新バージョンでは対応済みです。

 * [PaulStoffregen/MsTimer2](https://github.com/PaulStoffregen/MsTimer2)
 * [Arduino Playground - MsTimer2](http://playground.arduino.cc/Main/MsTimer2)
 * [MsTimer2 and FlexiTimer2 Arduino Libraries, Run a Function At Regular Intervals](http://www.pjrc.com/teensy/td_libs_MsTimer2.html)

現在GitHubリポジトリをメンテしているPaul Stoffregenさんは[Teensy](https://www.pjrc.com/teensy/)を開発しているPJRC社の社長さんかな…？

## 対応アーキテクチャ

両ライブラリとも下記のアーキテクチャに対応しています。

 * ATMega48/88/168/8
 * ATMega128
 * ATmega328P
 * ATmega1280
 * ATmega2560
 * AT90USB1286
 * AT90USB646
 * ATmega32U4（note: uses timer4 on ATmega32U4）
 * Teensy 3.0
 * Teensy 3.1

## 注意点

割り込みのタイミングでレジスタがクリアされちゃうので、割り込みを使う場合は割り込まれる側の変数宣言に`volatile`キーワードをつけましょう。当然ですけど、これはライブラリを使わなくても同じです。
Go言語 識別子のエクスポート

## ■ 同じパッケージ
同じpkg内の `const` は、先頭が大文字小文字に限らず、使えることが出来ます。
ソースファイルのエンコードが `UTF-8` であれば、 `日本語` も使えます。

```go
package main

import "fmt"

const (
	HELLO = "大文字alphabet"
	hello = "小文字alphabet"
	はろう = "ひらがな"
)

func main() {
	fmt.Println(HELLO)
	fmt.Println(hello)
	fmt.Println(はろう)
}
```

```:結果
大文字alphabet
小文字alphabet
ひらがな
```

## ■ 別パッケージからエクスポート
まずエクスポートしてくるpkgは、これ。

```:pkg-identifer
package identifier

const (
	HELLO = "大文字alphabet"
	hello = "小文字alphabet"
	はろう = "ひらがな"
)
```

### 1. 大文字
これは、OK。

```go
package main

import (
	"fmt"
	. "identifier"
)

func main() {
	fmt.Println(Hello)
}
```

```:結果
大文字alphabet
```

### 2. 小文字
小文字の `const` は、エクスポート出来ない。

```go
package main

import (
	"fmt"
	. "identifier"
)

func main() {
	fmt.Println(hello)
}
```

```:結果
# command-line-arguments
./main.go:5: imported and not used: "identifier"
./main.go:9: undefined: hello
```

### 3. 日本語
日本語には、大文字・小文字の区別がないので、日本語の識別子はエクスポート出来ない。

```go
package main

import (
	"fmt"
	. "identifier"
)

func main() {
	fmt.Println(はろう)
}
```

```:結果
# command-line-arguments
./main.go:5: imported and not used: "identifier"
./main.go:9: undefined: はろう
```
CentOS7 の docker で aufs を使う

CentOS7 で docker を動かすと storage driver として devicemapper が使われるが、aufs を使えるようにしたメモ。

<参考>

* [aufs-backed docker host on centos6 - blog.hansode.org](http://blog.hansode.org/archives/52636502.html) CentOS6の方はこちら
* [CentOS7（RHEL7）　デフォルトで起動するkernelを変更するには](http://knowledge4linux.blogspot.jp/2014/11/centos7rhel7kernel.html)
* https://github.com/bnied/rhel-aufs-kernel

ちなみに、なんでそんなことをしたいのかと言うと、drone で docker の storage driver に devicemapper (デフォルト)を使うとビルドが起動するまでに時間がかかる issue があるようで、aufs への切り替えが推奨されていたため。実際すぐ起動するようになった。> https://github.com/drone/drone/issues/271

## aufs 対応 kernel を入れる

https://github.com/bnied/rhel-aufs-kernel で配布してくれている aufs 対応 kernel を入れる

```
rpm -Uvh https://yum.spaceduck.org/rhel-aufs-kernel/7/x86_64/kernel-ml-aufs-3.19.8-1.el7.centos.x86_64.rpm
```

## 起動するカーネルの選択

CentOS7 は grub2 を使っているので、`grub2-set-default` コマンドを使って設定する。

```
$ grep ^menuentry /boot/grub2/grub.cfg
menuentry 'CentOS Linux (3.19.8-1.el7.centos.x86_64) 7 (Core)' --class rhel fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.5-3.el6.x86_64-advanced-aa16c27c-9b7f-4d02-a899-f1fe4dc7cd77' {
menuentry 'CentOS Linux (3.19.8-1.el7.centos.x86_64) 7 (Core) with debugging' --class rhel fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.5-3.el6.x86_64-advanced-aa16c27c-9b7f-4d02-a899-f1fe4dc7cd77' {
menuentry 'CentOS Linux 7 (Core), with Linux 3.10.0-229.el7.x86_64' --class rhel fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-229.el7.x86_64-advanced-aa16c27c-9b7f-4d02-a899-f1fe4dc7cd77' {
menuentry 'CentOS Linux 7 (Core), with Linux 0-rescue-4627da230679477086e4995bae995b57' --class rhel fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-4627da230679477086e4995bae995b57-advanced-aa16c27c-9b7f-4d02-a899-f1fe4dc7cd77' {
```

kernel-ml-aufs は一番上のものようなので、そちらを使って boot するように選択する

```
grub2-set-default 'CentOS Linux (3.19.8-1.el7.centos.x86_64) 7 (Core)'
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.orig
grub2-mkconfig -o /boot/grub2/grub.cfg
```

reboot

```
reboot
```

カーネルバージョンが選択したものになっていることを確認

```
$ uname -a
Linux xxxxxxx 3.19.8-1.el7.centos.x86_64 #1 SMP Mon May 25 22:45:44 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
```

```
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```

## docker の設定

/etc/sysconfig/docker

```
other_args="-s aufs"
```

再起動

```
systemctl restart docker
```

aufs になってるか確認

```
# docker info
Containers: 0
Images: 0
Storage Driver: aufs
```
OSS版 drone.io のジョブ実行を高速化する

問題: ビルドが始まるまで４分ぐらいかかる
解決: docker の storage driver を devicemapper から aufs に変更する

こちらに issue があがっていた > https://github.com/drone/drone/issues/271
どうやらそもそも docker の devicemapper は遅いようだ。aufs にした所すぐ立ち上がるようになった。

なお、overlayfs でも良いという話だったが、docker の issue があってちゃんと使えなかった。
https://github.com/docker/docker/issues/12488

**aufs対応方法**

* [CentOS7 の docker で aufs を使う](http://qiita.com/sonots/items/e8301de5d232c0e9532c) kernel 入れ替えないといけない
* Ubuntu は試してない
メモ : Google Apps Script の html テンプレート周りのライブラリを作るうえで知っておくべきこと


# はじめに
これは、自分用メモ。

Google Apps Script の html テンプレート周りをライブラリ化しようとしている。その関連の話。

# 内容
## `HtmlService.createHtmlOutputFromFile()`, `HtmlService.createTemplateFromFile()` が読み込むのはどこの html ファイルか

ライブラリになっているプロジェクト lib とそれを使っているプロジェクト proj があるとする。ライブラリを作る側としては、`HtmlService` の `createTemplateFromFile(name)` 関数をプロジェクト lib 側に置きたいのだが、この関数は関数が書かれているプロジェクトの html ファイルを読み込むようだ。つまり、

```js:lib/lib.gs
function loadTemplate(hs, name) {
  return hs.createTemplateFromFile(name);
}
```

となっていた場合、proj 内で

```js:proj/main.gs
function test() {
  var tmpl = lib.loadTemplate(HtmlService, 'sidebar');
  ...
}
```

としたときに読み込もうとするのは `proj/sidebar.html` ではなくて `lib/sidebar.html`である。

別の例を示そう。

HtmlTemplate オブジェクトに次のような `include()` メソッド (インスタンスメソッド) を追加できると、html ファイルの中で他の html ファイルをインクルードできるようになる。
つまり、

```html:proj/index.html
<?= this.include('style'); ?>
<div id="main_content">
  ...
</div>
<?= this.include('script'); ?>     
```

みたいに別ファイルで管理している css や js を読み込めると便利だよね、と。
で、問題はこの `include()` メソッドをどこで付与してやろうか、ということになるが、ライブラリの方で

```js:lib/lib.gs
function deco(tmpl) {
  tmpl.include = function(name) {
      return HtmlService.createHtmlOutputFromFile(name).getContent()
    };
}
```

とでもして、ライブラリを使う側では

```js:proj/main.gs
var tmpl = HtmlService.createTemplateFromFile('index');
tmpl.evaluete();
```

としたくなるのだが、`proj/index.html` の中の `<?= this.include('style'); ?>` の個所で読み込まれるのは `proj/style.html` ではなくて、`lib/style.html` である。

ということで、`include()` を mixin するというライブラリ化の夢は破れ去り、プロジェクトごとに毎度

```js:proj/main.gs
function deco(tmpl) {
  tmpl.include = function(name) {
      return HtmlService.createHtmlOutputFromFile(name).getContent()
    };
}
```

を書かない限り、この `.include()` メソッドは使えないのである。

##逆に

このことは、逆に言えば、複数のプロジェクトで共有したいような css や js は、ライブラリとして提供できることを示している。
つまり、自サイトで使う jQuery プラグインを jquery-my-awesome-plugin というライブラリとして提供して、

```html:sample/index.html
<?= jquerymyawesomeplugin.awesome(); ?>
```

として利用するような。