OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift] iAdバナーが画面からはみ出る問題

ステータスバーを表示しViewContollerの範囲をステータスバー以下に設定すると、

```lang:swift
self.canDisplayBannerAds = true
```

この書き方ではバナーが画面からはみ出てしまった。
![スクリーンショット 2015-08-10 18.35.26.png](https://qiita-image-store.s3.amazonaws.com/0/87550/443bccb6-2935-9a84-4dda-1a7e143a8b16.png)

対策として、以下のようにしたところ、正常に表示された。

```lang:swift
var iAdBanner = ADBannerView()
//画面下に配置
iAdBanner.frame.origin.y = UIScreen.mainScreen().applicationFrame.height - iAdBanner.frame.height    
//バナー表示前に表示される背景の色を指定
iAdBanner.backgroundColor = UIColor.blackColor()
self.view.addSubview(iAdBanner)
```
gemのインストールで bad response Service Unavailable 503

## ローカルの開発環境では出ないのにEC2だと出る

グローバルでインストールしたいgemがあって、Ansibleから以下のように実行した。

```gem install specific_install --no-rdoc --no-ri```

必ず失敗するわけではなかったが、ほとんどが以下のエラーを吐いていた。

```
Could not find a valid gem 'specific_install' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - bad response Service Unavailable 503 (https://s3.amazonaws.com/production.s3.rubygems.org/latest_specs.4.8.gz)
```

## gemにソースを追加して解決

以下を実行してソースを追加する。
```gem source http://production.s3.rubygems.org```

上のエラーを見て `https://s3.amazonaws.com/production.s3.rubygems.org/latest_specs.4.8.gz` という部分が気になってブラウザでアクセスしてみると何やらS3のエラーが出る。`http://production.s3.rubygems.org/latest_specs.4.8.gz` にしてみるとダウンロードできた。
CoffeeScript でマージソート

```coffeescript:mergesort.coffee

# 配列をマージソート
mergeSort = (ary, isAsc = true)->
  tmpAry = ary.concat()

  split = (ary)->
    if ary.length < 2
      return ary
    mid = ary.length / 2 | 0
    a = split ary.slice 0, mid
    b = split ary.slice mid, ary.length
    merge ary, a, b
  merge = (ary, a, b)->
    unless b?
      return ary
    c = []
    aK = bK = cK = 0
    while aK < a.length and bK < b.length
      if isAsc ^ a[aK] > b[bK]
        c[cK] = a[aK]
        aK++
      else
        c[cK] = b[bK]
        bK++
      cK++
    c.concat (if a.length <= aK then b.slice bK else a.slice aK)
  split tmpAry
```
XMLからJAXBのbeanを簡単に作る方法

XMLからJAXBのbeanを簡単に作る方法

java<=>xmlのバインディングができるJAXBだけど元データからbean作るのがめんどくさい
でも以下の2ステップで簡単にできるので覚えておくと便利

1). xmlからxsdを作成
どうせjavaを使うならtrangが便利
https://code.google.com/p/jing-trang/

適当にtrang-20091111.zipを解凍して以下のコマンドを叩く
`java -jar trang.jar hoge.xml page.xsd`

なおhoge.xmlの先頭が<?xmlで始まっていないと以下のエラーがでるっぽい
`fatal: "[xX][mM][lL]"と一致する処理命令ターゲットは許可されていません。`

2). xjcコマンドでbean作成
jdkに同梱されているxjcコマンドを使ってbeanを作る
`xjc page.xsd`

実行すると
generatedディレクトリの下に自動生成されたbeanが出来上がる

あとはいつもの様にJAXB.unmarshalとかでバインディングすればOK
capistrano使い方まとめ

初めてcapistranoを使ったので、デプロイまでをまとめ。
アプリはRailsで、ステージング環境をデプロイする。

# 事前準備（Rails）
Railsにはstaging環境がデフォルトでは用意されていないので、staging用の設定を事前に行いコミットしておく。

* staging用secret_key_baseの作成

```bash
$ RAILS_ENV=staging rake secret
```
secrets.ymlにstaging用のsecret_key_baseを追加する。

```yaml:config/secrets.yml
staging:
  secret_key_base: 【rake secretで出力された値】
```
* staging用DBを設定

database.ymlにstaging用のDBの設定を追加する。

```yaml:config/database.yml
staging:
  <<: *default
  database: DB名_staging
``` 

* config/environments にstaging用ファイルを作成

config/environments/production.rbをコピーしてstaging.rbを作成する。

```bash
$ cd config/environments
$ cp production.rb staging.rb
```


事前準備が完了したらcapistranoの設定を行う。

# Gemfile作成
デプロイを実行サーバの任意のディレクトリでGemfileを作成

```rb:Gemfile
source 'https://rubygems.org'
gem 'capistrano'
gem 'capistrano-rails'
gem 'capistrano-bundler'
gem 'capistrano-rbenv'
```

gemをインストール。

```bash
$ bundle install
```

# capistranoのデフォルトファイル作成
capコマンドでデフォルトファイルを作成する。

```bash
$ bundle exec cap install
# 以下のディレクトリ・ファイルが作成される
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified
```

# Capfile
capistrano設定ファイル。
今回はrbenvを利用してrubyがインストールされている想定で設定を行う。

```ruby:Capfile
# Load DSL and set up stages
require 'capistrano/setup'

# Include default deployment tasks
require 'capistrano/deploy'

# Include tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails
#   https://github.com/capistrano/passenger
#
# require 'capistrano/rvm'
require 'capistrano/rbenv'

# require 'capistrano/chruby'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
# require 'capistrano/passenger'

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

```

# staging.rb/development.rb
デプロイ先の環境ごとの設定ファイル。
ステージング環境をデプロイするのでstaging.rbを修正する。

```rb:config/deploy/staging.rb
set :stage, :staging #環境名
#各サーバの役割を記述
role :app, %w{サーバ名} #アプリケーションサーバ
role :web, %w{サーバ名} #webサーバ
role :db,  %w{サーバ名} #DBサーバ
#サーバ情報記述
server 'サーバ名', #サーバ名
user: 'ユーザ名', #実行ユーザ
roles: %w{web app db}, # サーバの役割
ssh_options: {
    keys: %w(SSH接続用の秘密鍵ファイルパス),
    auth_methods: %w(publickey),
    password: 'パスワード'
}
```

# deploy.rb
デプロイ内容を定義するファイル。

```rb:config/deploy.rb
# config valid only for current version of Capistrano
lock '3.4.0'

set :application, 'アプリ名'
set :repo_url, 'gitリポジトリURL'
set :deploy_to, 'デプロイ先パス'
set :pty, true # タスク内でsudoするために必要
set :keep_releases, 3 # 世代数

# デプロイ先サーバのrbenvの設定を追加
set :rbenv_ruby, '2.2.2'
set :rbenv_path, '~/.rbenv'

# nokogiriのインストールで失敗するためサーバインストール済みnokogiriを使用
set :bundle_env_variables, { nokogiri_use_system_libraries: 1 }
```

# デプロイ実行
capコマンドでデプロイを実行する。

```bash
$ bundle exec cap staging deploy
```

デプロイ先のサーバでRails起動コマンドを実行し、ブラウザでアクセスできればデプロイ完了

```bash
# デプロイ先ディレクトリのcurrent内で実行
$ bundle exec rails s -e staging -b 0.0.0.0
```
DirectoryInfo.GetFiles の罠

C:\hoge に存在する拡張子が.txtのファイル一覧がほしい場合、

```csharp:C#
DirectoryInfo di = new DirectoryInfo(@"C:\hoge");
FileInfo[] fi = di.GetFiles(@"*.txt");
```

```vbnet:VB
Dim di As New DirectoryInfo("C:\hoge")
Dim fi() As FileInfo = di.GetFiles("*.txt")
```

こんなコードを書いておりました。
が、この書き方だと.txt 以外のファイルも引っかかります。
例えば、.txt_ みたいな拡張子のファイルも対象になってしまいます。

この動きは.NET Framework 2.0 からの仕様のようで……。

