OmniAICreator/Qiita-1.07M huggingface dataset:
mbed .binの中身は？

オンラインコンパイラでコンパイルした結果の.binファイル、普段からmbedドライブにコピーしていますが中身は何なのか気になったので調べました。

#オフラインコンパイラのBuild Output
オフラインコンパイラのBuild Outputを見ると、fromelfコマンドで.axfファイルから.binファイルを生成していることがわかります。

```text:BuildOutput
*** Using Compiler 'V5.06 update 1 (build 61)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Rebuild target 'mbed NXP LPC1768'
compiling main.cpp...
linking...
Program Size: Code=16116 RO-data=1536 RW-data=52 ZI-data=592  
After Build - User command #1: fromelf --bin -o build\mbed_blinky_LPC1768.bin build\mbed_blinky.axf
".\build\mbed_blinky.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:01
```

#教えて！Google先生！
".elf .bin"でググると、[ELF イメージからプレーンバイナリ形式への変換](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0477bj/CACDFBIF.html)というページが見つかりました。
> 各ロード領域に対して 1 つのプレーンバイナリ形式の出力ファイルを生成するには

"プレーンバイナリ形式"。
はて、プレーンバイナリ形式って何だろう？
アドレス0番地からのバイナリデータなのだろうか？

#確認
デバッガにSimulatorを選択し、Debug Sessionを開始します。
![20160122A.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/90e9affe-e6a3-1e62-5cee-105bcb6990c2.png)

Memory Windowを表示して、Address=0に。ウィンドウをフローティングにして、幅を16バイトで折り返すよう調整します。
![20160122C.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/6eceaf3e-5072-6ec1-1b95-9328bb01d807.png)

.binファイルの中身と、Memory Windowの値を比較します。
![20160122D.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/a9071883-29d1-031a-c794-17d01e7114c5.png)

一致しました！
.NETの非同期に関して ～Task, async/await（自分用メモ）

## await task が確実にスレッドプールスレッドで実行させるようにするには？ 

###### 2017/01/09追記
コメントで以下のご指摘を頂きました。ご注意下さい。※但し、私の実験した環境においては確実にスレッドプールスレッドで実行されています。
> await Task.Delay(1).ConfigureAwait(false); と書いても、**awaitの次の行がスイッチされたコンテキストで実行されるとは限りません**
本体のTaskをawaitする前に、

```
await Task.Delay(1).ConfigureAwait(false);
```
を呼び出すだけ。

`Delay(1)`は必ず(?)スレッドプールスレッドで実行され、そして`ConfigureAwait(false)`することで、UIスレッドに戻ってこないようにする、という仕組み。

### 背景

await した task は必ずしもスレッドプールスレッドで実行されるとは限らない。
MSDNのどこかにもそんなことが明記されていたし、実際にトータルで数秒かかる処理（IO待ち1秒＋その他）が全てUIスレッドで実行されるということも頻発した。（環境依存が強そう。Windows10で頻発。）

それによって数秒間画面が固まり、その間ボタンのEnabled/Disabledも画面に反映されず… というのは、要件によっては大問題となる。
そのため、必ずスレッドプールスレッドで実行してもらう（UIスレッドを自由にさせてあげる）方法が必要となった。

以上。

# ライブラリでの非同期実装について

##ライブラリ内でTask.Runを使わない

>スレッド、特にスレッドプールのスレッドはグローバルに共有されているリソースで、アプリケーション開発者に属しています。ライブラリの作者はTask.Runを使ったり、スレッドを作るメソッドを作成するべきではありません。どのようなタイミングでスレッドを追加するか決めるのはアプリケーション開発者の権利と責任です。

## await するなら、ConfigureAwait(false) する
不用意にUIスレッドに戻らないよう。

```csharp
await XxxAsync.ConfigureAwait(false)
```

----

## 参照

