OmniAICreator/Qiita-1.07M huggingface dataset:
muninでMIB値監視

munin
* ubuntu 16.04で実施

## 参考

* [Muninインストールメモ on ubuntu 13.10 - Style](http://d.hatena.ne.jp/pidekazu/20150122/1421907617)

# インストール

```bash:
apt-get install -y \
  munin munin-node munin-plugins-extra
```

* munin : Webインターフェース
* munin-node : モニタリングデーモン
* munin-plugins-extra : 拡張プラグイン

```diff:/etc/munin/munin.conf
- #htmldir /var/cache/munin/www
+ htmldir /var/cache/munin/www

- [localhost.localdomain]
+ [myserver.home]
```

* muninに登録されるサーバ名を指定。

```diff:/etc/munin/apache24.conf
 <Location /munin-cgi/munin-cgi-graph>
-        Require local
+        Require ip local 192.168.0
```

* 自分自身と192.168.0.0/24からのアクセスを許可

## リスタート

```bash:
sudo service munin-node restart
sudo service apache2 restart
```

## アクセス

* http://localhost/munin/

![munin1.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/a30eecb9-58d1-113c-2271-4eea156c9a2b.jpeg)

----

# SNMPから監視

* [vyos（SNMP対応機器）をmuninで監視する - Qiita](http://qiita.com/sion_cojp/items/1155f3bbfe7e0a81ae1e)

```bash:root権限で実行
munin-node-configure \
  --snmp 192.168.0.19 \
  --snmpversion 2 \
  --snmpcommunity \
  public
```

```bash:設定可能なシンボリックリンク一覧を表示
munin-node-configure \
  --snmp 192.168.0.19 \
  --snmpversion 2 \
  --snmpcommunity \
  public \
  --shell sh
```

> ln -s '/usr/share/munin/plugins/snmp__cpuload' '/etc/munin/plugins/snmp_192.168.0.19_cpuload'

のようにシンボリックリンクを貼るコマンド一覧が表示される。
使うもののみ手でリンクを貼る。

## ノード追加

```rb:/etc/munin/plugin-conf.d/munin-node
[snmp_192.168.0.19_*]
env.version 2
env.community public
```

```rb:/etc/munin/munin-conf.d
[192.168.0.19]
    address 127.0.0.1
```

* `address 127.0.0.1`決め打ち。(対象のIPを記述するのではないことに注意)

```bash:今すぐ更新
sudo -u munin /usr/bin/munin-cron
```

```diff:nodes確認
  $ telnet localhost 4949
  nodes
  localhost.localdomain
+ 192.168.0.19
```

* ブラウザで確認

## カスタムproc値取得

```bash:
cd /usr/share/munin/plugins
cp -a snmp__processes snmp__processes_apache2
```

```diff:/usr/share/munin/plugins/snmp__processes_apache2
-         print "require 1.3.6.1.2.1.25.1.6.0 [0-9]\n";
+         print "require 1.3.6.1.4.1.2021.2.1.5.4 [0-9]\n";
...
- graph_category system
+ graph_category proc_apache2
...
- print "processes.value ", $session->get_single('1.3.6.1.2.1.25.1.6.0'), "\n";
+ print "processes.value ", $session->get_single('1.3.6.1.4.1.2021.2.1.5.4'), "\n";
```

```bash:有効化
$ sudo munin-node-configure --snmp 192.168.0.19 \
  --snmpversion 1 --snmpcommunity public --suggest | grep proc
snmp__processes            | yes  | yes (192.168.0.19)
snmp__processes_apache2    | no   | yes (+192.168.0.19)
$ sudo ln -s '/usr/share/munin/plugins/snmp__processes_apache2' \
  '/etc/munin/plugins/snmp_192.168.0.19_processes_apache2'
$ sudo service munin-nodes restart
$ sudo -u munin /usr/bin/munin-cron
```

## トラブルシューティング

* [munin-nodeの設定をコマンドで確認する方法](http://hivecolor.com/id/133)

```bash:手動でsnmp取得
sudo munin-run snmp_192.168.0.19_uptime
```
RDS コマンドメモ

<h> RDSのコマンド</h>

* スレーブの確認
<code>show slave status\G;</code>
* Error=1062 
<code>CALL mysql.rds_skip_repl_error;</code>
* Error=1236
<code>CALL mysql.rds_next_master_log(logID)</code>
* KILLコマンド
<code>CALL mysql.rds_kill(PID);</code>
* process list
<code>select * from information_schema.PROCESSLIST;</code>
<code>show processlist;</code>
* SQLの結果をファイルに出力 <code>mysql -hHOST_NAME -uUSER -pPASS -e "`SQL`" | sed -e 's/\t/,/g' > 結果ファイル出力</code>
【AngularJS+RequireJS】(メモ) コントローラの自動ロード


```js:app.js
/**
 * モジュール生成、構成
 */
define(['angular', 'jquery'], function() {
    // AngularJS起動
    var module = angular.module('SampleApp', []);
    
    return module;
});
```

```js:SampleController.js
/**
 * SampleController
 */
define(['angular', 'jquery', 'app'], function(ng, jq, module) {

    module.controller('SampleController', function($scope) {
        $scope.hoge = "Hoge";
        $scope.foo  = "foo";
    });
});
```

```js:load.js
/**
 * RequireJS 設定
 */
require.config({
    baseUrl: '../',
    paths: {
        // モジュール
        angular: 'bower_components/angular/angular.min',
        jquery:  'bower_components/jquery/dist/jquery.min',
        
        // アプリケーション
        app: 'app/app',
        SampleController: 'app/controllers/SampleController',
    },
    shim: {
        // モジュール
        jquery: {deps: ["angular"]},
        
        // アプリケーション
        app: {deps: ["angular", "jquery"]},
        MasterDetailController: {deps: ["app"]},
    },
});

/**
 * ロード処理
 */
require(['angular', 'jquery'], function() {
    // 各モジュールをロード、DOMのロード完了後に…
    $(function() {
        // ng-ontrollerの属性値（コントローラ名）を取得する
        var controllerName = $('[ng-controller]').attr('ng-controller');
        // コントローラ名に該当するjsファイルをロード
        require(['app', controllerName], function(module){
            // モジュールの紐付け（※RequireJSではngAppだとタイミングが間に合わない）
            angular.bootstrap(document, ['SampleApp']);
        });
    });
});
```
Rails の  flash メッセージを bootstrap-sass でスタイリング

Rails 4.2.5 に bootstrap-sass 3.3.6 を導入してフラッシュメッセージをスタイリング。

[こちらのページ](https://gist.github.com/suryart/7418454)を参考にした（というか、ほぼそのまま）だけど、あとのコメントまで追って修正しないと正しく動作しなかったので、結論をメモ。

```rb
# helpers/application_helper.rb

def bootstrap_class_for flash_type
  { success: "alert-success", error: "alert-danger",
    alert: "alert-warning", notice: "alert-info" }[flash_type.to_sym] || flash_type.to_s
end
def flash_messages(opts = {})
  flash.each do |flash_type, message|
    concat(
      content_tag(:div, message, class: "alert alert-dismissable #{bootstrap_class_for(flash_type)} fade in") do
        concat(
          content_tag(:button, class: "close", data: { dismiss: "alert" }) do
            concat content_tag(:span, "&times;".html_safe)
          end
        )
        concat message
      end
    )
  end
end

# views/layout/application.html.erb
<body>
...
  <div class="container">
    <% flash_messages %>
    <%= yield %>
  </div>
</body>
```

レイアウトの

```rb
<% flash_messages %>
```

が、元は

```rb
<%= flash_messages %>
```

になっていたため、空のハッシュ（{}）が画面に表示されて、「何だこれ？？」としばらく悩んだ。
DatapipelineをCLIで使ってみる。

AWSのDatapipelineをCLIで操作してみます。

#新しいJOBの作成
まず新しいJOBを構築するときですが、[さきの記事](http://qiita.com/YutaKawahra/items/dfab6d2b9a7bd7c9793e)に従って、
権限管理するとなると、タグの設定が必要なのでこんな感じです。
ユニークIDはなんか必要らしいです。
```
aws datapipeline create-pipeline --name "JOB-NAME" --unique-id <uniq-num> --tags key=<tag-key>,value=<tag-value> 
```


レスポンスはidがjosn形式返ってきます。

```
{
    "pipelineId": "df-xxxxx～"
}
```

これでJOBのIDがわかったので、設定していきましょう。

#設定を行うとき
```
aws datapipeline put-pipeline-definition  --pipeline-id <DatapipelineID> --pipeline-definition file://<Difinition-File>
```

<Difinition-File>はJson形式の設定ファイルです。
自力じゃ作れる気がしません。コンソールから作成した方がいいかと思います。。。



#JOB設定を取得するとき
コンソールで、Exportをした時の処理と同じ出力がみられます。
```
aws datapipeline get-pipeline-definition  --pipeline-id <DatapipelineID>
```

#Activateするとき
```
aws datapipeline activate-pipeline --pipeline-id  <DatapipelineID> 
```

#Deactivateするとき
```
aws datapipeline deactivate-pipeline --pipeline-id  <DatapipelineID>
```
                      
 設定を変更するときは、
Deactivateで停止
→Put-pipeline-definitionで設定を反映
→Get-pipeline-definitionで設定を確認
→Activateで設定を有効化

って流れでしょうかね？

#Deleteするとき
削除はこのコマンド。
```
aws datapipeline delete-pipeline --pipeline-id  <DatapipelineID>  
```             


#残課題
それぞれのステータス確認の方法を確認しておきたい。
コンソールでは、PENDING、ACTIVATINGみたいなJOBのステータスと、オブジェクト（中の処理一つ一つ）のステータスがあるので、表示させる方法がありそう。
I2C接続センサ > GY-80 > 4つの複合センサ > Gyro / Accelerometer / Magnetometer / Barometer + Thermometer

youtubeのI2C関連の動画
https://www.youtube.com/watch?v=6IAkYpmA1DQ&list=PL_MJualihC5CAtnZHphK-hli8aSL3PRRz&index=4

上記にて GY-80 という４つのセンサが搭載されている製品が紹介されている。

http://selfbuilt.net/shop/gy-80-inertial-management-unit
HK $150.00 = 2300円くらい

秋月や千石など調べたが扱ってなさそう。他にも、マイクロテクニカ、ストロベリー・リナックス、aitendo、digikey、RScomponents、チップワンストップなど自分が知っているところで検索したが扱いはなさそうだった。

個々の搭載センサ自体は秋月で扱っているが、全部購入したら８０００円くらいになる。

http://www.dx.com/p/gy-80-bmp085-9-axis-magnetic-acceleration-gyroscope-module-for-arduino-145912#.Vp1hfxiLRfA
では42%OFFで1430円で販売している。しかしよく分からない店からの購入には躊躇する。

amazon.comでは$26.90.
http://www.amazon.com/365buying-magnetic-acceleration-gyroscope-atmospheric/dp/B008V8OK8Q
しかし発送元はよくわからないお店だ。
技術英語 > ... sounds too good to be true / What’s the catch? / What's the problem? / What seems to be the problem?

@ LOE > October 12, 2012
http://loe.org/shows/shows.html?programID=12-P13-00041
> This enhanced geothermal system <font color=red>sounds too good to be true</font>! No pollution, all the steam you could need - you could power millions of homes with it… <font color=red>what’s the catch?</font>

http://eow.alc.co.jp/search?q=too+good+to+be+true&ref=sa
>話がうま過ぎる

よくある文法の本で too ... to xxx で「あまりに...すぎてxxxできない」というのがある。too good to be trueは「あまりに良すぎて本当ではない」から転じて「話がうま過ぎる」として使われているのだろう。

<hr>
What’s the catch?
は初めて意識したフレーズだ。

http://eow.alc.co.jp/search?q=catch
> [名]
> 1. 捕まえること、わな、捕まえたもの、捕獲物、収穫
...
5. 〈俗〉問題点、難点、欠陥、まずいこと

このあたりが関係しそう。

フォーマルな場面では
What's the problem?
What seems to be the problem? 
あたりが近いのだろうか?
macのXcodeにOpenCVを導入 - OpenCV(1)

備忘録

#HomeBrewのインストール
HomeBrewをインストールする。
http://brew.sh/index_ja.html
上記のサイトを参考にする。

Homebrewのダウンロード

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

Homebrewをアップデート

```
brew update
brew install -v cmake
```

HomeBrewのチェック

```
brew doctor
```

#OpenCVのインストール

OpenCVのインストール

```
brew tap homebrew/science
brew install opencv3
```

OpenCVは`/usr/local/Cellar/opencv3`にある。

#XCodeの設定
プロジェクト作成
`File > New > Project…`
`OS X > Application > Command Line Tool`
LanguageはC++を選択する。

Build Settingsタブを開き、Header Search Pathsに次の内容を追加
`/usr/local/Cellar/opencv3/3.1.0_1/include/`

Build Phasesタブを開き、Link Binary With Librariesにライブラリを追加する。
ライブラリは以下の場所にある。
`/usr/local/Cellar/opencv3/3.1.0_1/lib/~`
必要なライブラリを追加する。


###これで準備おわり、あとは遊ぶだけだ
ControllerとModel - Ember.js(3)

Ember.jsについて学んだので、忘れないよう備忘録を残したいと思います。

Ember.js(1)の[準備](http://qiita.com/seaka829/items/89e96416e021ae722df5#%E6%BA%96%E5%82%99)を参考にして、環境を整える。

#Templateを定義
test.htmlのbodyタグ内に次の内容を追加します。

```html:test.html
<p>曲名 : {{title}}</p>
<p>アーティスト : {{artist}}</p>
<p>音量 : {{soundVolume}}</p>
<p>
    <span {{action 'up'}}>UP</span> 
    <span {{action 'down'}}>DOWN</span>
</p>
```

#Controllerとは?
Controllerは、URLともmodelとも関係のない一時的なデータとイベント処理等を保持するもの。
今回のアプリケーションでは、音量データと音量調整のための関数を保持している。
test.jsに次の内容を追加します。

```js:test.js
App.ApplicationController = Ember.ObjectController.extend({
    soundVolume: 6,
    actions: {
        up: function() { },
        down: function() { }
    }
});
```
`App.ApplicationController = Ember.ObjectController.extend({ })`でControllを明示的に定義している。
2行目の`soundVolume: 6,`でsoundVolumeプロパティを追加しています。
また3行目以降の`actions: { up: function() { }, down: function() { } }`で、Actionを定義している。
ここではアクション名(upとdown)をキーに、対応する関数が呼ばれるようになっている。

#Modelとは?
Modelは、永続化データを保持するものです。
永続化データはModelに状態(一時的なデータ、アクション等)はControllerに記述すると綺麗に設計できる。
ModelはRoute内で定義しています。
次の内容をtest.jsに追加する。

```js:test.js
App.ApplicationRoute = Ember.Route.extend({
    model: function() {
        return {
            title: '終わりなき旅', 
            artist: 'Mr.Children'
        };
    }
});
```
`App.ApplicationRoute = Ember.Route.extend({ })`でRouteを明示的に定義している。
`model: function() { }`内でModelを定義している。

#Templateを定義
test.htmlのbodyタグ内に次の内容を追加する。

```html:test.html
<script type="text/x-handlebars" data-template-name="test1">
    <p>曲名 : {{title}}</p>
    <p>アーティスト : {{artist}}</p>
    <p>音量 : {{soundVolume}}</p>
    <p>
        <span {{action 'up'}}>UP</span> 
        <span {{action 'down'}}>DOWN</span>
    </p>
</script>
```
`<span {{action 'up'}}>UP</span> ` 内の{{action}}ヘルパーにControllerのactionsに定義したアクション名を指定する。

test.htmlを実行すると次の内容が出力される。

```
曲名 : 終わりなき旅
アーティスト : Mr.Children
音量 : 6
UP DOWN
```

#Actionを定義
OS.js - ハック編 -

## オープンソースハックず　-open source Hack's-

# OS.js - ハック編(日本語対応) -
![スクリーンショット 2016-01-19 3.08.25.png](https://qiita-image-store.s3.amazonaws.com/0/12007/74fa7882-6d87-32c9-c785-4a2761c61797.png)

[OS.js](http://os.js.org/)とは...様は、JavaScriptでできたOSです。
インストールはターミナルなどからワンライナーと非常に簡単で、インストールから起動まで10分たらずと初心者でも容易にできます。

起動したら、さっくさくでjsでできてると思えないくらい軽いです。
起動確認くらいしかやってないので、わからないですがw

---
## ソースハック - 日本語対応にしよう編 -
今回は、ソースをハックしてみました。
まだ、日本語対応版がなかったみたいなので、日本語訳を実装してみることに挑戦です。

ソースの解読性も高いので、何も参考せずに容易にハックすることができました。
変更箇所のソース基は、2ファイルとなります。
規則性に合わせて、変更してみました。以下が変更内容となります。

```lang:folder
/OS.js
　├...
　└/dist
　　├...
　　├locales.js
　　└settungs.js
```

この2つとなります。

```lang:settungs.js(設定側)
"Languages": {
        "en_EN": "English",
       　...,
       　..,
       　.,
       　"ja_JP":"日本語(Japan)"
    },
```

```lang:locales.js(翻訳の素)
(function() {
  'use strict';
  OSjs.Locales = OSjs.Locales || {};
  OSjs.Locales.ja_JP = {...'LBL_UNKNOWN': '不明',...};})();
```

※注意※
「settungs.js」ファイルは、[dist]と[dist-div]にまたいで存在しています。
ただし、[dist-div]のディレクトリには、「locales.js」が存在していないので、
注意して編集するようにしてください。

![スクリーンショット 2016-01-19 3.31.40.png](https://qiita-image-store.s3.amazonaws.com/0/12007/6add1018-3c65-6c65-2977-a85887d98b74.png)

![スクリーンショット 2016-01-19 3.32.25.png](https://qiita-image-store.s3.amazonaws.com/0/12007/f9f5e51b-57b3-fb07-1f3b-b9cbc3955979.png)

上のスクリーンショットでお分りいただけますでしょうか。
日本語で編集した箇所については、日本語が適用されております。

今回はこれで、OS.jsの日本語対応は終わります。
インストールも容易であれば、ハックも容易でしたねw

ちなみに、OS.js編はまだまだ続ける予定ですので、乞うご期待ください。

---

## 追記:
---
なお、本件の方法では公式のアプリインストールで、デフォルトに戻ってしまいます。

---

## 修正:
---
◆言語コードの修正:
　"jp_JP"→"ja_JP"
パイプ処理における遅延評価の問題（SIGPIPE問題）

パイプ処理における問題といえば、例の`cat file | while read`の同一変数が別コンテキストになる問題でしょ？と思われたかもしれないですが、それとはまた別のお話でして。

```bash:
seq 1 1000 | head -10
```

上記のコードを実行すると、画面上には`1`～`10`が表示されます。

パイプ前段のプロセスが無限に標準出力する場合でも、パイプ後段のプロセスが必要な結果だけ取得できれば事足りるので、前段プロセスが愚直に最後まで計算を続けたりする必要はない。これはかしこい。

```bash:
for((i=0; ;i++)){      # 終了条件が無いが無限ループにならない
    builtin echo "i=$i"
} | head -10
```

ただ、このようなイケてる遅延評価があだとなり、結果的に、ユーザの思惑に反する挙動をしてしまうケースもあります。

例えば以下のコードの場合、書かれてある通りに解釈すれば、本来ファイルには`i=99`まで出力されてしかるべきなんですが、実行してみると`i=15`までしか出力されませんでした。

`i=16`を書き込もうとしたタイミングで、書き込もうとしたパイプが後段プロセスによってクローズ済みだったため、`SIGPIPE`が発生したというところでしょうか。

```bash:
rm -f ./sample.log
for((i=0; i<100; i++)){
    builtin echo "i=$i"
    builtin echo "i=$i" >>./sample.log
} | head -10
```

```shell-session:sample.log
$ cat ./sample.log
i=0
i=1
i=2
...
i=14
i=15    # i=99まで出力されるべきが、i=15の直後でSIGPIPE発生
$
```

試しに、以下のような`seq2`コマンド（`SIGPIPE`を受信したタイミングでメッセージをエラー出力する）を実装し、パイプにつなげてみました。

```c:seq2.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void catch(int signum)
{
    signal(SIGPIPE, SIG_IGN);
    fprintf(stderr, "**** signal(%d) is received !!! ****\n", signum);
    exit(1);
}
int main(int argc, char **argv)
{
    signal(SIGPIPE, catch);
    if(argc<4)
        exit(1);

    long start = atol(argv[1]);
    long end = atol(argv[2]);
    long step = atol(argv[3]);

    for(long i=start; i<=end; i+=step)
        printf("%ld\n", i);

    printf("**** end ****\n");
    return 0;
}
```

以下が実行結果です。確かに、`SIGPIPE`が発生しています。

```shell-session:実行結果
$ ./seq2 1 2147483647 1 | head -10
1
2
3
4
5
6
7
8
9
10
**** signal(13) is received !!! ****
```

これ知らないと、ハマりそうですね。パイプはあくまで「I/Oを一方向につなげて多段フィルタをかける」ためのもので、並列処理だぜヒャッホー！ってなノリで使っちゃ危険ということですね。
${西暦}/${月}のフォルダをbatで作る

ただの書き殴りです（もっと良い方法あれば...
`usage: hoge.bat 2010 2020`

```bat
setlocal enabledelayedexpansion
for /L %%y in (%1,1,%2) do (set b=%%y
for /L %%i in (101,1,112) do (set a=%%i
mkdir "!b!/!a:~-2!"))
endlocal
```
[Swift]WebViewをキャッシュでオフライン閲覧

オフライン時にもキャッシュからWebViewを表示したかった時の思い出をメモ。
[「ウェブページをキャッシュで保存してオフライン閲覧するためのシンプルな実装」](http://qiita.com/EntreGulss/items/8da6847e4dae59bfb1eb)
参考にさせていただいたこちらの記事のSwift版（やってることほとんど変わらない...）

##ライブラリ・フレームワーク
####**RNCachingURLProtocol**
[https://github.com/rnapier/RNCachingURLProtocol](https://github.com/rnapier/RNCachingURLProtocol)
NSURLProtocolというネットワークプロトコルをカスタムするライブラリ。
このライブラリを使うと，以下のことが可能に。

>+ 初めて読み込んだページは普通に開く
>+ 読み込みが完了したらキャッシュする
>+ 次回読み込み時，キャッシュがあればそれを読み込む

####**SystemConfiguration.framework**
デバイスのネットワーク状況を取得することができるフレームワーク。

##実装
###1. **フレームワークを入れてからAppDelegateにimport**

```swift:AppDelegate.swift
import SystemConfiguration
```
###2. **RNCachingURLProtocolをSwiftで使えるようにする**
RNCachingURLProtocolはObjective-Cのライブラリなので，Swiftで使えるようにする必要がある。方法は，{プロジェクト名}-Bridging-Header.hを作成し，そこに使うObjective-Cのライブラリのヘッダーファイルをimport。

```objc:Bridging-Header.h
#import "RNCachingURLProtocol.h"
```

###3. **NSURLProtocolをRNCachingURLProtocolでカスタム**
AppDelegateに **NSURLProtocol.registerClass(RNCachingURLProtocol)** を記述。この１行でNSURLProtocolが，今回の目的を満たす処理にカスタムされる。

```swift:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        NSURLProtocol.registerClass(RNCachingURLProtocol)
        return true
}
```

###4.　**WebViewを普通に表示**
1~3までの手順で終わりだが，一応WebViewのコードも。

```swift:ViewController.swift
class ViewController: UIViewController {

    @IBOutlet weak var webview: UIWebView!
    
    var url="https://www.google.com/"
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let request=NSURL(string: url)
        let requestURL=NSURLRequest(URL: request!)
        webview.loadRequest(requestURL)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```

`@IBOutlet weak var webview: UIWebView!`はstoryboardに配置したWebViewを``control+ドラッグ``してコードにドロップしたもの。

####以上でWebViewをオフラインでも扱うことが可能に！

##おまけ
このライブラリだとhttps通信はキャッシュされないようになっている。そのため，`https://www.google.com/`とか手頃なURLでテストしてた人は，「オフライン時表示されないじゃん！」ってなるはず。（なりました）
https通信をキャッシュしたいなら，`RNCachingProtocol.m`の`initialize`メソッドの`@http`と記述されてる部分を`@https`に書き換えればいい。

##参考
[swiftでwebViewアプリを作ってみた](http://qiita.com/drobune/items/17295b2de6663b56785a)
爆速でターミナルを使うためのショートカット集

ターミナルを操作するためのコマンドを纏めてみました。
これからターミナルを触っていく方の参考になればと思います。
このページを見ながらターミナルをどんどん触って、操作に慣れてみてください。
bashでmacです。

## カーソルの移動
| コマンド |意味 | 
|:-----------|:------------:|
| Ctrl + b | 後退 |
| Ctrl + f       |前進|
| Ctrl + a       |行頭へ移動|
| Ctrl + e       |行末へ移動|
| Esc + b       |一語後退|
| Esc + f       |一語前進|
矢印キーでもできますが、このコマンドを使った方がホームポジションをずらさずに操作できるのでオススメです。

## 削除
| コマンド |意味 | 
|:-----------|:------------:|
| Ctrl + h (BackSpace)| カーソルの後方を1文字削除 |
| Ctrl + d  (Delete)     |カーソル上の1文字削除|
| Ctrl + w      |単語1個文削除|
 Ctrl + d は何も入力していない状態で入力するとログアウトしてしまうので注意が必要。

## カット,ヤンク
| コマンド |意味 | 
|:-----------|:------------:|
| Ctrl + k | 行末まで削除 |
| Ctrl + u |行頭まで削除|
| Ctrl + y      |最後に削除した内容を挿入|
カットが切り取りで、ヤンクが貼り付けと覚えておけば大丈夫です。

## 履歴
| コマンド |意味 | 
|:-----------|:------------:|
| Ctrl + p | 一つ前のコマンド履歴 |
| Ctrl + n |次のコマンド履歴|
| Ctrl + r |インクリメンタル検索|
インクリメンタル検索は過去に使用したコマンドを検索する機能です。

## インクリメンタル検索の操作
| コマンド |意味 | 
|:-----------|:------------:|
| Ctrl + r | 一つ前の履歴 |
| Ctrl + g |破棄|
| Enter |実行|
| ESC |コマンドラインに戻る|


## その他
| コマンド |意味 | 
|:-----------|:------------:|
| Ctrl + c | 実行中のコマンドを強制終了 |
| Ctrl + l |画面をクリアする|
| Ctrl + ｔ |一つ前とカーソルの文字を入れ替える|
| Ctrl + ｄ |終了|
| Ctrl + m |Enter|
| Ctrl + j |Enter|
| Ctrl + o |Enter|

## Tips
- Tabボタンで補完できる。

実際にターミナルを触りながら挙動を確認してみてください。
UE4 でアクターにライトを追加する

# 環境
UE 4.10.0
Visual Studio 2015

# 概要
Unreal Engine 4 を触ってみて動作を確認する
アクターにディレクショナルライトを追加してみる
参考 : UE4 でアクターにスタティックメッシュとマテリアルを適用する
http://qiita.com/maprog/items/4fa40ae23e987428d823

# 本文
## プログラムからライトを追加してみる
基本的に、スタティックメッシュコンポーネントと同じで、ライトコンポーネントのインスタンスを
作成します。今回は、ディレクショナルライトなので UDirectionalLightComponent のインスタ
ンスを生成して初期化パラメータを設定します。

## アクターのコードを書く
今回は、以下の 4 つのインスタンスをアクターに追加します。

+ UStaticMeshComponent
+ UStaticMesh
+ UMaterial
+ UDirectionalLightComponent

※ コンテンツブラウザにマテリアルを作成しておきます
　 マテリアル名は "Material1" です

[ヘッダー]
class TEST20160104_API AActorMaterial : public AActor
{
    GENERATED_BODY()
	
public:	
    AActorMaterial(const FObjectInitializer& ObjectInitializer);

    virtual void BeginPlay() override;
	
    virtual void Tick( float DeltaSeconds ) override;

    UStaticMeshComponent* mStaticMeshComponent;
    UStaticMesh* mStaticMesh;
    UMaterial*	mMaterial;
    UDirectionalLightComponent*	mLightDirectional;
};

[コード]
AActorMaterial::AActorMaterial(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
, mStaticMeshComponent(nullptr)
, mStaticMesh(nullptr)
, mMaterial(nullptr)
{
    PrimaryActorTick.bCanEverTick = true;

    static ConstructorHelpers::FObjectFinder<UMaterial> materialAsset(TEXT("/Game/Material1.Material1"));
    if (materialAsset.Succeeded())
    {
        mMaterial = materialAsset.Object;
    }

    static ConstructorHelpers::FObjectFinder<UStaticMesh> staticMeshAsset(TEXT("/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere"));
    if (staticMeshAsset.Succeeded())
    {
        mStaticMesh = staticMeshAsset.Object;
        mStaticMesh->Materials[0] = mMaterial;

        mStaticMeshComponent = ObjectInitializer.CreateDefaultSubobject<UStaticMeshComponent>(this, TEXT("StaticMeshName"));

        if (mStaticMeshComponent)
        {
            RootComponent = mStaticMeshComponent;
            mStaticMeshComponent->SetStaticMesh(mStaticMesh);
        }
    }

    mLightDirectional = ObjectInitializer.CreateDefaultSubobject<UDirectionalLightComponent>(this, TEXT("LightName"));
    if (mLightDirectional)
    {
        FRotator rot(-90.0f, 0.0f, 0.0f);
        mLightDirectional->SetRelativeRotation(rot);
    }
}

## ライトの設定項目
今回は、ディレクショナルライトのインスタンスを生成し、回転を設定しました。
それによって、ディレクショナルライトの当たる方向を制御しています。
今回は、メッシュの上から光が当たるように調整しました。
ディレクショナルライトは座標は関係なく、向きだけなので回転を制御すれば良いですね。
動的にライトの方向を動かすには SetRelativeRotation で、ライトの方向を Tick 関数
等で制御すれば良さそうですね。
bashでIFS等の変数を変更する場合、こうすると良いのでは？


と、ふと思ったのでメモ。

▼ 改善前

```bash:
# バックアップ
$ IFS_BACKUP="$IFS"

# IFS変更
$ IFS=$’\n'

…（処理）…

# IFSを元に戻す
$ IFS="$IFS_BACKUP"

# IFS_BACKUP変数を削除
$ unset IFS_BACKUP
```

▼ 改善後

```bash:
(
# IFS変更
$ IFS=$’\n'

…（処理）…

)
```
Logic Testing Unavailableエラーへの対処

実機をビルド対象に指定してXCTestを実行しようとしたら以下のエラーが起きてビルドできませんでした。
![null.png](https://qiita-image-store.s3.amazonaws.com/0/100736/5fda0af8-a3b5-fa36-7847-11cb7197e8d4.png)

```
Logic Testing Unavailable

Logic Testing on iOS devices is not supported. You can run logic tests on the Simulator.
```

そんなわけなかろうと思って調べてみるとこんなページを見つけました。
http://stackoverflow.com/questions/8454935/logic-testing-on-ios-devices-is-not-supported

Host Applicationが怪しいようです。
実際Host Applicationがどうなっているか確かめてみたところ、何も値が設定されていませんでした(Noneになっていました)。ので修正します。
![スクリーンショット 2016-01-19 0.41.14.png](https://qiita-image-store.s3.amazonaws.com/0/100736/d48c7eea-509a-20bb-a3b4-1e6182c0be76.png)
<プロジェクト名>Testsのターゲットの
General -> Host Application -> <プロジェクト名>を指定し、その下のAllow testing Host Application APIsにチェックを付けます。

これでエラーが出なくなり、実機でもビルドできるようになります。
電池の持ち時間の計算方法

 ラズパイやArduinoを電池で動かしたい時に、消費電力は5v 0.5Aとか書いてあるけど、電池に書かれているのは5000mAhとか単位が違う…これだけでは、自分の電池でこれらの機器を何時間動かせるかわからなかったのでまとめてみた。

# 単位の意味
まずは電池容量計算に出てくる単位とその意味を整理。

## mAh(ミリアンペア時）
例えば 540 [mAh] とは、540 [mA] の電流を 1 [時間] 、流すことができることを表している。

## Wh（ワット時）
ワット時という他には、仕事率、電力の単位である(W)ワットと、時間の単位である時(h)から組み立てた単位。
１Whとは、１ワットの仕事率で１時間続けた時の仕事量、あるいは１ワットの電力を１時間消費した時の電力量を指す。

## W（ワット）
ワットさんにちなんでつけられた、仕事効率を表す単位。
電気工学の分野では、仕事率である電力は、以下の式で表される。
**電力[W]=電圧[V] × 電流[A]**
例えば、5Vの電圧がかかり、1Aの電流が流れている回路は、5Wの電力を消費する。式に表すと以下のようになる。
**5[W] = 5[V] × 1[A]**

## A（アンペア）
電流を表す。
水道で例えるなら蛇口の大きさ。値が大きいほど一気にたくさんの水（電流）がでていくイメージ。

## V（ボルト）
電圧を表す。
水道で例えるなら水の出る勢い。値が大きくなればなるほど水が勢いよく出ているイメージ。

## 極端に考えると…
電流が大きく、電圧が小さい時は大きな穴からゆっくりと水が大量に出ているイメージ。大きな川。
電流が小さく、電圧が大きな場合は小さな穴から水が勢い良く出ているイメージ。ホースの水。

# 値の変換式の整理
電池の容量は、定格電流と定格電圧の２つの値で表されていることが多い。（たまにWhが使われる程度？）
## WhとmAhの関係は？
mAhにVをかけるとWhに変換できる
**ワット時[Wh] = 定格電流[mAh] ÷ 1,000 × 定格電圧[V]**

## mAhからWhに変換するには？
変換式
**mAh ÷ 1000(単位変換) × 定格電圧[V] = Wh**
>例１： 1,000mAh, 出力5Vの電池の場合 = 1,000[mAh] ÷ 1,000 × 5[V] = 5[Wh]
>例２： 50,000mAh, 出力10Vの電池の場合 = 50,000[mAh] ÷ 1,000 × 10[V] = 500[Wh]
 

# 例題
## ①定格電流 10,000mAh,定格電圧 5vの電池で、下記のラズパイは何分動く？
### ラズパイ(Model B)の消費電力
電流：900mAh
電圧：5V

### 答え
まずは、電池の電力量を算出（＝電池の持つ電力量）
**電池＝10,000[mAh] ÷ 1000 x 5 = 50[Wh]**
次に、ラズパイの消費電力を算出（＝一時間あたりに消費する電力）
**ラズパイ＝900[mAh] ÷ 1000 x 5 = 4.5[Wh]**
最後に、電池の電力量とラズパイの消費電力を使って、何時間動作するかを計算。
**50[Wh] ÷ 4.5[Wh] ≒ 11時間**

## ②定格電流0.5A, 定格電圧3Vのデバイスを24時間動作させるために必要な電池容量[mAh]は？
（消費電力はずっと同じであると仮定。電池の電圧は[5V]
　１．消費電力を算出
　　**0.5 [A] × 3 [V] = 1.5 [W]**
　２．24時間の消費電力量を算出
　　**1.5 [W] × 24 [h] = 36 [Wh]**
　３．消費電力量Whから容量mAhに変換
　　**36 [Wh] ÷ 5 [V] = 7.2 [Ah] = 7200 [mAh]** 


*上記は理論値であり、実際の電池の持ち時間とは多少異なることに注意（ラズパイの電流は、一定ではなく、実行する処理によって変化する。）*

ここで、電池の容量[mAh]と消費電力[mA]を入力すると、電池の持ち時間を自動的に計算してくれる。便利！
http://www.digikey.jp/ja/resources/conversion-calculators/conversion-calculator-battery-life

# その他わかったこと
## ニッケル水素電池と携帯充電用に売られているリチウムイオン電池は単純比較できない。
ニッケル水素電池の電圧は1.2Vで、リチウムイオン電池の電圧は4V前後であることが多いため。（表示値）
## ニッケル水素電池と、アルカリ電池は電圧が異なる。
アルカリ電池は1.5Vであるのに対し、ニッケル水素電池は1.2Vと0.3V電圧が異なる。
これは電池の特性によるものであるとのことだが、ほとんどの場合、この差は気にしなくてもよい。
（電圧が低くても問題なく動作する）


## 普通の乾電池（マンガン・アルカリ）に容量が登録されていない理由
普通の単３電池で、ラズパイが何時間動くかについても計算してみようとしてみたが、電池の容量が書かれていない。
調べてみたところ、**機器によって取り出せる容量が決められない**という理由から、記述されていないらしい。
>一般的な充電式電池（ニッケル水素電池）にはアルカリ乾電池などの乾電池は機器によって取り出せる容量が異なり、電池容量が決められないため電池容量を記載していません
http://jpn.faq.panasonic.com/app/answers/detail/p/1844,1845,1846/a_id/18153/session/L2F2LzEvdGltZS8xNDUzMTc1MzI2L3NpZC9wZkU4UFRHbQ%3D%3D



# 参考ページ
http://kaden.watch.impress.co.jp/docs/column/fujilabo/20111208_496279.html

放電容量
https://ja.wikipedia.org/wiki/%E6%94%BE%E9%9B%BB%E5%AE%B9%E9%87%8F

バッテリー持ち時間計算方法
http://www.baysun.net/calculate.html

mAhからWhへの計算方法
http://takemetothe.main.jp/?p=3329

電流・電圧
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1267799307

Rasberry Pi(Wikipedia)
https://ja.wikipedia.org/wiki/Raspberry_Pi
Project Eulerをシェル芸で解いてみる(Problem 16)

# 概要
Project Euler[^pe]は、数学的な問題解決能力を要求する、プログラミング問題集・オンラインプログラミングジャッジである。
一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、あらゆるプログラミング言語で解答することが可能である。
そのため、Web上では様々な手法による解答が公開されている。

しかし、シェル芸[^def]による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
<br>

本記事では、Project EulerのProblem 16を、シェル芸で解いた際の過程を述べる。

# 実行環境
* Arch Linux (x86\_64, 4.3.3-2-ARCH)
* bash (4.3.42, POSIX互換モード)
* GNU coreutils (8.24)

<!---
* bsd-games (2.17)
--->

# 問題文
[原文 ([https://projecteuler.net/problem=16](https://projecteuler.net/problem=16))]
> $2^{15} = 32768$ and the sum of its digits is $3 + 2 + 7 + 6 + 8 = 26$.
> What is the sum of the digits of the number $2^{1000}$ ?

[日本語訳 ([http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2016](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2016))]
> $2^{15} = 32768$ であり, これの数字和 ( 各桁の和 ) は $3 + 2 + 7 + 6 + 8 = 26$ となる.
> 同様にして, $2^{1000}$ の数字和を求めよ.

正答は、注釈[^ans]に記載する。

# 解法
```sh:prob_016.sh
1	#!/bin/sh
2	
3	echo '2^1000' \
4	| # 2^1000の算出式の生成
5	bc \
6	| # 2^1000の出力
7	tr -d '\\\n' \
8	| # bcの出力の整形
9	grep -o . \
10	| # 列->行変換
11	xargs \
12	| # 行->列変換
13	tr ' ' '+' \
14	| # 総和算出式の生成
15	bc
16	  # 総和の出力
```

以下、コマンドライン上での実行用コードである。

```sh
echo '2^1000' | bc | tr -d '\\\n' | grep -o . | xargs | tr ' ' '+' | bc
```

## 解説
単純に $2^{1000}$ を算出し、その数字和を求めれば良い。

まず、 $2^{1000}$ を算出する。
この処理は、3~7行目のecho, bc, trを用いておこなう。
bcは、デフォルトでは出力を70字毎に改行するため、7行目のtrによって出力を整形する。

そして、数字和(総和)を求める。
この処理は、9~15行目のgrep, xargs, tr, bcを用いておこなう。
3~7行目で算出した $2^{1000}$ の値を、grepとxargsを用いて1字毎に分離する。
その後、trによって総和の算出式を生成し、bcによって総和を求めている。
<br>

以上が、 $2^{1000}$ の数字和を求める方法である。

# 雑記
* 「こんな別解があるよ」や、「こうすればもっと効率化できるぜ」、「こう書けばエレガントですわよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
* 現在の進捗状況 -> [https://github.com/gin135/Project_Euler/tree/master/sh](https://github.com/gin135/Project_Euler/tree/master/sh)
<br>

* 今回の問題は、これ以上無いくらいシンプル。
* 問題とは全然関係無いけれど、grep -oとxargsを用いた行列変換が好き。
    - grep -oで一度列->行変換してから、xargsで再度行->列に戻すと、ちょうどtrに渡しやすい書式になっている点が面白い。
    - こう、向きを縦方向にしたり横方向に戻したり、データをこねくり回すのが、何だか楽しい。

- - -

[^pe]: About - Project Euler ([https://projecteuler.net](https://projecteuler.net))
[^def]: シェル芸の定義 >> シェル芸 - 上田ブログ ([https://blog.ueda.asia/?page_id=1434](https://blog.ueda.asia/?page_id=1434))
[^ans]: 1366
UnityでRenderer毎にShaderPropertyを制御する

#目的
Materialを共有しているRendererにおいてUVスクロールやカラー値等のパラメータを個別に渡したい

#手段1. Materialを複製する
手っ取り早くやるならこっち。
DynamicBatchingの恩恵は受けれない。
Renderer.materialは内部でキャッシュするか作り直すようなので複数回呼んでもメモリリークはしなかった。
（※MaterialをnewやInstantiateで作った場合は明示的にMaterialをDestroyしないとメモリリークしていた。）

```
using UnityEngine;


public class Test : MonoBehaviour {
	public Color color = Color.white;

	private Material mat = null;

	void Start() {
		Renderer renderer = this.GetComponent<Renderer>();
		this.mat = renderer.material;	// ※複製が必要ない場合はsharedMaterialから取得すればいい
	}
	
	void Update() {
		this.mat.SetColor("_Color", this.color);
	}
}

```

#手段2. Materialを使いまわす
Material数が非常に多い場合はこちらの方が**メモリの節約**ができる。
また**ShaderPropertyのパラメータが全て一致している場合**はDynamicBatching対象となっていた。
（※頂点シェーダーで頂点をいじっている場合はDynamicBatchingによってメッシュが崩れていた。）

```
using UnityEngine;


public class Test : MonoBehaviour {
	public Color color = Color.white;

	private MaterialPropertyBlock mpb = null;
	private Renderer ren = null;

	void Start() {
		this.mpb = new MaterialPropertyBlock();
		this.ren = this.GetComponent<Renderer>();
	}
	
	void Update() {
		this.mpb.SetColor("_Color", this.color);
		this.ren.SetPropertyBlock(this.mpb);
	}
}
```
aws elastic beanstalkでdeployが失敗する

今日ebにdeployを実施したところ、大した修正でも無いのにdeployが失敗するようになってしまった。
deployに失敗するとそのEC2インスタンスはshutdownされて新たに新しいインスタンスがspawnされるため原因を探るのに一苦労した。
ログをtailで追っていくと `/opt/elasticbeanstalk/hooks/appdeploy/pre/13_test_for_puma.sh` で固まっている。
更に追っていくと `13_test_for_puma.sh` から呼んでいる `/opt/elasticbeanstalk/support/scripts/check-for-gem.rb` で詰まっていた。

```rb
#!/usr/bin/env /opt/rubies/ruby-current/bin/ruby
#==============================================================================
# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Amazon Software License (the "License"). You may not use
# this file except in compliance with the License. A copy of the License is
# located at
#
#       https://aws.amazon.com/asl/
#
# or in the "license" file accompanying this file. This file is distributed on
# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or
# implied. See the License for the specific language governing permissions
# and limitations under the License.
#==============================================================================
require 'bundler'

Dir.chdir '/var/app/ondeck'
groups = Bundler.definition.groups

begin
    Bundler.definition.resolve_with_cache!
rescue Bundler::GemNotFound
    Bundler.definition(true).resolve_remotely!
end

gems = Bundler.definition.specs_for(groups).collect(&:name)
exit 0 if gems.include? ARGV[0]
exit 1
```

こいつを実行してみると、 `Bundler.definition(true).resolve_remotely!` で固まっていた。
`Bundler.definition(true).resolve_remotely!` が何をやっているのかを調べれては無いけど、timeoutを入れて回避するようにしてみた(この対応で大丈夫なのかよりdeployが通ることを優先)。

`.ebextensions/xxx.config` で `check-for-gem.rb` を上書きするようにして対応。

```yaml
files:
  "/opt/elasticbeanstalk/support/scripts/check-for-gem.rb":
    mode: "000755"
    owner: "root"
    group: "root"
    content: |
      #!/usr/bin/env /opt/rubies/ruby-current/bin/ruby
      require 'bundler'
      require 'timeout'

      Dir.chdir '/var/app/ondeck'
      groups = Bundler.definition.groups

      begin
          Bundler.definition.resolve_with_cache!
      rescue Bundler::GemNotFound
          begin
              timeout(5) do
                  Bundler.definition(true).resolve_remotely!
              end
          rescue Timeout::Error
              puts $!
          end
      end

      gems = Bundler.definition.specs_for(groups).collect(&:name)
      exit 0 if gems.include? ARGV[0]
      exit 1
```

deployは通るようになったので原因究明して、そのうち追記する。
type parameters を type members でエンコードした際の implicit の扱い

水島さんの記事 [Scala doesn't Need Generics! (or You can Encode Generics Using Abstract Type Members)](http://kmizu.hatenablog.com/entry/2016/01/17/230833) についたがくぞーさんの引用リプライ[「おー、これimplicit parameterの解決も上手く動くのかな？ 」](https://twitter.com/gakuzzzz/status/688901942316150784) について考えて見ましょうという話です。時間がないのでかなり適当に書く。

abstract type members に対して Context Bound を記述することはできません。これは随分前の Scala Advent Calendar 向けの記事で一度[書きました](http://qiita.com/lyrical_logical/items/533631161bbeab196dbf)。
で、書けないなら別の方法でエンコードする必要がある。ML 風に abstract (type) members に対して何からを要求するなら、まあ普通にメンバとして要求すればいい。すごく簡単。

```scala
abstract class HashSet[E : Hashable] {
  ...
}
```

上記のコードは以下のようにエンコードすればよい。水島さんの作法に従うと…

```scala
trait HashSet { self =>
  type E
  def `E is hashable`: Hashable[self.E]
  ...
}

new HashSet {
  type E = Int
  val `E is hashable` = implicitly[Hashable[Int]]
}
```
 
Functor（関手ではなく、ML の言語機能の方） のパラメタとして、具象的な型と、それに対する操作を貰うようなイメージですね。そうです、案外知られて無いけれど、ML 系のモジュールベースのプログラミングも、Scala では普通に出来ます。皆モナド～みたいになってますけど、できます。確か真面目に比較してる論文もあったはず…

まあクラスの型変数はこれでいいけれど、メソッドは違ってくる。

```scala
  def max(implicit ord: Ordering[E]): E
```

うーん。

```scala
  def max(ord: Ordering[E]): E
```

いやこれじゃ implicit 消えて明示的に型クラスのインスタンス渡してるだけじゃん、implicit parameter の意味ないじゃんとなる。そもそも最初の例だってわざわざ明示的にインスタンス渡すのはだるい。

ということで一枚噛ます。

```scala
trait HashSet { self =>
  type E
  val `E is hashable`: Hashable[Int]

  class Max(implicit ord: Ordering[E]) {
    def max: E = ???
  }
}

trait HashSetCompanion { self =>
  type E
  class Apply(implicit ev: Hashable[self.E]) {
    def apply(): HashSet = new HashSet {
     type E = self.E
     val `E is hashable` = ev
    }
  }
}
```

これでまあなんか下みたいに書ける様になる（コンパイル通してないので通らなかったらすいません。キモチだ）

```scala
val companion = new HashSetCompanion { E = Int }
val set = new companion.Apply apply
val max = new set.Max max
```

うんだるいですね却下。generics 使いましょう。
type member のよくないところは、プライマリコンストラクタのパラメタ宣言からは見えないことですかねえ。

### 追記
trait だけでできないの、と言われそうだなーと思ってたら言われなかったので追記しておくと、trait だけでは implicit parameter の解決はできません。色々考えたけどどうやっても無理そうというです。implicit parameter の解決を行うには、引数リストを持てるような、コンストラクタやメソッド等がどうしても必要になります。

なのでまあ class 使わずに下のように書いてもいいわけです。

```scala
trait HashSet { self =>
  type E
  val `E is hashable`: Hashable[Int]

  def Max(implicit ord: Ordering[E]) = new {
    def max: E = ???
  }
}
```

でもこれだと本当に「なんで def 一枚噛ますの馬鹿なの？」みたいな例になっちゃうので class にしました。
implicit なんてルールに従ってディクショナリ引っ張ってるだけなんだから手で書けばいいんですよ手で（CanBuildFrom のディクショナリとか IDE か reflection かコンパイラの力借りないと分かりそうもないけど）
Raspberry Pi 2(Raspbian)で固定IPを設定

# ■概要
Raspberry Pi 2(Raspbian)で固定IPを設定をします。

なお、Debianの標準的なやり方で固定IPを設定すると下記のような症状が発生し、ネットワークが何かのタイミングで切れることがありました。

```lang:/var/log/syslog
Jan 17 06:35:19 raspberrypi01 dhcpcd[3414]: eth0: carrier lost
Jan 17 06:35:19 raspberrypi01 kernel: [4512912.336501] smsc95xx 1-1.1:1.0 eth0: link down
```

原因は、Raspbianにはraspberrypi-net-modsというカスタマイズがされているからっぽいです。


# ■手順
・su -
・cd /etc/
・cp -p dhcpcd.conf dhcpcd.conf.org
・vi dhcpcd.conf
下記の２行をファイルの一番上に追加。IPは固定したい物で書き換えてください。

```lang:dhcpcd.conf
interface eth0
static ip_address=192.168.178.1/24
```
・reboot
・ifconfigで確認
完了です。お疲れ様でした。

# ■既に/etc/network/interfacesで固定IPを設定している場合
/etc/network/interfaces　eth0をmanualに戻す必要があるそうです。
それか、raspberrypi-net-modsをアンインストールすれば良さそう。
参考サイトを参照してみてください。

# ■参考
Raspberry Pi • View topic - Eth0 doesn't keep static IP
https://www.raspberrypi.org/forums/viewtopic.php?t=120982&p=817858
Elixir スクリプトとしてもシェルスクリプトとしても実行可能なファイルを作る

## こうすればいい

```ex:sh.exs
#!/bin/sh

true || """
"
echo "ここにシェルスクリプトを書く"
exit
"""

IO.puts "ここに Elixir スクリプトを書く"
```

## 解説

### シェルスクリプトとして解釈した場合

まずは

```bash
true || """
"
```

について。 `"""（改行）"` は単なる2つの文字列である。空文字列と改行文字1つを含む文字列を並べて書いただけだ。シェルスクリプトでは隣接した文字列は結合されるため、 `"""（改行）"` は改行文字1つを含む文字列に等しい。

 `||` は `cmd1 || cmd2` のように使う演算子である。 `cmd1` が0以外のステータスコードで終了したら `cmd2` を実行するという意味になる。 `true` はステータスコード0を返すだけのコマンドなので、 `true || """（改行）"` の後半は実行されない。

続く行には自由にシェルスクリプトを書ける。ただし `"""` または `#{` を含んではいけない。これらは Elixir スクリプトとして解釈したとき不都合がある。[^1]

シェルスクリプトのパートは

```bash
exit
"""
```

で終わる。 `exit` はそこでシェルスクリプトの実行を終了する。 `exit` 以降の行はシェルスクリプトとして正しくないが、実行されないので問題はない。

### Elixir スクリプトとして解釈した場合

```ex
true || """
"
echo "ここにシェルスクリプトを書く"
exit
"""
```

`""" 〜 """` は heredoc （複数行文字列）である。 `true || """ 〜 """` は `true` を返す無意味な式になる。

これ以降は自由に Elixir スクリプトを書ける。

[^1]: `"""` は Elixir として解釈したとき heredoc を閉じるクォートとして扱われる。 `#{...}` は Elixir の heredoc 中に Elixir コードを埋め込む記法であり、 Elixir として解釈したとき予期しないコードを実行することになる。
お菓子神社を支える技術

# お菓子神社
私が神主をつとめるお菓子神社では、__基本無料__で運用していて、お菓子をとったら__「他のお菓子を入れる」__か__「募金をする」__という形を取っています。

![スクリーンショット 2016-01-18 22.40.39.png](https://qiita-image-store.s3.amazonaws.com/0/26265/fe7c33cc-562e-d638-7ccc-70564a5ca44c.png)

# 運用
* __お菓子を食べた人が募金 or 新たなお菓子を供給__
* 神主と副神主が週に2度ほど買い出しに行く
* 募金は二人で分割

# メリット
* __自分では絶対買わないお菓子が食べられる。_
* おみやげも集まる
* チームメンバーがお菓子を買いに行く時間を削減できる
* 他チームの人がお菓子を食べに訪ねてくる。普段コミュニケーションが生まれない人にコミュニケーションが生まれる
* 会社見学の人の良いみせものになっている（と思っている）

# デメリット
## 会社のデメリット
* __周辺のゴミ箱がいっぱいになりやすい__（小さいゴミ箱3、4個くらいがすぐに埋まります）
* 意外にスペースを使う

## 神主のデメリット
* 運用コストがかかる。__確実にマイナス。__（募金は大体相場通り、もしくは少ないくらい）
* お菓子を買いに行くのが面倒
* 最近は供給主が大体神主なので買ってくるお菓子がマンネリ

# デメリットへの施策
とにかく募金が少なすぎることが一番の問題なので、これに対しておこなった施策を書いていきます。

## ヘビーユーザーに訴えかける（◎効果絶大）
__お菓子神社ヘビーユーザーの目の前で経営難であることをアピール__

## 募金のクオリティをあげる（✕効果なし）
募金に10円や1円が入らないように定期的に募金箱の中身を50円 / 100円 / 500円のみにしてみました。すぐに10円入れる人がいるので効果はありませんでした。

## イラストで訴えかける（◯効果まあまあ）
私がイラストが大好きなのでイラストで訴えかけてみました。

### v1. 泣きながら経営難を訴える
素直に経営難なことをアピールしてみました。v1ということもあり、効果は結構ありました。
![スクリーンショット 2016-01-18 22.55.29.png](https://qiita-image-store.s3.amazonaws.com/0/26265/484b356d-325b-32ea-73b9-d123e8deaec7.png)


### v2. お菓子が欲しいことをアピール
__お金よりもお菓子のマンネリが深刻__だったので、お金よりもお菓子が欲しいことをアピールしました。（お金は神主がマイナスがかさみ過ぎてどうでもよくなりました）
![スクリーンショット 2016-01-18 22.58.37.png](https://qiita-image-store.s3.amazonaws.com/0/26265/286581d2-900f-a047-40d6-141ca44dcca0.png)

### __お菓子が欲しいのに見事お金を挟んでくれました。__
![スクリーンショット 2016-01-18 23.02.48.png](https://qiita-image-store.s3.amazonaws.com/0/26265/6eeff155-6f83-0d0f-d6c7-61906904b9ca.png)

### v3以降. マンネリしないようアップデート
イラスト更新直後は課金されやすいので、適宜アップデートしています。
![スクリーンショット 2016-01-18 23.01.22.png](https://qiita-image-store.s3.amazonaws.com/0/26265/d3f72e9c-cd9d-1bd3-9f27-4afbeb58ee21.png)

# まとめ
* __お菓子神社はみんなの善意で成り立っています__
* お菓子含めて定期的にアップデートされることが重要です
* 会社の迷惑にならないように運用しましょう


# 他の神主のTips

* [3年くらいお菓子神社運営してきた](http://qiita.com/arihh/items/eaff832ca03f807d9232)
* [お菓子神社を5ヶ月運用してみて得た知見を共有](http://qiita.com/suthio/items/0d991ec549afb690f063)

# Appendix(KPT)
![スクリーンショット-2016-01-18-23.36.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/26265/dde6f7b6-4a5d-a732-4416-191b8084ddf7.jpeg)
Pythonを使ってMakefileでOS判別

WindowsとOSXで起動するファイルを変えたいという要望があったので、MakefileでOS判別してみました。
ちなみにWindowsでは`uname`が動かないので今回は**Python**の**platform**を使っています。

```mf
OSPLATFORM = $(shell python -c 'import platform; print platform.system()') 
```

> 参照
> 15.15. platform — 実行中プラットフォームの固有情報を参照する
> http://docs.python.jp/2.7/library/platform.html

```mf
kickoff:
ifeq ($(OSPLATFORM),Windows)
    $(KICKOFF_BAT)
else ifeq ($(OSPLATFORM), Darwin)
    $(KICKOFF_SH)
endif
```

このように使います。
[小ネタ] TortoiseSVN でリポジトリブラウザを開くショートカットを作る


ショートカットを作るだけの超小ネタ。

![TortoiseSVN リポジトリブラウザー](https://qiita-image-store.s3.amazonaws.com/0/48194/d3ed69ff-c4bc-318d-5e0c-3a12cccec1be.jpeg)

普段はもっぱら Eclipse で開発していているが、ログを追いかけたり、Blame で変更行の確認したり、ブランチのマージしたり…、といった作業は TortoiseSVN の方が便利なので、素早くリポジトリビューアが開けると非常に捗る。

前提条件として [TortoiseSVN](https://tortoisesvn.net/) がインストールされていること。

手順

1. 右クリック「新規作成＞ショートカット」を選択
1. 「項目の場所」は以下のように入力

```text
"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:repobrowser /path:"https://xxxxx.xx.xx/repos/path/to/" 
```

要は `TortoiseProc.exe` の `repobrowser` コマンドでリポジトリの URL を与えているだけなので、パスや URL は適宜変更。

あとは、作られたショートカットをスタートメニューなり、タスクバーなり、好きなランチャーなりに放り込んでおくといいと思う。

`TortoiseProc.exe` は下記リンクにあるように TortoiseSVN の諸々の処理を行えるので、Cygwin や Subversion コマンドをインストールしていないなら、代わりにちょっとしたスクリプトに組み込んで使うこともできる。

[付録D TortoiseSVN の自動化](https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-automation.html)

ちなみに、TortoiseGit の方も `TortoiseProc.exe` があるので同じようなことができると思う。
ramlのsyntasticのsyntax checker書いた。

なんか見つけられなかった。悲しい。
https://github.com/umezo/vim-syntaxcheker-raml-raml-parser

しかも裏で使おうと思ってたraml-parserの出力がまた errorformatで定義しづらくて、そっちも超雑に生み出してしまった

https://github.com/umezo/raml-js-parser-machine-friendly

名前が酷い。なにがマシンフレンドリィなんだろう。



## おわりに
ramlをsyntasticでうまいことやる方法知ってたら教えて下さい。

追加の情報を得られなければ上記もうちょっとまともにメンテしようかなという感じ。
特に名前。

名前！！！！
iOSアプリの画面固定(縦)

ちょっとメモ

プロジェクトからTARGET
　　　　　　　　↓
　　　　　Generalタブ内
　　　　　　　　↓
　　　　Development Info　
　　　　　　　　↓
　　　Device Orientation
　　　　　　　　↓
Portraitのみにチェックする
bootstrap modal の表示速度を変更する


bootstrapのmodalの表示スピードを速くしたかったので、bootstrapのmodalのoptionsで変更できないか調べたが、cssだけで変更できるみたい。

~~~
//fade out のスピード
.modal.fade {
  transition-duration: 0.1s;
}

//fade in のスピード
.modal.in {
  transition-duration: 0.1s;
}

//slide out のスピード
.modal.fade .modal-dialog{
  transition-duration: 0.1s;//slide out のスピード
  transform: translate3d(0, -5%, 0);//slide開始位置(x,y,z)
}

//slide in のスピード
.modal.in .modal-dialog{
  transition-duration: 0.1s;//slide in のスピード
  transform: translate3d(0, 0, 0);//slide終了位置(x,y,z)
}

~~~

fade outとslide outのスピードは0.5sくらい以上？にしても効かないみたい、bootstrapのjsか何かが邪魔してるかも。
なので、一応表示する時のスピードは変えられますってことで許してください。

あと、transformでtranslate3dの値も指定しているのは速度を上げた場合、開始位置はデフォルトの-25%より0に近づけたほうが見え方がよくなるので。

さらに、cssはbootstrapのスタイルを上書きするような位置に書く必要があります。
underscoreコードリーディング（bind）



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



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


##bindとは


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

こんな説明。
>####_.bind(function, object, *arguments) 
>Bind a function to an object, meaning that whenever the function is called, the value of this will be the object.
>Optionally, pass arguments to the function to pre-fill them, also known as partial application.
>For partial application without context binding, use partial.

```javascript
var func = function(greeting){ return greeting + ': ' + this.name };
func = _.bind(func, {name: 'moe'}, 'hi');
func();
=> 'hi: moe'
```
------------- 
関数が呼び出されるときに、その値がobjectであるというように、オブジェクトを関数に紐付けます。
必須ではないけれど、argumentsを渡すことによって、事前に値を埋めておくことができます。（partial applicationとして知られているように？）




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

```javascript
  // Create a function bound to a given object (assigning `this`, and arguments,
  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
  // available.
  _.bind = function(func, context) {
    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
    var args = slice.call(arguments, 2);
    var bound = function() {
      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
    };
    return bound;
  };
```

[nativeBind(function.prototype.bind)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)があるかつfunc.bindがそれだった場合、function.prototype.bindを利用する
funcがfunctionじゃなかった場合、[TypeError](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/TypeError)を返す。
そうでない場合、argsに第三引数以降を格納する。
boundsに変え率に引数func,bound,contextとthis自体とargs.concatのargumentsをsliceしたものを返す新しい関数を格納しておく。
その後、boundを返す。
CodeIgniterでinsert_batchする場合のポイント

CodeIgniterはシンプルなフレームワークなので、RailsのActiveRecordのような高度な機能はありませんが、それでもDB操作に便利な機能はちょくちょく存在しています。

# 配列から`INSERT`
単純な`INSERT`文であれば、自分でSQLを組み立てなくても、`$this -> db -> insert()`とすることで実行可能です。文字データのエスケープも自動実行してくれるので、自分で組み立てるより楽だし安全です（[日本語版マニュアル](http://codeigniter.jp/user_guide_ja/database/active_record.html#insert)[^1]）。

```php:insert.php
$data = array(
   'title' => 'My title' ,
   'name' => 'My Name' ,
   'date' => 'My date'
);

$this->db->insert('mytable', $data); 

// 生成される SQL 文: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
```

# バルク`INSERT`
大量のデータを`INSERT`する場合、逐一`INSERT`を行ってももちろん動作はするのですが、必要以上に負荷がかかってしまいます（[MySQLでの例](http://qiita.com/jkr_2255/items/12081b3c066d371516f5)）。ということで、一気に複数行を`INSERT`する機能があって、CodeIgniterからも、`insert_batch()`で呼び出すことができます。

```php:insert_batch.php
$data = array(
   array(
      'title' => 'My title' ,
      'name' => 'My Name' ,
      'date' => 'My date'
   ),
   array(
      'title' => 'Another title' ,
      'name' => 'Another Name' ,
      'date' => 'Another date'
   )
);

$this->db->insert_batch('mytable', $data); 

// 生成される SQL 文: 
// INSERT INTO mytable (title, name, date) VALUES
// ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
```

# 失敗例
上のSQL文を見てみればわかるかもしれませんが、一括`INSERT`を行う上では、**全部同じだけの列を用意する**必要があります。CodeIgniterのマニュアルに明記はされていないのですが、一部のキーが欠けた状態で`insert_batch`を行おうとすると、途中に`Array`が挟まるなどの不可解なエラーが発生してしまいます。

```php:失敗例
$data = array(
   array(
      'title' => 'My title' ,
      'name' => 'My Name' ,
      'date' => 'My date'
   ),
   array(
      'title' => 'Another title' ,
      'name' => 'Another Name' ,
      // 'date' => 'Another date' 削ってみる
   )
);

$this->db->insert_batch('mytable', $data);
// 実行するとSQL文に「Array」が混入してSQLエラー
```

# 対策方法
まとめて`INSERT`するための配列を用意して、ループで加えていくパターンはよくあると思いますが、テンプレートとして全列を用意しておいた配列を先に作って、そこにコピー、書き込みで各行を構築すると便利です。全部`NULL`でよければ、テンプレート配列は列一覧から`array_fill_keys()`一発で作れます。

```php:実践例
$insert_values = array();
$columns = array('column1', 'column2', /* 後略 */);

// $columnsの中身それぞれをキーとして、値はすべてNULLの配列
$row_template = array_fill_keys($columns, NULL);
foreach($data_array as $data_row){
  //PHPだと配列は代入だけでコピーされる
  $row = $row_template;

  //$rowにいろいろ代入

  $insert_values[] = $row;
}
$this->db->insert_batch('mytable', $insert_values);
```

# 脚注
[^1]: このマニュアルはCodeIgniter 2.0 でのものですが、3.0でも「Active Record」という（大げさな）名前が「Query Builder」に変わった程度で、DB操作自体はほぼ同じままです。
Rubyでバブルソートとマージソートを比較する

# 概要
手習いのためにバブルソートとマージソートを書いて比較します。
先日、某codilityで最悪の場合に$O(n \\log n)$でソートすることが求められて、マージソート（の変則）を書こうとしたら、ちょっと時間がかかったので。
具体的には、Arrayを受け取り、破壊的な操作をして、ついでにArrayを返す関数を書いて、比較します。

# バブルソート
[Wikipediaにおける説明](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88)
昔はもうちょっと浮き上がる感じのgifだったような。泡が浮き上がっていくイメージのソートアルゴリズムですが、たくさん比較、交換をしないといけないので遅いです。

```rb:bubble
def bsort(a)
  l = a.length
  for i in 1..l do
    for j in 1..(l-i) do
      if a[j - 1] > a[j]
        t = a[j]
        a[j] = a[j - 1]
        a[j - 1] = t
      end
    end
  end
  return a
end
```
コードは比較的すっきりしています。
配列の長さ(コード中のl)を$n$と書き直すと、ループの内容から明らかなように$n(n-1)/2$に比例した計算が必要になります。つまり$O(n^2)$です。

# マージソート
[Wikipediaにおける説明](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88)
すべての要素を分割して、再帰的に結合＋ソート、結合＋ソート、…を繰り返していきます。再帰計算の例には、よく階乗やフィボナッチ数列が使われますが、マージソートでもよいような気がしています。

```rb:merge
def msort(a)
  l = a.length
  if l <= 1
    return a
  end
  al = msort(a[0..((l-1)/2)])
  ar = msort(a[((l+1)/2)..(l-1)])
  i = 0
  while i < l do
    if al[0] < ar[0]
      a[i] = al.shift
    else
      a[i] = ar.shift
    end
    i += 1
    if al.length == 0
      while i < l do
        a[i] = ar.shift
        i += 1
      end
    elsif ar.length == 0
      while i < l do
        a[i] = al.shift
        i += 1
      end
    end
  end
  return a
end
```
ただ、マージソートの場合、バッファ領域みたいなものをきちんと意識して破壊的に書くか、適当にnewしまくるか、みたいな部分で色々気にしないといけないことが転がっています。ただ、その手の事情は良くも悪くも「実装する時には考えるべきこと」なので、それも含めた練習としては有意義かと思いました。
最悪の場合の計算のコストを$C(n)$で表すと、$C(2n)\\leq C(n)+C(n)+2an$となりますが、これを順次適用して展開していくと、$2an,4a(n/2)=2an,8a(n/4)=2an,...$というように$2an$が$\\log_2 n$個だけ出てきて、（たかだか）$O(n \\log n)$であることが分かります。
※適当な説明…$C(n)+C(n)+2an$という式が、al,ar,後半のマージにそれぞれ対応していますが、マージは少なくとも$n/2$は比較が必要で、代入等は結局すべての要素について行うので、$O(n \\log n)$になります。厳密な計算については検索してみてください。

# 比較
```rb:compare
# 乱数列の作成
timearr.push Time.now.instance_eval { self.to_i * 1000000 + usec}
N = 10000
target = Array.new(N){0}
n = -1
temp = Array.new(N){n;n+=1}
n += 1
while n > 0 do
  t = rand(n)
  n -= 1
  target[n] = temp[t]
  temp.delete_at(t)
end

targeta = target.clone
targetb = target.clone

timearr.push Time.now.instance_eval { self.to_i * 1000000 + usec}
bsort(targeta)
timearr.push Time.now.instance_eval { self.to_i * 1000000 + usec}
msort(targetb)
timearr.push Time.now.instance_eval { self.to_i * 1000000 + usec}

p timearr[1] - timearr[0]
p timearr[2] - timearr[1]
p timearr[3] - timearr[2]
```
10000要素の無重複の乱数列を生成し、クローンを作って破壊的なソートを行います。

```text:結果
0       #準備の時間 
5797493 #バブルソートの時間
31256   #マージソートの時間
```

これは圧倒的ですね。
rubyの配列の使い方の勉強も兼ねているので`delete_at`とか`shift`とか、`clone`の練習ができました。
[アルゴリズムクイックリファレンスという書籍](http://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-George-T-Heineman/dp/4873114284)を買ったので、時間があれば、ruby/pythonの復習がてら、少し基礎的な勉強をして結果を書いていこうと思います。

# おしまい
たのしめ！