OmniAICreator/Qiita-1.07M huggingface dataset:
特定のモジュールと強く依存するプロジェクトの開発を行うときのtips(「npm link」と「dependenciesにローカルフォルダを指定する」方法の比較 ) 

「npmに公開していないローカルフォルダにあるモジュール」を使ったプロジェクトを開発する際に`npm link`を使う方法と`dependencies `を使ってモジュールをローカルに指定する方法があるので２つを比較してみました。

# 1. 「npm linkを使う」方法

## 概要
- `node_modules`以下にモジュールへのエイリアス(ショートカット)を貼ります。

## メリット
- エイリアスを貼るだけなので、モジュールの更新との同期がすぐできる。
- モジュール側をどこのフォルダに配置しても問題ない。

## デメリット
- 初回のみだが、開発中のメンバー全員に、インストール手順を知らせなければならない。(※ もしかしたらnpm scriptsのinstallにコマンド書けばいいかも・・・？)

## 使用手順

1\. モジュール側のプロジェクト(package.json)があるフォルダで、以下のコマンドを実行します。

```terminal
$ npm link
```

2\. モジュールを使用するプロジェクトが(package.json)あるフォルダで以下のコマンドを実行します。

```terminal
$ npm link (モジュールのpackage名)
```

![npm-use-link.png](https://qiita-image-store.s3.amazonaws.com/0/1423/5fd96f22-1803-970a-f943-84bfc76dca0e.png "npm-use-link.png")

▲ mylibはエイリアス

- [ソースコード(GitHub)](https://github.com/nyamogera/making_typescript_library/tree/master/app-use-npm-link)

# 2. 「dependenciesにローカルフォルダを指定する」方法

## 概要
- `node_modules`以下にモジュールを直接インストールします。

## メリット
- `npm install`だけでモジュールをインストールできる。

## デメリット
- モジュールの更新時に再度`npm install`が必要

## 使用手順

1\. モジュールを使用するプロジェクトの「package.json」ファイルを編集し、`dependencies`にモジュールへのパスを指定します（`file:`でローカルにあるファイルを指定できます）。

```package.json
{
  "name": "app-use-dependencies",
  "version": "0.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "nyamogera <nyamogera＠gmail.com> (nyamogera.net)",
  "license": "MIT",
  "dependencies":{
    "mylib":"file:../mylib"
  }
}

```
2\. 上記編集後、`npm install`コマンドを実行します。

```terminal
$ npm install 
```

![npm-dependencies.png](https://qiita-image-store.s3.amazonaws.com/0/1423/3c80b076-27d2-c66c-fff7-e2c305010d3f.png "npm-dependencies.png")

▲ mylibは通常のパッケージと同様にインストールされる。

- [ソースコード(GitHub)](https://github.com/nyamogera/making_typescript_library/tree/master/app-use-dependencies)

# まとめ
どちらを使うかは、モジュールの更新頻度や大きさによって変わると思います。モジュールが未成熟で頻繁に更新がかかっていたり、モジュールが大きく`npm install`にコストがかかるのであれば`npm link`を使うと良いでしょう。モジュールすでに成熟してて更新がそこまでかからなかったり、モジュールが小さく`npm install`にコストが少ないのであれば、`dependencies`に指定するほうが無難だと思います。


# 参考にした記事
- [npm linkが意外と便利だった - TEJI TECH BLOG](http://www.tejitak.com/blog/?p=1535)

- [npm 2.0.0でローカルモジュールを使ってrequire('../../../')を回避する - Web Scratch](http://efcl.info/2014/10/04/npm2-local-module/)
Alpine Linux で DNS設定が消えるのを解消する

何度も setup-dns で設定しても /etc/resolv.conf 消されます。

/etc/network/interfaces いじったり
openresolv 入れて設定してみたり
NetworkManager 止めてみたり
あれこれやりましたがやっぱりダメでした・・・

そこで諦めてchattrを使おうとしましたが Alpine の busybox には入ってない？

本家からDLして追加しました。

#chattrをインストール
 cd /bin/
 wget https://busybox.net/downloads/binaries/1.21.1/busybox-x86_64
 chmod 755 busybox-x86_64 
ln -s /bin/busybox-x86_64 chattr

#immutable属性を付与
 setup-dns -d localhost -n 8.8.8.8
 chattr +i /etc/resolv.conf 


#補足
変更するにはいったんimmutable属性を外して編集する

 chattr -i /etc/resolv.conf

 setup-dns -d localhost -n 8.8.4.4
もしくは
 vi /etc/resolv.conf 

 chattr +i /etc/resolv.conf
DeviseとRansack-->active_admin. Undefined Method "-eq"というerrorが出た時の対処法

gem 'active_admin' をインストールして、設定をして管理したいモデルを読み込ませて
いざ、開いてみると colomn名 or method名 + "-eq" というerrorが吐かれた。
そんなの定義した覚えはなかったのに。。分からないので調べるとよくあるみたい？

has_manyやbelongs_toの多対多のリレーションと関係があるらしい。。

そこで

参考サイト！
http://stackoverflow.com/questions/21707959/how-to-fix-ransack-undefined-method-eq-when-using-activeadmin-with-through


app/admin/読み込んだmodel名.rbのファイル内を編集。
以下を追記

```lang:app/admin/user.rb
remove_filter :(例 user_roles  <--has_many, throughで定義したやつ
```

見てわかるようにerrorになってるcolumn等をfilterから外してあげると、解決できて管理画面も表示できる。
<br />
ちなみに僕の場合,テーブルに作ったカラム名や自動的に作られる :created_at, updated_at　とかも引っかかって"created_at-eq"(はっきり覚えてないけど)みたいな感じで errorになってたので、これもfilterから外してあげる。

こんな感じ↓

```lang:app/admin/user.rb
remove_filter :start_time, :end_time, :created_at, :updated_at
```


avtive_adminの表示コラムを制限したいなどのカスタマイズは、こちらの方の投稿が大変参考になりました。ありがとうございました。
http://qiita.com/sa-wa-m/items/f999b82da2647bb4d513
http://qiita.com/hirooooooo/items/d1c4d7b93faf2683ba4d

active_adminのassetsが全体に反映される時の対処法はこちらが参考になりました。
http://blog.supermomonga.com/articles/rails/rails-activeadmin-css-issue.html#

以上。
MySQL sandbox note


# install

via centos7

```
mkdir bin && cd ~/bin
curl -LOk http://xrl.us/cpanm
chmod +x cpanm
which env
vim cpanm #<-- fix shebang

# perl mods via RPM
yum install perl-ExtUtils
yum install perl-ExtUtils-Install
yum install perl-Data-Dumper

# linux mods
yum install libaio

# cpanm other mods
./cpanm Test::More
./cpanm MySQL::Sandbox
```

And .bash_profile

```
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin

export PATH
export SANDBOX_AS_ROOT=1
```

# use it!
```
curl -LO  http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.29-linux-glibc2.5-x86_64.tar.gz
make_replication_sandbox --how-many-slaves=2 mysql-5.6.29-linux-glibc2.5-x86_64.tar.gz
```

default --how-many-slaves = 2

## login
`sandboxes/rsandbox_mysql-5_6_29/node1/use`

# Refs
http://search.cpan.org/~gmax/MySQL-Sandbox-3.1.05/lib/MySQL/Sandbox.pm
CASA4.5でNRO/FORESTデータを解析する

# スクリプト例

```py:reduction.casa.py
#
# CASA Version 4.5.2 (r36115)
#

nrofile = 'cyg1xa.Cyg1.20160113175731.16.Y'

# 下準備
# ======

# scan table 形式で NRO 生データを読み込む
# ---------------------------------------
st = sd.scantable(nrofile, average=False, freqref='VREF')

# ASAP 形式で保存する
# -------------------
st.save(nrofile + '.asap')


# リダクション
# ===========

# ベースラインを引く
# -----------------
kw1 = {
    'infile': nrofile + '.asap',
    'outfile': nrofile + '.A01.blfit.asap',
    'spw': '0',    # '0' -> Array01, '1' -> Array02, ...
    'maskmode': 'auto',
    'blfunc': 'poly',
    'order': 1,
}
sdbaseline(**kw1)

# スケーリングを補正する
# --------------------
kw2 = {
    'infile': kw1['outfile'],
    'outfile': nrofile + '.A01.scale.asap',
    'factor':  1.0,  # 実際は適切なファクターを使います
}
sdscale(**kw2)

# MS2 形式で保存する
# -----------------
kw3 = {
    'infile': kw2['outfile'],
    'outfile': nrofile + '.A01.scale.ms',
    'outform': 'MS2',
}
sdsave(**kw3)

# 実際は、ベースラインを引く、スケーリングを補正する、MS2 形式で保存する、
# 一連の作業を、全てのアレイ、全ての観測に対して実行します。

# イメージングする
# ---------------
use_data_list = [
    nrofile + '.A01.scale.ms',
    nrofile + '.A05.scale.ms',
    nrofile + '.A09.scale.ms',
    nrofile + '.A13.scale.ms',
]

kw4 = {
    'infiles': use_data_list,
    'outfile': 'cyg1xa.Cyg1.20160113175731.16.Y.12CO.ms',
    'spw': '0,4,8,12',
    'gridfunction': 'GAUSS',
    'cell': ['8.5arcsec', '8.5arcsec'],
    'mode': 'velocity',
    'nchan': 251,
    'start': '-150km/s',
    'width': '1km/s',
}
sdimaging(**kw4)

# FITS 形式で書き出す
# ------------------
kw5 = {
    'imagename': kw4['outfile'],
    'fitsimage': 'cyg1xa.Cyg1.20160113175731.16.Y.12CO.fits',
    'velocity': True,
    'dropdeg': True,
}
exportfits(**kw5)
```

# 関数リファレンス
引数の詳細などは下記から。

- scan table 形式で NRO 生データを読み込む
    - sd.scantable : http://casa.nrao.edu/docs/CasaRef/sd.scantable-Tool.html
- ASAP 形式で保存する
    - st.save : http://casa.nrao.edu/docs/CasaRef/sd.scantable.save.html#x1141-11590005.1.2
- ベースラインを引く
    - sdbaseline : http://casa.nrao.edu/docs/TaskRef/sdbaseline-task.html
- スケーリングを補正する
    - sdscale : http://casa.nrao.edu/docs/TaskRef/sdscale-task.html
- MS2 形式で保存する
    - sdsave : http://casa.nrao.edu/docs/TaskRef/sdsave-task.html
- イメージングする
    - sdimaging : http://casa.nrao.edu/docs/TaskRef/sdimaging-task.html
- FITS 形式で書き出す
    - exportfits : http://casa.nrao.edu/docs/TaskRef/exportfits-task.html
rake db:migrate でエラー"already extist"が吐かれた時、Migration file内にいつも居る***<NO FILE>***の対処法メモ


プログラミング歴=Ruby On Rails歴(8週間目)
個人メモ


rake db:migrate でエラー"already extist"が吐かれた時、
Migration file内によく居る"NO FILE"の対処法メモ

原因はdown->rmという手順を踏まずにうっかり消しちゃうから
よくやる上その度に対処法思い出せず調べてるので(笑)自分のためにメモ。



<br />
<br />
①コマンドで

```lang:ターミナルコマンド
rake db:migrate:status
```



<br />
<br />
②***NO FILE***となっているmigration fileの左の番号をコピー
_temp.rb　という名前(任意)にする

```lang:ターミナルコマンド
vim db/migrate/****14桁の数字****_tmp.rb
```


<br />
<br />
③vimで...._tmp.rbファイル内を下記のように編集

```lang:vimコマンド
class Tmp < ActiveRecord::Migration
  def change
  end
end
```
w(保存)->q(終了)





<br />
<br />
④さっきのmigration faleの名前が反映されてることを確認

```lang:ターミナルコマンド
rake db:migrate:status
```




<br />
<br />
⑤変更したファイルのVERSION(14桁の数字)を入れてdownする

```lang:ターミナルコマンド
rake db:migrate:down VERSION=*****14桁の数字*****
```




<br />
<br />
⑥ファイルを削除

```lang:ターミナルコマンド
rm db/migrate/****14桁の数字****_tmp.rb
```




<br />
<br />
⑦ステータスで削除できたことを確認。

```lang:ターミナルコマンド
rake db:migrate:status
```





<br />
<br />
終了。

参考サイト
https://joppot.info/2014/10/16/2104
いつもお世話になりました。ありがとうございました。
Windows 10インストールメディア作成

目的
---
Windows 10のインストールディスクを作成する。
※Enterprise Editionは対象外

※参考までに個人のWindows 8 HomeがインストールされていたLenovo ThinkPad X1 Carbon (Model:3443CTO/プロダクトキーはUEFI BIOSファーム内に記録)を本手順で作成したインストールメディアでクリーンインストールしましたが、ライセンス認証は自動的に行われました。

Windows 10インストールディスク作成手順
---
1. Microsoftの以下サイトから"MediaCreationTool.exe"をダウンロードし、起動する
https://www.microsoft.com/ja-jp/software-download/windows10
<br>

2. ［同意する］を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/15cd424f-8ff3-0fa2-b12f-67d7591078ec.png)
<br>

3. ［他のPC用にインストールメディアを作る］にチェックを入れ、［次へ］を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/524dbee9-b688-4a9a-5cc0-c89610df2461.png)
<br>

4. ＜言語＞、＜エディション＞、＜アーキテクチャ＞を設定し、［次へ］を選択
※アップグレードの場合、アップグレード元のPCと同じ＜言語＞、＜エディション＞、＜アーキテクチャ＞を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/3ca91b27-b3be-a71b-b419-ef2dad5c306d.png)
<br>

5. ［OK］を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/1fe41595-fb0d-647d-dfa4-64d92436f20a.png)
<br>

6. ［USBフラッシュドライブ］、［ISO］ファイルのどちらかにチェックを入れ、［次へ］を選択
※今回は［USBフラッシュドライブ］を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/36b00fa5-e2ac-65d2-31dd-4f73d18c3e98.png)
<br>

7. 利用する＜ドライブ＞を選択し、［次へ］を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/1ae3fecb-8b54-c954-c237-430fd334587b.png)
<br>

