OmniAICreator/Qiita-1.07M huggingface dataset:
Android Thingsを触ってみる


[Android Things](http://jp.techcrunch.com/2016/12/14/20161213google-launches-developer-preview-of-android-things-its-new-iot-platform/)が気になっているので、[Getting Started with the SDK Preview](https://developer.android.com/things/preview/index.html#get_familiar_with_android_development)を参考に触ってみます。

# はじめに

私は、Androidアプリ作成経験なし、Javaを使ったプログラミングもほぼ経験なし。という状況です。

今回使用する環境は下記の通りです。

* MacBookAir
	* MacOS10.11
	* Android Studio 2.2.3
* RaspberryPi3


# Android Studioのinstall & アプリ作成

Androidアプリを作成したことないので、Android Studioのinstallから始めます。
[Android StudioでAndroidアプリを作成](http://qiita.com/snumano/items/35b66234adf37f6fd847)

# Raspberry Pi3に、Android Things imageをinstall & 起動

基本的に下記の手順通りにすすめます。
https://developer.android.com/things/hardware/raspberrypi.html

ポイントは下記。

* 該当のzip fileをMacで解凍する場合、unzipではうまく解凍できないので、私は、p7zipを使用しました。(上記手順で`The Unarchiver `が紹介されていることを後で気づきました)

 ```
 brew install p7zip
 7z e androidthings_rpi3_devpreview_1.zip
 ```

* Raspberry Pi3に、imageを入れたmicroSDカードを挿入し、イーサネットのケーブルを接続して、電源をいれると下記の画面になります。
	* 画面はこれ以上は変化ありません。
	* 最初は、イーサネットでDHCPでIPが割り当てられます。(最初は、wifi側はIPは割り当てられていません。下記画像はadbコマンドでwifi設定後のものです)

![IMG_6343.JPG](https://qiita-image-store.s3.amazonaws.com/0/4779/06de65f3-d041-7a0e-6ba1-0c6fd178ca84.jpeg "IMG_6343.JPG")


* 下記を参考に、MacBookAirにてadbコマンドを使えるようにしました。
 [adbをMacのターミナルで使えるようにする](http://qiita.com/furusin_oriver/items/f956848788c7a63922bd)
 

# サンプルアプリを実行

* 下記を参考に実際に、AndroidThingsアプリを作成しました。AndroidThingsのイメージがやっとできました。
[Android Things 用の空のプロジェクトの作り方](http://qiita.com/KazuyukiEguchi/items/7f90d03b5768fb646afd)

* AndroidStudioのlog(logcat)に、無事、Available GPIOの情報が出力されました。

![androidstudio.png](https://qiita-image-store.s3.amazonaws.com/0/4779/7a7c9a5a-b1f5-9800-e123-5b26c8359c5f.png "androidstudio.png")


* 参考までに、上記AndroidThingsアプリをRaspberryPi3にinstall後の画面は下記の通りです。
	* アプリのUIとしては文字列を表示しているだけで、他には何もしていないので、特に面白くないです。

![IMG_6345.JPG](https://qiita-image-store.s3.amazonaws.com/0/4779/fbbefc69-50a2-2fdf-56ae-49091021532e.jpeg "IMG_6345.JPG")


# 参考

* [Android Things 用の空のプロジェクトの作り方](http://qiita.com/KazuyukiEguchi/items/7f90d03b5768fb646afd)
* [Raspberry Pi3によるAndroid Things入門](http://qiita.com/tatsu/items/dc98d600ff6c35832243)
ScalaでFizzBuzz

ScalaでFizzBuzz書いてみた。

## ifのみで単純にやってみる
```scala
def fizzBuzz(num: Int): String = {
  if (num % 3 == 0 && num % 5 == 0) {
    "FizzBuzz"
  } else if (num % 3 == 0) {
    "Fizz"
  } else if (num % 5 == 0) {
    "Buzz"
  } else {
    num.toString
  }
}
```
単純に書くとFizzBuzzと1つずつのケースを別個の分岐に書かないといけないので若干無駄。


## StringBuilder使って分岐を減らしてみる
```scala
def fizzBuzz(num: Int): String = {
  val sb = new StringBuilder
  if (num % 3 == 0){
    sb.append("Fizz")
  }
  if (num % 5 == 0){
    sb.append("Buzz")
  }
  if (sb.isEmpty) num.toString else sb.result
}
```
同じチェックを何度もしなくていいんで割と綺麗に書けた。

## パターンマッチでやってみる
```scala
def fizzBuzz(num: Int): String = {
  (num % 3, num % 5) match {
    case (0, 0) => "FizzBuzz"
    case (0, _) => "Fizz"
    case (_, 0) => "Buzz"
    case _ => num.toString
  }
}
```
パターンマッチが綺麗にかけているような気がするものの直感的ではない。
もう少しワンライナー的な書き方ができないものか。

こちらにも投稿
http://melvins-nest.com/dev/2017/01/08/scalaでfizzbuzz/
FontAwesome-For-WinForms-CSharp で 「使用されたパラメーターが有効ではありません。」

# FontAwesome-For-WinForms-CSharp で FontAwesome を使うと 「使用されたパラメーターが有効ではありません。」

C# の Windows Form プロジェクトで `FontAwesome-For-WinForms-CSharp` を使っているとデバッグ開始時に、しばしば (毎回ではない) 例外が発生する。
原因は不明だが回避できた (ている、今のところ) ので記録しておく。以下は、情報の正しさと効果をまったく保証しないので利用者の責任において使用すること。

## 使用したライブラリ
[FontAwesome-For-WinForms-CSharp](https://github.com/microvb/FontAwesome-For-WinForms-CSharp)
Thx.

## エラー情報
エラーメッセージ
使用されたパラメーターが有効ではありません。

例外発生時のスタックトレースはこんなかんじ。
>   場所 System.Drawing.FontFamily.GetName(Int32 language)
   場所 System.Drawing.FontFamily.get_Name()
   場所 System.Windows.Forms.Internal.WindowsFont.FromFont(Font font, WindowsFontQuality fontQuality)
   場所 System.Windows.Forms.Internal.WindowsGraphicsCacheManager.GetWindowsFont(Font font, WindowsFontQuality fontQuality)
   場所 System.Windows.Forms.TextRenderer.MeasureText(String text, Font font, Size proposedSize, TextFormatFlags flags)
   場所 System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.LayoutOptions.GetTextSize(Size proposedSize)
   場所 System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.LayoutOptions.LayoutTextAndImage(LayoutData layout)
   場所 System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.LayoutOptions.Layout()
   場所 System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintWorker(PaintEventArgs e, Boolean up, CheckState state)
   場所 System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintUp(PaintEventArgs e, CheckState state)
   場所 System.Windows.Forms.ButtonInternal.CheckBoxStandardAdapter.PaintUp(PaintEventArgs e, CheckState state)
   場所 System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.Paint(PaintEventArgs pevent)
   場所 System.Windows.Forms.ButtonBase.OnPaint(PaintEventArgs pevent)
   場所 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   場所 System.Windows.Forms.Control.WmPaint(Message& m)
   場所 System.Windows.Forms.Control.WndProc(Message& m)
   場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

## 回避方法

```csharp
public static void Reload() {
    PrivateFontCollection f=new PrivateFontCollection();
    f.AddFontFile( FontAwesomeTTF );
    FontAwesome=new Font( f.Families[0], Size, Style );
}
```

上記の `PrivateFontCollection` のインスタンスをクラスのフィールドに移動する。誰が、いつ呼ぶのかわからないが。

```csharp
static class Fonts {
    private static PrivateFontCollection _f=new PrivateFontCollection();
    public static string FontAwesomeTTF { get; set; }
    public static Font FontAwesome { get; set; }
        :
    public static void Reload() {
        if ( _f != null ) {
            _f.Dispose();
        }
        _f=new PrivateFontCollection();
        _f.AddFontFile( FontAwesomeTTF );
        FontAwesome=new Font( _fonts.Families[0], Size, Style );
    }
}
```

## 確認した環境

- OS: 日本語 Windows 10 Home 64 ビット (1607)
- コンパイラ: Visual Studio Community 2015 Update 3
GradleでFlywayを使うのーと

* Flyway 4.0.3
* Gradle 3.3

# build.gradle の記述

1. flywayプラグインをpluginsに追加。

以上。

```
plugins {
  id "org.flywaydb.flyway" version "4.0.3"
}
```

# 実行

```
gradle flywayMigrade -Pflyway.url="jdbc:mysql://localhost/mydatabase?useSSL=false" -Pflyway.user=myuser -Pflyway.password=mypassword
```

# メモ

JDBCドライバはたぶん別途必要なので、無かったらなんとかする。

* https://flywaydb.org/documentation/gradle/
* https://plugins.gradle.org/plugin/org.flywaydb.flyway
Unity ～他のオブジェクトからメソッド呼び出し～

#コード
CountDownTXTオブジェクトのCountDownスクリプトのCountメソッドを使いたい時

```csharp

GameObject CountDownTxt;

void Start () {
        CountDownTxt = GameObject.Find("CountDownTXT");
}

void Update () {
        CountDownTxt.GetComponent<CountDown>().Count();
}

```

他にも使いまわしたいなら

```csharp
CountDown cd = CountDownTxt.GetComponent<CountDown>();
cd.Count();

```

こんなんとかね
Unity ～手抜きカウントダウンの作り方！！～

##コード

新しくこんなん作ります

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class CountDown : MonoBehaviour {

    public float MAX_TIME = 5;
    float timeCount ;

    // Use this for initialization
    void Start () {
        timeCount = MAX_TIME;
        GetComponent<Text>().text = ((int)timeCount).ToString();
		
	}
	
	// Update is called once per frame
	void Update () {
        timeCount -= Time.deltaTime;
        GetComponent<Text>().text = ((int)timeCount).ToString();
        if (timeCount <= 1)
        {
            GetComponent<Text>().text = "スタート！！";
        }
	}
}

```

using UnityEngine.UIを追加忘れずに

Time.deltaTimeこれ書くとまぁ色々unityがうまくしてくれてマシンスペックに関係なく1秒を1秒と数えてくれます

適当なTextオブジェクトにスクリプトをadd

MAX_TIMEをパブリックにしてるからUI上で変更出来ます！
Android Kotlin : UnitTestでDagger2のコンポーネントが生成されない

暫くハマってしまったのでメモ。

# 結論

`kapt` をtestで動作させるには build.gradle に`kaptTest` の宣言が必要。 

```groovy
kaptTest 'com.google.dagger:dagger-compiler:2.7'
```

僕がハマっていたのはこれでした。

## 御託

`testCompile` 等から類推して適当に `testKapt` とかして駄目だったので、
無いのかと思っていたのが間違いでした。

*`apt` の場合は `testApt` なのに…orz*
*最近は `annotationProcessor` らしい？*

# 参考

* [Dagger 2 in Unit tests with Kotlin - Stack Overflow](http://stackoverflow.com/questions/32029302/dagger-2-in-unit-tests-with-kotlin)

* これを見てから、もしかして…ってなって調べたら早かった。
    * [android - Dagger not generating components for /test class - Stack Overflow](http://stackoverflow.com/questions/36231457/dagger-not-generating-components-for-test-class)
Unity ～BitBucketで管理～

#はじめに
Unityを複数で開発する場合やバージョン管理したい場合ありますよね
私みたいに完成目前でデータが吹っ飛ぶ悲しい事件を少しでも減らしたいです。


#アカウント登録とかインストール

サイトは
https://bitbucket.org/
ここ使います。詳しくはググってください
アプリは「Soucetree」使います
詳しくはググってください

#リポジトリ作成
![gagd.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/bf40c00b-6217-0304-0280-ec84eb3d5a9d.png)

リポジトリ作成

![agaf.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/63dd2840-afd4-91e6-a959-1ffd303d9ed8.png)
リポジトリ作成

#Unity側の設定
画像な感じに
![fafaf.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/24bf6e65-5d8c-911d-0618-5b69d1a48258.png)

![dfgzdg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/c75c209c-35c2-f643-b139-addb845b3f9e.png)

Asset SerializationをFourceTextに変更

Unity保存して一回落としとく

#SourceTree側
##リポジトリ作成
起動して新規
![ghsh.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/effe3bfa-db09-2e1c-ca55-a2f6152cf0d1.png)

保存パスを作成したunityプロジェクトのフォルダに選択
![greytret.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/90435585-707f-cb88-891f-459594ec450b.png)

これで作成

##コミット
まだコミットしてはいけないです！
作業ツリーを見ると超大量のファイルが指定されてます。
管理不要なファイルが沢山有るのでそれを除外します

![gfasgarg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/da05897c-2234-6d67-c495-8eb30d5aec91.png)

![gergrg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/f9f0e676-1817-3877-9320-5d8cb3e65e87.png)

編集を押すとテキストが開かれるので入力

```text
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd


# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage

```
ここから参考にしてます。
https://github.com/github/gitignore/blob/master/Unity.gitignore

入力終わったら保存してOK

作業ツリーのファイルがだいぶ減ったと思います
全部ステージして
![asrgrg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/d97c59ef-7027-86f6-dad9-9b2a2f1b69c6.png)

コミット

##GitBucketとヒモ付

ここのHTTPSをコピーして
![dfgseht.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/c713c1d1-24b1-01b7-cc0e-621c66ced1e4.png)

ここの追加押して
![tgrgtegr.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/ddb6b33f-a472-bc6b-3f26-20f8f4b9712a.png)

URL/パスに貼り付け
![rgreg.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/8b0d519c-d7ad-a757-50d4-2c8c959cd012.png)

リモート名はデフォルトでいいかな

これでOK

プッシュします
![gatat.PNG](https://qiita-image-store.s3.amazonaws.com/0/156510/11cf7575-c3c1-a62b-f033-4605c18beae0.png)

サイト確認したらちゃんと出来てると思います！

一応ちゃんとクローンできるか確認しといてくださいね！
自作のDocumentsProviderを直接開く

Androidで，自分で作ったDocumentProviderをIntentで直接開く方法です．
仕組みは，独自定義のMIME_TYPEでフィルタしてるだけです．

### DocumentProvider側
DocumentProviderのルートポイント実装で，DocumentsContract.Root.COLUMN_MIME_TYPESに独自のMIME_TYPEを設定しておく．

[ここ](https://developer.android.com/guide/topics/providers/document-provider.html?hl=ja)のサンプルを一部修正

```java
@Override
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
    final MatrixCursor result =
            new MatrixCursor(resolveRootProjection(projection));
    if (!isUserLoggedIn()) {
        return result;
    }

    ...

    // 画像の場合．適当な hoge とかを設定しておく
    row.add(Root.COLUMN_MIME_TYPES, "image/hoge");

    ...

    return result;
}
```

### クライアント側
```java
private static final int WRITE_REQUEST_CODE = 43;

private void createFile(String mimeType, String fileName) {
    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);

    intent.addCategory(Intent.CATEGORY_OPENABLE);

    // DocumentProvider側で定義したMIME_TYPEを指定する
    intent.setType("image/hoge");

    ...
    
    startActivityForResult(intent, WRITE_REQUEST_CODE);
}
```
npm 環境復元コネタ

# 事前処理

## ユーザー情報

```shell-session
npm config set init-author-name username
npm config set init-author-email username@example.com
```

## npmjsへアカウント登録

```shell-session
npm adduser # ユーザー情報を事前にセットしておくと、それを使ってくれるとのこと(自分はしなかった)
...
```

# パッケージ情報保存
グローバルインストールするパッケージをnpmjsのstarとして保存

```shell-session
npm star package-name
```

# 復元

## ユーザー情報は同じものを設定/もってくる

## あわせてnpmrcにnpmjsのトークンが設定されていること
```text:.npmrc
...
//registry.npmjs.org/:_authToken=ほげほげ
```

## 復元

```shell-session
npm stars | xargs npm install -g
```

`apm stars --install`みたいなことはしないんだろう(いろいろインストールする場所/状況がありえるので)
以上
borgWarp / TensorFlow / ADDA > 学習対象(input layer / output layer)の整理 > v0.1, v0.2

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

関連 http://qiita.com/7of9/items/9623e6fffec60db0baa6

TensorFlowで数値計算の処理を高速化したい。

Amazon Dash Buttonに熱中するあまり、15日ほど何もしなかった。。。

### 目指していること

線形方程式の初期値を学習して、別PC上での計算時に学習結果を用いて線形方程式を解く。
これにより、別PC上での処理が高速になる(かつ誤差も抑えられる)という見込み。


### 学習対象のマインドマップ

TensorFlowで学習することになるであろう数値を整理中。
(一番簡単な計算条件[球形]での設定)

output layerの係数が以下のマインドマップ(v0.1)に書いた通りになるだろうか。
[マインドマップ(v0.2)](https://atlas.mindmup.com/yasokada/adda_learningtarget_170108/index.html)
(マップは公開設定してから30分くらい処理がかかる。2017/04/02 11:00には見えるだろう)

~~output layerの総項目数(ノード数)は83,963個。~~
double complex型なので、実部と虚部をそれぞれ考えると167,926個程度だった。

以下のいずれかをしないと学習はうまく行かないと考えている。

- output layerのノード数を減らす
  - rvec[]は削れるだろうか
  - size parameterを減らすことで、出力の配列サイズを減らす
- input layerのノード数を増やす
  - shape informationでdipoleの配置は数万個にはなるだろう


真面目に~~83,963個~~167,926個を学習しようとしても失敗する気がする。
AutoEncoderなどで特徴を抽出して、影響力のある係数だけ残して学習する、というなど検討が必要かもしれない。
（なお、AutoEncoderは未学習のため、的外れなことを書いている可能性がある）。

そもそも、ノード数が多すぎてGTX 1070 (8GB)では計算できないかもしれない。
VSCodeあれこれ

メインエディタとしてVisual Studio Codeを使い始めてしばらく経ったが、使い方や機能拡張について後々分かるようにメモする。
Mac版を対象とするため、他環境では手順が異なることがある。
便利！と思うことがあれば追記する。

#環境
+ macOS Sierra 10.12.2
+ Visual Studio Code 1.8.1

#統合ターミナルを開く
メニューバーから、表示→統合ターミナルで開ける。
コンパイル&実行可能、cd, lsも使える。gitもOK
上でプログラム書いて、下で実行できるので便利。競技プログラミング時に良い。
ショートカットキーは `Control + Shift + @`
※動作確認：JIS配列

#Markdown
##### **Markdownファイル編集時に自動的にプレビューを開く**
[Auto-Open Markdown Preview](https://marketplace.visualstudio.com/items?itemName=hnw.vscode-auto-open-markdown-preview)を入れる。
VSCode上でショートカット`Command + p`を入力し、コマンド入力欄を出す。
そして、`ext install vscode-auto-open-markdown-preview`を入力すればインストールされる。(インストール後VSCodeの再起動をした方がいいかも)
GUIでやりたいなら、拡張機能からもインストールすることができる。

##### **改行を使いやすくする(面倒なのでスペースによる改行を要らなくする)**
参考：[VS Code 標準Markdown Extensionsで、改行を有効にする](http://qiita.com/rma/items/75f502e784b7164b8813)
Macの場合は、`/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/markdown/out`にある。
PythonでRPNの計算をしてみる(初心者向け)

## はじめに

AOJをちまちまと解いていて久しぶりに「逆ポーランド記法」に触れました。
[0087:Strange Mathematical Expression](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0087)
ということで復習がてらPythonで逆ポーランド記法(RPN:Reverse Polish Notation)を書いてみました。

## そもそも逆ポーランド記法とは

大学の授業で習ったときは「へぇ～、いちいち括弧を書かなくて済むし慣れたら使いやすそうな書き方だなぁ～」程度にしか思っていませんでした。
難しく考えなくても計算したい数字や演算子の入力をすべて待たなくても済むというだけでコンピュータとの相性は良さそうです。

また、日本人との相性も良さそうです。
たとえば
「(1 + 3) * (9 - 2)」
という普段慣れ親しんだ数式表現（これを中置記法と呼びます。）を逆ポーランド記法で記述すると
「1 3 + 9 2 - *」
のように書き換えられます。
これはつまり、
「１と３を足して、９から２を引き、それらを掛ける」
というなんとも日本語的な翻訳がなされているわけです。

Stackを使えば、記述も簡単です。
・入力が数値であればStackにPush
・入力が演算子であればStackから引数分の数値をPopして演算し、戻り値をまたPush
これを繰り返すだけです。

ちなみに、これは余談ですがなぜ「（逆）ポーランド記法」と呼ばれているのかご存知でしょうか？
僕はてっきりポーランドではこのような記述方法が一般的なのかと勘違いしていました（え？）がそうではありません。
もともとこの記述方法を考案した論理学者ヤン・ウカシェヴィチがポーランド人であったから呼ばれているそうです。
だとすれば「ウカシェヴィチ記法」などと呼ばれそうなものですが、Jan Łukasiewiczという彼の名前は当時の英国人には発音が難しかったため「ポーランド記法」とざっくりとした名称で呼ばれるようになったそうです。

優先順位を表す括弧の表記を無くすことを目的として考案されたポーランド記法が括弧の多さに定評のあるLispに採用されているのは何とも皮肉なものです。

[Wikipedia - ヤン・ウカシェヴィチ](https://ja.wikipedia.org/wiki/%E3%83%A4%E3%83%B3%E3%83%BB%E3%82%A6%E3%82%AB%E3%82%B7%E3%82%A7%E3%83%B4%E3%82%A3%E3%83%81)

## 実際にPythonで書いてみる

```python:rpn.py
def RPN(states):
    '''
    逆ポーランド記法を計算する関数
    '''
    operator = {
        '+': (lambda x, y: x + y),
        '-': (lambda x, y: x - y),
        '*': (lambda x, y: x * y),
        '/': (lambda x, y: float(x) / y)
    }
    stack = []
    print('RPN: %s' % states)
    for index, z  in enumerate(states):
        if index > 0:
            print(stack)
        if z not in operator.keys():
            stack.append(int(z))
            continue
        y = stack.pop()
        x = stack.pop()
        stack.append(operator[z](x, y))
        print('%s %s %s =' % (x, z, y))
    print(stack[0])
    return stack[0]

def test():
    print("OK" if RPN("37+621-*+") == 16 else "NG")

if __name__ == '__main__':
    import sys
    RPN(sys.argv[1])
    test()
```

```text
$ python rpn.py 37+621-*+
RPN: 37+621-*+
[3]
[3, 7]
3 + 7 =
[10]
[10, 6]
[10, 6, 2]
[10, 6, 2, 1]
2 - 1 =
[10, 6, 1]
6 * 1 =
[10, 6]
10 + 6 =
[16]
OK
```

## おわりに

復習がてらいくつかサイトを見ていたら実装にenumerate関数を使っている人が多かったので真似をしました。

```pycon
>>> a = ['a','b','c']
>>> for x in a:
...     print(x)
... 
a
b
c
```

のようなlistに対して

```pycon
>>> a = ['a','b','c']
>>> for i,x in enumerate(a):
...     print('%d : %d' % (i,x))
... 
0 : a
1 : b
2 : c
```

のような処理ができます。

お恥ずかしい話、今日まで使ったことがなかったのですがindexと要素を同時に取り出したい場合（こんかいのような場合）には非常に便利だということがわかりました。

※@shiracamusからご指摘いただき、enumerateを使わなくても実装ができました。一応残しておきますが、参考までに。

最後に全然関係ないですが、PRN計算が可能な電卓が[Amazonリスト](https://www.amazon.co.jp/RPN%E8%A8%98%E6%B3%95%E3%81%AE%E5%87%BA%E6%9D%A5%E3%82%8Bhp%E9%9B%BB%E5%8D%93/lm/R2KBMLT0XMHPJ2)にまとめられていました。

欲し...くはないかな？
『キットで遊ぼう電子回路シリーズ1』学習メモ(STEP1~STEP11)

あまりに今までソフトウェアしかやってないので、低レイヤを勉強していこうということで、学習を進める。
回路図は気が向いたら書く。

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272036/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/612e%2BQSbtbL._SL160_.jpg" alt="基本編Vol.1セット [キットで遊ぼう電子回路シリーズ1]" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272036/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">基本編Vol.1セット [キットで遊ぼう電子回路シリーズ1]</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 17.01.08</div></div><div class="amazlet-detail">キットで遊ぼう電子回路研究委員会 <br />アドウィン (2013-07-01)<br />売り上げランキング: 18,231<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272036/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

# STEP1：LEDを点灯させてみよう
![step1.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/3a763114-023c-beda-0264-0eb4f7af6d15.jpeg)

LEDを点けるだけ。抵抗挟まないと壊れるので注意

# STEP2：LEDを逆につけてみよう
つかない

# STEP3：VR（可変抵抗器）をつないでみよう
![IMG_2828.JPG](https://qiita-image-store.s3.amazonaws.com/0/50690/1ebd9d6c-e3e7-71c5-94e9-9c9a7ee0378b.jpeg)
明るさが変わる

# STEP4：オームの法則
V=RI

# STEP5：電圧の測定
![step5.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/3b9c9839-1b81-1f42-a38c-ee2ec42103f4.jpeg)
可変抵抗器の抵抗値によって変わる

# STEP6：電流の測定
電流は回路を途中で切断する

# STEP7：抵抗値の測定
Skip

# STEP8：並列回路
![step6.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/d4e7ce4e-b3a9-9ce9-ccb4-e28893dd36a6.jpeg)

# STEP9：ダイオードを利用した回路１　整流回路
![step9.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/c2177035-ac21-db39-f91c-b234924c5b05.jpeg)

# STEP10：ダイオードを利用した回路２　論理回路を学ぶ前に
電圧について

# STEP11：ダイオードを利用した回路２　論理回路　OR回路
![step11.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/dd067987-89d9-acfb-641f-befeab803abe.jpeg)
リモートデスクトップユーザーの追加方法

 
 タスクマネージャーのアイコン「サーバーマネージャー」をクリックして開く。
 <img width="1148" alt="useradd00.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/b39fa8e2-3351-fc8e-b7d3-0d3f244dbf99.png">


メニューバーより「ツール」をクリックして表示されるプルダウンメニューより「コンピュータの管理」をクリックする。
<img width="1149" alt="useradd01.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/8b148b20-5e69-786e-6440-acd5cdc4c471.png">

左ペインのツリーより、「コンピューターの管理（ローカル）」ー「ローカルユーザーとグループ」ー「ユーザー」をクリックする。
次に中央ペインにて右クリックをして表示されるメニューより、「新しいユーザー」をクリックする。
<img width="1003" alt="useradd02.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/b8db5da1-c261-d678-0c36-29a2067112f1.png">


「新しいユーザー」ダイアログボックスが表示されるので、「ユーザー名」と「パスワード」「パスワードの確認入力欄」に適宜登録情報を入力する。
<img width="1003" alt="useradd03.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/bbb5c9a4-897e-189b-45f4-841f1a4116c1.png">

次に、「ユーザーは次回ログオン時にパスワードの変更が必要」チェックボックスを外し、「作成」ボタンをクリックする。
次に、「閉じる」ボタンをクリックして「新しいユーザー」ダイアログボックスを終了する。
<img width="1000" alt="useradd04.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/8b1324fc-ee2c-18d7-bce5-df62525d0a79.png">


登録したユーザーが中央ペインに表示されていることを確認し、右上の「✖️」をクリックして「コンピュータの管理」を終了する。
<img width="1004" alt="useradd05.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/73bcd02e-6480-4997-ded9-389377aea958.png">

「サーバーマネージャー」画面の左ペインにて、「ローカルサーバー」を選択して表示された「プロパティ」画面内の「リモートデスクトップ」　のリンク「有効」をクリックする。
<img width="1150" alt="useradd06.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/80b83776-14e4-cd44-1dcc-c65322e6df10.png">

「システムのプロパティ」ダイアログの左下の「ユーザーの選択」をクリックする。
<img width="488" alt="useradd07.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/5edf541e-5a86-01ab-2d25-db1a190ac841.png">

「リモートデスクトップユーザー」ダイアログが表示されるので、「追加」をクリックする。
<img width="492" alt="useradd08.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/07e6fa4a-41ba-5144-830a-b0b49170c3bd.png">

「選択するオプジェクト名を入力してください」入力ボックスに登録ユーザーを入力して「OK」をクリックする。
<img width="580" alt="useradd09.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/563f4843-ecda-b36a-f88b-03aeddd2e0e1.png">

と画面の通り一覧に登録したユーザーのアイコンが表示されていることを確認したら「OK」でダイアログを閉じます。
次に表示される「システムのプロパティ」ダイアログボックスの「OK」をクリックします。
<img width="490" alt="useradd10.png" src="https://qiita-image-store.s3.amazonaws.com/0/66142/694799fe-8b6e-37ed-f68a-80a4c657a7f4.png">

以上で完了です。
畳み込みニューラルネットワークとは

#画像が比較したい！
例えば，次の画像があったとします．
![cross.png](https://qiita-image-store.s3.amazonaws.com/0/28622/7701901a-a37b-8172-f4e2-62ede6147a4b.png)
ピクセルでバツを表現しています．
バツですね．

では，次の画像はどうでしょうか？

![cross_2.png](https://qiita-image-store.s3.amazonaws.com/0/28622/4043d4c8-7684-65e8-36bb-c5de2671c71f.png)

バツと言えないこともありません．まあバツです．では，これをコンピュータにわかってもらうためにはどうしたらいいのでしょうか？

そこで，畳み込みニューラルネットワークの出番です．

#畳み込み演算とは？
ニューラルネットワークの特徴は，人間が指定しなくとも特徴を見つけてくれることです．では，その特徴をどのように使って画像同士を比較したらよいのでしょうか？

例えばバツは次の特徴を持っています．

![cross_4.png](https://qiita-image-store.s3.amazonaws.com/0/28622/b23f6461-c430-0f85-166e-3f4bdba8e0b7.png)

ここで，このピクセルは白か黒なので，白を-1，黒を1とします．するとバツの画像は
![cross_5.png](https://qiita-image-store.s3.amazonaws.com/0/28622/36ad4f6a-787a-4951-3d17-4360080a115a.png)


特徴は
![cross_6.png](https://qiita-image-store.s3.amazonaws.com/0/28622/524a408c-d579-d78a-8c59-d0ed2e000d92.png)


と，表現することができます．

ここで，
![cross_4.png](https://qiita-image-store.s3.amazonaws.com/0/28622/ea0f9e17-57e6-6033-74bc-7fb734328e25.png)
この部分を比較計算してみます．
対応するセル同士を計算します．
つまり，
合致すれば
1(黒) × 1（黒） = 1
1(白) × 1（白） = 1
1になり，
合致しなければ
-1（白） × 1（黒） = -1
1(黒) × -1（白） = -1
-1になります．

計算した結果を表現すると，
![cross_8.png](https://qiita-image-store.s3.amazonaws.com/0/28622/cf995353-9b46-b818-98df-d4fa9be9ffa6.png)

最終的にそれぞれのセルの値を足したものをピクセルで割ります．つまり，合致すればするほど値が1に近づきます．
この場合，完全合致なので1です．
この一連の演算を「畳み込み演算」といいます．

今回の場合，画像のセルが9×9マス，特徴が4×4マスなので，パーツを1マスずつずらしくいくと，その計算結果は6×6マスになります．（計算結果はでたらめなので信用しないでください）
![cross_10.png](https://qiita-image-store.s3.amazonaws.com/0/28622/0492e025-6914-854a-1cc3-10a6daf3b7e0.png)


こうして得られたものを特徴マップといいます．

こうして画像がどれだけ特徴をもっているのかを数値的に測ることができます．
この演算自体はとても単純なものです．しかし，これが9×9の荒い画質ではなく，標準的な画質の画像となったとき，その計算量は膨大なものになります．GPUを使わないと学習にかかる時間が大変なことになるのはこのためです．

#おわりに
今回は畳み込みとはどういったことか書きました．
まだ私も理解が浅いため，間違ったことを書いていたらご指摘ください．

#参考
山下隆義
イラストでわかるディープラーニング 講談社

斎藤康毅
ゼロから作るDeep Learning

畳み込みニューラルネットワークの仕組み
http://postd.cc/how-do-convolutional-neural-networks-work/
XquartzでIndirect GLXを有効にする


[2.7.10のChangeLog](https://www.xquartz.org/releases/XQuartz-2.7.10.html)に書いてあるとおり、`defaults write org.macosforge.xquartz.X11 enable_iglx -bool true`すれば良いです。
普段はChangeLogはスルーしているので、まったく意識していませんでした…


`openrave.py --example hanoi`がvagrant ssh上で通らず、はまっていました。(経緯はまだ語れませんが)
Debian jessieではこれで通りますが、wheezyはどうなのか、微妙にエラーが違うのでわからずじまいです(SSDの容量が足りず、vagrant destroyしてしまった)。
使いたいPHPバージョンに合わせて Laravel Homestead を選ぼう

[Laravel Homestead の第３の使い方](http://qiita.com/makies/items/49e67dfa3abfd4394998)で紹介した方法を使うと、Homestead のバージョンによってインストールされるPHPのバージョンも切り替えることができます。


|  **homestead** | **Ubuntu** | **PHP** | **MySQL** |
|  ------ | ------ | ------ | ------ |
|  2.2.2 | 14.04.3 LTS | PHP 5.6.13-1 | mysql  Ver 14.14 Distrib 5.6.19 |
|  3.1.0 | 16.04.1 LTS | PHP 7.0.13-1 | mysql  Ver 14.14 Distrib 5.7.16 |
|  4.0.3 | 16.04.1 LTS | PHP 7.1.0-2 | mysql  Ver 14.14 Distrib 5.7.16 |


# PHP 5.6

```composer.json
{
    "require-dev": {
        "laravel/homestead": "^2.0"
    }
}
```

```bash
$ php -v
PHP 5.6.13-1+deb.sury.org~trusty+3 (cli)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans
    with blackfire v1.4.1, https://blackfire.io/, by SensioLabs
```


# PHP7.0


```composer.json
{
    "require-dev": {
        "laravel/homestead": "^3.0"
    }
}
```
```homestead.yaml
---
ip: "192.168.10.10"
memory: 2048
cpus: 1
hostname: homestead
name: homestead
provider: virtualbox
version: 0.6.0  # boxバージョン指定が必要
```

```bash
$ php -v
PHP 7.0.13-1+deb.sury.org~xenial+1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.13-1+deb.sury.org~xenial+1, Copyright (c) 1999-2016, by Zend Technologies
    with blackfire v1.14.1~linux-x64-non_zts70, https://blackfire.io, by Blackfireio Inc.
```


# PHP7.1

```composer.json
{
    "require-dev": {
        "laravel/homestead": "^4.0"
    }
}
```


```bash

$ php -v
PHP 7.1.0-2+deb.sury.org~xenial+1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.1.0-2+deb.sury.org~xenial+1, Copyright (c) 1999-2016, by Zend Technologies
    with blackfire v1.14.1~linux-x64-non_zts71, https://blackfire.io, by Blackfireio Inc.
```
マルチシグの仕組み（P2SH方式）

# マルチシグ

複数の公開鍵と必要な署名の数を設定したアドレスを作り送金時に複数の署名を要する仕組み
ここでは2of3をベースに記載

## 複数の公開鍵からビットコインアドレスを生成する流れ

```
Pubkeys -> Redeem Script -> Locking Script -> Script Pubkey -> Bitcoin Address
```

* アドレスが３から始まるのはBIP13で決めているから。

```
base58-encode: [one-byte version][20-byte hash][4-byte checksum]
The leading version bytes are chosen so that, after base58 encoding, the leading character is consistent: for the main network, byte 5 becomes the character '3'. For the testnet, byte 196 is encoded into '2'.
```

## Pubkeys

* マルチシグアドレスを生成するために用意する公開鍵のリスト
* ソートされている必要がある

## Redeem Script

* 最大15個まで公開鍵を設定できる
* 公開鍵の数だけスクリプトのサイズが大きくなる
* (3 + (34 * n)) byte -> 2of3なら105byte

```
OP_2(0x52) pubkey1 pubkey2 pubkey3 OP_3(0x53) OP_CHECKMULTISIG(0xae)
```

## Locking Script (scriptPubKey)

* アドレスに含まれる公開鍵に代わるスクリプト（scriptPubKey）
* P2SHとして扱うのでハッシュ化している
* 23byte 固定

```
OP_HASH160 HASH160(Redeem Script) OP_EQUAL
```

## Unlock Script

* トランザクションに含まれる実際の署名
* 実際にトランザクションをブロードキャストしない限りRedeemScriptは外部に公開されない
* つまり一度も送金したことがないマルチシグアドレスは外部からいくつの鍵を設定しているかわからない

```
OP_0(0x50) Sig1 Sig2 Redeem Script
```

# 参考資料

* [ビットコインにおける「マルチシグ」とは](http://www.slideshare.net/JonathanUnderwood/ss-45128655)
* https://en.bitcoin.it/wiki/Transaction
* [BIP13, Address Format for pay-to-script-hash](https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki)
* [BIP16, Pay to Script Hash](https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki)

# 個人的な所感

* マルチシグはスクリプトの仕様はシンプルなのだが運用にたくさん課題があり大変
* 自前の仕組みでウォレットを作った場合は未署名トランザクションをincomplete状態で署名を追記してほかの人に渡す必要があるがそれをどう受け渡すか、どう知らせるか、どう承認してもらうか、いつビットコインネットワークにながすか。
* 受け手のトランザクション手数料が高いので手数料以下のスパム攻撃を受けやすい（inputがたくさんあると引き出す時に不利な仕様のため）

# 実装や利用例

* copay
* bitgo
* lightning network


# hdwalletとの組み合わせ

* [BIP45, Structure for Deterministic P2SH Multisignature Wallets](https://github.com/bitcoin/bips/blob/master/bip-0045.mediawiki)
# 新橋で日曜にチョイ呑み

## 信州おさけ村
[東京都港区新橋２-２０-１５ 新橋駅前ビル１号館 １F](https://goo.gl/maps/hYg3DCkTWFt)
* 信州黄金シャモもも肉燻製で、酒をクイっと軽くやろう！！

## ぼんそわ
[東京都港区新橋４-１５-５](https://goo.gl/maps/Y94dWLuqrbC2)
* マスカルポーネおかか
* 半熟卵のスタミナ漬け
* カツオ辛子漬け
* いかわたあえ

## Standing 焼酎 Bar 立
[東京都港区新橋３-１３-２ 新共ビル１F](https://goo.gl/maps/aYXNa9xLgRS2)
* 黒糖焼酎のソーダ割り！！
* しめサバ
* キビナゴ
* 白レバー

## 立ちのみ　新橋以蔵
[東京都港区新橋２-９-１ 青葉ビル１F](https://goo.gl/maps/RJMxYDTUKNU2)
* 龍馬の兄弟店だそうだ！！

## 根室食堂 新橋店
[東京都港区新橋2-18-4 磯部ビル](https://goo.gl/maps/8ooBpVrkboy)

```Text
2017/1/8(日) 21時頃 1人でGo！
さすがにガラガラ。2階に通され、4人グループ1組だけ。
お通しのカブの漬物は美味い！
黒ムツ天ぷら、真イカ刺身、ブリとニンニク・芥子菜のヌタ。
生ビール、国士無双ワンカップ、北の勝ワンカップ。
¥4,000- 満足度に比して高い印象。
```

<br>
---
以上
CentOS7へGitLabを導入する

Githubのような環境を自作してみたく調べたところGitLabが良さそうだったので構築してみた。
ネットの情報ではすぐできると書かれていたけれど意外と詰まったので覚書

# 環境
* KAGOYA VPS  
* CentOS 7（初期化済み）

# 手順
* 基本的には以下の本家サイトに沿って構築
    * https://about.gitlab.com/downloads/#centos7

## 必要なパッケージを事前に導入

```
sudo yum install openssh-server
sudo systemctl enable sushi
sudo systemctl start sushi
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
sudo yum install firewalld
sudo systemctl start firewalld
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
```

## GitLabのパッケージを取得、インストール

```
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce
```

## 設定ファイルを更新
* 設定ファイルの更新については触れていないとこが多い
* すでにあるWebサーバとかと連携するケースとか色々あるため書いてない？
* 今回はpostgresもnginxも入れたいので、両方設定が必要かと思いきやpostgresの設定だけコメントを外すことで動く

```
vim /etc/gitlab/gitlab.rb 
```
```
#####################
# GitLab PostgreSQL #
#####################

 postgresql['enable'] = true
 postgresql['listen_address'] = nil
 postgresql['port'] = 5432
 postgresql['data_dir'] = "/var/opt/gitlab/postgresql/data"
 postgresql['shared_buffers'] = "256MB" # recommend value is 1/4 of total RAM, up to 14GB.
```

上の５項目をコメントインする。

ちなみにこれをやらないと設定読み込み時以下のエラー発生

```
* execute[create gitlab database user] action run
    [execute] psql: could not connect to server: No such file or directory
              	Is the server running locally and accepting
              	connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"?
    [execute] psql: could not connect to server: No such file or directory
              	Is the server running locally and accepting
              	connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"?
    [execute] psql: could not connect to server: No such file or directory
              	Is the server running locally and accepting
              	connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"?
```

## 設定ファイルを読み込み、起動
```
sudo gitlab-ctl reconfigure
```

通常はこれだけで管理画面へアクセスできるはずだが一つだけ引っかかった

### SELinux関係のパッケージ
```
Error executing action `run` on resource 'execute[semodule -i /opt/gitlab/embedded/selinux/rhel/7/gitlab-7.2.0-ssh-keygen.pp]'
```

調べるとメモリ不足とか、Swap領域がないためのエラーとか出てくるけれど、単にモジュールが入っていないだけだった

```
sudo yum install policycoreutils-python
```

再度実行でインストール完了

## サービスへログイン
![Sign in · GitLab 2017-01-08 18-31-11.png](https://qiita-image-store.s3.amazonaws.com/0/158765/585be514-abe0-6fae-c636-44846a0eec02.png)
Zの名を冠した圧縮形式Zstandardの基本的な使い方

# Zstandardとは?
2016年の8月にFacebookがオープンソース化した圧縮アルゴリズム。
リアルタイム圧縮を重要視しており、圧縮率を維持しながら、高い圧縮速度と伸長速度、使用メモリ量の削減を実現しているそうだ。
また特異な点として、辞書を作成することで、更に圧縮率を高めることが可能。
多様な言語(Java, Swift, Go等)で実装されているのもうれしいところ。

* 公式ページ
 * [Zstandard - Real-time data compression algorithm](http://facebook.github.io/zstd/)
* Github
 * [GitHub - facebook/zstd: Zstandard - Fast real-time compression algorithm](https://github.com/facebook/zstd)  

# インストール方法
macの場合ではhomebrewで簡単にできる。

```bash
$ brew install zstd
```

# 使い方
## 圧縮
* ファイルを圧縮する。

```bash
$ zstd inputFile
# 出力ファイル名は inputFile.zstになる
```

* 出力ファイル名を指定して、圧縮する

```bash
$ zstd inputFile -o outputFile.zst
```

* 圧縮レベル\[1-19\](デフォルト:3)を指定して、圧縮する

```bash
$ zstd -11 inputFile
```

* `--ultra`オプションをつけることで圧縮レベルを20以上にすることもできる。(最大:22)

```bash
$ zstd --ultra -22 inputFile
```

* ディレクトリ内を再帰的に圧縮  
※zstandardは圧縮アルゴリズムなので、ファイルアーカイブ機能はないです。

```bash
$ zstd -r inputDirectory
```
## 解凍
以下どちらでもOk.

```bash
# dはdecompress
$ zstd -d inputFile.zst

# unzipと同じ
$ unzstd inputFile.zst
```

# 参考
他の圧縮形式との比較はこちらを参照するといいかも。
[最強の圧縮アルゴリズム ZStandard を試す - hidekatsu-izuno 日々の記録](http://hidekatsu-izuno.hatenablog.com/entry/2016/09/09/214350)
順運動学と逆運動学

# 順運動学と逆運動学
ロボットや 3D モデルの関節を制御する方法として順運動学（Forward Kinematics）と逆運動学（Inverse Kinematics）がある。

- 順運動学 … 関節の角度から指先やつま先の位置が決まる
- 逆運動学 … 指先やつま先の位置から関節の角度が決まる

3D モデルのモーションデータは、スケルトンの各関節の SRT についてのカーブであり、これをスケルトンに適用することでモデルの姿勢が決まる。これは順運動学。

ロボットアームに何かを掴ませたり、3D モデルに何かを拾わせたりする場合、腕の先端（手）を目標の位置に持っていくために、肩や肘の姿勢をどのようにすればよいかを求める必要がある。これは逆運動学。

# 順運動学の実装
## デモ
https://keitanxkeitan.github.io/TentacleFK/
腕が揺れます。

<img width="1392" alt="TentacleFK.png" src="https://qiita-image-store.s3.amazonaws.com/0/1004/89269bd9-d0bb-8de9-4a71-76d5db8351a0.png">


# 逆運動学の実装
## デモ
https://keitanxkeitan.github.io/TentacleIK/
アローキーで腕の目標位置を操作できます。

![TentacleIK.png](https://qiita-image-store.s3.amazonaws.com/0/1004/540393ad-217f-5392-4f7d-6d82285970e4.png)

## アルゴリズム
Cyclic-Coordinate-Descent 法（CCD 法）と呼ばれるアルゴリズムを使っています。
詳細は[こちら](http://mukai-lab.org/wp-content/uploads/2014/04/CcdParticleInverseKinematics.pdf)を御覧ください。

<dl>
  <dt>長所</dt>
  <dd>ほかの IK アルゴリズムと比べて計算量が小さく、アルゴリズムもシンプル</dd>
  <dt>短所</dt>
  <dd>関節の回転可動域を設定したり、エフェクタの位置と方向を同時に指定した計算が苦手</dd>
</dl>

このような特徴があるため、人間の腕や脚のような可動域が明確に決まっている場合は使いにくいかもしれません。
一方で、イカやタコの触腕、生物の尻尾のような自由な可動域を持つ関節とは相性が良さそうです。

# ソースコード
https://github.com/keitanxkeitan/Tentacle
肝となるのは ArmController.cs です。

```C#:ArmController.cs（一部抜粋）
// CCD アルゴリズムで IK
if (armParts.Count >= 1) {
	GameObject armPart_Last = armParts [armParts.Count - 1];

	for (int i = 0; i < ccdIterNum; ++i) {
		// 末端から根本へイテレートする
		for (int iArmPart = armParts.Count - 1; iArmPart >= 0; --iArmPart) {
			GameObject armPart = armParts [iArmPart];

			// エフェクタ位置
			Vector3 posEffect = armPart_Last.transform.position + armPart_Last.transform.forward * 5.0f;
			// -MEMO- 値を決め打ちにしているが本当はロケータを置くのがよい

			// エフェクタ方向
			Vector3 dirEffect;
			{
				dirEffect = posEffect - armPart.transform.position;
				dirEffect.Normalize ();
			}

			// 目標方向
			Vector3 dirTarget;
			{
				dirTarget = ikTarget.position - armPart.transform.position;
				dirTarget.Normalize ();
			}

			// 回転角
			float rotateRad;
			{
				float dot = Vector3.Dot (dirEffect, dirTarget);
				rotateRad = Mathf.Acos (dot);
			}

			if (rotateRad > 0.001f) {
				// 回転軸
				Vector3 rotateAxis = Vector3.Cross (dirEffect, dirTarget);
				rotateAxis.Normalize ();

				// 回転
				armPart.transform.Rotate (rotateAxis, rotateRad * Mathf.Rad2Deg);
			}
		}
	}
}
```
初心者向け：WordPressでオサレで垢抜けたソレっぽいデザインを探す時に試したいワード

くぎゅう10です、

**お洒落でナウい感じのサイト作りたい！**
**HTLMとかCSSとか分からない！（PHP？美味しいの？）**
**でも、無料で、ラクにそれっぽく仕上げたい！**

そういう方は真っ先にWordPressに飛びつくと思います。

私も飛びつきました。

WordPressなら、無料で、ナウい感じに洗練された
デザインテンプレートがたくさんある、

と聞いたからです。

たくさんありすぎて迷子になるレベルでした。


なので、今回は
初めてWordPress試してみる人が
デザインテンプレートを効率良く探すための
キーワードをご紹介します。

ある程度以上WordPressを使いこなしている人には
当たり前なことかもしれませんが、御覧ください。


##レスポンシブ(responsive)
スマホでもタブレットでもPCでも
**ええ感じ**に表示してくれるデザインのこと。

PCで表示したときに、幅を

* 画面いっぱい
* モニタ半分
* モニタ４分の１くらいに細長く

と変えてみるとぐりぐりデザインが変わるのが確認できます。

イマドキのWEBサイトはみんなレスポンシブなので
とりあえずナウいデザインが欲しい時はこのキーワードで
絞り込んでおけば間違いないです。

##無料（free）
実は、WordPressは有料デザインもたくさんあります。
しかも結構高い！（$50～$100くらいが多い）

WordPressテンプレートでメシを食っている人もいるくらいです。

とりあえずWordPressビギナーのあなたは
無料のものを試してみたいと思うので、
素直に「無料」というキーワードを入れましょう。


##ミニマル(minimal)
特に文章メインのサイトを作りたい時に。

ミニマ**ム**ではないです。

みんなミニマ**ル**って言っているのでそう検索しましょう。

単にシンプルでスッキリしているだけでなく、
余計な機能がなく軽快に動作する、とか
余白をうまく使って文章を魅せることに特化しているとか、
なんかそういう感じの意味が含まれています。


##写真(photo)　または　ポートフォリオ（portfolio）
ミニマルと逆に、
写真とかイラストとかをメインに魅せたい時。

ポートフォリオとは、自分の作品群を見やすくまとめたもの、
って意味です。

素人ブログ感が無い、非常に垢抜けた、
まるでファッションサイトみたいに
洗練されたデザインが多いのが特徴。

下手に文章書かないほうが魅力的なサイトに仕上がります。
文章が苦手な人は逆にこういう系で攻めた方がやりやすいかと。

##ビジネス(business, biz)
ベーシックな、良く言えば安心する、読みやすいデザインです。
悪く言えばありきたり。

比較したことないけどSEOでも有利？

よく見るタイプなので、記事書く方も見る方もラクです。

ここがbodyで、ここが見出しで、とか
なんとなく分かりやすいので、
初めてWordPress使うなら意外とオススメです。

##中級技：英語で検索する

実は、WordPressデザインは英語の方がメチャクチャ数あります。

今までの単語を組み合わせるだけです。

> WordPress free responsive portfolio

とか。

検索結果も当然英語ですが、
全てGoogle翻訳先生に丸投げしてください。
ほぼ英語力いりません。

デザインをカスタマイズしたりする場合は
日本人ユーザーが多い方がいろいろとググりやすいので、
今回は中級技として紹介しておきます。

- - -
以上、

いかがでしたでしょうか？

WordPressなら高品質の無料デザインがたくさんあります。

うまく探しあてて、ラクラクに「ソレっぽい」サイトを
作ってください。

ある程度WordPressを使ったことある人には
当たり前すぎる内容だったかもしれませんね。

- もっといいキーワード知ってるよ！
- このデザインまじナウいぜ！

って方は、ぼくにコッソリ教えてくれると幸いです。

くぎゅう10
@kugyu10
Windows10 64bit Python3.5 へのKivy-Designerのインストール

## 概要
KivyにはKivy-DesignerというGUIデザインツールが存在します．
そのKivy-DesignerをWindowsにインストールした際のノートです．

GitHub - kivy/kivy-designer: UI designer for Kivy (WIP)
https://github.com/kivy/kivy-designer


![kivy_designer.png](https://qiita-image-store.s3.amazonaws.com/0/43136/bebdfcff-1402-6706-0d75-67a698450551.png)


このノートは基本的に以下のリンク先の手順に従っています．
参考: Installation — Kivy Designer 0.9 documentation
https://kivy-designer.readthedocs.io/en/latest/installation.html

## 環境
- Windows 10 64bit
- Anaconda 64bit
- `conda create -n py35 python=3.5`で構築されたPython環境
    - Kivy                      1.9.1
    - Kivy-Garden               0.1.4
    - pip                       9.0.1
    - python                    3.5.2
    - setuptools                27.2.0
    - vs2015_runtime            14.0.25123
    - wheel                     0.29.0

Kivy のインストールは以下より．
Windows10 64bit Python3.5 へのKivyのインストール - Qiita
[http://qiita.com/Superable/items/1ddb3aafa24d303a0b00]()


## Kivy-Designerのダウンロード
gitを使用する場合は`git clone http://github.com/kivy/kivy-designer/`で適当な場所にソースコードをダウンロードします．
gitを使用しない場合は[https://github.com/kivy/kivy-designer/archive/master.zip](https://github.com/kivy/kivy-designer/archive/master.zip)からzipファイルをダウンロードし、適当な場所に展開します．
※zipファイルから展開した場合はフォルダ名に`-master`が付くので必要に応じて変更します．

## Kivy-Designerを動作させるための環境の構築
### pipを使用して動作に必要なPythonパッケージをインストール

動作に必要なパッケージはダウンロードしたフォルダ内の`requirements.txt`に記載されています[^1]．

[^1]: 私の環境では`pip install kivy`が失敗したため、`Kivy`, `Kivy-Garden`を事前にインストールしています．[Windows10 64bit Python3.5 へのKivyのインストール - Qiita](http://qiita.com/Superable/items/1ddb3aafa24d303a0b00)

```requirements.txt
kivy >= 1.9.1
pygments >= 2.1
docutils >= 0.12
watchdog >= 0.8
jedi >= 0.9
gitpython >= 1.0
six >= 1.10.0
kivy-garden
```


以下のコマンドで必要なパッケージをまとめてインストールします．

```bat:cmd.exe
cd kivy-designer
pip install -Ur requirements.txt
```


### kivy-garden.garden.FileBrowserをインストール
`kivy-garden.garden.FileBrowser`は`Kivy`のファイル選択ダイアログウィジェットです．以下のコマンドでウィジェットをダウンロード＆インストールします．

```bat:cmd.exe
garden install filebrowser
```

※私の環境ではAnacondaをProgram Filesにインストールしてしていたため、gardenの実行がうまく出来ませんでした．
そのため上記コマンドを以下のように変更して実行しています．

```bat:cmd.exe
cd "C:\Program Files\Anaconda3\envs\py35\Scripts"
python garden install filebrowser
```


## Kivy-Designerの起動
以下のコマンドでKivy-Designerが起動します．

```bat:cmd.exe
cd kivy-designer
python -m designer
```

起動のためのバッチファイルを作成し、`kivy-designer`フォルダ内に保存して使用すると便利かと思います（※各々のPython環境への対応が必要）．

```bat:kivy-designer.bat
cd /d %~dp0
python -m designer
```


## 追記
現時点(2017/01)ではかなり動作が不安定なので、Kivy-Designer上で基本的なパーツを配置して生成されたkvファイルを参考として別途テキストエディタ等で開発を進めるのがよさそうです。


## 参考
- GitHub - kivy/kivy-designer: UI designer for Kivy (WIP)
    - https://github.com/kivy/kivy-designer
- Installation — Kivy Designer 0.9 documentation
    - https://kivy-designer.readthedocs.io/en/latest/installation.html
  
  
***
いろんな言語でラムダ式を使ってフィボナッチ数列を表現する

とある機会がありまして、いろんな言語でラムダ式を使ってフィボナッチ数列を表現してみました。

# javascript編
```js:fib.js
var fib = function(v){
  return(function(f,m){
    return f(f,m)
  }(function(r,n){
    return n < 2 ? n : r(r,n-1)+r(r,n-2)
  },v)
)}
```

# python編
```python:
$ python
>>> fib = lambda n: n if n < 2 else fib(n-1) + fib(n-2)
>>> fib(0)
0
>>> fib(1)
1
>>> fib(2)
1
>>> fib(6)
8
```

# ruby編
```bash:
$ irb
irb(main):001:0> f = lambda { |n| n < 2 ? n : f.call(n-1) + f.call(n-2) }
$ irb(main):002:0> f.call(0)
0
$ irb(main):003:0> f.call(1)
1
$ irb(main):004:0> f.call(2)
1
$ irb(main):005:0> f.call(6)
8
```

ruby 1.9から、ラムダ関数の書き方が増えたため、次のような書き方もできます（thanks @kbaba1001）
 
```ruby
[1] pry(main)> f = ->(n) { n < 2 ? n : f[n-1] + f[n-2] }
=> #<Proc:0x007fb5ac26fe58@(pry):1 (lambda)>
[2] pry(main)> f[0]
=> 0
[3] pry(main)> f[1]
=> 1
[4] pry(main)> f[2]
=> 1
[5] pry(main)> f[3]
=> 2
[6] pry(main)> f[6]
=> 8
```

# haskell
```bash:
$ ghci
Prelude> let fib = 0:1:zipWith (+) fib (tail fib)
Prelude> fib !! 0
0
Prelude> fib !! 1
1
Prelude> fib !! 2
1
Prelude> fib !! 6
8
```

# c++編
### ソースコード
```cpp:fib.cc
#include <iostream>
#include <functional>
using namespace std;

int main(int argc, char const *argv[])
{
  std::function<int(int)> fib = [&fib](const int n)  {
    return n < 2 ? n : fib(n - 1) + fib(n - 2);
  };

  cout << fib(0) << endl;
  cout << fib(1) << endl;
  cout << fib(6) << endl;

  return 0;
}
```
### 実行手順

```bash:
$ g++ -std=c++11 fib.cc 
$ ./a.out 
1
1
8
```

# vim編

### vim 8.0にアップデート

```bash:
$ apt-get install software-properties-common # if not found add-apt-repository command
$ sudo add-apt-repository ppa:jonathon/vim
$ sudo apt-get update
$ sudo apt-get install vim
$ vim --version
$ sudo add-apt-repository -remove ppa:jonathon/vim # delete PPA if needed 
```
### ソースコード
```vim:fib.vim
function! Main()
  let Y = {f -> (({x -> f ({y -> x(x)(y)})})({x -> f ({y -> x(x)(y)})}))}
  let Fib = {f -> {n -> (n < 2 ? n : f(n-1) + f(n-2))}}
  echo Y(Fib)(0)
  echo Y(Fib)(1)
  echo Y(Fib)(2)
  echo Y(Fib)(6)
```
### 実行手順
```bash:
$ vim
:source fib.vim
:call Main()
```

# 感想
ラムダ式の書き方ひとつとっても、言語によって個性がでるものですね。
個人的には、python、rubyが直感的でした。
Haskell、javascript、c++はなんとか出来ましたが、完全に文法と心を通わせきれていないうちに完成してしまいました。
vimは職場の方におすすめされて書いてみました。一番苦戦しましたが、できたときの感動は大きかったです。

他にも個性的なラムダ式があれば、教えてください :)
MSP430 | 組込み > const宣言した値の変更が反映されない理由と対処

```txt:動作環境
MSP430
組込みC
とあるIDE
```

関連 http://qiita.com/7of9/items/e00977111ade79bd9bf6

### 症状

20個程度の項目を持つ構造体を定義。
その構造体で初期値用にconst宣言していた。その項目のうち、1つの項目の値を50から20に変更した。
プログラム実行時に、その変更が反映されない(50のまま)。

補足として、上記変更作業はIDEのエディタでなく、外部エディタ(Sublime Text2)で行った。

### はまりポイント

IDEのエディタでなく外部エディタで変更した内容は、IDEのエディタ上では変更されたように見えている。
一方で、プログラムをダウンロード(MCUに書込み)時には、古い内容で書込みされていることに気づいた。

<font color=blue>**IDE上のエディタで一旦別の値に変更して、再度、希望する値に変更してダウンロードすると、変更が反映されるようになった。**</font>

IDE上でキャッシュでも残っているのだろうか。不思議な振る舞いである。

対処方法が見つかったので、これはよしとする。

### 余談

自分のプログラムのデバッグをしながら、IDEのデバッグをするのはしんどい。
GoでGoole Driveにファイルを追加


[Google Drive REST APIのドキュメント](https://developers.google.com/drive/v3/web/quickstart/go)には、GoでGoogle Driveのファイル一覧を取得するサンプルがのっています。
このサンプルを一部変えて、ファイルをアップロードするサンプルコードを作ってみました。
クライアントID、クライアントシークレットの取得などはドキュメントと同様です。

下記ファイルと同じディレクトリにアップロードしたいファイルを保存しておき、`go run upload.go`を実行します。
認証情報などが保存されていれば、アップロードしたいファイルのファイル名を入力すると、Google Driveのルートディレクトリにアップロードされます。

```go:upload.go
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
	"os"
	"path/filepath"

	"golang.org/x/net/context"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/drive/v3"
)

func getClient(ctx context.Context, config *oauth2.Config) *http.Client {
	cacheFile, err := tokenCacheFile()
	if err != nil {
		log.Fatalf("Unable to get path to cached credentioal file. %v,", err)
	}
	tok, err := tokenFromFile(cacheFile)
	if err != nil {
		tok = getTokenFromWeb(config)
		saveToken(cacheFile, tok)
	}
	return config.Client(ctx, tok)
}

func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
	authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
	fmt.Printf("Go to the following link in your browser then type the authorization code: \n%v\n", authURL)

	var code string
	if _, err := fmt.Scan(&code); err != nil {
		log.Fatalf("Uncable to read authorization code %v", err)
	}

	tok, err := config.Exchange(oauth2.NoContext, code)
	if err != nil {
		log.Fatalf("Uncable to retrieve token from web %v", err)
	}
	return tok
}

func tokenCacheFile() (string, error) {
	tokenCacheDir := ".credentials"
	err := os.MkdirAll(tokenCacheDir, 0700)
	return filepath.Join(tokenCacheDir, url.QueryEscape("drive-go-quickstart.json")), err
}

func tokenFromFile(file string) (*oauth2.Token, error) {
	f, err := os.Open(file)
	if err != nil {
		return nil, err
	}
	t := &oauth2.Token{}
	err = json.NewDecoder(f).Decode(t)
	defer f.Close()
	return t, err
}

func saveToken(file string, token *oauth2.Token) {
	fmt.Printf("Saving credentioal file to: %s \n", file)
	f, err := os.Create(file)
	if err != nil {
		log.Fatalf("Unable to cache oauth token: %v", err)
	}
	defer f.Close()
	json.NewEncoder(f).Encode(token)
}

func main() {
	ctx := context.Background()

	b, err := ioutil.ReadFile("client_secret.json")
	if err != nil {
		log.Fatalf("Unable to read client secret file: %v", err)
	}

	config, err := google.ConfigFromJSON(b, drive.DriveFileScope)
	if err != nil {
		log.Fatalf("Unable to parse client secret file to config: %v", err)
	}
	client := getClient(ctx, config)

	srv, err := drive.New(client)
	if err != nil {
		log.Fatalf("Unable to retrieve drive Client %v", err)
	}

	fmt.Println("Please input file name you want to upload")
	var filename string
	if _, err := fmt.Scan(&filename); err != nil {
		log.Fatalf("Uncable to read authorization code %v", err)
	}
	uploadFile, err := os.Open(filename)
	if err != nil {
		log.Fatalf("Cannot find such file %v", err)
	}

	f := &drive.File{Name: filename, Description: "test"}

	res, err := srv.Files.Create(f).Media(uploadFile).Do()
	if err != nil {
		log.Fatalf("Upload Failed %v", err)
	}
	fmt.Println(res)
}
```
Ubuntu16.10上でAndroidStudioをインストールしてAVDが起動できずに嵌ったので、その対策をメモしておく

AndroidStudioのインストール
----
AndroidStudioのインストール自体は特に嵌まることなく終了  

以下のサイトを参考にさせていただきました。
http://qiita.com/TsutomuNakamura/items/ef4aeec32cdaaf9105cc

```bash
$ sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install ubuntu-make
$ umake android
```
インストール自体はサクッと終了。
早速、プロジェクトを作成しビルド、問題なく終了。
（ここまでは順調だったが・・・）

AVDがエラーで起動しない
----
AVDを使ってアプリ起動しようとするとエラーをバリバリ吐いてAVDが起動しない。エラーメッセージを見ると、shared libraryがロードできていないとのメッセージみたい。
対処方法について、ググるといろいろ出てきます。
http://stackoverflow.com/questions/35911302/cannot-launch-emulator-on-linux-ubuntu-15-10
https://code.google.com/p/android/issues/detail?id=197254#c15
http://stackoverflow.com/questions/40066007/android-emulator-in-yakkety-yak-ubuntu-16-10

いろいろworkaroundが書いてあるが、システムに影響を与えたくないので、以下のどちらか 

- emulator のコマンドラインオプションに `-use-system-libs` を追加する
- 環境変数 `ANDROID_EMULATOR_USE_SYSTEM_LIBS=1` を定義する

Android Studio が emulator を起動するときに `-use-system-libs` を渡すように設定するのが簡単でいいな、と思い試行錯誤したのですが、どこで設定するのか、よくわからない。。。
ご存じの方、ご教授願います。m(_ _)m

結局、`~/.profile`に以下を追加

```bash
export ANDROID_EMULATOR_USE_SYSTEM_LIBS=1
```
やっと起動できました。

以上