OmniAICreator/Qiita-1.07M huggingface dataset:
Docker版Galaxyにツール開発用のplanemoをインストール

# この記事の概要

- バイオインフォマティクス解析環境のGalaxy用のツール開発の記事です。
- [前回の記事](https://qiita.com/youyuh48/items/0745d8dad978bd819f94)で構築したDocker版Galaxy環境でツールを開発するための環境を構築します。
- Galaxy用のツール開発支援ツールの[planemo](https://github.com/galaxyproject/planemo)を利用してみます。

# planemo のインストール

Docker版Galaxy環境に[planemo](https://github.com/galaxyproject/planemo)をインストール

コンテナを起動

```
$ docker run --name galaxy -d -p 8080:80 \
 --volumes-from galaxy-store \
 --privileged=true \
 -e GALAXY_CONFIG_ENABLE_BETA_MULLED_CONTAINERS=True \
 -e ENABLE_TTS_INSTALL=True \
 bgruening/galaxy-stable
```

コンテナにログイン
`$ docker exec -it -e COLUMNS=200 -e LINES=50 galaxy /bin/bash`

ターミナルで文字列が変に折り返されないように`-e COLUMNS=200 -e LINES=50`をつける

planemoのインストール

```
# pip install --upgrade pip
# pip install planemo
# planemo --version
planemo, version 0.49.2
```

コンテナ内にツール開発用のディレクトリを作成
`# mkdir /local_tools`

コンテナから抜けて今までの変更をコミットして新しいイメージを作成、最初のコンテナは削除

```
# exit
$ docker stop galaxy
$ docker commit galaxy galaxy-stable:20180510
$ docker rm galaxy
```

作成したイメージで再度コンテナを起動。
ホストのツール開発用のディレクトリでコンテナ起動し、ツール開発ディレクトリにマウント

```
$ docker run --rm --name galaxy -d -p 8080:80 \
 -v `pwd`:/local_tools \
 --volumes-from galaxy-store \
 --privileged=true \
 -e GALAXY_CONFIG_ENABLE_BETA_MULLED_CONTAINERS=True \
 -e ENABLE_TTS_INSTALL=True \
 galaxy-stable:20180510
```

ホストのカレントディレクトリのパスに空白や日本語が含まれるとエラーになるので注意

# plnemoを起動

```
$ docker exec -it galaxy planemo --version
planemo, version 0.49.2
```

これでplnemoを使う準備が完了

# 参考

- [GitHub - galaxyproject/planemo: Command-line utilities to assist in developing tools for the Galaxy Project.](https://github.com/galaxyproject/planemo)
- [Galaxyで関連のメモ - Qiita](https://qiita.com/manabuishiirb/items/55782f9cca605f7b87fe)
nyagos 4.3でもmigemoでディレクトリ移動したい!

nyagos4.3になり、LuaのエンジンがGopherLuaに変わりました。

[nyagos で lua53.dll のかわりに GopherLua を使おう](https://qiita.com/zetamatta/items/112484eb7fdae87830a0)
[続・nyagos で lua53.dll のかわりに GopherLua を使おう](https://qiita.com/zetamatta/items/18597ed77c4574796c7b)

これまではlua53.dllを使用していたので、Luaの拡張DLLを自作し、
c/migemoを使ったローマ字入力による日本語ディレクトり移動を実現していたのですが、
Luaエンジン変更に伴い拡張DLLが使えなくなったので、
Luaエンジンに依存しないよう外部コマンドでmigemo部分を置き換えようというのが今回の目的です。

## 外部コマンドの`gmgmgm`作成

[koron/gomigemo](https://github.com/koron/gomigemo)を使って、Go言語で[nocd5/gmgmgm](https://github.com/nocd5/gmgmgm)というコマンドを作りました。
`gmgmgm`はマッチパターンと検索したいリストを渡すと
migemoでマッチしたリストを返す簡単なコマンドで、
次のように引数を渡します。
`gmgmgm <マッチパターン> <検索したいリスト>`

#### example

```
$ gmgmgm test 私見 試験 私権 rest test west てすと テスト
test
テスト
試験
```

### インストール

migemoの辞書は埋め込みのものを使用したので、
以下のコマンドだけでインストールが完了し使える状態になります。

```
go get github.com/nocd5/gmgmgm/cmd/gmgmgm
```

## nyagosでの利用
[nocd5/gmgmgm/example/nyagos.d/catalog/mgcd.lua](https://github.com/nocd5/gmgmgm/blob/master/example/nyagos.d/catalog/mgcd.lua)にサンプルのスクリプトを同梱しました。
`ls`で得たリストをmigemoで絞込み、nyago組み込みの`box`で移動先ディレクトリを選択します。

日本語名のディレクトリに限らず、先頭の文字を入力すれば`box`でインタラクティブに移動できるので以外と便利です。
![gmgmgm.gif](https://qiita-image-store.s3.amazonaws.com/0/52493/9b5242a4-3b41-2392-483b-9d56c7517aa0.gif)
js 与えられた文字の真中を返す

##題
与えられた文字の中間の文字を返してください。
単語の長さが偶数の場合は、中央の2文字を返してください。
*与えられる文字はアルファベットになります

```javascript
function getMiddle(s){
  //write your code
}

getMiddle("test")//"es"
getMiddle("testing")//"t"
getMiddle("middle")//"dd"
getMiddle("A")//"A"
```

##使ったもの
if
length
charAt();
slice();
Math.floor();

##考えかた
与えられた文字を2で割る
割り切れるかどうかでif文を設定

##コード

```javascript
getMiddle = (s) => {
  var middle = s.length / 2;
  return (s.length % 2) 
    ? s.charAt(Math.floor(middle))
    : s.slice(middle - 1, middle + 1);
}

```

##その他コード

```javascript

getMiddle = (s) =>{
  return s.substr(Math.ceil(s.length / 2 - 1), s.length % 2 === 0 ? 2 : 1);
}
```

他にもコード浮かんだ方、コメントお願いします。
Sublime Text 3 のインストール手順と使い方をとにかく簡単にまとめてみる（2018春）

# はじめに
プログラマにとって最も向き合うことが多いソフトはエディタだと思う。
だからか、雑談をしているとエディタはどれがいいかとよく話題になる。
そのたびに、Sublime Textはええで
と勧めているんだけど、結局いい感じのインストールマニュアルがないので、
うーんインストールも慣れれば簡単なんだけど、拡張性も高いし！
あーでもめんどくさいよね初期設定。情報ふるいの多くてハマるし。
でもうーん設定して回るのはいやｗ

なら、自分が再設定するときのことも考え作っちゃおうということで。
ライセンスの話とか、なにがいいのとかはみんなが語ってくれているので、割愛します。
んで、どうやってインストールと設定するのが楽なの、実用は？って人向けです。

# 内容
* ダウンロード
* インストール
* Package Controlを追加
* 日本語化
* 簡単な使い方

# 環境
* windows 10
* 2018/05/09時点
* 設定中もインターネットにつながっていること。

（設定ファイルの場所が違ったりはするけど、それ以外はどのOSでも一緒）
# インストールと初期設定
## ダウンロード
https://www.sublimetext.com/3
から「Windows 64 bit」をクリック。

## インストール
ダウンロードしてきた.exeを使ってとりあえずインストール
インストールが終わったら起動。

## Package Controlの追加
メニューバーから
`Tools` > `Command Palette`
もしくはショートカット`Ctrl + Shift + P`
で、コマンドパレットを表示。
ウィンドウ上部に白い入力スペースが出るので、ここに`Package Control`と入力（下画像のように適当に補完してくれるので、Paくらいであとは↓カーソルを押せばよい。）
![sub1.PNG](https://qiita-image-store.s3.amazonaws.com/0/194701/50a438b5-3f3d-a3c3-24bb-a2e1606f2dda.png)

installdとか出ればOK。

追加機能は基本的にこのPackage Controlを使って管理できる。
コマンドパレットを表示したら`Package Control:`で始まるものを選択して使用する。（使い方編で少し後述する）

英語しか使わないよ。って人はこれで設定は完了。

# 日本語化
さっそくPackage Controlを使って、日本語入力と日本語の表示に必要なPackageを入れていきます。
## IMESupportの追加
IMESupportはIMEを使った変換前の文字入力を適切な位置に表示してくれるパッケージです。
これを入れないと日本語入力時に、入力中カーソルが、画面左上に行ったり、宙に浮いたりしてしまいます。

コマンドパレットから、`Package Control: Install Pacage`を選択。
IMESupportを選択。
![sub2.PNG](https://qiita-image-store.s3.amazonaws.com/0/194701/0c1b5738-7045-65e4-3da9-333640b212ef.png)

## Japanezeの追加
メニューを日本語で表示してくれるパッケージです。
英語メニューの方がいいという人は不要。

コマンドパレットから、`Package Control: Install Pacage`を選択。
Japanizeを選択。
![sub3.PNG](https://qiita-image-store.s3.amazonaws.com/0/194701/2c7c9323-b8f7-6a4b-1f65-f2e8750a3778.png)

新しくタブが開いて、メッセージが表示されいるとおもいます。
表示された手順通りに.jpのファイルをDefaultに移動していけばOKです。

```
Package Control Messages
========================

Japanize
--------

  Japanese menu for Sublime Text 3  
    
  Sublime Text 3の日本語化プラグインです。  
  [ゆーがいぶろぐ](http://blog.huwy.org/article/292827228.html)さんの日本語化ファイルがベースです。  
    
  適用手順  
  １．C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\Japanizeにインストールされている*.jpファイルを、  
   　　　C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\Default  
  　　にコピーします。※Defaultフォルダがない場合は作成してください。  
  ２．コピーしたファイルをオリジナルのファイル（.jpが付かないファイル）と置き換えます。（念のため、オリジナルのファイルが有る場合は.orgなどを付けて保管しておきましょう。）  
  ３．C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\Japanize\Main.sublime-menu（.jpが付かない方）を、  
   　　　C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\User  
  　　にコピーします。すると、他のプラグインで上書きされてしまっているトップメニューも日本語化されます。  
  以上です。
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194701/4518b737-dfa4-d364-ea06-5487d61b2e3f.png)
こんなかんじで、メニューがすべて日本語になっていれば完成です。

---
ちなみに余談ですが、`C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\`をバックアップしておくと、作業環境をそのまま復元できますので、パッケージが自分好みにそろってきたら、このフォルダをコピーしておくといいかもしれません。
作業履歴とか最近開いたファイルとかまで全部復元できちゃいます。

# 簡単な使い方
また午後書きます。とりあえず公開しちゃいます。
今更だけどvagrant入門

お手本どおりやったらエラーが出て何個かの記事を行き来したため。

## やること

バーチャルボックスにosを立ち上げるだけ

## 前提

- vagrantをインストール済みである
- VirtualBoxをインストール済みである
- macOSを使用している

## test用を作る
```
$cd ~
$cd Desktop
$mkdir vagrant_test
$cd vagrant_test

```

## boxをとってくる

[ここ](http://www.vagrantbox.es/)

```
$ vagrant box add https://atlas.hashicorp.com/envimation/boxes/ubuntu-xenial-docker


==> box: Loading metadata for box 'https://atlas.hashicorp.com/envimation/boxes/ubuntu-xenial-docker'
==> box: Adding box 'envimation/ubuntu-xenial-docker' (v1.0.0-1516241473) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/envimation/boxes/ubuntu-xenial-docker/versions/1.0.0-1516241473/providers/virtualbox.box
==> box: Successfully added box 'envimation/ubuntu-xenial-docker' (v1.0.0-1516241473) for 'virtualbox'!
```

## initiする

```
vagrant init envimation/ubuntu-xenial-docker
```

## 注意文をよく読む

もし読めない単語があったら[ここ](http://wordtranslate.info/WordTrans/word_trans.html)で単語翻訳をしてくれる（文章流し込めば単語で翻訳してくれる...）

```
Vagrant is currently configured to create VirtualBox synced folders with
the `SharedFoldersEnableSymlinksCreate` option enabled. If the Vagrant
guest is not trusted, you may want to disable this option. For more
information on this option, please refer to the VirtualBox manual:

  https://www.virtualbox.org/manual/ch04.html#sharedfolders

This option can be disabled globally with an environment variable:

  VAGRANT_DISABLE_VBOXSYMLINKCREATE=1

or on a per folder basis within the Vagrantfile:

  config.vm.synced_folder '/host/path', '/guest/path', SharedFoldersEnableSymlinksCreate: false
```

## 完了

```
$ vagrant up


Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'envimation/ubuntu-xenial-docker' is up to date...
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
```

## 確認



<img width="883" alt="Screen Shot 2018-05-09 at 20.11.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/cb20676f-1a36-b53d-0691-a220d71f0d58.png">


## 注意点

vagrant init の時は後ろにName（ボックスの）名前を加えること。



<img width="1210" alt="Screen Shot 2018-05-09 at 20.13.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/a8ff0942-50c0-6051-fd43-fa2abf051a7e.png">
Windows 10 & Visual Studio 2017でのopenFrameworksの環境構築

表題の通り、VisualStudio2017でのopenFrameworksの環境構築に関するメモ。

構築前の環境 : 
Windows 10 
Visual Studio 2017 (C++周りのコンポーネントは導入済み)
Windows SDK 10.0.17134.0


##1. openFrameworksのダウンロード
こちらのサイトからopenFrameworksのインストールを行う。
(https://openframeworks.cc/ja/download/)
執筆段階でのバージョンは0.10.0でした。
ダウンロードしたzipを適当なディレクトリで展開。

##2. openFrameworksのプラグインをVisual studioに入れ、プロジェクトを作成
以下のサイトを参考に、openFrameworksのプラグインをVisual studioに入れ、プロジェクトを作成。
(https://openframeworks.cc/ja/setup/vs/)

しかし、上の動画のようにmyAppsフォルダをプロジェクトのパスに指定したにも関わらず、以下のようなエラーが現れる。
![OFpathError.png](https://qiita-image-store.s3.amazonaws.com/0/192240/4c65bec2-ef22-6cf1-5c1d-40ed66af3309.png)

移植する予定もないので、ひとまず、絶対パスでopenFrameworksのpathを認識させる。

すると、
![error2.png](https://qiita-image-store.s3.amazonaws.com/0/192240/e8090823-6f13-3dac-0fbd-10042b2c5b34.png)
のようにpathを見つけたとの表示が。これにて、myAppsの中に、プロジェクトが作成される。

##3. 必要なコンポーネントのインストール
プロジェクト作成後、試しにビルドしてみると、
"Windows SDK 8.1をターゲットにして" というエラーや、"ctype.hファイルがない"みたいなエラーが山ほどでる。
ひとまず、僕のPCには8.1のSDKが入ってなかったので、Visual studio installerを使ってインストールすることに。
![8.1.png](https://qiita-image-store.s3.amazonaws.com/0/192240/bd104504-9d5f-3791-59f8-a3a50db30d3d.png)
これをインストールしたのち、再びプロジェクトのソリューションファイルを開く。
プロジェクト→ソリューションの再ターゲットを開き、SDKのversionを8.1に変更する。
これで、Windows SDK 8.1のエラーは直る。

次にctype等のファイルが見つからないエラーだが、これは以下の記事を参考にしたら直った。
https://qiita.com/quallo_japan/items/e1206ea5150417b7bbfe

これで、ひとまずビルドできるようになる。

以下Graphic Exampleの実行結果。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/192240/2ba1f1a4-94d1-332e-88be-0a345d65cbd3.png)


##3. 追加依存ファイルのパスの修正
こちらは参考で、(https://openframeworks.cc/ja/setup/vs/)
の通りに作業すると、リンカ―に関するエラー(;objを読み取れない的な)が出ます。
これは、追加依存ファイルのパスを正しく設定すれば直ります。

詳しい内容は以下にまとめられています。
(https://openframeworks.cc/ja/setup/vs/)

以上、メモでした。
NativeBaseのPickerの背景色の変更

Pickerの背景色をデフォルト以外にしたい場合
CSSやカスタムなどでは不可
直接コードを書き換えるしかない

参考: https://github.com/GeekyAnts/NativeBase/issues/1259

### 対象ファイル
/node_modules/native-base/dist/src/theme/components/index.js
line 174

```
"NativeBase.PickerNB":{
"NativeBase.Button":{
"NativeBase.Text":{}}},
```

↓

```
"NativeBase.PickerNB":{
"NativeBase.Container": {
  backgroundColor: '#000',
},
"NativeBase.Button":{
"NativeBase.Text":{}}},
```
dockerで簡易にpython3の環境を作ってみる

## 概要
Mac内でPythonのライブラリなどをインストールしようとしたらいろいろ面倒だったので、使い捨てできる環境が欲しくて作ってみたのでメモする。

## ファイル構成
下記の構成になります。

```:ファイル一覧
├ Dockerfile
├ docker-compose.yml
└ opt
```

## Dockerfile
公式コンテナを使って作る。

```Dockerfile
FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
```

## docker-compose.yml
下記の内容で作成する。

```yaml:docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt
```

## コンテナ起動
下記コマンドにて、コンテナを起動する。

```terminal:ターミナル
$ docker-compose up -d --build
```

## 使いたいライブラリを追加

### コンテナへ接続
```terminal:ターミナル
$ docker-compose exec python3 bash
```

### 各種ライブラリをインストール (任意)
```terminal:ターミナル(python3コンテナ)
$ python -m pip install numpy
$ python -m pip install pandas
$ python -m pip install matplotlib
$ python -m pip install networkx
$ python -m pip install pyyaml
$ python -m pip install xlsxwriter
$ python -m pip install tornado
```

## インストールしたライブラリの確認

```terminal:ターミナル(python3コンテナ)
$ python -m pip list
Package         Version
--------------- -------
cycler          0.10.0 
decorator       4.3.0  
kiwisolver      1.0.1  
matplotlib      2.2.2  
networkx        2.1    
numpy           1.14.3 
pandas          0.22.0 
pip             10.0.1 
pyparsing       2.2.0  
python-dateutil 2.7.2  
pytz            2018.4 
PyYAML          3.12   
setuptools      39.1.0 
six             1.11.0 
tornado         5.0.2  
wheel           0.31.0 
XlsxWriter      1.0.4  
```

## 要らなくなったら...
利用が終わって不要になったらコンテナごと下記コマンドにて削除する。

```terminal:ターミナル
$ docker-compose down
```

以上です。

## 参考サイト
* [WindowsでPython3, numpy, pandas, matplotlibなどインストール](https://qiita.com/mojaie/items/241eb7006978e6962d05)
* [データ分析ライブラリPandasの使い方](https://librabuch.jp/blog/2013/12/pandas_python_advent_calendar_2013/)
HSI(Hopkins-Skellam index)算出のためのImageJマクロ

#__概要__
組織中の細胞の分布パターンを画像解析から評価するため、Fiji(ImageJ)で使えるマクロを作成した。
評価基準にはHSI(Hopkins-Skellam index)という指数を用いている。


#####**HSI(Hopkins-Skellam index)とは**
HSIとは植物集団における個体の分布パターンを分類するためHopkinsとSkellamにより考案された指標である。ある領域内の点群についてこれを求めると、分布がランダムであればHSIは1に近く、凝集・集合が起こっている状態では1より大きく、regularに分布していれば1より小さくなる([Hopkins & Skellam, 1954](https://doi.org/10.1093/oxfordjournals.aob.a083391))。


#__使用法__
#####__画像の前準備__
1)Fiji(またはImageJ)で画像を開く

2)カラー画像の場合は8bit画像に直す
　`Image > Type > 8-bit`

3)着目したい粒子のみが選択されるよう、Thresholdを設定する
　`Image > Adjust > Threshold →(設定)→ Apply`

　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/178269/75845d3f-f4a9-dff9-ba81-7bc0e33010d3.png) 
　　　　⬇︎
　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/178269/3d541e22-bd4c-1c9b-b5a9-78067be44c65.png)


#####__粒子群の位置測定__
4)測定内容の設定：
　`Analyze > Set Measurements...`
　→ `Center of mass`にチェック☑︎ → `OK`
　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/178269/ad5bf0cf-fabe-b5da-b1fc-6504738c0a03.png)

5)粒子の重心座標を測定：
　`Analyze > Analyze Particles...`
　・着目する粒子群以外に小さな塵などが認識されている場合は、
　　"Size"の下限を引き上げることで解析対象から除外できる。
　・`Display Results`にチェック☑︎を入れておくと、測定終了後に
　　結果がResultウィンドウで表示される。
　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/178269/217fe9a2-058a-b2dc-6854-7751105de1c4.png)



#####__HSIの算出__ - マクロの実行
6)以下のマクロを実行する。
　マクロウィンドウは`Plugins > New > Macro`などから開ける。

```ImageJ:obtainHSI.ijm
macro "obtainHSI"
{
	getDimensions(width, height, channels, slices, frames);
	
	r1sum=0;
	r2sum=0;
	for(k=0;k<1000;k++)
	{
		for(j=1;j<nResults();j++)
		{
			r1sum=r1sum+getNearestDistanceSquare(random()*width,random()*height);
			r2sum=r2sum+getNearestDistanceSquare(getResult("XM",j),getResult("YM",j));
		}	
	}
	showMessage(r1sum/r2sum);
	
	function getNearestDistanceSquare(x,y)
	{
		nearestDistanceSquare=width*width+height*height;
		for(i=1;i<nResults();i++)
		{
			DistanceSquare=(getResult("XM",i)-x)*(getResult("XM",i)-x)+(getResult("YM",i)-y)*(getResult("YM",i)-y);
			if(DistanceSquare<nearestDistanceSquare&&0<DistanceSquare)
			{
				nearestDistanceSquare=DistanceSquare;
			}
		}
	return nearestDistanceSquare	
	}
}
```

7)算出されたHSIがMessageウィンドウに表示される
　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/178269/81a06ea9-5f6e-1ecc-0fb4-d7538c9ebf88.png)


***
spfquery　の使い方

迷惑メール対策の　SPF（Sender Policy Framework）について確認する spfquery の使い方です。

Arch Linux でのインストール

```bash
sudo pacman -S perl-mail-spf-query
```

pass となるケース

```bash
SPFQUERY=/usr/bin/vendor_perl/spfquery
#
$SPFQUERY --ip 133.130.98.29 --mail-from from@ekzemplaro.org --helo gmail.com
#
echo
$SPFQUERY -i 133.130.98.29 -m from@ekzemplaro.org -h gmail.com
```

>実行結果

>```text
pass
Please see http://www.openspf.org/why.html?sender=from%40ekzemplaro.org&ip=133.130.98.29&receiver=spfquery: 133.130.98.29 contains 133.130.98.29
spfquery: domain of from@ekzemplaro.org designates 133.130.98.29 as permitted sender
Received-SPF: pass (spfquery: domain of from@ekzemplaro.org designates 133.130.98.29 as permitted sender) client-ip=133.130.98.29; envelope-from=from@ekzemplaro.org; helo=gmai.com;
```

none となるケース

```bash
SPFQUERY=/usr/bin/vendor_perl/spfquery
#
$SPFQUERY -i 133.130.98.29 -m from@www.ekzemplaro.org -h gmail.com
```

>実行結果

>```text
none
SPF: domain of sender from@www.ekzemplaro.org does not designate mailers
spfquery: domain of from@www.ekzemplaro.org does not designate permitted sender hosts
Received-SPF: none (spfquery: domain of from@www.ekzemplaro.org does not designate permitted sender hosts) client-ip=133.130.98.29; envelope-from=from@www.ekzemplaro.org; helo=gmai.com;
```

softfail となるケース

```bash
SPFQUERY=/usr/bin/vendor_perl/spfquery
#
$SPFQUERY -i 133.130.98.28 -m from@ekzemplaro.org -h gmail.com
```

>実行結果

>```text
softfail
Please see http://www.openspf.org/why.html?sender=from%40ekzemplaro.org&ip=133.130.98.28&receiver=spfquery
spfquery: transitioning domain of from@ekzemplaro.org does not designate 133.130.98.28 as permitted sender
Received-SPF: softfail (spfquery: transitioning domain of from@ekzemplaro.org does not designate 133.130.98.28 as permitted sender) client-ip=133.130.98.28; envelope-from=from@ekzemplaro.org; helo=gmai.com;
```

SPF のチェックをするページ
>[SPF Record Testing Tools](http://www.kitterman.com/spf/validate.html)
>[Mx TOOLBOX](https://mxtoolbox.com/spf.aspx)
Railsの変数をJSで使う（gon、Rails 5）

gazay/gon: Your Rails variables in your JS
https://github.com/gazay/gon

# 検証環境

検証日: 2018/05/10
debian 9.4
rails 5.1.5
Bundler version 1.16.1
gon v6.1.0 

# 手順

## 1. gemの追加

```rb:Gemfile
gem 'gon'
```

```
bundle install
```

## 2. テンプレートに記述

**JSファイルよりも前に記述する**

```erb:app/views/layouts/application.html.erb
<%= Gon::Base.render_data %>
```

## 3. Controllerに変数をセット

```rb
def index
  gon.str = 'Hello World'
end
```

## 4. JSから読み込む

```application.js
console.log(gon.str);
```

# 仕組み

gonがHTMLにグローバル変数を宣言してくれてました。

```HTML
<script>
//<![CDATA[
window.gon={};gon.str="Hello World";
//]]>
</script>
```
高さが変わる要素を天地中央揃え

ダイアログの様な中身によって高さが変わる要素を、CSSで画面中央に配置する。
transformプロパティのtlanslateを%単位で指定すると、その要素の幅・高さが基準となるので、-50%を指定することにより要素の基準点を中心に変えている。

```css
.dialog__wrapper {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
  min-width: 160px;
  max-width: 640px;
  margin-right: auto;
  margin-left: auto;
  padding-right: 24px;
  padding-left: 24px;
}
```

<p data-height="265" data-theme-id="light" data-slug-hash="odbxjL" data-default-tab="result" data-user="hal9188" data-embed-version="2" data-pen-title="dialog centering" class="codepen">See the Pen <a href="https://codepen.io/hal9188/pen/odbxjL/">dialog centering</a> by Haruumi Kondo (<a href="https://codepen.io/hal9188">@hal9188</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
VBA LINEST （LINEST関数を２次以上でもつかう）

###Summary
LINEST関数を２次以上でもつかう

###サンプルコード

```vb
Sub SampleLinEst2()

    'Linest againt 'y = ax + b
    DP LinEst2(Array(10, 20, 30), Array(1, 2, 3)), Array("a", "b"), Array("m", "stddev", "R2", "F/df", "SS"), , 5
    
    '     |m    |stdde|R2   |F/df |SS   |
    '------------------------------------
    'a    |   10|    0|    1|Error|  200|
    'b    |    0|    0|    0|    1|    0|

    
    
    'Linest againt 'y = ax^2 + bx +c
    DP LinEst2(Array(10, 20, 30), PowerScan(Array(1, 2, 3), 2)), Array("a", "b", "c"), Array("m", "stddev", "R2", "F/df", "SS"), , 5

    '     |m    |stdde|R2   |F/df |SS   |
    '------------------------------------
    'a    |    0|    0|    1|Error|  200|
    'b    |   10|    0|    0|    0|    0|
    'c    |    0|    0|Error|Error|Error|


    'Linest againt 'y = ax^3 + bx^2 +cx +d
    DP LinEst2(Array(1, 2, 3), PowerScan(Array(1, 2, 3), 3)), Array("a", "b", "c", "d"), Array("m", "stddev", "R2", "F/df", "SS"), , 5

    '     |m    |stdde|R2   |F/df |SS   |
    '------------------------------------
    'a    |-0.09|    0|    1|Error|    2|
    'b    |0.545|    0|    0|    0|    0|
    'c    |    0|    0|Error|Error|Error|
    'd    |0.545|    0|Error|Error|Error|
    
End Sub
```

###ちょっとした解説

ポイントと思っているところは、xのところに２次以上の場合はPowerScanで渡してるところです。

```vb
Sub SamplePowerScan()

    Debug.Print Dump(PowerScan(2, 3))
    'Array(Array(2#), Array(4#), Array(8#))
    
    Debug.Print Dump(PowerScan(Array(1, 2, 3), 3))
    'Array(Array(1#, 2#, 3#), Array(1#, 4#, 9#), Array(1#, 8#, 27#))

    
End Sub
```

### サポート関数

```vb
Public Function LinEst2(ByVal y As Variant, ByVal x As Variant) As Variant
    LinEst2 = Arr2DToJagArr(Application.WorksheetFunction.LinEst(y, x, True, True))
End Function

Public Function PowerScan(ByVal x As Variant, ByVal n As Long) As Variant
    Dim wf As WorksheetFunction: Set wf = Application.WorksheetFunction
    PowerScan = Arr2DToJagArr(wf.Transpose(Application.Power(wf.Transpose(x), ArrRange(1, n))))
End Function
```

### Ariawaseが必要
[Ariawase](https://github.com/vbaidiot/Ariawase)
Circle CI 2.0上でmecab-pythonをテスト

# 背景
[Circle CI](https://circleci.com/)で[MeCab](http://taku910.github.io/mecab/)を利用したコードのテストをするには、依存関係の解消はpipでは完結しません。既にQiitaに[CircleCIでmecab-pythonをインストールする](https://qiita.com/saicologic/items/933e2f27b3e32c199248)があるが、この記事はCircle CIのバージョンが1.0なのと少々やり方が煩雑だったのでまとめ直しました。

# 結論
Pythonのdockerでmachineを構築したあとにaptを使えばOK。

## config例
```yml:.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: python:3

    steps:
      - checkout

      - run:
          name: Install MeCab
          command: |
            apt-get update;
            apt-get -y install mecab libmecab-dev mecab-ipadic-utf8

      - run:
          name: Install python dependencies
          command: pip install -r requirements.txt
```

```text:requirements.txt
mecab-python3
```

超簡単 :v:

## ハマったところ
- `apt-get update`を事前にやらないとMeCab packageがないと怒られる.
- `sudo`はこのimageでは不要.むしろ、`sudo`があると怒られる.

# あとがき
これで簡単にMeCabを利用したコードをCircle CIでテストすることができました。ちなみに、[Neologd](https://github.com/neologd/mecab-ipadic-neologd)に依存したテストを行うために毎度これをInstallするとテスト時間が増大してしまうので、[Caching Dependencies](https://circleci.com/docs/2.0/caching/)を使うと良さそう。ざっとドキュメントを見た限りかなり複雑な設定をしなきゃいけないので、また機会があったときに勉強してまとめたいです!!
PythonでJsonをよむときにエラーが出た場合の対処

かなり手こずったのでメモメモ

### エラー内容

```python

Expecting value: line 1 column 1 (char 0)
```


### 対処

`try~`を入れてあげると解決しました〜

```python

// ホームページからデーターをとってくる
jsons  = urlopen(url).read().decode('utf-8').split('\n')

result = []
for v in jsons :
    try:
        js = json.loads(v)
        result.append( js['info'] )
    except Exception:
        pass

```

### 追記 2017/02/13

下記でいけました〜

結局`json`データーでない空の行が含まれてました

```python
json_lines = [ json.loads(s) for s in responses if s != "" ]
```
F#からSQLiteをつかってみる ( OSX )

### Summary
`FSharp on OSX`で`SQLite`をつかう

下記の３点が必要

`System.Data.SQLite`を`nuget`する

`libSQLite.Interop.dylib`をコンパイルする

`FSharp`コード内で`DLLImport`する

###すること

その１

`System.Data.SQLite`を`nuget`する



その２

`libSQLite.Interop.dylib`をコンパイルする

下記からソースコードをダウンロード

[System.Data.SQLite Downloads](https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki)

```
List of Release Packages
-> Source Code
-> sqlite-netFx-full-source-1.0.104.0.zip
```

`zip`を解凍して

```bash
$ cd Setup

$ chmod +x compile-interop-assembly-release.sh

$ bash compile-interop-assembly-release.sh
```

これで`libSQLite.Interop.dylib`ができるので
```
$ chmod -x bin/2013/Release/bin/libSQLite.Interop.dylib
```


その３

`FSharp`コード内で`DLLImport`する

さっきの`libSQLite.Interop.dylib`を`fsx`と同じ場所にコピーしてくる

で、コード

```fsharp
#r @"./packages/System.Data.SQLite.Core/lib/net46/System.Data.SQLite.dll"
open System.Data.SQLite
open System.Runtime.InteropServices

module Database =
    
    [<DllImport(@"/Users/kohei/Documents/jikkenSqlite3/libSQLite.Interop.dylib" , CallingConvention = CallingConvention.Cdecl)>] 
    let sqlite_connection : System.Data.SQLite.SQLiteConnection  =
        ( new SQLiteConnection( @"Data Source=:memory:;Version=3;foreign keys=true" ))

    type ABC ( connection : System.Data.SQLite.SQLiteConnection ) =

        let cn = connection

        member theis.sqlite_open : unit =
            cn.Open()

        member this.sqlite_createTable sql  =
            ( new SQLiteCommand(sql, cn)).ExecuteNonQuery() |> ignore

        member this.sqlite_insert  sql =
            ( new SQLiteCommand(sql, cn)).ExecuteNonQuery() |> ignore

        member this.sqlite_select  sql f =
            let reader = ( new SQLiteCommand(sql, cn )).ExecuteReader()
            while ( reader.Read() ) do
               f reader 

module Jikken =
    open Database
            
    let s0 = @"CREATE TABLE IF NOT EXISTS foo ( name VARCHAR(20), price INT )"
    let s1 = @"INSERT INTO foo ( name, price ) VALUES ('apple', 3000 )"
    let s2 = @"SELECT name FROM foo"
    let f = fun (r:SQLiteDataReader) -> 
        [0]
        |> List.fold ( fun acc n -> acc + " " + r.GetString(n) |> fun s -> s.TrimStart() ) ""
        |> stdout.WriteLine

    let db = ABC( sqlite_connection )
    db.sqlite_open
    db.sqlite_createTable s0
    db.sqlite_insert s1
    db.sqlite_select s2 f
```

### なんとなくスクリプト

```bash
wget https://system.data.sqlite.org/blobs/1.0.108.0/sqlite-netFx-full-source-1.0.108.0.zip
mkdir foo
unzip sqlite-netFx-full-source-1.0.108.0.zip -d ./foo/
bash foo/Setup/compile-interop-assembly-release.sh
cp foo/bin/2013/Release/bin/libSQLite.Interop.dylib ./
rm -rf foo
rm ./sqlite-netFx-full-source-1.0.108.0.zip
```
.NETの時間表記のちょっとしたメモ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/d7708a8e-468d-19c4-3bc6-47bcc0fd67f6.png)



# Summary
`.net`の時間表記のちょっとしたメモ

### こんな感じ

```fsharp
open System

/// このパソコンのタイムゾーンの確認
System.TimeZoneInfo.Local.Id |> printfn "%A" /// "Asia/Tokyo"


/// このパソコンに入ってるタイムゾーンの確認
System.TimeZoneInfo.GetSystemTimeZones()
|> Seq.iter ( fun n -> stdout.WriteLine n )

/// Africa/Abidjan
/// Africa/Accra
/// Africa/Addis_Ababa
/// ....




/// 日付をRFC3339形式にする関数
let toRFC3339 dt =
    System.Xml.XmlConvert.ToString( dt, System.Xml.XmlDateTimeSerializationMode.Utc )


/// RFC3339形式を普通の日付形式にする関数
let toDate rfc3339 =
    System.DateTime.Parse(rfc3339)


/// (JST)2017年4月9日11時という時刻
let JST = DateTime( 2017,4,9,11,0,0 )

JST |> stdout.WriteLine              /// 4/9/2017 11:00:00 AM
JST |> toRFC3339 |> stdout.WriteLine /// 2017-04-09T11:00:00Z


/// Convert UTC ( JST = UTC + 9 )
let UTC = JST |> System.TimeZoneInfo.ConvertTimeToUtc

UTC |> stdout.WriteLine              /// 4/9/2017 2:00:00 AM
UTC |> toRFC3339 |> stdout.WriteLine /// 2017-04-09T02:00:00Z


/// Convert EET ( EET = UTC + 3 summer, UTC + 2 winter )
let easternZone = TimeZoneInfo.FindSystemTimeZoneById("Europe/Rome")
let EET         = System.TimeZoneInfo.ConvertTime( JST ,easternZone )

EET |> stdout.WriteLine              /// 4/9/2017 4:00:00 AM
EET |> toRFC3339 |> stdout.WriteLine /// 2017-04-09T04:00:00Z
```
F#でprintfデバッグ

# sample code
コードはこんな感じで

```fsharp
open System.Diagnostics

/// Debugモードのときだけコンパイルする
#if DEBUG
/// リスナーをインスタンス化する
let listener  = new DefaultTraceListener()
/// logファイルを指定する
let parentDic = System.Reflection.Assembly.GetEntryAssembly().Location |> fun x -> string ( System.IO.Directory.GetParent(x) )
listener.LogFileName <- System.IO.Path.Combine( parentDic, "log.txt" )
/// リスナーに追加する
Debug.Listeners.Add(listener)
#endif

let rec main s (acc:int)=
    match s with
    | "quit" -> () /// quitという文字列で終了する
    | _      -> 
                /// stdoutから出力する
                stdout.WriteLine(s)
                /// log.txtに出力する
                Debug.WriteLine(acc)
                main (stdin.ReadLine()) (acc + 1)

[<EntryPointAttribute>]
let entry arg =
    main arg.[0] 0
    0
```

### デバッグのしかた

まずdebugモードでコンパイル

```shell

$ fsharpc -d:DEBUG abc.fsx
```

で、ログファイルをリッスン

`F`を押して`Forward forever`とする

```shell

$ less log.txt
```

実行してみる

```shell

$ mono abc.exe callmekohei

/// 標準出力へ
callmekohei

/// log.txtへ
0
```
F#で簡単プロセス間通信

# Summary
親子プロセスでの通信

### こんな感じ

```shell

$ mono abc.exe 
HELLO from child process
hello --- from child process --- 
apple
apple --- from child process --- 
banana
banana --- from child process --- 
cherry
cherry --- from child process --- 
quit

$ 

```

### 子プロセス
文字を入力すると`abc --- from child process ---`と返す

```fsharp
let rec main s =
    match s with
    | "quit" -> ()
    | "init" -> stdout.WriteLine("HELLO from child process")
                main ( stdin.ReadLine() )
    | _      -> stdout.WriteLine( s + " --- from child process --- " )
                main ( stdin.ReadLine() )

[<EntryPointAttribute>]
let entry arg =
    main "init"
    0
```

### 親プロセス
親プロセスで文字を入力

→ 子プロセスに文字を送る
→ 子プロセスの標準出力が出力されたら取得する（イベントで見張ってる）

```fsharp
open System.Diagnostics

type Interaction (fp:string, args:string, wd:string) =
    
    // 子プロセスの起動パラメータを作成する
    let procStartInfo =
        ProcessStartInfo(
            FileName               = fp   ,
            Arguments              = args ,
            WorkingDirectory       = wd   ,
            RedirectStandardInput  = true , // 子プロセスの標準入力をリダイレクトする
            RedirectStandardOutput = true , // 子プロセスの標準出力をリダイレクトする
            RedirectStandardError  = true , // 子プロセスの標準エラーをリダイレクトする
            UseShellExecute        = false  // シェルを使用せず子プロセスを起動する(リダイレクトするために必要)
    )
    
    // 子プロセスをインスタンス化
    let ps = new Process(StartInfo = procStartInfo)

    // Set our event handler to asynchronously read the ps output.
    // リダイレクトした標準出力の内容を受信するイベントハンドラを設定する
    do ps.OutputDataReceived
       |> Event.add ( fun (args :DataReceivedEventArgs) ->
           stdout.WriteLine(args.Data) |> ignore )
    
    // 子プロセスを起動する
    do ps.Start() |> ignore
    // 子プロセスがアイドル状態になるまで無期限に待機
    do ps.WaitForInputIdle() |>ignore
    // Start the asynchronous read of the ps output stream.
    // 標準出力の非同期読み込みを開始する
    do ps.BeginOutputReadLine()

    // リダイレクトした子プロセスの標準入力にテキストを書き込む
    member this.Send(message:string) = ps.StandardInput.WriteLine(message)
    
    // 子プロセスを終了する
    member this.Quit() = ps.Kill()



let mono    = "/usr/local/Cellar/mono/4.8.1.0/bin/mono"
let args    = "/Users/kohei/Documents/childProcess.exe"
let workdir = "/Users/kohei/Documents/"
let replyer = Interaction(mono,args,workdir)

let rec main s =
    match s with
    | "quit" -> replyer.Quit()
    | _      -> replyer.Send(s)
                main ( stdin.ReadLine() )

[<EntryPointAttribute>]
let entry arg =
    main "hello"
    0
```
dllファイルをサブフォルダーにおく

# Summary

依存する`dll`ファイルは`exe`ファイルと同じフォルダに置くのが一般的
依存する`dll`をサブフォルダーに置く方法

### 方法
`config`ファイルを作成する

### ファイル構成
`gimBeam.exe`がメイン

```shell

highball$ tree
.
├── dll
│   ├── FSharp.Compiler.Service.dll
│   ├── FSharp.Core.dll
│   ├── Newtonsoft.Json.dll
│   ├── deopletefs.exe
│   └── log.txt
├── gimBeam.exe
├── gimBeam.exe.config
└── gimBeam.fsx

1 directory, 8 files
```

### config ファイル
`gimBeam.exe.config`をつくって下記を入力

```xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

　　　<!-- Look for addins in the addins directory for now -->
      <probing privatePath="dll"/>

    </assemblyBinding>
  </runtime>
</configuration>
```

### 留意事項

依存する`dll`ファイルは同じフォルダかサブフォルダしかおけない

```
privatePath は親フォルダを指定できない仕様
```
eclipse で DevStyle適用後の補完機能の色を変更する

## 環境
- Windows 10
- eclipse Oxygen (Pleiades Java 用)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108113/6745abaa-ed18-95fe-00c7-9801b853d368.png)

## DevStyle
https://www.genuitec.com/docs/workbench/using-devstyle-themes/

eclipse を簡単に黒くできる目に優しいツール
白い画面をずーっと見ていると目が痛くなってきます。
見た目もカッコよいので入れていますが、一つ問題が・・・。

## 補完機能の色が見にくい
1. 全然見えません
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108113/e5c6bdc0-ab68-ac62-c133-bb2bf291146e.png)

2. 「設定」→「一般」→「外観」→「色とフォント」で「基本」→「コンテンツ・アシスト前景色」を変えます。
今回はグレーにしてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108113/3da9ecd8-823a-a37c-1f0d-0d3930be58c1.png)

3. 「適用」して閉じます

4. 見えるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108113/55b5f8fa-b706-3d3a-7d1b-43feada5d273.png)

eclipse のバージョンアップが今から楽しみです。。。
（F#）重い処理を並列で処理する（Actor Model）

# Summary
アクターモデルで重い処理を並列でしょりする

### こんなかんじ

たとえば５秒かかるしょりがあるとします

```fsharp
// ５秒かかる処理
let take5sec =
    System.Threading.Thread.Sleep 5000
```

この重い処理を１０回おこなうとすると普通は５０秒かかるかと思いますが、これを並列で処理すると５０秒以下で処理できるようになります。

アクターモデルでの定形コード

```fsharp

// 並列処理する定型コード

// MailboxProcessorは長いのでActorと名前を変更
type Actor<'T> = MailboxProcessor<'T>
// 返信用のチャンネル
type Msg = AsyncReplyChannel<int>

let actorBehavior ( actor:Actor<Msg> ) =
    // アクターを使い回すので再帰にしておく
    let rec messageLoop() = async {
        // メッセージハンドラのトリガー
        let! reply = actor.Receive()
        // 処理内容（重い処理）
        take5sec
        // とりあえずスレッドIDを返してみる
        reply.Reply System.Threading.Thread.CurrentThread.ManagedThreadId
        return! messageLoop()
    }
    messageLoop()

let futures actorAmount runnerAmount behavior =

    // アクターをn個用意する
    let roundRobinRouter actorAmount =
        List.init actorAmount (fun _ -> Actor<Msg>.Start( behavior ) )

    // アクターにラウンドロビンで処理を割り当てる
    Seq.initInfinite( fun n -> n % (actorAmount) )
    |> Seq.take runnerAmount
    |> Seq.map ( fun i -> (roundRobinRouter actorAmount).[i].PostAndAsyncReply(id) )
```

実行してみる

```fsharp
// アクターを５個用意して１０個のランナーを作成する
futures 5 10 actorBehavior
|> Async.Parallel
|> Async.RunSynchronously
|> printfn "%A"
```

結果

```shell

[Loading /Users/callmekohei/tmp/abcabc.fsx]
[|17; 15; 18; 21; 15; 17; 17; 17; 17; 15|]
namespace FSI_0010
  val take5sec : unit
  type Actor<'T> = MailboxProcessor<'T>
  type Msg = AsyncReplyChannel<int>
  val actorBehavior : actor:Actor<Msg> -> Async<'a>
  val futures :
    actorAmount:int ->
      runnerAmount:int ->
        behavior:(MailboxProcessor<Msg> -> Async<unit>) -> seq<Async<int>>


*** time : 5.197822 s ***
```

５０秒かかるところが５秒で実施できた！

### 参考

[Python: Pykka でアクターモデルについて学ぶ](http://blog.amedama.jp/entry/2017/03/14/005610)
vimconf2017に行ってみたった

# summary
東京で開催された`vim`というテキストエディタのお祭りに行って来ました！

### vimconf2017とは？

`vim`のお祭りです！
`vim`に関するいろいろな話を聞けました！

### 内容とか・・・

いろいろと興味深い話がありました！
例えば`go`という言語のプラグインの話とか
シンタックスハイライトの話とか・・・
その他色々聞けました！

### 感想

すごく楽しかったです！
すごく気分転換になります！（本当に）
会場もすごく綺麗だしみんなマナーいいしで。
来年ももしあればまた行きたいです！

### その他

会場の様子

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/8e541359-7194-93cf-d601-4249c3208546.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/b6e91f0b-6222-0b73-e172-dc0268a5f264.png) 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/8e4c93d2-7443-cad9-5e53-dd84d89e833a.png)

お昼ご飯のお弁当（ものすごく美味しかった！）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/0ba41ea2-02b0-16ba-eb66-85224b52c64d.png)

コーヒースリーブに落書き〜
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/529f167f-6910-eb62-9765-e706b0744d85.png)

公演中の落書き〜
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/4059db24-aa43-4484-55b9-661cb66b2200.png)

話題の暗黒さんの歌（歌はなかったですwww）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/d0b44092-5f75-17f1-650f-cb87c0666834.png)

### さらに追加

さらに飲んだよ〜

暗黒さんの似顔絵

ぶっちゃげ暗黒さんは意外とイケメンでした！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/96211743-9380-b722-542b-07c7cfa36798.png)
RHEL7でターゲットをGUI画面での運用（ランレベル変更の代替）

RHEL7でターゲットをGUI画面での運用（ランレベル変更の代替）際に下記の内容に注意。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/installation_guide/sn-switching-to-gui-login
上記の手順で実施するが、残念ながら
`# vi /etc/inittab`
でランレベルの変更ができない。

理由は
https://thinkit.co.jp/story/2014/12/11/5388
ランレベルが廃止されていた。。。

下記の手順で実施
`# systemctl set-default graphical.target`
で設定。

`# systemctl get-default`
で確認し、下記となってる事を確認。
graphical.target

最後に
`# reboot`

参考のURL
https://thinkit.co.jp/story/2014/12/11/5388
Debug F# with sdb!

`This article is F# Advent Calendar2017 7th day`
see :  [F# Advent Calendar2017](https://qiita.com/advent-calendar/2017/fsharp)

# Summary

I just try to debug F# code with sdb!

### Like this

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149269/06973e90-3b56-e35d-b349-58bbd09dde44.png)

### What is mono/sdb?

A command line client for the Mono soft debugger.
[mono/sdb](https://github.com/mono/sdb)



### Environment

```shell

$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.13.1
BuildVersion:	17B1003

$ uname -a
Darwin callmekoheis-MacBook-Air.local
17.2.0 Darwin Kernel
Version 17.2.0:
Fri Sep 29 18:27:05 PDT 2017;
root:xnu-4570.20.62~3/RELEASE_X86_64 x86_64

$ mono --version
Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Sun Sep 17 18:29:46 BST 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
	TLS:           normal
	SIGSEGV:       altstack
	Notification:  kqueue
	Architecture:  amd64
	Disabled:      none
	Misc:          softdebug 
	LLVM:          supported, not enabled.
	GC:            sgen (concurrent by default)
```

### Prepare

install [mono/sdb](https://github.com/mono/sdb)

```shell
$ git clone https://github.com/mono/sdb

$ cd sdb

$ git submodule update --init --recursive

$ make
```

check

```shell

$ sdb --version
Mono soft debugger (sdb) 1.5.6503.20649

$ which sdb
/usr/local/bin/sdb
```
setting

```shell

$ which mono
/usr/local/bin/mono

// set location of mono
$ sdb
(sdb) cfg s RuntimePrefix /usr/local/ ( was /usr )
```

### Debug

```shell

// write code
$ vim sample.fsx 

namespace ABC

module DEF =
    let bar() =
        stdout.WriteLine("abc")

    let foo (str:string) =
        stdout.WriteLine(str)
        bar()

    [<EntryPointAttribute>]
    let main _ =
        let s = "Foo!"
        foo s
        stdout.WriteLine("callmekohei")
        0

// compile
$ fsharpc -g --optimize- sample.fsx 

// launch sdb
$ sdb
Welcome to the Mono soft debugger (sdb 1.5.6548.37600)
Type 'help' for a list of commands or 'quit' to exit

// set break point
(sdb) bp add func ABC.DEF.foo
Breakpoint '0' added for method 'ABC.DEF.foo'

// run 
(sdb) r sample.exe
Inferior process '8743' ('sample.exe') started
Hit method breakpoint on 'ABC.DEF.foo'
#0 [0x00000000] ABC.DEF.foo at /Users/callmekohei/tmp/xxx/sample.fsx:8
        stdout.WriteLine(str)

// look source code
(sdb) src
       1:    namespace ABC
       2:    
       3:    module DEF =
       4:        let bar() =
       5:            stdout.WriteLine("abc")
       6:    
       7:        let foo (str:string) =
       8:            stdout.WriteLine(str)  // <--- color green!
       9:            bar()
      10:    
      11:        [<EntryPointAttribute>]
      12:        let main _ =
      13:            let s = "Foo!"
      14:            foo s
      15:            stdout.WriteLine("callmekohei")
      16:            0

// continue
(sdb) c
Inferior process '8743' ('sample.exe') resumed
Foo!
abc
callmekohei
Inferior process '8743' ('sample.exe') exited with code '0'

// quiet
(sdb) q
Bye
```

### Point
compile option `--optimize-`

```shell

$ fsharpc -g --optimize- sample.fsx 
```
<a href="#">のclickイベントで、表示を移動させないようにするには

下記のようなhtmlに対しclickイベントを設置し、

```html:html
<a class="btn" href="#">Click Me!</a>
```
```JavaScript:JavaScript
document.getElementById('.btn').addEventListener('click', function() {
  console.log('hogehoge');
 });
```
ってやってクリックすると、画面が一番上に…

## 原因
aタグクリック時の規定アクションのためにページ最上部に遷移してしまうようです。
この規定アクションを無効化する必要があります。

## 解決策
`returen false;`を入れたら回避しました。

```JavaScript:JavaScript
document.getElementById('.btn').addEventListener('click', function() {
  console.log('hogehoge');
  return false;
 });
```
`return`だけだとIE6で動作しないので、クロスブラウザ対策です。
## 参考にしたサイト
[aタグのonClick、href=&quot;#&quot;で表示を移動させたくない - おはようバッファロー](http://d.hatena.ne.jp/kaitoh07/20090422/1240385880)

---
*追記*
`return false;`の代わりに
イベントの規定アクションを無効化する`event.preventDefault();`メソッドも利用できるとコメントいただきました。

```JavaScript:JavaScript
document.getElementById('.btn').addEventListener('click', function(event) {
  console.log('hogehoge');
  event.preventDefault();
});
```

[「aタグの無効化 - preventDefaultとreturn falseの違いとか」](https://qiita.com/mwtonbel/items/f3c6e2373c348ea74b19)にこれらの違いがまとめてあります。
systemd基本的な使いかた

#systemdのデーモンの起動順序を調べる

以下のコマンドでsystemdのデーモン起動順序をsvgのグラフに出力

`systemd-analyze plot > systemd.svg`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211497/6e5b49ed-b1ce-d128-919d-54777adc31ce.png)

参考
[Systemdのサービスの依存関係を調べる方法 - ククログ(2015-12-28)]
(http://www.clear-code.com/blog/2015/12/28.html)
[systemdのサービスの起動順序を決める]
(http://takeg.hatenadiary.jp/entry/2017/02/15/220536)

#設定ファイル
###Type
>「Type」は、「ExecStart」で指定したコマンドでサービスのプロセスを起動した際に、起動完了をどのように判定するかを指定します。

|Type|起動完了と判定されるタイミング|使用用途|
|:--|:--|:--|
|Type=simple|コマンドが実行されたタイミング|フォアグラウウンドで実行を継続するコマンド|
|Type=forking|実行したコマンドが終了するタイミング|子プロセスをフォークしてバックグラウンドにまわして、最初のコマンド自体は終了するタイプの場合|
|Type=oneshot|コマンドが完了したタイミング|一度だけ指定のコマンドを実行するタイプのサービスの場合|

フォアグラウンドで常駐するタイプのコマンドの場合、Type=simpleを指定します。他の物を指定するとエラーになります。Type=forkingだと子プロセスが派生しないのでエラー、oneshotの場合はコマンドが終了しないのでエラー。

参考
[Systemd入門(4) - serviceタイプUnitの設定ファイル]
(http://enakai00.hatenablog.com/entry/20130917/1379374797)
deoplete-jediの設定

### Summary

deoplete-jediの設定

### Setteing
dein.toml

```toml

[[plugins]]
repo = 'zchee/deoplete-jedi'
on_ft = 'python'
hook_add = '''
    let g:deoplete#sources#jedi#python_path = '/usr/local/bin/python3.6'
'''

```

### Point
 
`let g:deoplete#sources#jedi#python_path` にPython3.exeを通しておく

これをすることで補完につかう`Python3`を固定できる

つまり

`pip 3 foo`でいれたライブラリに対して補完できる

この設定をしないと、`$PATH`で最初に捕まえた

`Python3`を使用することになるので

`pip3`の`Python3`と違う可能性が生じる

### つまり

下記の設定は必ずおこなうこと

```
let g:deoplete#sources#jedi#python_path = /path/to/python3
```

### 使用してるPythonの確認方法
```
$ which python3
/usr/local/bin/python3
```
Greenletの罠

### Summary

`vim-jp`で話題になっていた件をコンパクトにまとめてみました

###たとえば・・・

`Neovim`というエディタで `Python-client`を動かすために

`neovim` python package をインストールしてみる

```
$ pip3 install neovim
```

### 症状

`Neovim` を立ち上げるも `import error` と表示される

```
undefined symbol: PyExc_ValueError

ImportError: /path/to/site-packages/greenlet.cpython-36m-x86_64-linux-gnu.so: undefined symbol: PyExc_ValueError
```

### 原因

バイナリパッケージのバイナリと python のバイナリの互換性がない

### workaround

自前で`greenlet`をビルドする

```
pip uninstall greenlet
pip download greenlet
tar -xvf greenlet-0.4.12.tar.gz
cd greenlet-0.4.12
pip install -vvvv .
```

こういう方法もあるみたいです！
```
pip install greenlet==0.4.12 --no-binary
```

`pythonjp Slack` で `@aodag` さんに教えていただきました！ありがとうございます！

<br>
<br>
<br>
Nginxのupstreamに安易にlocalhostと書くと嵌まる罠、またはドメイン名解決の挙動

Nginxで、アクセスしたらちゃんと返ってきているのにログを見ると `connect() failed (111:Connection refused)` が頻発に発生している謎を調査したら、
いままで知らなかったNginxの挙動にたどり着いたのでメモ。

（ただしよく見るとドキュメントにちゃんと書いてあったというオチ）

# 問題

```text:nginx_default.conf
upstream rails-unicorn {
    server localhost:3000;
}
```

こんな風に書いていたら

```
[error] 11#11: *21735 connect() failed (111: Connection refused) while connecting to upstream, client: xx.xx.x.x, server: example.com, request: "GET /hogehoge HTTP/2.0", upstream: "http://[::1]:3000/hogehoge", host: "xx.xx.x.x", referrer: "http://xx.xx.x.x:80/hogehoge"

[warn] 11#11: *21735 upstream server temporarily disabled while connecting to upstream, client: xx.xx.x.x, server: example.com, request: "GET /hogehoge HTTP/2.0", upstream: "http://[::1]:3000/hogehoge", host: "xx.xx.x.x", referrer: "http://xx.xx.x.x:80/hogehoge"
```

ログに↑のメッセージがしょっちゅうでていた。

# 解決方法

`localhost` ではなく `127.0.0.1` とすると解消する

```nginx_default.conf
upstream rails-unicorn {
    server 127.0.0.1:3000;
}
```

----

[[Sy] nginx（リバースプロキシ）+node.jsでconnect() failedが頻発する場合の対処 | Syntax Error.](https://utano.jp/entry/2015/07/nginx-proxy-connection-refused-error/)

# 何故なのか

nginxのupstream serverは、複数のIPを持つドメイン名があると、それぞれのIPごとに複数のserverを定義したことになるから

ドキュメント : http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

> A domain name that resolves to several IP addresses defines multiple servers at once.

で、`localhost` は `127.0.0.1` (IPv4), `::1` (IPv6) どちらともに名前解決される設定になっていた

```text:/etc/hosts
127.0.0.1	localhost
::1	localhost
```

つまり

```text:nginx_default.conf
upstream rails-unicorn {
    server localhost:3000;
}
```

は

```text:nginx_default.conf
upstream rails-unicorn {
    server 127.0.0.1:3000;
    server ::1:3000;
}
```

と書いてることになっていた。

そのためこんな動作になっていた模様。

1. upstreamにserverを複数書くとラウンドロビンでロードバランシングされるので、IPv4とIPv6で交互にバックエンド（rails-unicorn）を呼ぼうとする。

2. バックエンドのunicornではIPv4しかlistenしていなかったため、 `::1:3000`(IPv6で)は繋がらず、
Nginxは
    
    ```
    connect() failed (111: Connection refused) while connecting to upstream
    ```

    とログを残し、

3. 繋がらなかった`::1:3000`をしばらくバランシング対象から外す

    ```
    upstream server temporarily disabled while connecting to upstream
    ```

4. ここで、まだ他のバランシング先(`127.0.0.1:3000`)があるので、アクセス元にエラーはまだ帰らず、Ipv4の方に接続を試みにいく

5. Ipv4ではちゃんとつながるので無事レスポンスが返される

6. バランシングから外された`::1:3000`しばらくするとNginxは`::1:3000`をバランシングに復帰させてみる

7. もちろんつながらないので、以下これが繰り返されてエラーログが吐かれ続ける

# おわり

バックエンドがIPv6でもlistenしていれば `server localhost:3000` と書いててもエラーは出ないが、同じサーバをIPv4とIpv6でラウンドロビンさせることに意味はないので `localhost` とは書かず `127.0.0.1` か `::1` かで書くようにしたほうが良さそう。

複数のIPを持つドメイン名があると、それぞれのIPごとに複数のserverを定義したことになるのは `localhost` に限らず（むしろ特殊）どんなドメインに対してもなので、気をつけておかないと他でも嵌りそう。
FlutterでGridViewItemの高さを変える

GridViewをFlutterで使った時にデフォルトのアスペクト比は1:1で表示されています。
内部実装をみてもGridの高さや、幅を設定する方法はありません。

```dart
GridView.count({
    Key key,
    Axis scrollDirection: Axis.vertical,
    bool reverse: false,
    ScrollController controller,
    bool primary,
    ScrollPhysics physics,
    bool shrinkWrap: false,
    EdgeInsetsGeometry padding,
    @required int crossAxisCount,
    double mainAxisSpacing: 0.0,
    double crossAxisSpacing: 0.0,
    double childAspectRatio: 1.0, ←ここが１で設定されているので縦横１：１で設定されている
    bool addAutomaticKeepAlives: true,
    bool addRepaintBoundaries: true,
    List<Widget> children: const <Widget>[],
  }) 
```

## 普通に実装したら

例えばこんなコードを実行したら縦横正方形で画像が表示されてます。

```dart

Widget _renderPhotoGrid() {
    List<String> widgetList = ['A', 'B', 'C'];
    return new GridView.count(
      controller: new ScrollController(keepScrollOffset: false),
      crossAxisCount: 2,
      scrollDirection: Axis.vertical,
      mainAxisSpacing: 4.0,
      children: widgetList.map((String value) {
        return new Container(
            color: Colors.green,
            child: new Center(
                child: new Text(
                  value,
                  style: new TextStyle(
                    fontSize: 50.0,
                    color: Colors.white,
                  ),
                )
            )
        );
      }).toList(),
    );
  }
```
<img width="444" alt="スクリーンショット 2018-05-10 10.13.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/1b9920b8-14ef-8e57-3ecf-c9da8e537a64.png">

## Gridアイテムの高さを変えたい！

Gridアイテムの高さを変えたい！ってときはアスペクト比を変えます。

```dart
Widget _renderPhotoGrid() {
    List<String> widgetList = ['A', 'B', 'C'];

    // アスペクト比を計算する
    var size = MediaQuery.of(context).size;
    final double itemHeight = (size.height - kToolbarHeight - 24) / 2;
    final double itemWidth = size.width / 2;

    return new GridView.count(
      controller: new ScrollController(keepScrollOffset: false),
      crossAxisCount: 2,
      scrollDirection: Axis.vertical,
      mainAxisSpacing: 4.0,
      childAspectRatio: (itemWidth / itemHeight), ←比を計算していれる。
      children: widgetList.map((String value) {
        return new Container(
            color: Colors.green,
            child: new Center(
                child: new Text(
                  value,
                  style: new TextStyle(
                    fontSize: 50.0,
                    color: Colors.white,
                  ),
                )
            )
        );
      }).toList(),
    );
```

<img width="451" alt="スクリーンショット 2018-05-10 10.14.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/d7642577-b7ea-0f21-7f33-ef56f6274c6a.png">


## 参考

https://stackoverflow.com/questions/48405123/how-to-set-custom-height-for-widget-in-gridview-in-flutter
機械学習を勉強するための教材

ボリュームの小さい教材から順に学習して理解を深めていくのがいいかもです。

9ページ
https://homes.cs.washington.edu/~pedrod/papers/cacm12.pdf

12ページ
https://www.mathworks.com/content/dam/mathworks/tag-team/Objects/i/88174_92991v00_machine_learning_section1_ebook.pdf

56ページ
http://disp.ee.ntu.edu.tw/~pujols/Machine%20Learning%20Tutorial.pdf

70ページ
https://courses.edx.org/asset-v1:ColumbiaX+CSMM.101x+1T2017+type@asset+block@AI_edx_ml_5.1intro.pdf

234ページ
http://alex.smola.org/drafts/thebook.pdf

421ページ
https://www.cs.ubbcluj.ro/~gabis/ml/ml-books/McGrawHill%20-%20Machine%20Learning%20-Tom%20Mitchell.pdf

449ページ
https://www.cs.huji.ac.il/~shais/UnderstandingMachineLearning/understanding-machine-learning-theory-algorithms.pdf

579ページ
http://cs.du.edu/~mitchell/mario_books/Introduction_to_Machine_Learning_-_2e_-_Ethem_Alpaydin.pdf

758ページ
http://users.isr.ist.utl.pt/~wurmd/Livros/school/Bishop%20-%20Pattern%20Recognition%20And%20Machine%20Learning%20-%20Springer%20%202006.pdf