OmniAICreator/Qiita-1.07M huggingface dataset:
GlassFishを起動しようとしたら java.lang.UnsupportedClassVersionError: org/glassfish/admin/cli/AsadminMain : Unsupported major.minor version 51.0 となってしまった時の対応方法

- 環境
    - Windows10 64bit
    - GlassFish : 4.1.2

GlassFishを起動しようとしたら怒られました。

```text
$ /c/app/glassfish-4.1.2/glassfish4/glassfish/bin/asadmin
java.lang.UnsupportedClassVersionError: org/glassfish/admin/cli/AsadminMain : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: org.glassfish.admin.cli.AsadminMain. Program will exit.
Exception in thread "main"
```

### 原因 : Javaのバージョンが合っていませんでした。
> This is because the “jar” is compiled with JDK 1.7, but you try to run in a JDK 1.6 environment. 
> [Java : Unsupported major.minor version 51.0](https://www.mkyong.com/java/java-unsupported-major-minor-version-51-0/)

jar動かしてないです・・・なぁんて思って asadmin.bat を開くとちゃんとjarを動かしていました。

```text
REM Always use JDK 1.6 or higher
REM Depends on Java from ..\config\asenv.bat
VERIFY OTHER 2>nul
setlocal ENABLEEXTENSIONS
if ERRORLEVEL 0 goto ok
echo "Unable to enable extensions"
exit /B 1
:ok
call "%~dp0..\config\asenv.bat" 
if "%AS_JAVA%x" == "x" goto UsePath
set JAVA="%AS_JAVA%\bin\java"
goto run
:UsePath
set JAVA=java
:run
%JAVA% -jar "%~dp0..\lib\client\appserver-cli.jar" %*
```

その時のJavaは・・・

```text
$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
```

気のせいでしょうか？asadmin.batに ```Always use JDK 1.6 or higher``` と書いてあるような気がします。

### 対応方法 : javaのバージョンを1.7以上にする

JAVA_HOME を1.8にしました。
Windows7でうまくJavaを切り替えられない場合は [こちら](http://qiita.com/ponsuke0531/items/8939cb2764acd3f981c5) をご参照ください。

```text
$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
```

今一度 GlassFishの起動を試みます。

```text
$ /c/app/glassfish-4.1.2/glassfish4/glassfish/bin/asadmin start-domain domain1
Attempting to start domain1.... Please look at the server log for more details.....
```

思っていたメッセージ ```Command start-domain executed successfully.``` 的なのではなかったので起動できない:interrobang:と焦りましたが、http://localhost:4848 を見てみたら起動していました。
![FireShot Capture 1 - GlassFish Console - Common Tasks - http___localhost_4848_common_index.jsf.png](https://qiita-image-store.s3.amazonaws.com/0/159761/5182b538-b537-570c-0592-6f1f4b9fc425.png)
適したjqueryのサンプルを見つける＆jqueryで詰まった時の対処法（プログラミング初心者向け）

** 自己紹介 **
今年の４月にプログラミングを始め、現在はruby on rails,react.jsを学習し始めた大学生。４月、５月はプログラミングに自分の時間を費やし、自分のHPを作成する。その際にプログラミング初心者がjqueryを使用する際に、ハードルが低そうに見えて、意外と詰まったりしていたので、そこを書いていこうと思います。

###重要：これはjavascriptの知識がほとんどない人に向けた記事です。（もちろんjqueryも）

# 通常のググりだとjqueryでできることの１部しか見ることができない
多分、みなさんがjqueryで何か作ろうと思ったとき、アニメーションの名前をテキトーに打ち込んでして検索していませんか？

ex: 『jquery アニメーション　フェードイン　方法』や
　　　　　　　　『jquery アニメーション　スクロールしてから表示　方法』など

このように検索していませんか？

実際わたしもそう検索していました。こういった検索をしたとき、大抵、jsの記述コードが貼ってあってできますよ！　みたいなサイトが出て来ます。でもそれって本当にjqueryでできるサンプルの一部が乗っているだけなんです。
もっと色々なのみて、自分の制作物にあうものを厳選したくないですか？　サンプルを自分らしく改良したくありませんか？

サンプルサイトではうまくコピペしたはずなのにうまく動かない！！なんてこともあります。そんなときに考えられる原因を考えてみましょう。

# サンプルサイトにおいて稀に起きる問題の対処法
　そういったサイトの通りやってもうまくいかない時があったときの対処法を教えます。
＊＊　まずは実際に動いたサンプルのページのソースを見てみましょう。＊＊
ページで書かれていることを違うところがあるとおもいます。　そういったところをとにかく見比べて、コピペして...リロードして...の確認になります。(地道にこれをやるのが意外と一番簡単に解決する方法だったりします。）

その他にも様々なミスの原因があるので書いて行きますね。
・そもそもしっかりjqueryがダウンロードされているか
・バージョンがしっかりと合っているか
・jqueryのコードを書く場所が間違っていないか
　　　 （headの中に書こう！）
・scriptの記述があてられるコードよりも前に記述されていないか
　 　　(基本的にbodyの最後にまとめて書いた方がみやすいよ！)
### でも結局はそんなめんどくさいのに振り回されずに楽に色々なアニメーション取り入れたい！と思う方もいるかと思います。
　　　　　　　　　↓
　　　　　　　　　↓
# そんなときに使うのが〇〇.js もしくはそういったものをまとめて乗っけているサイト
実は適当に　『jquery サンプル』みたいにググるよりよっぽどわかりやすく、かつ、様々なバリエーションのものが存在します。
一応、参考になるサイトをいくつか乗っけておきますね
http://getbootstrap.com/
https://daneden.github.io/animate.css/
http://gimmicklog.main.jp/jquery/
gimmicklogは似たような記事が一覧になっているのでぜひチェックしてみてください。
どれも説明がしっかり書かれていてわかりやすいです。
（添付させて頂いたurl先の方にに感謝の思いを込めて）
Node.jsでAPIのリクエストとレスポンスの内容をログに出力する

意外と調べても出てこなかったので備忘録的なめも

# やりたいこと

APIを実行した際にログとして

* 実行された時間
* API名
* Request Header
* Request Body
* Response Body

を出力したい

# 環境

|ツール|バージョン|
|:-----------------|------------------:|
| Node.js | v7.6.0 |
| Express | 4.15.3 |
| log4js  | 1.1.1 |

# 実装

## フォルダ構成

```
.
├── config
│   ├── default.yaml
│   └── development.yaml
├── app.js
└── lib
    └── logger.js
```


## log4jsを使ったログ出力機構について

res.endを利用してResponse Bodyを取得した後に
Request Header や Request Bodyと合わせてログに出力する。
   ※ [express logging response body](http://stackoverflow.com/questions/19215042/express-logging-response-body) を参考

```lib/logger.js
'use strict';

var log4js = require('log4js');
var config = require('config');
log4js.configure(config.log4js);
var logger = { 
  access: log4js.getLogger('access')
};

module.exports = function (req, res, next) {

    var oldWrite = res.write,
        oldEnd = res.end;

    var chunks = [];

    res.write = function (chunk) {
      chunks.push(chunk);

      oldWrite.apply(res, arguments);
    };

    res.end = function (chunk) {
      if (chunk)
        chunks.push(chunk);

      var body = Buffer.concat(chunks).toString('utf8');

      // ここで必要なログをくっつける
      var logs = {
        requestHeader: req.headers,
        requestBody: req.body,
        responseHeader: {},
        // 取得したbodyはテキスト型であるため、一旦Json形式に変換しておく
        responseBody: JSON.parse(body)
      };
      logger.access.info(req.method, req.path, JSON.stringify(logs));

      oldEnd.apply(res, arguments);
    };

    next();
  }
};
```

サーバプログラムの中で先ほど作成したログの出力処理をapp.useで読込させる。

```app.js
'use strict';
// Express フレームワーク
var express = require('express');
var bodyParser = require('body-parser');


var app = express();
// POSTでリクエストパラメータを取得するために必要
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.listen('3000', () => {
    console.log('listen');
});

// リクエストやレスポンスの内容をログに出力するための設定
var logger = require('./lib/logger.js');
app.use(logger);

// パスが該当しなかったときの処理を記載
app.use(function(req, res, next){
  res.send(404, {statusCode: 404, message: 'Not Found'});
});

module.exports = app;
```

## 実行

* NodejsのWebサーバを起動する

```
 NODE_ENV=developmentn node app.js
```

* curlコマンドでAPIにアクセス

```
curl -H "Accept: application/json" -H "Content-type: application/json" -H "x-api-key: AAAAA" -X POST -d '{"endpoint":"xxx", "auth":"xxx", "key":"xxx","group":"xxx"}' http://localhost:3000/user/subscribe
```

* 出力結果

```出力
[2017-05-19 20:09:12.258] [INFO] access - POST /user/subscribe {"requestHeader":{"user-agent":"curl/7.37.0","host":"localhost:3000","accept":"application/json","content-type":"application/json","x-api-key":"AAAAA","content-length":"96"},"requestBody":{"endpoint":"xxx","auth":"xxx","key":"xxx","group":"xxx"}, "responseBody":{"statusCode":404,"message":"Not Found"}}
```


出来たー
ただし、これが正しいやり方なのかは正直分からない...


- 参考
   - [[Node.js]Express4 + log4jsでロギング](http://qiita.com/tnnsst35/items/7e7129c7758c9c560c41)
   - [express logging response body](http://stackoverflow.com/questions/19215042/express-logging-response-body)
「Rubyでデータサイエンス」に参加してきました🏃💨


下記のイベントに参加したので、ハイライトだけメモしておきます。とりあえず Jupyter Notebook が動けば自由に遊べるので、遊びたい人がいたらご参考にしてください ;)

DataScience.rb ワークショップ 〜ここまでできる Rubyでデータサイエンス〜
https://rubyassociation.doorkeeper.jp/events/59965

## 背景

データサイエンスにおけるRubyの現在の位置づけと可能性
http://www.s-itoc.jp/report/reaserch_results/439

## 準備

1. [Docker](https://www.docker.com/) をインストールする
2. docker pull で準備する

	```console
	$ docker pull rubydata/pycall
	```

3. [mrkn/pycall](https://github.com/mrkn/pycall)をcloneする

	```console
	$ git clone git@github.com:mrkn/pycall.git
	```

4. PyCall の実行環境を立ち上げる

	```console
	$ cd path/to/pycall
	$ bundle install
	$ bundle exec rake docker:run
	```

5. `http://localhost:8888/tree` が立ち上がる
6. ブラウザ上から local -> examples -> datasicence_rb_20170519.ipynb をクリックする
7. PyCall で遊べるよッ...!!

![成功時の画面](https://qiita-image-store.s3.amazonaws.com/0/1857/65bee3ad-c81f-5ab4-6d95-d60cd277641f.png "Screen Shot 2017-05-19 at 19.57.02.png")


## Jupyter Notebook の使い方

- Kernel -> Restart & Clear Output で初期化
- カーソルを合わせて、Shift + Enter でそのコードを実行
- 内部はただのインタプリタ。実行時のコンテキストは引き継がれます

**Enjoy PyCall...!!** :sunglasses: :sparkles:
[CentOS] dm-cacheを使用してSSDをHDDのキャッシュにする

# 環境

- CentOS Linux release 7.3.1611
- Linux 3.10.0-514.el7.x86_64

2つのドライブがあります。

- /dev/sda1 SSD
- /dev/sdb1 HDD

SSDをHDDのキャッシュとして設定します。

# 作業手順

lvmcache(7)のマニュアルに従って作業します。

## Volume Groupを作成

Volume Groupを作ります。SSDとHDD両方を所属させないといけないです。

名前は *vg0* にしました。

```shell-session:
# vgcreate vg0 /dev/sda1 /dev/sdb1
```

## 実データ用Logical Volumeを作成

名前は *export* にしました。サイズはHDD全部です。

```shell-session
# lvcreate -n export -l 100%FREE vg0 /dev/sdb1
```

## キャッシュのメタデータ用Logical Volumeを作成

メタデータは、キャッシュデータ自体の1000分の1より小さくしないといけないです。 [^1]

[^1]: 本当はチャンクサイズを決めて、そこから計算するみたい？？ https://www.redhat.com/archives/dm-devel/2012-December/msg00046.html チャンクひとつで16バイト使うそうです。

SSDがあるので、割り算して *457MB* にしました。

名前は *cache0meta* にしました。

```shell-session
# lvcreate -L 457M -n cache0meta vg0 /dev/sda1
```

## キャッシュのデータ用Logical Volumeを作成

SSDの余った領域を使い切ります。

名前は *cache0* にしました。

```shell-session
# lvcreate -l 100%FREE -n cache0 vg0 /dev/sda1
```

## キャッシュプール用Logical Volumeを作成

キャッシュデータと、キャッシュのメタデータをくっつけてキャッシュプールにします。[^2]

```shell-session
# lvconvert --type cache-pool --cachemode writeback --poolmetadata vg0/cache0meta vg0/cache0
```

`--cachemode`でwrite backやwrite throughを選べます。

## キャッシュ用Logical Volumeを作成


```shell-session
# lvconvert --type cache --cachepool vg0/cache0 vg0/export
```

# こんなんできました。

```
# lvs -a vg0
  LV              VG  Attr       LSize   Pool     Origin
  [cache0]        vg0 Cwi---C--- 446.19g
  [cache0_cdata]  vg0 Cwi-ao---- 446.19g
  [cache0_cmeta]  vg0 ewi-ao---- 452.00m
  export          vg0 Cwi-a-C---   1.82t [cache0] [export_corig]
  [export_corig]  vg0 owi-aoC---   1.82t
  [lvol0_pmspare] vg0 ewi------- 452.00m
```


[^2]: こうしたところ、エクステントが足りないと言われてしまったので、キャッシュデータ用のLVを少し小さく作り直しました。
備忘録 React でのリストの作り方

#react でのリストの作り方

```javascript:list.jsx

const NavList = (data) => {
  <ul>
  { data.map((element) => {
     <li>
       <div>装飾的な何か</div>
       <Link to={data.link}>{data.name}</Link>
     </li>
  })}
  </ul>
}
```

こんな感じで初期は書いていた
でも、mapに無名関数を渡しているので毎回作成されるのでよろしくない


##リファクタ後


```

const NavLink = (element) => {
  <li>
    <div>装飾的な何か</div>
    <Link to={element.link}>{element.name}</Link>
  </li>
}

const NavList = (data) => {
  <ul>
    { data.map(NavLink) }
  </ul>
}
```

こっちの方が見やすいし呼ばれるのは一度だけなので配列で作成する時はこうしようという備忘録
ブランチを作業ごとに切る


#切る基点

１つの作業が終わって、他の作業に取り掛かるときはmasterブランチを基点として切るようにする。

```
git checkout origin/master -b topic_apple
```

###origin/master

trackingブランチのこと。

##origin/masterが更新されている場合

以下のコマンドで更新内容をとってきてから、上記コマンドでブランチを切るべし。

```
git fetch origin master
```

##プルリクにいらないコミットが入ってしまったら

クローズするべし。
[Django]Django REST frameworkでMessagePackを使う

# Django REST frameworkでMessagePackを使う

Django REST frameworkアプリケーションの、HTTPリクエスト／レスポンスはデフォルトではJSONを想定しています。
JSONも良いんですが、MessagePack使いたいですよね。

これを変更するにはParsers／Renderersを設定します。

[リクエスト - Parsers](http://www.django-rest-framework.org/api-guide/parsers/)
[レスポンス - Renderers](http://www.django-rest-framework.org/api-guide/renderers/)

デフォルトではMessagePackはサポートしていませんが、ドキュメントに[djangorestframework-msgpack](https://github.com/juanriaza/django-rest-framework-msgpack)を使えと書いてあります。

```
MessagePack is a fast, efficient binary serialization format.
Juan Riaza maintains the djangorestframework-msgpack package which provides MessagePack renderer and parser support for REST framework.
```

## djangorestframework-msgpack

djangorestframework-msgpackをインストールします。

```
pip install djangorestframework-msgpack
```

setting.pyにMessagePackを利用するように設定します。

```py3
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework_msgpack.parsers.MessagePackParser',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework_msgpack.renderers.MessagePackRenderer',
    ),
}
```

これでMessagePackを使うようになりました。

あとはおまけです。

## Django REST Swaggerも使う

Django REST Swaggerを使っているんですが、MessagePackを利用する方法がわかりません。
※ 知ってたら教えてください。

なので、Swaggerを利用する環境（ここではDEBUG=Trueの場合）はJSONも利用できるようにしています。

```py3
if DEBUG == True:
    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': (
            'rest_framework_msgpack.parsers.MessagePackParser',
            'rest_framework.parsers.JSONParser',
        ),
        'DEFAULT_RENDERER_CLASSES': (
            'rest_framework_msgpack.renderers.MessagePackRenderer',
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
        ),
    }
else:
    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': (
            'rest_framework_msgpack.parsers.MessagePackParser',
        ),
        'DEFAULT_RENDERER_CLASSES': (
            'rest_framework_msgpack.renderers.MessagePackRenderer',
        ),
    }
```

並び順が大切です。
一番上がメインなのでMessagePackをメインに書きます。

BrowsableAPIRendererは[これ](http://www.django-rest-framework.org/api-guide/renderers/#browsableapirenderer)用です。
今は使ってないんですが入れてみました。

## 通信のテストはMessagePackでやる

通信のテストするときはMessagePackを使うように書きます。
JSONでテストをしても意味ないです。

```py3
import msgpack

from django.test import TestCase

class ApiUsersTestCase(TestCase):
    def test_put_users_pk_ok(self):
        """
        例えばユーザーのパラメータを設定するようなAPI
        イメージなので簡単なテストだけ
        """
        
        pk = 1
        params = {
            "name": "トランプ"
        }

        response = self.client.put("/users/{0}/".format(pk), msgpack.packb(params, use_bin_type=True), "application/msgpack")
        self.assertEqual(response.status_code, 201)
        
        content = msgpack.unpackb(response.content, encoding='utf-8')
        self.assertEqual(content["name"], params["name"])
```
Texでポスターを作る際のテンプレート

# beamer + platex + dvipdfmxでポスター作成

beamerとplatexとdvipdfmxでポスターを作るためのテンプレート。
これで一通りできる。デザインに凝りたい場合はネットで適当なテンプレートを探して使うか、自分で頑張ってスタイルファイルを作る。

```template_poster.tex
\documentclass[dvipdfmx,hyperref={pdfpagelabels=false}]{beamer}
\usepackage{bxdpx-beamer} % beamerでdvipdfmxを使うためのパッケージ
\usepackage[utf8]{inputenc} % utf-8を使うためのパッケージ
\usepackage[orientation=landscape,size=a0,scale=1.4,debug]{beamerposter} % 縦の場合はportrait

%%% 日本語環境設定 %%%
\usepackage{pxjahyper}
\usepackage{minijs}
\renewcommand{\kanjifamilydefault}{\gtdefault} % デフォルトをゴシック体にする

%%% figure環境の設定 %%%
\usepackage{subcaption} % 1つのfigure環境で複数の図・キャプションを用いるときに使う
\renewcommand{\figurename}{図} % 'Figure 1' -> '図 1'
\setbeamertemplate{caption}[numbered] % 図の番号を表示する

%%% 長さと余白の設定 %%%
\setlength{\textwidth}{\paperwidth} % textwidthを紙の幅にする
\setlength{\oddsidemargin}{-0.4truemm} % 奇数頁の左側の余白をデフォルト(25.4mm)から-0.4mm
\setlength{\evensidemargin}{-0.4truemm} % 偶数頁の左側の余白
\addtolength{\textwidth}{-50truemm} % textwidthを-50mm(左右の余白を25mmずつにする)

%%% Title %%%
\title{\huge Texでポスター作成}
\author{名前}
\date{\today} % 日付を表示させない場合は\date{}とする

%%% Main Contents %%%
\begin{documents}
\begin{frame} % frame環境1つで1枚
  \maketitle % タイトル作成
  \begin{columns} % frameを縦に分割してcolumnを作成する
    \begin{column}{0.33\textwidth} % columnを作成
      文章・図など % 必要に応じてblock環境などを使う
    \end{column}
    \begin{column}{0.66\textwidth}
      % figure環境を使う
      % 複数の画像を横に並べたいときはminipageを用いる
      \begin{figure}
        \centering\includegraphics[width=0.8\textwidth,height=0.2\textheight]{test.png}
        \caption{キャプション}
        \label{ラベル} % \ref{ラベル名}で参照できる
      \end{figure}
    \end{column}
  \end{columns}
\end{frame}
\end{documents}

```

ポスターからはみ出して入りきらない場合は

- \vspace{-1ex}などとして上下の間隔を詰める
- 文字サイズを小さくする
  
などで対処する。
日本語NLP@janome/spaCy/Python

# Installation

```install-japanese-nlp-spacy.sh
virtualenv .env
source .env/bin/activate
pip install -U janome jupyter 
pip install -U Cython git+https://github.com/explosion/spaCy
pip freeze > .env/requirements.txt
```

`pip spacy`だとちょっと古く、日本語サポート`spacy.ja`が入っていなかったので、上記のように`pip install -U git+https://github.com/explosion/spaCy`で最新版をダウンロードし、ビルドしましょう。Cloud9が約30分ビルドに励んでくれました。
![Screenshot 2017-05-19 at 18.18.41.png](https://qiita-image-store.s3.amazonaws.com/0/36973/29472d38-a213-3c98-5ce2-db7d35a74ea6.png)

# Run Jupyter Notebook on Cloud9 IDE
spaCyが無事インストールできたら、Jupyter Notebookを起動しましょう。
Cloud9なら：

```start-jupyter-c9.sh
jupyter notebook --port $PORT --ip $IP --no-browser
```

# Try Janome/spaCy

JupyterでNotebookを開きます。

![Screenshot 2017-05-19 at 18.44.40.png](https://qiita-image-store.s3.amazonaws.com/0/36973/57122448-1ade-8828-b1ad-0fb3a10d53d4.png)

ソース：[GitHub](https://gist.github.com/vochicong/e9ec244e7b4caa4fdc27f5afe231c814)または[nbviewer](http://nbviewer.jupyter.org/gist/vochicong/e9ec244e7b4caa4fdc27f5afe231c814)

# NLTK?
NLTKも有力らしいですが、まだ試していません。

```install-nlp-nltk-python.sh
pip install -U nltk requests
```

# Links
- [explosion/spaCy, NLP with Python and Cython](https://github.com/explosion/spaCy)
- [mocobeta/janome, Japanese morphological analysis engine](https://github.com/mocobeta/janome)
- [nbviewer, a simple way to share Jupyter Notebooks](http://nbviewer.jupyter.org/)
JOINコマンドを使う際の注意

# はじめに 
[集計はRDBばかりに頑張らせるのをやめると幸せになれる。](http://qiita.com/taruhachi/items/496d217ed2338239f0d2)のですが、JOINコマンドを利用するともっと幸せになれます。

# JOINコマンドとは
こちらに詳しくまとまっているのですが、2つのtsvファイルや、csvファイルをjoinする事ができます。

* [Joinコマンドでテキスト結合はこうする](http://qiita.com/hirohiro77/items/f3847fd4ab1dc653f4ca)
* [joinコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-join)

RDBを利用できない時に、ファイルだけでテーブル間の結合処理ができるという夢のようなコマンドですが、sortとの兼ね合いで思ったようにjoin出来ないことがあります。

# 結論から言うと
```
join: [ファイル]: is not sorted: 
```
というエラーが出たときには、

* join前のsort時にLANG=Cを指定する。
* join時にもLANG=Cを指定する。

# JOINが失敗するなら、grepで似たようなこと出来ないの？
近いことで、以下のコマンドで、[ファイル2]中にある[ファイル1]の内容を含む行を抽出することができますが、これは計算量のオーダーが[ファイル1のサイズ] * [ファイル2のサイズ]であるため、これが巨大なときには何時まで待っても完了しません。

```
grep -f [ファイル1] [ファイル2] 
```

ファイル1が100万行,ファイル2が1000万行だったときには計算量のオーダーは10兆回です。


# JOINコマンドは速い
JOINコマンドを利用するためには、予め[ファイル1]と[ファイル2]が***適切に***ソートされている必要がありますが、その分高速に動作します。
ソート済みのファイル同士を上から比較することで、[ファイル1のサイズ]+[ファイル2のサイズ]のオーダーの計算量で比較を行ないます。

ファイル1が100万行,ファイル2が1000万行だったときには計算量のオーダーは1100万回で、grepを利用するケースのおよそ91万分の1です。


```
sort [ファイル1] > [ソート済みファイル1]
sort [ファイル2] > [ソート済みファイル2]
```

# SORTの際に気をつけなければならないこと
sortコマンドは環境変数により、文字列のスコア評価が変わり、ソート順が変更されてしまいます。

例：
* 大文字小文字を無視する。
* 数値以外を無視する。
* "-"ハイフンや"+"プラスなどを無視する
* etc...

sort時の文字列スコア評価とjoin時の文字列スコア評価が異なるとjoinコマンドは
```
join: [ファイル1]: is not sorted: 
```
というエラーを吐き、処理を中断してしまいます。

ここで、sortの結果を固定するために、LANG=Cを指定して下さい。

```
LANG=C sort [ファイル1] > [ソート済みファイル1]
LANG=C sort [ファイル2] > [ソート済みファイル2]
```

# JOINの際に気をつけなければならないこと

sortと同様に、joinコマンドも環境変数により文字列のスコア評価が変わりますので、環境によってはこちらも適切に指定してあげないとjoin出来ません。
sort時に指定したのと同じLANGを指定してjoinします。

```
LANG=C join [ソート済みファイル1] [ソート済みファイル2] [オプション]
```
[Swift]バイナリデータを解凍する際にNSKeyedUnarchiverが実行可能か判定したい

NSKeyedUnarchiverしたいときに実行時に落ちてしまい躓いたので自分用に備忘録に残しておく

## 躓いたケース
NSKeyedArchiverを未実行NSData型のデータに対してNSKeyedUnarchiverを実行すると落ちた。

## 対処法
圧縮済み・未圧縮の判定をオプショナルバインディングを使って行う。

## 理由
下記コードは落ちる問題を解決した例

```Swift2_3ver.swift
func excuteHogeWithData(NSData: Data) 
{
	if let extractedData = NSKeyedUnarchiver.unarchiveObjectWithData(data)
	{
        // 引数に対してNSKeyedArchiver実行済みの場合
	}
	else
	{              
        // 引数に対してNSKeyedArchiver未実行の場合
    }
}
```
```Swift3_ver.swift
func excuteHogeWithData(data: Data) 
{
    if let extractedData = NSKeyedUnarchiver.unarchiveObject(with: data) 
    {
        // 引数が NSKeyedArchiver で圧縮されたのデータの場合
    } 
    else 
    {
        // 引数が NSKeyedArchiver で圧縮されたデータでない場合
    }
}
```
## 追記 2017/5/24
・Swift2.3で開発をしていたため、Swift3系の実装法が未記載でした。
・このケースではオプショナルバインディングが使えることを考慮していなかったため記事を修正しました。
Pythonによる立体骨組解析事例

最新版のプログラムは以下に掲載していますので参考にしていただければと思います．

+ [Python：FEMでの疎行列計算利用による高速化（３次元骨組構造解析での事例）](https://qiita.com/damyarou/items/85c7902cc658d748115e)

# はじめに
Pythonによる立体骨組解析プログラムで計算した事例を紹介します．
ここでは，格子桁解析結果と平面骨組解析結果を再現してみました．
３次元の座標変換がうまくいっているか気になっていたのですが，結果としては，うまく行っているようです．

これまでは，設計したい構造物に応じて平面骨組解析と格子桁解析を使い分けていいましたが，立体骨組解析プログラムを自由自在に使えるようになれば，これ１つで双方の役割をはたすことができるので，便利になりそう．


でも実際には，格子桁解析は立体骨組解析で行うでしょうが，平面骨組解析は平面のプログラムを使うでしょう．なぜなら立体は入力データ作成が少し面倒なので．

用いたプログラムは前回紹介したものです．
[http://qiita.com/damyarou/items/2b83b9b20181c1b8e35d](http://qiita.com/damyarou/items/2b83b9b20181c1b8e35d)

プログラム，入力データ，解析手順やGMTによる断面力図作図スクリプトは以下のGistにアップしています．
[https://gist.github.com/damyarou/8b99e5e57576db5e71bf630fa1b396a2](https://gist.github.com/damyarou/8b99e5e57576db5e71bf630fa1b396a2)

# プログラムについて
有限要素法による立体骨組構造解析プログラムはPython3ですが，断面力図作成はGMT (Generic Mapping Tools) で行っています．理由はPython-matplotlibの３次元プロットはかっこ悪いから．matplotlibは２次元プロットまではいいのですが，３次元になると急に漫画チックになるような気がします．その点，GMTは取り扱いが面倒ですが，２次元・３次元とも統一感のある作図ができ，品が良い感じです．いずれも好みの問題ですが．
GMTにプロットさせるため，解析プログラムの出力データを読み込み，GMTによるプロット用データファイルを作成するPythonプログラムを別途作って対応しています．

# 全体座標系X-Y面内格子桁の解析
三次元プロットを見ている方位：北から150度，仰角30度
コードアングル：全て0

![fig_grid.png](https://qiita-image-store.s3.amazonaws.com/0/129300/72e03ab9-732f-c677-8c45-6abab0d6b86c.png)



# 全体座標系Y-Z面内多層ラーメンの解析
三次元プロットを見ている方位：北から120度，仰角30度
コードアングル：全て0

![fig_cpost_1.png](https://qiita-image-store.s3.amazonaws.com/0/129300/4225cc14-9cce-fa9a-a9da-ab1d5ef957e8.png)


# 全体座標系X-Z面内多層ラーメンの解析
構造系の寸法・断面特性・荷重は，前出，全体座標系Y-Z面内モデルと全く同じですが，三次元モデルにする際，構造物をX-Z面内に配置したものです．
このケースでは，柱部材において，コードアングルを-90度とすることにより，前出モデルと同一の断面力図を得ています．

三次元プロットを見ている方位：北から150度，仰角30度
コードアングル：梁部材は0，柱部材は-90度

![fig_cpost_2.png](https://qiita-image-store.s3.amazonaws.com/0/129300/fe6738c6-6507-18c6-db42-94adf79c8442.png)

コードアングルについては，柱部材と梁部材の関係を考えて設定する必要があります．
以下の文書が，参考になります．

[http://www.archi.hiro.kindai.ac.jp/laboratory/SAL/dfujii/Report/fem/fem_11.pdf](http://www.archi.hiro.kindai.ac.jp/laboratory/SAL/dfujii/Report/fem/fem_11.pdf)


以上
CakePHP3でAuthComponentを利用した時のPageController経由のページの許可方法

CakePHP3でのページ作成でハマったところやちょっとしたつまづきを記録するその１

CakePHP 3.4
PHP 7.0.16

## 困ったこと

AppControllerにてAuthComponentをonにした時にRoot直下のページが映らなくなった

## 解決方法

`beforeFilter()`に`$controller->Auth->allow(['display'])`を指定すれば良い

## 試行錯誤

- phpunitのテストが落ちていたことで発覚
- `beforeFilter()への到達は確認`
- `$controller->Auth->allow(['index', 'home'])`など試行錯誤
- `/`の処理については特殊なのかと思い`config/routes.php`を確認
  - ` $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);`
  - actionを`display`として振り分けていることを知る
- 解決方法の`beforeFilter()`に`$controller->Auth->allow(['display'])`を指定
[Vagrant][Ubuntu] Atlasで提供されているUbuntu boxのパスワード設定を確認

Atlasで提供されているUbuntuの公式boxのパスワード設定が変更になっていたため確認方法のメモ

# Ubuntu 14.04 (trusty) まで

デフォルト設定はかなりゆるい感じでした。

| 項目 | 値 |
|:-:|:-:|
| user | vagrant  |
| pass | vagrant  |

# Ubuntu 16.04 (xenial) から

ユーザー名が変更されてパスワードは固定では無くなった様子です

| 項目 | 値 |
|:-:|:-:|
| user | ubuntu  |
| pass | (boxのVagrantfileを参照) |

### パスワード参照先(versionは環境によって変わります)
Windows
`%homepath%\.vagrant.d\boxes\ubuntu-VAGRANTSLASH-xenial64\20170427.0.0\virtualbox\Vagrantfile`

Linux
`~/.vagrant.d/boxes/ubuntu-VAGRANTSLASH-xenial64/20170311.0.0‌​/virtualbox/Vagrantf‌​ile`

# 参考
[16.04 - ubuntu xenial64 box password? - Ask Ubuntu](https://askubuntu.com/questions/832137/ubuntu-xenial64-box-password)
[Bug #1569237 “vagrant xenial box is not provided with vagrant/va...” : Bugs : cloud-images](https://bugs.launchpad.net/cloud-images/+bug/1569237)
IPoE(v6)+DS-LiteとPPPoE(v4)を両立させる(ポリシールーティング)

自宅のネットワーク回線が目に見えて遅くなっていることを強く意識する機会が増えたので、対策をしてみました。

# 参考リンク

* [てくろぐ: IIJmioひかりの混雑の理由とバイパス手段(IPoE・DS-Lite対応)](http://techlog.iij.ad.jp/archives/1879)
* [てくろぐ: DS-Lite(RFC6333)対応ルータをLinux (Raspberry Pi) で作る](http://techlog.iij.ad.jp/contents/dslite-raspi)
* [Linuxでポリシーベースルーティング - Hogex spotted](http://www.nanajo.com/blog/hogex/?p=444)

# 手段

* IPoEv6 + DS-LiteでIPv4の通信をトンネリングする
* IPv4はこれまで通りPPPoEでグローバルアドレスをもらう
 * 外部からグローバルIPv4アドレスと通信できるようポリシールーティングを設定する

# IPoEv6の有効化

自分が利用しているISPで、IPoEv6を申請します。

# IPv6を受け取れるようにする

自分の場合、NGN IPv6アドレスが降ってくるのを嫌ってsysctlでnet.ipv6.conf.all.disable_ipv6=1となるようにしていたのですが、これを=0に変えました。

# トンネルを作成する

現状、手で実行するスクリプトを書いて設定しています。

```bash
#!/bin/sh
REMOTE='2404:8e00::feed:101' # gw.transix.jp 自分のホストから見えるアドレスを指定する必要がある
LOCAL=`ip addr show br0 |grep 'mngtmpaddr' | awk '{print $2}'  | awk -F/ '{print $1}'` # br0は自分の使っているデバイスを指定する
echo $LOCAL

# IPIP6 tunnel linkup
ip -6 tunnel add ip6tnl1 mode ip4ip6 remote $REMOTE local $LOCAL dev eth0
ip link set dev ip6tnl1 up
```

# デフォルトルートの設定

自分の設定では既にPPPoEセッションを貼るようにしているため、セッション確立時にデフォルトルートが指定されてしまいます。これをip6tnl1に変えるスクリプトを用意して実行しました。

```bash
#!/bin/sh

route delete default
route add default dev ip6tnl1
```

# ポリシールーティングの設定

このままだとPPPoEで設定されたIPv4アドレスへの応答もトンネル側にいってしまうので、PPPインターフェースに割り当てられた情報に基づいた設定を行います。次のようなスクリプトを作りました。

```bash
#!/bin/sh                                                                       

DEV=ppp0
PPP_LINE=$(ip addr show $DEV|grep global)
LOCAL=$(echo $PPP_LINE| awk '{print $2}')
REMOTE=$(echo $PPP_LINE| awk '{print $4}'| cut -d / -f 1)

ip route add from $LOCAL table 10001 prio 32765
ip route add table 10001 via $REMOTE dev $DEV
ip route add default via $REMOTE dev ppp0 metric 10001
```

これでppp0側のIPv4アドレスには応答しつつ、ルーター配下のIPv4マシンはds-lite経由で接続できる環境になりました。

# 課題

## 一部通信できない

一部サイトにうまく繋がらない、あるいは繋がるけど通信が若干おかしいといった感じの現象が起きています。多分MSS/MTUの問題だと思います。iptablesを使っていた頃はその辺り調節できていたのですが、ds-liteの場合にどうすべきかちょっとよくわかっていません。

## IPv4 global側にプライベートアドレスから接続できない

多分ルーティングの優先順位あたりの問題だと思うのですが、LAN内部のプライベートIPv4アドレスからppp0のグローバルIP側に到達できません。多分さらなるルーティングを追加すればいけるのでしょうが、今のところうまくいっていません。
下手に設定を間違えるとLAN内からのアクセスすらできなくなるのが辛いです。

# 結果

speedtest.netで計測した結果が以下になります。昨晩8時頃に計測しました。

|   |PPPoE|DS-Lite|
|:-:|:---:|:-----:|
|下り|7.93Mbps|68.90Mbps|
|上り|20.38Mbps|23.98Mb|

PPPoEでの速度は動画視聴サービスや大きなデータのダウンロード(Kindle, PSN, Steam等)でかなり不便を感じるレベルだったのですが、これでようやくまともになりました。
あるブランチで追加したgemを他のブランチで追加出来ない時

# 概要

下記の事象に遭遇した。

1. ブランチAで pry-byebug を追加した (masterにマージはしてない)
2. ブランチBでも pry-byebug を入れようとブランチBで bundle install したが、すでにインストール済みと出た
3. ブランチB上で pry-byebug の binding.pry を使おうとしたら NoMehotdError が出た

```
NoMethodError (undefined method `pry' for #<Binding:0x007f9cb5920b40>):
```

詳しい原因はわからなかったが、どうやらブランチBではgemAがインストールされたことは記録されているが、実際にはインストールされていないようだった。


# 対処法

下記コマンドで一旦 pry-byebug を削除してから bundle install することでちゃんと追加出来た。

```
bundle exec gem uninstall pry-byebug
```


# まとめ

bundle install に対する理解をもっと深めるべきだと思った。
Ubuntu＋openFrameworksでPerfumeのモーションキャプチャデータを動かしてみる。

#目的
Ubuntu＋openFrameworksでPerfumeのモーションキャプチャデータのサンプルを動かしてみる。
MacやWindowsでの記事は色々あるが、Ubuntuの記事が少ないため、備忘録として残す。

#準備
[UbuntuでopenFrameworksの開発環境を構築する。]
(http://qiita.com/nnn112358/private/b6834379e2eeeeae6793)
を参考に、Ubuntu環境でopenFrameworksをインストールする。


#ソースコードをダウンロードする。
githubより、モーションキャプチャデータをopenFrameworksで動かすexampleをダウンロードする。フォルダ内のofxBvhをaddon以下にコピーする。

```
cd ./OF/apps/
git clone https://github.com/perfume-dev/example-openFrameworks
cp ofxBvh/ ../../addons/ -r
```

```
cd ./OF/addons/
git clone https://github.com/larsberg/ofxMarchingCubes
git clone https://github.com/obviousjim/ofxSTL
```



#モーションキャプチャデータ
Perfume global siteからモーションとサウンドを取得する。example-sync-soundのdataフォルダに格納する。
http://www.perfume-global.com/

```
wget http://cdn.perfume-global.com/launch/swf/140606_1/assets/dl/bvhfiles.zip
wget http://cdn.perfume-global.com/launch/swf/140606_1/assets/dl/Perfume_globalsite_sound.wav.zip

unzip bvhfiles.zip
cp -R bvhfiles example-sync-sound/bin/data/

unzip Perfume_globalsite_sound.wav.zip
cp Perfume_globalsite_sound.wav example-sync-sound/bin/data/

```

#コンパイル
Ubuntu環境でexample-sync-soundをコンパイルするために、Makefileとaddons.makeファイルを作成する。


```
cd  OFX/apps/example-openFrameworks/example-sync-sound
vi Makefile
vi addons.make
make
make RunRelease
```

addons.make

```
ofxBvh
```

Makefile

```
ifneq ($(wildcard config.make),)
	include config.make
endif

ifndef OF_ROOT
    OF_ROOT=$(realpath ../../..)
endif

include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk
```

参考：
https://github.com/perfume-dev/example-openFrameworks
http://www.itmedia.co.jp/news/articles/1203/30/news042.html
特定の条件で Android アプリをクラッシュさせたい

ログにエラーを出していても気が付かないことがあったので、特定の条件でクラッシュさせて、バグに気がつきやすくしたかった。

# Java の assert を使うこと
まずはじめに考えるのはこれでしょう。

```java
assert object != null : "object が null だぞ！！"
```

と本家の Java ならこれで条件を満たすと AssertionError が throw されるが、Android ではこれが機能しないようだ。


# 何も考えず適当に RuntimeException を throw する
ただ throw するだけ。誰も catch しなければクラッシュしてくれる

```java
throw new RuntimeException();
```

これでも十分機能するが RxJava などを使っているとライブラリの中で一旦 catch しているので、これではうまくいかない。

# デフォルトのエラーハンドラを直接呼び出す
これが正解。デフォルトの例外ハンドラにはアプリをクラッシュさせるためのコードが含まれているようで、これを直接呼び出すと、いつものクラッシュしたときのダイアログとともに落ちてくれた。素晴らしい。

```java
Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), new IllegalStateException(e));
```
macのpython3系にopencv3をインストールする

macのopencv3をインストールするのに手こずったのでメモ。

anaconda3-4.3.1(python3.6)にopencv3をインストールしたかった。

#python3にopencv3をインストール
Homebrewがインストールされている状態で以下を実行する。

```
$ brew install opencv3 --with-python3 --without-python --with-contrib
```
--without-python をつけないとエラーが発生する。

その後

```
$ cd /usr/local/opt/opencv3/lib/python3.6/site-packages/
$ mv cv2.cpython-36m-darwin.so cv2.so
$ cd ~
$ echo /usr/local/opt/opencv3/lib/python3.6/site-packages >> ~/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/opencv3.pth
```

anacondaでない場合は最後を

```
$ echo /usr/local/opt/opencv3/lib/python3.6/site-packages >> /usr/local/lib/python3.6/site-packages/opencv3.pth
```
のようにする。
MySQLで関連テーブルの複数行を、カンマ区切り1行にする方法を教えてください

これは「コードを書いていて困ったときに、suinがチャットで質問に答えたり相談に乗る[suinのプログラミング相談室(仮)](https://help.suin.io/)」で頂いた質問と僕の回答の要約です。

## 質問

下記図[^1]のようなデータベースで、各`article`が持ってる`keyword`をカンマ区切りかつ一行で取り出す方法を教えてください。関連テーブルを`JOIN`してみたのですが、1行にまとめることができず複数行になってしまいます[^2]。

![myapp.png](https://qiita-image-store.s3.amazonaws.com/0/889/f330cdba-7934-a189-0841-1e509e200206.png)


[^1]: この図は質問者ではなくsuin作です。作成方法は[SequelProでER図を出力する方法 - Qiita](http://qiita.com/suin/items/25cc0e9d6670a62f4d8e)。
[^2]: suin記: 質問者が試したSQLは省略します。

期待するアウトプットは次のようなものです:

| articles.title | keywords.name|
|-----|-----|
| article1 | keyword1,keyword2,keyword3 |
| article2 | keyword1,keyword2 |
| article3 | keyword1,keyword2,keyword3 |

## suinの回答

MySQLでは`GROUP_CONCAT`関数でカンマ区切り1行にできます。

```sql
SELECT articles.title, GROUP_CONCAT(keywords.name) AS keywords FROM articles
  LEFT JOIN article_keywords
    ON articles.id = article_keywords.article_id
  LEFT JOIN keywords
    ON keywords.id = article_keywords.keyword_id
  GROUP BY articles.id
;
```

## 回答に対して頂いた反応

GROUP_CONCAT関数は知りませんでした！(suinも調べて知りました😂)。ありがとうございます！
PHPUnit でパースエラーを捕捉

PHP の Extention を開発中です。引数のチェックは厳重にやりたいので、いろんなエラーケースを書いていたところ、参照渡しでハマりました。

```bash
vagrant@php-reform:~/php/ext/aha$ phpunit

Fatal error: Only variables can be passed by reference in /usr/local/src/php-7.1.4/ext/aha/tests/FE2Test.php on line 14
```

この FE2Test.php のソース自体がパースエラーになるので、phpunit 全体が失敗してしまうようです。

```php
<?php
use PHPUnit\Framework\TestCase;

class FE2Test extends TestCase
{
  /**
   * 第二引数の型がリファレンスでないと Fatal Error
   * @expectedException ParseError
   */
  public function testArg2IsReference()
  {
    $handle = aha_MbSend([], "test");
    $content = "";
    $this->assertFalse(aha_MbReceive($handle, [], $content));
  }
}
```

```bash
vagrant@php-reform:~/php/ext/aha/tests$ php -l FE2Test.php

Fatal error: Only variables can be passed by reference in FE2Test.php on line 14
```

aha_*() は自分で書いた Extention の中の関数です。aha_MbReceive() の第二引数はリファレンスとして定義してあるため、パースでコケて実行まで行かないようです。

ぐぐってみると、[Testing PHP parse errors with phpunit](http://stackoverflow.com/questions/36624100/testing-php-parse-errors-with-phpunit)で解決策を見つけました。結果的に、以下のように書くだけでテストが通るようになりました。

```php
（中略）
  /**
   * 第二引数の型がリファレンスでない
   * @expectedException ParseError
   */
  public function testMbReceiveArg2IsReference()
  {
    eval('<?php
$content = "";
aha_MbReceive(self::$handle, [], $content);
');
  }
```

コツとしては、とにかく「php -l ソースファイル」でコケたら負けということのようです。

参照

[PHP7調査(23)致命的エラーが例外としてキャッチできるようになった](http://qiita.com/hnw/items/4e2d47d269a26025a726)
Unityのmapbox SDKでとりあえず地図を表示してみる

```
2017/06/29追記
sdkのバージョンが1.0.0になり、Map Controller周りが改修されたようです。
Unity->Map->AbstractMapがベースとなりTile Providerなどが追加されました。
```

mapboxのUnity用SDKを試してみるよ。

## Unity PackageからSDKをインストール
### 1. 新規プロジェクトの作成
mapboxを試す新規プロジェクトを適当に作る。

### 2. SDKの入手
https://www.mapbox.com/unity/ からmapbox SDKのunitypackageを落とす。

### 3. インポート
`Assets` —> `Import package` —> `Custom Package` から落としたunitypackageをインポートする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/7661f2b7-c246-4558-35dd-0658c3e45dd5.png)

## アクセストークンの設定
### 1. 入手
mapboxでアカウントを作成し、以下からアクセストークンを入手する。
https://www.mapbox.com/studio/account/tokens/

### 2. 設定
メニューに `Mapbox` 項目が追加されているので、入手したアクセストークンを設定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/4d3fc6e1-8408-a58e-3035-4186e19ec5e6.png)

`TokenValid: saved to /StreamingAssets/MapboxAccess.text` と表示されれば成功。

ここまではmapboxの[Getting Started](https://www.mapbox.com/mapbox-unity-sdk/docs/00-getting-started.html)に書かれている内容。

## 地図の表示
スタンダードなmapを表示してみる。

### 1. シーンを作成
今回はMapというフォルダの中に必要なものを追加していく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/29fe0f17-2c11-c45e-6072-11c68d13c5d6.png)

### 2. Map Controllerの作成
Hierarchyの `Create` -> `Create Empty` から空のゲームオブジェクトを作成し、今回は名前を `Map Controller` とする。
Inspectorの `Add Component` から `Map Controller` で検索しコンポーネントを追加。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/fc7c7fda-b482-e3a2-5908-b123215a835a.png)

### 3. Factoryの準備
マップの表示に最低限必要なFactoryを作る。

`Factory` フォルダを作成し、 `Create` -> `Mapbox` -> `Factories` -> `Terrain Factory` を作成。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/f226c218-2b0f-a7c6-32d9-90c7a5b6586d.png)

Terrain Factoryはマップのベースとなるもので、平面だけでなく実際の地形のような凸凹なベースも作成できる。
設定はひとまずデフォルトでOK。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/c9962b73-d2bd-1096-290b-599f4e1476d6.png)

同じように `Create` -> `Mapbox` -> `Factories` -> `Map Image Factory` を作成。
Map Image Factoryは文字通り、表示するマップの見た目を指定するもの。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/dccfbb53-24dd-3613-70cc-e8a8a0ca024e.png)

`Map Type` から Mapbox Studioで作成したカスタムスタイルなどを設定することができる。
これも設定はひとまずデフォルトでOK。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/358e4e00-4b99-c5b3-16e7-c9f8b52e2f74.png)

### 4. Map Visualizationの作成
作成したファクトリーを反映していく。

`Create` -> `Mapbox` -> `MapVisualization` から Map Visualizationを作成。

`Factories` の `Size` を 2 に変更し、先ほど作成したFactoryを指定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/8e11051b-2cc2-2563-0031-4e86ea3fff76.png)

Map Controllerのコンポーネントに作成した Map Visualizationを設定し、`Lat Lng`、 `Zoom`、 `Range` の各パラメータを適当に指定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/a9eae0bf-76fc-5752-291c-212bda583b2b.png)

### 5. カメラなどの調整
このままではマップがいい感じに見えないのでカメラやライトを調整。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/0c7fdc62-abd6-b58b-05d1-73a2a31c94bc.png)

### 6. 表示確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/52eb8301-d5e8-fa4e-4b6f-04d906d3d0d0.png)

マップが表示された。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/20586169-741b-fe94-1442-914f79cadba0.png)
RDS for PostgreSQL パラメータ設定

# 構築に最低限のパラメータ設定

## タイムゾーン、ログ・ファイル関連

| パラメータ | 値 |
|:--|--:|
|timezone|Asia/Tokyo|
|log_temp_files|0|
|log_lock_waits|on|
|log_min_duration_statement|100|
|log_disconnections|on|
|log_connections|on|

- 随時更新していきます。
- チューニング項目は別途。
WindowsにVCCWでwordpress開発環境を整える件

いっぱい記述はその辺にあるんだけど、Windowsでの記述が少ないのと、
site.ymlの日本語化設定が何故か効かず一度入れ直したもので、手順をメモっとく。

## VCCW同梱物
Ubuntu 16.04 Xenial64
Subversion
Git
jq
WP-CLI & WordPress
WP-CLI
WordPress i18n Tools
WordPress Coding Standards for PHP_CodeSniffer
PHP 7
PHPUnit
Composer
PHP_CodeSniffer
MySQL 5.7.x
Apache 2.4.x
NodeJS 最新版
Ruby 2.3
Bundler
Wordmove
MailCatcher

まあなんやかんや、その時点で結構新しい目のものが入ります。
個人的にUbuntuっつーのが引っかかるが…（デスクトップOSだと思ってる派）

## 準備するもの
Oracle Virtualbox 5.1.6以上（インストールしておく）
Vagrant 1.8.6以上（インストールしておく）

## VCCWのダウンロード
gitで落としてこいよ！という記述が多いものの、
うちの会社ではgitはこないだ勉強して知りました、という人が多いので
（やらせてもいいんだけど）CLIからgitコマンドを放つのはパス。

http://vccw.cc/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181930/8c12d4a8-ba3b-75b2-8bba-f83d98278d63.png)
ちゃんとzipファイルでダウンロードできるように、vccwのサイトに用意されている。
これを任意の場所に展開する。

## コマンドプロンプトの起動
Cygwinとか使いなよと、会社でvccwの勉強を始めた人たちは言われていたのだけど、
フォルダのプロパティからコピーしたファイルパスがそのまま使えないのと、
Vagrantのコマンドはパスが通っているはずなので
コマンドプロンプトからでもできるよ！

というわけでコマンドプロンプトを開き、vccwを展開したフォルダに移動する。

```bash:command
cd C:\Users\kuragen\Documents\vccw
```
## site.ymlの変更
さて、vccwを展開したフォルダの中には
vccwの起動に必要なVagrantfileが入っているので、
もうこのまま起動しちゃってもいい。

だけどこのままだとWordpressは英語版が起動するので、
site.ymlの記述を変更する必要がある(まあ、英語版がいい人はこのままでいい)。
どうもこの時点でsite.ymlを用意してしまった方が良いように感じる。

（site.ymlはprovisionフォルダ内のdefault.ymlをコピーして作成）

というのは初回起動した後にsite.ymlを書き換えて再起動しても、
画面に何故か反映されなかったからだ。
（そういうとき、
　仮想環境というのはその仮想マシン捨てちゃって新しいのを入れたら済むので楽と言えば楽、
　不具合を解消するという苦労を忘れるの良くない）

```site.yml:25行目付近
\#lang: en-US  //コメントアウト
lang: ja
```
これはWindows側から堂々フォルダを開いて、お好きなエディタで編集どうぞ。
また、その近くにマルチサイト用のmultisite:という設定項目があるので、
デフォルトはfalseだがマルチサイトを試みたい人はtrueへ書き換えるとよい。
## VCCWの起動とVCCW仮想マシン作成
ようやくvccwを起動。
コマンドプロンプトに戻る。

```prompt:cmd
vagrant up
```
初回起動は仮想マシンを作成するので、
仮想ネットワークの設定やらSSH鍵の設定やら、
composerのライブラリインストールやらで5分ぐらいは見ておいた方が良い。

インストールが全部終了しても、
特に「Welcome VCCW!」などというメッセージもなく、
そっと起動してるのでコーヒーでも飲みながらちらちら窺ってると良いかも。

VirtualBoxのマネージャーは起動しないけど、
起動させるとちゃんと「vccw.dev」というのが実行中になってるはず。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181930/8737144b-777b-664e-acc1-b20253dde650.png)
## hostsファイルの設定
vccwのサイトにはhostsを書き換えてくれるスクリプトが置いてあるんですが、
残念ながらWindowsでは動かないので、手で書き換えましょう。

```cmd:C\\Windows\systes32\drivers\etc\hosts
	192.168.33.10	vccw.dev
```
あ、このフォルダの中での編集は禁止なので、
一度デスクトップにでもコピーしてから編集して元に戻してね。

## Vagrant upが失敗する場合
Virtualization Technology(VT)がdisableになっている可能性を第一に考えましょう。
一旦再起動して、BIOS画面を開きます。
CPU Setting辺りにVirtualization Technologyの項目がありますので
これをenableにしてください。
保存して再起動し、もう一度vagrant upにチャレンジ。

## では良い航海を
http://vccw.dev
http://192.168.33.10
のどちらかに接続すればWordpressが開くはず。

仮想マシンの操作はSSHで接続して行うのが良いかと思います。
仮想マシンにはどっちみちGUIは用意されておりませんので。

接続ユーザはsite.ymlの中に書いてあるよ！

いらっしゃいませ、Wordpress開発の世界へ。

あ、仮想マシンを落とすときは

```prompt:cmd
vagrant halt
```
上げるときはvagrant up、落とすときはhalt！
これだけ覚えとけば今のところ大丈夫！
【iOS】クッキーをセットする【Swift3.0】

UIWebviewにインクルードしているWebにIDFAを渡すという要件があった。会員登録が不要なコンテンツでユーザを一意に特定する手段が存在しないため、サーバサイドでIDFAを受け取るAPIを用意してDBにストックするという方法は使えない。というわけでクッキー経由でIDFAの受け渡しを実現したというメモです。

## クラスメソッドを定義

汎用的に使えるように、IDFA取得とクッキーをセットするクラスメソッド２つをユーティリティクラス的なところに定義します。IDFAを扱うにはAdSupport.frameworkが必要ですので追加しておきます。

```Swift
// Common(ユーティリティ)クラス

// import AdSupport


    /// getIdfaString　
    ///　
    /// - returns: IDFA
    class func getIdfaString()->String.UTF8View {
        
        var idfaString:String.UTF8View = "".utf8
        
        //IDFA
        if let myIDFA = ASIdentifierManager().advertisingIdentifier {
            idfaString = myIDFA.uuidString.utf8
        }
        
        return idfaString
        
    }
    
    /// setCookie
    ///
    /// - parameter key: クッキーのキー
    /// - parameter value: 値
    class func setCookie(key: String, value: AnyObject) {
                
        let ExpTime:Double = TimeInterval(60 * 60 * 24 * 365)
        
        let cookieProps: [HTTPCookiePropertyKey : Any] = [
            HTTPCookiePropertyKey.domain: Common.baseDomain,
            HTTPCookiePropertyKey.path: "/",
            HTTPCookiePropertyKey.name: key,
            HTTPCookiePropertyKey.value: value,
            HTTPCookiePropertyKey.secure: "TRUE",
            HTTPCookiePropertyKey.expires: NSDate(timeIntervalSinceNow: ExpTime)
        ]
        
        if let cookie = HTTPCookie(properties: cookieProps) {
            HTTPCookieStorage.shared.setCookie(cookie)
        }
    }

```

## 呼び出して使う

実際にIDFAを取得してクッキーにセットするところです。クッキー利用の許可を忘れずに。
`HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always`
以下は、ad_idfaにIDFAを、ad_idfa_typeに"idfa"を、ad_optoutに"0"を設定しているサンプルコードです。

```Swift
// ViewControllerクラス

    override func viewDidLoad() {
        super.viewDidLoad()


        // IDFAを取得
        let idfa = Common.getIdfaString()
        
        // クッキーを許可
        HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always
        
        // クッキーを設定
        Common.setCookie(key: "ad_idfa", value: idfa.description as AnyObject)
        Common.setCookie(key: "ad_idfa_type", value: "idfa" as AnyObject)
        Common.setCookie(key: "ad_optout", value: "0" as AnyObject)

	}
```

参考　[How To Set a Cookie for a UIWebView manually in Swift
](http://stackoverflow.com/questions/37136797/how-to-set-a-cookie-for-a-uiwebview-manually-in-swift)
SQL 文字列を連結する


# SQL 文字列を連結する

## 概要

- SQLで文字列を連結したい場合は、CONCAT関数を使用する
- 引数には2つ以上の文字列を指定する

## 構文

```SQL
CONCAT ( string_value1, string_value2 [, string_valueN ] )  
```


<h3><i class="fa fa-pencil-square-o"></i> 使用例</h3>

```SQL:example.csv
SELECT CONCAT('ひとよ','ひとよに','ひとみごろ') AS result;
```

<h3><i class="fa fa-play-circle"></i> 結果</h3>

| result                   |
|:-------------------------|
| ひとよひとよにひとみごろ |
CentOSでポート開放確認する時のメモ

telnetをインストールするのが面倒な時は

```shell-session
curl -v telnet://<ipアドレス>:<ポート番号>

# 疎通確認出来ればこんな感じで表示されます
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) port 22 (#0)

# 失敗するとこんな感じで表示されます
Failed to connect to xxx.xxx.xxx.xxx port 22: Operation timed out
```

でOKです。
ACFでTaxonomyの返り値オブジェクトに設定してしまった際に、meta_queryで一覧を出したい

#ACFのオブジェクトの返り値を使って一覧を出したい
アドバンスドカスタムフィールドを使って、記事と別のタクソノミーを連携した際にの記事一覧の出し方について、当たった問題と解決策を書いてきます。

## フィールド設定をタームIDにした時
タームIDを使用した際の記事一覧は、

``` php
$args = array(
  'meta_query' => array(
    array(
      'compare' => 'LIKE',
      'key'     => "acf_taxonomy" // 設定したキー
      'value'   => 41 // 取得したい値
    )
  )
);
```

で取得できます。

## フィールド設定をオブジェクトにした時
タームIDをオブジェクトにした際、設定したのフィールド名を`acf_taxonomy`とすると、
ここに入っている値は`WP_Terms`というオブジェクトが配列で入っています。

ですので、タームIDと同じようにはいきません。

オブジェクトで入っていると説明をしましたが、
記事に入っている情報`acf_taxonomy`の中身をみてみると

`'a:6:{i:0;s:2:"41";i:1;s:2:"56";i:2;s:2:"74";i:3;s:1:"2";i:4;s:1:"4";i:5;s:1:"3";}'`

みたいな感じで入っています。

このダブルコーテーションで囲まれてる`"41"`などが、**オブジェクトのterm_id**になります。
なので、この文字列に「**取得したいIDが、ダブルコーテーションで囲まれて入っていれば取得**」という形を取ります。

``` php
$args = array(
  'meta_query' => array(
    array(
      'compare' => 'LIKE',
      'key'     => "acf_taxonomy"
      'value'   => '"41"' // "41"という文字列を探す
    )
  )
);
```
これで特定の値をもった記事を探す事ができます。

もしかしたらタクソノミーだけでなく、投稿とかでもつかえるかも・・・（要検証）

## ACFでつまったら
たまに検索しても解決策が見つからない場合があります。
その際、

``` php
var_dump( get_post_meta($post->ID,) );
```
を記事が出力される箇所にいれて、
どのフィールドがどのように入っているのかをみてみると、もしかしたら解決できるかも・・・！
[bash] 実行スクリプトの絶対パスの取得

毎回調べてるので使い方メモ

スクリプトの配置位置、実行位置を気にせずにスクリプトの実行をしたい
相対パスから絶対パスへの変換に使用する

# 実装

```bash:スクリプトの絶対パスの取得
SCRIPT_DIR=$(cd $(dirname $0); pwd)
```

+ `$0` で実行コマンドを取得
+ `dirname` でベースディレクトリを取得
+ サブシェル内で `cd` で移動
+ `pwd` で絶対パスの取得

# 使用例

```bash:test.sh
#!/bin/bash

SCRIPT_DIR=$(cd $(dirname $0); pwd)

echo $SCRIPT_DIR
```

```console:使用例
$ ./test.sh
/tmp

$ mkdir hoge
$ cd hoge/
$ ../test.sh
/tmp
```

どこから実行してもパスは変化しない
kernel の起動に失敗した時に、昔のカーネルから起動させる方法

#


# 再起動に失敗した場合

起動中に

```text:
Hit [Enter] to boot immediately, or any other key for command prompt.
```
と出ているところで、Enter以外のキーを押し、

```text:
unload
load kernel.GENERIC (FreeBSD(98)の場合はkernel.GENERIC98)
boot
```
と入力すると、以前のカーネルで起動する。
EC2 instance起動時にtagをつけるTagSpecifications

AWSCLIでEC2 instance起動時に同時にタグをつける方法としては、instance起動してinstance-idを取得しておいて、パイプでつないでtagをつけたり、スクリプトの中で後でタグ付けする方法があったと思います。
http://kurochan-note.hatenablog.jp/entry/2017/01/08/220155

AWSCLI EC2 Run-Instanceのなかに--tag-specificationsというoptionが入って、run-instancesの中でタグが作成できるようになりました。地味なアップデートかもしれませんが、結構うれしいです。

instanceの詳細はjsonに記述して、下記のように指定して実行します。

```
aws ec2 run-instances --cli-input-json file://instance.json
```
EC2は山ほど設定項目があるので、generate-cli-skeltonでフォーマットを出力して、必要な項目だけ入力して、不必要なものは消すとinstanceの詳細を記述したjsonの完成です。Gitにでも入れておきましょう。
http://docs.aws.amazon.com/cli/latest/userguide/generate-cli-skeleton.html

```
aws ec2 run-instances --generate-cli-skeleton
```

Instanceの設定詳細を記述したjsonサンプル

```instance.json
{
    "ImageId": "<image-id>",
    "KeyName": "<my-key>",
    "SecurityGroupIds": [
        "<my-sgid>"
    ],
    "InstanceType": "<instance-type>",
    "BlockDeviceMappings": [
        {
            "VirtualName": "Root",
            "DeviceName": "/dev/sda1",
            "Ebs": {
                "VolumeSize": 100,
                "DeleteOnTermination": true,
                "VolumeType": "gp2"
            }
        }
    ],
    "Monitoring": {
        "Enabled": false
    },
    "SubnetId": "<subnet-id>",
    "DisableApiTermination": false,
    "IamInstanceProfile": {
        "Name": "<instance-iam-role>"
    },
    "TagSpecifications":[
        {
            "ResourceType": "instance",
            "Tags": [
              {
                "Key": "Name",
                "Value": "<server-name>"
              },
              {
                "Key": "ClusterName",
                "Value": "<cluster-name>"
              },
              {
                "Key": "Application",
                "Value": "<myapp>"
              },
              {
                "Key": "CostCenter",
                "Value": "<my-cost-center>"
              },
              {
                "Key": "Environment",
                "Value": "Test"
              },
              {
                "Key": "User",
                "Value": "<user-name>"
              }
            ]
        },
        {
          "ResourceType": "volume",
          "Tags": [
            {
              "Key": "Device",
              "Value": "<device-name>"
            },
{
              "Key": "CostCenter",
              "Value": "<my-cost-center>"
            },
            {
              "Key": "backup_key",
              "Value": "true"
            }
          ]
        }
    ]
}
```
Vagrantチュートリアル(4)

前回からの続きで書いてます [< Vagrantチュートリアル(3) >](http://qiita.com/piyomarudayo/items/df8f27837e5cdfa2ebd0)

# Networking
今回はホストマシンからVagrantの仮装サーバにアクセスするためのオプションを設定します。
※初期設定は自動ゲストログインする設定になっています。

### » Port Forwarding
いわゆる接続においてのポート指定をしていきます

例によってVagrantFileを編集していきます
以下の1行を追加します
`config.vm.network :forwarded_port, guest: 80, host: 4567`
<img width="310" alt="スクリーンショット 2017-05-19 14.54.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/218444e7-a318-81a3-6fb0-061388fbd5bb.png"> → <img width="310" alt="スクリーンショット 2017-05-19 14.54.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/3000474e-ad3c-48f0-4a3c-9f3da4c5593f.png">

終わったら

```
$ vagrant reload
$ vagrant ssh
```
とコマンドを打つと設定が反映されます

ブラウザを立ち上げて以下URLを入力して確認します
`http://127.0.0.1:4567`

こんな感じで確認ができます
<img width="500" alt="スクリーンショット 2017-05-19 15.49.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/66075b0a-4b8e-1d41-7107-ae8d8cf77cbc.png">

### » Other Networking
ゲストマシンを既存のネットワークにブリッジすることができる他の形式のネットワークもあります。他のオプションに興味がある場合は、[こちらの公式ページ(networking)](https://www.vagrantup.com/docs/networking/)を読みましょう。

# あとがき
自分用に公式のチュートリアルをまとめてみようと思ったものです
詳細は公式また他にもわかりやすい記事は色々あるのでご参考に
[Vagrant公式](https://www.vagrantup.com/intro/index.html)
[ドットインストール](http://dotinstall.com/lessons/basic_vagrant)
GitHub Desktopの基本用語を整理

正真正銘のGitHub初心者。
コミットとかプッシュとかプルとかわけがわからないので一旦まとめてみる。

# リポジトリ
あるディレクトリのバージョン履歴(変更履歴)を保管しておく容れ物。リポジトリの管理下にファイルやディレクトリを置くことで、そのファイルやディレクトリの変更履歴を記録することができる。

## ローカルリポジトリ
自分のPC上(ローカル環境)に置くリポジトリのこと。自分のPC上にあるファイルやディレクトリのバージョン管理をしたい場合に用いる。

## リモートリポジトリ
外部のサーバなどのネットワーク上に置くリポジトリのこと。ネットワーク上に置くことで複数人で管理下のファイルやディレクトリを共有することができる。

### リモートリポジトリには常に最新のソースコードを置く
リモートリポジトリには常に最新のソースコードを置いておく。それぞれの開発者は自身のPC上のローカルリポジトリにリモートリポジトリのソースコードをコピーする。
そしてローカルで何か変更を加えた時に、その変更をネットワーク上のリモートリポジトリに同期して反映させる。


# コミット
リポジトリに変更を記録する操作を<strong>コミット</strong>と言う。ディレクトリやファイルの状態を記録するための操作。
コミットをすることで現在の状態が日時や変更を加えた人の情報と一緒に保存され、いつでもその状態に戻れるようになる。

# インデックス
コミットするファイルが一時的に登録される場所で、コミットするためにチェックを入れたもの。GitHub Desktopだとこんな画面。
<img width="656" alt="スクリーンショット 2017-05-19 14.59.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/176100/e005e358-0f11-8900-0645-f6c23c1d6bb6.png">
選択して<strong>コミット</strong>すると、選択したファイル群の変更が記録される。

# クローン
リモートリポジトリを複製してローカルリポジトリを作成すること。クローンを実行すると、リモートリポジトリの内容をまるまるダウンロードしてきて、別のマシンにローカルリポジトリとして作成できる。

# プッシュ
ローカルリポジトリで加えられた変更をリモートリポジトリに同期させる。ローカルリポジトリで変更を記録(コミット)したあとは、プッシュをしないとリモートリポジトリに変更が反映されないので注意。

つまり順序としては(```add-posting-article```というブランチで作業しているとして)

1. ```add-posting-article```に<strong>ローカルリポジトリ</strong>で変更を加えたものを<strong>インデックス</strong>にあげて、チェックを入れたものに対して<strong>コミット</strong>する。これで、ローカルリポジトリにファイルの変更履歴が記録される。
2. <strong>プッシュ</strong>して、ローカルリポジトリでの```add-posting-article```の変更内容を<strong>リモートリポジトリ</strong>の```add-posting-article```に反映させる。


# プル
リモートリポジトリを取得してローカルリポジトリを更新する操作。他の開発者による変更がリモートリポジトリに反映されたあとや、マージをした後には必ずプルをする必要がある。(プルはプッシュの反対)


# マージ
ブランチとブランチを統合すること。マージするには結合される側のブランチをする側のブランチの2つが必要。原則、結合される側のブランチはmasterブランチと言う名前。masterブランチは常に公開できるような状態にしておき、新しく作ったブランチをmasterブランチにマージしていく。

# プルリクエスト
作成したブランチをmasterブランチにマージする時の確認作業。プルリクエストを使うと、Github上でブランチ間にどれだけの差分があるかを確認できる。差分を元に他の開発者から確認やレビューをもらうことができる。(プルリクエストはローカル→リモートだが、プルはリモート→ローカル。よって分けて考えた方が混乱しなくて良い)