OmniAICreator/Qiita-1.07M huggingface dataset:
MacにlibGDX導入

## 事前に入れておくもの

* java
* sbt
* android-sdk

## 事前設定

.zshenv等に以下を加えておく。

```sh
export CONSCRIPT_HOME="$HOME/.conscript"
export CONSCRIPT_OPTS="-XX:MaxPermSize=512M -Dfile.encoding=UTF-8"
export PATH=$CONSCRIPT_HOME/bin:$PATH
```

## conscript 導入

githubからscalaのプロジェクトをいい感じに落としてくるツール。

```sh
> curl https://raw.githubusercontent.com/foundweekends/conscript/master/setup.sh | sh
```

zshの場合`refresh`することで*$CONSCRIPT_HOME/bin/cs*コマンドが使えるようになる。

## giter8 導入

githubからいい感じにテンプレートを生成するツール。

```sh
> cs foundweekends/giter8
```

zshの場合`refresh`することで*$CONSCRIPT_HOME/bin/g8*コマンドが使えるようになる。

## プロジェクト作成

```sh
> g8 Darkyenus/libgdx-sbt-project
name [My Game]: GdxSample
package [my.game.pkg]: com.strnet.game
api_level [21]: 24
scala_version [2.11.5]: 2.12.3
libgdx_version [1.7.0]:
robovm_version [1.8.0]:
```

### plugins.sbt編集

androidとして実行すると`[warn] UPDATE: A newer android-sdk-plugin is available: 1.6.0, currently running: 1.5.6`と警告されるので編集。

```project/plugins.sbt
//addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.5.6")
addSbtPlugin("org.scala-android" % "sbt-android" % "1.7.10")
addSbtPlugin("org.roboscala" % "sbt-robovm" % "1.8.0")
```

## 実行

`sbt desktop/run`でPC用として動作、`sbt android/android:run`でAndroid端末に転送。iOSは未検証。

