OmniAICreator/Qiita-1.07M huggingface dataset:
一からTangoを始めて詰まったこと(2017/07/02時点, Ikariotikos)

## はじめに ##
この記事は開発途中のSDKに対するメモであり、他の人の環境で動作保証する記事ではありません。
特にTango SDKではIkariotikos以降のバージョンでFixされる可能性があります。

## Zenfone AR 買いました ##

Zenfone ARに一目惚れし、Asusの公式ストアに運良く並んでいるタイミングで購入できました。（再入荷したタイミングだったのかな？）

さて、早速SDKを試していたんですが、まずサンプルが動きませんでした。
動かそうとしたサンプルはこれ[【tango-examples-unity/UnityExamples/Assets/TangoSDK/Examples/AugmentedReality/】](https://github.com/googlesamples/tango-examples-unity/tree/master/UnityExamples/Assets/TangoSDK/Examples/AugmentedReality)

一日を潰して得た成果について記述します。

## Unityの動作バージョンが曖昧、5.4もしくは5.5が安定？ ##
[【Getting Started with Unity for Tango - Google Tango】](https://developers.google.com/tango/apis/unity/)
公式だとUnity5.2.1からと書いてありますが、少なくとも2017だと強制終了、5.6.0もカメラ周りがおかしく、満足に動作せず。AR表示がうまく動きませんでした。
自分の環境で動作した環境は5.5.2f1でした。

(動作Unity ver 5.4.1f1)
[【入門編】Google Tango対応スマホで拡張現実（AR）アプリを作ってみた #1 - GET AR](http://getar.jp/created-an-augmented-reality-application-with-google-tango-part-1/)

(動作Unity ver 5.4.2f)
[Tango + Cardboard/Daydreamの話 - ReDo (@youten_redo　さん)](http://greety.sakura.ne.jp/mt/mt-search.cgi?IncludeBlogs=2&tag=Tango&limit=20&IncludeBlogs=2)

## カメラの映像がうまく表示できない ##
グラフィックスバッファのクリアの設定がおかしくなっているようです。この記事がなければ詰まっていました・・・

**Clear Flags: Depth only -> Solid Color**
[Tango SDK for UnityをIkariotikosにしたらAR Screenが映らなくなったので直した - じゅころぐAR](http://jyuko49.hatenablog.com/entry/2017/07/01/230409)

## オブジェクト遮蔽(Occlusion)がうまくできない ##

Tangoの目玉であるオブジェクト遮蔽(Occlusion)を有効にするため、下記の記事を参考にしながらやっていたのですが、
[【TangoでOcclusionを有効にする (@shiroizu さん)】](http://qiita.com/shiroizu/items/6bb3eea3ddaa41bd61d5)
PointCloudっぽいものは表示されど、一向に遮蔽されず、調べていたのですが見つからず。途方にくれながらpointcloudのshaderを見ていたら、見慣れないセマンティクス`PSIZE` が。
セマンティクス周りの解釈がうまく行っていない可能性があったので、試しに **Auto Graphics APIを無効にして、手動でGLES 2.0を指定にする**ことで動作しました。

[【Release Note】](https://developers.google.com/tango/release-notes)にはver OKulでGLES 3.0に対応とかかれていましたが、UnityのバージョンごとにValidationを取っているのか怪しく、原因はおそらくUnityのシェーダーのコンバータにあるのかなぁと思っています。

## 最後に ##

とりあえずは動いたので、これから色々と入れ込んでいこうと考えています。

私はUnstableなパッケージを使う機会が割とあったので、ある程度は目星をつけて調べられたのですが、開発そのものが初めてな方だといきなりこういう問題に放りこまれたらかなり困惑しそうです。せめてSDKはold_versionも提供してほしいですね・・・
C++11/14 でテンプレートを使用する場面

[ブログ記事](http://secret-garden.hatenablog.com/entry/2016/08/11/163118)からの転載です。

C++03 ではせいぜいクラスや関数ぐらいでしかテンプレートを使う場面はなかったのですが C++11/14 でテンプレートを使う場面が増えたのでまとめてみました。

## クラステンプレート(C++11)

クラスにテンプレート型を渡します。

```cpp
template<typename T>
struct holder{
	T value;
};

holder<int>   n = { 10 };
holder<float> f = { 3.14f };
```

## 関数テンプレート(C++11)

関数にテンプレート型を渡します。

```cpp
template<typename R, typename T>
R
twice(T t){
	return t + t;
}

int n1 = twice<int, int>(2);
int n2 = twice<int>(3.5);		// 引数型を省略することも可能
```

関数の場合は、引数からテンプレート型を推論する事ができるので、引数のテンプレート型を省略する事が出来ます。

## エリアステンプレート(C++11)

C++11 から追加された `template aliases` という機能で使用します。
これは同じく C++11 で追加された `using` を使用した型エイリアス対してテンプレートを定義します。

```cpp
// std::string をキーにした std::map 型を定義
template<typename T>
using my_map = std::map<std::string, T>;

my_map<int> table = {
	{ "homu", 1 },
	{ "mami", 2 },
	{ "mado", 3 }
};
```

## 変数テンプレート(C++14)

これは C++14 から追加された機能ですが『すでに定義してる変数の型をテンプレートを使用してあとから定義する』ような機能になります。
例えば、『PI の値を任意の型で定義したい場合は次のように利用することが出来ます。

```cpp
template<typename T>
T pi = static_cast<T>(3.141592);

int   i_pi = pi<int>;		// 3
float i_pi = pi<float>;		// 3.14159
```

これは `pi<int>` の場合は `static_cast<int>(3.141592)` が返ってきて、`pi<float>` の場合は `static_cast<float>(3.141592)` が返ってきます。
他のテンプレートとは違い `pi<int>` は__型ではなくて値が返ってくる__のがすごく奇妙に感じますね。

## 可変長テンプレート引数(C++11)

これは、特定の場面で使用するわけではないですが（むしろテンプレートが使える場面ではどこでも使えますが）テンプレート型を可変長に受け取る事が出来ます。

```cpp
template<typename... Args>
struct holder{
	std::tuple<Args...> data;
};

holder<int, float, bool> table = {{ 42, 3.14f, false }};
```

上記のコードは簡単な例ですが、今回上げた中では一番学習コストが高い機能だと思います。  
他には関数で『型情報がある可変長引数を受け取りたい』場合などに利用できます。  

## まとめ

テンプレート自体は突き詰めると『型を引数として渡す機能』だけなので__普通に__使う分にはそんなに難しくはないと思います。  
ただ、C++11/14 でテンプレートを使う場面はかなり増えたので学習コストは上がってきていると思います。  
C++03 の頃は敬遠されがちだったテンプレートですが、今は C++ を使う上で必要な技術になりつつあると思います。
Bootstrapのハンバーガーメニューにドロップダウンを追加する

Bootstrapのハンバーガーメニューを、上手に整理していくためには、メニューの中に、さらにプルダウンメニューを入れましょう。
ポイントは、リストタグの中に、トグルメニューを書くだけです。
class="caret"を使うと、プルダウンの矢印が表示されます。

```
<nav class="navbar navbar-default">
  <div class="container-fluid"> 

    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#defaultNavbar1"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button>
    </div>
    
    <div class="collapse navbar-collapse" id="defaultNavbar1" >
      <ul class="nav navbar-nav">
        <li><a href="#"><span class="glyphicon glyphicon-picture"></span> 作品リスト</a></li>
        <li><a href="#"><span class="glyphicon glyphicon-credit-card"></span> 注文・発送</a></li>
        
		<li><a href="#" class="dropdown-toggle" data-toggle="dropdown">プルダウン<b class="caret"></b></a>
			<ul class="dropdown-menu">
				<li><a href="#">リスト１</a></li>
				<li><a href="#">リスト２</a></li>
				<li><a href="#">リスト３</a></li>
			</ul>
		</li>      
        
        <li><a href="artist_logout.php"><span class="glyphicon glyphicon-off"></span> ログアウト</a></li>
      </ul>          
    </div>
    <!-- /.navbar-collapse --> 
  </div>
  <!-- /.container-fluid --> 
</nav>
```



###サンプル
http://7135244fd63eb4a7.lolipop.jp/Qiitasample/Qiita_0001.php
素のVimでgitのHEADとのdiff

ちょっとdiffを見たい時に。

単純な方法ですが、
新しいバッファに ```git show HEAD``` を出力して、それを開いているファイルと比較します。

対象のファイルを表示している状態で ```:new``` などで新しいバッファを作り、
```:r !git show HEAD:#:.``` でそのバッファにHEADの内容を表示して、
```:vert diffs #``` で先ほど開いたファイルとのdiffをとります。

ただ、```:r``` した内容の先頭に空行が入るのが微妙ですが…。

なお、Windowsの場合はフォルダの区切りをスラッシュにしておく必要があります。

```vim:.vimrc
set shellslash
```
---
**追記**
コマンド化してみました。

```vim:.vimrc
command! GD :enew | execute "r !git show HEAD:#:." | :1d | :vertical diffsplit #
```
KotterKnife導入

# KotterKnifeとは
ViewInjectionをしてくれるライブラリでございます。
作者はButterKnifeの人とのこと。
リポジトリは[こちら](https://github.com/JakeWharton/kotterknife)

#導入

```gradle:app/build.gradle
dependencies {
    compile 'com.jakewharton:kotterknife:0.1.0-SNAPSHOT'
}
repositories {
    maven {
        url 'https://oss.sonatype.org/content/repositories/snapshots/'
    }
}
```

って思ったんだけど全然メンテされてないからやめた
compileSdkVersion 23とのこと

[株式会社Arrvis](http://www.arrvis.com)
Kotlinいいとこまとめ①

#いいとこまとめ
です。リファレンスとかはググればいくらでも出てくるからね。
とりあえず1時間実際書いてみて、他の言語と比べていいなと思ったとこを列挙。
しばらく使って続編も書きます。
あといまいちなとこまとめもそのうち。

＊Kotlin導入編は[こちら](http://qiita.com/yutaka_izumaru/items/57e9fc8a8efc8d2901e5)

#基本構文
SwiftっぽいからSwiftやってた人は入りやすいのでは。

#セミコロン
Swift書いてて、セミコロンつけないのに慣れたから楽。

#型推論
やっぱ楽ちんね。

```Java:Java
// 変数
private String value = "Hello";

// 定数
private static final String VALUE = "Hello";
```

```Kotlin:Kotlin
// 変数
private var value = "Hello"

// 定数
private val value = "Hello"
```

#インターフェース
Javaと違ってデフォルト実装持てる。素敵。
インターフェースを実装した抽象クラスとかもう書かなくていいんだね！

```Java:OnBackPressedListener.java
interface OnBackPressedListener {

    // NG
    boolean onBackPressed() {
    }
}
```

```Kotlin:OnBackPressedListener.kt
interface OnBackPressedListener {

    // OK
    fun onBackPressed(): Boolean {
        return true
    }
}
```

#継承系
Javaと違ってextendsとかimplementsとか書かなくていい。素敵。

```Java:HogeFragment.Java
class HogeFragment extends Fragment implements OnBackPressedListener {

}
```

```Kotlin:HogeFragment.kt
class HogeFragment : Fragment(), OnBackPressedListener {

}
```

openで継承できるメソッドを限定できる。overrideするときに@Overrideアノテーションじゃなくなった。素敵。

```Java:Java
public class Hoge {

    public void Hello() {
        Log.d("Hoge", "Hello");
    }
}

public class Fuga extends Hoge {

    @Override
    public void Hello() {
     Log.d("Fuga", "Hello")
    }
}
```

```Kotlin:Kotlin
public class Hoge {
    
    open fun Hello() {
        Log.d("Hoge", "Hello");
    }

    public fun Hello2() {
        Log.d("Hoge", "Hello2");
    }
}

public class Fuga : Hoge() {

    // OK
    override fun Hello() {
        Log.d("Fuga", "Hello");
    }

    // NG
    override fun Hello2() {
        Log.d("Fuga", "Hello2");
    }
}
```

#プロパティ
もうgetValue()とか書かなくていい！素敵！

```Java:Java
public int getValue() {
    return mValue;
}

public void setValue(int value) {
    mValue = value;
}

private int mValue = 0;
```

```Kotlin:Kotlin

public var value: Int
    get() = mValue
    set(value) {
        mValue = value
    }

private var mValue = 0
```

今日はここらへんで

[株式会社Arrvis](http://www.arrvis.com)
CircleCI 2.0 から IBM Bluemix へデプロイする方法

## CircleCI 2.0 とは?
CircleCI 2.0 は Docker ベースの CI サービスで、現在 β 版として利用できます。
任意の Docker イメージを指定してビルド・テスト・デプロイができることが特徴です。

### 参考
- [2.0 Docs (Beta) - CircleCI](https://circleci.com/docs/2.0/) (公式ドキュメント)

## IBM Bluemix とは?
IBM が提供する PaaS です。[Cloud Foundry](https://ja.wikipedia.org/wiki/Cloud_Foundry) をベースに構築されています。
Java、Ruby、PHP、Python、Node 等、メジャーな言語には一通り対応しています。

無期限の無料枠が用意されているため、開発環境としての利用や小さなサービス運営などが無料で行なえます。

### 参考
- [クラウドサービスIBM Bluemixを無料で使うノウハウまとめ](http://qiita.com/zuhito/items/86e7ad47d14937d3e9b6) (Qiita)

## CircleCI 2.0 から IBM Bluemix へデプロイする手法
公式で用意された Cloud Foundry のコンソールツール [cf-cli](https://github.com/cloudfoundry/cli) を使います。

下記は Node.js で構築されたアプリケーションを、テストしデプロイする設定ファイル `.circleci/config` です。

```yaml
version: 2
jobs:
  build:
    working_directory: ~/workspace
    docker:
      - image: node:6.10.2
    steps:
      - checkout
      - restore_cache:
          key: project-{{ .Branch }}-{{ checksum "yarn.lock" }}
      - run:
          name: System information
          command: |
            echo "Node $(node -v)"
            echo "Yarn v$(yarn --version)"
      - run:
          name: Install dependencies
          command: yarn
      - run:
          name: Test
          command: yarn test
      - save_cache:
          key: project-{{ .Branch }}-{{ checksum "yarn.lock" }}
          paths:
            - ~/workspace/node_modules
            - ~/.cache/yarn/
      - deploy:
          name: Deploy to IBM Bluemix
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              apt-get update -qq
              apt-get install -qq -y apt-transport-https
              wget -q -O - https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | apt-key add -
              echo "deb http://packages.cloudfoundry.org/debian stable main" | tee /etc/apt/sources.list.d/cloudfoundry-cli.list
              apt-get update
              apt-get install -qq -y cf-cli
              cf -v
              cf api https://api.au-syd.bluemix.net
              cf login -u $BLUEMIX_USER -p $BLUEMIX_PASSWORD
              cf push
            fi
```

deploy フェーズで実行されているコマンドが部分が重要になります。今回は Ubuntu をベースにしたイメージなため、`apt-get` にてインストールを行っています。

インストール後、下記 3 つの cf-cli コマンドを実行する必要があります。

```bash
# デプロイ先の指定
cf api https://api.au-syd.bluemix.net

# ログイン
cf login -u $BLUEMIX_USER -p $BLUEMIX_PASSWORD

# デプロイ実行
cf push
```

ログイン時の情報は、CircleCI の環境変数で事前に指定しておきます。環境変数の指定方法は、CircleCI 1.0 の時と変わりません。

![プロジェクトの設定](https://qiita-image-store.s3.amazonaws.com/0/51394/227f9b79-0b31-7c7f-6229-6ef3a697682a.png)

![環境変数の設定](https://qiita-image-store.s3.amazonaws.com/0/51394/8941789d-4330-9e91-af6f-932b51879f40.png)


## まとめ
IBM Bluemix は CircleCI 2.0 から簡単にデプロイ可能です。また、他の Cloud Foundary ベースの PaaS に対しても、同様の手法が適応することができはずです。

IBM Bluemix は無料で試せるので、興味のある方はぜひ触ってみてください。
Kotlin導入

# Kotlinとは
オブジェクト指向言語です。型推論・ラムダ式・トレイトなどが使えます。
JVM言語で、最近Androidの公式言語になりましたね。
導入手順も簡単だし、JavaとKotlinを混在させることも可能で、相互呼び出しもおｋ、しかもJavaからKotlinに変換するのもちょーらくちん。なので、とても導入しやすいですね。
ってことでKotlinの導入方法を。

# 環境
Android Studio 2.3.3

#手順
###インストール
Android Studioのメニューバーから。

```text:Mac
Android Studio -> Preferences
もしくはCommand + ,
```

```text:Windows
File -> Settings
もしくはAlt + F7
```

を選択。

```
Plugins -> Install JetBrains Plugin
```

をクリック。
検索バーに「Kotlin」って入れるとKotlinが出てくるので、選択して「Install」をぽちっと。
しばし待ちましょう。
終わると「Install」ボタンが「Restart Android Studio」に変わるのでぽちっと。Android Studioを再起動しましょう。
インストール完了です。

###導入
導入したいプロジェクトをAndroid Studioで開きましょう。
んで、またまたAndroid Studioのメニューバーから。

```
Tools -> Kotlin -> Configure Kotlin in Project
```

をぽちっと。
Choose Configuratorって出たら、「Android with Gradle」を選択しましょう。
導入したいmoduleを選択して、Kotlinのコンパイラバージョンを指定しましょう。
今回はAll modules / 1.1.3としました。
OKをぽちっとしてしばし待つと導入完了です。
ぼくの手元だと以下2ファイルに追記されました。
わざわざConfigureしなくてもこれを追記すればよさそうですね。

```text:build.gradle（プロジェクトルートの方）
buildscript {
    ext.kotlin_version = '1.1.3'
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
```

```text:app/build.gradle（モジュール直下の方）
apply plugin: 'kotlin-android'
dependencies {
    complile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}
repositories {
    mavenCentral()
}
```

### 既存コードの変換
変換したいJavaファイルを開きましょう。
Android Studioのメニューバーから

```
Code -> Convert Java File to Kotlin File
```
もしくは

```text:Mac
Command + option + shift + k
```

```text:Windows
Ctrl + Alt + Shift + k
```

.javaから.ktになりますねー。中身も変わってますねー。

今回はここまで。Kotlin基礎はまた次回。

[株式会社Arrvis](http://www.arrvis.com)
dockerでmecab neologd



# alpineでneologの手順です。
alpine使いやすぎる。

```

FROM python:3.5-alpine
RUN apk add  --update build-base git python-dev bash curl file openssl perl sudo
ENV PYTHONUNBUFFERED 1

WORKDIR /usr/src/mecab/
RUN mkdir -p /temp/mecab_src/ && \
git clone https://github.com/taku910/mecab.git  /temp/mecab_src/ && \
mv -f /temp/mecab_src/mecab/* /usr/src/mecab/ && \
 ./configure  --enable-utf8-only && \
make && \
make install && \
rm -rf  /temp/mecab_src/  && \
rm -rf  /usr/src/mecab/

RUN git clone https://github.com/neologd/mecab-ipadic-neologd.git /usr/src/mecab-ipadic-neologd && \
/usr/src/mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -y && \
rm -rf  /usr/src/mecab-ipadic-neologd && \
pip install mecab-python3

WORKDIR  /root/



```
pythonからつかう場合は以下のようにパス指定してあげればいけます。

```
tagger = MeCab.Tagger(' -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')

```

　python3からmecabつかうので以下のように一回空文字をパースしなければ解析してくれません(´・ω・`)

参照
http://qiita.com/piruty_joy/items/ce218090eae53b775b79
こんなバグぜったいはまってました。。ありがとございます。
iOSプロジェクトをビルドするJenkinsを構築する

CircleCIでiOSプロジェクトのビルドをしていたけど、ビルド回数が多くなってプランの中に収まらくなってきたので自前でJenkins立てた時の話。

## 今回の要件
* 既に別の用途で利用しているマシンにJenkinsを同居させること
* ↑につき別ユーザーでログインしつつ、JenkinsでiPhoneシミュレーターが起動してテストが実行できる事

[公式サイト](https://jenkins.io/download/)からdmgをDLしてきてインストールする方法もあるのですが、これだと以下の問題があって今回の要件とマッチしませんでした。

* JenkinsプロセスがデーモンになってしまってiPhoneシミュレーターが起動できない
* Jenkinsがjenkinsユーザーのディレクトリ以下にインストールされるので
  * 常時ログインしていないとiPhoneシミュレーターが起動できない
  * いつも使っているユーザーと別ユーザーになるのでbrewなどのパーミッションの変更が必要


色々調べたところ、brew経由でJenkinsをインストールすると、既存ユーザーの権限でJenkinsを動かすことができるので今回はこちらを採用しました。

---

### インストール
```
brew install jenkins
```

### 起動/停止
launchctlのラッパーである[brew services](https://github.com/Homebrew/homebrew-services)を利用しているので以下のコマンドで起動・停止できます
```
brew services start jenkins
brew services stop jenkins
```

### Jenkins本体の場所はこちら(Jobの設定ファイルや、workspaceなども)
```
/Users/{ユーザー名}/.jenkins
```

### 起動オプションの設定ファイルはこちら
```
/usr/local/Cellar/jenkins/{Jenkinsバージョン}/homebrew.mxcl.jenkins.plist
```

### 注意点
* 標準の起動オプションだとlocalhostからのアクセスしか受け付けない設定となっているので、外部からJenkinsにアクセスしたい場合は[起動オプションの設定ファイル](#起動オプションの設定ファイルはこちら)のhttplistenAddressを0.0.0.0に書き換えましょう。[(ドキュメント)](https://wiki.jenkins.io/display/JENKINS/Starting+and+Accessing+Jenkins)
GUIサーベイ

# 概要

サラリーマン個人開発者が同一コードで、Windows, Macで動くGUIアプリを作る場合、何を使うべきか？サーベイしてみました。

前提として、サラリーマン個人開発者は**時間が最も大事**なので、かっちょ良さ、ユーザーの利便性を落としたり、お金を払うことで時間が短縮できるならそうするべき、という価値観を仮定します。

なので、**敷居の低さ**、**初心者の利用実績**、**ユーザーが多いか？**を重視します。

# まとめ

## 結論

WindowsFormsが良さそう。

### ネック1

ネイティブでは無いことがネックですが、ビジネスロジックは全てC++で書いてDLLでAPIを提供して、C#からそのAPIを叩くという開発スタイルで良さそう。どうせ、全てC++で書く場合も同じ構造になる。APIを叩くことがボトルネックになるほど性能にシビアなアプリだと避けるのが良さそう。

### ネック2

.NETをインストールしていないと起動できないことがネックですが、今後減ってくるはずなのと、ドキュメントで緩和できると思うので、妥協するのが良さそう。

### ネック3

かっちょ良くないですが、平凡ということは親しみやすく使いやすいUIということなので、トントンです。

## メリデメ

| 観点 | Qt | WPF  | WindowsForms | EssentialStudio | FireMonkey |
|:--|:-:|:-:|:-:|:-:|:-:|
| かっちょ良さ  | 〇 | 〇 | × | 〇 | 〇 |
| 枯れているか？ | 〇 | 〇| 〇 | 〇 | 〇
| ユーザーが多いか？ |〇 |〇| 〇 | × | × |
| ネイティブか？ |〇 |×| × | × | 〇 |
| 依存DLLは少ないか？ | △ |×| × | × | 〇 |
| 敷居の低さ(主観/直感) |× |〇| 〇 | × | 〇 |
| LGPLでないか？ |× |〇| 〇 | 〇 | 〇 |
| 初期コスト(金銭)は低いか？ |〇 |〇| 〇 | 〇 | × |
| 初心者の利用実績は多いか？ | ×  |〇| 〇 | ×  | × |
| macで使えるか？ | 〇  |×| 〇 | ?  | 〇 |

# ライブラリ一覧

## Qt

歴史が長いのと、C++で使えるという部分に惹かれているが、結論以下の否定的な意見を参考にして却下。

### 否定的な意見1

https://stackoverflow.com/questions/2201365/quickest-easiest-gui-mfc-or-c-sharp-or-qt-or
速攻でGUI作りたいなら、C#かDelphi使えって書いてる。直感的にもそうだよな。

### 否定的な意見2

https://softwareengineering.stackexchange.com/questions/88685/why-arent-more-desktop-apps-written-with-qt
敷居の高さ(ゴツさ)やLGPLであることが敬遠されているらしい。
タイトル(なぜQtで書かれたアプリは少ない？)が本当だとすると、実績として使いづらいから少ない可能性がある。

直感的に避けたほうが良いような気がする。そういうときってたいがい半年後くらいに書き直すんだよな。

## WPF

敷居は低い。昔からあったので枯れている。

http://www.atmarkit.co.jp/fdotnet/dotnettips/1061wpfthemes/wpfthemes.html
かっちょ良いテーマを当てられるらしいです。

そもそも、WPFがmacで使えないので惜しいですが論外。

## WindowsForms

敷居はWPFと同程度。かっちょ良さで比較すると、WPFに劣る。ネイティブではないところと、ユーザーが.NETをインストールしていなくて起動できないというお問い合わせが来るのがネック。

## EssentialStudio

敷居はWindowsFormsより高そう。ただし、WindowsFormsよりかっこよくなるかも知れないので後で検討するのはよさそうです。C#なので後で移行するのもたぶん簡単。

## FireMonkey

Delphiに慣れている人にとっては、WindowsFormsと同程度に敷居が低そう。ただし、初心者の利用実績や、ユーザーの多さでWindowsFormsに負ける。一方で、ネイティブなので他のネイティブDLLとの連携はWindowsFormsよりは容易。良さそうですが、ネイティブが必須でなければWindowsFormsで良さそうです。

## Avalonia

https://github.com/AvaloniaUI/Avalonia
C#のUIライブラリ。Starが2286個。
面白そうだが、調べるのも面倒。その時点で敷居が高い。

## xwt

https://github.com/mono/xwt
C#のUIライブラリ。Starが913個。
面白そうだが、調べるのも面倒。その時点で敷居が高い。
Mac向けのGUI neovim

# 概要

MacOSX向けにneovimのGUI環境を構築する

terminalのvimもいいけどアプリの切り替えをタブでシャカシャカやってる自分にとっては
GUIで別アプリとして立ち上がっているほうが扱いやすい

OSXのGUI vimはKaoriYaさんっていう印象だったけどneovimはやってないので探してみると
Githubで公開している人がいたので使ってみる

ただ使えればいいよって言う場合はbrewで入れればいい！

```bash
$ brew tap neovim/neovim
$ brew tap rogual/neovim-dot-app
$ brew install neovim-dot-app
$ brew linkapps neovim-dot-app
```

# 手順

* githubからソースをクローンする

https://github.com/rogual/neovim-dot-app

```bash
$ git clone https://github.com/rogual/neovim-dot-app
```

* makeする

```bash
$ cd neovim-dot-app/
$ make
VIM=/usr/local/Cellar/neovim/0.2.0/share/nvim NVIM=/usr/local/bin/nvim scons -Q
/bin/sh: scons: command not found
make: *** [all] Error 127
```

* 通らない（^p^）

* sconsコマンドをインストール
    * 調べると次世代のmake的な？知らなかった

```bash
$ brew install scons
```

* その後、再度makeすると無事に通った

* make installでインストール

```bash
$ sudo make install
```

* make install後は普通にlaunch padにneovimという名称で追加されている

# カスタマイズ

* デフォルトでは ~/.config/nvim/init.vimが読み込まれるので普通にnvimの設定がしてあればおっけー

```vim
" 行番号表示
set number

" シンタックス有効
syntax enable

" タブ、空行、改行、全角スペースの可視化
set list
set listchars=tab:>.,trail:･,extends:>,precedes:<,nbsp:%
function! ZenkakuSpace()
    highlight ZenkakuSpace cterm=reverse ctermfg=DarkMagenta gui=reverse guifg=DarkMagenta
endfunction

" インデント設定
set autoindent
set tabstop=4
set shiftwidth=2
set expandtab

" infoファイル設定
set viminfo=

" undoファイル設定
set noundofile

" 入力補完
inoremap jj <ESC>
inoremap <C-j> <ESC>

" Escの2回押しでハイライト消去
nmap <ESC><ESC> ;nohlsearch<CR><ESC>

" dein.vim設定
let g:cache_home = $XDG_CACHE_HOME
let g:config_home = $XDG_CONFIG_HOME

" dein {{{
let s:dein_cache_dir = g:cache_home . '/dein'

" reset augroup
augroup MyAutoCmd
    autocmd!
augroup END

if &runtimepath !~# '/dein.vim'
    let s:dein_repo_dir = s:dein_cache_dir . '/repos/repos/github/'

    " Auto Download
    if !isdirectory(s:dein_repo_dir)
        call system('git clone https://github.com/Shougo/dein.vim ' . shellescape(s:dein_repo_dir))
    endif

    " dein.vim をプラグインとして読み込む
    execute 'set runtimepath^=' . s:dein_repo_dir
endif

" dein.vim settings
let g:dein#install_max_processes = 16
let g:dein#install_progress_type = 'title'
let g:dein#install_message_type = 'none'
let g:dein#enable_notification = 1

if dein#load_state(s:dein_cache_dir)
    call dein#begin(s:dein_cache_dir)

    let s:toml_dir = g:config_home . '/nvim/dein'

    call dein#load_toml(s:toml_dir . '/plugins.toml', {'lazy': 0})
    call dein#load_toml(s:toml_dir . '/lazy.toml', {'lazy': 1})
    if has('nvim')
        call dein#load_toml(s:toml_dir . '/neovim.toml', {'lazy': 1})
    endif

    call dein#end()
    call dein#save_state()
endif

if has('vim_starting') && dein#check_install()
    call dein#install()
endif
" }}}

" file type setting
au BufRead,BufNewFile,BufReadPre *.coffee   set filetype=coffee
au BufRead,BufNewFile,BufReadPre *.launch   set filetype=xml
au BufRead,BufNewFile,BufReadPre *.test   set filetype=xml
au BufRead,BufNewFile,BufReadPre *.xacro   set filetype=xml
au BufRead,BufNewFile,BufReadPre *.world   set filetype=xml
au BufRead,BufNewFile,BufReadPre *.urdf   set filetype=xml

filetype plugin indent on
```
古いruntimeのAWS Lambdaを一括削除する

Lambdaで古いruntimeが設定されているfunctionがあるとアラートが飛んできて鬱陶しいです。

> AWS Lambda to end support for Node.js v0.10 runtime, please migrate to Node.js v4.3 or v6.10 immediately

`LATEST` 以外のバージョンのfunctionも古いruntimeが設定されていると、アラートが飛んで来るので、古いruntimeのfunctionはすべて削除してしまいます。


```bash
aws lambda list-functions | \
    jq ".Functions[].FunctionName" -r | \
    xargs -I{} aws lambda list-versions-by-function --function-name {} | \
    jq -r '.Versions[] | select(.Runtime == "nodejs" and .Version != "$LATEST") | .FunctionArn' | \
    xargs -I{} aws lambda delete-function --function-name {}
```

上のコマンドを実行するだけです。念のため、バージョンが `$LATEST` のものは除外しています。

aws cliを実行するのが直列なので時間がかかりますが、 xargs の `-P`　オプションを使って適当に並列化すれば良さそうです。
Lua版 ゼロから作るDeep Learning まとめ


はじめに
--
　この記事は斎藤康毅先生著の[ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装](https://www.oreilly.co.jp/books/9784873117584/)で掲載されているスクリプトをLuaの機械学習計算ライブラリ[Torch](http://torch.ch/)で実装した記事のリンクを掲載しています。
　定期的に参照したい方はこちらをストックしていただけたら便利かと思われます。


記事一覧（更新中）
--
[Lua版 ゼロから作るDeep Learning その１[パーセプトロンの実装]](http://qiita.com/Kazuki-Nakamae/items/16c82b5ac8a85d4adee3)
[Lua版 ゼロから作るDeep Learning その２［活性化関数］](http://qiita.com/Kazuki-Nakamae/items/5199447a54642620139a)
[Lua版 ゼロから作るDeep Learning その３［３層ニューラルネットワークの実装］](http://qiita.com/Kazuki-Nakamae/items/57c2977d0a9a38bdf6b8)
[Lua版 ゼロから作るDeep Learning その４［ソフトマックス関数の実装］]
(http://qiita.com/Kazuki-Nakamae/items/20e53a02a8b759583d31)
[Lua版 ゼロから作るDeep Learning その５［MNIST画像の表示］](http://qiita.com/Kazuki-Nakamae/items/6373443510f94a67e910)
[Lua版 ゼロから作るDeep Learning その5.5［pklファイルをLua Torchで使えるようにする］](http://qiita.com/Kazuki-Nakamae/items/b56c3d23fc21fdc260b0)
[Lua版 ゼロから作るDeep Learning その６［ニューラルネットワークの推論処理］](http://qiita.com/Kazuki-Nakamae/items/4a8198ec56c8a9658bd3)
[Lua版 ゼロから作るDeep Learning その７［バッチ処理］](http://qiita.com/Kazuki-Nakamae/items/3900c1f4e23a2ffdd48d)
[Lua版 ゼロから作るDeep Learning その８［損失関数］](http://qiita.com/Kazuki-Nakamae/items/6c95cf75a0fb73909933)
[Lua版 ゼロから作るDeep Learning その９［損失関数（バッチ対応版）］](http://qiita.com/Kazuki-Nakamae/items/75e314043ad986780d81)
[Lua版 ゼロから作るDeep Learning その１０［一次元の数値微分］］](http://qiita.com/Kazuki-Nakamae/items/c0daa63a3d9d1046ab77)
[Lua版 ゼロから作るDeep Learning その１１［勾配の算出］](http://qiita.com/Kazuki-Nakamae/items/104b9236ddf8f470ab51)
[Lua版 ゼロから作るDeep Learning その１２［勾配法］](http://qiita.com/Kazuki-Nakamae/items/2a67c3979e38eb43bfaa)
[Lua版 ゼロから作るDeep Learning その１３［ニューラルネットワークに関する勾配］](http://qiita.com/Kazuki-Nakamae/items/04c78ab720129b6375ee)
[Lua版 ゼロから作るDeep Learning その１４［二層ニューラルネットワークの実装］](http://qiita.com/Kazuki-Nakamae/items/f4d65875f6eefbedbbe4)
Lua版 ゼロから作るDeep Learning その１５［二層ニューラルネットワークによるMNIST学習（後回し）］
[Lua版 ゼロから作るDeep Learning その１６［単純なレイヤの実装］](http://qiita.com/Kazuki-Nakamae/items/24c1a0c67695b56c996d)


スクリプト
--
　その１４以降のスクリプトに関しましてはgithub上にも掲載しています。
　[Lua_DLfromScratch](https://github.com/Kazuki-Nakamae/Lua_DLfromScratch)

```bash:ダウンロード
$git clone https://github.com/Kazuki-Nakamae/Lua_DLfromScratch
```


その他Torch関連リンク集
--
・[公式マニュアル](https://github.com/torch/torch7)
　
　インストール関連記事
・[Torchでdeep learning](http://qiita.com/perrying/items/c53864d1bd2155a0635d)
・[Torch7 のインストール](http://nonbiri-tereka.hatenablog.com/entry/2015/01/21/083351)
　
　その他
・[numpyとの対応表](https://github.com/torch/torch7/wiki/Torch-for-Numpy-users)
・[Torch7の分かりにくい話](http://ultraist.hatenablog.com/entry/2015/01/30/221102)
WaffleでGrove Light Sensorで読み込んだ値を4-Digit Displayに表示する

[ここ](http://qiita.com/mine820/items/562e5570ae642277876d)と[ここ](http://qiita.com/mine820/items/610d533700d281dc5236)で書いた内容をまとめてみます。

# Waffleとは
Arduino互換のマイコンボードです。
[こちら](https://dotstud.io/docs/waffle/)をご覧ください。

# 繋いでみる
まずは物理的に繋いでみます。

Waffle ← A0 ← Lihgt Sensor
Waffle → D9 → 4-Digit Display

![DSC_0003.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/7a2e4e34-dbf5-5f33-f08b-889b81e6a1cc.jpeg)

# プログラミング
今までのコードを繋げてみます。

```C
#include "TM1637.h"
#define CLK 9
#define DIO 10
TM1637 tm1637(CLK,DIO);
void setup()
{
    tm1637.init();
    tm1637.set(BRIGHT_TYPICAL);
}
void loop()
{
    int sensorValue = analogRead(A0);
    int percent = (sensorValue / 1023.0f) * 100;

    tm1637.display(0,(percent/1000)%10);
    tm1637.display(1,(percent/100)%10);
    tm1637.display(2,(percent/10)%10);
    tm1637.display(3,percent%10);

    delay(500);
}
```

Light Sensorで取得した値そのままだとわかりづらいので％に変換してみました。

![DSC_0005.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/1abafffa-4244-6732-a611-1c2d19ba6572.jpeg)

ちょっと不格好だけど、0.5秒毎に値が表示されました。

# 脱線
パーセント計算を

```C
    int percent = sensorValue* 100 / 1023;
```

としたら、負の値になることがありました。
そう、オーバーフローです。
Arduinoのintは2バイト（-32,768～32,767）までなのですね。

# まとめ
とりあえずWaffle内に閉じた形式で、Input→Outputが出来ました。
ユーロドル一時間足のDIFFをグラフ化してみる。

ユーロドル１時間足の終値において、１つの前との差分をグラフ化してみる。
当然、レートの動きが大きいと値が大きくなることになる（物理の言い方をすれば速度に相当する）。
解析にはDatalabを利用した。

# ユーロドルの生データ（１時間足）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189952/4b76c269-9b88-99ed-d873-a25e330a657d.png)

# 差分グラフ（物理でいう速度に相当）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189952/d7682175-afe6-dda4-45e6-3cd0445c3052.png)

# ２回差分グラフ（物理でいう初速度に相当）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189952/83f61e8f-3e6c-87bb-8d52-44699b5c20b4.png)

# 傾向
* レートの動きが大きいところは、差分グラフの値も大きく、かつ２回差分グラフの値も大きいことがわかる。
* 差分情報が、順張り or 逆張りに有効かは要検証。、
Lua版 ゼロから作るDeep Learning その１０［一次元の数値微分］


過去記事まとめ
--
[Lua版 ゼロから作るDeep Learning まとめ](http://qiita.com/Kazuki-Nakamae/items/e1d79bf10f433c4aca54)


はじめに
--
　今回は原書4章の数値微分の部分を実装します。
　CNNを実装する上ではこの部分は飛ばしても構いません。Torchを用いたグラフ描写の参考程度としていただければと思います。
　スクリプトは以下の通りです。


```lua:gradient_1.lua
require 'gnuplot'

---数値微分関数.
-- 入力値に対する一変数関数の数値微分を求める
-- @param f 一変数関数 (Type：function)
-- @param x 入力値 (Type：Tensor)
-- @return 入力値に対する数値微分の値 (Type：Tensor)
function numerical_diff(f, x)
    local h = 1e-4 -- 0.0001
    return (f(x+h) - f(x-h)) / (2*h)
end

---(0.01x^2+0.1x)一変数関数.
-- @param x 入力値 (Type：Tensor)
-- @return 出力値 (Type：Tensor)
function function_1(x)
    return 0.01*torch.pow(x,2) + 0.1*x 
end

---接線生成関数.
-- 入力値に対する関数の接線関数を求める
-- @param f 一変数関数 (Type：function)
-- @param x 入力値 (Type：number)
-- @return 接線関数 (Type：function)
function tangent_line(f, x)
    d = numerical_diff(f, x)
    print(d)
    y = f(x) - d*x
    return function(t) return d*t + y end
end

--function_1(x)のグラフを描写
local x = torch.range(0.0, 20.0, 0.1)
local y = function_1(x)
gnuplot.figure(1)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'})

--数値微分の値
print(numerical_diff(function_1, torch.Tensor({5})))
print(numerical_diff(function_1, torch.Tensor({10})))

--接線のグラフ描写
--x=5の場合
local function_t1 = tangent_line(function_1, 5)
local L_5 = function_t1(x)
gnuplot.figure(2)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'},{x, L_5, '-'},{torch.Tensor({5}), function_t1(torch.Tensor({5})), '+'})
--x=10の場合
local function_t2 = tangent_line(function_1, 10)
local L_10 = function_t2(x)
gnuplot.figure(3)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'},{x, L_10, '-'},{torch.Tensor({10}), function_t1(torch.Tensor({10})), '+'})
```
　
　グラフの説明に関しては[公式のマニュアル](https://github.com/torch/gnuplot)の説明がすごくわかりやすいです。
　
　実行結果は以下の通りです。

```bash:実行結果
$ th gradient_1.lua
 0.2000
[torch.DoubleTensor of size 1]

 0.3000
[torch.DoubleTensor of size 1]

0.19999999999909	
0.29999999999863
```
　f(x) = 0.01x^2 + 0.1xのグラフ
　
　![plot1.png](https://qiita-image-store.s3.amazonaws.com/0/147329/05df3b6e-32aa-ba1c-ac7f-5de0e56f303c.png "plot1.png")

　
　f(x) = 0.01x^2 + 0.1xのグラフとx=5での接線
　
　![plot2.png](https://qiita-image-store.s3.amazonaws.com/0/147329/fdaff101-bbd7-b621-49a3-2ee202217c53.png "plot2.png")

　
　f(x) = 0.01x^2 + 0.1xのグラフとx=10での接線

　![plot3.png](https://qiita-image-store.s3.amazonaws.com/0/147329/91b043a8-1e35-142a-4356-b4d6607024d7.png "plot3.png")

　

おわりに
--

　今回は以上です。

　次回は偏微分の場合をみていきたいと思います。
　
　ありがとうございました。
検索対象ファイルの任意のパラメータの値を抜き出す

# 目的
検索対象ファイル(data.txt)の任意のパラメータ(cn1)の値を抜き出す。

# 環境
Active Perl v5.24.1
Windows 10 Home
Sublime Text 2

# コード
```test.pl
use strict;
use warnings;

open(DATAFILE, "< data.txt") or die("error :$!");

while (my $line = <DATAFILE>) {
	chomp($line);
	if ($line =~ /cn1.+cn2/) { # .+は任意の複数文字
		my $tmp =$&; # $&は一つ上の行でマッチした文字列
		$tmp =~ s/^cn1=//; # ^は先頭を表現する正規表現
		$tmp =~ s/ cn2$//; # $は末尾を表現する正規表現
		print("$tmp\n");
	}
}
```
```data.txt
cn1=200 cn2=response_code
cn1=100 cn2=response_code2 
```
Raspberry Pi IPアドレス検索


arp コマンドを実行

```console
$ arp -an
? (192.168.2.2) at b8:27:eb:74:d5:45 on bridge100 ifscope [bridge]
 :
```
Raspberry PiのMACアドレスは「ベンダーID(b8:27:eb) + CPUシリアル番号の下6桁」

```console
$ ssh pi@192.168.2.2
pi@192.168.2.2's password:
 :
pi@raspberrypi:~ $
```
ログインできた。

初期IDとパスワードは
* ID: pi
* PASS: raspberry
【メモ】foreach&array_pushで配列に一つずつ要素を追加したいが、一部要素のみ配列に入れたく無い場合

配列に要素を一つずつ追加していくときに以下のようなコードで対応したが、

```php
$team = [];
foreach($members as $member){
  array_push($team,$member);
}
```

$memberの中で特定の要素を配列に入れたく無い場合、

```php
foreach($members as $member){
  if($member !== 'takeshi'){
    array_push($team,$member);
  }
}
```
このようにif文を用いて特定の条件に該当する要素を弾くことで対応出来た。

以上。
Javascript Remoting で async/await を使ってみる

#Visualforce 開発における非同期通信とコールバック
javascript の開発において、非同期処理の実装によるコールバック地獄は免れませんよね。
Visualforce 開発においても Javascript Remoting や Remote Object などの非同期処理によるサーバー通信の仕組みがありますが、開発を進めるにつれどうしてもコードを複雑化してしまう要素になります。

#Promise と Async/Await
この複雑性を解消するために、javascript 開発では一般的に Promise オブジェクトが使われるかと思います。
また、最近では Async 関数なる物が出てきて非同期処理をとても簡潔にわかりやすく記述することが出来るようになりました。
Visualforce の開発においても、これらの機能を利用する事が出来る(ブラウザや環境によって異なる)ので、可読性や保守性改善の手法として利用を検討してみましょう。

#Javascript Remoting で Async/Await 例
Async 関数を使用して、 Visualforce の Javascript Remoting で 取引先のリストを取得する Apex コントローラーのメソッドを呼び出すというシンプルなコードの例です。

```html:AsyncAwaitSample.vfp
<apex:page controller="AsyncAwaitSampleController">
    <script>
    (async () => {
      let accountList = await getAccountList().catch(err => {console.error(err.message); });
      if (accountList) { // エラー時は undefined となるので注意
        console.log(accountList);
      }
    })();

    const REMOTEACTION_OPTIONS = {buffer: true, escape: true, timeout: 120000};
    function getAccountList() {
      return new Promise((resolve, reject) => {
        Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.AsyncAwaitSampleController.getAccountList}',
          (result, event) => {
            if (event.status) resolve(result);
            else reject(event);
        }, this.REMOTEACTION_OPTIONS); // アロー関数を使う場合は this を忘れずに
      });
    }
    </script>
</apex:page>
```

```java:AsyncAwaitSampleController.apxc
public class AsyncAwaitSampleController {
    @RemoteAction
    public static List<Account> getAccountList() {
        return [SELECT Id, Name FROM Account];
    }
}
```

これにより、複雑なコードの記述も楽になりますね。
iOSで楽にデバッグメニューをつける

アプリを開発していて、チュートリアルをたくさんやり直して動作確認をしたかったりする時がありますよね。
そんな時はデバッグメニューをアプリにつけると楽ちんです。

次のコードをコピペして `AppDelegate.swift` に置くだけで「UserDefaultsを消す」「Viewをリセットする」デバッグメニューができます。

```swift
// Debug View
extension UIWindow {
    open override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
        #if DEBUG
            guard motion == .motionShake else {
                return
            }
            
            let alert = UIAlertController(title: "デバッグメニュー", message: "デバッグメニューだよ！！", preferredStyle: .alert)
            let clearCache = UIAlertAction(title: "UserDefaultsをクリア", style: .default, handler: { (_) in
                UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
            })
            let restartApp = UIAlertAction(title: "Viewをリセット", style: .default, handler: { (_) in
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                self.rootViewController = storyboard.instantiateInitialViewController()
            })
            let cancel = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
            
            alert.addAction(clearCache)
            alert.addAction(restartApp)
            alert.addAction(cancel)
            
            self.rootViewController!.present(alert, animated: true, completion: nil)
        #endif
    }
    
    open override var canBecomeFirstResponder: Bool {
        get {
            return true
        }
    }
}
```
メモ：i2c-gpioドライバでRaspberry PiにI2Cポートを追加

I2Cポートが足りないとき、i2c-gpioドライバを使用することで普通のGPIOポートをI2Cポートとして使うことができる。

GPIOを高速で制御 (Bit banging) して、SDAとSCL相当のシリアル波形を作り出そうというドライバ。任意のGPIOポートが使える代わりに、それなりにCPUパワーを消費するし、きっちりとした波形が出ないのでデバイスによってはうまく動作しない場合がある。

参考: https://en.wikipedia.org/wiki/Bit_banging

できることならハードウェアI2Cポートを使用すべきだし、使うにしてもオシロスコープで波形を確認し、デバイスの仕様に沿うか確認して使いたいところ。

`/boot/overlays/README` に記載のあるように、dtoverlayディレクティブを使用し`/boot/config.txt`に設定を追加することで動作するようになる。

```text:/boot/overlays/README
Name:   i2c-gpio
Info:   Adds support for software i2c controller on gpio pins
Load:   dtoverlay=i2c-gpio,<param>=<val>
Params: i2c_gpio_sda            GPIO used for I2C data (default "23")

        i2c_gpio_scl            GPIO used for I2C clock (default "24")

        i2c_gpio_delay_us       Clock delay in microseconds
                                (default "2" = ~100kHz)
```

GPIO 5をSDA、GPIO 6をSCL、クロックディレイを2μsecとする場合の設定は以下のような感じ。

```text:/boot/config.txt
dtoverlay=i2c-gpio,i2c_gpio_sda=5,i2c_gpio_scl=6,i2c_gpio_delay_us=2
```
Velocityを使ってみた話

# 静的コンテンツを表示するHTMLに動的な値を表示したい
プロジェクトの実行環境はJerseyのため、画面はJSPにより動的に生成されるHTMLで表示する想定であったが、静的コンテンツのみを扱う画面のためHTMLで表示を行いたいとの要望があった。
このため、Jersey/JSPによる画面の表示はやめ、servletによりサーバ上のHTML（モジュールのクラスパス外）を取得画面に表示するようにした、という経緯がある。

しかし、このHTMLに動的な値を出したいという要望があり、対応することとなった。
（初めから動的な値を表示するのであればJSPにしていたのに。。。）

対象のモジュールはすでに本番リリースをしているモジュールであるため、影響度をできる限り抑えたいとのことでHTML→JSPへの変換は却下された。。。

そこで、別のプロジェクトでもHTMLに動的な値を埋め込むために使用した実績のあるVelocityを使うことに。
そんなわけで、その時に手こずったところを中心に思いつくままにメモメモ。。

## クラスパス外の任意のフォルダのHTMLファイルをテンプレートファイルにする
設定ファイルによってデフォルトのリソースローダを指定したところ、ファイルが見つからない旨のエラーが発生。
⇒設定ファイルのテンプレートファイルの配置先を指定するプロパティがデフォルト値「.（クラスパスルート）」となっており、任意のディレクトリがクラスパスルート直下に存在しなかったためエラーとなっていた。
⇒テンプレートファイルの指定はフルパスで行っているため、配置先のプロパティを使わないという意味をこめ設定ファイルに「配置先のプロパティ名= 」(未指定)としたところ、、これもエラー。。

## 設定ファイルを用いず、javaコード内でプロパティを設定
javaのコード内でVelocityのインスタンス生成時に動的にプロパティを設定することができる。（Propertiesクラスを用いる）
`setProperty("配置先のプロパティ名", "")`（空文字を設定）としたところ、配置先のプロパティを見ずにテンプレートファイルの指定のみを見るように動作、テンプレートファイルを読み込むことに成功した。

正常動作したコードは以下。

```java:java
	ServletOutputStream out = response.getOutputStream();	//HttpServletResponse
	String pathName = "/hogehoge";
	//Velocityの初期化
	Properties p = new Properties();
	p.setProperty("input.encoding", "UTF-8");
	p.setProperty("output.encoding", "UTF-8");
	p.setProperty("resource.loader", "file");
	p.setProperty("file.resource.loader.path", "");	// ※このプロパティの値を空にしたいが、設定ファイルだと上手く空にならない。。。このためPropertiesで設定する
	p.setProperty("file.resource.loader.class", FileResourceLoader.class.getTypeName());
	p.setProperty("runtime.log.logsystem.class", "org.apache.velocity.runtime.log.SimpleLog4JLogSystem");
	p.setProperty("runtime.log.logsystem.log4j.category", "velocity");
	p.setProperty("runtime.log.logsystem.log4j.logger", "velocity");
	Velocity.init(p);
	//Velocityコンテキストに値を設定
	VelocityContext context = new VelocityContext();
	context.put("userName", "hogehoge";

	StringWriter sw = new StringWriter();
	//テンプレートの作成
	Template template = Velocity.getTemplate(pathName);
	//テンプレートとマージ
	template.merge(context,sw);
	byte[] bytes = sw.toString().getBytes("UTF-8");
	out.write(bytes);
	out.flush();
```
旧バージョンのcordovaの環境構築

# なぜ古いcordovaで環境構築するのか
案件の中でcordovaのバージョンが最新ではなく特定のバージョンが指定されており、環境構築に結構苦労したので記載します。

対象はcordova-androidの4.0.2が対象になります。

# 注意
2017/07の時点でcordova-androidの最新バージョンは6.2.3になります。基本的にcordovaは後方互換は保障しているので、特別な事情がない限りは最新版を使うことをおすすめします。

また、googleサポートから4.1.1以前のcordova-androidで構築されたアプリはGoogle Play での公開ができません。
[Apache Cordova の脆弱性を含むアプリを修正する方法](https://support.google.com/faqs/answer/6325474?hl=ja)

Apache Cordovaの公式からも5.1.0以上の使用を推奨しており、本当に特別な理由がない限り4.X系のcordova-androidを使用することはないと思います。
[CVE announcements for Cordova-Android](https://cordova.apache.org/announcements/2015/11/20/security.html)

## Cordova4.0.2環境の構築方法

### 前提条件

* node,npmがインストールされていること(バージョンは任意)

1. cordovaがインストール済みならアンインストールします

    ```.bash
    npm uninstall -g cordova
    ```
1. cordovaをインストールします
cordova-androidの4.0.2をインストールするためには、cordova-cliを5系にする必要があります。
    
    ```
    npm install -g cordova@5.4.1
    ```
1. インストールが正常に完了したかどうか確認します。バージョンが表示されればインストール完了。

    ```.bash
    cordova -v
    ```

1. 適当なディレクトリに移動し、以下のコマンドを実行してcordovaのプロジェクトを作成します。
    
    ```
    cordova create cordovaSample com.example.hello CordovaSample
    ```
1. 作成したcordovaのプロジェクトに移動し以下のコマンドでandroidプラットホームを追加します。追加が成功した場合はplatformsフォルダが作成され、配下のplatform.jsonにバージョン情報が追加されます。
    
    ```.bash
    cordova platform add android@4.0.2
    ```

## Android SDKのインストール方法

AndroidSDKのインストールはAndroid Studioを使用してのインストールが推奨されていますが、
SDK toolsのバージョン25.3.0以降よりtoolsの構成が変わってしまっています。
そのため古いcordovaではその構成に対応しておらずemulateなどの幾つかのコマンドが実行できないです。
そのため、以前のSDK toolsを使用してSDK等のダウンロードを行う必要があります。
[SDK Tools Release Notes](https://developer.android.com/studio/releases/sdk-tools.html)

1. Android Studioなどを使用してSDK等をインストールしたことがある場合は全て削除します。
1. AndroidのSDKが保存されていたディレクトリに移動します。sdkフォルダが存在する場合は削除し、もう一度sdkフォルダを作成します。
    
    ```
    Windowsの場合
    C:/Users/{ユーザ名}/AppData/Local/Android/Sdk
    Macの場合
    /Users/{ユーザ名}/Library/Android/sdk
    ```
1.  以下からSDK toolsをダウンロードします。ダウンロードしたファイルをsdkフォルダ配下にコピー。コピーしたらzipを解凍します。  

    [Windows](https://dl.google.com/android/repository/tools_r25.2.3-windows.zip)
[Mac](https://dl.google.com/android/repository/tools_r25.2.3-macosx.zip)

1. windowsの場合はsdk/toolsに移動しandroid.batを実行し、Android SDK Managerを起動します。Macの場合はターミナルでtools配下に移動し以下のコマンドを実行します。

    ```.bash
    android sdk
    ```

1. SDK Manager で下記のものをインストール。
    * Android SDK Tools
    * Android SDK Platform-tools
    * Android SDK Build-tools
    * Android5.1.1(API 22)
    * Android4.4.2(API 19)
    * Extras全て

1. 開発対象プロジェクトに戻りエミュレータを起動します。正常に起動できればOK。なお、エミュレータなどの設定はAndroid Studioを使用して問題ありません。
    
    ```.bash
    cordova emulate android
    ```

## おわりに
以上でcordova-android4.0.2に環境構築は終わりです。手順として書いてしまうと簡単なのですが実際は情報が少なくトライアンドエラーで大変でした。
急ぐあまり単体テスト省略すると逆に時間を無駄にする

　開発を急ぐ状況の中で、単体テストを省略していきなり結合テストしたいと思うかもしれない。しかし、単体テストを軽視すると痛い目を見ることは間違いない。少なくとも単体テストを軽視したプロジェクトの中で、私は何度か痛い目をみた。

###**テスト不十分な状況での実機動作は機器を破壊する**
 [テスト不十分な状況での実機動作は機器を破壊する](http://qiita.com/nonbiri15/items/015494c7c624748a5974#%E3%83%86%E3%82%B9%E3%83%88%E4%B8%8D%E5%8D%81%E5%88%86%E3%81%AA%E7%8A%B6%E6%B3%81%E3%81%A7%E3%81%AE%E5%AE%9F%E6%A9%9F%E5%8B%95%E4%BD%9C%E3%81%AF%E6%A9%9F%E5%99%A8%E3%82%92%E7%A0%B4%E5%A3%8A%E3%81%99%E3%82%8B)

 チェックリストを一箇所に集約するために、文章を移動しました。対策編の記事を読むだけで方向性を見出せるようにしたいと思う。


###**人によって単体テストへの理解が異なる**
　何かを作り上げたときになってからバグが見つかると、**「ソフトウェアを今から直せばいいよ」とならない**プロジェクトにかかわってきたため、単体テストをしないことはありえないプロジェクトで仕事をしてきた。
　人によっては、単体テストの重要性に気づかないままソフトウェアの開発を進めてくるプロジェクトに関わってきたため、単体テストを後回しにする傾向がある（あるいは分野違いのまま、ソフトウェアを含む開発のプロジェクトマネジャーになって、単体テストの重要性に気づかないままいるのかもしれない。）。そして、単体テストをしないために、プログラムの中でバグが潜んでいる部分について間違った判断をして貴重な工数を無駄にしてしまう。(問題の見極めに失敗して、問題のある方で課題をほったらかしにして、問題のない方に嫌疑をかけてしまう状況を生み出してしまう。その後、きちんとした名誉回復がされないと、該当のモジュールを開発したメンバーの意欲をそぐという組織運営上問題となる自体を引き起こす。)

###**「単体テストは理想だけど、、、、」**
 「単体テストは理想だけど、、、、」というひまがあったら、一つでも単体テストを実装してみよう。


###**単体テストの重要性は、開発テーマ自体にあって、あなたの理解に関係しない。**
　単体テストの重要性は、開発テーマ自体にあるのだから、あなたが「単体テストは後回し。」としたところで、解決しない。
　単体テストを先送りしたツケは、大事な局面での無様な失敗ということになりうる。
　単体テストは万能ではないから、単体テストをしても、大事な局面で失敗することはあるだろう。
　単体テストが不十分で、それでもバグを見逃すこともあるだろう。
　しかし、単体テストを軽視したツケは、必ずやって来る。

　**単体テストを無視していいのは、あなた個人の趣味のプログラムの範囲の中でだけだ**。

###**アルゴリズムは、多数のデータで期待どおりの動作をすることを検証しておこう**
　開発したアルゴリズムは、「うまくいく」と自称しているほどにはうまくいかないものだ。入力として想定しているデータの素性と、実際に入ってきたデータの素性が違っていることでうまくいかないことがある。また、想定していた使い方と違った状況で使われることもあり、それもうまくいかない要因を増やす。
 うまくいくことを担保するには、多くのデータを使って検証する。多くのデータを検証するには、アプリケーション全体として動作させるのではなく、モジュールとしての動作を多数させることで検証させるのがよい。
　


###**開発スケジュールの中に単体テストを必ず入れておくこと**
  
　単体テストが自動化テストでできるようになっていれば、ソフトウェアの改訂後の劣化を予防できるし、テストを繰り返す際の工数を無駄に増やすこともない。



単体テストを行うには、一つ一つの関数の意味を明確にしなければならない。
単体テストが記述できるように要件定義すること。
 

単体テストをするためには、適切な依存性をもった関数になっていなければならない。
単体テストを軽視すると、実装済みでバグがかれているとみられるものと、バグが残っているものとの区別ができない。


成功するプロジェクトと失敗するプロジェクトとを分けるものは、どのように効果的に品質の確保を確かなものにするかという差にあると思う。


追記：
回帰テストをすることで、リファクタリングなどの改造によって動作結果を変えてしまっていないことを確認しよう。
ある時点の動作結果を保存しておき、現行の版の動作結果を出力させ、その比較をする。
そのようなテストは、自動化しやすい。


### 単体テストは時間を節約する。
- ファイル入力でモジュールをテストすると、実機なしでもテストできる。
  実機なしでもテストできることで、そのモジュールのテストができる分だけ、テストが頻繁にできる。
- ファイル入力でテストすることで、再現性のテストが実施できる。
- 単体テストで実行できるので、すぐに目的の箇所のテストができる。

### 単体テストは問題の発覚を早める。
- 問題は早めに見つけることが大切
- 早めに見つけられれば、早めに対策が可能になる。
- 得体のしれないバグとなる前に、どのモジュールのバグなのかを把握できる。
- テスト駆動開発は、変更とバグの発見と解決の期間が短くなることを述べている。

こういった理由があるから、単体テストをして、仕事の質を向上させましょう。
docker-composeでイメージ１個だけ更新＆リスタートする

タイトルの表現が合っているかが分からない。


docker-composeで単体を再構築、リスタートしたい場合
例）nginxだけ失敗した時

```
[root@dev test.jp]# docker-compose ps
       Name                      Command              State           Ports
-----------------------------------------------------------------------------------
mysql                 docker-entrypoint.sh mysqld     Up       3306/tcp
nginx                 nginx -g daemon off;            Exit 1
testjp_phpmyadmin_1   /run.sh phpmyadmin              Up       0.0.0.0:3001->80/tcp
web                   docker-php-entrypoint php-fpm   Up       9000/tcp
```

アイヤー見事に失敗しとる。
何故エラー出ているのか。
エラーのログを見るにはこんな感じ
docker-composeではなくdockerコマンドを使います。

```
[root@dev test.jp]# docker logs nginx
nginx: [emerg] host not found in upstream "php" in /etc/nginx/conf.d/default.conf:76

```

にゃるほど。
default.confを間違っとるのね。
ゴニョゴニョ書き直して・・・

```
docker-compose build nginx
docker-compose up -d nginx
```

でOK。

```
[root@dev test.jp]# docker-compose ps
       Name                      Command              State          Ports
----------------------------------------------------------------------------------
mysql                 docker-entrypoint.sh mysqld     Up      3306/tcp
nginx                 nginx -g daemon off;            Up      0.0.0.0:8001->80/tcp
testjp_phpmyadmin_1   /run.sh phpmyadmin              Up      0.0.0.0:3001->80/tcp
web                   docker-php-entrypoint php-fpm   Up      9000/tcp
```

すっきり！
Spring+Doma+H2DB+ThymeleafでWEBシステムを構築

#はじめに
以前[Spring+Doma+H2DBでWEBシステムを構築](http://qiita.com/tharao/private/ead65865c7af9f6b8075)を行いましたが、テンプレートエンジンに`Thymeleaf`を使用してページを作ってみようと思います。

#環境準備
以前のプロジェクトをそのまま使用します。
まず`pom.xml`に以下を追加します。

```xml:pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
```

#HTML、Controllerの作成
まずHTMLファイルを追加します。
今回は`test.html`を追加します。
追加する場所は`src/main/resources/templates`です。

```html:test.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
	<head>
		<meta charset="UTF-8">
		<title>Test</title>
	</head>
	<body>
		<table>
			<thead>
				<tr>
					<th>ID</th>
					<th>Name</th>
				</tr>
			</thead>
			<tbody>
				<tr th:each="entity : ${entities}" th:object="${entity}">
					<td th:text="*{id}">id</td>
					<td th:text="*{name}">name</td>
				</tr>
			</tbody>
		</table>
	</body>
</html>
```

最後にControllerにHTML表示用のメソッドを追加します。
以下のメソッドを`TestController.java`に追加します。

```java:TestController.java
@RequestMapping(value = "test_th", method = RequestMethod.GET)
public String getEntitiesHtml(Model model) {
	List<TestEntity> list = service.getAllEntities();
	model.addAttribute("entities", list);
	return "test";
}
```

クラスに付いていたアノテーションを`@RestController`から`@Controller`に変更します。

```java:TestController.java
//@RestController
@Controller
public class TestController {
	...
}
```

#動かしてみる
[http://localhost:8080/test_th](http://localhost:8080/test_th)にアクセスすると、無事データがテーブル形式で表示された。
![test.png](https://qiita-image-store.s3.amazonaws.com/0/189711/781a075f-f242-9866-69b3-a97ef52da356.png)
Vyos ポートフォワーディング


eth0に振られている123.223.23.4のtcp:80を192.168.111.201のtcp:80に転送する場合
ルール番号はかぶらないように設定する

```
set nat destination rule ルール番号 destination 123.223.23.4
set nat destination rule ルール番号 destination port 80
set nat destination rule ルール番号 inbound-interface eth0
set nat destination rule ルール番号 protocol tcp
set nat destination rule ルール番号 translation address 192.168.111.201
```
picodomを使おうとして思ったこと

[picodom](https://github.com/picodom/picodom)は、「1 KB Virtual DOM builder and patch function.」と名乗るような、ごく小さな仮想DOMフレームワークです。コンパクトで取り回しが良さそうなのですが、実際に使おうとすると何点か気になることがありました。

## picodom自体のAPI

picodomには、APIがたった2つしかありません。

### `picodom.h`
`h()`関数が、仮想DOMを生成する関数です。引数は、`h(タグ名, オプション, 中身1, 中身2…)`のようになっていて、`オプション`には`{class: 'hoge', href: '/foo'}`のように、タグの属性と値をオブジェクトで指定します。そして、複数指定できる`中身`は、

* 他のVDOMオブジェクト
* 文字列や数値（テキストノードになります）
* 上2つの配列

などを、いくつでも指定できます。

### `picodom.patch`

`patch()`で、仮想DOMを実際のDOMに差分適用させます。引数は、`patch(親のDOMノード, 中身のDOMノード, 古いVDOM, 新しいVDOM)`となっていて、返り値は新しく生成した中身のDOMノードです。

## 気になった点
コア機能としては、たしかにこの2つがあればVDOMを実現できます。ただ、やはり最小化優先のため、そのままの使い勝手はよくありません。

### 連続した差分更新
通常、VDOMの差分更新を行う場合、「古いVDOM」は「直前に更新したVDOM」以外を指定することがないので、それをハンドリングするような関数を作っておいたほうがいいでしょう。

```javascript
// PicodomのVDOMに含まれる、
// string、number、function、Array、Object、null、undefined、booleanだけが対象
const deepCloneVDOM = (arg) => {
    // 即値、function（コピー不要）、null
    if(typeof arg !== 'object' || arg === null) return arg;
    // 配列
    if(Array.isArray(arg)) {
        return arg.map(x => deepCloneVDOM(x))
    }
    // Object
    const ret = {}
    for(let key in arg) {
        ret[key] = deepCloneVDOM(arg[key]);
    }
    return ret
}

let oldVDOM = null;
let innerNode = null;
let parentNode;

function update(newVDOM){
  innerNode = picodom.patch(parentNode, innerNode, oldVDOM, newVDOM);
  oldVDOM = deepCloneVDOM(newVDOM);
}
```

なお、反映済みのVDOMを破壊的に変更してしまっても差分を正しく取れるようにするため、保存時にディープコピーを行うようにしてあります。

### タグ生成
JSXをつないでもいいのですが、そこまで大げさにするのであればpicodomの値打ちがなくなる気もします。ということで、`h`の引数のオプションを省略できるようにしたり、その他工夫を考えてみました。

```javascript
// dataを省略できるようにしたVDOM生成関数
const tag = (name, data, ...children) => {
    // dataがVDOM or その配列 or 文字列の場合
    if(typeof data !== 'object' || (data.tag && data.data) || Array.isArray(data)) {
        children.unshift(data);
        data = {};
    }
    return picodom.h(name, data, children);
};

const TAGS = ['a', 'abbr', /* 中略 */ 'wbr'];

const specificTag = (name) => (...rest) => tag(name, ...rest);

TAGS.forEach((tagName) => {
    tag[tagName] = specificTag(tagName);
});
```

このような補助関数を用意すれば、

```javascript
const{h1, p, span, div, a} = tag;

let someVDOM = div({class: 'foo'},
    h1('title'),
    p('文章中の', a({href: 'http://qiita.com/'}, 'リンク'));
);
```

のように、VDOMもそこそこきれいに組み立てられるようになります。

### モジュール化
むろんこれもpicodomの守備範囲ではないのですが、複数のモジュールに分けたぐらいの開発をするとなれば、別にレイヤーを組み立てる必要がもちろん出てきます。

## まとめ
picodomは、そのまま使うというより、自分なりのVDOMフレームワークを作るベースとして使う、というのが適当なのかもしれません。
Colossusを勉強するにあたって参考になるコード一覧(見つけ次第随時更新)


## まとめた理由
参考になるコードが少なく、探すのに苦労したため。。
同じように必要になる人がいたら、同じ苦労をさせたくない。。

## そのままで動くコード一覧

### githubのcode example
https://github.com/tumblr/colossus/tree/master/colossus-examples/src/main

## そのままで動かないコード一覧
ByteString→Stringのimplicitを書く必要があったり、ひと手間かかる・・

### quickstart
http://tumblr.github.io/colossus/docs/quickstart/

## 確認中

### g8(フィボナッチが動かない？)
https://github.com/cuno/colossus-quickstart.g8
Swiftのソースコード行数をカウントしてみる

## ソースコード行数をカウントする

自分たちが開発したプロダクトのSLOC数を求められることあると思います。
JenkinsなどでCIを回した結果からSLOC数を求めてくれるようなものもありますが
今回はお手軽にコマンドを使ってSLOCを求めました。

使うコマンドは以下です

``` .bash
find . -type f -name "*.swift" | xargs grep -v -e '^\s*$' -e '^\s*\/' | wc -l
```
C#で区切り文字を指定して文字列の連結をする際の選択肢と何を使うか

## 選択肢
- [string.Join()](https://msdn.microsoft.com/en-us/library/system.string.join(v=vs.110).aspx)
- [StringBuilder](https://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=vs.110).aspx)

## 何を使うか
- string.Join()
- なぜか
    - 簡潔に書けて、可読性が高い

## 文字列の連結例
`StringBuilder` での連結めんどくさい :cry: 

```C#
void Main()
{
	var names = new List<string> { "Taro", "Jiro", "Goro"};

    // StringBuilder	
	var builder = new StringBuilder();
	var numberOfNames = names.Count;
	var counter = 0;
	foreach (var name in names)
	{
		counter++;
		if (counter == numberOfNames)
		{
			builder.Append(element);
			break;
		}
		
		builder.Append(element).Append(",");
	}
	
	Console.WriteLine(builder.ToString());

    // String.Join()
	Console.WriteLine(string.Join(",", names));
}

```