8. ダウンロードが完了するまで待ち、［次へ］を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/ecc2205d-bd31-c46f-adf2-ef62c9e3cd35.png)
<br>

9. ［完了］を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/981c03ae-2416-f40d-0b33-afed19ded039.png)

利用環境
---
Windows 8.1 Home
VimperatorでJavaScriptのON/OFFをトグルする

`about:config`の`javascript.enabled`をトグルさせるVimperatorの設定です。


```js:toggleJavaScript.js
//Toggle JavaScript On/Off
;(function() {
  let name = "javascript.enabled"
  options.invertPref(name)
  liberator.echomsg(name + "=" + options.getPref(name))
})();
```


```vim:.vimperatorrc
command! toggleJavaScript :source ~/.vimperator/scripts/toggleJavaScript.js
nnoremap <Leader>j :toggleJavaScript<CR>
```

##参考資料
[vimperator の :set javascript / :set nojavascript で JS の on/off 切り替え](http://subtech.g.hatena.ne.jp/secondlife/20090217/1234868635)
Vagrant で default: Warning: Remote connection disconnect. Retrying... のまま起動しない

# 原因は無線LANの線もあった

http://ja.stackoverflow.com/questions/11880/vagrant-up%E3%81%8Cconnection-timeout-retrying-%E3%81%8B%E3%82%89%E9%80%B2%E3%81%BE%E3%81%AA%E3%81%84/15021#15021

![image](https://qiita-image-store.s3.amazonaws.com/0/37611/7b8dc3df-523c-b704-0520-13faca571509.png)
Check! Azure Web Apps でオンラインエディタ Visual Studio Online "Monaco" を使おう！

こんにちは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
やっと Azure Web Apps で使える Visual Studio Online のオンラインエディタの利用方法を知ることができました！！（遅

今までは、探しても、どうしても「Visual Studio Team Services」の方にたどり着き見つからずじまいだったのですが、やっと見つけました。

Azure Web Apps で Visual Studio Online "Monaco" を有効にする方法
====
ポータルで Web Apps の画面を開きます。

Tools > DEVELOP > Visual Studio Online で Visual Studio Online の設定画面が表示されるので、 `On` にしてください。しばらくすると、 `Go` リンクが表示されるので、クリックしましょう！
![20160313_azure_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/3a0ef32f-9085-c915-4afd-195978876d2f.png)

ぱぱーん！

ヾ(o´∀`o)ﾉ

![20160313_azure_003.png](https://qiita-image-store.s3.amazonaws.com/0/3812/49a43003-265f-df49-0fe6-aa08853231ce.png)

書き込んだ内容は、即時反映のようです。いやー、オンラインエディタは便利ですね！！

Epilogue - おわりに
====
ん、この画面、どっかでみたことあるな…？

(*‘∀‘)ﾉ Visual Studio Code だー！

ということで、オンラインエディタ好きな私としてはこれでAzureの勉強もはかどりそうです！祝！
Rubyインストール

#Ruby
Ralilsのインストールにハマったこと...

$sudo gem install rails

ができなくて、何が悪かったかというと

・必要なライブラリが足りなかった

でした。

$ sudo yum install zlib-devel openssl-devel libffi-devel -y

後に再実行。ダメでした。

$ make clean
$ ./configure
$ make
$ sudo make install

の順に実行。その後に再実行でできました。
SCSSでBrainf*ckインタプリタ

SASS、SCSSの勉強に作ってみました。実行環境によって動作が違って大変でした……。

##制作過程

まず、文字列のn文字目の文字を返す関数を作ります。環境によっては動かなかったりするので、色々調整します。

```scss
@function str-nth($str, $num) {
  @return str-slice($str, $num, $num);
  // 動かない場合１
  @return str-slice($str, $num, $num - str-length($str));
  // 動かない場合２
  @return str-slice(str-slice($str, $num - 1, $num), 2, 3);
}
```

次に、10進数を16進数に変換する関数を作ります。

```scss
@function dec2hex($num) {
  @if ($num == 0) {
    @return "0";
  }
  $digit: "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f";
  $out: "";
  @while $num > 0 {
    $hex: $num % 16;
    $out: nth($digit, $hex + 1) + $out;
    $num: ($num - $hex) / 16;
  }
  @return $out;
}
```

これを何に使うかというと、Unicodeのコードポイントで表した文字列を返す関数を作るためです。

```scss
@function char($codepoint) {
  @return unquote("\\") + dec2hex($codepoint);
}
```

そして、関数本体を作ります。

```scss

@function bf($src) {
  // 変数宣言
  $array: (0, 0);  // 配列。(0)だけだとリスト扱いされない場合がある
  $p: 1; // ポインタ
  $i: 1; // ソースコードの何文字目か
  $out: unquote(""); // 出力結果。「"」が付かない文字列にする

  // 1文字ずつループ
  @while $i <= str-length($src) {
    $c: str-nth($src, $i);
    @if $c == ">" {
      $p: $p + 1;
      @if $p > length($array) {
        $array: append($array, 0); // ポインタが端を超えたら配列を増やす
      }
    }
    @else if $c == "<" {
      $p: $p - 1;
      @if $p < 1 {
        @return "Error!"; // ポインタが負になったらエラー
      }
    }
    @else if $c == "+" {
      $array: set-nth($array, $p, (nth($array, $p) + 1) % 256);
    }
    @else if $c == "-" {
      $array: set-nth($array, $p, (nth($array, $p) + 255) % 256);
    }
    @else if $c == "." {
      $out: $out + char(nth($array, $p));
    }
    @else if $c == "," {
      // 入力の実装はなし
    }
    @else if $c == "[" {
      @if nth($array, $p) == 0 {
        $b: 1; // カッコの対応を数える
        @while $b != 0 {
          $i: $i + 1;
          @if $i > str-length($src) {
            @return "Error!"; // 正しく対応していなかったらエラー
          }
          @else if str-nth($src, $i) == "[" {
            $b: $b + 1;
          }
          @else if str-nth($src, $i) == "]" {
            $b: $b - 1;
          }
        }
      }
    } @else if $c == "]" {
      @if nth($array, $p) != 0 {
        $b: -1; // 対応するカッコを数える
        @while $b != 0 {
          $i: $i - 1;
          @if $i < 1 {
            @return "Error!"; // 正しく対応していなかったらエラー
          }
          @else if str-nth($src, $i) == "[" {
            $b: $b + 1;
          }
          @else if str-nth($src, $i) == "]" {
            $b: $b - 1;
          }
        }
      }
    }
    $i: $i + 1;
  }
  // クオートで囲んで返す
  @return unquote("\"") + $out + unquote("\"");
}

```

表示してみます。

```scss
$helloworld: "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.";

#log::before {
  content: bf($helloworld);
}
```

```css:コンパイル結果
#output::before {
  content: "\48\65\6c\6c\6f\2c\20\77\6f\72\6c\64\21";
}
```

```html:HTML
<div id="output"></div>
```

```text:表示結果
Hello, world!
```

SASS、SCSSはチューリング完全なんですね。

##実行結果

https://jsfiddle.net/vtw8jdyk/
OpenFrameworksをQt CreatorでHello,worldする


##参考サイト
[OpenFrameworks公式ホームページ](http://openframeworks.cc)
[Qt Creator公式ホームページ](http://www.qt.io/ide/)

##環境
OS:MacOSX 10.11.2
OpenFrameworks:0.9.3
Qt Creator:3.5.1

##Step1 OpenFrameworks及びQt Creatorをダウンロード
以下のURLより、OpenFrameworks、QtCreatorをダウンローします。

[OpenFrameworksダウンロード](http://openframeworks.cc/download/)
[Qt Creatorダウンロード](http://www.qt.io/download-open-source/#section-6)

##Step2 install_template.shを実行
ダウンロードしたOpenFrameworksフォルダ内に、script -> qtcreator -> install_template.shがあるので、以下のコマンドより実行します。

```bash
	chmod a+x install_template.sh
	./install_template.sh
```

##Step3 コンパイラをclang gccに設定

Qt creatorを起動し、設定 -> ビルドと実行 ->	キット -> デスクトップ（デフォルト）より、コンパイラをClangに設定します。以下のスクリーンショットを参考にしてください。

![設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/115251/fbaaa44f-9fde-19ce-53ab-9bebcae0caac.jpeg "設定.jpg")

##Step4 以下のコードを記入し、実行

以下のコードを実行し、Qt creatorのアプリケーション出力ウィンドウにHELLO,OPENFRAMEWORKS!!が出力されれば完了です。

```cpp:ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){

    std::cout << "HELLO,OPENFRAMEWORKS!!" << std::endl;

}

