OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Compose で WordPress のテーマ開発環境を構築

環境は Mac と Docker Desktop です。
Docker Compose を使って素早く WordPress のテーマ開発環境を作ることができるようになりました。

# 開発初期テーマを用意
以下の URL から underscores をベースにした汎用テーマをダウンロードします。
https://underscores.me/

これでテーマの雛形ファイルがてにはいります。試しに `pugiemonn` と入力してテーマファイルを作りダウンロードしました。Zip ファイルを解凍します。

underscores からダウンロードしたらテーマのファイル一覧です。

<img width="206" alt="wordpress-theme.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/7a4587d4-8292-becf-0b5f-c5d662cd108f.png">

ここは少しおまけですが、ダウンロードディレクトリにある `pugiemonn` テーマを作業場所に移動しました。

```
mkdir -p ~/Documents/WordPress/themes
mv ~/Downloads/pugiemonn ~/Documents/WordPress/themes
cd ~/Documents/WordPress
```

解凍した `pugiemonn` テーマディレクトリを、`~/Documents/WordPress/themes` ディレクトリに移動しています。
次に、`docker-compose.yml` を作成します。

# docker-compose.yml を用意


```bash:docker-compose.yml
vi docker-compose.yml

version: '3'

services:
  db:
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=wordpress
  web:
    image: wordpress
    volumes:
      - ./themes/pugiemonn:/var/www/html/wp-content/themes/pugiemonn
    links:
      - db
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=root
      - WORDPRESS_DB_PASSWORD=password
```

docker-compose.yml を作成したら準備完了です。
参考までに `~/Documents/WordPress` は以下の画像のようなディレクトリ構成です。
<img width="100%" alt="wordpress-directory.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/1b3a3d2b-eb41-9b56-dd2c-17e1ee3a916a.png">

# WordPress 開発環境をスタート
Docker を立ち上げます。

```
docker-compose up -d
```

# 動作確認
`localhost:8000` にアクセスすると WordPress のインストールが始まります。

<img width="371" alt="WordPress インストール" src="https://qiita-image-store.s3.amazonaws.com/0/1624/15b33404-aa98-2d7e-ddf7-b4b9aef480dc.png">

WordPress のテーマ開発環境を作成できました。
PWAやってみるメモ - 1 計画フェイズ

*この記事は最近のWebAppに慣れていない人間がとりあえずPWAを体験するための備忘録を兼ねたものです。*

PWAをやるぞ！と思ったので、とりあえず動かすところから始めようと思う。
というわけでまずは動かす前に計画（というか滅茶苦茶ざっくりした方針決定）から。

# 作るもの
TODO アプリ。
（すごくPWAの無駄遣いな気がするが、とりあえずやってみることに価値がある、ということにしておく）

# ざっぱな要求
* TODO をなんかそれっぽく登録できること。
* TODO の期限が来たらなんかそれっぽくPush通知が来ること。
* TODO をリスト表示できて、実施済みのものはなんかそれっぽくわかるようにすること。

## ちょっと細かくしてみる
* TODO は以下の要素からなる。
  * ID (整数値？SequenceなPKのイメージ / Key兼順序整理担当)
  * description (文字列 / TODO の内容)
  * limit (日時 / TODO の期限)
  * lastupdate (日時 / 登録ないし更新時のSysdate)
  * status
* TODO は一覧表示できる。
* TODO は「完了」することができる。
  * 「完了」すると一覧から消えるか「完了済み」に移る？
     * とにかくなんか動く。
* 時刻が TODO の limit に到達した時、Push通知する。
* TODO は削除 / 更新できる。
  * ……ようにしたいが、オマケ感がある。スコープ外でもいい。

*重要事項: Service Worker は時間を数えられない。*
まあそういうモデルじゃないよな。

# 何を使う？
*重要事項: WebApp的にはかなり古い部類の人間で（なにせ未だにJS系のフレームワークをロクに触ったことがない！）あるため、まずはPWAに絞って話をしたい。*

