OmniAICreator/Qiita-1.07M huggingface dataset:
メモ書き

HAXMのインストールに失敗する場合、URLが出てくるので見に行く。

'''
Preparing "Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 6.2.1)".
Downloading https://dl.google.com/android/repository/extras/intel/haxm-windows_r6_2_1.zip
https://dl.google.com/android/repository/extras/intel/haxm-windows_r6_2_1.zip
haxm_check.exe
intelhaxm-android.exe
Release Notes.txt
silent_install.bat
silent_install_readme.txt
"Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 6.2.1)" ready.
Finishing "Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 6.2.1)"
Installing Intel x86 Emulator Accelerator (HAXM installer) in D:\D_Users\Takahashi\AppData\Local\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager
"Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 6.2.1)" complete.
"Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 6.2.1)" finished.
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\add-ons\addon-google_apis-google-24\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\build-tools\25.0.3\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\build-tools\26.0.1\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\docs\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\emulator\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\extras\android\m2repository\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\extras\google\m2repository\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\extras\m2repository\com\android\support\constraint\constraint-layout-solver\1.0.2\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\extras\m2repository\com\android\support\constraint\constraint-layout\1.0.2\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\patcher\v4\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\platform-tools\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\platforms\android-25\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\sources\android-25\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\system-images\android-25\google_apis\x86\package.xml
Parsing D:\D_Users\Takahashi\AppData\Local\Android\sdk\tools\package.xml


Android SDK is up to date.
Running Intel® HAXM installer
'cal' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'd' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'nt_install.bat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
HAXM installation failed. To install HAXM follow the instructions found at: https://software.intel.com/android/articles/installation-instructions-for-intel-hardware-accelerated-execution-manager-windows
Done
'''

https://dl.google.com/android/repository/extras/intel/haxm-windows_r6_2_1.zip
をダウンロード、展開し、

intelhaxm-android.exe　を
ダブルクリック。

Android studioの[help]-[Check for Update]をクリックして更新もしておく。
Tango Unity SDK Ikariotikos (Version 1.54, June 2017)とUnity 2017.1.1f1の組合せで不具合か？

# 報告内容
Tango Unity SDK Ikariotikos (Version 1.54, June 2017). とUnity 2017.1.1f1の組合せでは、Tango アプリが動作しないのでは？という疑義。Google Developerサイトの調査は未完のため速報。

# 環境
* Windows 10 Pro ver.1703 
* Unity 2017.1.1f1
* Android SDK API Level 23,24 installed
* Tango Unity SDK Ikariotikos (Version 1.54, June 2017)
* Zenfone AR （メモリ6Gモデル）

