OmniAICreator/Qiita-1.07M huggingface dataset:
APIの戻りを特定のTypescriptクラスにマッピングしてキッチリ管理したい


`java`だとよくやるマッピングのお話。`Typescript`を使っているので型の恩恵を受けたい！ということでJSON形式のAPIの戻りを任意のクラスにマッピングしてみる。

```object-mapper.ts
export default class ObjectMapper{

  private static DEFAULT_MAPPER:(string,any)=>any = (s:string,a:any)=>null

  static fromJson<T>(type:{new ():T},json:any,mapper:(string,any)=>any = ObjectMapper.DEFAULT_MAPPER):T{
    let instance = new type()
    for (var key in json) {
      if (instance.hasOwnProperty(key) && json[key] != null && json[key] != undefined) {
        let obj = mapper(key,json[key])
        if(obj){
          instance[key] = obj
        }else{
          instance[key] = json[key]
        }
      }
    }
    return instance
  }
}
```

同名プロパティをそのままマッピングする。入れ子になっているクラスはmapperでインスタンスを作成して返す。名前が違うプロパティのときもmapperを使う。
タイプの指定方法が少し特殊。


```使いかた
let res = ...//APIの戻り

ObjectMapper.fromJson(Category, res , (key:string, value:any) => {
  if(key === 'sub_category'){
    return SubCategory.from(value)
  }
  return null
})

```

・`hasOwnProperty`で余計なプロパティが生えないようにしているつもりだが、マッピング対象のクラスのプロパティを初期化しておかないと何も追加されないので注意！
・入れ子をマッピングするプロパティを知っているのはそのクラスなのでファクトリメソッド作るのがいいかも。そうすれば使う側は`Hoge.from(res)`とかで済むので。
・判定の部分が雑なので治す。
Mongolab のデータを Rails から mongoidを使って参照する方法

