OmniAICreator/Qiita-1.07M huggingface dataset:
Emacsで調子に乗ってキーバインドを変えまくっていたらひどい目にあった話

先日[「Emacs初心者だがオススメ設定を晒させてくれ」](http://qiita.com/blue0513/items/ff8b5822701aeb2e9aae)という記事をかいたが，その後も色々周りの人にオススメのショートカットなどを教えてもらっていた．
そんな中，調子に乗りまくって色々キーバインド変えて遊んでいたら本当に大変な目にあった話を書く．

## Enterキーが効かない
本当に大変だった...
なんせEnterキーが効かなかったら決定も改行もなにもできず，`Find ~/.emacs.d/init.el`とミニバッファに表示してからもファイルが開けず（RETコマンドが打てないので）手の打ちようがない．
頑張ってterminalの`open`コマンドでemacsを開いても，なぜかEnterキーを打つたびにミニバッファには`Minibuffer is inactive`の文字列．
**改行は未だにできない**

## 原因調査
仕事にならないからこんな夜中でも気合で対処するしかない．
とりあえず原因調査にかかった．StackOverflowやら色々なサイトを「emacs enter disabled」「emacs return minibuffer is inactive」などなど検索ワードを変えて検索したがいまいち．
八方塞がりだったが，ググるうちにemacsのキーバインド一覧を見ることの出来るコマンド`M-x descrive-bindings`を発見する．その中に

```
<return> windmove-down
```
と表示されていた．．．．
**あれ，原因これじゃね？**


## 対応
Enterキーが`windmove-down`にバインドされているのはわかったので，早速自分の`init.el`を確認．

```
(global-set-key (kbd "C-m")  'windmove-down)
```
**あれ，普通じゃね？**

しかし，色々探してるうちにちらっと見た[サイト](http://ergoemacs.org/emacs/keyboard_shortcuts.html)に，
**Keys to Avoid**の文字．
あれ？なんかそれっぽくね？と思ったのでちょっと読んでみると，

```
【Ctrl+m】 or Enter ↵ (These are tied together.)
```

**な，なんだってーーーー！！！**
つまり，`Ctrl+m`と`return`は同じ扱いということらしい．

とりあえずコメントアウトして`eval`

```
 ;; (global-set-key (kbd "C-m")  'windmove-down)
```

**ちゃんと治りました！！**

## まとめ
1. キーバインドを変更する前には`M-x descrive-bindings`する
2. キーバインドはやたらめったら変更しない
3. あせらない

## 参考サイト
[ErgoEmacs](http://ergoemacs.org/)
GitHub/GitLab 特定ディレクトリ配下のドキュメント群でwikiを一発更新する

## はじめに

- リポジトリの特定ディレクトリ配下のドキュメント群を一気にwikiにアップするエイリアスを作成しました。
- `git push --force`で強制pushするので、ドキュメント管理はあくまでメインリポジトリで行い、wikiは公開用、という場合に使えるかと思います。
- 逆に、ドキュメントはwikiで管理するという場合には適しません。

## つくったもの

### エイリアスの登録

```shell-session
$ git config --global alias.wikiupdate '!f () { git push `git config --get remote.origin.url | sed -e 's/.git$/.wiki.git/'` `git subtree split --prefix ${1}`:master --force ;};f'
```

### 使い方

リポジトリのルートディレクトリ `/path/to/your/repo` にて下記を実行することで、 `path/to/doc/dir` 内の全ドキュメントがwikiにアップロードされます。

```shell-session
$ cd /path/to/your/repo
$ git wikiupdate path/to/doc/dir
```

## 解説

### wikiのリポジトリを取得

- GitHub, GitLabでは、リポジトリのurlの最後の`.git`を`.wiki.git`に置き換えたものがwikiのリポジトリ
- `git config --get remote.origin.url`でリポジトリのurlを取得
- `sed -e 's/.git$/.wiki.git/'`で末尾を置換

```shell-session
`git config --get remote.origin.url | sed -e 's/.git$/.wiki.git/'`
```

### 特定ディレクトリ配下のみを切り出す

- `subtree split`は特定のディレクトリ配下のみを切り出して、コミットIDを発行してくれる

```shell-session
`git subtree split --prefix ${1}`
```

### wikiのリポジトリに強制push

- 取得したwikiのリポジトリのmasterへ、切り出した内容をpush

```shell-session
git push {リポジトリのurl} {commit ID}:master --force
```

### エイリアスに登録

- `git config` でglobalのエイリアスに登録
- 1番目の引数（対象ディレクトリ）を関数に渡す

```shell-session
git config --global alias.wikiupdate '!f () { ... ${1} ... }; f'
```
サーバの負荷に応じて加速するマリオBGMプレイヤー(html5<audio>)

こんにちは、エイチーム引越し侍の中川です。
「仕事をしながら、常に直感的にサーバの負荷状況を把握していたい」
今回はそんな要望を実現してみました。

# 概要
[1]サーバのロードアベレージを返すAPIと、
[2]HTML5のAudioタグで、
サーバの負荷に応じて再生速度を変えながら音楽が再生されるようにしました。
まずはこちらをご覧ください↓
https://youtu.be/u14rl3wgVSs
[![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/101405/84dca832-639a-77e9-7929-822dbb45ed8a.png)](https://youtu.be/u14rl3wgVSs)

# 背景(こじつけ)
* 日頃、直感的にサーバの負荷状況を知りたい
* 職場の非エンジニアも知りたい
* 視覚は気が散るのでそれ以外の何か
* 味覚、嗅覚→負荷上がると臭くなる→実現難しい、触覚→負荷上がると椅子にビリビリ...→いや難しい
* 「音」なら、PCのファンやエアコンの稼働音のように、鳴っていても日頃慣れて忘れることができる

# 音楽再生側

html5とjsで実装しました。
ちなみに、これはどこかのサーバに置かずローカルにあってもいいです。
以下の記述のあるhtmlとBGMの音データが同じ階層にあればOK。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Load Average Player</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
  audio = document.getElementById("bgm");
  audio.playbackRate = 1;
  document.getElementById("bgm").play();

  function checkLA() {
    // APIを呼ぶ
    $.ajax({
      type:"post",
      url:"/getLa.php",
      data: {
      },
      contentType: 'application/json',
      dataType: "json",
      success: function(data) {
        $('#current_la').text(data.la);
        // テンポの変わり具合をちょっと調整
        if (data.la < 0.3) {
          document.getElementById("bgm").playbackRate = 1+(data.la/2);
        } else {
          document.getElementById("bgm").playbackRate = 1+(data.la);
        }
      }
    });
  }
  setInterval(checkLA,1000);

  audio.loop = true;
});
</script>
</head>
<body>
  <div>load average： <span id="current_la">0</span></div>
  <hr/>
  <div id="content">
    <audio id="bgm">
      <source src="bgm.mp3">
    </audio>
  </div>
</body>
</html>

```

## 1.html5のaudioタグ

まずこれですね。

```html
<audio id="bgm">
  <source src="bgm.mp3">
</audio>
```
ほとんどimgタグみたいな感覚で使えます。ソースのあるサーバにmp3データを置いておいて、
src="hoge.mp3"って具合に指定するだけ。

## 2.ajaxでAPIたたく

まあ、これは、いいでしょう。

## 3.曲の再生速度を変える

```js
document.getElementById("bgm").playbackRate = 1+(data.la);
```

再生速度変えるのもとっても簡単、そう、html5ならね(笑)
playbackRate が1なら100%の再生速度です。今回はlaの値を足してます。
今回やってみてすげーと思ったのは、chromeの場合しか試してないですが、
再生速度あげてもピッチが変わらないんですよね。いわゆる早送りでキュルキュル・・・と
高い音になったり、反対にスローモーションで低い巨人の声みたいになったり、
普通に再生速度変えるだけだと周波数が変わることになるのでピッチ変わっちゃうはずなんですけど
ちゃんとピッチそのままでテンポだけが変わってました。すごい。
これ各ブラウザ調べてみたいです。

## 4.1秒ごとにAPIをたたく
```js
setInterval(checkLA,1000);
```
1000ミリ秒を指定。

## 5.繰り返し再生させる
```js
audio.loop = true;
```

最後まで再生したときに繰り返すかどうか。今回の用途では繰り返しです。

# API側
```php
<?php
date_default_timezone_set('Asia/Tokyo');
$la = sys_getloadavg();
$json_array = array(
  'la' => $la[0],
);
header("Content-Type: text/javascript; charset=utf-8");
echo json_encode($json_array);
?>

```
phpでロードアベレージ取得する関数あるんですね。
今回特にパラメータ受け取ることもないので、その関数の値をjsonで返してるだけです。

# やってみて
いったん、イメージしてた通りのものはできました。
閾値超えたらマリオで100秒切った時みたいにしてみたいです。

実際問題、職場で音楽流すわけにはいかないけど、とりあえず満足(笑)！
BLE で送信するパケットのサイズを拡張する際の注意点 (Android)

BLE で一度に送信できるデータサイズの上限はデフォルトでは 20 byte ほどですが、拡張することができます。
その方法とその際の注意点をまとめました。
※ central が Android の場合の方法です。

#拡張
BluetoothGatt.requestMtu(int mtu) というメソッドで拡張することができます。
上限は 512 byte　です。

# 注意点
下記のように、拡張と write などのリクエストを続けて行ってしまうと、 peripheral が反応してくれません。

```
mBluetoothGatt.requestMtu(50);
mBluetoothGatt.writeCharacteristic(characteristic);
```

そのため、拡張のリクエストを送ったperipheral でパケットサイズの変更が終わるまで待つ必要があります。
peripheral での処理が終わると central の BluetoothGattCallback.onMtuChanged()　が呼ばれます。
なので、　BluetoothGattCallback.onMtuChanged()　が呼ばれるのを待って write などの処理を開始するとうまく動作させることができます。
Oracle Certified Java Programmer, Silver SE 8 を取るためにしたこと

Oracle Certified Java Programmer, Silver SE 8 の試験に合格したのでやったことをまとめます。

#私の受験結果
## 受験時のレベル
Java を使い始めて約 2 年。
Java の資格試験の受験は初。

## 勉強時間
約 2 週間

## 結果
正答率 91% で合格

##やったこと
[徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Silver-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-808/dp/4844339931/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)の問題を解きました。
全ての問題に正解できるようになるまで繰り返し解きました。

#おすすめの勉強法
##ある程度 Java の経験がある場合
上にあげた参考書の「総仕上げ」問題を解けば十分だと思います。
本番の試験でもこの「総仕上げ」に載っている問題と同じ問題が全体の 7 割ほど出題されていました。

## Java の経験がない、自信がない場合
いきなり総仕上げ問題に取り組んでも解けないと思うので最初から問題を解き、解説を読んでいきましょう。
ただ、時間がない場合はいきなり総仕上げ問題に取り組んでもいいかもしれません。ここで出題される問題を確実に解けるようになれば、合格ラインは十分目指せます。

#注意した方がいいこと
勉強する時間さえ確保できれば合格は難しくないはずです。
なので、試験以外の注意点をあげたいと思います。
Oracle Certified Java Programmer　の資格を受験する際にはピアソンVUEを通して試験の申し込みをすることになります。また、試験の結果を確認するためには Oracle のアカウントを作って専用のサイトにログインする必要があります。しかし、ピアソンVUEのアカウントを新規作成した場合、その内容が Oracle のサイトに反映されるまでに一週間かかります。そのためピアソンVUEのアカウントを受験日の一週間以上前に作らないと受験結果を受験後にその場で確認することができません。
この資格試験を受験する予定があり、まだピアソンVUEのアカウントを作っていないのであれば早めに作っておくことをおすすめします。
[CentOS7]pyenvを使ってanacondaをインストール

CentOS7にpyenvとanacondaをインストールしたいと思います。

##事前準備
最初に必要になるライブラリをインストールしておきます。
(下記のライブラリのうちインストールされてないものをインストール)

```:Terminal
$ sudo yum -y install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
```

#pyenvのインストール
```:Terminal
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```
これでpyenvがインストールされました。

一応PATHの確認

```:Terminal
$ which pyenv
~/.pyenv/bin/pyenv
```

#anacondaのインストール
```:Terminal
$ pyenv install -l | grep anaconda
  (省略)
anaconda3-4.2.0
anaconda3-4.3.0
anaconda3-4.3.1
$ pyenv install anaconda3-4.3.1
$ pyenv global anaconda3-4.3.1
$ python -V
Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
```
anacondaのインストールが完了しました。
次にPATHを通しておきます。

```:Terminal
$ echo 'PATH="$PYENV_ROOT/versions/anaconda3-4.3.1/bin/:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

最後にcondaとanacondaのアップデート

```:Terminal
$ conda update conda
$ conda update anaconda
```

#参考
- https://github.com/pyenv/pyenv
- https://docs.continuum.io/anaconda/install
Swift 3.1: prefix(while:_) / drop(while:_) の使い方


# TL;DR
Swift 3.1 で Sequence に追加されたAPI。
Haskellにおける `takeWhile` と `dropWhile`。

```swift
let isEven: ((Int) -> Bool) = { $0 % 2 == 0 }
let xs = [2, 4, 6, 1, 3, 8]
xs.prefix(while: isEven) // => [2, 4, 6]
xs.drop(while: isEven)   // => [1, 3, 8]
```

# Trailing Clojure

```swift
xs.prefix { $0 % 2 == 0 }  // => [2, 4, 6]
xs.drop   { $0 % 2 == 0 }  // => [1, 3, 8]
```

# 文字列で使ってみる

```swift
let s = "Hello world!"
String(s.characters.prefix { $0 != " " }) // => "Hello"
String(s.characters.drop   { $0 != " " }) // => " world!"
```

# 参考
https://github.com/apple/swift-evolution/blob/master/proposals/0045-scan-takewhile-dropwhile.md

# 終わり
最近Qiita投稿してなかったので軽いものを書いてみました。
個人的にはやっぱり`takeWhile`なのですけれども。
テスト投稿

```Processing:blockBreakOriginal.pde
//
// ブロック崩し (バー操作はマウス式)
//ブロックを中央に配置、数も500個に増やしnoStrokeを使用してデザインを変更
//ブロックの配置変更に伴って、最初のボール発射位置も変更
//バーを画面上部に追加、天井にボールが当たってもゲームオーバーとした
//ブロック破壊の難易度を5段階に引き上げ、色を変更
//ゲームオーバー、またはゲームクリアのときに「Press Mouse to restart!」の案内を明記し、
//マウスボタンをクリックすることでまたゲームを始められるようにした
//ボールのサイズと速度もa若干変更

//

// ブロック崩し本体
BlockBreak blockBreak;
  
// セットアップ
void setup() {
  size(400, 500);         // ウインドウ設定
  fill(0, 0, 0);          // 塗りつぶし初期値
  blockBreak = new BlockBreak();
}
  
// 1フレームごとの描画処理
void draw() {
  background(255, 255, 255);      // 背景の初期化(フラッシュ)
  blockBreak.draw();
}
```
Swiftで可変長引数に渡す引数が0個のときのやり方と挙動まとめ

可変長引数に渡す引数が0個のときのをやり方と挙動をSwift 3.0.2で検証。

#外部引数名がないもの
単に引数を省くだけである。

```swift
func testValArg(_ a: Int...) {
}
testValArg() //省くだけ
```

#外部引数名があるもの
これも外部引数名ごと省くだけである。外部引数名をつけてはだめ。

```swift
func testValArg(a: Int...) {
}
testValArg() //まるごと省くだけ
```



#可変長引数以外が同名の関数が他に定義されているとき
外部引数ごと省くとなると同名関数とバッティングする。例えばこの場合どうなるか。

```swift
func testValArg() {
	print("なし")
}
		
func testValArg(a: Int...) {
	print("あり")
}

testValArg() //なしと表示
```
これはコンパイルエラーにはならない。
呼ばれるのは引数なしの方になる。
この同名関数を削除すると当然可変長引数のものが呼ばれる。

```swift
func testValArg(a: Int...) {
	print("あり")
}

testValArg() //ありと表示
```

#ちなみに
外部引数名をつけたときはエラーになるが、そのエラーメッセージは定義されている引数の個数によって異なる。
1つのとき

```swift
func testValArg(a: Int...) {
}
testValArg(a:) //Expression resolves to an unused function
```

2つのとき

```swift
func testValArg(a: Int, b: Int...) {
}

testValArg(a: 1, b:) //Expected expression in list of expressions
```

引数が2つのときは引数が与えられていない状態と解釈出来ているが、1つのときは（実行指令ではなく）単に関数が書かれている状態という解釈と思われる。例えば

```swift
let atodeyaru: (Int...) -> Void = testValArg(a: )
```
のような使い方をするときの解釈である。
[JavaScript] ”クリップボードにコピー” ボタンを実装する（clipboard.jsの使い方）

`clipboard.js` の使い方メモ。すごく簡単に `クリップボードにコピー` ボタンを追加できます。

[clipboard.js — Copy to clipboard without Flash](https://clipboardjs.com/)

ライセンスは `MIT license` です。

# インストール
## cdn

[CDN Providers · zenorocha/clipboard.js Wiki](https://github.com/zenorocha/clipboard.js/wiki/CDN-Providers)

## npm

```console:npm
$ npm install clipboard --save
```

# 使用例

基本的に `data-clipboard-target="#idname"` で任意のidを指定するだけで良いです。

```html:index.html
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.6.0/clipboard.min.js"></script>

<input type="text" value="クリップボードコピーテスト(input)" id="input_test">
<button class="btn" type="button" data-clipboard-target="#input_test">Copy</button>

<textarea id="textarea_test">
クリップボードコピーテスト(textarea)
</textarea>
<button class="btn" type="button" data-clipboard-target="#textarea_test">Copy</button>

<script>
(function() {
'use strict';

var clipboard = new Clipboard('.btn');

clipboard.on('success', function(e) {
    console.info('Action:', e.action);
    console.info('Text:', e.text);
    console.info('Trigger:', e.trigger);
    
    e.clearSelection();
});

clipboard.on('error', function(e) {
    console.error('Action:', e.action);
    console.error('Trigger:', e.trigger);
});

})();
</script>
```

オプションとして `data-clipboard-action="cut"` の指定で切り取りに変更もできます。

# Vue.jsと組み合わせて使用する場合

※Vue.jsと組み合わせて使用する場合はやり方が若干異なります。以下の記事を参照してください。

[[Vue.js][clipboard.js] Vue.jsとclipboard.jsを組み合わせて使用する - Qiita](http://qiita.com/koara-local/items/7c0155306e158d76526b)

# 参考
[clipboard.js — Copy to clipboard without Flash](https://clipboardjs.com/)
javascript iteratorのnext呼び出しタイミング

ちょっと調べたのでメモ。
スプレッド関数とか配列に変換する場合、最初に一気に呼ばれる。`for(x of iterator)`の場合は逐次呼ばれる。

[Iteration protocols - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols "Iteration protocols - JavaScript | MDN")

以下をchromeのconsoleで実行する。

```js
itr = {
  [Symbol.iterator]: () => ({
    i: 1,
    next: function(){
      console.log(this.i)
      return { value: this.i, done: this.i++ > 10 }
    }
  })
}

Array.from(itr).forEach(i => console.log('for-each')) // 1
for(j of itr){console.log('for')} // 2
```

1の場合、最初に数字がバッと出て後で`for-each`とまとめて出る。
2の場合、数字と`for`が交合に出る。
1の方が今風って感じですが、2の方が安全。中間操作とかないし。当たり前のことを確認してしまった感もあります。
  
まぁこれでStreamみたいな事ができるかも。
Raspberry PI 3 + OpenCV 2.4 + ruby-opencv で顔認識はおそすぎる

## 参考

1. http://shokai.org/blog/archives/8627
2. https://github.com/ruby-opencv/ruby-opencv/issues/72

## cascadeファイルのダウンロード
すでに存在する"/usr/local/share/OpenCV/haarcascades/"以下のcascadeファイルは、
参考2により、フォーマットの互換性に問題がある。

そのため、別のものを用意する。
https://raw.githubusercontent.com/Itseez/opencv/2.4.10.4/data/haarcascades/haarcascade_frontalface_alt.xml

## 実装

ほぼほぼ参考1のコード

```
require 'opencv'

window = OpenCV::GUI::Window.new "face detect"
capture = OpenCV::CvCapture.open
detector = OpenCV::CvHaarClassifierCascade::load "./haarcascade_frontalface_default.xml"

loop do
  image = capture.query
#  image = image.resize OpenCV::CvSize.new 640, 360 
  image = image.resize OpenCV::CvSize.new 320, 240 # ここだけ書き換え
  detector.detect_objects(image).each do |rect|
    puts "detect!! : #{rect.top_left}, #{rect.top_right}, #{rect.bottom_left}, #{rect.bottom_right}"
    image.rectangle! rect.top_left, rect.bottom_right, :color => OpenCV::CvColor::Red
  end
  window.show image
  break if OpenCV::GUI::wait_key(100)
end

```

## 結果

pythonと比べ、話にならないぐらい遅い。。。。
リアルタイム性はほとんど感じられない衛星通信レベル。
上限、下限つきの値を生成するクラス(ジェネリクス対応)[kotlin]

キーワード：Range、制限、リミット,limit
#目的

GoogleGuavaのRangeクラスのように範囲内に入っているかをBooleanで返すのではなく、値を変化させたときに

上限を超えた場合->上限値
下限を下回った場合->下限値

とするようなクラスが欲しかったのでジェネリクス対応で作った。
同じ初期値、上限、下限の値を用意したいときに有効..かな


#コード

```kotlin

fun main(args : Array<String>){
    val limitedValue = LimitedValue<Int>(initialValue = 1,MAX_VALUE = 10,MIN_VALUE = 0)
    limitedValue.value = 100
    println(limitedValue.value)

    val limitedDoubleFactory = {LimitedDouble(
            initialValue = 10.0,
            MAX_VALUE    = 100.0,
            MIN_VALUE    = 0.0,
            calcMethod   = fun Double.(others  : DoubleArray) : Double = this + others.sum())}
    val limitedDouble = limitedDoubleFactory.invoke()
    println(limitedDouble.setValueProcessArgumentsInTheRange(10.0,20.0))
}

class LimitedDouble private constructor(private val limitedValue: LimitedValue<Double>,private val calcMethod : Double.(DoubleArray)->(Double)) {

    constructor(initialValue: Double,MAX_VALUE: Double,MIN_VALUE: Double,calcMethod: Double.(DoubleArray) -> Double)
            : this(limitedValue = (LimitedValue(initialValue, MAX_VALUE,MIN_VALUE)), calcMethod   = calcMethod )
    fun setValueProcessArgumentsInTheRange(vararg values : Double) : Double = calcMethod(limitedValue.value,values)

}

class LimitedValue<T : Comparable<T>>(private val initialValue : T,private val MAX_VALUE : T,private val MIN_VALUE : T){
    var value : T = initialValue
        set(value) = when {
            value > MAX_VALUE -> field = MAX_VALUE
            value < MIN_VALUE -> field = MIN_VALUE
            else -> field = value
        }

    init {
        require(MIN_VALUE < MAX_VALUE){"MAX_VALUE should be bigger than MIN_VALUE"}
        require(initialValue <= MAX_VALUE){"Initial Value should be smaller than MAX_VALUE"}
        require(initialValue >= MIN_VALUE){"Initial Value should be bigger  than MIN_VALUE"}
    }
}
```
コマンド実行時にハッシュタグをつけて履歴から検索しやすくしてみる

本当にちょっとしたことなのですが、

 - よく使うコマンドなのにちゃんと覚えていない
 - 毎回調べるのも面倒
 - 覚えているけど少しでも楽したい
 - `Ctrl+r` での検索ではノイズが多い
 - かといって専用のツールいれるほどでもない

というときに自分がたまにやる小技です。

```:コマンド実行
[user@localhost ~]$　find . -type f -print0 | xargs -0 mv -t /var/tmp/ #taihi
```

\#がコメントの書式であることを利用して、ハッシュタグをつけるようなイメージです。
ここでは \#taihi というタグをつけてるイメージです。
（コマンドの中身は[こちら](http://uguisu.skr.jp/Windows/find_xargs.html)を参考にさせていただきました）

こうしておいて、あとで `Ctrl+r` で検索する際に `#taihi` と入力して、再実行します。

```:履歴を検索
[user@localhost ~]$ (Ctrl+r入力)
(reverse-i-search)`#taihi': find . -type f -print0 | xargs -0 mv  /var/tmp/ #taihi
```


# 参考
- [何度も同じコマンド調べ直すのやめませんか？](http://qiita.com/knqyf263/items/01ff865bbab2f5e48d1e)
    - ツールでもっと便利にしたいという場合はこちらの pet というツールが便利そうです。
ウェブフロントエンドフレームワークの正式表記が紛らわしい(React,Angular,Vue.js,Riot)

# React
react.jsなどのように".js"を付けた表記をよく見かけるが公式サイトにそのような表記はない。"React"が正式表記

# Angular
バージョン1のときはAngularJSが正式表記だったがバージョン2からはAngularとなった。

# Vue.js
Vue.jsは".js"まで含めたものが正式表記

# Riot
Riot.jsという表記をよく見るが、正式表記はRiot

# まとめ
ん～、こうしてみると、Vue.js だけが異端なのかも。
node-opencvを使ったテンプレートマッチング実践

# 概要

[node-opencv](https://github.com/peterbraden/node-opencv)を用いたテンプレートマッチングの実践録。
あまり実装例がなかったので、試行錯誤した結果を載せてみます。

ソースは[こちら](https://github.com/kazuma-ickw/IonI)。
docker-composeを用いての環境構築とテンプレートマッチングを行うアプリケーション入りです。

# テンプレートマッチングとは

テンプレートマッチングとは、探索対象の画像内からテンプレート画像が出現する座標を探索するものです。
例えば指定の画像内に指定のアイコンが存在するかなどを探すことができます。

# 実装

## 環境

環境は https://hub.docker.com/r/siomiz/node-opencv/ を利用して、構築しています。
ほぼそのままです。

## 実装

以下がコードです。今回は複数のテンプレートを探索して、各テンプレートにマッチしてる座標があるかどうか(探索画像内にテンプレートが現れるか)を見ています。

```js
cv.readImage(BASE_IMAGE_PATH, function(err, baseImage) {
  if (err) return console.error('error loading image');
  baseImage.convertGrayscale()

  var results = []
  for (var searchImagePath of searchImagePaths) {
    // 検出対象画像を読み込み、マッチングを行う
    cv.readImage(searchImagePath, function(err, searchImage) {
      if (err) return console.error('error loading image');
      searchImage.convertGrayscale()

      let output = baseImage.matchTemplateByMatrix(searchImage, 3);
      let matches = output.templateMatches(0.99, 1.0, 5, false)
      console.log(matches)

      if (matches.length > 0 && typeof(matches[0]) != 'undefined') {
        console.log('match!')
        results.push(true)
      } else {
        console.log('unmatch!')
        results.push(false)
      }
    })
  }
  console.log(results)
})
```

苦慮したところがいくつかあるのであげておきます。

### 背景色

```js
baseImage.convertGrayscale()
```

これは文字どおりグレースケールに変換する関数なのですが、これはテンプレート画像の背景色と探索画像の背景色が違う場合にもマッチングが取れるように行なっています。
もし、その場合はマッチングと判定しない場合は不要かもしれません。
また、グレースケールに変換するため画像はjpgで用意しました。

### matchTemplate

```js
let output = baseImage.matchTemplateByMatrix(searchImage, 3);
let matches = output.templateMatches(0.99, 1.0, 5, false)
```

```matchTemplate``` という関数もあるのですが、なかなかうまくいかず・・・。
```matchTemplateByMatrix``` を利用して、opencv内で画像データ保持に用いられるMatrixオブジェクトとして吐き出してから、マッチング結果を検出する ```templateMatches``` 関数を実行するとうまくいきました。

ちなみに ```templateMatches``` 関数の第一引数、第二引数はどれくらいの割合の類似が見られた場合にマッチングしたとみなすかの下限・上限の設定になっています。
今回の例だと 99%~100%をマッチングとみなすようになっていますが、この値はどの程度の精度を求めるかによって調整していく必要があります。

```templateMatches``` の結果は以下のように返ってきます。
指定の割合範囲のマッチングが見られた座標と確からしさ(probability)がオブジェクトとして、配列に入って返却されます。
返却される要素数は第三引数によります。また、マッチングがない場合は空の要素が返却されます。
以下は1座標のみマッチングが検出された際の例です。

```js
[ { x: 4, y: 159, probability: 0.9926717877388 }, , , ,  ]
```

# まとめ

node-opencvでテンプレートマッチングを試してみた事例でした。
個人的には慣れているのでNode.jsを今回選択したのですが、情報量にだいぶ差があるようなので余程の事情がなければ情報量が多そうなPythonやC++を利用することをお勧めします・・・w

OpenCV自体は初めて触りましたが、これ以外でも様々機能があり画像処理には重要な技術だと実感したので、今後もいろいろ試してみようと思います。
Hyper-V 上の Windows 10 VM で Docker（Windows コンテナ）を使おう

# はじめに

Windows 10 で Docker（というか Windows コンテナ）を使うためには Hyper-V を有効にする必要があります。ということで、Hype-V 上の VM で Hyper-V を有効にして（Nested Virtualization）、VM 上で Docker を動かしてみます。ホストも VM も、Windows 10 Pro か Enterprise の Anniversary Update 以降が必要です。（ホストは Windows Server 2016 でも OK）

# Nested Virtualization 有効化

Hyper-V 上の VM に Windows 10 をインストールしたあと、VM を停止した状態で、Hyper-V ホストで以下の PowerShell コマンドを実行して Nested Virtualization を有効化します。

```ps1
> Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
> (Get-VMProcessor -VMName <VMName>).ExposeVirtualizationExtensions # 有効化の確認
True
```

以降の作業はすべて VM 側で実施します。

# Hyper-V とコンテナの有効化

Nested Virtualization を有効化したら VM 上で PowerShell を管理者として起動して以下のコマンドを実行します。（要再起動）

```ps1
> Enable-WindowsOptionalFeature -Online -FeatureName containers -All
> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
```

有効化の確認。

```ps1
> (Get-WindowsOptionalFeature -Online -FeatureName containers).State
Enabled
> (Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V).State
Enabled
```

# Docker for Windows のインストール

Docker for Windows をダウンロードしてインストールします。

```ps1
> Invoke-WebRequest -Uri https://download.docker.com/win/stable/InstallDocker.msi -OutFile ~\Downloads\InstallDocker.msi
> cd ~\Downloads\
> .\InstallDocker.msi /passive
```

docker コマンドを使ってバージョン確認します。環境変数 Path の再読み込みのため、PowerShell を再起動してから実行します。

```ps1
> docker --version
Docker version 17.03.1-ce, build c6d412e
```

デスクトップの Docker for Windows をダブルクリックして Docker を起動しましょう。（スタートアップに自動登録されるため以降は OS 起動時に自動起動されます）

# Hello World（Linux コンテナ）

動作確認のために Hello World を実行します。とりあえず Linux コンテナから。

```
> docker run hello-world
```

# Hello World（Windows コンテナ）

Linux コンテナと Windows コンテナは同時に起動できず、切り替える必要があります。タスクバーの Docker アイコンを右クリックして Switch to Windows containers... を選択して Windows コンテナに切り替えます。

切り替えたら Hello World を実行しましょう。（400MBぐらいダウンロードします）

```
> docker run hello-world:nanoserver
```

# 蛇足

Microsoft 的には -er で終わる単語の日本語訳は長音になる決まりなので正しくはコンテナじゃなくて「コンテナー」なんですが、日本語としては微妙...。
Raspberry pi3で、複数のWifiアクセスポイントに対応する設定

#概要
Raspberry pi3には無線LAN機能がついてます。複数のアクセスポイントに対応できると、自宅のWifiに繋いでおいて、外出時にはポータブルWifiでつないで、みたいなことができると便利です。
MacやWindowsでは普通に実現できていることですが、Linuxではちょっと調べないと面倒でした。
OSは Raspbian GNU/Linux 8 (jessie)です。

#設定
ここでは、HomeWifiと、W03Wifiの２つのアクセスポイントのどちらかに繋がるようにします。
IPアドレスは固定とします。
intefaceの中に、HomeWifiと、W03Wifiを２つ並べて書きます。
さらに、対応するSSIDとPSKは、wpa_supplicant.confに２つ書きます。
pskは、`wpa_passpharase`コマンドで作ります。これについては参考サイトに詳しい手順が書かれてます。

##interfaces

```
# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet dhcp
 
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

iface HomeWifi inet static
address 192.168.0.100
netmask 255.255.255.0

iface W03Wifi inet static
address 192.168.0.100
netmask 255.255.255.0
```

##/etc/wpa_supplicant/wpa_supplicant.conf

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="AirPort42918" 
       　　psk=2d851fce8e72885ab5bb7fc146863bdfc05f84f9d8e0df688e065e5adacc666
        key_mgmt=WPA-PSK
        proto=WPA
        priority=0
        scan_ssid=1
        id_str="HomeWifi"
}

network={
        ssid="W03_F4CB52F2EDAC"
     　　　　　　psk=040c126647ed0d909fda71aa7860de97aa3061a2548823e7e70304958a6ef03
        priority=1
        scan_ssid=1
        id_str="W03Wifi"
}
```

id_strで、interfaceの中の設定と対応づけます。
これで、どちらかのWifiに自動的に繋がるようにできました！

#参考サイト
Debian で WPA-PSK(AES) 方式で無線接続 - wpa_supplicant 編
http://qiita.com/t_uda/items/a29874cbeecd080ea2fe
【SEO】GoogleAnalyticsAPI を Python で利用した時の流れ・サンプルコード


#はじめに

今回はアナリティクスAPIをPythonで利用した時の流れを非プログラマの視点からわかりやすく説明（したつもり）
サンプルコードも掲載してありますので、developersに登録さえ乗り越えれば楽しめると思います。

#注意
普段はマーケッターという肩書きで活動しているものなのでプログラミングスキルはほぼ皆無です。
なのでより良い記述のためにアドバイスなどありましたらぜひご教授お願い致します。

#流れ
- Google Developer ConsoleからAPI有効化や認証キーの取得する
- Google Client ライブラリをインストールする
- sample を実行する
- 必要なデータを取得するためにdimention・metricsにどんなものがあるのか目を通しておく
- Let's Analyse!

#最初にして最大の難関 Google Developers登録
plantuml のカラー設定ファイルを作成する

# 概要
自分が使っているplantumlのカラー設定を載せる。
各ファイルから同じ設定ファイルを参照すると、デザインが統一されて良い感じ。

今のところあんまり頑張ってないので、適宜更新する。

# 使い方
- 適当なところに設定ファイルを置く
    - ここではplantumlファイルと同じディレクトリに、plantumlcolor.incを作成する
- 以下のようにplantumlファイルの先頭に`!include`を記載

``` test.plantuml
@startuml test.svg
!include plantumlcolor.inc
title test

以下は内容
```

# 設定ファイル
``` plantumlcolor.inc
skinparam {
  defaultFontColor #4c3f52
  backgroundColor #fdfbf4
  borderColor #828282

  noteFontColor #4c3f52
  noteBackgroundColor #f9f3ef
  noteBorderColor #3c2f41
}

skinparam sequence {
  ArrowColor #828282

  LifeLineBorderColor #3c2f41
  LifeLineBackgroundColor #fcf9ef

  ActorBorderColor #3c2f41
  ActorBackgroundColor #fcf9ef
  ActorFontStyle bold

  ParticipantBorderColor #3c2f41
  ParticipantBackgroundColor #fcf9ef
  ParticipantFontColor #d05a6e
  ParticipantFontStyle bold

  BoxBorderColor #3c2f41
  BoxBackgroundColor #fcf9ef
  BoxFontColor #d05a6e
  BoxBorder 1
}

skinparam state {
  ArrowColor #3c2f41
  StartColor #3c2f41
  EndColor #3c2f41
  BackgroundColor #fdfbf4
  BorderColor #3c2f41
}
```
Windows10 に Docker for Windows をインストールする手順

# やりたいこと

* Windows 10 に Docker for Windows をインストールする。

# 前提環境

| # | Type | Software |
|:-- |:-- |:-- |
| 1  | ClientOS | [Microsoft Windows 10 Enterprise 10.0.14393 ビルド 14393](https://msdn.microsoft.com/ja-jp/subscriptions/downloads/hh442898.aspx#FileId=71099) |

# インストールするソフトウェア

| # | Type | Software |
|:-- |:-- |:-- |
| 1  | Container Host | [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) |

# 手順

## インストーラをダウンロード

- [https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows](https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows) へアクセス
- `Get Docker for Windows [Stable]` を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/72a5c094-8bb3-186e-52aa-eb113f932d85.png)

## インストーラを実行

- `%userprofile%\Downloads\InstallDocker.msi` を実行。（ダブルクリック）

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/d1e5c8af-3b80-e878-e267-589701a92e33.png)

## ウィザードに沿ってインストールを進める

- [x] `I accept the terms in the License Agreement` 
- `Install` ボタンを選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/37c40133-3563-5b3d-5d4e-c7d6146f0b7e.png)

- [x] `Launch Docker`
- `Finish` ボタンを選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/dc08975a-6d85-6051-678c-e715787ed586.png)


- アドレスバーにDockerアイコンが表示されている。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/6dda7768-bfd8-ac9d-6efe-1a9201171627.png)

## インストールされたか確認

### Hyper-V（Windowsの標準機能）の設定が有効化されたのかを確認

- `スタートメニュー` - `コントロール パネル`

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/86772ffa-7126-64a6-436b-3d2092f1fd17.png)

- `プログラムと機能` を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/8dd5a968-7c76-b7ac-45bb-d5a71f3a26c3.png)

- `Windows の機能の有効化または無効化` を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/ff97854f-d0bc-c231-f368-dc14f2d82aa4.png)

