OmniAICreator/Qiita-1.07M huggingface dataset:
押すとごちうさが再生されるボタン

まずは成果物
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">辛いときに押すとごちうさが再生されるボタンを求めて <a href="https://t.co/7fQy2VvFNz">pic.twitter.com/7fQy2VvFNz</a></p>&mdash; rerofumi (@rerofumi) <a href="https://twitter.com/rerofumi/status/806191190697656320">2016年12月6日</a></blockquote>

目指す物
=====

Amazon Dash ボタンが日本でもリリースされて話題です。
ボタンワンプッシュで欲しいものは何ですか？トイレットペーパー？フルグラ？
それよりも求められているのはボタン1つでごちうさが視聴できる事ではないでしょうか。
辛いときにワンプッシュでごちうさが再生されれば QOL もうなぎ登りというものですよ。

作るもの
=====

PC に繋がったボタンを押すことでビデオが再生されるものを作ります。
動画については Amazon プライムビデオの見放題コンテンツを利用しました。ブラウザで Amazon プライムビデオの再生を開始できれば良いのですね。

##再生実験

Amazon プライムビデオのページを表示して再生ボタンに振られているリンクURLを取得します。
![www.amazon.co.jp_2016-12-08_23-08-50.jpg](https://qiita-image-store.s3.amazonaws.com/0/50737/97d67b57-9408-8de4-4397-bb9923a1f171.jpeg)

```
https://www.amazon.co.jp/dp/**********?autoplay=1
```
みたいな感じのURLになっていると思います。
これをブラウザで開けばごちうさの再生が始まることが確認できます。

##シェルから開くには

プログラムからの制御でブラウザを起動して上記 URL を表示するにはどうすれば良いのでしょうか。
Windows の場合はコマンドラインから

```
start [url]
```

と入力することで行えます。
MacOS の場合はターミナルから

```
open [url]
```

となります。firefox で開きたい場合はアプリ名を指定して

```
open -a firefox [url]
```

## 外部ボタンの作成

目指すのは Amazon dash のようなボタン、というところから始まったので IoT 的なガジェットを利用するのが正解だと思います。
今回は短時間で試すために USBシリアルで接続したマイコンを使いました。シリアルポートでボタンが押された情報を受け取りますので、SPP 対応の Bluetooth モジュールで差し替えられると思います。
本当は Bluetooth モジュールで無線ボタンを作りたかったのですが、手軽に接続できるのが手元になかったので有線になってしまいました。その分電源が USB から取れたので結果としては楽でした。
![DSC_0101.jpg](https://qiita-image-store.s3.amazonaws.com/0/50737/051d2365-7efb-cbbc-0469-1cd3c205e2cc.jpeg)

マイコン基板は自作の「つみょん」基板を使っています。(非売品)
![DSC_0102.jpg](https://qiita-image-store.s3.amazonaws.com/0/50737/74c322d0-6f0a-61c1-bf0b-65442441f3d0.jpeg)

チップは PSoC4 でソースコードだけ公開しても意味がないので省略します。

ボタン側のプログラムは、ボタンが押されたら LED を 3秒間ほど点滅させながらシリアルポートに ```010``` の 3バイトを送信します。前後の 0 は通信安定化のためで無視します、```1``` が PC に届いたら反応するように作ります。


ごちうさハンドラーの作成
=====

PC 上でボタンを読み取り、押されていたらブラウザを起動するプログラムを作成します。

各要素の接続は

ボタン読み取りマイコン - USBシリアル変換 - シリアルポート - ハンドラープログラム → ブラウザ起動

といった感じになります。

## プログラムの作成

プログラムはざっくりと go言語で書きました。小物を書くときにさらさらと go で書けるようになりたいです。

```go:gotibutton.go
package main
import (
    "fmt"
    "github.com/ohisama/serial"
    "os/exec"
)
func main() {
    device := "COM3"
    baud := 9600
    fmt.Println("open", device, "at", baud)
    port, err := serial.Open(device, baud)
    if err != nil {
        fmt.Println("open failed:", err)
        return
    }
    defer port.Close()
    fmt.Println("ready")
    buf := make([]byte, 100)
    for ;; {
        n, err := port.Read(buf)
        if err != nil {
            fmt.Println("serial read error:", err)
            break
        }
		 for i:=0; i<n; i++ {
            fmt.Println("read ->", string(buf[i]))
            if buf[i] == '1' {
                fmt.Println("exec!!")
                exec.Command("cmd", "/c", "start", "https://www.amazon.co.jp/dp/********/?autoplay=1").Start()
            }
        }
    }
}
```

COM ポート番号がコードの中にハードコートされているのがダサいですね。

これを起動しておいて、USBシリアルで繋いだボタンを押すとごちうさが再生開始します。やったね。


今後の展開
=====

有線接続だとやはり雰囲気が出ません。ここは無線化するのが筋でしょう、Dash ボタンをハックするのが流行っぽいですし。
そのへん今はやりの IoT デバイスで実装してみてください。ESP-WROOM-02 や FlashAir を使って Wi-Fi 化するのも良いかもしれません。


みなさんも是非作って幸せになりましょう。
画像のアップロード上限に気をつける

Qiitaに初めて投稿しようと意気揚々と画像を下書きにアップしていたら、投稿数が0件だと月間2MBだった。
画像のサイズに気をつけてアップする。
ちなみに1件でも投稿すると、100MB上限になるらしい。
Excelのvbaでロックしたセルを塗りつぶしてみた

```vbnet
'(参照)『保護をした後にセルの塗りつぶしの色を変えたい』（くどう） 
'http://www.excel.studio-kazu.jp/kw/20050615120953.html
'Excel2013のマクロの記録で作成しました。
Sub aaa_Excelのロックしたセルを塗りつぶし()
    ActiveSheet.Unprotect
    Range("A1").Select
    Cells.Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=CELL(""protect"",A1)=1"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent6
        .TintAndShade = 0.799981688894314
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
        AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
        :=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
        AllowDeletingRows:=True
    Range("A1").Select
    ActiveSheet.Protect
End Sub
```
CentOS7.2にgcsfuseをインストールしてGCSをマウントしてみた


はじめまして、カラフルボードのbitchalです。
AIの研究からシステムへの実装まで、色々やっています。

AIで使用するファイルには何かとサイズが大きいものがあり、
いろいろな場面で制約を受けることがあります。

そんなとき、GCSをマウントしておくと便利なことがあります。

###gcsfuseをインストール
***
```
$ sudo vi /etc/yum.repos.d/gcsfuse.repo
```

```
[gcsfuse]
name=gcsfuse (packages.cloud.google.com)
baseurl=https://packages.cloud.google.com/yum/repos/gcsfuse-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
```

```
$ sudo yum install gcsfuse
```


####mount
***
```
$ gcsfuse {bucket-name} /path/to/mount
```
####unmount
***
```
$ fusermount -u /path/to/mount
```


####インスタンス起動時に自動でマウントしたい
***
/etc/fuse.confに権限を追加します。
```
user_allow_other
```

systemdの設定をします。
```
$ sudo vi /etc/systemd/system/gcsfuse-mount.service
```

```
[Unit]
Description=A user-space file system for interacting with Google Cloud Storage
After=systemd-networkd.service

[Service]
Type=simple
Environment=PATH=$PATH:/opt/bin:/bin
ExecStart=/bin/gcsfuse -o allow_other -file-mode=777 -dir-mode=777 --foreground {bucket-name} /path/to/mount
ExecStop=/bin/fusermount -u /path/to/mount/
User={username}

[Install]
WantedBy=multi-user.target
```


###書き込み権限
***
マウントしたディレクトリにファイルを作成しようとしてエラーになったら、確認してください。
<img width="353" alt="スクリーンショット 2016-12-08 22.33.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/104992/98b0a11e-48e9-790d-ab03-a6d012b50371.png">



###参考
***
・gcsfuseをインストール
https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/installing.md
・先人に学ぶ
http://qiita.com/sh_cs/items/d941854ad324fe9d86f7
RailsからnpmでinstallしたCSSを使う

## About
タイトルそのまま。自分用メモ。

## 環境
- Rails 5.0.0.1
- npm 3.9.3

## node_moduleをinstallする
今回はこちらのprogress barを導入したい。

https://github.com/NigelOToole/progress-tracker/

```
$ npm init -y
$ npm install progress-tracker --save
```

## RailsからCSSを使えるようにする

- assetsにpathを追加する

```config/initializers/assets.rb
Rails.application.config.assets.paths << Rails.root.join('node_modules')
```

- importしてやる

```app/assets/stylesheets/application.css.scss
@import "progress-tracker/app/stylesprogress-tracker.scss";
```

これであとはRails側で呼び出せば良い。

## 追記
importがいいとかrequireがいいとかはまだよくわかってない。


## 参考
- https://programming.wikihub.io/@r7kamura/20160428211223
getrpimodel: Raspberry Pi の model (A, B, B+, B2, B3, etc) を python で認識

#(2021.06.18)フランス語訳
以前から Qiita に書いた記事って以外と[グローバルに読んでいただけてる](https://qiita.com/UedaTakeyuki/items/cce2a414eab9487e1249)なぁと思ってたのですがなんと、本稿を[フランス語訳](https://linuxtut.com/fr/ad3e3518452a9d6832d0/)してブログにあげてくださってる方がいらっしゃってビックリしました

当方、そもそもフランス・ヲタなので喜んで読んじゃったのですが、自分が書いた文章の外国語訳ってこんなにも読みやすいものなのですね、村上春樹とかいつもこんな思いしてるんでしょうか

自分の知らない所で訳されて知らない所で読んでいただけてるって、まるでポール・グレアムにでもなったみたいな気分でちょっと誇らしいです ^^/

#始めに
予期せず RPi 3 を入手した(ebay で RPi 2 を買ったらなぜか RPi 3が届いた)のですが、これまで作ってきたプログラムが色々とうごきません ^^;;; 11月24日から今日までの２週間ちょっとで気がついた範囲でも

- tty が ttyAMA0 じゃなくて ttyS0 になっている
- /sys/class/leds/led1/ がなくなってて、赤LED を shell でつけたり消したりできない

RPi 3 かどうかを認識して処理を変えないといけないところがいくつかありそうです

ということで、どうせなら後々も使えるように[こちらでも](http://qiita.com/UedaTakeyuki/items/c5226960a7328155635f)補足でご報告させていただきましたとおり[getpimodel](https://github.com/UedaTakeyuki/getrpimodel)というパッケージを作りました
その際はあまり親切でない簡潔な報告ですませてしまっておりましたので、僭越ながらこちらで再度、詳細をご報告させて頂きました次第です

つきましては効率的でない部分や間違っている所など有りましたら忌憚のない御指導・御指摘をいただければ大変ありがたく、すみませんがよろしくお願いいたします次第でございます

#インストール

```bash:
pip install getrpimodel
```

# 使い方 
## python programとして

```bash:
python -m getrpimodel [--s] 
```

## python ライブラリとして

```python:
import getrpimodel

print (getrpimodel.model())
print (getrpimodel.model_strict())
```

# 戻り値
[こちらのテーブル](http://elinux.org/RPi_HardwareHistory)の「model」列の文字列からカッコ書きの部分を除いたもの(--s や、model_strict()ではカッコ書きもそのまま）
具体的には B とか A とか B+ とか。--s や model_strict() だと B (Beta) とか

# ロジック
[こちらのテーブル](http://elinux.org/RPi_HardwareHistory)に従ってチェックしてます

# コード
[こちら](https://github.com/UedaTakeyuki/getrpimodel)で公開させていただいております

#コード使用例
[こちら](https://github.com/UedaTakeyuki/slider/blob/master/mh_z19.py)で、こんな感じでつかってます

```python
import getrpimodel

# setting

if getrpimodel.model() == "3 Model B":
  serial_dev = '/dev/ttyS0'
  stop_getty = 'sudo systemctl stop serial-getty@ttyS0.service'
  start_getty = 'sudo systemctl start serial-getty@ttyS0.service'
else:
  serial_dev = '/dev/ttyAMA0'
  stop_getty = 'sudo systemctl stop serial-getty@ttyAMA0.service'
  start_getty = 'sudo systemctl start serial-getty@ttyAMA0.service'```
```

#PyPI
[こちら](https://pypi.python.org/pypi/getrpimodel/0.1.3)に登録させていただきました

#謝辞
PyPI に登録する方法を[こちら](http://qiita.com/edvakf@github/items/d82cd7ab77ea2b88506c)を参考にさせていただきました。大変参考になり、感謝いたしました次第です

#感想
getrpimodel、地味に便利です
Roots -Sage 9.0.0-alpha.4をいじった時のメモ

wordpressテーマ、roots・sage
何気に個人的には、一番使いやすいバージョン使用する時のメモ。 
[sage](https://roots.io/sage/)

要件

* PHP >= 5.6.4
* Composer
* Node.js >= 6.9.x
* Yarn  


インストールする場所に移動して
your-theme-nameはテーマ名に変更

```
# @ app/themes/ or wp-content/themes/
$ composer create-project roots/sage your-theme-name dev-master
```

ヴァージョン変えるときは...
https://github.com/roots/sage/releases/

```
$ composer create-project roots/sage your-theme-name 9.0.0-alpha.4
```

テーマファイル

```
@ themes/your-theme-name/
$ yarn
```  




assetsにあるconfig.jsonの書き換え

devUrlをサイトのurlに
```"devUrl": "https://project-name.dev",```
publicPathにテーマのパスを
```"publicPath": "/wp-content/themes/sage"```

ビルドコマンド

```
//ファイルが変更されたときにアセットをコンパイルする、Browsersyncセッションを開始する
$ yarn run start 

//assetsディレクトリのファイルをコンパイルして最適化する
$ yarn run build
//圧縮
$ yarn run build:production
```

よく触るところ

```
└── assets
    ├── config.json
    ├── scripts
    │   └── main.js
    │
    ├── styles
    │   ├── main.scss
    │   └─── commom
    │        ├── _global.scss
    │        └── _variables.scss
    ├── templates
    ├── functions.php
    └── src
         ├── admin.php
         ├── filters.php
         ├── helpers.php
         └── setup.php
```

#### main.js
jsファイル読み込む時など

#### main.scss
scssを読み込む時

#### global.scss
書き込む時

#### _variables.scss
bootstorapなどの変数定義

#### srcフォルダ
ウィジットや初期設定の定義のファイルがある

***
上書き用

* [bootstrap4でデザインしたヤーツ。](https://github.com/noboo/wp-plane-tpl)
* [bootstrap4でデザインしたwoocommerceなヤーツ。](https://github.com/noboo/wp-woo-tpl)
遺伝的アルゴリズムでナンプレが解きたい(前編)

#どうしても遺伝的アルゴリズムがしたかった
本稿は、遺伝的アルゴリズムを用いてナンプレを解く方法について、実装までを記録したものである。

#ナンプレって何？
3×3のマス目からなるブロックに1～9の数字を重複なく入れる。
その3×3が9個集まって正方形になる。
正方形の9マスの行・列に数字が重複しないようにするゲーム。
あとは[検索してください。](https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC)

#遺伝的アルゴリズムって？
問題に合わせた**遺伝子**情報を作る。
遺伝子を**評価**して強い遺伝子どうしを**交叉**させて次の世代をつくる。
たまに**突然変異**するとものすごく強くなったり弱くなったりする。
「俺の屍を越えてゆけ」システムでだんだん強い遺伝子だけに淘汰されるよねっていうアルゴリズム。
あとは[検索してください。](https://ja.wikipedia.org/wiki/%E9%81%BA%E4%BC%9D%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)

#実装

###個体情報
今回は個体中に**9×9の二次元配列**で表現された遺伝子を登録する。各遺伝子には1～9までの数字が入り、個体はナンプレのルールに従って自分の**「スコア」**を知ることができ、これを評価値とする。
個体が持つ機能は以下のとおり。
- 生成・・・ランダムな遺伝子を持つ自身を生成する
    - 個体の「お手本」が引数にあれば、その遺伝子情報をコピーする
- 評価・・・自分自身を評価する。
- 組換・・・指定部分の遺伝子情報を送信したり、変更したりする

###ブレンダー
各個体を管理し、それらの交配を決定する**ブレンダー**を導入する。
ブレンダーは決められた個数の個体を生成し、それらの世代交代を実行する。
ブレンダーが持つ機能は以下のとおり。
- 生成・・・指定個数の個体を生成する
- 交配・・・新しい世代を作る
    - 選択・・・親となる個体を選ぶ
    - 交叉・・・決められた操作により、2つの親から新しい子をひとつ作る
    - 変異・・・極わずかな確率で、交叉により得られた子の遺伝子情報を変異させる

###評価
今回は、遺伝子を9×9のマス目に見立てて、ナンプレのルールに従って評価した。
①ブロックの評価
　**「同じブロック内に同一の数字が入らないようにする」**というルールに従っっているかを判断する。1ブロックに10点を割り振り、そこに同じ数字が入っていたら、**同じ数字の個数だけ減点**を行う。
　例：
　　　111
　　　456
　　　789　→ 10点 - 3点 = 7点

　　　111
　　　111　
　　　111　→ 10点 - 9点 = 1点
　各遺伝子に9個のブロックがあるので、①は**90点満点**で評価する。
②行・列の評価
　**「同じ行・列に同一の数字が入らないようにする」**というルールに従っっているかを判断する。①と同様に、各行・列に10点を割り振り、**同じ数字の個数だけ減点**する。
　各遺伝子に9+9=18の評価行・列があるので、②は180点満点で評価する。

①，②の評価の合計を、270点満点で評価した。

###選択について
ある世代の子の中から、ルーレット方式で親を2個体選び出す。
スコアを次々に足し合わせた合計の**ルーレット**を作り、0～合計間の乱数をダーツの**矢**とする。
矢の示した位置にある個体を親として選択し、これを親の個数だけ繰り返す。

###交叉について
交叉は一様交叉を選択した。新しくできる子の81個の遺伝子それぞれについて、同じ場所の遺伝子を、親の中からランダムに選んで採用する。

###変異
5%の確率で子に突然変異が起きる。突然変異が起きると、子のランダムに選択された1箇所の数字がランダムに変化する。

#結果
子の個数20,親の個数4,世代交代回数を100として実験した。
子の評価値の平均は200/270点で、およそ74点。70個の重複があるということは、ナンプレを解こうと思ったらかなり低い数値である。ランダムに生成した個体の評価値平均もおおよそ同じ数になる。
一様交叉はナンプレのような「よい遺伝子のかたまり」を容易に破壊してしまうので、パラメータを変化させても良い結果は出ないだろう。改良時は交叉方法を吟味したい。

#おわりに
とりあえず形になったのでメモ書き程度に。。。今後追記をして、多少マシな遺伝子を作っていきます。
TypeScript 2.1 で setState() が型安全になるぞー

[昨日 TypeScript 2.1 がリリースされました。](https://blogs.msdn.microsoft.com/typescript/2016/12/07/announcing-typescript-2-1/)リリースされるの早いなあと思いながら眺めていたのですが、興味深い機能が追加されました。 `Partial<T>` 型です。

`Partial<T>` 型は、T型のフィールドを全てオプショナルにした型です。

たとえば次のような `T1` があったとき、

```ts
interface T1 {
  n: number;
  s: string;
}
```

`Partial<T1>` は次と等価になります。

```ts
// Partial<T1> 型はこんな感じ。
{
  n?: number;
  s?: string;
}
```

これのどこが便利なの？と疑問に思うかもしれませんが、 React の `setState()` を的確に表現できるようになるのです。
`setState()` の引数に渡すのはまさに `Partial<State>` 型です。
今までは cast (type assertion) してウソをついて過ごしてきましたが、これからは正々堂々と生きていくことができます！

[DefinitelyTyped には既に PR があがっています。](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/13155)

```diff
-        setState(f: (prevState: S, props: P) => S, callback?: () => any): void;
-        setState(state: S, callback?: () => any): void;
+        setState(f: (prevState: S, props: P) => Partial<S>, callback?: () => any): void;
+        setState(state: Partial<S>, callback?: () => any): void;
```

早く merge されるといいですね！

ちなみに `Partial<T>` は同じく 2.1 から追加された [`keyof` と lookup 型を利用して宣言されています](https://github.com/Microsoft/TypeScript/blob/fb23e6dba1e79c2c13f116299756062ee36cbf09/lib/lib.d.ts#L1366-L1371)。

```ts
/**
 * Make all properties in T optional
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};
```

`typeof T` はTのキーとなる文字列リテラル型の直和型となるようで、こちらも何かの時に便利そうです。
Kobitoでタグの先頭文字を勝手に大文字にするのをやめてほしい


Kobitoを使っていると、タグの最初の文字が勝手に大文字にされてしまいます。
そのせいで、iPhone、jQuery、iOSといったタグを入力しづらいです。

![スクリーンショット_2016-12-08_23_17_12.png](https://qiita-image-store.s3.amazonaws.com/0/74551/79ce5502-ecbe-e50b-db78-860fd08e54a2.png "スクリーンショット_2016-12-08_23_17_12.png")

Qiitaのwebエディタのように、勝手に大文字にしない仕様にしてほしいです。
Windows にて unsafe な呼び出しをくるんで Rust の世界で扱う

# はじめに

Rust Advent Calendar 12/8 の記事です。

> 要求された空間や時間内での動作、 デバイスドライバやオペレーティングシステムのような低レベルなコードなど他の言語が苦手とする多数のユースケースを得意とします。

[プログラミング言語Rust](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/) より

このうたい文句にやられ、9月くらいから Windows API を Rust で呼び出して、パフォーマンス情報を取得するようなコードを書いていました。
[ROki1988/perf_client](https://github.com/ROki1988/perf_client)  

Windows API の呼び出しについては、すでにあった [retep998/winapi-rs](https://github.com/retep998/winapi-rs) を使っています。
で、``winapi-rs`` は unsafe な関数たちです。  
このコードたちをどう Rust の世界へ引き込んだらいいんだろう、と考えたりしたので、
そちらについて触れていきます。

# Wrapper を書く

結論として、Wrapper 関数を書くことで対応しました。  

```Rust
fn pdh_open_query() -> Result<winapi::PDH_HQUERY, winapi::PDH_STATUS> {
    use std::ptr;
    let mut hquery = winapi::INVALID_HANDLE_VALUE;
    let ret = unsafe { pdh::PdhOpenQueryW(ptr::null(), 0, &mut hquery) };

    if winapi::winerror::SUCCEEDED(ret) {
        Ok(hquery)
    } else {
        Err(ret)
    }
}
```

上記関数はパフォーマンスカウンターの値を取得する PDH* 関数の1つになります。
``pdh::PdhOpenQueryW`` が ``winapi-rs`` にて定義されている関数です。

書いたり消したりしながら、以下の方針が形になってきました。

* Wrapper 関数内で ``unsafe`` を完結させる
  * かつ ``unsafe`` の範囲をなるべく小さくする
* 結果は ``Result`` の文脈で包む
  * かつ Wrapper 関数のエラーの型は ERROR_CODE でそろえる

たぶん当たり前のこと書いてますw けどそろえることが大事、としました。
これで Wrapper 関数の呼び出し元では Rust の世界でコードを書いていけます。

```Rust
impl<'a> Iterator for PdhControllerIterator<'a> {
    type Item = PdhCollectValue;

    fn next(&mut self) -> Option<Self::Item> {
        if self.index == 0 {
            pdh_collect_query_data(self.pdhc.hquery);
        }

        let item = self.pdhc
            .items
            .get(self.index)
            .iter()
            .flat_map(|c| {
                pdh_get_formatted_counter_value(c.hcounter, PDH_FMT_DOUBLE)
                    .map(|v| PdhCollectValue::new(&c.element, v))
            })
            .last();
        self.index += 1;
        item
    }
}
```

上記コードでは  ``pdh_collect_query_data`` と ``pdh_get_formatted_counter_value`` が Wrapper 関数にあたります。  
``unsafe`` は一切見当たらず、Rust の世界で関数をつなげながら、ガシガシ書いていけました。  

具体的には Drop トレイトを実装してハンドルの開放をしたり、Iterator トレイトを実装して map で値を取り出せるようにしたりしました。
いやぁ楽しい!

# おわりに

Wrapper 関数を書くのは少し手間ですが、Rust の世界の呼び出し元では心地よくコードがかけました。
うたい文句にやられてよかったです。
指定した複数ウェブサイトのスクリーンショットを自動で撮影(Ruby+Selenium)

# はじめに

私は趣味でいろいろな高専のウェブサイトを定期的に巡回しているのですが，ここ数ヶ月はリニューアルがピークで，自動的にそれを検知してほしくなってきたため，とりあえず自動でスクリーンショットを撮ってくれるスクリプトを組みました。

# 環境

* MacBook Pro (Retina 13-inch、Early 2015)
* Ruby2.3.1

# 下準備

1. `gem install selenium-webdriver` する
2. 環境にあった [Geckodriver](https://github.com/mozilla/geckodriver/releases) をダウンロードする
3. 適当な場所で2.を解凍し，その場所にpathを通す

# プログラム

```rb
#!/usr/bin/ruby

require 'selenium-webdriver'
require 'json'

# 日付取得
day = Time.now

# 画像ディレクトリ
image_path = "./img/#{day.strftime('%Y%m%d')}"
# ディレクトリを作成
FileUtils.mkdir_p(image_path) unless FileTest.exist?(image_path)

# urlファイル
file = File.read('url.json')

# urlファイル読みこみ
hash =  JSON.parse(file, {:symbolize_names => true})

# seleniumのインスタンス生成
driver = Selenium::WebDriver.for :firefox

# スクリーンショット撮影
hash.each do |number, school|
  school.each.with_index(1) do |description, count|
    name = description[:name]
    url = description[:url]
    begin
      driver.get url
      driver.save_screenshot "#{image_path}/#{format('%02d', count)}_#{name}.png"
    ensure
      p "[Error] #{format('%02d', count)}_#{name}"
      next
    end
  end
end

# ブラウザを閉じる
driver.quit
```

（勢いで書いたので決してきれいなコードではありません…）
画像の保存先や，JSONファイルのパスは適宜変更してください。
このスクリプトを実行すると， `./img/#{日付}/#{連番}_#{JSONのname}.png` が保存されます。もしもエラーがあった場合はそのウェブサイトのスクリーンショットは取得されず，コンソールでエラーが表示され，次のサイトのスクリーンショット取得フェーズに移行します。

JSONファイルの形式は以下のようにしてください。

```json
{
  "items": [
    {
      "name": "函館高専",
      "url": "http://www.hakodate-ct.ac.jp/"
    },
    {
      "name": "苫小牧高専",
      "url": "http://www.tomakomai-ct.ac.jp/"
    },
    {
      "name": "釧路高専",
      "url": "http://www.kushiro-ct.ac.jp/"
    },
    {
      "name": "旭川高専",
      "url": "http://www.asahikawa-nct.ac.jp/"
    }
  ]
}
```

# まとめ

このサンプルでは愚直にスクリーンショットを取得するだけですが，Selenium界隈はまた奥が深そうですので，よりよい方法を探していきたいと思います。ちなみに現在54のサイトを巡回していますが，すべてのスクリーンショット取得に5分程度かかるため，もう少し改善したいところです（ネットワークの回線速度にも依存するでしょうが）。
さらに，Javascriptを使用しているウェブページではページ全体のスクリーンショットが取得されるのに対し，そうでないサイトでは1280*841のサイズのスクリーンショットが取得されるため，改善が必要だと思われます…。

# 参考

* [Selenium WebDriverでFirefox47を動かす方法](http://qiita.com/yssg/items/a054d67bc7c7fc39b276)
* [elenium + ruby 2.3 でchrome操作](http://qiita.com/hirohiro77/items/8dee178feebd4a9f9c4b)

#更新履歴

2016.12.09 誤記修正(Special Thanks @scivola !!)
2016.12.08 公開
gemビルドしようとして `The validation error was 'yourgem-x.y.z contains itself (yourgem-x.y.z.gem), check your files list` と出たとき 

これは [pepabo Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/pepabo) 8日目の記事です。

docker環境で動かしているredashをマイグレーションする話を書こうと思っていたら、[一緒にやった人に先に書かれてしまう](http://buty4649.hatenablog.com/)というアクシデントがおこり、どうしようと思いながらこんな時間になってしまいました。

今回の記事の内容は、**gem開発の流儀ややり方を知ってる人はほとんどハマることはない問題**です。それ故にあまり情報がないので、アドベントカレンダーのネタにすることにしました。

## 社内向けのgemをインストールしようとして失敗した

ペパボでは、社内向けのcliツールをgemとして開発し、GitHub Enterpriseからcloneして`rake install`するような運用をしているものが幾つかあります。

数日前に、たまたまその1つを使おうと思ってcloneして、`bin/setup`(または`bundle install`)をするとタイトルのようなエラーメッセージが出てきました。(ディレクトリやgem名はマスクしています)

```
$ bin/setup

bundle install
+ bundle install
You have one or more invalid gemspecs that need to be fixed.
The gemspec at /your/gem/src/location is not valid. Please fix this gemspec.
The validation error was 'your_gem-x.y.z contains itself (your_gem-x.y.z.gem), check your files list'
```

下から2行目のエラーメッセージは、gemを作ったことのある人ならよく見ることになる(？)、gemspecファイルにエラーがあるときに出るメッセージですね。
そして、一番下のメッセージは自分自身のgemパッケージがファイルリストに含まれてるよ〜と言っています。

## gemspecファイルを見てみる

gemspecには、gemをパッケージングするときにどのファイルを含めるか、定義する部分があります。`bundle gem`コマンドで雛形を作った場合は、以下のようになっています。

```ruby
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
```

つまり、含めるファイルは`git ls-files`コマンドを使って調べるわけですね。

bundlerのgemの雛形を使う限りは、`.gem`ファイルは`pkg`ディレクトリの中に生成されて、それは`.gitignore`で除外されていまるので、今回問題となったようなエラーは起きないようになっています。

## エラーの原因: `pkg`以外に`.gem`がコミットされていた

これでエラーが起きる原因がわかってきました。cloneしてきたディレクトリをみてみると確かに.gemが入っていることがわかったので、これを消せばいいとわかります。

最後に1点。前述の通り、gemspecの中では、`git ls-files`コマンドを使ってファイルをリストアップします。そのため、rmコマンドなどでファイルを消すだけでなく、`git rm`等でgitの管理下からも外してあげないといけません。

## まとめ

知ってる人が慣れた手順でやる分には、このような問題が起きることがないような仕組みになっています。(rubygems & bundler ありがとうございます！)

一方で、何かの手違いだったり、gemを作る練習の過程でこのような問題が起きることがあるかもしれないので、見慣れないエラーメッセージを見たときに、この記事のことを思い出していただければと思います。
Unityからマウスカーソルを操作する

# Unityからマウスカーソルを操作してみる
（あるいは Win32 APIの利用について / デスクトップマスコット風プロ生ちゃん添え）
<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">Unityでデスクトップマスコット風プロ生ちゃんを作ってみました。<br><br>マウスカーソルをUnityから操作するテストです。<br><br>ファイルはこちら。<a href="https://t.co/jaqEarFefT">https://t.co/jaqEarFefT</a> <a href="https://t.co/bvRMIGJs7t">pic.twitter.com/bvRMIGJs7t</a></p>&mdash; キルロボ (@kirurobo) <a href="https://twitter.com/kirurobo/status/806853409886220289">2016年12月8日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

プロ生ちゃん Advent Calendar 2016 に空きがありましたので "マウスカーソルを引き寄せる能力をもったデスクトップマスコット風プロ生ちゃん" を作って載せてみました。

Windows専用です。下記からダウンロードできます。
https://github.com/kirurobo/UnityWindowController/releases/download/Ver.0.1.0/Demo_PronamaChanDesktop_Win32.zip

（ただ、環境によっては起動直後に真っ白になってしまうかも。そのときは[End]か[Home]を2回押すとたぶん表示されます。）
（また、ウィンドウ枠がないデスクトップマスコット風ですが、実際には矩形のウィンドウがありますので後ろは操作できなかったりします。）

中身はUnityパッケージでも置いておこうと思いますが、一部ユニティちゃんのモーションを使っていたのでライセンス的に公開できるかどうかわからず本日時点ではまだ用意できていません m(__)m
後日公開したいと思います。

プロ生ちゃん要素は以上です。


発端は光輝さんの下記ツイートを拝見して、単にカーソル移動くらいなら前に作ったなーということで今でも Unity で動くか確認してみようということで試したものです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">マウスカーソル動かすunityアセットあるじゃん。<br>気付かず自作しちゃったよ。<br>しかし、あれで16＄か…。<a href="https://t.co/x0hzNkgcE1">https://t.co/x0hzNkgcE1</a></p>&mdash; 光輝@MR機器製作中 (@koukiwf) <a href="https://twitter.com/koukiwf/status/806033068595130368">2016年12月6日</a></blockquote>

デスクトップマスコット風プロ生ちゃんを起動してフォーカスがある状態で [Shift] キーを押すと、マウスカーソルを引き寄せます。

Win32 API でマウスカーソルを移動させるだけなら割合簡単で、Plugins フォルダに何か置いたりする必要もなく、下記のようなC#スクリプトを作成して、適当なものにアタッチさせれば動きました。
こんな感じで他の Win32 API 関数も呼べます。

```lang:CursorController.cs
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class CursorController : MonoBehaviour {

    [DllImport("user32.dll")]
    public static extern bool SetCursorPos(int x, int y);

    // Use this for initialization
    void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	    if (Input.GetButton("Fire1"))
        {
            SetCursorPos(400, 400);
        }
	}
}
```

ポイントは
・ using System.Runtime.InteropServices を入れる
・ [DllImpot("user32.dll")] で使う関数を書く
というところです。


マウスカーソル移動だけだとあまり実用性はありませんが、マウスボタン押下も組み合わせるとペイント上に落書きとかできるかもしれません。
（今回のプロ生ちゃんはカーソル移動しか入れられていませんが。）

ただ、ボタン押下になるともうちょっと色々と書かないといけません。

というわけでボタン押下や、ウィンドウを操作する関数、Aeroによるウィンドウ透過を含めてGitHubにて公開してあります。よろしければご覧ください。
https://github.com/kirurobo/UnityWindowController
私が作成した部分は Unlicense （パブリックドメイン相当）になっています。また、Wrapper/WinApi.cs もパブリックドメイン相当です。

---
2017/01/03 追記
起動時に真っ白になっていたことの対策や、モーションの修正をしたうえでソースを UnityPackage の形でも公開しました。
https://github.com/kirurobo/UnityWindowController/releases/
に Demo_PronamaChanDesktop.unitypackage としてアップしてあります。
OpalでWebアプリケーションをつくろう

この記事は[Opal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opal)の8日目の投稿として書いています。

今日はOpalで実際にWebアプリケーションを作る方法について書こうかと思います。

まずは公式サイトからRackで動かすチュートリアルがあります。(http://opalrb.org/#getting-started-rack-and-sprockets)

チュートリアルのとおりファイルを作成し

*Gemfile*

```ruby
gem 'rack'
gem 'opal-sprockets'
```

*config.ru*

```ruby
require 'opal-sprockets'

run Opal::Server.new { |server|
  server.main = 'application'
  server.append_path 'app'
}
```

*app/hello_world.js.rb*

```ruby
require 'opal'
require 'native'
$$.alert 'Hello World from Opal!'
```

サーバーを起動します。

    $ bundle install
    $ bundle exec rackup

`http://localhost:9292`へアクセスするとエラーになります。ファイル名が間違っているようです。
`app/hello_world.js.rb`=>`app/application.rb`にリネームします。
サーバーを再起動してブラウザをリロードするとアラートが表示されました。

htmlファイルを置きたいときには、`index_path`を追加してerbファイルを作ります。
せっかくなのでここではちょっとアレンジしてhamlで書くことにします。

Gemfileに`gem 'haml'`という行を追加して

*config.ru*

```ruby
require 'opal-sprockets'

run Opal::Server.new { |server|
  server.main = 'application'
  server.append_path 'app'
  server.append_path 'index.haml'
}
```

*index.haml*

```haml
!!!
%head
  %title Hello world
%body
  %h1 Hello world
  = javascript_include_tag @server.main
```

ここまでは[6日目のyharaさんの記事](http://yhara.jp/2016/12/06/opal-three-js)でも触れられています。

本格的なWebアプリケーションを作るには、Opalの組込みサーバーだけでは少々役者不足です。
Railsにインテグレーションして使うという方法もありますが、ここではもうすこしライトにSinatraで始める方法を書きます。

opalをsinatraで動かすexampleがリポジトリにありました。=> https://github.com/opal/opal/tree/master/examples/sinatra

exampleに倣ってconfig.ruを書きかえます。

*config.ru*

```ruby
require 'opal-sprockets'
require 'sinatra'

opal = Opal::Server.new { |server|
  server.main = 'application'
  server.append_path 'app'
  server.index_path = 'index.haml'
}

sprockets   = opal.sprockets
prefix      = '/assets'
maps_prefix = '/__OPAL_SOURCE_MAPS__'
maps_app    = Opal::SourceMapServer.new(sprockets, maps_prefix)

configure do
  set sprockets: sprockets
  set prefix: prefix
end

map maps_prefix do
  run maps_app
end

map prefix do
  run sprockets
end

get '/' do
  haml :index
end

run Sinatra::Application
```

configureでindex.hamlの中で参照するための変数をsettingsに入れておきます。

Gemfileにも忘れずに`gem 'sinatra'`を追加しておきましょう。

*index.haml*

```haml
!!!
%head
  %title Hello world
%body
  %h1 Hello world
  = ::Opal::Sprockets.javascript_include_tag('application', sprockets: settings.sprockets, prefix: settings.prefix, debug: true)
```

サーバーを再起動してブラウザをリロードしてみましょう。どうでしょうか上手く動きましたか?

最後にまたしても我田引水ですが、[hyalite](https://github.com/youchan/hyalite)および[menilite](https://github.com/youchan/menilite)をつかってのWebアプリケーションを作る方法です。

こちらは設定する項目も大分多くなります。そこで[silica](https://github.com/youchan/silica)というツールをつかってテンプレートを生成することにします。

    $ gem install silica
    $ silica new sample-app

sample-appというプロジェクトができました。

    $ cd sample-app
    $ bundle install
    $ bundle exec rackup

`http://localhost:9292`へアクセスしてみましょう。

**Welcome!!!**

と表示が出ましたか?
コマンドを実行するだけですぐにWebアプリケーションをつくりはじめることができて便利ですね：P
videoタグの動画埋め込み時に、画面クリックで再生、ポーズを設定する方法


#内容
videoタグでの動画埋め込み時は、通常コントローラーの再生ボタン等でしか操作ができない。ただそれだとyoutubeのように動画画面クリックで再生・ポーズに対応するデバイスに慣れている利用者にはUI的にイマイチだと思い方法を模索した。

#実装
動画画面全体を覆う空divを作り、それにjavascriptで再生・ポーズのアクションを割り当ててるだけ。
気をつけた点は、、、

- divで動画全体を覆う際に通常のコントローラーも覆ってしまうと、コントローラーでの操作ができなくなるでその部分のみ覆わないように調整
- 再生、ポーズの動作の違いをstatus変数+ifで調整

##html
```html
<div class="video-wrap">
	<video  muted controls poster="test-movie.jpg" id="video">
	  <source src="test.mp4" type="video/mp4" />
	  <img src="test-movie.jpg" />
	</video>
	<div class="video-btn" id="video-btn"></div>
</div>
```

##css
```css
.video-wrap {
	position: relative;
}
.video-btn {
	content: "";
	position: absolute;
	top:0;
	left:0;
	right:0;
	bottom:40px; /*コントローラー分下部に余白を*/
	cursor: pointer;
}
```

##javascript
```js
    const video = document.querySelector('#video');
    const video_btn = document.querySelector('#video-btn');
    let is_playing = false;

    video_btn.addEventListener('click', () => {
      if (!is_playing) {
        video.play();
        is_playing = true;
      } else {
        video.pause();
        is_playing = false;
      }
    });
```
HTTPリクエストを一部修正して送りたい時の方法

# はじめに

おくれましたが、初老丸アドベントカレンダー7日目です

やはり初老ともなると httpリクエストを一部書き換えることが多くなります。
ChromeでURLからcurlコマンドが作成できることを見つけたので方法を共有します。とても簡単です。


# Chromeでリクエストをcurlコマンドにする

1. デベロッパーツールを開きます

2. Networkタブを選択し、修正したいURLを右クリック -> Copy -> Copy as cURL

<img width="1156" alt="Curlコマンドとしてコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/51203/deb3c884-ef6c-6d21-fc0d-6e81aac5be84.png">

3. curlコマンドがテキストとしてコピーされているので、修正して実行します。

以上です!
植物の育成環境のデータを取得する。


皆さん、植物は好きですか？
僕は好きだ。
好きだからこそ成長を見たく、実家の庭に生えていた山野草や水草、未だ見ぬアフリカの植物まで植えて育ててみた。
しかし、一体いくつもの植物たちを枯らせてしまったのだろうか。。。
僕以外にも植物を育てていて枯らしてしまったことがある人はどのくらいいるんだろう。

植物はベストな環境下にあればいきいきとしてもっと魅了してくれるはず。
ただ、鉢の中の人工的な環境にある中でどのようにその魅力を引き出せるか、今まではネットの情報や書籍を読み、栽培家のところへ行き尋ねてきた。
育て方がなんとなくは分かっても枯らしてしまう。
枯れた原因は分からない。そうなると次回も同じ過ちを繰り返してしまうかもしれない。
俗に言うPDCAサイクルが回せない。。

数年大事に育てもある日突然腐ることも。
なんとかできないか。。

考えた結果、植物が育つための要素の光・水・温度・空気・養分(土)をセンシングしてデータを貯める。
同じ植物を育てている人のデータが集まれば、長生きさせられるベストな環境を導き出せるはず。
そうして愛でた植物を人に託す際にも、データを引き継いでいけば生存確率は上がり、愛でた植物の価値も上がるのではないか。
そんなプラットフォームを作りたい。


前置きが長くなりましたが、プラットフォームに繋ぐためのデータ（光・水・温度）を集めるガジェットを作ります。
###実現したいこと
土壌水分と光量、温度の変化をWi-fiでWebアプリに飛ばし計測する。
土壌のNPKまたはイオン濃度を計測できるセンサーをご存じの方が要らしたらコメント頂けるとうれしいです。

###使うもの
・Raspberry Pi2 Model B
・Micro SDカード
・ブレッドボード
・ジャンパー線
・無線LAN USBアダプタ　GW-USNano2
・10bit 8ch ADコンバータ MCP3008
・抵抗 10Ω~1MΩ のセットで1000円くらいのもの
・LED 動作確認用 10個100円くらいのもの
・照度センサー TSL2561
・温度センサー LM60
・土壌湿度センサー Soil Moisture Sensor V2
※秋葉原とアマゾンで調達できます。
まずどのセンサー買えば良いのか分からず、いくつか試した結果このセレクトになりました。

###ブレッドボードの配線（Fritzing）
![cobit_sketch.png](https://qiita-image-store.s3.amazonaws.com/0/46374/c81392ba-81b6-8f0d-0912-45b48ba1e9e1.png "cobit_sketch.png")


####次回はセンシングのコードを。。。


###参考になった書籍
これ１冊でできる！ラズベリー・パイ 超入門 改訂第2版 Raspberry Pi Model B／B+／2対応 
http://qq2q.biz/Adt6

電子工作入門以前
http://qq2q.biz/Adtb

Arduinoをはじめよう 第3版 (Make:PROJECTS)
http://qq2q.biz/Adti


このプラットフォームを自社のサービスとして作り上げたい。
このサービスを一緒に立ち上げてみたいエンジニアの方、一度[クアッド](https://quad.co.jp)に遊びに来てみませんか？

![plants_south.jpg](https://qiita-image-store.s3.amazonaws.com/0/46374/02e2ad8d-cb3c-73e3-84de-f101c4fbc94a.jpeg "plants_south.jpg")
CocoaPodsにてインストール時の警告

CocoaPodsのバージョンを上げたところインストール時にこんな警告が。

```
[!] `xcodeproj` was renamed to `project`. Please update your Podfile accordingly.
```
どうやらxcodeprojという記述は古いようなのでpodfileを以下の通り編集する。

```
#xcodeproj 'moge.xcodeproj'
project 'moge.xcodeproj'
```
無事警告が消えました。

```
Sending stats
Pod installation complete! There are 12 dependencies from the Podfile and 19 total pods installed.
```
Swift で、Twitter に 30秒以上の動画を投稿 

# Twitter への動画つき投稿
簡単な方法がありそうでなかったので、地道に api をコツコツ呼びました。
詳細は以下のサイトにまとまっているのですが、基本的な仕組みとswiftでの実装メモを書きました。
[CORETWEETで30秒を超える動画をTWITTERにアップロードしてみる](https://blog.hinaloe.net/2016/06/23/upload-more-long-video-with-coretweet/)

## Twitter api を２つ使います
```
// 動画アップロード用 ： こちらに色々なコマンドを投げる
let UPLOAD_URL = NSURL(string: "https://upload.twitter.com/1.1/media/upload.json")

// ツイート用 : 最後に１回投げてツイート完了
let STATUS_URL = NSURL(string: "https://api.twitter.com/1.1/statuses/update.json")
```

## 最初に動画をアップロードして、media_id_string を取得
* UPLOAD_URLにコマンドを投げます。

大きなファイルは分割してアップロード。以下４コマンドを順次呼び出します。
1. INIT (開始。media_id_stringを取得。以後の呼び出しは、全てこの値を使う)
2. APPEND (ファイルを適当な容量に分割して全部アップロードできるまで呼ぶ)
3. FINALIZE (終了)
4. STATUS

ポイントは、**アップロード完了から、メディアが使用可能になるまで間があるとこです。**
STATUS の戻り値で、state == "succeeded" になるまでポーリングが必要です。

```
if json["processing_info"]["state"] == "succeeded" {
    // 次の処理へ
}
```

## media_id_string と text を一緒にツイート
* STATUS_URL にコマンドを投げます。

```
let params = [
    "status": self.mTweet,
    "media_ids": self.mMediaIdString
]
```
## swift での実装メモ
### 通信で使用するクラス・メソッド
```
SLRequest
.addMultipartData
.performRequestWithHandler 
```

### バイナリファイル分割
```
// CHUNK_SIZE = 2 * 1024 * 1024 など、大きすぎないサイズ。
// mSegmentIndex は、0からの連番。append を呼ぶたびに +1。

var _range = NSRange()
_range.location = mSegmentIndex * CHUNK_SIZE
_range.length = min(CHUNK_SIZE, mFileSize)
let _mediaData = NSData(contentsOfFile: self.mFilePath)
let mediaData = _mediaData?.subdataWithRange(_range)
```

非同期コードの塊ですが、SwiftTask を使うとネストが深くならずに快適に実装できました。
[SwiftTask（Promise拡張）を使う](http://qiita.com/inamiy/items/0756339aee35849384c3)

### メモ
FINALIZE -> STATUS 確認まで5秒程必要っぽいので、ツイート編集画面を表示した時点などでこっそりアップロードを開始したいところですが、キャンセル時など、数メガのアップロードが無駄になると思うと悩ましいところです。

以上です。
僕がiTerm2を使ってる理由

iTermを使っていて良さが一言で説明できなかったのでまとめます。

## Hotkey

設定するとiTermにフォーカスを持ってくることができます。chromeで何かしててターミナル触りたくなったときとかに便利です。

赤枠で囲ってるところに設定します。

<img width="926" alt="スクリーンショット 2016-12-08 21.48.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/82745/f4395a45-9cd1-5fc5-358c-e4890eb998a2.png">


個人的には `control + t` に割り当てています。

これがないと仕事にならない。

## window style

こんな感じの画面に設定できます(赤枠のとこらへん)

<img width="1440" alt="スクリーンショット 2016-12-08 21.53.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/82745/9c1ae5eb-8340-5d77-5166-108e01c61326.png">


設定方法は赤枠のところをFull-Width Bottom of Screenにするだけ

<img width="898" alt="スクリーンショット 2016-12-08 21.50.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/82745/e3a0b288-ed60-72af-9cb7-aa7a7c759e7c.png">

## 検索

`command + f` で画面に表示されてるものの検索ができます

<img width="1439" alt="スクリーンショット 2016-12-08 22.26.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/82745/e79bb5ec-53de-1cc6-f633-798e05007b83.png">


## クリップボード

クリップボードは他のツールに任せてるので使う頻度は低いですがiTermでクリップしたものを時系列で保持しておけるので便利です。

ドラッグしたらコピーされるのでその履歴が `command + shift + h` で見れます。

<img width="824" alt="スクリーンショット 2016-12-08 22.27.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/82745/8b5fbc48-d727-d8f7-eda0-a86a66e8cca7.png">

# まとめ

これだけ？って思われるかもしれないですがHotkeyとwindow styleはないと困ります。

Macのデフォルトのターミナル.appでも頑張ればできる気もしますが、一度使い始めてしまったので使い勝手が劇的に変わらない限り使い続けるつもりです。。。
tmuxでログを自動取得

参考　https://memo.laughk.org/2014/12/09/tmux-ssh-logging.html

本当はターミナルアプリのログ取得機能を使いたいのだけど、
tmux/screenで画面分割なんかしてるとログが使い物にならないので下記で対応。

```bash
# .bashrc, .zshrc等に下記を追加
if [[ $TERM = screen ]] || [[ $TERM = screen-256color ]] ; then
  LOGDIR=$HOME/Documents/term_logs
  LOGFILE=$(hostname)_$(date +%Y-%m-%d_%H%M%S_%N.log)
  [ ! -d $LOGDIR ] && mkdir -p $LOGDIR
  tmux  set-option default-terminal "screen" \; \
    pipe-pane        "cat >> $LOGDIR/$LOGFILE" \; \
    display-message  "Started logging to $LOGDIR/$LOGFILE"
fi
```
[Swifty]Struct化

<p>関連情報ではClassだと値を変更したら、他で参照しているところにも影響を与えるのでStructを勧めていたが、Model（Dataコントローラ）の実装次第だと思っている。ただ、これは次の関数型プログラミングの導入のためだと思うので、素直に従う。</p>

<p>C++のことを考えると誤解が発生しそうなので、利用するのが躊躇してしまう、リファレンス型と値というのがSwiftにあって、Structは値型のため、＝で代入するとコピーとなる。ただ、自分がここで混乱してしまったが、冷静に考えると、SwiftのオブジェクトはObjective-Cのid型で、ARCでメモリ管理されているはずで、Structでは＝演算子がコピーするようになっているということだろう。</p>

<p>値型でコピーとなるとコストの問題が気になるが、Swiftでは配列はCopy-On-Writeという考えで実装されていて、＝演算子で代入する際は、idのコピーで、値の変更が派生する際に、中身のコピーが発生するので、気にする必要はないようだ。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/ios/Hand">https://github.com/murakami/workbook/tree/master/ios/Hand</a> - GitHub<br />

関連情報
<a href="https://realm.io/jp/news/tryswift-daniel-steinberg-blending-cultures/">文化を調和させる</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
[Java] HibernateとMultipleBagExceptionとLazyInitializationException

# 環境

- Spring Boot 1.4.2
- Hibernate 5.1.1(?)

# 前提

このようなエンティティたちがありました。

```
+------------+
|Grand Parent|
+-+----------+
  |1
  |
  |*
+-+----+
|Parent|
+-+----+
  |1
  |
  |*
+-+---+
|Child|
+-----+
```

それぞれJavaソースはこのような感じになっています。

```java:GrandParent.java
public class GrandParent {
    // 略
    @OneToMany(mappedBy="grandParent")
    private Collection<Parent> parentCollection;
}
```

```java:Parent.java
public class Parent {
    // 略
    @ManyToOne
    private GrandParent grandParent;

    @OneToMany(mappedBy="parent")
    private Collection<Child> childCollection;
}
```

```java:Parent.java
public class Parent {
    // 略
    @ManyToOne
    private Parent parent;
}
```

# 発生した問題

## LazyInitializationException

Jerseyリソースから`Parent`を取得し、`childCollection`にアクセスすると、`LazyInitializationException`が発生します。

Hibernate(?)のセッション外なのが原因だそうです。

なんでだよ！detachしてないよ！

FETCH戦略をLAZYからEAGERに変えて、先にロードしてしまえばよいみたいです。

具体的にはこのように変えます。

```
    // @OneToMany(mappedBy="parent")
    @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
```

やれやれ、これで一安心かと思いきや……。

## MultipleBagException

実行時ではなく初期化時に`MultipleBagException`が発生しました。

複数個Collectionがあったり、親も子もあったりすると、EAGER戦略を通してくれないようです。

`org.hibernate.annotations.Fetch`をつければ解決するとのこと？

ドキュメント → http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#fetching-fetch-annotation

```
    // @OneToMany(mappedBy="parent")
    @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
```

これで`MultipleBagException`は出なくなりました。

やれやれ……！？

## 再びLazyInitializationException

まただよ！

さらにぐぐると、EAGERはだめなのでLazyCollectionを使えとのこと。

ドキュメント → http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#annotations-hibernate-lazycollection

```
    @OneToMany(mappedBy="parent")
    // @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
    // @Fetch(FetchMode.SUBSELECT)
    @LazyCollection(LazyCollectionOption.FALSE)
```


## まだまだLazyInitializationException

まだだめでした！

ドキュメントをよく読むと

> The TRUE and FALSE values are deprecated since you should be using the JPA FetchType attribute of the @ElementCollection, @OneToMany, or @ManyToMany collection

`@LazyCollection(LazyCollectionOption.FALSE)`は、単にEAGER戦略指定しているのと一緒なのですね。MultipleBagException出ませんけれど。


# 解決策

探求中です。。。  :sob:
大学教授に聞いた英語の学び方

英語の読解能力向上の為，
英語を教える大学教授に勉強法を聞いたところ
文法の理解が重要ということで，
文型についての本の通読と，
文法書を手元に置くことを薦められました．
そこで，オススメの本を聞いたのでシェアします．

# 文型について
- [内容を的確につかむ英文の読み方](http://amzn.to/2gnXUtn)
- [英文解釈 - 5文型を本当に理解すればあなたの読解力は飛躍的に伸びる](http://amzn.to/2gFhPBL)

# 文法書
- [総合英語Forest 7th Edition](http://amzn.to/2ho4VYI)

読解には単語力が重要と言われ，私も高校では単語で文の意味を推測せよと言われたのを覚えています．
しかし，文法を意識しながら読めるようになると，文の理解の曖昧さが減ります．
是非，外国語の読解能力を身につけたい方は文法の勉強をオススメします．

お役に立てたら嬉しいです．
二段階認証のスマホが使えなくなって詰んだときの記録（AWS）

二段階認証のスマホを何も考えずに初期化してしまい、AWSコンソールにログインできなくなってしまいました。最終的に電話で解除してもらったので、そのときのプロセスを記録しておきます。

# 準備

## 非通知の拒否設定を解除
AWSからの電話は非通知で来ます。非通知の着信拒否を解除しておいてください。

私はdocomoのAndroid（Xperia Z3）ですが、設定する場所が2カ所あったので注意が必要です。
1. 「設定」→「通話設定」→「着信拒否設定」
2. 「設定」→「通話設定」→「ネットワークサービス」→「番号通知お願いサービス」

## 時間を確保
AWSコンソールとメールの確認をする必要があります。
携帯は通話に使うので、PCなどが触れる環境と、そこに1時間くらい滞在する準備をしてください。

# フォーム送信

いよいよ、電話くださいのフォームを送ります。
https://aws.amazon.com/forms/aws-mfa-support

フォームの内容は次の通り

| 項目 | 内容 |
|:--|:--|
| Problem with Authentication Device | 状況を表すものを選択。<br>とにかく使えなくなったのだという気持ちで "My device was lost, stolen, or damaged" を選択しました |
| Primary phone number | かけてほしい電話番号。念のため国際電話の形式にしました。<br>例）080-1234-5678 → (+81)8012345678 |
| Secondary phone number | 本当は代替の電話番号なんですが、**日本語の電話がほしい旨を書ける場所がここにしかない**ので、Please contact me with Japanese みたいなことを書きました |
| Country associated with your phone number | "日本" |

セキュリティチェックの文字列を入力して送信します。

ちなみに、この有効時間が非常に短く設定されているため、**送信が失敗**することがあります。送信ボタンを押した後のページをよく読んでください。フォームを送信したらすぐに "Your AWS Inquiry" というメールが届くので、これを確認しておくとよいです。

# 電話が来る

いろいろ失敗して何度かフォームを送り直すことになったのですが、およそ日本人から電話が来ます。一度だけ非通知でない番号からかかってきて、そのときは英語でした。Sorry, I want to speak in Japanese みたいなことを言って（通じた！）電話をかけ直してもらいました。

# あとは電話先の指示に従ってください

電話をつないだまま、
1. 二段階認証を解除するためのパスワードがメールで送られてくる
2. パスワードを読み上げる
3. 解除してもらう
4. ログイン確認
を行いました。

# おわり

英語の電話がかかってきたときは心臓が飛び出るかとおもいました。
今度スマホを修理・機種変更するときは気をつけよう。。
1つのdubプロジェクトで複数の実行ファイルを作成する方法

# はじめに

アドベントカレンダー4日目[cowsay -f dman](http://qiita.com/kotet/items/a04955c206a2f56e16d8)とネタが被り、力弱く7日目[ﾔﾀｰ! cowsayで使えるd-man.cowﾃﾞｷﾀﾖｰ!! ](https://gist.github.com/simdnyan/4814ddbba8e919c25bcc00ed5d311103)を投稿しました。D言語くんに何かを喋らせたいという欲求は万人に共通ということですね。

```
$ cowsay -f ./d-man.cow May D-man bless you.
 ______________________
< May D-man bless you. >
 ----------------------
    \    _   _
     \  (_) (_)
       /______ \
       \ (O(O \/
        | | | |
        | |_| |
       /______/
         <   >
        (_) (_)
```


# [gophersay](https://github.com/adamryman/gophersay)

```
$ go get github.com/adamryman/gophersay
$ gophersay
 ------------------------
 Concurrency is not parallelism
 ------------------------
   \
    \
     \   ,_---~~~~~----._
  _,,_,*^____      _____``*g*\"*,
 / __/ /'     ^.  /      \ ^@q   f
[  @f | @))    |  | @))   l  0 _/
 \`/   \~____ / __ \_____/    \
  |           _l__l_           I
  }          [______]           I
  ]            | | |            |
  ]             ~ ~             |
  |                            |
   |                           |
```
.
..
...
@simd_nyanは激怒した。必ず、かの[クソネズミ](https://blog.golang.org/gopher)を滅せねばならぬと決意した。@simd_nyanにはGo言語がわからぬ。@simd_nyanは、日本のサラリーマンである。会議資料を書き、新橋で遊んで暮して来た。けれどもマスコットに対しては、人一倍に敏感であった。

# d-man{say,think}

https://github.com/simdnyan/d-mansay

というわけで、d-man{say,think}コマンドを作りました。
1つのdubプロジェクトでd-man{say,think}、2つの実行ファイルを作成するために以下の方法を採用しました。

## dub の configurations

`"configurations"`以下に作成した`"versions"`にソース内で認識させる`version`名を入れます。
詳しくは[Configurations](https://code.dlang.org/package-format?lang=json#configurations)節を参照して下さい。

```json
{
  "name": "d-mansay",
  "configurations": [
    {
      "name": "say",
      "targetName": "d-mansay",
      "targetType": "executable",
      "versions": ["say"]
    },
    {
      "name": "think",
      "targetName": "d-manthink",
      "targetType": "executable",
      "versions": ["think"]
    },
  ]
}
```

以下でビルドします。

```bash
# say が適用される
$ dub build
Performing "debug" build using dmd for x86_64.
d-mansay ~master: building configuration "say"...
Linking...
```
```bash
# say が適用される
$ dub build --config=say
Performing "debug" build using dmd for x86_64.
d-mansay ~master: building configuration "say"...
Linking...
```
```bash
# think が適用される
$ dub build --config=think
Performing "debug" build using dmd for x86_64.
d-mansay ~master: building configuration "think"...
Linking...
```

# おわりに

```
$ d-manthink --help
 _________________________________________________________________________
( d-man{say,think} version 0.0.1, (c) 2016 @simd_nyan                     )
( Usage: d-man{say,think} [-bdgpstwy] [-h] [-n] [-W wrapcolumn] [message] )
 -------------------------------------------------------------------------
    o    _   _
     o  (_) (_)
       /______ \
       \ (O(O \/
        | | | |
        | |_| |
       /______/
         <   >
        (_) (_)
```

```
$ d-mansay May D-man be with you.
 ________________________
< May D-man be with you. >
 ------------------------
    \    _   _
     \  (_) (_)
       /______ \
       \ (O(O \/
        | | | |
        | |_| |
       /______/
         <   >
        (_) (_)
```
macOSで作業中にBGMを再生するにはmpvが最適

macOSで音楽や動画を再生するにはiTunesが一般的ですが、手元にある動画や音楽ファイルを再生するには、コマンドラインから実行できる「mpv」が最強です。私は、作業中のBGMの再生に、mpvを活用しています。

## mpvとは？

mpvは、クロスプラットフォーム対応のマルチメディアプレイヤーです。mplayer2とMPlayerをフォークしたプロジェクトとなっています。

- 公式サイト : https://mpv.io/


## mpvのインストール

mpvをインストールするには、Homebrewを利用します。

```
$ brew install mpv
```

## mpvの使い方

mpvで音楽を再生するにはターミナルからコマンドを実行します。コマンドラインが苦手な人は、素直にiTunesを使うと良いでしょう。
mpvを使うには、再生したい音声・動画ファイルを入れたフォルダを用意しておきます。私はいつもデスクトップに置いてあるのですが、例えば、デスクトップの「bgm」というフォルダに、音楽ファイルが置いてあるならば、以下のようにコマンドを叩くだけです。

```
# bgmフォルダに入っているメディアを連続して再生する
$ mpv ~/Desktop/bgm
```

つまり、「mpv (フォルダ名)」と打ち込むだけで、フォルダ内の音楽ファイルを連続再生してくれます。

### ランダム再生などのオプション

もし、ランダムに再生したい場合には「--shuffle」を付けます。繰り返し再生したい場合は「--loop=inf」とします。また、作業中のBGMとして動画を再生するときは、画面が不要です。そんなときは「--no-video」オプションを付けることができます。

```
# ランダムにBGMを再生する
$ mpv --loop=inf --shuffle --no-video ~Desktop/bgm
```

### ショートカット

さまざまなショートカットが用意されています。BGM用途でmpvを使う場合、曲を飛ばしたりしたいと思いますが、その場合には、コマンドラインでENTERキーを押します。

その他の、よく使うショートカットキーを紹介しましょう。

| キー | 説明 |
| --- | --- |
| ENTER | 次の曲へ
| SPACE | 曲の停止と再開
| < と > | プレイリストの曲を飛ばす
| q | mpvの終了
| カーソルキー | 早送りと巻き戻し
| 0 | ボリュームアップ
| 9 | ボリュームダウン

- マニュアル:https://mpv.io/manual/master/#keyboard-control


### ちなみに

ちなみに、macOS Sierraになって使えなくなっていたのですが、代わりのアプリを見つけるよりも、mpvがSierra対応する速度の方が早かったのでした。Sierra対応を記念して、改めてQiitaに使い方をメモってみました。

また、資料を調べていて、面白いと思ったのですが、YouTubeのURLを指定して動画を再生したり、起動時にluaのスクリプトを実行したりすることも可能という事です。

軽くて、多機能なmpv、これからも作業BGMの再生に活躍してくれそうです。
ターミナルで使う自分用のショートカット・コマンドを作ろう

Macや、ログインした任意のホストのターミナルでの話。
例えば、あるディレクトリへ移動後にコマンド実行など、といったルーチン処理があると思う。

- オプションは全て同じでホストだけ違うMySQLサーバへのログイン処理
- ホストへの特定の鍵を指定してのログイン処理
- etc., etc.

いちいちコマンドを打つのもおっくう。
かといって、`alias`で書くには、もう少し応用を効かせたい。
どこか`~/bin` とかにスクリプトを書くのもありだけど、簡単なものだったら`.bashrc`にさくっと定義してもいいかも。


## .bashrcへのスクリプト関数の定義

`goto`という疑似コマンドを定義した。名前の理由は、なんとなくそれっぽいのと、タイプするのが楽な文字列だから。

やってることは難しくないと思うので、適当に改変を。
なお、あえて`if`でベタに書いている。
デバッグやらで脳みそに負荷をかけたくないのと、一時変数とかの宣言やら何やらがめんどうなので。あと、サンプルとしても解析しやすいだろうから。
`case`を適宜使ってもいいかもねしれない。

```bash:.bashrcに追記
# --- goto pseudo command ---
goto() {
    if [ "x$1" = "xdev" ]; then
        cd ~/devel
    elif [ "x$1" = "xlog" ]; then
        cd ~/var/log

    elif [ "x$1" = "xssh" ]; then

        if [ "x$2" = "xc" ]; then
            ssh cuteyhoney.example.com
        elif [ "x$2" = "xp" ]; then
            ssh prettywoman.example.com
        elif [ "x$2" = "xb" ]; then
            ssh -i ./.ssh/id_pub_4aws beautifullife.example.com
        fi

    elif [ "x$1" = "xdb" ]; then

        if [ "x$2" = "x" ]; then   # goto db
            echo mysql -h develdb.example.com -u hogehoge -p
            mysql -h develdb.example.com -u hogehoge -p
        elif [ "x$2" = "xtest" ]; then   # goto db test
            echo mysql -h testdb.example.com -u fugafuga -p
            mysql -h testdb.example.com -u fugafuga -p
        fi

    fi
}
```

`.bashrc`の適当なところに追加したら、保存して、シェルにログインしなおすなりして、（シェルに）適用させよう。

```shell-session
$ goto dev
```


### ちなみに

例文中で、 `"x$1" = "xdev"` や `"x$2" = "x"` などわざわざ`x`を書いて条件判断しているのは、エラーを起こさずに判定するため。`"$1"="dev"` だと、`$1`（つまり１つ目の引数）が空の時にエラーになってしまう。シェルスクリプトの伝統的なTips。

## 但し書・注意

- `.bash_profile` ではなく、`.bashrc`に書こう。（cf. 『[本当に正しい .bashrc と .bash_profile の使ひ分け](http://qiita.com/magicant/items/d3bb7ea1192e63fba850)』 ）
- 関数名に、既存のコマンドと同じコマンド名をつけて、エイリアスのように機能を上書きする、って手もある。（関数の方が優先される）
    - この場合、元のコマンドはフルパスで指定すると良い。
- もう少し複雑な判断とか処理とかが必要ならば、その時はスクリプトを書いた方がいいかもね。

（おわり）
Effective Ladder

# この記事について
Effective C++がある。Effective Pythonがある。Effective Rubyがある。
なのにEffective Ladderがないのはどうしてなんだ！？
というわけで書きました。
書くのに結構苦労。なんで、QiitaはLadderのコードに対応していないんだ（鬼）！！

# 項1 : 環境のマニュアルをまず読もう。
恐ろしいことにLadderは各社好き勝手に作っているためCやPythonと比べたら**規格**はあってないようなものです。
こんな時にアテにできるのはメーカのマニュアルのみ。
マニュアルを読むことで各メーカが独自に定義した応用関数（特定の機能を実現するためだけのラダー要素）を使えるようになります。
これを使うことで多くの時間を節約できます。
必ずマニュアルを読みましょう。

# 項2 : 書く前に因果関係を考えよう。
考えながら書くとわけのわからない梯子になります。
必要のないスイッチが入ったり、起動してはいけないものが起動してしまったり…
コードを書く前に因果関係を文章にしましょう。

> スイッチX1とスイッチX2がONの間だけ、ソレノイドY1がONになる。

他のまっとうなプログラミング経験がある人はコードにしましょう。

```c:example.cp
if(X1 == true && X2 == true)
{
    Y1 = true;
} else
{
    Y1 = false;
}
```

これをやるだけで、余計なレジスタやメモリ（同じものなのにメーカによって呼び方が異なる）がいらなくなります。
完成したコードは以下のよう。
基本的にCで書いた時に現れる変数の数をラダーの構成要素の数が越えることは無いと思ってよいです。

![Example1.png](https://qiita-image-store.s3.amazonaws.com/0/77676/2e55d19a-6cb9-41b0-c53d-ab96746f106e.png)




# 項3 : スイッチのエイリアス機能を使おう。
X10、Y20、Y21、D31、M0、TM20、K50、T#30MS…
これが何かわかるようになったらあなたも立派な　~~時代錯誤の変態~~　梯子使いです。
もちろん、このX10やY20などの表記方法は絶望的に可読性が無いです。
よく訓練された変態しかわからないです。
そういうときのためにエイリアス機能を使いましょう。
X10が接触センサ、Y20がコンベア起動などの名前を持っていれば一目で機能がわかります。
可能な限り名前をつけましょう。
名前をつければ簡単に何をしているかわかります。

![Example2.png](https://qiita-image-store.s3.amazonaws.com/0/77676/28c3d430-1305-5746-5cbe-c99493845c86.png)




# 項4 : ド・モルガンの法則を使おう。
高校でみんな学んでいるはず。論理演算。

$$
\overline{A \cap B} = \overline{A} \cup \overline{B} 
$$
と、
$$
\overline{\overline{A}} = A
$$
これらを使うとコードの可読性を向上させることができます。
例えば以下のコードは

![Example3.png](https://qiita-image-store.s3.amazonaws.com/0/77676/b6dbed5e-9674-7dde-6f64-2451cca51c08.png)

以下のようにただのor演算のコードになります。

![Example4.png](https://qiita-image-store.s3.amazonaws.com/0/77676/d8b1db98-43d1-c157-b082-b62091eb811d.png)

ド・モルガンによって可読性が上がっていることがわかります。

# 項5 : 一つの機器に一つのコードにしよう。
コードの再利用性をあげるためです。はっきり言って**ラダーのコードに再利用性はほとんどありません。**
クラスも関数も無いものをどうやって再利用しろと？
唯一頼れるのは接続先のハードウェアに合わせて割り当てられたIOのマップは**辛うじて**再利用できることが**たまに**あります。
その僅かな希望のために一つのコードは一つの機器に割り当てるようにしましょう。


# 項6 : チャタリングに備えよう。
プログラマ。特に文系からプログラマになった人この言葉を知っている人はどれだけいるでしょうか？

チャタリングの画像です。
![Bouncy_Switch.png](https://qiita-image-store.s3.amazonaws.com/0/77676/23b29bd3-34fd-a1f3-ebb5-3b019b4dbeb5.png)

[チャタリング](https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)とはスイッチをONにしたときに電圧が波打つ減少です。スイッチはONした瞬間にONとOFFを僅かな時間だけくりかえします。これが問題になるのはラダーが動作するPLCがnano sec単位で1サイクルを終えるからです。誤動作の原因になります。
これに対処するにはディレイをいれる方法があります。
ディレイは各社が応用関数として提供しているのでそれを使いましょう。
それと、ハードウェア的に攻める方法があります。コンデンサと抵抗でRCローパスフィルタを接点に取付ける方法です。しかし、最後の手段です。コストと時間がかかるのでできるだけソフトでやったほうが賢明です。


# 項7 : 安全装置のIOは安全な状態を無通電かつ二重回路にしよう。
安全第一な現場ではコードも安全第一にあるべきです。 
安全装置はたとえ世界が滅びようとも動作するようにすべきです。
安全装置のチェックは必ずサイクルの一番はじめに実行されるように書き、安全装置が働いたら全てのIOが安全側になるようにしてください。
Playframeworkで複数のDBに接続する

カレンダーがなかな充実しないので、小ネタを。。。
今回はメモ的な感覚で。。。


設計上DBを２つに分けてたいと思って、まさかなと思って試したら案の定できたので残しておく

~~~~application.conf
db {
# １つ目のDB設定
  main.driver = org.mariadb.jdbc.Driver
  main.url = "jdbc:mariadb://localhost:3306/MAIN_DB_NAME"
  main.username = USER_NAME
  main.password = PASSWORD

# 2つ目のDB設定
  sub.driver = org.mariadb.jdbc.Driver
  sub.url = "jdbc:mariadb://localhost:3306/SUB_DB_NAME"
  sub.username = USER_NAME
  sub.password = PASSWORD

}
ebean {
  main = ["models.entity.main.*"]
  sub = ["models.entity.sub.*"]
}

~~~

考えればわかることでしたね。。。