```
ズンドコキヨシ with D

[元ネタ](https://twitter.com/kumiromilk/status/707437861881180160)を読んで一番最初に思いついたやり方です。  

```d:main.d
import std.stdio;
import std.random;

void main(){
	string[] words = ["ズン","ドコ"];
	int[] history = [];
	while(true){
		history ~= dice(1,1);
		words[history[$-1]].write();
		if (5 <= history.length) {
			if (history[$-5 .. $] == [0,0,0,0,1]){
				"キ・ヨ・シ！".writeln();
				return;
			}
		}
	}
}
```
phpenvでPECLからインストールするpecl-buildのオリジナルが壊れているのでfork版を使う

例えば``CakePHP 3``をインストールするとき、``ext-intl``が必要と出ます。これはPHPのビルド時に指定するか、``PECL``からインストールするかしなくてはなりません（ディストリビューション版PHPなら``php-intl``パッケージが用意されている場合もあります）。

PHPを複数バージョン共存させることができる``phpenv``環境下でPECLからインストールするには、**``pecl-build``**という
``phpenv``用プラグインが利用できます。

その``pecl-build``ですが、**オリジナルの https://github.com/crocos/pecl-build.git は不具合が修正されておらず動かない場合がある**ので、フォークされた方を利用します。

参考：http://sorehane.blog.jp/archives/1003227022.html

参考記事のようにやっても正常に動かない。

参考2：https://github.com/crocos/pecl-build/pulls

みんな修正案をプルリクエストしているがマージされない。どうやらHTTPレスポンスヘッダの``'Content-Disposition'``をgrepコマンドの環境変数依存で取得できたりできなかったりするのが原因らしいですね。

というわけで、実際の運用として、例えば``phpenv``が``${PHPENV_ROOT}``に入っているとして、

```
cd ${PHPENV_ROOT}/plugins/
git clone https://github.com/felipecwb/pecl-build.git 
cd
phpenv pecl intl
```

という感じとなります。

（ ``${PHPENV_ROOT}/plugins/php-build/share/php-build/default_configure_options``にビルドオプションとして書いておくほうが取りこぼしないのでお勧めです）
SwiftでQRコードを生成してみた

SwiftでQRコードを生成してみました。

# 環境

* Xcode 7.2.1
* Swift 2.1.1

# 結果

![image](https://qiita-image-store.s3.amazonaws.com/0/21321/4a9d540c-1c24-5c47-4a56-b70f297b18ae.png)

# コード

```swift

import UIKit
import CoreImage

var url = "http://www.yahoo.co.jp/"

// NSString から NSDataへ変換
let data = url.dataUsingEncoding(NSUTF8StringEncoding)!

// QRコード生成のフィルター
// NSData型でデーターを用意
// inputCorrectionLevelは、誤り訂正レベル
let qr = CIFilter(name: "CIQRCodeGenerator", withInputParameters: ["inputMessage": data, "inputCorrectionLevel": "M"])!


let sizeTransform = CGAffineTransformMakeScale(10, 10)
let qrImage = qr.outputImage!.imageByApplyingTransform(sizeTransform)

