OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant v1.8.5でvagrant upすると、エラー(Timed out while waiting for the machine to boot...)が出てきて進まない

## 環境
+ ホストOS: Xubuntu16.04.1(ただしOS関係なく起きる模様)
+ ゲストOS: CentOS7
+ Vagrant: 1.8.5(これが主な原因)
+ VirtualBox: 5.1

```bash
$vagrant up
ほげほげ(省略)
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...

Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.
```

と出てきて何度もvagrant upしてもおないことが起きたのでメモ。

# 原因
vagrant **1.8.5** におけるバグ。
https://github.com/mitchellh/vagrant/issues/7610
要はvagrantで作った鍵の権限の設定ミスでログインできないっぽい。
1.8.6では対策されそう。

# 対策
1.8.5におけるバグなので、1.8.4に下げればいいやと思ったが、1.8.4に下げるとVirtualBox5.1には対応していないので、Virtualboxもバージョン下げないといけない・・・。
それはめんどくさいので、Issueページに書いてある対策を実行した。

### 方法1 public_key.rb書き換え
Windowsの場合
``C:\HashiCorp\vagrant\embedded\gems\gems\vagrant-1.8.5\plugins\guests\linux\cap\public_key.rb``
Linux/macOS(OS X)の場合
``/opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb``
に、以下の+マークの行を追記する。

```rb
@@ -54,6 +54,7 @@
             if test -f ~/.ssh/authorized_keys; then
               grep -v -x -f '#{remote_path}' ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp
               mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys
+              chmod 0600 ~/.ssh/authorized_keys
             fi

             rm -f '#{remote_path}'
```

これで一旦VMを消して実行すれば大丈夫。

### 方法２ ゲストOSの権限を変える
もうこれについては記事が上がっているので省略。
既存のVMはこれでやれば消さなくていいのでいいかも。
http://qiita.com/ritukiii/items/9a51adc0334132bc8e15

### 方法3 VagrantFileを書き換え
```rb:VagrantFile
config.ssh.insert_key = false
```
を追記。ただこれで直るかは試していません・・・。

### まとめ
Vagrantめんどくさいなぁと思えるバグでした。バージョンには注意を払いつつ使いましょう。
質問するときも環境開示する大切さがわかってもらえると嬉しいです。
なんちゃってプロジェクト管理：RPGツクール系で分業をやってみた

#まずはじめに
この方法が良いとは思ってませんが、当時大学生サークルでゴリゴリ開発していた時の色々な反省点を踏まえ、今風に調整して公開してます。

- こういう方法があるよ！
- こんなんどうよ？

とかバンバンください！

#概要
こういう作りになってる背景をちょっとだけ。
メンバーは以下のとおり

私：一応代表やらせてもらってます。RGSS時代に一度挫折したけど今回帰ってきた出戻りスクリプター
F君：絵も文も書けるナイスガイ、そしてツクラー。スクリプトもちょっと書けるよ！
I君：ADVメインのツクラー。素材は凝る。UI作る能力がハンパない
S君：非ツクラー。難しい事は分からんが何でもやります。メインは動画・マンガの人
J君：デジ塗り専門。背景とかもバッチリ！

やたらとシナリオ書きたい人が多いサークルですが、彼らのやりたい事を考慮しつつ、うまいこと作成していく
#担当
PM：私
スクリプト：私
マップデザイン・クリエイト：I君
ADVパート：みんな
RPGパート：私
デバッガ：みんな

素材とか色々ありますが、ややこしくなるのでここでは省きます。

