OmniAICreator/Qiita-1.07M huggingface dataset:
MacOSXでpthreadとOpenMPを共存させる

# 問題

OpenMPを使って並列化されている処理をpthreadで作ったthreadから呼ぶことを考える。例えば、以下のようなコード。

main関数の中でpthreadを４つ作り、それぞれのthreadでループをOpenMPで並列化した処理を実行したい。

```test_thread_omp.cpp
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <omp.h>

#define NTHREADS 4

void *myFun(void *x)
{
  int tid;
  tid = *((int *) x);
  printf("Hi from thread %d!\n", tid);
  #pragma omp parallel
  {
    int n = omp_get_num_threads();
    #pragma omp master
    printf("num threads: %d\n", n);
    #pragma omp for
    for( int i=0; i < n; i++) {
      int t = omp_get_thread_num();
      printf("I'm thread %d-%d!\n", tid, t );
    }
  }
  return NULL;
}

int main(int argc, char *argv[])
{
  pthread_t threads[NTHREADS];
  int thread_args[NTHREADS];
  int rc, i;

  /* spawn the threads */
  for (i=0; i<NTHREADS; ++i)
    {
      thread_args[i] = i;
      printf("spawning thread %d\n", i);
      rc = pthread_create(&threads[i], NULL, myFun, (void *) &thread_args[i]);
    }

  /* wait for threads to finish */
  for (i=0; i<NTHREADS; ++i) {
    rc = pthread_join(threads[i], NULL);
  }

  return 0;
}
```