```
Hyper-Vレプリカのネットワーク構成について

実現したいと考えたこと
---
Hyper-Vホストサーバーにて通信用途別に利用するNICを分割したいと考えた。
想定したNIC割り当て、通信用途は以下の通り。

| NIC | 通信用途 | 備考 |
|-----|---------|------|
|eth1|Hyper-Vホスト管理用|Default Gateway設定有り|
|eth2|Hyper-Vゲストマシン用|-|
|eth3|Hyper-Vレプリカ用|-|



結果
---
Hyper-VホストサーバーにてHyper-Vレプリカ用として利用するNICを意図的に割り当てる事は出来ない模様。
どうやらHyper-Vレプリカはレプリケーションに利用可能なネットワークを自動的に検出し、利用している。
Hyper-Vホスト管理用にeth1、Hyper-Vゲストマシン用にeth2のNICを割り当てた構成の場合、Hyper-Vレプリカの通信としてはHyper-Vホスト管理用のeth1のNICが利用される。
※上記動作はHyper-Vレプリカが他サイトへのレプリケーションを想定されている点、Default Gatewayが1つしか設定出来ない点に関連していると考えられる。

ちなみにHyper-Vホスト管理用とHyper-Vゲストマシン用のNICの分割については仮想ネットワークスイッチ作成時に以下のチェックボックスにてHyper-Vホスト管理用に利用するか、ゲストマシンに該当のネットワークスイッチをバインドするか考慮し、設定する事で実現可能。

- [ ] 管理オペレーティングシステムにこのネットワークアダプターの共有を許可する

　① Hyper-Vホスト管理用
　　　チェックを入れ、各ゲストマシンに該当の仮想ネットワークスイッチをバインドしない
　② Hyper-Vゲストマシン用
　　　チェックを入れず、各ゲストマシンに該当の仮想ネットワークスイッチをバインドする

参考
---
Technet Library (https://technet.microsoft.com/en-us/library/dn550728.aspx)
※上記参考ページの一部を抜粋し、引用
>Hyper-V Replica automatically discovers and uses available network interfaces to transmit replication traffic.

利用環境
---
Windows Server 2012 R2
Hyper-V
Node.js簡易HTTPサーバー(3行)

#コード

HTTPサーバー置きたい場所に下記を置いて実行

```js:app.js
var app = require('connect')();
app.use(require('serve-static')(__dirname))
app.listen(3000);
```

```shell-session

 $ node app.js

```

#確認環境
Node v0.12.7 or v4.3.2
connect@3.4.1
serve-static@1.10.2

Node.jsは公式(https://nodejs.org/en/ ) からインストーラー
その後下記ターミナルからコマンド叩いてインストール
npm install connect
npm install serve-static
ズンドコキヨシ with Nemerle

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>

Nemerleでやってみた(´・ω・\`)　（GetZunで1秒間のウェイトを入れてます．嫌ならば，`Thread.Sleep(1000)`を消して，Randomクラスのコンストラクタに，毎回値が異なるシード値を入れてやればいいでしょう(´・ω・\`)）

```nemerle:zundoko
using System;
using System.Threading;
using System.Console;
using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;

GetZun(randMaker : Random) : string {
        Thread.Sleep(1000);
        def s = if(randMaker.Next(2) == 0 ) "ズン" else "ドコ";
        Write(s + " ");
        s;
}

Main() : void
{
   def randMaker = Ramdom()
   def MainLoop(_) {
      | ["ズン","ズン","ズン","ズン","ドコ"] => true
      | _::xs when xs.Length > 3  => MainLoop(xs + [GetZun(randMaker)])
      | x::xs => MainLoop((x :: xs) + [GetZun(randMaker)])
   }
   _ = MainLoop([GetZun(randMaker)]);
   WriteLine("キ・ヨ・シ！");
}
```
docker-composeでnginx, fluentd, nodeサーバの構成作ってみた

かなり昔に触って以来、そんなに触る機会もなくて放置してた docker の再入門を兼ね、nginx, fluentd, node(これはなんでもいいけど) の構成を作ってみました。

## 成果物

https://github.com/macoshita/docker-compose-example

`docker-compose build` して `docker-compose up` すると下記のような動作をします。

- node のサーバが立ち上がる
- nginx が起動、8080 ポートで待ち受け、node サーバにリバースプロキシ
- fluentd が起動、アクセスログを標準出力に吐き出す

## 注意

実運用に耐えられるものにはなってないです。
nginx の設定とかかなり適当、fluentd は標準出力に吐き出すだけ。
「個人サービスを作るときに VPS などにサクッと環境を立ち上げられる」の目標でこれから拡張していくつもりです。

## いろいろメモ

- docker のバージョン要確認
    - 私の環境のバージョンについては README に記載してます
    - 私の環境にはやたら古い boot2docker 入ってたりして大変でした。そういう人は、綺麗にアンインストールして VM とかも削除して、docker toolbox を入れるのが早そうです。
- Alpine Linux が DL 速くていい感じ
    - ハマって数日経過してるうちに公式リポジトリの nginx が alpine 対応してたので入れ替えたけど、すげーDL速い
- docker の logging drivers という機能で、fluentd の導入がとても楽になったが、結構はまった
    - まず docker のバージョンが古いせいで、ひとハマリ
    - 次に fluentd の仕組み（もしかしたら logging driver の仕組み？）でふたハマリ
        - nginx のログが一定量たまらないと、fluentd の標準出力に出てこない（curl で複数回アクセスしないとログに出てこない）
- docker-compose は便利
    - 複数個のコンテナを立ち上げて連携させるのが当然メイン機能、とても便利
    - 副次的な効果として、一度 docker-compose.yml 書いちゃうと build, up, stop, rm など覚えやすいコマンドでビルドや削除ができるのが良い
        - 昔は `docker rm (docker ps -a -q)` こういうことしてた記憶がある
herokuに秘密の設定ファイルを記述する場合


# 背景
ruby on railsを用いて [**YouTube DATA API v3**](https://developers.google.com/youtube/v3/)で `DEVELOPER_KEY` を記述する際に、gitで共有したくないため、 `.gitignore` に設定ファイルを追加してherokuにアップロードしようとした。
しかし、herokuでは `git push` するたびに、全ファイルを入れ替えるため、別でアップロードした際に毎回消えてしまう。

そのため、`heroku config` を用いて設定値を参照する方法と、ローカルではファイルを参照する方法に場合分けした。

なお、heroku側では事前に以下の設定値を定義した。
`YOUTUBE_DEVELOPER_KEY`

## 場合分け

```ruby
  if ENV["YOUTUBE_DEVELOPER_KEY"].nil?
      # for local
      setting = YAML::load_file("app/secret/setting/youtube.yml")
      YOUTUBE_DEVELOPER_KEY = setting["YOUTUBE_DEVELOPER_KEY"]
  else
      # for heroku
      YOUTUBE_DEVELOPER_KEY = ENV["YOUTUBE_DEVELOPER_KEY"]
  end
```
JavaScriptのスコープがわかっていなくて無限ループ

# はじめに
とあるSlacknにメッセージを出力するgsスクリプトにちょっと書き足したら出力が無限ループするようになりました。

# なんで！？
無限にループするような処理など処理など書いていないのにどうしてこうなったのでしょう。

# 問題のコード

```js:
function myFunction() {
  for(i=0; i<10; i++){
    Logger.log('out i =' + i);
    child1();
  }  
}

function child1(){
  for(i=0;i<4;i++){
    Logger.log('in i =' + i);
  }
}
```

ログを見ると。。

```text
[16-03-13 16:17:14:563 JST] out i =0
[16-03-13 16:17:14:564 JST] in i =0
[16-03-13 16:17:14:565 JST] in i =1
[16-03-13 16:17:14:566 JST] in i =2
[16-03-13 16:17:14:566 JST] in i =3
[16-03-13 16:17:14:567 JST] out i =5
[16-03-13 16:17:14:567 JST] in i =0
[16-03-13 16:17:14:568 JST] in i =1
[16-03-13 16:17:14:569 JST] in i =2
[16-03-13 16:17:14:570 JST] in i =3
[16-03-13 16:17:14:570 JST] out i =5

