OmniAICreator/Qiita-1.07M huggingface dataset:
Apiaryで作成するAPIドキュメントをGitHubで管理する


# 概要
ApiaryでAPIドキュメントを作成した場合、そのドキュメント自体のバージョン管理をどうするか疑問でした。調べてみると、ApiaryにはGitHubと連携させることでドキュメントのバージョン管理を行う機能が用意されていたので、実際に試してみました。

# サンプルリポジトリの作成
[ApiarySmaple](https://github.com/horie1024/ApiarySample)というリポジトリを作成します。

![apiary_github_1.png](https://qiita-image-store.s3.amazonaws.com/0/43438/1c632b49-bcc4-2e14-9df9-aaa001f7f0fb.png "apiary_github_1.png")

# Apiaryでドキュメントを作成
Apirayで[サンプルドキュメント](http://docs.sampleapi86.apiary.io/)を作成します。

# GitHubと連携させる
ApiaryのメニューからSettingsを選択。

![apiary_github_2.png](https://qiita-image-store.s3.amazonaws.com/0/43438/4cf2da23-6cff-5a66-f807-fdbf4853c88e.png "apiary_github_2.png")

設定メニューの下部にGitHubとの連携についての説明が書いてあるので、「Connect to GitHub」をクリック。
今回はPublicでサンプルリポジトリを用意したので、 **Grant access to my private repositories as well.** にはチェックを付けません。

![apiary_github_3.png](https://qiita-image-store.s3.amazonaws.com/0/43438/c5bbba22-cd3d-fba3-e036-82afd90273b1.png "apiary_github_3.png")

# 対象となるリポジトリを選択
GitHubとの連携を行うと、以下のように設定メニュー下部にリポジトリを選択する画面が表示されるので、先ほど作成した[ApiarySmaple](https://github.com/horie1024/ApiarySample)を選択。

![apiary_github_4.png](https://qiita-image-store.s3.amazonaws.com/0/43438/429bfa8d-a575-ebea-8dbe-2354331bdae6.png "apiary_github_4.png")

選択をすると以下のようになります。

![apiary_github_5.png](https://qiita-image-store.s3.amazonaws.com/0/43438/435db75f-a589-e24b-e3aa-4d8c58579dbd.png "apiary_github_5.png")

# リポジトリへのAPI Blueprintファイルの追加
ApirayでAPIドキュメントを作成する場合、[API Blueprint](https://apiblueprint.org/)というMarkdownを拡張した言語で記述します。拡張子は`.apib`です。上記でリポジトリを選択すると、[ApiarySmaple](https://github.com/horie1024/ApiarySample)リポジトリに`apiary.apib`がApiaryからプッシュされ自動的に追加されます。このファイルは、Apiaryのエディタで編集したものと同一のものになります。

![apiary_github_6.png](https://qiita-image-store.s3.amazonaws.com/0/43438/ca917ce2-60dc-bf2b-582a-1ea8193c7180.png "apiary_github_6.png")

# APIドキュメントの更新
## ブラウザからの更新
Apiaryへアクセスし、エディタでAPIドキュメントを更新します。通常は「Save & Publish」になっている右上のボタンがGitHubと連携済みの場合「Save & Commit」に変化します。

![apiary_github_7.png](https://qiita-image-store.s3.amazonaws.com/0/43438/06dc6aea-357a-39e4-4386-70b0c5943806.png "apiary_github_7.png")

「Save & Commit」をクリックするとコミットメッセージの入力フォームが出てくるので、「test」と入力し、「Save and Push to GitHub」をクリックします。

![apiary_github_8.png](https://qiita-image-store.s3.amazonaws.com/0/43438/2b8bb032-87af-c716-dd1c-9a8ba7e90a7c.png "apiary_github_8.png")

GitHubを確認すると更新が反映されていることがわかります。

![apiary_github_9.png](https://qiita-image-store.s3.amazonaws.com/0/43438/1172ec26-7984-ca7d-42a0-0bac2eabb90e.png "apiary_github_9.png")

## ローカルでの更新
[ApiarySmaple](https://github.com/horie1024/ApiarySample)をcloneし、apiary.apibを編集します。

![apiary_github_10.png](https://qiita-image-store.s3.amazonaws.com/0/43438/238b2613-4139-f789-c269-1d4fd16ef9cb.png "apiary_github_10.png")

編集後コミットしGitHubへプッシュすると、ApiaryのAPIドキュメントに自動的に反映されます。

![apiary_github_11.png](https://qiita-image-store.s3.amazonaws.com/0/43438/24f1182a-e0be-c3d1-0ee6-c0e65c497357.png "apiary_github_11.png")

# まとめ
Apiaryで作成したAPIドキュメントをGitHubで管理することができました。さらに[Dredd](http://dredd.readthedocs.org/en/latest/)を使うことで、`.apib`ファイルを使用したAPIレスポンスのテストが出来ると考えられるので、引き続き調べようと思います。
HDFSに接続してみる



## Outline

HadoopのYARN上で色々なアプリを動かすことになったのでテスト環境を作ってみた。

今回はHDFSへのアクセスを、コマンドラインとJavaコードからの両方で実行してみる。

## 環境

### メインマシン

実際に動かしているハード。
WebUIなどの動作確認に使う。

### Client

OS: Ubuntu14.04 （AWS EC2）
Hadoop: 2.5.2
Java: 8

### HDFSクラスタ

別記事を参照。
ここではNamenodeの必要な設定のみ記す。

OS: Ubuntu14.04 （AWS EC2）
ユーザー: ubuntu
IP: PublicIP, PrivateIP
Hadoop: 2.5.2
port: 全開放（22, 80, 8020, 8032, 8088, 50070が開いてればたぶん大丈夫）

ClientとHDFSクラスタは同じsubnetにいる。

## 事前準備

以下、clientでの操作を基本とする。

### Clientへ各種インストール

```bash:terminal
# java
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
sudo apt-get install oracle-java8-installer -y

# Hadoop
# めんどくさいのでHomeにそのまま置く
wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/hadoop/common/hadoop-2.5.2/hadoop-2.5.2.tar.gz
tar zxvf hadoop-2.5.2.tar.gz
```


### 環境変数など設定

別記事の通りに、

- hadoop-env.sh
- /etc/profile
- core-site.xml
- hdfs-site.xml

を編集する。

### HDFS側でのアクセス許可

そのままではクライアントに編集権限はない。（hdfs側で作った同じユーザー名だったら接続できたりする？）
そのため、特定フォルダの編集権限を変える必要がある。

```bash:namenode_terminal
# 今回はtestDirというところを操作する。
./hadoop-2.5.2/bin/hdfs dfs -mkdir /testDir
./hadoop-2.5.2/bin/hdfs dfs -chmod -R 777 /testDir

```

## commandLine

コマンドはこちらを参照
http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/FileSystemShell.html

```bash:client_terminal
./hadoop-2.5.2/bin/hdfs dfs -put .bash_logout /testDir
```

こんな感じで通る。

確認は`-ls`でもいいし、WebUIから見てもいい。

## JavaCode

こちらに用意してみた。
https://github.com/uryyyyyyy/hadoopSample/tree/master/hdfsClient


```bash:client_terminal
# fatJarの生成
./activator assembly
# 実行
java -jar target/scala2.11/hdfsClient-assembly-1.0.jar hdfs://[PrivateIP]:8020/ /home/ubuntu/.profile /testDir/client.txt
```

で、該当フォルダを見るとファイルがアップロードされているはず。

### コード解説

```scala
def getFileSystem(hdfsUrl: String):FileSystem = {
		try {
			val conf = new Configuration(false)
			conf.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, hdfsUrl)
			conf.setInt(DFSConfigKeys.DFS_REPLICATION_KEY, 1)
			FileSystem.get(URI.create(hdfsUrl), conf)
		} catch {
			case e:IOException => e.printStackTrace(); throw new RuntimeException()
		}
	}
```

Configurationインスタンスを作り、それに設定を入れていく（普通はcore-site.xmlとかをそのまま読み込ませると思う）
それ以外は見たらわかると思う。


## ハマったところとか

### メインマシンからだと繋がらない。

```
put: File /testDir/client.md._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
```

clientからだと繋がるから、
・ユーザーの問題（cleintはubuntu, メインマシンは自分用のユーザー）
・IPの問題（clientはPrivateIPで指定、メインマシンはPublicIPで指定）
だと思うけど、メインマシンは色々いじってるから調査する気にはなれなかった。


### 接続に失敗すると制御が返ってこない。
client側のnamenodeの接続先を間違えるとか、namenode、datanode間の通信が上手く行かない時に発生する。

60000㍉秒待たされたり、ひたすら再接続しに行ったりして、その間止めることが出来なかったりする。。。どうしようもなければterminalごと落としてるけど、いい方法あるのかな？

### ファイル名はあるのにダウンロードできない
よく見ると該当ファイルの容量が0byteで中身が無かったりする。
これはnamenodeには届いたもののdatanodeに保存されなかった（replicationが足りないとか）の場合に起きるっぽい。

### No FileSystem for scheme: hdfs
色々試した際に、Jar実行時にこのエラーが出た。
Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
fatJarを生成した際にhadoopのLibraryが不十分でhdfsの実装がないのが原因。`hadoop-common` Libraryを入れると動くようになる。

## まとめ

HDFSの操作は普通のファイル操作と同じようにできるので覚えやすい。
R を使って Excel の表を Markdown の表形式に変換する #rstatsj

次のような Excel の表があるのだが、これを Markdown の表形式に変換したい。

![Excel_Markdown.png](https://qiita-image-store.s3.amazonaws.com/0/2570/18c4f122-d78c-7c8b-7124-ccff4844fa00.png)

R に管理されたい願望の強い[^1]皆さまに置かれましては、これをサクッと R で行えると嬉しいわけです。

[^1]: http://uribo.hatenablog.com/entry/2015/09/22/120815

これを行うには、Excel の表を選択&コピーして、次の 2 行を実行するだけです。

```r:R
data <- read.table("clipboard", header=TRUE, sep="\t")
knitr::kable(data, format = "markdown")
```

```:結果
|  A|  B|C        |
|--:|--:|:--------|
|  1|  9|hoge     |
|  2|  8|fuga     |
|  3|  7|piyo     |
|  4|  6|hogehoge |
|  5|  5|fugafuga |
```

クリップボードからデータを読み込み、`knitr` パッケージの `kable()` 関数を使って Markdown 形式に変換しています。

`knitr` パッケージはあらかじめインストールしておきましょう。

```r:R
install.packages("knitr")
```

Enjoy!
総称型の配列は信用できない

`Class<T>#getConstructors()` の戻り値が `Class<?>[]` になっていて、なんで `Class<T>[]` でないのか納得できないとつぶやいたら、 [@kotomacontact](https://twitter.com/kotomacontact/status/646263595030851584) さんや [@backpaper0](https://twitter.com/backpaper0/status/646272444945199104) さんに理由を教えていただいて勉強になったのでメモ。

Javadoc によると、

> このメソッドの戻り値の型はConstructor\<?>[]であり、予想されるConstructor\<T>[]ではないことに注意してください。この情報の少ない戻り値の型は、このメソッドから返されたあとで必要になり、<ins>この配列はさまざまなクラスのConstructorオブジェクトを保持するよう変更されることがあります。これは、Constructor\<T>[]の型保証に違反します。</ins>

[getConstructors() | Class (Java Platform SE 8 )](http://docs.oracle.com/javase/jp/8/docs/api/java/lang/Class.html#getConstructors--)

とのこと。

つまり、 `Constructor<T>[]` で受け取ったとしても、別の型の `Constructor` を配列に設定することができると言っている。
そして、それができるということは、総称型が約束しているはずの型安全性に反することになるので `Constructor<T>[]` で返すわけにはいかず、 `Constructor<?>[]` を返すようにしているとのこと。

具体的にどうやったら別の型の `Consturctor` を設定できるかは、以下の StackOverflow に例があった。

http://stackoverflow.com/questions/24511789/generic-type-in-getconstructors-in-class/24513534#24513534

`Constructor` を `List` にしてみると以下のような感じになる。

```java:Main.java
package sample;

import java.util.ArrayList;
import java.util.List;

public class Main {
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception {
        List<Hoge>[] hogeListArray = new ArrayList[1];
        
        List<? extends Base>[] baseListArray = hogeListArray;
        
        List<Fuga> fugaList = new ArrayList<Fuga>();
        fugaList.add(new Fuga());
        baseListArray[0] = fugaList; // 実体は List<Hoge>[] だけど、 List<Fuga> を設定できる！
        
        List<Hoge> hogeList = hogeListArray[0];
        Hoge hoge = hogeList.get(0); // List<Hoge> から get() してるのに ClassCastException！！
    }
    
    public static class Base {}
    public static class Hoge extends Base {}
    public static class Fuga extends Base {}
}
```

```text:実行結果
Exception in thread "main" java.lang.ClassCastException: sample.Main$Fuga cannot be cast to sample.Main$Hoge
	at sample.Main.main(Main.java:19)
```

まぁ、配列じゃなくて `List` を使えよ、ということですね（API は後方互換のため、変更は難しいのだろう）。
Swiftのドキュメントコメント

追記： Xcode 8なら、 [簡単にコメントのひな形を挿入できます](http://qiita.com/hironytic/items/9eea39862a842cc42ad3)よ。

---

Swiftのドキュメントコメントの書き方がXcode 7から（Swift 2から？）変わっているようなのでメモ

## Xcode 7での書き方

- Markdown形式
- パラメーターは `- parameter <パラメーター名>: <説明>`
- 戻り値は `- returns: <説明>`

##### 例

```swift
/// なんか **うまいこと** やるよ。
/// - parameter foo: 1つ目の引数。
/// - parameter bar: 2つ目の引数。
/// - returns: うまいことやったらtrueを返すよ。
func doSomething(foo: String, bar:Int) -> Bool {
    // do nothing :P
    return false
}
```

メソッド名の上でOption-クリックで確認

![xcode7.png](https://qiita-image-store.s3.amazonaws.com/0/33397/e785a477-1437-21eb-3c0a-205e11316bd5.png)



##### 参考にしたもの

- http://ericasadun.com/2015/06/14/swift-header-documentation-in-xcode-7/


## Xcode 6での書き方

- reStructuredText形式
- パラメーターは `:param: <パラメーター名> <説明>`
- 戻り値は `:returns: <説明>`

##### 例

```swift
/// なんか **うまいこと** やるよ。
///
/// :param: foo 1つ目の引数。
/// :param: bar 2つ目の引数。
/// :returns: うまいことやったらtrueを返すよ。
func doSomething(foo: String, bar:Int) -> Bool {
    // do nothing :P
    return false
}
```

メソッド名の上でOption-クリックで確認

![xcode6.png](https://qiita-image-store.s3.amazonaws.com/0/33397/612f1f17-6dab-98e6-32cd-c0aecda11381.png)


##### 参考にしたもの

- http://nshipster.com/swift-documentation/
Unity5.1をiOS用にビルドした後，Xcode7のビルドでlinker command  failed exit code 1が出たら


こういうエラーが出ました．
>You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

***

##Build Settingsの Enable Bitcodeを**No**にする

![スクリーンショット 2015-09-22 21.44.50.png](https://qiita-image-store.s3.amazonaws.com/0/32950/a60ccbf7-5bb1-f236-5ad3-a16c76208115.png)

#引用文献
[Unity5.1.1f UniRX iOS Xcode7 Build On iPhone6(ios8.1) 実機](http://whaison.jugem.jp/?eid=748)
[New warnings in iOS9 - stackoverflow](http://stackoverflow.com/questions/30848208/new-warnings-in-ios9)
grunt serve すると 「Cannot find where you keep your Bower packages.」と言われる

## 現象
```
user:grunt serve

Running "wiredep:app" (wiredep) task

Warning: Error: Cannot find where you keep your Bower packages. Use --force to continue.
```

## 経緯
Yeoman で AngularJS の雛形を作ったときのこと。

## 解決策
`.bowerrc` に書かれているディレクトリを作成する。
以下は自分の環境下での `.bowerrc` 。

```json:.bowerrc
{
  "directory": "bower_components"
}
```

`bower_components` ディレクトリを作成すれば解決。

ググると下の記事がタイトル通りでしたが、現象が違いました。
[grunt serve で Cannot find where you keep your Bower packages. がでたときの解決方法](http://qiita.com/pugiemonn/items/75efa4a1a0fb4387ef7e)
新しいPCを買ってやったこと

#Windows環境の構築
ASUSの[Zenbook UX305](http://kakaku.com/item/K0000743146/)を購入
Windows10に更新
##Windowsのコンパイル環境
[Visual Studio 2015 Community edition](https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs) をインストール。お好みでC++やMFCを追加で。
##php開発環境
netbeanとapacheを入れよう…とするとapacheのWindowsバイナリ配布終了。めんどくせえ。
###VMwareとUbuntuを入れる
[VMware Player](https://www.vmware.com/go/get-player-jp)を入れて[Ubuntu](https://www.ubuntulinux.jp/download)環境で開発することにする。
SSDが128GBなのでUbuntu環境は10GBくらいに設定。
無人インストーラーが大活躍するのでやることは少ない。
###Ubuntuにログイン
最低限、これだけは設定する
`$LANG=C xdg-user-dirs-gtk-update`
$USERディレクトリ以下の予約ディレクトリ名が全角になるので英語化しておく。
さもなくばコンソールでイライラする。
####お好み環境
`$sudo apt-get remove libreoffice*`
`$sudo apt-get remove thunderbird*`
自分はChromeを入れたあと、firefoxを消しました。
下記URLをブラウザでアクセスし、debファイルをダウンロード。その後パッケージマネージャ経由でインストール。
`http://www.google.com/intl/ja/chrome/browser/`

###netbeansを入れる
JDKを入れるところから
`$sudo apt-get install openjdk-8-jdk`

netbeansをダウンロード
`https://netbeans.org/downloads/`
上記URLにアクセスしブラウザからダウンロードする方が良い。
ターミナルから
`$chmod +x netbeans-8.0.2-php-linux.sh`
`$sudo sh netbeans-8.0.2-php-linux.sh`

###phpとxdebugを入れる
`$sudo apt-get install php5`
`$sudo apt-get install php5-xdebug`


###apacheの環境を設定
xdebugが動作するように設定
`$gksudo gedit /etc/php5/mods-available/xdebug.ini`

```xdebug.ini
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
```

今回は$HOME/public_html以下に書いたコードを置いてデバッグする。
[こちら](http://dbweb.0258.net/wiki.cgi?page=Ubuntu%A4%CEApache2%A4%C7%A5%E6%A1%BC%A5%B6dir%A4%F2%BB%C8%A4%A6)を参考に設定しよう。
`$gksudo gedit /etc/php5/mods-available/php5.conf`

```php5.conf
php_admin_flag engine on
```
`$sudo /usr/sbin/a2emod userdir`
`$sudo /etc/init.d/apache2 restart'

でオッケーです。
【Unity】Switch Platformを高速にする(初回起動も)

EditメニューからPreferencesを開き、GeneralのCompress Assets on Importのチェックをはずすだけです。


![general.png](https://qiita-image-store.s3.amazonaws.com/0/89022/dc863e16-dfac-abcf-5109-b998c868d3a7.png)

ここはアセットをインポートした時に圧縮するかの設定になります。
ビルドした際はちゃんと圧縮されるのでこの設定でROMサイズが大きくなるということはありません。

確認したバージョンはUnity 5.2.0f3です。3以前でも同じ動作になります。
Ubuntu 14.04 LTSにnokogiriインストール失敗する時

今回、新たな環境を構築中にrailsをインストールしようと思った矢先、nokogiriのインストールで躓いた。
今回の対象とする環境は以下の通り

|環境|ジージョン|
|:-----------:|:---------------|
|マシン       |AzureVM         |
|Linux       |Ubuntu 14.04 LTS|
|ruby        |ruby2.1.7       |


まず、目的の環境を作るためにはruby2.1.7をインストールする必要がある
初期状態のUbuntu 12.04 LTSの場合、1.6系列までしかapt-getで取得できないので、
aptレボジトリにbrightbox/ruby-ngを追加することで2系列のインストールが可能となります。

`$ sudo add-apt-repository -y ppa:brightbox/ruby-ng
$ sudo apt-get update
$ sudo apt-get -y install ruby2.1`

今回の主題通りnokogiriが失敗する要因としていろいろ入っていないことが要因なので、「いろいろ」をインストールする。

`$ sudo apt-get install build-essential ruby2.1-dev zlib1g-dev libxslt1-dev`

上記にて解決ができた。

オラの3時間返せー。鋸めぇぇぇってかbuild-essential入ってないとか…やっちまったなぁ。


参考URL
http://www.oiax.jp/rails/zakkan/apt-get-install-ruby2-1.html
http://www.nokogiri.org/tutorials/installing_nokogiri.html
仮想環境でhackを遊べるようにするメモ(nginx・HHVM)

## Ubuntu14.04を設定する
VagrantでUbuntu14.04を用意した。  
`vagrant ssh` 後以下を実行。

## 権限変更
```
$ sudo su
```


## nginxインストール
### nginxをインストールする
```
# sudo apt-get -y install nginx
```

### 確認
```
# nginx -v
```

## HHVMの設定
### インストール
```
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
sudo add-apt-repository "deb http://dl.hhvm.com/ubuntu $(lsb_release -sc) main"
sudo apt-get update
sudo apt-get install hhvm
```

## nginxの設定
### nginx設定ファイル編集
```
vi /etc/nginx/conf.d/hhvm.conf
```
#### 設定を記述  
```
server {
    listen       80;
    server_name  dev.com;

    location / {
      root /usr/share/nginx/html;
      index index.php index.html index.htm;

      # hh・php 設定
      #
      location ~ .(hh|php)$ {
          root /usr/share/nginx/html;
          fastcgi_keep_conn on;
          fastcgi_pass   127.0.0.1:9000;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include        fastcgi_params;
      }
      
    }

    # エラーページ設定 40x.html
    #
    error_page  404              /404.html;
    location = /40x.html {
        root   /usr/share/nginx/html;
    }

    # エラーページ設定 50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

```

### 起動
```
# /etc/init.d/nginx start
# /etc/init.d/nginx status
# update-rc.d nginx defaults
```
## hhvm起動
### 起動
```
# /etc/init.d/hhvm start
# sudo update-rc.d hhvm defaults
```


## テストファイルを作成して実行してみる。

### プロジェクトルートに`.hhconfig`ファイルを作成
#### 移動
```
# cd /usr/share/nginx/html
```
#### .hhconfig作成
```
# touch .hhconfig
```
#### テストファイル作成
```
# vi test.hh
```
```
<?hh
echo "こんにちは 世界";
```
#### 実行
```
# hhvm test.hh
```
Spark mllib 教師あり学習アルゴリズム精度測定 - linear classifier編


## 概要
spark mllibの

- SVM
- LogisticRegression
- NaiveBayes

の精度測定を、

- news20
- rcv1

に対して実施。その結果を記載する。

各アルゴリズムのパラメータ設定は

## Svm

- L2正則化のみ
- numIteration = 1000
- SGD, miniBatchFraction = 1.0
- regParam=c= 1.0* 10^-3 〜 1000まで測定

## LogisticRegression (LR)

- L2正則化のみ
- numIteration = 1000
- SGD, miniBatchFraction = 1.0
- regParam=c= 1.0* 10^-3 〜 10まで測定

## NaiveBayes (NB)

- lambda=1.0*10^-3 〜 1000

## 測定結果

news20 NB

| lambda | 正例F1値 | 正解率 |
|-----------:|------------:|------------:|
| 0.0001     |     0.975 | 0.975    |
| 0.001     |      0.974 | 0.974    |
| 0.01      |      0.973 | 0.972      |
| 0.1       |    0.967| 0.967    |
| 1.0    |     0.931 |  0.933   |
| 10.0    |     0.838 | 0.855    |


rcv1 NB

| lambda | 正例F1値 | 正解率 |
|-----------:|------------:|------------:|
| 0.0001     |     0.925 | 0.924    |
| 0.001     |      0.932 | 0.932    |
| 0.01      |      0.937 | 0.935      |
| 0.1       |    0.943| 0.941    |
| 1.0    |     0.941 |  0.939   |
| 10.0    |     0.932 | 0.931    |


rcv1 LR

| regParam | 正例F1値 | 正解率 |
|-----------:|------------:|------------:|
| 0.0001     |     0.924 | 0.922    |
| 0.001     |      0.924 | 0.922    |
| 0.01      |      0.924 | 0.922      |
| 0.1       |    0.924| 0.922    |
| 1.0    |     0.924 |  0.922   |
| 10.0    |     0.924 | 0.922    |
| 100.0    |    NaN |  0.481  |
| 1000.0    |    NaN | 0.481     |

rcv1 svm

| regParam | 正例F1値 | 正解率 |
|-----------:|------------:|------------:|
| 0.0001     |     0.924 | 0.922    |
| 0.001     |       0.924|   0.922       |
| 0.01      |        0.924 |   0.922        |
| 0.1       |      0.924| 0.922    |
| 1.0    |     0.924 |  0.922     |
| 10.0    |     0.924 |   0.922      |
| 100.0    |     NaN | 0.480    |
| 1000.0    |    NaN  | 0.480   |
2015-09-22 unity 5 > RS-232C受信成功 > ReadByte()を使えばいい

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

Unity5でRS-232C受信がうまくいってなかったが、成功する方法が見つかった。

参考になったのは以下のQA
[answers.unity3d](http://answers.unity3d.com/questions/1022086/reading-serial-data-in-unity-from-android-app.html)

要点は以下。
- ReadLine()はフリーズする
- ReadTimeout=1とした時、ReadByte()はフリーズしない

こちらで動作確認したコードは以下。

```rcvCS.cs
using System.Collections;
using System.IO.Ports;
using UnityEngine.UI;

public class rcvCS : MonoBehaviour {
	SerialPort sp = new SerialPort("COM3", 9600);

	public Text T_rcv;

	private string lastrcvd = "";

	void Start () {
		sp.Open ();
		sp.ReadTimeout = 1;
	}
	
	// Update is called once per frame
	void Update () {
		byte rcv;
		char tmp;
		try {
			rcv = (byte)sp.ReadByte();
			if (rcv != 255) {
				tmp = (char)rcv;
				lastrcvd = lastrcvd + tmp.ToString();
				T_rcv.text = lastrcvd;
			}
		}
		catch(System.Exception) {
		}
	}
}
```

COM4でhelloと入力した文字がCOM3で受信できた。

![Win8x64pro.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/e8d8626f-de40-f8a8-fdec-64516445df48.jpeg)


<hr>
以下は、Unity 5でのRS-232C受信について得た事項 (Unity 5.1.3f1で確認)

- ReadLine()はフリーズする
- Read()も複数文字受信ではフリーズする
- ReadTimeout=1とした時、ReadByte()はフリーズしない
- Coroutine, ThreadでやってもReadLine()を使う限り受信できない
- ByteToRead()はNullReference()が発生する
- 上記は（おそらく)Unity4では問題なかった (Unity4で成功例がいくつかある)
scalewayとaws ec2でunixbenchを比較してみた

## scalewayとは

scalewayというクラウドサービスがある。大きな特徴は「ARM core、ベアメタル」であるらしい。

scalewayの詳細はこちらにある。

http://qiita.com/3upjp/items/9f1234cd06ae90765105

特徴として、ベアメタルで、

* 4 Dedicated ARM Cores
* 2GB Memory

が利用可能だ。ラスベリーパイとのunix benchの比較はこちらにある。

http://qiita.com/tukiyo3/items/20b0ab5ef6ff44669f22

1ヶ月使い放題で5ドル程度なので、AWSと比較してどの程度の性能か調べてみた。
ただ、ヨーロッパのフランスにしかデータセンターは無いようで、日本からだと数百ms程度遅延がある(昔のアジアリージョンが無かった時のEC2みたい)。

## unixbenchでscaleway-c1,aws-ec2-4m.large,vmware i7を比較してみた。

scalewayとec2 m4.large 手元のvmware i7でどの程度性能が違うのか比較してみた。

unixbenchの使い方は下記を参照。

http://blog.kondoyoshiyuki.com/2014/05/17/unixbench/

scaleway c1をマルチコアでunixbenchが取れなかったので、明示的にコア数をしていて、```./Run -c4```で実行した。

||arm 1core|arm 4core|ec2 m4.large 1core|ec2 m4.large 2core|vmware i7 2cores|
|:-----------:|:------------:|:------------:|:-----------:|:-----------:|:-----------:|
|Dhrystone 2 using register variables|313.6|1254.1|2681.6|3188.2|6271.7|
|Double-Precision Whetstone|100.5|403|733.7|1246.8|1664.2|
|Execl Throughput|215.7|701|925.7|1495.4|850.1|
|File Copy 1024 bufsize 2000 maxblocks|271.4|428.1|2600.8|3050.5|2554.9|
|File Copy 256 bufsize 500 maxblocks|181.4|290|1655.5|1914.9|1675|
|File Copy 4096 bufsize 8000 maxblocks|488.6|892.8|5542.9|6391.8|4677.7|
|Pipe Throughput|157.1|534.5|1676.5|1968.7|1391.9|
|Pipe-based Context Switching|88.1|472.6|112.1|965.2|912.6|
|Process Creation|217|668.8|837.1|1404.3|1024.4|
|Shell Scripts (1 concurrent)|473.1|1166.7|2117.7|2433.2|2195.7|
|Shell Scripts (8 concurrent)|1007.7|1064.9|2382.3|2490.2|2621.5|
|System Call Overhead|444.7|1597.9|2287.6|3559.9|789.8|
|System Benchmarks Index Score|261.9|697.1|1439.2|2198.9|1785.6|

比較結果をグラフ化した。
vmwareの環境はSSDではなくふつうのHDDなので、演算性能は高いが、ファイル操作でもたついて、性能が伸びなかった。

![比較結果グラフ](https://i.gyazo.com/66257b347e27b81a73594122f00cfbd9.png)

sclaewayは、1coreだと非力だが、4core束ねると、m4の半分ぐらいになる。マルチコアで実力を発揮できるのかも知れない。
さくらのクラウドからクラウドDNSが出てたので、fog-sakuracloudにDNS操作を追加した


[クラウドDNS | さくらのクラウドニュース](http://cloud-news.sakura.ad.jp/cloud_dns/)

クラウド共用ライブラリの[fog](http://fog.io)に、なんだったかのイベント向けで作ったさくらのクラウド向け実装[fog-sakuracloud](https://github.com/fog/fog-sakuracloud)というGemを趣味で保守してます。
(当時目線で)世界のクラウド見本市のようなfog対応プロバイダ一覧に、日本のが無いなーという程度の理由で追加したはず。

## fogでクラウドDNS

この記事で、fog-sakuracloudはv1.3.1です。クラウドDNSが無料のうちに追加しました。

### ゾーン一覧

クラウドDNSは必要な操作が少ないので、fogでまあまあ楽に管理できますね。

```Ruby:
require 'fog/sakuracloud'

## FogのDNSサービスを初期化
dns = Fog::DNS::SakuraCloud.new(
  :sakuracloud_api_token => 'YOUR_API_TOKEN',
  :sakuracloud_api_token_secret => 'YOUR_TOKEN_SECRET'
)

----

## ゾーン一覧を取得
> dns.zones

=> [  <Fog::DNS::SakuraCloud::Zone
    id="112700801016",
    name="sawanoboly4.net",
    description=nil,
    status={"Zone"=>"sawanoboly4.net", "NS"=>["ns1.gslb2.sakura.ne.jp", "ns2.gslb2.sakura.ne.jp"]},
    settings={"DNS"=>{"ResourceRecordSets"=>nil}},
    tags=[]
  >,
   <Fog::DNS::SakuraCloud::Zone
    id="112700801019",
    name="sawanoboly5.net",
    description=nil,
    status={"Zone"=>"sawanoboly5.net", "NS"=>["ns1.gslb2.sakura.ne.jp", "ns2.gslb2.sakura.ne.jp"]},
    settings={"DNS"=>{"ResourceRecordSets"=>nil}},
    tags=[]
  >]

```

(このstatusやsettingsのネスト、fogではわりと邪魔なので、ホンマに階層いるんかいなと思いつつ。。)ゾーン一覧が取れました。

### ゾーン単品取得して、更新

zonesはArrayなので、selectやらfindも使えます。一応getでID指定できるのでそれで単品を取得します。

```Ruby:
> zone = dns.zones.get('112700801016')
=>   <Fog::DNS::SakuraCloud::Zone
    id="112700801016",
    name="sawanoboly4.net",
    description=nil,
    status={"Zone"=>"sawanoboly4.net", "NS"=>["ns1.gslb2.sakura.ne.jp", "ns2.gslb2.sakura.ne.jp"]},
    settings={"DNS"=>{"ResourceRecordSets"=>nil}},
    tags=[]
  >
```

ZoneやNS、ResourceRecordSetsにはちょっと便利なゲッターが使えます。

```
> zone.zone
=> "sawanoboly4.net"

> zone.nameservers
=> ["ns1.gslb2.sakura.ne.jp", "ns2.gslb2.sakura.ne.jp"]
```

ではResourceRecordSetsを登録してみましょ。

```Ruby:
> zone.rr_sets = [{"Name"=>"mail", "Type"=>"A", "RData"=>"192.168.1.5"}]
=> [{"Name"=>"mail", "Type"=>"A", "RData"=>"192.168.1.5"}]

> zone.save
[fog][WARNING] Update DNS Zone 112700801016
=> true
```

設定が保存できているか確認します。

```Ruby:
> zone.reload # reloadはAPIから再取得。
=>   <Fog::DNS::SakuraCloud::Zone
    id="112700801016",
    name="sawanoboly4.net",
    description=nil,
    status={"Zone"=>"sawanoboly4.net", "NS"=>["ns1.gslb2.sakura.ne.jp", "ns2.gslb2.sakura.ne.jp"]},
    settings={"DNS"=>{"ResourceRecordSets"=>[{"Name"=>"mail", "Type"=>"A", "RData"=>"192.168.1.5"}]}},
    tags=[]
  >
```


rr_setの変更用ヘルパーは`Zone#rr_sets=`しか実装していないので、Arrayらしく操作するなら`settings['DNS']['ResourceRecordSets']`を直接触ってOK。

```Ruby:
> zone.settings['DNS']['ResourceRecordSets'] << {"Name"=>"www", "Type"=>"A", "RData"=>"192.168.1.2"}
=> [{"Name"=>"mail", "Type"=>"A", "RData"=>"192.168.1.5"}, {"Name"=>"www", "Type"=>"A", "RData"=>"192.168.1.2"}]

> zone.save
[fog][WARNING] Update DNS Zone 112700801016
=> true
```


その他の操作は[fogサイト](http://fog.io/about/provider_documentation.html)のDocumentationにまとめるようにしています。
jinja2備忘録


#基本
サンプルのまんま

```python:
>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')
>>> template.render(name='John Doe')
u'Hello John Doe!'
```

or renderに `{'name': 'John Doe'}`

#for loop
ipythonで

```python:
from jinja2 import Template

str_temp = """
<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
  <li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
"""[1:-1]

template = Template(str_temp)
data = [ { 'url': 'imaoka.click', 'username': 'imaoka'} ]
template.render(users=data)

> u'<title></title>\n<ul>\n\n  <li><a href="gimaoka.click">imaoka</a></li>\n\n</ul>'

```
`{% block}` は無視
`user` ではなく `users`
data.append({'url': 'hogehoge' ...
などで追加して試してみる
# エスケープ
`{#` とかシェルスクリプトでよく使うけどだめ
`{{ '問題の箇所' }}` 
みたいな感じでエスケープできる
http://qiita.com/swfz/items/63b3036a44829f201001

# block
テンプレート継承に使うらしい
いずれ書く
[GAE/Java] 非同期APIでQueueにAddしたTaskが消える問題（未解決）

Google App Engine(GAE)/Javaで、TaskQueueの非同期APIをトランザクション指定して呼び出したのにTaskのAddが消失する（Addされない）、という現象に遭遇しました。

GAEではDatastoreの弱いトランザクション機能をカバーする為に無限リトライするTaskQueueを併用して結果整合性を担保する、みたいなことをよくやるのですが、これでは結果整合性を保つ事ができません( ・᷄ὢ・᷅ )

仕様なのか、それともコードに問題があるのかもまだ分かっていません。識者が目をとめてくれることを期待して記事にしておきます。

## コード

そのままデプロイできるプロジェクトをgithubに置いてます。
https://github.com/knightso/asynctqtest

```TestServlet.java
AsyncDatastoreService datastore = DatastoreServiceFactory
		.getAsyncDatastoreService();

List<Future<?>> futures = new ArrayList<Future<?>>();
for (int i = 0; i < 10; i++) {
	Transaction tx = null;
	try {
		tx = datastore.beginTransaction().get();
		
		String keyName = UUID.randomUUID().toString();
		Entity entity = new Entity("Task", keyName);
		entity.setProperty("status", "pending");
		entity.setProperty("createdAt", new Date());
		datastore.put(tx, entity);

		Queue queue = QueueFactory.getDefaultQueue();
		queue.addAsync(
				tx,
				TaskOptions.Builder.withUrl("/task")
						.param("key", keyName).method(Method.GET));

		futures.add(tx.commitAsync());
	} catch (Throwable t) {
		logger.severe("error: " + t.getMessage());
		t.printStackTrace();
		if (tx != null && tx.isActive()) {
			tx.rollback();
		}
		if (t instanceof RuntimeException) {
			throw (RuntimeException) t;
		}
		throw new IllegalStateException(t);
	}
}

for (Future<?> f : futures) {
	try {
		f.get();
	} catch (InterruptedException | ExecutionException e) {
		throw new IllegalStateException(e);
	}
}
```

問題の箇所↓

```TestServlet.java
		Queue queue = QueueFactory.getDefaultQueue();
		queue.addAsync(
				tx,
				TaskOptions.Builder.withUrl("/task")
						.param("key", keyName).method(Method.GET));
```

ループ内でそれぞれDatastoreに"Task"というKindのエンティティを一件保存、さらにTaskQueueにTaskを一件保存しています。

Datastore、TaskQueueどちらのAPIも非同期版を使用していますが、Futureを処理しておらず、トランザクションのcommitAsyncの結果Futureをあとでまとめて同期とってます。

## 期待する挙動

各ループ内でトランザクション指定してDatastoreへのput、TaskQueueへのAddをしているので、どちらかが失敗した場合はロールバックかかることを期待しています。

## 実際

Datastoreのエンティティだけputされ、TaskがAddされないケースが何度か(10回ループ中3〜5回)発生します。
エラーもおきません。

![asynctq_problem_tqlist.png](https://qiita-image-store.s3.amazonaws.com/0/31437/b7275157-2902-60a9-cdd2-41f327441923.png)

Run in Last Minuteが10にならないといけないのに5になっています。ログを見てもTQ経由で呼び出されるはずのServletは5回しか呼び出されていません。

## 疑問

TaskQueueの非同期APIはFuture#getして同期を取って上げないと結果が保証されないのでしょうか。

ドキュメント
https://cloud.google.com/appengine/docs/java/datastore/async#Working_with_Async_Transactions
を見ると、"When you are using a transaction, calling Transaction.commit() blocks on the result of all async calls made since the transaction started before committing it" と書かれていて、何度かテストした限りでは確かにDatastoreの非同期APIは同期を取らなくてもちゃんと保存されていました。この記述はTaskQueue APIには当てはまらないのでしょうか。

## （とりあえずの）対策

TaskQueue APIだけ同期版に変更したところ、無事に全てのタスクがAddされるようになりました。
でもその部分で平行処理が失われてしまうのでとても残念( ・᷄ὢ・᷅ )

## ちなみに蛇足ですが・・

GAE/Goではgoroutine+channelを使ってトランザクションごとまるっと並行処理できるので、上記の問題はおきません（｀・ω・´）ﾄﾞﾔ

あ、GAE/JavaでもThread使えるか。。でもThread自体が重すぎてあまり魅力を感じない。。
cgoでMacのスリープログを勝手にとって作業時間の可視化してみた


2016/9/2編集 s/kuxuxun/tacogips/g

#何がしたい?
macがスリープしたり復帰したりした時刻を勝手に記録してほしい

#どうやる?
kernelと直接ごにょごにょやらなくてもOSXにはIOKitというものがあり、こいつでmacの起動イベントを受け取れる模様。
調べていくとIORegisterForSystemPower,IONotificationPortGetRunLoopSourceで起動時のハンドラの登録と監視を行うみたい感じらしい事はわかりつつも、意外にここらへんのドキュメントが少なくてちょっと時間かかりました。
最終的にこのページがざっくりわかりやすかったです(safariでしか見れません)
https://developer.apple.com/library/prerelease/mac/qa/qa1340/_index.html

新しいnotifierの構造体とコールバックを渡してイベント監視ループに混ぜてやれ、という事のようですね。

#書く
とりあえず、スリープを監視してgoの関数を呼び出すやつだけをcgo使って作ります
https://github.com/tacogips/mac_switch_watch

goのコード内にcを書くには、コメント内にCで書いて直後に
import "C"

cgoでgoからcのコードを呼び出す場合は

```go
C.[cの関数名]()
```

その逆にcのコードからgoの関数を呼び出す場合は、goの関数コメントに//exportをつけるだけでOK。あら簡単

ただ、この時呼び出されるgo関数が呼び出すCのコードが書かれてるファイルと同じファイルに記述してあるとエラーになります。

cgoについてはyuroyoroさまのスライドがわかりやすいです
http://yuroyoro.net/trying_cgo/#/


#動かす
こいつを使ってスリープと起動した時に時刻をファイルに吐き出す代物をつくります
https://github.com/tacogips/log_mac_sleep


```bash
log_mac_sleep -watch
```

起動、スリープ、復帰のたびに下記のような時刻ログをホームディレクトリの下のファイルに吐き出しています。

```
start:2015-09-13 23_33_18
sleep:2015-09-13 23_38_40
wakeup:2015-09-13 23_40_08
sleep:2015-09-14 00_11_28
wakeup:2015-09-14 09_16_14
sleep:2015-09-14 09_44_14
```

デーモン化したければこんな感じのplistを書いて~/Library/LaunchAgents/にファイル置いてlaunchctl load /path/to/plistしてlaunchdに登録します。

```plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>github.com.tacogips.log_mac_sleep</string>
        <key>Disabled</key>
        <false/>
        <key>ProgramArguments</key>
        <array>
          <string>/path/to/log_mac_sleep</string>
          <string>-watch</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>
```

(ちなみにProgramArgumentsのパスに$GOPATH/bin/...とか書きたかったけど、環境変数をlaunchdに渡すのがうまくいかず断念してしまいました。。)


このログファイルでグラフ化すればどんだけ休憩とってるかが一目瞭然です
1日の開始と終業はコマンドで出せます。日報とか書く必要あるとかなら使えそう(実はこれするのが目的だったり)

```bash
log_mac_sleep -daily
```

6時間以上スリープしてたらその日の仕事は終わったぜということで
既存DBからseed-fu用seedファイルを生成

# 前準備

ActiveRecordクラスだけ作っておく

```ruby:app/models/city.rb
class City < ActiveRecord::Base
end
```

既存DB（のSlaveやコピー）に接続する環境を用意しておく
この環境は一時的にあればよい

```yaml:config/database.yml
dump:
  ...
```

# 実行

rails console起動
ダンプ用に作っておいた環境につなぐ

```bash
$ RAILS_ENV=dump rails c
```

rails consoleに以下のコードを打ち込む

```rb
SeedFu::Writer.write('db/fixtures/cities.rb', class_name: 'City') do |writer|
  City.order(:id).find_each do |city|
    writer << city.attributes
  end
end
```

以上ｗ

# 制御

`SeedFu::Writer.write`メソッドにオプション渡すといろいろ制御できる。
例えば、`seed_once`で出力したければこんな感じ。

```rb
SeedFu::Writer.write('db/fixtures/cities.rb', class_name: 'City', seed_type: :seed_once) do |writer|
```

他にもオプションあるので、気になる場合はソース見たほうが早い。
https://github.com/mbleigh/seed-fu/blob/master/lib/seed-fu/writer.rb
c++ builder > あるライブラリを使う > implib.exeで.dllから.libを作成 / ヘッダinclude

```txt:動作確認
C++ Builder XE4
```

手順
1. implib.exeで.dllファイルから.libファイルを作成する (*1参照)
2. [プロジェクト]->[プロジェクトに追加]で.libファイルを追加する
3. dll用のヘッダファイルを.cppで#includeする (SomeLbrary.hが提供されている場合、`#include "SomeLibrary.h"`
)
4. ビルドする
5. .dllをDebugフォルダ(.exe生成場所)にコピーする

以上で[実行]でdllを使ったソフトが動いた。

ただし、DLLの作り方(種類)によっては上記がうまくいかないかもしれない。今回試した.dllでは動いた。

```txt:*1)
"C:\Program Files\Embarcadero\RAD Studio\11.0\bin\implib.exe" someApi.lib someApi.dll
```

参考
http://www.gesource.jp/weblog/?p=4869

手順2に関して、手順3の.hファイルに`#pragma comment(lib, "MyAPI.lib")`があれば、プロジェクトに.libを追加しなくてもよさそう。

http://docwiki.embarcadero.com/RADStudio/Seattle/ja/Pragma_comment
Chromeエクステンションを作ろう：国際化編


説明で使用した拡張機能は[こちら](https://chrome.google.com/webstore/detail/redmine-lazy-applicant/dofmgcleeckgckfapnhookpocglpbmgp)からインストールできます. 一人でも多くの方に利用いただければ幸いです.
ソースコードは[こちら](https://bitbucket.org/dhun-h/lazy-applicant)から閲覧できます.


## 国際化とは

拡張機能でメッセージなどを複数の地域や言語に対応させる仕組みです.

![i18n-after-2.gif](https://qiita-image-store.s3.amazonaws.com/0/74102/f7164179-210e-f0f1-f866-cd7aded45b41.gif "i18n-after-2.gif")

詳細は[公式サイト](https://developer.chrome.com/extensions/i18n)を参照してください.

## プラグインで実装したこと
* マニフェストファイルのメッセージを国際化
* アプリケーションのメッセージを国際化
* 多言語化のルール
	1. 日本語が有効であれば、日本語で表示
	2. それ以外の環境であれば、英語で表示


## メッセージファイルの準備

まず、マニフェストファイルのデフォルトロケールに`en`を指定します.
拡張機能を国際化をする場合は必須属性となります.


```json:manifest.json
   ,"default_locale": "en"
```

次にメッセージファイルを準備します.
ルートディレクトリに`_locales`ディレクトリを追加して、その中に日本語と英語のメッセージファイルを配置します.

```bash
src/
  +-- manifest.json
  +-- _locales/
        +-- ja/messages.json
        +-- en/messages.json
```

こうすることで、ブラウザのロケールが日本であれば日本語＞英語の優先順位でメッセージが解決されます.

## メッセージファイルの書式

### 固定文言

メッセージキーに対してオブジェクトを定義して、message属性にメッセージを記述します.

```json:messages.json
{
    "ext_name": { "message": "Redmine Lazy Applicant" }
   ,"ext_desc": { "message": "怠惰な申請者.  Redmineのチケットが簡単に登録できるようになるプラグインです." }
}
```

### パラメータ付き文言

メッセージキーに対してオブジェクトを定義して、message属性にメッセージを記述します.
placeholders属性に、パラメータを展開するプレースホルダの名前とパラメータ番号を記述します.

```json:messages.json
{
    "content_msg_storeTemplate": { "message": "テンプレートに$target$を保存しました",
       "placeholders": {
          "target": { "content": "$1" }
        }
   }
}
```

## メッセージの解決

メッセージの解決には[chrome.i18n.getMessage](https://developer.chrome.com/extensions/i18n#method-getMessage)を利用します.

### 固定文言

第１引数にメッセージキーを指定して、chrome.i18n.getMessageを呼び出します.

```js
var msg = chrome.i18n.getMessage('ext_desc');
```

### パラメータ付き文言

第１引数にメッセージキー、第２引数にパラメータを配列で指定して、chrome.i18n.getMessageを呼び出します.
指定したパラメータはプレースホルダに展開されます.

```js
var msg = chrome.i18n.getMessage('content_msg_storeTemplate', ['サンプル']);
```

### マニフェストファイルやCSSファイルからメッセージを利用

`'__MSG_' + メッセージキー + '__'`の形式で記述することで、マニフェストファイルやCSSファイルからでもメッセージファイルを利用できます.
プラグインでは行っていませんが、地域ごとに画像リソースを切り替えることも簡単に実現できそうです.

```json:manifest.json
{
    "manifest_version": 2
   ,"name": "__MSG_ext_name__"
   ,"description": "__MSG_ext_desc__"
}
```


## tips

### ブラウザのロケールを切り替える
[こちら](https://developer.chrome.com/extensions/i18n#locales-testing)にプラットホーム毎の切替手順が記載されています.



## 説明で紹介したプラグインのソースコード

* [manifest.json](https://bitbucket.org/dhun-h/lazy-applicant/src/f371e1be0e9d66311bf81555e098b71c25886eb7/src/manifest.json?at=master&fileviewer=file-view-default)
* [_locales/ja/messages.json](https://bitbucket.org/dhun-h/lazy-applicant/src/f371e1be0e9d66311bf81555e098b71c25886eb7/src/_locales/ja/messages.json?at=master&fileviewer=file-view-default)
* [_locales/en/messages.json](https://bitbucket.org/dhun-h/lazy-applicant/src/f371e1be0e9d66311bf81555e098b71c25886eb7/src/_locales/en/messages.json?at=master&fileviewer=file-view-default)
Visual Studio 2015 > Visual C++ (MFC) > 1つのフォームのソフトの作り方

```txt:動作確認
Visual Studio 2015 Community Edition
```

C++ Builderでやっていたように１つのフォームのソフトをVisual Studioで作りたかったが、Visual C++での作り方がよくわからなかった。

標準的なもので選択すると、色々なメニューなどがついたフォームができてしまう。また、そのフォームのデザインへのたどり着き方がさっぱり分からない。

以下の手順でやればいいと知った (テンプレート:Visual C++の場合)。

1. [新しいプロジェクト]を選択
2. テンプレート > Visual C++ > MFCアプリケーション を選択
3. MFCアプリケーションウィザードにて「アプリケーションの種類」の選択にて「ダイアログベース」を選択する。

![visualStudio.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/5a3600e0-d432-cfdf-543e-d142f648f680.jpeg)

この設定でプロジェクトを作成すると、１つのフォームとしてのソフト作成ができる。

![Win8x64pro.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/d4f1c8f5-ddc7-5b97-6663-ede899a7a46d.jpeg)

あとは適宜ボタンをつけたりしてその実装をコーディングしていく。

なお、C#で選択した場合は上記のような混乱はない。
FastlyのオリジンとしてAmazon S3、GCS、GAEを使うとき

Fastly CDNのオリジンサーバー（バックエンド）として、Amazon S3（S3）や、Google Cloud Storage（GCS）、Google App Engine（GAE）を利用する場合には、オリジンサーバーはIPアドレスではなくドメイン名で指定してください。また、Default Hostを明示的に指定することも大事なポイントです。

#1. Backend指定

**図1. New Backendの指定**
![image](https://qiita-image-store.s3.amazonaws.com/0/89952/69f55b1d-27c5-e3fa-04b2-48680ce882ed.png)

**図1**はFastly顧客ポータル https://app.fastly.com のConfigure（サービス設定）から、Configure → Hosts → Backends → Newを選択すると表示される画面です。Address欄のコロンの左側はIPアドレスを指定するのが基本ですが、ドメイン名でもOK。S3やGCS、GAEの場合は、IPアドレスが変更される可能性があるので、ドメイン名で指定することが必要です。

#2. Default Host指定

**図2. Default Hostの指定**
![image](https://qiita-image-store.s3.amazonaws.com/0/89952/9413a714-e04a-92b0-ab6a-a9ec13893c21.png)

**図2**はConfigureから、Configure → Settings → Default Settingsを選択すると表示される画面です。Default Host指定は、Fastlyがオリジンサーバーへリクエストする時のHostヘッダーの値を決定します。（Default Hostを指定しない場合は、エンドユーザーからFastlyへのリクエストのHostヘッダー値が使われます。）

S3やGCS、GAEのサーバーは、このHostヘッダーの値に応じてどのコンテンツを返すかの判断するので、この指定は必須です。

##2-1. Default Host 指定内容（例）

*example*.s3-website-ap-northeast-1.amazonaws.com (S3)
*www.example.com* (GCS) （注）
*example*.appspot.com (GAE)

注. GCSではバケット名がそのままウェブサーバーのドメイン名になるので、バケット名（例：www.example.com）をDefault Hostとして指定してください。（関連情報 https://cloud.google.com/storage/docs/website-configuration#step3）

# 関連ドキュメント

[Using a named domain as an origin](https://docs.fastly.com/guides/basic-configuration/using-a-named-domain-as-an-origin) 『オリジンとしてドメイン名を用いる場合』
数字の文字列をread使って数字列に変換する


# やり方

`read . return`を使って型を指定すれば良い

```haskell
Prelude> let n = "123456789" :: String
Prelude> n
"123456789"
Prelude> map return n :: [String]
["1","2","3","4","5","6","7","8","9"]
Prelude> map (read . return) n :: [Int]
[1,2,3,4,5,6,7,8,9]
Prelude> map (read . return) n :: [Float]
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]
```

`[String]`の場合には以下のように`map`してあげれば良い

```haskell
Prelude> let parse str = map (read . return) str :: [Int]
Prelude> :t parse
parse :: [Char] -> [Int]
Prelude> map parse ["1234","5678","9012"]
[[1,2,3,4],[5,6,7,8],[9,0,1,2]]
Prelude> map product $ map parse ["1234","5678","9012"]
[24,1680,0]
```

## ちょっと詳しく

大事なのはこの型指定

```haskell
Prelude> map (read . return) n :: [Int]
```

`return`をリスト(モナド)への変換操作として用いており、
さらに`read`の返り値として`Int`を同時に指定している

分解するとこうなる

```haskell
Prelude> let x = return "100" :: [String]
Prelude> x
["100"]
Prelude> map read x :: [Int]
[100]
```

当然リスト以外を使うことも出来て、
例えば文字列を`Maybe Int`に変換したければ`fmap`を使って以下のように書ける

```haskell
Prelude> fmap read $ return "100" :: Maybe Int
Just 100
Prelude> let x = return "100" :: Maybe String
Prelude> fmap read x :: Maybe Int
Just 100
```

## 使えるシーン

[Problem 8 - Project Euler](https://projecteuler.net/problem=8)
Visual Studio 2015 > #pragma comment(lib, "myAPI.lib") > プロジェクト設定でなく、コードでDLLインポートを指定する

```txt:動作確認
Visual Studio 2015 Community Edition
```

myAPI.dllを読み込む設定をプロジェクトの設定で探したが見つからなかった。
色々調べた結果、.hファイルに以下の行があり、それでdllの関連付けができていることが分かった。

```myAPI.h
#pragma comment(lib, "myAPI.lib")
```

[SO](http://stackoverflow.com/questions/12199595/c-what-does-pragma-commentlib-xxx-actually-do-with-xxx)などを見るとバージョン違いのdllを切り替えて使うなど便利そうだということらしい。

```
#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif
```
Atomでvim-modeのカーソルが見辛いのを解消する

Atomのvim-modeプラグイン（公式が作ってる）はなかなか完成度が高く、普段はvimの私もちょっと大きなソースコードの編集にはAtomを使うようにしている。

しかし、vim-modeのブロックカーソルが、選んだテーマに寄ってはとても見づらくなる。

それを解消するには、以下のCSSを追加する。

```css:~/.atom/style.less
atom-text-editor.is-focused::shadow .cursors.blink-off .cursor {
  opacity: 1;
}
atom-text-editor.vim-mode.normal-mode,
atom-text-editor.vim-mode.operator-pending-mode,
atom-text-editor.vim-mode.visual-mode.is-focused {
  &.is-focused::shadow
  {
    .cursor {
      background-color: @text-color;
      opacity:0.3;
    }
    .blink-off .cursor{
      opacity:0.3;
    }
  }
}
```

ついでに点滅の停止も含まれている。適用しても見づらい場合は、```@text-color```を好みの色に書き換えたり、```opacity:0.3;```の値を変えたりする。

参考：https://github.com/atom/vim-mode/issues/201
Visual Studio 2015 > 共通プロパティの開き方

```txt:動作確認
Visual Studio 2015 Community Edition
```

「共通プロパティ」の設定を見たいのだが、そこに辿りつけない。

参考
http://qiita.com/imura/items/d5fadbbcf1830019adce

手順
1. [表示]->[その他のウィンドウ]->[プロパティマネージャ]
2. 下の画像にあるように、矢印のいずれかをダブルクリック (Debug...でもいい)

![commonProperty.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/69e19dda-9fbf-ab21-6130-85b1939698f7.jpeg)

以上で「共通プロパティ」(下図)が開く。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/beabb8b4-4948-cb2c-86b8-8faabe32531c.jpeg)
gccの-Wincompatible-pointer-typesオプションめも

ある程度汎用的に使いたい時にvoid型のポインタを引数に取ったりするけど、その時にポインタのポインタとかを使う場合は呼び出し側でキャストしてあげないと怒られるよということ。
試したのはgcc 5.2.0。

```
masami@kerntest:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /build/gcc/src/gcc-5.2.0/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release --with-default-libstdcxx-abi=gcc4-compatible
Thread model: posix
gcc version 5.2.0 (GCC)
```

例えばこんなコードがあって、test()はvoid**を引数に取る。そして呼び出し側で```test(&p);```とすると_-Wincompatible-pointer-types_によってwarningがでる。

```c
#include <stdio.h>

struct foobar {
        int n;
};

void test(void **p)
{
        struct foobar *f = *(struct foobar **) p;
        f->n = 10;
}

int main(int argc, char **argv)
{
        struct foobar f, *p;
        p = &f;
        p->n = 1;

        //test((void **) &p);
        test(&p);

        printf("%d\n", p->n);

        return 0;
}
```
コンパイル。

```
masami@kerntest:~$ gcc a.c -Wall -Werror
a.c: In function ‘main’:
a.c:20:7: error: passing argument 1 of ‘test’ from incompatible pointer type [-Werror=incompatible-pointer-types]
  test(&p);
       ^
a.c:7:6: note: expected ‘void **’ but argument is of type ‘struct foobar **’
 void test(void **p)
      ^
cc1: all warnings being treated as errors
```

では、呼び出し側をとして明示的にキャストして```test((void **) &p);```とした場合。

```
masami@kerntest:~$ gcc a.c -Wall -Werror
masami@kerntest:~$
```
Visual Studio 2015 > フォームデザインを表示する

```txt:動作確認
Visual Studio 2015 Community Edition
```

C++ Builderを使ったことがあるが、Visual Studioはほとんど知らない中で、フォームの表示にたどりつくまで苦労した。

以下のようにすれば、フォームが表示される。

1. [ソリューションエクスプローラー] -> [Source Files] -> .rcのファイルをクリック (例: SampleApplication.rc)
2. 表示される中で[Dialog]にあるものをダブルクリック (例: IDD_SAMPLEAPPLICATION)

これでSample Applicationのフォームデザインが開く。
【AWS】セキュリティグループを設定してみた（そして関連する用語を調べてみた）

# セキュリティグループとは
AWSのファイアウォール機能の一つ。（他には、後述するACLなどがある）
プロトコル、ポート範囲、送信元／送信先IPアドレスによるパケットフィルターが可能。
インスタンス単位に適用することができる。
**殻で覆ってそこに穴をあけるイメージ。**
セキュリティグループを作って何も設定しなければ何も通信を通さない。
許可したい通信に応じて許可ルールを作成することでそこに穴を開ける。
（→拒否ルールは設定できない）

# セキュリティグループの設定方法
### マネジメントコンソールから設定する場合
1.「AWSマネジメントコンソール」に入る
2.「EC2」を選択する
3.「セキュリティグループ」を選択する
4.「セキュリティの作成」を選択する
5.セキュリティグループ名をつけ、VPC（後述）を選択し、インバウンド、アウトバウンド（後述）それぞれで許可ルールを設定する
--以下はセキュリティグループを適用する手順--
6.「インスタンス」を選択する
7.セキュリティグループを追加したいインスタンスを選択する
8.「ネットワーキング」を選択する
9.「セキュリティグループの変更」を選択する
10.適用したいセキュリティグループを選択する

### AWS CLIから設定する場合
##### セキュリティグループの作成
```
$ aws ec2 create-security-group
--description <value>
--group-name <value> 
[--vpc-id <value>]
[--dry-run | --no-dry-run]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
```
##### セキュリティグループの確認
```
$ aws ec2 describe-security-groups 
--group-id <value>
```

##### セキュリティグループのルール追加
```
# インバウンドのSSHポート22を開けるとき
$ aws ec2 authorize-security-group-ingress 
--group-id <value> 
--protocol tcp 
--port 22 
--cidr 0.0.0.0/0
```

# セキュリティグループに関連する用語
### インバウンド、アウトバウンド
##### インバウンドルール
そのセキュリティグループに関連付けられたインスタンスにアクセスできるトラフィックを規制するルール
##### アウトバウンドルール
そのセキュリティグループに関連付けられたインスタンスからどの送信先にトラフィックを送信できるか（トラフィックの送信先と送信先ポート）を制御するルール
##### →応答パケットについて
セキュリティグループは「ステートフル」なので、アウトバウンドルールにかかわらず、許可されたインバウンドトラフィックのアウトバウンドへの通信、またその逆を許可する応答を出す。
→つまり、AWS上のwebサーバのポート80にクライアントPCのポート49152からアクセスしてきたとして、アウトバウンドでポート49152をわざわざ開けなくても動的にポートが開いて応答を出す。

### ACL
ネットワークアクセスコントロールリストの略。
セキュリティグループとの違いは
・サブネットレベルで動作する
・ルールの許可と**拒否**設定が可能である
・ステートレスである

以上です。
Atomエディタで行末の空行を自動削除する設定を無効化する

Atomエディタを使っていると行末に余分な空行があったら自動で削除してくれる気の利かせた機能があるのですが、diffの差分などの都合で改行を削除したくない時など、たまに余計なお世話に感じるときもあります。

この設定は、「Atom」->「Preferences」-> 「Settings」を探しても見当たらず、どこにあるのかなーと思ったら
「Atom」->「Preferences」->「Packages」-> 「Whitespace」->「Settings」の中に
 「Ensure Single Trailing Newline」というのがあって、これをOFFにすると無効化できます。

エディタの基本機能っぽいものもパッケージ化されてて、なるほどなーというかんじですが、ちょっと分かりづらいです。

(2016/11/12追記)
「行末」という単語が不正確でした。上記ではいわゆる「ファイル末尾の余分な空行」を「行末の空行」という表現をしていました。
 「Ensure Single Trailing Newline」はファイル末尾の空行を常に1行に調整する設定で、これをOFFにするとファイル末尾の空行の数の自動調整が無効化されます。

一方「行末＝1行の末尾」の空白を自動削除する設定は、@kd9951さんにコメントで指摘いただいた「Remove Traling Whitespace」をOFFにすれば無効化できます。
IDによるスタイル適応が拡張性を下げるケース

cssでIDを使ってスタイルを適応してるコードで、これは拡張しにくい。。。と思ったケース

## コード

```html
<ul id="style01" class="cf">
  <li> ....
  <li> ....
</ul>
```

```css
#style01 {
  width 200px;
}

#style01 li {
  width: 100px;
  float: left;
}
```

横並びにliをレイアウトするようなHTML  
これを下にもう１段増やしたい

```html
<ul id="style01" class="cf">
  <li> ....
  <li> ....
</ul>
<ul id="style01" class="cf">
  <li> ....
  <li> ....
</ul>
```

もちろんこうはできない。IDが重複するので

```html
<ul class="style01 cf">
  <li> ....
  <li> ....
</ul>
<ul class="style01 cf">
  <li> ....
  <li> ....
</ul>
```

```css
.style01 {
  width 200px;
}

.style01 li {
  width: 100px;
  float: left;
}
```

クラスにスタイルを移動

## つらい。

これ移動するのに

* #style01を使っている箇所をプロジェクトファイル全体から検索し、変更しても問題ないことを確認
* IDをクラスへ付け替え
* 表示チェックで確認

しました。もともとクラスで設計されてたら

* 同じ構造のタグを下に追加
* 表示チェックで確認

だけで済んだ。

IDを使う前にちょっとだけ将来のことをおいたほうが良いかなと。
Visual Studio 2015 > ローカルデバッガー > .exeを開始できません > 名前にVC付き.exeを生成して、VCなし.exeを実行 > [リンカー]->[全般]にある「出力ファイル」の項目名から-VCを外せばいい

```txt:動作確認
VisualStudio 2015 Community Edition
```

2010年ごろの古いVisualStudioのプロジェクトを使用。

古いプロジェクトを開いた時、新しいVSへ使用のための変換が自動的に行われた。ビルドで.exeファイルも作成され、その.exeファイルを実行できることも確認済。

しかし、VisualStudio上でローカルデバッガー機能で実行すると以下のようなエラーがでる。

```
プログラム 'C:\User\...\SampleApplication.exe'を開始できません。

指定されたファイルが見つかりません。
```

よく見ると、実行ファイルは`SampleApplication-VC.exe`のような名前で作成されているが、実行しようとしているのはVCなしの.exeファイルだ。

どこで設定を変更すればいいのか調査中。

Visual C++プロジェクトの場合`-VC.exe`付きになるような気がする。

##解決

[プロジェクト]->[SampleApplicationのプロパテイ]を選択し、[リンカー]->[全般]にある「出力ファイル」の項目名に`-VC`がついている。`Debug/SampleApplication.exe`(-VCなし)に変更したらローカルデバッガが動くようになった。

![vs2015error.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/2db68e24-38d8-f6d0-8e83-a22f351209d1.jpeg)
WPFでWebBrowser内のスクリーンショットを保存する

WPFで特定要素、今回の場合WebBrowserの範囲のスクリーンショットを保存するために以下のようなコードを書きました。

```xml
<WebBrowser x:Name="browser"/>
```

```csharp
var rtb = new RenderTargetBitmap(
    (int)browser.Width,
    (int)browser.Height,
    96,
    96,
    PixelFormats.Pbgra32
);
rtb.Render(browser);

string dir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
using (FileStream fs = File.Open(filePath, FileMode.Create))
{
    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bmp));
    encoder.Save(fs);
}
```

このコードでは当然何もキャプチャすることはできません。

[RenderTargetBitmap クラス](http://msdn.microsoft.com/ja-jp/library/system.windows.media.imaging.rendertargetbitmap%28v=vs.90%29.aspx)を読めばわかるように、ここでのbrowserはVisualオブジェクトでは全然ありません。つまりこれは以下のように書き直す必要があるということです。

```csharp
Image imgScreen = new Image();
imgScreen.Width = (int)browser.Width;
imgScreen.Height = (int)browser.Height;
imgScreen.Source = new DrawingImage(VisualTreeHelper.GetDrawing(browser));

string fileName = "sample.png";
string directoryPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string filePath = System.IO.Path.Combine(directoryPath, fileName);

using (FileStream fs = new FileStream(directoryPath, FileMode.Create))
{
    var vis = new DrawingVisual();
    DrawingContext cont = vis.RenderOpen();
    cont.DrawImage(
        imgScreen.Source,
        new Rect(new Size(imgScreen.Width, imgScreen.Height))
    );
    cont.Close();

    var rtb = new RenderTargetBitmap(
        (int)imgScreen.Width,
        (int)imgScreen.Height,
        96d,
        96d,
        PixelFormats.Default
    );
    rtb.Render(vis);

    var enc = new PngBitmapEncoder();
    enc.Frames.Add(BitmapFrame.Create(rtb));
    enc.Save(fs);
}
```