## フロント
[ここ](https://qiita.com/radiocat/items/034904a094d07c389a4f#%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E6%A7%8B%E6%88%90)を参考にする。
ReactもVueも触ったことがない + 今回の主題ではない。よって無視する。
（というか、どう考えてもこの規模のものに頑張って導入するようなものじゃないだろう。jQueryだって要るか怪しい）

## バック
Firebaseがよいらしい。
これはこれで複雑そうだしオーバーパワーもいいところだけど、お試しだし、とりあえずGoogle様の御威光に縋る。

## おおまかに全体像
### フロント・キャッシュ
* データ以外全部（HTML/CSS/JS）

データはJSONでサクサクやり取りしてフロント側で適当に書き出したい

### バックエンド → フロントエンド
* TODO リスト
* Push 通知

### フロントエンド → バックエンド
* 新規 TODO
* TODO ステータス変更
Google App Engine で Rails 5 を動かす

Google App Engine で Rails 5 を動かしてみました。
この記事では、その流れを紹介しようと思います。

# 前提
Cloud Console 上で、新しい Cloud Platform プロジェクトを作成しておきます。
App Engine アプリケーションを作成し、課金を有効にします。

このあたりの作業の流れは、公式ドキュメントを読むことをお勧めします。
https://cloud.google.com/ruby/getting-started/hello-world?hl=ja

# Cloud Shell を使う
自分の PC 上で開発したアプリを SDK でデプロイすることもできるのですが、ここでは Cloud Shell を使ってみます。ウェブコンソールの右上にアイコンが並んでいて、下記の赤で囲ったアイコンをクリックすると Cloud Shell が起動します。
![cloud-shell.png](https://qiita-image-store.s3.amazonaws.com/0/48133/21125e84-adcd-bbff-2632-051d0a4e612b.png)

# Rails のデプロイを試す
では、Cloud Shell 上で Rails のプロジェクトを作成しましょう。
```
$ rails new sample_app
```

hello world を表示するページを作成します。ソースは [Rails Tutorial](https://railstutorial.jp) と同じものです。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def hello
    render html: "hello, world!"
  end
end
```

```ruby:config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root 'application#hello'
end
```

デプロイしてみます。デプロイ時に app.yaml を自動的に作ってくれます。

```
$ gcloud app deploy
```

# ログを見て切り分け

ページが正しき表示されることを期待してページにアクセスしたところ、こんな表示になっていました。
![err-page.png](https://qiita-image-store.s3.amazonaws.com/0/48133/a968bc9d-02cf-1f25-3ae6-680ee280f216.png)

ログを見てみます。Cloud Console 上で、ロギングのところで GAE アプリケーションを選ぶとログを見ることができます。

![logging.png](https://qiita-image-store.s3.amazonaws.com/0/48133/31358ee9-3413-03e8-13c7-001b2ddd701d.png)

お、これがエラー原因のようですね。

![errlog.png](https://qiita-image-store.s3.amazonaws.com/0/48133/32af732e-28b3-d703-bba0-aa1788f03faa.png)

上記エラーへの対応を行います。

```
$ rails secret
```

を実行し文字列を取得した後、app.yaml で環境変数の設定をします。

```app.yaml
env_variables:
  SECRET_KEY_BASE: [rails secret で表示された文字列]
```

デプロイしなおすと、無事ページが表示されました！

![web.png](https://qiita-image-store.s3.amazonaws.com/0/48133/50fe0bbf-f5e5-e902-4492-4fe7592920bc.png)


# 課金についての注意点

スタンダード環境は無料枠がありますが、スタンダード環境のランタイムには Ruby がありません…
よって、現状はフレキシブル環境で使用するしかないようです。

https://cloud.google.com/appengine/pricing?hl=ja
https://cloud.google.com/appengine/docs/standard/

また、デフォルトではインスタンスが 2 個起動するようになっています。1 個だけでよい場合は、以下のようにしましょう。

```app.yaml
manual_scaling:
  instances: 1
```

# （追記）デプロイにかかる時間について

フレキシブル環境だとデプロイに 10 分程度要します。個人で試すときには、すぐデプロイ結果を見れないので、ちょっと不便だと感じました。サービスの選定は適材適所ですが、個人で Rails の開発を GAE で進めるのは今一つ向かないという感触です（少なくとも現時点では）。
vSphere EVCを有効化する場合のCPU世代に気をつける件

仮想環境を導入しているところでも、ハードウェアのリース切れ保守切れから老朽化などで、ホストを入れ換えるということはままある事態だと思われ。

#フェールオーバーとCPUの関係
仮想環境の強みは「ホストに異常が生じても、その上で稼働中のVMは自動的にフェールオーバー」だと思ってるんですが、
vSphereだとホストをクラスタでまとめておくことと、それらのホストのCPUが同一世代であることが条件なわけですね。(他の環境でも同じだと思うけど)

理由は「CPUの命令セットが世代ごとに異なるから」なんですが、
基本的に後方互換性があるので、2世代以上のCPUが混在していても、
新世代CPUホスト上の仮想マシンを旧世代CPUホスト上にフェールオーバーさせるのは(無論、仮想化命令が使えるのが前提の旧世代ですよ！)いけるんですけど、
普通逆だろと。ホストがヤバくなるのは一般的には古い方からだろと。

そこで、vSphereにはクラスタに設定するEnhanced VMotion Compatibility(EVC)という機能が搭載されております。

#vSphereのEVC機能と制限
これは有り体に言えば
クラスタ内に存在する全ホストのCPU(の命令セット)世代を、一番古い世代に統一することによって、
新世代CPUか旧世代CPUかの区別なくvMotion(フェールオーバー)させることができるようにしちゃおうという、
ホスト入れ替え時に大変ありがたい機能となっております。

が、この機能、
当たり前のことですがvSphereのバージョンによって選べるCPU世代が決まってましてね？
特にvSphere Clientを頑なに使っているそこの会社のインフラ担当の方、
vSphere Clientは5.0の機能のまま時が止まっているため、
最新バージョンでも選択できるCPU世代はIntelで言うところのSandy Bridgeまでとなります。次の世代のIvy Bridgeもアウトです、Haswellなんて夢のまた夢です。
vSphere5.5の場合、WebクライアントからだとIvy Bridgeならワンチャンあります。

で、今稼働中のホストで一番古い世代のCPUよりもEVCモードで選択できるCPU世代が古いとどうなるかというと、
「EVCをオンにするときに稼働中の仮想マシン再起動が必要になる」ということです…

EVCをオンにしていない場合、ざっくりと
1.EVCオンのクラスタを同じDC内に作成
2.元のクラスタのホストのうち、どれか1つのホストの稼働中VMをvMotionで他のホストに移動する
3.稼働中VMのなくなったホストをメンテナンスモードに切り替え
4.メンテナンスモードのホストをEVCオンのクラスタに移動
5.メンテナンスモードを切る
6.移動し終わったホストにVMをvMotionで戻す
7.他のホストも同じように移動

という手順になるんですが、この手順6.で「新世代CPUのホストから旧世代CPUのホストに移動」という、前の方に書いた「できない話」になってしまうのですね。
当然、エラーが発生します。

斯くなる上は、皆様が長期休暇中に出勤して、
VM停止→再起動を繰り返しながら作業するしか無くなります。
ホスト入れ替え時にはEVCの適用条件と、あとvSphereのアップグレードの話もお忘れなく…(今回はギリギリ良くても、ホスト入れ替えた次回困るかも知れない…VCサーバも入れ替えだろという話もあるが)

この話、日本語では書いてるWeb上の記述見たことないので書き残すことにしました。
いずれどなたかの何かのヒントになれば幸いです。N年後の自分だったりしてな。
キーワードを指定してTwitterに流れてくるメッセージをSlackに流すGo言語Bot

自社サービスについてのTweetがあったらSlackに通知するというBotを、[anaconda](https://github.com/ChimeraCoder/anaconda)というライブラリを使って作成します。
エゴサーチがとっても捗るのでオススメです。

# Create New App

[Application Management](https://apps.twitter.com/)からアプリケーション追加を行い、以下の認証情報を入手します。

* Consumer Key
* Consumer Secret
* Access Token
* Access Token Secret


# ソースコード

認証情報を使って、以下のように実装します。

```go:twitter_search.go
package main

import(
  "github.com/ChimeraCoder/anaconda"
  "net/http"
  "net/url"
  "fmt"
  "bytes"
  "os"
)

func main() {
  /* 第二引数に検索キーワード(track)を指定 */
  if len(os.Args) != 2 {
    fmt.Print("track not specified!\n")
    os.Exit(1)
  }
  var track string = os.Args[1]

  /* 認証情報を設定 */
  anaconda.SetConsumerKey("REPLACE_WITH_CONSUMER_KEY")
  anaconda.SetConsumerSecret("REPLACE_WITH_CONSUMER_SECRET")
  api := anaconda.NewTwitterApi("REPLACE_WITH_ACCESS_TOKEN", "REPLACE_WITH_ACCESS_TOKEN_SECRET")

  /* フィルタリング条件を指定してstreamを取得 */
  v := url.Values{}
  v.Set("track", track)
  twitterStream := api.PublicStreamFilter(v)

  /* streamから入力があり次第処理 */
  for {
    x := <-twitterStream.C
    switch tweet := x.(type) {
    case anaconda.Tweet:
      /* Tweetの場合はSlackに通知(webhookのURIに対してPOST) */
      jsonStr := `{"text":"https://twitter.com/` + tweet.User.ScreenName + `/status/` + tweet.IdStr + `/","icon_url":"` + tweet.User.ProfileImageUrlHttps + `","username":"` + tweet.User.Name + `"}`
      req, _ := http.NewRequest(
        "POST",
        "https://hooks.slack.com/services/REPLACE_WITH_WEBHOOK_URI",
        bytes.NewBuffer([]byte(jsonStr)),
      )
      req.Header.Set("Content-Type", "application/json")

      /* POST実行 */
      client := &http.Client{}
      resp, err := client.Do(req)
      if err != nil {
        fmt.Print(err)
      }
      defer resp.Body.Close()

    case anaconda.StatusDeletionNotice:
      // pass
    default:
      fmt.Printf("unknown type(%T) : %v \n", x, x)
    }
  }
}
```

anacondaはgo getする必要があります。

```
$ go get github.com/ChimeraCoder/anaconda
```

# 実行

hello等のよくTweetされそうな単語で実行すると検証しやすいです。

```
$ go run twitter_search.go '検索キーワード'
```

# 参考URL
[golang + anacondaでTwitter Streamimg APIを使う](http://ykicisk.hatenablog.com/entry/2015/11/11/004757)
pocketのAPIを触るためにconsumer_keyとaccess_tokenを得たい

試しにPocketのAPIを触ってみたので、軽くメモを残しておきます。

[Pocket Developer Program: Pocket Authentication API: Documentation](https://getpocket.com/developer/docs/authentication)

これを使えば`consumer_key`と`access_token`を得ることができます。一応curlで雑にやる方法を書いておきます。
まずはアプリケーションを作成します。これで`consumer_key`が手に入ります。

https://getpocket.com/developer/apps/new

ここからcurlで以下のURLを叩きます。

```
$ curl -H "Content-Type: application/json; charset=UTF-8" -d '{"consumer_key":"1234-abcd1234abcd1234abcd1234","redirect_uri":"pocketapp1234:authorizationFinished"}' -X POST https://getpocket.com/v3/oauth/request

code=dcba4321-dcba-4321-dcba-4321dc
```
ブラウザで以下のようなURLにアクセスして許可をします。

https://getpocket.com/auth/authorize?request_token=dcba4321-dcba-4321-dcba-4321dc

これでまたcurlで以下のURLを叩きます。

```
$ curl -H "Content-Type: application/json; charset=UTF-8" -d '{"consumer_key":"1234-abcd1234abcd1234abcd1234","code":"dcba4321-dcba-4321-dcba-4321dc"}' -X POST https://getpocket.com/v3/oauth/authorize
access_token=5678defg-5678-defg-5678-defg56&username=pocketuser
```

これで`access_token`が手に入りました。後は以下のAPIを使えばよいです。

[Pocket Developer Program: Pocket API: Add](https://getpocket.com/developer/docs/v3/add)
EC2(ubuntu)のmosquitto clientを使ってAWS IoTにPub/Subする

EC2インスタンス（ubuntu16.04）にmosquitto-clientsをインストールし、AWS IoTに向かってPublish/Subscribeをしました。

前提条件は、
・AWS IoTのconnect_device_package（デバイス証明書や秘密鍵を含んでいる）を取得していること。（AWS IoTコンソールの接続ウィザードからデバイスの設定をする）
・AWS IoT ルートCAを取得していること。（connect_device_packageのstart.sh内に記載されている）

```shell-session
$ curl https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem > root-CA.crt
```
です。

#### mosquitto-clientsのインストール

```shell-session
$ su
Password:
# apt-get install mosquitto-clients
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package mosquitto-clients
# apt-get update
(...log...)
# apt-get install mosquitto-clients
(...log...)
```

#### AWS IoTに向かってSubscribe

```shell-session
$ mosquitto_sub --cafile root-CA.crt --cert X.cert.pem --key X.private.key -h "${endpoint}" -p 8883 -q 1 -d -t mq/test
Client mosqsub/2897-ip-172-31- sending CONNECT
Client mosqsub/2897-ip-172-31- received CONNACK
Client mosqsub/2897-ip-172-31- sending SUBSCRIBE (Mid: 1, Topic: mq/test, QoS: 1)
Client mosqsub/2897-ip-172-31- received SUBACK
Subscribed (mid: 1): 1
```
※endpointは、aws cliが設定済であれば以下のコマンドで取得可能。（コンソールからも確認可能）

```shell-session
$ aws iot describe-endpoint
```

#### AWS IoTに向かってPublish
Subscribeのターミナルとは別のターミナルを立ち上げてpublishします。

```shell-session
$ mosquitto_pub --cafile root-CA.crt --cert X.cert.pem --key X.private.key -h "${endpoint}" -p 8883 -q 1 -d -t mq/test -m "XYZ"
Client mosquitto_pub sending CONNECT
Client mosquitto_pub received CONNACK
Client mosquitto_pub sending PUBLISH (d0, q1, r0, m1, 'mq/test', ... (3 bytes))
Client mosquitto_pub received PUBACK (Mid: 1)
Client mosquitto_pub sending DISCONNECT
```

#### Subscribeを実行したコンソールを確認

```shell-session
Client mosqsub/2897-ip-172-31- received PUBLISH (d0, q1, r0, m1, 'mq/test', ... (3 bytes))
Client mosqsub/2897-ip-172-31- sending PUBACK (Mid: 1)
XYZ
```
OSをEl CapitanからHigh Sierraに変えたら技巧2が動かなくなった

#OSをEl CapitanからHigh Sierraに変えたら技巧2が動かなくなった
つらい。
もともとは写真Appが不具合を起こしてiPhoneの同期ができなくなったので、OSアップデートしたらなんとかなるだろ、くらいの軽い気持ちだった。
写真Appは狙い通り不具合が解決したが、ついでに将棋周りもアップデートしておくか、と思って将棋ブラウザQを3.2から3.3にアップデートして、将棋エンジンの設定をしようとしたら

エンジンプロセス起動に失敗

のエラーメッセージが出た。やべーよと思った。

##技巧2インストール時

技巧は2016年の終わりごろから使っている。その後、技巧2が公開されてアップデートした。初代インストール時も、技巧2インストール時も結構な苦労をしている。またアレをやるのかと思うと気が重かった。

##今回やったこと

初代技巧インストール時にお世話になったブログを参考に手順を再確認した。
https://qiita.com/ligerbolt/items/6e27c882838fdcc1a490

homebrewとgitをアップデートして、改めて技巧２をmake releaseすると下記のエラーメッセージが出た。

`make[1]: *** [obj/release/src/cli.o] Error 1
make: *** [release] Error 2`

###作業のポイント

1. 将棋ブラウザQ ver.3.2を使って、もともと動いていた技巧2をエンジン登録しようとしてもコケる
2. 技巧2のmake releaseがコケる

以上から、High Sierra由来の問題だと推測。
OSをEl Capitanに戻すのが最も有力な解決策に思えるが
勉強がてらHigh Sierra環境のまま頑張ってみる。

###Xcordのインストール

App Storeからダウンロード、インストール

###Command Line Tool for Xcordのインストール

下記URLからOSのバージョンに合ったものをインストール
https://developer.apple.com/download/more/

###Homebrewをインストール

下記URLでターミナルに貼り付けるコードが表示されるのでコピペする
https://brew.sh/index_ja.html

下記URLでHomebrewのbrew doctorを実行するよう推奨してるのでやってみると
https://qiita.com/_daisuke/items/d3b2477d15ed2611a058

下記エラーメッセージが出て怖い
`Warning: You have MacPorts or Fink installed:`
`  /opt/local/bin/port`

`This can cause trouble. You don't have to uninstall them, but you may want to`
`temporarily move them out of the way, e.g.`

`  sudo mv /opt/local ~/macports`

`Warning: Broken symlinks were found. Remove them with `brew prune`:`
`  /usr/local/bin/g++`
`  /usr/local/bin/gcc`

なのでbrew pruneを実行する。このあたりで何をやっているのかわからなくなるが仕方ない。
最悪バックアップが残ってる2週間前に戻るだけのこと。

##結果

High Sierraと将棋ブラウザーQおよび技巧2の相性の問題だとすると
手に余ると判断し、Time MachineからOSをEl Capitanに戻した。

将棋ブラウザーQはver.3.3にアップデートした。
SbrowserQ_Bundle_Java8を使ったら将棋エンジン登録でやはりコケた。
Javaバンドルバージョンではない方を使ったら問題なく登録できた。

なくなってしまったデータ20日分で50局くらいあるので再度登録するのがめんどい。
バックアップに戻す前に、データベースを外にコピーしておけばよかった。
Time Machineでそこだけ最新のデータを使えると勘違いしていた。
UE4でVR空間にカノジョを錬金 3日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 3日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回はHMDをかぶった状態でうなずいた時の処理を書いていきます。
前回書き忘れていましたが、開発に使用しているVR機材はOculusRiftのため、処理がOculus限定の実装になることがあるのでご了承ください。

# うなずく処理

某ゲームのように首を横に振ったらNOの処理となるように実装していきます。
こちらは同じようなVRゲームを作成している学生のモナくん([@mona19920307](https://twitter.com/mona19920307))が既に実装していた部分があるため、一部を改良してそのままありがたく利用させていただきます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/YuukiOgino?ref_src=twsrc%5Etfw">@YuukiOgino</a> <br>OculusでHMDの加速度？を取得するノードです！<br>Get raw sensor dataを使いました！<br>Oculus libraryのやつみたいです。<a href="https://t.co/RMgbAyyPDm">https://t.co/RMgbAyyPDm</a><br>あと、自分はやり方がわからなかったけど、学園追放という下記の記事に調整の仕方が載ってました。<a href="https://t.co/oP0ifTguK5">https://t.co/oP0ifTguK5</a> <a href="https://t.co/ogVNbthTye">pic.twitter.com/ogVNbthTye</a></p>&mdash; モナ (@mona19920307) <a href="https://twitter.com/mona19920307/status/933954928426369025?ref_src=twsrc%5Etfw">2017年11月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## ロジック実装

今回はNOの処理を入れていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/dbcef05d-22be-e950-1765-58d001a59402.png)

二回横方向に加速度あった場合、NOと判定します。

処理は以下の画像の通りに実装しました。
Get Raw Sensor DataからYの加速度を取って、ある程度の値以上で一回首を振ったか判定します。
その後、Delayで処理を一時的にとめ、もう一度Yの加速度を取り、一定以上の値を取れたらNOであると判定します。

※人間の仕様上、首は360度回らないため

最終的に以下のような処理になりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/cf9c5081-6452-96f9-9f23-2fc38ec7b893.png)

#次回以降
今度は視線入力による選択肢を実装していく予定です。
[swift3]数字のみ入力可能 + 最大値での制限ありのUITextField


数字のみ入力可能で最大値での制限のあるUITextFieldを作ろうと思ったがちゃんと動くものが見つからなかったのでメモ
[UITextFieldの文字数制限とキーボードの収納 [Swift3.0]](https://qiita.com/takehiro224/items/6d331389252aea681a0a)を参考にしました。

#コード

```swift
@IBOutlet var textField: UITextField!

override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self,selector:#selector(textFieldDidChange),name: NSNotification.Name.UITextFieldTextDidChange,object: textField)
    }

@objc func textFieldDidChange(notification: NSNotification) {
        let textField = notification.object as! UITextField
        guard let text = textField.text else { return }
        guard let intText = Int(text) else { textField.text = ""; return }
        if intText > 1000 {
            textField.text = text.substring(to: text.index(text.startIndex, offsetBy: 3))
        }
    }
```
influxdbのコマンドメモ

influxコマンドから入れる対話モードの時に
実行できるコマンドメモ

（調べたら随時追記していく）

## 環境
influxdb: 1.3.7

### データベース操作

- 作成

```
create database "db"
```

- 一覧表示

```
> show databases;
name: databases
name
----
_internal
db
```

- 削除

```
drop database "db"
```

### measurements操作 
measurementsはテーブルのようなもの
はじめに使用するデータベースを選択してから実行する

```
use "db"
```

- 作成

insertで作成する
measurement(meas)とtag key(key=1)とfields(value=2)を指定する

```
insert meas,key=1 value=2
```

- 一覧表示

```
>show measurements
name: measurements
name
----
meas
```

- 削除

```
drop measurement "meas"
```

### measurementの中身操作

- tag key一覧表示

```
> show tag keys
name: meas
tagKey
------
key
```

- tag keyのvalue一覧表示

```
> show tag values with key = "key"
name: meas
key value
--- -----
key 1
```


## 参考

- https://docs.influxdata.com/influxdb/v1.3/
UE4でVR空間にカノジョを錬金 2日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 2日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回はHMDをかぶった状態でうなずいた時の処理を書いていきます。
前回書き忘れていましたが、開発に使用しているVR機材はOculusRiftのため、処理がOculus限定の実装になることがあるのでご了承ください。

# うなずく処理

某ゲームのようにうなずいたらYESの処理となるように実装していきます。
こちらは同じようなVRゲームを作成している学生のモナくん([@mona19920307](https://twitter.com/mona19920307))が既に実装していた部分があるため、一部を改良してそのままありがたく利用させていただきます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/YuukiOgino?ref_src=twsrc%5Etfw">@YuukiOgino</a> <br>OculusでHMDの加速度？を取得するノードです！<br>Get raw sensor dataを使いました！<br>Oculus libraryのやつみたいです。<a href="https://t.co/RMgbAyyPDm">https://t.co/RMgbAyyPDm</a><br>あと、自分はやり方がわからなかったけど、学園追放という下記の記事に調整の仕方が載ってました。<a href="https://t.co/oP0ifTguK5">https://t.co/oP0ifTguK5</a> <a href="https://t.co/ogVNbthTye">pic.twitter.com/ogVNbthTye</a></p>&mdash; モナ (@mona19920307) <a href="https://twitter.com/mona19920307/status/933954928426369025?ref_src=twsrc%5Etfw">2017年11月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

恥ずかしながら、OculusRiftで加速度が取れるとは知らなかったので非常に参考になりました。

## ロジック実装

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/69574e1a-6f6c-d2ba-f28a-fd35f5c732ba.png)

Get Raw Sensor DataからZの加速度を取って、ある程度の値以上でうなずいたかどうか判定しています。
ただし、これだと上を向いた時も加速度が取れてうなずいたと判定されてしまうため、下に向いた時の判定を入れています。
こちらはHMDの情報のみ取れればいいため、Get Orientation And Positionで取得しています。

加速度と下を向いている、こちらを満たした段階でYESとなるように処理を実装しました。

#次回

次回はNOの処理を入れていきたいと思います。
わかる人は大体予測はつくとは思いますが。
【Python】site-packagesのパスを確認する方法【pip install・pyenv】

pythonで何かしらのライブラリをpip installしたものはsite-packagesに入るわけですが、
そのsite-packagesへのパスが知りたいそんなときのTIPS


何も考えず、

```
python -c "import site; print (site.getsitepackages())"
```

これで、表示させることが可能です。

## 以上です

pyenvを使ってたりするとちょっと混乱するかもしれないので、
覚えておくと便利かもしれないです。

pip installしたライブラリだとかを、いじりたいときや、仕組みがどうなっているのか気になったときとかにどうぞ。

いじったりする際は、直接編集せずに、自身のpythonプロジェクトのディレクトリにごそっとコピーしてきてその上でいじると吉です。（パスさえ通しておけばそっちが優先して読み込まれるはずです）
Welcartでレビューを書いて送料無料を実現する

#楽天でよくあるレビューを書いて送料無料

どうしてもやらないといけなかったのでやりました。今回のやり方で大前提は「送料が全国一律固定である場合」を想定しています。それ以外の場合はなんとかがんばってください。

##カスタムオーダーフィールドを設定する

まずはカスタムオーダーフィールドに以下のように追加。

<img width="1023" alt="スクリーンショット 2017-11-25 21.52.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/a6b5db0f-4e46-1d9f-bf59-a790c9879eab.png">

次にfunctions.phpに書き加えます。

```functions.php
add_filter('usces_filter_set_cart_fees_shipping_charge', 'review_fees_shipping_charge', 10, 3);
function review_fees_shipping_charge($shipping_charge, $carts, $entries){
    if($entries['custom_order']['review'] == "レビューを書かない（＋680円）"){
            $shipping_charge += 680;
    }
    return $shipping_charge;
}
```

完成です。
複数のマテリアルパラメータを同時に触る

###はじめまして
Qiita初めてなので、ちょっとビビりながら書いてます。実は私、プログラマではないので、
このような場所に投稿してよいものか、正直いまだに躊躇いがあります。なのでシッタカブッタような生意気なこと書くかもしれません。デザイナー視点ではありますがUE4への愛を綴っていければと思っておりますので、お手柔らかにお願いします。


###複数のマテリアルパラメータを同時に触る
キャラクターなどのメッシュにはマテリアルが複数アサインされていることがほとんど。今回はアイテムを拾った時などに、キャラクターが一瞬光ったりするのを作ってて発見したので、メモっておくことにします。

同じ共通のパラメータ名にしておくと set *** Parameter Value のノードがひとつで済むというものです。
既出でしたらすみません。

Grayちゃんのデータで試しました。 Grayちゃん公式サイト： http://www.gray-chan.com/ 

まずプロジェクトを読み込んでメッシュをエディタで開くと、マテリアルが５つほど付いています。

![fig00.png](https://qiita-image-store.s3.amazonaws.com/0/212880/30612c33-7b6e-9dd1-0aec-76c7f191114e.png)

名前でなんとなくアタリをつけて、Element の 1、2、4 番を触ることにします。
下のようなパラメータを仕込みました。

![fig01.png](https://qiita-image-store.s3.amazonaws.com/0/212880/3df6b3a8-9a66-eb7f-072d-cf98727ed246.png)

モデルのフチを黄色く光らせようかと。
Emissive Color のピンがちょうど空いていたので、そこにつなぎました。

調整の効率を考えたらマテリアルファンクションとか、マテリアルパラメータコレクションにした方が良さそう。
とりあえず、これと同じノードを全部で３つのマテリアルに仕込みました。コピペなので簡単です。

getget というのが、Scalarパラメータの名前です。後からタイムラインで値を渡します。


で、GrayちゃんのEventGraphに、カスタムイベントをおいてタイムラインノードをつなぎ、パラメータをいじるためのノードをつなぎます。

![fig02.png](https://qiita-image-store.s3.amazonaws.com/0/212880/672a5174-3c5e-e1ee-7b6e-a866a3cae18e.png)

Target に ”Mesh”オブジェクトをつないでますが、これは **Set ScalarParameter Value on Materials**ノード を取り出すときにくっついてきます。
![fig03.png](https://qiita-image-store.s3.amazonaws.com/0/212880/d8465f20-fbea-05dd-bef8-2f0e1428b425.png)

コンポーネントとしてブループリントが抱えているのを拾ってるだけだと思うけど、こういう気遣いがとても好きですUE4。
よくみたら、この **Set Scalar Parameter ～** の最後が **Materials** と 複数形になってるんですよね。

これだけで、３つのマテリアルに仕込んだパラメーターが同時に変化してくれます。

![fig04.jpg](https://qiita-image-store.s3.amazonaws.com/0/212880/9ae732fe-7822-f67d-399b-3bac057acbc5.jpeg)

この便利な Set Scalar Parameter～ ですが、古いアンリアルエンジンのバージョン（4.16以前）だと、まとめて触ること自体は可能でしたが、Material Instance Dynamic を使う必要があったりして、ちょっと面倒でした。

ConstructionScript で、MeshのマテリアルをMaterialInstanceDynamic化。
![fig05.png](https://qiita-image-store.s3.amazonaws.com/0/212880/11e1008d-4a99-a597-0714-6069c3b5d5e5.png)


てなわけで、Qiita初体験でしたが、Wikiみたいな書式で楽しいですね。もっといろいろ書いていきたいです。とりあえずアドカレ目指して頑張ろう。
Jupyterでデータ分析を全力で楽しむ！（1）環境準備


　お疲れ様です。
　今回より新シリーズ、「Jupyterでデータ分析を全力で楽しむ！」を執筆していきたいと思います。
　とはいえ、当方はまだまだPythonもデータ分析も初心者で勉強中の身。この初心者がどのようにデータ分析を身に着けていくかを解説しながら楽しんでいく過程を記述していきたいと思います。

# 開発環境
- CentOS 7.4

# Anacondaインストーラをダウンロードしよう

　以下のサイトからWindows、MacOS、Linuxの各々のOSに合わせて、インストーラをダウンロードします。
　https://www.anaconda.com/download/

　Python3.6版とPython2,7版の2つがありますが、Python2.7の方はパッケージの更新などが終了しているものもあるため、どうしてもという理由がない場合はPython3.6をおススメします。
　Linuxの場合なら、下記のコマンドで取得するのもありです。

```
wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh
```

# Anacondaインストール
　
　それでは、インストールしてみましょう。
　実行権限をつけて、シェルを実行します。

```
chmod +x Anaconda3-5.0.1-Linux-x86_64.sh
./Anaconda3-5.0.1-Linux-x86_64.sh
```

　利用規約等を読んで、yesとタイプすると、自動でパッケージ等をインストールします。
　無事、インストールが完了すると、下記コマンドにてPython3.6がインストールされていることがわかります。

```
python --version

Python 3.6.3 :: Anaconda, Inc.
```

# Jupyter Notebookを起動しよう

　さて、これでPythonやデータ分析に使うパッケージをインストールできました。
　このまま、CLIモードでPython言語を使ってスクリプトを書くのもいいですが、ブラウザ上でインタラクティブにPythonコードでデータ分析を行えるツールがあります。

　それがご存知、Jupyter Notebookです。
　AnacondaにはJupyter Notebookを標準で備えているので、下記のコマンドを打つだけで起動することができます。

```
jupyter notebook &
```

　これで起動します。&がないと、現状のセッションでCLI操作ができなくなるので、&をつけておきます。
　ここで上記のコマンドだけだと、127.0.0.1:8888のアクセスしかできないので、全員がサーバにアクセスできるようにするためには、次のようなオプションをつけます。

```
jupyter notebook --ip=xx.xx.xx.xx &
```

　これで、ブラウザでxx.xx.xx.xx:8888にアクセスすれば全員で利用することができます。ただ、デフォルトだとトークンによる認証になってしまうので、パスワード認証に変えておいたほうが良いかもしれません。
　下記の記事に大変お世話になりましたので、下記を参考にしてパスワードを設定してください。

　【Jupyter notebookのパスワード】
　https://qiita.com/SaitoTsutomu/items/aee41edf1a990cad5be6

# Jupyter Notebookにアクセスしよう

　さて、これでJupyter Notebookへアクセスできるようになりました。
　早速、Webブラウザでアクセスしてみましょう。

![jupyter001.png](https://qiita-image-store.s3.amazonaws.com/0/213134/17abbdf3-c3e8-60ea-5a35-258ddb12333f.png)

　パスワードを設定していれば、このようなログイン画面が出てくるはずです。
　パスワードを入れて認証が通ると、次の画面が表れます。

![jupyter002.png](https://qiita-image-store.s3.amazonaws.com/0/213134/305b8071-c3e5-2731-48c0-45389922b02d.png)

# Notebookを作って動かしてみよう

　さっそく動かしてみちゃいましょう。
　[NEW]を押下して、[Python3]を選択します。

![jupyter003.png](https://qiita-image-store.s3.amazonaws.com/0/213134/e1b44d4b-ede9-2f03-00f3-bd32812c0b7e.png)

　すると、下のような画面が現れます。
　そこにPythonコードの"Hello,World!"を入れて動くか確認してみましょう。

![jupyter004.png](https://qiita-image-store.s3.amazonaws.com/0/213134/7531d866-0dc8-b443-a23a-6786292b9bb0.png)


　きちんと動いたでしょうか。
　今回はここまで、次回はAnacondaに入っているパッケージで簡単なデータ分析を紹介します。

　次→[Jupyterでデータ分析を全力で楽しむ！（2）最小二乗法](https://qiita.com/Fortran/items/6ccb3596466b8bd0839a)
nodeで改行なしのログ出力

# nodeで改行なしのログ出力

```node.js
process.stdout.write('hoge');
```

[古い情報](https://qiita.com/alucky0707/items/790054d1c6a59b421c08)だと、util.print()を使っていますが、現在、util.print()はDeprecatedです（[リンク](https://nodejs.org/api/util.html#util_util_print_strings)）。
XCode 9.1 にアップグレードしてから React Native で iOS のシミュレータが起動しなくなった

例えば `create-react-native-app` で作ったアプリであれば、`yarn ios` してもシミュレータ起動時に以下のエラーが出て起動に失敗する場合。

```
Could not parse the simulator list output
```

一度 XCode を起動すると additional tools をインストールするかどうかのダイアログが出てくるので、そのままダウンロードを実行するとまたシミュレータが起動できるようになる。
Windowsの既存業務プログラムをWine上で動かそうとしてぶつかった壁

Windows 10のアップデートで業務アプリで使用するMySQL Connector/Netのアセンブリが破壊される問題があり
今後LinuxにWineを入れて既存システムを運用できないか検討することになりました。
自宅PCにUbuntuを入れてLinux環境にやっと慣れてきたので、実際に動かせるのかいろいろ試してみました。

その結果、以下のような問題点がありました。

- Wineが64bit設定だと.Net Frameworkをインストールするのが困難。(WINEARCH=win32 winebootで対応) <br>参考：[Wine環境(WINEPREFIX)を分けてWindowsアプリを上手に管理する](https://kakurasan.blogspot.jp/2015/06/manage-winapps-using-wineprefixes.html)
- Winetricksの「error: dotnetXX conflicts with dotnet20, which is already installed.」問題。参考：[.NET 3.5 conflicts with .NET 2.0](https://github.com/Winetricks/winetricks/issues/703)
- Wineのstable版ではクリップボードをLinux上のプログラムと共有できない(devel版では修正済)
- プリンター未設定時、プリンター一覧の取得時、Windowsでは「Microsoft XPS Document Writer」が返るがWine上では例外が発生する
- フォント描画の仕組みが異なる為か、同じフォントを指定しても、太字や斜体の時にMeasureString(フォントの幅を取得)の結果が異なる
- 文字入力のIMEの変換候補リストが入力中のキャレットの近くに表示されない。文字入力プログラムibus,Fcitxどちらもダメ

これらは些細な問題で、プログラムの一部修正や、顧客に了承していただくことで解決できるかと思います。
しかし慣れないLinuxに四苦八苦しコツコツ解決しながら、特に問題だと思ったのは、NetBIOS名の解決とふりがな入力でした。

#Wine上でNetBIOS名の解決が行えない
LinuxにはSambaというNetBIOS(SMB)に対応するためのプログラムがありますが、なぜかNetBIOS名をWineアプリケーション側で取得できない問題があります。
いろいろと解決法を探しましたが、libnss-winbindを入れてLinux側でWinsの名前解決ができてもWine側では無視されます。(WineではなくMonoならばいける)

NetBIOSの名前解決は行えなくても、IPアドレスを直接指定すれば問題なくデータベースやプリンターにも接続できます。
しかしプリントサーバーやDBサーバーがDHCPでネットワークに接続されている環境では、毎日変わるかもしれないIPアドレスを指定することはできません。
DHCPをやめてIPアドレスを固定にするのが理想ですが、顧客の都合なども考えるとやはりLinuxPC側でなんとか出来ないとまずそうです。
いろいろ考えた結果、Linuxネイティブのプログラムは名前解決できる為、redirコマンドをLinux起動時に実行してlocalhostへポートフォワードさせることで解決できそうでした。

参照：[色々なport forwarding方法](https://qiita.com/tukiyo3/items/94eda73b951d23b214c3)
(iptablesやstoneが紹介されていますが、redirはインストールや設定も考えると一番手軽だと思いました)

#ふりがな取得などのIMEを使うAPIやクラスライブラリが使用できない
ふりがなの自動入力は業務アプリでは必ずと言っていいほど使われているため、かなりクリティカルな問題だと思います。
ユーザビリティを考えれば、Webアプリですら可能なふりがなの自動入力を手動で運用してもらうというのはさすがに了承して頂けないでしょう。

こちらはまだ具体的な解決案はありませんが、Linuxへふりがなを返す単純なサービスをlocalhostに立て、ふりがなAPIが失敗した場合にそちらから取得すれば、解決できないだろうかと考えています。

- [Kuromoji](http://www.atilika.org/) Javaのライブラリ
- [MeCab](http://taku910.github.io/mecab/)

**追記**
現在のWineではIMEがOn状態の場合、Linux側でフィルターされたような感じになり、変換中は一切のキーバッファが格納されません。
そのため、Windowsと異なりimm32.dllのAPIを使用しても、ProcessKeyを取得することは不可能。

IME関連のバイナリimm32.dll.soとwinex11.drv.so（ソース[wine/xim.c](https://github.com/wine-mirror/wine/blob/master/dlls/winex11.drv/xim.c)）の修正を行えば、変換中のキー入力をGetVirtualKey()で取得できるはずと思いソースとにらめっこしていますが、・・・まだ勉強不足で修正は行えていません。
Lancers案件を10399件スクレイピングして、副業したら儲かりそうな案件を見つけてみた

# やったこと

- Lancersから、10399件のエンジニア向けの案件を取得
- 保守・運用・管理案件、スマートフォンアプリ案件、Web開発案件をヒストグラムに落とした。

# 結果

- モバイル系の案件は割と単価が全体的に高い印象。
- アンドロイド・iOSアプリ作れるとフリーランスやりやすかったりするのかなぁ。
- どういう案件があるのかについてはブログ見てください。

![保守.png](https://qiita-image-store.s3.amazonaws.com/0/134704/b2ecbfec-38e5-4da9-9dd0-7ce1199e878b.png)

![スマホ.png](https://qiita-image-store.s3.amazonaws.com/0/134704/2c2fd652-e29e-8747-c303-f50c7af5abce.png)

![Web.png](https://qiita-image-store.s3.amazonaws.com/0/134704/09a1b267-f725-c311-45e2-d7a6b21bb743.png)

# 関連

【副業したいプログラマーへ！】在宅プログラミングで稼ぐ方法まとめ　どのくらいの収入がもらえるかもデータにしてみたよ！|Review of My Life https://review-of-my-life.blogspot.jp/2017/11/programmer-sidework.html
WordPress 4.9のTemplate Post Typeのバグ

WordPressの4.7から追加されたTemplate Post Typeがあります。
どんな機能かというと、普通の投稿タイプでテンプレート属性が使えるようになります。
で、こんな便利な機能が4.9で使えなくなるという・・・

正確にはバグです。Template Post Typeを使ったファイル名をリネームしたり、削除したりすると、WARNINGが表示されます。
WARNINGを非表示にしても、テンプレート属性が使えなくなりますので、結果的にTemplate Post Type機能が使えません。

調べた所、既にバグとしてWordPressのフォーラムにチケットが発行されていて、4.9.1で直るそうです。
https://core.trac.wordpress.org/ticket/42573

でも4.9.1まで待てない人の為に回避策を書きます。僕が書いたわけじゃないですけど・・・
westonruterさんに感謝
https://gist.github.com/westonruter/6c2ca0e5a4da233bf4bd88a1871dd950

```function.php
function wp_42573_fix_template_caching( WP_Screen $current_screen ) {
	// Only flush the file cache with each request to post list table, edit post screen, or theme editor.
	if ( ! in_array( $current_screen->base, array( 'post', 'edit', 'theme-editor' ), true ) ) {
		return;
	}
	$theme = wp_get_theme();
	if ( ! $theme ) {
		return;
	}
	$cache_hash = md5( $theme->get_theme_root() . '/' . $theme->get_stylesheet() );
	$label = sanitize_key( 'files_' . $cache_hash . '-' . $theme->get( 'Version' ) );
	$transient_key = substr( $label, 0, 29 ) . md5( $label );
	delete_transient( $transient_key );
}
add_action( 'current_screen', 'wp_42573_fix_template_caching' );
```
これを追加すればOKです。
ただし、4.9.1で直るそうなので、その時には消すのを忘れないようにしましょう。
IT 用語集

初心者である自分の為の用語集
順不同

SQL（Structured Query Language）・・・
直訳で問合せ言語。
プログラム言語とは違いRDBMS専用に作られた言語。
一番少ない質問で目当てのデータを検索できるように、もっとも効率のいい問い合わせすることができる。

専用のプログラムでデータを操作することにより、同じ操作でも間違えずに何度も操作することができます。
それによってデータの重複を許すなどのミスを防ぐこともできるので「データの一貫性」を保つことができる。

RDBMS(Relational Database Management System)・・・
関係データベース（RDB）のマネージメントシステム
RDBMSの簡単な定義として、「データを表の形式で永続化し、かつデータ間の関連もまた表の形式で永続化できるDBMS」
Netatalkの最新版をソースからコンパイルする

#環境
・Ubuntu16.04

#コンパイル
```bash:コンパイルに必要なファイルを取得
sudo apt install build-essential libevent-dev libssl-dev libgcrypt-dev libkrb5-dev libpam0g-dev libwrap0-dev libdb-dev libtdb-dev libmysqlclient-dev avahi-daemon libavahi-client-dev libacl1-dev libldap2-dev libcrack2-dev systemtap-sdt-dev libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libio-socket-inet6-perl tracker libtracker-sparql-1.0-dev libtracker-miner-1.0-dev
```

[こちら](http://netatalk.sourceforge.net)から最新版のソースコードをダウンロードしてください

```bash:netatalkの取得
cd /tmp
wget http://prdownloads.sourceforge.net/netatalk/netatalk-3.1.11.tar.bz2
tar xvf netatalk-3.1.11.tar.bz2
```

trackerのバージョンを調べます、ここでは1.0ですね

```console:trackerのバージョン確認
root@timemachine:/tmp/netatalk-3.1.11# pkg-config --list-all | grep tracker
tracker-miner-1.0     tracker-miner - A library to develop tracker data miners
tracker-sparql-1.0    tracker-sparql - Tracker : A library to perform SPARQL queries and updates in the              Tracker Store
```


```bash 
cd netatalk-3.1.11
./configure \
        --with-init-style=debian-systemd \
        --without-libevent \
        --without-tdb \
        --with-cracklib \
        --enable-krbV-uam \
        --with-pam-confdir=/etc/pam.d \
        --with-dbus-daemon=/usr/bin/dbus-daemon \
        --with-dbus-sysconf-dir=/etc/dbus-1/system.d \
        --with-tracker-pkgconfig-version=1.0
```
with-tracker-pkgconfig-versionには先ほど調べたバージョンを指定します。今回は1.0ですね

```bash:インストール
$ make
$ sudo make install
```

#参照
[Chapter 2. Installation](http://netatalk.sourceforge.net/3.1/htmldocs/installation.html#idm140604598445744)
[Swift]Referenceを作成中

<p>Swiftのリファレンスが欲しい！自分好みのものは自分で作れば。そうだ、オープンソースにすれば協力者が現れるかも！</p>

<p>ということで、作成中のリファレンスをgithubにあげました。markdownなので、参加しやすいと思います！</p>

<p><a href="https://github.com/murakami/Swift_in_a_Nutshell">Swift in a Nutshell</a></p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/Swift_in_a_Nutshell">https://github.com/murakami/Swift_in_a_Nutshell</a> - GitHub<br />

関連情報
<a href="https://qiita.com/advent-calendar/2017/cocoa">Cocoa Advent Calendar 2017</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
macOS 上の VirtualBox で Windows 10 Insider Preview を使えるようにするまで

ググりながらインストール／セットアップしたので備忘のために書きます。誰かのお役に立てば。
環境: macOS High Sierra, VirtualBox 5.1.30 r118389 (Qt5.6.3)

# Windows 10 Insider Preview ISO のダウンロード

[本家サイト](https://insider.windows.com/ja-jp/getting-started/)から Windows 10 Insider Preview ISO をダウンロードする。ダウンロードにあたって Windows Insider Program に登録する必要がある。

# 新規仮想マシン作成
VirturlBox を起動し Command + n 。
設定項目は以下のようにした。

* 名前: 適当
* タイプ: Microsoft Windows
* バージョン: Windows 10 (64-bit)
* メモリー: 4096MB
* 仮想ハードディスクを作成
    * ファイルの場所はデフォルト
    * ファイルタイプ: VDI
    * 固定サイズ *可変よりパフォーマンスが良いらしい
    * サイズ: 32GB *あとから変えるのが面倒らしいので余裕を持って設定

# 仮想マシン起動
起動するとイメージファイルのパスを聞かれるのでダウンロードしておいた ISO ファイルを指定する。

* USキーボードな人は英語キーボードを設定する
* 画面に沿って Windows のセットアップ
    * プロダクトキーはセットアップ後の入力も可
    * Cortana がいきなり喋りだすので音量をミュートにしておくとよい。
    * 英かな切り替えは Option + ` で行える。

<img width="1024" alt="スクリーンショット 2017-11-25 17.56.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/92385/f63300b7-3110-0a2b-3673-cefa602cdb15.png">
*起動できた！*

# 最低限快適に使えるようにする
起動はできたのでここから快適に使うための設定を行う。

## Guest Additions をインストールする
Windows 10 が起動している状態で、
VirtualBox VM メニューバー -> Devices -> Insert Guest Additions CD Image
と選び、 画面に出てくる VBoxWindowsAdditions.exe を実行する。
これでフルスクリーンにできたり、マウスカーソルの動きも快適になったり、多分他にも色々と快適になる。

## キーボードを使えるようにする
* ホストキーを左 Command キー -> 右 Command キーへ変更
[VirtualBox上のWindows10で、MacのUSキーボードを使うための設定方法 - 1. VirtualBoxのホストキー設定を変更する。](https://qiita.com/laineek/items/236311d4f9501cae301b#1-virtualbox%E3%81%AE%E3%83%9B%E3%82%B9%E3%83%88%E3%82%AD%E3%83%BC%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B) を参照し設定。

* 左 Control キーと 左 Command キー を入れ替える
左 Command キーをホストキーから外すと、 Windows キーとなる。これでもよいのだが、 mac と同じように Command + c でコピーとかしたいので、 Control キーと
 Command キーを入れ替える。 [KeySwap](https://keyswap.softonic.jp/) とその解凍のための [LhaPlus](http://www.vector.co.jp/soft/win95/util/se169348.html) をダウンロードしてキーバインドを設定した。
<img width="787" alt="スクリーンショット 2017-11-25 19.00.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/92385/4553b786-eab4-b53b-20e8-1e5d5085a42f.png">
*Control と Command の入れ替え*
* Command + Space で英かな切り替えができるようにする（USキーボードな方向け）
[MacBook Pro の US キーボードで Windows 10 を使用するとキーボード配置通りに入力できない](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-hardware-winpc/macbook-pro-%E3%81%AE-us/9ea5d799-e66f-4485-b220-2f679ae8c393) を参照し設定。
* キーボードの速度を上げる
[Windowsでキーボードの速度の限界を突破する - TL;DR](https://qiita.com/ka_/items/7d19e8624af26fd5ede2#tldr) を参照し設定。

## CPU の設定
VM 右クリック -> 設定 -> システム -> プロセッサ から設定できる。
一旦 2CPU と使用率制限 60% に設定した。PAE/NX の有効化もした。
凝りたい人は [VirtualBoxMania](http://vboxmania.net/) とかを見てみると良いかも。

## フォントとかを鮮明にする
VM 右クリック -> 設定 -> ディスプレイ -> スケールしない HiDPI を使用にチェック
そうすると表示が小さくなりすぎるので、
Windows 設定　-> システム -> ディスプレイ -> 拡大率を 200% あたりに変更する。

## クリップボードを mac と Windows 間で共有する
[Virtual Boxでクリップボードを共有する](https://qiita.com/morinco/items/ab264632cca07607ed99) を参考に設定する。

# おしまい
以上で大体使えるようになったと思っています。これもやったほうがいいよ、というのがあれば教えてください。
VSCodeでタイトルにパスを表示してわかりやすくする

VSCode使いやすいんですが、デフォルトでは編集中のファイルのパスがわかりづらいのが不満です。そこでエディタウィンドウの最上部のタイトルに表示される文字列を設定で変更します。

## window.title

VSCodeは設定ファイル(settings.json)の`window.title`の値の指定によって、タイトルに表示される文字列を変えることが出来ます。

`window.title`用にファイル名などを表す既定の変数が用意されています。使える変数は以下の通りです。

| 変数                   | 値                                          | 
|-----------------------|---------------------------------------------|
| ${activeEditorShort}  | アクティブなファイル名                          | 
| ${activeEditorMedium} | ワークスペースフォルダに対する相対パス            |
| ${activeEditorLong}   | ファイルのフルパス                             |
| ${folderName}         | ワークスペースフォルダ名                        |
| ${folderPath}         | ワークスペースフォルダのパス                     |
| ${rootName}           | ワークスペース名                               |
| ${rootPath}           | ワークスペースのパス                            |
| ${appName}            | アプリ名（つまりは"Visual Studio Code"）        |
| ${dirty}              | dirty indicator（未保存の変更の有無の表示アイコン）|
| ${separator}          | セパレータ（" &ndash; "）                      |

`⌘ + ,`でsettings.jsonを開いたら設定はお好みで。ちなみに僕は以下のようにしています。

```json:settings.json
{
    "window.title": "${dirty}${activeEditorMedium}${separator}${rootName}"
}
```
ニューラルネットワークをつかって推理小説家をつくる

# はじめに
これまで([前回](https://qiita.com/iss-f/items/b02a618318c3b9b3656d)、[前々回](https://qiita.com/iss-f/items/ce423ab83c40e9eebedd))いろいろやってきましたが、ようやく本題に入れそうです。
Kerasを使ってSeq2Seqを組み、推理小説のデータを学習させます。
これで、文章生成すれば、すばらしい推理小説家が作れるはずです！


# 学習データ
学習に使ったデータは、青空文庫から以下の作家の
`江戸川乱歩、夢野久作、大阪圭吉、小栗虫太郎、海野十三`
の全小説を用います。

用いた学習データの詳細は、次のようになっています。

```
ファイル容量: 36M
文章数： 255737
非ユニーク単語数: 6685052
ユニーク単語数: 83660
```

これらのデータを、mecabを用いて単語ごとに区切り、word2vecを用いて、128次元のベクトルにします。ベクトル化された単語を元の文章と同じようになぎ合わせ文章をベクトルで表現します。文章ベクトルを学習データとして用います。


# モデル
モデルは、前回作ったもの利用します。
input_dim、output_dimはそれぞれ128次元、隠れ層は256次元です。
入力は単語ベクトルを利用しているので、出力層の出力はベクトルになるようにsoftmaxではなく線形結合を用いています。

モデルのコードと図はそれぞれ以下のようになります。

```
input_dim = self.word_feat_len
output_dim = self.word_feat_len

encoder_inputs = Input(shape=(None, input_dim))
encoder_outputs, state_h, state_c = LSTM(latent_dim, return_state=True)(encoder_inputs)
encoder_states = [state_h, state_c]

decoder_inputs = Input(shape=(None, input_dim))
decoder_lstm = LSTM(self.latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = self.decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(output_dim, activation='linear')
decoder_outputs = decoder_dense(decoder_outputs)

self.sequence_autoencoder = Model([encoder_inputs, decoder_inputs], decoder_outputs)
```

![seq2seq_fig5.png](https://qiita-image-store.s3.amazonaws.com/0/204896/d2dc50af-b425-624a-24e4-e74ad7a59a3d.png)


# 学習
今回は、bucket_sizeを[5, 10]に固定しました。つまり、全文章から、入力文章長と出力文章長がそれぞれ5、10となる文章のみを学習させます。

バッチサイズは70、epoch数は1、これを1stepとし、17500stepの学習を行いました。

最適化関数、損失関数はそれぞれ以下を用いました。

```
最適化関数 : RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
損失関数 : mean_squared_error
```

#　結果
次のグラフは。lossとval_lossのstepごとの推移を表しています。(横軸はepochと書いてますが、step数だと思ってください....。)
![graph_loss.png](https://qiita-image-store.s3.amazonaws.com/0/204896/19c56966-43b4-973a-dcfe-a7333855ed96.png)

グラフを見ると、lossとval_lossともに、2500stepほどで完全に収束しているように見えます。lossとval_lossの最終的な値は、それぞれ、`loss: 2.8645e-04 - val_loss: 1.2736`となりました。lossは十分小さくなっていますが、val_lossは小さくなっていません。lossとval_lossの差が大きいため、過学習の可能性が考えられます。


次に、accuracyとval_accuracyのstepごとの推移を表したグラフです。lossのグラフと同様に横軸はstep数です。

![graph_acc.png](https://qiita-image-store.s3.amazonaws.com/0/204896/37836757-c716-88a1-abef-61d36b532f22.png)

accuracyとval_accuracyの最終的な値は、`acc: 0.9750 - val_acc: 0.2238`となりました。早い段階で、accuracyとval_accuracyも大きく変化しなくなっています。accuracyは、十分に1に小さい値になってますが、val_accuracyはいまいちです。こちらもlossと同様に、過学習している可能性があります。


学習データに対して、モデルが複雑なときは過学習が起きやすいです。今回のモデルのパラメタ総数は2,691,200でした。学習に用いたデータは、ユニークな単語数が83,660、文章数が255,737で、これらを単語毎に128次元のベクトルに圧縮したものです。約2百万のパラメタを決定するためには、学習データが少なすぎることはないと思います(この辺は直感的な感覚ですが....)。とすれば、学習に使用したデータにまだ、ノイズが混ざっていた可能性があります。また、batch_sizeが小さい場合にも過学習は起きる可能性がありますが、今回のbatch_sizeは70としています。他のうまく文章生成が出来ている論文やコードと見比べても小さすぎるようには思えません。今回用いた、最適化関数のパラメタはkerasのデフォルトのものを利用しましたが、これらを変更する必要があるかもしれません。もしくは、別の最適化関数を使うか、Dropoutを使う必要があるかもしれません。


# まとめ
小説家のデータを使って、Seq2Seqを学習させ、文章生成を行いました。過学習している感じがありました。次は、メタパラメタ(ニューロンの数や隠れ層の層数、batch_size、epoch数)を決定する方法をもう少し詳しく調べて見たいと思います。(というか、他のブログなんかを漁ると、学習には何日もかかるらしいですが、今回の学習ではlossやaccが収束する2500stepまで1、2時間ほどしかかかってません....なんか間違ってるんですかね.....)
デプロイを便利にするソリューションであるところのrelease-request

## release-request

https://github.com/mackee/release-request

---

## The release-request is a cli tool for Pull Request driven deployment.

---

## demo

https://github.com/mackee/release-request/pull/3

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3629/a1410372-0621-4e71-178f-02b923f555ba.png)

---

## 何が出来るか

* deployのPull Requestを自動作成してくれる
* マージされたPull Requestをリスト化してくれる
* 特定のラベルが付けられたPull Requestをリスト化してくれる
* 差分を外部プログラムに渡してテンプレートから手順書を入れたり抜いたり出来る

---

## 先行するOSS

* https://github.com/motemen/git-pr-release
* Mackerel::Release https://metacpan.org/pod/Mackerel::ReleaseUtils

---

## 先行するOSSと比べて優位な点

* ワンコマンドで完結
* 外部プログラムは言語に依存しない
* デフォルトでもある程度機能する

---

## 挙動

* 実行すると
    * 既に指定ブランチから指定ブランチへのPull RequestがあればDescriptionを上書きする
    * 無ければ新しく作る
* 弊社ではwebhookが来ると外部コマンドを実行する[tkuchiki/ghooks-cmd-runner](https://github.com/tkuchiki/ghooks-cmd-runner)と組み合わせてmasterブランチへのpushをトリガーに走るようにしている

---

## 工夫

* 設定が必要であるが、テンプレートを吐いてくれる

https://asciinema.org/a/9MPHTp9xKyRMnDbVlq7o8yaHN

---

## 設定ファイル

* config.yml
    * githubのtokenとかブランチとかトラッキングするラベルとか
* release.md
    * Pull Requestのテンプレート

---

## 外部プログラムの例

```yml
calls:
  - name: deploy_timing
    command: |
      perl -MTime::Piece -E '
      my $now = Time::Piece->new;
      for my $hms (qw/16:30:00 19:45:00 23:45:00/) {
          next if $now->hms gt $hms;
          say $now->ymd . " " . $hms;
          last;
      }'
```

---

## 外部プログラムをMarkdownから使う

上記のプログラムを組み合わせてデプロイウィンドウの明記を手順書に盛り込んでいる

```markdown
# Release

Estimated time of deploying: {{ .Call "deploy_timing" }}

```

---

## DDLの差分があったら反映の手順書を入れる

```yml
  - name: has_ddl
    command: |
      perl -MJSON -E '
      my $json = do { local $/; <STDIN> };
      my $releaser = JSON::decode_json($json);
      my $files = $releaser->{comparison}->{files};
      my @assets = grep { $_->{name} =~ m!^sql/master.sql.*$! } @$files;
      @assets > 0 ? exit 0 : exit 1;
      '
```

---

## DDLの差分があったら反映の手順書を入れる

```markdown
{{ with .CallIf "has_ddl" -}}
- [ ] migrate ddl

    $ git_ddl_migrater sql/master.sql
{{ end }}
```

---

## 解決する問題

* デプロイするものを整理してデプロイ前の把握と、デプロイした後の記録にしたい
* しかし言うてもその手間がしんどい
* 手順書のクオリティを一定にしたい

---

## と言う感じで使ってくれ！！！

---

## あとOSS紹介Advent Calendarやってます

https://qiita.com/advent-calendar/2017/favorite-oss

登録してくれ！！！
rails　任意のviewのみで、特定のjsを読み込む方法

記事の内容に間違いがあればご指摘お願いいたします。

#状況
ログイン画面があるツイッターのようなwebアプリを作成している。
app/assets/javascriptsの配下に配置したjsでsetInteavalなどを使った繰り返しの処理を実行しているが、ログイン画面では実行したくない。

railsにはAssets Pipelineという、app/assetsの配下に置いたファイルを自動的にコンパイル？する仕組みがある。
なので、app/assets/javascriptsの配下に設置したjsもすべてのviewで実行されてしまう。

以下の手順でAssets Pipelineへの自動追加を解除し、手動で任意のものをコンパイルする。（無効かしたいものは追加せず、別途読み込む。）

#手順
##１．Assets Pipelineの自動追加を無効化
```ruby:app/assets/javascripts/application.js
//= require jquery  
//= require jquery_ujs  
//= require_tree
```
application.js内の//= require_treeという記述によってapp/assets/javascripts内のjsを読み込んでいるため、この記述を以下のように削除する。

```ruby:app/assets/javascripts/application.js
//= require jquery  
//= require jquery_ujs  
```

##２．全てのviewで読み込んでほしいjsを手動でコンパイルの設定をする
//= require_treeの記述を削除するとすべてのjsが読み込まれなくなってしまう（たぶん）。
なので、手動で設定を追記する
hoge.jsを追加したい場合は以下の通り。

```ruby:config/environments/production.rb
config.assets.precompile += ['hoge.js']
```
また、jsをディレクトリで分けて、特定のディレクトリ（hogehoge）だけ追加する場合は以下の通り。

```ruby:config/environments/production.rb
config.assets.precompile += ['hogehoge/*.js']
```
上記では本番用環境（production）のみを記載したが、開発環境でも同様のことを行う場合はdevelopment.rbも同様に追記する。

##３．任意のページで特定のjsを読み込む
手順2で記載しなかったjsは読み込まれないので、任意のviewで、読み込みたいjsを別途読み込む。
htmlの最後にjavascript_include_tagを使用して読み込む
index.html.erbにて、fuga.jsを読み込みたい場合は以下の通り。

```assets/views/index.html.erb
<%= javascript_include_tag 'fuga.js' %>
```
##４．config/initializers/assets.rbに追記（2017/11/26追記）
これを行わないと以下のようなエラーが発生する（理由は不明。（わかる人がいたらコメントください））

```
Asset was not declared to be precompiled in production.
Add `Rails.application.config.assets.precompile += %w( fuga.js )` to `config/initializers/assets.rb` and restart your server
```
なので、エラーに従い、以下のように追記する。

```config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( fuga.js )
```
エラー文通り、再起動をしてください（再起動をめんどくさがり、悩みました。笑）

以上。

もっとよい方法があれば教えてください。
ウェブページを作成時のスタイルシート初期設定

#　初期設定の必要性について
　各ブラウザは、デフォルトのスタイルが異なるためブラウザによって不要な余白が出てくる場合が有るらしいので、まずはデフォルトのスタイルを解除する必要がある。

## ページの余白を0にする

```
body {
	margin:0;
	padding:0;
}
```

## 見出しと段落のマージンをなくす
```
p,h1,h2,h3,h4,h5,h6 {
	margin-top: 0;
}
```

## 画像の下の余白をなくす
```
img {
	vertical-align:bottom;
}
```

## リストの余白をなくす
```
ul {
	margin:0;
	padding:0;
}
```

ウェブページ作成でこんなことが必要だとは知らなかった勉強って大切。。。ｗ
オフラインリアルタイムどう書くF08の回答

40分ほどで解きました。
隣接の空き数を数えて、優先度の高いものを選んでいます。

```ruby:f08.rb
RANKS = [ 1, 3, 5, 7, 9, 8, 6, 4, 2, ]

def sit( chairs, c, priority )
  neighbor = chairs.length.times.map { |i|
    next -1 if chairs[i] != '-'
    [ i-1, (i+1)%chairs.length, ].count { |pos|
      chairs[pos] == '-'
    }
  }
  rank = neighbor.zip(RANKS).select { |n, i|
    n == neighbor.max
  }.map(&:last).send(priority)
  chairs[RANKS.index(rank)] = c
end

def stand( chairs, c )
  chairs[chairs.index(c)] = '-'
end

def solve( input )
  chairs = ['-'] * RANKS.length
  input.chars { |c|
    case c
    when /[A-M]/
      sit( chairs, c, :min )
    when /[N-Z]/
      sit( chairs, c, :max )
    when /[a-z]/
      stand( chairs, c.upcase )
    end
  }
  chairs.join
end

def test( id, input, expected )
  actual = solve( input )
  if expected != actual
    puts '[%d] NG: input = %s, expected = %s, actual = %s' % [ id, input, expected, actual, ]
    exit 1
  else
    puts '[%d] OK' % [ id, ]
  end
end

test( 0, "NABETanI", "I-E--T-B-" );
test( 1, "A", "A--------" );
test( 2, "Aa", "---------" );
test( 3, "Z", "----Z----" );
test( 4, "Zz", "---------" );
test( 5, "AaB", "B--------" );
test( 6, "ABa", "-------B-" );
test( 7, "ABCDEFGHI", "AGCEIDHBF" );
test( 8, "OPQRSTUVW", "WSQUOTPVR" );
test( 9, "F", "F--------" );
test( 10, "L", "L--------" );
test( 11, "Mm", "---------" );
test( 12, "JQ", "J---Q----" );
test( 13, "ACP", "A---P--C-" );
test( 14, "GgS", "----S----" );
test( 15, "USLE", "L-E-U-S--" );
test( 16, "XJZY", "J-Y-X-Z--" );
test( 17, "NnJXx", "J--------" );
test( 18, "AJjQa", "----Q----" );
test( 19, "HGThgQ", "----T-Q--" );
test( 20, "NJRErI", "J-E-N--I-" );
test( 21, "ZzWwDYG", "D---Y--G-" );
test( 22, "ZGgKQHM", "K-H-Z-Q-M" );
test( 23, "OZYSAsHP", "A-Y-OPZ-H" );
test( 24, "VNnEISAW", "E-S-VWAI-" );
test( 25, "HhYAKkCOE", "A-O-Y-EC-" );
test( 26, "KAkHJTSWV", "H-JWTSVA-" );
test( 27, "WNTYKHZhMQ", "KMTQWZN-Y" );
test( 28, "YyJHFGfgTh", "J---T----" );
test( 29, "NRWPLBZAOpC", "LBWONZRAC" );
test( 30, "IORiTMXHUCF", "MCTFOURXH" );
test( 31, "AEeHGBEJUNZn", "AZGEUB-HJ" );
test( 32, "GgKGSOsZTLYS", "K-OYZTSGL" );
test( 33, "VZvPOpWPMzHGF", "MGO-W-HFP" );
test( 34, "CMmcUuLTWADFQ", "LFA-TQW-D" );
test( 35, "HUGZMLzlNgTLDd", "H-N-U-MTL" );
test( 36, "CFKEkHeJShUDTf", "C-UTSJ--D" );
test( 37, "QJjGPMAICHKqWcY", "GIMHWKPYA" );
test( 38, "HhIiQCIBiUMZcVv", "--B-QZU-M" );
test( 39, "VMvEmFOPANIBUiVb", "F-PUONAEV" );
test( 40, "EDCJUINdLPVnFpGe", "-VCFUJGLI" );
test( 41, "FGQINTEnLMAlBbPpV", "FMITQAVGE" );
test( 42, "WSVCORUMXsvNBuTtT", "CXBTWRNOM" );
test( 43, "HJTjRVIQAXqDGxCtUh", "-AVCUGRDI" );
test( 44, "ZzHXIEKQYUuBTxLlCq", "HTEYC-KIB" );
test( 45, "RGDCAEBVrgFbTJUePjc", "-T-FUVADP" );
test( 46, "WBIRSALCVvsbwalYBJP", "B-R-YPCIJ" );
test( 47, "HKFZGEPAIphLRarAOaHo", "LHFIZ-GKE" );
test( 48, "WFNwBfbSAXCZzMDJUcKx", "AM-JSUNDK" );
```