```

おーchild1()から戻ってくるとiがいつも４になっちゃって無限ループ！

ということで、 `for(i=0;..` だとiがグローバル変数になって、内側の関数内のiも同じiを参照しちゃうんですってね。奥様。JavaScriptって普通に書くとブロックスコープにならないのね。

ってことで `for(var i=0;...` って書けば解決。
スコープわからないなら、、、というかいつもvarちゃんとつけましょうね。って話。

とほほ。。
Tarのライブラリをダウンロード

# Tar解凍するには

・下記ページの237 KBのところにリンクがあるのでそこをクリックすればDllを含んだzipがダウンロードされる。
http://icsharpcode.github.io/SharpZipLib/

・展開後、指定の.Netバージョンに一致したフォルダを開くと
　**ICSharpCode.SharpZipLib.dll**　がある。
Unityで紙をめくるアニメーションするシェーダー作った

# [紙をめくるアニメーションするシェーダー作った](http://esbrog.hatenablog.com/entry/2016/03/13/130506)

本とかで紙をめくるような表現をさせたかったので作ってみました。
詳細は[こちらのページ](http://esprog.hatenablog.com/entry/2016/03/13/130506)で。

このシェーダーを適用すると、以下の様な感じにできます


![1](http://cdn-ak.f.st-hatena.com/images/fotolife/r/radwimps-september/20160313/20160313022004.gif)

![2](http://cdn-ak.f.st-hatena.com/images/fotolife/r/radwimps-september/20160313/20160313152038.gif)

![3](http://cdn-ak.f.st-hatena.com/images/fotolife/r/radwimps-september/20160313/20160313152039.gif)

コードは以下で公開しています。

[Gist](https://gist.github.com/EsProgram/c26402199070b2b356c6)
ec2で初期パスワードを設定する

1. 从aws获得.pem文件
2. 使用puttygen将.pem文件转化为.ppk文件
   conversions->import key
   save private key

3. "centos"ユーザとキーファイルでログインする。
4. sudo su -でrootユーザに切り替える。
5. passwdでrootユーザのパスワードを設定する。
6. /etc/ssh/sshd_configを編集し、rootユーザのパスワードでのログインを許す。
7. rootユーザでログインしている時に、passwd centosコマンドで"centos"ユーザのパスワードを設定する。
8. 重启服务
   systemctl restart sshd.service
これで、centosとrootユーザ両方キーファイル無しでログインできるようになった。
HTMLのテンプレート

HTMLをゼロベースでかきはじめる場合のテンプレート。
検索しても説明付きでヒットするものがなかったのでリマインド用に。

***

```html
<!DOCTYPE html>　…左記はHTML5の場合。
<html lang="ja">　…日本語のサイトであることを指定。
<head>
    <meta charset="UTF-8">　…文字コードの指定。
    <link rel="stylesheet" type="text/css" href="style.css" />
    <title>タイトル</title>
</head>
<body>
    コンテンツ
</body>
</html>
```

***
ChromeでのWebGLの有効化

WindowsのChromeで設定→詳細から以下のチェックボックスを有効にして再起動すれば（対応しているなら）WebGLが有効になります。

![enablewebgl.png](https://qiita-image-store.s3.amazonaws.com/0/10584/9bf4d9dc-ad8d-177a-1c45-e962603111e2.png)

以下サンプルページで三角形ポリゴンが描画されれば有効になっています。

https://wgld.org/s/sample_002/
EP19 Provide Optional Behavior with Keyword Arguments

> - Function argument can be secified by position or by keywrod.
- Keywords make it clear what the purpose of each argument is when it would be confusing with only positional arguments
- Keyword arguments with default value make it easy to add new behaviors to a function, especially when the function has exsisting callers.
- Optional keyword arguments should always be passed by keyword instead of by position.

> Effective Python

```python
def remidner(number, divisor):
    return number % divisor

```

It can be called by

```python

reminder(20,7)
reminder(20, 7)
reminder(number=20, divisor=7)
reminder(divisor=7, number=20)
```

This expression is confusing.

```python
twitter_search('@obama', False, 20, True)

```


```python
twitter_search('@obama', retweets=False, numtweets=20, popular=True)
```
Is slightly (microseconds) slower but is worth it for the code clarity and developer time savings.
ワンライナーずんどこ@Ruby

HashにLambda式載せてみた

```rb
z,d=%W|ズン ドコ|;c=0;{z=>->{c+=1},d=>->{c=c<4?0:-1}}[p [z,d].sample][] until c<0;p"キ・ヨ・シ！"
```

テキスト出力にputsでなくpを使っているのは文字数削減だけではなく、引数をそのまま返してくれるから。
ズンドコキヨシ with Elixir(二番煎じ)

乗るしかない、[このビックウェーブに！](http://qiita.com/B73W56H84/items/519e27a1aed5e6d5304f#%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%E8%AA%AD%E3%81%BF%E3%81%9F%E3%81%84)

```ex
defmodule Kiyoshi do

  @zun "ズン"
  @doko "ドコ"
  @kiyoshi "キ・ヨ・シ"

  def zundoko(), do: _zundoko(0, _gen_word, "")

  defp _zundoko(0, word = @zun,  acc), do: _zundoko(1, _gen_word, acc <> word)
  defp _zundoko(0, word = @doko, acc), do: _zundoko(0, _gen_word, acc <> word)
  defp _zundoko(1, word = @zun,  acc), do: _zundoko(2, _gen_word, acc <> word)
  defp _zundoko(1, word = @doko, acc), do: _zundoko(0, _gen_word, acc <> word)
  defp _zundoko(2, word = @zun,  acc), do: _zundoko(3, _gen_word, acc <> word)
  defp _zundoko(2, word = @doko, acc), do: _zundoko(0, _gen_word, acc <> word)
  defp _zundoko(3, word = @zun,  acc), do: _zundoko(4, _gen_word, acc <> word)
  defp _zundoko(3, word = @doko, acc), do: _zundoko(0, _gen_word, acc <> word)
  defp _zundoko(4, word = @zun,  acc), do: _zundoko(4, _gen_word, acc <> word)
  defp _zundoko(4, word = @doko, acc), do: _zundoko(5, _gen_word, acc <> word)

  defp _zundoko(5, _, acc), do: acc <> @kiyoshi

  defp _gen_word(), do: Enum.random [@zun, @doko]
end
```

```
iex(30)> Kiyoshi.zundoko
Kiyoshi.zundoko
"ズンドコドコズンズンズンズンドコキ・ヨ・シ"
```

キ・ヨ・シ！キ・ヨ・シ！
Xcodeとgitのディレクトリ構成を合わせる

# はじめに
Xcodeで開発をするときにファイルの管理はgitを使っています。Xcodeでファイルを編集してそれをターミナルからコマンドラインでgitへコミットするという感じです。

単純にファイルを修正したりする分にはちゃんとgitの方にも差分が反映されていて問題ないのですが、困ったことにXcode上で新しいディレクトリを追加したりするとそれがgit上には反映されていない、、、

Xcodeと合わせてgitの方も手動でディレクトリ追加などやればいいのですが、、
できれば自動で反映されると嬉しいなぁとおもっていたらちょうどいいのがありました。

# Synx
上記悩みをまさに解決してくれるものです！
→ [synx](https://github.com/venmo/synx)

使い方は簡単でXcodeで適当にディレクトリを作ったりファイルを移動したりして、
その後でターミナルからコマンド一つ打つとgitの方もXcodeのディレクトリ構成と合わせてくれます。

詳しい使い方はこちらにうまくまとまっているのでこちらを参考にすればすぐに導入できます。
→ [Xcodeのファイルを整理する Synx](http://qiita.com/Yuta/items/fdce62fcb871912629ce)


# 理想的なディレクトリ構成
MVC,MVVMなどなど作り方は人それぞれ考え方と共にあると思います。
自分は最近こちらを参考にしてます。
[まだMVC,MVP,MVVMで消耗してるの？ iOS Clean Architectureについて](http://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc)
Clean Architectureと言うらしくドメイン駆動開発(DDD)の考え方に近いようです。

とても分りやすいと思いますし、うまく整理できると思うのでこのディレクトリ構成を参考にしようと思っています。
なのでこんな感じにXcodeのディレクトリを変更することがあればSynxを使うとサクッとディレクトリ構成を合わせられるので便利だなぁと思いました。
rubyで後方から一致した1文字だけ置換する方法

会員が退会したとかでメールアドレスを無効にするために、無理やり別の文字列に置換することがあると思います。
(今回の例では#にしています。)

それを再び有効にするたいにgsubを使って全部変えてしまうと#がローカル部分に使われると元のアドレスに戻らないので、後方から1文字だけ一致したやつだけを置換したいケースがありました。

```rb
irb(main):001:0> mail = 'test#test#example.com'
=> "test#test#example.com"
irb(main):002:0> mail.reverse.sub(/#/, '@').reverse
=> "test#test@example.com"
```

こういう感じで戻しました。

他にいいやり方あれば教えて下さい
これしか思いつかず…
Ruby+例のcurlの証明書でもなぜか解決しない問題


以下は
ruby 2.2.4p230 (2015-12-16 revision 53155) [x64-mingw32]
で検証しています。
## RubyでSSL通信するにはルート証明書が必要
まずは試しにgithubにHTTPSで接続してみる

```bash
ruby -rnet/http -e"Net::HTTP.get URI('https://github.com')"
```

Rubyには信頼された証明書リストがバンドルされていないので多くの環境でエラーがでるはずです
対処法は[curlの人がMozillaのソースから変換した信頼された証明書リスト](https://curl.haxx.se/ca/cacert.pem)
をダウンロードしてそのパスをENV['SSL_CERT_FILE']に入れるのが個人的な見解としてはオススメです
注意点として、require 'openssl'より前に環境変数を設定しないとダメなようです

信頼された証明書リスト自体がHTTPSで配信されてるので外部コマンドを使わないと安全にダウンロードできません。
curl/wgetが使えるならcurl/wgetでいいのですが
Windowsだと標準では入ってないのでpowershell使う方法を参考までに

```rb
# Windows用自動でcacert.pemをダウンロードしてENV['SSL_CERT_FILE']に入れる
certfile = File.expand_path('../cacert.pem', __FILE__)
if !File.exist?(OpenSSL::X509::DEFAULT_CERT_FILE) && !File.exist?(ENV['SSL_CERT_FILE']) && !File.exist?('cacert.pem')
  # コマンド長いので適当に分割
  psmagic = 'powershell -NoProfile -ExecutionPolicy Bypass -Command'
  `#{psmagic} "(new-object net.webclient).DownloadFile('https://curl.haxx.se/ca/cacert.pem','#{certfile}')"`
end
ENV['SSL_CERT_FILE'] = certfile
```

## 証明書入れたし解決!……のはずが
これでgithubを含む多くのHTTPSサイトへの接続ができるようになりました。
ではコレを試してみましょう

```bash
ruby -rnet/http -e"Net::HTTP.get URI('https://www.rapid-ssl.jp')"
```

なんと不思議な事にまだエラーがでます。
(エラーのでない環境の場合は信頼された証明書リストが更新されてない可能性があります)
ではコレは無効な証明書のでしょうか？

## 原因究明
Firefoxでhttps://www.rapid-ssl.jp を開いてみます
あれ？　特に警告やエラーもなく開けてしまいました。
念のため証明書ビューアを開いてみます
![証明書ビューア](https://i.gyazo.com/4d1a288dbf149a8af878ad9d9e9d4395.png)
GeoTrustをルートに持つ普通の証明書に見えます

opensslで接続して証明書チェーンを表示してみます

```bash
openssl s_client -connect www.rapid-ssl.jp:443
```

![openssl](https://i.gyazo.com/90386b013271189a4ab2ad64a7fe9308.png)
……なんか一つ多い

Equifax + SSL + Firefoxでググると、
どうやらEquifax Secure Certificate Authority の証明書はRSA1024bitだったため
信頼された証明書リストから削除されたようです。
普通のブラウザはdepth=2のGeoTrust Global CAが信頼された証明書リストに存在するため
そちらをルートとしてdepth=3 Equifax Secure Certificate Authorityを検証しないのかな

## 応急処置
cacert.pem末尾に
https://www.geotrust.com/resources/root_certificates/certificates/Equifax_Secure_Certificate_Authority.pem
の内容を追加する事でとりあえずエラーはなくなります。

ただしSSL詳しくないので断言できませんが、セキュリティリスクがありそうです。


## 追記 2016/03/14
CentOS 7 on Vagrantで試したところデフォルト状態だと
/etc/pki/tls/cert.pem (実体は/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem)
にある信頼された証明書リストを用いるようでエラーなく表示されたが、
/etc/pki/tls/cert.pem をhttps://curl.haxx.se/ca/cacert.pem で上書きするとエラーが出るようになりました。
google AdMobのスマートバナーをswiftで実装する

# 概要

AdMobのバナー広告を配置して、PhoneとTabletでそれぞれの広告の高さを変更出来るように実装しました。

この記事を読む前に、[Admobのスタートガイド](https://developers.google.com/admob/ios/quick-start?hl=ja#prerequisites)に目を通してください。

# ソースコード

## BaseViewController.swift

AdMob広告を配置するViewControllerの基盤クラス

```swift
import UIKit
import GoogleMobileAds

class BaseViewController: UIViewController, GADBannerViewDelegate {
  var bannerView: GADBannerView?
  override func viewDidLoad() {
    super.viewDidLoad()
  }
  
  // Google Ads設定
  func setupBannerView(bannerViewWrapper: UIView, heightConstraint: NSLayoutConstraint?) {
    heightConstraint?.constant = getBannerViewHeight()
    
    bannerView = GADBannerView(adSize: getAdSize())!
    bannerView!.adUnitID = "ca-app-pub-3940256099942544/2934735716" // テスト用
    bannerView!.delegate = self
    bannerView!.rootViewController = self
    bannerView!.loadRequest(GADRequest())
    
    bannerViewWrapper.addSubview(bannerView!)
  }
  
  func getBannerViewHeight() -> CGFloat {
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
      return 50
    } else {
      return 90
    }
  }
  
  func getAdSize() -> GADAdSize {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
      return kGADAdSizeSmartBannerLandscape
    } else {
      return kGADAdSizeSmartBannerPortrait
    }
  }
  
  override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    bannerView?.adSize = getAdSize()
  }
}
```

## HogeViewController.swift

BaseViewControllerを継承したクラス。
広告用のUIView(bannerWrapperView)と広告の高さの制約(bannerHeightConstraint)をIBOutletとして持つ。

```
class HogeViewController: BaseViewController {
  @IBOutlet weak var bannerWrapperView: UIView!
  @IBOutlet weak var bannerHeightConstraint: NSLayoutConstraint!