参考：[Darkyenus/libgdx-sbt-project](https://github.com/Darkyenus/libgdx-sbt-project.g8)

環境構築だけして満足して終わる僕。
main関数を別の関数から実行する

gccでwrapオプションを利用すると、main関数を別の関数から実行することができます。
コンパイルの時にwrapオプションで指定した関数を実行する時、その前にwrap関数を割りこませる、という表現の方が実態に近いかもしれません。あと、これでwrapできるのはlibcでサポートしているシステムコール限定かもしれません。

ソースコードをコンパイルし、生成されたオブジェクトファイルをリンクしていく仕組み、プログラムが起動する仕組みをちゃんと勉強すればもう少しまともな説明ができそうな気もしますが、その辺は後々。


# サンプルコード 其の一

```c:test.c
#include<stdio.h>
#include<unistd.h>

// こが実際のmain関数らしい．．．
int __real_main(int argc, char *argv[]);

// コンパイルする時「wrap,main」を指定するとmain関数の前に__wrap_man関数が実行されます。
int __wrap_main(int argc, char *argv[])
{
    printf("%s\n", __FUNCTION__);
    return __real_main(argc, argv);
}

int main(int argc, char *argv[])
{
    int cmdopt = 0;

    printf("%s\n", __FUNCTION__);
    printf("%d\n", argc);
    while((cmdopt=getopt(argc, argv, "m:")) > 0)
    {
        switch(cmdopt) {
        case 'm':
            printf("%s\n", (char*)optarg);
            break;
        default:
            printf("not support arg(%d %s)\n", cmdopt, (char*)optarg);
            return(1);
        }
    }
    return(0);
}
```

これを、

    $ gcc -g -o test test.c -Wall -Wl,-wrap,main

または、

     $ gcc -g -o test test.c -Wall -Wl,-wrap=main

でコンパイルすると、

```
$ ./test -m orz
__wrap_main
main     <- __wrap_mainから実行されたmain関数
3        <- コマンド引数の数(コマンド名含む)
orz      <- -mのオプション
```

のように、main関数実行前に__wrap_main関数が実行されます。


# サンプルコード 其の二

其の一のサンプルだと、__wrap_mainはただの土管なので、わざわざラップするメリットがないのですが、これを利用するとプログラム内でmain関数に引数をセットして実行するテストコード（みたいな？）を書くことができます。


```c:test2.c
/*
 * デバッグコンパイル
 *   gcc -g -o test test2.c -Wall -Wl,-wrap,main -DDEBUG
 *   gcc -g -o test test2.c -Wall -Wl,-wrap=main -DDEBUG
 * 通常コンパイル
 *   gcc -g -o test test2.c -Wall
 */
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>

#ifdef DEBUG
int __real_main(int argc, char *argv[]);

int __wrap_main(int argc, char *argv[])
{
    /* main関数の引数をセットする */
    int wrap_argc = 3;
    char *wrap_argv[] = {argv[0], "-m", "test message"};
    /* main関数の戻り値を評価する */
    assert(__real_main(wrap_argc, wrap_argv) != 0);
    return(0);
}
#endif

int main(int argc, char *argv[])
{
    int cmdopt = 0;

    while((cmdopt=getopt(argc, argv, "m:")) > 0)
    {
        switch(cmdopt) {
        case 'm':
            printf("%s\n", (char*)optarg);
            break;
        default:
            printf("not support option(%d %s)\n", cmdopt, (char*)optarg);
            return(EXIT_FAILURE);
        }
    }
    return(EXIT_SUCCESS);
}
```



ただ、下記のように__wrap_main関数を、main関数終了直後に、引数を変えてもう一度main関数を実行しても期待した動作が得られないので、テストコードとしては微妙な感じです。

```c
int __wrap_main(int argc, char *argv[])
{
    printf("%s\n", __FUNCTION__);

    int wrap_argc1 = 3;
    char *wrap_argv1[] = {argv[0], "-m", "test message"}; 
    assert(__real_main(wrap_argc1, wrap_argv1) == 0);

    int wrap_argc2 = 3;
    char *wrap_argv2[] = {argv[0], "-M", "test message"};
    /* ここでassert NGになることを期待していたのですがOKだった．．． */
    assert(__real_main(wrap_argc2, wrap_argv2) == 0);
    return(0);
}
```
[Vue warn]: Cannot find element

Railsでvue.jsを使っています。Railsがjavascriptを一本化する方針のようなので、ID指定を行っていると`[Vue warn]: Cannot find element`といった警告がよく出ます。

対応策は [Instance Vue if element exists?](http://stackoverflow.com/questions/37901520/instance-vue-if-element-exists) などがあるようです。

ただ、コードを確認したところ https://github.com/vuejs/vue/search?utf8=%E2%9C%93&q=%22Cannot+find+element%22&type=Code によると`env.NODE_ENV`が`production`なら本番では出ないようなので、開発用の警告と捉えて対応しなくてもいいのかもしれません。

IDが無い場合は読み込まないようにしてみました。

```js
document.addEventListener('DOMContentLoaded', function() {
  if (document.getElementById("feed")) { require('./feed.js') }
  if (document.getElementById("shop")) { require('./shop.js')  }
}, false);
```
enchant.jsをサイトに使う!

enchant.jsは本来ゲームを作るライブラリ、フレームワーク、ゲームエンジンです。
しかし、今回は本来ページが重くなるため推奨されないWebでのenchant.js使用をしようと思います。

#enchant.jsとは?
世の中には、いろいろなパソコンがあります。そして中のOSもたくさんあります。もちろんブラウザもたくさんあります。
そして、アプリケーションはWebアプリが増えてきていたりもします。
Webアプリは昔はFLASHで作られていたことが多いのですが、今はHTML5とCanvasにとってかわられています。
それに機能を追加、楽に作業をすることができるようにするのが、ライブラリやフレームワークです。
一方ゲームエンジンとは、ゲームの光の当たり方の調整、影のつけ方などを自らプログラムを組まなくても楽してできるようにするものです。
それが一つにまとまったのが、enchant.jsです。

#余談

enchant.jsはやはり重いんじゃないかな?と思うのですが…

2016.09.19追記：enchant.jsを使うのをやめて、phina.jsを使います。そのための準備中なので、もう少ししたらまた投稿します。タイトル変えました。比較記事→[phina.jsとenchant.jsの自分のためのまとめ](http://qiita.com/progbasb/items/ac9e47027287d7ecade8)
git for windows 初めてのadd,commit

#まずはファイルを作ってaddしてみよう

**現状の確認**

```
$ git status
On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)
```
現状は空っぽです。


**ファイルを新しく作る**

```
$ touch read.me
$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        read.me

nothing added to commit but untracked files present (use "git add" to track)
```
touchはファイルのタイムスタンプを変更するコマンドですが、空のファイルを作ることもできます。
ステイタスを見ると「read.me」は「Untracked files」とでてきます。これはリポジトリで管理されていないファイルということです。

**登録してみる**

```
$ git add read.me
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   read.me
```
git addコマンドでステージ領域（コミットをする前の一時領域）へ登録します。


#commitしてみよう

**commitしてみる**

```
$ git commit -m "my  first commit"
[master (root-commit) 4833fd1] my  first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 read.me
$ git status
On branch master
nothing to commit, working directory clean
```
git commitコマンドでコミットします-mはコミット内容の概要を追加するオプションです。
git statusを確認するとread.meがなくなってしまいました。これはワーキングディレクトリ、つまり作業中のファイルはないよってことで、read.meはリポジトリにいます。


**ファイルはディレクトリにありますよ**

```
$ ls
read.me
```


**logを見てみる**

```
$ git log
commit 4833fd1ad12c674fb6d4583afb59a11193e759b4
Author: firstname lastname <your_email@example.com>
Date:   Sat Jul 9 12:25:18 2016 +0900

    my  first commit
```
logをみればcommitできていることがわかります。
4833fd・・・はハッシュです、コミットの番号です。
ZYBO > Pmod > XADC Pmod > 1V peak-to-peak取込み

```txt:動作環境
DIGILENT ZYBO
```

http://www.marutsu.co.jp/contents/shop/marutsu/datasheet/595400.pdf
によるとZYBOはPmodからアナログ取込みができるようだ。

> 16.3 Dual Analog/Digital Pmod (XADC Pmod)
> The on-board Pmod expansion connector labeled “JA” is wired to the auxiliary analog input pins of the PL.
Depending on the configuration, this connector can be used to input differential analog signals to the analog-todigital
converter inside the Zynq (XADC). Any or all pairs in the connector can be configured either as analog input
or digital input-output.

analog取込みの電圧は以下のように0-1Vの範囲のようだ。

> In analog input mode, the voltage on these pins must be limited to 1V peak-to-peak. In digital mode, the regular
VCCO-dependent limits apply. See Xilinx datasheets for more information.

digital modeというのは未消化。
GoogleAnalytics APIで自身が作成した「セグメント」を利用する

## TLDR

1. GooleAnalytics（GA）のデータをGoogleSpreadSheet（SS）へ自動importするTipsを書いた
  - [GoogleAnalytics API Add-onを使ってspreadsheetを最強のKPI管理シートに - 基礎編](http://qiita.com/Yamotty/items/41a513fe9592ee0cd11a)
2. 本記事は応用編。自身が作成したセグメントを使ってデータ抽出することでより緻密な検証を自動化し、アクション精度を高めよう

## 前提

プロダクトの成長は

1. データのinput
2. 課題エリアの特定（問の設定）
3. 仮説
4. 検証
5. 実装

といったステップで行われることが多いですが、特に`2. 課題エリアの特定（問の設定）`の精度が実装のROIを決めると思っています。その上で必須とも言えるのがGAの`セグメント`機能。セグメント機能については[こちら](https://support.google.com/analytics/answer/3123951?hl=ja)。

>たとえば、すべてのユーザーのうち、特定の国や都市のユーザーだけを 1 つのセグメントに設定できます。また別のセグメントには、特定の商品ラインを購入したユーザーや、サイトの特定のページにアクセスしたユーザーを含めることができます。

「セグメント」機能の真骨頂は「自社プロダクトにとって最も優位な切り口を簡単に作成できる」という点です。例えば

>Facebook経由で訪問したリピーターで、ページA→Bと遷移してページCを閲覧したユーザーのUU

といった極めてspecificな行動を分析することができるので、自然解像度の高い検証が可能となり打ち手の精度も上がります。

と、前置きが長くなりましたが早速GA APIでの利用方法を見てみましょう。

## 手順

### レポート作成

手順は[こちら](http://qiita.com/Yamotty/items/41a513fe9592ee0cd11a)参照。詳細は省略します。

### Segmentの設定

上記で作成した`Report Configuration`の`Segment`欄に、使用したいセグメントのキーを設定することで、特定の条件で抽出されたデータだけを取り出すことができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/1716d48f-4b05-6771-2bdf-8dd906f4deb8.png)


#### 自身が作成したセグメントのキーを調べる

Googleが提供している[Query Explore](https://ga-dev-tools.appspot.com/query-explorer/)を使用します。アクセスすると認証を求められるので、流れに沿って認証しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/42fcaa93-b46d-7d81-1840-eba2d0438d3b.png)

認証が完了すると、自身のアカウントに紐づくGAのプロパティやビューが選べるようになるので、ここで今回取得したい対象のビューを選択してください。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/57e36d26-bfb9-af46-573c-cb83e98e0dbb.png)

選択後、ページ下部にある `Segment`の項目を選択すると、ビューで作成されたカスタムセグメントの一覧が表示されます。使用したいものを選択しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/9bb33bad-e4cc-eb2f-5097-85cafbb354d6.png)

各セグメントにはキーが振り当てられており、カスタムセグメントの場合は `gaid::`のあとにランダムな文字列がついたキーが振られているのでこれをコピーします。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/eb1ece58-6ba4-7005-da98-ce20156483aa.png)

あとはこのキーをReport ConfigurationのSegment欄にコピペし、Run Reportでデータを抽出してみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/d77e5629-2480-d50e-6dcc-82b7edb3fefb.png)

すると、設定したセグメントの条件に当てはまるデータだけが抽出されます。あとはSS上で好きなだけ分析したりチャートを創って、なんならSlackに自動でポストしたりしましょう！

例えばわかり易い例ではこんな感じで、Facebook経由のユーザーの1週間分のPVやセッションなどを毎日定時に抽出し、Slackへポストしたりしています（Slackへの自動連携にはGASを使おう。GASの設定は[こちら](http://qiita.com/Yamotty/items/bb2f002ba843386ce6f5)や[こちら](http://qiita.com/Yamotty/items/b0eb3d855c4266b18b39)などを参考に）。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/b56ddc9d-4d64-a1e7-4139-273a0bde9344.png)

## まとめ

- GAは非常に便利なツールですが、プロダクトに関わるチームがほしいのは便利なツールではなく**GAから抽出・分析されて出てきた示唆**なんです。
- リソースには限界があるので、出来る限り数字を抽出する、見るという習慣は自動化し、示唆をひねり出すところに時間も頭も使いたいところ。このセグメント機能によって、一歩近づくのではないでしょうか？
- GAでspecificな分析を実行するための複雑なセグメントをたくさん作っている人は、これを機にAPIとSS管理を導入してみてはいかがでしょうか？
Psych::SyntaxErrorをキャッチ

RubyでYAMLを使用していたら、`Psych::SyntaxError` をキャッチできずにプログラムが終了する事態に遭遇した。

```ruby:sample1.rb
require 'yaml'

def catch_test
	yield
rescue => ex
	p "catch #{ex.class}"
end

catch_test { 1 / 0 }          #=> "catch ZeroDivisionError"
catch_test { YAML.load('"') } #=> Psych::SyntaxError
```

原因が分かれば単純なことだったが、分かるまでは本当に行き詰っていたので、また似た状況にはまらないためにメモを残しておく。

## 原因
Ruby 1.9までは、`Psych::SyntaxError` は `StandardError` を継承していない。

```bash
$ ruby1.9.1 -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
$ ruby1.9.1 -e 'require "yaml"; p Psych::SyntaxError.ancestors'
[Psych::SyntaxError, SyntaxError, ScriptError, Exception, Object, Kernel, BasicObject]
```

2.0以降では冒頭のコードでもキャッチできる。「`StandardError` を継承していないのは変ではないか」という[議論](https://github.com/tenderlove/psych/issues/23)があったようで修正されていた。なお今は `Psych::Error` が `Psych::Exception` に変わっている（[変更履歴](https://github.com/tenderlove/psych/commits/master/lib/psych/syntax_error.rb)）。

```bash
$ ruby2.0 -v
ruby 2.0.0p384 (2014-01-12) [x86_64-linux-gnu]
$ ruby2.0 -e 'require "yaml"; p Psych::SyntaxError.ancestors'
[Psych::SyntaxError, Psych::Error, RuntimeError, StandardError, Exception, Object, Kernel, BasicObject]
```

## 対策
1.9系にも対応するには、普通にクラスを明示してキャッチすればいい。（なぜもっと早く試さなかった…）

```ruby:sample2.rb
require 'yaml'

def catch_test
	yield
rescue Psych::SyntaxError, StandardError => ex
	p "catch #{ex.class}"
end

catch_test { 1 / 0 }          #=> "catch ZeroDivisionError"
catch_test { YAML.load('"') } #=> "catch Psych::SyntaxError"
```
ZYBO > GPIO Pmod出力の波形測定 > 27MHz程度は出そう?

```txt:動作環境
DIGILENT ZYBO
Analog Discovery 2 (以下AD2)
Vivado 2015.4 on Windows 8.1 pro (64bit)
```

## cnt使用

http://qiita.com/7of9/items/2e714e66d4a6c78c4a02
をベースに以下のソフトに変更した。

```helloworld.c
#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "platform.h"

#define PMOD_DEVICE_ID  XPAR_AXI_GPIO_0_DEVICE_ID

XGpio PMODInst;

int main()
{
    init_platform();

    print("Hello World\n\r");

    int status;
    status = XGpio_Initialize(&PMODInst, PMOD_DEVICE_ID);
    if (status != XST_SUCCESS) {
        print("LED initialize failure\r\n");
        return -1;
    }
    XGpio_SetDataDirection(&PMODInst, 1, 0);
    XGpio_DiscreteWrite(&PMODInst, 1, 0x0F);

    int cnt = 0;
    while(1) {
    	cnt++;
    	if (cnt == 1000) {
    		XGpio_DiscreteWrite(&PMODInst, 1, 0xF0);
    	}
    	if (cnt == 2000) {
    		XGpio_DiscreteWrite(&PMODInst, 1, 0x0F);
    		cnt = 0;
    	}
    }

    cleanup_platform();
    return 0;
}
```

cnt2000周期での波形の出力をしている。

対応するPmod コネクタのピン１つをAD2のChannel 1で取込んだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ca85fbc1-d7a4-5a44-d382-0b9c80eb1f53.png)


1周期が37usecになっている。

1秒 / 37usec = 27027Hz 
= 27kHz

2000カウントに対して27kHz.
2カウントにすると27Mhz程度が出るのだろうか。

ZYBOのZynqは650MHz。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a5640ee5-7348-d5be-b826-c1a0fcbea852.png)



## usleep使用

XillinxのAPIとしてusleep()という関数があるようだ。usleep()を使うように変更してみた。

```helloworld.c
#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"
#include "platform.h"

#define PMOD_DEVICE_ID  XPAR_AXI_GPIO_0_DEVICE_ID

XGpio PMODInst;

int main()
{
    init_platform();

    print("Hello World\n\r");

    int status;
    status = XGpio_Initialize(&PMODInst, PMOD_DEVICE_ID);
    if (status != XST_SUCCESS) {
        print("LED initialize failure\r\n");
        return -1;
    }
    XGpio_SetDataDirection(&PMODInst, 1, 0);
    XGpio_DiscreteWrite(&PMODInst, 1, 0x0F);

    int cnt = 0;
    while(1) {
    	usleep(50);
		XGpio_DiscreteWrite(&PMODInst, 1, 0xF0);
    	usleep(50);
		XGpio_DiscreteWrite(&PMODInst, 1, 0x0F);
    }

    cleanup_platform();
    return 0;
}
```

100usecの周期が取れた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/dc03ee19-9629-ea60-4282-3e99d852080d.png)
vue.js 2.0 で SSR やろう


先日betaがリリースされたvue.js 2.0 

仮想DOMの導入でパフォーマンス向上、SSR対応が図られています。

パフォーマンス向上のサンプルは
http://qiita.com/mikakane/items/78614572d964420e7e31
をご確認下さい。

以下はSSRに関する覚書。イベント公開前でサンプルコードがUP出来ないのですが、
後でサンプルコード含めて加筆してUPする予定。

## SSR して遊んでみる

vue.js 2.0 のSSRサンプルとしては、公式で下記の様なものが提供されており非常に参考になります。

https://github.com/yyx990803/vue-ssr-demo

vue.jsでSSRの手順としては、以下の形になります。

1. フロントのコードをサーバ用にビルドする。
2. 作成したコードからrendererを作成
3. rendererを文字列orストリームに変換

### フロントのコードをビルド

最初はフロント用に記述したコードをそのままrequireして使えないか…なども考えていたんですが、テンプレートの読み込みとかはwebpackなりbrowserifyなりを使用しているケースが多いので、
サーバでの利用時にも素直にwebpackなりbrowserifyなりを使用する方が良さそうです。

サーバ用のエントリを作成して、Vueインスタンス(またはPromise)をreturnする関数を作成します。

フロント側ready等でデータの読み込みなど行っている場合、SSRで利用できないっぽい(？)ので、
独自の初期化関数を組む方が良さそうです。

この場合 export する関数もPromiseを返す形になります。

````:server-entry.js
const Vue = require('vue')

Vue.component("my-component",require("../frontend/component/myComponent/"))

const app = new Vue(require("../frontend/app.js"))

app.ssrInit = ()=>{
    return new Promise(resolve => {
        app.loadData().then((articles) => {
            app.articles = articles
            resolve()
        })
    })
}

export default (context) => {
    return app.ssrInit().then( ()=>{
        return app;
    } )
}
````

### 作成したコードからrendererを作成

`export default`でappを返す関数を実装しwebpackで target node のビルドを行うと、vue.js側からbundleでrendererを作成出来るようになります。

````
var fs = require("fs");
const createBundleRenderer = require('vue-server-renderer').createBundleRenderer
const renderer = createBundleRenderer(fs.readFileSync(__dirname+'/server-bundle.js'))
````

### rendererを文字列orストリームに変換

renderer からSSRコンパイル済文字列を受け取るにはrenderToString やrenderToStream を利用する。

シンプルに様子を見るだけだとrenderToStringとかでも良さそう。
公式の方ではrenderToStreamを使ったサンプルが掲載されています。

生成されたvue.jsのコードをテンプレートに埋め込んで吐き出せば完了。

````
var express = require('express');
var app = express();

app.get("/", (req,res)=>{
    const renderStream = renderer.renderToString((e,result)=>{
        let html = `
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>WP API Sample Application</title>
  <script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
  <script src="./assets/js/common.bundle.js"></script>
</head>
<body>
<div id="app">
  <h1 class="app-title">WP API Sample Application</h1>
  ${result}
</div>
</body>
</html>
        `;
        res.send(html)
    })
})

````

### 運用を考える

とりあえずサーバ側で利用可能、という所は分かったとして、後はどのように運用を考えるか。

公式サンプルのコードでは初期のデータを取得して、HTML側に__INITIAL_STATE__と言うかたちの変数で、値を格納しています。

この辺はやっぱりVuex(Vue.js 向けのflux実装)とかと混ぜて使うほうが使い勝手が良さそう。

個人的には SSR出来るようになったなら、コマンドラインツール的にHTML吐き出す実装使って、PHPとかの多言語でフロントのコンポーネント利用できたりしないかなぁ…とか妄想しています。
アニメーションGIFを写真に保存する

アニメーションGIFを写真.app（Photos.app）に保存する方法を紹介します。

![写真](https://qiita-image-store.s3.amazonaws.com/0/3862/cc4e616d-84c9-0f83-3470-322339e83590.jpeg)

UIImageViewを配置してアニメーションGIFを読み込みます。

```swift:sample1.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var kImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = NSURL(string: "http://example.com/sample.gif")!        
        let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data, response, error in
            self.kImageView.image = UIImage(data: data!)
        })
        task.resume()
    }
}
```

![アニメーションGIF](https://qiita-image-store.s3.amazonaws.com/0/3862/00eaae7f-ff44-2f85-f93b-0f87fb133bb0.jpeg)

アニメーションGIFを写真.appに保存するためには`Photos.framework`を利用します。

```swift:sample2.swift
import UIKit
import Photos

class ViewController: UIViewController {

    @IBOutlet weak var kImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = NSURL(string: "http://example.com/sample.gif")!        
        let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data, response, error in
            self.kImageView.image = UIImage(data: data!)
            let url = NSURL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).URLByAppendingPathComponent("tmp.gif")
            data?.writeToURL(url, atomically: true)
            
            PHPhotoLibrary.sharedPhotoLibrary().performChanges({
                PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURL(url)
            }, completionHandler: nil)
        })
        task.resume()
    }
}
```

アニメーションGIFのデータを一度ファイルに書き出すのがポイントです。
`UIImageWriteToSavedPhotosAlbum()` や `PHAssetChangeRequest.creationRequestForAssetFromImage()` などUIImageを引数にとるものでは1コマ目だけが保存され静止画となります。

写真.appを開くとアニメーションGIFが保存されていることがわかります。
しかし写真.appでは静止画となってしまいアニメーションが再生されません。

アニメーションGIFであることを確認するために共有をタップしてメールに添付します。
これでアニメーションGIFであることが確認できます。

![アニメーションGIFの確認](https://qiita-image-store.s3.amazonaws.com/0/3862/08544d3a-d96b-d3d2-b3c9-f1d43d4226e7.jpeg)
GolangでBufferからzipファイルを作成

```
//中間ファイルを作成せずに圧縮ファイルを生成する手法
package main

import (
	"archive/zip"
	"bytes"
	"io/ioutil"
	"os"
)

func before() {
	f, err := os.Create("sample.txt")
	if err != nil {
		panic(err)
	}
	f.Write([]byte("sample"))
	f.Close()
}

func main() {
	before()

	//圧縮対象ファイル取得
	files := find()

	//圧縮ファイルデータ生成
	//この時点では、メモリ上に存在する
	b := compress(files)

	//例としてこのタイミングで、ファイル化
	//この時点では、あまり意味は無い
	//ローカルに残さず、s3にuploadするなどが可能となる
	//file ioがかからないので、高速化
	if err := save(b); err != nil {
		panic(err)
	}
}

func find() []string {
	return []string{"sample.txt"}
}

func save(b *bytes.Buffer) error {
	zf, err := os.Create("sample.zip")
	if err != nil {
		return err
	}
	zf.Write(b.Bytes())
	zf.Close()
	return nil
}

func compress(files []string) *bytes.Buffer {
	b := new(bytes.Buffer)
	w := zip.NewWriter(b)

	for _, file := range files {
		info, _ := os.Stat(file)

		hdr, _ := zip.FileInfoHeader(info)
		hdr.Name = "files/" + file
		f, err := w.CreateHeader(hdr)
		if err != nil {
			panic(err)
		}

		body, err := ioutil.ReadFile(file)
		if err != nil {
			panic(err)
		}
		f.Write(body)
	}

	w.Close()

	return b
}

```

本来は、S3にアップロードするなど、ローカル以外に保存する際に
ファイルIOを減らす目的で書きました。

https://play.golang.org/p/x9MS1Z_jmz
Vim | 編集内容を破棄してからファイルを開き直すより簡単なこと ( :e! )

`:e!` でファイルを「最後の保存状態」に戻せる。

# 例

ファイルを開いて。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/22ed8fdb-98c2-ac91-c9d9-bcbba6cda892.png)

編集しても。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/2c3d81d1-5e10-1af8-dde2-992cdb4159a0.png)

`:e!` で

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/635765c6-04c8-b2af-fba8-9dd560367caf.png)

戻せる！

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/341db26d-e8f9-6f1f-5e31-9a03f561bd19.png)

