OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu16.04のMySQL5.7にはmecab用のプラグインがインストールされていない

これが失敗する

```
$ mysql -uroot -p
mysql> INSTALL PLUGIN mecab SONAME ‘libpluginmecab.so’;
```

`mysql> show plugins;`してもmecabのプラグインがない

プラグインの場所を調べる

```
mysql> show variables like 'plugin_dir';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| plugin_dir    | /usr/lib/mysql/plugin/ |
+---------------+------------------------+
1 row in set (0.00 sec)
```

プラグインの場所にソースからビルドして作成したlibpluginmecab.soを入れれば認識してくれるかと思ったが失敗した
`sudo cp /usr/local/mysql/lib/plugin/libpluginmecab.so /usr/lib/mysql/plugin/libpluginmecab.so`

ソースコードからインストールした

```
cd /usr/local/src
sudo wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.18.tar.gz
sudo tar xavf mysql-boost-5.7.18.tar.gz
sudo mkdir -p /usr/local/build/mysql-5.7.18
cd /usr/local/build/mysql-5.7.18
sudo cmake /usr/local/src/mysql-5.7.18 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/build/mysql-5.7.18/boost \
-DWITH_MECAB=system
sudo make -j4
sudo make install
cd /usr/local/mysql
sudo chown -R mysql:mysql .
sudo /usr/local/mysql/bin/mysqld –initialize –user=mysql

一時パスワードをコピー
A temporary password is generated for root@localhost: oajIOEFGGei

sudo chown -R root .
sudo chown -R mysql data

sudo ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
sudo apt-get install sysv-rc-conf
sudo sysv-rc-conf mysql on
sudo sysv-rc-conf –list
```

mecabのプライグインのインストールに成功した

```
mysql -uroot -p
INSTALL PLUGIN mecab SONAME ‘libpluginmecab.so’;
```