  override func viewDidLoad() {
    super.viewDidLoad()
    setupBannerView(bannerWrapperView, heightConstraint: bannerHeightConstraint)
  }
}
```

## StoryBoardのHogeViewController

- フッターバナー用のUIViewを配置して、HogeViewController.swiftのbannerWrapperViewと接続する。
- 上記Viewに以下の制約をセットする
 - Height Equals: 50
 - Leading Space to: Superview, Equals: -20
 - Trailing Space to: Superview, Equals: -20
 - Bottom Space to: Bottom Layout guide
 - Top Space to: 任意
- 上記のHeight Equals制約と、HogeViewController.swiftのbannerHeightConstraintを接続する。

# 参考

- https://akira-watson.com/iphone/admob.html
- http://stackoverflow.com/questions/20145357/change-the-adsize-in-gadbannerview
private method 'load' called for Psych:Module (NoMethodError) にはまった

# 現象
`YAML.load`を利用したアプリケーションを実行すると

```
/Users/resessh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/ec2ssh-3.0.3/lib/ec2ssh/migrator.rb:17:in 'check_version': private method 'load' called for Psych:Module (NoMethodError)
        from /Users/resessh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/ec2ssh-3.0.3/lib/ec2ssh/cli.rb:96:in 'check_dotfile_version'
        from /Users/resessh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/ec2ssh-3.0.3/lib/ec2ssh/cli.rb:25:in 'update'
        from /Users/resessh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/thor-0.19.1/lib/thor/command.rb:27:in 'run'
        from /Users/resessh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/thor-0.19.1/lib/thor/invocation.rb:126:in 'invoke_command'
        from /Users/resessh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/thor-0.19.1/lib/thor.rb:359:in 'dispatch'
        from /Users/resessh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/thor-0.19.1/lib/thor/base.rb:440:in 'start'
        from /Users/resessh/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/ec2ssh-3.0.3/bin/ec2ssh:4:in '<top (required)>'
        from /Users/resessh/.rbenv/versions/2.2.2/bin/ec2ssh:23:in 'load'
        from /Users/resessh/.rbenv/versions/2.2.2/bin/ec2ssh:23:in '<main>'
```

のように `private method 'load' called for Psych:Module (NoMethodError)` が吐かれて動作しない。

※ ec2sshいつも便利に使わせてもらってます！

# 解決策
```
$ gem update --system
```
gemのバージョンを2.4.6以上に上げる。

# 参考文献
[Problem installing 3.0.5 on OS X · Issue #584 · ruby-gnome2/ruby-gnome2](https://github.com/ruby-gnome2/ruby-gnome2/issues/584)
[Heisen-loading of 2.0.12 · Issue #223 · tenderlove/psych](https://github.com/tenderlove/psych/issues/223)
デモソフトのライセンスについて


Nifty Cloud Mobile Backendのちょっとしたデモを作りました。

* [See_Ku / NcmbDatastoreDemo — Bitbucket](https://bitbucket.org/See_Ku/ncmbdatastoredemo)

そこで、とりあえず制限の緩いMIT Licenseを適用させましたが・・・　冷静に考えると、ちょっとしたデモなのにMIT Licenseは大げさなような気がします。

そう思ってPublic Domainにしようと思ったら意外とPublic Domainも面倒だったので、そのあたりについてまとめたメモです。

## Public Domainのライセンスとは？

オープンソースライセンスについて、良い感じにまとめてあるサイトが見つかったのでここを起点に調査を開始しました。

* [たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ | コリス](http://coliss.com/articles/build-websites/operation/work/choose-a-license-by-github.html)

するとPublic Domain (Unlicense)と書いてある・・・　Unlicenseとは？　サイトではリンク切れでしたが、さかのぼって調べるとこのページに行き着きます。

* [Licenses - Choose a License](http://choosealicense.com/licenses/)

ここで見ると、Public DomainはCC0 1.0 UniversalとUnlicenseの二種類で、それぞれ別物になってます。

* [Creative Commons Zero v1.0 Universal - Choose a License](http://choosealicense.com/licenses/cc0-1.0/)
* [The Unlicense - Choose a License](http://choosealicense.com/licenses/unlicense/)

では、どう違うのか？　困ったところで、オープンソースライセンスの本家である（？）gnuがまとめてくれている情報をチェックしました。（最初からここを見れば終わってた？）

* [さまざまなライセンスとそれらについての解説 - GNUプロジェクト - フリーソフトウェアファウンデーション](http://www.gnu.org/licenses/license-list.ja.html)

ざっくりまとめると、Public Domainとして公開したい場合はCC0を使うことを推奨しますよ、と。そういう事のようです。

と言うわけで、CC0を使うことにしました。

![cc0.png](https://qiita-image-store.s3.amazonaws.com/0/48763/48941bef-9ae7-b13d-e878-a5d991ae44cf.png "cc0.png")

## CC0を適用する方法

これについては、先程紹介したサイトに書いてありました。

* [Creative Commons Zero v1.0 Universal - Choose a License](http://choosealicense.com/licenses/cc0-1.0/)

> Create a text file (typically named LICENSE or LICENSE.txt) in the root of your source code and copy the text of the CC0 into the file. 

簡単に日本語に訳してみます。

 **※こういう翻訳はあまり当てにせず、原文を直接参照しましょう**

> LICENSEとかLICENSE.txtって感じの名前でテキストファイルを作って、ソースコードのルートに置いて、その中にCC0のテキストを入れれば良いよ！

簡単ですね。

念のため、README.mdにも書いておきました。

```
ソースコードのライセンスは CC0 とします。
	
