OmniAICreator/Qiita-1.07M huggingface dataset:
MacでElectronするとクリップボードが効かなくなるときの対処

自分用のメモ。

MacでElectronしていたら、どういうわけかクリップボードがアプリ内で効かない。Qtでも似たようなことが起きていたので、両方に共通するChromiumランタイムが原因かと思いきや、以下によるとどうやらMacOS 側の問題であるらしい。

- https://github.com/atom/electron/issues/916
- https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard#mac-os-x-pasteboard-access-under-tmux-and-screen

開発中しか影響しないらしいとあるけど、うっとおしいことこの上ないので修正したい。けどパッチとかかったるいことしたくない。

すると、[Electron - Enable copy and paste](https://pracucci.com/atom-electron-enable-copy-and-paste.html)でElectronに明示的に Edit メニューを追加する方法があったので、これで回避することにした。そもそもElectronウィンドウにEdit メニューがないのはいろいろ気持ち悪いので。

以下は、[Electron - Enable copy and paste](https://pracucci.com/atom-electron-enable-copy-and-paste.html)の方法そのまんまです。ごめんなさいごめんなさい。

```js
var app = require("app");
var BrowserWindow = require("browser-window");
var Menu = require("menu");
var mainWindow = null;

app.on("window-all-closed", function(){
    app.quit();
});

app.on("ready", function () {
    mainWindow = new BrowserWindow({
        width: 980,
        height: 650,
        "min-width": 980,
        "min-height": 650
    });
    mainWindow.loadUrl("file://" + __dirname + "/index.html");
    mainWindow.on("closed", function () {
        mainWindow =  null;
    });

    // Create the Application's main menu
    var template = [{
        label: "Application",
        submenu: [
            { label: "About Application", selector: "orderFrontStandardAboutPanel:" },
            { type: "separator" },
            { label: "Quit", accelerator: "Command+Q", click: function() { app.quit(); }}
        ]}, {
        label: "Edit",
        submenu: [
            { label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:" },
            { label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:" },
            { type: "separator" },
            { label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
            { label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
            { label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
            { label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" }
        ]}
    ];

    Menu.setApplicationMenu(Menu.buildFromTemplate(template));
});
gulp-zipでディレクトリ構成を保ったまま圧縮する

gulpを使って圧縮ファイルを作りたい時に、ディレクトリ構成を保ったまま圧縮する方法

ライブラリは [gulp-zip](https://www.npmjs.com/package/gulp-zip) を使用。

Usage通りに `gulp.src('src/*')` と指定するとルートディレクトリに全部展開されてしまう。
`gulp.src('src/**/*', {base: 'src'})` と、 `base` を追加すると指定されたディレクトリの構成を保ったまま圧縮できる。

`base` は [gulp自体の機能](https://github.com/gulpjs/gulp/blob/master/docs/API.md#optionsbase) なので、他でも使えるテクニックだった。

全体

```
const gulp = require('gulp');
const zip = require('gulp-zip');
 
gulp.task('default', () => {
	return gulp.src('src/*', {base: 'src'})
		.pipe(zip('archive.zip'))
		.pipe(gulp.dest('dist'));
});
```
時系列プロット / Matplotlib

``` data.txt
# data1,data2
2016-01-23,12
2016-01-24,15
2016-01-25,11
...
2016-03-09,20
```

``` time_series.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import dateutil

(data1, data2) = np.loadtxt("data.txt",
                            delimiter=",",
                            dtype=int)

data2 = np.array([datautil.parser.parse(v) for v in data2])

fig = plt.figure(figsize=(10,10), dpi=100)
ax = fig.add_subplot(111)
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d\n%H:%M"))
ax.plot(data1, data2, ".")
ax.set_ylim(-0.1, 1.1)
ax.grid(True)

```
iOSでライブラリ管理をする CocoaPods


iOS開発を始めてみたのでメモ

[CocoaPods](https://cocoapods.org/ "CocoaPods")


#CocoaPodsのインストール

```
sudo gem install cocoapods
```

これで完了


#ライブラリをインストールする

xcodeのプロジェクトフォルダ直下に移動し、

```
pod init
```

するとPodfileが生成される
ここにライブラリを追加していく


```
vim Podfile 
```

```Podfile:Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

target 'first-app' do
  pod 'Alamofire'
  # pod 'SwiftyJSON'
  # pod 'Alamofire-SwiftyJSON', :git => "https://github.com/SwiftyJSON/Alamofire-SwiftyJSON.git"
end

target 'first-appTests' do
end

target 'first-appUITests' do
end
```



ここでおもむろに

```
pod install
```

こんな感じのメッセージが出たら成功です

```
[!] Please close any current Xcode sessions and use `first-app.xcworkspace` for this project from now on.
```














#参考
[「CocoaPods」で便利なiOSライブラリ管理](http://tsuchikazu.net/cocoapods/ "「CocoaPods」で便利なiOSライブラリ管理")
ローカライズの .strings ファイルの名前は Localizable.strings にする

**ローカライズのファイル名は ```Localizable.strings``` にすること。**

そうしないと ``NSLocalizedstrings:coment:`` で認識してくれない。別の名前を使用してしまった場合は呼び出すときにいちいち指定しないとダメらしい。

自分はチュートリアルで見間違えて ``Localized.strings`` という名前で作ってしまい、丸一日悩んでいた。
PostgreSQLアンチパターン：外部キー制約の更新コストを見くびる

このTABLE定義であやういところはどこでしょう？　サービスにどんなインシデントが発生したか想像できるでしょうか？

```sql
CREATE TABLE reports
(
    id bigserial NOT NULL,
    user_id bigint NOT NULL,
    time_of_report timestamp without time zone NOT NULL,
    previous_report_id bigint REFERENCES reports (id),
    elapsed_time integer NOT NULL DEFAULT 0,
    CONSTRAINT reports_id_pkey PRIMARY KEY(id),
    CONSTRAINT reports_user_id_fkey FOREIGN KEY(user_id)
        REFERENCES users(id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE INDEX reports_user_id_time_of_report_idx ON reports USING btree(user_id, time_of_report);
```

[前回](http://qiita.com/masudakz/items/6a9cfa1db7ab59ea75aa)の time_of_report の date_trunc()関数の話とは別件です。

前提知識

- 利用者の最大1日1回の操作で1行追加されます。
- インシデント発生日には 500万行ほど蓄積していました。

# 参照制約下のDELETE

インシデント発生時の postgres log です。28秒の長期トランザクションになりました。
`LOG: 期間: 28575.514 ミリ秒 実行 <unnamed>: DELETE FROM reports WHERE user_id = $1`

全体で500万行とはいえ、user_id １つにつき、高々数百行です。しかも user_id を第一キーにしたインデックスがついています。
これ以上シンプルにはできない SQL で、SQLプランナが何かを間違えようもないのに。

アンチパターンは、下記カラム定義でした。

`previous_report_id bigint REFERENCES reports (id)`

さらりと参照制約がついています。user_id の方は、最後にまとめて CONSTRAINT定義しているところに記述しているのに、不統一ですね。これで、SQL予約語を大文字にするというコーディング規約も破っていたら、見落とすかもしれません。このへんは余談で本論ではないですが。

記法を揃えると下記のようになります。これで、危うさが少し見えやすくなってきました。外部キー制約ですが、previous_report_idの場合は同じTABLEを参照しています。

```sql
CONSTRAINT reports_previous_report_id_fkey FOREIGN KEY (previous_report_id)
 REFERENCES reports(id)
 MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION
```

仕様としては省略できるところでも、プロダクト用の設定やDDLでは、あえて明示したほうがいいです。そのほうがレビューで問題を検出しやすい。書いてあるところの間違いを指摘するのは容易ですが、記述してないものを見通すのは技量がいります。「あるべき記述が無い」と指摘できる力や、「記述がないときのデフォールトを諳んじている」知識力というのは、そう簡単に手に入りません。

外部キー参照には参照先DELETE時の動作定義もついてきます。

1. NO ACTION
1. RESTRICT:　参照先のDELETEをさせない
1. CASCADE:　連鎖して参照元もDELETEする
4. SET NULL:　値としてNULLを入れる
5. SET DEFAULT:　カラム定義のDEAFULT値を入れる

インシデント発生時は、デフォールトのNO ACTION でした。
NO ACTION の字面は、とくにDBMS側でやることはないような気がしますよね？　実は、NO ACTION と RESTRICT はそれほど違いは無くて、参照先のDELETE時点でトランザクションの失敗が確定する（RESTRICT）か、トランザクション中で、参照元もDELETEしないとトランザクション失敗する（NO ACTION）か。NO ACTIONは判定を先送りするだけです。DBMSとしては参照整合性を守るのは大前提で、どうやって実現するかを指定しているので。

## インシデント経緯

このTABLEへ500万ほどのINSERTの後、サービスインして相当期間が経ってから初めてのDELETE文で発生しました。

2.  トランザクション終了直前には、DELETEされたid を、previous_report_id に持つ行が存在しないことを、確認する
2. previos_report_id のインデックスがないので 500万行の Seq. Scan が発生する
3. user_id １つにつき、数百回 の DELETE があるので、数百回×500万行 のSeq. Scan が発生する
4. 28秒もかかる

[運用のインデックスは怖くて消せない](http://qiita.com/masudakz/items/6a9cfa1db7ab59ea75aa)話を前記事でしましたが、こんな具合に普段まったく使ってないindexが必要とされるケースがあるのです。

## 対策

- previous_report_id のインデックスを追加する

これが一般解です。

実際のサービスでは、`DROP CONSTRAINT reports_previous_report _id_fkey` でした。実は previous_report_id は定義されたものの、使ってなくて、500万行全てで NULL だったのです。
btree(user_id, time_of_report) があるんだから、 previous_report_id がなくても一つ前は簡単に取り出せます。

もちろん、`DROP COLUMN` で大正解ですが、それやるにはプログラム側を先に変更対応する必要があるので、取り急ぎの性能不具合回避に、`DROP CONSTRAINT` を先行させました。

## まとめ

- 外部キー制約は参照先と同様に参照元にもインデックスがないと更新がつらい
- 外部キー制約の NO ACTION はなにもしないわけじゃない
- SQL DDL にもコーディング規約は欲しい
- プロダクト用の設定ファイルやDDLではデフォールトのところも明示しよう
- 不要カラム定義は、運用投入前に取り除いておきましょう
mruby-cliでOpenCVに依存したmruby-webcamを使ってマルチプラットフォームでワンバイナリを作る

# 背景

[外部のライブラリに依存するmrbgemを使ってもmruby-cliでワンバイナリを作成できるようにした](http://abrakatabura.hatenablog.com/entry/2016/02/14/144922)にて自作のmrbgemモジュールのmruby-webcamをmruby-cliに対応させた。

# やり方

```bash
git clone 
mruby-cli --setup webcamapp
cd webcamapp
cp ../mruby-webcam/docker/* .
```

## アプリ本体

```rb:webcamapp.rb
def __main__(argv)
  if argv[1] == "version"
    puts "v#{App1::VERSION}"
  else
    puts "Hello World"
    cam = Webcam.new

	  cam.capture {|img|
          # img : JPEG format
		  puts img.length
		  File.open("#{Time.now.to_s.gsub!(' ','').gsub!(':','')}.jpg","wb") {
        |f| f.write img
      }
	}

  # SPC : capture
  # ESC : exit
  cam.start
  end
end
```

## ビルド

```bash
docker-compose run compile
```

初代MacBook Pro Retinaで３時間程度待つと、mruby/build配下にWindows、OSX、Linuxのワンバイナリが作成される。

# あとがき

mruby-webcamモジュール自体は現状、Webカメラの映像を表示する程度だが、
OpenCVをmruby-cliに付属のコンパイラでクロスコンパイルできているので、
色々頑張ると使えるかもしれません。

docker-machineでcpu数増やすともう少しビルド時間を短縮できるかも。

# 関連記事

- [mruby-webcamをヘッドレス対応した](http://abrakatabura.hatenablog.com/entry/2016/06/07/112409)
- [mrubyでWebカメラを黒い画面にそのまま表示できるようにした](http://abrakatabura.hatenablog.com/entry/2017/02/25/080830)
- [WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した](http://abrakatabura.hatenablog.com/entry/2017/09/01/072123)
- [mruby-webcamにWebカメラで取得する画像サイズを指定できるメソッドを追加した](http://abrakatabura.hatenablog.com/entry/2017/09/05/064906)
技術英語 > Well my concern is that these stressors are [cumulative]. / as a result of these [cumulative] effects. / stick-to-itiveness

@ LOE > December 7, 2012

http://loe.org/shows/shows.html?programID=12-P13-00049
>Well my concern is that these stressors are <font color=red>cumulative</font>. 
...
>as a result of these <font color=red>cumulative effects</font>.

大学生の時に読んだレイチェル・カーソンの沈黙の春。そこで恐ろしいcumulativeなものが紹介されていた。

<hr>
コーディング関係でよく目にするのは

http://ejje.weblio.jp/content/accumulator

<hr>
蓄積から連想して、1万時間訓練したらいいよというものもある

関係しそうなのは

> stick-to-itiveness

http://ejje.weblio.jp/content/stick+to+itiveness

先週、道を迷っている外国人の道案内をした。流暢な日本語を話すのだが、日本語を話すのは初めてだということだった。
日本のアニメが好きで８年間見ていると、日本語が分かるようになったそうだ。
コミットログテンプレートにIssue番号を自動で入れる

手元で直した修正がgithubのissueに上がっている事をうっかり忘れて、コミットログに参照を書かずコミットしてしまうことがよくありましたが、ブランチにissue番号を予め入れておくという[この記事のアイデア](http://qiita.com/PallCreaker/items/c91bc201fb8562c8fbd3#1-2)のおかげでミスはほぼなくなりました。

導入にあたって、`git-flow`の作るブランチに対応できるように修正を加えました。

```sh:.git/hooks/prepare-commit-msg
#!/bin/sh

if [ "$2" == "" ] ; then
  mv $1 $1.tmp
  echo "refs #`git branch | grep "*" | awk '{print $2}' | sed -e 's/.*([1-9][0-9]*).*/\1/'`" > $1
  cat $1.tmp >> $1
fi
```

元記事では、`23_issue_name`のようにブランチの先頭にissue番号を入れるようになっていましたが単に数字を持ってくるようにしています。

ところが、[コミットログのテンプレート](http://qiita.com/kasaharu/items/cdb587d4d27d7608b063)とこのままでは併用ができません。

そこで、以下のようにテンプレートの`{issue}`を置き換える形に変更しました。

```sh:.git/hooks/prepare-commit-msg
#!/bin/sh
issue=$(git branch | grep "*" | awk '{print $2}' | sed -E 's/.*\/([1-9][0-9]*).*/\1/')
# commit template の {issue}をブランチから抽出した番号に置換する
perl -i.bak -ne "s/{issue}/$issue/; print" "$1"
```

テンプレートには以下のように書いておきます。

```.gitmessage.txt

# Explain why this change is being made

# Provide links to any relevant tickets, articles or other resources
refs #{issue}
```

Issue番号の参照付きのコミットメッセージをより楽に作成することができるようになりました。
VueでTypeScriptを使う時のテンプレートを作った

## 投稿時点のバージョン
Vue.js: v1.0.16
TypeScript: 1.7.5
vue-cli: v1.3.0
vue-loader: v8.0.0

# 概要

　Vue.jsは最近（2015年末ごろ？）、Vueを使ったWebアプリのひな形をかんたんに作成できる[CLIツール(vue-cli)](https://github.com/vuejs/vue-cli) の提供をはじめました。

　このツールは自作のテンプレートを利用できるようになっていますので、TypeScriptを使ったテンプレートを作ってみました。
https://github.com/AbeHaruhiko/vue-webpack-typescript

　公式のテンプレートは下記の4種類です。一番上のテンプレートをForkして作りました。

* [webpack](https://github.com/vuejs-templates/webpack)
* [webpack-simple](https://github.com/vuejs-templates/webpack-simple)
* [browserify](https://github.com/vuejs-templates/browserify)
* [browserify-simple](https://github.com/vuejs-templates/browserify-simple)

# Get Started

```bash
$ npm install -g vue-cli
$ vue init AbeHaruhiko/vue-webpack-typescript my-project
$ cd my-project
$ npm install
$ tsd install
$ npm run dev
```

　※ 公式のテンプレートと違い[`tsd install` が必要](https://github.com/AbeHaruhiko/vue-webpack-typescript#usage)なのでお忘れなく！！

# 背景

 　公式のテンプレート（vue-loaderを使う）では、`*.vue` ファイルで `<script lang="ts">` としても、 下記のようなエラーになり、トランスパイルに失敗します。

```
ERROR in ./~/ts-loader!./~/vue-loader/lib/selector.js?type=script&index=0!./src/App.vue
Module build failed: Error: Could not find file: '/path/to/peoject/src/App.vue'.
    at getValidSourceFile (/path/to/peoject/node_modules/typescript/lib/typescript.js:44463:23)
    at Object.getEmitOutput (/path/to/peoject/node_modules/typescript/lib/typescript.js:47595:30)
    at Object.loader (/path/to/peoject/node_modules/ts-loader/index.js:406:34)
 @ ./src/App.vue 3:17-107

```

　`webpack.base.conf.js` で`transpileOnly` とすることでエラーは解消できますが、肝心の静的解析が行われなくなるのでTypeScript最大のメリットが失われます。

```js:webpack.base.conf.js
  ts: {
      transpileOnly: true
  }
```

[参考] https://github.com/vuejs/vue-loader/issues/109

　そこで、`*.vue` （vue-loader）の使用はあきらめて、`*.ts`を ts-loaderで読み込んで使用します。その際 [vue-class-component](https://github.com/vuejs/vue-class-component) を使用します。同様に`*.html`はhtml-loader、`*.css`はstyle-loaderで読み込みます。

# 注意
　`*.vue` ファイルを使ったコンポーネントと違い、`html`, `ts`, `css` に分断されてしまいます。ひとつのコンポーネントを1ファイルで扱えるvue-loaderのメリットが失われますが、それぞれlintによる静的解析が利用できるなど、メリットもあります。

　なお `html` は[このサンプル](https://github.com/vuejs/vue-class-component/blob/master/example/example.js) のようにdecoratorの引数として、`ts` ファイルに埋め込むこともできます。


# さいごに
　vueの作者さんによるとvue-loaderでtsを扱えるようにするのは容易ではないようです[^1]。vue-loaderが対応するまでは、こんな感じでTypeScriptを利用してみてはどうでしょうか。

[^1]: https://github.com/vuejs/vue-loader/issues/109
Scalaの並列コレクションでフィボナッチ数列

#フィボナッチ数列を計算

```Scala:Fib.scala
object Fib {
  def main(args: Array[String]): Unit = {
    println ((1 to 30).par.map(x => fib(x)))
  }
  def fib(n: Int): Int = if(n < 2) 1 else fib(n - 1) + fib(n - 2)
}

```

出力：
ParVector(1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269)
【C#】変数のデバッグログ出力を簡単に行う拡張メソッド

拡張メソッド+Jsonシリアライザを利用したログ出力拡張メソッドを作ります。
デバッグログ出力のためにコードを汚したくない人におすすめです。

# 普通のデバッグ出力の場合
普段、変数の状態を出力する時は

```csharp:
using System.Diagnostics;

var index = 1;
Debug.WriteLine("index = {0}", index);

var array = new int[] { 1, 2, 3 };
Debug.WriteLine("array = [{0}]", string.Join(", ", array));
```

こんな感じに出力すると思います。
この程度ならちゃちゃっと書けば済む話ですが、クラスのフィールドやプロパティの状態を出力したい時は

```csharp
using System.Diagnostics;

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override string ToString()
    {
        return string.Format("Name = {0}, Age = {1}", Name, Age);
    }
}

var person = new Person() { Name = "hoge", Age = 20 };
Debug.WriteLine("person = {0}", person);
```

みたいにToStringをオーバーライドしていちいちログ出力のためのコードを書かなければいけません。
ちょっとしたプログラムならさほど面倒ではありませんが、クラスのプロパティを修正したり追加したりするたびにログ出力のためのコードも修正しなければならないので正直面倒です。

# 作るもの
こんな感じにデバッグログ出力できるものを作ります。

```csharp:
var index = 1;
index.DebugLog("index");

var array = new int[] { 1, 2, 3 };
array.DebugLog("array");

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var person = new Person() { Name = "hoge", Age = 20 };
person.DebugLog("person");
```

これだけで

```csharp:
index = 1
array = [
  1,
  2,
  3
]
person = {
  "Name" : "hoge",
  "Age" : 20
}
```

このような変数名=Json形式で値を出力してくれる拡張メソッドを作ります。
変数の対象が数値、配列、クラスでもなんでも .DebugLog(name)をつけるだけでいいのでかなり楽です。
また、ToStringをオーバーライドしてうんたらかんたらもやらなくていいのでコードもすっきりします。

以下実装方法
# 準備
まず、[http://www.newtonsoft.com/json](http://www.newtonsoft.com/json)からJsonシリアライザのDLLをダウンロードして、
Newtonsoft.Json.dllをプロジェクト参照に追加してください。
デバッグログ出力の形式は何でもいいのですが、ここではシンプルで見やすいJson形式で出力するために上記のdllを利用します。

Newtonsoft.Json.dllを参照できるようにしたら以下のクラスを作成し、拡張メソッドを記述します。
名前はログの拡張機能ということでLogExtensionにしています。

```csharp:LogExtension.cs
using System;
using System.Diagnostics;
using Newtonsoft.Json;

static class LogExtension
{
    [Conditional("DEBUG")]
    public static void DebugLog<T>(this T obj, string name)
    {
        try
        {
            var json = JsonConvert.SerializeObject(obj, Formatting.Indented);
            Debug.WriteLine("{0} = {1}", name, json);
        }
        catch
        {
            Debug.WriteLine("{0} : Debug Log Error!", name);
        }
    }
}
```

これだけです。ものすごく簡単です。
引数のnameもどの変数が出力しているのかを確かめるためのものなので、あってもなくてもいいです。
もっといろいろ魔改造してさらに便利なログ出力機能を追加するのもいいですね。

ちなみに変数がnullの場合でもちゃんと`変数名 = null`って出力してくれます。

### System.Code.dllへの参照が~でエラーが出る場合
最近の.NetであればSystem.Codeが最初から参照されているので問題ないですが、.Net Framework3.0とかだと拡張メソッドを使うのにちょこっと工夫しなければいけません。といっても

```csharp:ExtensionAttribute.cs
namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
    sealed class ExtensionAttribute : Attribute { }
}
```

上記のクラスを定義するだけです。
# まとめ
どんな型の変数でも.DebugLog()をつけるだけでデバッグログ出力をしてくれる拡張メソッドを作りました。
今回は楽するためにNewtonsoft.Json.dllを使ってJson形式で出力するようにしましたが、工夫すればもっとわかりやすいログにすることができるかもしれません。

拡張メソッド便利！
JavaEE7(JDK1.8) プロジェクト作成 Netbeans

#1 プロジェクト作成
- [ファイル]-[新規プロジェクト]
- [Maven]-[Webアプリケーション] で[次へ]
- プロジェクト名など必須項目に任意の値を入れて[次へ]
- GlassFish, JavaEE7Web を選択して[終了]
- pomを編集してビルド：javaee-web-apiをjavaee-api, maven-compilerの1.7を1.8

#2 JPA関連を自動生成
- entity, persistance.xml生成<br>
-- プロジェクト右クリック-[新規]-[DB～Entity]で[次へ]<br>
-- データソースの接続先、表を指定して[次へ]<br>
-- デフォルト値（パッケージ等、必要に応じて変更）で[終了]<br>
-- entity, persistance.xml が自動生成
- Dao生成<br>
-- プロジェクト右クリック-[新規]-[EJB]-[Entity～SessionBean]で[次へ]<br>
-- Entity を指定して[次へ]
-- デフォルト値（パッケージ等、必要に応じて変更）で[終了]<br>
-- Dao(Facade)が自動生成
- Service生成<br>
-- プロジェクト右クリック-[新規]-[EJB]-[SessionBean]で[次へ]<br>
-- EJB名、パッケージを指定して[終了]<br>
-- 作られたクラスに Dao を @Inject して private 変数作成
-- Dao のメソッド実行するメソッドを作成

#3 JPA Entity以外の使用

```java:
public class Test {
    
    private String name;
    private long count;
    
    public Test(String name, long count){
        this.name = name;
        this.count = count;
    }
    
    public Test(){}
    
    // 以下、getter,setter
```

```java:
List<Test> tests = em.createQuery(
        "select new xxx.xxx.Test(s.name, count(s)) "
          + "from Main m join Sub s on m.id = s.mainId group by s",
        Test.class
).getResultList();

for(Test test : tests) {
    System.out.println(test.getName() + ":" + test.getCount());
}
```

#4 AOPの設定

アノテーション作成

```java
@InterceptorBinding
@Target(value={ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Priority(Interceptor.Priority.APPLICATION + 20)
public @interface AopMethod{
}
```

AOP処理実装

```java
@Interceptor
@Dependent
@AopMethod
public class AopInterceptor implements Serializable{
    @AroundInvoke
    public Object invoke(InvocationContext ic) throws Exception{
        try{
            return ic.proceed();
        }catch(Exception ex){
            Logger logger = Logger.getLogger(ic.getTarget().getClass().getSuperclass().getName());
            logger.log(Level.SEVERE, "error", ex);
            return null;
        }
    }
}
```

AOPを設定

```java
@AopMethod
public void subCalc(){
    result = calcLogic.sub(param1, param2);
}
```

<hr>
参考
http://masatoshitada.hatenadiary.jp/entry/2015/04/03/230218
https://github.com/sueasen/javaeee.git
http://d.hatena.ne.jp/MoonMtLab/20150314/1426327019
https://cloudear.jp/blog/?p=2005
http://enterprisegeeks.hatenablog.com/entry/2015/02/16/080922
http://d.hatena.ne.jp/nowokay/20131213
GCM

curl    -i --header  "Authorization: key=$AUTHKEY" \
       --header Content-Type:"application/json" --header "Accept: application/json" \
	   -X POST -d "{\"to\":\"$TOKEN\",\"notification\":{\"title\":\"Sun Feb 14 14:58:06 UTC 2016\",\"text\":\"test\"}}" \
       https://gcm-http.googleapis.com/gcm/send  


:-|
UnityでGooglePlayServicesを入れるにはPlayServicesResolver(unity-jar-resolver)が便利

# 前置き

Unity＋Androidで、Google Play Servicesのライブラリを使いたい場合、
google-play-services_libを丸ごと入れてしまうと、メソッド数が多すぎて
65K超えエラーになることが良くあります。

こんな感じのエラーですね。
http://developer.android.com/intl/ja/tools/building/multidex.html

```
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.
```

AndroidStudioでビルドする場合は、Google Play Servicesのライブラリの中から、
必要なAPIのみをbuild.gradleで指定して追加することができます。
https://developers.google.com/android/guides/setup#split

しかし、Unityのビルドではbuild.gradleを使用することはできないため、
Unityで同じことをするにはどうすれば良いのかという話です。


# 本題

GooglePlayServicesの中から、必要なAPIのみを追加するためのUnityライブラリを
Googleが公開してくれています。

**PlayServicesResolver (unity-jar-resolver)**
https://github.com/googlesamples/unity-jar-resolver

これはGoogle公式の以下のUnityプラグインに含まれているため、
これらの機能をUnityで使用したい場合は、公式プラグインをそのまま使えば良いです。

* [Google Ads (AdMob)](https://github.com/googleads/googleads-mobile-unity)

* [Google Play Games](https://github.com/playgameservices/play-games-plugin-for-unity)

# PlayServicesResolverの使い方

上記のリポジトリを持ってきて、**play-services-resolver-x.x.x.unitypackage**をインポートします。

[SampleDependencies.cs](https://github.com/googlesamples/unity-jar-resolver/blob/master/exploded/Assets/PlayServicesResolver/Editor/SampleDependencies.cs)というサンプルが用意されているので、
実装方法はこれを見ればだいたいわかるかと思います。

試しにGoogle Adsのライブラリを追加するソースを追加してみます。

```csharp:AdsDependencies.cs
using Google.JarResolver;
using UnityEditor;

[InitializeOnLoad]
public static class AdsDependencies {

	static AdsDependencies() {

		PlayServicesSupport svcSupport = PlayServicesSupport.CreateInstance(
			"AdsSample", EditorPrefs.GetString("AndroidSdkRoot"), "ProjectSettings");

		svcSupport.DependOn("com.google.android.gms", "play-services-ads", "8+");
	}
}
```

こんな感じで、**PlayServicesSupport#DependOn** を必要なだけ呼び出せばOKです。
３つの引数は、見ての通りbuild.gradleで指定する際のコロン区切りの値です。
（[ここに書いてあるやつ](https://developers.google.com/android/guides/setup#split)です。）

パッケージをインポートした時に、**Assets -> Google Play Services** というメニューが追加されています。
（Build SettingsでAndroidにSwitchしていないと表示されません）

![image](https://qiita-image-store.s3.amazonaws.com/0/19872/d9d36976-93e6-c163-3407-d88a431609ee.png)

**Resolve Client Jars** を実行すると、指定したライブラリが依存関係を含めて追加されます。
なお、上記メニューの **Settings -> Enable Background resolution** がONになっていると、
**Resolve Client Jars** を実行しなくても勝手に追加してくれます。（デフォルトON）

さて、実行結果ですが、以下のようにaarとjarファイルが、Assets/Plugins/Android 配下に追加されました。

![image](https://qiita-image-store.s3.amazonaws.com/0/19872/4264146d-5d49-ed2b-df02-b1ab977e55e8.png)



以上。
WixにおけるFeatureの扱い方の注意

# はじめに

[Wix](http://www.wixtoolset.org)の[Feature](http://wixtoolset.org/documentation/manual/v3/xsd/wix/feature.html)という機能を調べている途中ではまったポイントがあったのでメモ。

## Featureという機能

WixというかMSIにおいて、構成要素の最小単位は[コンポーネント](http://wixtoolset.org/documentation/manual/v3/xsd/wix/component.html)だが、個々のコンポーネントをグループ分けして、インストールするかどうかを決める仕組みとして、Featureというものがある。

Wix内で定義する場合、Product要素以下にFeatureを定義して、名前、インストールレベル等を設定すれば、それでMSIの中に登録されることになる。

## Featureの選択方法と問題

WixでどのFeatureをインストールするか選択する場合、通常はFeatureTreeや、Advanced、Mondo等、Wix側で用意されたUIを使用して選択する。
しかし、この方法は必ずWix側で用意されたツリー構造で行う必要があり、例えばチェックボックスで制御したい場合等、小回りが利かない部分がある。

もう一つの方法としてWXSファイル内のFeature要素の下にConditionを置けば、プロパティに基づいてインストールの可否を決めてくれるように見える。

```xml:Product.wxs
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product...>
    ...
    <Feature Id="TestFeature" Title="TestFeature" Absent="allow" Level="2" Description="TEstTest">
      <!-- TESTPROPERTYが定義されていれば、インストールすることを期待 -->
      <Condition Level="1"><![CDATA[TESTPROPERTY]]></Condition>
      <ComponentRef Id="Component.TextFile1.txt" />
    </Feature>
  </Product>
</Wix>
```

しかし、上記のwxsでmsiを作成し、インストールを実行すると、 **サイレントでプロパティを定義すればTestFeatureがインストールされるが、UI内でプロパティ定義してインストールすると、TestFeatureが入らないという問題が起こる。**

## 原因

MSI内におけるMigrateFeatureStatesというアクションの実行タイミングが関係している。
MigrateFeatureStates自体はIntallUISequenceまたはInstallExecuteSequenceの両方で実行されるが、InstallUISequenceで実行された場合、InstallExecuteSequenceを通っても何もMSIは何も実行しない。

そして、InstallUISequence内では、 **ダイアログが表示される前にMigrateFeatureStatesは実行される。**
よって、この後にいくら//Feature/Conditionで指定されているプロパティの中身を書き換えようが、インストールされるFeatureは決定しているので、インストールされるFeatureには何も影響を及ぼさなくなる。

## 回避方法

* ダイアログシーケンスの中で[ADDLOCAL](https://msdn.microsoft.com/en-us/library/windows/desktop/aa367536%28v=vs.85%29.aspx)プロパティを直接編集する
    * カンマ区切りで名前を指定する
* カスタムアクション内で[MsiUseFeature](https://msdn.microsoft.com/en-us/library/windows/desktop/aa370502%28v=vs.85%29.aspx)を使用する
    * C#で使う場合は、DTF(Deployment Tools Foundation)内のMicrosoft.Deployment.WindowsInstaller.Installer.UseFeatureメソッドが使える
* [Installation Package Bundles](http://wixtoolset.org/documentation/manual/v3/bundle/)等のブートストラッパーを使って、MSIインストール実行前にプロパティを設定する(MSI内蔵のUIを使用しない)

前者二つに関しては、Featureが小規模のうちはまだ大丈夫だが、規模が膨れ上がってくると途端に管理が難しくなるので、扱いには注意が必要となる。
ブートストラッパーを使用する場合、場合によっては一からUIを構築する必要があるので、こちらはより大規模アプリ向けの方法となる。

DTFについてはWixのバイナリにchmとdllが同梱されているので、そちらを参照のこと。(公式のオンラインドキュメントが見つからなかった)
angularで再帰処理。ディレクトリ・ツリーを作成。

#ソース
ng-templateを使用し、dirTree.htmlを再帰処理。
##html
```html
<!DOCTYPE html>
<html ng-app="app">
<head>
  <script data-require="angular.js@*" data-semver="1.4.9" src="https://code.angularjs.org/1.4.9/angular.js"></script>
  <link rel="stylesheet" href="style.css" />
  <script src="script.js"></script>
</head>

<body>
  <div ng-controller="myCtrl">
    <ul>
      <li ng-repeat="data in tree" ng-include="'dirTree.html'"></li>
    </ul>
  </div>

  <script type="text/ng-template" id="dirTree.html">
    <a ng-if="!data.dir">{{data.file}}</a>
    <span class="dir" ng-if="!!data.dir">{{data.dir}}</span>
    <ul ng-if="!!data.dir">
      <li ng-repeat="data in data.dirContents" ng-include="'dirTree.html'"></li>
    </ul>
  </script>
</body>
</html>
```
#script.js
jsonのキーにdirがある場合とfileがある場合で、処理を分けて再帰処理を実行。(↑のdirTree.htmlで)

```js
 var app = angular.module("app", []);
  app.controller("myCtrl", ["$scope", function($scope){
    $scope.tree = [
                    {"file": "file-A"},
                    {"dir": "dir-B","dirContents":[{"file": "fileB-1"},{"file": "fileB-2"},{"dir": "dirB-3","dirContents":[{"file": "fileB3-1"},{"file": "fileB3-2"}]}]},
                    {file: "file-C"}
                  ];
  }]);
```
カスタムディレクテイブでもいけそうだが、まずはこのやり方で。以下demoっす。
[plnkr-demo](https://plnkr.co/n6YsAp0dkhB9EBw8Mzc9)
FacebookAPI〜Graph-apiからの提供を5秒で爆速検証する方法〜

仕事でFacebookの動画再生数を取得したいという依頼があったため、その際に調査した結果をメモがてらここに残します。

おそらくFacebookAPIに関する技術資料ってほとんどが英語だったり、Stackoverflowに書かれていることもあまり役に立たなかったりして、最終的にDocument(reference)をあっちこっちして実際に用意されてるSDKを叩いたりしてとぐるぐるしてしまうことも多いはず。
少しはそんな手間が省けるようにと今回使ったツールや仕様を整理してみたいと思います。

通常の流れとしては、FB開発を行う場合
・Facebook Developersへの登録
・graph-apiの確認
・実際に自分の環境への導入
・検証
という流れになるかと思われます。

しかし今回はかなり便利なツールがあることを知りましたので、手軽にAPIの返り値などを試してみたい方は以下がおすすめです。
・Graph API Explorer
https://developers.facebook.com/tools/explorer

上記はおそらくFB開発者なら知ってて当然の機能かと思われますが、
・FB開発を普段行わず滅多に使わないが使わなければならない
・そもそもその仕様が提供されているのかわからない
という方はまず上のGraph API Explorerを試されてみるのが一番かと思われます。

使い方はまずAccessTokenでパーミッションの設定をします。
次に自分のTokenを設定した後で
GETフォームへ<strong>me/friends</strong>(APIversionの次)と入力してみてください。

はい、自分の友達一覧がJSON形式で取得できましたね！！

他にもGraphAPIのリファレンスから確認して引っ張りたいデータを打ち込んでみてください。



〜続き〜

余談ですが、video views（再生回数）は現在のFacebookAPIではインサイトでしか提供していないみたいです。

FacebookページインサイトとはFBページを持つサイトオーナーが閲覧できる管理機能です。Facebookでは、Facebookページ上での利用者のアクティビティに関するページインサイトを、ページを管理する人に提供しています。
https://www.facebook.com/help/336893449723054/

そしてそのインサイトへアクセスできるAPI仕様をまとめたのが以下のページです。(v2.5のところはアップデートされたら最新版に書き換えてください。)
https://developers.facebook.com/docs/graph-api/reference/v2.5/insights

もしかしたら通常のユーザー投稿のviewも取れるかな〜とぐるぐる探し回ったのですが、最終的にやはり取れないみたいで残念。。。どなたかFacebookAPIスペシャリストの方がいらっしゃいましたらそういう方法などあったらご教授願いたいものです。

ではでは、またの機会に投稿させていただきます！！！ご閲覧ありがとうございました！
近藤科学のB3Mサーボを秋月のUSBシリアルモジュールで制御する


　高トルクなサーボが欲しい場面があったので，試しに近藤科学の [B3M-SC-1040-A](http://kondo-robot.com/product/03090) を買ってみました．

　サーボ買ったのは良いのですが，B3Mシリーズのサーボと通信するための純正のシリアル変換アダプタが6000円して買う気が起きなかったので，とりあえず手元にあった秋月のUSBシリアル変換アダプタにRS485トランシーバ(150円)を付けて通信できるか試しました．


![動作中の様子](https://qiita-image-store.s3.amazonaws.com/0/58515/eaa8ad7d-135c-3fee-55f8-6fb5775af673.jpeg)

　つないだらあっさり動きました．PWM制御のサーボしか使ったことがなかったので，コマンド式のサーボがどんな感じかコード書きつつ雰囲気がわかれば良いなと思います．

# 必要なもの

- 近藤科学のB3Mサーボ
- サーボ駆動用の電源(6～12V)
- [USBシリアル変換モジュール AE-UM232R](http://akizukidenshi.com/catalog/g/gK-01977/)
- [RS-485トランシーバ LTC485CN8](http://akizukidenshi.com/catalog/g/gI-02792/)

# 回路図

![回路図](https://qiita-image-store.s3.amazonaws.com/0/58515/064d8e5d-7228-2efd-ff73-653fa0a51bab.png)

　RS-485は送受信の切り替えが必要ですが，AE-UM232RのCB2ピンにはTXDENが出ているので，それをLTC485CN8のRE,DEピンにつなぎます．

　通信用の5Vの電源はUSBからとり，サーボ用の電源は別途用意しました．


# 説明

　近藤科学のサイトにあるB3M Manager(残念ながらWindowsでしか使えないみたいですが)もそのまま使えるので簡単に動作確認が出来ます．最初Arduinoからコマンドを送信してみていたのですが，試しに上記の回路でPCにつないでCOMポート指定したらあっさり動いてしまいました．サーボにコマンドを送信するために必要な情報は[B3M-SC-1040-A](http://kondo-robot.com/product/03090)のページの「サポート情報」にある「B3Mソフトウェアマニュアル」を読めば書いてあります．

　USBシリアル変換アダプタは一家に一つあると便利ですし，最終的にはLTC485CN8を直接Arduino等につなぐことを考えると手間は変わらないと思うので，6000円のアダプタが150円で済むのは良いと思います．
CocoaPodsのライブラリをTravis CI上のXcode7.2でテストするときにハマった

`pod lib create` で作成したCocoaPodsライブラリのテンプレートに付いている`.travis.yml`の初期設定(下記)ではテストがうまく動かない(RxTwiftはライブラリ名)。

```yaml
language: objective-c
script:
- set -o pipefail && xcodebuild test -workspace Example/RxTwift.xcworkspace -scheme RxTwift-Example -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO | xcpretty
- pod lib lint
```

ここに`osx_image: xcode7.2`を追加すると、Xcode 7.2で実行するようになる。

```yaml
language: objective-c
osx_image: xcode7.2
script:
- set -o pipefail && xcodebuild test -workspace Example/RxTwift.xcworkspace -scheme RxTwift-Example -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO | xcpretty
- pod lib lint
```

以前までは、これで動いた。
が、今回はこんなエラーが出てコケるようになってしまった。

```
Build settings from command line:
    ONLY_ACTIVE_ARCH = NO
    SDKROOT = iphonesimulator9.2

xcodebuild: error: Failed to build workspace RxTwift with scheme RxTwift-Example.
        Reason: A build only device cannot be used to run this target.
```

7.2の`xcodebuild`から`sdk`オプションが変わったらしく、`destination`オプションを使うようにしたら動いた。

```
-sdk iphonesimulator
↓
-destination 'platform=iOS Simulator,name=iPhone 5s'
```

全体はこう。

```yaml
language: objective-c
osx_image: xcode7.2
script:
- set -o pipefail && xcodebuild test -workspace Example/RxTwift.xcworkspace -scheme RxTwift-Example -destination 'platform=iOS Simulator,name=iPhone 5s' ONLY_ACTIVE_ARCH=NO | xcpretty
- pod lib lint
```

`name`に`iPhone 5s`を直接指定しているのがキモいけども動くからしばらく許容しようと思う...
Macにanyenvを入れてrbenvとphpenvを共存させる

今までrbenvのみを使用しておりましたが、PHPもバージョンを切り替える必要が出たのでanyenvを使用することにしました。

事前にbrewからrubyenvとruby-buildを削除

```bash
$ brew uninstall rbenv
$ brew uninstall ruby-build
# ruby-versionを消しておく
$ rm ~/.ruby-version
```


anyenvをインストールします。

```bash
$ git clone https://github.com/riywo/anyenv ~/.anyenv
```

anyenvのパスを通します。
内容はpfavillさんの[欲張り？anyenvでモダンな開発環境構築。PHP,NodeJS,Ruby,Perl,Python](http://qiita.com/pfavill/items/f500e46444c86a6f8e6a) から拝借しました。ありがとうございます。

```bash
if [ -d $HOME/.anyenv ] ; then
    export PATH="$HOME/.anyenv/bin:$PATH"
    eval "$(anyenv init -)"
    # tmux対応
    for D in `\ls $HOME/.anyenv/envs`
    do
        export PATH="$HOME/.anyenv/envs/$D/shims:$PATH"
    done
fi
```

rubyenvとphpenvをanyenvからインストールし、確認。
現状だとsystemのデフォルトが設定されています。

```bash
$ anyenv install phpenv
$ anyenv install rbenv
$ anyenv versions
phpenv:
* system (set by /Users/truffaz76/.anyenv/envs/phpenv/version)
rbenv:
* system (set by /Users/truffaz76/.anyenv/envs/rbenv/version)
```

rubyenvからruby2.3.0をインストールします。

```bash
$ rbenv install 2.3.0
$ rbenv global  2.3.0
$ rbenv rehash
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin13]
```

rubyのインストール完了です。
続いてphpenvを使用してphpをインストール。バージョンがアレなのは会社のPHPバージョンに対応するためです。
インストール時にbuild errorが発生してしまいました。これはlibmcryptが入っていなかっただけなのでbrewでインストールして対処しました。

```bash
$ phpenv install 5.3.29
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
-----------------------------------------

$ brew install libmcrypt
```

再チャレンジ。と思ったら以下のようにまたエラーが出た。
opensslはbrewで入れてるんだけど出てしまう。

```bash
$ phpenv install 5.3.29

-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
      _load_all_certs_from_file in openssl.o
  "_sk_value", referenced from:
      _zif_openssl_x509_parse in openssl.o
      _zif_openssl_csr_new in openssl.o
      _zif_openssl_pkcs7_verify in openssl.o
      _php_openssl_parse_config in openssl.o
      _php_openssl_sockop_set_option in xp_ssl.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [sapi/fpm/php-fpm] Error 1
-----------------------------------------
```

リンクをforceオプション使うと解決するらしい(configureオプションを変更してmakeし直す方法もあるらしいんだけど今回はやりませんでした)

```bash
$ brew link --force openssl
$ phpenv install 5.3.29
[Success]: Built 5.3.29 successfully.
```

今度こそ成功。

```bash
$ phpenv global 5.3.29
$ phpenv rehash
$  php -v
PHP 5.3.29 (cli) (built: Feb 15 2016 00:22:59)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
    with Xdebug v2.2.7, Copyright (c) 2002-2015, by Derick Rethans
```

完了。
FreeBSDでmruby

mruby with ZRouter.org

mrubyは組み込みを対象にしているので、クロスビルドの機能があります。またhttpなどの通信スタックも用意されています。

FreeBSDのルータ向けビルドシステムの[ZRouter](http://qiita.com/yamori813/item/2fc5b14648029bb4730f)とmrubyのクロスビルドを組み合わせて環境を作ります。ZRouterとmrubyは極めて親和性が高いです。

もちろんターゲットの機器はハードオフで入手した無線ルーターのジャンクを利用します。

デフォルトでprofileのmrubyを選択すれば素のmruby入りがつくれます。ビルドにはホスト側にrubyとbisonをpkgでインストールする必要があります。ネットワークアクセスが出来るようにビルドしてみます。

![スクリーンショット（2019-01-31 9.38.56）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/95eed975-ff33-4f5c-f19c-92cc427d52c4.png)

ports/lang/mruby/build_config.rbをベースにzrouterのターゲットに以下を入れます。

```
  conf.gem :git => 'https://github.com/mattn/mruby-uv.git'
  conf.gem :git => 'https://github.com/mattn/mruby-http.git'
  conf.gem :git => 'https://github.com/luisbebop/mruby-polarssl.git'
  conf.gem :git => 'https://github.com/matsumoto-r/mruby-simplehttp.git'
  conf.gem :git => 'https://github.com/matsumoto-r/mruby-httprequest.git'
```

上記のmebgemsに依存したライブラリなどをvendor/Buffalo/vendor.mkなどに以下を追加します。

```
WORLD_SUBDIRS_PORTS+=${ZROUTER_ROOT}/ports/devel/libuv
WORLD_SUBDIRS+= secure/lib/libcrypto
WORLD_SUBDIRS_LIB+=librt libdl
```

libuvのビルドのためにホスト側にautoconf,automake,libtoolをpkgをインストールしておきます。

修正した、build_config.rbを環境変数のMRUBY_CONFIGに設定してmrubyを追加してZRouterのビルドを流すとその設定でmrubyがビルドされイメージに入ります。

これでインターネットへのアクセスはできたので、LEDやセンサーを使えるようにします。FreeBSDではGPIOが使えるので、これに接続する事にします。ネットで検索してもFreeBSDのGPIOをサポートしたモジュールはなさそうだったので作ってみました。

https://github.com/yamori813/mruby-bsdgpio

こんなスタックができました。このスタックを一発でビルドできるZRouterはほんとよくできていると思います。

![mruby_freebsd.png](https://qiita-image-store.s3.amazonaws.com/0/104066/a7c9a0a0-14ce-4326-0027-57a57ffdb1e7.png)

ターゲットの機器はFlashが8M(空き2Mくらい)でRAMが32Mあれば十分使えます。

後日追記：i2cも使えるようにしてみました。[mrubyでi2c](http://qiita.com/yamori813/items/1d1c40ce69fe6e60ce1c)

下記のフィブナッチ(Fibonacci)コードでベンチマークとってみました。

```ruby
def fib n
  return n if n < 2
  fib(n-2) + fib(n-1)
end

puts fib(32)
```

|SOC|Type|Endian|Clock|1.2|1.3|1.4|2.0|2.1|3.0|3.1|
|:--|:--|:--|:--|--:|--:|--:|--:|--:|--:|--:|
|AR2312|MIPS 4K|Big|180MHz||||121||||
|AR2315|MIPS 4K|Big|180MHz|89|||118|103|||
|AR2318|MIPS 4K|Big|180MHz|||||122|||
|AR7240|MIPS 24K|Big|350MHz|64|||||||
|AR7242|MIPS 24K|Big|400MHz|||||45|||
|AR7161|MIPS 24K|Big|680MHz|||||57|||
|AR9132|MIPS 24K|Big|400MHz|53||||54||62|
|AR9330|MIPS 24K|Big|400MHz|47|84|88|95|90|58|123|
|AR1321|MIPS 74K|Big|535MHz||||19|16||18|
|BCM5356|MIPS 74K|Little|333MHz|24||||24|||
|RT2880|MIPS 4K|Little||||||60||||
|RT3050|MIPS 24K|Little|320MHz|25||29|33|26|27|29|
|RT3883|MIPS 74K|Little|500MHz|||||18|18||
|RT5350|MIPS 24K|Little|360MHz||25|26|29|23|||
|MT7620|MIPS 24K|Little|580MHz|13|15|16||14|||
|RT1310|ARM 5T|Little|300MHz|145|||||||
|88E6281|ARM 5T|Little|1200MHz||||232||||
|A10|ARM Cortex-A8|Little|1000MHz||||15|||||
|QEMU|MIPS 4K|Big|||31||||||

AR2315はAtheros(後にQualcommが買収)という会社のチップで2005年くらいに製造されていました。RT3050はRalink(後にMediaTekが買収)という会社のチップで2008年くらいに製造されていました。
fib(32)だったらMac mini 2010では4秒くらいなので、それなりに遅いですが、同じコードが動く事はすごいと思います。
Atherosが遅い原因はわかっていません。
underscoreコードリーディング（findKey）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##findKeyとは


###[underscorejs.orgのfindKey](http://underscorejs.org/#findKey)

こんな説明。
>####_.findKey(object, predicate, [context]) 
>Similar to _.findIndex but for keys in objects. 
>Returns the key where the predicate truth test passes or undefined.


------------- 

_.findIndexに似ているが、objectの中のkeyを探すためのものである。
predicateのテストに当てはまるkeyもしくはundefinedを返す。


###[underscore.findKey](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1012)
コード的にはこのあたり。

```javascript
  // Returns the first key on an object that passes a predicate test
  _.findKey = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = _.keys(obj), key;
    for (var i = 0, length = keys.length; i < length; i++) {
      key = keys[i];
      if (predicate(obj[key], key, obj)) return key;
    }
  };
```


predicateにcbの結果を格納する。
keysを_.keysを用いてkeyの配列を格納し、変数keyも宣言する。
for分を用いてkeysの中を走査する。
keyにkeysのi番目を入れる。
predicateにobjのkeyに対応するvalueと、keyと、objを渡し、その返り値がtrueだった場合はkeyを返す。
（合致しなければ何も返さない・・・）
Railsノート　（ドットインストールRuby on Rails 4入門＃７まで）

ドットインストールのRuby on Rails 4入門の内容を追っかけています。
ひとまず＃７までのノートをアップします。


#新しいアプリを作ります
 $ rails new taskapp --skip-bundle
rails new hoge --skip-bandle
railsのバージョンを指定したいときは
rails_バージョン番号_
と書けばオッケー　
バージョン番号を指定しなければインストールしている最新バージョンでアプリケーションを作成します。

--skip-bandleオプションを付けて「bandle install」をスキップすることによって
トラブルを切り分けることができるようです。

--skip-bandleオプションを付けないと自動的に「bandle install」が実行されるようです。

#サーバを立ち上げます

`$ cd taskapp`
ディレクトリを移って
`$ rails s -p $PORT -b $IP`
（cloud9の場合　ローカルの場合は　rails s）
立ち上げます

ブラウザで確認後ctrl+cで閉じる。そうするとまたコマンドが打てます
（cloud9だとリンクが出てきます。ローカルの人は:3000です。）

model
controller
view
の順に作ります。

#modelを作ります。
$ rails g model Project title

model名の命名規則　単数形で大文字はじまり
migration fileができるので

$ rake db:migrate
でDBに反映させます。

ここで
$ rake db migrate
なんて打つと
rake aborted!
Don't know how to build task 'migrate' (see --tasks)

(See full trace by running task with --trace)
↑こんなこと言われます。

#modelが出来たか確認するときは
 $ rails db
を打つと
SQLite versionなどを表示してくれます

sqlite> .schema
と打つと
自動的にtableが出来て、フィールドが出来たよって出てきます。
titleだけつけてあげると、あとはrailsがいろいろ用意してくれます。

sqlite> .exit
で閉じることができて、またコマンドが打てるようになります。

$ rails console
作ったモデルをrubyを使いながら操作することができます。

2.3.0 :002 > p = Project.new(title:"p1")
でつくって
2.3.0 :003 > p.save
でsaveすると日時とかいろいろデータを入れてくれます。
2.3.0 :004 > p
でデータを表示してくれます

2.3.0 :008 > Project.create(title:"p2")
だと
.newと.saveを両方してくれます。

私は.newの時にtitleを入れ忘れてあとから入れなおしてから.saveしたので
便利だけど心配です・・・。

2.3.0 :009 > Project.all
で全部を表示してくれます。
2.3.0 :010 > quit
で閉じるとまたコマンドが打てます。

#コントローラーを作成します
$ rails g contoller Projects
Projectに対するコントローラーを作りたいときはProjectsと複数形にするという
お約束を守りましょう

contollerのfileと
viewのfolderができます。

#ルーティングをします。（URIの自動設定に関することなど？）
config>locales>routes.rb
に
resources :projects
を書き足します。

$ rake routes
で確認をすると
<pre>
 Prefix Verb   URI Pattern                  Controller#Action

    projects GET    /projects(.:format)          projects#index

             POST   /projects(.:format)          projects#create

 new_project GET /projects/new(.:format)      projects#new

edit_project GET /projects/:id/edit(.:format) projects#edit

     project GET    /projects/:id(.:format)      projects#show

             PATCH  /projects/:id(.:format)      projects#update

             PUT    /projects/:id(.:format)      projects#update

             DELETE /projects/:id(.:format)      projects#destroy
</pre>
と出てきて、URIと書くべき（定義する）場所を教えてくれるらしいです。
Intel Edison Hardware Block Diagram の 念写

# Overview

Intel Edison を 検索しても、いわゆるhardware block diagramが出てきません。
というわけで、pin配などの情報から念写します。
(つまり、間違っているかもしれません^^;)

![Intel Edison Block Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/100425/4aea802f-07ec-80e3-cc8a-766e90b5a2b5.png)
Siv3Dでテトリス風ゲームのソースコード公開

こんにちは．はむくんです．
ほぼお蔵入りになったSiv3Dテトリス風ゲームがあります．
![ezgif.com-optimize (3).gif](https://qiita-image-store.s3.amazonaws.com/0/34295/99f38d5d-1365-b887-3008-4777245d17eb.gif)

もったいないので公開することにしました．
ソースコード（399行）はこちらです．
使用しているバージョン：January2016
https://gist.github.com/chobby/1d6994a993f19956f888


内容

* シーン遷移
* 効果音生成
* それっぽいエフェクト
* フィールドサイズは2<b>1</b>×10
* 同時に消す列の数に応じて得点上昇
* 得点上昇に応じて落下速度上がり難易度変化
* ブロックのホールド機能
* ３つのNEXTブロック表示
* ハードドロップ機能
* テトリミノの種類の偏りを補正
* ブロック着地位置表示
ボタンクリックで取得したng-clickをスコープに反映させる。

#ソース
ボタンクリックして表示されたaタグ中のng-clickは動作しなかった。scopeの中に入ってるのに。

```html
<!DOCTYPE html>
<html ng-app="app">
<head>
  <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
    <script src="https://code.angularjs.org/1.4.9/angular-resource.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular-sanitize.min.js"></script>
</head>
<body ng-controller="getJsonCtrl">
  <button ng-click="getButton()">set button</button>
  <div ng-bind-html=trustClick></div>
  <script type="text/javascript">
  var app = angular.module('app', ['ngResource','ngSanitize'])
  app.controller('getJsonCtrl', ['$scope', '$sce', function($scope,$sce){
    $scope.getButton = function(){
          $scope.click = '<a ng-click=\"show()\">click1</a>'
          $scope.trustClick = $sce.trustAs($sce.HTML,$scope.click)
    };
    $scope.show = function(){
      alert('click!')
    }
  }])
  </script>
</body>
```
新しく表示されたng-click=show()がscopeに認識されないっぽい。

#カスタムディレクティブでcompile,link
ボタンクリックで取得したng-click=show()をcompile,linkでscopeに紐付けると、動作するようにはなった。

カスタムディレクティブ

```html
 <body ng-controller="scopeCtrl">
    <button type="submit" class="btn btn-primary" ng-click="getButton()">set button</button>
    <dir content="trustClick" ng-bind-html="trustClick"></dir>
 </body>
```

スコープを監視。変化があるともう一回スコープに反映させる。

```js
  app.directive('dir', function($compile, $parse) {
    return {
      restrict: 'E',
      controller:'scopeCtrl',
      link: function(scope, element, attr) {
        scope.$watch(attr.content, function() {
          var getter = $parse(attr.content);
          var clickFunc = getter(scope);
          element.html(clickFunc);
          var linkFn = $compile(element.contents());
          linkFn(scope);
        }, true);
      }
    }
  });
```
$scope.$applyで出来ないのかなー。また調べよう。もっとスムーズなやり方もあると思うので。
ってかangular2も触ってみたいなと。
demo作りました。
[plnkr demo](https://plnkr.co/Rk4A5LWqNKTHwKSdfDjE)
brew tap で入れる Homebrew 外部コマンド


## brew tap

brew tap は、公式以外の formula を追加することのできる Homebrew のサブコマンドです。

```sh
$ brew tap <userName>/<repository>
```

とすると、GitHub 公開リポジトリ (`https://github.com/<userName>/homebrew-<repository>`) が参照され、`/usr/local/Library/Taps`以下に取り込まれます。

```sh
$ brew tap <url>
```

とすると、GitHub 以外のリポジトリからも取り込むことが可能です。(HTTP/HTTPS である必要もありません)

```sh
$ brew tap
```

と打てば、既に取り込んだ taps の一覧を表示することができます。


## External Commands

[External Commands](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/External-Commands.md) にあるように、Homebrew は外部コマンドを取り込むことができます。取り込んだ外部コマンドは、`brew commands`を実行した時に"External commands"として表示されます。

```sh
$ brew commands
Built-in commands
...

External commands
...
```

brew tap で取り込むものが多いです。
有名どころを以下にいくつか記載します。


## [Homebrew Services](https://github.com/homebrew/homebrew-services)

- `launchctl`と連携させるための拡張です。

### インストール

`brew services` コマンドを初回実行する際に、自動でインストールされます。

### 使い方

```sh
# mysql を Homebrew でインストールしたとします
$ brew install mysql

# すると、Homebrew のコマンドとして mysql の状態管理をできます
$ brew services start mysql
$ brew services stop mysql
$ brew services restart mysql

# brew service で扱えるサービス一覧を表示します
$ brew services list
```


## [Brew Bundle](https://github.com/homebrew/homebrew-bundle)

- Ruby の Bundler のように、インストールしたいパッケージ一覧をファイルに記載するようにする拡張です。
- 以前は Brewdler と呼ばれていたみたいです。

### インストール

`brew bundle` コマンドを初回実行する際に、自動でインストールされます。

手動でやるなら

### 使い方

現在のディレクトリに `Brewfile` というファイルを用意して、インストールしたいパッケージを記載します。
(以下の例は GitHub の README からそのまま借用しています)

```Brewfile
cask_args appdir: '/Applications'
tap 'caskroom/cask'
tap 'telemachus/brew', 'https://telemachus@bitbucket.org/telemachus/brew.git'
brew 'emacs', args: ['with-cocoa', 'with-gnutls']
brew 'redis', restart_service: true
brew 'mongodb'
brew 'sphinx'
brew 'imagemagick'
brew 'mysql'
cask 'google-chrome'
cask 'java' unless system '/usr/libexec/java_home --failfast'
cask 'firefox', args: { appdir: '/Applications' }
```

そして、以下のコマンドで一括インストールします。

```sh
$ brew bundle
```

他にも次のような使い方ができます。

```sh
# 現在 Homebrew でインストールしているパッケージを Brewfile に全て書き出す
$ brew bundle dump
# Brewfile に書いていないパッケージを全てアンインストール
$ brew bundle cleanup
# Brewfile に記載のあるものでインストール・アップグレードすべきものを表示
$ brew bundle check
```


## [Homebrew-Cask](https://github.com/homebrew/homebrew-cask)

- バイナリ形式で配布されているMacアプリケーションをインストールするための拡張です。

### インストール

昔は Homebrew 公式とは別のところ (`caskroom/homebrew-cask`) から配布されていて、別途インストールが必要だったんですが、今は Homebrew 公式に取り込まれて、別途インストールの必要は (たぶん) なさそうです。

### 使い方

どうも `/usr/local/Caskroom/` にインストールされて、 `/Applications` にコピーが置かれるようです。

```sh
# パッケージを検索
brew cask search google
# パッケージの情報表示
brew cask info google-chrome
# パッケージの homepage を表示
brew cask home google-chrome
# インストール
brew cask install google-chrome
# アンインストール
brew cask uninstall google-chrome
# インストール済みのものを表示
brew cask list
# 不要なダウンロード済みファイルを削除
brew cask cleanup
```
Ruby書いててあれ、これどうなるんだっけってなったやつら


rubyでプログラミングしてて、あれ、これどうなるんだっけってなったもの達をメモしていきます。

### 1, ブロックの外とブロック変数で同じ名前の変数を使う

例えば、以下は、出力は3になる。

```rb
num = 0

3.times do
  num += 1
end

p num
```

しかし、これはどうだろう

```rb
num = 0

3.times do |num|
  num += 1
end

p num
```

これは結果は0になる。ブロック変数numと外のnumは別物として理解される。


### 2, rangeのドットが３つ

下の２行、どうなるだろう。

```rb
p (1..3).to_a
p (1...3).to_a
```

結果は、

```
#=> [1,2,3]
#=> [1,2]
```

ドット３つでレンジオブジェクトを作ると、最後の要素を含まない。
ActiveRecordでこれを使うとbetweenで最後の要素を取得しないクエリーを作るときに便利です。


### 3, Hash#delete_if とHash#reject
２つとも、ブロックを受け取ることで、trueを受け取った要素を削除するメソッド。(それぞれ反対にあるメソッドは、keep_if, select)

しかし、これらが微妙にやっかい。

```delete_if.rb
h = {a: 10, b: 20, c: 30}

h.delete_if {|k, v| v < 20}

p h
#=>{b: 20, c: 30}
```
delete_ifはレシーバを破壊する。


```reject.rb
h = {a: 10, b: 20, c: 30}

h.reject {|k, v| v < 20}

p h
#=>{a: 10, b: 20, c: 30}
```
rejectはレシーバを破壊しない。
しかし、rejectはbangがある。

```reject_bang.rb
h = {a: 10, b: 20, c: 30}

h.reject! {|k, v| v < 20}

p h
#=>{b: 20, c: 30}
```

つまり、

delete_if = reject!
keep_if = select!

delete_if、keep_ifはそれだけで破壊的、rejectとselectは!をつけて破壊的になる。


### 4, ブロックを渡すメソッドの引数のカッコ省略

do end　はカッコ省略可能、 {}はカッコ省略できない。

```rb
[1,2,3].inject 0 do |i, e| i + e * 2 end
#=> 12

[1,2,3].inject 0 { |i, e| i + e * 2 }
#=> error
```


これからどんどん見つけたら追加します〜
windowsでPHPでSelenium webdriverを使ってブラウザテスト

#windowsでPHPでSelenium webdriverを使ってブラウザテスト

##事前準備
composerがインストール済み
Javaがインストール済み
PHPがインストール済み

##手順
1. Selenium Serverを立ち上げ、nodeを登録

selenium-server-standalone-2.52.0.jarがあるディレクトリまで移動して下記コマンドを実行

```shell-session
C:\D\selenium>java -jar selenium-server-standalone-2.52.0.jar -role hub -port 4445
C:\D\selenium>java -jar selenium-server-standalone-2.52.0.jar -role node  -hub http://localhost:4445/grid/register
````

2.　phpunit, facebook/webdriverをcomposer経由でインストールする
テストコードがあるディレクトリまで移動して下記コマンドを実行。
facebook/webdriverでPHPでseleniumを実行できる

```shell-session
composer require phpunit/phpunit
composer require facebook/webdriver
```

3.　テストスクリプト(webTest.php)を書く

```webTest.php:php
<?php
use Facebook\WebDriver;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\Remote;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;

class webTest extends PHPUnit_Framework_TestCase
{
    public function testWebUI()
    {
        //hostの登録
        $host = 'http://localhost:4445/wd/hub';
        //どのブラウザを使うか設定
        $driver = RemoteWebDriver::create($host, DesiredCapabilities::firefox());
        //テストするサイトに移動
        $driver->get('http://192.168.33.51/');
        //idがtest-idの要素を取得
        $testId = $driver->findElement(
  			WebDriverBy::id('test-id')
		);
	
	    //test-idのテキストを取得する
	    $text = $testId->getText();
        //期待値とあっているかのテスト
 	    $this->assertSame('Expected', $text);
        //ブラウザを閉じる
        //$driver->close();
    }
}
```

テストに使用するページのtest-idのDIVのテキストはtest-valueとする

```html
<div id="test-id">test-value</div>
```

4.　テストの実行
テストスクリプトがあるディレクトリまで移動して下記コマンドを実行

```shell-session
C:\D\vagrant\laravel51\selenium>vendor\bin\phpunit webTest
PHPUnit 5.2.5 by Sebastian Bergmann and contributors.

F                                                                  1 / 1 (100%)

Time: 29.34 seconds, Memory: 2.50Mb

There was 1 failure:

1) webTest::testWebUI
Failed asserting that two strings are identical.
--- Expected
+++ Actual
@@ @@
-Expected
+test-value

C:\D\vagrant\laravel51\selenium\webTest.php:23

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
```

テストした値はtest-valueで期待値がExpectedなのでNG

成功版は下記

```shell-session
C:\D\vagrant\laravel51\selenium>vendor\bin\phpunit webTest
PHPUnit 5.2.5 by Sebastian Bergmann and contributors.

.                                                                  1 / 1 (100%)

Time: 15.56 seconds, Memory: 2.50Mb

OK (1 test, 1 assertion)


```