OmniAICreator/Qiita-1.07M huggingface dataset:
第23回梅雨でモワッとしたシェル芸勉強会


タイトルの通りです。
コマンドプロンプトと自作コマンドを駆使して解けるところまで解いてみました。

[【問題】第23回梅雨でモワッとしたシェル芸勉強会](https://blog.ueda.asia/?p=8465)

とりあえずデータを取ってきます。
コマンドプロンプトでは `bitsadmin` というコマンドを使います。
見慣れない感じですが、標準コマンドだそうです。

```bat:Q0
bitsadmin /rawreturn /transfer get http://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/landing/landing.csv %CD%\landing.csv
```

落ちてきたデータは UTF-8 のようなので変換します。
変換には [`iconv`](https://github.com/asterisk9101/wincmd/blob/master/scripts/iconv.js) を使います。

```bat:Q0
iconv /f UTF-8 /o landing.sjis.csv landing.csv 
```

`iconv` は `ADODB.Stream` を呼び出すだけのコマンドです。出力文字コードを指定しない場合は Shift_JIS で標準出力に吐き出すので、上記のコマンドは  `iconv /f UTF-8 landing.csv > landing.sjis.csv` と等価です。Shift_JIS 以外で出力するときは `/o` で一旦ファイルに落とす必要があります。

話がそれました。では問題に取り掛かります。

# Q1

いきなりですが [`sed`](https://github.com/asterisk9101/wincmd/blob/master/scripts/sed.js) で黒魔術っぽいことをやります。12月までのデータが一行に並んでいるので、カンマを改行に置換しながら月毎に分割していきます。

```bat:Q1
type landing.sjis.csv | ^
sed /e "1d" | ^
sed /e "s/,/01 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$102 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$103 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$104 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$105 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$106 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$107 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$108 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$109 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$110 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$111 /" ^
/e "s/(\d{4})(.*?),/$1$2\n$112 /" ^
/e "s/,.*//" > monthly_typhoon
```

# Q2

さらに闇が深まりました。もはや何が起こっているのか自分でも理解できません。元データと変換データの突き合わせ検証をしているらしいです。最後の 3 行だけ解説すると、 '元データの合計値'=='変換データの合計値' という式を作り、 `eval` に突っ込んだ結果 `false` となった行だけ出力しようとしています（この場合は全て true となり何も出力されません）。

```bat:Q2
type monthly_typhoon | ^
sed /e "s/^(\d{4})\d{2}/$1/;$d" | ^
sed /e "N;N;N;N;N;N;N;N;N;N;N;s/\r\n//g" ^
/e "s/\d{4} / /g" ^
/e "s/ +/\+/g" ^
/e "s/\+$/+0/" | ^
xargs /n 1 eval | ^
sed /e "1i hoge" | ^
paste landing.sjis.csv - | ^
sed /e "s/^.*,//" ^
/e "s/^\t/0\t/" | ^
sed /e "1d" ^
/e "s/\t/==/" | ^
xargs /n 1 eval | ^
findstr false
```

# Q3, Q4, Q5

諦めました。

# Q6

簡単でした。

```bat:Q6
type hittakuri | ^
cut /d , /f 1 | ^
sort | ^
uniq | ^
(for /f "usebackq" %i in (`findstr .*`) do @( findstr %i hittakuri | wc /l | xargs /I @ echo %i @ ))
```

# Q7

作成中の `join` を使いました。ところで `wc` がタブを出力していることに気付いたんですが、この挙動は一般的なんでしょうか。`tr` で簡単に置換できるので気になりませんが。

```bat:Q7
type hittakuri | ^
cut /d , /f 1 | ^
sort | uniq | ^
(for /f "usebackq" %i in (`findstr .*`) do @( findstr %i hittakuri | wc /l | xargs /I @ echo %i @ )) | ^
tr "\t" " " | ^
join - population_h27sep | ^
sed /e "s/  .* /\//" /e "s/^(.*) (.*)$/'$1 ' + \($2\)/" | ^
xargs /n 1 eval | ^
msort /k 2nr
```

# Q8

ちょろいですね。

```bat:Q8
type hittakuri | cut /d , /f 1,2,3,8,9,10 | sort | uniq /c | findstr /v "^1" | cut /d " " /f 2
```

# Q9

諦めました。


# おわりに

windows で `awk` に相当するコマンドが思いつかず、集計がうまくできませんでした。`awk` だと `hoge[$1] += 1` で簡単に集計できるので連想配列は便利ですね。また `for` や `END` が使えるのも `awk` の強みだと思います。やはり `awk` は偉大。

そういえばコマンドプロンプトから powershell を呼び出せることに今気づいたのですがもしかして。。。
Ansible+Vagrant でシンプルなPrometheusモニタリング環境構築

## 概要

[Prometheus入門](https://prometheus.io/docs/introduction/getting_started/) にあるチュートリアルを
Ansibleで簡単に構築できるようにした、
というものです。

先日2016年6月14日、
LINE株式会社での[Prometheus Casual Talks #1](http://connpass.com/event/32859/)に参加し
ナレッジのおさらいなどしたく、
構築法をまとめました。

## Prometheusとは

最近話題のPull型のQuery Filtering可能で Grafana等と連携できる モニタリング/Alertツールです。

## 構成

![Imgur](http://i.imgur.com/pfazhaR.png)

- Prometheus Server × 1
- Prometheus Client × 2

## 環境

- CentOS 6.5
- Prometheus Server 0.20.0
- Supervisor 3.3.0
- Go 1.6.2
- Ansibl 2.1.0.0
- Vagrant 1.8.1
- MacOSX 10.11.5

## 前提条件

以下ツールをインストールしておいてください。

* VirtualBox
* Vagrant
* Ansible


## 使い方

### 1. git repository を clone

```
$ git clone https://github.com/kenzo0107/Vagrant-Prometheus
```

## 2. Vagrant VM 起動

```
$ cd Vagrant-Prometheus
$ vagrant up
```

3 node running !  

- 1 node: Prometheus Server
  - 192.168.11.30
- other 2 nodes: Prometheus Client Server
  - 192.168.33.31
  - 192.168.33.32

## 3. ssh.config 追加

```
$ vagrant ssh-config > ssh.config
```

## 4. ping 疎通試験

```
$ ansible default -m ping

server | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
client1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
client2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

ok, success.

## 5. 2node に PrometheusClient 設定

```
$ ansible-playbook set_clients_prometheus.yml
```

## 6. PrometheusClient の起動確認

以下PrometheusClientを起動しているサーバにアクセスし
起動されているか確認します。

- <http://192.168.11.31:8080/metrics>  
- <http://192.168.11.32:8080/metrics>

以下のように表示されれば成功です。

<img src="http://i.imgur.com/igPci2Z.png" width="400px" />


## 7. PrometheusServer 設定

```
$ ansible-playbook set_server_prometheus.yml
```

## 8. PrometheusServer 確認

<http://192.168.33.30:9090> にアクセス

以下のように表示されれば成功です。

<img src="http://i.imgur.com/XDTarz3.png" width="400px" />

是非多少なりとも一助となれば何よりです！
いじくり倒してみてください！

以上
NetLimiter3を利用して、ネットワークの帯域を制御する

複数ファイルの並列ダウンロードや、NWの輻輳状態は簡単に実現できません。遅延発生機を導入したり、NW機器で帯域を絞るなどが必要だと思っていました。このソフトウェアを導入すれば、UL/DLどちらも指定した規模の帯域制御ができ、非常に有用できます。

#NetLimiterを導入する

**インストーラーをダウンロードする**
![dl.png](https://qiita-image-store.s3.amazonaws.com/0/110457/0a404170-5142-224a-e6fb-69f167724971.png)

**インストール後、管理画面を開く**
![nl.png](https://qiita-image-store.s3.amazonaws.com/0/110457/0e989036-06ae-2a58-e7ca-014dde64ea6d.png)

利用しているアプリ、もしくはNICに対して、DL/ULいずれかに
指定した数値の帯域制御を掛けることができます。
→この例では、すべての通信が、100bps(DL)になります

**帯域制御をかけたまた、yahooにアクセス**
![set.png](https://qiita-image-store.s3.amazonaws.com/0/110457/c2cf94d4-c187-9861-f9bf-32521f1159d4.png)

1分程度待っても、画面が表示できない。。。

**結果、チェック（帯域制御）を外しました**
![res.png](https://qiita-image-store.s3.amazonaws.com/0/110457/68578820-b4bd-8c5b-1564-b267dbb9bd54.png)

指定した数値で、DLの帯域制御ができていることが確認できました。これで、NWの輻輳状態再現など、いろいろな状況を作り出せそうです。近年回線や無線LANが高機能、大容量、高速になったため、ファイルの並列ダウンロードテストをしようにも、ダウンロード開始してすぐに終了してしまい、テスト方法に悩んでいました。このNetLimiterを使えば、DLの帯域を制御して、複数ファイルの並列ダウンロードが実現できました。
キー入力1つでGameObjectのアクティブON/OFFを切り替える

※この記事のUnityのバージョンはUnity5.3.5f1です.
# はじめに
キー入力でオブジェクトのアクティブ状態の切り替えができたら楽なのでは？　と思い、
キー入力ひとつでHierarchyで選択しているオブジェクトのアクティブ状態を反転させるエディター拡張を作ってみました。

![Unity (64bit) - Untitled - EditorKeyControlTest - PC, Mac & Linux Standalone_ _DX11_ 2016-06-21 00.04.13.png](https://qiita-image-store.s3.amazonaws.com/0/44288/c3fb1d6c-4da2-2c58-ae22-a547008ba111.png)


#コード
下記URLのコードを参考にさせていただきました。
http://anchan828.hatenablog.jp/entry/2013/05/20/135339

カンマが入力されたときにHierarchyで選択しているオブジェクトのアクティブ状態が反転します

``` NewBehaviourScript.cs
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using System.Reflection;

[InitializeOnLoad]
public class ToggleGameObjectActiveShortCut
{
    static ToggleGameObjectActiveShortCut()
    {
        bool keyDown = false;
        EditorApplication.CallbackFunction function = () =>
        {

            if (!keyDown && Event.current.type == EventType.KeyDown)
            {
                keyDown = true;

                // . が入力されたらHierarchyで選択しているオブジェクトのアクティブ状態を反転させる
                if (Event.current.keyCode == KeyCode.Comma && Selection.activeGameObject != null)
                {
                    foreach (var go in Selection.gameObjects)
                    {
                        Undo.RecordObject(go, go.name + ".activeSelf");
                        go.SetActive(!go.activeSelf);
                    }
                }
            }

            if (keyDown && Event.current.type == EventType.KeyUp)
            {
                keyDown = false;
            }
        };

        FieldInfo info = typeof(EditorApplication).GetField("globalEventHandler", BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
        EditorApplication.CallbackFunction functions = (EditorApplication.CallbackFunction)info.GetValue(null);
        functions += function;
        info.SetValue(null, (object)functions);
    }
}
#endif // UNITY_EDITOR
```

#結果
キーボードのカンマを入力すると選択しているオブジェクトのアクティブ・非アクティブが切り替わるようになります。　楽ちん
![Unity (64bit) - Untitled - EditorKeyControlTest - PC, Mac & Linux Standalone_ _DX11_ 2016-06-21 00.19.59.png](https://qiita-image-store.s3.amazonaws.com/0/44288/871436b0-d35c-8b3e-998b-0ff47b12c301.png)
ActiveRecord::Base.transactionで囲うタイミング

**分けることができない処理**を

```rb
ActiveRecord::Base.transaction do
end
```
で囲うのはもちろんとして、


Railsは

```rb
ActiveRecord::Base.transaction do
end
```
で囲っていなくても、DBをコミットしたりロールバックする処理が自動で走るのだが、
後から見て自動で走るポイントがわかりずらいので、明示的に

```rb
ActiveRecord::Base.transaction do
end
```
で囲ったほうがよいかも。

なので、下記のような形にすることがあるかな。

```rb
def hoge
  ActiveRecord::Base.transaction do
    foo.save!
  end

  ActiveRecord::Base.transaction do
    bar.save!
  end
rescue ActiveRecord::RecordInvalid
  # エラーハンドリング
end
```


でも、本当は、明示的に囲うのではなく、**分けてもよい処理**なら

```rb
def hoge
  unless foo.save
    # エラーハンドリング
    return
  end

  unless bar.save
    # エラーハンドリング
    return
  end
end
```

もありかな。　上記は別のオブジェクトへのsaveが2回以上でてくる例なので、
トランザクションで囲って`rescue ActiveRecord::RecordInvalid`でエラーハンドリングするのか、
`unless`でエラーハンドリングするのか悩みどころだが、saveが1個のみなら、

```rb
def hoge
  unless foo.save
    # エラーハンドリング
    return
  end
end
```

の`unless`形1択で、

```rb
def hoge
  ActiveRecord::Base.transaction do
    foo.save!
  end
rescue ActiveRecord::RecordInvalid
  # エラーハンドリング
end
```

とはしないのが普通かな？

eachとかで何回も保存するときは、要件的に**分けられない処理**と考えられることが多いので、

```rb
def hoge
  ActiveRecord::Base.transaction do
    foos.each do|foo|
      foo.save!
    end
  end
rescue ActiveRecord::RecordInvalid
  # エラーハンドリング
end
```

の形になることが多い気がする。


んー、後からみて自動で走るポイントがわかりずらいと、始めに書いたが、

* [ruby on rails - railsが自動で行うトランザクションはhas_manyな関係のためでしょうか？ - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/18419/rails%E3%81%8C%E8%87%AA%E5%8B%95%E3%81%A7%E8%A1%8C%E3%81%86%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AFhas-many%E3%81%AA%E9%96%A2%E4%BF%82%E3%81%AE%E3%81%9F%E3%82%81%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B)

おそらく、`save`か`save!`を何も考えずに書けば、都度コミットが走って、`save!`のときはロールバックも走るのだと推測している。
ElectronとSocket.ioでBotと音声チャット

人工無脳と気楽に会話出来るように音声チャットのテンプレートを作ってみました。

[PonDad/electron_voice_chat - GitHub](https://github.com/PonDad/electron_voice_chat)

こんな感じです。

[![](http://img.youtube.com/vi/Zx3c8Si7LRI/0.jpg)](http://www.youtube.com/watch?v=Zx3c8Si7LRI)

[electron_voice_chat - YouTube](https://www.youtube.com/watch?v=Zx3c8Si7LRI)

## ElectronでSocket.ioを使う

こちらの記事を参考にしました。

[Electron+Node.js+jQueryで最小構成チャット - Qiita](http://qiita.com/naga3/items/e1e7a1fc2acbefa76964)

最初expressを使ってローサルサーバーを立てなきゃいけないと思っていたんですけど、

`var io = require('socket.io').listen(3000);`

これだけでローカルサーバーが立てられるとは知りませんでした。こちらのサンプルを元に音声入力、出力を追加します。

## annyan.js & responsiveVoice.js

音声入力と出力はJSライブラリのAnnyan.js、ResponsiveVoice.jsを利用します。入出力はこちらのライブラリを参考にしました。

[augustogoncalves/personal-assistant - GitHub](https://github.com/augustogoncalves/personal-assistant)

一番のポイントはannyan.jsをnode.jsのモジュールとして読み込んでいることです。（ElectronのクライアントサイドでWebSpeechRecognitionAPIを読み込むとエラーになってしまいます。）

```js:js/app.js
var annyang = require('annyang');
var socket = require('socket.io-client')('http://localhost:3000');
var commands = {'*i': function() {console.log("実行")}};

  annyang.addCommands(commands);
  annyang.setLanguage('ja');
  annyang.start();
  console.log('録音開始');
  document.getElementById('recording').textContent = '録音開始';
  annyang.addCallback('resultMatch', function(userSaid) {
    console.log('録音: ' + userSaid);
    socket.emit('chat_message', userSaid);
  });

socket.on('msg', function(msg) {
  console.log('返信: ' + msg);
  say(msg);
});

function say(msg, callback) {
  console.log('発話: ' + msg);
  document.getElementById('messages').textContent = msg;
  annyang.abort();
  console.log('録音停止');
  document.getElementById('recording').textContent = '録音停止';

  responsiveVoice.speak(msg, 'Japanese Female', {
  　onend: function() {
      annyang.start();
      console.log('録音再開');
      document.getElementById('recording').textContent = '録音再開';
    }
   });
};

```

あとはannyang.jsのドキュメントに沿った形で記述します。ドキュメントでは音声アシスタントように「音声認識」→「キーワード一致」→「実行コマンド」というパターンですが、今回は人工無脳と音声でやりとりすることを考え、認識した音声を`*i`を使って全てサーバーサイドに送るようにしました。

```js:server.js
var io = require('socket.io').listen(3000);
io.sockets.on('connection', function(socket) {
  socket.on('chat_message', function(data) {
    var bot_reply =  data + 'だボット';
    io.sockets.emit('msg', bot_reply);
  });
});
```

サーバーサイドでは入力音声をオウム返しするようにしてみました。

サーバーサイドで受け取った音声データを基にしてAPIからjsonデータを取得したり、人工無脳とやりとりしたり、といったことが出来ると思います。

サーバーの立ち上げを手動でするのが面倒なので

```js:main.js
//略
var exec = require('child_process').exec;
exec('node server.js', function(err, stdout, stderr){
  if (err) { console.log(err); }
});
//略
```
`child_process.exec`で起動させてみました。

## まとめ

最近人間と話すよりBotと会話する方が多くなっている気がします。（それでいいのか・・・）。

それはさておき、サンプル動画をご覧になった方は分かると思うのですが私のカミカミの早口言葉を良く認識出来るもんだと感心します。さすがGoogle先生といったところでしょうか。
【Python】FlaskでAPIをさくっとつくる

# なにこれ
DBを使いつつ、ちょこっとしたAPIをさくっと作りたいときありますよね。
そういう時、[Flask](http://flask.pocoo.org/)が便利です。
基本的に以下のコードに肉付けしていくだけで、APIがつくれますよん

# 注意
個人的な意見として、中規模なプロジェクトだったり、flask-*を後で追加しまくったり、DBをガッツリ使うのであればDjango等のフレームワークを使ったほうが良いと思います。
後々、別のフレームワークに移す予定があるならもうそっちをつかっちゃいましょう。


# コード
Modelに対してCRDを提供するAPIを以下に示しました。　
(Updateは気が向いたら後で実装します)

* db.session.commit()が呼び出されると実際のDBへ反映されます
* 失敗した場合、自動でロールバックされるっぽいです

```py
# coding: utf-8
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost/postgres'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)


# Model
class Model(db.Model):
    __tablename__ = 'models'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)

    def to_dict(self):
        return dict(
            id=self.id,
            name=self.name
        )

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<Model {}>'.format(self.name)


@app.route("/api/v1/model/<id>", methods=['DELETE'])
def api_v1_model_id(id):
    if request.method == 'DELETE':
        d = Model.query.get(id)
        db.session.delete(d)
        db.session.commit()
        return '', 204


@app.route("/api/v1/models", methods=['GET', 'POST'])
def api_v1_models():
    if request.method == 'POST':
        name = request.json['name']
        d = Model(name)
        db.session.add(d)
        db.session.commit()
        return jsonify(d.to_dict()), 201
    if request.method == 'GET':
        ls = Model.query.all()
        ls = [l.to_dict() for l in ls]
        return jsonify(ls), 200


if __name__ == "__main__":
    db.drop_all()
    db.create_all()
    app.run(host='0.0.0.0', port=3001)

```
非vimmerもこれだけは覚えていてほしいvimコマンドシリーズ 第二弾【<C-a>, <C-x>】

#なにこれ
「普段はvim使ってないけど、サーバ上ではvimです。」っていう人向けのvimコマンド集です。
特にpluginを入れなくても使える機能になります。

#\<C-a\>, \<C-x\>
\<C-a\>: 次にある数値に1を足す
\<C-x\>: 次にある数値から1を引く

#実践
##\<C-a\>

```
nad|eko is 14 years old. # |の位置がカーソルだと思ってください
```

ここで\<C-a\>を押す

```
nad|eko is 15 years old. # |の位置がカーソルだと思ってください
```

##\<C-x\>

```
nad|eko is 14| years old. # |の位置がカーソルだと思ってください
```

ここで\<C-x\>を押す

```
nad|eko is 13| years old. # |の位置がカーソルだと思ってください
```

#ちなみに
10\<C-a\>とか12\<C-x\>とかを使うと10を足したり12を引いたりできます。

#まとめ
次回予定している、キーボードマクロと一緒に使うとかなりの作業(例えば変数リストの番号1づつ足していくとか)がvimで自動化出来たりするので、すごく便利です＼(^o^)／
CTF入門 (不定期更新)

# CTFの入門 
## CTFとは？
>CTFとは、Capture The Flagの略で、情報セキュリティー分野で技術を競う手法の1つです。

へぇ、なるほど

> 参加するチームは、自分のホストを守りながら、他チームのホストを攻撃します。攻撃の>方法には、改ざんや情報取得などがあり、より多くの攻撃をしたチームが勝利となります。相手の攻撃を素早く検知し、自チームのサーバーを防御することも大切な要素です。敵の心理を読む実践力を磨く取り組みとして注目されています。

ふむふむ

おもろそう

参考: [CTFとは](http://www.elite-network.co.jp/x/dictionary/it/ctf.html)

## 出題範囲

- 暗号理論
- 符号理論
- 信号処理
- 画像処理
- 通信処理
- 組み込み技術
- Web技術
- 公開鍵基盤(PKI)
- プログラミング言語
- データベース
- OSオペレーティングシステム
- ファイルシステム
- API(POSIX, Win32API)
- ファイルフォーマット
- 符号化
- 脆弱性、バグ
- Exploits(Bin術)
- 情報の秘匿
- ログ解析
- ツール
- その他雑学

こう見ると難しい・・・っていうか範囲広い

次回から細分化していきます

＊ つっこみがあればコメントお願いします
FlexSlider2でNetflixっぽいUIを実現する

[Babelink](http://www.babelink.net/)（※アダルトサイトのため閲覧注意）をリニューアルするにあたってNetflixっぽいUIにするため、FlexSlider2を使用しました。
FlexSlider2では自動で幅調整をしてくれるので、`item_width`パラメータを任意の値に設定してCSSで少しスタイルを調整するだけでスマホ画面にも対応したサイト作成が簡単にできます。  


```index.html
<head>
	<script src="/static/node_modules/flexslider/jquery.flexslider-min.js"></script>
	<link rel="stylesheet" type="text/css" href="/static/node_modules/flexslider/flexslider.css" />
</head>
<main>
{% for (title, item_list) in all_item_list %}
	<div class="flexslider-wrapper">
		<div class="flexslider-title">
			<span>
				{{ title }}
			</span>
		</div>
		<div class="flexslider">
			<ul class="slides">
				{% for item in item_list %}
					<li>
					 <img
						class="img-src"
						src="{{ item.img_src }}"
					 />
					</li>
				{% endfor %}
			</ul>
		</div>
	</div>
{% endfor %}
</main>
<script>
$(window).load(function() {
	$('.flexslider').flexslider({
		animation: "slide",
		slideshow: false,
		animationLoop: true,
		controlNav: false,
		itemWidth: 140,
		itemMargin: 4,
		prevText: "",
		nextText: ""
	});
});
</script>
```

```app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index():
    all_item_list = []

    # 一つの行に表示するアイテムを取得する
    item_list1 = get_item_list1()
    all_item_list.append('title1', item_list1)
	
    item_list2 = get_item_list2()
    all_item_list.append('title2', item_list2)
    .
    .
    .

    return render_template(
        'index.html',
        all_img_list=all_img_list)
	
```

## 参考資料

[FlexSlider2](http://flexslider.woothemes.com/)
[【jQuery】超万能スライダー FlexSlider の使い方をマスターする。](http://on-ze.com/archives/409)
Xamarin.Formsでページが破棄されたタイミングでViewModelのDisposeなどを実行する

Xamarin.FormsでViewModelを使っている場合、そのページが破棄されたタイミングでイベントの購読解除等を行うDispose的な処理を書きたいなと思っていてその方法を調べてみました。
ページが破棄されるのをStackからページがPopされることとすれば、Popに関するイベントを捉えるのが良さそうです。
調べてみるとPushAsyncはNavigationPageのPoppedイベント、PushModalAsyncはApplication.CurrentのModalPoppedイベントで対処できるようです。

## ViewModelに適当なインターフェースを適用する

例としてIDisposableを適用。自作インターフェースでももちろん可。

```csharp
public class ViewModelSample : IDisposable
{
    public void Dispose(){
        //後始末
    }
}

```

## NavigationPageのPoppedに登録

PopAsyncでPopしたページはNavigationPageのPoppedイベントで拾えるのでNavigationPageのコンストラクタ等で処理を登録しておきます。毎回書くのがめんどうならBaseクラスにでも。

```csharp
public MainNavi() {
    this.Popped += (sender, e) => {      
        (e.Page.BindingContext as IDisposable)?.Dispose();
    };
}
```

## Application.CurrentのModalPoppedに登録

PopModalAsyncでPopしたページはApplication.CurrentのModalPoppedイベントで拾えるのでAppクラスのコンストラクタ等で処理を登録しておきます。

```csharp
public App(){
    Application.Current.ModalPopped = (sender, e) => {
        (e.Modal.BindingContext as IDisposable)?.Dispose();
    };
}
```

## 注意事項

PopToRootAsyncを使うと処理対象のページを見失います。
PoppedToRootイベントで拾えそうなんですが、そこで拾えるのは直前のページだけで他のページは参照できません。しかもPoppedToRootはPopした後なのでNavigationStackにも残ってません。なのでPopと特定の処理を合わせたい場合はPopToRooTAsyncは使わないようにするか、同様の動きをする機能を独自に実装するしかないと思います。

### 補足

iOSではTabbedPageの現在表示中のタブをクリックするとルートページに戻ります。これはPopToRootしているように見えますが実際は1ページずつPopしているようなのでPoppedイベントの方で処理できます。

## 参考
https://forums.xamarin.com/discussion/57043/viewmodels-not-disposing-on-navigation-pop
EB CLI (Elastic Beanstalk CLI) Docker の eb local で実行したコンテナに対して初期化処理を行うメモ

`eb local run` でローカルのdocker-machine上にいろいろ構築できるし、ElasitcBeanstalkへのデプロイもでる、控えめにいって神ツールな EB CLI ですが、微妙にいろいろ足りません。神見習いって感じ。

自分の使い方が悪いだけかもしれませんが `.ebextensions` に対応してないっぽいのがいけてない。
たとえば適当なPHPアプリを組んでみたのはいいけど、migrate処理が行えない。
たぶん `.ebextensions` さえ使えたら楽勝（楽勝とはいってない）のに！！！という感じ。

というわけで、 初期化処理を行うメモ。
本当は `eb local run` が走りつつ、諸々起動確認とれたらmigrateまで行うような神コマンドラインが書けたらよかったんだけど、まだそこまでいけてないので、とりあえずということで。

## 構成

[標準のPHP-FPM+Nginxのサンプル](https://github.com/awslabs/eb-docker-nginx-proxy) にMySQL足した感じで、 `php-app` の中に `Lumen` を入れてる風のを↓にアップしてます。

https://github.com/takyam-git/eb-docker-multiple-php-nginx-lumen-example

## やること

※eb init などのセットアップは終わってる前提

* `eb local run` でコンテナを起動する
* `docker-machine ssh default "PHP_CONTAINER_ID=\$(docker ps -f name='php' --format '{{.ID}}');docker exec \$PHP_CONTAINER_ID 'php' '/var/www/html/artisan' 'migrate'"`
 で `artisan migrate` する。

以上です。

## なにをしてるのか

* `eb local run` で `docker-machine` 上に `default` という名前のDocker daemonが起動します。
* `default` の中には今回の例だと、 `nginx` `php` `mysql` の３つのコンテナが起動してます
* PHPファイルがあってartisanを実行するのは `php` の環境なので、PHPの環境に入ってartisanコマンドを叩きたいです
* `docker-machine ssh default "実行したいコマンド"` で`default`上にホスト（OS X）からシェルでログインして操作しなくてもコマンドを実行できます
* `PHP_CONTAINER_ID=\$(docker ps -f name='php' --format '{{.ID}}');` で `PHP_CONTAINER_ID`環境変数に `php` コンテナのコンテナIDを格納してます
* `docker exec \$PHP_CONTAINER_ID 'php' '/var/www/html/artisan' 'migrate'` で `php` コンテナに対して `php /var/www/html/artisan migrate` コマンドを実行してます
* これをワンライナーにすると `docker-machine ssh default "PHP_CONTAINER_ID=\$(docker ps -f name='php' --format '{{.ID}}');docker exec \$PHP_CONTAINER_ID 'php' '/var/www/html/artisan' 'migrate'"`
 で `artisan migrate` になります。
* ただのシェルスクリプトなので、これをまとめることで初期化スクリプトがきっと作れるはず

## 感想

* `EB CLI` を使うことで「本番環境・開発環境・ローカルの全てが `Dockerrun.aws.json` の設定だけでイケイケドンドン」みたいな夢を見ましたが、普通に考えて開発環境や本番環境ではRDSとか使うでしょうし、ローカルも全部ふくめてイケイケドンドンは無理だなと思いました。
* とはいえ `eb local run` でローカル環境が本番と（コンテナ的な意味では）同じ設定でバッチリ立ち上がるのはかなり魅力的ではあるので、何とか使いこなしたい人生です。
* `.ebextensions` がどうやらローカルでは動かない？昨今としては、docker-machineに対して直接コマンドをバッチコーイするのが非常に後ろ向きで確実なソリューションとしてあるのかなと思いました
* もちろんシェルで入ってモニョモニョ操作すれば何でもできるんですが、折角Dockerをドッカンドッカンしてるのに手作業は負けてる気がするので、頑張って自動化したいと思いました。
* 幸い `docker-machine` コマンド経由で中のコンテナに `exec` することができるので、何とでもなりそうな印象です
* マジDocker芸を身につけないとつらそうだなと思いました。がんばりたいとおもいます。まる。
MacにSwift3  framework(Vapor) をインストール

#Swift3のインストール
**現在はSwift3が開発段階であり正式なバージョンでは無いので開発段階を使用します。

Xcode7 Homebrew はインストール済みとします。

|Download|
|:---|
```> curl -O https://swift.org/builds/development/xcode/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a-osx.pkg```

|Install|
|:---|
```> open swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a-osx.pkg```

|Add to path|
|:---|
```> echo "export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:\"\${PATH}\"" >> ~/.bash_profile```
```> source ~/.bash_profile```

|Check|
|:---|
```> swift --version```
```# Apple Swift version 3.0-dev (LLVM b010debd0e, Clang 3e4d01d89b, Swift 7182c58cb2)```

※ここまでSwift3はインストールできているようですが、現在バージョンがSwift2へ戻ってしまうようです。下記の方法を継続してインストールが良いと思われます。

|swiftenv　Install|
|:---|
```>  echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.bash_profile```

|swiftenv　Install|
|:---|
```>  swiftenv install DEVELOPMENT-SNAPSHOT-2016-06-06-a```
```>  swiftenv global DEVELOPMENT-SNAPSHOT-2016-06-06-a```

|Check|
|:---|
```> swift --version```
```# Apple Swift version 3.0-dev (LLVM b010debd0e, Clang 3e4d01d89b, Swift 7182c58cb2)```

プロジェクト作成は
```> vapor new hello-world```

Xcodeをターミナルからの起動は、プロジェクト内で
```> vapor xcode```

プロジェクトを App へ変更してビルド後に実行
main.swift などでブレイクポイントを設定して

ブラウザから、http://localhost:8008/json でJSONが表示される。

まだ、Swift3でのライブラリが少ないのでこれからの普及が楽しみな所です。
iOSだけの開発だけでなく、Web開発が出来れば大きく開発のノルマが減り使う方も増えてくるでしょう。
今後、大変楽しみです。Androidも出来るという噂もあります。
RoR+ Nginx + Unicornで起動する。


#敬意
　-普段RoRで自分で整える環境はRoR Passengerを使うことが多かったのですがNginxが動いている環境で何かしたいと思い作ってみました。
ただそれだけ....
初心者がちょっと難しそうなことをしたなと思う程度で眺めてください。

#環境

-centos 7
-rails 4.2.6
-nginx 1.6.3

vagrantの環境は入ってるもので話を進めていきます。

#CentOSのインストール
```
 $ vagrant box add rails_env https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
 $ vagrant init rails_env
 $ vagrant up
```
#railsのインストール

```
sudo gem install rails
```
-少々時間がかかります。

#nginxのインストール

```
sudo yum install nginx
```

#railsプロジェクトの作成

```
rails new project名
cd project名
```

#Gemfileの編集 インストール
```
gem 'unicorn'
bundle install
```
#起動確認
```
bundle exec rails server -b ip番号
```

さぁ、用意が整いました。

#unicornファイルを編集

```ruby:config/unicorn.rb
@app_path = 'プロジェクトまでのディレクトリ'

worker_processes 2
working_directory "#{@app_path}/"

preload_app true

timeout 30

# socketファイルを生成するディレクトリ
listen "/tmp/unicorn.sock", :backlog => 64
#プロセスIDを生成するディレクトリ
pid "/tmp/unicorn.pid"

#logの場所を指定
stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

# USR2シグナルを受けると古いプロセスを止める。
#必要に応じて変えてください
#worker_processes 2 , timeout 10

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

  old_pid = "#{server.config[:pid]}.oldbin"
    if old_pid != server.pid
      begin
        sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
        Process.kill(sig, File.read(old_pid).to_i)
      rescue Errno::ENOENT, Errno::ESRCH
      end
    end
    sleep 1
  end
after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
```

これでUnicronの設定は完了です。

<p>次は、nginxですね</p>

```
#最大コネクション数の設定 デフォルトは512でした
events {
  worker_connections  1024;
}
http {

    upstream unicorn_server {
        # unicorn.rbで設定したsockpathを指定
        server unix:/tmp/unicorn.sock
        fail_timeout=0;
    }
    server {
        // 
    	listen 80;
    	client_max_body_size 4G;
    	server_name _;

    	keepalive_timeout 5;

    	# railsまでのpathを指定
    	root rails_project/public;

    	location / {
    	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	    proxy_set_header Host $http_host;
    	    proxy_redirect off;

    	    # If you don't find the filename in the static files
    	    # Then request it from the unicorn server
    	    if (!-f $request_filename) {
    	        proxy_pass http://unicorn_server;
    	        break;
    	    }
    	}

    	error_page 500 502 503 504 /500.html;
    	location = /500.html {
    	    root /hoge/vagrant/hage/public;
    	}
    }
}
```
#unicornを起動
```
bundle exec unicorn_rails -c config/unicorn.rb -E development -D

```
#nginxを起動
```
sudo nginx
```
![スクリーンショット 0028-06-20 22.58.27.png](https://qiita-image-store.s3.amazonaws.com/0/65606/7b793fab-d34f-81af-481e-fe95f8d54a7f.png)


<p>無事起動できましたね。</p>
<p>chefとかdocker等で立てるのは落ちているものを拾うだけでいい感じはしますが手動で立てたら結構時間かかりました。どのように動くのかを把握するには一番ですね
お疲れ様でした。</p>
browser solidityで作成したContractを呼び出してもマイニングが終わらない場合の対処法

Browser solidity で、下記の様なContractを書きました。

```lang:
contract answer{
  mapping(address => mapping(string => bool)) voters;

  struct qList {
    uint count; //The number of respondents
    mapping(address => mapping(uint => uint)) answer;
  }

  mapping(string => qList) questionnaires;

  function vote(string ID, uint qNum, uint ans) returns (bool) {
    if(voters[msg.sender][ID]) throw;
    voters[msg.sender][ID] = true;
    questionnaires[ID].count += 1;
    questionnaires[ID].answer[msg.sender][qNum] = ans;
    return true;
  }

  function getNumResult(string ID) constant returns (uint res) {
    return questionnaires[ID].count;
  }
}
```

アンケート(ID)の質問(qNum)に対して回答する(ans)という、シンプルな内容です。

contract自体には特に問題ないのですが、browser solidity上でvoteを行った後に、”Waiting for transaction to be mined...”と表示がずっと出て、マイニングが終わらないという現象が起こりました。


原因は非常に単純で、gasが足りない為に起こった現象でした。


というわけで、CLI上でコンパイルして動かしてみた結果が以下の通り

```
> var answerSource='contract Answer { mapping(address => mapping(string => bool)) voters; struct qList { uint count; /* The number of respondents */ mapping(address => mapping(uint => uint)) answer; } mapping(string => qList) questionnaires; function vote(string ID, uint qNum, uint ans) returns (bool) { if(voters[msg.sender][ID]) throw; voters[msg.sender][ID] = true; questionnaires[ID].count += 1; questionnaires[ID].answer[msg.sender][qNum] = ans; return true; } function getNumResult(string ID) constant returns (uint res) { return questionnaires[ID].count; }}'
undefined
```

```
> var answerCompiled = web3.eth.compile.solidity(answerSource);
undefined

> var answerContract = web3.eth.contract(answerCompiled.Answer.info.abiDefinition);
undefined 

> var answer = answerContract.new({
    from:web3.eth.accounts[0], 
    data: answerCompiled.Answer.code, gas: 2000000}, 
    function(e, contract) {
      if (!e) {
        if(!contract.address) {
          console.log("Contract transaction send: TransactionHash: " 
            + contract.transactionHash + " waiting to be mined...");
        } else {
          console.log("Contract mined! Address: " + contract.address);
          console.log(contract);
        }
    }
})
```
すると以下の様に無事minedとなりました。
```
Contract mined! Address: 0xe51ac93e4c28206f0f0296e5b6d66daf0a917bc3
```

アンケートidOneの質問１への回答として、１を選択したとしましょう。

```
> answer.vote("idOne", 1, 1, eth.accounts[0], {
  from:web3.eth.accounts[0], 
  data: answerCompiled.Answer.code,
  gas: 1000000
});
"0xfcbf47472733c0922552aa617fc7cb1226c346edc022fbe09ea521dfb75f7699"
```

しばらくすると、minedとなります。下記の様に、無事voteが機能していることがわかります。

```
> answer.getNumResult("idOne")
1
```

と、以上の様に、正しいcontractであるにも関わらず、browser compiler上ではマイニングされない問題が起こりましたら、CLI上でgasを設定すれば無事マイニングされるというお話でした。

browser solidity上でgasの設定ができればいいのですが、やり方を未だ見つけられておらず。見つけたら追記したいと思います。
fakes3+nginxで結合テスト用S3を立てる

S3がダウンした場合の結合テストをしたい事はよくある。そんな時は[fakes3](https://github.com/jubos/fake-s3)が便利。以下の感じで簡単にモックを立てられる。

```
# fakes3 server -r /tmp -p 80
```

でも、実際に結合テストに使おうとすると課題が出てくる。



## 1. httpとhttpsの両方サポートしないといけない
ライブラリによっては、httpとhttpsの両方の口を開けておかないといけない。以下でSSL対応できる。

```
# fakes3 server -r /tmp -p 443 --sslcert=/path/to/cert  --sslkey=/path/to/key
```

80番ポートと443番ポート両方別々にプロセスを立てて、ディレクトリだけ共有したらいいけどなんかいまいち。

## 2. nginxのヘッダ転送
fakes3をhttp/httpsの両方対応させるために、fakes3の前段にリバースプロキシとしてnginxを置く。

**最初の設定**

```
server {
    listen 80;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

server {
    listen 443 ssl;
    server_name *.example.com;
    ssl_certificate /path/to/cert;
    ssl_certificate_key /path/to/key;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}
```

この設定では、fakes3までリクエストは通るけど、何故かfake s3上にファイルが作られなかった

[ここ](https://github.com/jubos/fake-s3/blob/master/lib/fakes3/server.rb#L449)をみると、fakes3は`Host`ヘッダを見てbucket名を特定するため、nginxでHostヘッダをfakes3に転送する必要がある。

**修正後**

```
server {
    listen 80;

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
    }
}

server {
    listen 443 ssl;
    server_name *.example.com;
    ssl_certificate /path/to/cert;
    ssl_certificate_key /path/to/key;

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
    }
}
```

これでうまくいった。あとはfakes3をいじれば、s3のダウンとか、変なハングとかをモックできる。
私の問題に対する思考例(その1)


# はじめに、この記事を書く意図
私は1年程インフラのお仕事をしていたのですがそろそろコーディングのお仕事も再開することになりそうなのでそのリハビリに「業務のコードを書く時の思考をふりかえる」為に半ばチラシの裏として書いてみます。ですが、私以外の方の取り組み方も興味がございますのでコメントいただけるとうれしいです。

# 取り組む問題
下記記事の問題について取り組んでみます。
[複雑なSQLをデチューンしてみよう - SQLer 生島勘富 の日記](http://d.hatena.ne.jp/Sikushima/20100616/1276680064)

# 問題の解釈、確認
まず、この問題について「確認しなければならない事」を洗い出します。一人でコードを書くのであればこの工程は不要かもしれませんが、今回は自分が書いたものを別の誰かが使う「業務」を想定していますので。

## 1.データの元にするテーブルについて
元の記事では箇条書きで書かれており残念ながら私は意図をすぐにつかむ事ができませんでした。なので、「解釈」をして問題ないか「確認」する必要があります。以下に私が確認しなければと感じた項目を挙げます。

+ テーブルは「売上」「売上明細」「得意先」「商品」の4つで、その項目は箇条書きにある項目で問題ないか。
+ 【要望】の「顧客マスタ」とは「得意先」で間違いないか。
+ 多対一などのテーブルの関係性
+ 主キー
+ 最終出力する項目

…正直、これでもまだ足りていないと感じております。その点、コメントにてご意見いただけると助かります。

## 2.何を満たしていれば問題を解決した事になるのか
ここでは問題に対して作成したプログラムをどのようにチェックするか考えます。この工程は絶対に本体のコードを書く前にすべきです。テストファーストだとかユニットテストだとかそんな大層な事ではなく、何を満たしていれば良いのかだけでも考えます。ちょっと昔話になるのですが、私はこの工程をすっぽかし、資料も残さず現場から去ったメンバーのおかげで一晩過ごしました。私だけでなく、他のチームメンバの一部も。チーム開発している現場で**「適当に」確認したコードを本番環境に挙げるのだけは絶対に止めて下さい。**
さて本題に戻ります。ちょっと問題を整理しましょうか。

### 2.1 何を作るのか
一番大きな項目ですね。説明を読む限りでは以下のような項目を持つデータを一覧として作成するとあります。
おおよそ、テーブルから拾える項目ですが、消費税だけはあるルールに則って出さなければならないようです。


|請求書NO|納品書NO|行NO|売上日|得意先ID|丸め単位|商品ID|商品区分|単価|数量|消費税|...|
|---|---|---|---|---|---|---|---|---|---|---|---|
|...|...|...|...|...|...|...|...|...|...|...|...|

### 2.2 何に気を付けなければならないか
消費税についてルールを纏めてみます。

+ 小数点以下[^1]の丸め方は得意先ごとに決まっている
+ 得意先の丸め単位によっては納品書単位、請求書単位で合計してから丸めた消費税との差から誤差を合計金額順に1円づつ差がなくなるまで増減させてゆく

このルールをどう処理するかは正直まだピンときません。ですがテストしなければならないパターンだけは整理できます。

### 2.3 動作確認するパターン出し

得意先テーブルが持つ消費税のルールに関する項目は2項目3種類[^2]。テストパターン表に纏めると以下の通り。

|             |明細単位|納品書単位|請求書単位|
|---------|----------|-----------|------------|
|切り捨て|              |               |                 |
|四捨五入|              |               |                 |
|切り上げ|              |               |                 |

このうち明細単位は「変わってない事」を確認し、残りは「プラスの誤差」「誤差無し」「マイナスの誤差」のパターンをださなければならないと思うのですが、パターンを出していくうちにあることに気が付きました。

**「切り捨ての場合、プラスの誤差は出ない気がする」**
**「同様に切り上げの場合、マイナスの誤差は出ない気がする」**

「気がする」とある通り、実のところまだ自分の中で何故そうなるのか説明できていません。
残念ですが、説明ができたら続きを書こうと思います。


[^1]: 問題中には「小数点以下」って書いてないですね…これも確認項目だ！
[^2]: 実際の業務であれば「それ以外」も必ず想定しなければ後で泣きます。
Windows PowerShellでCoreutilsライクなls

素人の備忘録。

Windows10でBashが使えるようになるそうですね。
そんな状況で今更この記事に需要があるのかよくわからないが、意外と日本語での情報が見当たらないので念のため記録しておく。

# 動機
PowerShellのls (Get-ChildItem) はもう少しなんとかならなかったのか。
コマンドプロンプトから何も変わっていない。

![normal_ls.png](https://qiita-image-store.s3.amazonaws.com/0/110101/129f9a9d-608f-6d7b-de13-72543552363a.png)

さすがにもうちょっと見栄えを良くしたい。

![coreutils-like_ls.png](https://qiita-image-store.s3.amazonaws.com/0/110101/e9f4ae67-04ae-0092-d815-6d3a062bd0ff.png)

# 解決策
ぶっちゃけこちら。

[code: Coreutils-style ‘ls’ for Windows Powershell](https://la11111.wordpress.com/2012/10/20/code-coreutils-style-ls-for-windows-powershell/)

`gcic-profile.ps1`の中身を自分のプロファイルにコピペし、`get-ChildItemColored.psm1`を`\WindowsPowerShell\Modules\get-ChildItemColored`以下に保存するだけ。

ただし、このままでは日本語のファイル/フォルダ名で表示がおかしくなる。
原因は明らかで、`get-ChildItemColored.psm1`の28, 29行目と131, 133行目でファイル/フォルダ名の文字数をカウントしているので、倍角文字に対応できていない。
そこで文字列のバイト数を見るように手を加える。

```diff:get-ChildItemColored.psm1_28-29行目
-if ($_.name.length -gt $w) {
+if ([System.Text.Encoding]::GetEncoding("Shift_Jis").GetByteCount($_) -gt $w) {
-$w = $_.name.length
+$w = [System.Text.Encoding]::GetEncoding("Shift_Jis").GetByteCount($_)
```

```diff:get-ChildItemColored.psm1_131-133行目
-write-host -nonewline "$(' '*($c.width - $fn.length - $dec))"
+write-host -nonewline "$(' '*($c.width - [System.Text.Encoding]::GetEncoding("Shift_Jis").GetByteCount($fn) - $dec))"
} else {
-write-host -nonewline -fore $(pick-color $f) "$fn$(' '*($c.width - $fn.length - $dec))"
+write-host -nonewline -fore $(pick-color $f) "$fn$(' '*($c.width - [System.Text.Encoding]::GetEncoding("Shift_Jis").GetByteCount($fn) - $dec))"
```

これで日本語に対応できる。
Ansible×Cowsay

* cowsayがインストール~~されている~~したマシンでAnsibleを実行すると、牛が出てきます。
* Localマシンならいいけど、プロダクション、ステージングでやると怒られます。

```bash
__________________ 
< PLAY [test-play] >
------------------ 
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

______________ 
< TASK [setup] >
-------------- 
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

ok: [10.0.0.90]
_____________________ 
< TASK [epel-install] >
--------------------- 
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

ok: [10.0.0.90]
______________________ 
< TASK [nginx-install] >
---------------------- 
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

ok: [10.0.0.90]
_____________________ 
< TASK [nginx-status] >
--------------------- 
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

ok: [10.0.0.90]
____________ 
< PLAY RECAP >
------------ 
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

10.0.0.90                  : ok=4    changed=0    unreachable=0    failed=0   
```

* ansible.cfgでnocowsをコメントアウトすれば、牛は出てこないです。

```ini:/etc/ansible/ansible.cfg
# don't like cows?  that's unfortunate.
# set to 1 if you don't want cowsay support or export ANSIBLE_NOCOWS=1 
nocows = 1

```

``` bash
PLAY [test-play] ***************************************************************

TASK [setup] *******************************************************************
ok: [10.0.0.90]

TASK [epel-install] ************************************************************
ok: [10.0.0.90]

TASK [nginx-install] ***********************************************************
ok: [10.0.0.90]

TASK [nginx-status] ************************************************************
ok: [10.0.0.90]

PLAY RECAP *********************************************************************
10.0.0.90                  : ok=4    changed=0    unreachable=0    failed=0
```
GoogleMap APIを使って地図にピンをたてたらズレる件について

## WebサイトにGoogleMapを埋め込む
クライアントから「WebサイトにGoogleMapを埋め込みたいです」と要望がきた。
よゐこなデベロッパーなので、当然のごとく標準の埋め込み用タグではなく、GoogleMapAPIを使って地図を埋め込みます。(地図の上でスクロールしたときに、意図しないズームを防ぐため)

## ピンがずれる
GoogleMapでピンを建てたい場所の緯度・経度を取得して、APIのoptionに書く。
しかし、実際に表示させると何故か数十から数百メートルほどズレる。

## 測地系が違う
ググッて見ると、以下のような記事が出てきた。
[Google Maps APIで緯度経度を元にプロットしたマーカーの位置がずれる（測地系変換）](http://shimz.me/blog/google-map-api/3103)

どうやら、「測地系」が日本版と世界版があるらしく、それのズレがピンのズレにつながってるぽい。
(測地系とは: 緯度・経度を座標で表すシステムのこと)

上にあげたサイトでは、ライブラリを使って変換しているっぽいけど、地図は1つしか埋め込む気がないのでわざわざ1つの地図のためにライブラリを導入するものなあ...と思った。

## GeoCodingで取得した緯度・経度で試してみる

以下のサイトで、住所を入力して緯度・経度を取得してやると正しい値が取れる。
取得した値をAPIを呼ぶときのオプションに設定してやるとちゃんとズレが直る。
http://www.geocoding.jp/

めでたい。
Docker Machine(Boot2Docker)でbashを使えるようにする方法

[ブログ](https://t-hiroyoshi.github.io/docker-machine-bash/)のコピペです。

Docker Machineめっちゃ便利ですがBoot2Docker上で作業をしている時、コンテナをShell Scriptで管理していて困ったことありませんか?

```Shell
docker@dev:/Users/t-hiroyoshi/git/some-project/docker$ ./manage.sh build
env: can't execute 'bash': No such file or directory
```

bashがBoot2Dockerに入ってない!これは困る!ということでBoot2Dockerにbashを入れる方法です。
Boot2Dockerは[Tiny Core Linux](http://tinycorelinux.net)ベースで動いているのでそのパッケージ管理システム([tce-load](http://wiki.tinycorelinux.net/wiki:tce-load))を利用してあげれば万事解決です。

```Shell
docker@dev:/Users/t-hiroyoshi/git/some-project/docker$ tce-load -wi bash
```

これでbashが使えるようになったのでbash Shell Scriptが使えます。
Docker Machine(Boot2Docker)上に状態を持つのはあまり良くない気がしますがまあbashぐらいはあってもいいのではと思いました。
[自分メモ] blenderからUnityへのimport




blenderで作成した3DモデルをUnityへインポートするための設定等の備忘録

ここではRig, Animationは扱わない。

#前提条件
blender 2.77a
Unity 5.3.4p3


#blender fbxエクスポート設定
blender側でモデリングするときの前と上の設定が
Unityとは食い違っているので、エクスポートするときに軸を合わせる。

Unityは左手系Y-Upなので、この内容に合わせる。
fbxエクスポート時にオペレータの設定を「-Zが前方」「Yが上」に設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36154/ae01dcfb-04e0-8556-259b-d1c3fe8f964b.png)

注:左手系で人差し指の方向が前方になるのですが、見た目上の前は-Zのため、このように設定します。
Unityの[Transform.forward](https://docs.unity3d.com/ja/2022.3/ScriptReference/Transform-forward.html)の値はローカルの+Z。
Codeigniter2 "The URI you submitted has disallowed characters."について

もうCI３の時代でニーズも無いとは思うけどメモ書き。

URLに()とか入ると

```shell-session
An Error Was Encountered

The URI you submitted has disallowed characters.
```

な、エラーが出るんだけどさね。
/system/core/URI.php

を見てみても、

```php:URI.php
  function _filter_uri($str)
  {
    if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
    {
      // preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
      // compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
      if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))
      {
        show_error('The URI you submitted has disallowed characters.', 400);
      }
    }

    // Convert programatic characters to entities
    $bad  = array('$',    '(',    ')',    '%28',    '%29');
    $good = array('&#36;',  '&#40;',  '&#41;',  '&#40;',  '&#41;');

    return str_replace($bad, $good, $str);
  }
```

って書いてあって、\$bad $good とconfig.phpから、()は通って良いんじゃね？って
ずーっと首かしげ状態だったのですが、これCI２の問題だったみたい。

```
preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str)
```
⇓ をUTFマッチ　"/xxxxxxx…/u"

```
preg_match("/|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i/u", $str)
```

な、なんか、モチベーションが下がってきた…。

で、コアコードに書いたらアップグレードで消されると思って
application/core/MY_URI.php に書いたんだけどうまく動かなかったんだよねぇ…。オシマイ

```php:MY_URI.php
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_URI extends CI_URI {
  public function __construct(){
    parent::__construct();
  }

  // ------------------------------------------------------------------------

  /**
   * Filter segments for malicious characters
   * @access  private
   * @param string
   * @return  string
   */
  if ( ! function_exists('_filter_uri'))
  {
    function _filter_uri($str)
    {
      if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
      {
        // preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
        // compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
        if ( ! preg_match("/|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i/u", $str))
        {
          show_error('The URI you submitted has disallowed characters.', 400);
        }
      }

      // Convert programatic characters to entities
      $bad  = array('$',    '(',    ')',    '%28',    '%29');
      $good = array('&#36;',  '&#40;',  '&#41;',  '&#40;',  '&#41;');

      return str_replace($bad, $good, $str);
    }
  }
}
```

```
　　　 ∧ ∧　 　　　　　 　／￣￣￣￣￣￣￣￣￣
|￣￣（ ﾟДﾟ)￣￣|　　　＜　　もう寝る！
|＼⌒⌒⌒⌒⌒⌒＼ 　　＼
|　 ＼ 　　　　　 　 　 ＼ 　　￣￣￣￣￣￣￣￣￣
＼　 ｜⌒⌒⌒⌒⌒⌒｜
　 ＼ |＿＿＿＿＿＿＿|
Erlang チーム開発 rebar3でOTPアプリの雛型を作る

[前回KVSを開発](http://qiita.com/haminiku/items/b7d6e4cecc12733cf565)したので、いよいよチーム開発にむけてOTPの雛型アプリを作成します。

Erlang本やErlangで書かれたプロジェクトのソースを読んでいると、Erlang OTPアプリケーションのディレクトリ構造や設定ファイルには、どうやら一定のルールがあるようです。

社内のErlangエンジニアに聞いてみたところ、仕事では手でディレクトリ構造を構築せず、rebarかrebar3を利用すべきだとアドバイスを頂きました。早速最新版のrebar3でOTPの雛型アプリを構築してみました。（rebarは古く、一部機能がメンテされず機能不全に陥ったためforkしてrebar3が開発された経緯があるそうです）

# 概要
1. rebar3 インストール
2. rebar3を利用したErlang OTPアプリケーションの生成
3. ビルドとリリース
4. コマンドラインからアプリの起動

## 1. rebar3インストール
**Mac**上で実行しています。[rebar3](https://github.com/erlang/rebar3)のリポジトリから

```shell-session:rebar3_install
# mac向け手順
git clone https://github.com/erlang/rebar3.git
cd rebar3
./bootstrap
./rebar3 local install
# .bashrcに設定するとよい
export PATH=$PATH:/Users/{USERNAME/.cache/rebar3/bin

# rebar3 インストール確認
rebar3 --version
>> rebar 3.2.0+build.3479.ref4fd4195 on Erlang/OTP 18 Erts 7.1
```

## 2. rebar3を利用したErlang OTPアプリケーションの生成
アプリケーション作成はコマンド一つです。

```shell-session:rebar3_create_app
rebar3 new release name=kvs author_name="hami"
```

■ コマンドを実行した結果、複数のファイルが生成されました
![スクリーンショット 2016-06-20 21.16.10.png](https://qiita-image-store.s3.amazonaws.com/0/65312/ae0d6330-1e10-fa7f-99e2-71a0558ddd0c.png)


ソースコードに少し手を加えます。HTTPサーバのcowboyをprint文を仕込んでみました。


```text:rebar.config
{erl_opts, [debug_info]}.
{deps, [
  {cowboy, "1.0.1"}, % package
  {cowboy, {git, "git://github.com/ninenines/cowboy.git", {tag, "1.0.1"}}} % alternatively, source
]}.
...略...
```


```erlang:kvs_app.erl

...略...
start(_StartType, _StartArgs) ->
    print("start"),
    kvs_sup:start_link().

%%--------------------------------------------------------------------
stop(_State) ->
    ok.

%% printer
print(Message) -> io:format("E: ~p~n",[Message]).

```

## 3. ビルドとリリース
ビルドとリリースも簡単です。成果物として_build配下にコンソールから起動できるアプリが生成されます。

```shell-session:rebar3_build
rebar3 compile
rebar3 release
```

■ 生成されたビルドファイル
![スクリーンショット 2016-06-20 21.45.08.png](https://qiita-image-store.s3.amazonaws.com/0/65312/ff51a2b0-3417-8482-e613-c6129267d9e6.png)


## 4. コマンドラインからアプリの起動

ビルドが成功すると_buildディレクトリ下に実行アプリが格納されます。 《 _build/default/rel/ 》
早速コマンドライン上で実行してみましょう！

```shell-session:rebar3_app_start
$ cd _build/default/rel/kvs/
$ ./bin/kvs start
$ ./bin/kvs stop
ok
```


# 辛かったこと
インターネット上にあまり資料がなく[公式ドキュメント](https://www.rebar3.org/docs)と延々格闘しました。rebarの情報よりもrebar3の情報は本当に少ないです。公式ドキュメントが詳細な点は本当に本当に助かりました。
ディレクトリ下で、ある文字列を含むファイル全てに対してその文字列を置換する

# やりたいこと

ディレクトリ下で、ある文字列を含むファイルを検知し、それらのファイルの中のその文字列を別の文字列に置き換えたい。
`grep`と`sed`の組み合わせでワンライナーでできます！
(すでに同じような記事がたくさんあるような気がしますが、備忘録として残しておきます。)

# コマンド

```
grep -rl matchstring directory | xargs sed -i 's/matchstring/replacestring/g'
```

# コマンドの説明

1. grep

- **-r, --recursive** directory下のファイルを全て再帰的に読み込む
- **-l, --files-without-match** 通常の出力をせずにmatchstringを含むファイル名のみを表示する

2. xargs
`xargs`で`grep`の出力結果を一行ずつ引数として`sed`に渡します

3. sed
`matchstring`を含むファイルそれぞれに対して`matchstring`から`replacestring`への置き換えを行います。
**-i**でファイルの上書きをしています。

# 参考サイト
- [Replace a String in Multiple Files in Linux Using Grep and Sed](http://vasir.net/blog/ubuntu/replace_string_in_multiple_files)
仮想マシンとの共有ディレクトリを設定する

何度か設定したことがあるはずなんだが、例によって忘れたので備忘録的にメモ。


基本的にVagrantfileに下記記述を追加することでホストマシンと仮想マシンとでディレクトリを共有できるようになる。
もちろん`vagrant up`する前に共有するディレクトリを生成しておかないとエラーになるので注意。

```
config.vm.synced_folder "shared", "/usr/x", mount_options: ['dmode=777','fmode=755']  
```
ReduxのreducerもHot Reloadingさせる方法

# はじめに

[Webpack](https://webpack.github.io/)と[React Hot Loader](https://github.com/gaearon/react-hot-loader)を使うことでReactコンポーネントのHot Reloadingができるが、[Redux](https://github.com/reactjs/redux)を使った場合にreducerのHot Reloadingにはコツが必要だったので書いておく。また、[TypeScript](https://www.typescriptlang.org/)を使って書く場合には追加で注意事項もあるので合わせて書いておく。


# 前提

[React Hot Loader](https://github.com/gaearon/react-hot-loader)は現在v3系が開発中だが、今回は2016/06/20時点で安定版の v1.3.0 で動作確認している。動作確認はしていないが、v3系でも同様の方法でいけるはず。


# 方法

Reduxの`createStore`を呼んでStoreを作成している箇所に、Hot Reloading用のコードを入れる必要がある。

```js:通常の書き方
import { createStore } from 'redux';
import rootReducer from '../reducers';

export default function configureStore(initialState) {
  return createStore(rootReducer, initialState);
}
```

```js:Hot&nbsp;Reloadingさせる書き方
export default function configureStore(initialState) {
  const store = createStore(rootReducer, initialState, enhancer);

  if (module.hot) {
    module.hot.accept('../reducers', () =>
      store.replaceReducer(require('../reducers').default)
    );
  }

  return store;
}
```

※reducerモジュールのパス `../reducers` は適宜アプリケーション構成に合わせて修正すること

# TypeScriptで書く場合の注意点

自分はTypeScriptで書いていて見事にハマったので書いておく。

何も考えずに`module.hot`と書くとTypeScriptがエラーを吐いてしまうので、最初以下の様に書いて回避していたのだが、これだとHot Reloadingが動作せず困っていた。

```ts:駄目な書き方
export default function configureStore(initialState) {
  const store = createStore(rootReducer, initialState, enhancer);

  if (module['hot']) {
    module['hot'].accept('../reducers', () =>
      store.replaceReducer(require('../reducers').default)
    );
  }

  return store;
}
```

Hot Reloadingのコードをデバッグしてみたところ、`accept`で渡される引数が`../reducers`のままで渡っていた。JavaScriptで動作する環境で確認すると、ここはモジュール名ではなく数値のモジュールIDが渡ってきていた。
ここで`module.hot.accept`でないとWebpackがうまく変換できないのだろう、と推測。

というわけで、下記のように一旦`declare var module: any`を宣言して`module.hot.accept`と書けるように変更したところ、無事に動作するようになった。

```ts:OKな書き方
declare var module: any;

export default function configureStore(initialState) {
  const store = createStore(rootReducer, initialState, enhancer);

  if (module.hot) {
    module.hot.accept('../reducers', () =>
      store.replaceReducer(require('../reducers').default)
    );
  }

  return store;
}
```

というわけで、`module.hot.accept`と書かなければならないので注意しよう。


# 参考
redux reducer hot reloading などでググると以下のIssueコメントにたどりついた。ここで作者のDanさんがreducerのHot Reloading方法について説明していた。

https://github.com/erikras/react-redux-universal-hot-example/issues/44#issuecomment-132260397

# Starter Kits

[React Hot Loader で紹介されているStarter Kits 一覧](https://github.com/gaearon/react-hot-loader/tree/master/docs#starter-kits) には、ReduxでHot Reloadingを組み込んだものとして2つ紹介されている。ともに下記の箇所でReducerのHot Reloadingにも対応するためのコードが入れられている。これらのStarter Kitsを使っておけば大丈夫。

* [react-redux-universal-hot-example](https://github.com/erikras/react-redux-universal-hot-example)
    * https://github.com/erikras/react-redux-universal-hot-example/blob/v0.9.0/src/redux/create.js#L27-L29 で対応
* [react-cordova-boilerplate](https://github.com/unimonkiez/react-cordova-boilerplate)
    * https://github.com/unimonkiez/react-cordova-boilerplate/blob/v1.2.0/src/store/configureStore.js#L20-L22 で対応
UbuntuをインストールしていたPCにWindowsをインストール

ubuntuマシンにwindowsを入れます。windowsマシンにubuntuをデュアルブートするという記事は多いのですが逆のパターンを見つけるのに苦労したのでまとめます。なお本記事はデュアルブートではなくubuntuを消してます。事前にバックアップをしておいて下さい。
なお実際にやったバージョンはubuntuが15.10でwindowsが7です。

# 必要なもの
- Ubuntuが入っているPC
- Ubuntuインストーラが入っているCD(もしくはUSB)
- Windowsインストーラが入っているCD

# 手順
1.UbuntuCDをPCに入れる
2.BIOSを起動（F2連打など）
3.CDを再優先でブートするように変更（マザーボードなどにより異なる）
4.「try Ubuntu without installing」を選択しお試しモードで起動
5.ユーザー名は「ubuntu」と入力、パスワードは何も入力せずにEnterでログイン
6.ターミナルを起動（ショートカット：Ctrl+Alt+T）
7.「sudo gparted」と入力しgpartedを起動
8.ubuntuをインストールしているパーティションを選択し削除
9.windowsCDを入れ再起動

# おまけ
ubuntu消してwindowsを入れた理由は以下の通りです。

- ubuntuだと研究室で利用するプリンタのドライバが使えなかった
- システム上で一部の文字が表示されないことが多かった
- 研究室の共有フォルダが利用出来なかった
- 研究室で流行ってる、すすめられるPCゲームが出来ない
- windows10への無償アップデート期間中にアップデートしておきたい

恐らくいくつかの問題はubuntuのままでも解決出来たのかもしれませんが、後半の理由もありOSを変えることにしました。windows10に関しては悪口をよく聞きますがブラウジングやメディアデータの閲覧程度しかしないですし、実際使ってる人の話聞いてる限りでも問題無いかなと。開発するのはlinuxの方が好きなのでvirtualbox上でなんらかのlinuxOSを使おうかなと思ってます。