Creative Commons — CC0 1.0 Universal  
http://creativecommons.org/publicdomain/zero/1.0/
```

これで問題ない・・・　かな？

----

この記事は自分のブログからの転載です。

デモソフトのライセンスについて - 開発メモ
http://seeku.hateblo.jp/entry/2016/02/21/191950
ズンドコキヨシ with C#

流行っているようなので。[ズンドコキヨシ](http://qiita.com/B73W56H84/items/519e27a1aed5e6d5304f#%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%E8%AA%AD%E3%81%BF%E3%81%9F%E3%81%84)

すでにやられていますが、Rxの教材として面白そう。

**先人**
[C# と Reactive Extensions でズンドコキヨシ](http://qiita.com/amay077/items/85dfc4bd194f57c52c57)

**コード**

```csharp
private static readonly string Zun = "ズン";
private static readonly string Doco = "ドコ";
private readonly string[] Pattern = new[] { Zun, Zun, Zun, Zun, Doco };
private bool KiyoshiSinging = true;

public void ZunDoco()
{
	var rand = new Random();
	var dis = Observable.Create<string>(observer =>
		{
			while (KiyoshiSinging)
			{
				var nextWord = rand.Next() % 2 == 0 ? Zun : Doco;
				Console.Write(nextWord);
				observer.OnNext(nextWord);
			}
			observer.OnCompleted();
			return () => { };
		})
		.Buffer(5, 1)
		.Subscribe<IList<string>>(next =>
		{
			if (next.Count < 5)
			{
				return;
			}
			if (next.SequenceEqual(Pattern))
			{
				Console.WriteLine("キ・ヨ・シ！");
				this.KiyoshiSinging = false;
			}
		}, () => Console.WriteLine("終了"));
}
```

実行結果
>ドコドコズンズンドコドコズンドコズンドコズンズンズンドコドコドコドコズンドコドコズンズンドコズンズンズンズンドコキ・ヨ・シ！
終了
EclipseのプラグインDBeaverのインストールとSQLiteへのアクセス


# ねらい
EclipseからSQLiteにアクセスしてテーブルのプレビューを行いたい．

# DBeaverのインストール

Eclipseを使ってPHPのプログラミングをしていますが，SQLiteのデータベースの中身を見たいことがしばしばあります．スタンドアロンのビューアを使えば目的は達成できるのですが，せっかくEcliseを使っているのでEclipseの中からプレビューをしてみたいと思いました．また，MySQLにもアクセスしたいので，Marketplaceからsqliteとmysqlをキーワードにして検索をしてみました．

![Kobito.2dJb8q.png](https://qiita-image-store.s3.amazonaws.com/0/116877/b3679be3-7955-79c7-b80a-771c8408eb80.png "Kobito.2dJb8q.png")

その結果，DBeaverとToadExtensionというのが引っかかりました．インストール数はToadExtensionの方が多いのですが，カエルよりビーバーのほうが可愛いのでDBeaverを試してみることにしました．

# DBeaverの設定

DBeaverをインストールしてEclipseを再起動し，DBeaverのパースペクティブに切り替えます．Database Navigetorから"New Connection"をクリックします．

![Kobito.0sfcTG.png](https://qiita-image-store.s3.amazonaws.com/0/116877/94f2d59c-6104-a1e6-f925-7db535918e8b.png "Kobito.0sfcTG.png")

DBeaverからアクセスできるデータベースの一覧が表示出来ます．この中からSQLiteを選択します．

![Kobito.5gW42M.png](https://qiita-image-store.s3.amazonaws.com/0/116877/9fe52857-4a9c-cec1-bbe7-126587a0c79e.png "Kobito.5gW42M.png")

PathのところでSQLiteのファイルを指定します．

![Kobito.j9xm9u.png](https://qiita-image-store.s3.amazonaws.com/0/116877/4add3222-cd8a-10f5-18dc-043a29f01f6d.png "Kobito.j9xm9u.png")

Test Connectionを押してきちんと接続できるか確認します．

![Kobito.7VkwFk.png](https://qiita-image-store.s3.amazonaws.com/0/116877/4b222112-1b68-194b-51d9-f065c8ce8c50.png "Kobito.7VkwFk.png")

接続設定の最終確認です．好みに応じてConnection nameを変更してください．

![Kobito.N5jSek.png](https://qiita-image-store.s3.amazonaws.com/0/116877/8ccf07e4-7d8d-595d-5c49-3c03f7e23402.png "Kobito.N5jSek.png")

Database　Navigatorに追加したデータベースが表示されますので，クリックしてアクセスします．

![Kobito.tc4fg0.png](https://qiita-image-store.s3.amazonaws.com/0/116877/5ea9cd6f-2e6e-7259-7a33-949c4a58b439.png "Kobito.tc4fg0.png")

無事にテーブルにアクセスできました．

![Kobito.CTnPJ0.png](https://qiita-image-store.s3.amazonaws.com/0/116877/e69d1a21-f354-f59e-5621-8fa16ab994f9.png "Kobito.CTnPJ0.png")

# DBeaverの使い心地
まだそれほど使い込んでいないのですが，長所と短所を書いておきます．

## 長所
* Eclipseに統合されているのが便利．ペインを分けてテーブルを見ながらプログラムが書ける．
* データベースの種類に関係なく，同じインターフェイスでアクセスできる．

## 短所
* 反応が今一つ．きびきびとした動きとは言いがたいです．
* データの変更が面倒．

総合的に見て，テーブルのプレビューがメインでデータの変更を多くしないのであれば，DBeaverは便利なのではないでしょうか．
sudoコマンド

**普通ユーザがrootユーザ権限のコマンドを実行する**
用法：sudo command
原理はどのユーザがroot権限コマンドを実行できるかをあるファイルで定義する。
`/etc/sudoers`

sudoersの最終行は##と書いてあるが、コメント行にならない。
以下のフォルダの下にすべてのファイルがincludeされる。
`/etc/sudoers.d/`

例：上記フォルダにファイルを一個作って、記述する。
`centos ALL=(ALL) NOPASSWD:ALL`
centosがrootユーザとしてコマンドを実行できる。

*sudo su -コマンドにより、rootユーザに切り替える。*
CakePHP3のインストールおよびSmarty3の導入


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

:smile: 2016/03/13時点における最新版を前提としています。
:smile: 本記事は、前記事にCakePHP3のインストール方法、およびサンプルを加筆したものです。
前記事はこちら：http://qiita.com/yukikikuchi/items/f64182288a6e23087c12

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

#CakePHP3のインストール

##方法１：zipファイルでダウンロード
php.iniに下記を追記(かなり重要)

``` ini:php.ini
# Windowsの場合
extension=php_intl.dll
```


CakePHP3をダウンロード
https://github.com/cakephp/cakephp/tags
Downloadsリンクをクリックし、
画面下のcakephp-3-x-x.zipを選択。
![WS010037.JPG](https://qiita-image-store.s3.amazonaws.com/0/62845/06c32997-597d-18b3-f59a-bef9ee16fbb0.jpeg)

![WS010038.JPG](https://qiita-image-store.s3.amazonaws.com/0/62845/0e47f867-d87c-a42c-af68-f26a7a8312f0.jpeg)


任意のフォルダに展開
![WS010029.JPG](https://qiita-image-store.s3.amazonaws.com/0/62845/17f835de-40df-37f0-c3b4-578f611f0f41.jpeg)

##方法２：Composerでダウンロード
php.iniに下記を追記(かなり重要)

``` ini:php.ini
# Windowsの場合
extension=php_intl.dll
extension=php_openssl.dll
```

Composerダウンロード＆インストール
https://getcomposer.org/

任意のフォルダ上で実行
composer create-project --prefer-dist cakephp/app ./


#Apacheにドキュメントルートを設定
:smile: これでとりあえず動くようになりました。
:smile: ここからSmarty3を導入しましょう。


#SmartyViewクラスをダウンロード

https://github.com/yukikikuchi/cakephp3-smartyview
をダウンロード

#Smarty本体の設置
Smarty本家サイト
http://www.smarty.net/
からstableをとってくる
2016/03/13現在の最新版は3.1.29です。

app/vendor/smarty
にlib配下のファイルを配置
#SmartyViewを使用できるようにする

app/src/View/
にSmartyView.php
を配置

AppControllerを修正

``` php:AppController.php
class AppController extends Controller {
	public $viewClass = 'App\View\SmartyView';
// 中略
}
```

#レイアウトの修正

src/Template/Layout/default.tplを作成

``` tpl:default.tpl
{$this->fetch('content')}
```
:smile: これでSmarty3が有効になりました。
:smile: ここからはオマケです。サンプルを作ってみましょう。


#画面を作ってみる

コントローラーを作成

``` php:src/Controller/SamplesController.php