# なんちゃって例
![qiita_RPGMV.png](https://qiita-image-store.s3.amazonaws.com/0/122800/2dc248bc-00bb-fef7-0766-69e81e114b4a.png)


#使い方と各コメント
基本的には開発環境でガッツリ、ある程度安定版を出せればテスト環境に移行していく。
ドキュメント整理も立派な仕事なので、各担当者に徹底させるようにすると、「締め切りに間に合わない時に代表がキャッチアップできる」というメリットがある。
当日、会場に行ってプレスする羽目にならないように普段から進捗管理を心がけよう。

*「今、困ってる事はない？」*

## root
なんかあった時のために置いてる。
なんでこういう作りにしようと思ったのかは覚えてないけど、root以下をまるっとコピペする方法が当時はなかった気がする。今もない？

## 環境別
当時やってなかったけど、これをやらなかった所為でファイルが管理出来なかった。
完成版とテスト版のマップがどれか分からないので、マップ名に[本番]とか書いてた気がする。
->この対応自体はやるだろうけど、親フォルダがどこにあるのかわからなくなるので、予め対応すると探すのが劇的に楽になる。

## バージョン管理
このバージョン管理の目的は*いつエターナっても適当に切り上げられるようにする*ための措置。
個人開発だとポシャって非公開で良いんだけど集団開発しているとポシャった時のフォローが大変。
完成していなくても公開はしよう、という意見は絶対出てくるのでサークルの空中分解を防ぐのに大きく貢献してくれる。
当然、学生時代にそんな事に気が回らなかったので頑張って手作業で動くところまで復旧して空中分解を阻止していた過去が…。

### テスト環境のバージョン
テスト環境の場合、赤ペン先生のごとくあーでもないこーでもないとバグが見つかる。
基本的にその処理さえ動けばいいや、という作り方をしているダメな設計のプログラマーがプレゼン中にバグを披露するという恥ずかしい事態に陥りやすいための措置。
RPGパートをスクリプト屋以外の人間が分業していたら意味はあると思う。

ある程度形になってきた時に開発者一同が気晴らしに自分のゲームをしたい時にも使える。

### テスト環境：デバッガー／おかしく
*テスト環境：デバッガー／おかしくなったら作りなおす*
作りなおしたりバージョンを差し替える時は場所移動の変更をお忘れなく。
よく忘れるのはデスルーラの移動先設定。デスルーラってマップを作ってそこで飛ばす方法が良いかもしれない。

## シン・タイトル
デフォルトのタイトル画面でも良いんだけど、RPGMVの細かいの見てると色々いじれそうなので別に作ってみた。
凝りだすといつまでたっても終わらないのはcatsystem2とかYU-RISとかあの辺のADVエンジンで経験済み。
デザインやりたいスクリプト屋なら凝る可能性を憂慮してここでは分けてみた。

## マップのエンカウントの有無・シンボルエンカウント
これはマップの広さに関わってくる。
VX時代からでも描画関連で色々な問題があったのに、MVで問題にならないわけがない。
対象のマシンスペックを考慮してしっかりと定義しておくこと。

## ADVパート
ぶっちゃけバージョンを分ける必要はない。が、ノンプログラマー的にはちょっとカッコ良く見えるらしい。
テンションを上げるための努力をするのも代表の仕事だ。

## プレゼン・MTG
これがあるとチャットワークスなりスカイプなりの会議が捗る。
議題にするファイルを予め入れて、それらが動くような形に設定してプロジェクト自体を配布するのが良い。

ついでに、プレゼンで使った時点のプロジェクトはどこかに持っておくようにしよう。
それがそのままバックアップに使える。

## デプロイ
VXまでは容量削減のため、開発プロジェクトを保存しておきデプロイプロジェクトは本番環境以外ごっそり削って、デプロイしたファイルを使って通しプレイをする、というのが当たり前だった。
MVもあんまり変わらない気がしているが…


## 結局のところ
ツクラーあるある対策は一部盛り込んだつもりですが、そのチームのクセを見ぬいて最適化してあげるのが一番良いでしょう。
この形は私のサークルではある程度まとまりが取れていたので、この形にしていました。

## ぶっちゃけ
ソロで開発したほうが楽な事が目立つかも知れない…

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
Unity の SceneView を動画キャプチャして Twitter に投稿してみた。

Unity で作業中のものを動画キャプチャして Twitter に投稿しようとしたところ、思った以上に大変だったので、まとめてみました。

ちなみに、この方法を使えば、Unity に限らず、PC 上の様々なものを動画として保存して Twitter に投稿できるようになります。

# 使用するツール
* ScreenToGif<br>
**「連番キャプチャした png」**を作成するのに使用します。<br>
ダウンロードは[こちら](https://screentogif.codeplex.com/releases/view/625276)から。
* FFmpeg<br>
**「連番キャプチャした png」**から**「mp4」**を作成するのに使用します。<br>
ダウンロードは[こちら](https://ffmpeg.zeranoe.com/builds/)から。

# やり方
まず、**「ScreenToGif」**を使って、**「連番キャプチャした png」**を作成します。
キャプチャの仕方は以下のとおりです。

0. 「ScreenToGif」を起動し、**「レコーダー」**を選択します。<br>
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/231478f2-dce6-9757-613e-74d8cb38caa9.png)
0. 中の透けたウィンドウが表示されますので、キャプチャしたい範囲をその中に入れるように調整して、右下の**「記録」**ボタンを押して、キャプチャを開始します。<br>
キャプチャを終了させたい場合はその右隣りの**「停止」**ボタンを押します。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/eeb7dfd6-3b7f-5d45-9ec5-be149b2c108f.png)


これで連番キャプチャは完了です。
キャプチャした画像は以下のフォルダに保存されています。
**C:\Users\【ユーザー名】\AppData\Local\Temp\ScreenToGif\Recording\【日付】(例、2016-08-18 22-34-21)**

それが終わったら、**「FFmpeg」**を使って**「連番キャプチャした png」**から**「mp4」**に変換します。
FFmpeg はコマンドプロンプトから操作します。

例として、自分の実行したコマンドを載せます。

```
ffmpeg.exe -r 15 -i "C:\Users\【ユーザー名】\AppData\Local\
Temp\ScreenToGif\Recording\2016-08-18 22-34-21\%d.png" -vcodec libx264 -acodec l
ibfaac -b 1024k -profile:v baseline -pix_fmt yuv420p -s 560x450 test.mp4
```

意味をざっくり説明すると……

* フレームレートは**「15 fps」**
* 入力ファイルとして**「C:\Users\【ユーザー名】\AppData\Local\
Temp\ScreenToGif\Recording\2016-08-18 22-34-21\～.png」**を使用。
* ビデオコーデックは**「H.264」**。
* オーディオコーデックは**「AAC」**。
* ビットレートは**「1024 kbps」**。
* H.264 のプロファイルは**「baseline」**。
* 出力解像度は**「560x450」**。
* 出力ファイル名は**「test.mp4」**。

となります。

Twitter に投稿できる動画には制限があるので、その制限に従って動画を作成する必要があります。
詳しくは、[こちらのページ](http://aviutl.info/twitter-movie/#i)を参照してください。


これで出来上がった動画を Twitter の投稿画面にドラッグして、ツイートできれば成功です。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/d08614d9-7cbf-7e45-30c7-88a5ed74d73b.png)

成功したツイートはこちらになります。
https://twitter.com/go_astrayer/status/766295378966695936


# 参考サイト
* [画面の操作Gif動画としてキャプチャする「ScreenToGif」が、バージョンアップで便利になってた - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2016/05/08/073000)
* [Unityの実行画面をキャプチャして動画に変換する方法 - 強火で進め](http://d.hatena.ne.jp/nakamura001/20131114/1384451104)
* [動画処理の定番ツール「FFmpeg」ことはじめ - Qiita](http://qiita.com/kitar/items/59f80bba2ca997e0f5e6)
* [ツイッターに投稿する動画の条件について【動画形式･コーデック】](http://aviutl.info/twitter-movie/)
* [Transcoding fails - baseline profile doesn't support 4:2:2 - ViMP - Video CMS](https://www.vimp.com/en/web/forum/topic/3776.html)
Play Framework導入時のTypesafeActivatorでactivator newしたらエラーが表示される場合の解決法

#環境
+ Windows10
+ jdk1.8.0_101

#現象
Play Framework導入時に
activator newしようとしたら以下のエラーが出た．

```
C:\Play\Project>activator new
ACTIVATOR_HOME=C:\Play\activator-1.3.10-minimal
ファイル BIN_DIRECTORY\..\conf\sbtconfig.txt が見つかりません。
'findstr' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
コマンドの構文が誤っています。
```

findstrというコマンドが見つからないらしい．
PATHにC:/Windows/System32とかを設定してもダメだった．

#解決策
__C:/Windows/System32にあるfindstr.exeを
使っているJDKのbinフォルダにコピーする．__

![image](https://qiita-image-store.s3.amazonaws.com/0/71690/0823aac5-0174-7bdc-2f24-775c138101ea.png)

無事各種関連ファイルがDLされました．

![image](https://qiita-image-store.s3.amazonaws.com/0/71690/d1a25753-9972-6216-8016-8f954f0c2755.png)
[Rails] Hirbでcreated_at, updated_atのカラムを非表示にする

Hirbは`rails c`でActiveRecordオブジェクトを表形式で見やすくしてくれるgemです。
（詳しくはこちら: http://ruby-rails.hatenadiary.com/entry/20141024/1414160189）

```
irb(main):001:0> User.all
  User Load (0.4ms)  SELECT "users".* FROM "users"
+----+-----------+----------+-------------------+-------------------------+-------------------------+
| id | firstname | lastname | email             | created_at              | updated_at              |
+----+-----------+----------+-------------------+-------------------------+-------------------------+
| 1  | 太郎      | 鈴木     | t.suzuki@test.com  | 2014-10-23 17:07:14    | 2014-10-23 17:07:14  |
| 2  | 花子      | 佐藤     | h.satou@test.com   | 2014-10-23 17:07:57    | 2014-10-23 17:07:57  |
+----+-----------+----------+-------------------+-------------------------+-------------------------+
2 rows in set
```

このうち`created_at`と`updated_at`はあまり興味がないので非表示にしたい。

手順：`.pryrc`に以下を追記:

```rb
begin
  require "hirb"
  require "hirb-unicode"
rescue LoadError
  # 何もしない
end

if defined? Hirb
  # セッション中にHirbをdisable/enableできるようにするためのもの
  # Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |*args|
        Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  module Hirb
    IGNORE = [:created_at, :updated_at]
  end 

  # モンキーパッチ
  # created_atとupdated_atを表示しないようにする
  module Hirb::Views::Rails #:nodoc:
    alias :_original_get_active_record_fields :get_active_record_fields
    def get_active_record_fields(obj)
      _original_get_active_record_fields(obj).select {|x| !Hirb::IGNORE.include?(x) }
    end
  end

  Hirb.enable
end
```
古いnode.js(0.10.x)でMoment.jsのプラグインとMoment Timezoneを共存させる方法

古いnode.js(0.10.x)でMoment.jsのプラグインとMoment Timezoneを両方使った時に出るエラーと、修正方法をご紹介。

# 経緯

* 自分が作った[Hubot](https://hubot.github.com/)のScript「[hubot-amesh](https://www.npmjs.com/package/hubot-amesh)」を入れたHubotを[Herokuにデプロイ](https://hubot.github.com/docs/deploying/heroku/)し、コマンド(amesh)をリプライしたら何も返ってこず、ログを見たらエラーが出ていた。
* エラーは[Moment.js](http://momentjs.com/)のプラグイン「[Round](http://momentjs.com/docs/#/plugins/round/)」のfloor関数が無いというエラー(`has no method 'floor'`)だった。
* 自分の環境では動いていた。

# エラー箇所

```coffeescript
moment = require 'moment-timezone'
require 'moment-round'

# ...

getFilename = ->
  moment()
    .tz('Asia/Tokyo')
    .floor(5, 'minutes')
#    ^ <- ここ
    .format('YYYYMMDDHHmm')
```

node.jsのバージョンが6.3.1のローカル環境では動いていた。

# 調査

* Herokuのnode.jsのバージョンを確認
    * `0.10.46`
        * 理由はHubotの雛形のgenerator-hubotの[package.json](https://github.com/github/generator-hubot/blob/master/generators/app/templates/_package.json)でengines.nodeが`0.10.x`と設定されているため
* enginesの部分を下記のように自分の環境と合わせる
    * npmのバージョンも指定できるので指定する

```diff
{
  ...

  "engines": {
-   "node": "0.10.x"
+   "node": "6.3.1"
+   "npm": "3.10.3"
  }
}
```

上記のバージョン指定の修正を加えることでエラーが起きなくなった。
古いnode.jsで起きるエラーでした。
READMEに対応するnode.jsのバージョン書いてめでたしめでたし。。。

、、、って思ったけど、HubotをHerokuで使ってる人の何人がpackage.jsonのenginesでHerokuのnode.jsのバージョンを変えられると知っているだろうかと考えると、script自体を0.10.xに対応させた方が良い気がした。

# :star2:0.10.xでMoment.jsのプラグインとMoment Timezoneを共存させる

というわけで本題。
0.10.xに対応させるためscript修正する。

```coffeescript
momentTimezone = require 'moment-timezone'
moment = require 'moment'
require 'moment-round'

# ...

getFilename = ->
  tokyo = momentTimezone().tz('Asia/Tokyo')
  moment(tokyo).floor(5, 'minutes').format('YYYYMMDDHHmm')
```

moment-timezoneとmomentを別変数に持ち、
moment-timezoneでタイムゾーンを指定した時間オブジェクトを作ってから、
[Moment Clone](http://momentjs.com/docs/#/parsing/moment-clone/)の仕組みを使って時間オブジェクトをコピーして次の処理を行う。

こうすることによって0.10.xでもエラーが出なくなった。

node.jsのバージョン変遷に詳しくないのだが、0.10.xと6.xではnpmのパッケージの管理方法が違うのではないかと思った。
あるいは、requireのアルゴリズムが違う？
ともかく、試行錯誤して答えが見つかった。

# ゆる募

なんで0.10.xと6.xでこういう差が出るのか解説記事があればぜひ教えて下さい。

# おまけ

経緯の中でも紹介していますが、「[hubot-amesh](https://www.npmjs.com/package/hubot-amesh)」というscriptを作りました。
「amesh」と話しかけると現在の雨の状況を画像で教えてくれます。

<img width="361" alt="hubot-amesh sample image" src="https://qiita-image-store.s3.amazonaws.com/0/76069/fbc28abf-80c1-cc85-57c7-8093dbc2af09.png">
※ ImageMagick(Herokuにはデフォルトで入っています。)とimgurのClient IDが必要になります。

ぜひ使ってみてください。
[Swift] NSMutableArray -> Array への変換を読みやすくする


# はじめに

`NSMutableArray`から（Swiftの）`Array`への変換には、以下のように2回のキャストが必要になります。

```swift
let mutableArray: NSMutableArray = Foo.someArray()

if let xs: [String] = mutableArray as NSArray as? [String] {
}

// or

if let xs: [String] = mutableArray as [AnyObject] as? [String] {
}
```

しかし、`as`キーワードが2回も登場して、視覚的にどうもゴチャゴチャして読みづらく感じます。

# ジェネリックなメソッド

すぐに思いつくのは、`NSMutableArray`のextensionを作成して、そこでジェネリック（多相的）なメソッドを宣言することです。

```swift
extension NSMutableArray {
    func asArray<T>() -> [T]? {
        return self as NSArray as? [T] // Warning: Cast from 'NSArray' to unrelated type '[T]' always fails
    }
}
```

コンパイラの”必ず失敗する”というWarningが気になりますが、これで一応動作はするようです。

**追記：Swift 3.0 では Warning が表示されないことを確認しました。
以降でいくつか考察していますが、この書き方がベターかと思います。**

```swift
if let xs: [String] = mutableArray.asArray() {
    print(xs)
}
```

戻り値から型を推論するので、代入先での型宣言は必須です。

# Warningが気になる

（私の手元の環境では）動作していますが、コンパイラのWarningが気になります。

Objective-Cであれば`clang`の`#pragma`でWarningを消すことが出来ましたが、現状のSwift（2.3）の時点ではそのような制御構文は（たぶん）存在しません。

次善策として、キャストする型ごとにメソッドを用意してしまうというのも手でしょうか？

```swift
extension NSMutableArray {
	var as_StringArray: [String]? { return self as NSArray as? [String] }
	var as_IntArray:    [Int]?    { return self as NSArray as? [Int] }
	...
}

if let xs = mutableArray.as_StringArray {
}

if let xs = mutableArray.as_IntArray {
}
```

型ごとにボイラープレートコードを書く必要がありますが可読性は上がります。ジェネリックverと異なり、戻り値で型が決定しているので、（あなたがそれを望むならば）代入先の型宣言は省略できます。

型ごとのコードを書くコストを受け入れる価値があるかどうかは、あなたのプロジェクトやチームに依存するでしょう。

# .copy()

**追記：
コメントにて @tomohisaota さんに`.copy()`する書き方も教えて頂きましたので、追記させていただきました。**

`NSMutableArray`に対して`.copy()`を呼び出して、`NSArray`に変換するように書くことで、`as`によるキャストを1回に抑えられます。

```swift
if let xs: [String] = mutableArray.copy() as? [String] {
}
```

一見すると無駄なコピーが発生しそうにも見えますが、パフォーマンス的には変化無いようです。（詳細はコメント欄を参照）

# まとめ

ここまでに上げた3種類のキャストコードをまとめます。

```swift
let mutableArray: NSMutableArray = Foo.someArray()

// 1. 普通のキャスト（問題提起：可読性が悪い？）
if let xs: [String] = mutableArray as NSArray as? [String] {
}

// 2. ジェネリックなキャスト（メソッド宣言側でコンパイラWarningあり）
// 追記：Swift 3.0 では Warning なし
if let xs: [String] = mutableArray.asArray() {
}

// 3. 型ごとに特化したキャスト
if let xs: [String] = mutableArray.as_StringArray {
}

// 4. .copy()を利用したキャスト
if let xs: [String] = mutableArray.copy() as? [String] {
}
```
GLSLで2色グラデーション

## Code

```glsl
precision mediump float;
uniform vec2  m;       // mouse
uniform float t;       // time
uniform vec2  r;       // resolution
uniform sampler2D smp; // prev scene

void main(void){
	const vec4 color1 = vec4(0.0, 0.18, 0.28, 1.0); // 下
	const vec4 color2 = vec4(0.0, 0.0, 0.0, 1.0); // 上
	float percent = 1.0 - (gl_FragCoord.y / r.y);
	gl_FragColor = color1 * percent + color2 * (1.0 - percent);
}
```

## 結果
![fragment.png](https://qiita-image-store.s3.amazonaws.com/0/103779/61fa04ed-4c6c-d5c3-34ae-779f8e0e014b.png)
Markdown記法でのテーブル表記

```
|ヘッダ１|ヘッダ２|ヘッダ３|
|---|:---:|---:|
|左寄せ|中央揃え|右寄せ|
|LEFTLEFTLEFT|CENTERCENTER|RIGHTRIGHT|
```


|ヘッダ１|ヘッダ２|ヘッダ３|
|---|:---:|---:|
|左寄せ|中央揃え|右寄せ|
|LEFTLEFTLEFT|CENTERCENTER|RIGHTRIGHT|

2行目が必要。
textile記法だったらヘッダ不要なのにな。。
（全般的にMarkdownの方がシンプルで書きやすいけど。）
iOS - UIButtonTap時の処理を他クラスで行う


課題
-
UIButtonTap時の処理を他クラスで行う
→ UIButtonをViewに書いているがTap時の処理はViewControllerに書きたい的な状況

解決方法
-
1. UIButtonの`addTarget`に対象のクラスを指定
1. 対象のクラスに`action`で指定したFunctionを記述

`View.h`　:　Buttonを持っている画面
`ViewController.h`　:　ButtonTap時の処理を記述


### objective-c
```objc:View.h
#import "ViewController.h"

- (void)makeBtn:(ViewController *)ViewController;
```

```objc:View.m
- (void)makeBtn:(ViewController *)ViewController {
	UIButton* button = [[UIButton alloc] init];
	[button addTarget:ViewController action:@selector(tapButton:) forControlEvents:UIControlEventTouchUpInside];
}
```

```objc:ViewController.h
#import "View.h"

- (void)tapButton:(UIButton *)button;
```
```objc:ViewController.m
- (void)testFunc{
	View* view = [[View alloc] init];
	[view makeBtn:self];
}

- (void)tapButton:(UIButton *)button {
	NSLog(@"tapped!!!");
}
```


### Swift
今度書く。
ATOMのファイルオープンがメチャクチャ遅い時に確認するポイント（ウイルスバスターが動いているPCにて）

ATOMで左のツリーからファイルを選択しても開くまでにメッチャ時間が掛かる時があります。
だいぶ限定された環境下での話ですが、同じ環境で困っている人がいましたら参考にして頂けたら幸いです。
なお、ATOMだけではなくてディスクIOの多いアプリなどは、こちらの症状が当てはまるかもしれません。

**一応セキュリティに絡む設定変更なので、吟味の上自己責任にて行って下さい**

# 前提
- ATOMのファイルツリーを押してオープンする時の動作がメチャクチャ重い
- TrendMicroが動作している（自分のはビジネスセキュリティ）

# 手順
TrendMicroのビジネスセキュリティが動作している状態で、タスクマネージャーのプロセスのタブをCPU使用順で開きます。
そこでATOMでファイルを選択したりする動作をしている時に、
Manages the Trend Micro unautorized change prevention feature
というプロセスが頑張ってくれていると思います。

これは、トレンドマイクロのデバイス制御と挙動監視を行っているプロセスで、
これと対象のアプリが競合しているようです。

この挙動監視下からATOMを取り除きます。

## アナライザーを起動
```C:\Program Files (x86)\Trend Micro\Security Agent\TMPerfTool.exe``` を「管理者として実行」します。

警告をOKで進みます。
<img width="407" alt="b548aca8-a5cc-d77c-e6be-e399174adf89.png" src="https://qiita-image-store.s3.amazonaws.com/0/83221/fcd1bbdf-27d9-0f21-49cd-38382484c64e.png">


以下の画面が出たら準備完了
<img width="458" alt="74f6fb0b-fbea-2006-9271-5c44b1a592db.png" src="https://qiita-image-store.s3.amazonaws.com/0/83221/7a34a9ef-8b5f-ce72-5ede-b6192f133b13.png">


## アナライズする
パフォーマンスが低下する現象が発生している時に、[Analyze] をクリックします。
![83d7f2ab-c228-7422-9f25-a3148a656c16.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83221/f9b182b3-97bb-7f67-d96b-df62ba80052d.jpeg)

I/Oの多いプロセスが動作している場合、いずれかのステータスバーが赤くなり、そのプロセスがハイライト表示されます。
ハイライトがなくても、File等でソートして察して下さい。
![9e264eda-c145-c149-d3af-36b968f90490.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83221/b3c8347b-d2ca-c590-9c0f-82cf01918e2a.jpeg)


該当プロセスがパフォーマンス低下の原因であるかどうかを確認するため、プロセスを選択して Running Event Summaryの[+] をクリックし、該当プロセスを不正変更防止サービスの監視対象から一時的に除外します。
![32320abd-37a2-22a5-7b95-4ffe43302db6.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83221/b192c0b2-7874-d870-70ad-d2bf6adeb3bf.jpeg)


ATOMのパフォーマンスが向上するかどうか確認します。
これで軽々と動いたのであれば、ウイルスバスターとの競合が原因です。
[STOP]を押して、プロセス一覧を右クリックして対象のアプリのパスをコピーします。

## 挙動監視対象から外す
タスクバーからビジネスセキュリティを右クリックし、[ビジネスセキュリティを開く]をクリックし、以下の画面が表示されます。

歯車の[設定]をクリックして設定画面を表示させ、[保護]タブの[挙動監視]を開きます。

除外リストに先ほどコピーしたパスをペーストし、追加を押します。
一覧に表示され、処理を[許可]に設定して[適用][OK]をしたら完了です。

# 注意点
- 挙動監視はアプリが不正な動作をしないように監視する為の機能なので、無闇矢鱈に除外にするのはやめましょう。
- 挙動監視の設定はサーバー側での一括監視の場合もあります。（たぶんそちらの方が多い気がします）その場合は管理者の方に頼みましょう。
- ATOMのバージョンが新しくなると、exeが変わるので再度除外設定が必要になります。
シェルスクリプト（bash）のif文やwhile文で使う演算子について

どうも、江川くんです。
今回はシェルスクリプト（bash）のif文やwhile文で使用できる演算子についてとぼとぼ書いていきたいと思います。（実はちょっと眠いので、じゃーって書いていきます。）


## 更新情報
- 2016/8/19 新規作成
- 2916/8/19 表現のわかりにくいところを修正

## 比較演算子とその仲間

### 文字列比較演算子

| 演算子 | 意味 |
|:-----------|:------------|
| 文字列 | 文字列の長さが0より大きければ真 |
| -n 文字列 | 文字列の長さが0より大きければ真 |
| -z 文字列 | 文字列の長さが0であれば真 |
| 文字列A = 文字列B | 文字列Aと文字列Bが等しければ真 |
| 文字列A != 文字列B | 文字列Aと文字列Bが等しくなければ真 |

#### 使用例
```egawa.sh
#!/bin/bash

if [ "ABC" = "ABC" ]; then
  echo "equal"
else
  echo "not equal"
fi
```
この場合 equal が表示されます。

### 数値比較演算子

| 演算子 | 意味 |
|:-----------|:------------|
| 数値1 -eq 数値2 | 数値1と数値2が等しければ真 |
| 数値1 -ne 数値2 | 数値1と数値2が等しくなければ真 |
| 数値1 -gt 数値2 | 数値1が数値2より大きければ真 |
| 数値1 -lt 数値2 | 数値1が数値2より小さければ真 |
| 数値1 -ge 数値2 | 数値1が数値2以上であれば真 |
| 数値1 -le 数値2 | 数値1が数値2以下であれば真 |

#### 使用例
```egawa.sh
#!/bin/bash

if [ 100 -eq 99 ]; then
  echo "equal"
else
  echo "not equal"
fi
```
この場合 not equal が表示されます。

### ファイルチェック演算子

| 演算子 | 意味 |
|:-----------|:------------|
| -d ファイル名 | ファイル名がディレクトリであれば真 |
| -f ファイル名 | ファイルであれば真 |
| -e ファイル名 | ファイルがあれば真 |
| -L ファイル名 | シンボリックリンクであれば真 |
| -r ファイル名 | 読み取り可能であれば真 |
| -w ファイル名 | 書き込み可能であれば真 |
| -x ファイル名 | 実行可能であれば真 |
| -s ファイル名 | ファイルが存在し、空でなければ真 |
| -S ファイル名 | ファイルがソケットならば真 |
| ファイルA -nt ファイルB | ファイルAがファイルBより新しければ真 |
| ファイルA -ot ファイルB | ファイルAがファイルBより古ければ真 |

#### 使用例
例えば、
`/var/log/egawa/egawa.log`
ファイルがなければ処理（file not foundを表示）をするが、ファイルがあれば何もしない。

```egawa.sh
#!/bin/bash

if [ ! -f /var/log/egawa/egawa.log ]; then
  echo "file not found"
else
  :
fi
```
上記のように、 `-f`演算子の前に`!`をつけることによって否定することも可能ですので、よく覚えておきましょう。
（ファイルがあれば真→ファイルがなければ真）
またelseの後にある`:（コロン）`のように記述すると、何も処理を行いません。
もし何も処理をしないからといって何も記述しないと、実行時にエラーが出力されます。

### 結合
| 演算子 | 意味 |
|:-----------|:------------|
| 条件A -a 条件B | 条件Aかつ条件Bが真であれば、真 |
| 条件A -o 条件B | 条件Aまたは条件B、どちらかが真であれば、真 |

#### 使用例
例えば、`/var/log/egawa/egawa.log`が存在しかつ読み込み可能あれば処理（OKを表示）をするが、存在しないか読み込み不可能であったら処理(ERRORを表示)する。

```egawa.sh
#!/bin/bash

elog=/var/log/egawa/egawa.log

if [ -f ${elog} -a -r ${elog} ]; then
  echo "OK"
else
  echo "ERROR"
fi
```

### 否定
ちょっと演算子か明確にはわかりませんが。。。w

| 演算子 | 意味 |
|:-----------|:------------|
| ! (演算子) | 演算子の否定 |

ファイルチェック演算子の使用例でも使いましたが、`!`を使うことでその演算子を否定することができます。

### ちなみに
シェルスクリプトの最初に記述するこの一行`#!/bin/bash`は、`シバン`や`シェバング（Shebang）`などと呼びます。
「この行？フッ。。。この行はシェバングっていうんだZE☆」
とかってカッコつけてもいいかも。。。。
Go言語 constに関する一つの提案

Go言語 constに関する一つの提案
----------------------------------

既に実践されているのかもしれないけど、それでもあまり見かけないのでちょっと言ってみる。

## constに日本語を使う


Goでは識別子は駱駝形式が推奨されてるけど、定数も駱駝にすると(私の感覚だと)パッと見、変数と区別がつかなくて非常に嫌です。
だからと言って C言語でやってたように全大文字にするのは、ちょっと後ろ指さされそうだが、どうせやるなら、いっそのこと日本語にしてしまえば、意味も明瞭、形からも何者であるかわかっていいと思う。コメントも不要になるし。


```go:
    const (
        朝顔     = iota
        ヒマワリ
        コスモス
        桔梗
    )
    if flowerId == 朝顔 { 
        ...
    }
```
勿論、たとえば「必須パターン」ではなく「必須Ptn」のように外国語やその略語と組み合わせるのも、読みやすく・短くなっていい。

・・・と考えていたら、弱点ありました(下記コメント)。
エクスポートするためには、先頭に全角あるいは半角の英大文字をつける必要があるのでご注意！

なんでもかんでも日本語にするのは、意味ばかりに意識がいったり記述が大変だったりで、記号的な側面がもつ利点が薄れてマイナスと思うけど、Const程度を日本語にするのは、プログラミングするにはちょうどいいのじゃなかろうか。

余談だが、プログラミングではなく他人の書いたプログラムをメンテする時には、例えば関数名を "f日本語で意味()"みたいに変えてしまうのはありだと思う・・・私は昔、実際にそうやって、他人の書いた訳の分からん、縦にも横にもやたらと長いソースを変換して理解の一助としていたことがある。
nginx でリバースプロキシする時、レスポンスがエラーでもヘッダー追加をさせる方法

例えばRESTサーバー等を立てる時、その前にリバースプロキシ入れますよね？

で、RESTサーバーにいちいちヘッダー付けされるの面倒なので、
リバースプロキシで `Access-Control-Allow-Origin` とかのヘッダーをつけさせるとしましょう。


例えば、こんな感じになるでしょう。

```nginx.conf
server {
        listen 80;
        listen [::]:80;
        server_name api.example.com;

        location / {

                if ($request_method = 'OPTIONS') {
                        add_header 'Access-Control-Allow-Credentials' 'true';
                        add_header 'Access-Control-Allow-Headers'     'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since';
                        add_header 'Access-Control-Allow-Methods'     'GET, DELETE, OPTIONS, POST, PUT';
                        add_header 'Access-Control-Allow-Origin'      'http://example.com';
                        add_header 'Access-Control-Max-Age'           2592000;
                        add_header 'Content-Length'                   0;
                        add_header 'Content-Type'                     'text/plain charset=UTF-8';
                        return 204;
                }

                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Origin'      'http://example.com';

                proxy_pass http://localhost:8080/;
        }

```

基本はこれで良いんですが、これだけだとちょっと困ったことがあって、
後ろのサーバーからのレスポンスが404とかのエラーだと、設定したヘッダーをつけて返してくれないんですよね。


### ちなみに、 Fetch API だとこうなる
```
Fetch API cannot load http://api.example.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access. The response had HTTP status code 403. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
```

例えば Fetch API で持ってこようとしてもこうなる。　アイエエエ!? エラー!? エラーナンデ!?

よって、Fetch API の方に no-cors モードを設定して、空のレスポンスを返却させることでエラーを回避する。
CORS、corosべし。慈悲は無い。(これが言いたくて記事書いた。)

…とはならない！　実際、エラーコードは必要。

## レスポンスコードに関わらず、常にヘッダーを出力させる方法

答えは単純でした。

```nginx.conf
add_header 'Access-Control-Allow-Origin'      'http://example.com' always;
```

のように、後ろに `always` をつける事で、レスポンスコードにかかわらずヘッダーをつけてくれるみたいです。

実は[公式にきちんと書いてあるのですが](http://nginx.org/en/docs/http/ngx_http_headers_module.html)、何も知らないと
「なんでヘッダーついてないの？」ってなって全然違うところ調べ始めたりするから要注意。
C#で呼び出しの時に、Method(引数1)(引数2)(引数3)の形にする方法

　この記事ではC#においてMethod()()()のように()をつなげて引数を渡す方法を解説します。
　私はvisual studio 2015で試しました。

##呼び出しの具体例

```csharp:Main.cs
        static void Main(string[] args)
        {
            string result = MyStringJoin("aaa")("bbb")("ccc");
            Console.WriteLine(result);
            // 出力結果
            //aaabbbccc
        }
```
　タイトルだけでは何の話をしているかさっぱりわからないと思うのですが、C#ではこのような変則的な書き方でもコンパイルエラーを出さずに実行できます。JAVAやC++ではあまり見ない形だと思います。
　今回はこのメソッドの作成方法を解説したいと思います。

##メソッドの作成方法
　順を追って説明していきます。
###呼び出し元で()が1つのとき
```csharp:Main.cs
        static void Main(string[] args)
        {
            string result = MyStringJoin1("aaa");
            Console.WriteLine(result);
            // 出力結果
            //aaa
        }

        /// <summary>
        /// 文字列1を受け取って文字列1を返す
        /// </summary>
        static string MyStringJoin1(string str1)
        {
            return str1;
        }
```
　見たとおり、文字列を一つ受け取ってそのまま返すメソッドです。これを増築していきたいと思います。

###呼び出し元で()が2つのとき
```csharp:Main.cs
        static void Main(string[] args)
        {
            string result = MyStringJoin2("aaa")("bbb");
            Console.WriteLine(result);
            // 出力結果
            //aaabbb
        }

        /// <summary>
        /// 文字列1を受け取って
        /// 文字列2を受け取って、文字列1と文字列2を結合するメソッドを返す
        /// </summary>
        static Func<string, string> MyStringJoin2(string str1)
        {
            return str2 => str1 + str2;
        }
```
　ここで重要なのはMyStringJoin2の戻り値の型である <b>Func&lt;string, string&gt;</b> です。<b>Func&lt;string, string&gt;</b>は、「string型を受け取ってstring型を返すメソッド」という意味です。詳しくは「定義済みデリゲート Func」でググッてください。これを戻り値とすることで、呼び出し元で入れ子のようにメソッドから別のメソッドを呼びだされ、上記のような呼び出し方ができるようになります。
　return str2 => str1 + str2;の行ですが、ここは戻り値の型に合うように好きなメソッド定義を書きましょう。私はラムダ式を使用してメソッドを定義しました。他にはメソッド名を書いたり、匿名メソッドを書いたりできます。

###呼び出し元で()が3つのとき
```csharp:Main.cs
        static void Main(string[] args)
        {
            string result = MyStringJoin3("aaa")("bbb")("ccc");
            Console.WriteLine(result);
            // 出力結果
            //aaabbbccc
        }

        /// <summary>
        /// 文字列1を受け取って
        /// 文字列2を受け取って
        /// 文字列3を受け取って、文字列1と文字列2と文字列3を結合するメソッドを返す
        /// </summary>
        static Func<string, Func<string, string>> MyStringJoin3(string str1)
        {
            return str2 => str3 => str1 + str2 + str3;
        }
```
　()が3つになるようにMyStringJoin2を増築するとこうなります。戻り値の<b>Func&lt;string, Func&lt;string, string&gt;&gt;</b>ですが、日本語にすると「string型を受け取って、string型を受け取ってstring型を返すメソッドを返す、メソッドを返す」と読むと思います。

##まとめ
　Method()()()のような変則的な使い方ができるメソッドが書けるようになりましたが、使い所はあまりないと思います。
　IT企業の入社試験で受験者に対して「これどうやって書くと思う？」みたいな嫌がらせに使えるのではないでしょうか。
uFrame Documentを読む(Core-Concepts)

https://github.com/InvertGames/uFrame.Documentation/blob/master/uFrameMVVM/pages/core-concepts.md

##Core Concepts
Unityを使ってまさにUnityらしい開発をすると、小さなプロジェクトであってもクリーンなProjectを保つのは難しいです。アセットストアを使えば素晴らしいツールやアセットを自由に取り込むことができますが、それらはますます混乱を引き起こし、ますますProjectが汚れてしまいます。
uFrameはロジックを様々なカテゴリによって適切なサイズに分割することで、Projectをクリーンに保つことができます。例えばゲームにPlayer Elementがあったとしましょう。uFrameではPlayerをこんな感じで管理します。
![687474703a2f2f692e696d6775722e636f6d2f53544b307650642e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/67575/2b7f491e-7b75-0aed-ae27-3de8459307d6.png)

- [ViewModel] ゲーム世界のオブジェクトそのものです。データ構造を管理し、HPや所持金,経験値等になります。
- [Controller] 命令に従って動くゲーム/ビジネスロジックを管理します。例えばHP回復関数,所持金消費関数,経験値獲得関数等を持っています。
- [View] ゲームに存在する音やビジュアルを表現したオブジェクトそのものです。ViewModelとバインディングします。

**ViewModel**や**Controller**は"シーンの裏側"で生きています。これらは純粋なロジックだけで構成されており、シーンで何が起こっているのか知る必要はありません。**View**はゲームオブジェクトにアタッチされており、基本的にゲームデータとゲームワールドをつなぎ合わせます。**ViewModel**と**Controller**が純粋なロジックを持っていて、**View**がそれらとUnityGameをつなげる役割を持っていることはuFrameの重要なコンセプトなので覚えておきましょう。

![687474703a2f2f692e696d6775722e636f6d2f6f56756e4a65662e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/67575/c3fba792-01a8-c7f4-f75b-d344f88af0df.png)

ViewModel,Controller,Viewの関係図
![687474703a2f2f692e696d6775722e636f6d2f304d536867684d2e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/67575/3e3f93a7-67a3-2583-4967-abfd0fabb5c0.png)

- Controllerは、ViewModelと自分以外のControllerを知っているけどViewは知らない。
- Viewは、絶対にControllerのことを知らない。
- Viewは、たまに自分以外のViewのことを知っている時もあるけど、それはほとんどの場合、インタラクティブに動作するときだけ(当たり判定に関連することだったりクリックされたことだったりね)

##一般的なフロー
1. GameView: UI Buttonをクリックしたら、ExecutePlay関数が呼ばれます。
2. GameViewModel: ExecutePlay関数の影響を受けて、GameControllerにどんなロジックを行うのか聞きに行きます。
3. GameController: Play(gameViewModel)Commandを使って、次のようなことをします。


> 3-1. 新しいシーンを読み込む
3-2. 他のコマンドを実行する
3-3. AIPlayerViewModelsを作成し、gameViewModel.AIPlayersに加える
3-4. gameViewModel.StateプロパティにGameState.Playingをセットします。それが各種View要素の引き金となり、GameViewにバインディングされているCreateAIPlayersView関数が実行され、そしてそれがgameViewModel.StateプロパティにバインディングするInstantiateView(aiPlayer)ロジックを実行します（ UI transitions, HUD pop-upsなどです）。

4.　GameController: 実行が終わった時点でコマンドは無効になりそれ以上は何もしません。Game Logicは実行され、viewmodel プロパティは変更されるかもしれませんし、viewmodelがInstantiateされるかもしれません。すべてのトリガーはViewのバインディング次第です。
Ubuntu Server 16.0.4 LTSを用いたサーバ構築メモ

サーバ本体（マシン）をリプレイスするにあたり、新規で環境を構築することになりました。その際に参考にしたWEBへのリンク、今後の自分に向けてのメモが中心です。


##外付けHDDの自動マウント
- http://jlinuxer.dip.jp/?p=487

##VPN
- SoftEther VPN https://ja.softether.org/
SwiftでSegue...SIGABRT出た時に注意するポイント

Swift勉強中です。
なかなか先に進まずイライラしまくってます。
ViewControllerに配置したボタンから、別のViewControllerへ遷移させようと

```
performSegueWithIdentifier("toTestViewController",sender: nil)
```

として、

```
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
  if (segue.identifier == "toTestViewController") {
    let testViewController : TestViewController = (segue.destinationViewController as? TestViewController)!
  }
}
```

としたのですが、「testViewController」を取得しようとするとSIGABRTがでてクラッシュしてしまいます。

<img width="583" alt="source.png" src="https://qiita-image-store.s3.amazonaws.com/0/4664/a5772559-67fe-a9d0-21cb-fd8aa4539e45.png">

なんでだー、と。ギブアップ気味です。

サンプルコード
https://github.com/nmisawa/Segue

追記：
Stroyboardみてたら、Moduleっていう項目があり、そこに設定したら無事動くようになりました。

Custom Classのところ、

<img width="674" alt="empty.png" src="https://qiita-image-store.s3.amazonaws.com/0/4664/b955ba14-2007-9d87-0e3d-8edd4931abaa.png">

空っぽでしたが、

<img width="673" alt="module.png" src="https://qiita-image-store.s3.amazonaws.com/0/4664/11822f86-fb73-282d-ba3a-9ac17aa84273.png">

こうしたら動きました。
秘密鍵ファイル、公開鍵を使用したリモートアクセス、リモートコピーの整理、そして、herokuへのアクセス、github、gitlab、bitbucuketからのサーバへのデプロイ


## 背景

なんとなく、id_rsaとか生成して、サーバに接続したり、xxx.pemを使ってAWS EC2に接続したりしているけど、理解があいまいだったので、整理。

要は秘密鍵ファイルと公開鍵ファイルを使って、通信を暗号化することにより、リモートアクセス、リモートコピーをセキュアに可能にする。
ということくらいは前々から分かっているのだが、通信の暗号化だけでなく、認証が不要になるのが、ちょっと理解不足。

ここに具体的に書かれていた。
http://ossfan.net/setup/openssh-02.html
なるほど、sshサーバ側で秘密鍵だけで認証可にする設定があると。


## 秘密鍵ファイル
### ローカル、サーバ接続の場合
ローカルPCで作成するid_rsa、id_dsaとか。
id_rsa、id_dsaは暗号化方式の違い。RSAかDSAか。
背景に記載したように、認証無しでサーバに接続できることも可能なので、変なサーバに置いたり、コピーしたりしてはダメ。

### AWS接続の場合
AWS CONSOLEでダウンロードするxxx.pem。
catで中身を見たら、id_rsaもxxx.pemも中身は-----BEGIN RSA PRIVATE KEY-----から始まる文字列なので、一緒。
pemを使ってアクセスする際は、pemのパーミッションを適切に設定しないと、下記のようなエラーが出て、接続できない。chmod 400 xxx.pemのように変更する必要がある。

```
Permissions 0644 for 'xxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "xxx.pem": bad permissions
Permission denied (publickey).
```

## 公開鍵ファイル
### ローカル、サーバ接続の場合
ローカルで秘密鍵の作成と同時に作成される。サーバに置く。
id_rsa.pubみたいな公開鍵ファイルをそのまま置くのではなく、~/.ssh/authorized_keysに追記する形でサーバに置く。

### AWS接続の場合
初期状態で~/.ssh/authorized_keysに公開鍵の情報が記載されている。
そのため、xxx.pemがあれば、サーバにID、PASS認証無しで接続可能。

## 接続
よく

```
ssh hogeserver
```
のようにサーバへ接続するのだけど、暗黙的に~/.ssh/id_rsaを使用している。
そのため、AWS EC2に接続する場合は、明示的にpemファイルを指定しないといけない。
それが、

```
ssh -i hoge.pem ec2-user@ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com
```
の-i指定。

ただ、毎回、そのオプションを入力するのは面倒なので、~/.ssh/configに下記のように記載すると、

```
Host ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com
       	HostName       	ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com
       	Port   	22
       	User   	ec2-user
       	IdentityFile   	~/.ssh/hoge.pem
```
       	
```
ssh ec2-user@ec2-XX-XXX-XX-XX.ap-northeast-1.compute.amazonaws.com
```
でサーバに接続できるようになる。

scpは秘密鍵、公開鍵の扱い的にはsshと変わらないということで・・・


## herokuへのアクセス

herokuにheroku CLIで接続する際、秘密鍵、公開鍵を使用して、接続する。

```
ssh-keygen -t rsa
heroku keys:add
```
のように、ローカルで秘密鍵、公開鍵を生成して、コマンドで追加できる。
管理画面からid_rsa.pubの内容を登録してもよい。
![Screen Shot 2016-08-20 at 00.55.27.png](https://qiita-image-store.s3.amazonaws.com/0/59686/0e8bc589-d82d-558b-ba67-0a3891f86a49.png "Screen Shot 2016-08-20 at 00.55.27.png")

これにより、heroku CLIでheroku loginから通信を暗号化して、herokuにアクセスできることになる。
なるほどなーと。


## github、gitlab、bitbucuketからのサーバへのデプロイ
ソースコードがgithub、gitlab、bitbucuketにあって、herokuではない一般的なサーバにそのソースコードをデプロイしたい。かつ、自分だけではなく、数人がデプロイすることがある。
あと、gitのレポジトリはhttpsではなく、sshでアクセスする。
そんな場合に、サーバにデプロイ担当者がユーザを作って、/home/user/.ssh/に秘密鍵を置くのも面倒だし、セキュリティ的に危険。

その解決方法として、github、gitlab、bitbucketにレポジトリごとにデプロイ鍵(Deploy Keys)という設定がある。

github
![Screen Shot 2016-08-20 at 00.49.34.png](https://qiita-image-store.s3.amazonaws.com/0/59686/8c27b78f-37b0-9c0c-9ce4-6a735b5e5d3b.png "Screen Shot 2016-08-20 at 00.49.34.png")

bitbucket
![Screen Shot 2016-08-20 at 00.48.30.png](https://qiita-image-store.s3.amazonaws.com/0/59686/f2b611cf-854e-4759-47ba-e18832bb6383.png "Screen Shot 2016-08-20 at 00.48.30.png")

このデプロイ鍵にサーバでデプロイ用ユーザで認証なしで作成した公開鍵を登録すると、
デプロイ用ユーザにsuして、git pullするだけで、複数人がデプロイが可能になる。

レポジトリのメンバーにデプロイ用ユーザを追加して、デプロイ用ユーザの公開鍵に登録する方法もあるが、
上記の方が管理がシンプルになり、わかりやすい。
jQuery(Ajax)でTwitterAPIのベアラートークン認証が出来ない理由

#やりたかったけど出来なかったこととか
- 出来るだけ楽に(社内環境的にjQueryで)TwitterAPI使ってデータを取得したかった
- OAuth認証とかしてアクセストークン取ってくるとかただのディレクターもどきにはハードルが高かったほんとはOAuth用のライブラリ、oauth.jsを使うつもりだったけど消えてた…？）

#やってみたこと
このページを参考にベアラートークンを取得
https://syncer.jp/twitter-api-matome

取得したベアラートークンをヘッダーにつけてあげて、後は投げるだけ。
ってことで下記参考にしつつ書いてみました。
http://qiita.com/kazusa-qooq/items/8e443d08df2d9a678b1b

`
$.ajax({
	type: 'GET',
	dataType: 'jsonp',
	jsonp: false,
	cache: true,
	url: query,
	headers: { Authorization: 'Bearer '+ bearerToken },
})
`
しかし動かない…ということで何時間が調べてようやく原因が発覚

##動かなかった原因
- クロスドメイン制限を避けるためにdataTypeにjsonpを指定。
- しかしjsonpを指定した際にはheadersが効かないらしい。詳しくは下記参照
http://stackoverflow.com/questions/17004070/making-jquery-ajax-call-to-twitter-api-1-1-search
http://stackoverflow.com/questions/3073287/set-headers-with-jquery-ajax-and-jsonp

ってことでこれはボツになりました。
アクセストークン取得するとこだけ、サーバー側に任せるべきなのか、うーむ…
Electronでページ内検索を行う

Electronのページ内検索は[contents.findInpage](http://electron.atom.io/docs/api/web-contents/#contentsfindinpagetext-options)を使う必要がありますが、毎度同じような処理を書くのもなんだかなという感じがしたのでモジュールにして公開しました。

[electron-search-text](https://www.npmjs.com/package/electron-search-text)


![2016-08-18 22_38_58.gif](https://qiita-image-store.s3.amazonaws.com/0/17969/e4bf1027-a051-4644-4292-0f96db37f1d8.gif)

使い方は👇の通り。

```browser.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <style>
    body {
      height: 100vh;
      margin: 0;
    }
    webview {
      height: 100%;
    }
    .search-box {
      display: none;
    }
    .state-visible {
      display: block;
    }
  </style>
  <link rel="stylesheet" href="./search.css">
</head>
<body>
<div class="search-box">
  <input type="text" class="search-input">
  <span class="search-count"></span>
</div>
<webview src="https://github.com/trending"></webview>
<script>
  const {ipcRenderer} = require('electron');

  const ElectronSearchText = require('electron-search-text');
  const searcher = new ElectronSearchText({
    target: 'webview',
    input: '.search-input',
    count: '.search-count',
    box: '.search-box',
    visibleClass: '.state-visible'
  });

  ipcRenderer.on('toggleSearch', function() {
    searcher.emit('toggle');
  });
</script>
</body>
</html>
```

`require('electron-search-text')`して`new`するときに検索対象にする`webview`と、検索窓用のUIのセレクタを渡します。

`new`したインスタンスで`.emit('toggle')`すると`visibleClass`に指定したクラスを`box`に対してトグルします。

あとは`main.js`に`Cmd+F`でトグルできるようにショートカットキーを設定する。

```main.js
const {app, BrowserWindow, Menu} = require('electron');

app.on('ready', () => {
  const browserWindow = new BrowserWindow();
browserWindow.loadURL(`file://${__dirname}/browser.html`);

const menuTemplate = [
  {
    submenu: [
      {
        label: 'Quit',
        accelerator: 'Cmd+Q',
        click() {
          app.quit();
        }
      }
    ]
  }, {
    label: 'Edit',
    submenu: [
      {
        label: 'Search in File',
        accelerator: 'CmdOrCtrl+F',
        click() {
          browserWindow.webContents.send('toggleSearch')
        }
      }
    ]
  }
];

const menu = Menu.buildFromTemplate(menuTemplate);
Menu.setApplicationMenu(menu);
});
```

おしまい。
Key list と value list を map に変換する

# single value

```iex
iex(1)> keys = ["id", "name", "email"] |> Enum.map(fn x -> String.to_atom(x) end)
[:id, :name, :email]
iex(2)> value =  ["1", "username1", "test@example.com"]
["1", "username1", "test@example.com"]
iex(3)> Enum.zip(keys, value) |> Enum.into(%{})
%{email: "test@example.com", id: "1", name: "username1"}
```

# multiple value

```iex
iex(1)> keys = ["id", "name", "email"] |> Enum.map(fn x -> String.to_atom(x) end)
[:id, :name, :email]
iex(2)> values = [ ["1", "username1", "test@example.com"], ["2", "username2", "test@example"] ]
[["1", "username1", "test@example.com"], ["2", "username2", "test@example"]]
iex(3)> Enum.map(values, fn value -> Enum.zip(keys, value) |> Enum.into(%{}) end)
[%{email: "test@example.com", id: "1", name: "username1"},
 %{email: "test@example", id: "2", name: "username2"}]
```

keysとvalueの長さが同じであること。
環境変数を使用して Xcode のバージョンを切り替える

今まで `xcode-select` を使って、

```
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
```

のように Xcode のバージョンを切り替えていたのですが、[xcode-select](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/xcode-select.1.html) の man ページを見ていたら環境変数 `DEVELOPER_DIR` で一時的に切り替えられることが書いてありました。

```
$ xcodebuild -version
Xcode 7.3.1
Build version 7D1014

$ DEVELOPER_DIR=/Applications/Xcode-beta.app/Contents/Developer xcodebuild -version
Xcode 8.0
Build version 8S201h

$ xcodebuild -version
Xcode 7.3.1
Build version 7D1014
```

`export` を使って環境変数を設定すれば、シェルを閉じるまで切り替えることができます。

```
$ export DEVELOPER_DIR=/Applications/Xcode-beta.app/Contents/Developer
$ xcodebuild -version
Xcode 8.0
Build version 8S201h
$ clang -v
Apple LLVM version 8.0.0 (clang-800.0.38)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```

`DEVELOPER_DIR` を使えば `sudo xcode-select -s xxxx` とは違ってパスワードの入力が催促されることがないので、Jenkins などの CI に組み込みやすいかとおもいます。
Go で画像を JPEG に変換

```go:ConvertToJpeg
package main

import (
	"flag"
	"image"
	_ "image/gif"
	"image/jpeg"
	_ "image/png"
	"log"
	"os"
)

func main() {
	var (
		src     = flag.String("s", "", "JPEG に変換したい画像パス")
		dest    = flag.String("d", "", "JEPG に変換した画像パス")
		quality = flag.Int("q", 100, "JPEG 変換時の Quality")
	)

	flag.Parse()

	convertToJpeg(*src, *dest, *quality)
}

func convertToJpeg(src string, dest string, quality int) {
	file, err := os.Open(src)
	logError(err)
	defer file.Close()

	img, _, err := image.Decode(file)
	logError(err)

	out, err := os.Create(dest)
	logError(err)
	defer out.Close()

	opts := &jpeg.Options{Quality: quality}

	jpeg.Encode(out, img, opts)
}

func logError(err error) {
	if err != nil {
		log.Fatal(err)
		os.Exit(1)
	}
}

```
Subversionで間違って消したフォルダを復活する


ググって出てくるのは、古い書式ばかりで軽くハマってしまったので備忘のため記録します。Subversionの1.7.22で実際に実行しました。svn copyコマンドを使いますが、バージョンによって書式がちと異なります。`svn help copy`を実行すると以下のような書式が提示されます。

```
usage: copy SRC[@REV]... DST
```

例えば、リビジョン123までは存在していた(=124以降で削除した)barという名前のディレクトリを復活させたい場合、以下のようになります。

```
svn copy svn+ssh://foo.com/path/to/repo/bar/@123 ./
svn commit
```
直線位置調整 > スイッチ用IC > NチャネルMOSFET > ピン配置

S-12駆動用NチャネルMOSFETが届いた。

1つ目はBST76A。
http://aitendo3.sakura.ne.jp/aitendo_data/product_img/transisitor/BST76A/BST76A_philips.pdf

TO-92型のものだが、データシートのピン配置がtop viewかbottom viewか不明。

http://bdml.stanford.edu/twiki/bin/view/Rise/PinOuts.html
のピン配置と同じだろうか。

もう１つは2SK2541。
http://www.e-ele.net/DataSheet/2SK2541.pdf
こちらはピン配置がデータシートから分かりそう。
複数Excelファイルの各シートのフォーカスをA1に、表示倍率を100%に統一するPowerShell

# 実現したいこと
Excelファイルで資料を作成する際、
最終的に各シートのフォーカスをA1に、表示倍率を100%に統一したい、とします。
対象が1ファイルだけで、数シートなら手動でやっても構わないのですが、
ファイル数やシート数が多い場合は大変なので、PowerShellでスクリプト化しておきます。

# コード
```ps1:フォーカスと表示倍率を統一する.ps1

# 処理対象のファイル名を取得（複数可）　
# ここではスクリプトファイルと同じフォルダにあるファイルを対象とします。
$targetFiles = Get-ChildItem -Path *.xlsx

# Excelオブジェクト作成
$excel = New-Object -ComObject Excel.Application

# 非表示のまま処理する
$excel.Visible = $false

# xlsx ファイルのループ
foreach ($file in $targetFiles) {

    # エクセルを開く
    $book = $excel.Workbooks.Open($file.FullName)

    # シートのループ
    foreach ($WorkSheet in $excel.Worksheets) {
        # 非表示シートは対象外
        if ($WorkSheet.Visible -ne $false) {
            # 処理対象のシートを選択状態にする
            $WorkSheet.Activate()

            # セル「A1」を選択状態にする
            $WorkSheet.Cells.Item(1,1).Select() | Out-Null

            # 表示倍率を100%にする
            $excel.ActiveWindow.Zoom = 100
        }

    }

    # 一番左のシートを選択状態にする（おまけ）
    $excel.Worksheets.Item(1).Activate()

    # 上書き保存する
    $book.save()
    $book.close()

}

# 閉じる
$excel.Quit()

# プロセスを解放する
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
Remove-Variable excel

```

# 実行例

## 実行前確認
実行前は、以下のようにフォーカスはA1以外、表示倍率は100%以外になっています。
[Sheet1]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/329b802d-afc9-4e2c-b6cc-3c58d4c59844.png)

[Sheet2]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/f9ed4d96-d35d-8a03-825a-126bbf09d973.png)

## 処理実行
```
D:\>powershell -ExecutionPolicy Unrestricted .\フォーカスと表示倍率を統一する.ps1
```

## 実行後確認
実行後は、以下のようにフォーカスはA1、表示倍率は100%に統一されました。
[Sheet1]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/1da2d469-1ea0-76ca-12cc-c748275404aa.png)

[Sheet2]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/a3edf253-82b4-5f34-5f0a-88dcc7a825ab.png)



# 補足
 - 動作確認環境は Windows 10、PowerShell 5、Excel 2013です。多少前のバージョンでも大丈夫だと思います。
 - 処理後のファイルを別名で保存したい場合は`$book.save()`のところを`$book.saveAs("別名保存先ファイル名")`にしてください。
 - Excelオブジェクトのプロセス解放の仕方はネットで調べるといろいろあるようですが、私は以下のサイトの方法を参考にしています。
   - https://technet.microsoft.com/en-us/library/ff730962.aspx
vagrantのcentos7のbox使おうとvagrant upしたら Warning: Authentication failure. Retrying..

## 現象

http://www.vagrantbox.es/ で、centos7のboxをインストールして、vagrant upすると Warning: Authentication failure. Retrying.. がでる。使ったboxはこれ⬇︎

![スクリーンショット 2016-08-18 9.03.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20307/1f5d2109-3be9-476e-373f-7abde26f062a.png)

## 原因
ゲストosのauthorized_keysの権限が600になっていないのが原因

## 対処法
vagrantに手動でログインしてauthorized_keysの権限を変更すればいい

```
# vagrant up # Warning: .. の表示がでるけど無視
# vagrant status # runningであることを確認
# vagrant ssh # パスを聞かれる。'vagrant'と打つと入れる。
# cd .ssh
# chmod 700 authorized_keys 
```

このあと、再度ホストOSから vagrant sshするとパスなしで入れる。
次回からvagrant upするとWarning... がでなくなる。
apacheもMySQLも動いているのに「localhost で接続が拒否されました。」と出て来る問題について



![スクリーンショット 2016-08-18 20.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/135287/7dd3bfa5-ad17-858b-4804-18efea43a062.png)

xamppを利用する際に、localhost で接続が拒否されました。という表示が出てしまいました。

![スクリーンショット 2016-08-18 20.23.46.png](https://qiita-image-store.s3.amazonaws.com/0/135287/8c9e3bed-fbd8-12c3-df43-a014372be388.png)


http://localhost:8000/htdocs直下の階層にあるファイル.php


という形で8000番を指定したら正しく動作するようになりました。
Postgresqlで二つのSELECT句の差集合を取得したい！

# PostgreSQLで二つのSELECT句の差集合を取得したい！

某案件で、二つのSELECT句の差集合(Aにいて、Bにいないもの)を取りたいなーとふと思って調べたらあったので使ってみた！

http://www.sql-reference.com/select/except_minus.html


## EXCEPT句を使ってみた

```SQL
SELECT
-- 0,2,4,6,8,10
generate_series( 0, 10, 2 )

EXCEPT

SELECT
-- 0,3,6,9
generate_series( 0, 10, 3 )

```

### 結果

```
2
4
10
8
```

※実際には`generate_series`で使うなんてことはしませんw

## まとめ

実際には、なかなか使いどころはないし、使わずに解決できることのほうが多いと思いますが、引き出しの一つとしては持っておいてよさそう。

(後MySQLにはこれに該当する関数がないんだってさ。。。)
brew update が常に Already up-to-date になった時の対処法


バグの症状と調査
--

`brew update` をしても常に `Already up-to-date` になって更新されないなと思って調べていると，[homebrew の github の README](https://github.com/Homebrew/brew)の記述で以下のバグが存在していたことがわかりました．

* 2016/8/10~11 に homebrew を update している場合には，`brew update` しても常に `Already up-to-date` になる

まさにそんな症状のバグでした．

解決策
--

以下のコマンドを打つと解決するみたいです．

```sh
cd $(brew --repo); git fetch; git reset --hard origin/master; brew update
```
rustとmrubyでdslを作成してみよう

[itamae-go](https://github.com/k0kubun/itamae-go)の実装が面白そうだったので、ソースコードを調べていたんですが、
rustでもmrubyを組み込むcrateあったなーと思い、勉強ついでにマネをさせてもらいました。

## 用意するもの

1. rust (1.10.0)

## ソースコード

/tmp/madoka/homuraというディレクトリつくって、
そこに3つファイルを作るというあまり意味のないレシピ。

```Cargo.toml

[dependencies]
mrusty = "*"

```

```rust:main.rs
#[macro_use]
extern crate mrusty;

use mrusty::*;


// ruby
static RUBY_RECIPE: &'static str = r#"
directory '/tmp/madoka/homura'

3.times do |i|
  file "/tmp/madoka/homura/#{i}"
end
"#;

#[allow(unused_must_use)]
#[allow(unused_variables)]
fn main() {
   let mruby = Mruby::new();
   let itamae = mruby.def_module("Itamae");
   let recipe = mruby.def_class_under("Recipe", &itamae);
   let context = mruby.def_class_under("Context", &recipe);

   mruby.def_method(context.clone(), "directory", mrfn!(|mruby, slf: Value, v: (&str)| {
     std::fs::create_dir_all(v)
       .map(|_| mruby.bool(true))
       .unwrap_or(mruby.bool(false))
   }));

   mruby.def_method(context, "file", mrfn!(|mruby, slf: Value, v: (&str)| {
     std::fs::File::create(v)
       .map(|_| mruby.bool(true))
       .unwrap_or(mruby.bool(false))
   }));

   // itamae-goのように実装してみたら、mrustyだとうまくできなかったので、
   // method_missingを利用。
   mruby.run(r#"
      class Wrapper
        def initialize
          @inst = Itamae::Recipe::Context.new
        end
        
        def method_missing(method, *args)
          @inst.send(method, *args)
        end
      end
      ITAMAE_CONTEXT = Wrapper.new
   "#);

   mruby.run(format!("ITAMAE_CONTEXT.instance_exec {{{}}}", RUBY_RECIPE).as_str());
}
```

## まとめ

rustとmrubyでrubyのdslができたような気がします。
mrustyはrustのマクロ機能をいい感じにつかっていたので、とても勉強になりました。
ゼロから始めるWeb Accessibility入門：ボタン


# 前回まで
[ゼロから始めるWeb Accessibility入門：概要](http://qiita.com/toshinori/items/d5c81131aadc9610c36a)
[ゼロから始めるWeb Accessibility入門：誤解](http://qiita.com/toshinori/items/b94f3ae3f26893490624)
[ゼロから始めるWeb Accessibility入門：セマンティックHTML](http://qiita.com/toshinori/items/bc27612266306f06e884)



多用する「ボタン」を例に、「ロール（役割の定義）」「プロパティ（情報を提供する）」というWAI-ARIAの基本を記載します。

# button要素
これ大事です。
> button要素はボタンを表す。

基本のボタンは次のように記述します。

```
<button>何かを実行</button>
```

## ボタンをアクセシブルにするには？
`<button>`要素を正しく使用することで、**キーボードユーザ**と**スクリーンリーダ**のユーザにメリットがあります。

* ボタンがフォーカスを受け取る。
* フォーカスを受け取ったボタンをキーボードで習慣通りに操作する。
* スクリーンリーダーがボタンを「ボタン」として読み上げる。

キーボードユーザは、マウスでなくキーボードを使ってWebページをナビゲートします。キーボードでWebページを利用できるようにすることは、WCAG2.0（Web Accessibility Inisitative発行の「Web Content Accessibility Guidelines」）に規定されています。

> すべての機能をキーボードから利用できるようにすること。
ーWCAG2.0ガイドライン2.1

WebページでTabキーを押すと、ページ内の次のインタラクティブ要素（ボタンなど）にフォーカスが移動します。Enterキーまたはスペースバーを押すと、要素がアクティブになり、イベントが実行されます。

スクリーンリーダーユーザも同様にキーボードをよく使いますが、ボタンにフォーカスがあるかどうかを目で確認することができません。スクリーンリーダーは、ユーザがフォーカスを合わせたとき、その要素が`<button>`であるかどうかを伝える必要があり、そのためにはボタンのマークアップに`<button>`要素を使うというのが最も簡単な方法です。

## ボタンのタイプ
`<button>`が使われていないことが多くあります。
`<a>`要素で定義していたり、さらに悪い場合には、デフォルトではフォーカスを受け取れない`<span>`や`<div>`であることも多々あります。

ボタンのタイプは簡単に次です

| submit | button | reset |
|:-----------|:------------|:------------|
| フォームを送信する | JavaScriptイベントに適する | ？？ |

## ARIAによるラベルづけ
`aria-label`と`aria-labelledby`という、フォームにアクセシブルなテキストを付与するための2つの方法を提供しています。

* `aria-label` = 値にラベルテキストを含む属性
* `aria-labelledby` = テキストを含む他の要素を参照

ARIAのこれらのプロパティにより、読み上げのための追加のテキストコンテンツや足りないテキストコンテンツを提供することによってスクリーンリーダーのアクセシビリティを向上させることが可能です。

### aria-label

```
<!-- aria-labelの例 -->
<button aria-label="元に戻す">&#xE000;</button>
```

### aria-labelledby

ボタンとその説明との関係をアクセシブルな方法で構築

```
<p>元に戻すには<span id="back-text">元に戻す</span>ボタンを押してください。</p>
<button aria-labelledby="back-text">&#xE000;</button>
```


# 次回