# 問題の事象
* ビルドは成功
* zenfone上で「アプリが繰り返し停止」する
* 類似事象  
[じゅころぐAR/VR記事](http://jyuko49.hatenablog.com/entry/2017/07/10/232148)

# その他
* Unity を5.6.3f1にダウングレード(2017.1.1f1は削除）したところTango SDK内のexample Sceneは動作した
* Windows 7上でも類似の事象が発生


**以上**
Cloud Translation API を使用する際のポイント

Google が提供している 翻訳API の [Cloud Translation API](https://cloud.google.com/translate/) を使う機会があったので、ポイントをメモしておく。


## 変換方法
詳細はリファレンスをみよう。
https://cloud.google.com/translate/docs/reference/rest

ざっくり書いておくと
`POST https://translation.googleapis.com/language/translate/v2/`
を投げる。その際に Body に次のような JSON を指定する。

```json
{
  "q": "hello",
  "target": "ja",
  "format": "text"
}
```

すると次のような JSON が返ってくる

```json
{
  "data": {
    "translations": [
      {
        "translatedText": "こんにちは", 
        "detectedSourceLanguage": "en"
      }
    ]
  }
}
```

### GETでやるときはURLエンコードが必須
POST じゃなくて GET で流すことも可能。
その場合は、URLエンコードをしないとちゃんと変換されないので注意。

```
https://translation.googleapis.com/language/translate/v2/?target=en&q=Je%20suis%20ravi(e)%20de%20vous%20rencontrer
```

```json
{
  "data": {
    "translations": [
      {
        "translatedText": "Nice to meet you", 
        "detectedSourceLanguage": "fr"
      }
    ]
  }
}
```



## 2種類の翻訳
デフォルトでは、ニューラル機械翻訳（NMT）モデルで翻訳される。
リクエストした言語の組み合わせが NMT モデルでサポートされていない場合、フレーズベース機械翻訳（PBMT）モデルが使用される。

### 明示的に指定することも可能

"model": "nmt"
"model": "base"


## 言語のサポート
変わるだろうからこれはリファレンスを都度見たほうが良い
https://cloud.google.com/translate/docs/languages

## 価格
https://cloud.google.com/translate/pricing?hl=ja

>Google Translation API の料金は使用量に基づいて月ごとに請求されます。翻訳の使用量は 100 万文字（1,000,000文字）単位で計算されます。

**翻訳** 20 ドル/100 万文字
**言語の検出** 20 ドル/100 万文字

ただし100万文字にみたない場合、20ドルかかるわけじゃなくてちゃんと使った分だけになる。


### 文字数
文字がマルチバイトでも 1 文字ごとに課金される。
`こんにちは` は 5 文字ということ。

翻訳を POST のリクエストにすれば 日本語で `30,000文字` くらいは一回のリクエストでいける。
あまりにも多いとエラーになると思う。

#### HTMLの場合の文字数
翻訳対象は`format`で指定できるのだが、通常の `text` と `html` がある。
`html` の場合、タグ等の部分も文字数としてカウントされるので`text`のほうが安くすむ。



## 特定の文字列を変換対象外にする
HTML を変換する場合は、`<span class="notranslate">hello</span>` のように囲うことで変換対象外に出来る。


## 割り当て
https://cloud.google.com/translate/limits?hl=en

Daily Limit は `50,000,000` 文字まで増やせる。
それ以上は、増加の申込みをしないといけない。

秒間制限は `user` だけでなく `project` にもあるので、システム用のサービスアカウントを作って使う、で良いと思う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/881c9082-3d13-f638-8431-af9615b71cf9.png)



## その他
FAQ があるからこれは必読。
https://cloud.google.com/translate/faq
機械学習論文読みメモ_96


[A Probabilistic Framework for Deep Learning](https://arxiv.org/abs/1612.01936), NIPS2016
deep rendering mixture modelはlatent task nuisance variablesを用いる事で陽にデータのvariationを捉える事が可能な生成モデル
であり、これを用いてdeep learningモデルの確率的フレームワークを提案する。
これを用いたmax-sum operationによって畳み込みニューラルネットを導く事が可能になる。
この過程において、畳み込みネットの強みと弱み、またその改善方法に関する知見を得る事ができる。
DRMMはEMアルゴリズムで学習する事が可能で、back propagationの代替手法としてとらえる事ができる。
また学習時間は２，３倍高速化が可能で半教師、教師なし学習にも拡張可能である。

[Stochastic Variational Deep Kernel Learning](https://arxiv.org/abs/1611.00336), NIPS2016
Deep kernel learningはkernel methodの持つノンパラメトリックな柔軟性とdeep learning手法に基づくinductive biasを組み合わせる事を可能にする．
本論では新たなdeep kernel learning modelを提案し，それに対するstochastic variational inference手法も提案する．
この手法によってdeep kernel learningによるclassification, multi-task learning, additive covariance structure, そしてstochastic gradient学習を可能にした．
ここでadditive covorianceは和を取る事が可能なGaussian processesのセットを指す．
具体的には，入力に対してdeep learningに基づく多層の特徴抽出を行い，
その特徴を潜在変数とした複数のbase kernelによるGaussian processを適用し，その出力を用いる．
これらはGaussian process marginal likelihoodと用いて同時に学習される．
学習では，kernelの局所内挿の能力を活かしたstochastic variational inferenceを提案する．

[Ladder Variational Autoencoders](https://arxiv.org/abs/1602.02282), NIPS2016
教師なし学習においてvariational autoencoderは協力な手法である．
しかし，多層なモデルに対しては未だ学習は難しい．
本論では最近提案されたLadder Networkに似たモデルとして
Ladder Variational Autoencoderを提案する．
このモデルは，Ladder networkと似た形でrecursiveに生成分布を構成する．
結果，ladder構造を用いない場合と比較してより良いlog-likelihoodとよりタイトな
Log-likelihood lower boundを導く事が可能になる．
機械学習論文読みメモ_95


[Large Margin Discriminant Dimensionality Reduction in Prediction Space](http://papers.nips.cc/paper/6457-large-margin-discriminant-dimensionality-reduction-in-prediction-space.pdf), NIPS2016
本論ではboostingとSVMの間にある双対性を導く。
この双対性を利用する事で新たにdiscriminative dimensionality reduction手法を提案する。
いまマルチクラス分類の設定において、boostingとSVMは双方ともに特徴写像と線形分類を行っている。
特にSVMは事前に設定されたカーネル関数を用いるため特徴写像が固定されておりその上の線形分類器が学習される。
一方boostingでは用いる線形分類器は固定されておりその組み合わせ方の学習を特徴写像と捉えられる。
ここで得られる特徴写像はまた、データの分類可能性を保っており、さらに次元数を制限する事で、discriminative dimensionality reductionの枠組みで捉える事が可能になる。
以上を踏まえて、本論ではLADDERと呼ばれる手法を提案し、これは特徴写像と線形分類器を同時に効率的に学習する。

[Robustness of classifiers: from adversarial to random noise](http://papers.nips.cc/paper/6330-robustness-of-classifiers-from-adversarial-to-random-noise.pdf), NIPS2016
SOTAに分類器は敵対的サンプルに脆弱である一方、ランダムノイズには頑健である傾向が知られている。
本論ではこれらを一般化し、間をつなげる事ができるsemi-random noiseを提案する。
この一般化されたノイズを用いる事で、初めて非線形分類器に関する頑健性の指標を与えた。
そして頑健性は、分類器が持つ分類境界の曲率に依存している事が分かった。
この曲率で一定の条件を満たしたものはランダムノイズに強い事が分かった。
またsemi-random noiseが張る部分空間へ注目し、その次元を見る事でrandom noiseと敵対的noiseの間を内挿可能な事が分かった。

[Improved Techniques for Training GANs](https://arxiv.org/abs/1606.03498), NIPS2016
GANの高性能な学習に有効ないくつかのテクニックを示す。
これらテクニックを利用する事で半教師あり学習においてSOTAを実現できる。
テクニックに１つ目は、feature matchingで、生成モデルは従来の目的関数に加えて実データの統計量もマッチさせるようにする。
２つ目はminibatch discriminationで、判別器は１つ１つのサンプルでなく、バッチに対して一度に評価する。
３つ目はhistorical averagingで、今までの更新ステップで得られた推定パラメータ平均からの現在推定パラメータの乖離度合いを罰則項として加える。
４つ目はone-side label smoothingで、0か1で表現されるラベル情報を.1、.9のようにスムージングをかける。
５つ目はvirtual batch normalizationで、reference batchを学習データから予め設定しておき、それを用いてbatch normalizationを行う。
その他にも生成画像の質、半教師あり学習のためのテクニックも紹介されている。
機械学習論文読みメモ_94


[End-to-End Kernel Learning with Supervised Convolutional Kernel Networks](http://papers.nips.cc/paper/6183-end-to-end-kernel-learning-with-supervised-convolutional-kernel-networks.pdf), NIPS2016
多層カーネルマシンを利用した新たな画像表現を提案する。
従来のカーネル法では、予測タスクを通して画像表現は獲得されてきた。
一方提案手法では教師情報を利用してカーネルの構造を学習する。
本論では、まず最初に最近提案された教師なし学習であるConvolutional kernel networks(CKN)の性能を改善させた。
続いて、教師あり学習を行う事を可能にし、ラベル情報を活用可能にした。
得られるモデルは新たな形のCNNとして捉えられ、各フィルタの最適化がRKHSにおける線形部分空間を学習する事と等価になる。
提案モデルは様々な画像データに関連するタスクへ適用可能である。

[Adaptive Neural Compilation](http://papers.nips.cc/paper/6410-adaptive-neural-compilation.pdf), NIPS2016
本論では、効率的なプログラムを学習するためのadaptive neural-compilationフレームワークを提案する。
従来のコードコンパイル手法では予め決められた変換の集合を適用する事で、コードのセマンティクスを変える事なく効率的なコードへの変換を行った。
本論で扱う手法は一方、対象の入力分布に対する確からしさを変える事なくより効率的な表現を学習する事を考える。
本論では、最近注目されているプログラムの微分可能表現に注目し、低レベル言語によって記述されたプログラムは微分可能表現へ変換可能である事を示した。
またこの微分可能表現を元にどのようにすれば対象の入力分布に対して効率的な表現を獲得できるかも示した。

[Synthesis of MCMC and Belief Propagation](http://papers.nips.cc/paper/6317-synthesis-of-mcmc-and-belief-propagation.pdf), NIPS2016
MCMCと信念伝搬法（BP）は共にグラフモデルにおける推論を行う上で一般的な手法である。
ただ、MCMCはexactな確率的手法でありながらmixing rateが指数的に遅く、BPは決定的な手法で高速かつ経験的に成功するがループ構造があるグラフに対しては制御が難しい。
本論では、BPのそうした欠点により生じる推論誤差をMCMCを用いて補間する手法を提案する。
提案手法はLoop Calculusの手法によりBPの推論誤差をgeneralized loopの重み付き和として表現する。
この計算において全ての項を計算する事は不可能である事が知られているが、2ループまでを考慮した場合においては、planer pair-wise binary graphical modelを用いる事で多項式時間で計算可能である事が分かっている。
この事に基づき、本論では、MCMCを用いたpair-wise binary modelの予測手法を提案する。
また全ての項を考慮した場合での近似手法も提案する。
機械学習論文読みメモ_93


[Theoretical Comparisons of Positive-Unlabeled Learning against Positive-Negative Learning](http://papers.nips.cc/paper/6353-theoretical-comparisons-of-positive-unlabeled-learning-against-positive-negative-learning.pdf), NIPS2016
Positive unlabeled (PU) learningはPositive Negative label双方がある通常の分類問題と違って、Negativeラベルのない場合における分類学習である。
この時、特定のケースにおいて、PU learningにより得たモデルが、通常のNegativeラベルも利用して得たモデルよりも良い性能を出す事がある。
本論では、推論誤差の上界を分析する事によりNegativeラベルありなしの場合の間における違いを理論的に解析した。
そしてラベルなしデータが無限に与えられている場合においてPU設定が性能で勝る事を証明とともに見つけ出した。

[Homotopy Smoothing for Non-Smooth Problems with Lower Complexity than O(1/epsilon)](http://papers.nips.cc/paper/6406-homotopy-smoothing-for-non-smooth-problems-with-lower-complexity-than-o1epsilon.pdf), NIPS2016
最大値を取る関数の構造を持つnon-smoothな項と、smoothな項あるいはnon-smoothだが簡単でproximal mapping式が計算可能な項、で成り立つnon-smoothな問題を解く手法としてHOPSを提案する。
HOPSは最適解周りのsharpnessを利用する事で、従来よりも良い収束性能を実現できる。
HOPSはNesterovのsmoothing technic及びaccelerated gradient methodを用い、また段階的にsmoothingパラメータを減らしていく事でより良い近似解を獲得可能にする。

[Learning Kernels with Random Features](http://papers.nips.cc/paper/6179-learning-kernels-with-random-features.pdf), NIPS2016
確率的な特徴はkernel machineを近似するために計算効率の良い方法を与える。
この手法は従来のカーネル法で利用されるimplicitな特徴変換ではなく、explicitな特徴変換を考え、その上で確率的なアプローチを取る事で高速なkernel machineの近似を可能にした。
しかしながらこの手法を成功させるためには事前にカーネル関数を適切に決定しておく必要があった。
本論ではこのカーネル関数決定も学習により実現可能な手法を提案する。
この学習は教師あり問題において利用できる。
この学習により最適化されたカーネル関数を利用して得られる推定器の汎化誤差のboundを、そのカーネル関数の確率的特徴とのconsistencyとともに示した。
【swift】TwitterのようなSplash画面を実装する

# 【swift】TwitterのようなSplash画面を実装する

## この記事でできるようになること
- Twitterのような**一瞬縮小して、拡大しながらTopページに遷移**
するような、Splash画面を作ることができます。

![kyutech-splash (2).gif](https://qiita-image-store.s3.amazonaws.com/0/62822/c2f557b3-ed60-44ff-99ea-c4795cf1caec.gif)


## 実装する
- 私は、splash画面で１度APIを叩いてから、このsplashアニメーションを呼んでいます。
- CGAffineTransformで一旦0.8に縮小してから、10倍に拡大しながらalphaも0にします。
- ロゴの文字は縮小はかけていません。
- ごく普通なanimationを利用しています。

```
        UIView.animate(withDuration: 0.3,
                       delay: 1.0,
                       options:　.curveEaseOut,
                       animations: { () in
                        self.logoImageView.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
        }, completion: { (Bool) in
            self.performSegue(withIdentifier: "main", sender: nil)
            
        })
        UIView.animate(withDuration: 0.5,
                       delay: 1.3,
                       options:　.curveEaseOut,
                       animations: { () in
                        self.textImageView.transform    = CGAffineTransform(scaleX: 10.0, y: 10.0)
                        self.logoTextImageView.alpha    = 0
                        self.logoImageView.alpha        = 0
        }, completion: { (Bool) in
            self.logoTextImageView.isHidden     = true
            self.logoImageView.isHidden     = true
        })
```


## まとめ
- TwitterのようなSplash画面を実装することができました。
- 細かくみるとtwitterはロゴの中からTopページが見えるような仕様になっているので、完全には再現できていません。
nodejsでpngをjpgに変換する

png-to-jpegというモジュールを使います．

npm install --save png-to-jpeg
でインストールできます．

```js:png_to_jpg.js
const pngToJpeg = require('png-to-jpeg');
const fs = require("fs");

var buffer = fs.readFileSync("./fixture.png");
pngToJpeg({quality: 90})(buffer)
.then(output => fs.writeFileSync("./output.jpeg", output));
```

$node png_to_jpg.js
で，同じ階層にあるpngファイルをjpgファイルに変換できます．
一括で複数ファイルのシンボリックリンクを作成する方法

# はじめに
複数のファイルに対して、一括でシンボリックリンクを作成する方法。
親ディレクトリ単位でかけるのが一番手っ取り早いし楽なのですが、最近たまたまその手が使えないケースに遭遇したのでここに書いてみる。

# やり方
例として、あるディレクトリ内のtxtファイルのみ頭に「link.」と付けたシンボリックリンクを作成したい場合。
一ファイルずつやるとしたら当然、

```shell-session:1ファイルずつやる場合
$ ln -s test.txt link.test.txt
```

これで簡単にできます。
ただし、まとめて複数のtxtファイルに一括でシンボリックリンクを張りたい場合、特に意識せずワイルドカード使えばいけるかな？とか何となく思ったりもしますが、

```shell-session:失敗例
$ ln -s *.txt link.*.txt
ln: 宛先の `link.*.txt' はディレクトリではありません
```

ディレクトリではありませんと怒られます。
そこでlsコマンドでファイル名の末尾が.txtファイルだけ抜き出し、
その結果をxargsで渡してやると無事に一括でのシンボリックリンクの作成が出来ます。

```shell-session:成功例1（lsコマンド使用例）
$ ls *.txt | xargs -I{} ln -s {} link.{}
```

ちなみにfindコマンドで同じことをやるとこうなる。

```shell-session:成功例2（findコマンド使用例）
$ find *.txt -type f -print | xargs -I{} ln -s {} link.{}
```

このfindコマンドを使う場合だと、複数のディレクトリの名前にある共通のキーワードが入ってるファイルのシンボリックリンクの作成先を一か所にまとめたりとかできるのかな。試してないけど。

# おわりに
ある程度規模の大きい案件とかだと、システム間連携の際に連携元ファイルの出力先と連携先で参照しているパスが違うためにわざわざ手動でコピーする運用になってたり、などというケースも割とあるので、シンボリックリンクを使って楽に出来るところは楽にしましょう、というお話。
勿論ファイル名なりパス名をシステム間で合わせるのが一番楽なのですが、古いシステムとかだと、出力先を変更するのはそれなりにリスクもあったりしますし、中にはハードコーティングされちゃってるケースもあったりするので・・・・・・
react-navigationでAndroidのバックボタンやiosのスワイプバックを抑止する

## やりたいこと

- react-navigationのStackNavigatorを使っている時にヘッダーの戻るボタン以外で戻らせたくない
  - Android端末のバックボタンや、iosのスワイプバックで戻らせないようにする
- こんな需要あるんだろうかと思うけど試してみたので書く

## サンプル

### Android側

- index.android.jsのcomponentDidMountでバックボタンを押した時の動きを制御する
  - componentWillMountだとreact-navigationのバックボタンの制御に上書かれてしまう
  - バックボタンの制御は後勝ち
  - 詳しくはこちら
  - 　https://qiita.com/ozaki25/items/93ca8d4dac06cf48ed05

```js:index.android.js
import React, { Component } from 'react';
import { AppRegistry, BackHandler } from 'react-native';
import AppNavigator from './app/navigators/AppNavigator';

const noop = () => true;
const disabledBack = () => BackHandler.addEventListener('hardwareBackPress', noop);

class ReactNativeSample extends Component {
  componentDidMount() {
    disabledBack();
  }

  render() {
    return <AppNavigator />;
  }
}

AppRegistry.registerComponent('ReactNativeSample', () => ReactNativeSample);
```

### ios側

- react-navigationのオプションで制御できる

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

const AppNavigator = StackNavigator({
  SampleA: { screen: SampleAScreen },
  SampleB: { screen: SampleBScreen },
  SampleC: { screen: SampleCScreen },
}, {
  navigationOptions: {
    gesturesEnabled: false, // ここ
  },
});

export default AppNavigator;
```
意味役割付与システム ASA のPython client

# はじめに
ちゃお・・・†

今回は[岡山大学竹内研究室のASA](http://www.cl.cs.okayama-u.ac.jp/study/project/asa/)のPythonクライアントを作ったので紹介します。

# 意味役割付与システムとは
> 下記のように入力文に対して述語項構造解析を行い，その後，述語の語義を同定して，係り関係にある項の意味役割を付与するものです．
> 
> (入力文)
> 昨日彼は私に手紙を送った．
> (出力)
> [昨日] 場所(時)(点) => 時間(点)に変更予定 (2015.10)
> [彼は] 動作主
> [私に] 着点(人)
> [手紙を] 対象
> [送った] 状態変化あり-位置変化-位置変化（物理）（人物間）-他者への所有物の移動-提供
> 
> のように述語に対して，概念(「提供」)を付与し，述語にかかる係り元(項と呼ぶ)に意味的な関係を付与するものです．例えば「彼は」は「送った」に対して「動作主」という意味役割であることを示しています．
http://www.cl.cs.okayama-u.ac.jp/study/project/asa/

# インストール
1. ASA Scalaをダウンロードします http://www.cl.cs.okayama-u.ac.jp/study/project/asa/asa-scala/download/
2. `pip install asa` でPythonクライアントをインストールします

# 使い方
```py
from asa import ASA

# Initialize a ASA instance
asa = ASA(path-to-asa)

# Let's analyze a sample sentence
asa.parse('彼は村長だ')
# =>
[{'ID': 0,
  'category': '人',
  'frame': '1-copula',
  'link': 1,
  'main': '彼',
  'part': 'は',
  'tense': 'PRESENT',
  'type': 'elem',
  'wakati': ['彼\tカレ\t彼\t名詞,代名詞,一般\t\t\tO', 'は\tハ\tは\t助詞,係助詞\t\t\tO']},
 {'ID': 1,
  'category': '人',
  'frame': '0-elem',
  'link': -1,
  'main': '村長',
  'mood': 'INDICATIVE',
  'part': 'だ',
  'polarity': 'AFFIRMATIVE',
  'sentelem': 'PREDICATE',
  'tense': 'PRESENT',
  'type': 'copula',
  'voice': 'ACTIVE',
  'wakati': ['村長\tソンチョウ\t村長\t名詞,一般\t\t\tO', 'だ\tダ\tだ\t助動詞\t特殊・ダ\t基本形\tO']}]
```

# 問題点: 実行が遅い -> だいぶ解消されました
`echo`コマンドからパイプでASAに渡すだけというシンプルな構成になっているので、毎回YAMLファイルをロードするため実行毎に1秒近くかかります。JPypeとか使えばいい感じにならないかな？

追記: Version 0.2からは、最初だけYAMLをロードしてファイルを介しながらプロンプトでやり取りするようにしたため、__0.1系と比較して約36倍ほど速くなりました。__ たとえば上の例だと48.5 msかかっていたのが2.75 msにまで短縮できました。

我こそは！という方はcontributions are welcomeです！
https://github.com/ikegami-yukino/asa-python
Laravelのコレクションメソッド「sortBy」でつまずいた話

# 前提
Laravelのコレクションメソッドの1つであるsortByを使った結果をソートしている時につまずいたので、解決法を備忘録として残します。

# 問題点
- sortByを使うとコレクション内の並び順は下記のように変更されるのですが、JSON化するともとに戻ってしまう
    - 前

            [0] aaaa
            [1] bbbb

    - 後

            [1] bbbb
            [0] aaaa

## 解決法
```php
// valuesメソッドを使い、並び替えた結果をもとに採番し直します
$hoge = $hogeModel->hogehoge()->sortByDesc('priority')->values();
```

# 参考
- CollectionをソートするとJSONがオブジェクトになる件
    - https://atuweb.net/201707_laravel-sort-key-changed/
- valuesメソッド
    - https://qiita.com/nunulk/items/e92d34c4092f202e60fa#79-values
Macの開発時にオレオレ証明書を作ってPumaで接続するよ！

## はじめに

AWSのCloudFrontを使っている時に、アクセスするファイルのドメインの問題を解消したくなりました（`xxx.cloudfront.net`という名前のホストにCookie有効でアクセスしたいのです）。本番同様にローカル開発環境からSSLでアクセスして、AWSの環境にアクセスさせる環境をつくろうと思い立ちましたが、結構難儀したのでまとめておきたいと思います。

以前はごまかせたのに、昨今のブラウザがちゃんと証明書を作らないと表示すらさせてくれない（つれぇよ。設定でホワイトリストさせておくれよ）ので、こんな遠回りなことになっている気がします。

## 手順
### Hostsの設定をする

https://qiita.com/abdonwww/items/903431d1dad743dc9c69
こちらを参考にすると、`local.xxx.cloudfront.net`のような名前で自ローカルサーバーへアクセスできるようにすることが必要そうです。

というわけでHostsを設定します。

```:/etc/hosts
127.0.0.1	local.xxx.cloudfront.net
```

### オレオレ証明書を作る
https://qiita.com/pikanji/items/a09e906f7099f7eed392
こちらがとっても鮮やかでした！惚れてまうやろ！（古い）

とっても丁寧に書かれているので、こちらを参考にやると良いと思います。

私の場合には下記のように`.env`を修正しました。

> DOMAIN=xxx.cloudfront.net
> COMMON_NAME=local.xxx.cloudfront.net


プロジェクト外でファイルを作って下記のようにしました。他の人が試す時にはこれらのファイルで接続してもらえればわざわざ証明書を作ってもらわなくて済むようになりますよね（多分）。`server.crt`は`xxx.cloudfront.net.crt` という名前で作られているものをリネームしています。同様に`server.p12`は`xxx.cloudfront.net.p12` からリネームしました。 

- `/lib/supports/ssl/server.key`
- `/lib/supports/ssl/server.crt`
- `/lib/supports/ssl/server.p12`
- `/lib/supports/ssl/root_ca.crt`

### Pumaに設定する

https://qiita.com/zaru/items/ccf328e87c768168134d
ssl_bind という機能でやるんですね。

私が間違えてしまったのは 9292の部分を自分が立ち上げているサーバーのポート（`ENV.fetch("PORT") { 3000 }`） にすると読み違えてしまったことです。ここはwellknownポートにしたいはずなので、 443で良いです。以下のように書けば良さげですね。

```rb:/config/puma.rb
if "development" == ENV.fetch("RAILS_ENV") { "development" }
  ssl_bind '0.0.0.0', 443, {
    key:  Rails.root.join('lib', 'supports', 'ssl', 'server.key'),
    cert: Rails.root.join('lib', 'supports', 'ssl', 'server.crt'),
    ca:  Rails.root.join('lib', 'supports', 'ssl', 'root_ca.crt'),
    verify_mode: "none"
  }
end
```


### サーバーを起動する

sudo してね！

```
$ sudo bin/rails s
Password:
=> Booting Puma
=> Rails 5.1.4 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.10.0 (ruby 2.4.1-p111), codename: Russell's Teapot
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
* Listening on ssl://0.0.0.0:443?cert=/path/to/project/lib/supports/ssl/server.crt&key=/path/to/project/lib/supports/ssl/server.key&verify_mode=none
Use Ctrl-C to stop
```

アクセスすると下記のようなエラー表示が出るかもしれない。原因不明です。実害はなさそう。

```
2017-09-27 03:42:15 +0900: SSL error, peer: 127.0.0.1, peer cert: , #<Puma::MiniSSL::SSLError: System error: Undefined error: 0 - 0>
```

## おしまいに

些細なところでも気づかないとかなり時間を食ってしまうのがこの手の作業の辛いところでした。
phpでunixコマンドを実行する際に使うラッパー関数を作成した

phpでunixコマンドを実行する事が多かったので、簡単な関数を作ってみました。
終了ステータスあり版となし版を作ってみました。

##exec()(終了ステータスあり)

```exec.php
function exec_cm($command){
  $command .= ' 2>&1'; //error内容出力
  exec($command, $output, $re);
  return [
    'output' => implode("\n", $output),
    'is_error' => ($re == 0) ? false : true
  ];
}

$command = 'cp test.txt test2.txt';

$re = exec_cm($command);
if($re['is_error']){ //エラーの場合のみ内容を出力
  echo $re['output'];
}
```

これで実行した場合、test2.txtが作成されます。
また、ファイルがなかったりしたら
```cp: cannot stat ‘atest.txt’: No such file or directory%```
って感じで出力されます。

`exex()の場合終了ステータスは取れますが、出力結果が配列で返って来るため加工が必要です。`


##passthru()(終了ステータスなし)

```exec.php
function exec_cm($command){
  $command .= ' 2>&1'; //error内容出力
  ob_start();
  passthru($command);
  $output = ob_get_clean();
  return $output;
}

$command = 'cp test.txt test2.txt';

$re = exec_cm($command);
echo $re;
```

これで実行した場合もexec()の時と同じ結果になります。
ただ、こちらは終了ステータスを見ることはできません。
標準出力と標準エラー出力をそのまま変数に突っ込みたい時などに使えそうです。

`passthru()の場合終了ステータスは取れないですが、出力結果が未整形で返って来るためそのまま使えます。`

##まとめ

```
exec()
  終了ステータス取れる。
  出力は配列で返ってくるので加工しないといけない。

passthru()
  終了ステータス取れない。
  出力は未整形で返ってくるのでそのまま使える。
  ※実際は主に画像のバイナリを出力したりする時に使うみたいです。
```

phpの中で複数のunixコマンドを実行する必要がある時などは使えそうです。
起動時に共有フォルダを自動マウント

Mac起動時にNASの共有フォルダを_（Finderで開かせずに）_自動でマウントさせる。
WiFi接続だとLANに接続されるまでに時間がかかるので、接続されるまで待機してから共有フォルダをマウントさせる。

##ステップ
* MacがLANに接続するのを待つ
* 接続したい共有フォルダを指定
* 接続


##手順
Automatorで以下の処理を実行するアプリを作り、ログイン項目に追加する

１）シェルスクリプトを実行（ライブラリ：ユーティリティ）
MacがLAN接続するまで待機させる

```sh
while ! ipconfig getifaddr `netstat -rn | awk '/^default/{print $6;exit}'` > /dev/null 2>&1;
do
    sleep 2
done
```

２）指定されたサーバを取得（ライブラリ：ファイルとフォルダ）
接続先のアドレスを追加

```例
afp://10.0.0.3:548/share
afp://10.0.0.3:548/music
```
３）サーバへ接続（ライブラリ：ファイルとフォルダ）
![NASマウント.png](https://qiita-image-store.s3.amazonaws.com/0/199088/0f2c26d0-f37c-969c-6e94-c093146f0bab.png "NASマウント.png")


実行時に共有フォルダのパスワードをキーチェーンに保存しておけば次回から入力の必要がなくなる。
Observer Patternを用いた簡素なMVCのpython実装例

# やること
1. Viewはコンソールから入力されたテキストをControllerに渡す
2. Controllerは入力されたテキストをModelに書き込む
3. オブザーバーパータンでModelの変更を検知してViewを更新する

# コード

```python
class Model:
    def __init__(self):
        self.__observers = []
        self.__text = None

    def add_observer(self, observer):
        self.__observers.add(observer)

    def notify_observers(self):
        for observer in self.__observers:
            self.__observer.update(self)

    @property
    def text(self):
        return self.__text

    @text.setter
    def text(self, text):
        self.__text = text
        self.notify_observers()


class View:
    def input(self):
        return input("Enter text: ")

    def update(self, model):
        print(model.text)


class Controller:
    def __init__(self):
        self.model = Model()
        self.view = View()
        self.model.add_observer(self.view)

    def start(self):
        self.model.text = self.view.input()


if __name__ == '__main__':
    Controller().start()
```

## 複数Observer対応版

```python
class Model:
    def __init__(self):
        self.__observers = []
        self.__text = None

    def add_observer(self, observer):
        self.__observers.add(observer)

    def notify_observers(self):
        for observer in self.__observers:
            self.__observer.update(self)

    @property
    def text(self):
        return self.__text

    @text.setter
    def text(self, text):
        self.__text = text
        self.notify_observers()


class View:
    def input(self):
        return input("Enter text: ")

    def update(self, model):
        print(model.text)


class Controller:
    def __init__(self):
        self.model = Model()
        self.view = View()
        self.model.add_observer(self.view)

    def start(self):
        self.model.text = self.view.input()


if __name__ == '__main__':
    Controller().start()
```

# 参考資料
[やはりお前らのMVCは間違っている](https://www.slideshare.net/MugeSo/mvc-14469802)
[やはりおまえらの MVC は間違えている in バックボーンジェーエス](http://nekogata.hatenablog.com/entry/2013/11/11/075234)
[「MVCの勘違い」について、もう一度考えてみる](http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636)
[実践Python3](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-Python-3-Mark-Summerfield/dp/4873117399)

# 最後に
おかしな点，不明な点ありましたら遠慮なく指摘して下さい．
PostgreSQL上で双方向リスト

```plpgsql
-- 双方向リストを格納するtestテーブルを作成
CREATE TABLE test (
  id BIGSERIAL PRIMARY KEY,
  prev BIGINT REFERENCES test (id),
  next BIGINT REFERENCES test (id),
  val text
);

-- 双方向リストにレコードを追加する汎用関数を作成
CREATE OR REPLACE FUNCTION dlist_insert_after (
  dlist_name name,  -- レコード挿入先の双方向リストのテーブル名を指定
  new_prev bigint,  -- どのidのレコードの直後に新しいレコードを追加するか指定
  new_val text
) RETURNS bigint AS $$  -- 新しいレコードに払い出された id を返却
DECLARE
  dlist name := quote_ident(dlist_name);
  new_id bigint;
  new_next bigint;
BEGIN
  BEGIN
    -- 挿入先の直前のレコードが存在するか確認
    EXECUTE 'SELECT next FROM ' || dlist || ' WHERE id = $1'
      INTO STRICT new_next USING new_prev;
  EXCEPTION WHEN NO_DATA_FOUND THEN
    -- 存在しない場合は、新しいレコードのprevとnextをNULLにして追加
    EXECUTE 'INSERT INTO ' || dlist ||
      ' VALUES (DEFAULT, NULL, NULL, $1) RETURNING id'
      INTO new_id USING new_val;
    RETURN new_id;
  END;

  -- 新しいレコードを追加
  EXECUTE 'INSERT INTO ' || dlist ||
    ' VALUES (DEFAULT, $1, $2, $3) RETURNING id'
    INTO new_id USING new_prev, new_next, new_val;

  -- 直前のレコードのnextを新しいレコードのidに更新
  EXECUTE 'UPDATE ' || dlist || ' SET next = $1 WHERE id = $2'
    USING new_id, new_prev;

  -- 直後のレコードのprevを新しいレコードのidに更新
  EXECUTE 'UPDATE ' || dlist || ' SET prev = $1 WHERE id = $2'
    USING new_id, new_next;

  RETURN new_id;
END;
$$ LANGUAGE plpgsql;

-- 双方向リストの初期レコードAAAを挿入
SELECT dlist_insert_after('test', NULL, 'AAA');

-- id=1のレコード直後にCCCのレコードを追加
SELECT dlist_insert_after('test', 1, 'CCC');

-- id=1のレコード直後(id=2のレコードの直前)にBBBのレコードを追加
SELECT dlist_insert_after('test', 1, 'BBB');

-- id=1のレコードから続くレコードを取得
WITH RECURSIVE r AS (
  SELECT *, 1 AS num FROM test WHERE id = 1
UNION ALL
  SELECT test.*, num + 1 AS num FROM test, r WHERE test.id = r.next
)
SELECT * FROM r ORDER BY num;
```
ESLintで特定のソースコードのチェックを無効にする

ESLintはJavaScriptの構文をチェックしてくれるツールです。
本エントリーでは、プラグイン利用時に発生したESLintのエラーを例を元に、特定のソースコードのチェックを無効にする方法を紹介します。

## ESLintの`no-unused-vars`について

JavaScriptの構文チェックツールとしてESLintを用いた場合、`no-unused-vars`のルールによって、宣言はしているが利用していない不要な変数に対して警告してくれます。

例えば、以下のようなレスポンシブ対応のスワイプを実現してくれる[Swiper.js](http://idangero.us/swiper/)プラグインを使用した場合にもエラーが出力されます。

```js
// Swiperインスタンスの生成
var swiper = new Swiper('.swiper-container', {
  autoplay: 5000,
  autoplayDisableOnInteraction: false,
  loop: true,
  pagination: '.swiper-pagination',
  paginationClickable: true,
  spaceBetween: 30,
  speed: 500,
  effect: 'fade'
});
```

上記の場合は、次のようなエラーを出力します。

```
message: ''swiper' is assigned a value but never used. (no-unused-vars)'
```

この例では、Swiperコンストラクタを用いてインスタンスを生成していますが、`var swiper`はこれ以外の箇所で使用されることはありません。
そのため、ESLintの`no-unused-vars`のルールに反し、エラーが出力されます。

## 特定の行のみESLintを無効にする

この場合の解決方法として、任意の行数に対してESLintのチェックを除外する方法があります。

```js
var swiper = new Swiper('.swiper-container', { // eslint-disable-line
  autoplay: 5000,
  autoplayDisableOnInteraction: false,
  …
});
```

上記のように、

```js
// eslint-disable-line
```

を記述することで、ESLintのチェックを無効にすることができます。

特定のルールのみを無効にする場合には、`eslint-disable-line`の後に続けて特定のルールを記述することで、特定のルールのみを無効にすることができます。

```js
// eslint-disable-line no-unused-vars
```

つまり、先ほどの例は次のように書き直すことができます。

```js
var swiper = new Swiper('.swiper-container', { // eslint-disable-line no-unused-vars
  autoplay: 5000,
  autoplayDisableOnInteraction: false,
  …
});
```


## 複数行にかけてESLintを無効にする

例えば、複数行をまたいでESLintのチェックを無効にしたい場合は、次のように記述します。

```js
/* eslint-disable */

var swiper = new Swiper('.swiper-container', {
  autoplay: 5000,
  autoplayDisableOnInteraction: false,
  loop: true,
  pagination: '.swiper-pagination',
  paginationClickable: true,
  spaceBetween: 30,
  speed: 500,
  effect: 'fade'
});

/* eslint-enable */
```

上記の例では、

```js
/* eslint-disable */
```
以降から

```js
/* eslint-enable */
```

までのソースコードに対して、ESLintのルールを無効にします。

また、特定のルールを無効にする場合は、先ほどと同様に、`eslint-disable`の後に無効にしたいルールを記述します。

```js
/* eslint-disable no-unused-vars */

var swiper = new Swiper('.swiper-container', {
  autoplay: 5000,
  autoplayDisableOnInteraction: false,
  …
});

/* eslint-enable no-unused-vars */
```

## まとめ
上記の例では、プラグイン利用時にインスタンスを生成する時のみ必要な変数に対して、`eslint-disable-line`を用いて、ESLintの`no-unused-vars`のルールから除外することで、構文エラーを出力させないように書き換えました。

必要に応じて、

```js
// eslint-disable-line
```

もしくは、

```js
/* eslint-disable */
```

を利用することで、プラグイン利用時の避けられない構文エラーなどを回避する助けになるのではないかと思います。
goの並行処理パターンについてのリンク集

はじめに
--------------------
- golangで並行処理を書く時に、参考にさせていただいているサイトのリンク集
- 自分用のメモです


## [Advanced Go Concurrency 3 つのパターン - Block Rockin’ Codes](http://jxck.hatenablog.com/entry/20130623/1371999576)

> 1. loop を回して、定期的に外部サーバに GET を投げる
> 2. 取得した結果を、 channel を経由して呼び出し側に渡す
> 3. 呼び出し側から Close を呼ばれたら終了処理をする

- Close() を channel を用いた形で実装
- インターバル処理は、 time.Tick() を用いるこでイベントにできる
- buffer からの取り出しは channel への書き込みに
- nil channel

## [chanの使い方パターンメモ。 - GolangRdyJp](http://golang.rdy.jp/2015/03/25/chan_tips/)
> chanを扱う役割は５つある。
> - makeする役(maker)
> - writeする役(writer)
> - readする役(reader)
> - closeする役(closer)
> - 破棄する役(GC)

- パイプラインジョブパターン

[Goでchannelがcloseしてるかどうか知りたい というアンチパターン - beatsync.net](https://beatsync.net/main/log20150325.html)
--------------------

> さて、このタイトルを見てGoに詳しく賢明な読者の方々は「あぁまたこの話題だよ、Goでchannelがcloseしてるかどうか知りたいようなパターンはだいたい書いてるアプリの設計とかchannelの使い方が間違ってるんだからやめとけ」と眉をひそめるかもしれません。

- closeしてるchannelに書き込むと死ぬ
- closeしてるchannelをcloseすると死ぬ
- nilなchannelに書き込むと永遠にブロックする
- nilなchannelから読み込むと永遠にブロックする
- closeしてないchannelに、データが来てない状態で読み込むとブロックする

[Big Sky :: golang の channel を使ったテクニックあれこれ](https://mattn.kaoriya.net/software/lang/go/20160706165757.htm)
--------------------

- 下記のサンプル
    - ポーリング
    - キューイング
    - ワーカー

Dispatcher-Workerのサンプル
--------------------

- [Goで毎分100万リクエストを処理する | プログラミング | POSTD](http://postd.cc/handling-1-million-requests-per-minute-with-go/)
- [golang の channel を使って Dispatcher-Worker を作り goroutine 爆発させないようにする - at kaneshin](http://blog.kaneshin.co/entry/2016/08/18/190435)
- [Re: golang の channel を使って Dispatcher-Worker を作り goroutine 爆発させないようにする - okzkメモ](http://okzk.hatenablog.com/entry/2016/08/19/121652)
    - 上の記事を受けて、worker構造体なんて定義しなくてもforループでよくね、という内容
KeyRemap（Macの標準機能だけで）

Windows向け英語キーボードをMacで快適に使うための設定。
（職場はWindowsでも自宅はMacなわたくし向け）

##要点
`Ctrl`を`Command⌘`、`Windows`を`Control⌃`に変更。
右`Alt`を`英数`、`Application`を`かな`に変更。

##使うもの

+ Mac本体（iMac 27-inch 2017）
+ お気に入りキーボード（Microsoft Sculpt Ergonomic Desktop L5V-00001）
+ Automator（MacOS標準アプリ）
+ USB HID Tableの一覧：[Hut1_12v2.pdf](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf)

##差し替えるキーのピックアップとUsageID

###修飾キーの差し替え
カッコ内はUSB HID Table / USB HID UsageID

| 元のキー | MacOSの認識 | 差し替え後 |
|-------:|-------:|-------:|
| 左`Ctrl` (0x7/e0) | 左`Control⌃` (0x7/e0)  | 左`Command⌘` (0x7/e3) |
| 左`Windows` (0x7/e3) | 左`Command⌘` (0x7/e3) | 左`Control⌃` (0x7/e0) |
| 左`Alt` (0x7/e2) | 左`Option⌥` (0x7/e2) | _そのまま_ |
| 右`Alt` (0x7/e6) | 右`Option⌥` (0x7/e6) | `英数` (0x7/91) |
| `Application` (0x7/65) | _無視される_ | `かな` (0x7/90) |
| 右`Ctrl` (0x7/e4) | 右`Control⌃` (0x7/e4) | 右`Command⌘` (0x7/e7) |

###ファンクションキーの差し替え
F1〜F12をファンクションキーとして使用
（L5V-00001は、キーボード本体に切り替えスイッチがある）
その他のファンクションキー

| 元のキー | MacOSの認識 | 差し替え後 |
|-------:|-------:|-------:|
| `PrtScr` (0x7/46) | `F13` (0x7/46) | _そのまま_ |
| `ScrLk` (0x7/47) ※1 | `F14` (0x7/47) | `Volume -` (0xC/ea) |
| `Pause` (0x7/48) ※1 | `F15` (0x7/48) | `Volume +` (0xC/e9) |
| `電卓` (0xC/192) ※2 | _無視される_ | `Mute` (0xC/e2) |
| `Insert` (0x7/49) | `Help` (0x7/49) | `Eject` (0xC/b8) |
※1 修飾キーとして `Shift⇧`、`Option⌥`、`Command⌘` のみ利用可能。`Ctrl⌃` は被修飾キー（`ScrLk`、`Pause`）が無視される
※2 修飾キー（`Shift⇧`、`Ctrl⌃`、`Option⌥`、`Command⌘`）が無視される

###差し替えるキーのまとめ
| 元のキー | 差し替え後 |
|--------:|--------:|
| 左`Ctrl` (0x7/e0) | 左`Command⌘` (0x7/e3) |
| 左`Windows` (0x7/e3) | 左`Control⌃` (0x7/e0) |
| 右`Alt` (0x7/e6) | `英数` (0x7/91) |
| `Application` (0x7/65) | `かな` (0x7/90) |
| 右`Ctrl` (0x7/e4) | 右`Command⌘` (0x7/e7) |
| `ScrLk` (0x7/47) | `Volume -` (0xC/ea) |
| `Pause` (0x7/48) | `Volume +` (0xC/e9) |
| `電卓` (0xC/192) | `Mute` (0xC/e2) |
| `Insert` (0x7/49) | `Eject` (0xC/b8) |

##コマンドを実行してキーを変更
以下のページを参考にターミナルからコマンドを実行
[Remapping Keys in macOS 10.12 Sierra](https://developer.apple.com/library/content/technotes/tn2450/_index.html)

```sh
hidutil property --set '{"UserKeyMapping":[
{"HIDKeyboardModifierMappingSrc":0x7000000e0,"HIDKeyboardModifierMappingDst":0x7000000e3},
{"HIDKeyboardModifierMappingSrc":0x7000000e3,"HIDKeyboardModifierMappingDst":0x7000000e0},
{"HIDKeyboardModifierMappingSrc":0x7000000e6,"HIDKeyboardModifierMappingDst":0x700000091},
{"HIDKeyboardModifierMappingSrc":0x700000065,"HIDKeyboardModifierMappingDst":0x700000090},
{"HIDKeyboardModifierMappingSrc":0x7000000e4,"HIDKeyboardModifierMappingDst":0x7000000e7},
{"HIDKeyboardModifierMappingSrc":0x700000047,"HIDKeyboardModifierMappingDst":0xC000000ea},
{"HIDKeyboardModifierMappingSrc":0x700000048,"HIDKeyboardModifierMappingDst":0xC000000e9},
{"HIDKeyboardModifierMappingSrc":0xC00000192,"HIDKeyboardModifierMappingDst":0xC000000e2},
{"HIDKeyboardModifierMappingSrc":0x700000049,"HIDKeyboardModifierMappingDst":0xC000000b8}]}'
```
再起動すると入れ替え操作が戻ってしまうので、Automatorで上記コマンドを実行するアプリケーションを作成してログイン項目に登録。

あとはキートップが実際とは異なるのでテプラでキートップを作って貼り付ける。
joを使ってファイル一覧のJSONをつくる

## 背景 ##
友達から依頼されました。
サーバ関係でカレントディレクトリにある全ファイルを、拡張子ごとに分類したJSONをつくって欲しいとのことでした。
joを使います。

## joのインストール ##
```
brew install jo
```

## プログラム ##
```
for type in $(ls -F | grep -v / | grep -oE '\..*' | sort | uniq);do echo $type=$(ls *$type | awk '{print NR "=" $0}' | jo);done | jo -p
```

## 実行結果 ##
<img width="840" alt="スクリーンショット 2017-09-27 1.24.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/4a1d0288-e69f-d747-a9ad-dc003b482c57.png">
Linux系serverでよく使うコマンド一覧(Now Updating)

# フォルダ内のファイル一覧取得
###### 一覧をタイムスタンプ順にソートして、且つファイルサイズをKB or MB or GB表示指定をして最後にタイムスタンプを西暦表示する
**ls -lht --ful**

# Serverの起動状況確認
###### Serverが起動しているか確認時に使用する。ただし、ServerによってはPingを拒否している場合もあるため、通信ができないからと言ってServerが停止していると判断することは避けた方がよい。
**ping**

# DNSの設定状況確認
###### DNSの設定状況を確認する
**nslookup**

# http通信の状況を確認
###### http or https の通信結果を確認する
**curl**

# サーバからファイルをダウンロード or http通信の状況を確認
###### Serverからファイルをダウンロードする
**wget**

# Serverの再起動状況などログファイル監視
###### Serverの再起動などでログファイルを監視する際に使用する
**tail -f**

# ファイル内確認
###### ファイル内をpage単位等で確認する際に使用する。moreであれば参照のみのため、誤って内容を書き換えてしまう心配はない
**more**
Groovy入門(サマリ)

<!--
* [目的]
* 案件先で使用しているGroovyの基礎部分について習得する。
* 今後、活用できるようにある程度、活用できるようになる。
-->

##●参考文献

[簡単！Groovy入門](https://www.slideshare.net/leecgeun/groovy-36442060)

##●サマリ

**Java**に似た言語 → **Groovy**<br>

**Groovy**とは？
	- JVM上で動作する言語
	- Javaと類似した文法で書くことのできるスクリプト言語(≠JavaScript)
	- Androidでも動くらしい

**Groovy**の特徴
	- Javaでスクリプトが書ける
	- コンパイルが不要
	- Javaでイケてない部分も使いやすくなっている
macOS High SierraのcURLで手軽にPUSH通知が送れるようになった

macOSをHigh Sierraにアップデートしたら、cURLのバージョンが7.54.0になっており、さらにHTTP/2の利用ができるようになっていました。

iOS10からは[APNs Provider API](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html)を利用したPUSH通知が受け取れていたため、pemファイルさえあればローカルのmacOSからiPhone実機へ向けたPUSH通知を送れます。

念のため、curlコマンドからnghttp2込みでビルドされているのを確認するのは-Vです。

```bash
$ curl -V
curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy
```

Dockerを使った記事である[気軽にプッシュ通知のテストがしたい【iOS10以降対応】](https://qiita.com/fromkk/items/e1d8d8e302b49a372dd1)を参考にして、macOSのcURLからAPNs Provider APIを利用するスクリプトapns.shを用意する例を示すと、下記のようになります。

```
$ apns.sh key.pem iPhone実機のデバイストークン
```

これは引数でpemファイルのパス、デバイストークンを指定するようにしています。

```bash:apns.sh
#!/bin/sh

pemfile=$1
token=$2
pushData='{"aps": {"alert": "push dev test"}}'

bundleIdentifier="アプリのBundle ID"

appleUri="https://api.development.push.apple.com/3/device/"

curl -v \
-d "$pushData" \
-H "apns-priority: 10" \
-H "apns-expiration: 0" \
-H "apns-topic: ${bundleIdentifier}" \
--http2 \
--cert ${pemfile} \
${appleUri}${token}
```

iOSアプリを開発するmacOS標準で用意してくれているcurlコマンドさえ叩けばいいという利点は大きいので、例えばプラグイン作ってmacアプリからPUSH通知呼び出すとか。ちょっと工夫すればいろんな遊びがありそうですね。
Access VBA レポートを作ったときに書くべきNo Data Events

#VBAのCode
[Access Access VBA reference オブジェクト モデル Report オブジェクト (Access)](https://msdn.microsoft.com/ja-jp/library/office/ff195583.aspx)

```vbnet:Report_NoData
Private Sub Report_NoData(Cancel As Integer)

    'Add code here that will be executed if no data
    'was returned by the Report's RecordSource
    MsgBox "No customers ordered this product this month. " & _
        "The report will now close."
    Cancel = True

End Sub
```

#これを書くレポートごとにNo Dataイヴェントに書けと。

レポートの NoData イベントを使用して、***表示するデータがないときにレポートを開かない***ようにする方法を示します。
Javaのお勉強#2(\マークと演算子)

##￥マークの使い方について・・・

今回は第二章を読み進めて行きました！
二章と言ってもまだまだ一章の途中なんですけどね:D

```java

String msg　=　”この記号を見てください→（”）”

```

  みたいなのだと　この記号を見てください→（
  までが文字列とみなされてしまうようです。

まあコンピュータなのでしょうが無いですが、ついつい書きそうな単語でもありますね。

次は演算子を読んでみました。
算術演算子の+や-、*と/は難しい問題ではありませんでした。
もうひとつの算術演算子である%は、剰余の機能だそうで、例としては　9％2　→　1
そして、/には機能が正確に決められているみたいで、　9　/　2　→　4　となってしまうそう。
小数点まで出したいときには、　9.0　/　2　→　4.5　にすればいいのかな・・・？ここは実際にやってみるべきですね
　
次に代入演算子
　＝　は　a　=　5　→　a（中は5）
 +=　 は　a　+=　5　→　（a　=　a　+　2）
 ＝の前に付くのは算術演算子と同じ役割みたいですので省略しようと思います
 ＝が前に付くだけで意味がかなり違ってくるので気をつけたいですね
 
 次にインクリメント・デクリメント演算子について・・・
 　++　--　これがその演算子。
  　++　の機能は、値を1増やす・　--　の機能はその逆だそうです。
   
その次の型の変換については明日やろうと思います・・・
それではおやすみなさい
Sentry でのエラー通知を development 環境では防ぐ方法

Sentry の config 内で設定可能。
`shouldSendCallback` での返り値が `false` だと、 Sentry はエラーをレポートしない。
以下の例では、配列に 'production', 'staging' など指定し、指定した環境のレポートのみ送信する例。

```js
import Raven from 'raven-js';

Raven.config('https://セントリーのurl', {
      release: RELEASE,
      environment: process.env.NODE_ENV,
      shouldSendCallback: () => {
          return ['production', 'staging'].indexOf(process.env.NODE_ENV) !== -1;
      },
  }).install();
```

`environment` の キー をつけておくと、レポート時にタグも付けれる。絞り込みをする際に便利。

environment に production のタグをつけれる|
---|
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26095/bb5cc8c2-7f4b-0d18-b0a9-b23afd12af59.png)|


### 参考
- https://docs.sentry.io/clients/javascript/config/
- https://github.com/getsentry/raven-js/issues/105#issuecomment-320326597
flash エラーメッセージ 特定カラムのメッセージだけを取り出す方法

# 起きた事象
controllerにおいて例外処理をしているとき

```
raise  ActiveRecord::RecordInvalid
flash.now[:alert] = @takumi.errors.full_messages
render :new
```
=> 例外処理をしているのに、すべてのエラーが取れてしまうため例外が特定できない

#解決策
**full_messages_for(:symbol)**を使うといい感じに取り出せるヨ

```
@messages=
  {:first_name=>["を入力してください"]}

[1] pry(main)> takumi.errors.full_messages
=> ["first_nameを入力してください",
    "性別を入力してください"
]

[2] pry(main)> takumi.errors.full_messages_for(:first_name)
=> ["first_nameを入力してください"]

```
# 結果

```
raise  ActiveRecord::RecordInvalid
flash.now[:alert] = @takumi.errors.full_message_for(:first_name)
render :new
```

参考
[API dock](https://apidock.com/rails/ActiveModel/Errors/full_messages_for)
PhpStormのDatabase tool windowにてphp配列形式でダンプする

# はじめに
PhpStormって使いだしたら、すべてphpstormだけでやりたくなるくらい機能が充実してますよね～
データベースの操作ももちろんPhpStormのDatabase tool windowを使ってるのですが、データをダンプするのに、SQL、JSON、CSV,TSVとかいろいろ出力できるのにphpの配列形式はなくて、phpunitでdata_provider用のデータを作る時とか、わざわざJSON形式を置換したりしてたのですが、そんなことしなくても直接ダンプする方法を見つけて感動したので、投稿します！
![2017-09-26_22h46_46.png](https://qiita-image-store.s3.amazonaws.com/0/68254/b815f04f-99aa-8d96-e3bd-f31f6f1400b0.png)

# PHP出力用のScriptをダウンロード
ここからダウンロードします。
※もともとあったJSON用のScriptをちょっといじっただけです(^^;
https://github.com/albyte/phpstorm-utilities/blob/master/extensions/database/data/extractors/PHP.groovy

![2017-09-26_22h44_50.png](https://qiita-image-store.s3.amazonaws.com/0/68254/34409878-d188-2549-3b0d-0ba650a2c9c6.png)

# スクリプトをPhpStormに入れる
ダウンロードしたファイルを拡張フォルダに入れます。
![2017-09-26_23h22_04.png](https://qiita-image-store.s3.amazonaws.com/0/68254/55f9e255-7768-21a2-ea60-c13f9cc5b64b.png)

# おわりに
これで好きなテーブルを開いたら、dump形式のところにPHP.groovyってのがでるようになります。
Have a nice PhpStorm life!
自分自身をデフォルト引数に指定する。あるいはプログラムで詩を書く方法

es6では、デフォルト引数が使えて便利です。
そして、もちろん自分自身をデフォルト引数として指定できます。



<img src="https://pbs.twimg.com/media/DKp9ClqUIAo0z2U.jpg:small" />

自分自身を再帰的に呼ぶ場合は、引数がなければ無限ループするのであまり出番はないかも知れませんが、プログラムで詩を書くときは便利です。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">秋なので詩を書いてた <a href="https://t.co/7iKs9DEkjx">pic.twitter.com/7iKs9DEkjx</a></p>&mdash; 無職.js (@akameco) <a href="https://twitter.com/akameco/status/912679670872662016">September 26, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
AWS Greengrassを利用する際の「センサー制御部」と「新しいLambda関数のデプロイ」について

9/26のJAWS-UG IoT専門支部主催「[AWS Greengrass Handson](https://jawsug-iot.connpass.com/event/64960/)」を受講し終わったばかりの松下です

## 受講目的

1. AWS Greengrass Coreからセンサー制御ってどうするの？
2. Lambda関数の更新時の手順は？

この2点が前から気になっていました。運用するのに必須だからさ。

## 結論

### AWS Greengrass についてわかった事 (たぶん)

AWS Greengrass Core (エッジデバイス上で動くコンテナプロセス、以下ggc) は、AWS IoT に対するMQTT Proxyサーバ的役割と、Lambda実行環境を持っている。

そのため

* ggcを起動すると *8883* ポートでMQTT接続を待ち受ける
* オフラインとなったとしても、センサー制御部プログラム側から見ると、AWS IoTに直接接続しているかの如く動作し続けることができる

## AWS Greengrass Coreとセンサー制御部の関係

**NEW(3/7):** re:Invent 2017 で AWS Greengrass のアップデートがされ [ローカルLambdaからローカルリソースへのアクセスも可能](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/access-local-resources.html)になりました

~~ggcやその上で動くLambdaからOSが持っているローカルリソース、例えば `/dev/ttyUSB0` をRead/Writeすることはできない。（と推測される）~~

* ~~そのため、「**センサーからReadする→AWS Greengrass SDKを使って)ggcにデータを投げる**」というプログラムが必要。また、このプログラムが動くようにする環境が必須~~
* ~~また、上記プログラムの活動制御はggcは行ってくれないので、systemdのUnitを作る※、そのプログラム自体の更新の仕組みを考える、等が必須~~
    * ~~※ggc上のLambdaを更新する際、ggcのMQTT接続が切れる模様。そうなると、センサー制御部のプログラムは再接続の仕組みを持たせるか、supervisor的なところから再起動してもらう必要がある~~

## Lambda関数の更新時の手順

### ggc上で動くLambdaのイメージ

ハンズオンでの構成を再現すると

```
ThingShadowSensor.py
  (publishするように書く)
     ↓
(8883:sensing/data/Sensor-01)
     ↑
  (subscribeするように設定)
Lambda:cpuUsageChecker-01:VERSION
  (publishするように書く)
     ↓
(8883:$aws/things/Alert-01/shadow/#)
     ↑
  (subscribeするように書く)
ThingAlertSensor.py
```

わかりづらくてゴメン。何が言いたいかというと、Lambda関数だ～とか言わず、結局のところMQTTのトピックを介してパイプ処理をしている。そして、ggc内はスクリプトじゃなくてLambda関数を実行できるよ、という解釈で大丈夫。（たぶん）  
そのため、この行先（＝サブスクリプション）に、たとえば `Lambda:cpuUsageChecker-01:NEW-VERSION` が含まれるエントリー（トピックの組み合わせ）を作ってあげれば NEW-VERSION な Lambda関数が起動する。

手順は以下の通り;

1. AWS Lambda関数を更新、発行する (新しいバージョンができる)
2. クラウド側AWS Greengrassの「Lambda」メニューで、新しいバージョンのLambda関数を「追加」する (複数のバージョンが存在することになる)
3. クラウド側AWS Greengrassの「サブスクリプション」メニューで、新しいバージョンのLambda関数を「ソース」や「ターゲット」とするエントリーを作成し、古いバージョンのLambda関数を利用しているエントリーを消す
    * 消さなくても良い。その代わり、トピックを調整する必要がある
4. クラウド側AWS Greengrassの「グループ」メニューから、デプロイする

## まだわからないこと

* ggcに対してすっぴんのMQTTクライアント接続が可能なのか？ (AWS Greengrass SDKはデカすぎる。センサー制御プログラムは極力小さくしたいはずだ！)

## あとがき

市川さんはじめ、全国のJAWS-UG IoT 専門支部の方々、お疲れ様でしたー！！！
Docker内でAnsibleの勉強をしよう

# 概要

先にDockerをある程度使いこなせて、これからAnsibleを勉強しようとしている方向けです。
勉強用のゲスト環境をvagrant + VMで作るのって気が引けませんか？私はそうなりました・・・
なので、せっかくDockerを覚えたならゲスト環境をDockerで構築したくなりませんか？
ということでDockerでゲスト環境とAnsible実行環境を1つにまとめました.。
また、Dockerの特性を活かして、Ansibleの勉強で汚した環境を躊躇なく捨てて常にクリーンな環境で勉強できるのが、Dockerならではと思います。

以下は[こちらのコード](https://github.com/comefigo/docker-ansible-practice)をベースに説明していきます。

※コンテナにsshサーバを導入していますが、あくまでも勉強用に導入しています。
※すぐに学習始められるようにゲスト環境用のsshキー(パスキーなし)をあえて入れます。
  （変えたい場合は再生成し、イメージを再ビルドしてください）

# コンテナの構成

- centos7、ubuntu20 ･･･ ゲスト環境（CentoOS派とUbuntu派がいると思いますのでｗ）
- myansible ･･･ ubuntuベースのAnsible実行環境(2.9.x)

myansibleコンテナでansibleコマンドを実行し、各ゲスト環境を更新する流れです。

# 起動方法

以下のコマンドでゲスト環境とansible実行環境が起動されます。
なお、VSCodeの[Remote Container](https://code.visualstudio.com/docs/remote/containers)にも対応しておりますので、
該当の手順で起動することも可能です。

```shell
> docker-compose up -d
```

# Ansibleコンテナにログイン

```shell

> docker exec -it myansible bash
```

# 疎通確認

myansibleコンテナの`/myansible`配下で以下のコマンドを実行

```
root@myansible:/myansible# ansible-playbook -i hosts book.yml
```

実行結果
以下の様に表示されればOKです！

```

PLAY [all] ***************************************************
TASK [Gathering Facts] ***************************************
ok: [ubuntu20]
ok: [centos7]

TASK [debug] *************************************************
ok: [centos7] => {
    "msg": "hello from centos7 !!"
}
ok: [ubuntu20] => {
    "msg": "hello from ubuntu20 !!"
}

PLAY RECAP ****************************************************
centos7      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
ubuntu20     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

# playbookの実行

playbooksをmyansibleコンテナの`/playbooks`にマウントしているので、
playbooks内にplaybookなどを作成し、ansibleコマンドを実行してください。

# ゲスト環境が増えた場合

1. docker-compose.ymlの新たなゲストとなるサービスを追加
2. `playbooks/hosts`に手順1で追加したサービス名を追加

# 参考

https://kizawa.info/docker-sshlogin
https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image
STM32F7-DISCOでスマートミラー自作（１）

#スマートミラーとは
スマートミラーはマジックミラーと液晶（と任意のプロセッサ）を組み合わせて作る、鏡に情報を映し出せるガジェットのことです。
（参考）
http://www.maker-is-you.xyz/2017/04/07/smart-mirror/

と、いうわけで私も作ってみようと思います。

#仕様

###縛り条件
自作スマートミラーは以下の縛り条件でやろうと思います。

１）メインプロセッサはマイコン
２）タッチパネルも使える
３）**手軽に作れる**

###機能
１）鏡に情報表示
２）タッチパネルによる入力インターフェイス
--------今回はここまで---------
３）Wi-Fiモジュール搭載
４）Web APIで天気とかを取得
５）慣性センサー搭載（姿勢検出）
６）カメラ搭載、画像認識

こんな感じでいこうと思います。６）までできたら面白そうですね。

#材料
１） STM32F746G-DISCO(メインプロセッサ)
　メインプロセッサというかメインボードはこれです。
![F8820278-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/117189/cdb47c3d-7b0b-abdc-5af5-4b3b7be70960.jpeg)
Cortex-M7搭載でTFTタッチスクリーンが付いているんでほぼこれでハードは完成です。他にもMEMSマイクやイーサネットコネクターが付いていたりArduinoシールドに対応したピンソケット配置だったりするので有用性の幅は広いと思います。

２）マジックミラー
 ![DSC_0751.JPG](https://qiita-image-store.s3.amazonaws.com/0/117189/193b2086-d463-ef21-430f-2a41272a6827.jpeg)
マジックミラーというよりミラーコート使用の画面保護フィルムです。１００均で買えます。



#制作
１）ハードウェア
　と、いっても、ボードのタッチスクリーンに画面保護フィルム張るだけです。

２）ソフトウェア
　STM32系の開発環境はいろいろあって、仕事では有料ライセンスのKeilとか使っており、プライベートではeclipse + openOCDで無償の開発環境作ってたりしますが、有料版はコストがかなりかかるし、eclipse + openOCDだと環境構築でハマってしまったりするので、今回は手軽さを重視することにしてmbedで開発を進める事としました。
とりあえず、今回はミラー越しにディスプレイの出力が見れればいいので、Team STで公開しているDISCO-F746NG_LCD_Demoというプロジェクトをインポートしてほぼそのまま使用しました。背景は黒、文字は緑あたり(お好きな明るい色)にすると鏡として反射し、かつディスプレイの出力をクリアに見ることが出来ます。
　今回は、とりあえず出力テストと鏡の上からタッチパネルの動作テストをするだけなので黒い背景に緑色の文字を表示、タッチしたところに"Touch"と表示することにしました。

#動作
![DSC_0752.JPG](https://qiita-image-store.s3.amazonaws.com/0/117189/a830243e-009c-c309-77ae-4d91fa29f21e.jpeg)
![DSC_0754.JPG](https://qiita-image-store.s3.amazonaws.com/0/117189/8de05747-5611-dd51-16f0-c225587cfb0f.jpeg)

動作はとりあえずこんな感じです。画面保護フィルムをディスプレイの大きさに切るべきかもしれませんが、あえてそのまま張ってスマホ用の画面保護フィルムをそのまま使いました感を出してみました。
とりあえず、画面背景を黒系にすることでミラーコート仕様だけあって鏡のように反射することができ、ディスプレイの文字出力をみることができます。
また、タッチパネルもしっかり動作しました。

とりあえず今回はここまでとします。
次回はXbee Wi-Fiを接続して天気情報をGetしてみようと思います。
お天気アイコンどうしよう・・・
MacでRPy2のインストールでつまづいたのでメモ

# この記事について
- MACでRPy2のインストールにつまづいたのでメモです。
- RPy2は、Pythonから、Rを使うライブラリ
- PyCon JP 2017のトーク「[プレゼンテーション：PythonとRを行ったり来たり \| PyCon JP 2017 in TOKYO](https://pycon.jp/2017/ja/schedule/presentation/18/)」の[資料](https://github.com/toshiukii/rpy-talk/blob/master/rpy_pyconjp17.ipynb)を読んで、使えたら便利と思ったのがRPy2を入れてみようと思った経緯

# インストール
`$ pip install rpy2`  
でインストールできれば、それで終わりなんですが、私の環境下では２つほど原因がありうまくいきませんでした。

# Rのバージョン
１つ目のうまくいかなかった原因は、Rのバージョンが古かったから。  
以下のような、エラーが出た場合には、Rのバージョンが古いことが原因のようなので、アップデートしておきましょう。  
(なお、アップデートは、時間がある時に慎重にやったほうが良いです。)

```
 raise SystemExit("Error: R >= 3.3 required"
                                 " (and the we found R told '%s')." % '.'.join(map(str, rexec.version)))
```
# R_HOMEの設定
２つめは、`~/.bash_profile`　などで、R_HOMEを設定していなかったから。

```{~/.bash_profile}
export R_HOME=$(which R) # (which Rには、R_HOMEのパスを設定)
```
設定後、ターミナルから以下をためして、R_HOMEの場所が表示されれば完了です。
```
$ source ~/.bash_profile # 
$ echo $R_HOME
```

# 最後に
私の場合は、以上で無事にRPy2が使えるようになりました。