とても勉強になりました↓
[.NET非同期処理(async-await)を制御する、様々な方法 – kekyoの丼](https://www.kekyo.net/2015/06/04/4735)
[できる！C#で非同期処理(Taskとasync-await) – kekyoの丼](https://www.kekyo.net/2016/12/06/6186)

TAP (Task-based Asynchronous Pattern) 非同期メソッドのガイドライン
http://qiita.com/chocolamint/items/ed4999cccf011653cb78

HttpClient詳解、或いは非同期の落とし穴について
http://www.slideshare.net/neuecc/httpclient

.NETで非同期ライブラリを正しく実装する
http://www.infoq.com/jp/articles/Async-API-Design

async/await ～非同期なライブラリは楽じゃない～
http://qwerty2501.hatenablog.com/entry/2014/04/24/235849
xamlに定義したButtonのCommandParameterをイベントハンドラで受け取る

# xamlに定義したButtonのCommandParameterをイベントハンドラで受け取る

たとえばこんなItemsSourceとイベントの定義がある時

```xml
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d"
  Height="300" Width="300"
  x:Class="Boo.FooWindow">
  <Grid>
    <DataGrid x:Name="HogeDG" IsReadOnly="True" AutoGenerateColumns="False">
      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
      <DataGridTemplateColumn Header="Action">
        <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
            <Button Content="Action" CommandParameter="{Binding ID}" Click="HogeClick"/>
          </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
    </DataGrid>
  </Grid>
</Window>

```

```csharp
namespace Boo {
  public class FooWindow : Window {
    public FooWindow() {
      this.HogeDG.ItemsSource = new List() {
          new Hoge() { ID = 1, Name = "Bar" }
        , new Hoge() { ID = 2, Name = "Baz" }
      };
    }

    private void HogeClick(object sender, RoutedEventArgs e) {
      // クリックされたHogeのIDを表示したい
    }
  }
}
```

　今回の目標は、クリックされた行のHogeのIDを`Console.WriteLine`することです。
しかし`CommandParameter`は`ICommand`の`Execute(object parameter)`に渡されるものなので
普通のイベントハンドラである`HogeClick`では受け取れません。

そんな場合はこうしてやると、`ICommand#Execute`同様に受け取れます。

```csharp
namespace Boo {
  public class FooWindow : Window {
    public FooWindow() {
      this.HogeDG.ItemsSource = new List() {
          new Hoge() { ID = 1, Name = "Bar" }
        , new Hoge() { ID = 2, Name = "Baz" }
      };
    }

    private void HogeClick(object sender, RoutedEventArgs e) {
      // クリックされたHogeのIDを表示したい
      int id = (int)((Button)sender).CommandParameter;
      Console.WriteLine(id);
    }
  }
}
```
Pentaho環境設定手順6.0.1

・ソフトウェア ：Pentaho6.0.1.
・環境情報：Windows8.1（実装メモリ8.00GB、システムの種類64ビット）
・参考リンク or 参考サイト：
http://dataninja.jp/pentaho-install/#StepPentaho

【手順】

◇ダウンロードからログインまで

1.以下にアクセス

http://community.pentaho.com/

2.ALL OSをクリックし、以下をダウンロード

　biserver-ce-6.0.1.0-386.zip

3.ダウンロードしたファイルをCドライブ直下に展開

4.環境変数（JAVA_HOME）を設定
※既に設定済みならば必要なし

5. start-pentaho.bat（biserver-ceフォルダ内にある）を起動

6.以下のURLでPentahoにアクセス

http://localhost:8080/pentaho/

7.ユーザー、パスワードを入力してログイン
※以下の2種類のデフォルトユーザーがある

・管理者
　ユーザー：Admin
　パスワード：password

・ビジネスユーザー
　ユーザー：Suzy
　パスワード：password
vagrant1.8.1のインストール手順

・ソフトウェア vagrant-ver 1.8.1
・環境情報：Windows7（実装メモリ8.00GB、システムの種類64ビット）

【手順】
◇ダウンロード

1.以下にアクセス
http://www.vagrantup.com/downloads.html

2.Windows 用の msi インストールファイルをダウンロード

◇インストール

1.ダウンロードした msi インストールファイルを起動しインストール

2.「Finish」をクリックしてインストール終了

※インストール終了後は再起動される。
[Android] Compile all cpp files in a folder with Android.mk

Just use shell find command to list all the cpp files and add these files to the `LOCAL_SRC_FILES`.

```
SOURCE_FILES := $(shell find $(LOCAL_PATH)/Classes/* -type f -name *.cpp)
LOCAL_SRC_FILES += $(SOURCE_FILES:$(LOCAL_PATH)/%=%)
```

Also this is just a example, you also can append filters such as `*.cc` `*.h` and so on.
poderosa4.3.16のインストール手順

・ソフトウェア ver：Poderosa-4.3.16
・環境情報：Windows7（実装メモリ8.00GB、システムの種類64ビット）

【手順】

◇poderosaのダウンロード

1.http://sourceforge.net/projects/poderosa/
　 にアクセスする。

2.「Download」ボタンをクリックしてZip圧縮形式ファイルをダウンロード（Poderosa-4.3.16-bin-net20.zip）する。

◇poderosaのインストール

1.ダウンロードしたファイルを解凍する。

2.解凍が終わると終了。
【Google Analytics】セッションが切れる時間の設定手順

【手順】

アナリティクス設定>プロパティ>トラッキング情報>セッション設定

1.セッションのタイムアウトの時間を選択

2.「適用」をクリック

※セッションはユーザーがサイトを訪問したときに始まり、
指定した時間、サイト内でページビューやイベントを送信する行動がないときに終了する。
【Google Analytics】特定のグローバルIPアドレスからのアクセスを除外する設定手順

【手順】

アナリティクス設定>ビュー>フィルタ

1.「新しいフィルタ」を選択し、以下を入力

フィルタ名：任意
フィルタの種類：定義済み
フィルタの種類を選択：除外
参照元かリンク先を選択します：IPアドレスからのトラフィック
式を選択します：等しい
IPアドレス：除外したいIPアドレス（特定のグローバルIPアドレス）

2.「保存」をクリック
teraterm4.89のインストール手順

以下は、2016年1月10日時点

・バージョン：teraterm-4.89
・環境情報：Windows7（メモリ8.00GB）

【手順】

◇ダウンロード

1.以下にアクセスする。

https://osdn.jp/projects/ttssh2/
　
2.以下のファイルをダウンロードする。

teraterm-4.89.exe

◇インストール

1.ダウンロードしたファイルを起動する。

2.「次へ」をクリックして進む。

3.コンポーネントの選択画面が表示されるので、
　 「標準インストール」を選択して、インストールをする。

4.「完了」をクリックして終了。
VirtualBox5.0のインストール手順

2016年1月13日時点の手順書となります。

 ・バージョンVirtualBox5.0
・環境情報：Windows7（実装メモリ8.00GB、システムの種類64ビット）

  【手順】

◇VirtualBoxのダウンロード
1.https://www.virtualbox.org/
にアクセスする。
2.ダウンロードボタンをクリックする。
3.「VirtualBox platform packages」の「VirtualBox 5.0.12 for Windows hosts」にある「x86/amd64」をクリックしてダウンロード（VirtualBox-5.0.12-104815-Win.exe）する。
4.次にその下にある「All supported platforms」をクリックしてダウンロード（Oracle_VM_VirtualBox_Extension_Pack-5.0.12-104815.vbox-extpack）する。

◇VirtualBoxのインストール
1.VirtualBox-5.0.12-104815-Win.exeを起動する。
2.「Next」をクリックして、インストールを開始する。
3.「Oracle VirtualBox installation is complete.」が出て、「Finish」をクリックするとインストールが終了される。
◇エクステンションパックの導入
1.VirtualBoxのマネージャー画面で、[ファイル] -> [環境設定] -> [機能拡張]とクリックする。
2.ダウンロードしたパッケージ（Oracle_VM_VirtualBox_Extension_Pack-5.0.12-104815.vbox-extpack）を追加する。
3.確認画面が表示されインストールされる。
4.インストールが終わると終了。
exports と module.exportsの使い分け


## exports

* 多数の関数やオブジェクト（定数とか）を返す時に使いやすい
* 循環参照しているモジュール構成でも問題ない

```:想定される使い方
var hoge = require('./hoge');
var h = new hoge.Hoge(hoge.SPEC.FUGA);

var x = hoge.util(h);
```


## module.exports

* 単一のクラスや単一の関数を返す時に使いやすい
* 循環参照しているモジュール構成の時に問題がおきる
* 自プロジェクト内で依存関係が少ない場合に向いている(npmで取ってきたモジュール以外はrequireしないほうがいい)

```:想定される使い方
var Hoge = require('./hoge');
var hoge = new Hoge();
```

## 循環参照のケース

以下のようなケースにおいてmodule.exportsを使ってモジュールを外部に出すと問題が起きる

```:main.js
var TestManager = require('./test_manager');

var test = TestManager.instance.create()
test.ok()
```

```:test.js
var TestManager = require('./test_manager');

var Test = module.exports = function(){
    this.initialize();
}
Test.prototype.initialize = function(){
    TestManager.instance.add(this);
}
Test.prototype.ok = function(){
    console.log("ok");
}
Test.prototype.dispose = function(){
    TestManager.instance.remove(this);
}
```

```:test_manager.js
var Test = require('./test');

var TestManager = function(){
    this.tests = [];
}
TestManager.prototype.create = function(){
    return new Test();
}

TestManager.prototype.add = function(test){
    this.tests.push(test);
}
TestManager.prototype.remove = function(test){
    this.tests = this.tests.filter(function(v){ return v !== test });
}

module.exports = {
    instance : new TestManager()
}
```

```:console
$ node main.js 
c:\Users\you2\x\test.js:7
    TestManager.instance.add(this);
                        ^
TypeError: Cannot read property 'add' of undefined
    at Test.initialize (c:\Users\you2\x\test.js:7:25)
    at new module.exports (c:\Users\you2\x\test.js:4:10)
    at TestManager.create (c:\Users\you2\x\test_manager.js:7:12)
    at Object.<anonymous> (c:\Users\you2\x\main.js:4:33)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
```
数式中のセル参照を参照先のセルの値に置換し、セルの数式を文字列として返すExcel Worksheet関数

およびセルの数式を文字列として返すExcel Worksheet関数を作りました。
何言ってるのかよくわからないと思いますがこういうことです。

![example.png](https://qiita-image-store.s3.amazonaws.com/0/38266/80757602-35c0-3d20-df07-4f555d88b606.png)

Excelで計算書などを作る場合にセルの中の数式が見えていないとヤダ！と言われるケースが多々あるので作りました。

機械的に置換しているだけで大した例外処理などは行っていません。特に範囲を参照している場合に対応していないことに注意です。

ちなみにExcel 2013からはセルの数式を返す`FORMULATEXT()`が実装されています。

```vbnet
' セルの数式を文字列として返す。
' rcにtrueを渡すとR1C1形式で返す。
Function CellFormula(cell As Range, Optional rc As Boolean) As String
    If rc Then
        CellFormula = cell.FormulaR1C1Local
    Else
        CellFormula = cell.FormulaLocal
    End If
End Function

' 数式中のセル参照を参照先のセルの値に置換し、セルの数式を文字列として返す。
' 範囲を参照している場合は考慮していないので注意。
' 定義された名前は考慮していないので注意。
' 数式の中に参照のような文字列が存在する場合も考慮していないので注意。
Function CellIntermediateFormula(cell As Range) As String
    Application.Volatile
    
    Dim regExp As Object
    Dim matches As Object
    Dim match As Object
    
    Dim i As Long
    Dim strEvaled As String
    Dim strTarget As String
    
    strTarget = cell.FormulaLocal
    
    Set regExp = CreateObject("VBScript.RegExp")
    regExp.Pattern = "\$?[A-Z]+\$?[1-9]\d*"
    regExp.IgnoreCase = True
    regExp.Global = True
    
    If regExp.Test(strTarget) Then
        Set matches = regExp.Execute(strTarget)
        For i = 0 To matches.Count - 1
            Set match = matches(i)
            strEvaled = cell.Worksheet.Range(match.Value).Text
            strTarget = Replace(strTarget, match.Value, strEvaled)
        Next i
    End If
    
    CellIntermediateFormula = strTarget
End Function

```
Laravel5をPostgreSQLで使う

MACにPostgreSQLの環境をまずは作ってあることが前提
[Mac+mamp+postgresqlの環境つくり](http://qiita.com/tagosaku324/items/482dfb2ab114a5f19ff4)

postgresが動作しているかを確認する

```:バージョンで確認できる
$postgres -V
postgres (PostgreSQL) 9.5.0
```
データベースをPostgresに作っておく

```
$ createdb tagotest -O user_name
```

Laravelの.envファイルをpostgres用設定にする

```:.env
DB_CONNECTION=pgsql
DB_HOST=localhost
DB_DATABASE=tagotest
DB_USERNAME=user_name
DB_PASSWORD=passwd
```

migrateを実行してみる！

```
$ php artisan migrate 
<!! 真っ赤なエラー                       
  [PDOException]         
  could not find driver  
<!!
```

なにがいけないのだろう。。
実行する時、何も考えずにphpを実行したけど、これがいけなかった。
私の環境ではmacデフォルトのphpが実行されたようです。
そうすると、extension=php_pdo_pgsql.dll という部分の問題にぶちあたるみたいです。
参考：[初めてのLaravel（PHP Framework）](http://qiita.com/CyberMergina/items/857f63e6d20f8958ee1f#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%AE%9F%E8%A1%8C)
デフォルトの修正はしたくないので、別のPHPを使うことにしました。

幸い、MAMPが入っています。
[MAMPにLaravel5を使える環境を作ってみる](http://qiita.com/tagosaku324/items/0c51a400e0402b6ca2ad)

MAMPのphpを使うことにします。

```
$ /Applications/MAMP/bin/php/php5.6.10/bin/php artisan migrate
Migration table created successfully.
Migrated: 2016_01_14_022654_create_admin_table
Migrated: 2016_01_21_062638_create_company_table
```
無事に入りました。
EclEmmaでカバレッジを取得しながらステップ実行

あまりいないでしょうけど、EclEmmaでカバレッジを取得しながらデバッグ実行もしたいときに、
Coverage Asとか、EclEmmaのラウンチャーでアプリを起動すると、Eclipseのデバッガでステップ実行出来ない！という場合の対処方法。

Run Configurations(起動構成)でVM引数として
```
-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
```

そして、カバレッジ取得対象アプリの起動後、Debug Configuration(デバッグ構成)から、
Remote Java ApplicationでJWDPでアタッチしてやれば、EclEmma使いながらStep実行できます。

ちなみに、VM引数のaddress=8000は、JDWPで接続するポート番号なので、使ってるミドルとぶつかる！という場合は、ここの値を変えれば大丈夫です。
その場合は、当然ながらアタッチする際のポート番号も変えた値にする必要はありますが…

また、今回の起動引数では、アプリ側をJDWPのサーバー側として起動していますが、server=yをnに変更して、Debug Configurationのconnection typeをListenにして、JWDPのサーバーを先に起動（Debug Configurationの構成を先に実行してやる）と同じように動くと思います（多分）
PHP + Travis CI + Coveralls + Code Climate

Travis CI その他諸々を使ってみた作業ログ。

ソースは https://github.com/nishimura/laiz-monad これ。
すべてGitHubアカウントでログインするので設定が超早い。


# Travis CI

https://travis-ci.org/

テスト自動化。

```yaml
# .travis.yml
language: php

php:
  - '5.6'
  - '7.0'
  - hhvm
  - nightly

before_script:
  - composer install --dev --no-interaction

script:
  - vendor/bin/phpunit
```

Travis CIのサーバーにphpunitが入っているので、vendor/bin/phpunitじゃなくても良い。
その場合はlanguageとphpバージョンだけ指定すれば良さそう。

パッケージルートにphpunit.xmlを書いている。

```xml
<phpunit bootstrap="vendor/autoload.php" colors="true"
         forceCoversAnnotation="false"
         verbose="true"
         >
  <testsuites>
    <testsuite name="Laiz\Monad Test">
      <directory>test/src</directory>
    </testsuite>
  </testsuites>

  <filter>
    <whitelist>
      <directory>src</directory>
    </whitelist>
  </filter>
</phpunit>
```

タイプヒンティングのエラーチェックで、PHP7のTypeErrorとPHPUnit_Framework_Errorの両方対応するのにちょっと困った。



# Coveralls

https://coveralls.io/

CIサービスを利用したカバレッジ測定サービス。


```json
  "require-dev": {
      "satooshi/php-coveralls": "dev-master"
  }
```

```yaml
language: php

php:
  - '5.6'
  - '7.0'
  - hhvm
  - nightly

before_script:
  - composer install --dev --no-interaction

script:
  - mkdir -p build/logs
  - vendor/bin/phpunit --coverage-clover build/logs/clover.xml

after_success:
  - travis_retry php vendor/bin/coveralls -v
```

ネットで検索した情報は古いのが多かったのでgithubを見ながらやるのが良い。


# Code Climate

https://codeclimate.com/

静的解析。
GitHubアカウントでログインすれば特に設定の必要はない。
PHPも https://codeclimate.com/features 機能説明のサンプルにあるように普通に対応してた。

テストカバレッジもこっちでやりたい場合は

```json
  "require-dev": {
      "codeclimate/php-test-reporter": "dev-master"
  }
```

```yaml
language: php

php:
  - '5.6'
  - '7.0'
  - hhvm
  - nightly

before_script:
  - composer install --dev --no-interaction

script:
  - mkdir -p build/logs
  - vendor/bin/phpunit --coverage-clover build/logs/clover.xml

addons:
  code_climate:
    repo_token: #token#
```

このような設定に変更。
codeclimate/php-test-reporter を入れると satooshi/php-coveralls も入る。


でも何となく Coveralls の方が見やすいので両方使った。
resque用のワーカーを起動する


## 前提

Rails4.x 系での話

## 事前準備

以下のファイルを `lib/tasks` 配下に作成

```ruby:lib/tasks/resque.rake
require 'resque/tasks'
task 'resque:setup' => :environment
```

## ワーカー起動

```
$ QUEUE=* bundle exec rake resque:work
```

## キューの状態確認

Webブラウザで`http://{ホストのIP}:5678/`を開くと確認できる。


## 結論

RescueのReadmeって読みにくい...（あれで皆ちゃんと使えてるのか...?）

## 参考

[LoadError: No such file to load -- application_controller · Issue #1235 · resque/resque](https://github.com/resque/resque/issues/1235)
Akka ActorのテストはTestKitをなるべく使おう

# 背景

アクターを使った部分のテストを書いていて、非同期処理でされることを意識していなかったせいでドハマリしたので、そのメモ

## はまったパターン

ちょっとしたRestAPIを実装して、つぎのようなことをテストしたかったので、

1. APIを呼び出し
2. HogeActorにメッセージして、レスポンスを返す
3. HogeActorでなんらかの処理がされる

下記のようなテストコードを書きました。

```lang:SampleTest.java

  @Test
  public void test() {
      // 1. リクエスト実行

      // 2. レスポンスが返ってくることを確認
      assertThat(res).isNotEmpty();

      // 3. HogeActorでされる処理の結果を取得
      T actual = ...

      // 4. 上記が期待通りか確認
      assertThat(actual).isEqualTo(expected); 　 
  }

```

なにがまずいかというと、`3` のHogeActorの処理は別スレッドで行われているので、このコードでは処理が終わったことが保障できないのです。（言われてみれば超あたりまえですが...）

短時間で終わることがわかりきっているなら、 `TimeUnit.SECONDS.#sleep` で数秒待つのを差し込めば解消されますが、あまりよろしくはないです。

Actorはもともとマルチスレッドでやるためのようなものなので、このテストの方針がいけていないです。

## 対策

いわゆる、困難の分割です。テストの対象を、

1. APIをたたいたら、期待したメッセージをHogeActorで受け取る
2. HogeActorでメッセージを受信したら、期待する処理がされる

の２つに分けます。

1はJavaTestKitを使うのが向いています。

https://gist.github.com/jconwell/8153535

2はTestActorRefを使うのが向いています。これを使うと、通常は生成できないActorのインスタンスを取得できるので、onReceiveのメソッドをテストで直接使えるようになります。 

あるいはメッセージの送信やメッセージの部分をモックにおきかえられるなら、

1. APIを叩いたら、HogeActorにメッセージを送るメソッドがよばれる
2. HogeActorにメッセージをわたしたら、期待する処理をするメソッドがよばれる
3. 実際の処理を実行して、期待する結果かを確認

という風に、途中まではverifyでしのいで、やりたい処理のところだけを別途やるという作戦もあります。

マルチスレッドになっているときのテストは要注意ですね...

# 参考サイト

http://qiita.com/reoring/items/3baeac37ba0d63f39693

http://kzky.hatenablog.com/entry/2015/02/11/%E6%80%92%E6%B6%9B%E3%81%AEAkka%3A_Testing_Actor_Systems

http://roestenburg.agilesquad.com/2011/02/unit-testing-akka-actors-with-testkit_12.html
RubyのString#matchの挙動

#Rubyの`String#match`の挙動に関して。
ユーザーの入力した値のチェックをするために、以下のようなプログラムを書いていたらエラーが出た。

```ruby:app.rb
require 'bundler/setup'
Bundler.require
require 'sinatra/reloader' if development?
require 'net/http'
get "/" do
    if params[:test].match(/\d+(\.\d+)?/)
        #何らかの処理
    end
end
```

これで`params[:test]`に値が渡されないと、`nil`に対して`String#match`を行うのでエラーがおきてしまった。
以後注意したい。
GitHubに sampleBootAppを投稿

iOS App開発で案外面倒なのが、初期処理手順やマイグレーション、使用法(マニュアル)、in-App purchase、広告表示などの付帯機能です。で、世の中に公開されているものを元にまとめてみました。
https://github.com/AgeProducts/sampleBootApp
あまりキレイなコードではありませんが、ご参考まで。
npmのコマンドでローカルサーバーを簡単に立ち上げる

phpの簡易サーバーのコマンドを、`package.json`の`scripts`に設定しておくとHTMLとかPHPをサーバーにアップしなくても動作確認できます。

phpファイルも動作するので、ちょっとした開発ツールを用意したりもできると思います。

## ファイルを置いてコマンドを1つ覚えるだけ

### package.jsonの内容

```[package.json]
{
  "name": "Project name",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "server": "php -S localhost:8000 -t ./htdocs"
  },
}
```

ドキュメントルートは`./htdocs`のところを適宜変えてください。

### ディレクトリ構成

```
/project_directory/
  htdocs/
    img/
    js/
    css/
    index.php
  package.json
```

### 起動方法

ターミナルで1行入れるだけです。

```
$ cd project_directory #package.jsonのある場所に移動しておく
$ npm run server
```

### 停止方法

```
Cmd(Ctrl) + C
```

## Python版もあるよ

```
"scripts" : { "server" : "cd ../public && python -m SimpleHTTPServer" },
```
日本語ドメイン、クエリー付きのURLをエンコード・デコードする

まずは日本語ドメインは無視して、単純なエンコードとデコード。

```objc:Objective-C
// エンコード
NSString *encodeOriginal = @"エンコードしたい文字列です";
NSString *endcode = [encodeOriginal stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
NSLog(@"%@", endcode);
// -> %E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%81%84%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E3%81%99
        
NSString *encodeOriginalUrl = @"https://ja.wikipedia.org/wiki/でんぱ組.inc";
NSString *encodeUrl = [encodeOriginalUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
NSLog(@"%@", encodeUrl);
// -> https%3A%2F%2Fja%2Ewikipedia%2Eorg%2Fwiki%2F%E3%81%A7%E3%82%93%E3%81%B1%E7%B5%84%2Einc

// デコード
NSString *decode = [endcode stringByRemovingPercentEncoding];
NSLog(@"%@", decode);
// -> エンコードしたい文字列です

NSString *decodeUrl = [encodeUrl stringByRemovingPercentEncoding];
NSLog(@"%@", decodeUrl);
// -> https://ja.wikipedia.org/wiki/でんぱ組.inc
```

"stringByAddingPercentEncodingWithAllowedCharacters"はiOS7から使えるメソッドで、一発でエンコードできました。

# 日本語を含むURLエンコード、デコード
これには致命的な問題があって、（当然ながら）URL全体をエンコードしてしまうときちんとしたURLとしては認識してくれないんですよね。

``https://ja.wikipedia.org/wiki/でんぱ組.inc`` の場合、"でんぱ組"のところだけエンコードしたい、という時ありますよね。
もちろん、":"や"/"などはそのままにして、日本語だけをエンコードしたい。

分割するのもいいんですが、なかなか大変でスパッとやりたい。

そういう時にはこのカテゴリを使うのが良さげ。

[Wevah/Punycode-Cocoa](https://github.com/Wevah/Punycode-Cocoa)

うまいことエンコードしてくれるカテゴリ。

``NSStringPunycodeAdditions.h/m ``をプロジェクトに追加して、importすればOK。

クエリーのエンコードはこんな風にきちんとしてくれます。

```objc:Objective-C
// エンコードしたい時は"encodedURLString"を使う
NSString *encodeOriginalUrl = @"https://ja.wikipedia.org/wiki/でんぱ組.inc";
NSString *encodeUrl = [encodeOriginalUrl encodedURLString];
NSLog(@"%@", encodeUrl);
// -> https://ja.wikipedia.org/wiki/%E3%81%A7%E3%82%93%E3%81%B1%E7%B5%84.inc
```

逆のデコードの場合はこちら。

```objc:Objective-C
// デコードしたい時は"decodedURLString"を使う
NSString *decodeUrl = [encodeUrl decodedURLString];
NSLog(@"%@", decodeUrl);
// -> https://ja.wikipedia.org/wiki/でんぱ組.inc
```

日本語ドメインにも対応していました。

```objc:Objective-C
NSString *encodeOriginalUrl = @"http://お名前.com";
NSString *encodeUrl = [encodeOriginalUrl encodedURLString];
NSLog(@"%@", encodeUrl);
// -> http://xn--t8jx73hngb.com

NSString *decodeUrl = [encodeUrl decodedURLString];
NSLog(@"%@", decodeUrl);
// -> http://お名前.com
```

※こちらの記事を参考に書いてみました
[日本語ドメイン or クエリ付きURLを変換する](http://qiita.com/ShingoFukuyama/items/37e83ee5892c6f4d0ab6)
postgresqlをさわるときに忘れがちなこと

#個人的なメモ・忘備録

久しぶりにPostgreSQL触ったらハマったのでメモ
忘れそうな事があったら追記していく予定

## ユーザ・データベースを作ったのにアプリからアクセス出来ない

```/var/lib/pgsql/data/pg_hba.conf
# "local" is for Unix domain socket connections only
#local   all             all                                     ident
local   all             all                                     md5
```
CakePHPのハッシュ化後のパスワードを取得するためのメモ

# はじめに

CakePHP2から別のフレームワークへ移行したい場合にログインパスワードを変換したい時など、CakePHPで構築したシステムと同様のハッシュ化後のログインパスワードを必要とする際のメモ

# 使い方

以下のコードを実行すると、ハッシュ化後のhogehogeの結果が出力されます。

```php
$cake_hashed_password = new cake_hashed_password;

$password = 'hogehoge';
$cake_hashed_password->salt     = 'abcdefghijklmnopqrstuvwxyz';

echo $cake_hashed_password->hash($password, null, true);
```

# コード

CakePHP2の/lib/Cake/Controller/Component/AuthComponent.phpを参考に作成
（というか、ほとんどそのまま）

```php
<?php
class cake_hashed_password {
	var $salt = null;

	public function hash($string, $type = null, $salt = false) {
			if (empty($type)) {
				$type = null;
			}
			$type = strtolower($type);

			if ($type === 'blowfish') {
				return $this->_crypt($string, $salt);
			}
			if ($salt) {
				if (!is_string($salt)) {
					$salt = $cake_hashed_password->salt;
				}
				$string = $salt . $string;
			}

			if (!$type || $type == 'sha1') {
				if (function_exists('sha1')) {
					return sha1($string);
				}
				$type = 'sha256';
			}

			if ($type == 'sha256' && function_exists('mhash')) {
				return bin2hex(mhash(MHASH_SHA256, $string));
			}

			if (function_exists('hash')) {
				return hash($type, $string);
			}
			return md5($string);
	}

	private function _salt($length = 22) {
			$salt = str_replace(
				array('+', '='),
				'.',
				base64_encode(sha1(uniqid($cake_hashed_password->salt, true), true))
			);
			return substr($salt, 0, $length);
	}

	private function _crypt($password, $salt = false) {
			if ($salt === false) {
				$salt = $this->_salt(22);
				$salt = vsprintf('$2a$%02d$%s', array(self::$hashCost, $salt));
			}

			if ($salt === true || strpos($salt, '$2a$') !== 0 || strlen($salt) < 29) {
				return '';
			}
			return crypt($password, $salt);
	}	


}
```
最新のるりまが読みたい

こんな経験無いですか?

1. Rubyの配列の大きさが知りたいなぁ
2. Google 「ruby 配列 大きさ」
3. 見つかる


    ![result.png](https://qiita-image-store.s3.amazonaws.com/0/16790/3e289746-124a-6ba6-4d75-657d1baa3695.png)


    ＿人人人人人人人人＿
    ＞　(Ruby 1.8.7)　＜
    ￣Y^Y^Y^Y^Y^Y^Y￣

古すぎます。https://www.ruby-lang.org/ja/news/2014/07/01/eol-for-1-8-7-and-1-9-2/ によると、2008年ですよ!

# というわけで

現在見ているるりま(Ruby リファレンスマニュアル)を最新に更新するスクリプトを作りました。これは、ブックマークレットとしても、GreaseMonkeyのスクリプトとしても使えます。

https://gist.github.com/long-long-float/c542e5232dfd297ab724

## ブックマークレット

上のREADMEを読んでください

## GreaseMonkey(Firefox)

上の`source.js`を貼りつけてください。実行するページ(`@include`)を`http://docs.ruby-lang.org/ja/*`にしてください。Chrome版でも同じだと思います。

勝手に最新版にしてくれるので便利ですが、古いのが読みたくなった時にいちいち無効化しないといけないのとブラウザバックしてもまた更新がかかるので抜け出せなくなります。

## 最新と言っといて

~~`VERSION`変数に更新するだけなのでクリスマスになったら手動で更新してください。~~

`latest`で最新のバージョンが閲覧できるようになったようなので、`VERSION`を`latest`にすればいちいち更新する必要が無くなります。
PySparkで学習済みのscikit-learnのモデルを使う

# やりたいこと

Sparkで機械学習といえばMLlibだけど、まだまだscikit-learnには機能面で劣っているように思えます。例えば、scikit-learnでは学習時に正例と負例の数が不均等な場合の補正とかできますが、mllibの1.5ではまだそのような機能はありません[^クラスラベル補正]。こんな時にメモリに乗る程度のデータで事前にscikit-learnで学習器を作成しておき、それをpysparkで大規模データの予測に使用できるとsklearnとsparkの両者のメリットが活かせるのではと思っています。


# Let's Try

## 方針

データをndarrayのRDDに変換し、RDDのmapで学習済みのモデルのpredictに渡せばいいのですが、そのままやると関数呼び出しのオーバーヘッドが大きそうなのである程度の大きさのバッチ単位で処理したいと思います。

## 事前準備

Anaconda等の`scikit-learn`が使えるPython環境を全てのsparkノードに同じパス(`/opt/anaconda`とか)に準備しておきます。spark-submitコマンドを実行する際に`PYSPARK_PYTHON=/opt/anaconda/bin/python3`を指定してあげればこのPythonが使用されます。

## 実装例

事前に学習モデルを作成。今回はRandomForestを使用。データは適当です。

```py
import numpy as np
from sklearn import ensemble

N = 1000
train_x = np.random.randn(N, 10)
train_y = np.random.binomial(1, 0.1, N)

model = ensemble.RandomForestClassifier(10, class_weight="balanced").fit(train_x, train_y)
```

で、これをPySparkで以下のように使用します。

```py
from pyspark import SparkContext
sc = SparkContext()

test_x = np.random.randn(N * 100, 10)
n_partitions = 10
rdd = sc.parallelize(test_x, n_partitions).zipWithIndex()

# Point 1
def batch(xs):
    yield list(xs)

batch_rdd = rdd.mapPartitions(batch)

# Point 2
b_model = sc.broadcast(model)

def split_id_and_data(xs):
    xs = list(xs)
    data = [x[0] for x in xs]
    ids = [x[1] for x in xs]
    return data, ids

# Point 3
result_rdd = batch_rdd.map(split_id_and_data) \
    .flatMap(lambda x: zip(x[1], b_model.value.predict(x[0])))

for _id, pred in result_rdd.take(10):
    print(_id, pred)

sc.stop()
```

ポイントは次の３点です

1. mapPartitionsを使用して`RDD[ndarray]`を`RDD[list[ndarray]]`に変換しておきます。こうすることである程度の塊のデータを`model.predict`にまとめて渡せます。
2. 学習済みモデルをbroadcastしておきます。
3. idsとdataを分離し、dataを`b_model.value.predict`に渡します。これとidsを再度zipしてflatMapに入れてあげれば完成

(2016-01-26 追記)
partitionないでlistにまとめる

```py
# Point 1
def batch(xs):
    yield list(xs)

batch_rdd = rdd.mapPartitions(batch)
```

の部分は元々`glom`というメソッドが用意されていました。

```py
batch_rdd = rdd.glom()
```

(2016-01-26 追記その2)

DStreamにも`glom`と`flatMap`メソッドはあるのでSparkStreamingの場合も全く同様に使用できます。SVMで異常検出の学習器を作っておき、ストリーミングデータに対してリアルタイムで適用すると言ったこともできそうです。


[^クラスラベル補正]: 一応JIRAには要望が挙がっていてそろそろ実装されたかもしれませんが、CDH5.5ではsparkが1.5なので使えません。
[Xcode] iOSアップデート後に古いバージョンのXcodeでビルドする

2016/1/22
# iOS9.2.1にアップデートしたらXcode6.4で認識されなくなった :scream: 
**Could not find Developer Disk Image**というWarning...
<img width="422" alt="20151209194339.png" src="https://qiita-image-store.s3.amazonaws.com/0/100514/a77eee5a-9a05-8be9-35e3-08ad2cc45404.png">
デバイスが認識されない為、ついさっきまでできていた実機ビルドができない

# 原因はDiskImageがない
Warningのまんま。
Xcodeのパッケージ内のDeviceSupportファイルにDeveloperDiskImage.dmg
がないことが原因

# XcodeのVersionを上げる解決策
XcodeをUpdateすればDiskImageが対応するので解決します。

# XcodeVersionを解決策
プロジェクトなどの関係で、XcodeVersionはそのままにしておきたいのでDiskImageを追加する。

![スクリーンショット 2016-01-22 17.03.55.png](https://qiita-image-store.s3.amazonaws.com/0/100514/e7c2391f-463d-6f9d-4de8-028d31ee1fcb.png)
上の画像はXcode7.2のパッケージ内なので、ios9.0~9.2があるが、
Xcode6.4のパッケージ内には存在しない。
ファイルをコピーしてXcode6.4のパッケージ内に入れて、Xcode再起動。

問題なく実行できるようになった :tada:
Python + mecab をyum のみで入れる、3つのステップ

#　mecabをpythonスクリプトから使う

※ Amazon-Linux CentOS7　をお使いの皆様へ　2016年1月現在、EC2(Centos7系)　yum で　mecab と mecab-python をエラーなしでいれる最速パターンです
- (sudo yum install python python-pip )　※すでにあると思われるのでry


> sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-> 1.noarch.rpm
> sudo yum install mecab mecab-devel mecab-ipadic -y
> sudo pip install https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz


```py:mecab.py
# coding: utf-8

import MeCab
m = MeCab.Tagger ("-Ochasen")
print m.parse ("ご機嫌はいかがでしょうか")

```
> python mecab.py


結果:
`
ご      ゴ      ご      接頭詞-名詞接続
機嫌    キゲン  機嫌    名詞-一般
は      ハ      は      助詞-係助詞
いかが  イカガ  いかが  名詞-形容動詞語幹
でしょ  デショ  です    助動詞  特殊・デス      未然形
う      ウ      う      助動詞  不変化型        基本形
か      カ      か      助詞-副助詞／並立助詞／終助詞
EOS
`

以上。

- mecab-devel がないと、pip install mecab　で　mecab-configないってエラーがでる。

- mecab-ipadic は辞書ファイル。gccのコンパイルエラーとかmake とかヤダん、yum だけって人は黙って3つともいれとく。
NetCDF install

***NetCDF_setup***
--- 
NetCDF C インストール
1. 用意するもの（netcdf-4.3.3.tar.gz）
○入手先　http://www.unidata.ucar.edu/software/netcdf/
○Download: NetCDF-Fortran Relaeses: 
　・The Latest Stable netCDF-Fortran Release, tar.gz form 
　・The netCDF-Fortran 4.4.2 release is the latest stable release, netcdf-fortran-4.4.2.tar.gz.
2. 展開する。
○tar -xzvf netcdf.tar できたdirectoryに移動する。
3. 環境変数の設定をする。
○export FC=ifort
○export F90=ifort
○export FFLAGS="-O -mp"
○export CPPFLAGS="-DNDEBUG -DpgiFortran"
4. configureを実行する。***/home/liu/netcdf/netcdf-4.3.3_test***はインストール場所。
○./configure --prefix=/home/liu/netcdf/netcdf-4.3.3_test
5. makeでインストールする。
○make
○mkdir /home/liu/netcdf/netcdf-4.3.3_test
○make install
6.環境変数の設定をする。（***LD_LIBRARY_PATHが未設定の場合***）
○export LD_LIBRARY_PATH=/home/liu/netcdf/netcdf-4.3.3_test/lib

---
NetCDF-Fortran (v4.4.2)をコンパイル、/home/liu/netcdf/netcdf4/以下にインストール
1. シンボリックリンクを張る
○ ln -s /home/liu/netcdf/netcdf-4.3.3_test  /home/liu/netcdf/netcdf4
2. 展開する。
○tar xzf netcdf-fortran-4.4.2.tar.gz
○cd netcdf-fortran-4.4.2
○CPPFLAGS="-I/home/liu/netcdf/netcdf-4.3.3_test/include" LDFLAGS="-L/home/liu/netcdf/netcdf-4.3.3_test/lib"
○./configure --prefix=/home/liu/netcdf/netcdf4
○make >& log_make.txt
○make check >& log_make_check.txt
○make install
Python でmessagepackを作ったり、読んだりする


```lang:sh

   sudo yum install python-pip -y

   sudo pip install msgpack-python msgpack-tool

```

test.csv : 空白区切りのCSVファイル
test.pack : 浮動小数点型として作成されたpack作成

```lang:packer.py

import csv
import msgpack

infile = csv.reader(open('test.csv', 'rb'), delimiter=' ')
outfile = open('test.pack','w')
packer = msgpack.Packer()
for row in infile:
    outfile.write(packer.pack(map(float,row)))

```

標準入力でパイプしてpackファイルの中身をunpackしてみる

` zcat test.pack.gz | unpacker.py `


```lang:unpacker.py

import sys
import msgpack

BUF_SIZE = 64*1024
unpacker = msgpack.Unpacker()
while True:
    buf = sys.stdin.read(BUF_SIZE)
    if not buf:
        break
    unpacker.feed(buf)
    for obj in unpacker:
        print( obj )

```
URLから読み込んだ内容をStream APIで処理

たとえば```http://www.yahoo.co.jp```とかの文字列からHTMLを読み込んで来て、Stream APIで処理をしたい場合。

1. URLからInputStream
2. InputStreamからBufferedReader
3. BufferedReader#linesでStream<String>を取得

以下のコードはforEachしてるだけだけど、お好みで適当な処理を追加すればおｋ

```java
	public static void main(String[] args) throws MalformedURLException, IOException {
		URL url = new URL("http://www.yahoo.co.jp");
		try (
			InputStream in = url.openStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(in));) {
			reader.lines().forEach(System.out::println);
		}
	}
```
考察 > 暗号化方法変更時に新しい暗号化に切り替えるには

**(追記 2017/08/30): 「復号化」から「復号」に訂正しました。**

```txt:対象環境
Windows 7/8.1/10
```

パスワードの暗号化の機能を実装している中でふと思ったのが「その暗号化いつまで安全なの？」ということ。

そして、使っている暗号化が安全ではなくなったとわかった時点の対応（ソフトバージョンアップ時）にユーザ側でバージョンアップ後に問題なく使い続けるにはどうしておくのがいいのか。

1. バージョンアップ時に一度パスワードをクリア
  - 短所: バージョンアップ時にパスワード設定忘れを生じる可能性あり、その結果として本来の機能使用に失敗する
  - 備考: (2番目に記載の)バージョンがない場合は、「どの暗号化を使ったのか」わからないためこちらを実施することになる
2. パスワード暗号化のバージョニングを行う
  - 長所: 古い暗号化から乗り変え時には、暗号のバージョンを確認して復号し、新しいバージョンの暗号化を使って保存しなおす
  - 長所: 複数回の暗号化変更にも対応できそう
  - 短所: 暗号化バージョンという項目を別途保持する必要が出てくる

考えることは、複数バージョンのデータを扱えるソフトの作成と同じなのだろう。

今のうちにこういう仕組みを作っておくことで、将来の仕事を減らせると思う。

あとは、暗号化方法が漏洩した時にそれだけで復号されることがないような仕組みを追加で考えておくことは大事だと思う。
node.jsでお手軽にmuninプラグインを作ってみる

# はじめに

node.jsとmuninはどちらもお手軽で相性がいいとおもったのでmuninプラグインを作るフレームワークを作ってみました。

## インストール

```
npm i munin-plugin
```

## プログラムの流れ

プラグインつくるうえでやることは二つだけです

* データの取得
* データをmuninの形式に変換

## メモリ情報を取得するサンプル

```/opt/munin-plugin/meminfo.js
#!/usr/bin/node
'use strict'

const fs = require('fs');
const munin = require('munin-plugin');

const getMemInfo = () => {
    return fs.readFileSync('/proc/meminfo', 'utf8').
        split('\n').
        filter(data => data !== '').
        map(data => data.split(':').map(data => data.trim().split(' '))).
        reduce((r,v) => {
            let data = v[1];
            r[v[0]] = { value : data[0], unit : (data.length === 1 ? '' : data[1]) }
            return r
        }, {})
}

const main = () => {
    let info = getMemInfo();
    munin.create([
        () => {
            let g = new munin.Graph('linux memory detail','kbyte','system');
            g.add(new munin.Model.Default('active').setValue(info['Active'].value));
            g.add(new munin.Model.Default('cache').setValue(info['Cached'].value));
            g.add(new munin.Model.Default('buffer').setValue(info['Buffers'].value));
            g.sortLabel();
            return g;
        },
        () => {
            let g = new munin.Graph('linux free memory','kbyte','system');
            g.add(new munin.Model.Default('free').setValue(info['MemFree'].value));
            g.sortLabel();
            return g;
        }
    ].map(f => f()));
}
main();
```

### 実行権限をつけます

```
chmod 755 /opt/munin-plugin/meminfo.js
```


### デバッグする

以下のような形に出力されれば完成

```
$ ./meminfo.js
multigraph linux_memory_detail
active.value 565380
buffer.value 148280
cache.value 342548
multigraph linux_free_memory
free.value 167124
```

```meminfo.js
$ ./meminfo.js config
multigraph linux_memory_detail
graph_title linux memory detail
graph_vlabel kbyte
graph_category system
graph_scale no
graph_info 
graph_args 
active.label active
active.draw LINE2
active.type GAUGE
buffer.label buffer
buffer.draw LINE2
buffer.type GAUGE
cache.label cache
cache.draw LINE2
cache.type GAUGE
multigraph linux_free_memory
graph_title linux free memory
graph_vlabel kbyte
graph_category system
graph_scale no
graph_info 
graph_args 
free.label free
free.draw LINE2
free.type GAUGE
```

### 作ったプラグインをmunin-nodeに認識させる

```
ln -s /opt/munin-plugin/meminfo.js /etc/munin/plugins/meminfo
```

### グラフに描画

こんな感じに出力されます

![linux_memory_detail-day.png](https://qiita-image-store.s3.amazonaws.com/0/9834/2280106b-2dfb-5d47-30b5-f119487eb1a1.png)

![linux_free_memory-day.png](https://qiita-image-store.s3.amazonaws.com/0/9834/c6508085-0dee-a014-dd45-1b01ddca2713.png)

# その他

サンプルとしてnetstatの詳細版もあります

```
npm i -g munin-netstat-detail
```
Ansible2.0.0.2で'NoneType' object has no attribute 'send_callback'で--list-tasksが止まったので修正した

2系が出たし、そろそろAnsibleを触ってみるかとチュートリアルをやっていたら、'NoneType' object has no attribute 'send_callback'という例外で止まったので、ちょっとだけ調べてみました。

ちなみに試しているチュートリアルはこちらです。
(http://yteraoka.github.io/ansible-tutorial/)

引っかかったのは、6.Best Practicesに沿った構成を真似るのタスク一覧の確認の部分。

```
$ ansible --version
ansible 2.0.0.2
  config file = /home/vagrant/ansible/ansible.cfg
  configured module search path = Default w/o overrides

$ ansible-playbook --list-tasks -i test_servers site.yml
Unexpected Exception: 'NoneType' object has no attribute 'send_callback'
to see the full traceback, use -vvv

# -vvvオプションで例外の詳細を出してみる
$ ansible-playbook --list-tasks -i test_servers site.yml -vvv
2 plays in site.yml
Unexpected Exception: 'NoneType' object has no attribute 'send_callback'
the full traceback was:

Traceback (most recent call last):
  File "/home/vagrant/.pyenv/versions/ansible2/bin/ansible-playbook", line 85, in <module>
    sys.exit(cli.run())
  File "/home/vagrant/.pyenv/versions/2.7.10/envs/ansible2/lib/python2.7/site-packages/ansible/cli/playbook.py", line 150, in run
    results = pbex.run()
  File "/home/vagrant/.pyenv/versions/2.7.10/envs/ansible2/lib/python2.7/site-packages/ansible/executor/playbook_executor.py", line 115, in run
    self._tqm.send_callback('v2_playbook_on_vars_prompt', vname, private, prompt, encrypt, confirm, salt_size, salt, default)
AttributeError: 'NoneType' object has no attribute 'send_callback'
```

playbook_executor.pyの115行目で落ちているらしいです。
ググるとすぐにissuesが見つかりました。
https://github.com/ansible/ansible/issues/12682

どうやら、checkか--list-系のオプションをつけると落ちるらしいです。

修正は、こちらを参考に行いました。
https://github.com/ansible/ansible/commit/76feba00c4724e930c8c6fc7eba7e4a29c86cc3c

修正後、実行するとタスク一覧が無事表示されました。
(でも、なんかチュートリアルのサイトの表示とは大きく違うような・・・。2系だからか、gitからファイル取ってこずに手書きしたから、間違ったか・・・)

```
$ ansible-playbook --list-tasks -i test_servers site.yml -vvv
Using /home/vagrant/ansible/ansible.cfg as config file
2 plays in site.yml

playbook: site.yml

  play #1 (all): 	TAGS: []
    tasks:
      include	TAGS: []
      include	TAGS: []
      include	TAGS: []
      include	TAGS: []

  play #2 (wordpress): 	TAGS: []
    tasks:
```

メジャーアップデート後は、こういった不具合も出るもんなんですね。
stable-2.0ブランチには取り込まれているので、すぐに修正版が出そうな気はしますが、投稿したことなかったんで、作業メモ的な感じで投稿してみました。
Apache - Apache2.4でエラー「Unknown Authn provider: ldap」が出たときの対応手順


Apache2.4でOpenLdapと連携させる時に以下のエラーがでて結構苦労したのでメモ

#### 環境

* OS:Ubuntu 14.04.1 LTS

#### エラーメッセージ

```
AH00526: Syntax error on line 8 of /etc/apache2/mods-enabled/FILENAME:
Unknown Authn provider: ldap
Action 'configtest' failed.
```

#### 対応手順

```
sudo a2enmod ldap
sudo a2enmod authnz_ldap
```

#### 参考
http://makaaso.hatenablog.com/entry/2016/01/22/170220
Subversion - Subversion1.8.8 + Apache2.4.7 + OpenLDAP連携した環境構築


SubversionをAWS上に構築した時のメモ
今更ながらですが...

#### 環境

* OS:Ubuntu 14.04.2 LTS

#### 手順

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

```
sudo apt-get update
sudo apt-get install subversion subversion-tools libapache2-svn apache2-utils apache2 libapache2-modsecurity
```

##### 2.Apache設定変更

```
cat /etc/apache2/mods-available/dav_svn.conf
<Location /svn>
  # Subversion設定
  DAV svn
  SVNParentPath /svn
  # LDAP認証
  AuthType Basic
  AuthName "Subversion Repository"
  AuthBasicProvider ldap
  AuthLDAPUrl "ldap://ldap.example.com:389/ou=user,dc=example,dc=com"
  AuthLDAPBindDN  cn=admin,dc=example,dc=com
  AuthLDAPBindPassword Password
  Require valid-user
  LDAPReferrals Off
</Location>
```

##### 3.Subversionリポジトリ用ディレクトリ作成

```
chown -R /svn
```

##### 4.Subversionモジュール有効

```
sudo a2enmod dav_svn
```

##### 5.LDAPモジュール有効

```
sudo a2enmod ldap
sudo a2enmod authnz_ldap
```

#####  6.AH00558エラー対応

こちらを参考にしました
http://mk-55.hatenablog.com/entry/2014/07/07/004510

```
sudo echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf
sudo a2enconf fqdn
sudo service apache2 restart
```

#### 参考
http://makaaso.hatenablog.com/entry/2016/01/22/170116
GitHubアカウント作成とリポジトリの作成手順

新規にGitHubアカウントを作成し、リポジトリを作成するための手順です。

# 1. GitHubアカウントの作成
## 1-1. サイトへアクセス
[GitHub](https://github.com)のサイトにアクセスします。

## 1-2. 必要事項の入力
ユーザ名、メアド、パスワードを入力して「Sign up for Github」のボタンを押します。
![20160122_github-regist01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/e6ae5b0e-69cc-b29f-d5ee-bab2fdc2da67.png)

## 1-3. プランの選択
Freeプランが選択されているのを確認して「Finish sign up」のボタンを押します。
![20160122_github-regist02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/e52091b2-94eb-65e7-06d8-a4678d846c82.png)

## 1-4. 確認メール
登録したメールアドレスにGitHubから確認メールが来ます。
そのメール内にある「Verify email address」ボタンを押します。
![20160122_github-regist04.png](https://qiita-image-store.s3.amazonaws.com/0/82090/dda5bc7f-7039-aac4-5c15-972140365cd7.png)

## 1-5. 登録完了メール
「Welcome to GitHub!」というメールが届いたら登録が完了です。
![20160122_github-regist08.png](https://qiita-image-store.s3.amazonaws.com/0/82090/ada3aecd-1d22-b4b9-c8ca-458cfd1b10e7.png)


# 2. リポジトリの作成
## 2-1. ログイン
[GitHub](https://github.com)にログインします。

## 2-2. 新規リポジトリの作成①
「+ New repository」をクリックします。
![20160122_github-regist03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/1144cf43-4c43-179e-f06c-f80d6bd10ce2.png)

## 2-3. 新規リポジトリの作成②
リポジトリ名を入力して「Create repository」ボタンを押します。
![20160122_github-regist05.png](https://qiita-image-store.s3.amazonaws.com/0/82090/27012d17-a4ca-a869-c83c-dfffb34755d8.png)

## 2-4. 確認
作成が完了するとリポジトリのURLが表示されます。
![20160122_github-regist06.png](https://qiita-image-store.s3.amazonaws.com/0/82090/b123c18b-7f76-73a8-8769-c88f38f6c26b.png)


以上でGitHubのアカウントとリポジトリの作成が完了です。
gulp-sass, gulp-plumberを使うときの注意


gulp, gulp-sassでSassのコンパイルをwatchしようとしたら、アレ？ってなったのでメモ。

.scssファイルでコンパイルエラーとなるような内容を書くと、watchのプロセス毎落ちてしまうので、gulp-plumberで防御しようとした。
`.pipe(plumber())` の書き方だと一度エラーとなったあと、二度とコンパイルを行わないゾンビプロセスになってしまうという問題にぶち当たった。

以下のようにgulpfileを書いたところ解決。


```js:gulpfile.js
'use strict';

var gulp = require('gulp'),
    sass = require('gulp-sass'),
    plumber = require('gulp-plumber')
    ;

gulp.task('compile:sass', () => {
  return gulp.src('src/**/*.scss')
    .pipe(plumber({
      errorHandler: function(err) {
        console.log(err.messageFormatted);
        this.emit('end');
      }
    }))
    .pipe(sass())
    .pipe(gulp.dest('dist'))
  ;
});

gulp.task('watch', () => gulp.watch('src/**/*.scss', ['compile:sass']));
```

ポイントは`plumber` のオプションでerrorHandlerを書き換えてるとこ。

gulp, gulp-sass, gulp-plumberのサンプルコードは、結構出回ってるけど、あまり上の書き方を見かけないところを見ると、以前は発生しなかった問題なのかも。
JAVA ジェネリクス メモ

**<FONT color="#ff0000">ジェネリクス(generics)</font>**とは
汎用的(広く色々な方面に用いること)なクラスやメソッドを
特定の型に対応付けること。

![スクリーンショット 2016-01-22 13.33.13.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c4273f55-ad2a-8d99-ca53-831a1b9df683.png)

- [ ] ジェネリクスとは_____________________________________________________                            
- クラス宣言時には、EやKという「仮の型名」を使っておく  
- クラス利用時に、それをStringなどの「実際の型」に置き換えして利用する             
______________________________________________________________________

クラスが「インスタンスを生み出す原型」ならば
ジェネリクス利用クラスは「クラスを生み出す原型」



[参考にしたページ(こちらのページから重要な部分を抜粋しました)](http://so-zou.jp/software/tech/programming/java/generic/)

▪️Test107.java

```java
public class Test107 {
	public static void main(String[] args) {
		Generics<String> s;
		Generics<Integer> i;
		Generics<Hero> h;

		Generics g = new Generics();
		g.put(1234);
		g.put("Java");
		System.out.println(g.get());

		Generics<String> g2 = new Generics<String>();
		g2.put("Java2");
		System.out.println(g2.get());

		Generics<Integer> g3 = new Generics<Integer>();
		g3.put(12345);
		g3.put(6789);
		System.out.println(g3.get());

		Generics<Hero> h2 = new Generics<Hero>();
		Hero hero = new Hero();
		Hero hero2 = new Hero();
		h2.put(hero);
		h2.put(hero2);
		System.out.println(h2.get());

	}

}
```

▪️Generics.java

```java
//ジェネリクスを使ったGenericsクラス
//インスタンスを1つだけ格納できる
//どんな型のインスタンスでも格納できる
//格納するためのput()メソッド、
//取り出すためのput()メソッドがる
public class Generics<E> {
	private E data;

	public void put(E d) {
		this.data = d;
	}

	public E get() {
		return this.data;
	}

}
```

▪️Hero.java

```java
public class Hero {

}
```
[windows10]でファンクションキー機能を変更する方法

私は仕事でLenovoPC(windows10)を使っているのですが、ファンクションキーの機能がデフォルトでは、[Fn]+[ファンクションキー]というように、[Fn]キーと同時押しという直感操作がしにくいようになっていました。

これを、ファンクションキー単発で使えるように設定変更しようというものです。
ネットでいくつか見つかったものは、windows8やそれ以前のものが多く、windows10のものがなかったので、画像付きでなるべくわかりやすく書きます。

1. [スタート]->[設定]
![スクリーンショット (42).png](https://qiita-image-store.s3.amazonaws.com/0/32982/1bedfb7c-07ef-f8b7-82f9-3a5c1a37bfe7.png)

2. [更新とセキュリティ]
![スクリーンショット (39).png](https://qiita-image-store.s3.amazonaws.com/0/32982/0abd6695-c3fa-3743-69fd-e6fe96e6328e.png)

3. [回復]->[今すぐ再起動する]　(PCの起動をカスタマイズする)
![スクリーンショット (41).png](https://qiita-image-store.s3.amazonaws.com/0/32982/6b98d87e-c4af-5aa6-d3d4-e12108f73cdf.png)

4. [トラブルシューティング]
![IMG_7387.JPG](https://qiita-image-store.s3.amazonaws.com/0/32982/8014ec54-2228-9d58-a9ec-4fae378d0eb1.jpeg)

5. [詳細オプション]
![IMG_7388.JPG](https://qiita-image-store.s3.amazonaws.com/0/32982/d24a7b30-ba27-9eca-41dd-c5bcf44261fc.jpeg)

6. [UEFIファームウェアの設定]
![IMG_7389.JPG](https://qiita-image-store.s3.amazonaws.com/0/32982/55b8e5c4-2c1c-efda-28e4-31de34a2911f.jpeg)

7. [再起動]　(再起動してUEFIファームウェアの設定を変えます)
![IMG_7390.JPG](https://qiita-image-store.s3.amazonaws.com/0/32982/86b2ecec-85a5-9aff-0e9d-41dbf3fa46e6.jpeg)

8. configurationタブのHotkey Modeが[Enabled]になっているのを、[Disabled]に変更(変更方法はF5 or F6キーで可能。移動方法は矢印キー。設定変更後にF10キーで設定が反映されて再起動されます。)
![IMG_7391.JPG](https://qiita-image-store.s3.amazonaws.com/0/32982/88ce6e42-98fc-8cd7-adab-190e62d7dabc.jpeg)
![IMG_7392.JPG](https://qiita-image-store.s3.amazonaws.com/0/32982/340ce4d1-0097-dc83-fc83-bb78ad113fce.jpeg)

以上です。
快適なwindows10ライフを送りましょう！
fastlane の pem を使って一瞬で iOS 用の Push 通知 (Apple Push Notification Service) の証明書を作る

iOS でプッシュ通知通知をする場合、プッシュ通知用の証明書を作る必要があります。
恐らく最終的に hogehoge.p12という拡張子のファイルを作ることが多いと思います。

しかし、その証明書の作成方法はブラウザや mac の `キーチェーンアクセス` を行ったり来たりする必要があるので非常に面倒です。

[具体的にはここにあるような手順を踏む必要があります](http://qiita.com/takasan/items/2e9b1f7c3f78ea093195)

更にこの作業はリンク先にあるように証明書の期限が1年で切れるため毎年やる必要があります。

1年後だと確実に忘れていそうですよね。また、手順が複雑すぎて最初の1回目も手間取ると思います。

そこで今回はそんな面倒な手順をコマンド一発で終わらせる [fastlane](https://fastlane.tools/) の [pem](https://github.com/fastlane/pem) を紹介したいと思います。

### インストール

お手持ちの環境で `gem install pem` とやるとインストールできます。

[README.md](https://github.com/fastlane/pem) もご確認ください。

### 証明書の作り方

`pem` と実行するだけで Distribution 用の Push 通知の証明書を作ることができます。

メールアドレスやらパスワードやらを色々聞かれると思いますが、 正しく入力してください。

そうすると以下のスクショのように証明書のファイルが作られます。

![スクリーンショット_2016-01-22_16_20_50.png](https://qiita-image-store.s3.amazonaws.com/0/17704/fc11d411-8eb9-c608-f34d-1c2c9bbd5db4.png)

なお `pem --development` とやると development 用の証明書を作ることができます。

その他のオプションに関しては [README.md](https://github.com/fastlane/pem) をご確認ください。

### その他のスゴイ所

fastlane のプロジェクト構成に則ってプロジェクトが作られている場合は bundle identifier の入力などは行わずに証明書を作ることができます。

証明書の期限が切れそうな場合(残り30日)は再生成してくれます。

`pem --force` とやると強制的に再生成してくれます。

めっちゃ楽ですね。
【お試し】仮想デスクトップソフト「Desktops」を使ってみた

Windows10環境からは標準で仮想デスクトップを使うことができるが、
それ以前のOSバージョンでは使うことができない。

`Desktops` というフリーの仮想デスクトップソフトを発見したので、
使えるのかどうかを試してみた。

-

# 0.インストールファイルの準備

https://technet.microsoft.com/ja-jp/sysinternals/cc817881.aspx
上記リンクからインストールファイルをDL可能。

![kobito.1453429927.391326.png](https://qiita-image-store.s3.amazonaws.com/0/33479/aef2a0cb-fa60-08b5-607f-e79f8a923c83.png "kobito.1453429927.391326.png")


# 1.インストールしてみる

ZIPファイルを開くとこんな感じ。

![kobito.1453429983.490507.png](https://qiita-image-store.s3.amazonaws.com/0/33479/0384bdad-c71b-bbe1-7be4-3cce75d3e3d6.png "kobito.1453429983.490507.png")

アプリケーションファイルを実行してみる。

![kobito.1453430023.724856.png](https://qiita-image-store.s3.amazonaws.com/0/33479/2c23530b-9f77-eddc-8f88-09c307f620e6.png "kobito.1453430023.724856.png")

`Agree` を押下して進む。

![kobito.1453430071.527127.png](https://qiita-image-store.s3.amazonaws.com/0/33479/650b4f5e-8c44-6cd4-f042-fbe386b3ea80.png "kobito.1453430071.527127.png")

デフォルトのまま、 `OK` を押下する。

![kobito.1453430126.218778.png](https://qiita-image-store.s3.amazonaws.com/0/33479/86faf372-3796-00e2-25cc-aa190c8f29cf.png "kobito.1453430126.218778.png")

インストールできた。

-

# 2.使ってみる

最初は、デスクトップが1つしか存在しない。

![kobito.1453430200.301757.png](https://qiita-image-store.s3.amazonaws.com/0/33479/c5c7d6ec-49c8-be98-ea91-9c9495de29d7.png "kobito.1453430200.301757.png")

`Desktop 2` を作成してみる。

![kobito.1453430260.735755.png](https://qiita-image-store.s3.amazonaws.com/0/33479/608bb90d-c8f1-122c-16c0-73f6d4c5c406.png "kobito.1453430260.735755.png")


新規でデスクトップを作成した際に少し時間がかかるぽい。。。
実際にしばらく使ってみてみることにしよう。。。。

-

おわり。
Windows版SoX 14.4.2でmp3を読み込むとエラーが出る場合の対処法

## バージョン
私が使用したのは、SoXの公式サイト( http://sox.sourceforge.net/ )で配布されている、SoX 14.4.2 Win32インストーラーのバイナリー(sox-14.4.2-win32.exe)です。

## エラーの内容
mp3のファイルを読み込むと、以下の様なエラーが発生しました。

    C:¥>C:¥sox-14-4-2¥sox.exe --i "C:¥Users¥Public¥Music¥Sample Music¥Kalimba.mp3"
    C:¥sox-14-4-2¥sox.exe FAIL util: Unable to load MAD decoder library (libmad).
    C:¥sox-14-4-2¥sox.exe FAIL formats: can't open input file `C:¥Users¥Public¥Music¥Sample Music¥Kalimba.mp3':

## 対処法
このエラーは、mp3を読み込むために必要なライブラリが無いために発生しますので、次のように、そのライブラリをsox.exeがあるフォルダにコピーします。

以下の2つのdllをダウンロードします。
[libmad-0.dll](http://ossbuild.googlecode.com/svn/trunk/Shared/Build/Windows/Win32/bin/libmad-0.dll)
[libmp3lame-0.dll](http://ossbuild.googlecode.com/svn/trunk/Shared/Build/Windows/Win32/bin/libmp3lame-0.dll)

ダウンロードしたdllを、SoXをインストールしたフォルダ（私の場合はC:¥sox-14-4-2）にコピーもしくは移動します。

これでmp3を読み込むことができるようになります。

## 参照元
http://stackoverflow.com/questions/3537155/sox-fail-util-unable-to-load-mad-decoder-library-libmad-function-mad-stream
全てのディレクトリをzip化 & 元のディレクトリを削除

大量のディレクトリをzip化したり、解答したりする必要があったのでlinuxのコマンドをまとめました。
調べていくと初心者の僕にはコマンドの理解ができない場合が多かったのでそういう方のためにコマンドの解説も載せてみました。

##全ディレクトリをzip化し、元のディレクトリを削除

```linux
find . \! -name '*.zip' \! -name '.' -type d -exec zip {}.zip {} \; -exec rm -r {} \;
```

###解説

- find .  → 現在のディレクトリを参照
- \\! -name '*.zip' → xxx.zipというファイルを除く（!は否定で\でエスケープしている）
- \\! -name '.' -type d → 名前が.でディレクトリではないものは除く
- -exec コマンドを実行（\;まで）
    - {}にはfindしたものが入る
    - zip {}.zip {} → 通常のzipコマンド（zip 出力zip名 対象ディレクトリ名）
    - rm -r {} → 通常のrmコマンド

という感じです。

##全zipファイルを解凍し、元のファイルを削除
```linux
find . -name '*.zip' -exec unzip {} \; -exec rm -r {} \;
```

###解説

- find .  → 現在のディレクトリを参照
- -name '*.zip' → xxx.zipで始まるファイルを検索
- exec コマンドを実行（\;まで）
    - {}にはfindしたものが入る
    - unzip {} → 通常のunzipコマンド
    - rm -r {} → 通常のrmコマンド、ディレクトリを削除

という感じです！


linuxに関してまだまだ初心者なのでご指摘等ございましたらコメントをお願いいたします。