OmniAICreator/Qiita-1.07M huggingface dataset:
任意の文字列をFlashAirにテキストファイルとして保存する

　FlashAirの機能に、ファイルアップロード機能（upload.cgi）があります。これを使うと、Wi-Fi接続した機器からFlashAirにファイルをアップロードすることができるのですが、この機能を利用して、FlashAir内に配置したHTMLファイルのJavaScriptから、任意の文字列をファイルとしてFlashAir内に保存することができます。また、同じように、Wi-Fi接続した機器のアプリケーションから任意の文字列をファイルとしてFlashAir内に生成できます。
　今回は、JavaScriptとC#の場合についてご紹介します。

#CONFIGファイルの設定
　FlashAirのSD_WLANフォルダ内のCONFIGファイルに、UPLOADオプションを付加します。
```UPLOAD=1
```
　※SD_WLANフォルダとCONFIGファイルは不可視属性ファイルなので注意してください。

#テキストファイルの保存
　以下のサンプルコードでは、任意の文字列をテキストファイル（sample.txt）としてFlashAirに保存します。FlashAir内のHTMLファイルに記述したJavaScriptでも実行できますし、FlashAirとWi-Fi接続した外部機器内のHTMLファイルに記述したJavaScriptでも実行できます。
　今回のサンプルコードでは、FlashAirの[ホスト機器からのファイル書き込み禁止処置 - WRITEPROTECTの指定](https://flashair-developers.com/ja/documents/api/uploadcgi/#WRITEPROTECT)をしていません。必要に応じて指定してください。また、同様に[アップロード先ディレクトリの指定](https://flashair-developers.com/ja/documents/api/uploadcgi/#UPDIR)、[アップロードファイルの作成時間の指定](https://flashair-developers.com/ja/documents/api/uploadcgi/#FTIME)も必要に応じて指定してください。
指定例：
```http://flashair/upload.cgi?WRITEPROTECT=ON&UPDIR=/DIRNAME&FTIME=0x99999999
```
　※FTIMEの0x99999999は日時を16進数で表したものです。任意のものに置き換えてください。詳細は、[アップロードファイルの作成時間の指定](https://flashair-developers.com/ja/documents/api/uploadcgi/#FTIME)を参照してください。

###サンプルコード（JavaScriptの場合）

```sample.js
function uploadStringToFile(str){
  var blob = new Blob([str] , {type:"text/plain"});
  execPost("http://flashair/upload.cgi", blob, "sample.txt");
}
			
function execPost(sendurl, senddata, sendname) {
  var form_data = new FormData();
  form_data.append( "enctype" , "multipart/form-data" );
  form_data.append("file", senddata , sendname); 
  var xhr = new XMLHttpRequest();
  xhr.onload = function (e){
    console.log(xhr.responseText );
  };
  xhr.open("POST" , sendurl);
  xhr.send(form_data);
}

//呼び出し例：
uploadStringToFile("任意の文字列");
```

###サンプルコード（C#の場合）

```sample.cs
async Task<String> uploadStringToFile(String str)
{
  String rtnString;
  var httpClient = new HttpClient();
  Stream sr = new MemoryStream(Encoding.Unicode.GetBytes(str));  
  var fileContent = new StreamContent(sr);
  fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("multipart/form-data")
  {
    FileName = "sample.txt"
  };
  try{
    HttpResponseMessage aResponse = await httpClient.PostAsync("http://flashair/upload.cgi", fileContent);
    rtnString = aResponse.ToString();
  }
  catch(Exception e){
    rtnString = "HTTP Connection ERROR!!";
  }
  return rtnString;
}

//呼び出し例
var str = await uploadStringToFile("任意の文字列");
```

#テキストファイルの読み出し
　ちなみに、保存したファイルは以下のURLを参照することで読み出せます。
```http://flashair/sample.txt
```

#まとめ
　これで、FlashAir内のプログラムで保存しておきたい状態情報があれば、ファイルとして保存しておけば、電源断後、FlashAir起動時にファイルを読み込むことで、状態情報を再現できます。
　ユーザー設定情報などを保存しておくとよいですね。

#参考資料
　[FlashAir Developers - upload.cgi](https://flashair-developers.com/ja/documents/api/uploadcgi/)
　[FlashAir Developers - FlashAirへのアップロード](https://flashair-developers.com/ja/documents/tutorials/advanced/2/)
Bitcoin(Mainnet, Testnet)への接続方法

Bitcoinへの接続環境をMacにインストールし、ネットワークに接続する方法です。

## 用語
- Mainnet...実際に市場で取引されるBitcoinデータが格納されているBlockchain
- Testnet...開発のためのBlockchainネットワーク。TestnetのBitcoinならばネットで無料で手に入る。
- Blockchain...Bitcoinの取引記録。BitcoinのP2Pネットワークに参加している全てのノードが同一のデータを持つ

## 何が出来るか
取引所でBitcoinを購入するなど単純にBitcoinの売り買いをしたり、Bitcoinで投資をしてみたり、友人に送金してみたり、といったことは、下記に記載するような、Bitcoinへの接続環境をローカルに作らなくても問題なく行えます。  
ただ、自分でBitcoinウォレットを作ってみたり、取引所を作ってみたり、他にもBitcoinを用いたアプリケーションを作ってみたり、（あまり現実的ではないですが）個人でマイニングを行ったりする際には、このような環境構築が必要になってきます。  
また、実際に手元で動かしてみることで、Blockchainとはどういうものかというのが実感として理解出来ると思います。

## インストール
Githubからインストールしてビルドするか、公式サイトから最新版をインストールしてください。
https://bitcoin.org/ja/download

公式サイトからのインストールの場合、dmgファイルからダウンロードするとBitcoin-QtというGUIアプリケーションがインストールされると思います。

私は今回は、tar.gzファイルをダウンロードして展開、最低限必要な、 `bin/bitcoind` と `bin/bitcoin-cli` を `/usr/local/bin/` にシンボリックリンクを貼ることでセットアップを行いました。

## Bitcoinの動作確認
`bitcoind -daemon` コマンドを入力して、 `Bitcoin server starting` と返って来たら問題なく起動出来ています。
一旦、 `bitcoin-cli stop` で停止します。

## 設定
`$HOME/Library/Application Support/Bitcoin/` に `bitcoin.conf` ファイルを作成します。
このディレクトリ内にblock情報などが保存されていきます。
bitcoin.confの記載は今回下記のようにしました。

詳しい書き方は公式Wikiをご覧ください。
[BitcoinWiki (Bitcoin.conf Configuration File)](https://en.bitcoin.it/wiki/Running_Bitcoin#Bitcoin.conf_Configuration_File)

```
testnet=3
server=1

rpcuser=bitcoinrpc
rpcpassword= <<password>>
rpcallowip= <<allowIP>>
rpcport=8332
```

bitcoindはRPCサーバとして起動するため、外部から接続する場合は `allowip` などの設定が必要になってきます( `server=1` でRPC接続を許可するようです)。
また、 `testnet=3` と記載することにより、testnetに接続するよう設定しています(3というのは現在の最新バージョンです)
mainnetと接続する場合には、 `testnet` の記載をしなければ自動的にmainnetに接続すると思います。
なので、この設定ファイルで接続するnetworkを変更することになります。
(起動時に、 `bitcoind -testnet` と、オプションをつけることでもtestnet接続が可能になります)

## testnetへの接続
さて、設定ファイルを書き換えた段階で、もう一度bitcoindを立ち上げて、接続します。
そのままいくつか、 `bitcoin-cli` というコマンドラインツールを使って立ち上がっているBitcoinと対話を行ってみます。
bitcoin-cliで提供されているAPIの詳細は公式Wikiをご覧ください
[Original Bitcoin client/API calls list](https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list)

アドレスとアカウントの関係は、1つのアカウントに対して複数アドレスが作成所有される、という関係性です。
残高の単位は、アカウントごとであり、これは、Bitcoinを受け取る際にあるアカウントに所属する新しいアドレスを発行してそのアドレスで受け取ることにより、個人の特定を避ける、といった意味合いになっているかと思われます。

```
$ bitcoind -daemon  // 起動コマンド
Bitcoin server starting

$ bitcoin-cli getinfo  // blockchainの情報を取得
{
  "version": 120100,  //version
  "protocolversion": 70012,
  "walletversion": 60000,
  "balance": 12.49739739,  //
  "blocks": 870042,  // 現在同期済みの最新ブロック
  "timeoffset": 0,
  "connections": 3,
  "proxy": "",
  "difficulty": 1,
  "testnet": true,  // trueになっていたらtestnetに接続中
  "keypoololdest": 1452476315,
  "keypoolsize": 100,
  "unlocked_until": 0,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
}

$ bitcoin-cli getnewaddress <<アカウント名>> //新しいアドレスを作成
<<new address>>

$ bitcoin-cli getaddressesbyaccount // アカウントに所属するアドレスのリストを表示
<<address1>>
<<address2>>
<<address3>>

$ bitcoin-cli getbalance <<アカウント名>>  // アカウントが保有するBitcoin残高を表示
30.25

$ bitcoin-cli encryptwallet <<passphrase>>  // 送金する際のpassphraseを登録

$ bitcoin-cli walletpassphrase <<passphrase>>  // unlockする

$ bitcoin-cli  sendtoaddress <<to address>> <<send amount>>  // 送金する
```

以上、bitcoindにコマンドラインからアクセスして、基本的な動作を行う、というところを見ていきました。
Struts2の内部オブジェクト(1) ActionContext

# Struts2の内部オブジェクトとは

Struts2の内部オブジェクトとは、Struts2が動作する上で必要な設定・情報・サーブレットとの関連情報を扱えるオブジェクトたちで、ユーティリティとして使えるものです。

便利な機能が内包されており、中にはActionクラス以外にもStruts2が動作していればどこでもアクセスできる利点があります。

## ActionContext

一番よく使うクラスです。インターセプタやViewの共通化でも使え、Struts2がActionクラスを実行した結果やView層に渡すときの情報一式にアクセスできます。

## ActionContextの取得

```java
ActionContext actionCtx= ActionContext.getContext();
```

ActionContextの取得は、Struts2が動作するクラスであれば**どこでも**取得可能です。

例えば、Validationの実装クラス、set/getのみ実装しているDTO、POJOになっているロジック、果ては他のフレームワーク管理下にある実装クラスでも可能です。

### Actionクラス名が受け取ったリクエストパラメータを取得する

```java
Map<String,Object> parameters = actionCtx.getParameters();
```

パラメータ名はMapのキーです。リクエストパラメータの内容を再取得したい場合に使います。

### Actionクラスを実行するインスタンスを取得する

```java
ActionInvocation invoker = actionCtx.getActionInvocation();
```

Actionクラスの実行を命令できるインスタンスを取得します。 invoke()でActionクラスが動き、Actionクラスの実行結果 result のStringを受け取れます。インターセプタを自作し、Actionクラスの実行制御する場合に使います。

### Actionクラスの実行～View層で利用する情報を取得する

Struts2内部ではサーブレットのスコープ以外に独自のデータ領域を持っており、これを**ValueStack**と呼んでいます。
このValueStackはStruts2標準ではOGNL式でアクセスできるOgnlValueStackを扱います。このOgnlValueStackはActionクラスのフィールドにアクセスできます。これによりActionクラスの実装しているインタフェース(Aware)次第で、フィールドエラー情報やセッション情報などもActionクラス経由で取得可能です。

```java
ValueStack valueStack = actionCtx.getValueStack();
Object value = valueStack.findValue("dto.username", true);
```

OGNL式でActionクラスのフィールド名を指定できますので、ネストしたオブジェクトも参照できます。

### 自動型変換エラーを取得する

Struts2はリクエストパラメータを、Actoinクラスのフィールドへ自動型変換します。サーブレット仕様のリクエストパラメータはStringないしはString[]になりますが、これがActionクラスのフィールドに合わせて型変換を試行します。そのときに変換できなかった(例えばInteger型のフィールドに対して、パラメータが abc だったなど)場合には、型変換エラーとしてStruts2内部で蓄積し、Actionクラスのフィールドには何も反映されません。

この型変換エラー情報を取得できます。

```java
Map<String,Object> convertionErrors = actionCtx.getConversionErrors();
```

View層、テンプレートクラスで型変換失敗をしたパラメータを出力するときに使います。
Rubyで数字と文字の混ざった文字列から数字のみを取り出す

数字と文字が入り混じった文字列、例えば`"abc12345def67890"`のような文字列から数字のみを取り出す方法について。
正規表現で数字以外を削除します。

```rb
num = "abc12345def67890".gsub(/[^\d]/, "").to_i # num => 1234567890
```

これを利用すると記号付きの文字(100kg, 100km等など)から数字のみを抜き出して計算できました。
これなら例えば単位ごとに正規表現を書き換えるというようなことも無いので色々と使えるのではないかと思いました。

（これを思いつくまでに30分くらい色々考えてしまったのは内緒...）

-----

**追記**
コメントにて特定の種類の文字をすべて消すのであれば`delete`のほうが向いていると教えていただきました。

```rb:
"abc12345def67890".delete("^0-9")
```

ベンチマーク（コメント欄参照）でも数倍の差が出る模様です。
Embulkを使ってS3からBigQueryへデータをフィルタリングしてロードする

BigQueryは高速で安価なデータ分析サービスとして有用であり、BigQueryにデータをロードするツールとして、Embulkはとても相性がよい。
データをロードする際、取り込んではいけないデータや不必要なデータは落としてからロードする必要があるケースがある。
例えば以下のjsonでuserIdを取り除いてデータロードするケースについて記載する。

```
{
"a":{
   "b":{
     userId:"xxx"
    }
  }
"c":"yyy"
}
```

■インストール
・Javaのインストールと環境変数設定：省略
・Embulkのインストール

```
curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
chmod +x ~/.embulk/bin/embulk
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

・S3 inputプラグインのインストール
https://github.com/embulk/embulk-input-s3

```
$ embulk gem install embulk-input-s3
```

・filter-json_keyのインストール
https://github.com/civitaspo/embulk-filter-json_key

```
$embulk gem install embulk-filter-json_key
```

・BigQuery outputプラグインのインストール
https://github.com/embulk/embulk-output-bigquery

```
$ embulk gem install embulk-output-bigquery
```

■設定ファイルの作成

```config.yaml
in:
  type: s3
  bucket:★S3のバケット名
  path_prefix: ★S3に配置したファイルへのパス
  endpoint:★エンドポイント。s3-us-west-1.amazonaws.comみたいなの
  auth_method: basic
  access_key_id:★AWSのアクセスキーID
  secret_access_key:★AWSのシークレットアクセスキー
  parser:
    type: csv
    delimiter: "\t"
    charset: UTF-8
    newline: CRLF
    null_string: 'NULL'
    skip_header_lines: 0
    comment_line_marker: '#'
    allow_extra_columns: true
    columns:
      - {name: json_payload, type: string}
filters:
  - type: json_key
    column: json_payload
    nested_key_delimiter: "."
    drop_keys:
    - {key: "a.b.userId"}
out:
  type: bigquery
  mode: append
  auth_method: json_key
  json_keyfile:★サービスアカウントやユーザのシークレットキー(json)
  project: ★GCPのプロジェクト
  dataset: ★BigQueryのデータセット
  table: ★BigQueryのテーブル
  auto_create_dataset: true
  auto_create_table: true
  schema_file: insert_schema.json ★BQのテーブルのスキーマ
  column_options:
    - {name: json_payload, type: string }
  timeout_sec: 300
  open_timeout_sec: 300
  retries: 3
  path_prefix: temp_data
  file_ext: .gz
  delete_from_local_when_job_end: true
  source_format: CSV
  max_bad_records: 0
  formatter:
    type: jsonl
```

```insert_schema.json
[
 { "name":"payload", "type":"string", "mode":"nullable", "description":"1column1json" }
]
```

■実行

```
$ embulk run config.yaml
```
jbuilder

https://samurails.com/gems/jbuilder/

http://railscasts.com/episodes/320-jbuilder

https://jsfiddle.net/qqw2179q/4/

http://www.w3school.com.cn/jquery/event_submit.asp

https://www.google.com/search?q=rails+jbuilder+tree&oq=rails+jbuilder+tree&aqs=chrome..69i57j69i64.5000j0j7&sourceid=chrome&ie=UTF-8

https://blog.engineyard.com/2015/active-model-serializers

http://10.16.199.64:3002/fee_list/penalty
SMC を AndroidStudio 上で走らせて StateMachine を簡単に生成しよう

#これまでのあらすじ

[mokemokechicken](http://qiita.com/mokemokechicken)さんの[記事](http://qiita.com/mokemokechicken/items/9a4f7dea5a0fe37bd26f)を参考にし、SMC で生成した StateMachine を使ってアプリを書いている。
ただ自分のうんこっこな作業環境の問題で
```Linux マシンで SMC を実行して生成した StateMachine を commit
   -> 別マシンの Android Studio で merge して開発```
といった感じに要領の悪い工程になってしまっている。

要は AndroidStudio 上で SMC を実行すればいいじゃん。ということでやってみました。

#やったこと
##プロジェクトツリーにSMCを配置

`<Priject root dir>/<app>/bin/Smc.jar`

Smc.jar は[公式](http://smc.sourceforge.net/)からダウンロードしてね。

##ソースコードの配置

SMC の DSL で書いた StateMachine のソースコードを適当に配置。

`<Priject root dir>/<app>/src/main/java/<package>/statemachine/hoge.sm`

##設定

Run -> Edit Configurations... -> JAR Application -> Smc.jar
まで到達すると、下図のような設定窓になる。

 ![ss_2016-06-13_20-30-19.png](https://qiita-image-store.s3.amazonaws.com/0/71165/65ed7993-d596-dc0c-5e92-1242ba04bef8.png)


設定項目は以下の感じで。

 - Path to JAR: 自動で入るのでそのまま
 - Program arguments: 目的に合わせて適当に。今回は Java なので "-java" とソースコードのファイル名
 - Working directory: 引数のファイルはここからの相対パスになるよ。念のため。なお、引数で指定しなかった場合の出力ディレクトリもここになる

設定したら保存して閉じる。

##実行

あとは「Smc.jar」を Run させると statemachine ディレクトリに StateMachine の Context ファイルが生成される。あとはそれを import して StateMachine の条件分岐などを実装してあげればいい。詳しくは公式（わかりづらい）や各種 SMC の解説記事を参照してね。


#オワリに

あまりに簡単だった。面倒くさがらずにもっと早くやれば良かった。
dot ファイルの生成もできるので、工夫すれば StateMachine の図も自動生成できるかもね。
できればビルドに組み込みたいんだけどよくわからない。誰か教えて。
Vue.js Validator 使う


ドキュメントはこちら
http://vuejs.github.io/vue-validator/ja/index.html


インストール

````
$ npm install vue-validator --save
````

セットアップ

````
var VueValidator = require('vue-validator')

Vue.use(VueValidator)
````

## バリデーションの記述

HTMLの中にガシガシねじ込んでいきます。

````
  <validator name="validation1">
    <form novalidate>
      <div class="username-field">
        <label for="username">username:</label>
        <input id="username" type="text" v-validate:username="['required']">
      </div>
      <div class="comment-field">
        <label for="comment">comment:</label>
        <input id="comment" type="text" v-validate:comment="{ maxlength: 256 }">
      </div>
      <div class="errors">
        <p v-if="$validation1.username.required">Required your name.</p>
        <p v-if="$validation1.comment.maxlength">Your comment is too long.</p>
      </div>
      <input type="submit" value="send" v-if="$validation1.valid">
    </form>
  </validator>
````

validation カスタム要素のname属性で変数名を定義し、結果を格納していきます。

フォームとのバインディングには、v-validateを使用し、v-model は必須ではなくなりました。

v-validateはあくまでバリデーション目的のみに使用され、任意のフィールドのみv-modelを通じバインディングを活用する事が可能です。

### ルールの記述

````
<input id="username" type="text" v-validate:username="['required']">
<input id="comment" type="text" v-validate:comment="{ required:true, maxlength: 256 }">
````

上記に見られるようにルールは`v-validate`属性にフィールド名を渡して実装可能です。

フィールド名はvalidation内部での識別子で、v-model等のバインディングとは関係なさそう。

配列の表記は`required`のように値を必要としないルールでのみ使用可能で、通常はオブジェクトを使用する方が良さそう。

ルールはカジュアルにHTMLにガシガシねじ込むことも可能だが、`""`ないの配列ないしオブジェクトは変数参照することも可能で、JS側で管理するのも難しくなさそう。 

### メッセージの記述

````
<p v-if="$validation1.username.required">Required your name.</p>
<p v-if="$validation1.comment.maxlength">Your comment is too long.</p>
````

validatorオブジェクトで指定した変数名で、バリデーション結果を動的に取得できる。

各種ルール名でルール毎の結果が取得できるほか、`valid` `dirty`などのプロパティも生えているのでそちらを参照しても。

`$validation1` にも`valid` `dirty`などのプロパティは生えており、こちらはフィールドセット全体の結果となる。


## バリデーションルール

初期組み込みのバリデータルールとしては以下のものが用意されている。

- required: 値が指定されているかどうか
- pattern: 指定された値が正規表現のパターンかどうか
- minlength: 指定された値の長さが最小以下の長さかどうか
- maxlength: 指定された値の長さが最大以上の長さかどうか
- min: 指定された数値が最小以下かどうか
- max: 指定された数値が最大以上かどうか

カスタムのルール定義も簡単に出来るっぽい。

````
new Vue({
  el: '#app',
  validators: { // `numeric` と `url` のカスタムバリデータはローカル登録です。
    numeric: function (val/*,rule*/) {
      return /^[-+]?[0-9]+$/.test(val)
    },
    url: function (val) {
      return /^(http\:\/\/|https\:\/\/)(.{4,})$/.test(val)
    }
  },
  data: {
    email: ''
  }
})
````

Promise をreturnして非同期バリデーションも組めるっぽい。超便利
rdotswift: Android 用の values/strings.xml から iOS 用の R.swift を生成する

Android アプリと iOS アプリを両方開発しているとき、
Alert 文言や API エンドポイント、色指定、ナビバーの高さなどなど、
アプリの設定・定数値を共通管理したいことがあります。

Android アプリ用の設定ファイル　strings.xml 等から iOS アプリ用の Objective-C の R.h と R.m ファイルを生成するツールに [rdotm](http://qiita.com/ksoichiro/items/4befb2695b1efdff72dd) があります。

Swift でも同じことをやりたいので、[rdotswift](https://www.npmjs.com/package/rdotswift) を作成しました。

以下の手順で利用できます。

```sh
brew install node # まだ node.js がインストールしていない場合

npm install -g rdotswift

rdotswift app/src/main/res/values/*.xml --output=R.swift
```

rdotswift は以下のような R.swift ファイルを生成します。
アプリからは、`R.string.app_name` のようにして定数にアクセスできます。

```R.swift
// Generated by rdotswift <https://github.com/kawanet/rdotswift>

import UIKit

final class R {
    final class bool {
    }

    final class color {
    }

    final class dimen {
    }

    final class string {
    }
}

// colors.xml

extension R.color {
    /** #3F51B5 */
    static let colorPrimary = UIColor(red: 0.247, green: 0.318, blue:0.71, alpha: 1)
    /** #303F9F */
    static let colorPrimaryDark = UIColor(red: 0.188, green: 0.247, blue:0.624, alpha: 1)
    /** #FF4081 */
    static let colorAccent = UIColor(red: 1, green: 0.251, blue:0.506, alpha: 1)
}

// dimens.xml

extension R.dimen {
    /** 16dp */
    static let activity_horizontal_margin: CGFloat = 16
    /** 16dp */
    static let activity_vertical_margin: CGFloat = 16
    /** 16dp */
    static let fab_margin: CGFloat = 16
}

// strings.xml

extension R.string {
    /** MyApp */
    static let app_name = "MyApp"
    /** Settings */
    static let action_settings = "Settings"
}
```

現在は R クラス以下の bool・color・dimen・string の４つの型に対応しています。
drawable や style には対応していません。

いくつかオプションが指定できます。

```sh
rdotswift app/src/develop/res/values/*.xml --exclude='*_android' --output=R.swift
```

`--exclude='*_android'` をつけると、`_android` で終わるキーを無視します。
Android のみで利用する設定を iOS に取り込みたくない場合に使用できます。

```sh
rdotswift app/src/develop/res/values/*.xml --extension --if=DEBUG --output=R+develop.swift
```

`--extension` をつけると、`final class R {}` を出力しません。
`--if=DEBUG` をつけると、`#if DEBUG`〜`#endif` が付きます。
Android の Build Variants と iOS の TARGET を対比させるときに指定できます。

```sh
rdotswift app/src/main/res/values/*.xml --class=Const --output=Const.swift
```

`--class=Const` をつけると、R 以外のクラス名を使用できます。

```sh
rdotswift app/src/main/res/values/*.xml app/src/develop/res/values/*.xml --merge --output=R+develop.swift
```

`--merge` をつけると、上記の例では main の XML を読んだあとで、
develop の XML を読んで上書きした結果のみを .swift に出力します。
Android の Build Variants ごとに値を上書きしているときに利用します。

まだ出来立てのツールなので、ご意見・ご要望も歓迎です。
AWS アカウントを跨いだ S3 バケットの移動（KMS キーで暗号化している場合）

KMS キーで暗号化しているバケットから移行して、移行先でも KMS キーで暗号化しようとして少しつまずいたのでメモ。

**移行元のバケットが暗号化されている場合、aws-cli で使うユーザに KMS キーの権限が必要です。**

1. [How do I transfer ownership of Amazon S3 objects to a different AWS account?](https://aws.amazon.com/premiumsupport/knowledge-center/account-transfer-s3/) の通りに、移行元のバケットと移行先のユーザのポリシーを設定します。
1. ここで `aws s3 sync` を実行すると `A client error (AccessDenied) occurred when calling the CopyObject operation: Access Denied` のようなエラーが出て失敗するはず。
1. 移行元コンソールの「IAM > Encryption Keys > 該当のキー > Key Users > External Accounts」で移行先のアカウント番号を設定します。
1. 移行先コンソールの「IAM > Users > 該当のユーザ > Permissions > Inline Policies」で KMS キーの利用権限を設定します。

    ```json
    {
      "Version": "2012-10-17",
      "Statement": {
        "Effect": "Allow",
        "Action": [
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:ReEncrypt*",
          "kms:GenerateDataKey*",
          "kms:DescribeKey"
        ],
        "Resource": [
          "arn:aws:kms:（移行元リージョン）:（移行元アカウント）:key/（移行元 KMS キー ID）"
        ]
      }
    }
    ````

1. 移行先コンソールの「IAM > Encryption Keys」で移行先バケットを暗号化する KMS キーを作り、Key Users に aws-cli で使うユーザを設定します。
1. 移行先の KMS キー ID を指定しつつ、コピーを実行します。

    ```sh
    aws s3 sync --sse=aws:kms --sse-kms-key-id=（移行元 KMS キー ID） s3://（移行元バケット） s3://（移行先バケット）
    ```
DockerでOverlayFS over XFSするために

OverlayFSは上側に重ねるファイルシステムがファイルタイプを返すd_typeをサポートしていないと使えません。d_typeをサポートしないファイルシステムでOverlayするとwhiteoutファイルをDT_CHRと判定できないため、消したはずのファイル(やディレクトリ)が中途半端に見えてしまいます。

実際にどうなるかというと

```dockerfile:Dockerfile
FROM busybox
RUN mkdir /tmp/a; touch /tmp/a/b
RUN rm -rf /tmp/a
```
このDockerfileでコンテナイメージを`docker build`すると失敗します。

```
$ docker build -t amatsus/ovl-test .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM busybox
 ---> 63e6ca37d7f4
Step 2 : RUN mkdir /tmp/a; touch /tmp/a/b
 ---> Running in fb1dcc19fabb
 ---> e5cf048d5b44
Step 3 : RUN rm -rf /tmp/a
 ---> Running in 7a0b086ad4e9
rm: can't remove '/tmp/a': Directory not empty
The command '/bin/sh -c rm -rf /tmp/a' returned a non-zero code: 1
```

Btrfsやext2/3/4はd_typeをサポートしていますが、XFSもd_typeをサポートしています。ですが現時点ではデフォルトで有効になるディストリビューションは少ないと思います。d_typeを使えるようにするにはXFS v4フォーマットにFTYPEフィールドを付与するか、v5フォーマットでフォーマットします。

```shell-session:xfsprogs-3.2.0から3.2.2まで
# mkfs.xfs -n ftype=1 <device>
もしくは
# mkfs.xfs -m crc=1 <device>
```
xfsprogs 3.2.3以降ではcrc=1がデフォルトになったので、mkfs.xfsにオプションをつけずにv5でフォーマットするか、crc=0にした上でFTYPEフィールドを追加します。

```shell-session:xfsprogs-3.2.3以降
# mkfs.xfs <device>
もしくは
# mkfs.xfs -m crc=0 -n ftype=1 <device>
```
次のコマンドでFTYPEが有効であることを確認できます。

```
# xfs_db -r -c version /dev/mapper/centos-root
versionnum [0xb4b4+0x28a] = V4,ATTR,NLINK,ALIGN,DIRV2,LOGV2,EXTFLG,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT,FTYPE
# xfs_info /var/lib/docker| grep ftype
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
```
ちなみにFTYPEが有効でないときは

```
# xfs_db -r -c version /dev/mapper/centos-root
versionnum [0xb4b4+0x8a] = V4,ATTR,NLINK,ALIGN,DIRV2,LOGV2,EXTFLG,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT
# xfs_info /var/lib/docker| grep ftype
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
```

参考
---
- OverlayFS<br>
https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt
- overlayfs: Can't delete file moved from base layer to newly created dir even on ext4 #9572<br>
https://github.com/docker/docker/issues/9572#issuecomment-218201293
- ovl: Ensure upper filesystem supports d_type<br>
https://github.com/torvalds/linux/commit/45aebeaf4f67468f76bedf62923a576a519a9b68
C/C++用ヘッダオンリライブラリ管理ツールを作った

[chppl](https://github.com/nocotan/chppl-tool)

PythonのpipやRubyのgemsみたいにC/C++にもライブラリ管理ツールほしいなと思って作った。

>シングルファイル C/C++ ライブラリとは, ヘッダファイル .h ひとつだけで機能が実装されているライブラリ(もう少し条件をゆるくして .cc も含む)のことです. header-only とも言われれたりします.
http://qiita.com/syoyo/items/e9d4aff56f691f5b783b

らしい。
ヘッダオンリファイルってスマートだなーって。
登録サイトはheroku上で稼働しています。こちらはPythonで書かれています。
コマンドラインツールの方はC++を使用しています。


##依存パッケージインストール
```$ sudo apt-get install subversion subversion-tools postgresql postgresql-server-dev-9.3```


##インストール方法
```
$ cd  
$ git clone https://github.com/nocotan/chppl-tool  
$ cd chppl-tool/chppl-tool/src
$ make
$ echo "export PATH=$PATH:~/chppl-tool/chppl-tool/bin" >> ~/.bashrc
```

##使い方
###インストール
```
$ chppl install <packagename>
```
###ヘルプ
```
$ chppl help
```

ライブラリの登録、削除は[こちら](http://chppl.herokuapp.com/)
ヘッダオンリライブラリつくったよ〜って人や、便利なライブラリ知ってるぜって人は登録していただけると嬉しいです。


Contributors
@tortuepin
6月11日 フロントエンドの人がWeb APIを語る会 参加メモ


http://kfug.connpass.com/event/32138/

#セッション

##Falcorについて

@pastelInc さん

```
REST APIでは非効率ですか？ならばFalcorで立ち向かってみましょう
```

###Falcor
https://github.com/Netflix/falcor

動画配信大手のNetflixが開発したライブラリ。ミドルウェア。

####カスタマイズした情報を取得できる
データの階層をパスに記述することで、過不足無い情報を送受信できる。

####キャッシュコードの効率を向上させる
重複したアイテムはひとつだけキャッシュする。

→キャッシュコヒーレンシー

キャッシュとメモリの一貫性を保つ

###技術的な構造

####単一の仮想的なjsonモデルに集約して通信
クライアントからは一個のjsonのみあるようにみえる

→JSON Graph

####同じ内容が複数のエントリーにあるような状況
サーバーサイドでは単一の情報としてもっているが、
クライアントサイドでは別々のオブジェクトになるところ、
一個のアイテムとして扱える。

例；最近みた動画リストと、おすすめ動画リスト、それぞれ同じ映画が登録されているとして、その映画に関する情報は同一である。

Falcorが同じアイテムかどうかを判断して、既に別でキャッシュされた同じアイテムがあれば、キャッシュから取ってくる事で、高速に動作できる。

####サーバーサイドのためのRouter

サーバーサイドを JSON Graph グラフに対応させる。

→リクエストを受け取ってから別のAPIを叩くのもあり

→JSON Graph
の設計が結構面倒らしい

→Nodeでの実装になる


##WordPressをAPIでぶん回す

岡本秀高 さん

```
WordPressコア実装を目指して開発が進められているWP REST API。 Reactでのフロント実装やAWS Lambdaと組み合わせた使い方など、事例やコードを紹介します。
```
https://speakerdeck.com/hideokamoto/wordpresswoapidebunmawasu

###WordpressのデータをjsonでとってこれるAPI

管理画面とViewの分離

現状では知っている人にとっては結局WP関数のほうが便利

###従前のWPのテーマとプラグインの問題点

密に結合しているため、1箇所落ちると全部ダメになる。

→ APIで疎結合にすることで、完全に落ちる事は少なくなる

###まだベータ版
現在はプラグイン形式で有効にしたら使える

###IONICとかで使うと便利

自分のブログをアプリ化したり


##GitHub Pages を Web API として使う

カイト さん

```
GitHub の API ではなく、GitHub のサービスの一つである GitHub Pagesを使って、サーバなしで Web API を提供
```
https://speakerdeck.com/ixkaito/github-pages-wo-web-api-tositeshi-u

### Jekyll Pages API を使う

Jekyll サイト内のすべてのページなどのデータを元にJSONファイルを生成する

### GitHub Pages を使うメリット

インフラのメンテが不要

記事もすべてGit管理

スタティックファイルの配信なのでセキュリティリスクが低い

### GitHub Pages は、許可されたプラグイン以外は使用できない

→Jekyll Pages APIは使えない

####ローカルで生成してプッシュする？
→面倒

####TravisCIなどの外部サービスで自動化する
→学習コストがかかる
→公開されるまで時間がかかる

####Rakefileなどによるデプロイ
→Rakefileを作る必要がある
→git以外にデプロイ用のコマンドを実行する必要がある

##GraphQLについて

おのうえ(@_likr) さん

```
フロントエンドの変更のためにバックエンドのWeb APIまで修正なんてもうやってられない？ GraphQLでその悩みを解決しましょう。
```

###最大公約数的なAPIになりがち
不要な情報がつめこまれたり、ページ毎に乱立したり。
無秩序に拡張される、つらいAPIに、、、

###GraphQLで解決
Facebookの提唱するクエリインタフェース

フロント側で取ってきたいクエリーを書けば必要なフィールドだけとってこれる。

柔軟なクエリインタフェースを低コストで実装できる。

expressのミドルウェアとして動く

###自由なところ

クライアントサイド、サーバーサイド自由に構築できる

#LT

オープンデータを自動デプロイしたい話が多かった

##Lambda+GItHub+Travis CIで全自動サーバーレスAPI
宮内隆行 さん
https://speakerdeck.com/miya0001/lambda-plus-github-plus-travis-citequan-zi-dong-saharesuapi

###madefor
https://github.com/madefor

オープンソースで自治体の足りないところを補完する活動

###郵便番号API
https://github.com/madefor/postal-code-api

Lambdaから毎日Travis叩いて自動更新


##Node.jsでWebサイトからAPIを作るプログラムを書いた話
@potate4d さん
https://speakerdeck.com/potato4d/node-dot-jsdewebsaitokaraapiwozuo-rupuroguramuwoshu-itahua

最低賃金APIってない？というFB上の一言から。

Webサイトで公開されている情報のAPI化需要がある。

SJISの扱いは面倒。


## 行政のCSVファイルを 勝手にAPIにしてみた話
岡本秀隆 さん
https://speakerdeck.com/hideokamoto/xing-zheng-falsecsvhuairuwo-sheng-shou-niapinisitemitahua

### 和歌山県がgithubでオープンデータを公開している
https://github.com/wakayama-pref-org

役所のデータなので、CSV、SJIS

json化したら使いやすくなる

### 試しに図書館の貸出ランキングをJSON API化
https://github.com/hideokamoto/Prefectural-Library-Loan-Best

Travisでデプロイ自動化

FBでGitHubの人や和歌山県の人からリアクション

### 思いつきでもやってみたら喜ばれる

##mocha + superagent + power-assert で始めるAPIテスト入門
後藤知宏 さん

（すみません、メモ消えてしまいました）
pod installとpod updateの違いについて

以下コマンドの違いがあまりわかってなかったので調べました。

 - pod install
 - pod update

# ヘルプで確認

```shell-session
$ pod --help

(実行結果より一部抜粋)
+ install       Install project dependencies according to versions from a Podfile.lock
+ update        Update outdated project dependencies and create new Podfile.lock
```

 - installは**Podfile.lockをみて**インストールする
 - updateは**Podfile.lockをみずに**インストールする、さらにPodfile.lockを更新する

# Podfile.lockとは
 - install時にPodfile.lockがない場合、生成される
 - pod install時の各ライブラリのバージョンが記載されている

```
(Podfile.lockより一部抜粋)
PODS:
  - ChameleonFramework (2.1.0):
    - ChameleonFramework/Default (= 2.1.0)
  - ChameleonFramework/Default (2.1.0)
  - SVProgressHUD (2.0.3)
```
 - ライブラリのバージョンを保持しておくことで、共同開発などでライブラリのバージョンの差異を防ぐ

# 参考
 - [Xcode&gitで開発する時の.gitignore](http://qiita.com/kasajei/items/8c9ba3030c3eae736e89)
 - [Using CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)
GitHubのショートカット

つい最近、GitHubを見ながら間違えてキーボードを押してしまったらこんなものが！

![スクリーンショット 2016-06-13 18.42.33.png](https://qiita-image-store.s3.amazonaws.com/0/41813/751a7a34-c281-e797-5c9a-0b23c4843729.png)


どうやら指定した行に飛べるらしい。

他にもあるんじゃね、ということで、探してみました。


## w
**ブランチ切り替えのメニューにジャンプ！**

![スクリーンショット 2016-06-13 18.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/41813/461d14f2-768a-c2f8-a43b-3abddd14d358.png)


## s
**検索フォームへ移動!**

![スクリーンショット 2016-06-13 18.45.10.png](https://qiita-image-store.s3.amazonaws.com/0/41813/aa167327-d4be-9866-cf51-a39533edf0e0.png)


## l
**jump to line**

![スクリーンショット 2016-06-13 18.47.20.png](https://qiita-image-store.s3.amazonaws.com/0/41813/5f48bb34-f186-e148-7240-0ebf5b16971a.png)


しかもGoするとハイライト付き

![スクリーンショット 2016-06-13 18.47.25.png](https://qiita-image-store.s3.amazonaws.com/0/41813/1757c839-9d47-9788-b275-1beaf85dfe35.png)


## y
**ハイライトされている行を一番上にする**

![スクリーンショット 2016-06-13 18.49.21.png](https://qiita-image-store.s3.amazonaws.com/0/41813/e483474f-35bb-b413-c5bb-c9685da5c6f6.png)


## t
これは何て言ったらいい機能なのか、、、
**ファイル検索？**

![スクリーンショット 2016-06-13 18.51.12.png](https://qiita-image-store.s3.amazonaws.com/0/41813/885940c4-20ff-57a1-d161-fb933b7a728e.png)

こんな画面が出てきて。。。

ファイルの検索ができる

![スクリーンショット 2016-06-13 18.51.52.png](https://qiita-image-store.s3.amazonaws.com/0/41813/b7a326f8-c788-f5a8-04aa-731a510d7edc.png)



### ?
@paselaさんに教えていただき、?でヘルプが見れることを知りました！

そして押してみるとこんなに。。。

![スクリーンショット 2016-06-14 10.23.54.png](https://qiita-image-store.s3.amazonaws.com/0/41813/336694f6-acab-4e51-9163-4999a9a89a1a.png)
whenever gem を 0.9.4 から 0.9.5 にアップデートしようとすると Gem::Package::PathError

↓な感じでエラーになってアップデートに失敗しました。ちなみに `rbenv install 2.3.1` したばかりのﾎｯｶﾎｶ環境です。

```
$ bundle update whenever
...
Gem::Package::PathError: installing into parent path .../vendor/bundle/gems/capistrano/v3/tasks/whenever.rake of .../vendor/bundle/gems/whenever-0.9.5 is not allowed
```

結果論ですが `gem update --system` してからアップデートしなおしたら成功しました。

参考
----

- [getting "Gem::Package::PathError: installing into parent path" when building with rubygems ~> 2.5 · Issue #1448 · rubygems/rubygems](https://github.com/rubygems/rubygems/issues/1448)
- [Add support for packaging specs that contain symlinks by segiddins · Pull Request #1209 · rubygems/rubygems](https://github.com/rubygems/rubygems/pull/1209)

```
$ pwd
.../src/github.com/javan/whenever
$ find . -type l
./lib/whenever/tasks/whenever.rake
```

追記
----

シンボリックリンクを使わない様にして対応された 0.9.6 がリリース済み。

https://github.com/javan/whenever/commit/1d2c4a51d478f14e5b359864cc090e484fdc38de
Singletonパターンはどのようなときに使うのか？


# Singletonパターンは、基本的には「使用非推奨」
**Singletonパターンは、基本的には「使用非推奨」**です。  
次のうちどれか **1つにでも当てはまる場合は、Singleton で は な い** と思います。

* setter が1つ以上存在する
    * ≒ public な変数が存在する
* コンストラクタが1つ以上の引数を持っている
* 初期化され得る
    * 「初期状態」と「非初期状態」が存在するので、ダメ。
* 副作用のあるメソッドが1つ以上ある
    * ファイルへのI/O
    * 標準入出力の使用
    * ネットワーク経由でのデータの送受信
    * DB への CRUD 操作
    * 乱数を使っている
    * システムの時刻を参照している
    * その他、その Singleton クラスから外の情報に依存した処理

# Singletonが使えるとき
**以下の条件をすべて満たすクラスは、Singleton** にしても良いかもしれません。

* 別のクラスを継承したり、インターフェースを実装したりする
    * もしくは、継承される
* 属性は **ない**
    * コンストラクタは引数が **ない**
    * Setterが1つも存在し **ない**
* staticなメソッドのみ **ではない**

こんな条件を満たせるクラス、そう滅多にないでしょう。

# 使うべきタイミング

## 『オブジェクト指向における再利用のためのデザインパターン』

『オブジェクト指向における再利用のためのデザインパターン』P.144 によると、Singletonパターンに関係するパターンは、以下の3つだそうです。

* Abstract Factory パターン
* Builder パターン
* Property パターン

### Abstract Factoryパターン
『オブジェクト指向における再利用のためのデザインパターン』P.98 によると、

> Abstract Factoryパターンを実装するために、次のような役に立つテクニツクがある。
> 1. Singletonパターンを利附する。典型的なアプリケーションでは、部品の集合ごとにConcreteFactoryクラスのインスタンスを1つしか必要としない。したがって、通常ではConcreteFactoryクラスをSingletonパターンを使って実装することが最良の方法になる。

らしいです。

### Builderパターン
『オブジェクト指向における再利用のためのデザインパターン』P.114 には、

> Abstract Factoryパターン(p.95) このパターンは、複合オブジェクトを作成するという点でBuilderパターンに類似している。主な違いは、Builderパターンでは複合オブジェクトを段階的に作成していく過程に焦点をあてているのに対して、AbstractFactoryパターンでは部品の集合を強調している(それが単純で、あっても複雑であっても)という点である。Builderパターンでは、Productオブジェクトを最終段階で返すことになるが、AbstractFactoryパターンでは即座に返す。

と書かれています。
Buidler パターンの方にはは書かれていませんが、 **Factory系であることには変わりないので、同じ理由で「最良の方法になる」** のでしょう。

### Propertyパターン
cloneされる元の**Concrete Prototypeは、状態を持たない（もしくは、初期状態から変化しない）から、Singleton"でも"良い**、ということでしょうか。  
しかし、

> 3.複製の初期化を行う（『オブジェクト指向における再利用のためのデザインパターン』P.132）

とあり、「非初期状態」の Concrete Prototype オブジェクトというのもありそうです。
この場合は、Singleton にはしないほうが懸命でしょう。

## [シングルトンの賢い使用法（の「本当にシングルトンである場合」）](http://www.ibm.com/developerworks/jp/webservices/library/co-single.html#d)

この記事によると、以下の条件をすべて満たす場合は、Singletonらしいです。

* すべてのアプリケーションは、**まったく同一の方法で**このクラスを使用するか? (「まったく」がキーワード)
* すべてのアプリケーションは、**常に**このクラスの**1つの**インスタンスのみを必要とするか? (「常に 」と「1つの」がキーワード)
    * 「インスタンスが2つ以上あると困る」ということだと思う
* このクラスのクライアントは、自分自身がその一部に含まれているアプリケーションを意識しないべきか?

## [Singleton パターンの使いどころをまとめてみた](http://qiita.com/trashtoy/items/eea5dcfb1eb003101cc9#singleton-%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E5%85%B8%E5%9E%8B%E4%BE%8B)

「生きている」と「非生きている（＝死んでいる）」の2つの状態があるだろって思ったけど、それは「インスタンスが存在するかどうか」なので、大丈夫です。たぶん。

要するに、以下の条件をすべて満たす場合は、Singletonにしても良い、ということでしょう。

* 継承したりされたりする
* 属性（メンバ変数とかプロパティとかフィールドとか言うアレ）が存在しない
  
# 参考文献
[オブジェクト指向における再利用のためのデザインパターン](http://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF-%E3%82%AC%E3%83%B3%E3%83%9E/dp/4797311126)
[Singleton パターンの使いどころをまとめてみた](http://qiita.com/trashtoy/items/eea5dcfb1eb003101cc9)
[Singleton何が悪いの？](http://qiita.com/mo12ino/items/abf2e31e34278ebea42c)
[シングルトンの賢い使用法](http://www.ibm.com/developerworks/jp/webservices/library/co-single.html)
Excel > ヘッダ項目があるファイルから時系列グラフ作成

```txt:動作確認
Excel 2013 on Windows 8.1 pro
```

## やりたいこと

以下のような項目のファイルがあるとする。
2行目までは付随情報が入っており、4行目からデータがあるとする。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c29d25ac-535b-8eae-ddbf-da0585544f7b.png)

上記のファイルからB列[時刻]とG列[data5]からなる時系列グラフを手早く作りたい

## 失敗 (散布図)

以下は失敗した。

- Ctrlを押しながらB列を選択
- Ctrlを押しながらG列を選択
- 散布図としてグラフ作成

横軸が時刻にならず失敗

## 成功 (2D折れ線グラフ)

なんとなく見つけた方法

- Ctrlを押しながらB列を選択
- Ctrlを押しながらG列を選択
- 2D折れ線としてグラフ作成

この時点で横軸が時刻のグラフになっている

しかし2行目のデータがグラフの先頭のポイントとして存在しているので以下を行う

- グラフ上で右クリック、「データの選択」を選択
- 「横（項目）軸ラベル」の2行目のデータ(4)のチェックをはずす

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2f820e71-ff94-31b2-6b91-aff145852381.png)
bash / sh  | コマンド内容を見るためだけの echo デバッグとさよなら！ コマンド自体を標準出力する方法 

`-x` オプションを使う。

# ファイル

```bash:good_bye.sh
echo ABC
```

# 実行

```bash
$ sh -x good_bye.sh
```

# 結果

コマンド自体も標準出力されているのが分かるだろう。

```bash
+ echo ABC
ABC
```

# 環境

- sh-3.2
- bash-3.2
- Max OS X El Capitan 10.11.4

# 参考

- [bashスクリプトにおいて、  コマンドを実行しながら、そのコマンドを画面に表示したいです。](http://q.hatena.ne.jp/1319616956)

( ファイル先頭で -x を指定する方法は、自分の環境だとうまく動かなかった )








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
brew cask list とするとインストールしたはずのCaskが表示されない


`brew cask list`と実行すると、エラーが出力されて今までインストールしたCaskが表示されなかった。

```shell-session:terminal
$brew cask list
Error: nothing to list
```

そこで`brew cask doctor`と実行してみる。

```shell-session:terminal
$brew cask doctor
==> OS X Release:
10.11
==> OS X Release with Patchlevel:
10.11.5
==> Hardware Architecture:
intel-64
==> Ruby Version:
2.0.0-p648
==> Ruby Path:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
==> Homebrew Version:
Homebrew 0.9.9 (git revision e1f0; last commit 2016-06-12)
Homebrew/homebrew-core (git revision 65dd; last commit 2016-06-13)
==> Homebrew Executable Path:
/usr/local/bin/brew
==> Homebrew Cellar Path:
/usr/local/Cellar
==> Homebrew Repository Path:
/usr/local
==> Homebrew Origin:
https://github.com/Homebrew/brew
==> Homebrew-cask Version:
0.60.0 (git revision 23a0; last commit 3 hours ago)
==> Homebrew-cask Install Location:
<NONE>
==> Homebrew-cask Staging Location:
/usr/local/Caskroom
...
```

`Homebrew-cask Staging Location`がいつのまにやら `/opt/homebrew-cask/Caskroom`から`/usr/local/Caskroom`に変更されている。この[変更](https://github.com/caskroom/homebrew-cask/pull/21857)による影響と思う。

## マイグレーションの方法は2通り

### Caskroomの内容を移動させる方法

Finderを使って`/opt/homebrew-cask/Caskroom`以下のフォルダを、`/usr/local/Caskroom`に移動させた。すると、

```shell-session:terminal
$brew cask list
0xed		 atom		  calibre	   filezilla	    mactracker	     soapui	      virtualbox
adobe-reader-ja	 bartender	  coteditor	   flux		    onyx	     vagrant	      wireshark
appcleaner	 cakebrew	  dash		   gitbook-editor   skitch	     vagrant-manager  xquartz
```

無事に表示された。あとは`~/Applications`にあるエイリアスを再作成すればOK。

### 環境変数 HOMEBREW_CASK_OPTS で対応

Staging Locationが変更になったというメッセージが出ることがあるので、その指示に従って環境変数`HOMEBREW_CASK_OPTS`を`.bash_profile`に設定する。

```shell-session:.bash_profile
# Homebrew Cask migration
export HOMEBREW_CASK_OPTS='--caskroom=/opt/homebrew-cask/Caskroom'
```

`.bash-profile`を再読込すれば、ファイルの移動をせずに`Homebrew Cask`を使用し続けることができる。
Debianにnginxをインストール(自分用メモ)

Debianにnginxをインストールする手順

### nginxのインストール
~~~
# apt-get install nginx
Reading package lists... Done
Building dependency tree 
Reading state information... Done
.
.
.
~~~

### nginxを立ち上げる
~~~
# /etc/init.d/nginx start
Starting nginx: nginx.
~~~

### curlのインストール
~~~
# apt-get install curl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
.
.
.
~~~

### 確認
~~~
# curl http://[IPアドレス]
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>
</body>
</html>
~~~
キャプション生成モデルに対して fooling image を作成した

元論文
[Deep neural networks are easily fooled High confidence predictions for unrecognizable images](https://arxiv.org/abs/1412.1897)
DNN の中身を知るために，人間には理解できないが 99% 以上の confidence で DNN に分類させる画像を生成したという内容．
例えば以下のようになるようだ．
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/127010/87012d4f-fb76-fb52-0315-312978d29311.jpeg)
![jkljkljlklk.JPG](https://qiita-image-store.s3.amazonaws.com/0/127010/ab7f8360-ed24-c68b-640d-7d157f29e38c.jpeg)
(論文から引用)

この fooling image を generating model に対しても生成してみる．
# ふつうのキャプション生成例
こんなかんじ
![Ci0S0LkU4AE5DjK_orig.jpg](https://qiita-image-store.s3.amazonaws.com/0/127010/f764b501-f17b-2288-cf2e-b5542038c9b2.jpeg)
馬の画像を入れるとこのようなキャプションがでてくる．馬のようなものが2匹見えているらしい．
単語の出現確率から文の出現確率が計算される．出やすい文3つを表示している．
左の数字が小さいほどその画像に対してより適切な文であると判断している．
(実際には単語ごとのsoftmaxの対数の和の符号反転を単語数で割ったもの)

またピクセルの値をランダムにした画像を入れると次のような文が生成される．
![Ci0S0MjUYAAGFzR_orig.jpg](https://qiita-image-store.s3.amazonaws.com/0/127010/3801877f-8fe6-060d-953e-b48c443ddb68.jpeg)
一応文になっているが，数字が大きい，つまり画像に何があるのか判断できていないということ．
# fooling image 生成結果

とりあえずうまく生成できた．
![Ci0HI4LUgAAhh_W_orig.jpg](https://qiita-image-store.s3.amazonaws.com/0/127010/9ce6e46a-728b-00ed-f847-aa6a4293b0c5.jpeg)
![Ci0HI4AUUAAUxX5_orig.jpg](https://qiita-image-store.s3.amazonaws.com/0/127010/9b920a1f-34ad-2af8-c5b7-525fa3bdbaee.jpeg)

2枚生成させた．どちらも人間には何かわからず，機械は高い確率で馬に関する文を生成している．(=先の例よりも数字が小さい)

上：direct encoding，画像のピクセルを直接遺伝子としている
下：indirect encoding，ピクセル同士が何か相関を持っている
論文では indirect encoding のほうではきれいな模様ができており，アートとして展示したそうだが，てきとうに NN を作って相関を持たせただけではうまくいかなかった．(多分てきとうすぎた)
# どうやった
ある1つの文の生成確率が高くなるように画像を進化させた．
てきとうに最初の例で生成されてた文の1番上の
"a couple of horses are standing in a field"
を選び，この文の生成確率が高くなるように画像を進化させていった．
毎回8つ新しい個体が生成され8つ優れた個体を残すようにし，direct encoding では300世代程度でこのような結果となった．
# 生成モデルについて
今回はキャプション生成モデル Show, Attend and Tell に対して fooling image の生成を行った．
モデルの COCO に対する BLEU値は 0.689/0.503/0.359/0.255 だった．

# まとめ
進化的アルゴリズムを使って生成モデルに対してある文の生成確率が高くなるような fooling image の生成に成功した．この画像は同じCNNで学習した他のモデルに対しても fooling できるのか，複数の文に対して進化させるとどうなるのか，気が向いたら試してみる．
Realmで保存場所を指定する方法


```objc:
//Realm保存用のディレクトリ
#define REALM_DIR_PATH @"/Library/Caches/jp.co.apps.xxxx/"

//Realmファイル名
#define REALM_FILE_NAME @"default.realm"


```


```objc:
    
#pragma mark --RealmをConfigurationオブジェクト使って作成
-(RLMRealm *)createRealmWithConfiguration
{
    NSString *realmDirPath = [NSHomeDirectory() stringByAppendingPathComponent:REALM_DIR_PATH];
    realmDirPath = [realmDirPath stringByAppendingPathComponent:REALM_FILE_NAME];
    
    // declarations
    RLMRealmConfiguration *configuration = [RLMRealmConfiguration defaultConfiguration];
    configuration.fileURL = [NSURL fileURLWithPath:realmDirPath];

    RLMRealm *realm = [RLMRealm realmWithConfiguration:configuration error:nil];
    
    return realm;
}

```

こんな感じです。
ec-cube3にwordpressを組み込む

はじめまして、最近ec-cubeを使い始めたものです。
phpやscriptの知識はあります。
ec-cube3にwordpressを組み込み
twigでwpの関数を使う方法がわかりません、2系の記事は多くあるのですが、、、
どこまで2系と一緒でいいのか、wpはデータベースを別にした方がいいのか、twig内での記事投稿のサンプルなど
あれば教えて頂きたいです。よろしくお願いします。
C#からOpenCVを動かしてみた


## 環境
- Windows 10 Education
- Visual Studio 2013 Professional

## インストール

入手したVisual Studio 2013のISOファイルをタブルクリックします．
![01.png](https://qiita-image-store.s3.amazonaws.com/0/128610/570b6c69-7448-0e4f-2b79-4ab4fc10eb8d.png "01.png")

「vs_professional.exe」というファイルをタブルクリックします．
![02.png](https://qiita-image-store.s3.amazonaws.com/0/128610/e74cbb78-aed4-07b5-34a1-370312cfbb75.png "02.png")


「ライセンス条項およびプライバシーポリシーに同意します」のチェックボックスにチェックを入れて，「次へ」ボタンをクリックします．
![03.png](https://qiita-image-store.s3.amazonaws.com/0/128610/3d375a14-af54-6387-bbf2-3a3506174982.png "03.png")


「インストール」ボタンをクリックします．
![04.png](https://qiita-image-store.s3.amazonaws.com/0/128610/eaff7065-8c71-2f45-dc80-af35c5c9d2c5.png "04.png")

しばらくインストールに時間がかかります．
処理が完了したら↓の様な画面になるので，「起動」ボタンをクリックします．
![06.png](https://qiita-image-store.s3.amazonaws.com/0/128610/823bb3b5-a2bb-e5a5-0c35-b67310edf4c8.png "06.png")

ここでは，Visual Studioへサインインしません．
（サインインしたい人は後で各自サインインしてください）
![07.png](https://qiita-image-store.s3.amazonaws.com/0/128610/ec5b8ec6-4607-32c5-3ec0-7553aad0f887.png "07.png")

好みの配色テーマを選んで「Visual Studioの開始」をクリックします．
![08.png](https://qiita-image-store.s3.amazonaws.com/0/128610/03aae04f-e6b1-6f6a-e5e2-1c069ab7e237.png "08.png")

Visual Studioが起動したらプロジェクトを作成します．
メニューから「ファイル」→「新規作成」→「プロジェクト」をクリックします．
![10.png](https://qiita-image-store.s3.amazonaws.com/0/128610/aa6fd195-0a28-33a1-58e4-5fca0d5cea2d.png "10.png")

左のペインから「Visual C#」を選択
→中央のペインから「コンソールアプリリケーション」を選択
→好きな名前をつけて「OK」ボタンをクリックします．
![11.png](https://qiita-image-store.s3.amazonaws.com/0/128610/9578df85-9b04-bbfd-a7a3-87f57ea93d5f.png "11.png")

メニューから「プロジェクト」→「NuGetパッケージ管理」をクリックします．![12.png](https://qiita-image-store.s3.amazonaws.com/0/128610/ffeeb460-8ad5-3bb4-ce84-cdba8a91e098.png "12.png")

NuGetパッケージ管理のウィンドウが開きます．
左のペインから「オンライン」を選択
→右上の検索ボックスに「opencv」と入力
→中央の検索結果の「OpenCvSharp2」を選択して「インストール」ボタンをクリックします．
![16.png](https://qiita-image-store.s3.amazonaws.com/0/128610/f21e9505-dd28-3d3e-9b4d-b27ec238f373.png "16.png")

インストールが完了すると緑色のチェックマークが現れるので，「閉じる」ボタンをクリックします．

## 実際に画像処理してみる
「Program.cs」に↓のように書き込みます．

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace OpenCV_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var img = new IplImage(@"C:\Lenna.png"))
            {
                Cv.SetImageROI(img, new CvRect(200, 200, 180, 200));
                Cv.Not(img, img);
                Cv.ResetImageROI(img);
                using (new CvWindow(img))
                {
                    Cv.WaitKey();
                }
            }
        }
    }
}
```

- メインの中だけでなく，「using OpenCvSharp;」も忘れずに書き足してください．
- レナさんの写真を「C:\Lenna.png」に配置してください
	- レナさんの写真は「lenna」でGoogle画像検索するとトップに出てくると思います

F5ボタンで実行すると顔の色が反転したレナさんが出力されるはずです．
![19.png](https://qiita-image-store.s3.amazonaws.com/0/128610/d4efc270-6d0e-a838-9fff-621d2fde345a.png "19.png")



## 参考にしたページ
- [OpenCvSharpをつかう　その17(NuGetで導入)](http://schima.hatenablog.com/entry/2013/12/15/110513)
AWS Summit Tokyo 2016 - サーバーレスで構築する、マイクロサービスの未来形


# セミナーの基本情報

* 時間
 * 14:20 ～ 15:00
* 場所
 * グランドプリンスホテル新高輪　飛天
* 発表者
 * Tim Wagner (General Manager of AWS Lambda and Amazon API Gateway, Amazon Web Services, Inc.)
* 概要：
 * AWS Lambda はサーバーレスで、マイクロサービスを構築するための主要コンポーネントであり、AWS Lambda を使用することで、モバイルやウェブ、IoT アプリケーション用のスケーラブルなマイクロサービスをより簡単に構築することができる 


# 内容

## AWS computing
* VM
    * スケーリング単位としてのマシン
    * ハードウェアの抽象化
    * マシン、ストレージ、ネットワーク、OSを構成したい時に、EC2を選べる
* コンテナ
    * スケーリング単位としてのアプリ
    * OSを抽象化
    * サーバーを実行し、アプリケーションを構成し、スケーリング制御したい時に、ECSを選べる
* サーバーレス
    * スケーリング単位としての機能
    * 言語ランタイムを抽象化
    * コードが必要なときに実行したいで、AWS Lambdaを選べる

## AWS Lambdaのメリット
* サーバー管理不要
* 継続的なスケーリング
* アイドル時間は課金されない


## ユースケース
### データ圧縮処理
* データをS3に保存
* S3バケットイベントで、lambdaへ通信
* Lambdaで圧縮済みのデータをS3へ保存

### サーバーレスウェブアプリ
* 静的なコンテンツを提供するAmazon S3
* 動的なコンテンツ提供するAWS Lambda
* HTTPアクセスを提供するAmazon API Gateway
* NoSQLデータストレージを提供するAmazon DynamoDB

### サーバーレスアプリケーションエコシステム
* Amazon Echoから、Lambda経由して、Slackへメッセージ送信
* スケジュールされたポーリングによりメッセージを取得
* Echoで結果をユーザに報告
Linux | リンゴはどこへ消えた？ xargs の後続サブコマンドにパイプが渡せない

# 検証

## echo する

当たり前だが、出力される。

```shell-session
$ echo Apple is here.

Apple is here.
```

## echo に対して grep する

Apple に A が含まれているので、当然出力される。

```shell-session
$ echo Apple is here. | grep A

Apple is here. 
```

## サブコマンドの中で grep する

出力される。

```shell-session
$ echo $(echo Apple | grep A) is here.

Apple is here.
```

## xargs に引数を渡して echo する

出力される。

```shell-session
$ echo 'Apple' | xargs -I FRUIT echo FRUIT is here.

Apple is here.
```

参考 : [Linux | xargs の -I オプションで 後続コマンドに引数を渡す(的なことをする)](http://qiita.com/YumaInaura/items/fc79ce003978596db976)



というかこれは、 xargs の外の処理だ。

## xargs に渡した引数をサブコマンドの中で使う

これも出力される。

```shell-session
$ echo 'Apple' | xargs -I FRUIT echo $(echo FRUIT) is here

Apple is here.
```

## xargs に渡した引数をサブコマンドの中で grep する

リンゴが消える。

```shell-session
$ echo 'Apple' | xargs -I FRUIT echo $(echo FRUIT | grep A) is here 

is here
```

# 環境

- Mac OS El Capitan 10.11.4








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Apache】エラー： Invalid command 'SSLPassPhraseDialog', perhaps misspelled or defined by a module not included in the server configuration

#【Apache】エラー： Invalid command 'SSLPassPhraseDialog', perhaps misspelled or defined by a module not included in the server configuration

***Apacheの起動で上記のエラーが出力された時の対応メモ***

・httpd.confにmod_ssl.so読み込む設定をしているか確認
```LoadModule ssl_module modules/mod_ssl.so
```
設定してあった :expressionless: 

・そもそもmod_ssl.soがあるかコマンド叩いて確認
```# find /etc/httpd/modules/ -name mod_ssl.so```
ない :scream: 

・yumでインストール
```# yum -y install mod24_ssl
〜〜省略〜〜
Complete!```


・mod_ssl.soがインストールされてるか再度コマンド叩いて確認
```# find /etc/httpd/modules/ -name mod_ssl.so
/etc/httpd/modules/mod_ssl.so```
あった :joy: 

・起動してみる
```# /sbin/service httpd start
Starting httpd:　[  OK  ]
```
:tada: 

ひとまず解決。
GitHubのprivate ripositoryの代わりにAWS CodeCommitを使う

# 欲しかった環境
* 雑多なコードの為のprivate repository
	* できれば個数の制限無し
	* とりあえずコミットしておける環境
* 費用がかからない

githubの有料プランも考えましたが、雑多なコードの為にそれはしたくなかったのでAWS CodeCommitを試してみました

# 料金と制限について
[CodeCommit - 料金](https://aws.amazon.com/jp/codecommit/pricing/)
[AWS 無料利用枠](https://aws.amazon.com/jp/free/)
こちらにある通り現状では下記範囲が無期限提供分で無償となっています。


**AWS CodeCommit**  

1. 1. 1 か月当たり 5 アクティブユーザー
1. 1 か月当たり 50 GB – 月のストレージ
1. 1 か月当たり 10,000 Git のリクエスト

個人でしか参照しないコードであればアクティブユーザー数も関係ないので2と3の条件を超えなければ無料で利用する事ができます。
(個人では超えないぐらいの使い方しかしてないので私はこれで十分でした)

# 使い方
[CodeCommit 出来ることのまとめ & Setting Up](http://qiita.com/rev4t/items/6dc7d52b341ac5245e4e)

こちらを参考にさせてもらいました。


> AWS CodeCommit の SSH キーのアクセスキーを設定します。
> IAMのアクセスキーIDとは異なるため、ご注意ください。

この部分を注意して.ssh/configのUserを設定すればあとは普通に使えるかとおもいます。
あとは普通にgitのリポジトリとして使う事ができます

# その他
Triggerの設定でLambdaが使えるのでAWS上で何かするコードもここに上げるのが使い勝手がよさそうです。
その場合はgithubとCodeCommit両方を使ったりもでてくるとおもいます。

# まとめ
* 個人利用であれば問題なく使えますが
	* まだpull request等は使えない
	* 複数人で使うのであれば別環境使う方がよいです
* AWSのサービス使うコードはここを使うと連携がしやすそうです
めざせNode.jsライブラリマスター （11）scribbletune

#【ライブラリ説明】
　音楽作成

#【プログラム】
```js:scribbletune.js
var scribble = require('scribbletune');
var chords = scribble.clip({
	notes: [
		scribble.chord('f#', 'minor', 3),
		scribble.chord('c#', 'minor', 3),
		scribble.chord('d', 'major', 3),
		scribble.chord('f#', 'minor', 3),
		scribble.chord('c#', 'minor', 3),
		scribble.chord('b', 'minor', 3),
		scribble.chord('f#', 'minor', 3),
		scribble.chord('c#', 'minor', 3),
		scribble.chord('e', 'major', 3),
		scribble.chord('f#', 'minor', 3),
		scribble.chord('c#', 'minor', 3),
		scribble.chord('d', 'major', 3)
	],
	pattern: 'x_x_x_--'.repeat(8),
	sizzle: true
});

scribble.render(chords, 'chords.mid');
```

#【参考サイト】
　[npm](https://www.npmjs.com/package/scribbletune)
　[github](https://github.com/walmik/scribbletune)
PostgreSQLを使ってDBのバックアップ＆リストア


## 目的

* seedなどを使ってマスタを構築するのだが、そのseedが正しく動くかを確認するために、以下の作業を繰り返したい
	1. DBのダンプ
	2. seedスクリプト、データの登録
	3. データの確認
	4. DBのリストア
	5. スクリプト、データの修正(2に戻る)

* ダンプ、リストアの手順をまとめる
* また、テーブルのみの場合の手順も一緒にまとめておく


## 手順(フル)

* ダンプ

	```shell
    $ PGPASSWORD=password pg_dump -U user -d database > ~/dump/dumpfile.sql
    ```


* リストア

	```shell
	$ # database削除
	$ PGPASSWORD=password dropdb -U user database
	$ # database作成
	$ PGPASSWORD=password createdb -U user database
	$ # リストア
	$ PGPASSWORD=password psql -U user database < ~/dump/dumpfile.sql
	```

## 手順(テーブルのみ)

* テーブルのみダンプ

 	```shell
    $ PGPASSWORD=password pg_dump -U user -d database -t table > ~/dump/tablefile.sql
    ```

* テーブルのみリストア

	```SQL
	SQL> # table削除
	SQL> DROP TABLE `table_name`
	```
	
	```shell
	$ # リストア
	$ PGPASSWORD=password psql -U user database < ~/dump/tablefile.sql
	```

### 注意

* 当然ですが、スキーマが変わってると、Rails等のmigrateの状態がおかしくなるので、気をつけましょう。
めざせpythonライブラリマスター （56）colorthief

#【ライブラリ説明】
　画像に使われている色を取得

#【プログラム】
　こちらの画像を使いました。
　![imoyokan.jpg](https://qiita-image-store.s3.amazonaws.com/0/121997/87624cd4-8782-5c2b-b24c-62f3216b7e8e.jpeg)


```py:colorthief.py
# -*- coding: utf-8 -*-

from colorthief import ColorThief

color_thief = ColorThief('imoyokan.jpg')
# １番多く使われている色
dominant_color = color_thief.get_color(quality=1)
print dominant_color
# (43, 37, 27)

# 使われている色を６種類に分ける
palette = color_thief.get_palette(color_count=6)
print palette
# [(212, 173, 94), (42, 36, 27), (104, 64, 46), (123, 100, 46), (231, 199, 154), (73, 84, 78)]
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/colorthief/0.2)
　[github](https://github.com/fengsp/color-thief-py)