# 「戻した」のを「戻す」には

 `u` ( undo ) と打つ 。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/4688fb20-193c-3737-d7c5-6ca5f91e969e.png)


# 今までは

- `:q`
- `＄ vim [file]`

でファイルを開き直していた。

# 参考

- [Learning the vi and Vim Editors](https://www.amazon.co.jp/dp/B005EI85BE/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MAMPでapacheが起動しない。

ローカル環境に複数のapacheがインストールされていて、他のapacheが既に起動している場合、MAMPのapacheが起動しないことが起こる。

sudo apachectl stop;

で起動中のapacheを停止すれば。解決するはず。

参考サイト：
http://1day1tip.yeno.net/2015/03/mamp-cannot-apache-start-solution/
MySQLでサーバ、DBの文字コードを変更する方法

MySQLでサーバ、DBの文字コードを変更する場合、my.confという設定ファイルを編集する必要があるが。デフォルトでは用意されていないので、自作する必要がある。

ゼロから作るのではなく、以下の雛形ファイルから好みのものをコピーして所定のディレクトリに配置する。

/Applications/MAMP/Library/support-files/my-small.cnf
/Applications/MAMP/Library/support-files/my-medium.cnf
/Applications/MAMP/Library/support-files/my-large.cnf
/Applications/MAMP/Library/support-files/my-huge.cnf
/Applications/MAMP/Library/support-files/my-innodb-heavy-4G.cnf

設置場所は、/Application/MAMP/db/mysql/と様々なサイトで説明されているが、
ここにmy.confを設置すると、MySQLが再起動できなくなる現象発生。原因不明で未解決のまま。

設定ファイルで変更する方法はあきらめ、ターミナルから地道に変更する方法にチェンジ。

set character_set_databese = "uft8";
みたいな感じで変更していく。

参考サイト：http://klx.ldblog.jp/archives/wordpress_mamp_mysql_mojibake.html
topコマンドの使い方


どうも、江川(egawa)くんです。
Linuxの障害時やリソース状況を確認する際に使われるtopコマンドの使い方について、備忘録的に残していきたいと、おっもいま〜す。
※なお、topコマンド表示画面の解説については、別途投稿いたしますので、予めご了承ください。

## 更新情報
- 2016/7/10 新規作成
- 2016/8/18 テキストを一部修正
<br>

## topコマンドとは
簡単に言うとマシンの稼働状況を確認するコマンド。
CPUやメモリなどの利用率、プロセスの稼働状況などを確認することができます。

### topコマンドの使い方
基本的にはターミナル画面にて`top`と入力すると、以下のような画面に切り替わります。
（Windowsでいうタスクマネージャみたいなw）

```topコマンド表示画面
top - 00:00:00 up 1 min,  1 users,  load average: 0.05, 0.03, 0.05
Tasks:  5 total,   1 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  1.3%sy,  0.0%ni, 98.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1020076k total,   103188k used,   916888k free,     6308k buffers
Swap:   417788k total,        0k used,   417788k free,    37792k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
5 root      20   0 15008 1264  988 S  1.3  0.1   0:00.94 top
1 root      20   0     0    0    0 S  0.3  0.0   0:00.67 events/0
2 root      20   0 19232 1488 1220 S  0.0  0.1   0:00.72 init
3 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
4 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0 
```

また、以下のようにオプションを指定することで、様々な利用方法があります。

- `top -d 1` : 1秒間隔でtop画面を更新（-d 0.5と指定すると0.5秒間隔で更新してくれます）
- `top -a` : メモり使用率順にソートをして表示
- `top -u {username}` : 指定したユーザのプロセスが表示
これらの他にも、`-b` `-s`など色々指定することができるので、用途にあわせて使ってみるのもいいかもしれませんw
<br>



### top画面の操作方法
top画面が表示されている状態で、以下の操作をすることができます。

- Shift + o : 表示されるフィールドに対応するキーを押し、Enterを押下することで、任意列でソート
- Shift + p : CPU使用率順にソート（実行する時は、「ぷろせっさー」って叫んでください！）
- Shift + m : メモリ使用率順にソート（めもりーーっ）
- Shift + g : top画面表示形式を4種類から選択して、切り替え（Shift + aでサンプルを見ることもできます）
- s : 画面更新間隔を秒単位で指定（実は0.1と指定すると、0.1秒ごとに更新されるw）
- z : 表示画面をハイライト（Shift + zで詳細な設定が可能となる）
- m(半角英字) : `Mem`、`Swap`行の表示／非表示
- l(半角英字) : `Top`、uptime、`Load Average`の表示／非表示
- f(半角英字) : 画面に表示したいフィールド（項目）設定（項目と紐付いたキーを押すことで有効／無効）
- 1(半角数字) : CPUごとの使用率表示に切り替え（`Cpu(s)`の部分がCPU毎に表示されるようになります。）

上記以外にもできることはたくさんあるようです。（列挙するのが辛くなっ）
CSS で underline に animation をつける

# 問題

CSS で underline に animation をつけたい。

# 解決策

`::after` / `:hover` / `display` / `transition` / `width` を組み合わせることで実現できる。

# 例

結果は [https://jsfiddle.net/666xcjhj/](https://jsfiddle.net/666xcjhj/) .

```html
<a href="http://bouzuya.net">bouzuya.net</a>
```

```css
a { text-decoration: none; } /* reset default css */

a {
  display: inline-block;
}

a::after {
  content: "";
  display: block;
  width: 0;
  transition: width 0.3s;
  border-bottom: 1px solid #f00;
}

a:hover::after {
  width: 100%;
}
```

# 解説

- `::after` を underline として利用する。
- `transition` と `width` により `:hover` で underline を animation させている。
- `display: inline-block;` と `display: block;` は underline の幅をあわせるためにある。
- `content: "";` は `::after` を表示するためにある。
- `border-bottom: 1px solid #f00;` は underline の装飾なので任意。`height` や `background` を組み合わせても良い。
- `::after` に `margin: 0 auto;` を指定すると「左→右」から「中央→外」に変更できる。
- `line-height` によっては `::after` が離れてしまうので、`position: relative;` と `position: absolute;` などで合わせると良い。

# 参考

- [CSS Sliding Underline | Brad S. Knutson](http://bradsknutson.com/blog/css-sliding-underline/) ... その他の動きを集めている。
- [CSSでアンダーラインアニメーション - Qiita](http://qiita.com/junya/items/4805404624292401030d) ... 内容はほとんど同じ。この記事ではよりシンプルにした。
ReactJSでメーターを作ってみた

最近ジャバスクリプトでアンドロイド・アイホン・ＰＣのアプリを作ってますが、そのアプリにゲーム感覚みたいな特徴作りたくてメーターが必要だった。自分で挑戦したら驚くほど簡単でしたので、Qiitaに乗せておこうと思った。

メーターのクラスはこのようになりました → 

```javascript
var Meter = React.createClass({
    render: function(){

        var width = (this.props.current / this.props.max) * 100;

        var style = this.props.additionalStyles || {};
        style.width = width + '%';

        return(
        <div className="meter_base">
            <div className="meter" style={style}></div>
        </div>
        );
    }
});
```

AdditionalStylesについてですが、メータークラスを変えなくても色とか変わりたい時や、２つのメーターあって違う色とかで作りたい時のためにそのAdditionalStylesに置いたらいいって事です。

使用はこんな　→　

```javascript
var GameInterface = React.createClass({
    render: function(){
        var progressStyle = {
            background: '#9c9'
        };
        return(<div>
            <Meter max={マックス} current={ステータス} additionalStyles={progressStyle}
            // 他のエレメントとか
        </div>);
    }
});
```

そしてそのCSSは　→

```css
.meter_base{
    height: 15px;
    width: 100%;
}
.meter{
    height: 15px;
    transition: 0.5s;
    white-space: nowrap;
    border-radius: 0px 10px 10px 0px;
}
```
そして結果はこれです →
![progress.gif](https://qiita-image-store.s3.amazonaws.com/0/126962/fda1bdc4-e13a-0a70-0329-b4e0d37bdfec.gif)


作っているアプリではメーターは上がっていくけど、もちろん下がる場合でも（キャラクラーのライフとか）ちゃんと動きます。

そして色を変えてみたらこうなりました → 

```javascript
        var progressStyle = {
            background: '#9c9'
        };

        if(危ない条件){
            progressStyle.background = "#E38D8D";
        }
```

結果 →  
![redlife.gif](https://qiita-image-store.s3.amazonaws.com/0/126962/41c243da-d204-eb9b-8664-2e453e14d332.gif)


前回の投稿よりずっと簡単な内容だけど、今日は以上です！
gnubg python scripting: set threads

[先週](http://qiita.com/mkisono/items/bef45089dab399fac433)に続き、gnubgと戯れます。

マッチの解析をする際に、出来るだけ早く処理を終えたいです。デフォルトで実行すると１分くらいかかります。

```
In <5> > gnubg.command('import mat 87027157.txt')
 GNU Backgammon  Position ID: AAAAunEAAAAAAA
                 Match ID   : 8AqgAFAAAAAE
 +13-14-15-16-17-18------19-20-21-22-23-24-+     O: mkisono
 |                  |   |                  | OOO 5 ポイント
 |                  |   |                  | OOO
 |                  |   |                  | OOO
 |                  |   |                  | OOO
 |                  |   |                  | OOO
v|                  |BAR|                  |     5 ポイントマッチ (キューブ: 1)
 |                  |   |                  | X
 |                  |   |                  | X
 |                  |   | X           X    | X
 |                  |   | X        X  X    | X
 |                  |   | X        X  X  X | XX  0 ポイント
 +12-11-10--9--8--7-------6--5--4--3--2--1-+     X: cwm7296g

In <10> > %time gnubg.command('analyse match')
CPU times: user 1min 6s, sys: 112 ms, total: 1min 7s
Wall time: 1min 7s
```

私のPCは[究極のゲームマシン](http://mkisono.blogspot.jp/2015/08/ultimate-gaming-machine.html)なので、コアは８つあります。マルチスレッドで処理させなければ勿体ない。

```
In <11> > gnubg.command('analyse clear match')

In <12> > gnubg.command('set threads 8')
The number of threads has been set to 8.

In <13> > %time gnubg.command('analyse match')
CPU times: user 2min 18s, sys: 176 ms, total: 2min 18s
Wall time: 18.4 s
```

マッハで解析が終わるようになりました！

スレッド=1の設定
![Screenshot from 2016-07-09 10:47:55.png](https://qiita-image-store.s3.amazonaws.com/0/42252/9e6a12f0-2444-f8b5-7fc8-9076cb0e83e1.png)

スレッド=8の設定
![Screenshot from 2016-07-09 10:49:26.png](https://qiita-image-store.s3.amazonaws.com/0/42252/b333d63f-0b02-b694-e2c0-9b3faecf4457.png)

ちなみに、GUIでもスレッド数を設定できます。もしも設定していない人がいたら、この値を増やした方がいいと思いますよ。

![Screenshot from 2016-07-09 10:50:55.png](https://qiita-image-store.s3.amazonaws.com/0/42252/b996bb80-ee0b-504d-3652-722723e284eb.png)

gnubgには他にもいろんなオプションがあるので研究したいと思います。
Windowsで OSの設定を見る コマンドラインツール

忘れやすいので備忘録です。
コマンドラインで動くもの限定


ipconfig > ifconfig.txt
dxdiag /t dxdiag.txt
msinfo32 /report msinfo32.txt
systeminfo /fo LIST > systeminfo.txt

msinfo32 で大体こと足りるような気がする。
crossroads.js でルートに任意のクエリパラメータを含む場合

crossroads.js を初めて使ってて、addRoute したい URL が不特定数のクエリパラメータを含む場合。

```js
crossroads.addRoute('/path/to/lovelive{?query}', query => {
// ...
});
```

最初こうやって書いてて、これだとひとつ以上のパラメータが含まれた時にはちゃんと動くんですが、パラメータがない場合に正しくルーティングされないことにしばらく経ってから気付きました。

正しくはこう。

```js
crossroads.addRoute('/path/to/lovelive:?query:', query => {
// ...
});
```

公式のサンプルにこの場合がなかった（と思う）ので全然気づかなかったんですが、「crossroadsjs optional querystring」でググったら2秒で出てきた。
-> https://github.com/millermedeiros/crossroads.js/issues/94

OK, Google.
Windows10 のノートPC で VLAN を設定してみる(NIC:Realtek)

`Qiita で書くとGoogleさんのインデックス的には今一だなと思いつつ Qiitaで書いてます(多分はてなブックマークみたいな機能がないからだと思います)。`

会社のサーバーを社内ネットワークに繋ごうとスイッチのポートをVLAN設定してもらったのですが、どうにもつながりません。これは、VLAN辺りが怪しいとにらんでテストするときにノートPCにVLANを設定したときの記録です。

# 1. VLAN設定した状況
スイッチのポートに4つのタグVLANを切ってもらった。
1つのVLANは、ポートに untagでタグ無しパケットが来た場合はタグをつけてもらう。
残り3つはタグつきでパケットを出すのでタギングは無し。

まずタグなしでIPアドレスを設定したがつながらない。
恐らくuntag がポートに対して設定されていないのだろうけどそうじゃないかも。
ノートPCでタグ付きパケットを流してみてつながるか確認してみる。

# 2. 設定した機種情報
機種：ちょっと昔のVAIO
NIC：Realtek(8168ECだと思われる)
OS：Windows 10 Professional

# 3. 参考サイト
Realtek の NIC で VLAN を処理する
http://blog.techlab-xe.net/archives/2691

# 4. インストール 

## 1. Windows Diagnostic Programのダウンロード
RealtekのサイトからWindows Diagnostic Program for Win10
をダウンロードする。

Realtek
http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=4&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false
今時100MbpsのNICってこともないと思うので上記のURLで大丈夫でしょう。
Windows Diagnostic Program for Win10をダウンロード

0001-DiagnosticAllin1(2.0.2.11)_20150820_Win10Only.zip
なんてのがダウンロードされる

## 2. 展開
0001-DiagnosticAllin1(2.0.2.11)_20150820_Win10Only.zip
をなにかアーカイバで展開

DiagnosticAllin1(2.0.2.11)_20150820_General_Win10Only
なんてフォルダができる。

## 3. セットアップ実行
EXE_Diagnostic ディレクトリにある setup.exe を実行する。

途中 Windows 8用です。とかメッセージが出るが気にしない。

# 5. VLAN設定
## 1. 初期状態

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/955a1e15-1484-c195-0bf5-8a8d0f98cb62.png)
 
まだVLAN用仮想NICは追加されていない。

## 2. Realteck Ethernet Diagnostic Utility を起動
スタートメニューから起動
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/217ab1f9-662e-75a3-7f0d-2f09b9cf0a84.png)

## 3. 起動後画面
起動後画面です。
仮想NICが一杯ついているのは気にしないでください。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/db931792-4a94-369b-3593-74a064ffec69.png)


## 4. VLAN設定画面を開く
物理NICをクリックして、VLANをクリックするとVLAN設定画面が出る。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/c46e0e68-ecde-065e-a241-cf5e89300766.png)

## 5. VLANを追加
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/34aedecc-7bfc-1a0b-9eaf-06ae99ec17d0.png)

追加ボタンを押してVLAN IDのところに追加したい VLAN-ID を入力
VLAN ID からフォーカスが外れると自動的にダイアログが出る。「はい」を選択
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/1a797463-6bbe-02b6-054c-47b03233ebd2.png)

しばし待つ

## 6. VLANが追加された状態
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/94b0e7e6-280b-372e-4065-e8cd83343b3b.png)

「イーサーネット 3」が追加されている。

## 7. 確認
「イーサーネット 3」が仮想NICとして追加されている。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/3fac7fdd-9f32-7727-a6bd-432d93da5603.png)

# 6. 後は通常通りのIP設定を行う。
fluentd の exec で外部プログラムが動かない時

fluentdのexecで渡すプログラムが落ちる時の対応方法です。

自分の環境ではtd-agentを使っていたのですが。
execでphpを実行した際に実行できなくなっていました。

# 解決方法
execでプログラムを実行する前にLD_PRELOADをアンセットします。

phpの場合はexec.shなど作って
<pre>
unset LD_PRELOAD
php hoge.php
</pre>
などとします。

# 原因
バージョンによってtd-agentの起動スクリプトに以下のようなコードがあります。
<pre>
# use jemalloc to avoid fragmentation
if [ -f "/usr/lib/fluent/jemalloc/lib/libjemalloc.so" ]; then
        export LD_PRELOAD=/usr/lib/fluent/jemalloc/lib/libjemalloc.so
fi
if [ -f "/usr/lib64/fluent/jemalloc/lib/libjemalloc.so" ]; then
        export LD_PRELOAD=/usr/lib64/fluent/jemalloc/lib/libjemalloc.so
fi
</pre>

外部プログラムを実行する際この環境変数が引き継がれて実行されるようです
「libjemalloc.so」に関しては結構深そうなので割愛でー
JetBrains IDE で Surround Vim が使えるようになった

JetBrains IDE の IdeaVim プラグインが Version 0.46 になり、Surround Vim が使えるようになりました。いやあ、これ、待ってたんですよ。僕的には。

IdeaVim プラグインを最新にアップデートして、

`~/.ideavimrc` ファイルに次のように書きます。

```
set surround
```

以降、`S` コマンドで Surround Vim が使えます。

Surround Vim については

http://motw.mods.jp/Vim/surround.html などを参考にしてください。
ZYBO > [DRC 23-20] Rule violation (NSTD-1) Unspecified I/O Standard - 8 out of 138 logical ports use I/O standard (IOSTANDARD) value 'DEFAULT'

```txt:動作環境
DIGILENT ZYBO
Vivado 2015.4 on Windows 8.1 pro(64bit)
```
GPIOをPmodに出力するチュートリアルを実施中。
http://hybridcores.com/?p=78


bitstream生成時に以下のエラーが出た。


>[DRC 23-20] Rule violation (NSTD-1) Unspecified I/O Standard - 8 out of 138 logical ports use I/O standard (IOSTANDARD) value 'DEFAULT', instead of a user assigned specific value. This may cause I/O contention or incompatibility with the board power or connectivity affecting performance, signal integrity or in extreme cases cause damage to the device or the components to which it is connected. To correct this violation, specify all I/O standards. This design will fail to generate a bitstream unless all logical ports have a user specified I/O standard value defined. To allow bitstream creation with unspecified I/O standard values (not recommended), use this command: set_property SEVERITY {Warning} [get_drc_checks NSTD-1].  NOTE: When using the Vivado Runs infrastructure (e.g. launch_runs Tcl command), add this command to a .tcl file and add that file as a pre-hook for write_bitstream step for the implementation run. Problem ports: gpio_rtl_io_tri_io[7:0].


対応方法が以下に記載されている。
http://morilab-report.blog.jp/archives/1015865521.html
> Open Implementationでインプリ後のデータを開き、Layout>I/O Planningで端子アサインを確認してみる。
...
I/O Stdが赤い(defaultになっている)。LVCMOS18を選択して明示してやる。
修正し、再度インプリ実行。

実際に上記のI/O PlanningでDefaultから変更した (ZYBO_Master.xdcで記載されていたLVCMOS33にした)。

<font color=red>
変更を終了時に変更内容を保存するように聞かれたので使用している制約ファイル「ZYBO_Master.xdcに上書き」を選択したところ、ZYBO_Master.xdcファイルが書換えられた。問題は`set_property IOSTANDARD ....`の行だけとなり、`set_proerty PACKAGE_PIN...`の行が全部なくなってしまった。
</font>

I/O Portsにおいて、各ピンの[Fixed]にチェックをつけるとxdcファイルに`set_property PACKAGE_PIN ...`の行が記載されるようになった。
これでGenerate Bistreamを完了できた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f3563dde-ab25-18ff-6004-3a6dd6be6e92.png)
GCC treeのデータ構造

GCC treeのデータ構造を読んでみました。

treeはgccのfront endで使われている木構造を表すデータ構造です。
gccはパーサでソースコードをtreeに変換します。
treeのデータ構造はtree.hで定義されています。

対象: gcc 0.9 (私がgcc 0.9 のソースコードを読んでいるので→http://gcc.shoutwiki.com/wiki/Main_Page)

# tree_node
* treeはtree_nodeを連結したデータ構造です。
* tree_nodeはunionとして定義


```c
union tree_node
{
  struct tree_shared shared;
  struct tree_int_cst int_cst;
  struct tree_real_cst real_cst;
  struct tree_string string;
  struct tree_complex complex;
  struct tree_identifier identifier;
  struct tree_decl decl;
  struct tree_type type;
  struct tree_exp exp;
  struct tree_stmt stmt;
  struct tree_if_stmt if_stmt;
  struct tree_bind_stmt bind_stmt;
  struct tree_case_stmt case_stmt;
};
```

# tree_shared
* tree_nodeのメンバは、先頭にtree_shared構造体を持つ。

```c
struct tree_shared
{
  int uid;
  union tree_node *chain;
  union tree_node *type;
  enum tree_code code : 8;      /* Give it a byte only */

/* the attributes: (special properties of node) */
```
* gcc 2.xだとtree_sharedはtree_commonという名前になっているみたいです。

* よく出てくる マクロ TREE_CODE(x)でtreeのcodeを取得する。

```c
#define TREE_CODE(NODE) ((NODE)->shared.code)
```

* codeはtree_nodeの種類を表す。 code の値は tree.defで定義。
 * 整数定数ならINTEGER_CST、加算の式なら、PLUS_EXPR、if文なら、IF_STMT、変数宣言なら、VAR_DECL、などです。

* type は型のtree_nodeを指す。
* chain は次のtree_nodeを指す。 
* uidはtree_node毎にuniqueなidを持つ。


# tree_int_cst
* 整数定数は 上位と下位をlong型で持つ。
* 枝は無い。

```c
struct tree_int_cst
{
  char shared[sizeof (struct tree_shared)];
  long int_cst_low;
  long int_cst_high;
};
```

# tree_exp
* 式は枝として、operandsを持つ
* オペランドの数(枝の数)は式の種類により異なる。

```c
struct tree_exp
{
  char shared[sizeof (struct tree_shared)];
  union tree_node *operands[1];
};
```

# tree_stmt
* bodyを持つ
* loop_stmtはこの構造体を使って表す。

```
struct tree_stmt
{
  char shared[sizeof (struct tree_shared)];
  char *filename;
  int linenum;
  union tree_node *body;
};
```

# tree_if_stmt
* if文は枝として、条件、then部分、else部分の３つを持つ。
* stmtはファイル名と行数の情報を持つ。

```c
struct tree_if_stmt
{
  char shared[sizeof (struct tree_shared)];
  char *filename;
  int linenum;
  union tree_node *cond, *thenpart, *elsepart;
};
```

# tree_case_stmt
* switch case分は、indexとcase_listを持つ。
* 
```c
struct tree_case_stmt
{
  char shared[sizeof (struct tree_shared)];
  char *filename;
  int linenum;
  union tree_node *index, *case_list;
};
```

# tree_nodeのsize
* tree_nodeのサイズはcodeによって異なる。make_node()を見ると分かる。
* type が d or t なら固定長
* それ以外なら tree.defを使って定義するtree_code_length[]の値分を追加して確保する。

```c
  switch (type)
    {
    case 'd':  /* A decl node */
      length = sizeof (struct tree_decl);
      break;

    case 't':  /* a type node */
      length = sizeof (struct tree_type);
      break;

    case 's':  /* a stmt node */
      length = sizeof (struct tree_shared)
        + 2 * sizeof (int)
          + tree_code_length[(int) code] * sizeof (char *);
      break;

    default:   /* an expression or constant.  */
      length = sizeof (struct tree_shared)
        + tree_code_length[(int) code] * sizeof (char *);
    }
```



# 参考
* w_o さんの日記 
 * http://int.main.jp/log/03_12.html
 * http://web.archive.org/web/20040725032559/http://morihyphen.hp.infoseek.co.jp/log/03_12.html
* http://ja.gcc.wikia.com/wiki/Enum_tree_code
XMLをXSLTを使ってHTML文書にする 

XMLを使うと、パソコンにわかりやすい文書データファイルが作ることができます。
それを、人間にわかり易い文章にするにはHTMLにするとわかりやすいです。
それにはXSLT(XSL Transformations)XML変換言語を使います。
ちなみにブラウザはInternet Explorerが良いです。

#XSLを使うと？
- 人間にもPCにもわかりやすい文書ができます。したがって、とても効率のよい文書が作れるわけです。
- XMLを使うことによってデータファイルを視覚化することができ、データ交換にも役立ちます。

#作り方
XMLサンプルファイルをSampleFile.xmlとし、XSLTファイルをStyleDesign.xslとします。

```XML:SampleFile.xml
<?xml version="1.0" encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="StyleDesign.xsl"?>
<page>
  <class>
    <students>
      <no>1</no> 
      <name>山田太郎</name> 
      <age>13</age> 
      <tel>000-0000-0004</tel> 
    </students>
    <students>
      <no>50</no> 
      <name>井上智也</name> 
      <age>54</age> 
      <tel>555-2555-5555</tel> 
    </students>
    <students>
      <no>1401</no> 
      <name>塩田よし子</name> 
      <age>32</age>
      <tel>555-7878-4444</tel>
    </students>
  </class>
</page>
```

```XML:StyleDesign.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <head>
  <title>XMLとXSLT</title>
  </head>
  <body>
    <p style="text-align: center">とにかく表示してみよう</p>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>
```
このように書くと↓のようになります。
![tetetetet.JPG](https://qiita-image-store.s3.amazonaws.com/0/125607/6da02f3b-b1f2-b9c3-0a03-22ee8976560f.jpeg)


#コードの説明

 - 1行目が「このテキストはXMLですよ。」という意味です。
 - 2行目は「このXMLテキストを表示するのに使用するXSLTファイルはこれですよ。」という意味です。

##SampleFile.xml
1行目:	```<?xml version="1.0" encoding="UTF-8"?>```←エンコードはUTF-8
2行目:	```<?xml-stylesheet type="text/xsl" href="StyleDesign.xsl"?>```←このXSLTを使いますという宣言
3行目以降:  ```<!--・・・・・構造にしたがったタグ付きテキスト・・・・・-->```

##StyleDesign.xsl
1行目:```<?xml version="1.0" encoding="UTF-8"?>```←XML宣言
2行目:```<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">```←スタイルシート宣言
3行目～:	
```<xsl:template match="要素">
・・・ここに、もとの要素をどのように変換するかを書きます・・・
</xsl:template>```
↑スタイルシートの基本は、３行目以降から書かれている<xsl:template>要素です。この<xsl:template>要素で、もとのXMLドキュメントのどの要素をどのようなものに変換するかを示します。<xsl:template>の開始タグのmatch属性で、変換前のXMLドキュメントのどの要素を変換するかを指定します。実際には、色々な指定をするために<xsl:template>タグで囲まれた指定がたくさん必要になります。
そして要素(Element)とMatchを使ってHTMLにしていきます。

#XPathについて
詳しくは[XPathまとめ](http://qiita.com/merrill/items/aa612e6e865c1701f43b)というQiitaの記事が参考になります。
このXPathを使ってXMLが成り立っているのです。
#まとめ
この方法を使っていけばどんどんいい文書が作れると思います。CSSなども使えるので試してみてくださいね。
参考サイト:[楽しいXML](http://www6.airnet.ne.jp/manyo/xml/)
OpenFOAM用メッシュをGmshで作成し変換する方法（gmshToFoam）

# リンク

- [OpenFOAM wiki: 2D Mesh Tutorial using GMSH]
(https://openfoamwiki.net/index.php/2D_Mesh_Tutorial_using_GMSH)
- [Gmsh](http://gmsh.info/)
- [OpenFOAM wiki: GmshToFoam](https://openfoamwiki.net/index.php/GmshToFoam)
- gmshToFoam2：[GmshToFoam21x.tar.gz](https://openfoamwiki.net/images/4/47/GmshToFoam21x.tar.gz)

# Gmshのインストール

Ubuntuの場合は

```console
$ sudo apt-get install gmsh
```

とすれば`gmsh-2.8.3`をインストールできます。最新版（2016年7月現在は`gmsh-2.12.0`）を得るにはGmshのホームページから直接ダウンロードしてください。

```console
$ wget "http://gmsh.info/bin/Linux/gmsh-2.12.0-Linux64.tgz"   # Gmsh-2.12.0をダウンロード
$ tar zxvf gmsh-2.12.0-Linux64.tgz                            # 解凍
$ cd gmsh-2.12.0-Linux                                        # ディレクトリを移動
$ sudo su                                                     # 管理者へ移行
$ cp bin/gmsh /usr/bin/                                       # 以下、各ファイルをコピー
$ cp -r share/doc/gmsh /usr/share/doc/
$ cp share/man/man1/gmsh.1 /usr/share/man/man1/
$ gmsh -version                                               # バージョンを確認 >> 2.12.0が返ってくる
```

2.8.3から2.12.0までの変更点は[Gmsh Version History](http://gmsh.info/doc/VERSIONS.txt)を確認してください。（2.9.2からSurfaceに組み込まれたPoint/LineをExtrudeすることが可能となっていますので、その機能が必要な場合は最新バージョンをインストールしてください。）

# 説明

Gmshの使い方については上のリンクを参照してください。gmshToFoamはGmshで作成したメッシュをOpenFOAMのメッシュ形式に変換するユーティリティーアプリケーションです。ケースのルートディレクトリにおいて

```console
$ gmshToFoam <gmshFileName>
```

と入力すればGmshのメッシュがOpenFOAM形式に変換され`constant/polyMesh/`に保存されます。例えばディレクトリ構造が以下のようになっているケースの場合

```console:gmshToFoam実行前のディレクトリ構成
case/
  |---0/
  |   |---p
  |   |---U
  |
  |---constant/
  |   |---polyMesh/
  |
  |---system/
  |   |---controlDict
  |   |---fvSolution
  |   |---fvScheme
  |
  |---preProcess/
      |---gmsh.geo
```

Gmshを使ってメッシュを作成し、gmshToFoamでOpenFOAM形式に変換するには次のようにコマンドを入力します。

```console:Gmshでメッシュを作成しOpenFOAM形式に変換
$ cd preProcess/
$ gmsh -3 gmsh.geo                  # 3Dメッシュファイルgmsh.mshが作成される
$ cd ..
$ gmshToFoam preProcess/gmsh.msh    # メッシュ変換
```

```console:gmshToFoam実行後のディレクトリ構成
case/
  |---0/
  |   |---p
  |   |---U
  |
  |---constant/
  |   |---polyMesh/
  |       |---sets/
  |       |---boundary
  |       |---points
  |       |---faces
  |       |---owner
  |       |---neighbour
  |       |---pointZones
  |       |---faceZones
  |       |---cellZones
  |
  |---system/
  |   |---controlDict
  |   |---fvSolution
  |   |---fvScheme
  |
  |---preProcess/
      |---gmsh.geo
      |---gmsh.msh
```

Gmsh内で定義されたPhysical SurfaceおよびPhysical Volumeは、定義された名前のままそれぞれ

- Physical Surface --> boundary（outer surfaceの場合）またはfaceZones（internal surfaceの場合）
- Physical Volume --> cellZones

と変換されます。ただしgmshToFoamには、Gmshで定義されたinternal surfaceの名前を認識できずfaceZone_#という名前でfaceZone内に保存するというバグがあります。これはgmshToFoam2を使うと避けることができるようですが、gmshToFoam2はfoam-extend-3.2には標準で含まれておらず、またファイル・クラス・関数の定義名がgmshToFoam作成時から変化しておりMakeファイルおよびソースコードの修正が必要です。
ZYBO > Pmod > JA: XADC / JB: Hi-Speed / JC: Hi-Speed / JD: Hi-Speed / JE: Std. / JF: MIO

[ZYBO FPGA Board Reference Manual (pdf)](http://www.marutsu.co.jp/contents/shop/marutsu/datasheet/595400.pdf)

p.2 
> Six Pmod connectors (1 processor-dedicated, 1 dual analog/digital, 3 high-speed differential, 1 logic-dedicated)

p3
> MIO Pmod
> Standard Pmod
> XADC Pmod

p25 
> Pmod JF (MIO)

p25
> 16.1 Standard Pmod
> 16.2 MIO Pmod
> 16.3 Dual Analog/Digital Pmod (XADC Pmod)
> 16.4 High-Speed Pmod

6つあるPmodのうち、1つだけがPSに接続されていて、それ以外はPLとつながると理解した。
色弱シミュレーションの違いを比較してみる

色弱をシミュレーションできるサイトのいくつか試していたところ、微妙に色が異なるように思えました。入手できるソースコードをもとにどれくらい異なるのか比較してみました。
今回使用した環境はUbuntu12 + ImageMagick 7.0.2-2 Q16（ソースからコンパイルしたもの）です。

ちなみにシミュレーション結果が異なる理由を「[カラーユニバーサルデザイン（CUD）チェックツール（色覚シミュレーション）の原理と注意点](http://jfly.iam.u-tokyo.ac.jp/color/CUD_checker/)」では以下のように書いています。

> 一般色覚の人は色を3種類の錐体で見分けているので、見分けられる色の種類を3次元上の立体で表すことができます。一方、色弱（強度）の人は色を2種類の錐体で見分けているので、見分けられる色は2次元の平面で表すことができます。そこで、3次元の色座標の各点を、その中の2次元平面上の点に置きかえる計算を行うのが、チェックツールの原理です。この際に、どのような傾きの平面上の点に置きかえるのかによって、計算結果が微妙に異なってきます。
（「カラーユニバーサルデザイン（CUD）チェックツール（色覚シミュレーション）の原理と注意点」より引用）

##シミュレーション画像の作成方法
[ImageMagick](http://www.imagemagick.org/)は`-color-matrix`オプションを使って色変換が行えますので、それを使ってシミュレーションしてみようと思います。
`-color-matrix`は以下のように9つの数値を指定します。結果は3つの数値が1セットで初めの3つが赤チャンネル、次が緑チャンネル、その次が青チャンネルとなっているようです。

```
-color-matrix ' 1 0 0
                0 1 0
                0 0 1'
```

以下のような計算が行われると考えればいいのかなと思います。

```text
red'	= 1 * red + 0 * green + 0 * blue
green'	= 0 * red + 1 * green + 0 * blue
blue'	= 0 * red + 0 * green + 1 * blue
```

GIMPのカラーミキサー（`色` → `色要素` → `カラーミキサー`）をイメージした方が分かりやすいかもしれません。
![gimp_colormixer.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/743cda3e-a1fd-4bc5-d02e-9a3be2dfb9ff.jpeg)


##使用したRGB値
今回は以下の2つのサイトで公開されているソースコードとFirefox（Colorblind Designアドオン）とChrome（Spectrum拡張機能）のソースコードの計４つからP型（Protanopia）のRGB値を抜き出してみました。

- https://gist.github.com/Lokno/df7c3bfdc9ad32558bb7 - colorMatrices.js
- http://lpetrich.org/Science/ColorBlindnessSim/ColorBlindnessSim.html

それぞれのRGB値は以下のような感じになっていました。

```text:colorMatrices.js
0.567  0.433  0
0.558  0.442  0
0      0.242  0.758
```

```text:ColorBlindnessSim
0.202  0.992 -0.194
0.164  0.793  0.044
0.009 -0.013  1.004
```

```text:Firefox（アドオン）
0.111  0.888  0
0.111  0.888  0
0      0      1
```

```text:GoogleChrome（拡張機能）
 0.152286  1.052583 -0.204868
 0.114503  0.786281  0.099216
-0.003882 -0.048116  1.051998
```

さらにImageMagickの`-colorspace`オプションの値を変えるとどう影響するのかも試してみようと思います。

##実際のコマンド＆オプション
今回はImageMagickに含まれる`convert`コマンドの`-colorspace`オプションと`-color-matrix`オプションに先ほど調べたRGB値を指定する事でシミュレーションします。

実際に使用したコマンドは以下のような感じです。`-colorspace`と`-color-matrix`の値を変えていって、生成された画像をまとめるといった事を行ないました。

```console
$ convert in.jpg -colorspace RGB -color-matrix "0.567 0.433 0 0.558 0.442 0 0 0.242 0.758" out.jpg
```

##それぞれを比較してみる
colorMatrices.js、ColorBlindnessSim、Firefox（Colorblind Designアドオン）、Chrome（Spectrum拡張機能）のRGB値に対して「未指定」「RGB」「sRGB」「LMS」の4つのカラースペースを当ててみました。※LMSカラースペースはUbuntu12、14の標準パッケージとして提供されているImageMagick6では使用できませんのでご注意下さい。

元の画像は以下のとおりです。
![spectrum4.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/b8c78771-37b2-b521-6914-dbe152189060.jpeg)
（[Wikipedia - Visible spectrum](https://en.wikipedia.org/wiki/Visible_spectrum)より引用）

P型への変換結果は以下のとおりです。
![w-out-p.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/e1a943bf-f478-284b-8415-9c1f9c282b47.jpeg)

ちょっと見にくい画像ですが、ぱっと見でも「P型をシミュレーション」と一言でいっても結果に違いがある事が分かります。P型と言ってもL錐体がない人、L錐体の分光感度がずれてM錐体と似てしまっている等々があって見え方は人によって違っている考えれば、結果はひとつではないと考えるほうが正しいようにも思えます。少なくとも今の私の仕事＆プライベートの範囲ではそれで分かるというだけで十分かなと思います。
Topshelf（Windowsサービス用フレームワーク）がバージョンアップしていた

# 0. 前置き
個人的に気に入っているフレームワークのTopshelfがバージョンアップされていたので、何が変わったかをまとめます。Topshelfは、Windowsサービスを簡単に開発・テストするために作られたフレームワークです。Windowsサービスを対象としているものは珍しいこともあり、以前ブログで紹介したときもけっこう反響が大きかったです。

基本的な使い方は変わらないため、基礎を押さえたい方は私が昔書いたポストをご参照ください。 → [Windowsサービスを楽に開発～TopShelf～](https://84zume.wordpress.com/2014/03/23/topshelf/)

# 1. バージョンアップした点
前回調べたときのバージョンが「3.1」でした。2016/07/09現在のバージョンは「4.0」。この差分を見ます。特にリリースノートなどは無いので、GithubのCommitログベースでまとめてみます。箇条書きベースで。

- セッション変更イベントを扱えるようになった
    - WindowsのセッションIDの変更を検知できるようだ。
- Windowsサービスを登録する際に「LocalSystem」を利用できるようになった
- 「起動（Start）」、「終了（End）」のタイムアウトを定義できるようになった
    - 起動失敗とか起こりそうなので便利かも。
- 対応するロギングフレームワークの追加：Elmah, Serilog
    - Serilogなんて初めて聞いた
- サービスインストール時にEventLog Sourceを自動的に作らないよう変更
- NLogの新しいシグネチャに対応
- .NET 4.5.2対応
- サービス名とサービス表示名に空白を許容する
    - いままで許容していなかったんだ。気付かなかった。
- その他もろもろ改善。

# 2. まとめ
簡単ですがまとめました。2014年あたりはほとんど改善されていなかったんですが、2015年と2016年でまた活発に開発が進められているようで安心しました。