`Hyper-V` を含む、配下全てにチェックが [x] されていればOK。

- [x] `Hyper-V`
  - [x] `Hyper-V プラットフォーム`
    - [x] `Hyper-V Hypervisor`
    - [x] `Hyper-V サービス`
  - [x] `Hyper-V 管理ツール`
    - [x] `Hyper-V GUI 管理ツール`
    - [x] `Windows PowerShell 用 Hyper-V モジュール`

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/6b96f723-6da9-e650-4379-4b21be7b59b4.png)

### Dockerコマンドを実行できるかを確認。

- `PowerShell` を起動。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/abfcee3c-53a4-7f25-9691-25a5388ba893.png)

- バージョン確認コマンドが正常に実行できるか確認。

```ps1:powershell
PS C:\> docker -v
```

```ps1:result
Docker version 17.03.1-ce, build c6d412e
```
---

# 完了
shinydashboardのbox()のtitleを限界までいじってみる

###shinyにおけるvisualizationの階層化
shiny(shinydashboard)ではサイドバーメニュー、タブなどを駆使して見たいデータを階層化することが可能です。ただし1つのテーマのvisualizationはタブやメニューで分けると行ったり来たりして見ないといけなくなるので、できれば同一画面内で表現しきることが重要です。今まではvalueBoxとグラフをbox()内に配置して不必要なものは畳む、みたいな使い方をしていたのですが、畳むと見えなくなってしまうので困っていました。