##参考サイト
[Installing MySQL Using a Standard Source Distribution](https://dev.mysql.com/doc/refman/5.7/en/installing-source-distribution.html)
[Installing MeCab From Source](https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-mecab.html)
VirtualBoxのホスト⇔ゲスト共有フォルダの設定


# 目的
* VirtualBoxでは、GUI画面→設定→共有フォルダから共有フォルダを追加できるが、デフォルトではこれで追加される共有フォルダにはrootしかアクセスできない
* 一般ユーザでも共有フォルダにアクセスできようにする

# 環境
* Ubuntu 16.04
* VirtualBox 5.1.20

# 作業

## 1. 共有フォルダのアクセス権を調べる
* 上記GUI画面で、「hoge」という名前の共有フォルダを作ると、/media/**sf_**hoge という名前でマウントされる
* グループが「vboxsf」であることを確認

```bash
$ cd /media
$ ls -l

drwxrwx---  1 root vboxsf    0  4月 30 12:41 sf_hoge
```


## 2. ユーザにvboxsfグループを追加
```bash
$ sudo adduser ユーザ名 vboxsf
```
## 3. ログアウト
* ログアウトすると、ユーザにvboxsfが追加されるので、共有フォルダにアクセスできるようになる
WordpressをUnityエンジニアが導入した話

夢のゴールデンウィークなのでいつもと違う事をやろうと思いました。
普段はUnityで開発しているのですが、たまにはサーバーサイドもやってみるかと思い、よくあるWordpressをVagrantで作った環境に構築する感じの事をやることにしました。その過程で詰まった所とかを書こうと思います。
ちなみにスキル的には

- 普段はUnity(C#)での開発
- phpやjsもコードは書ける
- vagrant自体は触ったことある(vagrant upしとけば良いんでしょ？)
- wordpressは初めて(ツール自体も)
- linuxサーバーに入って色々設定見たりは経験有り(会社の研修で導入だけ)

こんな感じです。

# 仮想環境を作る
下記の記事を参考にVirtualBoxとVagrantをインストールします。ただし折角なので新しめなやつを採用していこうと思って居たのでCentOSのバージョンを`6.7 -> 7.2`に置き換えてやりました。

[Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する](http://qiita.com/ozawan/items/160728f7c6b10c73b97e)

### vagrant up 出来ない
いざ`vagrant up`しようとしたら

```
The executable 'cygpath' Vagrant is trying to run was not
found in the %PATH% variable. This is an error. Please verify
this software is installed and on the path.
```

なるエラーが出ました。そういえばcygwin入れてなかったなと思いインストールしてPATHを通したら問題なく`vagrant up`出来ました。SSHクライアントも入ってなかったのでPuTTYを導入しました。

# wordpressを入れる

[nginxでwordpressを動かすには](http://qiita.com/fk1/items/3ef1d989d1d5e44a1d03)

上記の記事を参考に導入しました。[WordPress日本語サイト](https://ja.wordpress.org/)を見ると`PHP バージョン 7以上`という記述があるのでPHP7を入れることにします。PHP7のインストールに関しては「[CentOS7にPHP7をyumでインストールする](http://qiita.com/inakadegaebal/items/b57cf10339978d638305)」も合わせて読みました。加えて`php-fpm`がなかったので一緒に下記のコマンドも叩いてます。一部被ってますが気にせずやってます。
`sudo yum install --enablerepo=epel,remi-php70 php php-mcrypt php-mbstring php-fpm php-mysqlnd php-opcache php-apc`

## configtest出来ない

nginxとphp-fpmの設定を変更した後に`service nginx(php-fpm) configtest`をしようと思ったのですが

```
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
```

というエラーが出て出来ませんでした。調べた所、
`sudo nginx -t`、`sudo php-fpm -t`とするとテスト出来ました。

## wp-config.phpの文字化け

日本語が恐ろしいまでに文字化けしていました。vimの設定等は問題なかったので少し困ったのですが、PuTTYの`ウインドウ -> 変換 -> 文字コードの設定`で`UTF-8`を設定することで表示出来ました。

# wordpress 起動！！
これは問題なく出来ました。アクセスしてちょっと感動。

## と思っていた時期が私にもありました
試しにテーマのインストールを試そうとするとFTPがどうのこうのと言われました。
[WordPressあるある　プラグインがインストールできない・・・２段階の対応](http://qiita.com/rojiuratech/items/550846c23756d4b15cb2)
この記事を参考に修正しました。ただし導入したのがapacheではなくnginxなので
`sudo chown -R nginx:nginx /var/www/wordpress`
こんな感じのコマンドになっています。

# 無事終わった
調べたり試行錯誤していたりで約6時間かけて導入しました。余裕があればテーマのカスタマイズもやってみようと思ってましたがそんな時間はなかった。
一時期dockerで遊んでた事があるのでdockerを使えばすぐ終わるんだろうなと思いつつ、あくまで基本を抑える感じでやりました。

次はLaravel使って何かやりたいなぁ。
Vue.js チートシート 日本語版

#置き場
https://nak1114.github.io/cheatsheet/

#Fork元
https://vuejs-tips.github.io/cheatsheet/

Vue.js使っていて一覧表が欲しくなり探したら一発で見つかったけど、当然英語。
公式サイトには日本語もあるので、こっちも対応させてみました。
Vue.js関連サイトなのにVue.jsを使用していないところが興味深い。
メモ用：Laravel構築

## 環境
- CentOS 7.3 (最小構成)
- nginx 1.12
- PHP 7.1
- MariaDB 5.5
- Laravel 5.4.21

## リポジトリ追加
```:EPEL
yum install -y epel-release
```
```:Remi
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```
```:nginx
yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
```

### PHP version 7.1 有効化
```
yum install yum-utils
yum-config-manager --enable remi
yum-config-manager --enable remi-php71
```

## インストール
* nginx

```:console
yum install -y nginx
```
* PHP

```:console
yum install -y php php-mbstring php-pear php-fpm php-mcrypt php-mysql php71-php-fpm php71-php-mysqlnd php71-php-mcrypt php71-php-mbstring php71-php-gd
```
* MariaDB

```:console
yum install -y mariadb mariadb-server
```
* git

```:console
yum install -y git
```
* Composer

```:console
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```

## 設定
### PHP
```
# vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx

listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
```

#### 自動起動
```:console
systemctl start php-fpm
systemctl enable php-fpm
```

### Laravel
```:console
mkdir /var/www
cd /var/www/
composer create-project --prefer-dist laravel/laravel Test
chmod -R 777 /var/www/Test/storage
chmod -R 777 /var/www/Test/bootstrap/cache
```

### nginx
```
# vi /etc/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  localhost;

    charset utf-8;
    root    /var/www/Test/public;
    index   index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php$query_string;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }
}
```

#### 自動起動
```:console
systemctl start nginx
systemctl enable nginx
```

### MariDB
```:console
systemctl start mariadb
mysql_secure_installation 
```

#### 自動起動
```:console
systemctl enable mariadb
文字列の1文字目が母音である列を取得するクエリー

# 元ネタ
https://www.hackerrank.com/challenges/weather-observation-station-6
# 方法1
IN演算子とSUBSTRING関数を使用する

```mysql
SELECT DISTINCT city
FROM station
WHERE SUBSTRING(city, 1, 1) IN ("a", "e", "i", "u", "o")
;
```
# 方法2
REGEXP文字列正規表現演算子を使用する

```mysql
SELECT DISTINCT city
FROM station
WHERE city REGEXP "^[aiueo]"
;
```

# 参考
12.3.2 比較関数と演算子
https://dev.mysql.com/doc/refman/5.6/ja/comparison-operators.html#function_in
12.5 文字列関数
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html
12.5.2 正規表現
https://dev.mysql.com/doc/refman/5.6/ja/regexp.html
行き詰まり（備忘録）

毎回nvmでnodeのインストールがされていることを確認しないとnodeが呼び出せない
おそらくパスが通っていないからではないかと思われる。

あとnodeでサーバを立てる際に他のプロセスがその対象のファイルを触っていると
モジュールがみつからないとかなんとか言われるから、
node使うときは他の関係してそうなプロセスは殺しておくべきっぽい

nodejsでのwebサーバの進捗は明日あげます。
Chefのインストールからknife-zeroでサーバ自動構築まで

前提として、サーバ側にはsudoが使えるユーザを作っておく。

↓以下仮定
サーバのアドレス：test-server.com
sudoユーザ：test_user
node名：test_node
cookbook：test_cook

## Chef Development Kit ダウンロードしてインストール

まずはダウンロードしてインストール
https://downloads.chef.io/chefdk

MACでもWindowsでもchefのコマンドは一緒。

## knife-zeroインストール

```
chef gem install knife-zero --no-document
```

## リポジトリ作成

```
chef generate repo chef-repo
```

↓こんな感じのものが作られます。

```
chef-repo
├── LICENSE
├── README.md
├── chefignore
├── cookbooks
│   ├── README.md
│   └── example
│       ├── README.md
│       ├── attributes
│       │   └── default.rb
│       ├── metadata.rb
│       └── recipes
│           └── default.rb
├── data_bags
│   ├── README.md
│   └── example
│       └── example_item.json
├── environments
│   ├── README.md
│   └── example.json
└── roles
    ├── README.md
    └── example.json
```

## kinfe-zeroを使用するための設定

```
cd chef-repo
mkdir .chef
vi .chef/knife.rb
```

knife[:automatic_attribute_whitelist]を入れないと、
nodeファイルの中身が大量に作られるので、これぐらいに収めてみる。
fqdn,hostname,roles,recipes
らへんがあれば動くかと思う。

```chef-repo/.chef/knife.rb
local_mode true
knife[:automatic_attribute_whitelist] = [
  "fqdn/",
  "os/",
  "os_version/",
  "hostname",
  "ipaddress/",
  "roles/",
  "recipes/",
  "ipaddress/",
  "platform/",
  "platform_version/",
  "platform_version/",
  "cloud/",
  "cloud_v2/",
  "chef_packages/"
]
```

## nodeにサーバ追加

sshでサーバ側につながり、chefがインストールされ、nodeファイルが作られる
node名：test_node

```
knife zero bootstrap test-server.com:<ポート> -x test_user --sudo -N test_node
パスワードを求められる
```

node確認

```
knife node list
test_node
```

フォルダ構成はこんな感じになったよ

```
chef-repo
├── LICENSE
├── README.md
├── chefignore
├── cookbooks
│   ├── README.md
│   └── example
│       ├── README.md
│       ├── attributes
│       │   └── default.rb
│       ├── metadata.rb
│       └── recipes
│           └── default.rb
├── data_bags
│   ├── README.md
│   └── example
│       └── example_item.json
├── environments
│   ├── README.md
│   └── example.json
├── nodes
│   └── test_node.json
└── roles
    ├── README.md
    └── example.json
```

## クックブック作成

```
chef generate cookbook cookbooks/sample_cook
```

レシピは今回は適当

```chef-repo/cookbooks/sample_cook/recipes/default.rb
package 'vim' do
    action :install
end
```

## 先程作ったnodeに、実行させるcookbookを指定

```
knife node run_list add 'test_node' 'sample_cook'
```

## サーバに対してレシピ実行

```
knife zero converge name:test_ -x test_user --sudo
```

fqdnの値でsshに接続される。
Azureとかでなったんだが、fqdnで接続出来ない場合、  
-a knife_zero.host  
を追加すれば、knife_zero.hostの値でssh接続を行う

以上
Pythonでlinuxのfindのようなファイル検索


いつも忘れるので，メモ．

```Python:myfind.py
import os
import fnmatch
import argparse

# parsing arguments
parser = argparse.ArgumentParser()
parser.add_argument('path', type=str, default=None,
    help="Directory for searching files.")
parser.add_argument('-n', '--name', type=str, default='*',
    help="Pattern for searching files.")
args = parser.parse_args()

# search
files = list()
for root, dirs, names in os.walk(args.path):
    new_files = [ os.path.join(root, f) for f in names
        if fnmatch.fnmatch(os.path.join(root, f), args.name) ]
    files.extend(new_files)

# print
for f in files:
    print f
```

```
# ls -F .
hoge/	uga/	ponyo.txt
# ls -F hoge
hogera.py	honyara.sh
# ls -F uga
uga.sh		ugera.py
# python myfind.py . --name "*.py"
./hoge/hogera.py
./uga/ugera.py
```
ZburshからIDマップ画像を出力してみる

他のツールでやれって話なんですが、前回サブスペ（サブスタンスペインターを勝手にこう呼んでる）上で簡易的にIDマップ作成する記事( http://qiita.com/harayoki/items/e62a80136221de9ccc91 )を書いた際に、ZbrushでもポリグループからIDマップ作る解説をどこか海外のサイトで読んだ気がする、って書いたので思い出しながら実際にやってみた奴です。元記事はどこにあったかわからないので自己流入ってます。

結論できたんですが、ちょっと面倒なところがあるんで、まあメモ程度で。

## 手順

<img width="386" alt=" 2017-05-04 0.59.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/5a1ca120-1cf7-421a-964d-b0739696c8f7.png">
まずターゲットとなるモデルをZbrush上でポリグループ分割します。この際、ポリグループごとに一旦サブツールに分割して、再度マージします。理由は後述。
このモデルはサブスタンスペインター2.6に付属してくるMAT君。彼は最初からIDマップ持ってるんですが、ここでは別のパーツ分割とUV展開をやり直しています。

<img width="360" alt=" 2017-05-04 1.38.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/cc57878b-8cc8-3bd6-1211-332afa9dc598.png">
UVマスターでUV設定を行います。ポリグループ別に作るのチェックを入れた方がいいかも。

<img width="469" alt=" 2017-05-04 1.36.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/6b55ae57-547e-3f75-ab4c-fcac395d18ba.png">
ここがキモの工程なんですが、ポリグループメニューから、ポリグループをポリペイントに変換、を行います。いろんな機能があるもんだ。

<img width="289" alt=" 2017-05-04 1.46.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/5b2aae04-ae06-8c70-aa56-21a71fd303a4.png">
このように（なんか色変わってますが）モデルにポリペイントがほどこされました。

<img width="771" alt=" 2017-05-04 1.47.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/592102a6-1cc4-dab1-c649-4e52724d54c5.png">
今度はポリペイントからテクスチャの作成機能を使います。これはいつも使ってるやつです。

<img width="258" alt=" 2017-05-04 1.47.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/b8173ed7-f0eb-15a5-4e2c-7d2ecef33033.png">
このように、IDマップぽい画像を用意する事ができました。クローンした外部保存するか、fbxエクスポートして使うなどすればOKです。

![CL_Mesh_MAT5_2.png](https://qiita-image-store.s3.amazonaws.com/0/8302/7475819e-b4df-2b96-5d19-38ac9b37630d.png)
きちんとピクセル単位で色分けができています。

## 注意点
一旦サブツールに分割して、再度マージした理由ですが、同一メッシュの中に異なるポリグループがあるとテクスチャを生成した際に色の滲みができてしまうからです。ポリグループ=頂点カラーなので、まあそうなりますね。

<img width="168" alt=" 2017-05-04 1.25.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/25fae502-f81e-1d3f-7323-9f4f29d49be1.png">
滲んだ図。

別にサブツール分割じゃなくても良いですが、メッシュがポリグループごとに分かれている状態ができれば良いわけです。この辺りが手順が面倒と言った所以です。
一発でIDマップ書き出せるプラグインやら機能やらは存在しないものかな。
がっつりiOSをやった人がAndroidに移るとListenerの実装でハマるかもしれない話

# 初めに

しばらくiOSの実装ばかりした後で久々にAndroidの実装にとりかかったら、
何故か変なタイミングでListenerのインスタンスが解放されてしまうのにちょっと悩まされた。

# やったこと
多分誰でも一度は書いたことがある、iOSで言うDelegate、 Androidで言うListenerを↓こんな感じで実装した。
メソッド名とかの流儀がおかしい、とかの話は今回は気にしない。

## iOS

```swift

import UIKit

// UI
class ViewController: UIViewController, ModelDelegate {
    
    let model = Model()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        model.delegate = self
    }
    
    func notify(model: Model) {
    }
}

// Modelと通知用のprotocol
protocol ModelDelegate: class {
    func notify(model: Model)
}
class Model {
    weak var delegate: ModelDelegate?
    
    func doSomething() {
        // 何かする
        delegate?.notify(model: self)
    }
}
```

## Android
```java

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.lang.ref.WeakReference;

// UI
public class MainFragment extends Fragment {

    private Model model;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        this.model = new Model();
        model.setListener(new ModelListener() {
            @Override
            public void notify(Model model) {

            }
        });

        return super.onCreateView(inflater, container, savedInstanceState);
    }
}

// Modelと通知用のinterface
interface ModelListener {
    void notify(Model model);
}

class Model {

    private WeakReference<ModelListener> mListener;

    void setListener(ModelListener listener) {
        mListener = new WeakReference<>(listener);
    }

    void doSomething() {
        // 何かする
        // 本当はnullチェックする

        mListener.get().notify(this);
    }
}
```

で、これだとiOSでは問題なく動く。
Androidでも問題なく動くように思わせておいて、あるとき突然 `mListener.get()` がnullを返すようになる。

## 原因
無名クラスで実装するとListenerを強参照しているインスタンスが無いのでGCの対象になる、という話だった。
GCが走ったタイミングで`mListener.get()` がnullを返すようになる。

無名クラスでない、通常のクラスで実装すると強参照されているので大丈夫だった。

## 考えたこと
(じゃあWeakReferenceではなくすべき？ 
でも強参照したら無名クラスでない通常のクラスで実装したときに循環するよな…。
え、javaってinterfaceの実装の仕方を強制するようなクソ言語なの?)

とか考えたがもちろんそんなことは無く、クソなのは自分の方だった。

## 結局
お気づきかとは思うが、javaはGCがあるので循環しても問題ない、という話だった。
ということでWeakReferenceじゃない普通の参照に直した。

iOSしかやったことが無い人がGCがある言語を書くときは気をつけよう。

## 終わりに
無名クラスはGCがあるからこそ可能な概念なのだ、ということに気付けたのは良い経験だった。
Python エラー時に出てくる英単語まとめ(随時更新)

自分の英語力はTOEICの点数で言うと770点です。
このレベルだと、自由に使うにはほど遠いけど、英文を読むとある程度の意味は理解できて、流し読みすることはできるといったレベルです。

語彙数は5000〜6000といったところでしょうか。
ちなみに語彙数が8000でTOEIC900、10000で英検1級レベルになります。

自分のレベルだとエラーで出てくる英単語の意味がわかりません。
毎回調べるのは面倒なので下記に調べた単語の意味を随時更新していきます。

- iterable 反復可能
- indented block インデントブロック
- parentheses　括弧
- concatenate　連結
c言語_三分木を実装する

```c:main.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


#define NAME 32
#define TRUE 1
#define LEFT -1
#define MIDDLE 0
#define RIGHT 1


typedef void(*DISPLAY)(void*);
typedef int(*COMPARE)(void*, void*);
typedef struct _tree3{
    void *data;
    struct _tree3 *left;
    struct _tree3 *middle;
    struct _tree3 *right;
}TriNode;
typedef struct _employee{
    char name[NAME];
    unsigned char age;
}Employee;


int compareEmployee(Employee *e1, Employee *e2){
    if ((e1->age) > (e2->age)) {
        return LEFT;
    } else if ((e1->age)==(e2->age)){
        return MIDDLE;
    } else {
        return RIGHT;
    }
}


void displayEmployee(Employee* employee){
    printf("%s\t%d\n", employee->name, employee->age);
}


void insertTriNode(TriNode **Root, COMPARE compare, void *data){

    TriNode *node = (TriNode*) malloc(sizeof(TriNode));
    node->data=data;
    node->left=NULL;
    node->middle=NULL;
    node->right=NULL;

    TriNode *root= *Root;

    if(root==NULL){
        *Root=node;
        return;
    }

    while(TRUE){
        if(compare((root)->data, data)==LEFT){
            if ((root)->left != NULL) {
                root = (root)->left;
            } else {
                (root)->left = node;
                break;
            }
        } else if(compare((root)->data, data)==MIDDLE){
            if ((root)->middle != NULL) {
                root = (root)->middle;
            } else {
                (root)->middle = node;
                break;
            }
        } else {
            if ((root)->right != NULL) {
                root = (root)->right;
            } else {
                (root)->right = node;
                break;
            }
        }
    }
}


void inOrder(TriNode *root, DISPLAY display){
    if (root != NULL){
        inOrder(root->left, display);
        display(root->data);
        inOrder(root->middle, display);
        inOrder(root->right, display);
    }
}


int main(int argc, const char *argv[]) {
    
    Employee *suzuki = (Employee*)malloc(sizeof(Employee));
    strcpy(suzuki->name, "suzuki");
    suzuki->age = 25;

    Employee *tanaka = (Employee*)malloc(sizeof(Employee));
    strcpy(tanaka->name, "tanaka");
    tanaka->age = 15;

    Employee *asa = (Employee*)malloc(sizeof(Employee));
    strcpy(asa->name, "asa");
    asa->age = 18;

    Employee *unko = (Employee*)malloc(sizeof(Employee));
    strcpy(unko->name, "unko");
    unko->age = 10;

    TriNode *tree = NULL;
    insertTriNode(&tree, (COMPARE)compareEmployee, suzuki);
    insertTriNode(&tree, (COMPARE)compareEmployee, tanaka);
    insertTriNode(&tree, (COMPARE)compareEmployee, asa);
    insertTriNode(&tree, (COMPARE)compareEmployee, unko);

    inOrder(tree, (DISPLAY) displayEmployee);

}
```

実行結果：

```c:main.o
unko    10
tanaka  15
asa     18
suzuki  25
```

　
三分木型のデータ構造を持つ構造体TriNodeは、各ノードに構造体Employeeのポインタをデータとして保持する。

関数insertTriNodeは、構造体TriNodeのノードへ新たに構造体Employeeを追加する。追加される構造体Employeeが左・真ん中・右のどの枝に属するかは、関数compareEmployeeによって決まる。

関数inOrderは通りがけ順で、構造体TriNodeの各Nodeに属する構造体Employeeが保持しているデータ(nameとage)を表示する。
　
参考：
> [詳説Cポインタ](https://www.oreilly.co.jp/books/9784873116563/)　

　
　
　
どやっ！
HTMLのタグ名称

円滑なコミュニケーションを行うには適切な言葉を使うことが大事だと思います。
なので、最初読み方がよくわからなかったHTMLタグの名称をまとめようと思いました。


a    :アンカー
　(「anchor」の略。リンクの出発点・到達点を指定する)

href :エイチレフ
　（「hypertext　reference」の略。)

width  :ウィドゥス（ウィズ）
　（表などの横幅を設定するプロパティ。）

height :ハイト
　（縦幅を指定するプロパティ。）

align  :アライン
　（要素と周りのテキストの位置関係を指定する属性。）

img　　　:イメージ
　（「image」の略。画像を表示するタグ。）

src :ソース
　（「source」の略。画像のあるurlを指定する属性。）

br      :ブレイク
　（「break」の略。改行を指定するタグ。）

dfn     :ディフィニション
　（「definition」の略。定義する用語を明示できるタグ。)

dir     :ディレクトリ
　（「directory」の略。リストを表示するタグ。）

em      :エンファシス
　（「emphasis」の略。強調文字・斜体文字を指定するタグ。）

i       :イタリック
　（「italic」の略。文字を斜体にするタグ。）

param   :パラメータ
　　(パラメータを指定するタグ。）

q　　　　　　　　　　　　　　:クォート
　　（「quote」の略。引用文であることを表すタグ。）

sub     :サブスクリプト
　　　（「subscript」の略。下付き文字を表示するタグ。）

sup     :スーパースクリプト
　　　（「superscript」の略。上付き文字を表示するタグ。)

u       :アンダーライン
　　　（「underline」の略。文字に下線を引くタグ。）

ul      :アンオーダードリスト
　　　（「unordered list」の略。番号なしのリストを作るタグ。）

ol      :オーダードリスト
　　　（「ordered list」の略。番号ありのリストを作るタグ。）
Docker起動までの最低限


# 目的
* dockerインストール後、起動まで最低限の操作をメモ
    * インストール：[UbuntuにDocker CEをインストールする](http://qiita.com/lynlea/items/e00248dd697059969203)

# 環境
* Ubuntu 16.04

# 作業
## 1. Dockerファイル作成
* Dockerイメージのコアには容量削減のためのAlpine Linuxを使うことが多けど、パッケージ依存の解決が大変なので、とりあえずUbuntuを使う

```bash:Dockerfile
FROM ubuntu:16.04

ARG USER_NAME="lynlea"
ARG USER_HOME="/home/lynlea"
ARG ROOT_HOME="/root"

#-------------------------------------
# 初期設定 
#-------------------------------------
# 時刻設定
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# aptリポジトリ変更
RUN sed -i -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.iij.ad.jp/pub/linux/ubuntu/archive/%g" /etc/apt/sources.list \
&& apt-get update && apt-get upgrade -y

# 文字コード設定
RUN apt-get -y install language-pack-ja-base language-pack-ja \
&& locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8 \
&& LANGUAGE ja_JP:en \
&& LC_ALL ja_JP.UTF-8

# ユーザ作成
RUN echo "CREATE_HOME yes" >> /etc/login.defs \
&& useradd -u 1000 ${USER_NAME}

#-------------------------------------
# パッケージインストール
#-------------------------------------
# do something

#-------------------------------------
# 後処理 
#-------------------------------------
RUN apt-get autoremove \
&& apt-get clean
```

## 2. Dockerイメージ作成

```bash:docker-build.sh
#!/bin/bash
set -e
IMAGE_NAME="lynlea/test-image"

docker build -t "${IMAGE_NAME}" .
```

```bash
$ ./docker-build.sh
```
## 3. Dockerコンテナ起動

```bash:docker-run.sh
#!/bin/bash
set -e

IMAGE_NAME="lynlea/test-image"
CONTAINER_NAME="test-container"
HOST_NAME="${CONTAINER_NAME}"

#PORT_HOST="8080"
#PORT_GUEST="80"

#DIR_HOST="/home/lynlea/docker_share"
#DIR_GUEST="/home/user/docker_share"

docker run -d -it \
	--name "${CONTAINER_NAME}" \
	--hostname "${HOST_NAME}" \
	-v /etc/localtime:/etc/localtime:ro \
	--restart=always \
	"${IMAGE_NAME}"

#-p "${PORT_HOSt}:${PORT_GUEST}"  \
#-v "${DIR_HOST}:${DIR_GUEST}" \
```
* -d … デーモン化（起動しっぱなし）
* -v /etc/localtime:/etc/localtime:ro … ホストと時刻を合わせる
* -p … ポート設定
* -v … ファイルマウント
* --restart=always … ホスト再起動したときに、このdockerコンテナを自動的に立ち上げる

```bash
$ ./docker-run.sh
```

## 4. 起動中のコンテナに入る

```bash
$ docker exec -it コンテナ名 bash
```
* 出るときは exit。-dでデーモン化しているからexitしてもコンテナ起動したまま
3. K5トライアル申し込み

このページは、
FUJITSU Cloud サービス K5 を使ってみる - Qiita
http://qiita.com/ynott/items/a256669c692625c5fd25
の「3. K5トライアル申し込み」のページです。

なんと、まだまだ先が長いです。
実は、WEB Martのアカウントを作ってからさらにトライアル申し込みが必要です。。。

# 1-1. 「WEB MART for クラウド」にログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/9895023c-8e55-cbac-dce0-2b8c4a20e0e4.png)

# 1-2. ログイン後
ログインしてみるとこんな感じですが、トライアル申し込みはどこでしょうね？ 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/2d0ccaeb-287e-0cc5-e9b4-5056abbc9703.png)

# 1-3. トライアル申し込み画面に移動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/3b21f129-c302-999a-41dd-6b077ab4c99b.png)

見えませんね。下までスクロールしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/ff564d8f-198f-97ee-3729-399eb3a75729.png)

ありました～。すかさずクリックです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/93b08060-e776-34f1-cda2-e8de8d85e807.png)

えっ！？www 落ち着いて「無料トライアルをクリックしましょう」:sweat:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/8d743d69-4391-e3e7-51d0-f63064119131.png)

ようやく申し込みできそうです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/be90bb18-11b3-9aad-159f-3810e012f6d1.png)

# 1-4. 承認して、申し込みに進む
同意チェックに入れて、「トライアル申し込みに進む」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/54691490-ff04-0cd5-f3bd-29b99762c77e.png)

# 1-5. お客様情報の入力
さすがに、これを見た時にはさすがにのけ反りましたわ。。。

これまでやってきたことは何だったんでしょうね？と思うぐらいビックリの入力欄です。。。。。:scream: これを考えた奴は、ゲンコで殴られても文句は言えないと思います。。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/54719540-9ac1-328c-1764-05ed36c4082a.png)

なんとか、入力がすみました(ゼハゼハ:tired_face:)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/4eef518a-c81e-c5c8-6422-d530a64ad8f1.png)
最終確認にすすみます。

# 1-6. 最終確認
見直して、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/d290756e-e80c-1105-7ec1-28f62df5849c.png)
「入力内容確定」を押すだけの簡単なお仕事です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/89e0895e-9376-c787-3b3c-309dc5d8d3d4.png)

# 1-7. 終了～お疲れ様でした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/6e2b687c-c248-482b-1c1f-3deb0269e3ec.png)

なんと言いますが、日本的ですね。。。

# 1-8. 電話連絡
審査が終わると電話連絡があります。
海外のクラウドだと英語で電話がかかってきたりしますが、日本のクラウドなので日本人が電話をかけてきます。安心して対応しましょう。
私の場合は、0899の局番からかかってきました。
実家が愛媛なので見慣れた局番にホッコリしました。

電話でいつから使い始めたいですか？ということなので、使い始めたい日程を指定します。気になるところはそれだけです。
知りたいことがあれば、この時に聞いてしまいましょう。
GitHub Enterprise も使いたい旨話をしました。料金がかかるかどうか聞きましたが、こちらも無料で使えるそうです。

# 1-9. 利用開始メール
こんなメールが届きます。
やった～。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/52cf71ab-04a2-be80-f03e-f1ec6d552bcb.png)

トライアルは期限があるので厳守ですね。
＜初心者向け＞　HTML,CSSを使って簡単なボタンを作成する。



#完成形
今回はEditボタンを作ってみます。
こんな感じです。

![スクリーンショット 2017-05-03 22.17.47.png](https://qiita-image-store.s3.amazonaws.com/0/179221/9c4c8c13-9fb0-dba6-e4f6-68c81681d12e.png)



#HTML
###まず、HTMLでEditボタンの大枠を作る。

```sample.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>ボタンを作る</title>
    <link rel="stylesheet" href="style.css">
  </head>

　<body>
　　<div class="button">Edit</div>
　</body>
</html>
```
- 内容は*body*に記述します。

#CSS
###続いてCSSを作成
　※リセットCSSは記述してません。

```style.css

  .button {
      height: 25px;
      width: 40px;
      font-weight: lighter;
      text-align: center;
      border:1px solid #38aef0;
      color: #38aef0;
      padding: 5px 20px;
  }
```
- *height*と*width*で作成するボタンの範囲を指定します。

- *text-align*で文字を*center*に移動。

- さらに*padding*でEditの位置を調節します。

- 枠の内側に幅を取りたいので、ここでは*margin*ではなく*padding*を使います。

- 見栄えをよくするために*font-weight*を使って文字の太さを調節しました。






HTML, CSSを始めたばかりの方、何か参考になればと思います。


- ボタンにもっとバリエーションをつけたければ、
以下の記事はとてもわかりやすく載っているので、参考になると思います。

http://www.nxworld.net/tips/css-only-button-design-and-hover-effects.html

https://saruwakakun.com/html-css/reference/buttons
EC2にWordPress構築テストのユーザーデータの個人メモ（nginx + mysql + php7）

EC2にWordPress構築テストのユーザーデータの個人メモ

* nginx（WordPressパーマリンク設定対応）
* mysql56
* php7

```bash:userdata.sh
#!/bin/bash
sudo yum -y update
sudo yum install -y nginx mysql56-server
sudo yum install -y php70 php70-fpm php70-mbstring php70-mysqlnd

sudo service nginx start
sudo service php-fpm start
sudo service mysqld start

sudo chkconfig nginx on
sudo chkconfig mysqld on
sudo chkconfig php-fpm on

#mysql
mysql -uroot -e "UPDATE mysql.user SET Password = PASSWORD('**********') WHERE User = 'root'"
mysql -uroot -e "DROP USER ''@'localhost'"
mysql -uroot -e "DROP USER ''@'$(hostname)'"
mysql -uroot -e "DROP DATABASE test"

mysql -uroot -e "CREATE DATABASE wordpress"
mysql -uroot -e "GRANT ALL ON wordpress.* to admin@localhost"
mysql -uroot -e "SET PASSWORD FOR admin@localhost=password('**********')"
mysql -uroot -e "FLUSH PRIVILEGES"

#wordpress
cat << EOF > ~/wordpress.conf
server {
  listen 80;
  server_name *.example.com;
  server_name ~^\d+\.\d+\.\d+\.\d+$;
  root        /var/www/html;
  index       index.php;

  charset utf-8;

  location / {
    try_files \$uri \$uri/ @wordpress;
  }

  location ~ \.php$ {
    try_files \$uri @wordpress;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME  /var/www/html\$fastcgi_script_name;
    include fastcgi_params;
  }

  location @wordpress {
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME  /var/www/html/index.php;
    include       fastcgi_params;
  }

  error_page 404 /404.html;
    location = /40x.html {
  }

  error_page 500 502 503 504 /50x.html;
    location = /50x.html {
  }
}
EOF

sudo mv ~/wordpress.conf /etc/nginx/conf.d/wordpress.conf

wget http://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz

sudo mv wordpress/* /var/www/html/
sudo chown -R apache:apache /var/www/html/
sudo service nginx restart
```
XHR中にクロスドメインのリダイレクトが発生した時に、リダイレクト先のページに遷移できない

# XHR中にクロスドメインのリダイレクトが発生した時に、リダイレクト先のページに遷移できない

上記についてハマった時のメモを残す。

## 状況
認証サーバ(OpenID Connect 準拠)を作っている。この時、以下のユースケースで認証が成立する。

1. アプリケーションから認証サーバにログイン処理が委譲される
1. 認証サーバで認証がすみ、ユーザにアプリケーションに対する同意を求める
1. 認証サーバはユーザ(UA)をアプリケーションのURIにリダイレクトさせる
1. アプリケーションは認証サーバから取得した情報を元に、ユーザを認証済みまたは拒否する

上記の3のプロセスで、リダイレクト先のページに遷移できなかった。

```log:エラーメッセージ
XMLHttpRequest cannot load <DESTINATION_HOSTNAME>. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin <SENDER_HOSTNAME> is therefore not allowed access.
```

以下、問題の焦点を分割し、それぞれについての対策を記述している。

## XHRでGETできない
### プリフライトリクエストを受信できるようにサーバを設定
サンプルとなるアプリケーションのサーバサイドは、S3のWebホスティングを使っている。
ここでは当該バケットの、CORS設定を下記のように変更した(See [here](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/cors.html#how-do-i-enable-cors))。

```xml
<CORSConfiguration>
	<CORSRule>
		<AllowedOrigin>*</AllowedOrigin>
		<AllowedMethod>GET</AllowedMethod>
		<MaxAgeSeconds>3000</MaxAgeSeconds>
		<AllowedHeader>*</AllowedHeader>
	</CORSRule>
</CORSConfiguration>
```
### プリフライトリクエストを送信できるようにリクエストヘッダを追加
リクエストヘッダに以下を追記(See [here](https://developer.salesforce.com/forums/?id=906F0000000MMKuIAO<Paste>))した。
これにより、ブラウザからプリフライトリクエストが飛ぶことになる。

```javascript
Requets
    .post('http://localhost:4000/authorization')
    .withCredentials()
    .set('Content-type', 'application/x-www-form-urlencoded')
    .set('Access-Control-Allow-Origin', '*')
    .set('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS')
  .  set('Access-Control-Allow-Headers', 'Content-Type, Content-Range, Content-Disposition, Content-Description')
```

## XHRでリダイレクトできない
### withCredentialsへの対応
リダイレクト先へのXHRではCookieを送信する必要はないのだが、大元のエンドポイントに対するリクエストには送信する必要があった。
このため、最終的なリダイレクト先に対しても`withCredentials = true`の状態でGETを行なっているようだ。
ゆえに、サーバのレスポンスヘッダ`Access-Control-Allow-Origin`が`*`だとNGになる(See [here](https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control))。この場合はサーバ設定にて送信元ホストを直接指定することで回避した。

```xml
<CORSConfiguration>
	<CORSRule>
		<AllowedOrigin>http://localhost:4000</AllowedOrigin>
		<AllowedMethod>GET</AllowedMethod>
		<MaxAgeSeconds>3000</MaxAgeSeconds>
		<AllowedHeader>*</AllowedHeader>
	</CORSRule>
</CORSConfiguration>
```

## 終わりに

|やったこと|必要性|
|---|---|
|アプリケーション側のCORS対応|やるべき|
|認証サーバ側のプリフライトリクエスト対応|やるべき|
|アプリケーション側のwithCredentials対応|やりたくはなかったが、仕方なく|

３つめについて、リダイレクト先(アプリケーション)には単純にGETリクエスト送信したかっただけだが、`withCredentials`対応をする必要があった。このためアプリケーションのサーバ設定で、`Access-Control-Allow-Origin`に送信元ホストを個別に指定することになってしまった。

なお、CORS関連の予備知識としてまとめた投稿は[こちら](http://qiita.com/rooooomania/items/4d0f6275372f413765de)にある。
【rails】hamlを初めて導入するときのミスと対処法

## hamlとscssを使いこなして、早くビューを作ろう。

railsのerbとcssの記述が早く見やすくなる、hamlとscss。学習コストが惜しくて、取り入れない方もいますが、記述がシンプルで早くなるため、絶対オススメです！以下はerbとhamlの比較です。↓

```erb:sample.erb
<section class=”container”>
  <h1><%= post.title %></h1>
  <h2><%= post.subtitle %></h2>
  <div class=”content”>
    <%= post.content %>
  </div>
</section>
```

```haml:index.haml
%section.container
  %h1= post.title
  %h2= post.subtitle
  .content
    = post.content
```

erbでは、class=“ “、id=“ “、<%= %>であったのが、hamlではそれぞれ . と # と = になります。断然楽ですよね？

Haml公式
http://haml.info/
railsへのhamlの導入
https://github.com/indirect/haml-rails

なお、以下のコマンドを入力することでerbファイルを一括でhamlファイルに変更することができます。

```:ターミナル
$ bundle exec rake haml:replace_erbs
```

ただ、最初は慣れずにエラーが多発してしまうことも。私が実際に起こしたミスとその対処法を置いておきます。

## インデントに対する意識が大事。

hamlはインデントにより階層構造を管理しています。私はhtmlの感覚で仮調整しようとして、レイアウトを崩していまうミスを多発していました。すでに書いてある記述を調整するときに、特にインデントを意識する必要があります。これが一番多かったミスなので、注意するだけでだいぶ時間を節約できるはずです。

```haml:sample.haml
.chat-menu
  .chat-menu__head
  .chat-menu__body
```

```haml:sample.haml
.chat-menu
  .chat-menu__head
    .chat-menu__body
```

## %と＝を混同しやすい。

erbでrubyを使用する場合、<%=  %>もしくは<%  %>で囲む必要がありましたが、hamlではそれを省略して、=　と - で記述します。私は慣れないうちは、%と書いてしまったりしてエラーを出していました。

## クラスを複数導入したいときはコンマで繋ぐ。

例えば、font-awesomeを導入するために、htmlの i class="fa fa-edit” と書きたいとします。htmlであれば、”fa fa-edit”とスペースを入れればいいのですが、hamlの場合はスペースを入れると、テキストとして認識されてしまします。この対処法は簡単でスペースの代わりにコンマを打つことでを対処することができます。

```haml:sample.html
<i class="fa fa-edit”>
```
上と下は同じ表記

```haml:sample.haml
%i.fa.fa-edit
```

省略してあるがゆえにわからないことも最初はあると思いますが、それさえわかればスピードはぐんと早くなるはずです。
UnityのLet's Tweet in Unityを用いた画像ツイート

Unityで画像付きツイートを行いましょう。
iOSとAndroidについては、[SocialConnector](https://github.com/anchan828/social-connector)を使っちゃえということで、Windows版をどうするかです。
[Let's Tweet in Unity](https://www.assetstore.unity3d.com/jp/#!/content/536)を使うのが簡単そうだったのですが、画像付きのツイートが出来ないので、情報を探していたら[こちらのサイト](https://teratail.com/questions/59416)にヒットしました。

タイトルがあちらのサイトのまんまなのですが、あちらのサイトの情報では不完全だったので、補足する意味であえて同じタイトルにしました。

さて、あちらのサイトの回答欄に、画像付きツイート用メソッドが書かれているので、そのままコピペして使えば良いのですが、実行してみると回答に書かれているとおり、「UriFormatException:Uri is longer than the maximum {0} characters.」というエラーが出ます。
さらにその解決法として「画像をjpgからpngに変えたらいけた」という書き込みがあるのですが、その解決方法は間違っており、この記事はその修正となります。

エラーの内容的には、Uri.EscapeDataStringに渡した文字列が長すぎるのが原因です。
画像をjpgからpngに変えて上手くいったのは、たまたまファイルサイズが小さくなって、文字列長が最大値に収まったからでしょう。
当然pngでもサイズが増えれば同じエラーが出ると思います。

エラーの場所はTwitter.csのUrlEncode(string value)内にあります。
`value = Uri.EscapeDataString(value);`なんですが、このメソッドが32766文字までしか変換ができません。
そこで、渡された文字列が32766文字以上だった場合は、文字列を分割しながら変換をかけてやることにします。

```
#if false
	value = Uri.EscapeDataString(value);
#else
	var result = "";
	int len;
	while ((len = value.Length) != 0)
	{
		var nowLen = (value.Length > 32766) ? 32766 : value.Length;
		result += Uri.EscapeDataString(value.Substring(0, nowLen));
		value = value.Substring(nowLen);
	}
	value = result;
#endif
```

ちなみにEscapeDataStringは.NETの4.0以降と以前で挙動が変わる場合があります。
よって、その下にあるエスケープ処理も念のため残しておきます。
詳しくは[こちらのサイト](http://dobon.net/vb/dotnet/internet/urlencode.html)にて。

これで晴れてWindowsでも画像付きツイートが行えるようになりました。
MacやLinux上では動くのかな？（5月6日追記：Mac上でも正常に動作しました）
機会があれば試してみたいと思います。

あちらのサイトに書き込みが行えれば良かったのですが、わざわざこのために向こうのサイトにユーザー登録するのも面倒なので、こちらに書きました。
すみません。
というか、アセット作者が対応してくれれば良いのになぁ。
コマンドによるファイル操作まとめ

個人的によく使うWindowsコマンドのメモ。
随時更新していきます。

```
//ディレクトリを移動
cd C:\\Users\%USERNAME%\Documents

//一つ前のディレクトリに戻る
cd ../

//ファイルを作る
mkdir xxx.csv

//コピーして別のファイルに書き込む
copy C:\\Users\%USERNAME%\Documents\sample.txt C:\\Users\%USERNAME%\Desktop\sample.csv
```
Mysql 5.7 データー 移行

# Mysql のデーターベースからデーターを全て移行する方法になります。

## mysql からデーターを取得する方法

```
 mysqldump -h HOST_NAME -u USER_NAME -p DATABASE_NAME > OUTPUT_DATA

#sample

 mysqldump -h localhost -u hoge -p hogedb > outputhoge

```

ホスト名やユーザー名は下記で取得できます。

```
mysql -u user -p

select Host, User from mysql.user;

+-----------+----------------+
| Host      | User           |
+-----------+----------------+
| %         | user           |
| %         | user@localhost |
| localhost | mysql.sys      |
| localhost | root           |
+-----------+----------------+


```

こんな感じで取得できますので、任意のユーザー名とホスト名を引数に渡して起動させてください。

OUTPUT_DATA は拡張子が.sqlでなくて大丈夫です。

つまり　-> hogeout とかでも大丈夫になります。

## 移行したいmysqlのデーターベースへインポートする。

```
mysql -u HOST_NAME -u USER_NAME -p DATABASE_NAME < hogeout 

#sample 

mysql -u localhost -u user -p distinationDB < outputHoge

```

これでパスワードを求められるので、任意のパスワードを入力して完成になります。
Unityで素数を求めてみた


nSearchNum個数分の素数がnResult配列に入ります。
素数は「平方根より小さい素数の倍数ではない」らしいです。

```csharp:Calc.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Calc : MonoBehaviour {
	public int nSearchNum = 100;

	// Use this for initialization
	void Start () {
		StartCoroutine (Calcurate ());
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	IEnumerator Calcurate() {
		int nPercent = (nSearchNum / 100) > 100 ? (nSearchNum / 100) : 100;
		float startTime = Time.time;
		int nInsIdx = 0;
		int[] nResult = new int[nSearchNum];
		nResult [nInsIdx++] = 2;
		int nTgtIdx = 0;
		int nMin = 3;
		bool bSosuu = false;
		while (nTgtIdx < nSearchNum) {
			int nMax = nResult [nTgtIdx] * nResult [nTgtIdx];
			for (int n = nMin; n < nMax; n++) {
				bSosuu = true;
				for (int i = 0; i <= nTgtIdx; i++) {
					if ((n % nResult [i]) == 0) {
						bSosuu = false;
						break;
					}
				}
				if (bSosuu) {
					nResult [nInsIdx++] = n;
					if (nInsIdx >= nSearchNum) {
						Debug.Log ("[" + nInsIdx + "] " + n+" (" + (Time.time-startTime).ToString() + "sec)");
						yield break;
					}
					if ((nInsIdx % nPercent) == 0) {
						yield return null;
						Debug.Log ((nInsIdx * 100 / nSearchNum).ToString() + "% (" + (Time.time-startTime).ToString() + "sec)");
					}
				}
			}
			nTgtIdx++;
			nMin = nMax + 1;
		}

		yield break;
	}
}
```
開発環境でcloud functions(firebase)の動作が遅い理由

## 遭遇した問題  
firebaseのcloud functionsが実行されるまでの時間が異様に長い。トリガーの条件を満たしてから、5秒前後かかってからデータに実行結果が反映されることがある。

## 結論
cloud functionsに一定期間のアクセスがない場合は、自動的にインスタンスがスリープモードに入る。そのために、しばらくぶりにアクセスがあると、インスタンスが起動するまでに数秒間の時間がかかる。
functionが実行される条件を満たしてから、functionを実行するためのインスタンスを立ち上げるイメージ。

## 取り組んでいた問題
チャットボットを作成しているときに、新しいチャットルームが作成されたら、ユーザーにメッセージを送信するプログラムを書いていた。

```javascript:index.js
var functions = require('firebase-functions');

exports.didCreateMainChat = functions.database.ref('main_chat/channels/{channelId}')
  .onWrite(event => {
    if (!event.data.exists()) {
      return;
    }
    var newMessageRef = event.data.ref.child('messages').push()
    newMessageRef.set({
      sender: "server",
      message: "初めまして！"
    })
  })

```


## 解決策
特になし。
頻繁にリクエストが送られている場合は、今回の問題は発生しないはずなので、開発環境特有の問題である。本番環境ではインスタンスが停止することはないはずなので、大した問題にならない。


## 参考
http://stackoverflow.com/questions/42726870/firebase-cloud-functions-is-very-slow
このstack overflowに同様の質問が書かれていた。
AnimationDrawableでアニメーションの完了を検知

# フレームアニメーションの完了が検知できない
「アニメーションの終了を待ってから何か処理を行いたい」という状況はよくあると思うのですが、どうやらAndroidのフレームアニメーション（AnimationDrawable）ではアニメーションの完了が検知できないようです。

なにか良い方法はないものかと探していたらこちらのエントリを発見。
[アニメーションの完了が分かるAnimationDrawer](http://qiita.com/Hoshi_7/items/053af5dab53896205081)

で、そのまま使ってみたのですが。。。
なぜかアニメーションが１フレーム目しか表示されない（完了検知して処理を実行するという部分は問題なく動く）という謎の現象に遭遇。

その原因がなんなのかは分からず仕舞いのままですが、力技で解決しました。

# 継承するのがダメっぽいのでラップした
なにも小細工していないAnimationDrawableだけだとアニメーションはちゃんと動くけれど、作成したサブクラスを使うとアニメーションが動かないようなので、アニメーションはAnimationDrawableに任せてリスナーも登録出来るようにラップしてみました。

```java:AnimationDrawableEx.java
import android.graphics.drawable.AnimationDrawable;
import android.os.Handler;

public class AnimationDrawableEx {
    private AnimationDrawable mDrawable;
    private OnAnimationStateListener mListener;
    private Handler mHandler;

    public AnimationDrawableEx(AnimationDrawable drawable) {
        mDrawable = drawable;
        mHandler = new Handler();
    }

    public void setOnAnimationStateListener(OnAnimationStateListener listener){
        mListener = listener;
    }

    public boolean isRunning() {
        return mDrawable.isRunning();
    }

    public void stop() {
        mDrawable.stop();
    }

    public void start() {
        mDrawable.start();
        if(mListener != null) {
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    mListener.onAnimationEnd();
                }
            }, getTotalDuration());
        }
    }

    public int getTotalDuration() {
        int duration = 0;
        for (int i = 0; i < mDrawable.getNumberOfFrames(); i++) {
            duration += mDrawable.getDuration(i);
        }

        return duration;
    }

    public interface OnAnimationStateListener {
        public void onAnimationEnd();
    }
}
```

呼び出すほうは上記エントリと一緒。

```java:Activity.java
AnimationDrawableEx frameAnimation = new AnimationDrawableEx((AnimationDrawable) img.getBackground());
frameAnimation.setOnAnimationStateListener(new AnimationDrawableEx.OnAnimationStateListener() {
    @Override
    public void onAnimationEnd() {
        // アニメーション終了時の処理
    }
});

if (frameAnimation.isRunning()) {
    frameAnimation.stop();
}
frameAnimation.start();
```

これで一応目的は達成できたから良いのだけど、継承した場合に動かない理由が分からないのはちょっと気持ち悪いかも。
Raspberry Pi用のOSをMacで焼いた話

Raspberry Pi 3 ModelBを入手したので、Mac上でラズパイOSをMicroSDに焼く方法をメモする。
#事前準備
必要なもの。
・MicroSD（4GB以上）
・Raspberry Pi3
・ディスクイメージ 


#インストール
##MicroSDをMacにつなげる。

##ディスクイメージの入手
[公式](https://www.raspberrypi.org/downloads/)からイメージを入手する。
入手した.zipファイルを解凍し、.imgファイルを用意する。

##diskを確認
```bash
$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *121.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            120.5 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.9 GB    disk1
   1:             Windows_FAT_32 NO NAME                 31.9 GB    disk1s1
```
接続したMicroSDはdisk1の模様。なお、フォーマットはFAT32じゃないといけないらしいが、ちょうどいいのでこのまま続ける。

##diskを一度アンマウント
```bash
$ diskutil unmountDisk /dev/disk1
Unmount of all volumes on disk1 was successful
```

##diskに書き込み
```bash
$ sudo dd bs=1m if=2017-04-10-raspbian-jessie.img of=/dev/rdisk1
```
書き込み先を間違えると最悪Mac側のデータとかが消失する。
なお、Ctrl+Tで途中経過を確認できる。

```bash
load: 2.26  cmd: dd 13859 uninterruptible 0.01u 2.53s
2640+0 records in
2639+0 records out
2767192064 bytes transferred in 96.518324 secs (28670121 bytes/sec)
```
書き込みが終わると、「boot」というデバイスをマウントしていることがFinderから確認できる。

##ラズパイの起動
書き込んだMicroSDをRaspberry Pi 3に接続。
ディスプレイ・マウス・キーボードを繋いで電源を投入すると、無事OSが起動した。

#初期設定
とりあえず外付けディスプレイをつなぎたくないので、無線LAN設定とVNC/SSHの用意だけ用意することを目標とする。

```bash
$ sudo raspi-config
```

で初期セットアップ画面の表示する。
7.Advanced Options -> A1. Expand Filesystemを実行。「Finish」を選択するとrebootするか聞かれるのでrebootする。
4.Location Options -> Change Localeでjp_JP.UTF-8に変更。デフォルトロケールもjp_JP.UTF-8にする。
4.Location Options -> Time Zone -> Asia -> Tokyoに変更。
2.Hostnameでホストネームを変更。
5.Interfacing Options->2.SSHでSSHをenableに。
さらに、/boot以下にsshというファイルを作らないといけないらしいので

```bash
$ sudo touch /boot/ssh
```
とした。

無線LANに接続したあと、以下を順番に実行する。

```bash
$ sudo rpi-update
$ sudo apt-get update
$ sudo apt-get upgrade
```

menu -> Preferences -> Mouse and Keyboardでキーボードのレイアウトを変更。

```bash
$ sudo apt-get install tightvncserver
$ tightvncserver
### 設定をする ###
```

これで、他からxxx.xxx.xxx:5901にアクセスすることで、vnc接続できる。
ただし、vncはrebootするたびにオフされるので、再起動が必要となる。
続いて、日本語入力可能にする。

```bash
$ sudo apt-get install ibus-anthy ibus-mozc
$ sudo reboot
```

これで入力できるようになった。
その他、serverとして使うためにパスワード変更。

```bash
$ passwd # パスワード変更
```

セキュリティとかは色々あると思うが、今回はこんな感じで。
three.jsのOrbitControls.jsで簡単にカメラをマウスコントロールする

カメラの"orbit"というのは「[移動](http://ejje.weblio.jp/content/Camera+Orbit)」と訳されます。けれど具体的には、立体を中心にして周回軌道を描くように映すことです。3次元JavaScriptライブラリ[three.js](https://threejs.org/)に含まれるOrbitControls.jsを使えば、このオービットのほか、ズームやパンもマウスで簡単に操作できます。

#OrbitControls.jsを使う準備
[OrbitControls.js](https://github.com/mrdoob/three.js/blob/dev/examples/js/controls/OrbitControls.js)は、three.jsライブラリの「examples/js/controls/」に納められているJavaScriptファイルです。これを`<script>`要素で読み込みます。たとえば、「js」というフォルダに納めたらつぎのように書き加えます。

```html
<script src="js/OrbitControls.js"></script>

```

three.jsの3次元空間に立体をつくるコードは、jsdo.itに公開した正二十面体のサンプル「[three.js r85: Rotating a icosahedron](http://jsdo.it/FumioNonaka/gpdN)」を使うことにします(サンプル001)。光源がなくても発色するマテリアル[`MeshNormalMaterial`](https://threejs.org/docs/index.html#api/materials/MeshNormalMaterial)を用いたので、コードは40行足らずです。この立体のつくり方については、「[three.js入門 03: ジオメトリーを使う](http://www.fumiononaka.com/Business/html5/FN1704012.html)」をお読みください。

####サンプル001■three.js r85: Rotating a icosahedron
[![threejs_icosahedron.png](https://qiita-image-store.s3.amazonaws.com/0/128949/463101f1-48e9-34ea-81d5-31cfbd4053aa.png)
\>\>jsdo.itへ](http://jsdo.it/FumioNonaka/gpdN)

#OrbitControlsでカメラをコントロールする
`OrbitControls()`コンストラクタは、つぎのように`Camera`オブジェクトを渡して呼び出します。 `OrbitControls.autoRotate`プロパティに`true`を与えると、カメラはゆっくりと周回します。この場合、アニメーションの再描画メソッドの中から`OrbitControls.update()`メソッドを呼び出してください。

```
new THREE.OrbitControls(カメラ)
```

カメラを動かすためのマウス操作は、つぎのとおりです。

- オービット: ドラッグ
- ズーム: ホイール
- パン: 右ボタンドラッグ

前掲サンプル001は、つぎのように手直しすればよいでしょう。OrbitControlsを加えたサンプルは、jsdo.itに「[three.js r85: Controlling the camera with OrbitControls](http://jsdo.it/FumioNonaka/Yzm3)」として掲げました。

```js
var controls;
function init() {

	camera = new THREE.PerspectiveCamera(30, width / height, 1, 1000);

	controls = new THREE.OrbitControls(camera);
	controls.autoRotate = true;

	update();
}

function update() {
	// mesh.rotation.x += 0.01;
	// mesh.rotation.y += 0.01;
	controls.update();
	requestAnimationFrame(update);

}
```
【Nginx】インストール手順

## yumリポジトリファイル作成
`$ sudo vim /etc/yum.repos.d/nginx.repo`

```nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=0
```

## インストール
`$ sudo yum --enablerepo=nginx install nginx`

## 起動方法
`$ sudo service nginx start`

## 自動起動設定
`$ sudo chkconfig nginx on`
Wunderlist APIのガイドライン意訳

## 概要
Wunderlist API を使ったアプリを作ろうと思い、その規約について調べる過程で [Brand Guidelines](https://developer.wunderlist.com/branding) を意訳しました。
ページの名の通り主に商標に関する利用の制限についてまとめた資料で、さらにざっくりまとめると以下です:

- フォントや色には気を使え
- 公式とまぎらわしい表示や名前は避けろ


商用利用の制限や、APIの利用制限などについては明記されていませんでした(これらの制限の有無も現状不明)。

なお2017/04/27時点の内容を意訳しましたが、更新されている可能性があるので詳細は原文の確認をお願いします。
訳のミスのご指摘や先述の制限事項に対する情報などお待ちしてます。


## 意訳

### 概要

ガイドラインは、私達のロゴ、コンテンツ、商標などの資産を利用する上で、法的な交渉をすることなく、あなたが創作を行えるよう設計しています。
このガイドラインに沿わないかたちで私達の商標を用いる場合、どのように利用するのか、視覚的な情報を添えて support@wunderlist.com にご連絡ください。

### タイポグラフィ
タイポグラフィは脳の両側に語りかける唯一の要素であり、とても重要です。

それは美しく見やすくなけれはいけません。
タイポグラフィは私達のメッセージを伝え、私達のユーザのコンテンツを表示するものです。
WunderlistのUIに倣うことで、私達は我々のキャラクターを伝えることができます。

[Latoフォント](https://fonts.google.com/specimen/Lato)はとても有用です。
遊び心がありながらも、構造化されています。
私達のすべてのプラットフォームにおいて、ちょうどいい感じのx-heightが読みやすさと見やすさをもたらしています。

```
訳メモ:
LatoはGoogle Fontsで提供されているフォント。
OPEN FONT LICENSE で提供されている。
Google Fontのページ内でフォントを選ぶとコピペでWeb FontとしてCDN利用できる。

<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
```


### 色

色は強い感情を呼び起こします。
時としてそれは個人の好みによって決まったり、文化的な背景に影響されることもあります。

Wunderlistのユーザは私達の製品と強い繋がりを持っていますが、
それは色を選択できることが関係している気がしています。

色名 | コード
--- | ---
Wunderlist Red      | <font color="#DB4C3F">#DB4C3F</font>
Wunderlist Blue     | <font color="#2B88D9">#2B88D9</font>
Wunderlist Green    | <font color="#65B01B">#65B01B</font>
Wunderlist Yellow   | <font color="#E6B035">#E6B035</font>
Dark Gray         | <font color="#444444">#444444</font>
Wunderlist Gray   | <font color="#5B5B5B">#5B5B5B</font>
Gray              | <font color="#737273">#737273</font>
Light Gray        | <font color="#A3A3A3">#A3A3A3</font>
White             | <font color="#FAFAFA">#FAFAFA</font>


### Wunderlistブランドを使う上で

あなたがWunderlistを使うアプリ/Webサイト/サービスを作るときは、それに固有の名前をつけてください。
あなたの製品が別のブランドの機能を使わない限り、Wunderlistの機能を使った製品であることは名言して問題ありません。

`Wunder` と `Wunderlist` が含まれる名前は使わないでください。
ドメインの登録についても同様です。
スペルや音がWunderlistに似ている名前もです。

アプリやサービスの見た目においても、我々のロゴやブランドとは別モノであることがわかるようにデザインしてください。
(バッジやアバターやグラフィクスなども)


#### OK
- Wunderlistのロゴによって、あなたのアプリが互換製品であることを示すこと

#### NG
- Wunderlistのロゴや商標を、あなたの製品のそれより大きく表示すること
- Wunderlistのロゴを、それ以外の他のサービスに対するリンクとして使うこと


### 製品の名前

#### OK
- Webサイト、製品、アプリなどが何らかの固有な名前であること

#### NG
- Wunderlistのロゴや商標を、あなたの製品のそれより大きく表示すること
- Wunderlist を製品名として使うこと
- スペルや音がwunderlistに似ている名前を使うこと
- Wunderlistやそのロゴ、それに似た名前を商標として登録すること


### 製品の見た目

#### OK
- 製品固有のブランド、ロゴによってデザインされていること

#### NG
- Wunderlistの見た目や使い勝手をパクり、ユーザに混乱を与えること


### 出版

#### OK
- 本や出版物のタイトルがWunderlistについて書かれたものであり、Wunderlist社によって出版されたものではないことを明示すること

    ```
    たとえば
    「Wunderlistでほにゃららする方法」はOK
    「ほにゃららのためのWunderlistガイド」はNG
    ```

#### NG
- Wunderlistのロゴをカバーやタイトルに使うこと


### その他

Wunderlistのマークを利用する上では、Wunderlistサービス自体のルールやポリシーに加え、以上のポリシーを遵守してください。
Wunderlistはこれらの権利を、いつでも独自にキャンセル、変更できます。
詳細については、wunderlist.comの商標について問合せてください。
UbuntuにDocker CEをインストールする


# 目的
* [Docker CE/EE が発表](http://www.itmedia.co.jp/news/articles/1703/03/news075.html)されて、Dockerのインストール方法が変わったのでメモ
* CE…無償のコミュニティエディション、EE…商用版
* CE版をインストールする

# 環境
* Ubuntu 16.04

# 参考
* [公式 "Docker Community Edition for Ubuntu"](https://store.docker.com/editions/community/docker-ce-server-ubuntu?tab=description)

# インストール
## 1. リポジトリ設定
```bash
$ sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
```

## 2. Docker CE インストール
```bash
sudo apt-get -y install docker-ce
```

## 3. ユーザーをdockerグループに追加
1.このままだとdocker実行に毎回sudoが必要となるので、dockerグループにユーザを追加する

```bash
$ sudo adduser ユーザ名 docker
```

2.再ログイン
3.groups コマンドで追加を確認

```bash
$ groups
lynlea adm cdrom sudo dip plugdev lpadmin sambashare docker
```

## 4. 試す
```bash
$ docker run hello-world

・・・
Hello from Docker!
This message shows that your installation appears to be working correctly.
・・・
```