OmniAICreator/Qiita-1.07M huggingface dataset:
Hello！Xamarin


#そもそもXamarinって何？
Xamarin(ザマリン)は、UWP/Mac/iOS/AndroidのアプリをC#を使ってクロスプラットフォームで作ることができる開発ツール。もともとは馬鹿高いライセンス料を支払う必要があったけどMSに買収されて無料で使えるようになった。
開発環境はWindowsはVisualStudioで、MacはXamarin Studio。
「iOS Simulator on Windows」ってのがあるのでMacがなくてもiOSアプリの開発ができるらしい。(手元にWindows端末がないので試してない。)

#ダウンロードとインストール
ここからダウンロードできる。
https://store.xamarin.com/

![スクリーンショット 2016-04-08 17.36.53.png](https://qiita-image-store.s3.amazonaws.com/0/19516/2cd321f2-11a9-7fef-09d1-3cca0f0b6574.png)

名前とかメアドとか書いてagreeにチェック。
![スクリーンショット 2016-04-08 17.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/19516/faff778b-cc8c-17f2-39e8-80d1a46f977b.png)

IDEとかSDKとか必要なものを諸々インストールしてくれる。
インストール中の画面はキャプチャしてないけど、何を開発するか(iOS向けかAndroid向けか)を選ぶくらい。
Android SDKがすでに入ってる人はAndroidの項目を外しておいてインストール後にSDKの場所を指定でいいのかな？

SDKの場所はPreferencesのSDK Locationsから設定できる。
![スクリーンショット 2016-04-08 17.46.22.png](https://qiita-image-store.s3.amazonaws.com/0/19516/313d3d0a-a048-762c-3633-7d123be2320d.png)


起動するとこんな感じ。
![スクリーンショット 2016-04-08 17.32.33.png](https://qiita-image-store.s3.amazonaws.com/0/19516/8bb90983-9edb-a96f-281f-114ca15d0554.png)

New Solution...押すと
![スクリーンショット 2016-04-08 17.32.50.png](https://qiita-image-store.s3.amazonaws.com/0/19516/0c5cb2af-b18a-a728-181c-7260dadd27e4.png)

#とりあえずサンプル実行 iOS編
iOS - Single View Appを選択してNext
![スクリーンショット 2016-04-08 17.55.57.png](https://qiita-image-store.s3.amazonaws.com/0/19516/59e32892-d261-b99a-9db6-39b1f8db3dbd.png)

アプリの名前とかDeviceとかターゲットのiOSバージョンとか選択してNext
![スクリーンショット 2016-04-08 17.56.46.png](https://qiita-image-store.s3.amazonaws.com/0/19516/6a7af3e4-d3dc-97d0-f119-de953d78601f.png)

git使うときは[Use git for ~]にチェックつけてNext
Test Cloudはその名の通りCloudでテストが出来るみたいだけどまだ使ったことない。
![スクリーンショット 2016-04-08 17.56.56.png](https://qiita-image-store.s3.amazonaws.com/0/19516/9360d9bd-e27d-2fb6-adca-1c5a21e3f7b8.png)

プロジェクト作成完了。Main.storyboardでUI作ってView Controller.csにコードを書いていく。
![スクリーンショット 2016-04-08 18.04.57.png](https://qiita-image-store.s3.amazonaws.com/0/19516/c98205b9-78ed-3c88-fd01-20aef356283e.png)

Main.storyboardはこんな感じ。左上の▶︎ボタン押せば実行される。
![スクリーンショット 2016-04-08 18.08.24.png](https://qiita-image-store.s3.amazonaws.com/0/19516/0987356b-4e3a-0da5-7a7b-fead2a940db8.png)

シュミレーターはXcodeで使ってるやつ。
![スクリーンショット 2016-04-08 18.11.06.png](https://qiita-image-store.s3.amazonaws.com/0/19516/7fa7b3ea-ee51-e0ac-e9e2-bbaab3ed8fcf.png)

#とりあえずサンプル実行 Android編
iOSと一緒。
実機を接続していればそっちで実行出来る。
エミュレーターを使うときはAVD ManagerでVirtualDeviceを作る必要がある。

#とりあえずサンプル実行 クロスプラットフォーム編
iOS、Androidをほとんど同じだけど、「Shared Code」って項目がある。
コードの共通化方法の違いらしい。
初心者にはPCLがいいとのことなので「Use Portable Class Library」を選ぶ。
![スクリーンショット 2016-04-08 18.37.53.png](https://qiita-image-store.s3.amazonaws.com/0/19516/f7ab1a60-9a46-b0e3-0098-2a368a0f134c.png)

#次回予告
簡単なアプリを作ってみる。iOS編
流し見60秒でユニットテストを知る

## 単体テスト、ユニットテストとは


http://www.slideshare.net/iKenji/ss-52081693

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/74133/7a1356fa-eba6-1242-520e-b9bececfd880.png)
エンジニアのプレゼン／スライド作成入門

> 基本はシンプル。安心感のある説明資料をサクサク作りたい (WEB+DB PRESS plus)  

のフィードバックです。適当な箇所あります。すみません。

http://www.slideshare.net/iKenji/ss-52244719

![abcde.png](https://qiita-image-store.s3.amazonaws.com/0/74133/49741878-c776-50b3-9205-deb96121c9fb.png)
リクエストの内容をログに出すだけの簡単HTTPサーバ


```
require "webrick"
require "pp"

server = WEBrick::HTTPServer.new(BindAddress: "0.0.0.0", Port: 8080)

server.mount_proc("/") do |request, response|
  puts request
end

trap(:INT) { server.shutdown  }
server.start
```

# 参考

* [WEBrickを使うためのメモ - 再帰の反復](http://d.hatena.ne.jp/lemniscus/20090722/1248261257)
git 差分を見る

マージ前にはきちんと差分を見ましょう


【想定】
現在のブランチ：issue001-fix-xxx
マージ先ブランチ：master
<br>

~~~ プログラム修正後 ~~~
### 前回コミット(HEAD)からの差分
```sh
git diff HEAD
```
### ステージングエリアとHEADとの差分
```sh
git diff --staged
git diff --cached
```
ステージングエリアというのはaddしたファイル群のことですね。ちなみに--staged と --cachedは同じ結果。お好きな方をどうぞ
<br>
~~~ コミット ~~~

### 自分がしたコミットを確認
```sh
git log -p --name-only (修正したファイル一覧)
git log -p (変更内容差分, ファイル名を引数で渡すと単体で指定可)
git log -p --ignore-space-change (スペースや改行で差分が見づらいとき)
```
<br>
~~~ マージ先(master)に切り替える(```git checkout master```)
編集途中のファイルが残っているからできないと言われたら 
下記どちらかを実行後チェックアウト:arrow_lower_left: 

```sh
git checkout . 　(編集内容を取り消す(HEADの状態に戻す))←※コミットした内容は消えません
git stash save (編集内容をスタックする(後で取り出せます))
```

### masterブランチを最新に更新(masterブランチなう)
```sh
git  pull --rebase origin master
```
リモートの更新をそのまま持ってくるだけなので```--rebase```でマージコミットは作らない

### 他人の更新を確認する
```sh
git log --oneline 
(念のため自分の状態も確認しておきたい人は下記コマンド )
git status -s 
```

### **プルリクエストで見られる差分を確認**
```sh
git diff master...issue001-fix-xxx
```
```git diff [マージ先ブランチ]...[マージ元ブランチ]```はマージによっての修正内容が、プログラム単位の差分で見られます。(※本当はコミット単位でも見たいんですが、その方法はわかりません。知りたい :fearful: 

追記)コミット単位->　[Qiita-[Git]ブランチ間の差分をコミット単位で知る・見る](https://qiita.com/ikenji/items/fecd39966bbf463da3f4)  
[Qiita-プルリクエストで表示される差分の仕組みを GitHub に問い合わせたときの話](https://qiita.com/ikenji/items/7417d4f41ac8b564b36d)




### いざマージ！
```sh
git merge --no-ff issue001-fix-xxx
```
マージ単位でrevert(打ち消し)できるようにこの場合は```--no-ff```でマージコミットをしっかり残しましょう

```git log --author [自分の名前]```
masterに自分が作ったコミットがちゃんとマージされています

<br>

お疲れ様でした！
```git revert```や```reset```、```reflog```などの取り消し、修正の仕方や、
```stash```や```blame```などのオシャレなコマンドに関しては後日別の投稿でご紹介する予定です。

<br>

----

### 過去に書いた Git関連の記事 :arrow_double_down: 

[Qiita-何も知らない人がGitとGitHubを独学で知る](http://qiita.com/iKenji/items/367e8344490dd37e14f0)
[Qiita-git checkout できないとき、私はこうしてます。](http://qiita.com/iKenji/items/c03bd6e72f57291da24c)
[Qiita-プルリクエストで表示される差分の仕組みを GitHub に問い合わせたときの話](https://qiita.com/ikenji/items/7417d4f41ac8b564b36d)
[Qiita-ブランチ間の差分をコミット単位で知る・見る](https://qiita.com/ikenji/items/fecd39966bbf463da3f4)
modo 使ってみた 目次

3Dのことを1mmもわかっていない状態から 3D マスターになるべくはじめるシリーズ。

目次です。

- [[modo 使ってみた #01] インストールからブーリアンで鉛筆つくるまで](http://qiita.com/aki_55p/items/39b0ed3d9572a48b5fb8)
- [[modo 使ってみた #02] ベジェ曲線で曲がったパイプをつくる](http://qiita.com/aki_55p/items/0a80af547316ea1ecc8f)
- [[modo 使ってみた #03] 頂点押し出しでゴルフボールをつくる](http://qiita.com/aki_55p/items/f02eeb46dc79fd54342d)
Kotlinの学習がてらWIFIをON/OFFするだけのアプリを書いてみた

## 前置き

画面なんかいらねーんだよ！**WIFI ON/OFFだけ**できさえすればいいんだよ！
ということで、趣味と実益をかねて実装してみました。


## WifiToggler


~~需要がありそうならそのうちGoogle Playに公開する....かも。~~
コードは以下で公開しています。
https://github.com/furu8ma/WifiToggler

Android Studio 2.0でビルドしています。

Google playにも載っけてみました。
https://play.google.com/store/apps/details?id=jp.hateblo.furu8ma.wifitoggler

~~Android4.4以上にしちゃったけど、全然たいしたことしていないので、minsdkバージョンをいじれば、2.xでもいけるはず。~~
それにしても、画面がないアプリなのにスクリーンショットとか、しんどい。
こんな時代だし、自分でビルドしたものをインストールするのが、一番安心ですね。


```MainActivity.kt
package jp.hateblo.furu8ma.wifitoggler

import android.app.Activity
import android.net.wifi.WifiManager
import android.os.Bundle
import android.widget.Toast

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        toggleWifi()
        finish();
    }

    fun toggleWifi() {
        val wifiManager: WifiManager = getSystemService(WIFI_SERVICE) as WifiManager;
        if (wifiManager.isWifiEnabled) {
            Toast.makeText(this, "WIFI OFF", Toast.LENGTH_SHORT).show()
            wifiManager.isWifiEnabled = false;
        } else {
            Toast.makeText(this, "WIFI ON", Toast.LENGTH_SHORT).show()
            wifiManager.isWifiEnabled = true;
        }
    }
}
```


```manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.hateblo.furu8ma.wifitoggler">

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.Translucent"
  >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```

## 使い方
アプリアイコンをタップするごとに、WIFI ON,OFFが切り替わります。
状態をトーストで通知するだけのミニマルデザイン。

ジェスチャーをサポートしているHomeアプリと組み合わせると良い感じです。
私はNova Launcherで、右トグルジェスチャーにバインドしました。
これだよ、これ。

![android.png](https://qiita-image-store.s3.amazonaws.com/0/74328/8e3dba59-b6eb-7ae6-15f3-10c984103d1f.png)


## Kotlinの感想

Javaに比べると冗長な記述をだいぶ省けて読みやすいコードが書ける印象。
あとKotlinがわかっていなくても、Android Studioの機能[Clean up code]で、Kotlin流の書き方に変えてくれるのがありがたい。

新しい言語に切り替えるということは、コードを読める人が少なくなる = readable 率が下がる のが非常に大きな問題なわけですが、Javaが読めれば、学習しなくても、Kotlinも読めそうだな、と感じました。

**読みやすさ(含む、読めるプログラマー数) >>> 書きやすさ ( ≒　バグの少なさ )**

だと思っているので、躊躇していましたが、このくらいなら素直な言語ならKotlinで問題なさそうです。

Javaも悪くはないんですが、冗長が記述が多いこと、政治的にゴタゴタしていることを考えると、これからは、Kotlinかな。
Jenkins job を Ajax で実行して結果を得る

# やりたいこと

自作の Web UI からポチっとして Jenkins job を起動し、非同期で実行結果がほしい

# やりかた
## Jenkins の CORS 許可
**[CORS Filter Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Cors+Filter+Plugin) を入れる**

自ドメインから Ajax で Jenkins API を叩いて結果をもらいたいので、Jenkins に CORS を許可するよう設定する。

- Access-Control-Allow-Origins: 自分のドメイン + (テスト用に localhost等)
- Access-Control-Allow-Methods: GET
- Access-Control-Allow-Headers: とくになし
- Access-Control-Expose-Headers: Location

が最低限必要になりそう

## ビルド URL を叩く
叩いて Polling する…

ビルドをトリガーする URL については[過去記事](http://qiita.com/komazarari/items/58f512cac8a9e4de554c)など参照。

### jQuery の例

```js
$.ajax({
  type: 'GET',
  url: 'https://myjenkins.example.com/job/myjob/buildWithParameters',
  data: { foo: 'bar', hoge: 'fuga' },
  success: function(_d, _t, xhr) {
    var queueUrl = xhr.getResponseHeader('Location');
    var queueId = setInterval(function() {
      console.log("Start queue polling");
      $.ajax({
        url: `${queueUrl}api/json`,
        dataType: 'json',
        success: function(data) {
          if (data.executable) {
            clearInterval(queueId);

            var jobWaitId = setInterval(function() {
              console.log("Start job polling");
              $.ajax({
                url: `${data.executable.url}api/json`,
                dataType: 'json',
                success: function(data) {
                  if (data.result) {
                    console.log('Job finished ! result: ', data.result);
                    clearInterval(jobWaitId);
                  }
                }
              })
            }, 1000);
          }
        },
        error: function(xhr, st, err) {}
      });
    }, 1000)
  },
  error: function(xhr, st, err) {}
})
      
``` 

### es6 & whatwg fetch の例

```js
fetch('https://myjenkins.example.com/job/myjob/buildWithParameters/?foo=bar&hoge=fuga')
  .then(res => {
    const queueUrl = `${res.headers.get('Location')}/api/json`;
    const queueId = setInterval(() => {
      console.log("Start queue polling");
      fetch(queueUrl)
        .then(res => res.json())
        .then(json => {
          if (json.executable) {
            clearInterval(queueId);

            const jobWaitId = setInterval(() => {
              console.log("Start job polling");
              fetch(`${json.executable.url}/api/json`)
                .then(res => res.json())
                .then(json => {
                  if (json.result) {
                    console.log('Job finished ! result: ', data.result);
                    clearInterval(jobWaitId);
                  }
                })
            }, 1000);
          }
        })
    }, 1000);
  })
```

# 仕組み

Jenkins のビルド URL を叩くと、レスポンスヘッダの `Location` にキューの URL が入ってくる。
https://issues.jenkins-ci.org/browse/JENKINS-30317
CORS 有効にしないとこのレスポンスヘッダがとれない。

Jenkins は URL のおしりに `/api/<format>` のようにしてデータが取れる。

このキュー URL をしばらく見ていると、ビルドをトリガーした直後は Quiet Period となっており、job 実行待ちの状態だが、しばらく待つと `executable.url` に実行 job の URL が入ってくる。

さらにその job URL の実行状態をチェックしながら、job が完了すると `result` が取得できるようになるのでそれを待つ。


わりとめんどくさい :weary:
[modo 使ってみた #03] 頂点押し出しでゴルフボールをつくる

3Dのことを1mmもわかっていない状態から 3D マスターになるべくはじめるシリーズ。
目次は[こちら](http://qiita.com/aki_55p/items/4fad97cfaa814081e06c)

## 今回やったこと
今回も[こちらのチュートリアル](http://www.mars-inc.net/press/tutorials/index.html)から、「03: ゴルフボールの作成」をやりました。

新しく出てくるのは、
- ポリゴンのモード
- 頂点押し出し
- subdivision surface
- boundary 選択
- weight tool
の5つ。

## 球の配置
`ctrl` を押しながら球を配置してドラッグすると xyz 方向に対称な形で配置できます。

球のポリゴンのモードが３つあって、球配置時の左下の欄の Sphere Mode で変更できます。（余談ですが、配置後にパラメータ調整したくなった時のこの欄の呼び出し方がわからない…）
- glob（グローブ）
- Quadball（四角形ボール）
- tessellation（モザイク）
となっており、球面のポリゴンの分割の仕方の模様。
glob は球面に沿っていい感じに分割。Quadball は四角のみ。tessellation は三角のみ。tessellation がいわゆる普通のポリゴンの分割なのかな？
今回は tessellation で分割です。

## 頂点の押し出しでゴルフボールの凹みをつくる
選択モードを vertex にして、球の任意の頂点をダブルクリックすると、球全体の頂点が選択されます。便利。

そして、左カラムの vertex タブの中から Extrude を選択して、頂点をクリックすると赤と青のハンドルが現れます。
<img width="773" alt="Screen Shot 2016-04-08 at 17.02.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/1725/02faa7ff-0426-8ad6-916f-2913fa143393.png">
赤いハンドルが、頂点を押し出す範囲。
青いハンドルが、頂点の押し出し具合です。

これらを操作して、ゴルフボールっぽい凹みを適当につくります。

## subdivision surface をかける
`tab`キーを押すと subdivision surface っていうのがかかります。
subdivision surface とは、日本語で「細分割曲面」っていうやつで、ポリゴンメッシュを規則的に分割することで得られる曲面とのこと。（from [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%96%E3%83%87%E3%82%A3%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%95%E3%82%A7%E3%82%B9))

種類があるみたいで、`shift`押しながらだと、違う種類のやつになったりするけど、見た目で互いがわからなかったです。
この辺はまたそのうち調べてみよう。

## 穴の縁を鋭角にする
よりゴルフボールっぽくするために穴の縁を鋭角にしていきます。
まずは、右カラムの Lists タブから Statics -> Polygons -> By Vertex -> 3 の＋マークを押すと、3頂点で構成されるポリゴンが全部選択されます。
<img width="829" alt="Screen Shot 2016-04-08 at 17.48.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/1725/f1b03fb4-a4b5-6117-7af4-e8d4dbdddd1e.png">

そして、`ctrl` を押しながらだと、上部タブの Edges が Boundary になって、クリックすると選択しているポリゴンの境界部分のみが選択された状態になる。
<img width="855" alt="Screen Shot 2016-04-08 at 17.48.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/1725/8800f8cd-1afb-3799-b8f0-f3cd0345596a.png">

次に、右カラム Lists の中の weightmap -> subdivision が選択された状態で、メニューバーの vertex map から weight tools を選択。
左下に weight って項目出てくるからそれいじる。200％くらいでゴルフボールっぽくなる。（メインビューをドラッグしても変わる）
<img width="1072" alt="Screen Shot 2016-04-07 at 23.32.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/1725/d52765a1-9193-af6f-1060-2de8c8a2c4dc.png">

これで完成。

でもまだ vertex の weight っていう概念がよくわかってない。（日本語だと「頂点ウェイト」って言うぽい）
ボーンの動きに対してボディの形状がどれくらい変化するかの値で、硬さみたいなものらしいけど、なんでそれでエッジが鋭角になるのかわからない。

次もチュートリアルやります。
だいぶ操作がこなれてきた。

## 参考
- [MARS modoチュートリアルシリーズ　初級編](http://www.mars-inc.net/press/tutorials/index.html)
- [球をつくるよ](http://modofukukoka.blogspot.jp/2014/02/blog-post_5.html)
- [サブディビジョンサーフェス - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%96%E3%83%87%E3%82%A3%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%95%E3%82%A7%E3%82%B9)
- [【MODO】サブディビジョンサーフェイスのコントロール方法について。](http://cgchips.com/how-to-use-subdivision-surface/)
Amazon Glacierについて

こんにちは、株式会社D2C 技術開発部の園部です。

現在、部署では Qiita:Team を使用し **d-tech** という技術情報共有の取り組みを行っております。
それらの中から選りすぐりの情報を発信していこうと思います。

第1回目の投稿はAmazon Glacierについてご紹介します。

#Amzon Glacierとは?
Amazon Glacierは、めったに取出すことのないデータを長期間保存するのに適したストレージサービスです。
特徴としてデータの取出し3～5時間かかりますが、S3と同じ堅牢性を持ち、利用料金もきわめて安価(1Gあたり1円、S3の1/3程度)です。
Amazonではこうしたデータの取出しに時間のかかるストレージサービスを「コールドストレージ」と読んでいて、解凍するまで使えないというところがサービス名(グレイシャー：氷河)の由来になっているそうです。

そんなAmazon Glacierについて調査した結果と使い方の一例を今回、次回とに分けてご紹介します。

#S3とGlacierとの比較
同じストレージサービスのS3と機能、料金等を比較します。　（2016.01時点）

| 項目 | S3 | Glacier | 備考 |
|:------------:|:------------:|:------------:|:------------:|
|料金（アジアパシフィック（東京））|3.96円 /GB|1.37円 /GB|1$=120円|
|データの堅牢性|99.999999999%(イレブン・ナイン) |99.999999999%(イレブン・ナイン) ||
|データの取出し|即時|データ取出し申請後3～5時間||
|操作性|コンソール画面のみで操作完結|APIツールを使用する必要がある||
|データの管理|ファイル名で管理|アーカイブIDで管理||

【Amazon Glacierのメリット】
・S3と同様に堅牢性を備えており、S3より低価格で利用できる。

【Amazon Glacierのデメリット】
・Glacierからデータの取出しに時間が掛る。
・ファイルのアップロードなどにはAWS SDK等のツールを使用したプログラミングで行なう必要がある。
・ファイルアップロード時にアーカイブIDが付与される。ファイルの取出し、削除の際はアーカイブIDを指定する必要があるため、
　ファイル名とアーカイブIDの紐付を管理しておかなければいけない。(紐付を怠るとファイルの削除が非常面倒くさくなるので注意!!)

上記のように料金が安い分制約も多く、利用用途も限られているため、
Glacier単体では利用しづらいことがわかります。

そこで、次回の投稿はS3を経由しGlacierを使うGlacierの有効活用方法をハンズオン形式でご紹介したいと思います。

Amazon Glacierについて(第2回目)へ続く。
EP 23 Accept Functions for Simple Interfaces Instead of Classes


> - Instead of defining and instantiating classes, functions are often all you need for simple interfaces between components in Python.
- References to functions and methods in Python are first class, meaning they can be used in expressions like any other type.
- The `__call__` special method enables instances of a class to be called like plain Python functions.
- When you need a function to maintain state, consider defining a class that provides the `__call__` method instead of defining a stateful closure.

> Effective Python



Statefull expression should use class with `__call__`.

Prieference for stateful expression.
1. class with `__call__`
2. class
3. statefull closure


```python
from collections import defaultdict

current = dict(green=12, blue=3)
increments = [
        ('red', 5),
        ('blue', 17),
        ('orange', 9)
]


# Utilize `__call__` is simple and the best way
# We just call the instance of the class
class BetterCoutMissing:
    def __init__(self):
        self.added = 0

    def __call__(self):
        self.added += 1
        return 0


counter = BetterCoutMissing()
result = defaultdict(counter, current)

for key, amount in increments:
    result[key] += amount
assert counter.added == 2


# class is better way to hold state
# But it is unclear how to instantiate and to call missing

class CountMissing:
    def __init__(self):
        self.added = 0

    def missing(self):
        self.added += 1
        return 0

counter = CountMissing()
result = defaultdict(count.missing, current)
for key, amount in increments:
    result[key] += amount

assert counter.added == 2

# Verbse, hard to read
# It is good to use closure to encapcell state, though.
def increment_with_report(current, increments):
    added_count = 0

    def missing():
        nonlocal added_count
        added_count += 1
        return 0
    result = defaultdict(missing, current)
    for key, amount in increments:
        result[key] += amount

    return result, added_count

result, count = increment_with_report(current, increments)
assert count == 2

```
MacからVPNでリモート接続する方法


接続の設定自体はさほど難しくないのですが、抜けるとものすごく遅くなるため、備忘録で残します。
何かあれば追記します。

## VPNの設定を追加
1.【システム環境設定】-【ネットワーク】から画面下部の+マークより設定を追加する
2. 入力画面でVPNの接続先の「サーバアドレス」、「アカウント名」を入力
3. 「認証設定」ボタンで、認証方法に応じた情報を設定し、OKボタンで画面を閉じる（私の場合は、ユーザー認証：パスワード、オンピュータ認証：共有シークレット、で設定）
4. 設定後、「適用」で設定を保存し、「接続」ボタンで設定

## メニューバーにVPNの設定メニューを表示する場合

上記のVPNを設定した画面で、下部にあるように「メニューバーにVPN状況を表示」にチェックする

![スクリーンショット 2016-04-08 17.29.49.png](https://qiita-image-store.s3.amazonaws.com/0/44140/231da632-92fc-21af-962d-8c222c44dfa5.png "スクリーンショット 2016-04-08 17.29.49.png")


## VPN接続がなかなかできない場合

作成したVPNの設定の詳細ボタンから詳細設定を開き、オプションのタブの「すべてのトラフィックをVPN接続経由で送信」にチェックを入れます。

![スクリーンショット 2016-04-08 17.20.48.png](https://qiita-image-store.s3.amazonaws.com/0/44140/d28e0995-5a33-7a37-5415-d16a07e253d7.png "スクリーンショット 2016-04-08 17.20.48.png")



## VPN接続出来ても、接続先へなかなか繋がらない/タイムアウトする場合

以下の「サービスの順序を設定」を選択し、作成したVPNの設定のサービスの優先順位を高めに変更してください。

![スクリーンショット 2016-04-08 17.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/44140/2262c765-d48d-5a74-93d8-7459b753728d.png "スクリーンショット 2016-04-08 17.22.22.png")

これをやるだけで驚くほど接続スピードが変わります。
docker-machine で作った環境が突然特定のネットワークと接続できなくなったら確認すること

# 概要

docker-machineでvirtualboxに作ったdocker環境
以前はうまく動いていたコンテナが、なぜか最近うまく繋がらなくなった。
docker 1.10 にしたからかとおもったが、どうも違うようだった

# 結論

```
docker network create
```

で作ったブリッジが、特定のネットワークとアドレス空間がかぶっていたようだ。

```
docker network rm 問題となっている空間のインターフェース
```

# 感想

コンテナに割り当てられているアドレスからは問題がないのではないかとおもったような気がする。

どんなネットワークがあるかは

```
docker network ls
ip a
```

で確認すればよいかなと。

いろいろネットワーク作れて便利なのだが、あまり知らない機能だったのでよく確認していなかった。

# 参考

* [Dockerの内部ネットワークのプライベート・アドレス帯を変更する - Qiita](http://qiita.com/MasashiKurita/items/b3e73aa1ea5a939d53e1)

* [Docker で標準と違うブリッジ・ネットワークを使う - Qiita](http://qiita.com/jiz/items/9b7c4e2cea8fbf202cb4)


* [How can I change the default assigned ip address for docker containers? - Stack Overflow](http://stackoverflow.com/questions/27344282/how-can-i-change-the-default-assigned-ip-address-for-docker-containers)
jadeがpugにrenameされたのでvimの設定も変えた

先日 kik の件でいろいろありましたが、javascriptのテンプレートエンジンのjadeも他企業と被ったらしく、最近pugにリネームされる運びとなっているそうです。

https://github.com/pugjs/pug/issues/2184

これにともない、vim-jadeが[vim-pug](https://github.com/digitaltoad/vim-pug)にリネームされています。
単純にリポジトリ名を変えただけだとsyntax highlightが効かなくなってしまったのですが、
filetypeもpugに変わっているのでその辺りをちゃんと変更してあげたところ無事復活しました。

```vim
au BufRead,BufNewFile,BufReadPre *.jade set filetype=pug 
```
resoureces/lang dirの sub dir指定


[configのsubdir](http://qiita.com/Ikumi/items/e8c92043f069dd8524b8) は . でつなぎましたが

こちらはオーソドックスに / でつなぎます。

resources/lang/ja/my/text.php の場合

```lang:text.php
return [
　　'common' => [
　　　　'service-name'=>'MyService',
　　],
];
```

取得方法

```lang:php
$file = '/my/text';
trans($file.'.'.'common');
```
Oracle Cloudのフリートライアルを申し込んでみた

Oracle Cloudのフリートライアルでは、無償で30日間利用することができます。

こちらからフリートライアルの申し込みができます。
https://cloud.oracle.com/tryit

Oracle Cloudの中のサービス毎に申し込みボタンが分かれています。
今回はJava Cloud Serviceを申し込んでみますが、Database Cloud Serviceなどもほぼ同じ手順です。

上のURLサイトの中のPaaSのJavaのところのTry Itボタンを押します。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/14f447b8-9f45-17da-6ab8-96faa19c7973.png)


次に表示される画面にはStart Trialボタンが2つ、「Java Cloud Service」と「Java Cloud Service - SaaS Extention」ありますが、「Java Cloud Service」の方を押します。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/e0ae2d76-373c-7c54-93c9-a141f374adae.png)


Start Trialボタンを押すと、Oracleのサイトのログイン画面にきます。oracle.comのアカウントを持っていれば、それをここで使用できますが、もしアカウントを持っていない場合は「プロファイルの作成」からアカウントを作成してください。すぐに作成できると思います。作成後、そのアカウントでログインしてください。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/ec58efad-1179-41a5-b9bd-8ee0ca4d11af.png)


次に、入力画面にきますので必要情報を入力します。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/29ae4f86-75f2-1411-c22c-a4cd73948dda.png)

- モバイル番号は+81のあとは最初の0を抜いた番号なので注意です。（例：080-1234-5678だったら、+81 **8012345678** になります）
- モバイル番号入力し、リクエスト・コードを押すと、携帯のSMSメッセージでコードが送られるので、それを検証コードに入力します。自分の場合はすぐに、数秒レベルでSMSメッセージが届きました。
- 「トライアルの詳細」では「新規アカウントの作成」のままにし、下の入力ボックスにはこのトライアルの環境の名前（これをアイデンティティ・ドメインと言います）を決めて入力します。この名前は後でクラウドのWebコンソールにログインする際に使用する名前ですので、あまり覚えにくい名前ではない方がいいと思います。最初は名前を何にするか迷うと思いますが、今回のフリートライアルの環境にだけ使う名前なので、何でもいいと思います。（あとで仮に有償で利用する場合はまた新たな環境名（アイデンティティ・ドメイン名）で登録することができます。）


サインアップが完了しました。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/87f45a6c-296e-c50f-2e8a-c4cb92aeda77.png)


しばらくすると、「Oracle Cloudへようこそ。......」という件名のトライアル環境への招待メールが、自分がoracle.comプロファイルとして登録したメールアドレス宛てに届きます。今回はサインアップから約30分でメールが来ました。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/3e91a3eb-7c22-01ab-75a2-ca580c3a25a9.png)


Oracle Cloudには大きく分けて2つのダッシュボードがあります。マイ・アカウントとマイ・サービスです。マイ・アカウントはフリートライアルでは使用しないかもしれません。有償利用時では請求金額の管理などをマイ・アカウントで行います。
今回はマイ・サービスのURLをクリックします。

サインイン画面が表示されます。自分が決めた環境名（アイデンティティ・ドメイン名）がプリセットされていると思います。
ユーザー名には自分のoracle.comのアカウントのメールアドレス（要は招待メールの受信アドレス）を入れ、パスワードにはメールに書いてある「一時パスワード」を入れます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/9d06d455-0456-3363-6e13-52684124b6e8.png)


そうすると、本パスワードを決める画面に来ます。チャレンジ質問も3つ入れる必要がありました。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/611f2916-27b7-0d26-89ea-41cccce45c53.png)


パスワードポリシーがありますので、あまり簡単なパスワードは使えません。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/ea9d395b-7a37-4dac-6143-0b260acdd07e.png)


画面の右の方の送信ボタンを押し、入力した情報に問題がなければ、Oracle Cloudの環境にログインできます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/c85473ad-e44f-16d9-539e-1fec4847cbd3.png)


今回は続行ボタンを押して表示された学習情報はスキップして、マイ・サービスの様子を見てみます。
使用できるサービスが縦に並んでいます。Java Cloud Service以外にも、見ての通りたくさんのサービスが使用できるようになっています。（申しこんだサービスによって異なってきます）
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/5cc8800e-ecac-b59d-c68c-16bdb61c25de.png)

有効期限は5/1になっていました（申し込んだのが4/1なので、ちょうど30日）
この後は各サービスに表示されている”サービス・コンソール”のリンクからサービスを使用することができます。

以上、フリートライアルの申し込み体験でした。
Kotlinの定数はJavaではどう見えるかという話


既存のアプリにKotlinを導入して、部分的に置き換えているのですが、そこでかるくはまりました。

### Javaの定数をKotlinに変換

```java
class Foo {
    static final int Hoge = 1;
    static final int Fuga = 2;
    static final int Piyo = 3;

    ...
}
```

これを、エイヤッとKotlinに変換すると、

```Kotlin
class Foo {
    companion object {
        val Hoge: Int = 1
        val Fuga: Int = 2
        val Piyo: Int = 3
    }

    ...
}
```

となるわけですが、Java視点で見た場合、この2つは同じではありません。
例えば、変換後のHogeは、Javaからみると、Fooのコンパニオンオブジェクトに定義されたGetterなので、Foo.Companion.getHoge()です。

なので、Javaのswitch()文のcaseなどでは使用できません。

### Kotlinの定数

じゃ、どうすればいいでしょうか？

```Kotlin
class Foo {
    companion object {
        val Hoge: Int = 1
        const val Fuga: Int = 2
        @JvmField val Piyo: Int = 3
    }

    ...
}
```

Kotlinのコードをこんな風に変えて、コンパイルした後、デコンパイルしてみたところ、

```java
class Foo {

    public static final class Companion {
        public final int getHoge() {
            return Buzz.Hoge;
        }

        ...
    }

    private static final int Hoge = 1;
    public static final int Fuga = 2;
    public static final int Piyo = 3;
    public static final Companion Companion = new Companion(null);
    
    ...
}
```

こんな風になります。
Hoge以外は、Javaからでも定数として使えるようです。

### まとめ

* Kotlinで、 **定数** を定義するときは、 **const** をつけましょう。
* なにか事情があって、constを使いたくないときは、 **@JvmField** でもよいです。

### おまけ

Android Studio 2.0.0(with Kotlin Plugin)のエディタでは、constをつけても定数と解釈してくれなくて、switch()文のcaseのところで、エラーだとのたまいます。
それにだまされて、ずいぶん、悩んでしまいました。
インプットするためのLTのススメ

##前置き
学びたいことを身につけるには教え合うと良いというけど、一番いいのは人前で話すことです。エンジニアやweb系界隈だとLTが頻繁に行われています。

LTとはライトニングトークの略で5分程度でプレゼンテーションをすることを言います。と言っても、他業界ではあまり通じない業界用語に近い言葉です。

##場所・機会を探す
LTはweb業界関係の勉強会の懇親会でおこなわれていたりするけど、中にはLTだけで構成している勉強会もあります。探してみましょう。

懇親会のLTは酒が入っているのもあり、ハードルは低めです。

また、自信が無ければ、初めはあまりオフィシャルではない場所で練習するのも良いでしょう。

##準備をする
では内容をどうするかを考えましょう。講師として呼ばれて登壇するのに比べるとLTはジャンルを間違えなければ、割と何でもアリな印象です。

例えば、「初めて〜するけど☓☓した」などと工夫した点を話すのもいいでしょう。「勉強し始めた言語でココがつまづいて、そこでどうした」なんてネタを話すのも良いかなと思います。

内容が決まったら、プレゼン用の資料を作りましょう。まとめる過程でも頭に残りますし、人前で発表するというプレッシャーが良い物を作る方向に向きます。

##緊張の発表
初めてだと本当に緊張します。周りの人をカボチャだと思えば、緊張しないといいますが、頭が真っ白になってしまうと、もうカボチャだかなんだかわからなくなることもあります。

といっても、5分程度ですから、あっという間に終わります。お疲れ様でした。

##副次的な効果
おまけ的効果として、LTをやると懇親会などで声をかけてもらいやすくなります。いわゆるパーティ的な立食で自由に話しましょうっていうのが苦手な人にはうってつけでしょう。

自分は話し掛けるのが苦手なので、これは本当にありがたかったりします。

皆さんもLTで発表してみてください。きっと勉強になります。頑張ってください！！
LINE BOT API を使い、匿名チャットルームを作る

準備や登録方法などは他に書いてる方が沢山いるため、省きます

# やっていること
- BOTへの発言を、BOTを友人追加している人たちに一斉送信

![line.png](https://qiita-image-store.s3.amazonaws.com/0/59518/91bdd1b8-f28b-7a76-de36-8017d272c011.png)

# 処理内容
1. メッセージを受け取ったらMIDをファイル等に保存
2. 保存されているMID全てに受け取ったtextを一斉配信

# 誰かを招待する
動作を確認したら、https://developers.line.me にあるBOTのQRコードの画像を保存し
その画像をLINE経由などで友人に送りつけましょう
友だち追加→QRコード→ライブラリ→保存したQRコード
と指定すればBOTが表示されます
(QRコード送ると年齢認証の手間を省ける)

# 動かしたコード

```php
<?php
$midFile = dirname(__FILE__)."/mids";
$json = json_decode(file_get_contents("php://input"), true);
$mids = explode(PHP_EOL, trim(file_get_contents($midFile)));
$newMids = array();
if (!isset($json["result"])) {
    exit(0);
}
foreach ($json["result"] as $result) {
    $newMids[] = $result["content"]["from"];
}
$messages = array();
foreach ($json["result"] as $result) {
    if (!isset($result["content"]["text"])) {
        continue;
    }
    if (1 > strlen($result["content"]["text"])) {
        continue;
    }
    $messages[] = array(
        "contentType" => 1,
        "text" => $result["content"]["text"],
    );
}
if (0 == count($messages)) {
    exit(0);
}
$mids = array_merge($newMids, $mids);
$mids = array_unique($mids);
file_put_contents($midFile, implode(PHP_EOL, $mids));

$body = json_encode(
array(
    "to" => array_values($mids),
    "toChannel" => 1383378250,
    "eventType" => "140177271400161403",
    "content" => array(
        "messageNotified" => 0,
        "messages" => $messages,
    ),
)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://trialbot-api.line.me/v1/events");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Content-Type: application/json; charset=UTF-8",
"X-Line-ChannelID: LINE_CHANNEL_ID",
"X-Line-ChannelSecret: LINE_CHANNEL_SECRET",
"X-Line-Trusted-User-With-ACL: LINE_CHANNEL_MID",
));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$result = curl_exec($ch);
```
OpenStreetMapのベクターレンダリングサーバをお手軽に立ち上げたい

# 前置き

OpenStreetMapのサーバ環境を構築する際、バージョン依存などキツくてつらい。
Ubuntuのversionが異なったり、middlewareのversion依存が多すぎて構築途中で挫折した。
調べるとdocker経由で簡単に構築できる方法があったので手順メモ。

[元記事](http://osm2vectortiles.org/docs/serve-vector-tiles)

# 前提

構築に利用したのは Ubuntu 12.04
Linux ubuntu 3.13.0-85-generic #129~precise1-Ubuntu

# 1. dockerのinstall

とりあえずdockerをinstall.

- https://docs.docker.com/engine/installation/linux/ubuntulinux/

# 2. 対象のエリアの地図データをDL

DownloadImage一覧から、tokyoをDL

- http://osm2vectortiles.org/downloads

```
curl -O https://osm2vectortiles-downloads.os.zhdk.cloud.switch.ch/v1.0/extracts/tokyo.mbtiles
cp tokyo.mbtiles /var/www
```

mbtilesの実体は、SqliteDBのファイルなのでこれを読み込むことで簡単に地図データのDBが構築できる。

# 3. docker imageの実行

あとはdocker runするだけ。

```
docker run -v $(pwd):/var/www -p 8081:80 klokantech/tileserver-php
```

# 表示確認

下記アドレスにアクセスすると地図表示できる

- http://localhost:8081/

![tileserver.png](https://qiita-image-store.s3.amazonaws.com/0/15000/73c0ad70-c598-ec28-99d2-fd9cbba4103a.png)

# タイルアクセス

tokyoをDLした場合。下記のようなアドレスでアクセスが可能

- http://localhost:8081/tokyo/{zoom}/{x}/{y}.pbf
- http://localhost:8081/tokyo/13/7277/3224.pbf
[Swift]配列をループで条件を探すいろんな書き方

# 基本的な書き方

```swift
let saveValue: Int = 1
Private fund checkSaveValue (array: [Int]) -> Bool {
    for value in array {
        if value == saveValue {
            return true
        }
    }
    return false
}

```
# .filterを使う

```swift
let saveValue: Int = 1

private func checkSaveValue(array: [Int]) -> Bool {
    array.filter { value in
        value == saveValue
    }.first != nil
}
```

# .Containsを使う

```swift
let saveValue: Int = 1

private func checkSaveValue(array: [Int]) -> Bool {
    return array.contains { $0 == self.saveValue }
}
```

# .enumerate()を使う

```swift
let array = [1, 2, 3, 4]

let pairList = array.enumerate().map { (tuple: (count: Int, int: Int)) -> String in
    return count == int
}
```

# いろいろ合わせた例 

これ↓を

```swift
var checkedIndexPath: [NSIndexPath] = []
private func checkeIndex(indexPath: NSIndexPath) -> Int? {
   var returnIndex: Int? = nil
   checkedIndexPath.enumerate().forEach { (index, data) in
      if data == indexPath {
          returnIndex = index
      }
    }
  return returnIndex
}
```
いろいろ合わせてこう書ける↓

```swift
var checkedIndexPath: [NSIndexPath] = []
private func checkedCellIndex(indexPath: NSIndexPath) -> Int? {
    return checkedIndexPath
        .enumerate()
        .filter { $0.1 == indexPath }
        .flatMap { return $0.0 }
        .first
}
```
Ruby | メソッド名のビックリマーク ( ! ) はなんと呼ぶ？

bang （バン） と呼ぶらしい。

- `!` = バン
- `!!` = ダブルバン
- `example!` = バンメソッド

>人はバンだけで生きるのではなく、神の口から出る一つ一つのことばによる

# 参考

 - http://stackoverflow.com/questions/612189/why-are-exclamation-marks-used-in-ruby-methods
 - http://www.ne.jp/asahi/petros/izumi/1999msg/991003.htm



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
.htaccess

## リダイレクトテンプレート

```
order deny,allow
allow from all
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|css|ico|js)$ [NC]
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Options Indexes FollowSymLinks SymLinksIfOwnerMatch


####################
#   mod_rewrite    #
####################
# rewriteLogを確認する
# 
# チェックポイント1 : httpd.confでAllowOverrideがallになっているか
#<Directory "/var/www/html">
#    Options Indexes FollowSymLinks
#    AllowOverride all
#</Directory>

# チェックポイント2 : .htaccessは有効になっているか
# 構文エラーになるように冒頭に「test」と記述してみる
# Internal Server ErrorになればOK

# チェックポイント3 : rewriteモジュールのロードチェック
# $ httpd -M | grep rewrite
# 「rewrite_module (shared)」と表示されればOK

# テスト用
#<IfModule mod_rewrite.c>
#     RewriteEngine On
#     ErrorDocument 404 http://www.google.co.jp/
#</IfModule>


# 特殊な例
# 受けたURLに対する情報をRewriteMapから当ててrewriteさせる
# RewriteMap usmap text:/var/hogehoge/user-server.txt
# RewriteRule ^/harc/json/(.*?)/(.*?) $ https://$[usmap:$1].api-robot.com/harc/json/$1/$2 [P,L]
````


## URLでの分岐方法
```
    RewriteCond %{REQUEST_URI} !(^/api/)
    RewriteRule ^(.*)$ index.html [QSA,L]

    RewriteCond %{REQUEST_URI} (^/api/)
    RewriteRule ^(.*)$ index.php [QSA,L]
```
Rundeck 使いやすいジョブコントローラー

以前書いた Rundeck のメモです。死蔵しておいてももったいないので Qiita で公開します。
内容は多少古くなっているので注意しください。


Rundeckとは
-----------

複数のサーバーを対象に、コマンドを分散実行するためのジョブコントローラーのひとつ。

ユーザマニュアルより引用

> [Rundeckの機能](http://rundeck.org/docs/jp/manual/01-introduction.html#rundeck-の機能)
>
> -   コマンドの分散実行
>
> -   拡張可能な実行システム（デフォルトでは SSH）
>
> -   マルチステップワークフロー
>
> -   ジョブの定義と実行（即時 or スケジュール)
>
> -   コマンドとジョブを実行するための GUI
>
> -   ロールベースの ACL（LDAP/ActiveDirectory 連携可能）
>
> -   履歴とログ監査
>
> -   外部のホスト管理ツールとの統合(open integration)
>
> -   CUI インタフェース
>
> -   Web API

Rundeckはエージェントレスのシステム。

実行したコマンドの出力も含め履歴が残るので、ターミナルからコマンドを実行するよりも、こういったツールを利用した方がよい。

CLIコマンドもあり、構成とジョブの実行のために必要となる最低限のコマンドは網羅されているようだ。Web APIを使えば全ての機能が利用できるようなので、他のシステムとの連携にも困らないだろう。

ユーザマニュアルは邦訳されていたが、もとの版がかなり古いようで、あまり当てにしない方がよいだろう。

JobScheduler との比較
---------------------

JobSchedulerだと、エージェントレスでジョブを実行することもできるけれど、扱えるのは1行コマンドのみとなるため、シェルスクリプトをJobSchedulerへ登録するような使い
方をするならエージェントを使う必要がある。


JobSchedulerが、ジョブネットのような連携したジョブのコントロールを目的とするシステムなのに対して、Rundeck はもう少し軽いところ、デプロイや構成管理ツールのコマンドやジョブを実行するのを主目的としている、というところか。

Rundeckではジョブのステップの出力を次のステップに渡したり、前に実行したステップ
の出力を参照するような仕組みはなさそうである。このあたりも、JobSchedulerと違うところである。

実行結果
--------

実行結果は履歴として後から参照できる。結果には、実行時のワークフローの定義も一緒に記録されている。つまり、過去の実行履歴をみると、その時、どのような定義のワークフローで実行したかもわかるようになっている。これは、ワークフローを後から変更したときでも、過去の実行履歴は独立した記録になっていて、影響を受けないということであり、大変重要なことである。

クイックツアー
--------------

-   Rundeck
    [インストール編](http://qiita.com/komeda-shinji/items/bb347a9fd89d03dd0a26)
-   Rundeck
    [プロジェクトの作成](http://qiita.com/komeda-shinji/items/5f7b4cf795063d204500)
-   Rundeck
    [ジョブの作成と実行](http://qiita.com/komeda-shinji/items/7a7aea43a35a89db5025)
-   Rundeck
    [コマンド実行のされ方を見る](http://qiita.com/komeda-shinji/items/160682a5e2c7748e1feb)
既存サービスにSwiftLintを導入する際の手順と注意点

# SwiftLintとは？

https://github.com/realm/SwiftLint
チーム内のルールの統一に役立つコードチェックツールです。
例えば、いち関数につき３０行位内、や変数は小文字始まりで、などのルール確認ができます。
ビルド時にSwiftLintも実行するのが一般的です。
ルール規定外のコードが書かれていたらビルドできないようにする・もしくは`warning`を出すという使い方ができます。

# 段階的に導入する

既存サービスの規模がおっきく、古いコードが残っている場合は十中八九ビルドできなくなります。
なので期間をとって段階的に導入していくのがいいと思います。

PC環境によっていは以外なところでビルドできなくなったりするので、途中から導入する際は慎重にいきましょう

# 段階導入のすすめ

３つの方法がとれると思います。
1. コードチェックを無視するディレクトリを増やす
2. コードチェック時にerrorを起こさないようにする
3. 修正差分のみに実行していく

この方法は、一部導入しつつ、ビルドができるようにする方法です。
もちろんこれらは段階的に修正していくことが前提です。
最初に導入したっきり修正することができないのならば入れる意味がないのでやめましょう。

# 1.SwiftLintの設定をいじって無視するディレクトリを増やす導入方法

1の方法では修正箇所がおおすぎる場合、長く期間をとって慎重にいきたい場合はこちらをおすすめします。
下記のように無視するディレクトリを増やしましょう。
ルールを甘くせずに、段階的にするのならばこれしかありません。
ただディレクトリ構成が適当なプロジェクトだと逆に苦労するかもしれません。


以下はswiftLintのREADMEからの引用です

```
excluded: # paths to ignore during linting. Takes precedence over `included`.
  - Carthage
  - Pods
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift
```
# 2.swiftLintの設定をいじってerrorを起こさないようにする導入方法

ビルドでひっかかる項目が極端に少ない場合はこちらの方法をとりましょう
その項目が３項目以上になる場合はおすすめしません。
チームの為の変更なのか一時的な変更なのかがわからなくなるので混乱しやすいのと、忘れやすいので。
更新を忘れて、ルールが甘々になってしまっては導入する意味がなくなってしまいます。

 - `disabled_rules`(無視する項目)に追加する
 
```
disabled_rules: # rule identifiers to exclude from running
  - Colon
  - comma
  - control_statement
```

 - `error`でなく`warning`にする
 
```
type_body_length:
  - 300 # warning
  - 400 # error

```

# 3. 修正差分のみに実行していく

手を加えた箇所から実行し、徐々に改善する場合は、この方法がオススメです。
公式にも書いてあるRun Script Phaseを少し書き換えて、git diff毎に実行します。

```
if which swiftlint >/dev/null; then
  git diff --cached --name-only | grep .swift | while read filename; do
    swiftlint --path "$filename"
  done
else
  echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint"
fi
```
参考元：[SwiftLintを変更のあったファイルのみに実行する方法](https://qiita.com/KazukiTanaka/items/cfbc67193aa554f5f693)


# まとめ

以上が段階的に導入する方法と注意点でした。
Lint触ったことのある方には意味のない記事ですが、なにかの参考になれば幸いです。

もっといい方法あるよ！
などありましたらお気軽にお願いします。
MacからSSHで接続する方法


ポイントだけまとめました。追加があれば追記します。

## 秘密鍵の配置

```ターミナル
$ mv id_rsa ~/.ssh/
$ chmod 600 id_rsa 
```

## sshコマンドで対象サーバに接続

```ターミナル
$ ssh -i ~/.ssh/id_rsa/  【login_user】@【hostname】 -p 22
```

## ポイント
* 秘密鍵のパーミッションを600にしないと、キーチェーンアクセスで読み取りができないため、要注意です。
@template is view_context in Rails 3.x

In previous versions of Rails, you could access View helpers in Controllers via the @template instance variable. In Rails >= 3.x, you have to access these helpers via view_context.

或者直接在helper里面self 

```rb
[2] pry(#<#<Class:0x007fdc18f616d8>>)> self.content_tag(:lala).class
=> ActiveSupport::SafeBuffer
```
openFrameworks 知ってると幸せになれるかもしれないTips


質問とか受けたり使ってて便利だなと思った
Tips的なものをちょこちょこ書き足していきます


#描画




#画像、映像
##ofImage
###アンカーを設定
```cpp:.cpp
	ofImage image;
	image.setAnchorPercent(0.5,0.5);
```
###スクリーンショット的な
```cpp:.cpp
	image.grabScreen(x,y,w,h)
```

###

#音楽
##ofSoundPlayer
###音楽を重ねて再生できるようにする
デフォルトではsoundPlayerはplay()する度に再生途中でも最初から再生されますが
以下のようにするとplay()する度に再生途中の音声とは異なる新しい再生が始まります。(再生途中の音楽が停止されない)


```cpp:.cpp
    ofSoundPlayer soundPlayer;
    soundPlayer.setMultiPlay(true);
```

###音楽の再生位置を明示する
```cpp:.cpp
	soundPlayer.setPosition(float position);
```

##ofSoundGetSpectrumについて

#Shader


#エラー対処

#Addon

#その他
多次元配列のデータの格納及び取り出し方法

##配列の作成
```php
$error = [];
```
##配列へのデータ格納
```php
$error["user"][] = "あああああ";
$error["user"][] = "いいいいい";

$error["pass"][] = "かかかかか";
$error["pass"][] = "ききききき";
```
##var_dumpして確認
```php
echo "<pre>";
var_dump($error);
echo "</pre>";
```
##var_dumpの結果
```txt
array(2) {
  ["user"]=>
  array(2) {
    [0]=>
    string(15) "あああああ"
    [1]=>
    string(15) "いいいいい"
  }
  ["pass"]=>
  array(2) {
    [0]=>
    string(15) "かかかかか"
    [1]=>
    string(15) "ききききき"
  }
}
```
##foreachで取り出す
```php
foreach ($error["user"] as $values) {
    echo "<p>{$values}</p>";
}

foreach ($error["pass"] as $values) {
    echo "<p>{$values}</p>";
}
```
##実行結果
```txt
あああああ

いいいいい

かかかかか

ききききき
```
会社のPC(windows7)でよく使うショートカットキーまとめ

いろんなショートカットを駆使してエンジニア感を出すのがマイブームです。
自分のメモ用みたいなものですが、参考になれば幸いです。
特によく使うものは強調表示にしています。

思い出したら付け足していきます。
### Windows編
|コマンド|動作|
|:----|:--|
|**windowsキー + l**| 画面ロック |
|**windowsキー + 矢印キー** | ウィンドウ幅寄せ|
|ctrl + alt + del | パスワード変更 or タスクマネージャ起動|
|**alt + tab**|ウィンドウ切り替え|
|alt + shift + tab|ウィンドウ切り替え逆順|
|alt + F4 | プログラム終了|
|windowsキー + 数字|タスクバー配置のプログラム実行|
|windowsキー + shift + 数字|:arrow_up: 新規ウィンドウで開く|
|windowsキー -> cmd -> enter|コマンドプロンプト|
|windowsキー + d | 全ウィンドウを最小化|


### GoogleChrome編
|コマンド|動作|
|:----|:--|
|**ctrl + t** | 新規タブ |
|**ctrl + w** | タブを閉じる|
|**ctrl + shift + t** | 閉じた(前回開いた)タブ・ウィンドウを開く|
|ctrl + l -> ctrl + c| URLコピー |
|**ctrl + l -> 矢印右キー**|URLに追記、パラメータ追加|
|**ctrl + shift + n**|シークレットウィンドウ|
|**ctrl + f**|ページ内検索|
|**ctrl + URLクリック**|クリックURLを新規タブで開く|
|**ctrl + shift + c**|gmail メール作成画面でcc欄追加|
|**ctrl + r**  | **リロード** |
|**alt + ←**| **戻る**|
|**alt + →**| **進む**|

### ターミナル編
|コマンド|動作|
|:----|:--|
|**ctrl + c**|クリア|
|ctrl + u| 全消し|
|ctrl + k|カーソルから右端までを消す|
|ctrl + y| :arrow_up: ２つで消した内容をペースト|
|**ctrl + a**|カーソルが一番左にもっていく |
|**ctrl + e**|カーソルが一番右にもっていく |

<br><br>
頑張れば一日マウス無くても仕事できるかもしれません。
や、無理か...
Wavemaker　日本ではまだ知られていない　高度な機能をもったノンプログラミング IDE 

■紹介するソフトウェア
「Wavemaker studio」　http://www.wavemaker.com/

日本ではまだ知られていないであろう、wavemaker studio について紹介します。
私がwavemakerに着目したのは、2012年頃、ノンプログラミングでの開発が現実味を帯びてきたころです。

■当ソフトウェアの特徴と変遷
wavemaker は2014年までは、デザイン的に冴えない見栄えと、難しいdojoフレームワークを活用したwysiwyg(what you see is what you go : あなたのみたままがあなたがやりたいことになります)のシステムをオープンソースで提供していました。
当時の肝はdojo datagrid といって、開発者が結構面倒だとしているデータベースから情報を引っ張り画面出力する、という機能をウィジェット(部品)化しており、それだけで開発生産性が高まる、という特徴がありました。他、画面のイメージは、webサイト用によくあるwysiwigと同じような使い方でデザインする、というものでした。

　当時、amazon ec2が出始めれば、すぐにec2への直接デプロイをサポートするなど、このチームは技術面では先進技術を素早く取り入れる体制があります。 （アメリカに拠点がありますがインドのメンバーが多くいる開発会社です）

　ところが、2014年に、運営会社の組織体制が変わり、スタートアップ的な動きで製品として開発が加速され、wavemaker7 シリーズに移行して以来、怒涛のようにソフトウェアとして向上しました。

現在は、webブラウザを通して、wysiwygの超高速開発の環境が使えます。
クラウドファースト、モバイルファースト、を目的としているため、
クラウド環境への直接デプロイはもちろん、モバイルビューへの自動変換、cordova(phonegap)の機能のサポート、ios(iphone,ipad)ビューへの自動変換、google mapなどのよく使われるものの部品化、チーム開発、など、様々な機能があります。

また、mysqlデータベースデザイナーや、ソーシャルメディアのOaut、将来的には課金の機能など、その時点で必要と思われれる機能をどんどん部品化してゆき、超高速開発をより推し進めているソフトです。内部言語も、angularJs に置き換わり、最先端の技術を山盛り搭載しています。


以前は完全オープンソースでしたが、
現在は商用に移りつつありwavemaker studioを利用するには若干月額料金がかかるようになりました。また開発主体が海外なので日本語サポートはありません。
（それが日本の利用者がつかない、もっとも端的な理由ですが）


■フリーで使えるwavemaker desktopバージョン
現在はまだフリーのデスクトップバージョンが提供されています。(サポートが続くか明確なアナウンスはありません)
[ダウンロード]
http://www.wavemaker.com/downloads/studio-desktop/7.8.0/wavemaker-studio-desktop-installer-7.8.0.jar

■私が推奨する使い方。
このツールを実際の現場で活用するには、料金、保守、中身、品質などの面でハードルがあるでしょう。そこでこのwysiwyoツールは、プロトタイプ開発に使うことをお勧めします。ツールのことを周囲に理解されないと怪しがられるかもしれませんが、そこらのプロトタイプツールよりよほど多機能、高性能でおすすめしています。
（コードを書いたほうが早い、と勘違いしないで！）
単純なwebであればよいですが、データベースと連携する、mapを表示する、画面の配置、色を変えるなど、その場で簡単に変更しながら議論できます。


■コミュニケーションの場
フォーラムを介した小さなコミュニティーがありますが、
私が数年前から書き込みをちょこちょこしていた程度で、日本の方はまだ他にいらっしゃらないようで寂しい限りです。
http://dev.wavemaker.com/forums/
日本の人に興味をもっていただけたらと思い、情報を書きました。
気に留められたかた、フォーラムに意見をかいてください。

現在は次々と新しい超高速開発環境が出ていますが、まだ日本で知られていない、という点で、
書籍を書くなどするとよいと思っています。

■qiitaで紹介する目的
１．純粋にまだ皆が知らないであろう優秀なツールを紹介したかったから
２．一緒にwavemakerの日本語書籍を書いてくださるかたを探しているから。

２に興味あるかた、私もまだ興味本位ですがメッセージいただけると幸いです。
得に英語がわかる必要はありません。


[追記2016/4/13]
ストックしていただいた方、ありがとうございます。
どうでしたかwavemakerの印象は？実際に利用されましたか？
差し支えなければ何でも良いのでコメントくださいませんか。
OpenStreetMapのタイルレンダリングサーバをお手軽に立ち上げたい

# 前置き

OpenStreetMapのサーバ環境を構築する際、バージョン依存などキツくてつらい。
Ubuntuのversionが異なったり、middlewareのversion依存が多すぎて構築途中で挫折した。
調べるとdocker経由で簡単に構築できる方法があったので手順メモ。

- [元記事](http://osm2vectortiles.org/docs/serve-raster-tiles-docker)

# 前提

構築に利用したのは Ubuntu 12.04

- Linux ubuntu 3.13.0-85-generic #129~precise1-Ubuntu

# 1. dockerのinstall

とりあえずdockerをinstall.

- https://docs.docker.com/engine/installation/linux/ubuntulinux/

# 2. 対象のエリアの地図データをDL

DownloadImage一覧から、tokyoをDL

- http://osm2vectortiles.org/downloads

```
curl -O https://osm2vectortiles-downloads.os.zhdk.cloud.switch.ch/v1.0/extracts/tokyo.mbtiles
```

mbtilesの実体は、SqliteDBのファイルなのでこれを読み込むことで簡単に地図データのDBが構築できる。

# 3. 描画したいstyleをDLする

[MapBox](https://github.com/mapbox/?utf8=%E2%9C%93&query=tm2)が公開しているstyleレポジトリからお好みのものをDLする。

```
git clone https://github.com/mapbox/mapbox-studio-light.tm2
```

ここまでの手順で現在のフォルダが以下のような構成になっていればOK

```
.
|- mapbox-studio.light.tm2
|- tokyo.mbtiles
```

# 4. docker imageの実行

あとはdocker runするだけ。

```
sudo docker run -v $(pwd):/data -p 8080:80 klokantech/tileserver-mapnik
```

# 表示確認

下記アドレスにアクセスすると地図のstyle一覧がでるのでお好みのstyleの地図が表示されているか確認する。

- http://localhost:8080/

mapbox-studio-lightをDLした場合。

- http://localhost:8080/#mapbox-studio-light/ol3

![style_light.png](https://qiita-image-store.s3.amazonaws.com/0/15000/cec272ca-983f-290f-b068-cd8b193216ce.png)

# タイルアクセス

tileには下記アドレスでアクセスが可能

- http://localhost:8080/{style}/{zoom}/{x}/{y}.png
- http://localhost:8080/mapbox-studio-light/0/0/0.png
gulp-html-extendで新規ファイルもウォッチさせる

# 新規ファイルをエクステンドしてくれない
extendで下記の形でwatchさせた場合、すでにあるファイルの変更は反映してくれるが
新しいファイルは一回コマンドを止めて、再開させないと書き出してくれない。

```lang:gulpfile.js
gulp.watch(['./src/extend/modules/**/*.html'], ['extend'])
```

なので下記に変更。これでOK

```lang:gulpfile.js
gulp.watch(['src/extend/modules/**/*.html'], ['extend'])
```
grafana-xxl grafana zabbix でプラグインとかいれようとしたら便利なのがあった。

# 概要

grafana を新しくしつつ zabbix のグラフ作成につかっていて、pie chart とか使いたいなぁとおもっていたところ、いろいろはいった便利な[grafana-xxl という docker コンテナ](https://hub.docker.com/r/monitoringartist/grafana-xxl/)があった。

# 結論

grafana-xxl を使うと便利。
zabbixプラグインもあったし、pie chartもあった。
ほかにもいろいろはいっている。

永続化するなら

```
mkdir grafana-xxl-data
```

```
docker run -d --name=grafana-xxl -p 3000:3000 -v $PWD/grafana-xxl-data:/var/lib/grafana monitoringartist/grafana-xxl:3.0
```

# 初期設定などは

* [grafana-zabbixのインストール&初期設定 - Qiita](http://qiita.com/biatunky/items/f148326ed0cc80afa217)

ここをみてもらったほうがよいです。
毎回zabbixのURLに ***api_jsonrpc.php*** を付け忘れては、上のページを見に行っている。。
お世話になってます。


# 参考

* [monitoringartist/grafana-xxl on hub.docker.com](https://hub.docker.com/r/monitoringartist/grafana-xxl/)

* [monitoringartist/grafana-xxl at 3.0](https://github.com/monitoringartist/grafana-xxl/tree/3.0)

* [monitoringartist/grafana-xxl: Grafana 2.6/3.0-dev with unofficial plugins: Zabbix, Dataloop, DalmatinerDB, Ambari, Atsd, Bosun, Cloudera Manager, Druid, OpenNMS, ...](https://github.com/monitoringartist/grafana-xxl)

# 気づいたこと

zabbix用の設定をしていたら、プルダウンででてくるとおもわれるメニュー項目がでてこなかったり、違うものだったりすることがあった。
その場合は、関係ない適当な場所をクリックしてから、また設定したい項目をクリックするとでてくることがある。

そもそもプルダウンがあるのかわからないようにも見える場合も、とりあえずクリックしてみる。とよいかもしれない。

## 値の指定

正規表現が使えるということもすっかり忘れてしまう。例えば

```
/MySQL .*/
```

でくくってあげる

# やってみてないこと

## 以前のバージョンからのバージョンアップ

あまりたくさんなかったので、まだ試してない。
今後もためさないかも。。。

## オプション

必要があれば、以下のようなオプションも渡す

```
GF_SERVER_ROOT_URL
GF_SECURITY_ADMIN_PASSWORD
GF_AUTH_ANONYMOUS_ENABLED
```
モンテカルロ法を用いた最短路の計算

# <i class='fa fa-pencil' /> モンテカルロ法を用いたダイクストラ法の紹介

確率的に移動時間が変わるグラフ上の最短路を求める方法を紹介します。

サンプルのグラフを作ります。

```py3:python3
%matplotlib inline
import numpy as np, networkx as nx

m = 4
g = nx.Graph()
for i in range(m):
    if i==0:
        g.add_edge(i, i+m, prob=[1], time=[1.9]) # 0-> 4
    else:
        g.add_edge(i, i+m, prob=[0.8, 0.2], time=[1, 6]) # 縦
    if i < m-1:
        g.add_edge(i, i+1, prob=[1], time=[2]) # 横
        g.add_edge(i+m, i+m+1, prob=[1], time=[2]) # 横

n = g.number_of_nodes()
pos = {i:[i%m, i//m] for i in range(n)}
nx.draw_networkx_nodes(g, pos, node_color='w')
nx.draw_networkx_edges(g, pos)
nx.draw_networkx_labels(g, pos, {i:str(i) for i in range(n)});
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/ea132a56-19cc-10fa-b16d-35465790dcdc.png)

- 上記の**点 0から点 7への最短路**を求めます。
- 横の道は、確定的に2時間かかります。
- 縦の道は、確率80%で1時間ですが、確率20%で6時間かかります。平均すると2時間かかります。
- 点 0から点 4までは、確定的に1.9 時間で行けます。
- ある点に到達したとき、その点に繋がる辺の移動時間だけは、確定するものとします。

平均時間で見れば、"0 -> 4 -> 5 -> 6 -> 7"のルートで、7.9時間が最短路です。

しかし、縦の道で、下から上へは、確率 80% で1時間で行けます。このことから、右に進みながら、縦に1時間で行ければ、上へ進む方針が、よさそうです。

## 考案したモンテカルロダイクストラ法
- 予め、確率で定まる辺に対し各々nn個の乱数を用意しておきます。
- 全ての点において終点への到達時間を∞にし、全ての点を未探索にします。
- 次の点を終点にし、次の点の到達時間を0にします。
- 始点が探索済みになるまで、以下を繰返します。
    - 次の点を探索済みにします。
    - 次の点に接続する点の到達時間を後述のように更新します。
    - 探索済みでない点の中で、到達時間が最小のものを次の点にします。

### 到達時間の更新
- 以下のサンプル値のnn回の平均が、現在の到達時間より短ければ、更新します。
    - サンプル値を接続する点について「到達時間と接続辺の時間の和」の最小値とします。

## 計算してみる

```py3:python3
def monte_min(g, s, t, nn=1000):
    n = g.number_of_nodes()
    dd = [np.inf] * n
    bb = [False] * n
    for i, j in g.edges():
        d = g.edge[i][j]
        d['log'] = (np.random.multinomial(1, d['prob'], nn) * d['time']).sum(axis=1)
    nx = t
    dd[nx] = 0
    while not bb[s]:
        bb[nx] = True
        for nd in g.edge[nx].keys():
            dd[nd] = min(dd[nd], np.mean([calcmin(dd, g.edge[nd], i) for i in range(nn)]))
        nx = np.argmin([np.inf if bb[i] else dd[i] for i in range(n)])
        if dd[nx] == np.inf: break
    return dd
def calcmin(dd, dc, i):
    return min([dd[nd] + d['log'][i] for nd, d in dc.items()])

print(monte_min(g, 0, 7))
>>>
[7.0436741200000021,
 5.0366892306401603,
 3.1682992231199996,
 1.7938642600000001,
 6.0,
 4.0,
 2.0,
 0]
```

monte_min で各点ごとの到達時間を出力します。

平均値のダイクストラでは 7.9でしたが、モンテカルロで計算すると 7.04になりました。
また、点4 を通ると、7.9 (= 6.0+1.9) ですが、点1経由にすれば、7.04 (= 5.04+2)なので、点0からは点1に向かうのがよいことになります。

点1についたら、点2に向かうと、5.17 (= 3.17+2)です。このとき、辺(1-5)が1ならば 5 (=4.0+1)となり、辺(1-5)が6ならば 10 (=4.0+6)となります。このように、上への移動時間が1のところで上へ行くことがよいこともわかります。

なお、このモンテカルロダイクストラ法は、サンプリングが正確であっても厳密な最適解の保証はありません。

以上
OnsenUI 2 Beta.9から使えるons-iconのアイコン複数設定

Beta.8以前では、実行する端末に合わせてons-ifを使って

```html
<ons-if platform="android">
    <ons-icon icon="md-menu"></ons-icon>
</ons-if>
<ons-if platform="ios other">
    <ons-icon icon="ion-navicon" style="font-size: 32px; width: 1em;"></ons-icon>
</ons-if>
```

としていたのが、Beta.9から

```html
<ons-icon icon="ion-navicon, material:md-menu" size="32px, material:24px">
```

と書けるようになった。

書く量が減るので嬉しい。

ツールバー内で使う場合はこれ推奨。
アイコンサイズをスタイルで設定しても無視されるっぽい。