[DirectoryInfo.GetFiles メソッド (String)](https://msdn.microsoft.com/ja-jp/library/8he88b63(v=vs.110).aspx)
>メモ
>searchPattern でアスタリスクのワイルドカード文字を使用した場合 ("\*.txt"など)、指定された拡張子の長さによって、一致の仕方が変わります。 searchPattern にちょうど 3 文字の拡張子が指定されていると、searchPattern に指定されている拡張子と最初の 3 文字が一致していて、3 文字以上の拡張子を持つファイルが返されます。 searchPattern に 1 文字、2 文字、または 4 文字以上の拡張子が指定されていると、searchPattern に指定されている拡張子と一致していて、それと同じ長さの拡張子を持つファイルのみが返されます。 疑問符のワイルドカード文字を使用した場合、このメソッドは、指定された拡張子と一致するファイルのみを返します。 たとえば、ディレクトリ内に "file1.txt" と "file1.txtother" という 2 つのファイルが存在する場合、"file?.txt" という検索パターンでは 1 つ目のファイルのみが返されますが、"file\*.txt" の検索パターンでは両方のファイルが返されます。

アスタリスク＆拡張子3文字の場合は気をつけましょうね、ということでした。←まんまと引っかかった人

なお、.NET Framework 4 から追加された EnumerateFiles でもこの辺の挙動は変わらないようです。
[DirectoryInfo.EnumerateFiles メソッド (String)](https://msdn.microsoft.com/ja-jp/library/dd383574(v=vs.110).aspx)
MSDNには書いてないけど……。

---
（2017/02/02 追記）
この挙動は、8.3形式の名前を生成するかどうかに依存するようです。
8.3形式の名前を生成するドライブではここに書かれたような挙動をし、そうでないドライブでは "自然な" 挙動をする、と。
参考：
https://teratail.com/questions/63523
Twitter公式webを絶対時刻表記にするChromeエクステンションを書きました

Chromeエクステンション、初めてやってみましたがお手軽でいいですね。

# ダウンロードとreadmeはこちらから

[tozaiuser/timestamp_switcher](https://github.com/tozaiuser/timestamp_switcher)

# 中身

- 各postの時刻部分で要素の検証をするとわかりますが、`<span class="_timestamp js-short-timestamp">`でタイムスタンプが記述されています。タグ中の`data-time`属性にUNIXタイムスタンプが格納されているので、`attr()`で取り出しています。
- `Date(timestamp)`でタイムスタンプを変換し、`toLocaleTimeString()`などを用いてなるべく簡潔な時刻表記を作っています。`Date()`は引数がなければ現在時刻を返すので、適宜日付や年を入れるための判断に使っています。
- 表示したい時刻表記ができたら`text()`で`<span>`で囲まれた相対時刻を置き換えます。
- 以上を行う関数を1分毎に回しています。
OpenCV+ZBarでQRコード読み込み

## きっかけ
世の中には既にQRコードを読み込めるソフトウェアがたくさんありますが、個人的にOpenCVで顔認識等をしながら、QRコードがあったらそれを読み込むものを作る機会があったので、やってみました。動作環境はMacOS 10.9.5, 言語はC++を使っています。

## 試行錯誤
顔の検出器を用いて顔認識を行っていたので、QRコードの検出器があればQRコードを切り抜けると考え、こちらの手法を試してみました。
http://cani.hatenablog.com/entry/20090725/1248498850

しかし思った以上に検出誤差が大きく、複数の位置をQRコードとして認識してしまいました。また低解像度のWEBカメラだと厳しいようでした。

そこで用いたのが、ZBarというライブラリです。
http://zbar.sourceforge.net/index.html
GNU LGPL 2.1ライセンスで、商用利用も可能です。
こちらを用いてQRコードの検出、データの抽出まで行いました。

## zbarの準備
OpenCVはインストールしている前提で進めます。
まずはZBarのインストールです。macへのインストールは、HomeBrewを用いると楽です。
`brew install zbar`
でできます。こちらを参考にしました
http://qiita.com/labocho/items/11985fa376b867b8e9ff

これが成功すると、画像でのQR読み込みコマンドが使えるようになります
`zbarimg test.jpg`
とすると、指定した画像からQRコードを探し、あればその情報を読み取ってくれます。

ZBarにはzbarcamという、webカメラからの画像データからリアルタイムでQRコード読み込みを行うコマンドがあります。しかし上記URLを参考にzbarをインストールすると、このコマンドは使うことができません。インストール時に--disable-videoを指定しているとこのコマンドは使えないようです。ImageMagickをうまくインストールし、解決しようとしましたが、うまくいきませんでした。

しかしながら今回はOpenCVで画像の抽出までは行うので、ここまでの準備は不要です。

##コード
コードはこちらのものを使わせて頂きました
https://github.com/ayoungprogrammer/WebcamCodeScanner

こちらをクローンしてきて、ビルドを行います。ビルドするときのコマンドはこんな感じでした。

```g++ main.cpp -o main `pkg-config -flags opencv` `pkg-config --libs opencv` `pkg-config --cflags zbar``pkg-config --libs zbar````

コンパイルしてできた実行ファイルを実行すると、うまくいきました。
Vimperatorの使われてなさそうな機能とか


Vimperatorというとjkが使えてfのヒントモードでリンクたどるみたいなところばかり取り沙汰されがちにも思えるが、コマンド数は実際のところ膨大であり、ひょっとしてあまり使われてないのでは？というところをなんとなくまとめてみた。※独断と偏見なのですでに大いに使われている可能性はある。

# about:config

`:set!`コマンドでabout:configの各値を設定できる。about:configを手動で触らず、すべてvimperatorrcでの制御にすれば、設定の明文化になるし、誤設定も防げるしでなかなかに良い。数年前、Firefoxのメモリリークが問題になっていた頃には様々な設定が流行りましたが、最近はわりと下火なんですかね。

# I'm feeling lucky

だいぶ古いtipsが今でも有効というのは、ツールの一貫性がとれている感じで良い。
[VimperatorからI'm feeling luckyする - ミニマリストhitode909の日記](http://hitode909.hatenablog.com/entry/20100509/1273380707)
この設定を入れた上で、`:o lu `に何か別のkeymapを当てておけば、一発で"I'm feeling lucky"できてブックマークがかなり省けるようになる。

# ページネーション操作

AutoPagerizeを入れてはいるが、時折有効化されないページネーションがあって、そのたびに`f`を押すのは面倒だなぁとか思ってた。実際はVimperatorだと、わざわざリンクを叩かずとも`]]`と`[[`でページネーションを行ったり来たりできる。`:set (next|previous)pattern`で定義した文字列を探索して遷移しているので、「次」「前」などの日本語圏で使われる文字列はあらかじめセットしておかなければ動かない。

# panorama

今は「タブグループ」が正式名らしいFirefoxの標準機能。なのだが、個人的にはVimperatorと組み合わせることで真価を発揮する気はする。要はタブをグループで括ってしまって、Vimのバッファのごとくフロントで表示するグループは常時1つだけで入れ替えながら使っていくというもの。作業用のタブグループと調査用のグループを別で作ったりだとか、そういう形で使える。Vimperatorで使う場合は`tabgroup`ないし`panorama`コマンドのサブコマンドで以下が使える。

* `list` 現在使われているタブグループのリスト
* `add` タブグループを追加
* `switch` タブグループを入れ替え
* `remove` 現在のタブグループを破棄
* `pushtab` カレントタブを別のタブグループへ移動
* `pulltab` カレントタブグループに別グループからタブをインポート

キーマップしていずれも3ストローク程で叩けるようにしているが、慣れるとVimのバッファを入れ替える感覚で作業環境を交代させられるので、操作感はかなり楽。

# apptab

タブのピン留め用コマンド。ピン留めというより、英語名称の「apptab」（Gmailみたいにページ遷移なしに常駐させたいウェブアプリで使う機能だからこう呼ぶんだろう）の方がイメージしやすい名前だと常々思う。で、ピン留め用のコマンドは無いのかなとずっと思ってたんだが、探したら実装されていた。個人的にはよく使うので、`:set apptab!`を`@`にマッピングしてトグルさせている。

# ステータスバーの調整

デフォルトだとステータスバーにはカレントタブのURL、ヒストリーの有無、タブ番号、スクロール位置が表示されているが、表示内容は`:set status`で調整できる。Vimperatorを使っているとアドレスバーを非表示にしていることが多いと思うが、これだとSSLの表示がなくなってしまうので、ステータスバーに表示させるようにしている。

# colorscheme

Vimperatorの外観は`:hi[ghlight]`コマンドを使ってCSSで指定することができる。これを複数取りまとめた設定ファイルをcolorschemeとして読み込めるようになっており、ネット上だと[ここ](https://github.com/vimpr/vimperator-colors)などにいくつか置かれている。適当に試してみるのも面白いと思うし、気に入らない部分だけ自分で`:hi`を使ってみても良いかと思う。ちなみに自分はヒントモードの赤と黄色の原色が嫌いなので入れ替えている。

# quickmarks

簡易ブックマーク、のような。`:qmark key url`と設定しておくと、`go(key)`でカレントタブ、`gn(key)`で新規タブに指定したURLを開ける。いまどきブラウザのブックマークをガッツリ使っている人もそれほどいないのではないかと勝手に思っているが、10～20程度のページであればvimperatorrcにquickmarks設定してしまえば、ブラウザブックマークとは無縁の生活になる（それ以上のページ数だとキーとURLの紐付けを覚えるのが大変そう）。

# ~（ファイラー）

ヘルプ曰く __「地球上で最速のファイラー」__ 。おもむろにチルダを叩けばカレントタブにホームディレクトリのファイル及びフォルダ一覧が開かれる。探索には当然ながらVimperatorの操作が使えるので、確かに慣れれば最速かも。チルダだけだとホームディレクトリにしか行かれなくて心もとないが、quickmarksと組み合わせればショートカット代わりにもできるわけで。

# GUI操作

ほぼすべてのGUI操作はコマンドで代替できる。自分もコマンドを知るまでは一時的に`:set gui=menu`したり、Altキーからメニュー触ったりしてたのだが、その必要はない。

## emenu

`:emenu`でメニューバーから実行できるすべての操作を呼べる。

## dialog

`:dialog`で別窓ダイアログを開くような操作を呼べる。`addons`とか`printpreview`とか。

## ext~

extから始まる各種コマンドでコマンドからアドオンを調整できる。例えば`:exta[dd]`がローカルxpiのインポート、`:extde[lete]`がアドオンの無効化。
RailsでSTIを使った場合のincludes


STIを使うとincludesで困る場合がある。
たとえば以下のようなコード。

```rb
class User < ActiveRecord::Base
end

class Student < User
  has_one  :student_detail
end

class Staff < User
  has_one  :staff_detail
end
```

この場合、全ユーザーを取得するときに`User.all.includes(:student_detail, :staff_detail)`とは書けない。Userにはそのようなアソシエーションは定義してないので。

以下のようにする。

```rb
users = User.all
users.group_by(&:class).each do |klass, records|
  associations = {
    Staff => [:staff_detail],
    Student => [:student_detail]
  }.fetch(klass, [])
  
  ActiveRecord::Associations::Preloader.new.preload(records, associations)
end
```

Rails 4.2.1で確認。
参考にしたページの`ActiveRecord::Associations::Preloader`の使い方ではうまくいかなかった。上記の`preload`メソッドもドキュメント化されてないようなので、また変わるかも。

## 参考にしたページ

* <a href="http://stackoverflow.com/questions/27791253/active-record-includes-with-sti" target="_blank">ruby on rails - Active Record includes with STI - Stack Overflow</a>
* <a href="http://stackoverflow.com/questions/29695265/how-to-set-preload-scope-for-rails-associationspreloader" target="_blank">activerecord - How to set preload scope for Rails Associations::Preloader? - Stack Overflow</a>
Trelloに「Webhook API」というのがあったのか（単なる雑記）

ここ数年、仕事にも私生活にも「**[Trello](https://trello.com)**」を利用している。
いわゆる「カンバン」型のツールで、主にメモやタスク管理、ブログの下書きなどに使っている。
チームでも使えるので外部スタッフとの連携も便利。

最近、APIに **[Webhook](https://trello.com/docs/gettingstarted/webhooks.html)** というものがあるのに気づいた。

見てみると、Trelloでの更新が **プッシュ** で **任意のURLに** 通知を送れるという神機能だった。
こりゃ使わん手はないなと思ったので、[PHPで通知を受け取る手順をブログに書いた](http://kijtra.com/article/trello-webhook-api-php/)。

これまでこのAPIに気づかず、cron で更新を検知するようなことをしてたので少しテンションが上がってここに書いてしまった。

-----

で、どんなことに使えるかと考えたところ、各アイテム（「カード」と呼ばれる）の更新をどこかのサーバーで受け取って、ブログとして表示させたら便利なように思った。
（思っただけで作ってはいません :sweat: ）

各アイテムは Markdown で記述できるため個人的にブログの下書きに使ってるけど、その下書きに「公開」とかのタグ（「ラベル」と呼ばれる）を付けたら即公開される、なんてことができそう。

以前、[Postachio](http://postach.io/) というサービスを使っていて、これはEvernoteのメモをブログで公開するというものなんだけど、さすがに使い勝手はあまり良くなかった。
（メモのタイトル（を強引に英訳した文字）がURLになるため、タイトルを変えるとURLも変わってしまったり、英訳も中国語みたいな発音だったり等）
Trelloの Oauth API を使って、Postachio と似たようなサービスも作れそうだと思った。
（しつこいですが思っただけで作ってはいません :cold_sweat: ）

-----

他の使いどころとしては、ブログほどでなくてもサイトの「お知らせ」なんかにも組み込めそう。
画像やファイルの添付もでき、検索もあるのでニーズはありそう。

-----

あとは・・・いまのところ思いつかないw

-----

Trelloはいろんな使い方ができるので、サードパーティのサービスが増えないかなと他力本願に期待してる。

ついでに「どんな使い方があるの？」みたいなコンテンツもあるので紹介。
https://trello.com/inspiration
cakephp3今課題に思っていること


### heroku の　deploy


```php:config/app.php
 'debug' => false,
```

 ~~にしてherokuにデプロイすると、Not Foundエラーで動かない。~~


## 日付表示のベストプラクティスが知りたい。
例）日付データがDBにはdate型で入っている

+------------+
| begin_date |
+------------+
| 2015-01-01 |
+------------+

これをfindすると、

```
begin_term(array)

    time 2015-01-01T00:00:00+0900
    timezone Asia/Tokyo
    fixedNowTime (false)
```

というようなオブジェクトで返ってくる。
これをそのままFormヘルパーに渡すと、勝手に年、月、日に分割したselectタグを生成してしまう。
が、自分は普通にdatepickerで選択させたいので、

```html
<input type="text" id="datepicker" value="2015-01-01">
```

としたいのだが、やりかたがよくわからない
とりあえず、

```php:src/Template/Posts/edit.ctp
use Cake\I18n\Time;
Time::setToStringFormat('YYYY-MM-dd');
echo $this->Form->text('begin_date', ['id' => 'begin_date']);
```

とすると時間のフォーマットが全部'YYYY-MM-dd'になるのでそれを使ってるが、あまりよくない。
（そのページ全部でこのフォーマットにする訳でもないので）




### コントローラで、他のモデルの読み込み

```php:src/Controller/UsersController.php
$this->loadModel('Offices');
$this->loadModel('Items');
$this->loadModel('Posts');
```

だらだらやってたら、こんな感じになっちゃったが、これは一行で書けないのか？

### findの書き方の統一感

だらだら書いているとfindにもいろんな書き方が出てきて統一感がない。


```php:src/Controller/OrdersController.php
	$query = $this->Orders->find();
	$query->where(['customer_id' => $customerId]);
	$this->set('orders', $this->paginate($query));
```


```php:src/Controller/Customers Controller.php
    $this->set('customer', $this->Customers->find()->where(['id' => $customerId])->toArray());
```

```php:src/Controller/UsersController.php
    $user = $this->Users->get($id, [
        'contain' => ['Posts', 'Offices', 'Situations']
    ]);
    $this->set('user', $user);
```



```php:src/Controller/UsersController.php
	$query = $this->Users->find();
	$query->where(['post_id' => $id, 'status' => 1]);
    $this->set('users', $query->first()->toArray());
```



### コントローラのテスト
ログイン済みユーザー設定をいくつかあるテストのうち数個のテストにだけ共通に設定したいのだが。。
こんなやつ。

```php:tests/TestCase/Controller/UsersControllerTest.php
	public function testPostAuthenticated(){
		// Set session data
		$this->session([
			'Auth' => [
				'User' => [
					'id' => 1,
					'name' => 'testname',
					'username' => 'testing',
					'role' => 'admin',
					// other keys.
				]
			]
		]);
		// 以下書略
	}
```
Qiita の テーブル記法を Google Spreadsheet で簡単に書く

# テーブル記法

Qiita や GitHub では Markdown を拡張し、テーブル形式の情報を表示することができます。

これが

```
|  **名前** | **射程** | **攻撃** | **連射** | **サブウェポン** | **スペシャルウェポン** | **価格** |
|  ------- | ------- | ------- | ------- | ------- | ------- | ------- |
|  わかばシューター | 32 | 32 | 75 | スプラッシュボム | バリア | 0 |
|  もみじシューター | 32 | 32 | 75 | ポイズンボール | スーパーセンサー | 800 |
|  スプラシューター | 50 | 45 | 55 | クイックボム | ボムラッシュ | 500 |
```

こうなる


|  **名前** | **射程** | **攻撃** | **連射** | **サブウェポン** | **スペシャルウェポン** | **価格** |
|  ------- | ------- | ------- | ------- | ------- | ------- | ------- |
|  わかばシューター | 32 | 32 | 75 | スプラッシュボム | バリア | 0 |
|  もみじシューター | 32 | 32 | 75 | ポイズンボール | スーパーセンサー | 800 |
|  スプラシューター | 50 | 45 | 55 | クイックボム | ボムラッシュ | 500 |





# これまで

けれども、この形式を手で作るのはちょっと面倒ですよね。

これまでは

1. Spreadsheet でデータ作成してコピー
2. エディタに貼り付け（TSV で貼り付けられる）
3. タブ文字を置換
4. ヘッダとボディ部を分割
5. 作成したテキストをコピーして Qiita に貼り付け

とこんな感じで作成して Qiita に貼り付けてました。


# これから

MarkdownTableMaker という Google Spreadsheet のアドオンを使うと簡単にテーブル形式のデータを作ることができます！


![Gyazo - 5b3b1675b62f5fa89daf025a1215ea2f.gif](https://i.gyazo.com/5b3b1675b62f5fa89daf025a1215ea2f.gif)


## インストール

[MarkdownTableMaker - Google スプレッドシート アドオン](https://chrome.google.com/webstore/detail/markdowntablemaker/cofkbgfmijanlcdooemafafokhhaeold) からアドオンをインストール

## 使い方

1. Spreadsheet でデータ作成
2. Markdown 化したいセルを選択し「アドオン -> MarkdownTableMaker > Convert range to table」
3. 作成されたテキストをコピーして Qiita に貼り付け

簡単ですね！
devstackでLVMのボリュームサイズを変更する

devstackではデフォルトで作成されるLVMのPVのサイズが10Gなので、VMを複数立てるには足りないことがある。
PVのサイズは以下の設定で変更できる。

```ini:local.conf
[[local|localrc]]
VOLUME_BACKING_FILE_SIZE=50G
```

PVのサイズを変更すると、VGのサイズも増える。

```
% sudo pvs                                                                                                                                                                      
  PV         VG                        Fmt  Attr PSize  PFree
  /dev/loop1 stack-volumes-default     lvm2 a--  50.00g 50.00g
  /dev/loop2 stack-volumes-lvmdriver-1 lvm2 a--  50.00g 50.00g
```

```
% sudo vgs                                                                                                                                                                     
  VG                        #PV #LV #SN Attr   VSize  VFree
  stack-volumes-default       1   0   0 wz--n- 50.00g 50.00g
  stack-volumes-lvmdriver-1   1   0   0 wz--n- 50.00g 50.00g
```
cocos2d-xでCocos Studioで作ったLabelの文字が変更できない？

cocos2d-xをやり始めたところです。

MacでもCocos Studioが使えると聞いて、便利に活用しています。
ただ、ものすごく簡単なことができなかったのですが、やっと分かったので共有します。

もともと、「CSBファイル上のラベルの文字列を変更したい」と思い

```cpp
// CSBファイルを読み込む
auto csb = CSLoader::getInstance()->createNode("example.csb");

// そこからラベルを取り出す
auto label = csb->getChildByName<Label*>("Label");

// ラベルの文字列を変更する
label->setString("edited string");
```

と書いたわけですが、これではラベルの表示は全く変わってくれません。


さっぱり分からなかったのですが、デバッガでよくよく見てみると

```cpp
(ui::Text*)label
```

という表示があり、なんとこいつはそもそも、

「Label型ではなくText型」だった

という事実を知りました。


従いまして、以下のコードならうまくいきます。

```cpp
// CSBファイルを読み込む
auto csb = CSLoader::getInstance()->createNode("example.csb");

// そこからラベルを取り出す
auto label = csb->getChildByName<Text*>("Label");

// ラベルの文字列を変更する
label->setString("edited string");
```

大変しょうもない話ですが、お役に立てればと思います。
fabric 書き方Tips

## localで実行したい
```py:fabfile.py
from fabric.api import local
def test:
  local("ls")
```
```bash:コマンドライン
$ fab test
```

## どこかリモートサーバーにsshした状態で実行したい
```py:fabfile.py
from fabric.api import run
def test:
  run("ls")
```
```bash:コマンドライン
$ fab -i ${key} -u ${user} -H ${host} test
```

## 実行コマンドから環境変数を渡して実行したい
```py:fabfile.py
from fabric.api import local
def test(value="hello"):
  local('echo %s' % value)
```
```bash:コマンドライン
$ fab test
# hello

$ fab test:value=ok
# ok
```

## cdした状態で実行したい
```py:fabfile.py
from fabric.api import cd, lcd, run
def test(value="hello"):
  #localの場合
  with lcd("/var/tmp/"):
    local("pwd")

  #remoteの場合
  with cd("/var/www/"):
    run("pwd")
```
```bash:コマンドライン
$ fab -i ${key} -u ${user} -H ${host} test
# /var/tmp/
# /var/www/
```

## ファイルを転送したい
```py:fabfile.py
from fabric.api import cd, put, run
def test():
  # SFTP転送
  put("~/local.txt", "/tmp/remote.txt")

  # 確認
  with cd("/tmp"):
    run("ls")
```
```bash:コマンドライン
$ fab -i ${key} -u ${user} -H ${host} test
# remote.txt
```

## 処理の途中でスリープさせたい
```py:fabfile.py
import time
from fabric.api import local
def test():
  # 処理１
  local('echo A')

  # 30秒待つ
  time.sleep(30)

  # 処理２
  local('echo B')
```

## 並列にパラレル実行させたい
### パターン１（コードに`@parallel`を付ける）
```py:fabfile.py
from fabric.api import parallel

@parallel
def test():
  # 処理
```

```bash:コマンドライン
$ fab -H "host1,host2,host3" test
```

### パターン２（-Pオプションを付けて実行する）
```bash:コマンドライン
$ fab -P -H "host1,host2,host3" test
```
Dockerの標準出力の改行コードはTTYオプションでCRLFになってしまう

普通に`run`するぶんには、改行コードは`LF`になる。

```console
$ sudo docker run --rm ubuntu:14.04 echo "test" | cat -e
test$
```

ForegroundオプションのTTYを有効にすると、`CRLF`になってしまう・・・。

```console
$ sudo docker run --rm -t ubuntu:14.04 echo "test" | cat -e
test^M$
```

`run`コマンドの出力結果をパイプして渡す、`eval`する場合などは`-t`オプションを外したほうがいいですね。

試したDockerのバージョン

```console
$ sudo docker version
Client version: 1.6.0
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 4749651
OS/Arch (client): linux/amd64
Server version: 1.6.0
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): 4749651
OS/Arch (server): linux/amd64
```
Arduinoをいじりはじめてみたよ-その1

#1. はじめに
## あいさつ
ひょんなことからArduinoを使って遊ぶことになったので
その備忘録としてまとめていこうかと。

## 今回の内容
今回は、下記の2項目について書きまーす

1. Arduinoについて
2. LEDを光らせる

## 参考ページ
下記のページを参考にしてます。

* 今回はほぼ[ここ](http://deviceplus.jp/hobby/entry_002/)の内容。詳細はリンク先をみていただければ。
* [その他](http://ideahack.me/what-is-arduino/)

#2. Arduinoとは
Arduino（アルデュイーノ）は、簡単に説明すると、電子工作の初心者でも簡単に扱うことができる[マイコン](http://www.weblio.jp/content/%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3)ボードとプログラミング環境のセットのこと。
用意されているIDEを用いることで手軽にプログラミングして開発が可能である。 
まあ、詳しくは参考ページで！実例とかのムービーがあるので


#3. LEDを光らせよう
これも参考ページをまねすればいいだけですが、
利用するLEDは、[Arduinoに搭載されているLED](http://www.japanese-makers.com/archives/781)を用いました。

## プログラム
### 例
```c++:led_test.ino
#define LED_PIN 13

void setup() {
  // put your setup code here, to run once:
  pinMode(LED_PIN,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(500);
}
```
### 説明
- setup()
	- 初期化処理を書くメソッド。 
- loop()
	- 繰り返す行う処理を書くメソッド。
- pinMode(pin, mode)
	- 指定したピンの挙動を設定する。OUTPUT, INPUT,  INPUT_PULLUPがある。
	- [reference](https://www.arduino.cc/en/Reference/PinMode)
- digitalWrite(pin, value)
	- ピンがアウトプットに設定されているならば、ピンの出力をvalueの値(HIGHT or LOW)にする。
	- 入力の場合は、ピン内部のプルアップの有効無効を切り替える。
	- [reference](https://www.arduino.cc/en/Reference/DigitalWrite)
	- [cf: digitalRead](https://www.arduino.cc/en/Reference/DigitalRead)

## 動作
![こんな感じ](https://dl.dropboxusercontent.com/u/55179773/gif/Graphics%20Interchange%20Format%EF%BC%88GIF%EF%BC%89-BC6E0840E2BC-1.gif)
c++11 > enum class > 列挙子の型も指定できる > enum class PrimitiveType: std::size_t { ... };

https://www.c3.club.kyutech.ac.jp/archives/1614

```cpp
enum class PrimitiveType: std::size_t
{
    TriangleList = -1, // error, Enumerator value evaluates to -1, which cannot be narrowed to type 'std::size_t'
};
```

右側の`std::size_t`のように列挙子の型を指定できるようになっている。

<hr>
通常の(C, C++)のenumの列挙子の型はなんだったか。
以下を見つけた。

http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01076.html
> 列挙子は int 値として利用できる。

と書かれているが @rinse_ さんのコメントを参照するとint型と規定されているわけではないようです。
Webページ表示速度計測ツールメモ


久しぶりにチェックしたのでまとめ。オンラインだったものがなくなっていたり、ブラウザ拡張であったものがなくなっていたりはしている。

## WebpageTest (オンライン)

http://www.webpagetest.org/

Webサイトのパフォーマンスを実際の計測してくれるサービス。計測する地域やブラウザを選択できる。

自前のホスティング環境に導入することで継続的に計測しデータを収集することが可能。

[Speed Index](https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index)というページの可視部分が表示される平均時間を取るものがあり、表示時間の完了時間を見るのではなく画面の可視部分の9割を速く表示できているかといったユーザ体験により近づいた指標になっている。計測ブラウザにIEを使うと0.1s毎の画面の表示段階のサムネイルが確認できる。

## Navigation Timing API (ブラウザ)

ブラウザ側に実装されるHTML5のAPI。

* [W3C Navigation Timing](http://www.w3.org/TR/navigation-timing/)
* [MDN PerformanceTiming Properties](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceTiming)

ブラウザがページの読み込み、表示にかかった時間を計測し、取得できる。
ハイパーリンクがクリックされてからの時間でDNSのフェッチの時間なども計測される。

高精度時計を使うことでアプリケーションの速度を計測にも利用できる。
参考: [User Timing API: あなたの Web アプリをもっと理解するために - HTML5 Rocks](http://www.html5rocks.com/ja/tutorials/webperformance/usertiming/)


対応ブラウザはChrome、Firefox 7+、IE9+、Android 4.0+
http://caniuse.com/#feat=nav-timing

iOSはi0S8で実装されたがパフォーマンスに問題があったためiOS8.1で無効化された
> The Navigation Timing API has been disabled only on iOS due to performance issues
> https://developer.apple.com/library/ios/releasenotes/Miscellaneous/RN-iOSSDK-8.1/index.html

## Google Analytics (オンライン)

Navigation Timing APIを利用しデータを回収し表示している。Navigation Timing APIが実装されていないIEでもGoogleツールバーがインストールされている場合は収集できる。

* [アナリティクスヘルプ > サイトの速度について](https://support.google.com/analytics/answer/1205784?hl=ja)
* [アナリティクスヘルプ > サイトの速度レポートの分析](https://support.google.com/analytics/answer/2383341?hl=ja)

測定できる環境が限られる他、PCとモバイルのスペックや回線速度の違い、ページごとの違いなどが全て平均されてしまうのでうまくセグメントを活用してデータを閲覧する必要がある。

## Page load time (Chrome拡張機能)


Navigation Timing APIを使ってページの表示速度を計測してくれるChrome拡張機能。大まかな項目の計測時間を表示する単純な機能しかないため、いろんなページを把握するときに役に立つ。

https://chrome.google.com/webstore/detail/page-load-time/fploionmjgeclbkemipmkogoaohcdbig


## Google PageSpeed Insights (オンライン)

GoogleのWebサービス
[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=ja)

URLを入力するとページの速度やユーザ体験を改善できる項目をPCサイトとモバイルサイトの両方を検証して一覧にしてくれる。計測時間ではなくパフォーマンスを向上させるための施策の実施度が数値化され、改善項目が列挙される。

以前は「Page Speed」と呼ばれており、Chrome拡張機能も公開されていたが今はオンラインバージョンのみが提供されている。
> PageSpeed Insights for Google Chrome has been deprecated. Please use the online version of PageSpeed Insights.

## YSlow (ブラウザ拡張機能)

[YSlow](http://yslow.org/)

PageSpeed Insightsと同様に、計測時間ではなくパフォーマンスを向上させるための施策の実施度がランク付けされ、改善項目が列挙される。

オンラインツールではなくブラウザ拡張機能として実行できるため公開していない社内インターナルなWebサーバからも実施ができる。

オープンソース化されている
https://github.com/marcelduran/yslow

## その他

いまだに使いこなせていない。

* [Chrome Developer Tools](https://developer.chrome.com/devtools) (ブラウザ拡張機能)

最近、動向を把握できていない。

* [Firebug](http://getfirebug.com/) (ブラウザ拡張機能)

使ったことがない

* [Pingdom Website Speed Test](http://tools.pingdom.com/fpt/) (オンライン)
unity > SerializeField 属性 > private変数に対してインスペクタで変更可能にする

http://www.wisdomsoft.jp/260.html

> SerializeField 属性は MonoBehaviour クラスを継承するスクリプト内のフィールドに対して有効な属性です。この属性を持つフィールドはアクセス修飾子に関係なく「Inspector」ウィンドウから編集可能になります。

publicな変数はインスペクタで編集可能だが、privateな変数の場合はSerializeField 属性を設定すればインスペクタで編集可能になる。

```csharp
[SerializeField]
private float speed = 1;
```
Macでコマンドからメールを送る Gmail

ざっと検索すると Postfixで設定するっぽい
思ったよりサクッと出来たのでオススメ

h2. 検索した

お使いのGmailのsmtpを使って、macのメールコマンドでメール送信を許可する設定の方法 - ITの隊長のブログ http://aipacommander.hatenablog.jp/entry/2014/10/31/151649

Mac OS X Lion mailコマンドでメールを送信する | HAPPY*TRAP http://www.happytrap.jp/blogs/2012/02/25/8313/

MacOSX - Macでコマンドラインやプログラムからmailを送る - Qiita http://qiita.com/tmsanrinsha/items/75e06fbdd7e12409bb02


h2. 設定した

会社Gmailアカウントについて設定する
sudo vi /etc/postfix/relay_passwd
smtp.gmail.com:587 ${you_address}@gmail.com:${you_password}
sudo postmap /etc/postfix/relay_passwd
ls -al /etc/postfix/
sudo rm -rf /etc/postfix/relay_passwd
sudo vim /etc/postfix/main.cf

追加する

```bash:/etc/postfix/main.cf
# HOST
relayhost = smtp.gmail.com:587

# SASL
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_passwd
smtp_sasl_security_options = noanonymous
# 2015/02/10 パラメータ追加
smtp_sasl_mechanism_filter = plain

# TSL
smtp_use_tls = yes
smtp_tls_security_level = encrypt
tls_random_source = dev:/dev/urandom
```

sudo postfix stop
sudo postfix start
sudo postfix reload

Gmailの設定を変更する

安全性の低いアプリのアクセスを有効に変更する。
これは設定項目が見つからなかった（会社アカウントだから？）
無くても動作した

```bash:テストメール
echo "test" | mail -s "test" your_account@gmail.com
```

mailコマンドは…知らな…

```
mail -s '件名' 宛先のメールアドレス
ターミナルからのメール送信テスト
. (ピリオド + リターンキー)
```


SMTPサーバのメール送信テストにmailxコマンドを使う ｜ Developers.IO http://dev.classmethod.jp/cloud/aws/using-mailx/

```bash
mail your_account@gmail.com < data.txt
date | your_account@gmail.com
# Subject : aaaaaa
mail -s "aaaaaa" your_account@gmail.com < data.txt
# From : ec2-user@example.com
mail -r ec2-user@example.com smokeymonkey@gmail.com
```
GITでコミット間の差分ファイルをZIPで出力するシェルスクリプト

```bash

#!/bin/bash
if [ $# -ne 3 ]; then
	echo "Usage: git diff-zip <archive_name> <oldCommit> <newCommit>"
	exit 1
fi

git archive --format=zip --prefix=$1/ $3 `git diff --name-only $2 $3` -o ../$1.zip

````
Subscriber経由でSlackに投稿する

ROSのSubscriber経由でSlackに投稿してみた。例によって需要は考えていない。

[SlackClient](https://github.com/slackhq/python-slackclient)を使うと簡単にSlackとつなげれる。

## 準備

```bash
pip install slackclient
```

pipでSlackのWeb APIのライブラリを入れておく。（ROSって仮想環境どうしたらいいだろ？）

## コード

SubscriberのコールバックでSlackに投稿している。チャンネルとかユーザー名はパラメータ化してもよいかも。

```sc.py
#!/usr/bin/env python

import rospy

from std_msgs.msg import String
from slackclient import SlackClient

token = "TOKEN" # トークンは https://api.slack.com/web で作る
username = "ros"
channel = "#ros"

sc = SlackClient(token)

def callback(message):
    print sc.api_call("chat.postMessage", channel=channel, text=message.data, username=username)

rospy.init_node("rosslack")
sub = rospy.Subscriber("postMessage", String, callback)
rospy.spin()

```

## 実行

```
chmod +x sc.py
./sc.py
```

別コンソールから `rostopic` を使ってPublishをする。

```
rostopic pub /postMessage std_msgs/String -- 'hoge'
```

これで、Slackの画面を見てみるとROSからメッセージが届いているはず。
DockerのコンテナでUbuntuを使う時にキャッシュを効かせてパッケージインストール(apt-get)を早くする

Dockerfileを試しながら作る時に`apt-get install`とするも通信環境が遅い場合に結構時間が掛かってどうにかできんのかなーと思ったらキャッシュするやり方があったのでメモ。やり方としてはapt-cacher-ngというAPT用のキャッシュプロキシのコンテナを立てて、検証用コンテナからaptコマンド実行時には上記プロキシを経由させてキャッシュを利用する方法です。

# 参考

+ [Dockerizing an apt-cacher-ng service](https://docs.docker.com/examples/apt-cacher-ng/)
+ [第315回　apt-cacher-ngを使ってAPT用キャッシュプロキシの構築](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0315)

# aptをキャッシュするDockerの作成

aptをキャッシュする`apt-cacher-ng`を実行するだけのDockerfileを作成します。

```lang:Dockerfile
# Build: docker build -t apt-cacher .
# Run: docker run -d -p 3142:3142 --name apt-cacher-run apt-cacher
#
# and then you can run containers with:
#   docker run -t -i --rm -e http_proxy http://dockerhost:3142/ debian bash
#
FROM        ubuntu
MAINTAINER  SvenDowideit@docker.com

VOLUME      ["/var/cache/apt-cacher-ng"]
RUN     apt-get update && apt-get install -y apt-cacher-ng

EXPOSE      3142
CMD     chmod 777 /var/cache/apt-cacher-ng && /etc/init.d/apt-cacher-ng start && tail -f /var/log/apt-cacher-ng/*
```

ビルドします。

```
$docker build -t eg_apt_cacher_ng .
$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
eg_apt_cacher_ng    latest              e4db4b1d78af        15 minutes ago      236 MB
ubuntu              latest              63e3c10217b8        2 days ago          188.3 MB
```

コンテナを起動します。

```
$docker run -d -p 3142:3142 --name test_apt_cacher_ng eg_apt_cacher_ng
```

起動されているかを確認します。

```
$docker ps
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                    NAMES
86aa9a703ec0        eg_apt_cacher_ng:latest   "/bin/sh -c 'chmod 7   14 minutes ago      Up 14 minutes       0.0.0.0:3142->3142/tcp   test_apt_cacher_ng
```

起動したコンテナのIPアドレスを確認しておきます。

```
$docker inspect --format '{{ .NetworkSettings.IPAddress }}' test_apt_cacher_ng
172.17.0.7
```

# 検証したいUbuntuコンテナの起動

環境変数の指定や/etc/apt/source.listを変更するなど色々やり方があります。(要はaptコマンド実行の際に上記コンテナをproxyとして利用できれば良い)

Dockerfileで何もしたくない場合、runコマンド実行時の環境変数としてproxyを指定することでキャッシュを効かせることができます。

```
$docker run -it -e http_proxy=http://172.17.0.7:3142/ ubuntu:latest /bin/bash
```

ただし、上記の場合、Dockerfile内でwgetやその他外部通信が必要なコマンド全体に影響が出るので考慮が必要です。

Dockerfile内で制御する場合、

```
$echo 'Acquire::http { Proxy "http://172.17.0.7:3142"; };' >> /etc/apt/apt.conf.d/01proxy
```

というような記述をDockefileの先頭で書くことでaptについてのみproxyを効かせるような設定を行うこともできます。
ニフティクラウド上の SQL Server 2012 R2 に Windows 7 + SQL Server Management Studio Express で接続する

(not implemented yet)

## 参考資料

* [I can't connect to my servers SQL database via an IP Address - Database Administrators Stack Exchange](http://dba.stackexchange.com/questions/62165/i-cant-connect-to-my-servers-sql-database-via-an-ip-address "I can't connect to my servers SQL database via an IP Address - Database Administrators Stack Exchange")
SQL Server コマンドメモ

## SQL 実行

`;` ではなく `go` が実行の合図っぽい。

```
1> select 1
2> go
```

## データベース一覧

`..` はどういう意味だろう？

```
1> select name from master..sysdatabases
2> go
name

------------------------------------------------------------------------------------------------------------------------
--------
master

tempdb

model

msdb

mydatabase

hoge

(6 行処理されました)
```

参考：[Get list of databases from SQL Server - Stack Overflow](http://stackoverflow.com/questions/147659/get-list-of-databases-from-sql-server "Get list of databases from SQL Server - Stack Overflow")
ニフティクラウド 上の SQL Server 2012 R2 サーバーの基本動作確認

## サーバー作成

1. ニフティクラウド Computing で Microsoft SQLServer 2012 R2 (Windows 64bit) サーバーを作成
2. 上記サーバーに下記ルールを適用
<pre>
TCP 3389 IN IPアドレス(IPv4) (接続元として利用する予定のIPアドレス)
</pre>

## ログオン (リモートデスクトップ接続でログオン)

1. Windows 7 の「スタート」メニューから「リモート」等で検索し「リモートデスクトップ接続」を立ち上げ
2. 接続ダイアログで作成したサーバーのグローバル IP アドレスを入力
3. サーバー作成時に入力した管理者ユーザー名・パスワードを入力

## サービス確認

* 「サービス」メニューから起動・停止
* net start mssqlserver, net stop mssqlserver で起動・停止
  * 管理者ユーザーで PowerShell を起動する必要があった

## SQL サーバーへのログイン

* Windows SQLServer Management Studio からログイン
  1. 「すべてのアプリ」からWindows SQLServer Management Studio 起動
  2. ログインダイアログで認証を「SQLServer認証」に変更
  3. ユーザー名 sa、パスワードなしでログイン
  4. 初回はパスワード期限切れでパスワードを再設定する必要あり
* PowerShell + sqlcmd でログイン
  1. PowerShell 起動
  2. 下記コマンド実行
<pre>
sqlcmd -U sa # パスワードが聞かれるので入力
</pre>

## 参考資料

* [ニフティクラウドで提供するMicrosoft SQL Server 2012 SP1の仕様について | ニフティクラウド](http://cloud.nifty.com/cs/catalog/cloud_faq/catalog_140130001646_1.htm)
Support Libraryのライセンスの確認方法で悩む


Support LibraryがApache 2.0ライセンスで配布されているのは知っていたのですが第三者にそれを確認してもらう(確認手順を示す)のが結構面倒だったので色々調べてみました。


例えばButterKnifeは[公式ページ](http://jakewharton.github.io/butterknife/)にはっきりライセンスが書いてあります。アプリでライセンスを表示する場合はこれをそのままコピペすればおｋでしょう。

```
Copyright 2013 Jake Wharton

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```

ところがAndroid Support Libraryの[公式ページ?](http://developer.android.com/intl/ja/tools/support-library/index.html)にはライセンスが明記されていません。

[AOSPの公式ページ](https://source.android.com/source/licenses.html#android-open-source-project-license)には「基本的にはApache 2.0ライセンスだけど例外もあるからね」(意訳)と書いてはいますがSupport Libraryについては明示されていません。

開発者的にはAOSPなんだからApacheライセンスに決まってるだろ常考、なんですが第三者に説明できるように色々調べてみました。


* SDK Managerで"Android Support Repository"を落として、`(android-sdk)/extras/android/m2repository/NOTICE.txt`を確認してもらう。
* [公式リポジトリ](https://android.googlesource.com/platform/frameworks/support.git/+/master)内のソース(java, xmlファイル)のヘッダーに記載されているライセンスを全部確認してもらう


どっちにしろ面倒なんですがなんかいい方法ないですかねぇ..
Rubyのインストール::Windows


対象

- とりあえずRubyインストールして使ってみたい人

参考

- [WindowsにRubyをインストールする(初心者向け) - Qiita](http://qiita.com/shimoju/items/41035b213ad0ac3a979e)

---

# ダウンロード
[RubyInstaller for Windows](http://rubyinstaller.org/)からインストーラをダウンロード

2015/08/10時点の一覧

- Ruby 2.2.2
- Ruby 2.2.2 (x64)
- Ruby 2.1.6
- Ruby 2.1.6 (x64)
- Ruby 2.0.0-p645
- Ruby 2.0.0-p645 (x64)
- Ruby 1.9.3-p551

Windowsが64bitなのでとりあえず`Ruby 2.2.2 (x64)`をダウンロード

# インストール
- 最低限`Rubyの実行ファイルへ環境変数PATHを設定する`のチェックは入れてから`インストール`を実行する
- インストールする場所（パス）は任意だが`C:\Ruby22-x64`とかでいいと思う
- インストール完了後、コマンドプロンプトで`ruby -v`と実行してバージョン情報が表示されることを確認する
  - `ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32]`とか表示されるはず

# Development Kitのインストール
## なにこれ？
コンパイルが必要なgemのインストールとかに必要
Ruby本体のみ使うならいらないけど、とりあえずいれとく

## ダウンロード
今回Rubyは64bit版なので
DEVELOPMENT KITの部分の「For use with Ruby 2.0 and above (x64 - 64bits only)」とかいてある下記をダウンロード(2015/08/10時点)
`DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe`

## インストール
インストール手順の詳細は下記参考先の記事どおり
[WindowsにRubyをインストールする(初心者向け) - Qiita](http://qiita.com/shimoju/items/41035b213ad0ac3a979e)

なんだけど`ruby dk.rb install`を実行したときとかにRubyが見つかれないっす的なエラーが出た場合は`C:\RubyDevKit\config.yml`を開いて下記のように編集してください。
（`- C:\Ruby22-x64`を追加してます）

```yaml
# This configuration file contains the absolute path locations of all
# installed Rubies to be enhanced to work with the DevKit. This config
# file is generated by the 'ruby dk.rb init' step and may be modified
# before running the 'ruby dk.rb install' step. To include any installed
# Rubies that were not automagically discovered, simply add a line below
# the triple hyphens with the absolute path to the Ruby root directory.
#
# Example:
#
# ---
# - C:/ruby19trunk
# - C:/ruby192dev
#
- C:\Ruby22-x64
---
```
編集完了後、再度`ruby dk.rb install`を実行

# インストール完了後にやっとくといいこと

## gemのインストール
プロジェクト問わず使うことの多いbundlerとかpryとか、入れておく
というかbundlerはそもそも入れとかないとプロジェクトごとに分けらんないし
コマンドプロンプトで下記を実行してインストールする

```bash
gem install bundler
gem install pry
gem install pry-doc
```

# で、このあとは？
irbでもpryでも使ってコンソール起動。pryのがおすすめ。
コンソール起動後に

```rb
Class.ancestors # => [Class, Module, Object, PP::ObjectMixin, Kernel, BasicObject]
```
とか

```rb
Class.new.class
```
とかして「クラスもClassクラスのインスタンスか。。。」とかつぶやくとそれっぽく見えるよ。
InfluxDBのv0.9.1でCan't connect with admin interface using authenticationと表示される

#InfluxDB　v0.9.1のバグ

InfluxDBのv0.9.1を使用すると、ログインができず`Can't connect with admin interface using authentication`と表示されるバグがありました。

4日ほど前にアップデート版（v0.9.1.1）がでましたので、こっちを使いましょう。

* [Githubでのやりとり](https://github.com/influxdb/influxdb/issues/3222)

#解決策

```
[root@~ ]# service influxdb stop 
[root@~ ]# rpm -aq |grep influxdb
influxdb-0.9.2-1.x86_64

[root@~ ]# wget https://s3.amazonaws.com/influxdb/influxdb-0.9.2.1-1.x86_64.rpm
[root@~ ]# sudo rpm -Uvh influxdb-0.9.2.1-1.x86_64.rpm

[root@~ ]# service influxdb start 
[root@~ ]# sudo /etc/init.d/influxdb version
InfluxDB v0.9.2.1 (git: b237c68bab4756507baf6840023be103853e77db)

```
VMware NSXの評価版の入手（2015.08.10時点）

# 概要

2015年8月10日現在、VMware NSXはMy VMwareから入手できます。ただし言語を英語にしておく必要があります。NSXは60日間はフル機能の評価モードで試用できます。

# 詳細

## 入手

多くの製品と同様、[My VMware](http://my.vmware.com)から入手できます。

ただし現時点では、My VMwareの言語を英語にしておくことが必要です。言語は、My VMwareにログインしたあと、ページ左上の「English」「日本語」などと表示された言語表示から変更できます。

![nsx_download_003.png](https://qiita-image-store.s3.amazonaws.com/0/55718/050219c2-5aa2-72a1-3388-cb3321c744ad.png)

言語を日本語にしていると、「製品のダウンロード」一覧にNSXが表示されません。また公開サイト上の「[VMware NSX の仮想ネットワーク](http://www.vmware.com/jp/products/nsx/)]」ページも、[無償評価](http://www.vmware.com/go/try-nsx-jp)のリンク先は[ハンズオンラボでの評価](https://my.vmware.com/group/vmware/evalcenter?p=nsx-hol)ページになります（このため、入手方法の質問が時々あがります）。

ダウンロードリンクが表示されても、権限が必要な場合があります。この時は、My VMwareの自社情報の管理者に確認してください。

## 評価期間

[NSX Installation and Upgrade Guide - NSX 6.1.x for vSphere](http://pubs.vmware.com/NSX-61/topic/com.vmware.ICbase/PDF/nsx_61_install.pdf)によれば、上記の製品版を、60日間はフル機能の評価モード（evaluation mode）で試用できます。

> Before purchasing and activating an NSX for vSphere license, you can install and run the software in evaluation mode. When run in evaluation mode, intended for demonstration and evaluation purposes, NSX components are completely operational immediately after installation, do not require any licensing configuration, and provide full functionality for 60 days from the time you first activate them. ("NSX Installation and Upgrade Guide - NSX 6.1.x for vSphere" p.19)

# 参考

* [My VMware](http://my.vmware.com)
* [NSX Installation and Upgrade Guide - NSX 6.1.x for vSphere](http://pubs.vmware.com/NSX-61/topic/com.vmware.ICbase/PDF/nsx_61_install.pdf)

----

本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
[追記]swf2jsでActionScriptをJavaScriptに置き換える。

# まずはActionScriptの実行順番を把握する。

ActionScriptは深度の上から順番に実行される。
MovieClipのアクションは表示される深度の下から実行される。

下記のようなタイムラインの場合

~~~
|深度|フレーム|名前|
| 7 | a | [as1] |
| 6 | ● | [MC1] |
| 5 | a | [as2] |
| 4 | a | [as3] |
| 3 | ● | [MC3] |
| 2 | ● | [MC2] |
| 1 | a | [as4] |
~~~

次のように実行される

~~~
as1
as2
as3
as4
MC2のアクション
 => MC2内のMovieClipのアクション
MC3のアクション
 => MC3内のMovieClipのアクション
MC1のアクション
 => MC1内のMovieClipのアクション
~~~

MovieClipの中のアクションも同じように実行されていく。


## はまったところ

MC2でMC1のフレームを移動してもMC1の移動する前のアクションは実行される。

### MC2のアクション

~~~
trace("mc2");
MC1.gotoAndPlay(2);
~~~

### MC1のフレームとアクション

~~~
フレーム1のアクション
stop();
trace("frame1");

フレーム2のアクション
trace("frame2");
~~~

とした場合

~~~
mc2;
frame1;
frame2;
frame1;
~~~


と出力される。

JavaScriptだと
まずはフレームのアクションを実行して
深度の低いMovieClipのアクションを実行。

この際にフレーム移動先でアクションがある場合は
その度に別の配列に格納しておいて最初のアクションの実行が完了したら
次は配列に格納されたアクションを実行する
これを繰り返す事で動いた。

~~~

    MovieClip.prototype.addActions = function()
    {
        var _this = this;

        // メインのアクション
        if (_this.isAction) {
            var frame = _this.getFrame();
            var as = _this.getActions(frame);
            if (as != undefined) {
                var player = _this.player;
                var actions = player.actions;
                var queue = player.queue;
                var obj = { as: as, mc: _this };
                if (queue == null) {
                    actions[actions.length] = obj;
                } else {
                    queue[queue.length] = obj;
                }
            }
            _this.isAction = false;
        }

        // 深度の若い順番にアクションを実行
        var tags = _this.getTags();
        var _addActions = _this.addActions;
        var _btnCallback = _this.btnCallback;
        var length = tags.length;
        for (var depth = 1; depth < length; depth++) {
            if (!(depth in tags)) {
                continue;
            }

            var tag = tags[depth];
            // loadMovieでよばれた別swfは形式を合わせる
            if (tag instanceof Player)
                tag = tag.getParent();

            if (tag instanceof MovieClip) {
                _addActions.call(tag);
            } else if (tag.characters instanceof Array) {
                // ボタンの状態でアクションを実行
                _btnCallback.call(_this, tag, _addActions);
            }
        }
    };

~~~

後は、queueにデータがあればひたすら実行

~~~

while(actions.length) {
    queue = [];
    
    // アクションを実行
    for (var i = 0; i < actions.length; i++) {
        action[i].execute();
    }
    
    actions = queue;
}

~~~

よしよし。
これで問題ないはず。

と思ったが、フレーム移動があった場合のアクションの順番は
このルールに当てはまらないorz


# フレーム移動の際のアクションの順番

レンダリング後、フレーム移動して移動先にアクションがある場合
(新規のMovieClipやフレーム終了したMovieClipは先の条件で呼ばれる)
最後にレンダリングされたMovieClipのアクションから実行される。

~~~
root
|a|a|
|●|●|MC2
|●|●|MC1

MC1
|a|a|

MC2
|a|a|

~~~

とした場合

~~~

1フレーム
root_frame1
mc1_frame_1
mc2_frame_1
ここは最初のルールが適用

2フレーム
mc2_frame_2
mc1_frame_2
root_frame2

2回目の1フレーム
mc2_frame_1
mc1_frame_1
root_frame1

2回目の2フレーム
mc2_frame_2
mc1_frame_2
root_frame2

~~~

# ルールは二つ

* 初回アクション実行時とアクションでフレーム移動があった場合
* レンダリング後、フレーム移動した場合

こんどこそできたorz



## 完成品

[ienaga/swf2js](https://github.com/ienaga/swf2js)


ベースはこれでできたので、次はSWF5,SWF6で使う
onClipEventを調べてみよう。
[VSCode]Visual Studio CodeでShift-JISのファイルを開く 

Visual Studio Codeが発表されたので、少し使ってみました。

サイト：https://code.visualstudio.com/

しかし、Shift-JISのファイルを開くと文字化けして読めないです。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/86431/b86b7f34-8fb2-cb25-d253-3b042a5d3bdc.jpeg)

右下のUTF-8と書かれた部分をクリック　->　Reopen with Encodingをクリックすると、エンコードが選択できます。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/86431/71f7d93d-da13-5483-86d2-7ea561d05eec.jpeg)

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/86431/412dbb5b-f775-4f2b-de39-88e4f4f34fc2.jpeg)

そこでShiftJISを選べば、解決できます。

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/86431/ccca4608-61a8-75e3-7c00-d3afb7f8d037.jpeg)

参考サイト：http://www.devrookie.com/post-2929/
Haxeでインラインワーカー


JSで非同期処理をする際に便利なインラインワーカーですが、ワーカーは通常ブラウザjsとは別のグローバルスコープで実行されるため、型付のHaxeでは使用するのがちょっと面倒でした。

インラインワーカーについてはこちらの記事を参考にしています。

http://qiita.com/mohayonao/items/872166cf364e007cf83d

https://developer.mozilla.org/ja/docs/Web/Guide/Performance/Using_web_workers

```Haxe:WorkerUtil.hx
class WorkerUtil {
    static var reg = new RegExp("^function\\s*\\w*\\s*\\([\\w\\s,]*\\)\\s*{([\\w\\W]*?)}$", "i");
    public static function createInlineWorker(workerFunc: Dynamic): Worker {
        var func = workerFunc.toString().trim().match(reg)[1];
        var blob = new Blob([ func ], { type: "text/javascript" });
        var url = URL.createObjectURL(blob);
        return new Worker(url);
    }
}

```

```Haxe:Main.hx

var worker = WorkerUtil.createInlineWorker(function() {
	var global: DedicatedWorkerGlobalScope = js.Lib.eval("self");
	global.onmessage = function(m: MessageEvent) {
		global.postMessage(m.data+"!!");
	};		
});
worker.onmessage = function(m: MessageEvent) {
	trace(m.data); // Hello World!!
}
worker.postMessage("Hello World");


```

当初、通常のjsのように、ワーカーで実行される無名関数内のスコープが実行時ワーカースコープになるという特徴をどうHaxeで実現するか悩んだのですが、結果的に、 **JavaScriptのevalが常にグローバルスコープで評価される** という特徴を思い出し、eval("self")をすればいいと気がつきました。WebWorkerのグローバルスコープには上記のMDNのようないくつかの関数と変数が登録されており、それらはWorkerGlobalScopeというインラーフェースとしていくつかの実装系があります。通常のWebWorkerの場合、DedicatedWorkerGlobalScopeというクラスになるため、selfの値はそのインスタンスになります。なので、このような形で書くことによってHaxeのコンパイラのエラーを回避できます。
Dockerの不要コンテナとイメージを削除するワンライナー

イメージを消すとき先にコンテナを消します。

`2> /dev/null`は僕の好みで付けてます。
シェルスクリプトに組み込むときに余計な出力が好きじゃないので

# 環境
vmfusionにdocker-machineで構築しています。

```bash
$ docker version
Client version: 1.7.0
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 0baf609
OS/Arch (client): darwin/amd64
Server version: 1.7.0
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 0baf609
OS/Arch (server): linux/amd64
```


# 不要なコンテナを削除
終了されているコンテナのみを削除

```bash
$ docker rm $(docker ps -aqf "status=exited") 2> /dev/null
```

# 不要なイメージの削除
開発してると溜まるイメージ

```bash
$ docker rmi $(docker images -aqf "dangling=true") 2> /dev/null
```
kindleリンク集

* kindle for windows 
    * https://www.amazon.co.jp/kindlepcdownload

## 変換して転送

* [Kindle Paperwhiteマンガモデルで自炊してzipファイルを流し込む方法まとめ。【Windows編】](http://setusoku.com/ithack/23950/)の通り。

* [Kindle Comic Converter](https://kcc.iosphe.re/)をインストール
* [KindleGen](https://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000765211)に含まれる`kindlegen.exe`を`C:\Program Files\Kindle Comic Converter\`に保存
* jpgをzipで固めてドラグアンドドロップ

![convert.png](https://qiita-image-store.s3.amazonaws.com/0/25728/54a0ef0d-d801-0588-3105-24ffe0a7fd5b.png)

kindle 2015 マンガモデルだと`Kindle PW 3`を指定。


## プライム対象商品の検索

* [Amazonプライム対象商品 - Kindle本: Kindleストア](http://www.amazon.co.jp/s?rh=n:2275256051,p_85:1)
* [Amazonプライム対象商品 : コンピュータ・IT](http://www.amazon.co.jp/s/ref=sr_nr_n_9?fst=as%3Aoff&rh=n%3A2250738051%2Cn%3A!2250739051%2Cn%3A2275256051%2Cp_85%3A1%2Cn%3A2291657051&bbn=2275256051&ie=UTF8&qid=1439165990&rnid=2275256051)
* [検索窓に「プライム対象」と入力すればよい](http://www.amazon.co.jp/s/ref=nb_sb_noss?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Ddigital-text&field-keywords=node.js+%E3%83%97%E3%83%A9%E3%82%A4%E3%83%A0%E5%AF%BE%E8%B1%A1)

* [月１冊、無料で本が読めちゃうKindleオーナーライブラリーで読んでおきたいIT技術書やビジネス書おすすめ50選](http://www.karamage.com/matome/post-6837)

## ChainLP

* calibre での変換が成功しなかったため、ChainLP(windows専用)を用いる。
    * [ChainLPが素晴らしすぎて僕にはもうほかになにも要らない(要dll) | Kitten Torpedo](https://weakboson.wordpress.com/2010/12/21/chainlp%E3%81%8C%E7%B4%A0%E6%99%B4%E3%82%89%E3%81%97%E3%81%99%E3%81%8E%E3%81%A6%E5%83%95%E3%81%AB%E3%81%AF%E3%82%82%E3%81%86%E3%81%BB%E3%81%8B%E3%81%AB%E3%81%AA%E3%81%AB%E3%82%82%E8%A6%81%E3%82%89/)
    * [ChainLP設定サンプル：Kindle Paperwhite、KindleDX | ブルーレディー]
(http://www.bluelady.jp/know-how/post-1653)
    * [こんにちわ。教えて下さい。最近kindle paperwhiteを購入しました... - Yahoo!知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1299805632)
* 解像度設定 : 1080x1440
* 横画面用 : 

### kindlestrip

* [Python 2.7 Release | Python.org](https://www.python.org/download/releases/2.7/)
* [kindlestrip 1.36.1 : Python Package Index](https://pypi.python.org/pypi/kindlestrip/)
* [Python - windowsにeasy_installとpipをインストールする - Qiita](http://qiita.com/tukiyo3/items/fb5c4f93b584d1999146)

ネットワークドライブだとkindlestripが失敗するので注意！！

## 書籍検索

* [プログラミングの本を無料で手に入れる方法 - Qiita](http://qiita.com/kodam/items/4b10f9c304e4c94a95f1)
* Googleでfiletype:pdf で検索。
    * [python](https://www.google.co.jp/search?q=python+filetype:pdf)
    * [ruby](https://www.google.co.jp/search?q=ruby+filetype:pdf)
    * [nodejs](https://www.google.co.jp/search?q=nodejs+filetype:pdf)

## コンテンツと端末の管理

* [amazon.co.jp](https://www.amazon.co.jp/mn/dcw/myx.html)
* [amazon.com](https://www.amazon.com/mn/dcw/myx.html)

## USB転送

* Kindleのdocumentsフォルダに入れるだけ
    * [【Kindle Paperwhite】勉強や仕事に必要なPDFをPCからUSB経由で転送して閲覧 | あんどろいどスマート](http://android-smart.com/2013/01/paperwhite2.html)

## 文字のサイズ、行間の変更

* TXTファイルを読み込んだ時に指定ができる。
* [Kindle Paperwhiteで文字の大きさや書体（フォント）を変更する方法 | nanapi [ナナピ]](https://nanapi.jp/61866)