###数値の表示とアイコンの表示、またその組み合わせがtitleでできます
いろいろ調べてみるとtitleを動的に変えられたりアイコンを並べたりみたいなことができることが分かったので、ここにやり方を記載しておきます。サマリ指標をtitleに乗っけておいて畳んでおき、詳細を見たい場合は開いてグラフを見る、などが可能になると思います。下のサンプルではselectInputを選ぶとandroidのboxの数値が変わります（特に意味ないデモですみません、、）。

![スクリーンショット 2017-03-30 22.15.13.png](https://qiita-image-store.s3.amazonaws.com/0/103775/3e45742e-e246-60d8-e673-8c86008122be.png)

###サンプルコード
上記のコードのサンプルです。CSSいじってタイトル間のスペースをもう少し詰めると美しくなるかもしれませんね。

```
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(
      menuItem("plot", tabName = "plot", icon = icon("stethoscope"))
    )
  ),
  dashboardBody(
    fluidRow(
      box(
        title = tagList(icon("github"), "github"),
          solidHeader = TRUE, status = "success", collapsible = TRUE, collapsed = TRUE, #icon = icon("stethoscope"),
        flowLayout(
          selectInput(
            "select", "select:", c("v1" = "7.1.1", "v2" = "6.0.2")
        ))
      ),
      box(
        title = tagList(icon("android"),textOutput("and_ver",inline = TRUE)), solidHeader = TRUE, status = "info", collapsible = TRUE, collapsed = TRUE, "Box content"
      ),
      box(
        title = tagList(icon("facebook"), "facebook"), solidHeader = TRUE, status = "primary", collapsible = TRUE, collapsed = TRUE, "Box content"
      ),
      box(
        title = tagList(icon("hand-o-right"), "right"), solidHeader = TRUE, status = "warning", collapsible = TRUE, collapsed = TRUE, "Box content"
      )
    )
  )
)
server <- function(input, output) {
  output$and_ver <- renderText({
    paste('Version',input$select)
  })
}

shinyApp(ui, server)
```
#iOS POSOってなに？似ているValue Object・Entity・DTOと比べてみました

# What is POSO ? 
## Plain Old Swift Object
try! Swift2017、 Mr.Jon Bott によるLTで取り上げられました
下記のSwift版に当たるでしょう

* POCO -- `Plain Old CLR Object`の略
* POJO -- `Plain Old Java Object`の略

## 似ているオブジェクトとの違い
他言語を参考に以下のオブジェクトとの違いを比べてみました

* Value Object
* Entity
* DTO
* DAO

# Value ObjectとEntity
* Getterのみ
* ロジックを持つ
* 値は不変（immutable）
* DTOと同義とされることが多い
* Entityにはアイデンティティがあり、VOにはない
* コンストラクタのみで生成可能
* 一般的には、レイヤー間の境界線上で持ち越される（DTO）には使われない

# DTO
* Getter / Setter
* ロジックを持たない
* VOと同義とされることが多い
* Layer間のオブジェクトの受け渡しなどに使われる

# DAO
* デザインパターンの一種
* 永続レイヤーからのオブジェクトアクセスのメカニズムを提供する

# まとめ
参考資料によって、いろいろな見解はあるものの、以下のようにまとまりそうです

| Object | Logic | Getter | Setter | Identity |
|:-------------|:-:|:-:|:-:|:-:|
| POSO         | △ | ○ | △ | △ |
| Value Object | ○ | ○ | × | × |
| Entity       | ○ | ○ | × | ○ |
| DTO          | × | ○ | ○ | × |

以上です、ありがとうございました :tada:

# 参考資料
* [Difference between DTO, VO, POJO, JavaBeans?](http://stackoverflow.com/questions/1612334/difference-between-dto-vo-pojo-javabeans)
* [【JavaBeans】BeanとDTOとEntityとVOとFormの違いって何？](http://yyyank.blogspot.jp/2013/07/javabeansbeandtoentityvoformwhat-is.html)
* [JavaBean, POJO, VO, DTO, DAO @JKNB](http://java-base.com/javabean-vs-dto-vs-pojo-jknb/)
* [エンティティをインタフェースではなくPOJOに](http://d.hatena.ne.jp/taedium/20090925/p1)
* [DTO vs Value Object vs POCO](http://enterprisecraftsmanship.com/2015/04/13/dto-vs-value-object-vs-poco/)（図あり、要約がわかりやすい）
* [Entity vs Value Object: the ultimate list of differences](http://enterprisecraftsmanship.com/2016/01/11/entity-vs-value-object-the-ultimate-list-of-differences/)（Entity と ValueObjectの違いわかりやすい）

参考になりました。
ありがとうございます :tada:
Raspberry PI 3 + OpenCV 2.4 + ruby-opencvをインストール

## 参考

### 本家
http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html

### ググって見つけた詳しそうなサイト
http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/
* 上記はpython環境も含まれる -> インストールしない
* 上記ではopencv-3をインストールしてる -> 2.4に読み替える


```
$ ruby -v
ruby 2.1.5p273 (2014-11-13) [arm-linux-gnueabihf]
```

## OpenCV 2.4のインストール

* makeに結構時間がかかる。1時間ぐらい。SSHじゃなくて直接実行するのがおすすめ

```
$ sudo apt-get install build-essential cmake pkg-config
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
$ wget -O opencv.zip https://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.13/opencv-2.4.13.zip

$ cd oepncv-2.4.13.zip
$ mkdir release

$ cd release
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make

$ sudo make install
```
この実行により、/usr/local/lib にOpenCVのライブラリがコピーされる


以下を知らなかったため、小一時間ハマった。
コレ無しでrubyでrequired 'opencv'すると、
"LoadError: libopencv_nonfree.so.2.4: cannot open shared object file: No such file or directory - /var/lib/gems/2.1.0/extensions/arm-linux/2.1.0/ruby-opencv-0.0.18/opencv.so"ってエラーが出る。

```
$ ldconfig
```

## ruby-opencvのインストール

ruby-opencvのインストール
https://github.com/ruby-opencv/ruby-opencv

```
$ sudo apt-get install ruby-dev
$ sudo gem install ruby-opencv -- --with-opencv-dir=/usr/local/lib
```

お試し

```
$ irb
irb(main):001:0> require 'opencv'
=> true
irb(main):002:0> 
```
create-react-appしたpepperのアプリをビルドしたらQiSessionのチェックでこけた。

# Reactってかっこいい！
HTMLでロボアプリを作ってるけど、読み込みがもっさりしていました。
Reactは高速らしいし、SPAで作れば動きは快適になるかもしれないと思ったので、
create-react-appを使って実験実装。

## create-react-appを使うと簡単に環境構築できるらしい。

```bash
$ npm i --save create-react-app
```

## Reactは動いた。アプリのレスポンスも改善された。しかし…
pepper開発におなじみのqimessaging.jsはそのままでは、ビルドできません。
例えばこんなコード。

```js:App.js
new QiSession();
```

ビルドしようとすると、未定義のエラーが出ます。

```bash
$ npm run build

...
71:25  error    'QiSession' is not defined                                             no-undef
...

```

未定義なのは当たり前（ブラウザで実行されるときはグローバルオブジェクトになっているはず）なので、
どうにかして読めないものかと試行錯誤。
同じ状況のjQueryなんかはnpmでインストールして読めました。

```js:App.js
import $ from 'jquery'
```

どうにもうまくいかないので、ビルド時にはチェックをスキップするようにしました。
まずはpublicフォルダにqimessaging.jsをコピーして、index.htmlに読み込みを追記。

```bash
$ ll public
-rw- 24838 2017-03-28 09:33 favicon.ico
-rw-  1342 2017-03-30 21:19 index.html
-rwx 52133 2017-03-30 20:46 qimessaging.js*
```

```html:public/index.html
<head>

...
<script src="%PUBLIC_URL%/qimessaging.js"></script>
...

</head>
```

次にjs側でのビルド時のQiSessionのチェックを無効化します。

```js:App.js
// eslint-disable-next-line
new QiSession();
```

これでビルドが通りました！
ブラウザでの実行時はQiSessionがグローバルオブジェクトになっているので問題ありません。

## React楽しい
pepperのアプリを作るのが本筋でしたが、pepper × react 楽しいです。
reactは理解できたのですがreduxの考え方が難しいです。
メモリイベントの類を、どこで管理するかとか、組み合わせを考えるのも楽しいですね。
Scala勉強はじめました。２

##プログラミングの基本を押さえる
#参考サイト様
- http://www.ne.jp/asahi/hishidama/home/tech/scala/for.html
- http://itpro.nikkeibp.co.jp/article/COLUMN/20080708/310424/?rt=nocnt

#プログラミングの基本といえば...

- 代入
- 繰り返し
- 条件分岐

ですね。
今回は代入について勉強していこうと思います。

#代入

```
val array = Array("a1","a2","a3")
```

型は特に指定せずにvalというのが用意されているそうです。
valで宣言された変数には一度値を代入するとほかの値を代入しなおすことができないそうです
Javaでいうところのfinalがついた変数だそうです

```
array = Array("hoge","hoe")
```
を追加してコンパイルしようとしたところ

```
Error:(11, 11) reassignment to val
    array = Array("hoge","hoe")
```
コンパイラ様に怒られました。
再度代入が必要な変数は、var で宣言するそうです
ということで下記のプログラムを書いて実行してみました。

```
var array2 = 2
println(array2)
array2 = 62
println(array2)
```
実行結果

```
2
62

Process finished with exit code 0
```
arrayと宣言しながらarrayじゃないのは変数名が思いつかなかったからです。ぽんこつです。

#まとめ
変数の宣言は2種類
val と var

- valで宣言すると再代入できない！
- varで宣言すると値の変更が可能

次は繰り返しについて学んでいきます。
Scala勉強はじめました。

#Hello worldから。
僭越ながら以下のサイトを参考にしました。

- http://libro.tuyano.com/index3?id=1047007
- http://blog.chopschips.net/blog/2014/09/07/scala-get-started/

##経緯
はじめてScalaというプログラミング言語に触れてみることにしました。
Java,PHPを初心者に毛が生えた程度に触ってきましたが、ちょっと友人に勧められScalaを触ってみることに。

##環境構築
備忘録程度に。

- IntelliJ
- SBT　とかいうやつ(´・ω・`)

IntelliJのConfigueからScalaとSBTをダウンロードしました。

##プログラミングの定番"Hello world"

IntelliJを開きScala用のファイルを作成しました。

classとobjectの二つがあり今回はobjectで作成。

いよいよ初めのコードを書いていこうと思います。

```
object hello {
  def main(args: Array[String]): Unit = {
    println("hello world")
  }
}
```
実行結果

```
hello world

Process finished with exit code 0
```

Javaに触れていた時間が長いために、構文に違和感が残っています。

しかし、よくコードを見てみると、意外と似ている点もあるようです。

```
object hello{...}
```

これがJavaでいうところの

```
public class hello{...}
```

にあたり、

```
def main(args: Array[String]): unit = {...}
```

がJavaの

```
public static void main(String args[]){...}
```

にあたるのだと今は解釈しておくことにします。

##まとめ

```
object hello{
  def main(args: Array[String]): unit = {
    //code here
  }
}
```

基本となる構文を覚えていくことにします
gitのリポジトリを一括操作する

# 背景

最近のプロジェクト構成だと複数のリポジトリで開発をしていくことが多いですが
開発をするたびに個々のリポジトリを最新化したりブランチ切ったりと結構手間だと
感じ何とか一括操作できないかとbatファイルを作ってみました。

## バッチファイル

```bat
@echo off
SETLOCAL enabledelayedexpansion

rem カレントディレクトリに移動
cd /d %~dp0

rem 引数からgitコマンドの生成
SET GIT_COMMAND=
for %%f in (%*) do (
  SET GIT_COMMAND=!GIT_COMMAND! %%f
)
echo %GIT_COMMAND%

rem フォルダの一覧を取得
for /D %%A in (*) do (

        IF EXIST %%A\.git\ (
                echo ☆☆コマンド実行リポジトリ %%A

                REM ディレクトリに移動
                cd %%A
                
                REM gitコマンドを実行
                git %GIT_COMMAND%
                
                REM カレントディレクトリに移動
                cd ..\
                
        ) ELSE (
                echo %%A はgitディレクトリではないので作業対象外です。
        )
)
```

# 事前準備

* gitにパスを通しておいてください

# 使い方 

以下のようにファイルを配置します。

./
 ├common(gitリポジトリ)
 ├front(gitリポジトリ)
 ├batch(gitリポジトリ)
 └git-all.bat(今回作ったバッチ)

コマンドプロンプトを開いて
`git-all fetch -p`

成功～

他の人はどうやってんだろ。。。
好きな人にはたまらない！スタートアップの祭典、SLUSH TOKYO参加レポート！

3月30日(木)、有給取ってSLUSH TOKYO 2017の最終日に参戦してきました！
アプリ・サービス好きとして大満足だったので、興味あるけど行ったことない人向けにレポートです。

# 目次
1. どんなイベント？
2. どうやって巡るのがオススメ？
3. 面白かったスタートアップは？
4. まとめ

# どんなイベント？

![IMG_3796.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/6a8ae517-7470-5801-ba3f-7058ac632f87.jpeg)

フィンランド初、スタートアップの製品見本市です。
じゃあ企業からきている参加者が多いのか？というと、ぱっと見で半分くらい大学生。

まず、展示会とは雰囲気が全然違います。
メインステージはスモーク＋LED＋重低音スピーカーで、ライブ会場のよう。
会場の公用語は英語。と言っても、日本人同士だと日本語で話すことが多かったですね。笑

![IMG_3782.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/eb930bda-db8e-f67e-066a-e2d0a54b012d.jpeg)

ちなみにチケット代が10000円以上(学生は7500円)するので、学生はボランティア参戦がおすすめ。
友達もできることだしね。

# どうやって巡るのがオススメ？

コンテンツが満載なので、よく戦略を立てて周るのがオススメです。

ステージ企画は3つ以上同時並行の上、常設の企業ブースも50近くあります。
はじめに逃せないステージ企画を決め、その後でブースを周る時間を確保すると良いでしょう。

![IMG_3782.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/dc4fd0ec-95e5-01b8-4d8a-324642565e8a.jpeg)

オススメは「参加型企画」こんなのがありました。
* 無礼講（ランチセッション）:
  敬語禁止のランチタイムセッション。見回りのボランティアスタッフに敬語を聞かれると、警告のイエローシールを貼られます。

* リアルWantedly:
  Wanteldyに出稿している企業が集合する、いわばスタートアップの合同説明会。
  社員さんと膝詰めで話せるからガンガン質問できてとても良い。（ベンチャーの規模なので、人事専門じゃない現場の人から話を聞けるのもマル）

企業ブースもスタートアップの製品がたくさん触れる＆担当者に質問し放題なので、ぜひ見るべし。
人だかりのあるところより、担当者がいま暇そうだな？ってところで話を聴くと面白い。
と言っても、商談の邪魔はしないように...

# 面白かったスタートアップは？

参加する前までは、（最新のテクノロジーを使った、消費者向けの新しいサービスがたくさん見れるのかな？）と思っていましたが...
* テック関係ないスタートアップ面白い！
* toBのサービス面白い！
...って感じでした。勉強不足を晒してきたぞ。

### テック関係ないスタートアップが面白い！

* お迎えシスター:
  https://omsister.com
  幼稚園や学校からのお迎え代行＋そのまま家で英会話教室、のサービス。
  教師は海外育ちの経験があるバイリンガル大学生を面接して採用。
  このビジネスモデル、プログラミング教育みたいなのにも広がっていくのか個人的に気になる。

* Tebura:
  http://www.samepagenet.com/
  荷物だけ版Airbnb。なるほど！
  全然関係ないけど、プレゼンターが忍者のコスプレで大変場が和んだ。
  会社のホームページが.ninjaドメインを使ってて二重に驚き。初めて見た。

### toBのサービスが面白い！

* カウリス:
  https://caulis.jp
  toBに行動パターン認証を提供する企業。
  ユーザのログイン時、使用デバイスやIPなど50以上のパラメータを元に「ユーザ本人によるアクセス率」を判定。
  その割合を元に、顧客企業は「警告メールの送付」「ログインの一時的ロック」などの対策が可能とのこと。

* INNOVATION GENERATOR:
  https://innovation-generator.jp
  博報堂 x Reaktor(フィンランドのデジタルサービス開発スタジオ）が提供する、大企業向けのサービス創生プログラム。
  マーケットの分析からモック・プロダクト作成、効果測定、改善までワンストップ提供。
  何が面白いって、既存のコンサル・ITベンダーと市場がモロ被りなこと。各社しのぎを削るのがとっても楽しみ。

* asoview!:
  http://www.asoview.com
  体験型コンテンツ特化の旅行検索サイト。というと消費者向けだが、実はコンサルティングもやっている。
  地方自治体や企業をクライアントにしたイベントの作成と、各地方の観光協会のWEBサイト作成受託。
  自社で培ったノウハウでコンサルティングって素敵...

# まとめ
新しいサービスの情報をたくさん仕入れられるので、好きな人はホクホクできるイベントです。

何より、見本市っぽくないフランクな雰囲気のおかげで、スタートアップの関係者とたくさんおしゃべりできます。
参加前後でスタートアップ企業への見方が変わることうけあい。
レガシーなLAMP+memcacheシステムのDockerFileを書いてみた


レガシーなLAMP+memcacheシステムをdocker内で開発、検証するために
DockerFileを記載してみました。

構成
centos 6.7
php 5.2.17
mysql 5.1.73
apache 2.2.0
memcached1.4.4

```

FROM centos:6.7

MAINTAINER terui-yuki

ENV PHP_VERSION 5.2.17


RUN yum update -y

RUN yum -y install wget && \
    yum install -y tar.x86_64 && \
    yum install -y  bzip2 && \
    yum install -y  gcc


#### apache
RUN yum -y install httpd httpd-devel

#### PHP 5.2　関連
RUN yum install -y  epel-release
RUN yum install -y \
  libaio-devel \
  libmcrypt-devel \
  libjpeg-devel \
  libpng-devel \
  libxml2-devel \
  libxslt-devel \
  curl-devel \
  freetype-devel \
  gmp-devel \
  mysql-devel \
  openssl-devel \
  postgresql-devel \
  libjpeg \ 
  libmemcached


RUN yum install -y --enablerepo=epel \
  libmcrypt \
  libmcrypt-devel \
  php-mcrypt

RUN ln -s /usr/lib64/libjpeg.so /usr/lib/ && ln -s /usr/lib64/libpng.so /usr/lib/


### PHP 5.2 ソースから
WORKDIR /usr/local/src
ADD http://museum.php.net/php5/php-${PHP_VERSION}.tar.bz2 ./
RUN tar xf ./php-${PHP_VERSION}.tar.bz2 -C ./
WORKDIR ./php-${PHP_VERSION}
RUN ./configure \
  --enable-gd-native-ttf \
  --enable-mbregex \
  --enable-mbstring \
  --enable-soap \
  --enable-zend-multibyte \
  --enable-zip \
  --with-apxs2 \
  --with-curl \
  --with-freetype-dir=/usr \
  --with-gd \
  --with-gettext \
  --with-gmp \
  --with-jpeg-dir=/usr \
  --with-mcrypt \
  --with-mysql-sock \
  --with-openssl \
  --with-pear \
  --with-pdo-mysql \
  --with-pdo-pgsql \
  --with-png-dir=/usr \
  --with-xsl \
  --with-zlib \
  --with-pear=/usr/local/pear \
  --with-apxs2=/usr/sbin/apxs
RUN make && make test && make install

### mysql
RUN yum install -y mysql-server


### memcache　 コードから入れてみる
RUN yum install -y  gcc-c++
WORKDIR /usr/local/src
ADD https://pecl.php.net/get/memcached-2.1.0.tgz ./
#ADD https://pecl.php.net/get/memcache-2.2.7.tgz ./
ADD https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz ./
RUN tar -zxvf ./memcached-2.1.0.tgz  -C ./
#RUN tar -zxvf ./memcache-2.2.7.tgz  -C ./
RUN tar -zxvf ./libmemcached-1.0.18.tar.gz  -C ./



WORKDIR /usr/local/src/libmemcached-1.0.18
RUN ./configure --without-memcached && make && make install

WORKDIR /usr/local/src/memcached-2.1.0
RUN phpize
RUN ./configure --with-php-config=/usr/local/bin/php-config --disable-memcached-sasl && make && make install

#WORKDIR /usr/local/src/memcache-2.2.7
#RUN phpize
#RUN ./configure --with-php-config=/usr/local/bin/php-config --disable-memcached-sasl && make && make install

RUN yum install -y  memcached

EXPOSE 80


CMD [ "/usr/sbin/httpd", "-D", "FOREGROUND" ]
```



起動テスト

```bash
docker run -i -t --rm -p 80:80 イメージ[:タグ|@ダイジェスト値] /bin/bash
```



参考にさせていただいたURL
----
https://github.com/sonicjam/docker-php-5.2-apache
Microservices Meetup vol.5 に行ってきたので雑にまとめる


## 概要

* イベントページ [connpass](https://microservices-meetup.connpass.com/event/52516/)
* Togetter : [URL](https://togetter.com/li/1095919)
* テーマが「API Gateway & BFF」
* 後半にパネルディスカッションが存在する
* ハッシュタグ #microserv
* 他の方のまとめ
    * @moomooya さん：[qiita](http://qiita.com/moomooya/items/3d130d10c122e0003f64)
    * @taka_ftさん：[hatena-blog](http://takahiro-fujii.hatenablog.com/entry/2017/04/01/182855)


## 忙しい人向けのまとめ

* どちらかというとテーマに対するTips,事例発表会的な内容
* API GatewayやBFF(Backend for Frontend) をどう組み込むのよ？という人は参考になりそう
* @yosuke_furukawa さんの「Re-Architecting」という言葉が結構響いたなーというのが個人的感想


## 各セッションについて

### APIのことはすべてシーマンが教えてくれた。
* 発表者：@charlier_shoe さん
* 発表資料：[資料URL](https://www.slideshare.net/charlier-shoe/api-73960006)
* 前半は @SEAMANBOT という twitterbotの発言を元に micro service あるある話
    * 「 ほどよい距離感を保つこと。 これって、サービス精神なんだよ。」
    * 「おまえの未来を最もせばめてい る原因、それは「面倒くさい」と思 う自分だよ」
* 後半は Oracleのmicroservice関連の製品とイベントのご紹介という感じ

### step by step BFF
* 発表者：@yosuke_furukawa さん
* 資料 : [資料URL](https://speakerdeck.com/yosuke_furukawa/step-by-step-bff)
* 最初はレガシーソフトウエア改善ガイド([Amazon](https://www.amazon.co.jp/dp/B01MSLAFPT/)) の 「Re-Architecting」になぞってBFFの概要話
* 次はBFFのユースケースのお話に
    * ユースケース５パターン：「API Aggregation」「Session Management」「(Server Side) Rendering」「File Upload」「WebSocket/LognPolling/SSE」
* その次はシステムのアーキテクチャの変遷のお話
* 最後はBFFのケーススタディ、TwitterとかNetflixとか

* 取りあえず、最後の数枚のスライドがBFF導入のために言いたいことなのかな、と感じました

### Webサービスの初期開発とマイクロサービス・BFF
* 発表者：@shimpeiws さん
* 資料：[資料URL](https://speakerdeck.com/shimpeiws/websahisufalsechu-qi-kai-fa-tomaikurosahisubff)
* 「前の方の発表のケーススタディ位で見てもらいたいです」
* 発表者の会社で実際にBFFをこんな感じで導入したよ、のお話中心
* 小さい会社や少人数での速攻開発時のあるある話？な内容でした。共感できる人はいそう
* 「後から考える余地のあるアーキテクチャ・設計、大事」


### ウェルネスタイム

* FiNC専門のトレーナーさん？による体動かし
* スクワットとかあって、楽ではなかった…

### Railsで作るBFFの功罪
* 発表者：@shotat_jp さん
* 資料：[資料URL](https://www.slideshare.net/RecruitLifestyle/railsbff)
* ケーススタディ的な感じで…
* ホットペッパービューティーのサイト開発でBFF導入したよ、的なお話


### パネルディスカッション

* パネラー：@charlier_shoe さん、@yosuke_furukawa さん、@shimpeiws さん
* 司会者：@qsona さん

* 主催者の方が質問を投げて、3人の方が答える形に。

* 質問内容
    * API GatewayとBFFの違いは？
        * API Gatewayの一部としてBFFはある
    * API Gateway製品のお話、BFFは実装
    * API Gateway製品についてどこまで担保してくれて、どこから自前で作らないといけないのか？
        * Kongだと～Oracle製品だといけるの？
    * BFFはバックエンドの近いロジックをどこまで持つのか？指針とか
    * BFFでは、更新系(GET以外)もオーケストレーションしたりする?
    * BFFはどこが担当すべきか？
    * 間に挟む製品のお話(GraphQLとか)
    * BFFについての考え

## 参加後の所感

* 「多種多様なフロントエンドとバックエンドの中間に一つ挟んでいい感じに処理していきましょうよ」というのがBFFの主たる考えなのかなーと。どちらかというとフロントエンド向き、らしいです。
    * でも、「中間層挟んでやり取りを円滑にしていく」ってフロンドエンドに限ったことでなくね？という気持ちもありました。

* あとは既存クラウドサービスのAPI Gateway的サービスを利用してとかの事例も欲しかった感はあります。
* 時折「GraphQL」や「Kong」などの製品の話になってましたね。(おいらたちはBFFをささっと導入したいんだよという気持ちがあふれ出てたというか。)

* 今回は全体的にフロントエンド開発者向けっぽかったですね。まぁBFFの意義的にはそうなるか…
ログイン後に端末エミュレータのウィンドウサイズを変えると表示が崩れるのを直す

某クラウドのサーバに、iTermで多段SSHログインしたら下記の事象に遭遇したのでメモ

# 事象
リモートのサーバにログインする

![Screen Shot 2017-03-30 at 6.21.04 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/36f995b0-62e1-a38a-971b-301541452eee.png)

`numbers`という、1から100までの数字が表示されたファイルを`less`で表示する。

```bash
$ cat numbers | less
```

下記のような表示になる。ここまでは想定した動作。

![Screen Shot 2017-03-30 at 6.21.13 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/6f8bd3e2-8ab8-0b08-cc68-6b69ad4d5c7f.png)

そこから、ウィンドウサイズを変える。ちょっと大きくして、同じことをする。

```bash:Terminal
$ cat numbers | less
```

すると表示がくずれる。

![Screen Shot 2017-03-30 at 6.22.42 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/87463d57-b5c2-6449-2612-8d58aec70399.png)

くずれる……。

![Screen Shot 2017-03-30 at 6.22.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/468844c5-c701-5002-b7b1-01519e75e575.png)


## 原因

ローカルのウィンドウサイズの変更が、リモート側の端末デバイスまでうまく反映されていない模様。ウィンドウサイズが変更されると、リモートホストのカーネル[^kernel]にもその情報を伝える必要があるが、できていない。多段SSHのために中継したサーバで損失しているのかも？このクラウド以外では発生しないため、特定のサーバ固有の問題っぽい。

[^kernel]: `stty`の説明より。例えば `stty rows` コマンドの説明として "tell the kernel that the terminal has N rows" とあり、カーネル側に端末の行数と列数を教えている模様。 http://man7.org/linux/man-pages/man1/stty.1.html

そのため`vim`や`less`など、対話スクリーンを独自に開くソフトウェアはレイアウト崩れに見舞われてしまう。

`$ stty size` と打つことで、端末デバイスが認識している端末の行数と列数が表示できる[^for_bash]が、端末エミュレータのウィンドウサイズを変更してもそれが変更されない。

[^for_bash]: bashでは`LINES`と`COLUMNS`という変数に行数と列数の情報が入る。

### ウィンドウサイズ変更前

![Screen Shot 2017-03-30 at 6.21.50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/15c8e2e2-fefb-788e-f109-4b1ae246ba5a.png)

14 x 62 を指している。

### ウィンドウサイズ変更後

![Screen Shot 2017-03-30 at 6.22.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/a47bdcdd-f99b-4ae3-6b61-c46ae42152df.png)

サイズが変わったにもかかわらず、同じ値である14 x 62 を指している。


# 解決方法

`stty`コマンドで端末デバイスに適切な端末サイズを教えてあげれば、レイアウトは戻る。

```bash:Terminal
$ stty rows <列数> cols <行数>
```

iTermの場合、ウィンドウサイズを変更しようとしてウィンドウの端をドラッグすると、入力できる文字の端末サイズを表示してくれるので、その値を入れる。

![Screen Shot 2017-03-30 at 6.58.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/af6be7f5-31cf-a091-3f8a-5f204b3c2cb6.png)

なおる。

![Screen Shot 2017-03-30 at 6.58.31 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/e0fe921d-4b24-2afc-4252-3c88a1a6207c.png)

# TMUX Pluginを使う

いちいち`stty`なんちゃらと入力するのも面倒だが、普段tmuxを使っている人には、もっと簡単な方法がある[^konpon]。tmuxのウィンドウ、あるいはペインサイズを`stty`コマンドの引数として渡して実行してやればレイアウトは戻るからだ。

`<tmuxのprefix> + a`キーを入力するだけで、上記の`stty rows <列数> cols <行数>`を入力してくれるtmuxのプラグインを作った。キーバインドは変更可能であるため活用されたし。導入方法は下記のリンクにあり。

Github: [tmux-adtty](https://github.com/greymd/tmux-adtty)

### 実行例

一番下のペインで開いている`vi`のレイアウトが崩れてるため、一旦`vi`を抜けて、`<tmuxのprefix> + a`キーを入力。

![Screen Shot 2017-03-30 at 6.06.26 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/8266fef4-85c2-d478-c616-f3e5803713c4.png)

すると、なおる(^_^)v

![Screen Shot 2017-03-30 at 6.06.45 PM.png](https://qiita-image-store.s3.amazonaws.com/0/68963/3db09537-895d-74b1-baa3-3dc197790b7b.png)



[^konpon]: そもそも、リモート側に端末サイズが伝わるようにするのが理想的だが、大人の事情でできない人はここにあるような方法で頑張るしかない、のかもしれない。
アスタリスク'*'だけの関数のパラメータ

Python3では、次の関数定義の例ように、`*`だけのパラメータというのがあります。
  
```pycon:
>>> def foo(*, x):
	print(x)
```
この用法の意味は、`*`に続くパラメータに対しては、キーワード形式での引数の渡し方を強制するということで、キーワード無しで引数を渡すと次のようにエラーになります。

```pycon:	
>>> foo(x=1)
1
>>> foo(1)
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    foo(1)
TypeError: foo() takes 0 positional arguments but 1 was given
```