<?php
namespace App\Controller;

class SamplesController extends AppController
{

    public function page()
    {
        $this->set('hoge', '変数の値');
    }
}
```

ビューを作成

``` tpl:src/Template/sample.tpl
This is tpl.<br>
smarty tag:{$smarty.now}<br>
hoge:{$hoge}<br>
escape:{'<>'|escape}<br>
helper:{$this->Html->link('tttt')}<br>
```

アクセス！
http://[ドメイン]/samples/page

:smile: いかがでしょうか。
:smile: お役に立てたら嬉しいです！
Rでズンドコ

# こういうのをPythonでも書きたいだけの人生だった

```r:zun.R
(function(a,b){if(b==5){c(a,'キ・ヨ・シ！')}else if(rbinom(1,1,0.5)>0){Recall(c(a,'ズン'),b-1)}else{Recall(c(a,'ドコ'),4+(b<=0)*1)}})('',4)
```
JavaScriptでも同じようにかけるけど、ちょっと長くなる。

```text:実行結果
Rscript zun.R
 [1] ""             "ズン"         "ズン"         "ズン"         "ドコ"        
 [6] "ドコ"         "ズン"         "ドコ"         "ドコ"         "ズン"        
[11] "ドコ"         "ズン"         "ズン"         "ドコ"         "ドコ"        
[16] "ドコ"         "ズン"         "ドコ"         "ドコ"         "ズン"        
[21] "ドコ"         "ドコ"         "ズン"         "ドコ"         "ドコ"        
[26] "ドコ"         "ズン"         "ドコ"         "ズン"         "ズン"        
[31] "ドコ"         "ドコ"         "ドコ"         "ズン"         "ドコ"        
[36] "ズン"         "ズン"         "ズン"         "ドコ"         "ズン"        
[41] "ドコ"         "ドコ"         "ドコ"         "ドコ"         "ズン"        
[46] "ズン"         "ズン"         "ドコ"         "ドコ"         "ドコ"        
[51] "ドコ"         "ドコ"         "ドコ"         "ドコ"         "ズン"        
[56] "ドコ"         "ドコ"         "ドコ"         "ズン"         "ズン"        
[61] "ズン"         "ズン"         "ズン"         "ズン"         "ズン"        
[66] "ズン"         "ズン"         "ズン"         "ズン"         "ドコ"        
[71] "キ・ヨ・シ！"
```
[妥協したPython版](http://qiita.com/sasanquaneuf/items/667f321b26d7f4463c47)
Swiftのパターンマッチについての情報集め

[The Swift Programming Language (Swift 2.2) Pattern]
(https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Patterns.html#//apple_ref/doc/uid/TP40014097-CH36-ID419)

[Swift2のパターンマッチ構文集(ほぼ翻訳)]
(http://qiita.com/mono0926/items/f2875a9eacef53e88122)

[Elixir のパターンマッチを攻略しよう]
(http://qiita.com/naoya@github/items/9da982febe89d83cb5b5)

[Swiftのパターンマッチを読む](http://qiita.com/demmy/items/d80612887b6bc8020271)
AD2 / RTS | DTR制御 > IO0 | RESET の信号の測定


http://qiita.com/hotchpotch/items/8a6fe6b8b0026ac6218e
のAnalog Discoveryでの確認

```txt:動作確認
Analog Discovery 2 (以下AD2) : 電圧測定, 3.3V電圧出力(プルアップ用)
Raspberry Pi2 (以下Pi2) : RTS, DTR制御
```

Pi2側コード
http://qiita.com/7of9/items/55ea4bffc924f98aad27


## RTS, DTR オープン

下図はRTS, DTRをGPIO制御しない状態での各電圧

- 黄色: IO0
- 水色: RESET

10kでプルアップしているので両方3.3Vになるのは問題ない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3a9021d8-d762-dabe-9046-c1acc0f0d586.png)

## RTS, DTR電圧

```
# RTS = either CH_PD or nRESET (both active low = chip in reset)
            # DTR = GPIO0 (active low = boot to flasher)
            self._port.setDTR(False)
            self._port.setRTS(True)
            time.sleep(0.05)
            self._port.setDTR(True)
            self._port.setRTS(False)
            time.sleep(0.05)
            self._port.setDTR(False)
```

上記に相当するpythonコードで制御したRTS,DTRの電圧。

- 黄色: RTS
- 水色: DTR

意図している通りの電圧変化になっている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c2b664d2-5eaf-fc74-7aec-0f470a88540b.png)


## RTS, IO0電圧

- 黄色: RTS
- 水色: IO0

このあたりで予想とは違っている。IO0は通常Hでなく0.7V程度の電圧になっていて、そこから2.8V程度になる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b3c1fa4c-dd1e-5c34-9cbf-7d500a75029c.png)

## RTS, RESET電圧

- 黄色: RTS
- 水色: RESET

これも予想と違う。RESETが通常は0.7V程度になっていて、2.8Vになる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/785c78aa-3e88-ad62-fccc-7f7527865ccf.png)

## IO0, RESET電圧

最終的にIO0, RESET電圧は以下の変化となった。

- 黄色: IO0
- 水色: RESET

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/208096c1-df35-31a8-112b-4a07130a0a2c.png)

動きとしては

- RTS, DTRのGPIO制御開始時点？: IO0, RESETはLに落ちる (0.7V程度)
- RTS=True,DTR=False: RESETがHになる
- RTS=False,DTR=True: IO0がHになる
- DTR=False: IO0がLになる

ブレッドボードの実装などまだどこか間違っているかもしれない。
python | GPIO | AD2 | RPi > DTR | RTS のH|L制御

```txt:動作環境
Analog Discovery 2 (以下AD2) on Windows 8.1 pro (64bit)
python on Raspberry Pi2 + raspbian
```

## セットアップ

http://qiita.com/hotchpotch/items/8a6fe6b8b0026ac6218e
の回路のDTR, RTSの H/L 制御をRPi2のGPIOで行う。

[GPIO @ element14](https://www.element14.com/community/docs/DOC-73950/l/raspberry-pi-2-model-b-gpio-40-pin-block-pinout)

BYOPで作っていたPi2とESP8266の通信用ケーブルを流用して以下のように結線した。

- Pi2:Pin# 08 <-> AD2:Scope1 Positive
- Pi2:Pin# 06 <-> AD2:Scope1 Negative
  - Pin# 06はGND
- Pi2:Pin# 10 <-> AD2:Scope2 Positive
- Pi2:Pin# 34 <-> AD2:Scope2 Negative
  - Pin# 34はGND


## code

上記の接続状態で以下のスクリプトを走らせる。

```rtsdtr.py
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
kPinRTS = 8
kPinDTR = 10
GPIO.setup(kPinRTS, GPIO.OUT)
GPIO.setup(kPinDTR, GPIO.OUT)

while(True):
    time.sleep(2.0)    #sec
    print "hello"
    GPIO.output(kPinDTR, False)
    GPIO.output(kPinRTS, True)
    time.sleep(0.05) #sec
    GPIO.output(kPinDTR, True)
    GPIO.output(kPinRTS, False)
    time.sleep(0.05) #sec
    GPIO.output(kPinDTR, False)    
    time.sleep(0.05) #sec
```


## 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/30986011-cf77-456e-4e8e-10ecf6aad456.png)

矩形の幅は50.16ms程度。
これを使って ESP8266 Auto FDTI Programの回路の結果を見てみる。
技術英語 > I assure you, Captain, it will not happen again. / It will never happen again. / History repeats itself.

@ Star Trek Voyager > MANEUVERS

セキュリティの裏をかかれたセキュリティ主任の Tuvok が Janeway に

> I assure you, Captain, it will not happen again.

僕が覚えていたのは

> It will never happen again.

never を使う方が「二度と起きない（ようにする）」が強調されるように思う。

<hr>
しかしながら

> History repeats itself.

http://ejje.weblio.jp/content/History+repeats+itself.