OmniAICreator/Qiita-1.07M huggingface dataset:
MacOS High SierraにLeJOS NXJの開発環境を導入

LEGO MINDSTORMS NXTをJava言語で動かしたい場合は，leJOSとEclipseの組み合わせが非常に便利です．
MINDSTORMS NXTは64bit Javaでは動かないため，32bitで動かす環境が必要となります．しかし，MacOS(特にSierra以降)ではそのための環境設定が面倒なので，設定方法をまとめてみました．
#####ダウンロードするもの
* [Eclipse Luna 32-bit](https://www.eclipse.org/downloads/packages/release/Luna/SR2)
* [Java 6](https://support.apple.com/kb/dl1572?locale=ja_JP)
* [LeJOS NXJ](http://www.lejos.org/nxj.php)
* [NXT Fantom Driver](https://www.lego.com/en-us/mindstorms/downloads)(必要に応じて)

# Eclipse(32-bit)のインストール
Eclipseをインストールする前に，Java 6を[Appleのサイト](https://www.eclipse.org/downloads/packages/release/Luna/SR2)からダウンロードしておく． ターミナルでjavaが起動する(きちんとversionが表示される)ことを確認する．

```:terminal
/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/　-version
```

4.6 Mars以降はMac用の32bit環境を配布していないため，4.5 Lunaをダウンロードする．[ここ](https://www.eclipse.org/downloads/packages/release/Luna/SR2)から"for Java Developers (MacOS Cocoa 32-bit)"のgzipファイルをダウンロードし，適当な場所(Documentsとか)に展開する．Eclipse.appのパッケージの中身を表示(Ctr+クリック)してeclipse.iniを起動し，Javaのパスを追加する.
(eclipse.iniをダブルクリックするとEclipse.appが起動してしまう場合は，プログラムを選択してテキストエディタから起動するようにする)

```ini:/Eclipse.app/Contents/MacOS/eclipse.ini
-vm
/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
```

また，HighSierraでは，eclipseのメニューが無効化される問題があるため，その対処として以下の設定を追加する．

```ini:/Eclipse.app/Contents/MacOS/eclipse.ini
-Duser.country=US
-Duser.language=en
```
eclipse.iniの追加設定が終わったら，-cleanオプションを付けてeclipseを起動し，設定を反映させる．

```:terminal
/Documents/eclipse/Eclipse.app/Contents/MacOS/eclipse -clean
```
以降，Eclipseを起動する際はterminalからバイナリファイルを直接実行させる．
(Luna以前のものは，Eclipse.appをダブルクリックしてもなぜか起動しない．)

```:terminal
/Users/usr_name/Documents/eclipse/Eclipse.app/Contents/MacOS/eclipse
```

# LeJOS NXJのインストール
[ここ](https://sourceforge.net/projects/nxt.lejos.p/files/)から"0.9.1-beta3"をダウンロードして適当な場所(homeとか)に展開する．leJOS NXJのPATHを通すために/etc/profileに次の設定を追加する．

```:/etc/profile
if [ $(whoami) != "root" ]; then
  export NXJ_HOME="/Users/user_name/leJOS_NXJ"
  export LEJOS_NXT_JAVA_HOME="/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"
  export PATH="$NXJ_HOME/bin:$PATH"
fi
```
PCを再起動し，PATHが通っていることを確認する．

```:tetminal
expoert -p
```
ターミナルで次のコマンドを入力し，"Flush leJOS firmware"と書かれたGUIが表示されることを確認． MINDSTORMS NXTをUSBケーブルで接続し，ファームウェアをダウンロードする．

```:terminal
nxjflushg
```

#leJOS Eclipse plug-inの適用
[ここ](https://lejos.sourceforge.io/nxt/nxj/tutorial/Preliminaries/UsingEclipse.htm)を参考に，EclipseにleJOSを適用させる．
Eclipseをターミナルから起動し，"/Help/Install New Software..."をクリック．
"work with:"に"[http://www.lejos.org/tools/eclipse/plugin/nxj/](http://www.lejos.org/tools/eclipse/plugin/nxj/)"を入力し，"leJOS NXJ Support->leJOS NXJ Plug-in"にチェックを入れる． "Security Warning"が表示されるが，OKを押してインストールを完了させる．
Eclipseを再起動し，メニューに"leJOS NXJ"が追加されていることを確認する．

#参考
*[LEJOS: Getting Started on OS X](http://www.lejos.org/nxt/nxj/tutorial/Preliminaries/GettingStartedMac.htm)
*[LEJOS: Using Eclipse](https://lejos.sourceforge.io/nxt/nxj/tutorial/Preliminaries/UsingEclipse.htm)
*[macOS High Sierraでeclipseのメニューが無効化される](https://qiita.com/yosikubo/items/42937d4f77fb13dfa900)
basemapに複数のグラフを重ねる

マップ上の座標を指定して新たなグラフを重ねるコード。

```py:axes_on_basemap.ry
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from mpl_toolkits.basemap import  Basemap


space = 0.05
size = 0.9
lonmin = -180.
lonmax = 180.
latmin = -90.
latmax = 90.
span = 30.

v = np.arange(180*360).reshape(180,360) #If basemap is used, reverse is not necessary. 
px,py = np.meshgrid(np.arange(-180,180,10.), np.arange(-90,90,10.))

fig = plt.figure(figsize=(20,10),dpi=80)
ax = fig.add_axes([space,space,size,size])
m = Basemap(resolution='l',llcrnrlat=latmin,llcrnrlon=lonmin,urcrnrlat=latmax,urcrnrlon=lonmax,ax=ax)

m.imshow(v,cmap=cm.cool,interpolation='nearest')
ax.scatter(px,py,s=4,c='r')
m.drawcoastlines(linewidth=0.5,color='white')
m.drawparallels(np.arange(latmin,latmax+1,span),linewidth=0.3)
m.drawmeridians(np.arange(lonmin,lonmax+1,span),linewidth=0.3)   

ax.set_xticks(np.arange(lonmin,lonmax+1,span))
ax.set_xticklabels(map(str,np.arange(lonmin,lonmax+1,span)),fontsize=16)
ax.set_yticks(np.arange(latmin,latmax+1,span))
ax.set_yticklabels(map(str,np.arange(latmin,latmax+1,span)),fontsize=16)

subsize = 0.1
subax=[]
coordinates = zip(np.arange(lonmin,lonmax,60),np.arange(latmin,latmax,span))
for i,(lon,lat) in enumerate(coordinates):
	x = space + (lon - lonmin) / (lonmax - lonmin) * size
	y = space + (lat - latmin) / (latmax - latmin) * size
	subax.append(fig.add_axes([x,y,subsize,subsize]))
	subax[i].text(0.5,0.5,i,size=36,ha='center',va='center')
plt.show()
```
![basemaptest.png](https://qiita-image-store.s3.amazonaws.com/0/187118/f3fd774b-d377-16a6-d4a1-d86d7e09553c.png)
GITがアンインストールできない場合

GIT2.7.0のhooksがなぜか使えないので
アンインストールしようとしたらできなかった。

まず、適当なディレクトリを作成し、そこにGitをインストールする。
```
$ mkdir /tmp/test_git
$ cd /usr/local/src/git-2.3.1/
$ make prefix=/tmp/test_git install
```
次に、インストールされたファイルをリストとして出力する。

$ find /tmp/test_git -type f -print > /tmp/git-installlist.txt

そして、出力されたファイルの全行の /tmp/test_git を /usr/local (元のインストールディレクトリ)に置換する。
```
$ vim /tmp/git-installlist.txt
```
```
:%s/\/tmp\/test_git/\/usr\/local/g
```
置換した結果
```
$ git-installliset.txt

/tmp/test_git/libexec/git-core/git-send-pack
/tmp/test_git/libexec/git-core/git-am
/tmp/test_git/libexec/git-core/git
(後略)

↓↓↓
$ git-installliset.txt

/usr/local/libexec/git-core/git-send-pack
/usr/local/libexec/git-core/git-am
/usr/local/libexec/git-core/git
(後略)
```
最後に、| xargsでgit-installlist.txtの内容をrmに渡してファイルを消す。
```
$ cat /tmp/git-installlist.txt | xargs rm -f
```
ここでアンインストール終了


そのあと普通のGITをインストール
```
$ yum install git
```
-bash: /usr/local/bin/git: そのようなファイルやディレクトリはありません
が出てくる
```
$ which git
/usr/bin/git 
```
シンボリックリンクをつなげる
```
$ ln -s /usr/bin/git /usr/local/bin/git
$ git --version
``` 
git version 1.7.1
django で checkbox

# はじめに

あ、すみません、全然たいしたことない記事です・・。
django を使ってて、form の checkbox を html に直接書くのではなく、
django の form を使いたかったんですけど、少しハマったので記事にします。


# checkbox で docs を調べると...

widget の CheckboxInput とかが引っかかります。
**だがしかし！** これではありません。
[docs](https://docs.djangoproject.com/en/1.11/ref/forms/widgets/) にもありますが、widget は html の表現を操作するためのクラスなので、
実際は form の BooleanField を使います。

```py
from django import forms


class CheckForm(forms.Form):
    read_terms = forms.BooleanField(
        label='read terms',
        required=True,
        widget=forms.CheckboxInput(attrs={'class': 'check'}),
    )
```


# おわりに

僕は form と widget の関係がよくわかってなかったので、しばらくハマってました 👼
have a good django life!
[Bash on Windows] ev3rt開発環境をWindowsで作る2


# はじめに
[[Bash on Windows] ev3rt開発環境をWindowsで作る1](https://qiita.com/Shitimi_613/items/09bec911048e55285868)の続きです。今回はEV3をC/C++で動かすための環境を構築します。

**[2018/01/17 追記]
[Windows10 HomeでDockerを使って簡単にTOPPERS/EV3RTのビルド環境を構築する](https://qiita.com/Shitimi_613/items/35b3a30ba55ee6f8e01d)を公開しました。本稿の方法よりも簡単にビルド環境を構築できます。**


## 対象
OS: Windows10 バージョン1703以上
※1703からUbuntuのバージョンが16.04になる為。それより前のバージョンでは`make`時にエラー(`mno-pic-data-is-relative`)が出ます。

[[参考] Windows10 Creaters Updateへの更新](https://support.microsoft.com/ja-jp/help/4028685/windows-get-the-windows-10-creators-update)

**Bash on Ubuntu on Windows(Ubuntu16.04)がインストール済であること**

## TOPPERS/EV3RTとは？

EV3RT上で動作するリアルタイムOSです。C/C++のプログラムが動きます。

**参考**
[TOPPERS/EV3RT とは？](http://dev.toppers.jp/trac_user/ev3pf/wiki/WhatsEV3RT)


# 環境構築
前回使えるようにしたBash on Ubuntu on Windowsを立ち上げてください
[参考][Linuxでの環境構築方法（Ubuntu Linux）](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnvLinux)

## 1. ARM社のGNU Toolchainのリポジトリの導入

```bash
sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt-get update
```

**TOPPERSの環境設定マニュアルには古いリポジトリが載っているので注意してください**

## 2. 必要なパッケージのインストール
```bash
sudo apt-get install gcc-arm-none-eabi u-boot-tools libboost-all-dev -y
```

## 3. Workspaceを作る
```bash:Windowsのユーザ名hogehogeの場合
cd /mnt/c/Users/hogehoge
mkdir ev3rt
```

## 4. ライブラリのダウンロード
[TOPPERS/EV3RT ダウンロード](http://dev.toppers.jp/trac_user/ev3pf/wiki/Download#ダウンロード)
上記のサイトを開き、「ev3rt-beta7-release.zip」をダウンロードする。
![TOPPERS/EV3RT ダウンロード](https://qiita-image-store.s3.amazonaws.com/0/125406/f18def08-49b7-cfdf-f7df-36fe2465b7ef.png "スクリーンショット 2017-10-15 22.29.07.png")
ダウンロードしたzipファイルを解凍し、解凍した中にある`hrp2.tar.xz`を`C:¥Users¥hogehoge¥ev3rt¥`にコピーする。（Windowsのユーザ名hogehogeの場合）

## 5. hrp2.tar.xzの解凍
```bash:/mnt/c/Users/hogehoge/ev3rt（Windowsのユーザ名hogehogeの場合）
tar Jxvf hrp2.tar.xz
```

## 6. EV3RTのコンフィギュレータのインストール
端末で，EV3RTのパッケージをインストールした場所に移動して cfg をビルドする

```bash:/mnt/c/Users/hogehoge/ev3rt（Windowsのユーザ名hogehogeの場合）
cd hrp2/cfg
```

```bash:/mnt/c/Users/hogehoge/ev3rt/hrp2/cfg（Windowsのユーザ名hogehogeの場合）
make
```

## 7. ソースコードをgithubから落としてmakeする
※ev3-way用のサンプルプログラムです。適宜変更してください。
[ev3way_on_off_linetrace - Github](https://github.com/korosuke613/ev3way_on_off_linetrace/tree/master)

```bash:/mnt/c/hogehoge/ev3rt/hrp2/cfg（Windowsのユーザ名hogehogeの場合）
cd ../sdk
```

```bash:/mnt/c/hogehoge/ev3rt/hrp2/sdk（Windowsのユーザ名hogehogeの場合）
git clone https://github.com/korosuke613/ev3way_on_off_linetrace.git
cd ev3way_on_off_linetrace
```

```bash:/mnt/c/hogehoge/ev3rt/hrp2/sdk/ev3way_on_off_linetrace（Windowsのユーザ名hogehogeの場合）
make app=src
```

makeが完了したら(appが生成されたら)ev3rtの開発環境構築は完了。

# EV3で動かす
1. EV3の真ん中のボタン（決定ボタン）を押してEV3RTを起動する
2. USBケーブルでEV3とパソコンをつなぐ
3. `G:¥ev3rt¥apps¥`に先ほど生成されたappを入れる(Gドライブの場合)
4. 安全な取り外しをしてからUSBケーブルを引っこ抜く
5. EV3のディスプレイに表示されている`Load App`で決定ボタンを押す
6. V3のディスプレイに表示されている`SD card`で決定ボタンを押す
7. appで決定ボタンを押す
8. 動けば成功！
Emacs日本語フォント設定

    ; 半角英字設定
    (set-face-attribute 'default nil :family "Consolas" :height 100)
    ; 全角かな設定
    (set-fontset-font (frame-parameter nil 'font)
                      'japanese-jisx0208
                      (font-spec :family "IPAゴシック" :size 14))
    ; 半角ｶﾅ設定
    (set-fontset-font (frame-parameter nil 'font)
                      'katakana-jisx0201
                      (font-spec :family "ＭＳ ゴシック" :size 14))
    ; ずれ確認用
    ; 0123456789012345678901234567890123456789
    ; ｱｲｳｴｵｱｲｳｴｵｱｲｳｴｵｱｲｳｴｵｱｲｳｴｵｱｲｳｴｵｱｲｳｴｵｱｲｳｴｵ
    ; あいうえおあいうえおあいうえおあいうえお
Unityプロジェクトの自作パッケージ依存性管理をnpmで行う

# はじめに
Unityで複数のプロジェクトを進行していると、共通の処理をライブラリとして切り出したくなることがよくある。公開できるものだったらAsset Storeに出せば、まあそれっぽい感じにはなるわけだが、privateな状態でやろうとすると、Unity自体にはそういったパッケージ管理の仕組みはないので[^1]、自作するか、サードパーティのものを使わなくてはいけない。

要件としては、
・gitのレポジトリ（プライベートレポジトリ含む）で公開されているパッケージを簡単にインポートできること
・依存するライブラリのバージョン管理ができること（ローカルのバージョンと最新を比較して、バージョンが上がっていればアップデートするなど）
・MacでもWindowsでも使えること
・パッケージを公開する側で行うべき処理がなるべく少ないこと
であるが、これらを満たすツールとして、node.jsのライブラリ管理で使われるnpmを使うのが便利だという結論に落ち着いたので、その内容を記す。

# npmを使ったUnityプロジェクトのパッケージ依存性管理
[unity3d-package-syncer](https://github.com/rotorz/unity3d-package-syncer) というnodeモジュールが公開されているので、それを使う。元々npmには依存ライブラリのバージョン管理機能は備わっているが、このモジュールはnpmが使う `node_modules` ディレクトリとUnityのディレクトリを同期してくれる。

以下手順を解説する。

## パッケージを公開する側の作業
unity3d-package-syncer は gitのrootに `assets` （先頭は大文字でもよい）ディレクトリがあることを前提として、その中身を使用する側のUnityプロジェクトにインポートするため、インポートされる必要のあるファイルは全て `assets` 以下に突っ込んでおく。

また、npmの習わしに従って、プロジェクトのrootディレクトリにpackage.jsonを配置する必要がある。
中身は最低限nameとversionくらいあれば十分だ。

package.jsonの例

```json
{
  "name": "my-unity-package",
  "version": "0.0.1"
}
```

後は githubのプラベートレポジトリなり、private npmなりにプッシュしておけばよい。

https://github.com/rotorz/unity3d-package-example/ で実際の例が見られる。

## パッケージを使用する側の作業
使用する側では、package.jsonの `dependencies` の項目に `unity3d-package-syncer` と使用したいパッケージの名前とバージョン（npmで公開している場合）もしくはチェクアウト先のURLを追加する。以下の例では
https://github.com/rotorz/unity3d-package-example/ で公開されているunityパッケージを追加している。

```json
{
  "name": "my-unity-project",
  "version": "0.0.1",
  "description": "",
  "scripts": {
    "sync": "unity3d--sync"
  },
  "dependencies": {
    "unity3d-package-syncer": "^1.0.1",
    "unity3d-package-example": "git@github.com:rotorz/unity3d-package-example.git"
  }
}
```

このpackage.jsonをUnityのrootディレクトリ（Assetsディレクトリがあるディレクトリ）に配置し、以下のコマンドを実行する。

```bash
$ npm install --save unity3d-package-syncer # unity3d-package-syncerをインストール
$ npm run sync
```

これでunity3d-package-exampleの中身がUnityのAssetsディレクトリにインポートされたはずだ。
以降は `npm run sync` を実行するだけで、自動的に最新にアップデートされる。

# まとめ
npm は nodeのプロジェクト以外で使っても意外と便利。

[^1]: https://unity3d.com/jp/unity/beta/unity2017.2.0b2 によると Unity 2017.2.0から順次 Package Managerの仕組みが導入されるようですが、2017年10月15日現在は使用できません。
機械学習における教師データのファイル名の一括変更

##はじめに
前回作ったツールの強化です。
[前回の記事](https://qiita.com/Umemiya/items/747934f18b00c026ce83)をご一読いただければ幸いです。
##解説
以前公開した
[指定した人物の顔画像を自動収集するプログラムの公開と使い方](https://qiita.com/Umemiya/items/747934f18b00c026ce83)
において顔画像を集めたものの、画像のファイル名が同じであるが故に複数のフォルダをまとめることが難しい状況に直面した為つくりました。

以前と同じ[Githubのリポジトリ](https://github.com/XXXalice/FaceImageCollector)に入れてあります

一括変更を行いたい画像フォルダをimage_renamer > imgフォルダ内に突っ込んで
FaceImageCollector > image_renamer > rename.pyを実行してください

![スクリーンショット 2017-10-15 22.32.22.png](https://qiita-image-store.s3.amazonaws.com/0/160607/af00af3e-bbeb-1ad4-b6f2-ec2f52508a34.png)

こんな感じで入力を進めます。
終了すると
![スクリーンショット 2017-10-15 22.33.56.png](https://qiita-image-store.s3.amazonaws.com/0/160607/5730d5c4-1319-4e53-effc-4ce243d0c476.png)
綺麗に連番になります。


また、開始する番号の指定もできるので
womenフォルダ60枚と同じフォルダに置く為
![スクリーンショット 2017-10-15 22.35.07.png](https://qiita-image-store.s3.amazonaws.com/0/160607/358a5526-b7dd-9e37-2c67-2163328c03da.png)
61からスタートすることもできます。
終わったら一つのフォルダにまとめてください。

約130枚の男女の顔をランダムに抽出した教師データの完成です。
![スクリーンショット 2017-10-15 22.36.57.png](https://qiita-image-store.s3.amazonaws.com/0/160607/1b3b480e-1dcd-6a32-72ba-6aad341974d5.png)



##ソース解説

```python:rename.py
import os
import glob

def main():
    print('imgフォルダに入れた画像フォルダ名を入力してください')
    f = input('>> ')
    path = './img/'+f+'/'
    print('始めたい番号を入力してください')
    label = int(input('>> '))

    files = glob.glob(path+'*')

    for i, file in enumerate(files, label):
        try:
            os.rename(file, path + str(i) + '.png')
        except Exception as e:
            print(e)
            continue

if __name__ == '__main__':
    main()
```

そんなに長くありません。
画像のパスを獲得した後、globモジュールのglobメソッドで全ての画像名を配列にできます。
その後、enumrateを使ったループによりos.renameで画像名に数字をつけフォルダ内に再配置します。
glob.glob（）は非常に便利ですので機会がありましたら皆さんも是非使ってみてください！

ありがとうございました。
システム自体は上記リンクに掲載しております。
macOSにAzure CLIをhomebrewでインストールする方法



## やりかた

```
brew install azure-cli
```


## 使い方

例

```
az vm create -n MyLinuxVM -g MyResourceGroup --image UbuntuLTS
```

詳細は、コマンドリファレンスを。

[az | Microsoft Docs](https://docs.microsoft.com/ja-jp/cli/azure/?view=azure-cli-latest)


## 参考

* [AzureCli — BrewFormulas](http://brewformulas.org/AzureCli)
* [Azure CLI 2.0 | Microsoft Docs](https://docs.microsoft.com/ja-jp/cli/azure/overview?view=azure-cli-latest)
特徴量選択の3つの基本戦略

# はじめに
[Pythonではじめる機械学習](http://amzn.to/2ync70Z)にて、自動特徴量選択の手法についてまとめられていた。
有用な特徴量だけを残して残りを捨てて、特徴量の数を減らすことで、汎化性能を向上することができる。
その基本的な戦略が下記の3つ。

# 単変量統計
個々の特徴量とターゲットとの間に統計的に顕著な関係があるかどうかを計算する。
個々の特徴量を個別に考慮する。そのため、他の特徴量と組み合わさって意味を持つような特徴量は捨てられる。
特徴量が多すぎてモデルを作ることができない場合や、多くの特徴量が全く関係ないと思われるような場合には、この手法が有効。

`sklearn` では、 `SelectPercentile` を用いる。

# モデルベース特徴量選択
教師あり学習モデルを1つ用いてここの特徴量の重要性を判断し、重要なものだけを残す手法。
特徴量選択に用いる教師あり学習モデルと最終的に使う教師あり学習モデルと同じでなくても良い。
例）RandomForestで特徴量の重要度を元に選択し、ロジスティック回帰で教師あり学習をする、など

`sklearn` では、 `SelectFromModel` を用いる。

# 反復特徴量選択
異なる特徴量を用いて一連のモデルを作る。
そのため前述の手法と比べて時間はかかる。
これには2つの基本的な方法がある。

1. 全く特徴量を使わないところからある基準が満たされるところまで1つずつ特徴量を加えていく方法
2. 全ての特徴量を使う状態から1つずつ特徴量を取り除いていく方法（再帰的特徴量削減）


2ではまず、全ての特徴量でモデルを作り、そのモデルで最も重要度が低い特徴量を削除する。そしてまたモデルをつくり、これを繰り返す。

`sklearn` では、 `RFE` を用いる。

# 参考
[Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎](http://amzn.to/2ync70Z)
Raspberry PiでEthereumクライアント（geth)をインストールする。

##やったこと：
Raspberry piにEthereumクライアント(geth)をインストールする。
インストールしたgethから既存のウォレットアドレスをインポートして残高を確認してみる。

##使うもの：
　Raspberry Pi model B (512MB)
　（OS：Raspbian GNU/Linux 8）
##方針：
　 Raspberry piのCPUはARMを使用しているが、gethの公式でもバイナリが提供されているので、それを使用する。

##Step1:ダウンロード：
　Raspberry pi(model B) はARMv6のCPUなので、gethのバイナリもそれに合わせてダウンロードする。
　(Raspberry pi3はARMバージョンが違うので注意）

```:
$ wget https://gethstore.blob.core.windows.net/builds/geth-linux-arm6-1.7.2-1db4ecdc.tar.gz
```

##Step2:インストール:
　/usr/localにgethをインストールする。

```:
$ sudo tar -C /usr/local -xzf geth-linux-arm6-1.7.2-1db4ecdc.tar.gz
```

PATHを通す
~/.bashrcに次を追記

```:~/.bashrc
 export PATH=$PATH:/usr/local/geth
```

bashrcを再度読み込み、PATHを更新する

```:
$ source ~/.bashrc
```

今後のバージョン変更に備えて、シンボリックリンクを作る。
（何度もPATHを設定し直したくないので、バージョンが変わったとしてもシンボリックリンクを作りなおせば
　PATHが通るようにしておく）

```:
$ sudo ln -s /usr/local/geth-linux-arm6-1.7.2-1db4ecdc /usr/local/geth

```

##Step3:gethの実行

gethを実行した時に、チェーンデータを格納するディレクトリを作っておく。
同期モードはLightクライアントモードで動かす。

```:
$ mkdir light_mainnet
$ geth --datadir "~/light_mainnet" --syncmode "light" console --rpc --rpcaddr "localhost" --rpcport "8545" --rpcapi eth,web3,personal 

```

別にコンソールを開いて確認したい場合は、geth attachを使用する。

```:
$ geth attach ipc:/home/umidachi/light_mainnet/geth.ipc
```

##Step4:確認
ウォレットアドレスをgethにインポートして残高を確認してみる。
すでにウォレットを持っていて、ラズパイからも残高を見れるようにするためには
MyEtherWalletから秘密鍵を取得して、インポートするのが手っとり早い。
（この秘密鍵は暗号化されていないので知られると危険。取り扱いは注意すること。）


下記のURLにアクセスして、自分の秘密鍵を確認しておく（下図赤枠）。
MYEtherWallet: https://www.myetherwallet.com/#view-wallet-info

![Screenshot from 2017-09-17 20-17-45.png](https://qiita-image-store.s3.amazonaws.com/0/142016/e2eeb9eb-a8cd-5725-8b9d-89cdf6592fc1.png)

geth上でimportRawKeyを使ってラズパイ用に使いたいパスワードを設定する。


```consl:geth
> web3.personal.importRawKey("<秘密鍵>","<設定したいパスワード>")
（出力例）
"0x○○○○○○○○○〜"  (←インポートしたウォレットのアドレスが出力される。)
```

インポートしたアドレスがgethに反映されているか確認する。

```consl:geth
> personal.listAccounts
（出力例）
["0x○○○○○○○○○〜"]
```

インポートしたウォレットアドレスの残高が確認できたらOK。

```consl:geth

> eth.getBalance(eth.accounts[0])
(出力例)
312892010075299350
```
上記のとおり残高が出力できた。（ETHに換算すると10^18を割った値になる。実際0.31ETH程度）



##参考にしたもの：
http://raspnode.com/diyEthereumGeth.html
https://github.com/ethereum/wiki/wiki/Raspberry-Pi-instructions
https://ethereum.github.io/go-ethereum/install/
https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-ARM
http://redcorner.io/blog/building-ethereum-light-client-on-chip/
https://geth.ethereum.org/downloads/
https://ja.wikipedia.org/wiki/Raspberry_Pi
Android Studioを使わずにAndroidアプリ開発 ~準備~

## はじめに

アンドロイドアプリをAndroid Studioを使って開発しようと思ったが余りに重たい...なんか別の方法ないんか!?
調べてみるとpythonのGUIライブラリにKivyというものがあるやん！
これで開発できるんとちゃうんか？
よっしゃ、この方法使ったろ！
ってのが全てのスタート地点です。

※あくまで個人用のメモとして書いてます。

## 環境
- Windows8.1
- Virtualbox: 5.1.22
- Python3.5.4

## 準備物
- Ubuntu: 16.04

以下のサイトでわかりやすくVirtualboxにインストール手順が書いてあったので参考にしてください。
[VirtualBoxにUbuntu16.04をインストール](http://releases.ubuntu.com/16.04/)

## Pythonの環境設定
pyenvを入れてバージョン管理を行う


    $ python -V
    2.7.12

    $ sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev　python3-tk tk-dev python-tk libfreetype6-dev

    $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
    $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
    $ source ~/.bashrc

    // kivyかbuildozerか、とりあえず何かでpython3.6は対応していないと見た気がしたので
    $ pyenv install 3.5.4

    $ pyenv global 3.5.4

    $ python -V
    3.5.4 // こうなっていれば成功


## Kivyのインストール
公式にやり方が書いてありました。
以下の手順でやれば問題なくインストールできると思います。

    $ sudo add-apt-repository ppa:kivy-team/kivy
    $ sudo apt-get update
    $ sudo apt-get install python3-kivy

    $ sudo apt-get install -y \
      python-pip \
      build-essential \
      git \
      python3 \
      python3-dev \
      ffmpeg \
      libsdl2-dev \
      libsdl2-image-dev \
      libsdl2-mixer-dev \
      libsdl2-ttf-dev \
      libportmidi-dev \
      libswscale-dev \
      libavformat-dev \
      libavcodec-dev \
      zlib1g-dev

現在の所では普通にCythonをインストールすればkivyのバージョンと対応する。

     $ pip install cython

続けてkivyもインストールする。

     $ pip install kivy

何事もなければdoneと出る。
もしエラーが起こって解決しなかったらコメントください。
     

## buildozerのインストール
pythonで書いたコードをAndroidビルド環境にしてくれる優れもの。
実はUbuntuで開発している全ての理由はこれで、このツールはWindowsでは扱うことができません(kivyはwindowsでも可能)。
けどこのツールがiOSにもAndroidにもビルドできるようにしてくれるのだからホント感謝です。

    $ pip install buildozer

恐らく、今の状態だとエラーが出るかと思われます。
cythonのバージョンが高いので下げろ的な何かを言われたりしませんでしたか？
もしかしたらkivyをインストールする時にも言われてるかもしれません。
けど簡単です。
単純にバージョンを下げてインストールしてあげればいいだけなので。

    $ pip install cython==0.22

とかでインストールすれば問題なくいくはずです。
kivyでエラーが出て困ったかたはごめんなさい。


一先ずandroidアプリ開発の準備は終了。

これ以降はただコードを書いていく作業になります。
kivyは最近人気のGUIライブラリなので調べたら簡単に情報がゲットできて楽ですね。
ただ英語のものが多いですが...まぁ大体訳してあると思いますけど、もし英語がよくわからないので訳して～ということがあればコメント頂ければ簡単でよければ訳します(笑)

## おまけ
kivyのexampleが色々とあるので気になる人はここをチェック。
[https://github.com/kivy/kivy/tree/master/examples](https://github.com/kivy/kivy/tree/master/examples)

最近Ubuntuで使っているエディターがVisual Studio Codeで、割と軽くて使いやすいのでよければ使ってみることをお薦めします。

[https://vscode-doc-jp.github.io/docs/setup/linux.html](https://vscode-doc-jp.github.io/docs/setup/linux.html)にインストール方法が載ってます。

※ソフトウェアセンターではなく端末からインストールした方が早いです。
BIP 0012 (OP_EVAL) 【任意の値をScriptとして実行できる】

今回は、BitcoinのScriptの新しい命令であるOP_EVALについてのBIPです。
https://github.com/bitcoin/bips/blob/master/bip-0012.mediawiki

# 概要
このBIPは、Bitcoinのscriptの新しいオペコード(OP_EVAL)と、受け取り側がトランザクションを変更できる新しいトランザクションの形式を説明します。

# 動機

安全なウォレットと安全なトランザクションだけで、古いマイナーとクライアントへの後方互換を保ったまま、複雑なトランザクションを実装することができる。

# 仕様
OP_EVALは、既にあるOP_NOP1の機能を以下のように再定義するものです。

- トランザクションの検証作業中に、スタックの一番上の値をpopし、それをScriptの形式に復号し、Scriptとして実行します。
- もしスタックの一番上のアイテムがなかったり、それがScriptの命令じゃなかった場合はトランザクションは無効となります。
- Scriptの命令に復号したときにOP_CODESEPARATORが含まれていれば、トランザクションは向こうになります。
- Scriptの命令に復号したときにOP_EVALが含まれていれば、それも実行されますが、OP_EVALは2つまでしか深く呼び出しできません。
- OP_EVALの中を実行し、トランザクションが無効化される結果になった場合、OP_EVALの呼び出し元でもトランザクションが無効化されます。

新しいScriptPubKeyの形式は以下のようになります。

```
    DUP HASH160 {20-byte-hash-value} EQUALVERIFY OP_EVAL
```

ScriptSigは以下のようになります。

```
    ...signatures... {任意の値=変換されたScriptの命令}
```

OP_EVALを使用するScriptPubKeyはスタンダードトランザクションとして標準のものになります。

## 実装

OP_EVALは、ビットコインの受け取り側がビットコインをどのように使うかを、ビットコインの送り主側が知ることができます。
送り主は、新しいアドレス形式などを含む複雑なトランザクションに対応するために、変換されたScriptを知っているだけで良くなります。

もし復号化されたScriptが複雑だったり、マルチシグネチャを利用していた場合、結果的に多いトランザクションフィーを払うのが、送り主ではなく受け取り側になります。

もし、OP_EVALがScriptに複雑さを追加することになり、そしてそれが問題になるようなことがあるかもしれません。また、セキュリティ的にそれが良くないこともあります。

同じことが既にあるBitcoinのScriptにも言えます。ScriptPubKeyは、ネットワークを超えてBitcoinの仕組み・実装を細かく変更できます。OP_EVALはただデータの場所を移動するだけです。おバカな人がわざわざBitcoin-coreのコードを書き換えなくても、セキュリティを保ったまま機能の追加ができます。

OP_EVALに対応しない古いクライアントに対して、ただのNOPとして1認証攻撃という攻撃をすることができます。しかし、これは難しいです。以下に方法を述べます。

1. 攻撃者は、古いクライアントでは有効に見えて、新しいクライアントでは無効なOP_EVALを含むトランザクションを作ります。
2. また、攻撃者は、1のトランザクションを入力とする、ティム宛の送金トランザクションを作ります。
3. 攻撃者は、1と2のトランザクションを含むブロックを採掘します。もしティムが1認証でこれを受け入れれば、ネットワークがブロックを無効と認定するまでの間、攻撃に成功します。

攻撃者は、不正なブロックを自力で掘らなければならないので、攻撃の難易度は高いです。また、高い価格の送金を1認証を完了させるような状況はBitcoinを使うビジネスとしては普通はないのも理由になります。

# 後方互換

驚くことに。、OP_EVALはOP_NOP1を書き換えるものですが、古いクライアントでも有効とみなされます。古いクライアントは、変換されたScriptの命令が値としておかしくないかを確認するだけです。もしOP_EVALがただのNOPとして有効であれば、トランザクションが有効としてみなされます。

古いクライアントはOP_EVALを無視します。また、一般的ではないトランザクションをブロックに取り込んでくれるマイナーか、新しいクライアントを使うマイナーも必要になります。

OP_EVALがブロックチェーンを分岐させないために、以下の2つのケースを気をつける必要があります。

1. OP_EVALを使い、新しいクライアントでは無効だが古いクライアントでは有効なトランザクション
2. OP_EVALを使い、新しいクライアントでは有効だが古いクライアントでは無効なトランザクション

ケース1の場合、新しいクライアントとマイナーは2012年2月1日まで古いOP_EVALをただのNOPとして認識するようにします。それまでは、OP_EVALが承認されるかどうか確認するため、マイナーがブロックに"OP_EVAL"という識別子がついているかどうか確認します。2012年1月15日の時点で、OP_EVALに対応するマイナーが50%以下の場合、そのトランザクションはOP_EVALに対応するマイナーが50%を超えてから有効になります。プロトコルの移行はそれまで拒否されます。

ケース2の場合、新しいクライアントはそもそもOP_EVALがただのNOPだった場合とOP_EVALである場合の両方でトランザクションが有効であることを確認します。例を以下に示します。

```
    scriptSig:  {OP_11を変換した値}
    scriptPubKey:  OP_EVAL OP_11 OP_EQUAL
```

# 実際の実装

https://github.com/gavinandresen/bitcoin-git/tree/op_eval

以下も参照してください。

https://bitcointalk.org/index.php?topic=46538

"Bitcoin Address 01" BIP

M-of-N Multisignature Transactions BIP 11
指定フォルダ内のファイル一覧を取得する

# 概要
Googleドライブの写真フォルダから各フォルダの写真名をスプレッドシートに出力する。

```text:フォルダ構成
写真フォルダ
 ├ xxxx年xx月xx日フォルダ
 │　├ 写真A
 │　└ 写真B
 ├ xxxx年xx月xx日フォルダ
 │　├ 写真A
 │　└ 写真B
 └ xxxx年xx月xx日フォルダ
  　├ 写真A
  　└ 写真B
```

```file.gs
/*
 * 指定シートにフォルダ内のファイル情報を出力する。
 */
function main() {  
  // 出力するシート名
  var FOLDER_ID = 'フォルダID';
  // 出力するシート名
  var SHEET_NAME = 'シート名';
  
  // フォルダ内のフォルダを取得
  var folders = DriveApp.getFolderById(FOLDER_ID).getFolders();
  // 指定したシート名に出力する
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME).clear();
  
  if (folders.hasNext()) {
    var index = 0;
    var values = [];
    while(folders.hasNext()) {
      var folder = folders.next();
      // フォルダ名
      var folderName = folder.getName();
      // フォルダURL
      var folderUrl = folder.getUrl();
       
      var files = folder.getFiles();
      while(files.hasNext()) {
        var file = files.next();
        // ファイル名
        var fileName = file.getName();
        // ファイルダウンロードURL
        var fileDownloadUrl = file.getDownloadUrl();
        values[index] = [index + 1, folderName, folderUrl, fileName, fileDownloadUrl];
        index++;
      }
    }
    sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
  }
}
```
Xcode, VScodeのリモートリポジトリ初期設定メモ

GitHub Xcode, VScode

Vscode
ctrl shift @ でターミナルを開く（^`を入力する意）
git remote add origin [gitsshurl]
git push
まで一回やるとオッケー

Xcode
source configration -> [projectname - branchname] ->configration [projectname]
remotes tab -> + -> [githttpurl]
Google HomeのIPアドレスを確認する方法


iPhoneなどのGoogle Homeアプリから確認できる。
1. デバイスメニューから、IPアドレスを知りたいGoogle Homeの右上のドットをタップ
2. 最下部にIPアドレスが表示されている。

参考
https://productforums.google.com/forum/#!topic/googlehome/CT7tDwf_e0Y
slackinをBluemixにデプロイする

GUIだけでやってみようとした時に、変数の場所と内容などがわからなかったのでメモ


#使うもの
##slackin
Slackへのinviteを自動化できるアプリ(MITライセンス)
https://github.com/rauchg/slackin

##Bluemix
IBMのクラウドプラットフォーム
https://console.bluemix.net/registration/?
アカウントは取得してあるものとする

#slackinをBluemixにデプロイする

Bluemixにログインした状態のブラウザで、
https://github.com/rauchg/slackin
**Usage** → **other platform** → **IBM Bluemix**

- とりあえずそのまま**デプロイ**ボタンを押す
- **Deploy Stage**で失敗する
- Deploy Stage右上の歯車アイコンから**ステージの構成**をクリック
- 下の方の**デプロイ・スクリプト**を以下のように変更する(２行目の先頭に# をつける)

`#!/bin/bash`
`# cf push "${CF_APP}"`
`# View logs`
`# cf logs "${CF_APP}" --recent`

- 保存して再度ジョブを実行する
- デプロイが成功する（この時点ではアプリケーションは異常終了して落ちている）

#アプリの実行

- 左上「三」メニューアイコンからダッシュボードをクリック
- ダッシュボードから先ほど作成したアプリケーションをクリック（経路の下線が引かれたurlを押すとアプリそのものに飛んでしまうので注意）
- 左メニューエリアのランタイムをクリック
- 画面中央の環境変数をクリック
- ユーザー定義環境変数に以下の４つを追加
    - SLACK_API_TOKEN
    - SLACK_SUBDOMAIN
    - GOOGLE_CAPTCHA_SECRET
    - GOOGLE_CAPTCHA_SITEKEY

SLACK_API_TOKEN：以下から生成
https://api.slack.com/custom-integrations/legacy-tokens

SLACK_SUBDOMAIN：チーム名
xxxxx.slack.comのxxxxx部分

GOOGLE_CAPTCHA_SECRET・GOOGLE_CAPTCHA_SITEKEY：以下から生成
https://www.google.com/recaptcha/admin
typeはInvisible reCAPTCHAを選択
DomainsはBluemixのアプリケーションの"経路"の下線が引かれたurlを入力

- 環境変数の保存ボタンを押すと、自動でアプリが再実行される
- アプリurlにアクセスすると、slackinアプリにアクセスできる
[Bash on Windows] ev3rt開発環境をWindowsで作る1

# はじめに

今回はWindowsでBashを使えるようにします。

**[2018/01/17 追記]
[Windows10 HomeでDockerを使って簡単にTOPPERS/EV3RTのビルド環境を構築する](https://qiita.com/Shitimi_613/items/35b3a30ba55ee6f8e01d)を公開しました。本稿の方法よりも簡単にビルド環境を構築できます。**

## 対象
OS: Windows10 バージョン1703以上
※1703からUbuntuのバージョンが16.04になる為。それより前のバージョンでは`make`時にエラー(`mno-pic-data-is-relative`)が出ます。

[[参考] Windows10 Creaters Updateへの更新](https://support.microsoft.com/ja-jp/help/4028685/windows-get-the-windows-10-creators-update)

## Bash on Ubuntu on Windowsについて
Windows上で動くUbuntuの上で動くBashのことです。
今回行うEV3のプログラミングはWindowsのままではできないのでBash on Ubuntu on Windowsを導入します。
![Bash on Ubuntu on Windowsの例](https://qiita-image-store.s3.amazonaws.com/0/125406/27fb86a6-4171-fcc3-f8fd-887358688ef4.png "Bash on Ubuntu on Windowsの例")

**参考**
[Bash on Ubuntu on Windowsとは？ そのインストールと使い方](http://www.buildinsider.net/enterprise/bashonwindows/01)


# 環境構築

## 0. Windowsのバージョン確認
1. 「スタート」を右クリック
2. 「システム」をクリック
3. 「Windowsの仕様」の、「バージョン」の右の数字を確認する。

* `1703`以上の数字であれば「1. Bashの有効化」に進む。
* `1703`未満の数字であれば[Windows10 Creaters Updateを適用しておく](https://support.microsoft.com/ja-jp/help/4028685/windows-get-the-windows-10-creators-update)

![設定→バージョン情報](https://qiita-image-store.s3.amazonaws.com/0/125406/fee70908-5b0d-ab3a-2cba-7e1107abafd1.png)


## 1. Bashの有効化
1. 「スタート」で右クリック
2. 「アプリと機能」をクリック
3. 「関連設定」の「プログラムと機能」をクリック
4. 「Windowsの機能の有効化または無効化」をクリック
5. 「Windows Subsystem for Linux (Beta)」にチェックして「OK」をクリック（インストールが始まる）
![Windowsの機能](https://qiita-image-store.s3.amazonaws.com/0/125406/40b3f69c-682b-50d4-e684-206c4e741f16.png "Windowsの機能")
6. インストール後に再起動する

## 2. 開発者機能の有効化
1. 「スタート」をクリック
2. 「設定」をクリック
3. 「更新とセキュリティ」をクリック
4. 「開発者向け」をクリック
5. 「開発者モード」にチェックを入れる

## 3. Bashのインストール
1. 「Windows PowerShell(管理者)」を開く
2. `bash`と入力してENTER
3. YesかNoか尋ねられるので、「y」と入力し、ENTER
4. しばらくまつ
![ロケール](https://qiita-image-store.s3.amazonaws.com/0/125406/58fe7fd2-1fed-6ef1-a1a3-4f68109d030d.jpeg)
5. 上の画像の状態になったら「y」と入力し、ENTER
6. 画面の指示に従い、ユーザ名・パスワードを設定する(Windowsのものと同じにする必要はない)
7. 「Windows PowerShell(管理者)」を閉じる

**Bashの開き方**
1. 「スタート」をクリック
2. 「ubuntu」と入力
3. 「Bash on Ubuntu on Windows」をクリック

## 4. リポジトリの変更

[【新】Bash on Ubuntu on WindowsでWindows上にLinux環境を導入する](http://ikesan009.sakura.ne.jp/2017/07/11/【新】bash-on-ubuntu-on-windowsでwindows上にlinux環境を導入する/)
> 標準設定ではパッケージ取得の時にいちいち海外サーバーにアクセスしてしまうため非常に効率が悪く、時間がかかってしまいます。なので、リポジトリの取得先を日本サーバーに変更します。先程と同様に次のコマンドを入力します。

```bash
sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list
```

上記のスクリプトをBashに入力する。

## 5. パッケージを最新版にする

```bash
sudo apt-get update
```

```bash
sudo apt-get upgrade -y
```

## 6. ログイン時のディレクトリを変更
*hogehoge***に当たる部分をWindowsのユーザ名に書き換えてください**
もし、Windowsのユーザ名が日本語の場合、不具合が起きる可能性があるので、半角英数字のユーザ名にしましょう

```bash:ユーザ名がhogehogeの場合
sudo echo "cd /mnt/c/Users/hogehoge" >> ~/.bashrc
```

# 続く
[環境構築編2](https://qiita.com/Shitimi_613/items/051d04eb139043222567)ではTOPPERS/EV3RTの環境構築をします。
[Swift4]  遅延評価のすゝめ 〜 LazySequence/LazyCollection

### mapなどによる無駄な処理

`[Int]`である配列の要素に1を加えて2を掛け最初の要素を取り出してみます。
処理の流れを見るために出力を付け加えています。

```swift

func add(_ i: Int) -> (Int) -> Int {
    return {
        print("<<", $0)
        return $0 + i
    }
}
func multiply(_ i: Int) -> (Int) -> Int {
    return {
        print($0 * i, ">>")
        return $0 * i
    }
}

let re = Array(0..<5).map(add(1)).map(multiply(2)).first

```
これを実行すると

```
<< 0
<< 1
<< 2
<< 3
<< 4
2 >>
4 >>
6 >>
8 >>
10 >>
```
と出力され、reには2が代入されます。
最初の`map`で全ての要素に1を加え、続く`map`で全ての要素に2をかけ、その後、最初の要素を取り出しています。

必要な値は

```swift
let re = (0 + 1) * 2
```
だけで計算可能であるのに、無意味な計算が多数行われます。
これを解決するのが`LazySequence`/`LazyCollection`とそのサブタイプです。

### 遅延評価

先ほどのプログラムにちょっと追加をします。

```swift
let re = Array(0..<5).lazy.map(add(1)).map(multiply(2)).first
```
`lazy`を追加しただけです。
これを実行すると

```
<< 0
2 >>
```
と出力され、reには2が代入されます。

最初の要素、つまり

```swift
let re = (0 + 1) * 2
```
だけが計算されているのがわかります。

これはつまり、`map`に渡された関数の実行はその場ではされず、実際に値が必要になった時必要な要素のみに、この場合は`first`が呼ばれた時に必要である最初の要素に対してのみ関数が実行されているのです。

このように、実際の値が必要になるまで、`map`などに与えられる関数の実行を遅延させるのが遅延評価であり、Swiftにおいてその役割を担っているのが`LazySequence`/`LazyCollection`とそのサブタイプです。

### いつ実行されるの？

`LazySequence`/`LazyCollection`とそのサブタイプ自身はあまり覚える必要はありませんが、それらに対して、**何をした時**に**何が起こるのか**というのは重要です。

遅延評価させるつもりで書いたものが、遅延評価になっていなかったというのが一番問題なのです。

ということで、未完成ですが、僕が現在調べた結果を記しておきます。
ハイライトされて読みやすくなるようにメソッドには`func`をプロパティには`var`をつけています。

### 実行されない

```swift
func map(_:)
func flatMap(_:)

func filter(_:)

func enumerated()

func reversed()

func prefix(_:)
func prefix(through:)
func prefix(upTo:)
func prefix(while:)

func suffix(_:)
func suffix(from:)

func dropFirst()
func dropFirst(_:)
func dropLast()
func dropLast(_:)

func joined()
```

### 該当箇所のみ実行される

```swift
var first

var last
```

### 条件が満たされるまで/満たされている間実行される

```swift

func first(where:)

func contains()

func index(where:)

var isEmpty
```

### 全て実行される

```swift
// 通常の配列などに変換する
let array = Array(lazySequence)

func reduce(_:,_:)

func sorted()
func sorted(by:)

func joined(separator:)
```

### 未完成

未完成なので、ちょっとつづ追加していきたい。
Raspberry PiのPWMはアナログ音声出力と共用

Raspberry PiのハードウェアPWMでサーボモータ… ではなく圧電サウンダ(ビープ音鳴らせるヤツ)を鳴らそうとしたところ，4極ジャックに繋いだスピーカからもビープ音が鳴るという奇妙な現象が．

日本語の情報が乏しいので英語の情報をあたると，PWMはアナログ音声出力と共用しているという記述を見つけました．

[PWM and audio on RPi3 - Raspberry Pi Forums](https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=165719)
> Hardware PWM on the Pi uses the same peripheral as that used by the audio jack.
> (意訳: ハードウェアPWMはオーディオジャックにも使われているぜ!)

現象の説明が付きます．
PWMと音声出力の両方を使用したい場合は，HDMIかUSBのオーディオデバイスを使うしかなさそうです．

----

[Schematics - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/README.md)

公式の回路図を確認すると，4極ジャックの音声出力にはAUD_PWM0, AUD_PWM1がつながっていて，たしかに音声出力をPWMで実現しているようです．
Dockerfileでapt-get install npm後にnpm update -g npmで最新にアップデートするとnpmがエラーになってしまう場合の対処法

# 目的  
Dockerfileで以下を行いたい。

+ `apt-get install npm`で`npm`をインストール
+ `npm install -g npm@latest`で最新版までアップデートする

## 問題点  
`npm install -g npm@latest`で最新版まで上げると依存ファイルが足りないらしく、`npm`が動作しなくなる。
例として以下のようなエラーが出る。
依存関係のあるものを先にインストールしようとしたが、1つや2つではないようなので断念。 

```
RUN apt-get update && apt-get install -y npm

# nをインストールしてnode.jsのstableをインストールする
RUN npm install -g n && n stable
RUN npm install -g npm@latest
```

```shell-session
module.js:529
    throw err;
    ^

Error: Cannot find module 'npmlog'
    at Function.Module._resolveFilename (module.js:527:15)
    at Function.Module._load (module.js:476:23)
    at Module.require (module.js:568:17)
    at require (internal/module.js:11:18)
    at /usr/local/lib/node_modules/npm/bin/npm-cli.js:22:13
    at Object.<anonymous> (/usr/local/lib/node_modules/npm/bin/npm-cli.js:92:3)
    at Module._compile (module.js:624:30)
    at Object.Module._extensions..js (module.js:635:10)
    at Module.load (module.js:545:32)
    at tryModuleLoad (module.js:508:12)
```

## 解決策  
一旦`npm@4.0`をインストールした後に`npm@latest`をインストール時する。

```
RUN apt-get update && apt-get install -y npm

# nをインストールしてnode.jsのstableをインストールする
RUN npm install -g n && n stable
RUN npm install -g npm@4.0
RUN npm install -g npm@latest
```

解決するまで結構悩みました…。
おそらくDockerfileではなく、実OSでも使えるテクニックだと思います。
自分用メモですが同じところでつまづいてる人の助けになるといいですね。
rsyslogの設定

#syslog, rsyslogとは
###syslog
- logを転送するための仕組み
- ファシリティ／プライオリティの組み合わせで出力先を振り分けられる
- ファシリティ: どこから送信されたか分類するためのもの
- プライオリティ: logの重要度を示すもの  
[ファシリティとプライオリティについてはこちら](http://knowledge.sakura.ad.jp/knowledge/8969/)

###rsyslog
- 基本的にsyslogと機能は同じで、それに「信頼性(reliable)」が加えられたもの  
→具体的には、TCPで送信できるようになったようです



#rsyslogの設定(/etc/rsyslog.conf)

```
$ModLoad imudp　★udpならコメントアウト
$UDPServerRun 514

$ModLoad imtcp　★tcpならコメントアウト
$InputTCPServerRun 514

$AllowedSender TCP, 192.168.1.0/24 ★受信を許可するプロトコルとIPアドレス
$Umask 0022　
$FileGroup root
$FileOwner root
$ActionQueueType Disk　★キューのタイプを指定、「Disk」にすればメモリを使わずDiskに書き込む
$template Error_log,"/var/log/Error.log"　★テンプレート名と保存先
local0.*  ?Error_log　★ファシリティ（今回はカーネル関連のファシリティ0に設定）
```

###rsyslogの出力先をIPで振り分けたい！
**書式**
`:<プロパティ名>, <条件式>, <設定値> -<出力先ファイル>`
設定例

```
:fromhost-ip, isequal, "192.168.1.0"  -/var/log/test.log
& ~

●設定の意味
fromhost-ip: ログを送信したホストのIPアドレス
isequal: '文字列'がプロパティと完全にマッチするかどうか
"192.168.1.0: IPアドレス
-/var/log/test.log: 出力先
& ~: 直前の条件に合致したログを破棄する設定、二重でログを出力させるのを防止する
```


####参考URL
[[メモ]rsyslog たくさんのNW機器のsyslogを振り分ける方法](http://www.harumaki.net/2014/08/22/rsyslog-property-replacer/)
[rsyslog　　特定のログに対するフィルタ](http://www.geocities.jp/yasasikukaitou/rsyslog-filter.html)
WP Social Bookmark LightでTwitterシェアの文面をなおす

※2017年10月現在の方法です

#WP Social Bookmark Lightとは
日本人の方がつくられている、WordPressで記事をシェアしてもらうための非常にシンプルなプラグイン。

WP Social Bookmarking Light — WordPress プラグイン
https://ja.wordpress.org/plugins/wp-social-bookmarking-light/


導入方法はこのあたりを参照。

WP Social Bookmarking Light の設定方法
https://bazubu.com/wp-social-bookmarking-light-23861.html


#Twitterシェアの文面で記事タイトルしか出ない
<img width="665" alt="スクリーンショット 2017-10-15 21.43.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/77925/d7d960b7-f2f2-508e-e14a-dd59c9ec2117.png">
`記事タイトル` だけじゃなく、 `記事タイトル | サイト名` にしたい。

## 対策
WP Social Bookmarking Lightで記事タイトルとブログ名の表示方法
http://gucciz03.com/twitibl-1311
こちらを参照したが、どんどん内容が修正されていくのでこの通りやってもうまくいかない。

### src/WpSocialBookmarkLight/Service.php
プラグインのフォルダ内、 `src/WpSocialBookmarkLight/Service.php`を開く。この中に各ボタンの挙動が記されている。
180行めあたりに下記のような部分がある。

```Service.php
    /**
     * Twitter button
     *
     * @return string
     */
    public function twitter()
    {
        $options = $this->option->getAll();;
        $twitter = $options['twitter'];
        $data_url = $this->url;
        $data_text = $this->title;
//以下略
```
これの`$data_text`の行がブログタイトル出してくるやつなので、下記のように変える。

```Service.php
    /**
     * Twitter button
     *
     * @return string
     */
    public function twitter()
    {
        $options = $this->option->getAll();;
        $twitter = $options['twitter'];
        $data_url = $this->url;
        $data_text = $this->title . ' | ' . $this->blogname;
//以下略
```

## 以上おっけー
<img width="661" alt="スクリーンショット_2017-10-15_21_51_26.png" src="https://qiita-image-store.s3.amazonaws.com/0/77925/524c5d83-cdf6-5289-12bd-5330a0795c3b.png">
シェアし放題です
xdebug インストール時の error: no acceptable C compiler について

問題が発生した環境 CentOS 7.3, PHP 7.1

## pecl install xebug でコケる

```shell-session
[root@localhost ~]# pecl install xdebug
downloading xdebug-2.5.5.tgz ...
<<中略>>
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... no
checking for gcc... no
configure: error: in `/var/tmp/pear-build-root4oZ63I/xdebug-2.5.5':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
ERROR: `/var/tmp/xdebug/configure --with-php-config=/usr/bin/php-config' failed
```

Cのコンパイラが無いことが原因
👇 以下を実行しましょう。

```shell-session
[root@localhost ~]# yum install gcc
```
file_get_contentsをキャッシュ付きにする

あるAPIを試していたら、あっという間に試用上限に達してしまったので、早い段階でキャッシュする習慣にしたほうがいいかな、と。そのうち多機能にします。

```php
function file_get_contents_cache($url){
    $cache_path = "cache/".md5($url);
    if( file_exists($cache_path) ){
        $contents = file_get_contents($cache_path);
    }else{
        $contents = file_get_contents($url);
        file_put_contents($cache_path,$contents);
    }
    return $contents;
}
```
chainerのDCGANのサンプルを使って自前のデータを生成してみた

# やりたいこと
今、はやりのDCGANの中身については、以前個人的に勉強してなんとなく中身は理解できているので、
ちょっと使ってみたいけど、実装を自前でするのはつらい...
とか思ってたら、chainerさんのgithubのexampleの中にあるではないか！？

これは使ってみるしかない！と思い使ってみたのと、少し自分なりに使いやすいように
改良(いや、改悪？）してみました。

DCGANについては、いろいろと解説しているページがあるのでそちらを見てください

# DCGANの学習
chainerさんのインストールをして、学習
自前のデータセットはchainerのバージョンが1.2とかそんくらいに
「あ」「い」「う」「え」「お」の認識をしようと思って作ったものを利用
`python -h train_dcgan.py`とすると、`-i`オプションでデータセットを指定できる！すばらしい

ということで、早速開始
`python train_dcgan.py -g 0 -i ../mydataset/ --snapshot_interval 500 --display_interval 100`

実行すると、なんと今、全体のうちどれくらい学習が終わっているかとか、
あとどのくらいで学習が終わりそうかなどが出力される
これまた感動...!

そして、学習が終わると`result/preview`フォルダに画像が

![image00002000.png](https://qiita-image-store.s3.amazonaws.com/0/114699/7eeec5a0-57ff-81d0-c5f3-6b10dda9e63d.png)

おおお！
上記、ちょっとソースをのぞいてみると、どうやら下記の部分で10×10のイメージ画像を、
一定のインターバルで出力している模様

```
101     trainer.extend(
102         out_generated_image(
103             gen, dis,
104             10, 10, args.seed, args.out),
105         trigger=snapshot_interval)
```

ということは、out_generated_imageを参考にすればできそう！
ということで、Let's try!

# 学習したGeneratorから任意の枚数の画像を個別に出力する
コードはgithubにコードおいてます。

`https://github.com/komorin0521/chainer_myexample/tree/master/dcgan_generator`

まず、generatorは、`train_dcgan.py`の`-r`のコードを参考に、Generatorをロードするようにしてます。
出力はサンプルの`visualize.py`を参考にさせてもらいました。
そうすると、任意の枚数の画像が生成できた！
下記、サンプルです。

![image_gen_0001.png](https://qiita-image-store.s3.amazonaws.com/0/114699/b53c5ff3-9ae2-7b7f-3bee-f6cc672a244a.png)


![image_gen_0002.png](https://qiita-image-store.s3.amazonaws.com/0/114699/fb537d3e-3cc6-4fac-6878-ade4f0eb2055.png)

![image_gen_0003.png](https://qiita-image-store.s3.amazonaws.com/0/114699/606f279d-d38e-4a97-9c01-0fe1852bbe8a.png)

うおおお！すごい。と感動しっぱなしでした。笑

# 参考
- chainer
    https://github.com/chainer/chainer
私のプレゼン考

勉強会で発表しなければならない、という手段が目的に変わりそうなフェーズを経たため、プレゼン形式の再考。自分向けメモ書き。

恥ずかしいので公開するか悩んだが、別件で既に何件かお蔵入りしてて悩むと公開されない実績があるので悩んでるうちに出す。

(投稿ボタンを押す直前に気付いたけど、プログラミングに関することではないのでこの記事消されるのではッ……？！)

---

# プレゼン


## 目的を見失わない

プレゼンを行う目的を見失わないようにする。
スライド作成や話題の展開などの些事に気をとられて意外と目的を見失いがち。最後まで「このプレゼンをする意味は何か？　どういう必要性があるのか？」という自問を徹底する。

目的はプレゼンのあらゆるフェーズに影響する。
プレゼンのテーマを決めるのは目的を達成するためのはずだし、プレゼンの構成は目的に向かっての一本道になっているはず。

プレゼンによって各種具体的な目的が設定されるはずだが、一般化するとしたら以下。

- 聞き手に知識を与える
- 聞き手の行動を引き出す

目的が達成できなければ意味がない。全ては目的を達成するために工夫する。


## プレゼンは聞き手に優しく

プレゼンは他のコミュニケーション方式の中で選択されなければならないのは、話者より聞き手の方の時間が貴重である場合だ。
例えば聞き手が多数だったり、偉くて忙しい人だったり、自由意志で参加しているメンバーだったりする場合は、プレゼンによるコミュニケーションを選択する必要が出てくる。
そういった話者と聞き手の時間コストの非対称性がないのであればプレゼンを選択する必要ない。相談や議論といった形のほうが双方向でコミュニケーションが取れるし、書類・説明書といった形の方が使いまわしができて話者がその場にいる必要がない。

それゆえにプレゼンは短く、聞き手にとってわかりやすくなければならない。
発表内容に対して話者が体系立てて整理できていないのであれば、プレゼンという形式を選択する必要がない。整理できていない情報は聞き手の時間コストを削減しているとは言えずプレゼンを選択する目的を達成していない。許されるなら相談・議論という形にするか、許されないなら早急に整理するべきだ。
逆に、プレゼンを要求されるのは (話者の時間コストを度外視してでも) 聞き手の時間コストを最小限にしろ、ということだし、プレゼンを要求するときはそういう非対称性を考慮した上でなければならない。

また、聞き手の分析は重要。
聞き手がどんな人達なのか・どんな背景なのか・どんな知識/考えを持っているのか分析しておかなければならない。コミュニケーションの基本。


## トップダウンで構成する

わかりやすい説明は構成がスッキリしているものだ。
説明が話者の思考を他人に完全にトレースさせられるものであれば直列化された思考が再現されるだけなので構成は気にしなくても良い。しかし、実際は完全には再現されず些末なズレが起きるため「現在の説明の話題の中心」をベースにブレが起きる。そのため、構成を正しくとらないと説明の時系列に沿った思考の展開を聞き手に与えることができず、話者と聞き手の間で思考のズレが起き、わかりにくさに繋がってしまう。

構成をスッキリさせるため、プレゼンの資料の作成は骨格となる構成を考えるところから始めるべきだ。
最初に構成を決めてしまわないと些末な問題に気を取られて構成が曖昧になりがち。
逆に言えば、プレゼンの内容を決定する検討段階では資料作成はまだで、話者の中できれいに整理ができた後に資料作成に取り掛かるべきである。意識的にフェーズを分け、構成を作成するという具体的なアクションにするべき。

骨格となる構成ができたら、それに説得力や影響力を持たせるために肉付けする。
肉付けにはうまい例え、数字などの具体的データ、生の声、などを用いる。話者はより確実にプレゼンの目的を達成するために肉付けを必要とする。
基本的にはプレゼンの時間は足りないものだが、時間の許す限り肉付け部分を増やし目的達成の確実度を高める。


## ビジョンを示す

聞き手への動機づけとして大きな役割を果たすのが「なぜ」の部分だ。プレゼンでは「なぜ」の部分を共有するためにはじめの部分で話者のビジョンについて話すことになるだろう。
ビジョンとは設定したプレゼンの目的を達成する事で得られるはずの未来予想図だ。プレゼンの目的というのは壮大な未来予想図に対して、具体的な事を解決するために設定される場合が多い。そのためプレゼンの目的を直接するだけでは聞き手から共感を得られない可能性がある。そのためプレゼンの目的を「なぜ」で分解し、未来予想図を共有して聞き手から共感を得る。(こういった「なぜ」による分解は再帰的に繰り返され得るが、ここでは聞き手から共感を得られるところまで分解できれば良いとする)

ビジョンはわくわくするもの、幸せなもの、楽しいものでなければならない。
プレゼンにおける以後の全ての話題の動機となるため聞き手が共感し同じ目的を持てるものでなければならない。ここで聞き手に疑問を持たれるようなビジョンを示すと、本来のこのプレゼンの目的である以後の説明が全て意味をなさない。


## コアのメッセージを磨く

繰り返しになるがプレゼンの目的を忘れてはならない。目的を達成するために伝えなければならないメッセージがあるはずだ。
なるべくプレゼン後にプレゼンを思い出してもらい、できればプレゼンを広めてもらえるようにするために「今回のプレゼンはどういう内容かを説明できる短いメッセージ」を作りたい。
極限はワンフレーズだ。「このプレゼンで伝えたいことは〇〇です」と一文で言えるぐらいに削りたい。

キャッチフレーズ、キャッチコピーは広告業界で深く考えられている。その例を見ればたったワンフレーズが与える影響の大きさを知れる。
プレゼンも伝えたいメッセージをワンフレーズ近くまで削ぎ落として活用すれば、聞き手はそのフレーズを用いて思い出したり周囲に広めたりすることができる。

ワンフレーズはキャッチーだったり面白い言い回しのものこそ好ましいがそうでなくても良い。
ワンフレーズに与えたい役割は聞き手の整理のための端的な説明だからだ。(プレゼンが自由参加形式で聞き手を「キャッチ」する必要がある場合はプレゼンタイトルと絡めて考える必要はあるかもしれない)

考えたワンフレーズは印象づけるためにプレゼン中に何回か言うべきだ。
コアのメッセージなので登場できる機会は豊富にあるはずだし、何度言っても問題ないはずだ。

---

ちょっと見直したところ、発表中の振る舞いとかごっそり抜けてて「やっぱりな」感があっていい。書くと気付きがある。
Java8のお勉強(StringJoinerとjoin)

サンプル

```java
import java.util.StringJoiner;

/**
 * Stringのjoinメソッドと、StringJoinerの勉強
 * @author komikcomik
 *
 */
public class JoinTest {

	public static void main(String[] args) {

		String[] strs = {"a","b","c"};
		String joinStr = String.join(",", strs);
		System.out.println(joinStr);

		StringJoiner sj = new StringJoiner(",");
		joinStr = sj.add("X").add("Y").add("Z").toString();
		System.out.println(joinStr);
	}

}

```

結果

```
a,b,c
X,Y,Z
```

定型フォーマットに整形したい場合なんかに便利かもですね。
Raspberry PiでOrkAudioを動かす

# 前書き

Oreka自体は主に通話録音をするOrkAudioと、通話録音したデータを収集するOrkTack、
通話録音したデータの管理をするOrkAudioの3つのソフトウェアで構成されています。

今回は通話録音をするOrkAudioをRaspberry Piで動作させます。
なお、今回の構成はミラーポートで取得したSIP/RTPパケットをOrkAudioで解析する構成です。
構成図はそのうち追記します。

# 環境

- Raspberry Pi
    - 今回はRaspberry Pi 2で試しますが、3でも動作することを確認しています。
    - OS: Raspbian
- USB NIC
    - ミラーポートから取得するため、イーサネットのインターフェースが2つ必要となります。

# 前提パッケージのインストール

```
# apt-get install -y automake libtool subversion \
 libspeex-dev liblog4cxx10-dev libace-dev libboost-dev \
 libpcap0.8-dev libxerces-c2-dev libsndfile1-dev
```

# ソースコードの取得

```
% svn checkout https://svn.code.sf.net/p/oreka/svn/trunk oreka-svn
```

# 共通ライブラリのインストール(orkbasecxx)

```
% cd oreka-svn/orkbasecxx/
% libtoolize --force
% aclocal
% automake -a
% make -f Makefile.cvs
% ./configure LIBS="-ldl"
% make
# make install
```

# OrkAudioのインストール

一部コンパイルが通らないため、パッチを当てます。

```
% cd oreka-svn/
% wget https://gist.githubusercontent.com/tatsuyaueda/c74af3fd6eb75fc9059e012e3012ed01/raw/3ea6337ce9f0aa976f91c1f06480a3c523ea847f/patch
% patch -p1 < patch
% cd orkaudio/
% libtoolize --force
% aclocal
% automake -a
% make -f Makefile.cvs
% ./configure LIBS="-ldl"
% make
# make install
```

# 設定

```/etc/orkaudio/config.xml
        <!-- 録音した音声ファイルの保存先 -->
        <AudioOutputPath>/var/log/orkaudio/audio</AudioOutputPath>

        <!-- 録音した音声ファイルのフォーマット -->
        <!-- Audio file storage format: choose from: native, gsm, ulaw, alaw, pcmwav -->
        <StorageAudioFormat>pcmwav</StorageAudioFormat>
        <!-- 総受話分離のステレオ形式にする場合は下記の2行が必要 -->
        <StereoRecording>true</StereoRecording>
        <TapeNumChannels>2</TapeNumChannels>

        <!-- OrkTrackerのホスト名とポート番号 -->
        <TrackerHostname>192.168.50.3</TrackerHostname>
        <TrackerTcpPort>8022</TrackerTcpPort>

        <VoIpPlugin>
                <!-- キャプチャするネットワークデバイス -->
                <Devices>eth0</Devices>
        </VoIpPlugin>
```

# 起動スクリプト

Typeをforkingにして動かす方法が良く分からないから、とりあえず動くところまで。

```/etc/systemd/system/orkaudio.service
[Unit]
Description=OrkAudio
After=network.target

[Service]
Type=simple
#PIDFile=/var/log/orkaudio/orkaudio.lock
WorkingDirectory=/var/log/orkaudio
ExecStart=/usr/sbin/orkaudio debug
#ExecStop=/bin/kill -WINCH ${MAINPID}
#TimeoutStopSec=5
StandardOutput=null

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

# 起動

```
# systemctl enable orkaudio
# systemctl start orkaudio
```
AtCoder 用の実行時の入出力例を Python でテストする

昨日、ふと思い立って AtCoder の [Beginner Contest 075](http://abc075.contest.atcoder.jp/) に参加したらボロボロだった。
打ったコードの内容はともかくとして、提出前の動作確認が非常に面倒だった。
自分は C++ で参加していたので、コンパイル後に毎回実行して、毎回同じデータを入力して、毎回出力を確かめて……という作業が、なんというか、煩雑。なので、自動化してみよう。
やりたいことは、動作確認データの標準入力の自動化と、その後の標準出力の結果判定。そして複数例の動作確認を一度に。これをできればコマンド一発で判定して欲しい。
というわけで Python を使ってやってみた。 [practice contest](http://practice.contest.atcoder.jp/) ページの[練習用問題 #A](http://practice.contest.atcoder.jp/tasks/practice_1) の解答プログラムが既にコンパイル済みで、入出力の確認をする、という想定。入力例と出力例はスクリプト本体に文字列として埋め込む。間違った場合のみ、プログラムからの出力をそのままコンソールへ出力する。

```python:practice.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess

Example = (
# 入力例1
("""1
2 3
test""",
# 出力例1
"""6 test"""),
# 入力例2
("""72
128 256
myonmyon""",
# 出力例2
"""456 myonmyon"""),
)

Program = "./a.out" # コンパイル後の実行ファイル名

def SampleAnswerDiff(sample, answer) :
	p = subprocess.Popen(Program, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
	p.stdin.write(sample.encode ('utf8'))
	p.stdin.close()
	result = p.stdout.read().rstrip()
	if result != answer.encode('utf8'):
		return "NG...\n" + result.decode('utf8')
	return "OK!"

if __name__ ==  "__main__":
	for s, a in Example:
		print (SampleAnswerDiff(s, a))
```

Mac OS 10.11.6, Python 3.6.1 で動作確認済み。
できれば入力例も出力例も、ウェブページからコピペしたものをそのまま使えるようにしたい。文字列化のためのクォートを前後にそれぞれ挿入するのが、ちょっと泥臭く感じる。ここのコピペで些細な事故が起こってしまった場合、原因に気付かないままプログラムを修正し続けてしまって精神力持って行かれそう。そんな事故の可能性があるような実装はできれば避けたい。
どうせ Python を使うならコンパイルも含めてテストと同時にやってしまった方が良いのかもしれない。でも個人の趣味としては、コンパイル時の問題と実行時の問題は分けて扱いたい。何より、コンパイル時のエラーはコンパイラ様が色もインデントもキレイに整理して表示して下さっているので、その恩恵に与りたい。
というかわざわざ Python を使わなくても、シェルスクリプトの方がこういう作業には向いているんじゃないかな。詳しくないけどなんとなくそう思った。
詳しい人がいらっしゃいましたら、お教え頂けるとありがたいです。
Riot.jsで配列を飛ばしつつ回すと、正しいインデックスが取れない

Riot.jsを使っていろいろ組んでいたのですが、ちょっと想定外の挙動を食らってしまいました。

# `each`

Riotのタグ内では、`each`を使って配列を展開することができます（オブジェクトにも使えますが、今回の話題と関係ないので、とりあえずそちらは省略します）。

[公式ガイド](http://riotjs.com/ja/guide/#%E3%83%AB%E3%83%BC%E3%83%97)にも例が上がっていますが、

* `each={ arr }`…`arr`の中身をオブジェクトとしてタグ内に展開
* `each={ item in arr }`…`arr`の各要素を`item`として取得できる
* `each={ item, i in arr }`…`arr`の要素は`item`、インデックスは`i`として取れる

というようになっています。ただ、実際には最後のものに落とし穴がありました。

# 配列を飛ばしてみた

Riotのタグ内で直接使える制御構造は`each`と`if`だけですが、「`each`で回しつつ、`if`で一部だけ取る」ようなことをしたくなることがあります。それでは実際にやってみましょう（[バグ報告のPlunker](http://plnkr.co/edit/U4nAZ8F06CsRPH6wYb1G?p=preview)より引用）。

```html:my-tag.tag
<my-tag>
  <div each={label, i in labels} if={i!=0} >{i} : {label}</div>
  <script>
    this.labels = ['a', 'b', 'c']
  </script>
</my-tag>
```

この`<my-tag>`をマウントすると、なんと「0:b、1:c」という表示になってしまって、配列のインデックスではなく**表示される分だけのインデックス**となってしまいます。

# 回避策
とりあえず、「値が（バラバラなオブジェクトなど）全部違う」場合には、`each`で取るインデックスの代わりに、`Array.prototype.indexOf`で配列から探すことで、応急措置にはなります（配列を走査するコストは発生しますが）。

# 外部リンク
* [riot/riot #2412 Loop an array with item, index pair, if skip some row, the index do NOT skip.](https://github.com/riot/riot/issues/2412)
Java8のお勉強(Optional)

Optionalのお勉強です
サンプル

```
/**
 * オプショナルのお勉強
 * @author komikcomik
 *
 */
public class OptionalHello {
	public static void main(String[] args) {
		String nullです = null;
		String nullじゃないよ = "abc";

		if (Optional.ofNullable(nullです).equals(Optional.empty())) {
			System.out.println("nullでした");
		} else {
			System.out.println("nullじゃなかったよ");
		}

		if (Optional.ofNullable(nullじゃないよ).equals(Optional.empty())) {
			System.out.println("nullでした２");
		} else {
			System.out.println("nullじゃなかったよ２");
		}

		Optional.ofNullable(nullです).ifPresent(s -> System.out.println(s));
		Optional.ofNullable(nullじゃないよ).ifPresent(s -> System.out.println(s));
	}

}
```

実行結果

```
nullでした
nullじゃなかったよ２
abc
```

今回例がイケてないですが実際にはメソッドの戻り値にOptionalを使うといいみたいですね。