このようなpthreadとOpenMPの混在はWindowsやLinuxでは問題なく動くようであるが、Macの場合にはmain threadから呼ばないとSEGVが発生するという情報を発見した([http://stackoverflow.com/a/8446942](http://stackoverflow.com/a/8446942))。

これを実際に自分で検証した。
OSXのデフォルトのコンパイラclangではそもそもOpenMPに非対応のためhomebrewでgccを入れる。
gccを入れる方法は [Homebrew で gcc4.7 を入れる](http://qiita.com/catatsuy/items/e2196d1a7751edadadab) を参照していただきたい。

# 実験結果

gcc-4.9で実験した場合、必ずセグメンテーションフォールトが発生する。

```
spawning thread 0
spawning thread 1
Hi from thread 0!
spawning thread 2
Hi from thread 1!
spawning thread 3
zsh: segmentation fault  ./a.out
```

デバッガでバックトレースをとると

```
$ lldb ./a.out
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb) run
Process 99724 launched: './a.out' (x86_64)
spawning thread 0
spawning thread 1
Hi from thread 0!
spawning thread 2
Process 99724 stopped
* thread #2: tid = 0x24c7ada, 0x00000001001c164b libgomp.1.dylib`gomp_resolve_num_threads + 43, stop reason = EXC_BAD_ACCESS (code=1, address=0x50)
    frame #0: 0x00000001001c164b libgomp.1.dylib`gomp_resolve_num_threads + 43
libgomp.1.dylib`gomp_resolve_num_threads:
->  0x1001c164b <+43>: movq   0x50(%rax), %rdx
    0x1001c164f <+47>: leaq   0xebca(%rip), %rax        ; gomp_global_icv
    0x1001c1656 <+54>: leaq   0x70(%rdx), %rbx
    0x1001c165a <+58>: testq  %rdx, %rdx
```

というエラーが起きて、どうやらOpenMPがスレッド数を取得しようとしたところで変なアドレスにアクセスしている模様。

一方、gcc-5で実験するとちゃんと動いてくれた。

```
spawning thread 0
spawning thread 1
Hi from thread 0!
spawning thread 2
Hi from thread 1!
spawning thread 3
Hi from thread 2!
Hi from thread 3!
I'm thread 2-2!
I'm thread 2-1!
num threads: 4
I'm thread 2-3!
num threads: 4
I'm thread 0-1!
I'm thread 0-2!
I'm thread 0-3!
I'm thread 2-0!
I'm thread 1-1!
I'm thread 1-2!
num threads: 4
I'm thread 1-3!
I'm thread 3-1!
I'm thread 3-2!
num threads: 4
I'm thread 0-0!
I'm thread 3-3!
I'm thread 1-0!
I'm thread 3-0!
```

# 結論

pthreadとOpenMPを混在させたい時はhomebrewでgcc5をインストールする

# 参考
- http://stackoverflow.com/questions/7433685/mixing-openmp-with-pthreads
BoZoN (シンプルで使い勝手の良いファイル共有システム)使ってみた

## 参考

* [broncowdd/BoZoN: Minimalist Drag & drop file sharing app (version 2.4)](https://github.com/broncowdd/BoZoN)
* [BoZoN - シンプルで使い勝手の良いファイル共有システム MOONGIFT](http://moongift.jp/2016/04/bozon-%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E4%BD%BF%E3%81%84%E5%8B%9D%E6%89%8B%E3%81%AE%E8%89%AF%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%B1%E6%9C%89%E3%82%B7%E3%82%B9%E3%83%86/)

## インストール

```
apt-get install -y \
  php7.0-curl \
  php7.0-gd \
  php7.0-zip
```

```bash:
cd /var/www/html/
git clone https://github.com/broncowdd/BoZoN.git
mv BoZoN bozon && cd bozon
mkdir uploads private tmp
chmod 777 uploads private tmp
```

## 画面

* 編集

![edit.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3a0c557f-a43f-8512-d895-06cc6d524194.png)

* 閲覧

![view.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7bd1e705-0fb5-db8a-da03-4c80d1008648.png)

* LIST

![list.png](https://qiita-image-store.s3.amazonaws.com/0/25728/347b7306-f18c-ce4f-0037-3d6911601fb4.png)

## フォルダ構造

* 以下のようにシンプルな構造

```
uploads/user1/フォルダ1/logo_php.png
uploads/user1/フォルダ1/スクリーンショット_2016-04-13_15-25-51.jpg
uploads/user1/フォルダ1/スクリーンショット_2016-04-13_15-25-51.png
uploads/user1/日本語.md
uploads/.htaccess
uploads/index.html
```
【Ansible】AnsibleでCisco機器を制御してみる(環境構築編)


# 1. はじめに
https://www.ansible.com/press/red-hat-brings-devops-to-the-network-with-new-ansible-capabilities
([もしくはこっち](https://www.redhat.com/ja/about/press-releases/red-hat-brings-devops-network-new-ansible-capabilities))
というわけで、Ansibleのcoreのnetwork moduleが充実したみたいです。
＃ 取り上げるの遅いですよね…

http://docs.ansible.com/ansible/list_of_network_modules.html
Ios(Cisco), Eos(Arista), Junos(Juniper), はてはopen switchまで。

数千台のswitchを前に、expectかteraterm macroでウニウニやっていた
ぼくらには朗報、此れは使はずばいらいでかということで使ってみました。
使ったのは

+ ios_command.py
+ ios_config.py

の各モジュールです。

動作環境などは2016年3月時点の状況です。
※2016/06 update

# 2. 実行環境

|items|version|notes|
|---|---|---|
|mac OSX|10.10.x|母艦OS|
|Oracle Virtualbox|5.0.16 r105871|HV用途|
|CentOS|7.2|ansible machine|
|Ansible|2.0.1.0|[ここ](http://releases.ansible.com/ansible-network/latest/)からげっと|
|Catalyst 3560E|IOS12.2|弄れるのがこれしかなかた|

### 構成
下記留意点のため、CentOS7上でAnsibleを動かしました。

# 3. 留意点
+ RedHat印のAnsibleでのみ動作可
    + mac OSXのbrew installで入るversionにはNW関連のupdateが含まれない(version 1.9.4)
    + yum installで入れるAnsibleにも同じくupdateが含まれない
     - 2016年6月現在、yum installで入るversionが2.0.xになったのでnetwork moduleが更新されています
    + githubにはあるのでcloneしても可

# 4. 簡単な環境構築手順
1. CentOS7を用意する
2. rpmパッケージを[こちら](http://releases.ansible.com/ansible-network/latest/ansible-2.0.1.0-0.2.network.el7.centos.noarch.rpm)からダウンロード
3. CentOS7上でインストール  

    ```
 [root@localhost ~]# yum localinstall /tmp/ansible-2.0.1.0-0.2.network.el7.centos.noarch.rpm
```

4. ansible --versionで応答があればとりあえずよい

    ```
 [root@localhost ~]# ansible --version
 ansible 2.0.1.0
   config file = /etc/ansible/ansible.cfg
   configured module search path = Default w/o overrides
```

# 5. つづく
サンプルコードを含めると、大作になってしまうので[次回](http://qiita.com/onifinger/items/0a05faf175cc818fe447)に続きます。
※[次回](http://qiita.com/onifinger/items/0a05faf175cc818fe447)は絶賛執筆中なのですが分量とかでこっちも加筆・減筆するかも。
viewでnilの場合にエラーを起こさない(許容する)方法

strftimeで時間をviewに表示させる時、nilの場合エラーが起きてしまう。
その時は`try`を使ってエラーを回避する。
`try`を２回使っている。

```rb
<%= @info.try(:expired_at).try(:strftime, "%Y年%m月%d日" ) %>
```

- 公開日開始日(released_at)
- 公開終了日(expired_at)
の２つのカラムがあって、公開終了日を設定しないかつ、viewに公開終了日が設定されていないことを表示させたい(なにも表示しない)ときは、上記のように`try`を用いてエラーを回避するとよい。
WC_Orderの関数についての雑なメモ

https://docs.woothemes.com/wc-apidocs/class-WC_Order.html
「こんな感じっぽいな」というのでメモっただけなので鵜呑みにすると火傷するかもです。
火傷した人は編集リクエストいただけると幸いです。


	$order =  wc_get_order( ORDER_ID );
	//送料を算出する
	$order->calculate_shipping()

	//消費税を算出する
	$order->calculate_taxes()

	//合計金額を計算する
	$order->calculate_totals()


	//住所（配列）
	$order->get_address();
	//決済者住所（文字列）
	$order->get_billing_address();
	
	//割引額
	$order->get_cart_discount();
	//割引額（HTML）
	$order->get_cart_discount_to_display();
	//消費税
	$order->get_cart_tax();
		
	//決済者住所
	$order->get_formatted_billing_address();
	//購入者氏名
	$order->get_formatted_billing_full_name();
	//配送先住所
	$order->get_formatted_shipping_address();
	//配送先氏名
	$order->get_formatted_shipping_full_name();
	//商品数
	$order->get_item_count();
	//商品リスト
	$order->get_items();
	//通貨
	$order->get_order_currency();
	//決済情報
	$order->get_order_item_totals();
	//注文番号
	$order->get_order_number();
	//配送先住所
	$order->get_shipping_address();
	//配送先地図
	$order->get_shipping_address_map_url();
	//配送方法
	$order->get_shipping_method();
	//注文状況
	$order->get_status();
	//小計
	$order->get_subtotal();
	//小計（HTML)
	$order->get_subtotal_to_display();
	//税金
	$order->get_tax_totals();
	//合計
	$order->get_total();
	//割引額合計
	$order->get_total_discount();
	//送料
	$order->get_total_shipping();
	//消費税
	$order->get_total_tax();
	//クーポン名
	$order->get_used_coupons();
	//顧客情報
	$order->get_user();
	//注文URL
	$order->get_view_order_url();
nodeのchild_processのexecが失敗する時の対策

child_processのexecの引数にはcwdを指定するとうまくいくことがあるという話です。

例えばWindowsでC:¥somewhare内のfoo.exeを呼び出したいとして、

```js:app.js
var exec = require('child_process').exec;
exec('foo bar', function(error, stdout, stderr) {
    if (error != null) {
        console.log(error);
    }
});
```

というスクリプトを記述して C:¥somewhare¥app.jsのパスに保存して、コマンドプロンプトから

```
cd c:¥somewhare
node app.js
```

のようにして実行した時に、

```
Error: Command failed: C:\Windows\system32\cmd.exe /s /c "foo bar"
```

というエラーが出力された場合、以下の様にexecの引数に{cwd: 'C:¥somewhare'}を追加する。

```js:app.js
var exec = require('child_process').exec;
exec('foo bar', {cwd: 'C:¥somewhare'}, function(error, stdout, stderr) {
    if (error != null) {
        console.log(error);
    }
});
```
c++ builder > 他のアプリケーションをHideからShowに変更する > this->Hide()とShowWindow(this->Handle, SW_HIDE);は挙動が違う > ShowWindow()はVisibleプロパティをtrueにはしない

[Stackoverflow](http://stackoverflow.com/questions/36589398/this-hide-works-only-once?noredirect=1#comment60778605_36589398)
で質問していた、うまく動作しない件が解決した。

## やろうとしていたこと

Hide状態のソフトを他ソフトからShowにするということをしたかった。

- UnitShowソフト: UnitHideソフトをHideからShow状態にする
- UnitHideソフト: 自身のボタンでHide状態にする

## code v0.1

２つのソフトでそれぞれの以下のユニットのコードを実装した。

```UnitShow.cpp
void __fastcall TFormShow::B_showClick(TObject *Sender)
{
    HWND hwnd = GetDesktopWindow();
    hwnd = FindWindowEx(hwnd, NULL, L"TFormHide", NULL);

    ShowWindow(hwnd, SW_SHOWNORMAL);
}
```

```UnitHide.cpp
void __fastcall TFormHide::B_hideClick(TObject *Sender)
{
    this->Hide();
}
```

上記の状態で以下の操作をしてもHideになるのは１回だけで、２回目以降はHideにならなかった。

- On UnitHide, click B_hide >> UnitHide is hidden
- On UnitShow, click B_show >> UnitHide is shown
- On UnitHide, click B_hide >> UnitHide is not hidden


## code v0.2

どうも this->Hide()がうまく機能しなくなるようだった。

以下のコードでは動いた。

```UnitShow.cpp
void __fastcall TFormShow::B_showClick(TObject *Sender)
{
    HWND hwnd = GetDesktopWindow();
    hwnd = FindWindowEx(hwnd, NULL, L"TFormHide", NULL);

    ShowWindow(hwnd, SW_SHOWNORMAL);
}
```

```UnitHide.cpp
void __fastcall TFormHide::B_hideClick(TObject *Sender)
{
    // this->Hide();
    ShowWindow(this->Handle, SW_HIDE);
}
```

this->Hide()とShowWindow(this->Handle, SW_HIDE);は挙動が違うようだ。

this->Hide()はフォームをHideする。
ShowWindow()はソフトをHideしているのだろうか?
http://www.festra.com/eng/snip10.htm

this->Showingの値を見ているとどうもそのようだ。
this->Hide()に対応するにはthis->Show()を使用して、ShowWindows(,SW_HIDE);に対応するにはShowWindow(,SW_SHOWNORMAL);を使用いたほうがよいように思う。


http://qc.embarcadero.com/wc/qcmain.aspx?d=1322
を見ているとShowWindow()はFormのVisibleプロパティをTrueにはしないようだ。そのため、2回目以降のthis->Hide()は無効になる。

関連 http://hakomof.hatenablog.com/entry/2014/09/24/210612
【AndroidStudio】Failed to complete Gradle execution. Cause: Unknown

##バージョン
AndroidStudio 2.0
（バージョン関係なく起こる可能性があります）
##事象
Clean/Rebuildができなくなる。
##エラー内容
Event Logに下記メッセージが表示される。

>Failed to complete Gradle execution. Cause: Unknown

##対応方法
- AndroidStudioを終了
- ホームディレクトリ配下の「.gradle」フォルダを削除
- AndroidStudioを再度起動、"Refleshing gradle~"的な処理が走るのでしばらく待つ
- Build成功 :tada: 

削除した「.gradle」フォルダは、AndroidStudio起動時に自動生成されます。

##考えられる原因
AndroidStudioが前回終了時に正常終了しなかった可能性・・・。

##その他
「.gradle」フォルダが1GB近くまで肥大化していたのですが、再生成して0.3GBまでサイズダウンしました。
使っていないプロジェクトのゴミファイルを削除するという意味で、良い機会だったかもしれません。
rubyで整数チェック

文字列に対して`*.to_i`をすると、数値の0に変換される。
これを利用して整数チェックを行う。

※コメントで指摘を受けました
文字列"1a"など、数値で始まるものは0ではなく先頭の数値に変換されます。

```ruby
t = 1
puts t.to_i.to_s == t.to_s	# true
t = "1"
puts t.to_i.to_s == t.to_s	# true
t = "abc"
puts t.to_i.to_s == t.to_s	# false
t = "1a"
puts t.to_i.to_s == t.to_s	# false
```
ターミナル(Git Bash)でMySQLの結果が文字化けしたとき

### 経緯
MySQL繋いでクエリなげたら結果が文字化けして解読不可。
GitBashの表示がUTF8になっていたせい。変更の仕方がわからなかった。
ワークベンチはいちいち重くてめんどくさい

### 問題
DBの文字コードがEUCJP。
ちょっとした軽いSQLでも結果が(文字化けして)見れない

### 解決案
- 素直にMySQLワークベンチを使う
- 文字コードを変更できるターミナルを使う
- 一時的にDBの文字コードを変更する
- **ファイルに出力してエンコードする←**

### 方法
1. ターミナルから直接SQLクエリを発行して結果をファイル出力する  
```mysql　-h[host_name] -u[user_name] -p -e "[query]" [db_name] > tmp.txt```  
  ※[各値]は任意のものへ変更  
<br>
2. 
   - Vim: ```vim tmp.txt → :e ++enc=eucjp```  
   - その他エディタ: GUIで文字コード変更

<br>
2. ...よく考えたらそのまま```cat```コマンドで文字コード変えて出力すればいいですね
:fearful: やり方はわからないですけど

<br>
3. ~~~ 結果を確認する ~~~
<br>
4. ファイルを作った場合は削除をお忘れなく
```rm ~/tmp.txt```

こういうのをMySQLクライアントを使わないって言い方するんですね。
勉強になりました!

:blush: おわり
HerokuでMySQLを使おうとして詰まったところ

##はじめに
HerokuのDBはデフォルトではPostgreなので、MySQLを使おうとすると設定を変更する必要がある。

##前準備
HerokuでMySQLを使うためにはクレジットカードの登録が必要です。
この記事がとても参考になるので、参考にしながら進めてください。
http://qiita.com/fukumone/items/b8934f78f841b19edbbe

##HerokuのDBをMySQLにする
`heroku addons:add cleardb`コマンドを使ってClearDBアドオンを追加して、データベースの設定をMySQLにする。

##HerokuのバージョンをGemと合わせる
Railsの場合はMySQLのバージョンを対応するGemに合わせる必要がある。
自分のGemはmysql2だった。

###Gemfileを確認する。
プロジェクトのGemfileを見れば良いので簡単！

```gemfile
gem 'mysql2', '0.3.18'
```

###データベースの情報を確認する
`heroku config | grep CLEARDB_DATABASE_URL`コマンドでデータベースの情報を見てみると、以下だった。

```
heroku config | grep CLEARDB_DATABASE_URL
=> CLEARDB_DATABASE_URL: mysql://~~~~~~~~~~~
```

###Gemとデータベースのバージョンを合わせる
`heroku config:set DATABASE_URL=~~~~~`コマンドで書き換えればOKぽい。

```
heroku config:set DATABASE_URL=mysql2://~~~~~~~~~~~（~~~はheroku config | grep CLEARDB_DATABASE_URLで出力された内容と同じ)
```

***しかし、、、、***

```
heroku config:set DATABASE_URL=mysql2://~~~~~~
Setting config vars and restarting app-name... !!!
▸    Cannot overwrite attachment values DATABASE_URL.
````

上書きされてなくない？(T_T)

調べてみると、いた！！！
同じような悩みの方
http://stackoverflow.com/questions/35061914/how-to-change-database-url-for-a-heroku-application

どうやら、上書きする前にdetachする必要があるらしい？

Herokuの設定を見てみるとこんな感じだった。

```ターミナル
heroku config
=== line-bot-practice Config Vars
CLEARDB_DATABASE_URL:         mysql://~~~~~~~~~
HEROKU_POSTGRESQL_SILVER_URL: postgres://~~~~~~~~~~~
LANG:                         en_US.UTF-8
RACK_ENV:                     production
RAILS_ENV:                    production
RAILS_SERVE_STATIC_FILES:     enabled
SECRET_KEY_BASE:*********
```

設定の中の`HEROKU_POSTGRESQL_SILVER_URL`を書き換える必要がある。
そのために、以下のコマンドを順に実行していく。

```
heroku addons:attach heroku-postgresql -a <app_name> --as HEROKU_DATABASE（これは必要ないかも）
heroku addons:detach DATABASE -a <app_name>
heroku config:add DATABASE_URL=mysql2://~~~~~~~~~~~（~~~はheroku config | grep CLEARDB_DATABASE_URLで出力された内容と同じ)
```


無事変更されました＼(^o^)／

```
heroku config:set DATABASE_URL=mysql2://~~~~~~~~
Setting config vars and restarting app-name... done
DATABASE_URL: mysql2://~~~~~~~~~
```

###参考
前準備
http://qiita.com/fukumone/items/b8934f78f841b19edbbe
エラー解決
http://stackoverflow.com/questions/35061914/how-to-change-database-url-for-a-heroku-application
Rubyのselenium-webdriverを使ってUAを偽装しつつWebテストをしてみる

# やりたかったこと
スマートホン最適化サイトでABテストを導入し、実装が完了しました。
しかしテストしているタイミングでABの割合が指定した割合になっているかが疑問をいだきました。
「少なく設定しているはずのBがずいぶんと多く出ていないか…？」
試行回数が少なくたまたま偏っただけの可能性もあります。
これの試行回数を増やし、設定した割合に落ち着くかを確認したかったのです。

なので今回、
UAを偽装してサイトにアクセス→ABのcookieの値を確認→cookieを削除→サイトにアクセス...以下繰り返し
を自動テストでやってみよう、となったのです。

やり方はいろいろあるかと思いますが、Rubyのselenium-webdriverを使ってやってみた次第です。
※最初FirefoxのSeleniumIDEでやろうとしましたが、セキュリティの観点からか使えなくなってました :disappointed_relieved: 
<img width="523" alt="スクリーンショット 2016-04-13 15.53.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/46392/453fd71f-b12e-509a-bf26-8a18dc2913bb.png">

# 前準備
bundlerを使ってGemのインストールをします。
bundlerは使わなくてもいいですが、使った場合の手順で進めます。

```rb:Gemfile
source 'https://rubygems.org/'

gem 'selenium-webdriver'
gem 'webdriver-user-agent'
```

webdriber-user-agentは、selenium-webdriverを利用するときに簡単にUAを偽装するためのgemです。

vendor/bundle以下にインストールするようにします。

```
$ bundler install --path=vendor/bundle
```

以上で準備は完了です。

# 動かす

テストを動かすRubyプログラムを書きます。
今回のは使い捨てのプログラムなので作りがアレだと思いますが大目に見てください。

```rb:test.rb
require 'selenium-webdriver'
require 'webdriver-user-agent'
require 'pp'

class Get
  attr_reader :data
  COOKIE_NAME = 'cookiename' # 取りたいクッキーの名前を指定します

  def initialize
    #@driver = Selenium::WebDriver.for :firefox # UAの偽装がいらない場合はSeleniumモジュールの方を使います

    # 引数でブラウザやUA、画面の向きを指定できます。
    # 指定しない場合、ブラウザはfirefox, UAはiPhone, 画面は縦向きという設定になります。
    # see also: http://www.rubydoc.info/gems/webdriver-user-agent/7.4
    @driver = Webdriver::UserAgent.driver

    @data = []
  end

  def open
    @driver.navigate.to 'http://hogehoge.com/example' # テスト対象のURLを指定します
    cookies = @driver.manage.all_cookies # 現在表示してるページで使えるcookieを全部取得します。配列です。
    cookie_index = cookies.find_index do |cookie|
      cookie[:name] == COOKIE_NAME
    end # ほしいcookieの順番を特定します
    return unless cookie_index # indexが取れなかったらcookieがセットされてないものと見なしてnilを返します
    @data << cookies[cookie_index][:value] # とれたらそのcookieの値を結果の配列に突っ込みます
    @driver.manage.delete_cookie(COOKIE_NAME) # 該当のcookieを消すことで新しいABユーザとします
  end

  def destruct
    @driver.quit # 終了処理です。やっておくとブラウザを閉じてくれます。
  end

end
get = Get.new
begin
  1.upto(500) do # 試行回数500回で試してみます
    get.open
    sleep 0.2 # 誰かがクローリングしてる！って怒られるのを恐れてsleepさせてます。（自社サイトかつ開発環境なので不要ですが念のため）
  end
ensure
  get.destruct
end

a_array = get.data.select {|v| v == 'a'}
b_array = get.data.select {|v| v == 'b'}
pp "aの数:#{a_array.size}"
pp "bの数:#{b_array.size}"
# なんかもっと簡単にカウントできる気がするけど、面倒なのでこれで。
```

コード内に解説というか補足を埋め込みまくっちゃいましたが、だいたいこんな感じです。
これを走らせると

```
$ bundler exec ruby test.rb
"aの数:372"
"bの数:128"
```

こんな出力になって、だいたい75:25という設定した通りの割合になってるね、と確認が済んだ次第です。

# まとめ

selenium-webdriverはブラウザを操作する機能が用意されていて、例えばformの操作とかそういうのもできます。
繰り返しサイトにアクセスするとか機械的にできるところは有効活用していきましょう。
【WordPress】Contact Form 7をテンプレート内で表示する


Contact Form 7のショートコードをテンプレートで使用したい場合は以下のように `do_shortcode()` を使用し、その中にショートコードを記述する。

```hoge.php
<div class="entry-content">
  <?php echo do_shortcode( '［contact-form-7 id="1" title="example form"］' ); ?>
</div>
```

idとtitleは移行の際など変わってしまう恐れがあるた、自動で取得したい。
そういった場合は以下の方法で取得できる。

```hoge.php
<?php
$get_form = get_posts(array('post_type' => 'wpcf7_contact_form', 'posts_per_page' => -1, 'name' => 'form'))[0];
?>

<div class="entry-content">
  <?php echo do_shortcode( '[contact-form-7 id="'.$get_form->ID.'" title="'.$get_form->post_title.'"]' ); ?> 
</div>
```

注意点としては、'name'で指定する値は **最初に登録した投稿タイトル** ということ。
最初に "お問い合わせフォーム" とした場合は、いくら投稿タイトルを編集しても "お問い合わせフォーム" のまま変わらない。
変更されても問題ないので逆にありがたいかもしれない。
ちなみにデフォルトで入っているテスト投稿は "contact_form_01" となっている。（うろ覚えなので間違ってるかも）
ansible install

# ansible install from tar file
```shell-session
sudo apt-get update
sudo apt-get install python-setuptools python-dev -y
sudo apt-get install git
sudo easy_install pip
sudo pip install PyYAML jinja2 paramiko

wget http://releases.ansible.com/ansible/ansible-2.0.1.0.tar.gz
tar xvf ansible-2.0.1.0.tar.gz
cd ansible-2.0.1.0/
sudo make install
```

# with PPA
```shell-session
sudo apt-get install software-properties-common -y
sudo apt-add-repository ppa:ansible/ansible -y
sudo apt-get update -y
sudo apt-get install ansible -y
```
レイアウト基礎講座(2日目)

## 文字のジャンプ率
+ 文字を配置するときは伝統的に見出しや小見出し、本文、ネームとネームの見出しには決められたサイズ・フォントがあり、それに応じてレイアウトする。
+ 本文(ほんもん)のサイズが基本のサイズとなる。
+ 文字のジャンプ率を上げると元気な印象になる。文字を読ませようという意思が伝わる。
+ 文字のジャンプ率を下げると上品な印象になる。落ち着いた印象になる一方ぼやけた雰囲気にもなる。

## 写真のジャンプ率
+ 写真のジャンプ率は一番小さい写真を基準にしたときの一番大きい写真との面積日を指す。
+ 写真のジャンプ率は全体の元気さに必ずしも影響せず、元気さあるいは静けさは写真自身の印象に寄ってきまる。
+ 写真のジャンプ率が決めるのは、シャープさ。
+ 写真のジャンプ率を上げると全体に引き締まってシャープな印象を受ける。
+ 写真のジャンプ率を高くしたとき、大きなほうの写真はアップの写真を使うほうが望ましい。
+ 写真のジャンプ率を高くしたとき、2枚の写真の中に写る被写体のサイズの大小に差があるとよりシャープに見えるからである。
mamp＋wp環境でパーマネントリンクがNot Foundになる

mampでwpを初めて動かした超初心者です。
パーマネントリンクの設定が上手くいかなかったので、備忘録として。


# 現象

Post name```/%postname%/```
が設定されているが、下層ページが全てNot Foundになる。
が、Plainの状態だとリンクは全て繋がる。

# 問題箇所
「.htaccess」か「mod_rewrite」というのが怪しいと知る。

## .htaccess

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
```

問題なし。


## しかし.htaccessを動かすためには・・・


```
<Directory "/Applications/MAMP/xxxx">
    AllowOverride None
</Directory>
```

noneになっている部分を、AllowOverride allにしなければならなかった。
というわけで、「httpd-vhosts.conf」の中の

```
<VirtualHost *:80>
    DocumentRoot "/Users/xxxx/xxxxx/wordpress"
    ServerName local-xxxx.com
</VirtualHost>
```

の後ろに、


```
<Directory "/Users/xxxx/xxxxx/wordpress">
    AllowOverride all
</Directory>
```

を書き足して、mampを再起動。


# 動いた！

「httpd-vhosts.conf」内の記述が足りないだけでした。
省略してもOK!みたいな記事に流されるがまま省略していましたが、大事な箇所だったようです・・・。
なんだったのか後で調べます。
CentOS6 に node.js をバイナリからインストール


現時点の TLS(4.x.x) の最新は、v4.4.3 でした。
このエントリではv4.4.3の 64bit版をインストールします。

# ダウンロード
[nodejs.org](https://nodejs.org/en/download/) から Linux版のバイナリをダウンロードします。

# インストール
```bash
$curl -O https://nodejs.org/dist/v4.4.3/node-v4.4.3-linux-x64.tar.xz
$tar Jxfv node-v4.4.3-linux-x64.tar.xz
```
- 解凍したファイルを任意のディレクトリに移動し、node-v4.4.3-linux-x64/bin にパスを通します
- node -v でバージョンが出れば、インストール完了です。

```bash
$node -v
v4.4.3
```
演算子のオーバーロードは無条件でオペランドを評価していること

Swift の演算子オーバーロードって非常に便利な機能の一つです。おかげでいろんな演算を簡単に定義できてしまいます。例えば下記のようなこと：

```swift
var x = 1
var y: Int? = 2
if let y = y {
	x = y
}
```

という、オプショナル変数 `y` がもし `nil` でなければその値を `x` に代入せよ、という操作、いちいち `if let` をやるより、演算子を一つ定義してやったほうが便利だったりします：

```swift
// 演算子定義
infix operator =? {
	associativity right
	precedence 90
	assignment
}

func =? <T> (inout lhs: T, rhs: T?) {
	if let rhs = rhs {
		lhs = rhs
	}
}

// 利用
x =? y
```

とこのように、あれだけ面倒な `if let` が `=?` 一つで解決してしまいました。

ところが今日気づいたことだけど、演算子って実は無条件でオペランドを評価しているようです。まあ大体の場合これは何の問題もないけど、ところがしかし、`mutating` 動作がオペランドに入ってると思わぬ罠が潜んでいます。

例えば下記のようなことをやりたい：

```swift
var x: Int? = 0
var queue: [Int] = [1, 2, 3, 4]

func retrieveFirst() -> Int? {
	if let first = queue.first {
		queue.removeFirst()
		return first
	} else {
		return nil
	}
}

if x == nil {
	x = retrieveFirst()
}
```

という、自前のキューを作っていわゆる FIFO の動作を実装したい時、まず自分自身が `nil` であるかどうかを判定して、`nil` であればキューに項目があるかどうかを判定し、あれば先頭項目を持ってきてその先頭項目をキューから消す、という動作。これはこのコードのままだったら特に何の問題もないけど、さっきの `if let` の例と同じように、いちいち `if x == nil` 書くの面倒だから演算子定義したい、てなるとこのままではちょっと大変なことになります。例を見てみましょう：

```swift
// 注：このコードは間違った動作です
infix operator ?=? {
	associativity right
	precedence 130
	assignment
}

func ?=? <T> (inout lhs: T?, rhs: T?) {
	if lhs == nil {
		lhs = rhs
	}
}

var x: Int? = 0
var queue: [Int] = [1, 2, 3, 4]

func retrieveFirst() -> Int? {
	if let first = queue.first {
		queue.removeFirst()
		return first
	} else {
		return nil
	}
}

x ?=? retrieveFirst()
```

このコードを実行してみるとどうなると想像されますか？まず `x` は `?=?` で代入しようとしても自分自身は `nil` でないから特に何の値も代入されず `0` のままです。これは問題ありません。ところが `queue` を見てみると、何と `[2, 3, 4]` になってしまったのです。先頭の `1` が消えてしまいました。

はい、`?=?` の演算子は、両側のオペランドを無条件で評価してから演算しているのです。なので自分は `x` が `nil` でなければ `retrieveFirst()` を実行しないつもりで演算子作っても、それが無条件で実行されてしまうからキューの先頭項目が無条件で一つなくなるのです。

というわけで、こう言った遅延評価？が望ましい場合は、演算子オーバーロードではなく、普通に関数かメソッドで作ったほうが無難っぽいです（個人的には `inout` が入る関数があまり好きではありませんが…）

```swift
extension Array {
	mutating func retrieveFirstItemTo (inout target: Element?) {
		guard target == nil else {
			return
		}
		if let first = self.first {
			self.removeFirst()
			target = first
		} else {
			target = nil
		}
	}
}

func retrieveFirst <T> (inout from queue: Array<T>, inout to target: T?) {
	guard target == nil else {
		return
	}
	if let first = queue.first {
		queue.removeFirst()
		target = first
	} else {
		target = nil
	}
}

var x: Int? = 0
var queue: [Int] = [1, 2, 3, 4]

// どっちも結果は同じ
queue.retrieveFirstItemTo(&x)
x
queue

retrieveFirst(from: &queue, to: &x)
x
queue
```

演算子に遅延評価するパラメーターが欲しいな…
もしくは上記のメソッドを分かりやすく表現出来る演算子があればな…
Visual Studio Code の editor.rulers を見やすくする

※[自サイトの転載](http://netsp.in/article/509)です

Visual Studio Code だけど

    "editor.rulers": [ 4, 8, 12, 16, 20, 24, 28, 32, 36, 40 ]
    

とかやってタブストップにルーラーを引くと、実線が描かれてしまって死ぬようにできている。4TABだとかなり死ぬ。

だからといって「8TABになぁれー」というわけにもいかないので、`C:\Program Files (x86)\Microsoft VS Code Insiders\resources\app\out\vs\workbench\workbench.main.css` （Windows デフォルトの場合）の末尾に、たとえば以下のようなルールをむりやり追加する。

    .monaco-editor div.view-rulers .view-ruler {
        width: 1px;
        background-image:
            linear-gradient(
                180deg,
                rgba(128,128,128,128), rgba(0,0,0,128) 1px
            )
        ;
        background-size: 1px 4px;
    }
    

すると、こんなふうに半透明の破線になってうれしい。

![20160413-1409-01.png](https://qiita-image-store.s3.amazonaws.com/0/121386/98507701-0d6e-dfef-a3d1-0fe000e35e98.png)

なお、暗色系以外のテーマでは `linear-gradient` の色を調整する必要があるので、くわしくは選挙公報などで衆知すべし。
やまガントチャート（Excelガントチャート）祝日対応版

Excelのガントチャートテンプレート「[やまガントチャート](http://www4.kcn.ne.jp/~yamam/soft/yamaganttchart/yamaganttchart.htm)」で
土日に加えて祝日も色が付くように条件付き書式を設定したもの。
みなさんやってそうですがせっかくなのでGithubに上げておきます。

[isaac-otao/yamaganttchart_holidays](https://github.com/isaac-otao/yamaganttchart_holidays)

「使い方」シートにある祝日欄（デフォルトだとA37～A74）に日付を入れるだけ。
月日だけでなく年も一致条件になっているので注意してください。
国民の休日以外に、有給休暇や会社の休日などを入れる用に多目に枠を作ってあります。
moment.jsで経過時間を年+月+日+時+分で表示させる

moment.js + [moment-precise-range](https://github.com/codebox/moment-precise-range) というプラグインが便利でした。
年、月、日、時、分をそれぞれ数値だけ取得するには下記のように記述する。

```js:js
var from = moment('2016-04-09 12:00:00');
var to = moment(); // now
var diff = moment.preciseDiff(from to, true); // fromからtoまでの経過日数を数値で取得

var d{
  Y = ('0' + diff.years).slice(-2),
  Mo = ('0' + diff.months).slice(-2),
  D = ('0' + diff.days).slice(-2),
  Mi = ('0' + diff.minutes).slice(-2),
  S = ('0' + diff.seconds).slice(-2)
};
```
Linux で tar.xz 形式のファイルを解凍する


# xz 

LZMA2のデータ圧縮アルゴリズムを採用したデータ圧縮フォーマット、およびその圧縮プログラム。
圧縮に時間がかかるが圧縮率は優秀です。

[wikipedia:Xz_(ファイルフォーマット)](https://ja.wikipedia.org/wiki/Xz_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88))

# xz コマンドで解凍

### その１
- xzの解凍 → tarの解凍と順番に行う方法です。

```bash
$xz -dv xxx.tar.xz
$tar xfv xxx.tar
```

### その２
- tar.xz をまとめて解凍します

```bash
$xz -dc xxx.tar.xz | tar xfv -
```
- xz -dc の代わりに xzcat でも良いです

```bash
$xzcat xxx.tar.xz | tar xfv -
```

# tar コマンドで解凍
- GNU tar 1.22 から xzフォーマットをサポートしてます
- オプション J を使用します

```bash
$tar Jxfv xxx.tar.xz
```
arduinoでtiny c

#概要
arduino nanoでtiny cでLチカしてみた。
tiny cは、「iArduino」です。
#写真
![tinyc.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/ef1726f9-d88c-7e06-2a7f-f6a688d2984e.jpeg)

#サンプルコード
```
pinMode(13, OUTPUT);
for(;;) {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
}
```
GalaxyProjectのGalaxy でツールの内容を修正したあとにやること

# 概要

ツールのxmlの中身を変更したかった。
変更した後に、実行してみたら変更前と変わらなかった。

# 結論

Admin のメニューから tool の reload を行う必要がある。

# やったこと

修正方法を考えたが、修正方法が正しいかをあらかじめ確認しておきたかった。
変更するべきファイルは特定できたのだが、その変更が反映できなかった。

Admin メニューの中にある以下のものをクリックする

```
Reload a tool's configuration
```

その後、ツールの名前をいれて、***Reload*** ボタンを押す。
ルーレットで勝てる？(優マルチンゲール)

##背景
　ギャンブルと言ったら、まず「勝てない」と、「やればやるほど損になる」というイメージが多いです。確かに、間違ってはいませんが、ギャンブルは本当に勝てないですか？もし、勝てるなら、どんな条件を揃う必要ですか？検証してみましょう。
##設定
　ルーレットはギャンブルの1種類としてよく知られています。ここで、ヨーロピアン式のルーレットで検証しましょう。
　ヨーロピアン式：37区分(黒*18、赤＊18、0*1)
　ルール：赤か黒に賭ける。当たったら、賭け金の2倍をゲット。
<img src="https://qiita-image-store.s3.amazonaws.com/0/114190/60a1fb3d-5d55-cb5b-ea99-ca3f0561ad52.png" width = "200" height = "200" alt="图片名称" align=center />

##賭け1
毎回1ドルで赤に賭ける。当たった場合、2ドルをもらう(利益は1ドル)
赤が出る確率：　18/37　(ほぼ0.5)
##賭け2
毎回赤に賭ける。最初に掛け金は1ドルで、負けたら前の2倍で賭ける。当たったら、トータルで利益1ドルをもらう。
$$-2^0-2^1-\ldots-2^{n-1}+2^n=1$$
赤が出る確率：　18/37　(ほぼ0.5)

##シミュ―レーション
ルーレット参加者：1000人
所持金:10000ドル
賭け回数：1000回

##結果

||平均収益|収益最大|収益最小|瞬時最大損失|儲かった人数|全体の割合|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|賭け1|-26.790|102.00|-154.00|-1|216|0.216|
|賭け2|481.059|541.00|-39.00|-524288|997|0.997|
<img src="https://qiita-image-store.s3.amazonaws.com/0/114190/95ef1f14-39b2-3868-ee3d-46fd18348bcb.png" width = "500" height = "300" alt="图片名称" align=center />

賭け1:　やればやるほど損になることが明らかです。gamble1の曲線は右下がりとなっています。
賭け2:　二つの条件が揃えれば、100%勝てます。
　　条件1：　所持金が十分（瞬時最低収益の2倍に超えればよい。）
　　条件2：　当たるまで、betを続けます。
##コード

```r:
p<-18/37
money<-10000
n<-1000
k<-1000

data1<-matrix(rbinom(n*k,1,p),n,k)
return1<-data1
return1[which(return1[,]==0)]<--1
money1<-apply(return1,2,cumsum)+money
am1<-apply(money1,1,mean)

data2<-matrix(rbinom(n*k,1,p),n,k)
fun2<-function(x){y<-x
y[1]<-1
for(i in 2:n){if(x[i-1]==0) y[i]<-y[i-1]*2
  else y[i]<-1}
y}
r2<-apply(data2,2,fun2)
rr2<-data2
rr2[which(rr2[,]==0)]<--1
return2<-r2*rr2
money2<-apply(return2,2,cumsum)+money
am2<-apply(money2,1,mean)

result<-matrix(0,6,2)
rownames(result)<-c("average","max","min","range","winner","rate")
colnames(result)<-c("gamble1","gamble2")
result[,1]<-c(mean(apply(return1,2,sum)),max(apply(return1,2,sum)),min(apply(return1,2,sum)),
              min(return1),length(which(apply(return1,2,sum)>=0)),
              length(which(apply(return1,2,sum)>=0))/k)
result[,2]<-c(mean(apply(return2,2,sum)),max(apply(return2,2,sum)),min(apply(return2,2,sum)),
              min(return2),length(which(apply(return2,2,sum)>=0)),
              length(which(apply(return2,2,sum)>=0))/k)
result

par(mfrow=c(1,2))
plot1<-plot(am1,type="l",main="gamble1",xlab="round of bet",ylab="money",col="Red")
plot2<-plot(am2,type="l",main="gamble2",xlab="round of bet",ylab="money",col="blue")
```
[cocos2d-x] ワイルドカードを使ってAndroid.mkの修正を不要にする

## 概要
cocos2d-xのAndorid版の開発では、proj.android-studio/app/jni/Android.mkのLOCAL_SRC_FILESに手動でソースファイルのパスを追加しなくてはいけないが、これはかなり面倒である。
そこで、Classes以下のソースファイル(.cpp)を自動で認識するAndroid.mkの書き方を示す。

## 対象とするcocos2d-xのバージョン

v3.15.1

## ビルド方法
Android Studioで行う。

Android.mkの修正は不要となったが、実はAndroid Studio側がファイルの変更を自動で認識してくれない場合がある。
ソースファイルの追加、削除が反映されずにエラーとなる場合は、メニューの「Build > Refresh Linked C++ Project」を選択すると反映される。

※Android SDKの更新により、コマンドラインによるビルドが出来ない場合がある。
cocos2d-x v3.15以降のプロジェクト設定では、Android Studioで全てのビルドを行う事が出来る。
Android Studioでブレークポイントを張る事も出来るし、ソースの修正も可能。

## Android.mkの該当部分

```
...
LOCAL_MODULE_FILENAME := libMyGame

LOCAL_SRC_FILES_JNI_PREFIXED := \
    $(wildcard $(LOCAL_PATH)/../../../Classes/*.cpp) \
    $(wildcard $(LOCAL_PATH)/../../../Classes/**/*.cpp) \
    $(wildcard $(LOCAL_PATH)/../../../Classes/**/**/*.cpp) \
    $(wildcard $(LOCAL_PATH)/../../../Classes/**/**/**/*.cpp)

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   $(LOCAL_SRC_FILES_JNI_PREFIXED)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes
...
```
FuelPHP URLの /index.php 排除！

###はじめに
改訂FuelPHP入門を勉強したいと思い、 **やるぞー！** と始めたのですが・・・

`http://localhost/blog/public/index.php/welcome`の
`/index.php`を取り除いた
`http://localhost/blog/public/welcome`

でアクセスしたいのに404が返ってくる問題に直面したので、
またFuelPHPをインストールしたらすぐ開発できるようにメモします！！！


```
※ちなみにFuelPHPのversionは1.7です。
※http://localhost/blog/public/index.php/welcome 
※このURLのblogと書いてある部分は自身のプロジェクト名です。
```


###index_fileをfalseに。

config.phpファイルに変更すべきところがあるので、

```APPPATH/config/config.php
	/**
	 * index_file - The name of the main bootstrap file.
	 *
	 * Set this to 'index.php if you don't use URL rewriting
	 */
　　　　　　　　　　// ↓コメントアウトされてるところ！↓
	 // 'index_file' => false,
```

コメントアウトされているので有効にする。

```APPPATH/config/config.php
	/**
	 * index_file - The name of the main bootstrap file.
	 *
	 * Set this to 'index.php if you don't use URL rewriting
	 */
　　　　　　　　　　　// ↓コメントを外してあげる！↓
	 'index_file' => false,
```

###httpd.confの設定

######※(自分のファイルはここにありました)
```/etc/apache2/httpd.conf
<Directory "/Users/naoki/fuelphp/blog/public">
・・・
・・・

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #

    # None になっているところを変更する
    AllowOverride None

・・・
・・・
</Directory>

```

None になっているところを All に変更する


```/etc/apache2/httpd.conf
<Directory "/Users/naoki/fuelphp/blog/public">
・・・
・・・

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #

　　　　　　　　# All に変更！
    AllowOverride All

・・・
・・・
</Directory>

```

###最後に

apacheに設定変更を反映させるので、下記のコマンドを実行する。
`sudo apachectl restart`

コマンド実行したらURLにアクセス！
`http://localhost/blog/public/welcome`


###これで設定完了!

これで動きました。
色々な情報が出ているのでそちらも参考にしつつ設定してみてください！
cronジョブから/usr/bin/scriptを使ったらハマった

## 概要

cronジョブの中から`/usr/bin/script --command "mycommand"`のようなことをすると、mycommandが終了するのを待たずにscript自体が終了してしまう。

util-linuxを2.23.2から2.27にバージョンアップしたら再現しなくなった。どうもバグだったらしい。ちなみに

- CentOS 7では再現した。
- Arch Linux（CentやAmazonと同じくcronie）では再現しなかった。
- FreeBSDでは再現しなかった。

## 環境

- Amazon Linux 2015.09
- cronie-1.4.4-12.6.amzn1.x86_64
- script from util-linux 2.23.2

## 実験方法

### cronの設定

1分おきに`script_test.sh`を実行するようにする。

```/etc/cron.d/script_test
* * * * *  root cd /home/ken && /home/ken/script_test.sh
```

### script_test.sh

```
#!/bin/sh

LOG="/home/ken/script_test.log"
rm $LOG
echo "$0 start $(date)" >> $LOG
script --return --flush --command "date; sleep 3; date; sleep 3; date; sleep 3;" /home/ken/typescript
echo "$0 end   $(date)" >> $LOG
```

`--return --flush`はつけなくても結果は同じだった。

### 結果

```
$ cat script_test.log
/home/ken/script_test.sh start Wed Apr 13 13:06:01 JST 2016
/home/ken/script_test.sh end   Wed Apr 13 13:06:01 JST 2016

$ cat typescript 
Script started on Wed 13 Apr 2016 01:06:01 PM JST
Wed Apr 13 13:06:01 JST 2016
Wed Apr 13 13:06:04 JST 2016
Wed Apr 13 13:06:07 JST 2016

Script done on Wed 13 Apr 2016 01:06:10 PM JST
```

`script`の引数で`sleep 3`を3回呼んでいるので少なくとも9秒かかるはず。typescriptを見ると実際に9秒かけて実行しているが、
シェルスクリプト自体は1秒もかからずすぐに終了している。
【メモ】mongoDBで環境間のデータに差異が無いか確認する方法

# 動機

開発環境とリリース前確認用の環境で、MongoDBのデータに差異が無いか確認しようと思ったけど、
数十万件あるデータを比べるとか無理じゃね？と思った時に。

# mongoexport使う

mongoexportで出力して、ちょいちょいと整形してやればよろし。
クエリも投げられるので、対象データの絞り込みは容易。

一致するはず！と期待しているフィールドを選んで、`--fields` と `--sort` にそれぞれ指定してあげる。

```
mongoexport --host example.mongo --db hoge --collection piyo --query '{userId:ObjectId("xxxxx")}' --fields name,credit,zip --sort '{name:1,credit:1,zip:1}' --out hoge.json
mongoexport --host example.mongo --db fuga --collection piyo --query '{userId:ObjectId("xxxxx")}' --fields name,credit,zip --sort '{name:1,credit:1,zip:1}' --out fuga.json
```

そんままでは`_id`が当然のように一致しないので、除去する。`_id`が無いなら気にしなくていい。

```
 cat hoge.json | perl -pe 's/"_id" : \{ "\$oid" : "[a-f0-9]+" \}, //g' > hoge-trim.json
 cat fuga.json | perl -pe 's/"_id" : \{ "\$oid" : "[a-f0-9]+" \}, //g' > fuga-trim.json
```

あとはdiffとるだけ。

```
diff *-trim.json
```

お手軽。
vagrant + docker + oracle db


## vagrant install
インストールしたバージョン　1.8.1

```
適当にやってください
```


## virtialbox install

インストールしたバージョン 5.0.14 r105127

```
適当にやってください
```



## Atlas login

アカウントがなければ作成
https://atlas.hashicorp.com/boxes/search?utm_source=vagrantcloud.com&vagrantcloud=1

```
$ vagrant login
# ユーザー名・パスワードを入力してログインする
```

## vagrant の BOXイメージを vagarant cloudから好きなのを選択
今回は[bento/centos-7.1]を使用

```
$ vagrant init bento/centos-7.1
```

## Vagrantfile 設定

```Vagrantfile
Vagrant.configure(2) do |config|
	#  以下２行を追加
+	config.vm.network "private_network", ip: "192.168.33.20"
+	config.vm.synced_folder "data", "/vagrant", create: true, type: 'rsync'
end
```

## vagarant のファイル自動ファイル共有

```
$ vagrant rsync-auto
```

## vagrant立ち上げ 

```
$ vagrant up
```

## vagrantにログイン確認 

```
$ vagrant ssh
# ログインできたらログアウト
[vagrant@localhost /]$ exit
```

## dockerインストール
[https://docs.docker.com/engine/installation/linux/centos/]

```
$ sudo yum update
$ curl -fsSL https://get.docker.com/ | sh
$ sudo service docker start
$ sudo docker run hello-world
```

## oracle 11gのdockerイメージを取得
[https://github.com/wnameless/docker-oracle-xe-11g]
[http://shibuya-3percent.hatenablog.com/entry/2016/01/31/163527]

```
$ sudo docker pull wnameless/oracle-xe-11g
```

## docker起動

```
$ sudo docker run -d -p 49160:22 -p 49161:1521 wnameless/oracle-xe-11g
```

## docker起動確認

```
$ sudo docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS                      PORTS                                                      NAMES
97f78b496a87        wnameless/oracle-xe-11g   "/bin/sh -c '/usr/sbi"   About a minute ago   Up About a minute           8080/tcp, 0.0.0.0:49160->22/tcp, 0.0.0.0:49161->1521/tcp   big_swartz
```

## docker停止

```
$ sudo docker stop 97f78b496a87
```
## docker内に入る

```
# ホストからvagrantにssh
$ vagrant ssh

# vagrant からdockerへssh
ssh root@localhost -p 49160
password: admin
```

## sqlplusで接続確認

```
sqlplus /nolog
connect system@localhost
password oracle

ERROR:
ORA-28002: the password will expire within 7 days


Connected.
```

```
SQL> ALTER USER system IDENTIFIED BY oracle;

User altered.
```
memo:パスワードの期限を無制限に設定 alter profile default limit password_life_time unlimited;


### 未確認↓
## sqldeveloper で oracledbに接続確認
[http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html]

```
hostname: 192.168.125.125
port: 49161
sid: xe
username: system
password: oracle
```
Windows CentOS（仮想環境）の「Vagrant」ファイルに行くまで

# 概要
僕自身、Macユーザーなwindowsでプログラミングをする際の基本的なことがわからなかったのでメモします。
**仮想環境の「vagrant」ファイルに行くまでの手順**を記します。

# 手順
## 1. 現在のWindowsのOSで共通ファイル(vagrant)に行く

```
cd vagrant
(「vagrant」は共通ファイルの名前)
```

## 2. Vagrantの仮想環境を起動

向こうの電源ボタンを押す的な？

```
vagrant up
```

## 3. 仮想環境まで行く

```
vagrant ssh
```
[vagrant....centOS...~]<- みたいな四角かっこで囲まれてたら成功かと...

## 4.　共通ファイル(vagrant)を探す
```
cd /
cd vagrant
```
僕の場合はなんかトップの配下に「vagrant」ファイルがいた。ややこしい


# 最後に
基本的には共通ファイルに「使うファイル」を保存しましょう。
全部、感覚で書いてますので、正確に言うと違うよってのがあるとご指摘貰えば嬉しいです。
以上
turbolinks 入れたら f.submit が効かなくなった件


# 概要

本来関係ないはずなんだけど、元々のviewの書き方によってハマる例です。
今回は、`<table>`の中の`<tr>`の外に、`<form>`を書いてたのがいけなかったです。

# 現象

諸事情により、今まで tubolinks 使ってなかった Railsプロジェクトに turbolinksを導入。

```application.js
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks // <-追加
//= require select2           // <-追加
//= require turbolinks        // <-追加
//= require_tree .
```

ajaxで動いてるところはサクッと動いたのに、なぜか、`f.submit` のボタンが動かなくなる。
ボタン押しても、リクエストどころか、clickイベントも発火してない模様。
そして、同じページをリロードすると改善する（普通にボタンが動作する）。

# 原因

関係あるのは `link_to` だけなハズなのに??? と理不尽に感じつつもいろいろ試し。
↓こちらで、invalid HTML の例が出ていたので気づけました。

http://stackoverflow.com/questions/19365809/form-submit-button-only-works-after-reload


```app/views/some_models/_form.html.erb
<table>
<%= form_for(@some_models) do |f| %>
（中略）
<% end %>
</table>
```

こういう書き方だと、こんな風にレンダーされてました。

```
<table class="ta1">
  <form accept-charset="UTF-8" action="/some_models/xxxxxxxxxx" class="edit_some_model" id="edit_some_model_xxxxxxxxxx" method="post"></form>
  <tbody>
  (中略)
  </tbody>
</table>
```

`<tbody>` の外で、`<form>` が閉じちゃってますので、`<tbody><tr><td>` の中に書いた `<input type="submit">` は効かなったというワケです。

# 解決

`<table>` の外に `<form>` をもってくることで、解決しました。

```
<%= form_for(@titles) do |f| %>
<table>
（中略）
</table>
<% end %>
```
Rewireを使ってNode.jsのprivateなfunctionをテストする

Node.js初心者な私がいろいろはまったことメモ。
Node.jsのUnit Testでexportsしていないfunctionをテストしたかったので、調べていたら便利なライブラリを発見。

## 使用ライブラリ
rewire(下記参照)
https://github.com/jhnns/rewire

## 使い方
インストール

```
npm install rewire
```

テストしたいファイルサンプル

```js:somethig.js
exports.someMethod1 = someMethod1

function someMethod1(var1, var2) {
 // 外部ファイルから読み出せる
}

function someMethod2(var1, var2) {
 // 外部ファイルから読み出せない
}
```

この場合、```someMethod1```は外部からテストできるけど、```someMethod2```がexportsされていないためテストが出来ない。

## 普通にrequireしてテストしてみる

```js:test.js
describe('#someMethod2', function () ) {
  it('should ok', function (done) ) {
    var something = require('something.js')
      ;
    result = something.someMethod2(var1, var2);
    assert.ok(result);
  }
}
```

結果

```
ReferenceError: someMethod2 is not defined
```

## rewireを使ってテストしてみる
以下のようにrewireの```__get__```を使う事でexportsされていないオブジェクトにアクセスできるようになる。

```js:test.js
describe('#someMethod2', function () ) {
  it('should ok', function (done) ) {
    var something = rewire('something.js')
      , someMethod2 = something.__get__('someMethod2')
      , result = null
      ;
    result = someMethod2(var1, var2);
    assert.ok(result);
  }
}
```

### いろんな使い方

```__get__```以外に, ```__set__```というものがあるので、それを使えばStubやMockも可能になる。

以下サンプルで、```someMethod2```のreturn値を変える。

```js:test.js
describe('#someMethod2', function () ) {
  it('should ok', function (done) ) {
    var something = rewire('something.js')
      , someMethod2 = something.__get__('someMethod2')
      , result = null
      , stubMethod = null
      ;
    
    stubMethod = function () {
      return false;
    }
    something.__set__({
      'someMethod2': stubMethod
    });
    result = someMethod2(var1, var2) // resultがfalseになる
    // 省略
  }
}
```
brew install redisでErrorが発生したときの解決策

Hubotでもいじってみようかと思い、環境を設定していると問題が発生したので解決策をまとめておきます。


#設定した環境
MacBook Pro (Retina 13-inch、Early 2015)
プロセッサ：2.9 GHz Intel Core i5
メモリ：8 GB 1867 MHz DDR3
バージョン：10.11.4


まずbrew install redis
をしたところ、パーミッションがないと表示されてしまいました。

```sh
$ brew install redis
==> Downloading https://homebrew.bintray.com/bottles/redis-3.0.5.el_capitan.bott
######################################################################## 100.0%
==> Pouring redis-3.0.5.el_capitan.bottle.tar.gz
Error: Permission denied - /usr/local/var
Warning: Bottle installation failed: building from source.
==> Downloading http://download.redis.io/releases/redis-3.0.5.tar.gz
######################################################################## 100.0%
==> make install PREFIX=/usr/local/Cellar/redis/3.0.5 CC=clang
Error: Permission denied - /usr/local/var
```

では、sudo付けて実行すれば解決するかと思い、試してみました。

```sh
$ sudo brew install redis
Password:
Error: Cowardly refusing to `sudo brew install`
You can use brew with sudo, but only if the brew executable is owned by root.
However, this is both not recommended and completely unsupported so do so at
your own risk.
```

今度はまた別のエラーが…
調べてみると、chownというコマンドでファイルやディレクトリの所有者を変更することで解決するとあったので、試してみます。
以下のコマンドでは、所有者を”root”に設定しました。

```sh
$ sudo chown -R root /usr/local
$ brew install redis
Error: Cannot write to /usr/local/Cellar
counterport-cafe:Documents ken$ brew install node
Warning: node-5.0.0 already installed
Error: Cannot write to /usr/local/Cellar
```

それでもう一度、brewしてみますが、やはりエラーが出てしまいました。しかもまた違うエラー。
どうやら、指定した所有者が悪かったらしい。
気を取り直して、以下で実行。
※　<*username*>　は自分の環境に合わせて、書き換えてください。

```sh
$ sudo chown -R <username> /usr/local
$ brew install redis
==> Downloading https://homebrew.bintray.com/bottles/redis-3.0.5.el_capitan.bott
Already downloaded: /Library/Caches/Homebrew/redis-3.0.5.el_capitan.bottle.tar.gz
==> Pouring redis-3.0.5.el_capitan.bottle.tar.gz
==> Caveats
To have launchd start redis at login:
  ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don't want/need launchctl, you can just run:
  redis-server /usr/local/etc/redis.conf
==> Summary
🍺  /usr/local/Cellar/redis/3.0.5: 9 files, 892K
```

無事に通りました！


##参考資料
『brew install goを実行すると「Error: Cannot write to /usr/local/Cellar」』
http://anton0825.hatenablog.com/entry/20140606/1409898700
CentOSにImageMagickをインストールする

2度探して調べたことは忘れないようにメモ。

環境
- Apache 2.2
- CentOS 6.7
- PHP 5.6

```
# yum -y install ImageMagick
# yum -y install ImageMagick-devel
# pecl install imagick
```

これですんなり完了。
後はphp.iniに以下を追記し、httpdをrestartすればOK。

```
# vim /etc/php.ini
extension=imagick.so #追記

# service httpd restart
```
Swift で MySQL を使う。（OSX）

# 概要

Swift で MySQL を使うための最も基本的なサンプル。
OSX 向けの記事です。iOS 向けではありません。

# 前準備

## mysqlclient のインストール
MySQL を扱う Swift で書かれたライブラリは執筆時点で存在しないと思われます。
なので、本家の C ベースの mysqlclient をインストールしてこれ経由でアクセスします。
Homebrew でインストールすることをベースに話を進めますが、Homebrew のインストールとかアップデートについては他にたくさんページがあるので割愛します。

インストール方法；
mysqlclient は普通に mysql についてきます。なので、mysql をインストールします。

```
brew install mysql
```

## Xcode の設定

### Build Settings

OSX アプリケーションを Swift で作ったら、Build Settings で以下の指定を行います。

- Header Search Path
 - /usr/local/include/mysql
- Library Search Path
 - /usr/local/lib

- Other Linker Flags
 - -lmysqlclient 
 


### ブリッジングヘッダー
ブリッジングヘッダーを作成し、以下の内容を記述します。

```
    #include	<mysql.h>
```
（ブリッジングヘッダーは新規に Cocoa Class のファイルを Objective-C で作成すれば、XCodeが自動的に作成して、Build Setting にセットしてくれる。）


# 簡単なクエリの結果を表示する例

```swift

import Foundation

let	wMySQL = mysql_real_connect(
	mysql_init( nil )
,	"127.0.0.1"
,	"root"
,	"root"
,	"information_schema"
,	8889 	//	8889 is MAMP's Default, 0 for 3306
,	nil
,	0
)

let	wSQL = "select TABLE_NAME, COLUMN_NAME from COLUMNS limit 10"
guard mysql_real_query( wMySQL, wSQL, UInt( wSQL.utf8.count ) ) == 0 else { fatalError() }
let	wResult = mysql_use_result( wMySQL );

while true {
	let wRow = mysql_fetch_row( wResult )
	if wRow == nil { break }
	NSLog( "%s %s", wRow[ 0 ], wRow[ 1 ] );
}

```
Command Line Tool を作成して、その main.swift の内容を上のようにすると、以下のように出力されます。必要に応じてポートは変更してください。上の例では MAMP のデフォルトの 8889 を指定しています。

```
2016-04-13 11:40:22.354 SwiftCUI[48941:6000289] CHARACTER_SETS CHARACTER_SET_NAME
2016-04-13 11:40:22.354 SwiftCUI[48941:6000289] CHARACTER_SETS DEFAULT_COLLATE_NAME
2016-04-13 11:40:22.355 SwiftCUI[48941:6000289] CHARACTER_SETS DESCRIPTION
2016-04-13 11:40:22.355 SwiftCUI[48941:6000289] CHARACTER_SETS MAXLEN
2016-04-13 11:40:22.355 SwiftCUI[48941:6000289] COLLATIONS COLLATION_NAME
2016-04-13 11:40:22.355 SwiftCUI[48941:6000289] COLLATIONS CHARACTER_SET_NAME
2016-04-13 11:40:22.355 SwiftCUI[48941:6000289] COLLATIONS ID
2016-04-13 11:40:22.355 SwiftCUI[48941:6000289] COLLATIONS IS_DEFAULT
2016-04-13 11:40:22.355 SwiftCUI[48941:6000289] COLLATIONS IS_COMPILED
2016-04-13 11:40:22.355 SwiftCUI[48941:6000289] COLLATIONS SORTLEN
```
Darwinでluajit実行中にlfs.luaが無いと怒られる時の対処法


## はじめに
会社のMac何台かにluajitの実行環境をインストールした際、スクリプト実行中にlfs.luaがないと怒られました。

で、

```
luarocks install --local luafilesystem
```

したけれどダメ。なんで？と思って調べたことをメモしておきます。

## 解決法
[ここ](https://github.com/Homebrew/legacy-homebrew/issues/32354)にヒントがありました。

##### 原因

luarocksを次の流れでインストールしていた。

```
brew install luajit
brew install luarocks
sudo luarocks install luafilesystem
```

その結果、luajitはlua5.1を参照しているのにluarocksはlua5.2を参照し、luajitに対応するバージョンのモジュールがインストールされなかった。

###### 対処
luaのバージョンを指定しluarocksを再インストールすることにした。
```
sudo luarocks remove luafilesystem
brew uninstall luarocks
brew install luarocks --with-lua51
sudo luarocks install luafilesystem
```

これでlfs.luaが見つからないエラーが出なくなった。
ElasticBeanstalk with Docker でのmackerel-agentのauto-retirement

# TL;DR
- auto-retirmentの設定が有効になるbase platform は ``` 64bit Amazon Linux 2015.09 v2.0.8 running Multi-container Docker 1.9.1 (Generic) ```
- instance terminate時に mackerel-agentのdocker processに対して終了シグナルが投げられるようになった
- [ここで](http://qiita.com/tknzk/items/0f1bea740e077801ce0b#auto-retirement)あげた問題点が解決された
- mackerel-agentのversionは ``` 0.30.0 ```
- docker imageのtag ``` 0.30.0-2 ```

<img width="823" alt="eb_base_platform.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3447/22cbc43c-1ad2-3cef-e286-3e9fb1bc64ca.jpeg">


# Dockerrun.aws.json

```Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
~~snip~~
    {
      "name": "mackerel-agent",
      "image": "mackerel/mackerel-agent",
      "memory": 512,
      "links": [
        "app-server",
        "nginx-proxy"
      ],
      "essential": true,
      "environment": [
        {"name": "apikey",  "value": "API_KEY"},
        {"name": "include", "value": "/etc/mackerel-agent/conf.d/*"},
        {"name": "auto_retirement",  "value": "true"},
        {"name": "enable_docker_plugin",  "value": "true"}
      ],
~snip~
    }
  ],
~snip~

}
```

- docker-plugin は environmentで設定できるようになったので追加

| version | auto-retirment | run |
|:--------|:---------------|:----|
| 64bit Amazon Linux 2016.03 v2.1.0 running Multi-container Docker 1.9.1 (Generic)  | ? | x |
| 64bit Amazon Linux 2015.09 v2.0.8 running Multi-container Docker 1.9.1 (Generic)  | o | o |
| 64bit Amazon Linux 2015.03 v1.4.6 running Multi-container Docker 1.6.2 (Generic)  | x | o |
| 64bit Amazon Linux 2015.03 v1.4.1 running Multi-container Docker 1.6.0 (Generic)  | x | o |
| 64bit Amazon Linux 2015.03 v1.4.0 running Multi-container Docker 1.6.0 (Generic)  | x | o |


# 注意
- 最新のbase platformである ``` 64bit Amazon Linux 2016.03 v2.1.0 running Multi-container Docker 1.9.1 (Generic) ``` は mackerel-agentが起動できない
   - ``` /startup.sh: line 23: 8 Trace/breakpoint trap /usr/local/bin/mackerel-agent $opts ``` というログを吐いて死んでいる

# 追記 (2016/06/28)
- ``` 64bit Amazon Linux 2016.03 v2.1.3 running Multi-container Docker 1.11.1 (Generic) ``` と ``` mackerel-agent:0.31.2 ``` の組み合わせは起動できるようになった (以下の対応によるもの)
    - server側のdocker が1.11.1になったこと
    - mackerel-agentがAmazonLinux2016.03対応済みのものになったこと

| version | auto-retirment | run | mackerel-agent | 
|:--------|:---------------|:----|:---------------|
| 64bit Amazon Linux 2016.03 v2.1.3 running Multi-container Docker 1.11.1 (Generic)  | o | o | 0.31.2 (centos:7, docker1.11.2) |
プロジェクト管理(redmine)について調べた   

# 初めに
ぼくは普段AD（アシスタントの方）をやっており、今度redmineを会社で使うことになったので、ざっくりとまとめました。

# Redmineとは
>Redmineはオープンソースのプロジェクト管理ソフトウェアです。
>プロジェクトのタスク管理、進捗管理、情報共有が行えます。SubversionやGitなどのバージョン管理システムとの連携機能も備えており、ソフトウェア開発やwebサイト制作などのITプロジェクトで特に威力を発揮します

# Redmineでできること
- チケットを使ってのタスク管理
※この時1チケットをどれくらいの細かさで作成するのかはルールを明確にする必要がある
- ドキュメントの一元管理
※wikiなどを利用し、どこに何があるのかを明確にすることで、スムーズなプロジェクトを進めることができる
- ガントチャートを自動作成してくれるので、進捗状況が一目でわかる
※1チケットに必ず開始日と期限日、進捗率を入れる必要がある
- 作業時間の管理
※チケットごとに作業時間を入力する必要あり

# メリット
- タスクの担当が明確
- 作業、やり取りの履歴が追いやすい
- 情報、ドキュメントを一元管理できる
- チームの状況が把握しやすい

# デメリット
- 運用ルールを明確にしないと荒れる
- 使い方の共有が大変
- 挫折しやすくなり、情報が羅列する

# 運用する前に決めないといけないこと
- 1チケット単位の確立
- 担当とウォッチを使い分ける
- やり取りは基本チケットのコメントにする
※ほかのチャットツールを使うかなど
- チャットとチケットの役割を理解する、させる
※マニュアル？wikiの充実
- 管理者と実行者の役割分担
※ステイタスの変更権限など
VirtualBox上のCentOSにSSHでログインする


<img width="772" alt="Screen_Shot_2016-04-13_at_11_08_43.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/2f3db93f-dead-13c0-2b65-910d49fb9407.png">

NetworkからPort Forwarding

<img width="772" alt="Screen Shot 2016-04-13 at 11.08.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/1d3bf933-f26e-bca5-0092-591440e26c5e.png">
HostPortとGuestPortを設定

#ホストの操作

`ssh -p 2222 root@localhost`