OmniAICreator/Qiita-1.07M huggingface dataset:
Docker で標準と違うブリッジ・ネットワークを使う

やってみたことを淡々と。

環境
----

- Docker 1.9.1
- Ubuntu 15.04

参考
----

- [network create](https://docs.docker.com/engine/reference/commandline/network_create/)

実行
----

### 作成

作成の基本形はこんな感じ。

~~~bash
$ docker network create \
    --driver=bridge \
    --subnet=172.30.0.0/16 \
    --gateway=172.30.0.8 \
    mynet
de40d30a63ab9b17df4c4f8ad1c93d176b56f44afe314635f0f96f44afe314635b07fb602b07fb602de40d30a63ab9b17f3d3
~~~

実行するとネットワークの ID が出力される。

#### 補足

- `--subnet` を省略すると Docker 標準ブリッジの 172.17.0.0/16 を起点に 172.18.0.0/16 , 172.19.0.0/16 と、繰り上げた値が自動的に設定される。
- `--gateway` を省略するとネットワーク範囲のうち、一番値の小さなものが自動的に設定される。
- 上では使っていないが `-o com.docker.network.bridge.name=bridgename` とすることで、ブリッジの名前を設定することができる。
  - 標準では `br-XXXXXXXXXXXX` 形式の名前が付く。この 12桁の X は ネットワーク ID の先頭部分が入る。

### 確認

Docker が管理するネットワークを一覧表示するには `docker network ls` を使う。

~~~bash
$ docker network ls     
NETWORK ID          NAME                DRIVER
f3c95be71222        none                null                
109db1b78591        host                host                
de40d30a63ab        mynet               bridge              
795b9950cbed        bridge              bridge       
~~~

`ip` コマンドで確認するとこんな感じ。

~~~bash
$ ip route
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 
172.30.0.0/16 dev br-de40d30a63ab  proto kernel  scope link  src 172.30.0.1
~~~

作成時に設定したサブネットの値に `br-XXXXXXXXXXXX` 形式の名前でブリッジが登録されている。

ネットワークの詳細は `docker network inspect mynet` で確認できる。

~~~bash
$ docker network inspect mynet 
[
    {
        "Name": "mynet",
        "Id": "de40d30a63ab9b17df4c4f8ad1c93d176b56f44afe314635f0f96f44afe314635b07fb602b07fb602de40d30a63ab9b17f3d3",
...
~~~

### 使用

使用するには `docker run` 時に `--net` オプションで作成したネットワークを指定する。

~~~bash
$ docker run --net=mynet ubuntu
~~~

`ip route` で確認すると、作成したネットワークの範囲にコンテナが収まっていることがわかる。

~~~bash
$ docker run --net=mynet ubuntu ip route
default via 172.30.0.8 dev eth0 
172.30.0.0/16 dev eth0  proto kernel  scope link  src 172.30.0.1 
~~~

### 削除

削除は `docker network rm` 。

~~~bash
$ docker network rm mynet
~~~

ちなみに使用中のネットワークを削除しようとするとエラーが出る。

~~~bash
$ docker network rm mynet 
Error response from daemon: network mynet has active endpoints
~~~
Jenkinsの行列セキュリティ設定に失敗してどうにもならなくなった場合のリカバリ方法

# Jenkinsのセキュリティ設定に失敗した時のリカバリ方法
## はじめに
[こちらの記事](http://qiita.com/n_rooms/items/2e1adefcc26d51b4e866)などを参考にJenkinsのセキュリティ設定を「行列による権限設定」で行った際に、**誤って設定してしまい**、ログイン後の画面に以下メッセージが出て**どうにもならなくなった時のリカバリ方法**のメモです。

## エラーメッセージ

**アクセスできません**
**hoge には、全体/Read パーミッションがありません。**

## 環境
|OS|Jenkins ver.|
|:-:|:-:|
|OSX Yosemite|1.616|
|CentOS6.7|1.656|

## リカバリ手順
Jenkinsをインストールしたアカウントかサーバのrootアカウントでサーバへsshログインして`JENKINS_HOME`配下で`$ vi config.xml`など設定ファイル直接編集してリカバリします。

|OS/インストール方法|`JENKINS_HOME`|
|:-:|:-:|
|OSXでbrew などでインストールした場合のパス|`~/.jenkins`|
|CentOSでyumやrpmなどでインストールした場合のパス|`/var/lib/jenkins`|

**変更前`config.xml`の抜粋**

```
  <authorizationStrategy class="hudson.security.GlobalMatrixAuthorizationStrategy"/>
```

または、

```
  <authorizationStrategy class="hudson.security.GlobalMatrixAuthorizationStrategy">
    <permission>com.cloudbees.plugins.credentials.CredentialsProvider.Create:hoge</permission>
中略
  </authorizationStrategy>

```

これを以下のように変更して、Jenkinsを再起動します。

**変更後`config.xml`の抜粋**

```
 <authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
```

### 参考
ちょっと調べたら[公式のwiki](https://wiki.jenkins-ci.org/display/JA/Disable+security)にもやり方が載っていましたね。。。
RSpec::RequestDescriberでテストを書くときUserAgentを変更する

[RSpec::RequestDescriber](https://github.com/r7kamura/rspec-request_describer) を使うと describe メソッドに渡した `"GET /users/:id"` のような文字列を元に Request Spec を実行してくれる。
RSpec::RequestDescriberの説明は[こちら](http://qiita.com/r7kamura/items/a1ab81561cb6accae558)を参照。

RequestDescriber を使っている時に UserAgent を変更したい場合は以下のように書く。

```rb
describe "GET /users" do
  before do
    headers["USER_AGENT"] = "my_agent/2.0"
  end
  
  it do
    expect(response.body).to include("ほげ")
  end
end
```
xcodeでViewController間で値のやり取りをする方法


appDelegate.swiftに変数を作成し、アプリ全体で使えるグローバル変数にする。

```AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var count:Int = 0
}
```

```ViewController.swift

	//delegateオブジェクトを作る
	let delegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

	delegate.count = 10 //このようにして、データを代入したり、やり取りを行ったりする
	
```
underscoreコードリーディング（escape）


underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##escapeとは


###[underscorejs.orgのescape](http://underscorejs.org/#escape)

こんな説明。
>####_.escape(string) 
>Escapes a string for insertion into HTML, replacing &, <, >, ", `, and ' characters.


```javascript
_.escape('Curly, Larry & Moe');
=> "Curly, Larry &amp; Moe"
```

------------- 
HTMLに挿入するための文字列をエスケープします。
エスケープするのは&, <, >, ", `, 'です。

###[underscore.escape](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1346)
コード的にはこのあたり。

```javascript
  // Functions for escaping and unescaping strings to/from HTML interpolation.
  var createEscaper = function(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped
    var source = '(?:' + _.keys(map).join('|') + ')';
    var testRegexp = RegExp(source);
    var replaceRegexp = RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  };
  _.escape = createEscaper(escapeMap);

```

_.escapeはcreateEscaperにescapeMapを渡す関数である。
createEscaperはmapを引数とする関数。内容は以下。
escaperを定義する。引数はmatch。map[match]を返す。
sourceに'(?:' + _.keys(map).join('|') + ')'を代入する。
testRegexpにRegExpのsourceを渡したものを代入する。
replaceRegepにRegExpにsource,'g'を渡したものを代入する。

返り値は以下の処理をもつ関数。
stringに、stringがnullだった場合は空文字を、そうでない場合はstring型にしたstringを代入する。
関数の返り値はstringに対してtestRegexp.testした結果がtrueの場合はstring.replaceにreplaceRegexp,escaperを渡したもの、falseの場合はstringを返す。



escapeMapは以下。

[underscore.escapeMap](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1335)


```javascript
  // List of HTML entities for escaping.
  var escapeMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;',
    '`': '&#x60;'
  };
```

escapeMapは&,<,>,",',`の各文字と、特殊文字の対応表。
化合物の2次元構造から体積を算出する

化合物の2次元構造から体積を算出する、ということが案外openbabelやrdkitのbuilt-inでは出来なさそうだったので（私の勘違いだったら悲しいなこれ）、論文を参考に[1]実装をした。単位は立方オングストローム。

https://github.com/keisuke-yanagisawa/python-tools/blob/master/calc_mol_volume.py

openbabelに依存した実装をしている。

これを使うと、例えばbenzeneを入力してみると、

```py
from calc_mol_volume import *
import pybel

mol = pybel.readfile("sdf", "benzene.sdf").next()
print estimate_volume(mol)
# -> 81.1800000...
```

となる。また、calc_mol_volume.pyには```annotate_sdf_volume```を用意している。

```py
from calc_mol_volume import *

annotate_sdf_volume("benzene.sdf", "benzene_annotated.sdf")
```

とすることで新しいsdfファイルを出力することもできる。

[1] Zhao YH, et al., "Fast calculation of van der Waals volume as a sum of atomic and bond contributions and its application to drug compounds", *The Journal of Organic Chemistry*, **68**(19), 7368-7373, 2003.
javascriptのテストを自動化する

[前回](http://qiita.com/Mic-U/items/253d57d6245e06485243)jsのテストコードを作りましたが、これではいちいちhtmlを開かないと結果を確認できないので面倒。

そこで、ちょっと手を加えてコマンドラインからテストを実行し、ソースに変更があれば都度テストをし直すようにします。

## ディレクトリ構成

基本は前回と同じですが、gulpを使うのでgulpfile.jsを追加

```
project_root/
├-node_modules
├-public
|  └-js
|     └sample.js
├-tests
|  └sample.test.html
├-gulpfile.js
└-package.json
```

## パッケージインストール

追加するのは下記
- [gulp](http://gulpjs.com/)
- [phantomjs](http://phantomjs.org/)(コマンドラインから操作するブラウザ)
- gulp-mocha-phantomjs(gulpからphantomjsを使うプラグイン)

`npm install gulp phantomjs gulp-mocha-phantomjs --save-dev`

個人的にグローバルインストールは極力避けたいので-gはつけません

### package.json修正

とはいえこのままだとgulpコマンドが使えないので、package.jsonにscriptに追記します

```json:package.json
{ 
  //省略
  "scripts": {
    "gulp": "gulp"
  },
  //省略
```

これでプロジェクトディレクトリ内なら`npm run gulp`でgulpが動きます

## gulpfile作成

次にgulpfileにタスクを書きます
起動時にまずテストして、その後ソースが変更されるたびにテストし直します

```js:gulpfile.js
var gulp = require('gulp');
var mochaPhantomJS = require('gulp-mocha-phantomjs');

gulp.task("serve", ["test"],function(){
  //ソースが変更されたらテスト実行
  gulp.watch(["public/js/sample.js"], ["test"]);
});

gulp.task("test", function(){
  return gulp.src(["tests/sample.test.html"], {read:false})
      .pipe(mochaPhantomJS());
});

gulp.task("default", ["serve"]);
```

## テスト実行

コマンドは`npm run gulp`
<img width="1129" alt="スクリーンショット 2016-04-07 21.54.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/116434/5411838e-3fd5-9780-291d-032107acd3a5.png">

テストが実行されました。

試しにソースを書き換えると
<img width="1088" alt="スクリーンショット 2016-04-07 21.57.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/116434/15b8e715-79e7-467b-2528-63c470847c0f.png">

若干タイムラグはあるものの自動で再テスト
バグの早期発見に役立ちます
晩御飯食べつつ、さくらのレンタルサーバにDrupal7を乗せて困った話を書く

#お行儀よくないのでちゃっちゃと書く
なお、中華丼なうです。
#付属の.htaccessを置くと500エラーになる（はっ！？）
さくらレンタルサーバは Options が使えないそうです...
[ここ](https://help.sakura.ad.jp/app/answers/detail/a_id/2315/~/.htaccess%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1)にきっちりくっきり明記されてますが、ハマりました。

#クリーンURLが使えない（初体験）

クリーンURLの設定画面を表示すると、こんな感じになる。

![Capture 2016-04-07 21.51.45.png](https://qiita-image-store.s3.amazonaws.com/0/65994/12ab5302-0b47-17ce-23c6-462ff2904a50.png)

結果、上記 .htaccess 問題をクリアしたら無事に動きました。

#取り急ぎ書きました
ごちそうさまでした。
ChromebookにGalliumOS入れてWine動かしたかった

![GalliumiCON_chromebook.png](https://qiita-image-store.s3.amazonaws.com/0/43608/e8ede292-c22f-c80b-8284-7811d48aff0f.png)
- - -
表題通りのことをしたかったんです。
実はEvernoteのWebクライアントよりも
デスクトップクライアントの方が好きでして、
出先も同じ環境で使いたいなと思い、
でもWindowsのノートパソコンまた買うのも癪ですし、
目の前にChromebookがあったので、
前々からデベロッパーモードにも興味あったし、
Chromebookに簡素でも開発環境があるのは良いなと思い、
それならcroutonで仮想的に使うより
パーミッション分けてインストールさせる方法の
GalliumOS使おうと思い立ったわけです。
そしてWineをインストールして
Evernoteのデスクトップクライアントをインストールし、
理想の環境を実現させようと目論みました。

#               *免責事項
<font color="red">利用の結果生じた損害について、一切責任を負いません。</font>

#               0.環境
- Dell Chromebook 11(2014|15Q31)  

#               1.まずは基本のバックアップ
さすがに怖いのでまずはバックアップをします。
ChromeOSには便利なアプリが元からはいってますからね。
[**Chromebook リカバリ ユーティリティを使用する**](https://support.google.com/chromebook/answer/6002417?hl=ja)
一応復元用のUSBメモリも作成しておきます。
ダウンロードフォルダ内はまとめてSDカードに入れました。

#              2.デベロッパーモードに変更
基本的にはどのChromebookも同じような操作らしいので
Google先生を頼りました。
[**Chromebook デベロッパーモードの入り方と出方。**](http://usagisaigon.blogspot.jp/2013/08/chromebook_11.html)

#              3.GalliumOSインストール
インストール前にchrxという
ChromebookにLinuxをインストールするツールを使用します。
デュアルブート環境にしたいので先駆者の手順を応用します。
一応その前にちゃんと対応環境か確認しました。
[**Hardware Compatibility - GalliumOS.org**](https://wiki.galliumos.org/Hardware_Compatibility)
Dell Chromebook 11ちゃんと入ってますね。

##        chrxでパーティション分け
0.Chromebookの電源ボタンを押して暫く待つ
1. [Ctrl]+[D]キーを押してまずChromeOSを起動させる
2. Wifiの設定だけをする 
3. [Ctrl]+[Alt]+[→(F2)]キーを押してCUI画面にする
4. "chronos"と打ち込んで[Enter]
> chronos@localhost ~ $ curl -Os https://chrx.org/go && sh go -d galliumos -v

5.↑を打ち込んで[Enter]
6.パーティションいくつに分ける？って聞いてくるので私の環境は全部で１６ＧＢしかないのでとりあえず半分にしました。
８って入力して[Enter]
7.少し待つと[Enter]押してって出てくるので素直に押す
8.再起動すると（OS verification is OFF）が出てくるから[Ctrl]+[D]を押してもう一回ChromeOSを起動
9.またネットワーク設定だけ入れてCUI画面へ
>chronos@localhost ~ $ curl -Os https://chrx.org/go && sh go -d galliumos -v

10.↑を入力するとGalliumOSのダウンロード＋インストールが開始されます。（結構時間がかかる１５分くらいかかった）
11.再起動したら（OS verification is OFF)で[Ctrl]＋[L]を押すとGalliumOSが起動します。
12.Usernameに「chrx」、Passwordに「chrx」でログイン
13.少し待つとデスクトップ画面が起動します。

#         4.日本語化と日本語入力
実はここが問題
どうやってもUIが日本語にならず、
Mozcを入れても上手く動作してくれず、
でも入力自体は問題なく出来るようになったので
とりあえず良いかなって

#        5.Wine
<font color="red">$ sudo apt-get install wine</font>
パッケージがない・・・だと・・・

＼(^o^)／

#       6.終わりに
今度どうやったらwine入れられるか調べてリトライします。
それとどうやったらEvernote動くかも調べておかないと・・・
とりあえず今はChromebookでgitとtmuxと使える環境が手に入ったので良かったと思ってます。
vimで日本語も打てるし（Chroshは日本語打てなくて諦めた）
ここまで見てくださりありがとうございます。
今後も精進します。


#              0.参考URL
- [Chromebook リカバリ ユーティリティを使用する](https://support.google.com/chromebook/answer/6002417?hl=ja)
- [Chromebook デベロッパーモードの入り方と出方。](http://usagisaigon.blogspot.jp/2013/08/chromebook_11.html)
- [Hardware Compatibility - GalliumOS.org](https://wiki.galliumos.org/Hardware_Compatibility)
とりあえずLINE BOT APIでオウムを作ってみた

LINEBOT API公開記念でただ同じ事を返すだけのボットを作ってみた。

アカウントや設定とかは、 https://developers.line.me から適当にやってください。

まず最初にハマるところは、Callback URLです。どうやらポート番号も必要なので、`https://example.com:443/callback`などのように443を指定してください。

LINE_CHANNEL_ID, LINE_CHANNEL_SECRET, LINE_CHANNEL_MIDは適当な物を指定して下記を実行すると「オウム返しBot」の出来上がり。

APIを呼ぶにはWhitelistにIPを登録する必要があるので、Herokuなどで動かす事はできません。

【追記】 [LINE BOT をとりあえずタダで Heroku で動かす](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516#comment-e6737f3166be32597681)を見ると、[Fixie](https://elements.heroku.com/addons/fixie)っていうアドオンを使えばHerokuでも行けるそうです。

CallbackやWhitelistは追加してから反映までちょっと時間が掛かるみたいです。

```app.rb
require 'bundler/setup'
require 'sinatra'
require 'json'
require 'httpclient'

post '/linebot/callback' do
  params = JSON.parse(request.body.read)

  params['result'].each do |msg|
    request_content = {
      to: [msg['content']['from']],
      toChannel: 1383378250, # Fixed  value
      eventType: "138311608800106203", # Fixed value
      content: msg['content']
    }

    http_client = HTTPClient.new
    endpoint_uri = 'https://trialbot-api.line.me/v1/events'
    content_json = request_content.to_json
    http_client.post_content(endpoint_uri, content_json,
        'Content-Type' => 'application/json; charset=UTF-8',
        'X-Line-ChannelID' => ENV["LINE_CHANNEL_ID"],
        'X-Line-ChannelSecret' => ENV["LINE_CHANNEL_SECRET"],
        'X-Line-Trusted-User-With-ACL' => ENV["LINE_CHANNEL_MID"]
      )
  end

  "OK"
end
```

```rb
# Gemfile
source "https://rubygems.org"

# gem "rails"
gem 'sinatra'
gem 'httpclient'
```
クライアントサイドjavascriptの単体テスト

テストしにくいことに定評のあるjavascriptさん
特にDOM操作が入ったりするとテストするのが非常に厄介

今回は[mocha](https://mochajs.org/)を使ってそんなjavascriptさんの単体テストをどうにか実現したお話です

## ディレクトリ構成

とりあえずサンプルなのでこんな感じで
sample.test.htmlがテストを実行するファイルです。

```
project_root/
├-node_modules
├-public
|  └-js
|     └sample.js
├-tests
|  └sample.test.html
└-package.json
```

## テスト対象

今回は簡単な例として下記のようなソースをテストするとします
入力された値が奇数ならtrue、偶数ならfalseを返す簡単な関数です

```js:sample.js
function isOdd(inputNum){
    return inputNum % 2 === 1;
}

```

## パッケージインストール

最低限必要なのはテストフレームワークのmocha
あとpower-assertもテスト失敗時に得られる情報が多くなるので入れておく
テスト用なのでdevDependenciesに保存

`npm install mocha power-assert --save-dev`

## テストコード作成

```html:sample.test.html
<!DOCTYPE html>
<html>
<head>
    <title>sample test</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../../node_modules/mocha/mocha.css" />
    <!--テストフレームワーク-->
    <script src="../../node_modules/mocha/mocha.js"></script>
    <script src="../../node_modules/power-assert/build/power-assert.js"></script>
    <!--テスト対象のスクリプト-->
    <script src='../public/js/sample.js'></script>
</head>
<body>
<!-- ここにテスト結果が表示される -->
<div id="mocha">
</div>
<script>
    // setup mocha
    mocha.setup('bdd');
    mocha.reporter('html');
    
    describe("sample test", function(){
        it("should return true", function(){
            assert(isOdd(7) === true);
        });
        it("should return false", function(){
            assert(isOdd(6) === false);
        });

    });
    // run test
    mocha.run();
</script>
</body>
</html>

```

scriptタグのsrc属性を全て相対パスで書いているのは、直接htmlファイルを開くだけでもテスト結果がわかるようにです。

テスト結果はこんな感じ
![スクリーンショット 2016-04-07 21.29.55.png](https://qiita-image-store.s3.amazonaws.com/0/116434/91c46645-aa39-8586-d56b-f2d7f1f7704b.png)

今回は使ってませんが、jQueryを使ったDOM操作とかもhtmlに必要な要素を足せばできます。

この[次](http://qiita.com/Mic-U/items/24af4e04336e38590dc5)は今回作ったテストを自動で実行するようにします
Firefox Tips


## タブを開くとき、現在のタブの直後に開きたい

いままでTabMixPlusというのを使っていたが、入れたあといろいろと設定をしないといけないのがめんどくさかった。
やりたいことは「現在のタブの直後に新規タブを開く」だけなので、代替のプラグインを探してみたところ、よさそうなものがあった。

[Open Tabs Next to Current](https://addons.mozilla.org/en-US/firefox/addon/open-tabs-next-to-current/)

入れてみたところ、TabMixPlusのようにごちゃごちゃした設定パネルから設定をいじらなくても期待通りの動作だったので非常によかった。
【再】[Microsoft Azure]勤務時間中だけ仮想マシンを動かす（スケジュールによる自動起動・停止）

以前に書いた記事[^1]は手順も長く面倒だったので、Moduleとしてまとめて[PowerShell Gallery](https://www.powershellgallery.com/)へ公開しました。

[^1]: [[Microsoft Azure]勤務時間中だけ仮想マシンを動かす（スケジュールによる自動起動・停止）](http://qiita.com/sengoku/items/1c3994ac8a2f0f0e88c5)

# 準備

PowerShell Galleryを使用できるように、Windows 10かWMF 5を用意します。

モジュールをインストールしてインポートします。

```powershell
Install-Module AzureRmMinus
Import-Module AzureRmMinus
```

`Login-AzureRmAccount`でログインしておきます。

# 使い方

## ステップ:one:

アプリケーション、サービスプリンシパル、Automationアカウント、RunBook、Automationアカウント資産を作成します。

以前の記事の[ステップ:one:](http://qiita.com/sengoku/items/1c3994ac8a2f0f0e88c5#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-one-ad%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90) ～ [ステップ:seven:](http://qiita.com/sengoku/items/1c3994ac8a2f0f0e88c5#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-seven-runbook%E3%82%92%E7%99%BA%E8%A1%8C) までに相当します。

```powershell:
New-AzureRmStartStopVmAutomation -ResourceGroupName rg01 -AutomationAccountName aaaa01
```

```
AD Application's Password:: *********
Re-type AD Application's Password:: *********
```

コマンドを起動するとパスワードを聞かれますので、アプリケーションに設定したいパスワードを入力してください。ここで設定するパスワードは他では使いませんので、適当に長く複雑なものを入力してください。

ロケーションは指定されたリソースグループと同一になります。

### オプションの説明

| オプション | 説明 |
|-----------|------|
|ResourceGroupName | 既存のリソースグループ名です。 |
|AutomationAccountName | 作成するAutmationアカウント名です。 |


## ステップ:two: スケジュールの作成

作成したAutomationアカウントにスケジュールを作成します。

```powershell
New-AzureRmAutomationSchedule -ResourceGroupName rg01 -AutomationAccountName aaaa01 -StartTime "2016-04-08 9:00" -Name nineo -OneTime
```

ここで作ったスケジュール名は次のステップで使います。

## ステップ:three: スケジュールとRunBookを紐づけ

VM起動RunBookとスケジュールを紐づけるときは、`Register-AzureRmStartVmScheduleRunbook`を使います。

```powershell
Register-AzureRmStartVmScheduleRunbook -ResourceGroupName rg01 -AutomationAccountName aaaa01 -VmName MyVmName -ScheduleName nineo
```

VM停止RunBookとスケジュールを紐づけるときは、`Register-AzureRmStopVmScheduleRunbook`を使います。

```powershell
Register-AzureRmStopVmScheduleRunbook -ResourceGroupName rg01 -AutomationAccountName aaaa01 -VmName MyVmName -ScheduleName nineo
```


### オプションの説明

| オプション | 説明 |
|-----------|------|
|ResourceGroupName | 既存のリソースグループ名です。 |
|AutomationAccountName | 作成したAutmationアカウント名です。 |
|VmName | 仮想マシン名です。 |
|ScheduleName | 作成したスケジュール名です。 |
CodeIQ「『ディビジョン・ナイン』問題」に参加しました。

どうでもいいですが、この4月から社会人になりました。毎日5時半に起床、夢の国に向かう電車に揺られて職場まで通っております。研修にもかかわらず、残業がわっしょいなことになっており、日本のIT(SIer)の暗部を真にあたりにしています……。ねむいつらい(´・ω・`)

それはさておき――[CodeIQ「『ディビジョン・ナイン』問題」](https://codeiq.jp/q/2561)の掲載期間が終わったということで、わたしの提出コードを公開したいと思います。

詳細な問題や解法についてはCodeIQMagazineあたりに[@riverplus](https://twitter.com/riverplus)さんの記事が掲載されると思うので、その際はリンクをここに張り付けておきます(覚えていれば)。またほかの方のコードに関してもTogetterにまとめられる(はず)なので、ご参照のほどをお願いします。そちらも余力があればリンクを追記したいと思います。

## 提出コード

使用言語はRuby。おそらくですが一発合格だったと思います。

```rb
# 1から4までの数字をn個並べたもののうち、合計がsとなるものの総数
# g(3, 5) => 6 [113, 131, 311, 122, 212, 221]
@memo = Hash.new{|ht, key| ht[key] = Hash.new}
def g(n, s)
    @memo[n][s] ||= if n == 1
        s.between?(1, 4) ? 1 : 0
    else
        (1..4).reduce(0){|sum, i| sum + g(n - 1, s - i)}
    end
end

# 問題文中のF(n)。1から4*nに含まれる9の倍数をsとしてg(s, n)を実行、その和を返す
# f(3) => 10, f(1) => 0
def f(n)
    (9..(4 * n)).step(9).reduce(0){|sum, s| sum + g(n, s)}
end

# == main ==
n = gets.to_i
p f(n)
```

## 考察

ある自然数について、各位の桁の和が9の倍数となるとき、その自然数も9の倍数である――という性質はよく知られています。そこで1から4までの数字を$n$個並べたもののうち、合計が$s$となるものの総数を$G(n,s)$とすると、この$G$は再帰的に表現できるはずです。

```math
G(n,s)=G(n-1,s-1)+G(n-1,s-2)+G(n-1,s-3)+G(n-1,n-3)
```

あとはこれをコードに落とし込んでやるだけですが、ただし単純な再帰だと計算量やオーバヘッドが大きくなりすぎて、制限時間を軽々と超えてしまいます。つまり高速化が必要であり、今回は`Hash`によるメモ化再帰を実践しました。試していないのでなんともいいがたいところはあるのですが、動的計画法などでもまったく構わないと思います。

なお求めるのは9の倍数のとき、すなわち$s$が9の倍数になるときだけ。これについては1から$4n$(=$444...44$)に含まれる9の倍数をsとして順次$G(n,s)$を実行、その和が求める$F(n)$となるわけです。

***

眠すぎて文章が支離滅裂かもしれません。お許しを(´・ω・`)
LinuxMintでCakePHP3＋PHP7＋Eclipse　メモ

新しい案件でCakePHP3＋PHP7を使用することになった。

開発環境は、環境は即複製できる物が良い！と煩い人が居るので
OSはLinuxを試すことにした。（ライセンスのあるOSだと複製できない）
※私以外のメンバー2名はWindows機にIDE入れてモクモクやってる。。

Windowsと同様に使用したいので、GUIでかつ軽量なmintを使用することにした。

IDEは有識者からPHPStromを薦められたのだが有料なのでNG
NetBeansを使用するつもりでインストールまでしたのだが、未だPHP７に正式対応していないためNG
（β版ではPHP7対応、CakePHP3未対応）
結局Eclipseを使用することになった。
以下が使用環境とVersion　(どれも最新に近い物を使用)
Linux Mint17.3 mate(32bit)
PHP7.0.4
CakePHP3.2.6
XAMPP for Linux 7.0.4
Eclipse-php-mars-2
pleiades1.6.0

キーワードのメモ程度だが
何か所か躓いたところを以下にあげる。　

mint付属ツールのソフトウェア管理からEclipseを選択インストールすると最新バージョンが入らない
　→　直接サイトからtarをダウンロードした
Eclipse日本語プラグインがコピーしただけでは動かない。
　→　設定ファイルに追記
CakePHP3のコマンドが2と少し違う。（View→Template）
composerを使用せずに作成したため、.htaccess（一番上の ディレクトリ）が作成されず、悩む。
※CakePHPに慣れてる人なら即気づくかもしれない
検索しまくって辿りついたのは結局、版元サイトだった。
http://book.cakephp.org/3.0/ja/installation.html

全部書き切れてないかもしれないが、基本的には設定ファイルの記述修正が多かった。（インスト場所が違うとか）

CakePHP使ったことが無かったので、どの様な物かも知らなかったのだが
いわゆるRuby on Railsの様な自動生成系ツール包含フレームワークらしい。
まあ、便利かも
今更ズンドコチェック Java-while版

Javaでやってみました。
こちらはwhileを使ってます。
(メモリとか何も気にしてません……)

```java:ZundokoByWhile.java
public class ZundokoByWhile {

    public static void main (String[] args) {
        StringBuilder str = new StringBuilder();

        while (true) {
            str.append((Math.random() < 0.5 ? "ズン" : "ドコ"));
            System.out.println(str);

            if(str.length() < 10){
                continue;
            }

            if(str.toString().endsWith("ズンズンズンズンドコ")){
                System.out.println("キ・ヨ・シ！");
                break;
            }
        }
    }
}
```

```java:出力例
ズン
ズンドコ
ズンドコズン
ズンドコズンドコ
ズンドコズンドコズン
ズンドコズンドコズンドコ
ズンドコズンドコズンドコドコ
ズンドコズンドコズンドコドコドコ
ズンドコズンドコズンドコドコドコドコ
ズンドコズンドコズンドコドコドコドコズン
ズンドコズンドコズンドコドコドコドコズンズン
ズンドコズンドコズンドコドコドコドコズンズンドコ
ズンドコズンドコズンドコドコドコドコズンズンドコズン
ズンドコズンドコズンドコドコドコドコズンズンドコズンズン
ズンドコズンドコズンドコドコドコドコズンズンドコズンズンズン
ズンドコズンドコズンドコドコドコドコズンズンドコズンズンズンズン
ズンドコズンドコズンドコドコドコドコズンズンドコズンズンズンズンドコ
キ・ヨ・シ！
```
今更ズンドコチェック Java-StreamAPI版

Java(+StreamAPI) でやってみました。
(メモリとか何も気にしてません……)

```java:ZundokoByStreamAPI.java
public class ZundokoByStreamAPI {

    public static void main (String[] args) {
        Stream.iterate(getZunOrDoko(), c -> c + getZunOrDoko())
              .peek(System.out::println)
              .filter(c -> c.endsWith("ズンズンズンズンドコ"))
              .findFirst()
              .ifPresent(c -> System.out.println("キ・ヨ・シ！"));
    }

    private static String getZunOrDoko () {
        return (Math.random() < 0.5 ? "ズン" : "ドコ");
    }
}
```

```java:出力例
ドコ
ドコドコ
ドコドコズン
ドコドコズンドコ
ドコドコズンドコズン
ドコドコズンドコズンズン
ドコドコズンドコズンズンドコ
ドコドコズンドコズンズンドコズン
ドコドコズンドコズンズンドコズンズン
ドコドコズンドコズンズンドコズンズンズン
ドコドコズンドコズンズンドコズンズンズンドコ
ドコドコズンドコズンズンドコズンズンズンドコズン
ドコドコズンドコズンズンドコズンズンズンドコズンズン
ドコドコズンドコズンズンドコズンズンズンドコズンズンズン
ドコドコズンドコズンズンドコズンズンズンドコズンズンズンズン
ドコドコズンドコズンズンドコズンズンズンドコズンズンズンズンズン
ドコドコズンドコズンズンドコズンズンズンドコズンズンズンズンズンズン
ドコドコズンドコズンズンドコズンズンズンドコズンズンズンズンズンズンドコ
キ・ヨ・シ！
```
【CentOS6.x】Ultra VNC Viewer でリモートデスクトップ接続

# **環境**
- CentOS6
- Ultra VNC Viewer

# **前提条件**
- Ultra VNC Viewerがインストール済みであること
- CentOSのデスクトップ環境が構築されていること
  - 追加構築の場合は[こちら](http://qiita.com/Tocyuki/items/d8d919876af49f528a83)を参考にしてください。 
- VNC用のアカウントが作成済みであること

# **手順**
## **VNCサーバのセットアップ**
- **vnc-serverのインストール**

```shell-session
[root@vnc ~]# yum -y install tigervnc-server
```

- **vncパスワードを設定するユーザへ遷移**

```shell-session
[root@vnc ~]# su - vnc
```

- **vnc用パスワードの設定**

```shell-session
[vnc@vnc ~]$ vncpasswd
Password:
Verify:
```

- **vncサーバの起動**

```shell-session
[vnc@vnc ~]$ vncserver :1
```

## **VNCクライアントからの接続**
### **Ultra VNC Viewerを起動し、IP入力後、接続ボタンを押下**
![WS000536.png](https://qiita-image-store.s3.amazonaws.com/0/79134/d3ebcc0d-5eec-a08d-28d7-42dcb3664a92.png)


### **先ほど設定したVNC用パスワードを入力**
![WS000537.png](https://qiita-image-store.s3.amazonaws.com/0/79134/1f18eef3-0178-7bb3-754e-23942e0dcee8.png)

### **接続完了！！**
![WS000538.png](https://qiita-image-store.s3.amazonaws.com/0/79134/16496638-fff8-9874-a039-609fdc29b838.png)
multirust を利用した Rust コンパイラのインストール

**2017/05/22 追記：この記事は古いので、今からRustをはじめられる方は[こちらの記事にあるrustup](http://qiita.com/chikoski/items/b6461367e8c3875bb235#_reference-c3719a1b7fedc87b9928)をご利用ください！** 

プログラミング言語 [Rust](http://www.rust-lang.org/) もラピッドリリースになり、コンパイラが頻繁にアップデートされるようになりました。homebrew やインストーラーではなく、[multirust](https://github.com/brson/multirust) というツールを使ってインストールしておくと、アップデートを簡単に行えるようになって便利です。

公式サイトはこちら：[brson/multirust](https://github.com/brson/multirust)

## multirust とは

複数バージョンの Rust をインストール / 管理できるツールで、以下のような特徴を持ちます。

* オフィシャルに配布されている Rust バイナリをインストールできる
* ディレクトリごとに利用するツールチェーンのバージョンを管理できる
* nightly, beta, stable のリリースチャンネルを指定して、インストールや更新が行える
* 更新の自動確認
* 公式のアーカイブを利用することによって、時期を指定して nightly をインストールできる
* バージョンを指定してのインストール
* インストールするツールチェーンのカスタマイズ
* Cargo のデータの分離によるインストールごとに独立したライブラリ管理
* ダウンロードしたバイナリのハッシュ値と署名の確認
* 分割ダウンロードと、レジューム
* bash, curl と一般的な UNIX のツールがあれば動作可能

## multirust を使ったインストール

curl を使ってダウンロードしたシェルスクリプトを実行するだけでインストールできます。

実際のコマンド入力例は以下のとおり：

~~~sh
% curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh # step 1 
~~~~

## プロジェクトで利用するリリースチャンネルの変更

override コマンドで利用する Rust のリリースチャンネルを変更できます。この設定は、コマンドを実行したディレクトリ以下で有効です。

設定されたリリースチャンネルのツールがインストールされていない場合は、ツールのダウンロードとインストールもあわせて行われます。

~~~sh
% mkdir project_with_nightly
% cd project_with_nightly
% multirust override nightly
multirust: installing toolchain 'nightly'
rustup: gpg available. signatures will be verified
rustup: downloading manifest for 'nightly'
（後略）
~~~

特定の日時の nightly をインストールしたい場合は、次のように日付をつけて override コマンドを実行します。

~~~sh
% multirust override nightly-2016-04-07
~~~

stable なら、利用するバージョンを指定できます。

~~~sh
% multirust override 1.0.0
~~~

## コンパイラのバージョンアップ

update コマンドを利用します。

~~~sh
% multirust update
multirust: updating existing install for 'stable'
rustup: gpg available. signatures will be verified
rustup: downloading manifest for 'stable'
rustup: downloading toolchain for 'stable'
rustup: 'stable' is already up to date
（後略）
~~~

ただし上記のコマンドでは、全てのリリースチャンネルのものをアップデートします。stable だけアップデートするなら、次のようにリリースチャンネルを指定して実行します。

~~~sh
% multirust update stable
~~~

## まとめ

multirust を使えば、コマンド 1 つで Rust 開発環境が手に入り、しかも開発に利用するコンパイラのバージョンを固定することも可能です。

nightly ユーザにとっては、更新が簡単に行える点も嬉しいツールです。わざわざサイトへ行かなくても、update コマンドで更新できるのは、楽すぎます。

multirust で楽しい Rustitian ライフを！
Google Play Developer Consoleの言語を変更

スクショを撮る都合で変更したい機会があったのでメモ。

英語の場合
https://play.google.com/apps/publish?hl=en

日本語の場合
https://play.google.com/apps/publish?hl=ja

末尾を変えれば他の言語にもできるようです。
pyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類

[python環境構築決定版](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)の補足です。

# 20180312追記
2017-12-20付けでリリースされたconda 4.4.0で`conda activate`が採用されたようです。
[conda/CHANGELOG.md](https://github.com/conda/conda/blob/a4c4feae404b2b378e106bd25f62cc8be15c768f/CHANGELOG.md#440-2017-12-20)
現状では `source activate`が廃止されたわけではないようですが、`conda activate`が推奨されています。

最近dockerがこなれてきた (proxy越しwindows環境でもストレスを感じない)ため、pyenvを挟む必要性が減っており、私もdocker-anacondaに移行していますが、参考まで。

[コメント](https://qiita.com/y__sama/items/f732bb7bec2bff355b69#comment-d00562f16f60826919ce)で情報いただきました。
ありがとうございます。

# pyenvとanacondaのactivate衝突問題とは?

linuxやMacではpyenvを介してanacondaをインストールできます。
更に、anacondaで複数開発環境の切り替えをしたいケースがあると思います。
anacondaでの環境は、`source activate <環境名>`として切り替えを行えますが、pyenvの下では下記のようなエラーが出てシェルごと落ちます。

```bash
$ source activate
#>>> pyenv: -bash: command not found
```

理由はよくわかりませんが、pyenvがshimスクリプトを使ってpathをのっとっているので、変な事が起こっているのかもしれません。

anacondaが`conda activate`を採用してくれていれば... orz

# 解決策

## 1. pyenvを使わない。  
[決定版](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)は基本的にこの方法を紹介しています。
この方法ではpyenvはanacondaのインストーラとしてのみ使います。
pyenv経由でanacondaをインストール後に、pathへanacondaのインストールpathを書き込んで、pyenvを無視させます。

```bash
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
```
- メリット: 一番設定が少なく、覚えることが少ない。
- デメリット: `pyenv local`が使えない。

この方法では、pathを設定した後はpyenvを全く意識することがなくなります。

環境切り替えは全部`source activate`を用います。


## 2. activateをフルパスで実行する。

1.では`pyenv local`が使えなくなりますが、これが致命的な人もいると思います。
特にweb開発系の人で、PJ毎にパッケージの依存関係を変えたい人などは、`pyenv local`で作業フォルダ毎に環境を切り替えた方が効率的だと思います。
単純な解決策ですが、activateをフルパスで指定すれば、condaのactivateを指定して実行できます。

```bash
$ source $PYENV_ROOT/versions/anaconda3-2.5.0/bin/activate <環境名>
```

- メリット: シンプル
- デメリット1: activateするのにタイプ量が多い

デメリットはaliasを設定すれば解決しますね。

```bash
$ echo 'alias activate="source $PYENV_ROOT/versions/anaconda3-2.5.0/bin/activate"' >> ~/.bashrc
$ source ~/.bashrc
```

**あれ?これでよくね??**

`pyenv local`を使えば作業フォルダごとに環境を切り替えられます。

```bash
$ conda create -n py2 python=2.7
$ mkdir py2
$ cd py2
$ pyenv local anaconda3-2.5.0/envs/py2
$ python
#>>>Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec  6 2015, 18:08:32)
#>>>[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
```

環境切り替えは`activate`と`pyenv local`を併用します。

## 3. pyenv-virtualenvを入れる

[決定版の追記](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#pyenv-virtualenv)で記載した方法です。
pyenvのプラグインであるpyenv-virtualenvを入れて、`pyenv activate`を使います。

#### インストール
```bash
$ git clone git://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
source ~/.bashrc
```

#### pyenv-virtualenvの簡単な使い方

```bash
$ conda create -n py2 python=2.7
$ mkdir py2
$ cd py2
$ pyenv activate anaconda3-2.5.0/envs/py2
$ python
#>>>Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec  6 2015, 18:08:32)
#>>>[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2

$ pyenv deactivate
```

`source activate`を間違えて使うと、やっぱりシェルが落ちるので注意。

メリット: 多分正しい使い方。
デメリット: このためだけにpyenv-virtualenvを入れるのも...

環境切り替えは`pyenv activate`と`pyenv local`を併用します。

# メモ

いずれの方法も仮想環境管理はcondaを用います。(virtualenvは使わない。)
1-3のどれを選ぶかは好みだと思います。私は、今まで1派でしたが最近2派になりました。
RDSでoak-online-alter-tableを使う

[oak-online-alter-table](http://openarkkit.googlecode.com/svn/trunk/openarkkit/doc/html/oak-online-alter-table.html)を使うとMySQLの巨大なテーブルに、テーブル・ロックを掛けずに `alter table` を実行することができますが、権限が足りないと

> You do not have the SUPER privilege and binary logging is enabled (you \*might\* want to use the less safe log_bin_trust_function_creators variable)

というエラーを吐いてコマンドが失敗します。残念ながらRDSではSUPER権限を持ったユーザを作ることができませんが、エラーにもあるように `log_bin_trust_function_creators` パラメータを 1 にすれば実行することができます。`log_bin_trust_function_creators` パラメータはRDSインスタンスをrebootしなくても即座に反映されます。

## 参考

- [AWS Developer Forums: RDS and openark ...](https://forums.aws.amazon.com/thread.jspa?threadID=147065)
Ecto.Query を SQL に変換する


[Ecto.Adapters.SQL.to_sql/3](https://github.com/elixir-lang/ecto/blob/47aa0d0162eb75d1120260ce20387730b342f793/lib/ecto/adapters/sql.ex#L128) を使えばいいみたい。

```elixir
# iex -S mix
iex(1)> import Ecto.Query
nil
iex(2)> import Ecto.Adapters.SQL
nil

iex(3)> user_id = 2
2

iex(4)> q = from u in SampleApp.User, join: fu in assoc(u, :relationships), where: u.id == ^user_id, select: fu.id
#Ecto.Query<from u in SampleApp.User, join: r in assoc(u, :relationships),
where: u.id == ^2, select: r.id>

iex(5)> sql = to_sql(:all, SampleApp.Repo, q)
{"SELECT u1.\"id\" FROM \"users\" AS u0 INNER JOIN \"relationships\" AS r2 ON r2.\"follower_id\" = u0.\"id\" INNER JOIN \"users\" AS u1 ON u1.\"id\" = r2.\"followed_id\" WHERE (u0.\"id\" = $1)", [2]}
```
サービスを止めずにRailsで大きなテーブルにalter tableを実行する

サービスが成長してテーブルが肥大化してくるとインデックスの追加などを気軽に行うことができなくなってきます。alter tableするためにメンテナンスの時間を取ることもできますが、無停止で変更できるならそれに越したことはありません。

この記事では、Railsで開発されているWebサービスでそういったことを実現するための方法を紹介します。

# tl;dr

- Railsのmigrationを使うのではなく、無停止で `alter table` するための専用のツールを使いましょう。
- `alter table` したら、整合性が取れるように修正しましょう。

# この記事に書かないこと

[oak-online-alter-table](https://github.com/shlomi-noach/openarkkit/blob/master/openarkkit/doc/html/oak-online-alter-table.html)や[pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html)の細かい使い方については説明しません。どちらも公式ドキュメントが充実していますし、説明している良記事がWebにあるので、そちらを参照してください。

# 方針

Railsのプロジェクトは内部的に `schema_migrations` というテーブルを用意して、そこに実行済みのmigrationファイルのタイムスタンプを入れています。 `rake db:migrate` ではこのテーブルに **無い** migrationファイルを実行したのちに、そのタイムスタンプをテーブルに追加します。

なので、手動で `rake db:migrate` を実行する代わりに、手動でmigrationファイル相当の処理を実行したのちに、対応するタイムスタンプを `schema_migrations` に追加すれば、あたかもRailsのmigration機能を使ったかのごとくDBに手を加えることができます。

# 流れ

1. migrationファイルを書く
2. developmentで`rake db:migrate`実行する。
3. productionにツールを使って `alter table` を実行する
4. productionの `schema_migrations` に1で作ったmigrationファイルのタイムスタンプを追加する

## migrationファイルを書く

まずは何はともあれmigrationファイルを書きます。ここでは仮に `users` テーブルの `name` カラムにインデックスを追加するものとします。

```rb:db/migrate/20160407191432_add_index_to_users.rb
class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_index :users, [:name]
  end
end
```

## developmentでdb:migrateを実行する

migrationファイルができたら、これもいつも通りdevelopment環境で `rake db:migrate` を実行します。これはdb/schema.rbを更新するために行います。

ここまでやったらgit的にはコミットしてしまって問題ありませんが、この状態でデプロイすると通常通りのmigrationが走ってしまうので絶対にデプロイしてはいけません。

## productionにツールを使ってalter tableを実行する

世の中には大きなテーブルに `alter table` を実行するためのツールがいくつか存在するのでそれを使います。

- [oak-online-alter-table](https://github.com/shlomi-noach/openarkkit/blob/master/openarkkit/doc/html/oak-online-alter-table.html)
- [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html)

あたりが有名ドコロです。詳しい使い方はググッてください。

## productionのschema_migrationsにタイムスタンプを追加する

`schema_migrations` にタイムスタンプを追加します。タイムスタンプというのはmigrationファイルの先頭にある数字の部分のことで、今回はファイル名が "20160407191432_add_index_to_users.rb" なので、タイムスタンプは "20160407191432" になります。
[minecraft][Forge] ItemとBlockに情報を付与する [modding]

# はじめに
動作環境
1. minecraftForge 1.7.10
2. intelliJ 15.0.3

# やりたかったこと
こんなの
some informationの部分の実装

![スクリーンショット 2016-04-07 17.35.50.png](https://qiita-image-store.s3.amazonaws.com/0/114344/8f31287e-4b23-01ae-c4bf-e7f6af7d6e45.png)
![スクリーンショット 2016-04-07 17.35.59.png](https://qiita-image-store.s3.amazonaws.com/0/114344/5b5b6585-8309-c5b6-7f3e-e14acb94d276.png)

# コード部分

**アイテムとブロックで実装が異なる。**

- 最初は簡単なItemから

Itemにはもともと`addInformation`というメソッドが存在するので、それをOverrideしてつかう。以下を情報を追加したいItemのクラスに追加する。

```java:myitem.java
    @Override
    public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean b)
    {
        list.add("some information");
    }
```

- 次に複雑になるBlockでの`addInformation`の方法について

BlockにはaddInformationのメソッドはないので、Blockのクラスだけでは実現することができない。

ではどこにブロックのaddInformationが可能な箇所があるのか？？
> ItemBlockというものが存在する。

ということで、新しいJavaClassを作成。
名前はなんでもいいですが、ここではCustomItemBlockとする。
作成したクラスを以下のように書き換えてください。

```java:CustomItemBlock.java
@SideOnly(Side.CLIENT)
public class CustomItemBlock extends ItemBlock
{
    public CustomItemBlock(Block block)
    {
        super(block);
    }

    public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean par4)
    {
        list.add("some information");
    }
}
```

複数のブロックに対して、情報を表示したい場合はその都度、クラスを作る。

最後にregisterにひと工夫加える。

```java:ExampleBlock.java
GameRegistry.registerBlock(myblock, CustomItemBlock.class, "myblock");
```

これで情報を付与したブブロックの登録ができる！
GrailsとRailsの比較 〜GORMとActive Recordの新規保存処理の違い〜


GrailsからRailsに自分が移行中なのですが、
移行応援ということで、いるかわかんないですが同じような人のためにGrailsとRailsの比較します。
Grailsは3.1.4、Railsは5.0.0beta3で試しています。

今回はGORMとActive Recordの、オブジェクトの新規保存時の比較です。
各々のフレームワーク詳しい方、もし間違いとかあれば教えて下さい。

# 比較
## 基本
### Grails
`save()`を利用します。

```groovy
def book = new Book(title: "New Book")
book.save() 
```

ドキュメント：https://grails.github.io/grails-doc/latest/ref/Domain%20Classes/save.html

### Rails
同じように```save```があります。

```rb
book = Book.new(title: "New Book")
book.save
```

オブジェクトのインスタンス作成と保存を一気に行う```create```もあります。
Grailsの方には同様のAPIはありません。

```rb
book = Book.create(title: "New Book")
```

ドキュメント：http://edgeguides.rubyonrails.org/active_record_basics.html#create

### 違い
#### 基本的な戻り値
下記のように異なります。

|フレームワーク|API|戻り値|
|---|---|---|
|Grails|save()|保存されたインスタンス or null|
|Rails|save|true or false|
|Rails|create|生成されたインスタンス|

個人的に面白いなーと思ったのは、`create`がvalidationのパスする、しないにかかわらずインスタンスを生成して返すということです。（状態としてはもちろんinvalidになる）
参考：http://stackoverflow.com/questions/23975835/ruby-on-rails-active-record-return-value-when-create-fails

Grailsのsave()がバリデーションこけたときにnullを返すのはそんな好きではなかったですが（なので例外出るようにしてました。後述）正常時もインスタンス返してくるのも不思議な気分。
と思ったけど、`create`の場合はインスタンス返してくれないとバリデーションに引っかかったエラー情報がとれないですもんね、と納得。

#### 保存時に例外を出したいとき
こんな風に違います。

|フレームワーク|API|
|---|---|
|Grails|`save(failOnError: true)`を使う|
|Rails|`save!` or `create!`を使う|

Grailsの方の ```failOnError```はけっこう冗長な気がするので、Railsのこういう気配り好きです。
ただ、今は`!`にまだ慣れなくて、APIドキュメント読みながらだけど。
なお、どちらのフレームワークでも、グローバルな設定で例外投げるかtrue/false返すかは変更できるようです（まだRailsの方調べてない）

#### バリデーションをスキップしたいとき
どちらのフレームワークも、保存用のAPI内でバリデーションが走ります。ただし、それらをスキップする方法があります。

`save(validate: false)`を使います。

シンタックスは全く同じなんですが、スタンスは若干違っていそうで、[Railsのドキュメント](http://edgeguides.rubyonrails.org/active_record_validations.html#skipping-validations)には

```
They should be used with caution.
(これらは慎重に利用されるべきだ)
```
という教訓的な記述がありました。

# 感想
さすがRailsをよく参考にしているだけあって、かなりGrailsは似ているなと感じます。
ただ、似ているだけにフィーリングで使ってしまうと、細かいところでつまづくので注意せねばと考えています。
SourceTreeで、mergeしてpushしても、リモートがマージされない


1. developブランチから、featureブランチを新規作成＆チェックアウト
2. 変更作業
3. 作業内容をfeatureブランチでコミット
4. developブランチに切り替える
5. featureブランチをdevelopブランチにmerge
6. リモートにpush

上記流れをやっても、リモートがfeatureブランチが伸びているだけで、
マージされないとき、

mergeの前に、
「マージ結果を直ちにコミット（競合がない場合のみ）」
にチェックを入れればできた！

![スクリーンショット 2016-04-07 19.28.47.png](https://qiita-image-store.s3.amazonaws.com/0/40940/c858aa05-a874-8c09-4a02-f1690af8c6b9.png "スクリーンショット 2016-04-07 19.28.47.png")


既にマージしてしまった時は、
一度コミットボタンを押すと、自動でコメント欄に
「Merge branch 'feature' into develop」
と記入されているので、
コミット＆プッシュすれば、無事マージできる。
Google code prettifyでスクロールバーを出す方法

ブログにソースコードを載せるとき、もともとは[Google code prettify](https://github.com/google/code-prettify)を使っていたんですが、１行が長い場合（ワンライナーとかだとよくある。。。）改行されちゃうんですよね。

で、代替シンタックスハイライターとして[Gist](https://gist.github.com)を使っていたんですが、ふたつ不満があります。

1.行数の多いコードが記事そのものを長くする
2.見た目の統一感を出すためにわずか数行のコードでGistを作るのダサい

２番目のは&lt;code&gt;タグで対応してもいいんですが、ハイライト効かないし、やっぱ見た目の統一感って大事だし。ということで…。

## Google code prettifyで横スクロールバーを出す
よくよく調べてみたらGoogle code prettifyのスタイルシートでは`word-wrap:break-word`になっています。要はわざわざ折り返しするように指定してある。

そこでこれを`word-wrap:normal`指定に戻すと折り返しをしなくなります。で、折り返しをしなくなると自動的にオーバーフロー分に対応して横スクロールバーが出てきます。なんて簡単！

## Google code prettifyで縦スクロールバーを出す
こちらはもっと簡単。ソースコードを表示している`<pre class="prettyprint">`ボックスに対し高さ制限を追加します。

たとえば50行もあるソースコードのうち10行以降を枠外に追いやっておきたいのであれば、`height:10em`指定をしておけばOK。はみ出し分は縦スクロールバーでスクロール表示できるようになります。（実際にはpaddingがあるので少し表示量は減るかも）

## まとめ
Google code prettifyスクリプト読み込み指定のついでに以下のようなスタイルを追記しておきましょう。

```
<!-- Google code prettify start -->
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
<style type="text/css">
pre.prettyprint {
  font-size:12px;
  word-wrap:normal;
}
pre.high {
  height:12em;
}
</style>
<!-- Google code prettify end -->
```
(Chromeのみ) IMEがONでも半角数字のみ入力可能にする

備忘録的投稿

```js
inp.oninput=_=>inp.value=inp.value.replace(/[０-９]/,(s)=>String.fromCharCode(s.charCodeAt(0)-0xFEE0));
inp.onkeydown=(evt)=>{
  if(evt.shiftKey) return false;
  return /Backspace|Tab|Enter/.test(evt.code) || /Digit([0-9])/.test(evt.code);
}
```

[demo](https://jsfiddle.net/8L6zL8nf/4/)

問題点：Chromeしか動作しない。カーソル移動が無理。maxlength属性が効かない。
Mono(ASP.NET) note


# Target OS

I want packege install!

- ubuntu `ready!`
- centos7 `ready!`
- amazonlinux `libpng15 unsuported... but I have WA`

## Notfound libpng15 WA
http://blog.brendanthompson.com/2015/09/08/installing-mono-onto-an-amazon-linux-ec2-instance/

Search `libpng15` rpm via google, so Download & install. You must install fc2x 's rpm.  ___DO NOT___ install `libpng-15.x.y.rpm`.

```
wget ftp://fr2.rpmfind.net/linux/fedora/linux/updates/23/x86_64/l/libpng15-1.5.25-1.fc23.x86_64.rpm
yum install libpng15-1.5.25-1.fc23.x86_64.rpm
```

## Normal install..

```bash:
rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
yum-config-manager --add-repo http://download.mono-project.com/repo/centos/
yum install mono-complete
```

# Run ASP.NET

## install xsp & nginx
```
yum install xsp nginx

```

## config nginx for fast-cgi
http://www.mono-project.com/docs/web/fastcgi/nginx/

```
 server {
         listen   80;
         server_name  www.domain1.xyz;
         access_log   /var/log/nginx/your.domain1.xyz.access.log;

         location / {
                 root /var/www/www.domain1.xyz/;
                 index index.html index.htm default.aspx Default.aspx;
                 fastcgi_index Default.aspx;
                 fastcgi_pass 127.0.0.1:9000;
                 include /etc/nginx/fastcgi_params;
         }
 }
```

## xsp (fastcgi) init script
https://gist.github.com/jokecamp/6399204

But, upstart more better.

## xps (fastcgi) upstart & config.xml

```:/etc/init/monofastcgi.conf
description "monoserver"
author "hisatoshi imaoka <imaoka@cloudpack.jp>"

start on runlevel [2345]
stop on runlevel [016]

exec /usr/bin/fastcgi-mono-server4 --config-file="/etc/monofastcgi/monofastcgi.xml"
```

https://github.com/mono/xsp/blob/master/README.mono-fpm.md#configuration-directory

```xml:/etc/monofastcgi/monofastcgi.xml
<Settings>
  <Setting Name="applications" Value="/app1:/var/www/app1" />
  <Setting Name="socket" Value="tcp:127.0.0.1:9000" />
  <Setting Name="logfile" Value="/var/log/mono/fastcgi.log" />
  <Setting Name="loglevels" Value="Standard" />
</Settings>
```
  
## HyperFastCGI
https://github.com/xplicit/HyperFastCgi

### Env-values
@ default configure

```
LD_LIBRARY_PATH=/usr/local/lib
MONO_GAC_PREFIX=/usr/local
```
### nginx
`fastcgi_keep_conn on;`
Rails ActiveDecoratorでbase moduleのDecoratorを使う


以下の様なモデル構成の時に、`Article::Base` module についの
decoratorを定義して使いたい。

```ruby:model.rb
module Article::Base
end

class Article::Suports
  include Article::Base
end

class Article::Tech
  include Article::Base
end
```

## How to
`active_decorator` `0.7.0`

```ruby:model.rb
module Article::Base
  def self.base_class
    Article::Base
  end
end

#app/decorator/article/base_decorator.rb
module Article::BaseDecorator
 def hoge
   `hoge`
 end
end
```

```haml:show.index.haml
-# includeしたmodelでbaseのdecoratorのメソッドが呼べる
= @article_tech.hoge
```
平日の営業時間だけEC2を稼働させる

# はじめに
開発サーバーをmicroタイプのインスタンスで何台も立ち上げてるのですが、塵も積もれば山となるといった感じで無視出来ないコストになっております。

立ち上げ間もないサービスなので、1円でもコストを下げるべく奔走しており、EC2は必要な時だけ立ち上げようと思いやってみました。

# やりたい事
* 平日の8:00にEC2自動起動
* 平日の20:00にEC2自動停止
* 祝日は起動しない

# 前提
AWS CLIが使える状態

# 前準備
## jqインストール

jkではないです。

```
curl -o /usr/bin/jq http://stedolan.github.io/jq/download/linux64/jq
```

パーミッションエラーが起きたらjqのパーミッション変更

```
chmod 755 /usr/bin/jq
```

# シェルスクリプトの作成
今回は``shelluser``というユーザーディレクトリ配下に``ec2.sh``というファイルで作成しました。

```
vi /home/shelluser/ec2.sh
```

### 以下内容を入力
コピペして、リージョンとインスタンスidを入れる部分だけ変えてください。

```vim
# リージョンの設定
readonly REGION='ap-northeast-1'

# 停止したいEC2インスタンスのIDを配列で保持
EC2_ID_ARRAY[0]='インスタンスIDを入れます'
EC2_ID_ARRAY[1]='インスタンスIDを入れます'
```
**EC2起動と停止のスクリプト**

```vim
#!/bin/sh

## 実行パラメータ
# --start (EC2起動)
# --stop (EC2停止)

# リージョンの設定
readonly REGION='ap-northeast-1'

# 停止したいEC2インスタンスのIDを配列で保持
EC2_ID_ARRAY[0]='インスタンスIDを入れます'
EC2_ID_ARRAY[1]='インスタンスIDを入れます'

# 祝日チェック 2016 (もっといい感じにしたい)
readonly HOLIDAY_2016='01/01','01/11','02/11','03/20','03/21','04/29','05/03','05/04','05/05','07/18','09/19','09/22','10/10','11/03','11/23','12/23'

# 今日をmm/ddで取得
today=`date '+%m/%d'`

# 祝日リストに今日が含まれるか？
if [ `echo $HOLIDAY_2016 | grep $today` ] ; then
  echo "今日は祝日"
  # 祝日は何もしない
  exit
fi

# パラメータ未入力
if [ -z "$1" ] ; then
    # 未指定
    echo "パラメータ未入力"
    # 強制終了
    exit
fi

# パラメータの値がstartでもstopでもない
if [ $1 != '--start' -a $1 != '--stop' ]; then
    echo "パラメータの値がおかしい"
    # 強制終了
    exit
fi

# 配列に格納したインスタンスIDをforループで展開 (インスタンスが増えたら${EC2_ID_ARRAY[x]}を増やしていく)
for instance in ${EC2_ID_ARRAY[0]} ${EC2_ID_ARRAY[1]}
  do

    # インスタンスのステータス確認
    status=`aws ec2 describe-instance-status --instance-ids $instance --region $REGION | jq -r '.InstanceStatuses[].InstanceState.Name'`

    # EC2インスタンス起動
    if [ -n "$1" ] && [ $1 = '--start' ] ; then
        # インスタンスのステータスが空(停止中)なら
         if [ -z "$status" ] ; then
           # 起動処理開始
           aws ec2 start-instances --instance-ids $instance --region $REGION
         fi
    fi

     # EC2インスタンス停止
    if [ -n "$1" ] && [ $1 = '--stop' ] ; then
        # インスタンスが稼働中なら
         if [ -n "$status" ] && [ $status = 'running' ] ; then
             # 停止処理開始
             aws ec2 stop-instances --instance-ids $instance --region $REGION
         fi
    fi

done
```

# テスト

起動コマンド

```
sh /home/shelluser/ec2.sh --start
```

停止コマンド

```
sh /home/shelluser/ec2.sh --stop
```

実行してEC2インスタンスが起動したり停止している事を確認してみてください。

# cronの設定

手動実行のテストで問題無ければcronの設定をします。

```vim
crontab -e
```

```vim 
# 朝8時にEC2起動
0 8 * * 1-5 sh /home/shelluser/ec2.sh --start
# 夜8時にEC2停止
0 20 * * 1-5 sh /home/shelluser/ec2.sh --stop
```
あとは実行されるのを待つだけです。

# おわりに
サービスを作るのもエンジニアの仕事ですが、技術を使ってコストを削減するのも必要な仕事だなぁと再実感しました。
Web based synthesizers supporting Web MIDI

# This is...
A post collecting web based synthesizer that you can play with your keyboards through the Web MIDI API. If you find any other synthesizer, please let me know, or send a pull request.

Web MIDI APIを使ってキーボードから演奏できるウェブベースのシンセサイザーを集めてみました。ここにないシンセを見つけたら御一報あるいは編集リクエストをぜひ。

# Web Audio MIDI Synthesizer
https://webaudiodemos.appspot.com/midi-synth/index.html
<img width="905" alt="Untitled.png" src="https://qiita-image-store.s3.amazonaws.com/0/12843/96a48fba-6bbe-1359-30b2-f3616cb430c4.png">

# WebSynths
http://www.websynths.com/
<img width="1373" alt="websynths.png" src="https://qiita-image-store.s3.amazonaws.com/0/12843/6374c414-8bc7-6f63-ea71-1e109c6e6cf2.png">

# Web FM synthesizer made with HTML5
http://www.taktech.org/takm/WebFMSynth/
<img width="1035" alt="fm.png" src="https://qiita-image-store.s3.amazonaws.com/0/12843/8e809e26-4030-a39e-9028-f0e82353b626.png">

# Viktor NV-1 Synthesizer
https://nicroto.github.io/viktor/
![nv1.png](https://qiita-image-store.s3.amazonaws.com/0/12843/43bb418e-2af5-a95f-de93-4fe64763e43d.png)

# Sympathetic Synthesizer System Mk 1
https://stuartmemo.com/synth/
<img width="928" alt="mk1.png" src="https://qiita-image-store.s3.amazonaws.com/0/12843/d215c40b-082e-8440-5a82-ec3cc7e18b86.png">

# Web Audio Synth V2
http://aikelab.net/websynthv2/
![aike.png](https://qiita-image-store.s3.amazonaws.com/0/12843/861e577a-743d-7cc8-0b3b-fe1fefe39c8d.png)

# Heisenberg synthesizer
https://www.audiotool.com/product/device/heisenberg/
![heisenberg.png](https://qiita-image-store.s3.amazonaws.com/0/12843/4a56b61f-8031-c75c-1302-43c4c8d0538f.png)

# 106.js
http://juno-106.js.org/
![106.js.png](https://qiita-image-store.s3.amazonaws.com/0/12843/80644b9f-c052-059b-b45e-309d80dde7e3.png)

# Foo YC20
http://foo-yc20.codeforcode.com/
![Foo YC20.png](https://qiita-image-store.s3.amazonaws.com/0/12843/5e281e99-afc4-2cef-e298-ae47c1a3b4ab.png)
【メモ】Sass/Scss、Compassの挙動メモ

ちょっと苦痛になってきたので気分転換にメモ書き。

# functionでプレースホルダ作りたい

## 問題のコード

```scss
$gList: ();
@function hoge($list...) {
  @each $v in $list {
    %foo {
      content: $v;
    }
    $gList: append($v);
  }  
}
```

見事に怒られる。
`@function`だとどうやらプレースホルダが作れない模様。
`@mixin`使えよってことですね。

## 結論
`@mixin`と`@function`両方で頑張る。（`@mixin`主体で）
あくまで`@function`は処理して値返すだけ

# JSON読み込んでmapにしたい

## やってみた

```rb
require "sass"

module JSON2Map
  def json2map(filePath)
    
    # JSON文字列を取得
    jsonStr = ""
    fs = open(filePath.value)
    jsonStr = fs.read
    fs.close
    
    # JSON文字列をrubyオブジェクトに変換
    obj = JSON.parse(jsonStr)

    # Sass::Script::Value::Mapオブジェクトを作って返す
    map = {}
    obj.each {|k, v|
      # 実際はStringだけじゃなく色んな型が存在したり、
      # ネストに対応するために再帰したりする
      map[Sass::Script::Value::String.new(k)] = Sass::Script::Value::String.new(v)
    }
    Sass::Script::Value::Map(map)
  end
end

module Sass::Script::Function
  include JSON2Map
end
```

config.rbにPluginとして読み込むと

```scss
$hogeMap: json2map('hoge.json');
```

こんな感じに扱えるようになります。やったー！

## 結論

先人が sass-json-var を作っています。
https://github.com/vigetlabs/sass-json-vars

* 本当に個人的に import する形を嫌っただけ
* カスタム関数（プラグイン）に挑戦したかった（なおruby経験0ヶ月）
* 大いに~~丸パクリ~~参考したので、特に思い入れがないのなら、本当にsass-json-var を使った方が楽です
* 自前でしっかり書いたやつは各型に適切に変換してます。

なお、sass-json-varは全部文字列でくるので適宜変換が必要だった気がします。
例：

```scss
@import "hoge.json";  // (foo: "12px")

$foo: map-get($hoge, foo); 
p {
  font-size: $foo - 2;  // error!
}
```

なお、必要そうな型に関しては、以下のとおり。

```rb
Sass::Script::Value::String.new("")  # 文字列
Sass::Script::Value::Number.new(0)   # 数値
Sass::Script::Value::Bool.new(true)  # 真偽値
Sass::Script::Value::List.new([])    # 配列
Sass::Script::Value::Map.new({})     # 連想配列
```

listは値をSassオブジェクトにしないとエラーが出ました。
mapはキーも値もSassオブジェクトにしないとエラーが出ました。


# 終わりに

↑のを探り探りやりながら、利用する人がどうしたら使いやすいかを
考えながら作っているので、あれやこれや悩んで先に進まないという苦痛です。

とりあえずRuby気持ち悪い…！（普段JS書きなんでまったく慣れてないだけです）
jenkins-chatwork-pluginを使ってChatworkに投稿する

Chatwork APIを使った jenkinsのプラグインを作ってくれてるみたいなので、
インストールして使ってみた。

### Plugin ダウンロード
[JenkinsのChatwork Pluginページ](https://wiki.jenkins-ci.org/display/JENKINS/ChatWork+Plugin)のLatest Releaseからhpiファイルをダウンロード

### Plugin インストール
Jenkinsの管理 > プラグインの管理 > 高度な設定 > プラグインのアップロード
ダウンロードした「Chatwork.hpi」ファイルを選択し、アップロードする

### Jenkins 全体設定
インストール完了後、Jenkinsの管理 > Jenkinsの設定 > Chatwork Plugin
にて、API Keyを設定
※Proxy経由でインターネットにアクセスする場合は、Proxy Server、Proxy Portを設定

### Jenkins job設定
任意のプロジェクトを選択し、設定 > ビルド後の処理の追加から「Notify the Chatwork」を選択し、
メッセージ内容を記載