OmniAICreator/Qiita-1.07M huggingface dataset:
El CapitanのmacOS標準の日本語IMでもGoogle日本語入力みたいにz+hjklを←↓↑→にする

# まえがき
最近僕Google日本語入力やめてmacOS標準の日本語IM使ってるんですよ。なんですけど、日本語IMだとz+hjklで←↓↑→にならないのがつらすぎたので、日本語IMでもできるようにしました。その方法を共有します。

参考

- [Google日本語入力で使える「Zコマンド」がすごい | IDEA*IDEA](https://www.ideaxidea.com/archives/2009/12/google_z.html)
- [Dvorak 配列のローマ字変換の設定 : tnomuraのブログ](http://tnomura9.exblog.jp/23594859/)

# 要約
日本語IMのキーマッピング設定は`/System/Library/Input\ Methods/JapaneseIM.app/Contents/Resources/RomajiRule_Default.txt`にあるので、そこにz+hjklで←↓↑→になる設定を追加します。
ただ、`/System`以下はMacのEl CapitanからSystem Integrity Protection(SIP, rootless)って機能でそのまま編集できないので、その機能を無効にしてからやる必要があります。

# 詳細
## SIPを無効にする
ここ読んで。

- [El CapitanのSystem Integrity Protection（rootless）の解除方法 - Qiita](https://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8)

## 設定ファイルをいじる
上記リンク見ながらSIPを無効にして再起動した前提。

一応バックアップとってからやりましょう。

```
$ cd /System/Library/Input\ Methods/JapaneseIM.app/Contents/Resources/
$ sudo cp RomajiRule_Default.txt RomajiRule_Default.txt.bak
```

`RomajiRule_Default.txt`はタブ区切りで1列目がキーで、2列目が出力される文字列です。3列目は何か知らないですが、今から編集する設定には無しで良いです。あとコメントアウトは`#`です。

```
$ head -n20 RomajiRule_Default.txt.bak
#
#
#
#


-	ー	1

a	あ	1
i	い
u	う	1
e	え	1
o	お	1

ka	か	2
ki	き	2
ku	く
ke	け
ko	こ
```

次に編集します。ついでに、矢印以外のzコマンドも追加してます。
あと、日本語IMで`www`と打つと`っっw`ってなるのがうざいので、`www`が出力されるよう`ww`で`っw`になる設定をコメントアウトしてます。

```
$ sudo vi RomajiRule_Default.txt
$ diff -u RomajiRule_Default.txt.bak RomajiRule_Default.txt
--- RomajiRule_Default.txt.bak	2015-10-03 16:23:21.000000000 +0900
+++ RomajiRule_Default.txt	2017-09-21 17:58:40.000000000 +0900
@@ -389,7 +389,7 @@
 yy	っy	1,1
 rr	っr	1,1
 ll	っl	1,1
-ww	っw	1,1
+# ww	っw	1,1

 bb	っb	1,1
 cc	っc	1,1
@@ -438,3 +438,16 @@
 ほ゜	ぽ

 ########################
+# Google日本語入力
+
+zj	↓
+zh	←
+zk	↑
+zl	→
+z。	…
+z「	『
+z」	』
+z、	‥
+zー	～
+
+########################
```

この編集をしたあとに`日本語入力プログラム`というプロセスを終了させます。で、日本語入力をしようとすると勝手に再起動して上記変更を読み込んでくれます。その時zjで←になれば成功です。
他に自分でカスタマイズしたかったらすると良いです。

## SIPを有効にする。
再掲。これの`csrutil disable`の所を`csrutil enable`にすると有効に戻ります。

- [El CapitanのSystem Integrity Protection（rootless）の解除方法 - Qiita](https://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8)

以上。
CentOS7.3でディレクトリ ファイルの表示色を変える

# 概要
CentOS7でlsコマンドを実行した時、ディレクトリ名の青色が背景色の黒と組み合わせると見づらいので表示色を変えてみた。

# カスタマイズ前
歳のせいか濃い青色と背景の黒色の際が見え辛くて困ってしまった。
![NoName_2017-9-28_2-16-2_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/91e51cae-82f3-e9e2-ae46-87af4f9e11f0.png)

# 手順

## 1.DIR_COLORSファイルを編集

```:/etc/DIR_COLORS
DIR 01;34       #_directory
　　　↓
DIR 01;33       #_directory
```

/directoryで検索すると、ディレクトリファイルの色指定を表す設定行を発見することができる。
上記の例では青色から黄色に変えている。

# カスタマイズ後
並べてみると効果がよくわかると思われる。劇的に見やすくなるのでお勧め。
![NoName_2017-9-28_2-17-59_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/52af3851-6ed0-a11d-90fa-b7fffe41c031.png)


# 参考情報
http://www.itmedia.co.jp/help/tips/linux/l0372.html

## 色指定
|番号| 変更内容 |
|:--:|:--------:|
|0 | | 標準色 |
|1 | 明るくする|
|4 | 下線を引く|
|5 | 点滅させる|
|30 | 黒色文字|
|31 | 赤色文字|
|32 | 緑色文字|
|33 | 黄色文字|
|34 | 青色文字|
|35 | 紫色文字|
|36 | 水色文字|
|37 | 白色文字|
|40 | バックを黒|
|41 | バックを赤|
|42 | バックを緑|
|43 | バックを黄|
|44 | バックを青|
|45 | バックを紫|
|46 | バックを水色|
|47 | バックを白|
react-navigationでページ遷移を検知して処理をはさむ

## 背景

- react-navigationを使っていてページ遷移を契機に処理を実行したい
- 例えば特定のページだけAndroidのバックボタンを制御したいようなときに、ページ遷移ではcomponentWillUnmount等通らないので解除するタイミングがない
  - 次のページのcomponentWillMountで解除してもいいが戻られた時に制御が外れてしまう

## 対応サンプル

- react-navigationの機能でページ遷移を検知することができた

```js:index.android.js
import React, { Component } from 'react';
import { AppRegistry } from 'react-native';
import AppNavigator, { disabledBackScreens } from './app/navigators/AppNavigator';
import { disabledAndroidBack, abledAndroidBack } from './app/utils/Util';

class ReactNativeSample extends Component {
  render() {
    // onNavigationStateChangeに渡す関数がページ遷移の度に呼ばれる
    return <AppNavigator onNavigationStateChange={this.onNavigationStateChange} />;
  }

  // 引数のサンプルは後述
  onNavigationStateChange(prevState, currentState, action) {
  　　　　// routesは遷移履歴の配列
    const routes = currentState.routes;
    // 現在の画面は配列の最後、routeNameで画面名がとれる
    const currentRouteName = routes[routes.length - 1].routeName;
    // ここの例では戻るを無効にしたい画面か判断しそれぞれ処理を呼んでいる
    disabledBackScreens.includes(currentRouteName) ? disabledAndroidBack() : abledAndroidBack();
  }
}

AppRegistry.registerComponent('ReactNativeSample', () => ReactNativeSample);
```
- onNavigationStateChangeで受け取る引数のサンプル
- <img width="308" alt="スクリーンショット 2017-09-22 1.09.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/4a8750f0-7f5b-fc55-efef-1c255916ce23.png">

```js:app/navigators/AppNavigator.js
import { StackNavigator } from 'react-navigation';
import SampleAScreen from '../containers/SampleAScreen';
import SampleBScreen from '../containers/SampleBScreen';
import SampleCScreen from '../containers/SampleCScreen';
import SampleDScreen from '../containers/SampleDScreen';
import SampleEScreen from '../containers/SampleEScreen';

const AppNavigator = StackNavigator({
  SampleA: { screen: SampleAScreen },
  SampleB: { screen: SampleBScreen },
  SampleC: { screen: SampleCScreen },
  SampleD: { screen: SampleDScreen },
  SampleE: { screen: SampleEScreen },
});

export const disabledBackScreens = ['SampleB', 'SampleD'];
export default AppNavigator;
```
```js:app/utils/Util.js
import { BackHandler } from 'react-native'

// trueを返すとバックボタンを押した時のデフォルトの動きをキャンセルしてくれる
const androidBackHandler = () => true

export const disabledAndroidBack = () =>{
  BackHandler.addEventListener('hardwareBackPress', androidBackHandler)
}

export const abledAndroidBack = () =>{
  // 第二引数はaddEventListenerした時の第二引数と同じものでないとダメ
  BackHandler.removeEventListener('hardwareBackPress', androidBackHandler)
}
```

## まとめ

- ページ遷移の度に処理をかませることが出来るので何かと便利そう
はじめてのKotlin:関数定義のバリエーション

# 関数の定義の種類
　大きく3つあります。以下に書式を紹介します。

# Java的な定義の方法
- 引数の名前と型名を定義します。
- 戻り型を定義します。戻り値がない時には、戻り型を **Unit** とします。
- 処理を中括弧で囲みます。
- 戻り値を指定します。

```text:Java的な定義
アクセス修飾子(省略可) fun 関数名( 引数名: 型名, ・・・ ): 戻り型 {
  処理
  return( 戻り値 )
}
```
　Scalaでは処理の最後の式の評価結果が暗黙の戻り値となりますので、 **return** キーワードを省略することができます。しかし、コトリンでは戻り値は明示的に **return** キーワードで示す必要があります。
# コトリン関数的な定義の方法
- 引数の名前と型名を定義します。
- 戻り型を定義します。
- 処理を **=** 以降に定義します。

```text:コトリン関数的な定義
アクセス修飾子(省略可) fun 関数名( 引数名: 型名, ・・・ ): 戻り型 = 戻り値を返す処理
```
# 戻り型を省略した定義の方法
- 引数の名前と型名を定義します。
- 処理をイコール記号 **=** 以降に定義します。

```text:戻り型を省略した定義
アクセス修飾子(省略可) fun 関数名( 引数名: 型名, ・・・ )= 戻り値を返す処理
```

```kotlin:コード例
fun 中括弧付き( 引数1: String, 引数2: Int ):String {
 return( 引数1 + 引数2 )
}

fun イコール付き戻り値あり( 引数1: String, 引数2: Int ): String = 引数1 + 引数2

fun イコール付き戻り値なし( 引数1: String, 引数2: Int ): Unit = println( 引数1 + 引数2 )

fun 戻り型省略戻り値あり( 引数1: String, 引数2: Int ) = 引数1 + 引数2

fun 戻り型省略戻り値なし( 引数1: String, 引数2: Int ) = println( 引数1 + 引数2 )

fun main(args: Array<String>) {
  println( 中括弧付き( "ほげ", 55 ) )
  println( イコール付き戻り値あり( "ばあば", 66 ) )
  イコール付き戻り値なし( "じいじ", 77 )
  println( 戻り型省略戻り値あり( "はげ", 88 ) )
}
```
```text:実行結果
ほげ55
ばあば66
じいじ77
はげ88
```
# 蛇足
　ちなみに上記のコード例のように関数名や変数名を2バイト文字、すなわちUnicodeで記述すると、Markdownではピンク背景の赤茶色の文字で表示されます。実はこれは記述エラーみたいです。CSSのクラス名が **err** になっています。実に見にくい　＆　醜いと思います。

```text:クラス名が"err" 
<span class="err">中括弧付き</span>
```
週刊 git GUIクライアントを作る [1] stage/unstage基礎知識編

# 始めに

何をどれだけ作るかは未定です。
まだGUIの話はしません。

# 動機

+ I love git. 
+ 各種GUIクライアントたちは（機能とプラットフォームと好みで）一長一短
+ 「ぼくのかんがえたさいきょうのGUIクライアント」を作れるようになりたい

# 行単位のstage/unstage

gitのGUIクライアントにとって最も大事な機能は

+ 行単位でstageおよびunstageが気軽にできる
+ wokrespaceとindexの状況（diff）が把握しやすい

だと私は考えています。そういうことにしましょう。
だいたいdiffを見ながらstage/unstageするので、後者は前者の必要条件ですね。

なお、ここで言うstageとはindexへの登録、unstageとはindexから解除のことです。
indexとはパスとデータベース上のファイル実体（blob）の対応表みたいなもので、これに登録されているものがcommitの対象となります。

# コマンドラインの場合

GUIを作る前に、gitの勉強をしましょう。
コマンドラインでは行単位のstage/unstageをする際に、以下のコマンドを使います

+ `git add -p`
+ `git reset -p`

上記コマンドでインタラクティブモードに入り、対象となるhunkに対して`e`を選んで編集することで、行単位でのstage/unstageが可能になります。
（hunkはdiffの断片で、1ファイル内の離れた場所にあるdiffは別のhunkとして切り出されます）

`git add -e [ファイル名]`でもだいたい同じですが、`reset`には`-e`オプションがありません。
また、`-p`オプション経由での編集時には、以下のようなコメントがついていて便利です。


```
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.
```

この編集用hunkは`.git/addp-hunk-edit.diff`として一時ファイルが作成されます。
（`git add -e `の場合は`.git/ADD_EDIT.patch`で、
　1ファイルについての1つ以上のhunkを含むpatch全体です）

ここで編集されたhunkをもとにpatchが作成されて、自動で`apply --cached`されます。

+ `git apply --cached <patch>`
+ `git apply -R --cached <patch>`


このインタラクティブモードでは、
（おそらく）patchはファイルとして作成されずに`apply`コマンドに渡されていますが、
`git diff`および`git diff --cached`の出力と同様の形式です。
この出力を`apply`すれば`git add`と`git reset`したのと同じことが起こります。

`git add`は以下と同じ。

```
git diff | git apply --cached
```
`git reset`は以下と同じ。

```
git diff --cached | git apply -R --cached
```

# patchおよびdiffのフォーマット

詳細はこちら https://git-scm.com/docs/diff-format#_combined_diff_format
ヘッダー部分と、1つ以上のhunkの繰り返しからできています。
（複数ファイルが対象となっている場合は、それがさらに繰り返されます。）

+ 1ファイルのdiff全体に対するヘッダー（4～5行）
 * hunkのヘッダー（1行）
 * hunkのボディ（1行～）
 * hunkのヘッダー
 * hunkのボディ
+ 1ファイルのdiff全体に対するヘッダー
 * hunkのヘッダー
 * hunkのボディ
 * hunkのヘッダー
 * hunkのボディ

ヘッダー部分はこんな感じです。ファイルごとに存在します。

```
diff --git a/names.txt b/names.txt
index 61b59be..2d94d6d 100644
--- a/names.txt
+++ b/names.txt
```

hunkはこんな感じです。`@@`から始まる行がhunk自身のヘッダーです。

```
@@ -1,2 +1 @@
-test.txt
-names.txt
\ No newline at end of file
```

インタラクティブモードではhunkのヘッダー部分は編集する必要がありませんが、`apply --cached`される前に自動で再計算されてpatchに組み込まれているようです。

# 行単位のstage/unstageのためにやるべきこと5つ

1. 元になるpatchとしてdiffを出力する
2. stage/unstageしたい行を選ぶ
3. hunkのボディを編集する
4. hunkのヘッダーを再計算する
5. 最終的なpatchをapplyする

GUIクライアントがGUIとして「見せる」のは1と2ですが、もちろん3～5も必要です。

+ 3は、インタラクティブモードでのhunk編集でやっていることで、
`+`や`-`で始まる行を丸ごと消したり、スペース始まりにしたりします。
+ 4は、hunk内の対応行の開始位置とオフセットを差分の適用前後それぞれについて表しています。
+ 5は、applyするだけで、コマンドも分かっているので簡単なはずです。（でも、例えば、JGITは`git apply --cached`に相当するコマンドが無いように思います）


**あとは作るだけ！**

# 参考になるかもしれないコード

## add/resetのインタラクティブモード
https://github.com/git/git/blob/master/git-add--interactive.perl
ただし、このコードが実際に使われているのか、よく分かっていません。
同内容のファイルは、windowsだと下記のような場所にあります。
 C:\Program Files\Git\mingw64\libexec\git-core\git-add--interactive

## git-gui.exeの`Stage Lines For Commit`
https://github.com/git/git/blob/6867272d5b5615bd74ec97bf35b4c4a8d9fe3a51/git-gui/lib/diff.tcl#L643
tclのコードです。
テキストウィジェットの機能を駆使して文字列検索しているため、文法を知らずに読むのは無理でした。https://www.tcl.tk/man/tcl8.4/TkCmd/text.htm などを参照すれば読めると思います。
MaterializeのDatePickerでフォーマット指定

# はじめに
MaterializeのDatePickerでフォーマット指定する方法です。
簡潔にいうと、オプションで指定すれば良いだけです。
# サンプル
```coffeescript
$ ->
  $('.datepicker').pickadate {
    # Creates a dropdown to control month
    selectMonths: true,
    # Creates a dropdown of 15 years to control year,
    selectYears: 15,
    today: 'Today',
    clear: 'Clear',
    close: 'Ok',
    # Close upon selecting a date,
    closeOnSelect: false,
    format: 'yyyy-mm-dd'
  }
```
# 参考資料
* [Materialize/Forms](http://materializecss.com/forms.html)
* [stack overflow/How to set the date in materialize datepicker](https://stackoverflow.com/questions/30324552/how-to-set-the-date-in-materialize-datepicker)
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第四章 ドメインを隔離する3

# フレームワーク
> アーキテクチャフレームワークは、プログラムにある他の部分の設計に、はるかに大きな影響を与える。(第二部 第四章より)

モデルに影響するようなアーキテクチャフレームワークの選択はとても大事ですよね。

javaなら、springやj2eeやplay、rubyならrails、phpならSymfony・・・
データベースとの接続も影響しますよね。MyBatisやJPA、Hibernate、ActiveRecord・・・

> フレームワークを使うと、他のレイヤをきわめて特殊な仕方で実装しなければならなくなることも多い、これは例えば、フレームワークが定義したサブクラスとして定義したり・・・ドメインについての設計の選択肢を制限する前提を多く設けすぎたり、・・・(第二部 第四章より)

モデル層のクラスがフレームワーク用のクラスを継承しなければならないとか、テーブルと１対１のクラスでないといけないとか、モデルとその他技術を分離する必要があるのに、フレームワークがそれを妨げてしまってはいけませんね。こういう意味で、フレームワークの選択が重要になってきます。

よいフレームワークとは何か？

> 最もよくできたアーキエクチャフレームワークは、複雑な技術的問題を解決する一方で、ドメイン開発者が表現することに集中できるようにする。(第二部 第四章より)

モデルの構築に障害が生じるならば、たとえ使い慣れたフレームワークでも、手放したり、一部機能を使わなかったりということをする必要もでてくるでしょうね。

最近よく聞く、「[モダンアジャイル](http://modernagile.org/)」の原則に「実験・失敗を繰り返す」というのがあります。
モデルを構築しやすい環境を作るための実験もこの中に含まれるのだろうと思うのです。

フレームワークに汚染されないモデルを実装することを目標にフレームワークを選択・実験する。

追伸：おすすめはspringとMyBatisの組み合わせです。最近でこそ、pythonなど他の言語も扱うようになりましたが、spring・MyBatisほど、複雑な技術の問題を解決しつつもモデルにはほぼ影響を及ぼさないフレームワークにはまだ出会っていません。。。
Windowsでgit log見た時日本語が<E6><97>～みたいに化けた時の対処方法

windowsの場合、原因が何か切り分けが難しい。windows10の細かいバージョンがおかしいのか、ターミナル(conemu 161206[32])が悪いのか、git.exeのバージョンが古いのか。しかもこのgit.exeはどこから持ってきたのか忘れた。

なので手当たり次第やるしかないっていうね。

Powershellの環境変数を設定する方法は `$env:GIT_PAGER= "LESSCHARSET=utf-8 less"`。
git configコマンドから設定する方法は `git config --global core.pager "LESSCHARSET=utf-8 less"`
どっちがいいかな。この環境変数をカラにすると再現する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/ac6583e1-0ee7-56f0-3bb3-524954d42eb0.png)

git logでは内部的にlessコマンドを使ってるんだけどそこで化けてるっぽい。`git --no-pager log`で一時的にlessを使わないように出来るらしい。windowsのless.exeもどこのバイナリ叩いてるんだか。

git log 文字化け でググると`\xE6\x97`みたいな化け方の方ばっか出てきて今回の場合の情報見つからないけどどうやって検索すればよかったのか。
laravel apidoc

# laravel apidoc

```php
<?php
/**
 * @api {get} /posts/:id posts get
 * @apiVersion 0.1.0
 * @apiName posts get
 * @apiGroup posts
 *
 * @apiParam {Number} id posts id.
 *
 * @apiSuccess {String} post post.
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "post": "post"
 *     }
 *
 * @apiError PostNotFound .
 *
 * @apiErrorExample Error-Response:
 *     HTTP/1.1 404 Not Found
 *     {
 *       "error": "PostNotFound"
 *     }
 */

 /**
 * @api {post} /posts posts post
 * @apiVersion 0.1.0
 * @apiName posts post
 * @apiGroup posts
 *
 * @apiParam {Number} id posts id.
 *
 * @apiSuccess {String} post post.
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "post": "post"
 *     }
 *
 * @apiError PostNotFound .
 *
 * @apiErrorExample Error-Response:
 *     HTTP/1.1 404 Not Found
 *     {
 *       "error": "PostNotFound"
 *     }
 */
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostsController extends Controller
{
    //
}
```

```sh
mkdir doc
apidoc -i app/Http/Controllers/ -o doc/
```
alt属性の意図

Webページの表示の上ではalt属性がなんの意味を持つのかわかりにくいです。
そこで、alt属性の役割について調べてみました。

#画像が表示されない時の代替テキスト
以下のような場合に代替テキストを表示する。

- ユーザの回線状態が悪い
- ユーザが意図的に画像の読み込みをしていない
- ユーザがテキストブラウザを使用している
- 目が不自由で、文字を音声合成で読み上げて「聞いて」いる

#アンカーテキストの代わりになる
画像からリンクを貼る場合にalt属性がアンカーテキストとして扱われる。
react-native-maps をインストールしてとりあえず地図を出す

# 概要

* [airbnb/react-native-maps](https://github.com/airbnb/react-native-maps) をインストールしてとりあえず地図を出すまでの手順をまとめます
* iOS 向けのビルドしか試していないので、iOS 向けの手順のみ書いています
* ネイティブ機能を使うため、`create-react-native-app` した人は `eject` が必要です
* バージョン
    * react-native: 0.47.0
    * react-native-maps: 0.16.4

# インストール

* react-native-maps をインストール

```
npm install react-native-maps --save
```

* 依存するネイティブライブラリをインストールして、プロジェクトに紐づける

```
react-native link react-native-maps
```

Apple の地図を表示するぶんには、上記2コマンドだけで準備完了です。[公式のドキュメント](https://github.com/airbnb/react-native-maps/blob/master/docs/installation.md) がなかなか読みづらく（以下を実行せよと言ってみたり不要だと言ってみたり...）、`pod install` 等すべきなのかどうか混乱しました。どうやら Google Map を表示したい場合以外は上記2コマンドを実行するだけでいいみたいです。ちなみに昔はもうちょっと面倒だったもよう (https://qiita.com/polidog/items/e1121e36fae31a09f1b2)。

# 地図を表示

* index.ios.js に以下を実装する
    * StyleSheet を適用しないと地図が表示されないので注意

```js
import React, { Component } from 'react';
import { StyleSheet } from 'react-native';
import MapView from 'react-native-maps';

export default class Main extends Component {
  render() {
    return (
      <MapView
        style={styles.map}
        initialRegion={{
          latitude: 37.78825,
          longitude: -122.4324,
          latitudeDelta: 0.0922,
          longitudeDelta: 0.0421,
        }}
      />
    );
  }
}

const styles = StyleSheet.create({
  map: { ...StyleSheet.absoluteFillObject, },
});
```

* ビルド

```
react-native run-ios
```

![スクリーンショット 2017-09-21 23.39.35.png](https://qiita-image-store.s3.amazonaws.com/0/66421/306dcfd6-31e2-d5b1-0e77-231b120da14f.png)

# 補足

## スタイルシートのところのドット3つは何？

* オブジェクトをプロパティとして展開するための記法
    * http://yami-beta.hateblo.jp/entry/2016/09/06/112330
TouchDesigner 日本語テキストを扱う方法


TouchDesignerで日本語をTextTOPで扱うことはもちろん、日本語テキストのファイルをそのまま読み込むことはできないようです。<img width="932" alt="スクリーンショット 2017-09-21 午後11.13.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/68ed5abf-403b-ed01-539f-e8eb46cc60df.png">
このように文字化けを起こしてしまいます。

Pythonスクリプトを書いて日本語テキストを扱う方法を紹介していきたいと思います。

まず、日本語テキストが書き込まれた.txtファイルを準備します。テキストの文字コードは「UTF-8」に指定します。
Macのテキストエディットでファイルを準備する際には、「環境設定>新規書類」のフォーマットを「標準テキスト」に、「環境設定>開く/保存」のエンコーディングを「Unicode(UTF-8)」に指定して保存します。

<img width="422" alt="スクリーンショット 2017-09-21 午後11.22.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/901fac75-bf23-604f-f685-4efb842bff37.png">

<img width="460" alt="スクリーンショット 2017-09-21 午後11.22.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/1ed26235-cef0-bfc8-4d87-fb369e620e81.png">


保存した日本語テキストファイルをエンコードUTF-8に指定して開き、データを'storetext'に一時保存します。
ExecuteDATのFrameStartをオンにし、以下のスクリプトを書きます。
<img width="931" alt="スクリーンショット 2017-09-21 午後10.56.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/66d17da9-14a4-9db7-b6af-cb33abc0d652.png">

TextTOPを以下のように設定します。
Text>textにExecuteDatでstoreした文字データ'storetext'をfetch(読み込み)ます。
<img width="432" alt="スクリーンショット 2017-09-21 午後11.29.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/6076680f-dac4-70aa-e287-0b6de11cf332.png">
Font>Font Fileに日本語のフォントファイルを読み込みます。今回はMS明朝をダウンロードして入れてみました。
<img width="432" alt="スクリーンショット 2017-09-21 午後11.06.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/35d03447-2cbc-ca63-28a3-5a8deec98027.png">

日本語テキストを表示することができました！

<img width="649" alt="スクリーンショット 2017-09-21 午後11.16.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/c2af6544-7384-a42a-2bf4-8b65e17770e8.png">
[小ネタ]Nutanix PrismをChromeで開くと、VM Consoleのマウスカーソルが動かない場合の対処

NutanixはPrismというHTML5ベースのツールで運用管理を行いますが、ハイパーバイザーがNutanix AHVの場合には、VMの操作を行うGUI Consoleが使用可能です。

ですがこのConsole、ある環境では"マウスカーソルが動かない"という事象が起きる場合があります。
具体的には私の常用している Windows端末 + Chrome で発生しているのですが、解決方法がありますので紹介します。

![DisableTouchEventsAPI.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/589261b5-9c0b-cc26-dd72-d9affa8185c3.png)
Chromeのアドレスバーに "chrome://flags" と入力して試験運用機能の設定画面を開き、"Touch Events API"の機能を”Disabled"に設定する、これだけです。

無効化した機能の名前からすると、Chrome + タッチスクリーン が根本原因かもしれません。
(私の使用している機種がDell XPS 13のタッチスクリーンモデルのため)

【参考】こちらでも話題になっていました - Mouse not working in Chrome
https://next.nutanix.com/t5/Installation-Configuration/Mouse-not-working-in-Chrome/td-p/15511/page/3

細かい発生条件の切り分けをしていませんが、似たような症状でお困りの場合にはお試しください。
「setNeedsDisplay」、「setNeedsLayout」、「layoutIfNeeded」、「layoutSubviews」の違い

## はじめに

独自のUIViewを作ったり、UIViewControllerなどからユーザーに見えている画面の部品を更新したいときによく呼ぶこれらのメソッド。

これら4つの描画周りメソッドが、どのように違うのかをきちんと把握できていない、もしくはこれらがどういうものなのかよくわからないという方は意外と多いのではないでしょうか。
(私もつい3日ほど前までそうでした😓)

今回は、仕事でUIViewをカスタマイズした独自のViewを作った際に調べたことや、コードレビューの際に指摘されたことなどの知見を共有したいと思います。

なお、このページでの記述は上から順番に「 **動作が軽量** 」で、「 **計算量が低い** 」順になっています。
(下のメソッドほど動作が重く、計算量が多いです。なお一番下のメソッドは我々プログラマーが直接呼んではいけません。)

内容について意見や間違いがあった場合は、 [@h1d3mun3](http://twitter.com/h1d3mun3) までご連絡をいただくか、コメント欄への記入をいただけると幸いです。
(間違っている内容を公開しておくのは大変お恥ずかしいので、もしも見つけていただいたら遠慮なくご連絡いただければ幸いです。)

## setNeedsDisplay

この処理では、UIViewに「再描画が必要」というフラグを設定します。
(処理が呼ばれたUIViewに存在するサブビューには設定しません)
フラグを設定するのみで、実際に再描画の処理を行うのは  **別の処理** となります。
その為、この処理を1万回呼んだためにiOSアプリが重たくなるということはありません
(実際の再描画の処理で重たくなる可能性はあります。というか実際に1万回も呼んだらそれのせいでほぼ重たくなります。多分、きっと、めいびー😢)。

## setNeedsLayout

この処理は、UIViewをルートとしたサブビュー全てに「再描画が必要」というフラグを設定します。
setNeedsLayoutではサブビューも含めて自身を起点とした配下のViewすべてを再描画するので、お手軽に使いやすいのではないでしょうか。
(setNeedsDisplayと比べて、setNeedsLayoutのほうが計算量も増えますが、2017年現在流通しているiOS端末のリソースから考えると微々たるものだと思います)

## layoutIfNeeded

この処理を呼ばれたView、及びその配下のViewに **画面更新の必要があった場合** にすべて **即座に** 配置します。
その為、setNeedsDisplayと、setNeedsLayoutの2つより処理が重いです。
また次の2つの特徴があります。
・iOSでは **UI周りの更新はMain Threadで行わないといけない** というルールがあるので、この処理を呼ぶスレッドはMain Threadである必要があります。(Main Thread以外で呼ぶとアプリが落ちます😢)
・この処理を呼んだ場合再描画処理が同期実行されます。その為、再描画が完了するまで呼び出し側の実行が止まります。再描画がとてもとても大変な場合はこの処理を安易に呼ぶのではなく、更新が必要な箇所のみに対して呼ぶなどして、計算量を減らしてみるというのも良いでしょう : )

## layoutSubviews

自身が持つSubViewを、制約に基づきリサイズし、位置を決定します。
(このメソッド経由で、UIViewのdrawRectなどが呼ばれているのだと思いますが、私もあまりよくわかっておりません・・・知見をお持ちの方は教えていただけるとうれしいです。)

## 余談

UIImageViewではdrawRectが **呼ばれません** ！
その為、UIImageViewでdrawRectをカスタムしたいような場合は、UIViewを継承したサブクラスのdrawRect内でUIImageを直接drawRectするほうが、お手軽です。
この仕様については後日調べて記事にしたいと思います。

## 参考資料

私がこの記事を書けたのはこれらの素晴らしい参考資料のおかげです。
感謝します。
・[What is the relationship between UIView's setNeedsLayout, layoutIfNeeded and layoutSubviews?](https://stackoverflow.com/questions/2807137/what-is-the-relationship-between-uiviews-setneedslayout-layoutifneeded-and-lay)
・[UIView が持つ描画・レイアウト更新系のメソッドメモ](http://xyk.hatenablog.com/entry/2015/10/30/000350)
MEMO: PuppeteerでSPA(Single Page Application)を操作する時の留意点

## 問題点
PuppeteerによるWebテストの自動化を行うと、HTML等のWebページ遷移が発生しないSingle Page Application(SPA)が正常に動作しない場合があります。特にGithubのPuppeteerのREADME.mdにある使用例をそのまま流用するとハマる可能性があります。

例えば、以下のようにCSSセレクターが見つからないエラーだったり

> UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError [ERR_ASSERTION]: No node found for selector: ...

画面が遷移したにも関わらず以下のようにタイムアウトが発生してしまうエラーだったりします。

> UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Navigation Timeout Exceeded: 30000ms exceeded

## 対処方法
Single Page ApplicationのWebページの場合、以下の点を考慮する必要があるようです。

- page.goto()の後は、動的生成されるHTMLタグのCSSセレクタが登場するまで待機する。
  - page.goto()のオプションで`{waitUntil: 'networkidle'}`を指定する。
  - またはpage.waitFor(), page.waitForSelector()などで待機する。
- page.click()で画面が遷移した後に待機を行う場合は、page.waitForNavigation()を使用しない。
  - page.waitFor(), page.waitForSelector()などで待機する。
  - page.waitForNavigation()はあるWebページから別のWebページに移動するまで待機する関数のため、Single Page Applicationのように同じWebページに留まる場合は待機タイムアウトする。
 

VueによるSPAデモページにアクセスして操作を行い、画像キャプチャをとるサンプルコードを以下に示します。

```js
const puppeteer = require('puppeteer');

async function spa_access() {
  const browser = await puppeteer.launch({headless: true});
  const page = await browser.newPage();

  await page.goto('https://skyronic.github.io/vue-spa/#/', {waitUntil: 'networkidle'});
  await page.screenshot({path: 'image-spa-top.png', fullPage: true});

  await page.click('body > div > div.page > div.product-container > div:nth-child(2) > a')
  //await page.waitFor(1000)  // waitFor()
  await page.waitForSelector('body > div > div.page > div.product-item > a')  // waitForSelector()
  await page.screenshot({path: 'image-spa-clicked.png', fullPage: true});

  await browser.close();
}
```

確認環境： Windows10, Node.js=v8.50, Puppeteer=v0.11.0

## (おまけ) WindowsでPuppeteerのWebアクセス等がタイムアウトする場合
Chrome 60以降でWindowsもヘッドレスChromeに対応しているはずなのですが、Chromium 60以降を使用しているPuppeteerであっても何故か https://www.example.com 以外へのアクセスでタイムアウトしてしまう問題が発生する場合があるようです。その場合にはpuppeteer.launch()の関数のオプションとして `{headless: false}` を追加してヘッドレスモードを無効にして動作させるとタイムアウトを回避できる場合があるようです。

ヘッドレスモードではなくてもWindowsでPuppeteerを動かしたい場合は試してください。
Python pandas覚書


#Series型からDataframeへの変換
Dataframeを1行ずつ取り出してSeries型に変換し、インデックスを0,1,2,3と降り直す。
（次の例では1行のみなのでインデックスを0としたい）

```python 
for key,row in dataframe1.iterrows():        
    dataframe2 = row.to_frame().T.reset_index()
```

#Dataframeの転置
```Python
dataframe1.T
```

#Azure Machine Leanirngネタ

dict から dataframe に変換する時

```
pd.DataFrame.from_dict(dic)
```
したら、以下のエラーが出てしまった。
``ValueError: If using all scalar values, you must pass an index``

コンストラクタを使うように変更してもだめ。

```Python
#こちらはエラーになる
pd.DataFrame(dic)
```

DataFrameのオプションにindexを追加したら動作するようになった

```
#これで動くようになる。
pd.DataFrame(dic,index=['i',])
```
go-on-rails: A Rails generator to develop or generate a Go application

The project's repo: https://github.com/railstack/go-on-rails

<img width="260" height="260" src="https://github.com/railstack/go-on-rails/raw/master/go-on-rails.png">

[go-on-rails](https://github.com/railstack/go-on-rails) is a Rails generator aims to:

* Integrate some APIs written in Golang to existed Rails app for high performance
* Use your farmiliar Rails tools to develope and manage a Golang app project
* Convert a *not very complicated* Rails app to Golang equivalent

Here's [a simple example(tutorial)](https://github.com/railstack/example_simple) shows the basic usage of go-on-rails generator, and [another example](https://github.com/railstack/example_with_admin) shows how to integrate Go APIs in a Rails project. 


## Prerequisites

* Rails 4.2+
* Golang 1.7+

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'go-on-rails', '~> 0.3.0'
```

And then execute:
```
$ bundle
```

Or install it yourself as:
```
$ gem install go-on-rails
```
## Usage

You must have a Rails app or to create one before you can try go-on-rails generator to convert a Rails app to Golang codes.

After that you can just run the command to convert the application:

```
rails g gor [dev(elopment) | pro(duction) | test] [-m model_a model_b model_c ...]
```

Then a directory named "go_app" with Golang codes will be generated under your Rails app root path.

Install the dependent Golang packages:

```
rails gor:deps
```

Then change to the `go_app` directory and run:

```
go run main.go
```

You can visit the page in http://localhost:4000 by default.

More command details about go-on-rails generator:

```
rails g gor --help
```

More details to visit the project's repo: https://github.com/railstack/go-on-rails

Issues and PRs are very **Welcome** !!
Arduino IDEをインストール


最近参加させてもらっているIoT勉強会にてArduinoを利用するので、Arduino IDEを入手しておくように言われました。

てわけで早速入手しましょう。

[ARDUINO SOFTWARE](https://www.arduino.cc/en/main/software)のページへアクセスします。


![Arduino - Software 2017-09-21 22-29-49.png](https://qiita-image-store.s3.amazonaws.com/0/27090/8083f89a-906c-0105-5f9b-e406e89fe8c2.png "Arduino - Software 2017-09-21 22-29-49.png")

私の環境はMacなので、 `Mac OS X` をクリック。

![Arduino - Donate 2017-09-21 22-31-43.png](https://qiita-image-store.s3.amazonaws.com/0/27090/9e97e126-bb66-2400-4271-b15e1db3eb93.png "Arduino - Donate 2017-09-21 22-31-43.png")

一瞬、有料のように見えますが、 `JUST DOWNLOAD` をクリックすれば無料でDLできます。



![アプリケーション 2017-09-21 22-39-18.png](https://qiita-image-store.s3.amazonaws.com/0/27090/1ec5b798-c9bf-f3e9-dd04-d2e24d31bd35.png "アプリケーション 2017-09-21 22-39-18.png")

DLしたzipを解凍すると `Arduino.app` が出て来ました。アプリケーションフォルダに移動してからダブルクリックして起動します。


![sketch_sep21a | Arduino 1.8.4 2017-09-21 22-39-35.png](https://qiita-image-store.s3.amazonaws.com/0/27090/e4c77247-4d0f-c17e-89a7-924b48f30918.png "sketch_sep21a | Arduino 1.8.4 2017-09-21 22-39-35.png")

無事起動しました。現在手元にArduinoがないので、まずはここまで。
mysql.server startしてもmysqlを起動できない

# どういう問題が起きたのか
まず、mysqlを起動しようとします。
```$ mysql.server start```
```Permission denied
ERROR! The server quit without updating PID file
```
エラーが出てきたので、自分がやったことを下記に書きたいと思います。
<img width="725" alt="bin_—_-bash_—_103×53.png" src="https://qiita-image-store.s3.amazonaws.com/0/179180/4265c93d-b7b6-aa61-829f-b76271d296f3.png">

# 解決方法
mysqlにログインする時のパスワードをつけてみる

```$ mysql -u root -p
```→パスワードを求められるので、macのパスワードを入力

<img width="663" alt="bin_—_mysql_-u_root_-p_—_167×53.png" src="https://qiita-image-store.s3.amazonaws.com/0/179180/f409c3db-4f60-0a78-08a9-3a3a921f8b3a.png">

**起動した！！**

# その他試したこと
色々試してみて最終的に、サーバーをたてて```$ mysql -u root -p```をすると起動できます
もし実行ができなかった時に↓のことを試してみてください:)

## ① chown _mysql
いたるところに
```
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql
```と書いてあるのでやってみた

```$ sudo mysql.server start```
↓のようなエラーが出ましたが、
最終的に```$ mysql -u root -p```をすると起動できた

<img width="702" alt="mai_—_mysql_-u_root_-p_—_100×56.png" src="https://qiita-image-store.s3.amazonaws.com/0/179180/4a154365-51e9-e7dd-e702-a6485cd9933c.png">


##② ファイルを指定してchown _mysql
1.mysqlの権限を確認

```
$ ls -la /usr/local/var/mysql
```

2.ファイルごと削除

```
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/〇〇noMacBook-Pro.local.pid
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/〇〇noMacBook-Pro.local.err
```

3.mysqlの起動
やっぱり最終的に```$ mysql -u root -p```をすると起動できるみたい

<img width="728" alt="mai_—_mysql_-u_root_-p_—_100×56.png" src="https://qiita-image-store.s3.amazonaws.com/0/179180/579a3e53-d759-074f-b4bc-d4eebd075113.png">

##③ mysqlのプロセスを消す
1.mysqlのプロセスを確認```
$ ps ax | grep mysql
```
2.mysqlのプロセスの強制終了をする```
$ sudo kill プロセスID
```
3.再度mysqlのプロセスを確認```
$ ps ax | grep mysql```
→さっき消したプロセスが実際に消えてる

4.mysqlの起動
やっぱり最終的に```$ mysql -u root -p```をすると起動できるみたい
<img width="671" alt="mysql_—_mysql_-u_root_-p_—_95×53.png" src="https://qiita-image-store.s3.amazonaws.com/0/179180/1db6a3ac-bc76-7cd4-900d-61267b0f5973.png">

# mysqlを起動するとき
普通に起動しようとするとエラーになってしまうので、、、
以下の手順でmysqlを起動する

```$ sudo mysql.server start
$ mysql -u root -p```
C#で漢数字表記

#数値を桁数ごとに分解

```csharp
        /// <summary>
        /// 数値を桁数ごとに分解
        /// </summary>
        /// <param name="n">数値</param>
        /// <param name="place">桁</param>
        /// <returns></returns>
        protected List<BigInteger> SplitNumber(BigInteger n, int place)
        {
            var list = new List<BigInteger>();

            //累乗
            var sunit = (BigInteger)Pow(10, place);

            for (; n > 0; n /= sunit)
            {
                var x = (n % sunit);
                list.Add(x);
            }
            return list;
        }
```
Powでは10の桁乗を出している。Math.Powだとdoubleになってしまうので自作している。
これで指定桁ごとに分割された数字のリストが作成される

#区切られた数値に単位をつける
```csharp
        /// <summary>
        /// 区切られた数値に単位をつける（万とか兆とか）
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list">区切られた数値のリスト</param>
        /// <returns></returns>
        protected virtual List<string> FormatStringList<T>(IList<T> list) where T : IEquatable<T>
        {
            var str = new List<string>();
            str.Add(list[0].ToString());

            for (int i = 1; i < list.Count; i++)
            {
                if (list[i].Equals(default(T)) == true) //0の場合は空文字列をセット
                {
                    str.Insert(0, "");
                }
                else
                {
                    str.Insert(0, list[i].ToString() + unit[i - 1]);
                }
            }

            return str;
        }
```
```csharp
protected override string[] unit { get; set; }
            = new string[] { "万", "億", "兆", "京", "垓", "秭", "穣", "溝", "澗", "正",
            "載", "極 ", "恒河沙", "阿僧祇", "那由他", "不可思議", "無量大数" };
```
という単位文字列を派生クラスで定義することによって単位つき数字文字列のリストができる。
これを連結すれば漢数字文字列が作れる

#ソースコード
https://github.com/reniris/NumberText/tree/master
とりあえず使ってみればわかるはず
派生クラスを作ってプロパティ実装すれば英語とかSI接頭辞とかに対応できます。
GithubのREADMEにGif画像を埋め込む

行きつけのジムがリフレッシュ休館という理不尽な境遇にあい、一週間もジムに行けていない筋肉エンジニアのtakuyama29です。

今日は、GithubのREADMEにGif画像を埋め込もうと思ったら案外と詰まったので、後から同じ問題でまた詰まらないようにここに解決方法を記録したいとおもいます。


# WikiにGif画像アップしてREADMEに埋め込む

READMEにGif画像を埋め込む方法はいくつかあるみたいですが、今回自分はWikiを使って解決しました。


### 1. WikiをLocalへcloneする

Wikiはメインのリポジトリとは別に独立したリポジトリとなっているので、ここにGif画像をアップしてそのパスを使います。

手順: **Wiki > Clone this wiki locally > Clone**

![Screen_Shot_2017-09-21_at_21_54_56.png](https://qiita-image-store.s3.amazonaws.com/0/143619/35b46b57-5f92-27a0-037d-0e6481aa697e.png)

cloneしたディレクトリに移動して画像アップロード用のフォルダ`images`を作成し、その配下に画像を配置します。(~/images/fileName)


### 2. Gif画像を作成する

僕はQuickTimeを使って.movファイルを生成し、それをGif画像へ変換した物を使いました。

Gif画像へ変換する方法はたくさん紹介されてますが、自分は[GithubやQiitaに載せるgif形式の動画を作成する方法](https://qiita.com/syamaoka/items/4d4054cd75df00460925)を参考にさせていただきました。

いつも活用させていただいております。ありがとうございますm(_ _)m

**それでできたのがコレ**

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/143619/4ff376ce-716f-1a2b-9d4e-1f9cd8b5bf06.gif)

今回はARアプリのDEMO動画をGif画像にしました。

この**サンプルは[WorldTracking](https://github.com/takuyama29/WorldTracking)に公開している**のでもし興味があればぜひ見てみてください。

因みにSwift3 & Xcode9 & ARKitを使って作成しています。

**注意!**
この時生成するGif画像のサイズが大きすぎると、WikiへアップしてREADMEへ埋め込んだ際に、ファイルサイズオーバーになるので注意してください。
具体的な上限サイズは調べていないのでなんとも言えないのですが、恐らく5MB程度かと思います。(このGif画像は3MB程度)


### 3. WikiにアップしたGif画像のパスをREADMEに埋め込む

Wikiに埋め込んだ画像ファイルは以下のパスで取得できます。

https://raw.github.com/wiki/<ユーザ名>/<リポジトリ名>/<画像へのパス>
↓具体例
https://raw.github.com/wiki/takuyama29/WorldTracking/images/Untitled.gif

※Untitledなのはつっこまないでください。


これREADMEで下記に様に記述することでGif画像をそのまま埋め込めます。

`![リンク名](パス)`
↓具体例
`![demo](https://raw.github.com/wiki/takuyama29/WorldTracking/images/Untitled.gif)`

この時の`リンク名`は何を書いてもある程度は問題ないので`demo`以外でも大丈夫です。

無事にREADMEへGif画像を埋め込めました！

OSS活動をする上では、READMEにGif画像を埋め込んだりして分かりやすくすることは大事だと思っているので、こういった細かいところも気を配りたいところです。

最後まで見ていただいてありがとうございましたm(_ _)m
Rustで乱数生成するときの処理速度の違い

Rustで乱数を生成するときに `rand` クレイトを使用しますが、無意識に `rand::thread_rng()`を使ってしまったりします。

暗号の強度より処理速度を優先したい場合、他の乱数生成アルゴリズムを使うと良い場面があります。
そこで`rand`クレイトで使えるアルゴリズムの処理速度を比較してみました。

## 前提条件

```shell-session
$ system_profiler -detailLevel mini | grep "Hardware Overview" -n12 | tail -n15
123-Hardware:
124-
125:    Hardware Overview:
126-
127-      Model Name: MacBook Pro
128-      Model Identifier: MacBookPro12,1
129-      Processor Name: Intel Core i5
130-      Processor Speed: 2.7 GHz
131-      Number of Processors: 1
132-      Total Number of Cores: 2
133-      L2 Cache (per Core): 256 KB
134-      L3 Cache: 3 MB
135-      Memory: 16 GB
136-      Boot ROM Version: MBP121.0167.B33
137-      SMC Version (system): 2.28f7

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G29

$ rustc --version
rustc 1.22.0-nightly (01c65cb15 2017-09-20)
```

## ベンチマーク結果
結論から言うと、処理速度を優先したい場合は`rand::XorShiftRng`を使うのがよいようです。

```text
test bench_rng_chacha       ... bench:          31 ns/iter (+/- 2)
test bench_rng_isaac        ... bench:          16 ns/iter (+/- 3)
test bench_rng_isaac64      ... bench:           7 ns/iter (+/- 0)
test bench_rng_osrng        ... bench:       1,119 ns/iter (+/- 110)
test bench_rng_random       ... bench:          55 ns/iter (+/- 5)
test bench_rng_std          ... bench:           7 ns/iter (+/- 0)
test bench_rng_thread_rng   ... bench:          48 ns/iter (+/- 3)
test bench_rng_xorshift     ... bench:           5 ns/iter (+/- 1)
```

## ベンチマークのソースコード

```rust
#![feature(test)]

extern crate test;
extern crate rand;

use test::Bencher;
use rand::{random, thread_rng, Rng, XorShiftRng, ChaChaRng, IsaacRng, Isaac64Rng, OsRng, StdRng};

#[bench]
fn bench_rng_random(b: &mut Bencher) {
    b.iter(|| {
        random::<f64>()
    });
}

#[bench]
fn bench_rng_thread_rng(b: &mut Bencher) {
    let mut rng = thread_rng();
    b.iter(|| {
        rng.gen_range(0., 1.)
    });
}

#[bench]
fn bench_rng_xorshift(b: &mut Bencher) {
    let mut rng = XorShiftRng::new_unseeded();
    b.iter(|| {
        rng.gen_range(0., 1.)
    });
}

#[bench]
fn bench_rng_chacha(b: &mut Bencher) {
    let mut rng = ChaChaRng::new_unseeded();
    b.iter(|| {
        rng.gen_range(0., 1.)
    });
}

#[bench]
fn bench_rng_isaac(b: &mut Bencher) {
    let mut rng = IsaacRng::new_unseeded();
    b.iter(|| {
        rng.gen_range(0., 1.)
    });
}

#[bench]
fn bench_rng_isaac64(b: &mut Bencher) {
    let mut rng = Isaac64Rng::new_unseeded();
    b.iter(|| {
        rng.gen_range(0., 1.)
    });
}

#[bench]
fn bench_rng_osrng(b: &mut Bencher) {
    let mut rng = OsRng::new().expect("OsRng::new() error.");
    b.iter(|| {
        rng.gen_range(0., 1.)
    });
}

#[bench]
fn bench_rng_std(b: &mut Bencher) {
    let mut rng = StdRng::new().expect("StdRng::new() error.");
    b.iter(|| {
        rng.gen_range(0., 1.)
    });
}
```

## リファレンス
* [rand - Rust](https://doc.rust-lang.org/rand/rand/index.html)
gphoto2を使ってラズパイからカメラ制御する(1) (構想編)


## 概要
趣味でカメラ撮影をやっていて、朝日や夕日のタイムラプス撮影にハマっている。
↓こんなの。(これは夕日→夜の時)
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">20170429 青森田舎館 桜タイムラプス <a href="https://t.co/pOsL5eF6e0">https://t.co/pOsL5eF6e0</a></p>&mdash; くるせす@鉄拳チュウニズムiPadPro (@clses) <a href="https://twitter.com/clses/status/911600199100805120">2017年9月23日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

だが、朝日タイムラプスは、やってみると撮影中の設定変更が難しいと痛感した。

通常、カメラを絞り優先モード(AvやAモード)で撮影すると、自動でシャッタースピードを変えて、明るさを最適化してくれるわけだが、朝日タイムラプスではそれが裏目に出てしまう。
暗いところを明るくしてしまうので、せっかく暗い状態から明るくなっていくところを表現したいのに、最初から明るく見えてしまうのだ。
なのでマニュアルモードで設定を固定し、勝手に明るくしないようにしなければならない。

一方、マニュアルモードでは、最初と最後の明暗差が非常に大きい朝日タイムラプスでは、設定を固定すると白飛びするか黒つぶれしてしまう。
なので、最初と最後で白飛びも黒つぶれもないような範囲に収まるように、少しずつ設定を変えながら撮影していかなければならないわけだ。

手作業でそれをやるのはとても難しい。
まずタイムラプスは、定点で固定した状態で撮影するわけだから、当然ブレてはいけないからだ。
設定を変更するためにカメラに触るというのは、本来あるべきではない。
更に、常に10-20秒単位でリモコンレリーズで撮影し続ける間に、設定を変えて試し撮りをして明るさを確認する暇などなく、設定を変更したらうまく撮れていることを祈るしかない。

そんなわけで、以下の条件でカメラを制御したいと考えていた。
1. 明るさに応じて自動で最適な設定値を計算できること
2. カメラに触れることなく設定を変えれること

いろいろ検索してみると、多くのカメラをコマンドラインで動かせるgphoto2なるソフトがあると行き着いた。
PCに繋いでコマンドを打てば、現在のカメラの情報取得や、カメラの設定変更、シャッターを切ることもできる。
まさしく必要としていたものである。
しかも、Linux関係のコマンドラインで操作できるということは、わざわざPCに繋げなくても、ラズパイにインストールすればラズパイから操作できることを意味する。

というわけで、gphoto2とラズパイを使って、デジタル一眼カメラにて朝日タイムラプスに最適なツールを作れるか、ちょっと挑戦してみようかと思った次第。

## やることリスト
- 朝日が登る際の明るさの範囲のデータを蓄積する(光センサー等で照度を測定し、EV値を出す)
- データ蓄積のためのファイルへの書き出し方法を覚える(CSV出力。ファイルの保存。場合によってはDropbox等への自動アップロード)
- 天気・雲量・日の出時間のインターネットからの取得できるようにする。
- ラズパイの電池の持ち(モバイルバッテリー接続)を把握する。
- I2Cミニ液晶への出力できるようにする。(動作確認、時間等表示用)
- gphoto2をPythonで動かす方法を覚える。
- タイマー制御による自動シャッター

とりあえず、大きくは2つ。
朝日が昇るときの明るさの変化を、実測して取得しておくこと。
撮影終了時の明るい状況を見越して設定していかなければならないので、事前にデータの取得をしておき、実際の撮影時にはそのデータを元に設定を当てはめていくということが必要と思っている。
晴れと曇りではかなり明るさが異なるようなので、天気・雲量との比較もして、関係性も取得したい。(といっても、晴れてるときじゃないと朝日撮影しないけど)
インターネットで調べてみても、意外と時間に応じた明るさのグラフは出てこなかった。
リニアなのかログなのかちょっと興味があるので照度センサーをつけて実測してみたい。

2つめはラズパイへのプログラムの実装。当然といえば当然。
そのままコマンドを呼び出すだけだと遅いという記事を見かけたので、少し工夫が必要とのこと。gphoto2に関する日本語の記事が限られるので、どこまでうまくできるかわからん。
あとラズパイへの電子工作も少しやっておかなければならん。

割と飽きっぽいので完成するかわからないけど、ちまちま進めていければと思います。
webpack v3でriotJSのビルド設定


webpack v1 => v2 => v3の流れでwebpack.config.jsの仕様がころころ変わってる模様。ここが変わるのは苦しいがさすがにそろそろ安定してくるはず。

```bash
DEV_PACKAGES="webpack@3.0.0 path riotjs-loader babel babel-core babel-loader babel-preset-es2015 babel-preset-es2015-riot"
yarn add --dev ${DEV_PACKAGES}
  # npm install --save-dev ${DEV_PACKAGES}

yarn add riot
  # npm install --save riot
```

webpack.config.js

```js
var webpack = require('webpack')
const path = require('path')

module.exports = {
  entry: './node_assets/javascripts/main.js',
  output: {
    path: path.resolve(__dirname, 'app/assets/javascripts'),
    filename: 'app.bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.tag$/,
        exclude: /node_modules/,
        loader: "riotjs-loader",
        enforce: "pre",
      },
      {
        test: /\.js[x]?$|\.tag$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets: ['es2015-riot']
        },
      }
    ],
  },
  plugins: [
    new webpack.ProvidePlugin({
      riot: 'riot'
    })
  ]
}

```

- プラットフォーム差の問題でoutputパスを絶対パスで指定するようになったぽい
- `preLoaders`,`loaders`設定は廃止されていて、`rules`設定に統一されている
- riotTagをjavascript変換して、さらにそれをes2015に変換するためには、`riotjs-loader`を`pre`で動かす（`enforce:"pre"`を指定）
- `es2015`にしないと、`webpack --optimize-minimize`がエラーになった

```bash
webpack
  # 以下の警告は出るが、コンパイルはできた
  # loaderUtils.parseQuery() received a non-string value which can be problematic, see https://github.com/webpack/loader-utils/issues/56
  # parseQuery() will be replaced with getOptions() in the next major version of loader-utils.
  
webpack --optimize-minimize
  # ls -l /path/to/compiled.js
  # 圧縮を確認
```

## References

https://webpack.js.org/configuration/
シェアしたいアプリを選択してからシェアする

# TO DO
- テキストをシェア
- シェアする前にシェア可能なアプリ一覧を表示

# 実装
```MainActivity.kt
    val builder = ShareCompat.IntentBuilder.from(this)
    builder.setText("https://google.co.jp")
    builder.setSubject("")
    builder.setType("text/plain")
    builder.startChooser()
```

# シェアダイアログ表示
![share_screen.png](https://qiita-image-store.s3.amazonaws.com/0/199764/8f85cca2-051d-a448-fc05-78fe3f92a848.png)

# Twitterタップ後
![twitter_screen.png](https://qiita-image-store.s3.amazonaws.com/0/199764/25b25189-b49e-85aa-60f8-f76313239256.png)
Pythonの固定引数は固定引数じゃないこともある

Python[^1]の関数定義は

```py
def func(a, b):
    # aとbとが非対称になるように定義しておく
    return a + 2 * b
```

みたいにやる。この関数を呼び出すときは、

```py
assert func(1, 2) == 5
```

という感じになる。これは

```py
assert func(a=1, b=2) == 5
```

というようにも呼び出せる。このとき、

```py
assert func(b=2, a=1) == 5
```

なんてこともできる[^2]。
固定とはなんだったのか...

[^1]: Python 3.5.0で動作確認
[^2]: `functools.partial` みたいなのをやるときに便利
Safari11で消えたレスポンシブ・デザイン・モードのショートカットを復活させる方法

Safari11でレスポンシブ・デザイン・モードのショートカットが消えました。

安心してください。復活方法ありますよ。


#手順

##システム環境設定を開き、キーボードをクリック
![0D556A06-2BE6-4F0A-B6EC-70B9CE2FF693.jpeg](https://qiita-image-store.s3.amazonaws.com/0/135478/d4dc28a0-14f1-9655-605c-50c6ba4c750b.jpeg)


##ショートカットをクリック
![9B50D7E2-90FC-461A-A6EF-41468901D28D.jpeg](https://qiita-image-store.s3.amazonaws.com/0/135478/42e32624-f2ab-2ad5-e9e4-aa50f147acdf.jpeg)


##アプリケーションをクリックし、＋ボタンをクリック
![6547676C-D3FD-4E78-8955-45EC5CDE0744.jpeg](https://qiita-image-store.s3.amazonaws.com/0/135478/f6c1163d-36ee-af38-2c76-1a8bcfec564e.jpeg)

##アプリケーションでSafari.appを選択し、メニュータイトルに「レスポンシブ・デザイン・モードにする」と入力。そしてキーボードショートカットにoption+⌘+Rを入力し追加。
![F11ED172-6F4F-4B11-BF84-BB9B657A269A.jpeg](https://qiita-image-store.s3.amazonaws.com/0/135478/3df08fb9-9e6e-196f-c467-37f48b861dcc.jpeg)


##先程と同様にアプリケーションでSafari.appを選択し、今度はメニュータイトルに「レスポンシブ・デザイン・モードを終了」と入力。キーボードショートカットにoption+⌘+Rを入力し、追加。
![F207A135-FBD0-40B4-A8E2-0811A3A0A3F7.jpeg](https://qiita-image-store.s3.amazonaws.com/0/135478/a1ca483f-73d2-1622-4e29-0ba34a72e4b1.jpeg)


これで今まで通りoption+⌘+Rでレスポンシブ・デザイン・モードに切り替えができるようになります。
シェルスクリプトのシングルクオートとダブルクオート

# 背景

curlコマンドでJSONを送りたいが、JSONの中に変数を書きたい。

`$ curl -Ssi "http://nantara-kantara" -H "Content-Type:application/json" -X POST -d '{"user_name":"$VAR"}'`

「$VAR」という文字列が送られてしまう…。

# ポイント

ポイントはここにあった。
`→'{"user_name":"$VAR"}'←`

[ShellScriptのダブルクォートとシングルクォートの違い](https://qiita.com/cocodrips/items/bb3640a9834c8978d48a)

>ダブルクォートの中の変数や式は展開されるのに対して、シングルクォートは展開されません。

# 解決

つまり、こう書かなければならない。

`$ curl -Ssi "http://nantara-kantara" -H "Content-Type:application/json" -X POST -d "{\"user_name\":\"$VAR\"}"`

全体をダブルクオートで囲んだことにより、JSON内部のダブルクオートはエスケープしなければならなくなった。
AWS サービス別 APIプロトコル一覧

Pythonのbotocoreに入っているメタデータから持ってきた。

|サービス名|API protocol|
|---|---|---|
| acm|json |
| apigateway|rest-json |
| application-autoscaling|json |
| appstream|json |
| athena|json |
| autoscaling|query |
| batch|rest-json |
| budgets|json |
| clouddirectory|rest-json |
| cloudformation|query |
| cloudfront|rest-xml |
| cloudhsm|json |
| cloudsearch|query |
| cloudsearchdomain|rest-json |
| cloudtrail|json |
| cloudwatch|query |
| codebuild|json |
| codecommit|json |
| codedeploy|json |
| codepipeline|json |
| codestar|json |
| cognito-identity|json |
| cognito-idp|json |
| cognito-sync|rest-json |
| config|json |
| cur|json |
| datapipeline|json |
| dax|json |
| devicefarm|json |
| directconnect|json |
| discovery|json |
| dms|json |
| ds|json |
| dynamodb|json |
| dynamodbstreams|json |
| ec2|ec2 |
| ecr|json |
| ecs|json |
| efs|rest-json |
| elasticache|query |
| elasticbeanstalk|query |
| elastictranscoder|rest-json |
| elb|query |
| elbv2|query |
| emr|json |
| es|rest-json |
| events|json |
| firehose|json |
| gamelift|json |
| glacier|rest-json |
| greengrass|rest-json |
| health|json |
| iam|query |
| importexport|query |
| inspector|json |
| iot|rest-json |
| iot-data|rest-json |
| kinesis|json |
| kinesisanalytics|json |
| kms|json |
| lambda|rest-json |
| lex-models|rest-json |
| lex-runtime|rest-json |
| lightsail|json |
| logs|json |
| machinelearning|json |
| marketplace-entitlement|json |
| marketplacecommerceanalytics|json |
| meteringmarketplace|json |
| mturk|json |
| opsworks|json |
| opsworkscm|json |
| organizations|json |
| pinpoint|rest-json |
| polly|rest-json |
| rds|query |
| redshift|query |
| rekognition|json |
| resourcegroupstaggingapi|json |
| route53|rest-xml |
| route53domains|json |
| s3|rest-xml |
| sdb|query |
| servicecatalog|json |
| ses|query |
| shield|json |
| sms|json |
| snowball|json |
| sns|query |
| sqs|query |
| ssm|json |
| stepfunctions|json |
| storagegateway|json |
| sts|query |
| support|json |
| swf|json |
| waf|json |
| waf-regional|json |
| workdocs|rest-json |
| workspaces|json |
| xray|rest-json |
wysiwygエディタについての学習3


## draft-jsを使ってみる続き

### キーバインド

https://draftjs.org/docs/advanced-topics-key-bindings.html#content

`keyBindingFn`で定義される
getDefaultKeyBindingをフォールスルー時に使うと良い

#### フォールスルー(fall through)

switchのcaseをbreakしないような処理

#### カスタマイズ

デフォルトをフォールスルーニした関数を定義して、それをEditorクラスに指定するのね
これもモンキーパッチ（reduxのmiddlewareにみた）と呼んで良いのかな

http://melborne.github.io/2013/08/30/monkey-patching-for-prudent-rubyists/

やはり批判的な意味を含むニュアンスなのね。

#### モンキーパッチ

モンキーパッチ - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%81

ゲリラー＞ゴリラー＞モンキーー＞ダックパンチング

若手エンジニア／初心者のためのRuby 2.1入門（12）：難しいが強力！ Rubyのメタプログラミング、self、特異クラス／メソッド、オープンクラスとモンキーパッチ (4/4) - ＠IT
http://www.atmarkit.co.jp/ait/articles/1501/06/news028_4.html#03

メタプログラミング的、黒魔術的、用法用量を守ること

#### キーバインド変更の構造

* keyBindingFn: バインドの分岐を通ってコメンド名を判別
* handleKeyCommand: コマンド名を受け取ってコマンド実行

### フォーカスマッピング

https://draftjs.org/docs/advanced-topics-managing-focus.html#content

#### フォーカスの制御を外だし

宣言的ではなくなるが、フォーカスの部分は開発者がシンプルに使えるように外だしした
エディタコンポーネントのpublicメソッドfocus()を外から呼び出せる

#### 宣言型プログラミング

宣言型プログラミング - Wikipedia
https://ja.wikipedia.org/wiki/%E5%AE%A3%E8%A8%80%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0

> 命令型プログラムでは目的を達成するための方法を「手続き」として示すのに対し、宣言型プログラムでは達成すべき目的（出力）を示して、それを実現する手続きはシステムに任せるわけである。

DSLやSQL的なイメージ。

#### エディタをラップしたときにはfocusを自分で呼ぶ

https://github.com/facebook/draft-js/blob/master/examples/draft-0-10-0/plaintext/plaintext.html

paddingのためにdivで囲んだ時にエディタのそとのdivのフォーカスなどを伝えるときの記述の例。

テキストエディタのコード例
reduxでよくあるやり方に似てる、自分で定義したメソッドじゃなくて元からのEditorのメソッドに紐づける感じかな
コンストラクタで初期化の際に、参照できるようbindにする、このことをなんと呼ぶのかな
機械学習における交差検証法の実装(備忘録)

# はじめに
ゼミの後輩たちがライブラリを用いて機械学習を使い出しました．(後輩たちが目を真っ赤にしながら毎晩頑張ってます)
機械学習を実装しモデル化を行い，あとは交差検証を行い，精度を出すだけですが，躓いている人続出だったので，残しておきます．
というか，ライブラリがあるので，私は英語の文献を読んで自分で解決して欲しいですが...
**正解は英語のサイトの方が多いです！！**

# 環境
Python3.6.2
MacOS Sierra 10.12.6
Pychram 2017.2

# 実装
## ソース

```python:main.py
# -*- coding: utf-8 -*-

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import LeaveOneOut
import numpy as np
import csv


# CSVから特徴量読み込み
# K近傍法の実装
# 交差検証法にはLOOCV(Leave-One-Out Cross Validation)
def main():
    K = 3  # K-NNのKの値
    correct_answer_count = 0  # 正解数初期化
    x = []  # 初期化
    y = []  # 初期化
    f = open("data/data_a.csv", 'r')  # fileのopen
    data = csv.reader(f)  # ファイルの読み込み(str型)
#------------------------------1---------------------------------
    for row in data:
        x1 = []
        y.append(int(row[0]))  # ラベルを取得
        for i in range(1, len(row)):  # 1列目から最後の列まで
            x1.append(float(row[i]))
        x.append(x1)
    x = np.array(x)  # xをnumpy行列に変換
    y = np.array(y)  # yをnumpy行列に変換
#------------------------------2---------------------------------

    loo = LeaveOneOut()  # LOOCVのインスタンス生成

    entire_count = loo.get_n_splits(x)  # テスト回数取得(csvファイルの行数)

    neigh = KNeighborsClassifier(n_neighbors=K)  # K-NNのインスタンス生成

    for train_index, test_index in loo.split(x):　　# loo.split(x)でいい感じに，sliceしてくれる
        x_train, x_test = x[train_index], x[test_index]
        y_train, y_test = y[train_index], y[test_index]
        neigh.fit(x_train, y_train)  # 学習させる
        result = neigh.predict(x_test)  # テストデータからラベルを予測する
        if result == y_test:  # ラベルと元々のラベルが一致していれば+1
            correct_answer_count += 1

    rate = (float(correct_answer_count) / float(entire_count))  # 正解率を計算
    print(str(rate))  # 正解率を出力


if __name__ == '__main__':
    main()

```

## 解説
所詮ライブラリ使っているので，解説も何もないですが...
ソースコードの1から2までが，学習させる特徴ベクトルへ変換しています．
具体的には，
- `ラベル=[1,1,...,2]`
- `特徴量=[[0.1,0.2,...,0,8],[0.1,0.2,...,0,8],...,[0.1,0.2,...,0,8]]`
みたいな形にしています．
**numpy行列**に変換したのは，参考サイトの流用です...

ソースコードの2より下が，学習と予測をLOOCV(Leave-one-out Cross Validation)という交差検証法を用いて精度を求めています．

# 終わりに
棚に上げますが，ライブラリを使用するときは，中身もちゃんと見て，アルゴリズム見て欲しいですね．
あと入力のイメージとい出力のイメージをしっかりもつこと．

# 参考
LOOCVのドキュメント
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.LeaveOneOut.html