mongolab にPythonからつっこんだデータを、Ruby on rails から参照しようと思いました。標準のActive Record と同じように扱えるよう、mongoid を使ってマッピングして使います。
######mongolab
[mongolab](https://mongolab.com/)は、mongoDB ホスティングサービスです。Daas(Database as a Service)です。500MB の容量まで無料で使えます。また、レコードした情報はウェブサイトから見ることが出来ます。
######MongoDB
[MongoDB](https://ja.wikipedia.org/wiki/MongoDB)は、データベースです。MySQLやpostgreSQLと異なり、スキーマレスデータベースという分類のもので、先にどういうデータを入れるか？を定義しなくて良いものです。JSONのようなデータ構造を保存します。

######Mongoid
Rails 内でいつもどおりモデルを扱えるようにマッピングするGem。

##導入方法
既にプロジェクトは構築済みとして、モデルクラスの生成から説明します。
[詳しくはこちら](https://docs.mongodb.org/ecosystem/tutorial/ruby-mongoid-tutorial/)。バージョンは最新の5を説明しています。他のバージョンだと設定などが異なるのでご注意ください。
######準備
まずはgemの導入

```ruby:Gemfile
gem 'mongoid', '~> 5.0.0'
```

bundle installしたあと、configファイルを作成します。
`$ rails g mongoid:config`
このままですと、`rails g model`などのコマンドでmongoidが標準になっていますので、標準を戻したい場合は

```Ruby:config/apprication.rb
config.generators do |g|
  g.orm :active_record
end
```

とする。こうすれば、何も指定せず`rails g`コマンドを実行すれば、通常通りactive record 用のファイルが生成されます。
mongolab用のモデルを生成したい場合は、`rais g mongoid:model`などとプレフィックスを付けてください。

生成された config/mongoid.yml で、各環境ごとの設定を行います。

```yaml:config/mongoid.yml
development:
  clients:
    default:
      database: データベース名
      hosts:
        - ドメイン名:ポート番号
      # The name of the user for authentication.
      user: 'user'

      # The password of the user for authentication.
      password: 'password'
```

ドメイン名とポート番号は、mongolabのものを、データベース名はmongolabで作成したものを指定してください。また、上記のようにuser、passwordを入力。

######modelの生成
準備が終わったらモデルクラスを生成。ここで、model名は単数形にする。`s`で終わるものを複数形と判断してしまうようなので、`status`のばあいは、`statu` と指定する。[(回避方法はこちら参照)](https://docs.mongodb.org/ecosystem/tutorial/ruby-mongoid-tutorial/)

```
$ rails g mongoid:model statu
```

すると、`Mongoid::Document`をインクルードしたモデルが生成される。

```Ruby:app/models/statu.rb
class Statu
  include Mongoid::Document
end
```

ここに、フィールドを設定していく。

```Ruby:app/models/statu.rb
class Statu
  include Mongoid::Document
  field :name, type: String
  field :status, type: String
end
```

これで、model内などで

```RUby:app/controllers/hogehoge_controller.rb
  @status = Statu.all
```

として、viewで

```RUby:app/views/hoges/hogehoge.html.erb
  <%= @status.first.name %>
```

などのコマンドを使えるようになります。
踏み台サーバ越しにあるMySQLにSequel Proでつなぎにいく

# 背景

Sequel ProはMySQLをGUIでいじれるのでいろいろ便利です。
もちろんSQL生で叩いてもいいですが、効率面からもSequel Proのほうが早かったりします。
以下は、Sequel Proの画面です。

![gui.png](https://qiita-image-store.s3.amazonaws.com/0/30079/4a4303bb-c9f1-a70a-08e5-cb9d757b08b1.png)

ローカルにあるMySQLは簡単につなげるのですが、その時に困るのが、踏み台など経由した先にあるMySQLにつなぐ場合です。
この場合、以下のように設定すると繋げれるようになります。

# 環境

![server.png](https://qiita-image-store.s3.amazonaws.com/0/30079/8674f899-43dc-4fe9-2206-46f7b31c6ab1.png)

ローカルのMacからAppサーバであるApp001に、踏み台を経由して以下のコマンドで、つなぎに行けることを前提としています。
なおapp001.xxxはApp001のホスト名です。

    ssh app001.xxx

上記のようにつなぐには~/.ssh/configに以下のような設定をします。
fumidai.domainが踏み台のホスト名です(図ではHost: Aのこと)

    Host fumidai
        HostName fumidai.domain
        User user_name
        IdentityFile ~/.ssh/id_rsa
        
    Host app001.xxx
        User user_name
        IdentityFile ~/.ssh/id_rsa
        ProxyCommand ssh fumidai -W %h:%p

# Sequel Proの設定

以下のように設定します。

![sequel_pro.png](https://qiita-image-store.s3.amazonaws.com/0/30079/c465b07e-90f5-c0af-b7c6-fc9526186eb3.png)

# 注意

このようにすればSequel Proで本番サーバにつなげたりしますが、念のため、アカウントはRead Onlyで設定しておくといいです。
なんでもできるアカウントだと間違って行を消したときなど取り返しがつかない事になるからです。
Mac/Win両方で扱える大容量ファイル用USBメモリフォーマット(exFAT)の方法

# USBメモリをMacとWin両方で使いたい
通常、市販されているUSBフラッシュメモリは、`FAT32`というフォーマットになっていると思います。しかし、このフォーマットだと4GB以上のファイルが書き込めません。
そこで通常は`NTFS`とかでフォーマットし直すわけですが、それだと(標準では)Macでの書き込みができません(読み込みならできる)。

ということで、Linuxには対応していませんが、WinとMacの両方で読める`exFAT`というフォーマットにしてやることで、***4GB以上のデータをMac/Win両方で読み書きできる***ようにしてあげます。


## 注意点
- Mac側でフォーマットするとWinで扱えないexFATにフォーマットされる(謎)
- Win側でexFATでフォーマットしましょう！


# フォーマット方法
## 初期化
Mac側で何らかのファイル書き込み・フォーマットをしている場合、Winで扱えないようになっているかもしれないので、***必要な場合は必ずバックアップを取った上で***、`FAT32`でまずは初期化しましょう。
はじめから`FAT32`の場合は不要です。

## Win側でフォーマット
1. `マイコンピュータ`的なところから、対象のディスクを右クリックして`フォーマット`を選択。
2. 出てきた画面のプルタブから`exFAT`を選択
3. 他の項目を適宜選択・修正
4. フォーマットを実行

以上です。かんたんでしたね！！
動画とかで4GB以上のデータを扱うことも多い昨今、FAT32じゃ少し物足りない、そんなときの覚え書きでした〜。
どうぞご参考までに。
ElCapitanにしたらphpmyadminにログインできなくなった


phpやapacheが入れ替わっていたので全部設定してphpmyadminも表示されてはいるもののログインで#2002エラーとなっていた。
コンソールではログインできていたので原因がよくわからなかったが以下の対応でログインできるようになった。他のPCでも対応必要なのでメモ。


```
$ sudo mkdir /var/mysql
$ sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock
```


参考：
http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/
bowerの初回起動時のプロンプトを無効にする

CIで実行する時などに、Bowerの初回起動時の`May bower anonymously report usage statistics to improve the tool over time? (Y/n)`というプロンプトを無効にしたいことがあります。

その場合は`--config.interactive=false`を使えばOK。

例。

```
bower install --config.interactive=false react
```
englishAppDev > ショートカットの表記 > dat.txt - Shortcut.lnk

```txt:動作環境
Windows 8.1 pro (English)
```

ショートカットファイルの表記は英語OSでは以下となる。

```
dat.txt - Shortcut.lnk
```

ファイル名の後ろに`- Shortcut`がついて、拡張子は`.lnk`となる。
re:Invent 2015 参加メモ


今年のre:Inventで見たセッションや感想などの自分用メモ

## キーノート総評

## 1日目

### 総評

* Andy Jassyのキーノート
	* http://dev.classmethod.jp/cloud/aws/aws-reinvent-2015-keynote-1/

* おもにエンタープライズ系の話題
	* ぶっちゃけ、あまりおもしろくない

* いかにしてエンタープライズのお客様を取り込むか
	* Snowballのような大容量データを取り込む仕組み
	* データベースマイグレーションのようなクラウド移行を助ける仕組み
	* セキュリティ(WAF)
	* クラウド化できない理由を潰していっている印象

* アプリケーション領域の強化
	* WAF
	* QuickSight(BIツール)
	* 今後このアプリケーション領域を攻めていくんだろうな

## 2日め

### 総評

* Werner Vogelsのキーノート
	* http://dev.classmethod.jp/cloud/aws/aws-reinvent-2015-keynote-2/

* おもに開発者向けの話題
	* こっちの方がわくわくする
	* 1日めが金持ちのためのセッションだとすると、2日めは貧民のためのセッション
		* t2.nano とか、Lambda(VPC/Python)とか、ECS(ecs-cli)
		* いかに金を使わずにシステム作れるかみたいな。エコシステム
		* 小さい粒度（コンテナ、関数）のクラウド化へ

* はやりの分野もとりあえずカバーしとくか的なやつ
	* モバイル系 = Mobile Hub
	* iOT = AWS iOT
	* このあたりは、リリースしてから用途模索する感じかな
		* KinesisとかCognitoみたいに

# 見たセッションなど

### 10/5

* ラスベガス大雨によりデンバーで２時間足止め
* ホテル内フードコートで夕飯

### 10/6

* キーノート1
* GPS309: ホワイトボードセッション デプロイとマネジメント
* GPS319: 明日のアプリケーションの構築:クラウドのサーバーレスソリューション
* Japan Night（懇親ディナー） (Treasure Island内)

### 10/7

* キーノート2
* DAT401:Amazon DynamoDB Deep Dive
	* 新しいアップデート情報は特になかった。
	* [Slide](http://www.slideshare.net/AmazonWebServices/dat401-amazon-dynamodb-deep-dive)


* BDT319: BDT319: Amazon QuickSight – 高速で簡単に利用できるビッグデータ用BI 
	* 新サービスなのでとりあえずチェック
	* [Classmethod Report](http://dev.classmethod.jp/cloud/aws/session-report-of-amazon-quicksight/)
	* [Slide](http://www.slideshare.net/AmazonWebServices/bdt319-new-amazon-quicksight-cloudnative-business-intelligence)


* DVO313: Building Next-Generation Applications with Amazon ECS
	* [Classmethod Report](http://dev.classmethod.jp/cloud/aws/report-dvo313/)
	* [Slide](http://www.slideshare.net/AmazonWebServices/dvo313-building-nextgeneration-applications-with-amazon-ecs)

* DVO317: Local Docker開発から実稼働デプロイメントまで
	* Dockerの中の人のセッション。めっちゃ早口でデモ多し。
	* [Classmethod Report](http://dev.classmethod.jp/cloud/aws/reinvent-dvo317/)
	* [Slide](http://www.slideshare.net/jpetazzo/from-development-environments-to-production-deployments-with-docker-compose-machine-swarm-and-ecs-cli-aws-reinvent-2015)
* ステーキ	
	* Treasure Island/Phil's Italian Steak House


### 10/8

* 認定ラウンジ
	* グッズもらうなど
* BDT320:ストリームデータフローと Amazon Kinesis Firehose
	* [Classmethod Report](http://dev.classmethod.jp/cloud/aws/reinvent-2015-bdt320/)

* BDT401: Amazon Redshift Deep Dive
	* [Classmethod Report](http://dev.classmethod.jp/cloud/aws/aws-reinvent-2015-report-bdt401/)

* CMP301: AWS Lambda and the Serverless Cloud
	* [Classmethod Report](http://dev.classmethod.jp/cloud/aws/reinvent2015-cmp301/)

* MBL402: Mobile Identity Management and Data Synchronization Using Amazon Cognito
* EJAWS懇親会
* re:Party


### 10/9

シリコンバレーツアー

* (オラクル)
* Facebook
* スタンフォード大学
* (ベンチャーキャピタル通り)
* (リニア加速炉 2.6キロ)
* (自動車会社？)
* (Vmware)
* (nest)
* アップル
* (マイクロソフト)
* グーグル
* コンピュータミュージアム
* サンフランシスコ高台
* crustaceanでカニ

※ カッコ内は通過しただけ

### 10/10

* サンフランシスコでスリに遭う
* テンダーロインの警察ですごす

-----

# 後からでも楽しめるre:Invent（復習用）


## 新サービスをチェック

- re:Invent 2015で発表された21個のAWSアップデートを140文字でまとめる 
	- http://dev.classmethod.jp/cloud/aws/reinvent2015-new-services/


## セッションの資料、動画をチェック

- AWS re:Invent2015【保存版】全セッションを網羅！非公式まとめ
	- http://dev.classmethod.jp/cloud/aws/reinvent-2015-matome/
GitBookでAnkerを使ったLinkのURLを使えるようにする

内容の構築が遅延でされるから。
`http://hostname/path#hash`
のようなURLにリンクされない。

[gitbook-plugin-anker-enable](https://www.npmjs.com/package/gitbook-plugin-anker-enable)

これを作ったので

```package.json
"devDependencies": {
  "eslint": "^1.5.1",
  "eslint-plugin-markdown": "git+ssh://git@github.com/sifue/eslint-plugin-markdown.git",
  "gitbook-cli": "^0.3.6",
  "textlint": "^3.6.0",
  "textlint-rule-max-ten": "^1.1.1",
  "textlint-rule-prh": "^1.1.0",
  "gitbook-plugin-anker-enable": "^0.0.3"
},
```

こんな感じでgitbookのpackage.jsonに`"gitbook-plugin-anker-enable": "^0.0.3"`書き加えて

```
npm install
```

その後、

```book.json
{
    "plugins": [
        "gitbook-plugin-anker-enable"
    ]
}
```

として、

```
node_modules/.bin/gitbook build
```

これでOK。

これで300msec以内にロードされるようなコンテンツであればAnkerにジャンプできるようになる。正直、gitbookの作り方的にしかたないところもあるけれど、あまりにDirty Hackなのは許してほしい。
堅実なJavaScriptフレームワークの選び方

# 流行りで選ぶのは良くない
- [JavaScriptフレームワークの寿命](http://postd.cc/longevity-or-lack-thereof-in-javascript-frameworks/)

**寿命を一番重要な要素として考慮すること**
長年にわたって改良を続けてくれている＝寿命が長い、これからも改良を続けてくれる保証があり、安定していることが重要。

> レースに勝つのは、ゆっくりとした堅実さです。

# 記事の要点引用
- 誇大広告を信じてはいけません。
- フレームワークの寿命はプロジェクトの成功を左右するほど重要な要素です。
- 最初は勢いがあったのに、徐々に弱まり、最終的には線香花火のごとく儚く消えてしまうようなフレームワークを選んでしまうと、書き直しに無駄な時間を費やしたり、チームの士気を下げたりする原因となります。
- JavaScriptのフレームワークは数年先まで生き残れるのかと言うと、これまでの実績はひどいものです。
- JSフレームワークのコンテキストでは、寿命は以下を意味します.
 - 信頼性。
 - 一貫性のあるイノベーション。 
 - 実証済みの実績。
- ソフトウェアのプロジェクトは数年存続するということを忘れないでください。数カ月ではありません。長続きするテクノロジを選んでください。 

# その点を踏まえてのオススメJSフレームワークとは
Angularでもなければ、Reactでもなく、

- [donejs](http://donejs.com/)
- [CanJS](http://canjs.com/)
正規表現メモ


## 概要
dotinstallで正規表現を学習したのでメモ

## 内容


//
>パターン　この間に正規表現のパターンを入力する

[abc]
> aかbかcの1文字

[a-z]
> aからzの1文字

[^abc]
> a,b,c以外の1文字

.a
>任意の1文字+a

^0
>行頭に0があるか

0$
>行末に0があるか


0{3}
>0が3文字->000

0{2,}
>0が2文字以上->00,000,000000

0{2,4}
>0がに文字以上４文字以下->00,000,0000

a?
>aがある又はない-> , a

a*
>aが0文字以上-> , a, aaaa

a+
>aが1文字以上->a, aaa, aaaaa

(abc)*
>abcが0回以上繰り返している

(abc|ef)*
>abc又はefの文字列が0回以上繰り返している->abcabc, abcef

\n
>改行

\t
>タブ

\d
>数字

\w
>英数字又は_

\s
>スペース又はタブ

\/
>バックスラッシュの後にメタ文字でメタ文字として扱う->/

/i
>大文字小文字を区別しない

/g
>全てのマッチした要素を配列で返す

/m
複数行の^,$(行頭や行末)に対応させる

dotinstall*?
>一番最初に0回以上マッチするdotinstall

dotinstall+?
>一番最初に1回以上マッチするdotinstall

/(.*?)@dotinstall.com/
console.log(RegExp, $1)
>@dotinstallの前にある何かしらの最小の文字列を取ってくる

/<img[^<]*?src[^<]*?(http[s]*?:\/\/.*?[.jpg|.png|.gif|.jpeg]).*?<"/g



```js:
#抜き出す文字列
var s = "@taguch, @koji, @dotinstall";


var re = s.match(/taguch/);
```
PowerPointで数式を打ちたい時のショートカットキー

# はじめに
Office（特にWordとPowerPoint）で数式を入力するとき，ショートカットキーを知っているのと知らないのとでは入力効率が大きく異なりますよね．
WordならLaTeXを使えよ，って話もありますし，「いやオイラはWordを使うんだ！」って人もショートカットキーが```Alt + =```，言い換えると```Alt + Shift + -```と割とよく知られているので苦労しないと思います．
しかしスライドはLaTeXで作るのは面倒だと思います(マサカリが飛んできそう)が，なぜか，PowerPointのショートカットキーがググっても出てこないんです．なぜなんでしょうか．多分私のググり力が足りないんでしょうね．

# よくある解決策
まず割とよくある解決策として知られている(らしい)方法を紹介します．
[ファイル]→[オプション]→[クイックアクセスツールバー]にて数式の挿入を追加して，
```Alt + (クイックアクセスツールバーの左から数えた時の数)```
をショートカットキーとするという手段があります．しかしこの方法はカスタマイズした環境でしか通用せず，スマートではありません．

# もっとスマートな解決策
実は，数式のショートカットキーは別に存在していたようで，
```Alt + ;(セミコロン)```
で挿入できるようです．また，当然文字を選択していればそこを数式に変換することも可能です．
適当に入力しまくって発見したショートカットキーで，ググってもあまり出てこないようなのでPowerPointのバージョンがいつの時から使えるようになったのかよくわかりません．当方は2013で発見し，一応他人のPowerPoint 2013でも動作することを確認しました．

*2016/10/11追記*
US配列では
```Alt + =```
で挿入できるようです．Shiftを押すと+を入力できるキーに割り当てられている？？

# 終わりに
MSさん，なぜWordと同じショートカットキーにしなかったんですか
CentOS6にNVIDIAグラフィックドライバをインストールするとき

①新規でCentOSをインストールする際は、CentOS6インストーラー起動時に、"Install system with basic video driver"を選択する
注:既にCentOS6をインストール済で、かつ標準のnouveauが入っている場合には、/boot/grub/grub.confのkernelの行の末尾に" nouveau.modeset=0"を追記する

②システムのアップデートを行う
　# yum -y update
　# yum upgrade

③NVIDIAドライバのインストールに必要なものをインストールする
　# yum install gcc*
　# yum install freeglut
　# yum install freeglut-devel
　# yum install kernel-devel

④システム再起動
　# reboot -h now

⑤ランレベル3(マルチユーザCUI)で起動
　# /sbin/telinit 3

⑥NVIDIAドライバのインストール
　# sh NVIDIA-Linux-x86_64-*****.run
　基本的にYesとOKで進めば完了する

⑦再起動してインストールが完了しているか確認
　# reboot -h now
　一瞬NVIDIAのロゴが表示されれば成功！
ブラウザの<input type="color">対応状況

<input type="color"> [^preview]
HTML5から追加された`<input type="color">`をサポートしているブラウザを調べる。
⇒ [Can I use "color" ?](http://caniuse.com/#search=color)


※ 2015/10/26 現在、FireFox, Chrome, Operaがサポートしているようです。
端末ではAndroidはOKでiOSがNG[^chrome]です。

おわりです。


# 参考や注釈

[Input Type : Color](http://www.html5tutorial.info/html5-color.php)

[`<input type="color">` …… 色の入力欄を作成する](http://www.htmq.com/html5/input_type_color.shtml)

[ブラウザが`<input type="color">`に対応しているか判別する - Qiita](http://qiita.com/takashibagura/items/c84dcced331cf3611601)

[^preview]: ![input_type_color.png](https://qiita-image-store.s3.amazonaws.com/0/76589/e16e849d-cedc-04c2-d2a4-bcbf36e464d5.png)サポートブラウザだとこんな風に。

[^chrome]: iOS版Chromeもダメでした。
Chainer開発用のDocker環境を整備する


**この情報は古いです。現状では、手で環境整備せずにnvidia-dockerを利用したほうが簡単・安全・確実です**

ローカル環境に複数バージョンのCUDAを入れるのができるのかできないのかよくわからないが、少なくともあまりやりたくない。そこで、Dockerを利用して、希望のバージョンのCUDAがはいった環境を作ることで、様々なCUDA環境での開発をやりやすくする。

また、Jenkins上ではここに書かれた手順を利用することで、複数バージョンのCUDAやcudnnのテストを行っている。

# Dockerをインストールする

手順に従って、dockerをインストールする。公式のインストール手順は度々変わるので注意する。

https://docs.docker.com/installation/ubuntulinux/

# ホスト側にcuda7.5をインストールする

chainer-testは、ホスト側にcuda7.5が入っていることを仮定している（cuda7.5同梱のドライバを利用している）。古いと動かない。
aptで完結するので、CUDAはdebファイルから入れる方がお薦め。

それから、Dockerのインストールなどでカーネルバージョンが上がると、ドライバが認識されなくなったりするので、Dockerのバージョンをあげたときはdriverも入れ直す（？）必要があったりする。この辺はちゃんと理解していない。

# nvidia-uvmを作る

Docker越しにCUDAを実行するには、`/dev/nvidia-uvm` が見えている必要がある。起動時にこのデバイスは見えない。以下のコマンドを実行するとこのデバイスができる。理由はよくわからない。

```
$ /usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery
```

nvidia-docker内では、以下のコマンドを実行している。こちらでも`/dev/nvidia-uvm`ができる。仕組みはよくわからない。

```
$ nvidia-modprobe -u -c=0
```

Jenkins環境内では、毎ビルドごとにこのコマンドを実行してから`docker run`している。

# Chainer用のDockerfileを作る

`chainer-test`プロジェクトには、環境に合わせた`Dockerfile`を生成するスクリプトがある。これを利用して、テストしたい環境用の`Dockerfile`を作成する。

```
$ git clone https://github.com/pfnet/chainer-test.git
$ ./make_docker.py --base=ubuntu14_py2 --numpy=numpy19 --cuda=cuda65 --cudnn=none
```

以前は、あらゆる組合せの`Dockerfile`を作っておいたが、流石に組合せが100通りくらいになってきたので、生成することにした。これで指定した環境用の`Dockerfile`ができる。
このDockerイメージを作成するためには、カレントディレクトリにインストール対象のCUDAのbinファイルとcudnnが必要。上記の設定なら`cuda_6.5.19_linux_64.run`を`chainer-test`ディレクトリにコピーしてくる。持っていない場合は、CUDAのサイトに行ってダウンロードする。
`Dockerfile`中でダウンロードしたほうがいいのだが、ネットワーク帯域が極めて下がることがあり、テストが何時になっても実行できないことがあったのでこうした。

あとは、普通にDockerを起動すれば良い。`--device`引き数で、GPUを見えるようにしているのが重要。

```
$ docker build -t chainer
$ docker run --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm -it chainer /bin/bash
```

これでDocker環境下のbashに入れる。あとはふつうにソースをとってきて開発するだけ。
Xcode 7.1でCDVViewController.h が File not found と言われた

10/22にXcode 7.1がリリースされて、早速更新しちゃっていたわけけですが…。
既存プロジェクトがビルドできなくなるとビックリするよね。。。
ということで、そんなお話し。

# Xcode 7.1でcordovaプロジェクトをArchive
Xcodeを7.1にしたらcordovaのプロジェクトでArchiveしようとすると

~~~
MainViewController.h:28:9: 'Cordova/CDVViewController.h' file not found
~~~

MainViewController.h で

~~~objective-c
#import <Cordova/CDVViewController.h>
~~~

が見つからない(file not found)と言われるようになった。


# 原因

ファイルが見つからない…と出ているので、そのものズバリ見つからないらしい。

[‘Cordova/CDVViewController.h’ file not found in Xcode 7.1 beta](http://forum.ionicframework.com/t/cordova-cdvviewcontroller-h-file-not-found-in-xcode-7-1-beta/32232)
探してみると、beta時代の話しではあるが同様の現象があった。

Build Settings > Header Search Pathの値が

~~~
"$(TARGET_BUILD_DIR)/usr/local/lib/include"
"$(OBJROOT)/UninstalledProducts/include"
"$(BUILT_PRODUCTS_DIR)"
~~~

となっているので、これを

~~~diff
"$(TARGET_BUILD_DIR)/usr/local/lib/include"
-"$(OBJROOT)/UninstalledProducts/include"
+"$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include"
"$(BUILT_PRODUCTS_DIR)"
~~~

とすることで、アーカイブできるようになるということで、早速やってみたところ、、、できた。

ReleaseもDebugも両方同じにしてしまってOKそう。
(Debugに関しては、変更しなくてもデバッグ出来ていたけど一応。)

ちなみに、TARGETの方に設定するとPROJECTの設定を個別に上書きした形になるのでTARGETSの方ではなくPROJECTの方で設定しました。
S3+lambda+SESで問い合わせフォームの作成

業務で製品の問い合わせフォームを作る機会があったので、まるまるAWSの機能を使ってみようかと。。


下記を参考にさせて頂きましたが、nodemailerの使い方がよく分かっていないので、メール部分はSESを使ってみました。SES以外の設定方法はこちらで
>S3 + Lambda + Cognitoを使って、簡単お問い合わせシステム構築
http://qiita.com/takuma_yoshida/items/3bd3af8b09307d25981a


#1.SESの設定
1-1 メールアドレスを登録
まずは使うメールアドレスを登録。「Email Addresses」の「Verify a New Email Address」からメールアドレスを登録。設定すると登録確認用のメールが飛んでくるので、メール本文にあるURLをクリックして本登録する。登録がされるとStatusがverifiedになります。
![s3image1.png](https://qiita-image-store.s3.amazonaws.com/0/60207/e949f9b0-7bdc-4ec0-84a1-3e8b3c2e3401.png)



#2.IAMの設定
2-1 IAMでSESを使わせるユーザの作成
IAMで「ユーザーごとにアクセスキーを生成」にチェックが入った状態でユーザを作成。
![s3image2.png](https://qiita-image-store.s3.amazonaws.com/0/60207/e7c5a05f-5ef3-5ac7-74d8-0205f9d2b06a.png)


2-2.認証情報のダウンロード
作成したら認証情報のダウンロードでアクセスキーとシークレットをダウンロードしておく。
![s3image4.png](https://qiita-image-store.s3.amazonaws.com/0/60207/bcd2fdba-6ed8-9f30-b5d7-9cfcb908a465.png)

2-3.ポリシーのアタッチ
作成したユーザのアクセス許可⇒ポリシーのアタッチから「AmazonSESFullAccess」を選択する。一瞬フルアクセスで良いのかと思いましたが、これしか選択できなかったので取り合えずコレで。
![s3image4.png](https://qiita-image-store.s3.amazonaws.com/0/60207/01d61bbf-0947-f44d-ad9d-dbcaef510b56.png)




#3.Lambda Functionの修正

accessKeyIdとsecretAccesskeyにはダウンロードしたファイル内に書いてあるキーを設定

```lang:index.js
console.log("Loading event")
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
var ses = new aws.SES({apiVersion: '2010-12-01',
						accessKeyId: 'xxxxxxxxxxxx',
						secretAccesskey: 'xxxxxxxxxxxx',
						region: 'us-east-1' });
exports.handler = function(event, context) {
	console.log('Received event:', JSON.stringify(event, null, 2));
	var bucket = event.Records[0].s3.bucket.name;
	var key = event.Records[0].s3.object.key;
	s3.getObject({Bucket: bucket, Key: key},
		function(err, data) {
			if (err){
				context.done('error', 'error getting file' + err);
			} else {
				console.log('data:' + data);
				var message = JSON.parse(data.Body);
				console.log('message:' + message);
				var eParams = {
						Destination: {
							ToAddresses: ["xxx@xxxx"]
						},
						Message: {
							Body: {
								Text: {
									Data: "mail：" + message.mail+ "\n" + "subject："+message.title + "contents："+message.contents
								}
							},
							Subject: {
								Data: "ホームページから問い合わせがありました。"
							}
						},
						Source: "xxx@xxxx"
						};

						console.log('===SENDING EMAIL===');
						var email = ses.sendEmail(eParams, function(err, data){
							if(err){
								console.log("===EMAIL ERR===");
							 	console.log(err);
							 	context.done(null, 'ERR'); 
							}else {
								console.log("===EMAIL SENT===");
								console.log(data);
								context.done(null, 'SUCCESS');
							}
				});
				console.log("EMAIL CODE END");
			}
		}
	);
	
};

```
c++ builder XE4, 10.2 Tokyo > const String [] から配列要素の数を自動取得

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

const Stringで定義した配列の要素数を自動計算したい。

```cpp
	const String kPanelNames[] = {
		L"P_1_1",
		L"P_1_2",
		L"P_1_3",
	};
	int numPanels = sizeof(kPanelNames) / sizeof(String *);
```


似たようなことをTPanel[]でもやっていた。
http://qiita.com/7of9/items/22165ecf3e7636bc53fe

分母をポインタとしてsizeof()を取れば他のものに対しても同様に使える。
指定したカラムのみを表示するコマンド


# コマンド説明
`csv [ファイル名] [カラム位置]`

# ソース
.bashrcに定義する（別にシェルを作ってもいいけど短いので）

```sh:.bashrc
alias csv=csv_column

# 指定したカラム位置の列を表示する
function csv_column() {
  if [ -z $1 ]; then                             # ファイル名の指定がない場合
    echo "ファイル名を指定してください"
  elif [ -z $2 ]; then                           # カラム数の指定がない場合は全てを整形して表示
    command column -s , -t $1
  elif expr "$2" : '^[0-9]*$' > /dev/null ; then # カラム数に応じた列を表示
    command cat $1 | awk 'BEGIN {FS=",";OFS=","} {print $'$2'}'
  else
    echo "${2}:数値を入力してください"
  fi
}
```

# 使い方
以下のようなCSVファイルがあるとする。

```
$ cat hoge.csv
hoge,piyo,fuga
11,22,33
AAA,BBB,CCC
あ,い,う
test1,test2,test3
```

●ファイル名だけを指定すると整形をして表示
`csv [ファイル名]`

```
$ csv hoge.csv
hoge   piyo   fuga
11     22     33
AAA    BBB    CCC
あ     い     う
test1  test2  test3
```

●カラム位置の数値を指定すると指定したカラムだけを表示
`csv [ファイル名] [カラム位置] `

```sh:
$ csv hoge.csv 1
hoge
11
AAA
あ
test1
$ csv hoge.csv 2
piyo
22
BBB
い
test2
$ csv hoge.csv 3
fuga
33
CCC
う
test3
```

「`csv hoge.csv 2 | less`」などとすると長いCSVファイルも表示できる。
vim内で特定カラム位置をハイライトする方法もあるので[こちら](http://qiita.com/rita_cano_bika/items/e447c042e70327014609)も合わせてぜひ。
Stable 版 Synergy の自前ビルド & インストール(Ubuntu 14.04 編)

Ubuntu 14.04 のリポジトリには 1.4.12 のバージョンしか無く、
公式の Nightly build には alpha 版しか置いていなかったため
自前でコンパイルしてインストールした時のログ。
基本的には [githubにある build 方法](https://github.com/synergy/synergy/wiki/Compiling) を参考に

# apt-get するもの
- cmake
- build-essential
- xorg-dev
- libqt4-dev
- libcurl4-openssl-dev
- libavahi-compat-libdnssd-dev
- libssl-dev

# ソースの取得

```sh
$ git clone https://github.com/synergy/synergy
```

stable 版の tag を探してみる

```sh
$ cd synergy
$ git tag | grep stable
v1.7.1-stable
v1.7.2-stable
v1.7.3-stable
v1.7.4-stable
```

どうやら最新の stable は 1.7.4 らしい。

```sh
$ git checkout -b release-1.7.4 v1.7.4-stable
```

# ビルド

synergy は cmake を叩く python スクリプトを利用している。

```sh
$ python hm.py conf -g1
$ python hm.py build
```

# deb パッケージ化

```sh
$ python hm.py package deb
```

bin 以下に synergy-release-**-Linux-x86_64.deb が出来ている

# インストール

```sh
$ sudo deb -i bin/synergy-release-**-Linux-x86_64.deb
```

# 注意点など
`CMakeLists.txt` や `configure` があるので、`./configure`
とかするのかと思いきや、`configure` の中身は `cmake` を叩いている
だけ・・・。素直に公式の通りに hm.py を使いませう
また、alpha版でも気にしない方は Nightly build を使う方が楽かと思います。
開発作業時にコマンドラインから利用すると便利なPHPライブラリ

# 開発作業時にコマンドラインから利用すると便利なPHPライブラリ

僕は主にvimでコーディングしています。
ただし、vimのプラグインはかけないため、効率を上げるためにもっぱらvimのバッファと外部ツールを **標準出力/標準入力** で接続するという方法をとっています。

**標準出力/標準入力** 経由で操作すると非常に便利なツールのうち、以下のコマンドで簡単にセットアップできるものをピックアップしてみました。

```sh
composer global require 'xxx/yyy'
```

## php-cs-fixer

### 便利度

高

### 役割

phpのソースコードを整形してくれる。

```sh
composer global require "fabpot/php-cs-fixer"
```


## sql-formatter

### 便利度

中

### 役割

エンジニアなら **SQL** を1日に一回以上は記述していると思う。
特に急いでいるときは SQL をささっとワンライナーで入力したりするが、
作業履歴として整理する際には整形されていないと見にくい。

以下のツールを利用すれば、SQLが一発で整形できる。

```sh
composer global require "jdorn/sql-formatter"
```

以下のようなスクリプトを用意しておき、標準入力から食わせてやる。

**sqlformatter.php** 

```php
#!/usr/bin/env php
<?php
require getenv('HOME') . '/.composer/vendor/autoload.php';

$query = file_get_contents('php://stdin');
echo SqlFormatter::format($query, false);
```

**利用**

```sh
$ echo "select * from test where x = 3;"| sqlformatter.php

select
  *
from
  test
where
  x = 3;
```
今さら聞けない！？ISDN乗り換えガイド

+ 祖父母の回線がまだISDNだったのでいろいろメモ
+ ISDNからの移行に関してなかなか情報がなかったのでまとめておきます

## 対象
+ ISDNよくわかってないけど、乗り換えたい人

## ISDNってなんぞや
+ ざっくり言うと同じ電話番号で二回線使えるサービス
+ 例えば、同じ電話番号から2台同時に電話かけたり、受けたりできる
+ そのためADSLとか流行る前のインターネット(つまり~~おっさん~~)では人気があった（インターネットしつつ電話かけれるからね）
+ しかし使うためにはONUのようなISDN回線を電話回線を変換するTAが必要

## 今回の乗り換えのきっかけと条件
+ のちのちブログに書くがTAの故障して電話がかけられなくなった
+ インターネットはしておらず、電話回線は1回線でも問題ない

# 乗り換え方法
+ 大きく分けて3パターン

### 加入回線に戻す
#### メリット
   + 月々の支払が安くなる（2,980→1,780）
   + 工事が早い（自分の場合は3日ほど）
   + メンテナンスが容易（TAの故障など気にしなくても良い）
   + ちなみに工事費は3800円（税抜）でした。場合によっては一万円かかることもあるみたいです。

 #### デメリット
  +  2025問題（後述）
  +  それに伴い加入回線に変更不可能な場合も
  +  ISDNにはナンバー・ディスプレイ（機能制限版。加入回線からの番号は表示されない。ひかり電話からは表示される）が標準装備なので、もし番号を表示したいなら別途オプションでつけなければならない。

### TAを買い換える
#### メリット
+ TAを交換するだけなのですぐ直せる
+ ISDNのサービスがそのまま利用できる
+ ちなみに今でも作っているメーカはあります
+ NECさんで[これ](http://kakaku.com/item/00700510000/)とか

#### デメリット
+ TA売ってる店がない（少なくとも家電量販店には売ってませんでした）
+ そのため、機械に詳しくない人はちょっと対処できないかも
+ 2025年問題（後述）
+ 今更使い続ける意味が無い（自分の場合です）

### 光に乗り換える
#### メリット
+ インターネットができる（当たり前ですが）
+ 2025年問題を回避できる
+ 電話代も安くなる

#### デメリット
+ 費用がかかる
+ 工事が始まるまでの期間が長い(自分の場合は3週間)
+ 月々の料金も高い(参考：NTTフレッツ光ライト＋ひかり電話で2,800円～（インターネットするには別途プロバイダ料も必要。かつインターネットしなければの話です）)
+ ナンバー・ディスプレイ使うには別料金がかかる
+ インターネットしないのにネット回線を引く意味（自分の場合です）

## 参考: 2025年問題
+ 結構誰も気にしてないけど知っておかないとまずい問題
+ 要は電話線の老朽化に伴い、2025年までには電話線が使えなくなる問題
+ そのため、加入回線、ISDN、ADSL等の電話線を使う全てサービスが2025年までに使えなくなる
+ 一部ではすでに電話線がないところもあるみたいです
+ そうなると、光の選択肢しかないような気もする・・・

## 結局自分はどうしたのか
+ 加入回線に戻しました
+ とりあえず電話がすぐかけられるようにするのが最優先
+ その中で一番早く済みそうなのは加入回線だった
+ 前述の通り2025年問題が来た時には光に変えようかなと思います
cxxfunctionのエラーはRtoolsへのパスが原因かも

Rcppを勉強しようと一念発起して```cxxfunction```を使ってみたのに、次のようなエラーでやる気が無くなった人は少なくないはず。

```r
Error in compileCode(f, code, language = language, verbose = verbose) : 
  Compilation ERROR, function(s)/method(s) not created! Warning message:
running command 'make -f "C:/PROGRA~1/R/R-31~1.3/etc/i386/Makeconf" -f "C:/PROGRA~1/R/R-31~1.3/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="file************.dll" OBJECTS="file************.o"' had status 127
In addition: Warning message:
running command 'C:/PROGRA~1/R/R-31~1.3/bin/i386/R CMD SHLIB file************.cpp 2> file************.cpp.err.txt' had status 1 
```
ただし、「********」の部分は毎回変わる一時ファイル名。

これはWindowsで、Rtoolsを導入していない・または導入しているけどパスを通していない場合に起こるようです。

通っているパスをR上で検索するには、```Sys.getenv```を使います。

```r
> Sys.getenv()["PATH"]
PATH 
"C:\\Program Files\\R\\R-3.1.3\\bin\\i386;...(以下略)" 
```
この中に、```c:\Rtools\bin;c:\Rtools\gcc-4.6.3\bin;```が含まれていないなら、パスが通っていないということです（gccのバージョンは自分のフォルダを確認）。
ユーザー環境変数のPathの先頭に```c:\Rtools\bin;c:\Rtools\gcc-4.6.3\bin;```を加えて、Rを再起動します（設定方法は、たとえば[こちら](http://next.matrix.jp/config-path-win7.html)を参照）。

再度```Sys.getenv```を用いて、結果の中にRtools関係が含まれていれば成功です。

```r
> Sys.getenv()["PATH"]
PATH 
"C:\\Program Files\\R\\R-3.1.3\\bin\\i386;(中略);c:\\Rtools\\bin;c:\\Rtools\\gcc-4.6.3\\bin;(以下略)" 
```

うまくいきました。

```r
library(inline)
g <- cxxfunction(signature(vs = "numeric"), plugin = "RcppArmadillo", 
                 body = '
  arma::vec v = Rcpp::as<arma::vec>(vs);
  arma::mat op = v * v.t();
  double ip = arma::as_scalar(v.t() * v);
  return Rcpp::List::create(Rcpp::Named("outer") = op,
                            Rcpp::Named("inner") = ip);'
)
g(7:11)

#> g(7:11)
#$outer
#     [,1] [,2] [,3] [,4] [,5]
#[1,]   49   56   63   70   77
#[2,]   56   64   72   80   88
#[3,]   63   72   81   90   99
#[4,]   70   80   90  100  110
#[5,]   77   88   99  110  121
#
#$inner
#[1] 415
```
bazelでMacroを作成する

# version
```shell-session
henteko@~  $ bazel version
Build label: 0.1.1
Build target: bazel-out/local_darwin-fastbuild/bin/src/main/java/bazel-main_deploy.jar
Build time: Thu Oct 15 20:51:11 2015 (1444942271)
Build timestamp: 1444942271
Build timestamp as int: 1444942271
```

# プロジェクト構成
今回の[サンプルプロジェクト](https://github.com/henteko/bazel_deploygate_macro)です
以下がプロジェクト構成です
Macroを作成するだけなのでシンプルにしました

```shell-session
henteko@~/Desktop/dev/sample  $ tree
.
├── BUILD
├── WORKSPACE
├── android.apk
└── deploygate.bzl

0 directories, 4 files
```

# Macroを作成する
基本はBazel公式の[ドキュメント](http://bazel.io/docs/skylark/macros.html)に書いてあります

今回作成するMacroは、ローカルにあるapkをDeployGateにアップロードするようなMacroです
最終的にはBUILDファイルに以下のように書くことで、Macroを実行できるようにします

```BUILD
load("deploygate", "deploygate")
deploygate(
  name = "deploy",
  user_name = "your_deploygate_name",
  api_key = "your_deploygate_api_key",
  apk = "android.apk"
)
```
```shell-session
$ bazel build //:deploy
```

## deploygate.bzlの作成
bazelのMacroでは.bzlファイルを作成して、各Macroごとの引数の指定や実際の処理を書きます

### 処理の記述
実際の処理は以下のように書きます

```
def _impl(ctx):
  out = ctx.outputs.result
  apk = ctx.file.apk
  name = ctx.attr.user_name
  api_key = ctx.attr.api_key
  ctx.action(
    outputs = [out],
    inputs = [apk],
    command = "curl -F 'file=@%s' -F 'token=%s' -F 'message=sample' https://deploygate.com/api/users/%s/apps > %s" % (apk.path, api_key, name, out.path),
  )
```
処理の記述にはPaythonに似たbazel独自言語を使って記述します
ctx.fileやctx.attrにはMacroの引数指定で指定した文字列などが渡ってきます
今回はDeployGateにcurlを使ってapkをアップロードするためにcurlを実行するようにしてます
ctx.actionはコマンドをそのまま実行することができるんですが、outputsファイルを指定しなければいけないので、curlで得た文字列(deploygateの場合はjson)をそのままoutputsとして吐き出すようにしてます

### Macroの引数指定

Macroの引数指定にはrule関数を使います
これがMacro自身のインターフェースを表します

```
deploygate = rule(
  implementation=_impl,
  attrs={
    "user_name": attr.string(mandatory=True),
    "api_key": attr.string(mandatory=True),
    "apk": attr.label(mandatory=True, allow_files=True, single_file=True),
  },
  outputs = {"result": "%{name}_result.txt"},
)
```
これだとuser_name, api_key, apkが引数指定されています
また、mandatory=Trueにしているとこの引数は必須となり、引数として足らないと実行時にエラーになって怒ってくれます、便利
attrにはstringやlabel以外にも色々な型があるので、詳しくは[公式ドキュメント](http://bazel.io/docs/skylark/lib/attr.html)を参照してください

これでMacroの作成は終了です
あとは BUILDファイルに上で説明したように記述すると、deployビルドを実行することができます

## deploygate.bzlの全体

```deploygate.bzl
def _impl(ctx):
  out = ctx.outputs.result
  apk = ctx.file.apk
  name = ctx.attr.user_name
  api_key = ctx.attr.api_key
  ctx.action(
    outputs = [out],
    inputs = [apk],
    command = "curl -F 'file=@%s' -F 'token=%s' -F 'message=sample' https://deploygate.com/api/users/%s/apps > %s" % (apk.path, api_key, name, out.path),
  )

deploygate = rule(
  implementation=_impl,
  attrs={
    "user_name": attr.string(mandatory=True),
    "api_key": attr.string(mandatory=True),
    "apk": attr.label(mandatory=True, allow_files=True, single_file=True),
  },
  outputs = {"result": "%{name}_result.txt"},
)
```

# さいごに
今回bazel周りを触ってみた感想としては、 Androidをビルドするにしてもまだまだ環境が整ってなくて結構苦労するなという印象でした
ただ、Macroの作成などは比較的簡単に行えそうな感じがしました
それと、buildでは何もdiffがないとそもそも実行されないので、余分なCPUリソースを使わなくてすんで親切な気がします
来年のAndroidStudio統合が待ち遠しいですね
AndroidなbazelでNo resource identifier found for attributeで怒られたときの対処法

# bazel version
```
henteko@~ $ bazel version
Build label: 0.1.1
Build target: bazel-out/local_darwin-fastbuild/bin/src/main/java/bazel-main_deploy.jar
Build time: Thu Oct 15 20:51:11 2015 (1444942271)
Build timestamp: 1444942271
Build timestamp as int: 1444942271
```

# 本題
bazelでAndroidなプロジェクトをビルドしようとしたときに以下のようなエラーで怒られることがあります

```
No resource identifier found for attribute 'layout_behavior' in package
```

## bazelの場合
この例の場合だと、Android Supportライブラリのdesignが不足しているのでbazelでこのライブラリを読み込んであげることで解消されます

```
java_import(
  name = "support_design_import",
  jars = ["android-sdk/extras/android/support/design/libs/android-support-design.jar"],
)

android_library(
  name = "support_design",
  custom_package = "android.support.design",
  manifest = "android-sdk/extras/android/support/design/AndroidManifest.xml",
  resource_files = glob(["android-sdk/extras/android/support/design/res/**"]),
  deps = [":support_design_import",  "//external:android/appcompat_v7"],
)
```
ちなみにここの**android-sdk**はローカルのAndroid SDKに対するsymlinkを、BUILDファイルと同フォルダに作成してます

あとはこの**"support_design"**をandroid_binaryのdepsで読み込んであげるだけです

```
android_binary(
  name = "android",
  custom_package = "com.henteko07.sample",
  srcs = glob(["android/app/src/main/java/**/*.java"]),
  manifest = "android/app/src/main/AndroidManifest.xml",
  resource_files = glob(["android/app/src/main/res/**"]),
  deps = ["//external:android/appcompat_v4", "//external:android/appcompat_v7", "support_design"]
)
```

# まとめ
bazelでは

* java_importでjarファイルを読み込み
* android_libraryでソースコードなどの読み込み

を行うことでandroid_binaryのdepsで使用可能になります
他のライブラリが必要な場合も同じような手順で追加可能だと思います

## gradleの場合
ちなみに、gradleだとbuild.gradleに以下を記述するとエラーが解消されます

```
dependencies {
  compile 'com.android.support:design:23.0.1'
}
```
GCP Qualification Examを受けてみた

先日、Google Cloud Storage Qualification Exam（CPE302）、Google Cloud SQL Qualification Exam（CPE303）を受けました。
受ける前に調べたのですが、試験の情報が全然見つからなかったので、概要を紹介したいと思います。
（問題についての詳細を書くのはNGだと思うので、全体の概要にとどめます）

# ポイント
* テストは自宅でもどこでも受けれる。ただし、インターネットに接続できること・周囲に人がいないことが必須。WEBカメラも必要。
* 持ち込み、ググる、実環境で検証するのはOK。ただし、人とコミュニケーションを取るのは禁止。
* 試験自体は日本語もあるけど、受けるまでの過程は英語。英語で指示されることを覚悟しとくことが必要。

# Certified Examって？
Google Cloud Platformの公式認定資格試験。合格すると、Google公認のデベロッパーとして認められます。
2015.10.26時点では、5つの分野（GCPのサービス）に分かれていて、それぞれの分野ごとに独立した資格になっています。
詳しくは[オフィシャルサイト](https://cloud.google.com/training/exams/)、もしくは[トップゲートさん](http://google-training.jp/cloud-platform/exams)を見てください。

# 試験範囲について
オフィシャルサイトに記載されています。

* [App Engine](https://cloud.google.com/training/exams/cpe301-app-engine)
* [Cloud Storage](https://cloud.google.com/training/exams/cpe302-gcs-qualification-exam)
* [Cloud SQL](https://cloud.google.com/training/exams/cpe303-cloud-sql-qualification-exam)
* [BigQuery](https://cloud.google.com/training/exams/cpe304-bigquery-qualification-exam)
* [Compute Engine](https://cloud.google.com/training/exams/cpe305-gce-qualification-exam)


# 申し込み方（試験事前準備）
1. [webassessor](https://www.webassessor.com/wa.do?page=publicHome&branding=GOOGLECLOUD)でチケットを購入します。（研修などでバウチャーを持っている場合は、バウチャーを使って購入することになります）
この際、同じ試験でも複数の言語があるので気をつけてください。
2. [onlineproctoring](https://www.onlineproctoring.com/googlecloud/index.htm)で、試験日程を予約します。
たぶん、アメリカのオフィスアワーで運用しているので、日本時間の夜中の時間帯の選択肢が多いです。

これで申し込みは完了です。あとは、予約した時間帯を待つのみです。

# 受け方（試験当日）
1. [onlineproctoring](https://www.onlineproctoring.com/googlecloud/index.htm)にログインします。予約時間に向けてカウントダウンが始まっています。
2. カウントダウンが終わると、アラーム音と共に、[BIGIN]というボタンが表示されるので、そちらをクリックします。
3. ビデオチャットが始まって、ファイルDLを促されます。そのファイルをDLして実行します。
4. 画面共有が開始されます。
5. 周囲に人がいないことを確認するため、周囲を映すように指示されます。
6. [webassessor](https://www.webassessor.com/wa.do?page=publicHome&branding=GOOGLECLOUD)にログインして、LAUNCHをクリック
7. インターネット越しの試験官が、パスワードを入力してくれて、試験が開始される。

# 試験のスタイル
* 資料（オンライン/オフライン）を見る・ググる・StackOverflowを見る・実機検証なんでもあり
* チャット、メール、電話、StackOverflowで質問する、周囲の人に聞くなどコミュニケーションを取るのは禁止（試験官にPCの画面と、WEBカメラ越しに様子を監視されてる）

# 試験問題について
* 選択問題オンリー。記述式はなし。

# 合格基準
* 全体で75%, 各セクション50%の正答率を両方満たせばOK

# 注意事項
* 英語のやり取りが基本なので、その覚悟をしたうえで
* この手の試験でありがちですが、たまに不自然な翻訳があります
* 会議室等で受ける場合は、少し長めに予約して、部屋を専有しきれるようにしましょう
* PCの画面共有、リモート操作を許可することになるので、会社支給のPCで受ける場合は事前に確認を。該当アプリケーションが動かなかったり、場合によってはコンプラ違反で怒られるかもしれません。

# 感想
* GCPは日本語でググってもあまり情報がないので、いっそ英語版のテストを受けた方がドキュメントに一発でたどり着きやすい。実際、SQLは日本語で、Storageは英語で受けましたが、問題のキーワードから探したいドキュメントにたどり着く速さは圧倒的に英語からのほうが早かったです。ただし、当たり前ですが問題文も選択肢も英語のみの表記になります。。。。
* 家で受けれるのは便利。
* 調べながら受けれるので、細かい暗記は不要。ただ、サービス概要の理解はもちろん、どこを参照すればいいかが分かる程度にはドキュメントも把握しておくことが必要。暗記は不要で調べて分かればOKというのは、合理的でいいなーと。（フルパスとかオプションを暗記させるLP◯Cとは大違い）
Realm が Downloading core failed. によって pod install に失敗する場合の対処療法

# 現象

たぶん一時的なエラーだとは思うのですが、CocoaPods `pod install` / ソースビルド `sh build.sh build` いずれでも以下のようなエラーで必ずビルドに失敗してしまいます。原因はよくわかりませんが、どうも realm-core なるライブラリ一式のダウンロード途中で失敗してしまっているようです。

```
Installing Realm (0.96.1)
[!] /usr/local/bin/bash -c 
set -e
sh build.sh cocoapods-setup

core is not a symlink. Deleting...

Downloading dependency: core 0.94.0

Downloading core failed. Please try again once you have an Internet connection.
```

# 対処

回線速度やその他要因の可能性もあるのでこれは一時的なものかもしれませんが、build.sh におけるライブラリのダウンロード処理を飛ばす方法でとりあえず対処しました。

realm-core ライブラリは次の URL から取得されるようなので、ブラウザや curl などであらかじめ自分で取得しておきます。

```:build.shより抜粋
${REALM_CORE_VERSION:=0.94.0}
〜
https://static.realm.io/downloads/core/realm-core-${REALM_CORE_VERSION}.tar.bz2
```

```sh:curl
$ curl -f -L --verbose "https://static.realm.io/downloads/core/realm-core-0.94.0.tar.bz2" -o $TMPDIR/core_bin/core-0.94.0.tar.bz2
```

build.sh でダウンロードされる bzip2 ファイルは `$TMPDIR/core_bin/core-{REALM_CORE_VERSION}.tar.bz2` に置かれるので、リネームしてここに配置しておきます。（ファイル名が変わります。）

これで `pod install` が通るようになりました。

![s.png](https://qiita-image-store.s3.amazonaws.com/0/3603/f221c9a4-98f3-8f61-5009-517a74ef5ca2.png)
VCCWでwordPressの開発環境作ってみた


wordpress案件が控えているため、vagrantを使ってwordpress環境を構築してみました。

## 今回使うもの

- [VAGRANT](https://www.vagrantup.com/)

- [VCCW](http://vccw.cc/)




## 事前準備

あ、mac環境です。
homebrew、virtualbox、vagrantをインストールしておきましょう。

さらに下記コマンドを叩いておきます。

```terminal
$ vagrant plugin install vagrant-hostsupdater
```


## 手順

### 1. ダウンロード
まず、適当なディレクトリに移動し、vccwをclone、もしくはzipを落としてきて展開します。  

```terminal
$ git clone https://github.com/vccw-team/vccw.git
```

### 2. 初期設定

無事落とせたら、次に設定ファイルをカスタマイズします。
vccw/provision/ に default.yml というファイルがあるので、これをコピーします。  
そしてsite.ymlという名称にリネームし、vccw/ 直下に配置します。  

このsite.ymlで初期設定を行います。　　
カスタマイズですが、例えば、host名やIPアドレスの変更をしたり、予めインストールしておきたいwordpressプラグインを設定できます。  
今回はhost名の変更と日本語化だけしてみましょう。

```yml:site.yml

#
# Network Settings
#
hostname: wordpress.dev //host名を自由に変更可能
ip: 192.168.89.54 //IPアドレスの設定
sync_folder: 'www/wordpress' //ここはルートとなるパスを指定

#
# WordPress Settings
#
version: latest
lang: ja //ここをjaに変更するとwordpressの画面が日本語化されます
title: タイトル // wordpressのサイトタイトルを設定
multisite: false //マルチサイトを使用するか否か
rewrite_structure: /archives/%post_id%

```

###3. 設置

設定が完了したら次のコマンドを叩きます。  
10分くらいかかると思うので、洗濯物を畳んだりして待ちましょう。

```terminal
$ vagrant up
```

完了したら、先ほど設定したhostnameもしくはipをブラウザで確認してみましょう。無事下記画面が表示されればOKです。

↓↓↓


![cap_20151026.png](https://qiita-image-store.s3.amazonaws.com/0/73074/7e667ef0-05f9-5020-9e2f-5e46c20d8b49.png "cap_20151026.png")
String#to_s は同一のオブジェクトを返す

個人的に気になって調べた点のメモです。
仕様化されているかはまだ調べていないものの、少なくとも Ruby 2.2.3 はこの挙動でした。

# 結論

`String#to_s` は同一のオブジェクトを返す (タイトル通り)

# 問題になるケース

たとえば以下のようなコード

```rb
query = str.dup
result = foo query
```

ここまで書いて `str` が `nil` になり得ることがわかったので、 `.to_s` しようとなったときに、それが新たな `String` オブジェクトを返すなら `.dup` はいらないことになるし、そうでなければ残す必要がある。
(もちろん、`str` をあとで使わなければ問題ない話なんだけど、それを完璧に保証するのは難しいので、変なバグを避けるために)

# 検証コード

```rb
a = 'foo'
b = a.to_s

p a.__id__ == b.__id__
# => true

a.upcase!

p [a, b]
# => ["FOO", "FOO"]
```

このように、`.to_s` しただけでは同一のオブジェクトがそのまま変わるので、元の変数 `a` に破壊的変更を行うと `b` にも影響してしまう。

`.dup` すればそういった問題は避けられる。

```rb
a = 'foo'
b = a.to_s.dup

p a.__id__ == b.__id__
# => false

a.upcase!

p [a, b]
# => ["FOO", "foo"]
```

あとで覚えてたら rubyspec とかも見てみる。
raspberry pi2 > シリアル出力

raspberry pi2でシリアル出力(RS-232C)をしたい。

[instructable](http://www.instructables.com/id/Read-and-write-from-serial-port-with-Raspberry-Pi/)にやり方が記載されている。

> By default the Raspberry Pi’s serial port is configured to be used for console input/output. 
...
To be able to use the serial port to connect and talk to other devices (e.g. a modem a printer.. ), the serial port console login needs to be disabled.
2015-10-26 python > 1秒ごとの処理 > while True: / time.sleep(1)

DHT11の温度、湿度データをのちのちグラフ化したい。

とりあえず1秒ごとに取得するため、whileとtime.sleep()を使う。

```timer.py
#!/usr/bin/env python
import time

while True:
	print "Hello"
	time.sleep(1)
```

print "Hello"の部分にDHT11からの読取り処理を実装する。

cronでやってもよさそうだけど、pythonコードで対応。
fluentdのレコードにホスト名を追加する

##目的
fluentdで集約した際にどのサーバで記録されたログなのかわからなくなるため

##config
td−agent2に標準でついてくるFilterプラグインを使用

```
#単純にtail
<source>
    type tail
    path ログ場所
    format none
    tag tag.hostname  #適当に
</source>

#hostname追加
<filter tag.hostname>
  @type record_transformer
  <record>
    hostname ${hostname}
  </record>
</filter>

#転送
# 集約サーバーへ送信,.
<match tag.hostname>
  type forward
  <server>
  </server>
</match>
```

結果

```
2015-10-26T12:14:22+09:00	tag.hostname {"message":"host:〜〜〜〜〜〜"hostname":"送信してきたホスト名"}
```
速報：仮想 DOM は殺された。誰に？ magnum.js に

# UPDATE@2016-01-26

MagJS のパフォーマンスを検証した結果、現時点では本番に投入できるレベルではないことが判明しました。

- [検証：MagJS の本当の描画パフォーマンス](http://qiita.com/t-suwa/items/dac3c929399185d2697f)

どうやら、仮想 DOM はまだまだ死なないようです。

# そして事件は起こった

Backbone ベースの Web アプリを恐る恐る作り出して、ようやく世界の状況が見えてきたこの頃。そろそろ次のステップを踏み出すべく、脱 Backbone を考えてます。

0. Angular あり得ない
1. Ember あり得ない
2. Vue あり得ない
3. React なんか違う
4. Mithril かなりイイ！

となって、Mithril に首までつかろうと決心したその矢先、Magnum.js が出てきてしまった。

https://github.com/magnumjs/mag.js

Mithril や他のフレームワークからいいとこどりしていて、デジャブ感満載。ですが、ココロをギュギュッと鷲掴みされてしまいました。

# 特徴

- スーパークレイジーに速い
- HTML と JS が完全に分離している
- HTML に JS は入らないし、JS にも HTML が入らない
- シンプルな API(Mithril ライク)

# サンプル

括目せよ！

```html:test.html
<div id="lister">
  <h2></h2>
  <ul>
    <li class="item"></li>
  </ul>
</div>
```

```js:test.js
mag.module('lister', {
  controller: function(props) {
    this.item = [1, 2, 3]
    this.title = 'Lister'
  },
  view: function(state, props, element) {
    state.h2 = {
      _text: state.title,
      _onclick: function() {
        state.show = state.show ? !state.show : true
        state.item.reverse()
        state.title = 'Gister' + state.show
      }
    }
  }
})
```

mag.module の第一引数、`lister` は `<div id="lister">` と対応しており、ここで両者が結ばれます。controller 関数は一度だけ呼ばれて、view 関数は描画の度に呼ばれます。state は~~モデル~~ DOM の変更をトリガーするためのオブジェクトであり、state を変更すると自動的に再描画が走りますが、もちろん最適化されています。props はいわゆるモデルに該当し、element は実際の `lister` 要素そのものになります。

重要なことは、HTML と JS が完全分離してお互いを侵食していないにも関わらず、state を通じてシームレスかつ協調的に動作すること。React や Mithril のような不格好な view はここでは一切登場しません。そして、Mithril 譲りのシンプル＆プレーンな関数やオブジェクトがそのまま使える気持ちよさ。フレームワークのゴリ押しを嫌々受け入れる必要など微塵もないわけです。

Mithril から拝借してきた概念なり部品が多く登場するので、Mithril な人は移行しやすいかもしれないけど、仮想 DOM がないので、view は完全に別物ですね。実際には、仮想 DOM に相当するものを裏で持っていると思いますが、少なくとも開発者レベルでは触れる必要がなさそうです。

まだ star もあんまりついていないので、本当に production に投入できるレベルかどうかの評価はこれからおいおいしていくことになります。でも、フルスクラッチではなく、巨人の肩乗りまくりでいいとこどりという戦法を取っているので、ある程度の品質は確保できていそうな予感があります。

仮想 DOM よ、さらば。永遠に。

# 結論

SPA はもうこれでいい気がする。KISS 万歳。
iTerm2でSSHしてMySQL弄ってたらドハマりした

# 予兆
なんか以前から，EC2のインスタンスにSSHしたときに

```
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
```

とか言われてなんじゃこりゃってなってたんですが，特に作業に影響ないから放置してました．．．

# なんか変
## MySQLの文字コード関係の設定

この状態でサーバ上のMySQLにログインすると，文字コード関係の設定が以下のようになってました．

```
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```

こりゃいかんということで，そういえば文字コード関係の警告でてたなぁとか思いながら

```sh
export LC_CTYPE=ja_JP.UTF-8
```
とかやってやると以下のようになったので一安心

```
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```

## サーバ上でファイルを編集したら文字コードが残念なことに

サーバ上でSQLが書かれたファイルを編集してたんですが，上記の警告が出てる状態で編集したために？ファイルの文字コードが`iso-2022-jp-3`とかいう見慣れないものになってしまってました．

# 起こったこと

MySQLで，ファイルを読みこませてSQLを実行させようとしたところ，エラーでコケた．

```
mysql> source mask.sql
ERROR 1406 (22001): Data too long for column 'body' at row 6
```

書かれてたSQLは下記の通り

```sql
update foo set body = repeat('＊', char_length(body));
```

やりたいことは，`body`カラムの内容を**同文字数の**`＊`で置き換えたいだけなのに，なんで溢れるのかがわからない．．．

- `varchar`って文字数だったっけなーとか
- `char_length`って文字数カウントだよなーとか

ただ，MySQLのコンソールで直接SQLをタイプして実行すれば問題なく実行されたことから，あれー??ってなってファイル見直すと文字コードが`iso-2022-jp-3`になってましたとさ．．．

自分は`＊`([U+FF0A](http://glyphwiki.org/wiki/uff0a))のつもりで打ってたのに，文字コードの違いにより全く別の文字列と解釈されてしまってMySQLに弾かれていたと．．．

# 対応
![image](https://qiita-image-store.s3.amazonaws.com/0/18974/86c5b4c5-07fb-4c29-cd93-43142adcb8d2.png)

一番下にある，**Environment**の項目

- [ ] Set locale variables automatically

が，最初からそうだったのか自分でやったのかよくわからないんですが，チェック済みだったのを外す

そうすると，`LC_CTYPE`が未設定の状態になるので，問題が起きなくなりました．

# まとめ
警告は無視しちゃいかん．
a-blog cms のカスタムフィールドの選択肢を動的にする方法



![Google ChromeScreenSnapz015.jpg](https://qiita-image-store.s3.amazonaws.com/0/5132/65b677a9-ad01-d8b6-ae00-e79e1756abfd.jpeg "Google ChromeScreenSnapz015.jpg")

a-blog cms のカスタムフィールドは、テンプレートの HTML を手で書くことで選択肢を作ることができますが、その部分を動的にするにはカスタムフィールドの追加用のファイル field.html にモジュールを書いて追加することになります。

サンプルの HTML は以下のようになります。

```html:field.html
    <!-- BEGIN_MODULE Entry_List id="moduleID" -->
    <!-- BEGIN entry:loop -->
    <label class="acms-admin-form-checkbox" for="input-sample-{eid}">
    <input type="checkbox" name="sample[]" value="{title}" id="input-sample-{eid}"\{sample:checked#{title}\} />
    <i class="acms-admin-ico-checkbox"></i>{title}</label><br>
    <!-- END entry:loop -->
    <input type="hidden" name="field[]" value="sample" />
    <!-- END_MODULE Entry_List -->
```

ポイントとしては **\\{sample:checked#{title}\\}** のようにモジュールが実行された後にも {変数} が残るようにバックスラッシュ (\\) をつけてエスケープしておく必要があります。

これがわかれば、モジュールが入れ子になった複雑なモジュールのテンプレートも書けるようになると思います。
Slack の ピン止め機能の使い方

- ピン止め機能を使うと、そのチャンネル全体での「お気に入り」が出来る。
- ピン止めは、そのチャンネルのメンバー全員で共有のものだ。

## 1. コメントの「歯車ボタン」から「Pin to (チャンネル名)」を選ぶ

![スクリーンショット 2015-10-26 11.31.37.png](https://qiita-image-store.s3.amazonaws.com/0/90607/62ff037a-7cc5-ee73-21c0-70df19ec51ee.png)

## ( 2. チャンネルにピン止めされたことが通知される )

![スクリーンショット 2015-10-26 11.31.49.png](https://qiita-image-store.s3.amazonaws.com/0/90607/2fc48478-4fb0-efa8-0391-6d3be7edd269.png))

## 3. チャンネル上部の「i」ボタンから、ピン止めされたコメントが見られる。

![スクリーンショット 2015-10-26 11.32.05.png](https://qiita-image-store.s3.amazonaws.com/0/90607/2dd3af69-b673-0580-2a78-7d0a7d734513.png)

## 4. ピン止めコメント横の「x」を押すと、ピン止め状態を解除できる

![スクリーンショット 2015-10-26 11.32.18.png](https://qiita-image-store.s3.amazonaws.com/0/90607/14b6c395-2a37-d18d-586f-cd28afddad5c.png)

(ピン止めを解除しても、発言本体は削除されない)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
ImageMagick を古いものに変更する


`rails s` しようとしたらこんなエラー

```
$ rails s
This installation of RMagick was configured with ImageMagick 6.9.1 but ImageMagick 6.9.2-4 is in use. (RuntimeError)
```

どうやら ImageMagick が新しすぎるらしいです。

前々日に `brew upgrade` したのが原因ですかね。。
新しいからダメっていわれるのつらい。


というわけでダウングレードします。

とりあえずインストール済みの ImageMagick のパッケージを調べてみます。

```
$ brew info imagemagick
imagemagick: stable 6.9.2-4 (bottled), HEAD
Tools and libraries to manipulate images in many formats
http://www.imagemagick.org
/usr/local/Cellar/imagemagick/6.8.9-8 (1433 files, 22M)
  Poured from bottle
/usr/local/Cellar/imagemagick/6.9.1-4 (1447 files, 21M)
  Poured from bottle
/usr/local/Cellar/imagemagick/6.9.2-4 (1448 files, 22M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/imagemagick.rb
```

あった。


```
/usr/local/Cellar/imagemagick/6.9.1-4 (1447 files, 21M)
```

そんなわけで今表立って ~~出てきやがる~~ 出ていらっしゃる最新の ImageMagic にはご退場願い、古い子に切り替えます。

```
$ brew switch imagemagick 6.9.1-4
Cleaning /usr/local/Cellar/imagemagick/6.8.9-8
Cleaning /usr/local/Cellar/imagemagick/6.9.1-4
Cleaning /usr/local/Cellar/imagemagick/6.9.2-4
71 links created for /usr/local/Cellar/imagemagick/6.9.1-4
```

ここで再び `ralis s` するとちゃんと立ち上がった。よかった。