OmniAICreator/Qiita-1.07M huggingface dataset:
nginx+puma+rails の worker,thread,connection pool 数の目安


※間違ってたら指摘を...

## 前提

MRI(Matz's Ruby Implementation) の前提, JRubyの場合は考え方が変わる。

## nginx の worker 数の目安

CPUコア数を基本とする。ただし...

> 一方で、例えば僕の用途では、現在画像の処理だったりとか、ngx_mrubyのようにリクエストの過程で一部ブロッキングされるような処理も増えてきているため、コア数以上の値に設定しておいた方が性能を発揮できるような状況も増えてきています。
> [nginxのworkerプロセス数をCPUコア数の倍数で自動的に設定できるモジュールを書いた - 人間とウェブの未来](http://hb.matsumoto-r.jp/entry/2017/06/01/151912)

上記のようにコア数以上に設定した方が良いケースも時としてあるようです。

## nginx の worker 数を設定する

以下のように conf を設定してあげれば、nginxがコア数に応じたプロセスを立ち上げてくれる。

```/etc/nginx.conf
worker_processes auto;
```


## puma の worker 数の目安

CPUコア数〜1.5倍を基本とする

> Use cluster mode and set the number of workers to 1.5x the number of cpu cores in the machine, minimum 2.
> https://github.com/puma/puma/blob/master/docs/deployment.md


## puma の thread 数の目安

> Set the number of threads to desired concurrent requests / number of workers. Puma defaults to 16 and that's a decent number.

デフォルトの 16 therad (1プロセスあたり）はちょうど良いくらいの設定らしい?

> Watching your CPU utilization over time and aim for about 70% on average. This means you've got capacity still but aren't starving threads.

目安としてはCPU使用率が平均して70%程度となる状態を目指す。その状態であればカツカツではないけどある程度キャパシティを活用している状態と言えるとのこと。

MRIはGILによって1プロセスの中で同時に動作するスレッドは1スレッドのみに制限されるが、スレッド内でのIO待ち(DB,ファイル等)の間に別スレッドでリクエスト処理できるので、そこそこ効果はあると言われている。

## database の connection pool 数の目安

puma の thread 数と同数とする。
database.yml に設定された pool の数はプロセスごとに確保される値なので、thread数を設定すれば十分。

> If you are using the Puma web server we recommend setting the pool value to equal ENV['RAILS_MAX_THREADS']
> [Concurrency and Database Connections in Ruby with ActiveRecord | Heroku Dev Center](https://devcenter.heroku.com/articles/concurrency-and-database-connections)


## puma の worker 数, thread 数, db の connection pool 数 を設定する

手元の Rails 5.1.3 では thread 数と connection pool 数は、環境変数 `RAILS_MAX_THREADS` に従うようになっていました。

puma の worker 数は環境変数 `WEB_CONCURRENCY` に従うような設定が記述されていますが、デフォルトでコメントアウトされているのでアンコメントして有効化する必要があります。

```config/puma.rb
# thread数
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count

# worker プロセス数
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
``` 

db の connection pool 数は、デフォルトで `RAILS_MAX_THREADS` に従うようになっています。

```config/database.yml
default: &default
 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
```



## 以下は要確認

* nginx
	* worker_cpu_affinity [Nginx なぜか 1CPU しか使われていない - eTuts+ Server Tutorial](http://server.etutsplus.com/nginx-worker-cpu-affinity/)
* puma
	* preload_app [puma/puma: A ruby web server built for concurrency](https://github.com/puma/puma#clustered-mode)


## 参考

* [puma/DEPLOYMENT.md at master · puma/puma](https://github.com/puma/puma/blob/master/DEPLOYMENT.md)
* [Concurrency and Database Connections in Ruby with ActiveRecord | Heroku Dev Center](https://devcenter.heroku.com/articles/concurrency-and-database-connections)
Auroraのスナップショット一覧がAWS CLIから取得できない件

Auroraで作ったDBのスナップショット一覧は `describe-db-snapshots` では取得できない:

```
$ aws rds describe-db-snapshots
{
    "DBSnapshots": []
}
```

代わりに `describe-db-cluster-snapshots` を使う:

```
$ aws rds describe-db-cluster-snapshots
{
    "DBClusterSnapshots": [
        {
            "Engine": "aurora",
            "SnapshotCreateTime": "2016-10-11T18:01:09.605Z",
            "VpcId": "vpc-XXX",
            "DBClusterIdentifier": "XXX",
            "DBClusterSnapshotArn": "arn:aws:rds:ap-northeast-1:XXX",
            "MasterUsername": "XXX",
            "LicenseModel": "aurora",
            "Status": "available",
            "PercentProgress": 100,
            "DBClusterSnapshotIdentifier": "rds:XXX",
            "KmsKeyId": "arn:aws:kms:ap-northeast-1:XXX",
            "ClusterCreateTime": "2016-10-06T00:48:22.278Z",
            "StorageEncrypted": true,
            "AllocatedStorage": 1,
            "SnapshotType": "automated",
            "AvailabilityZones": [
                "ap-northeast-1a"
            ],
            "Port": 0
        }
    ]
}
```

参考: 
- http://recipe.kc-cloud.jp/archives/8811
- http://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-cluster-snapshots.html
シェルスクリプトを作成してpythonファイルを複数回動かす

#シェルスクリプトを作成してpythonファイルを複数回動かす

##実施環境
* OS：Ubuntu 14.04.4 LTS

##今回のディレクトリ構成例

home
└── user1
　　└── src
　　　├─── test.sh
　　　└─── test.py

## 手順
1. 動かしたいpythonファイルを用意する
2. シェルスクリプトを作成する
3. シェルスクリプトを実行する

### 1. 動かしたいpythonファイルを用意する

#### test.py

```py:test.py
# -*- coding: utf-8 -*-

print u'こんにちは'.encode('UTF-8')
```

### 2. シェルスクリプトを作成する

#### test.sh

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

ARRAY=(1 2 3 4)

for num in ${ARRAY[@]}; do
    /usr/bin/python /home/user1/src/test.py
    echo $num"回目のループです"
done
```

### 3. シェルスクリプトを実行する
下記のコマンドで起動するシェルスクリプトを指定しつつ実行する 
コマンド：```bash /home/user1/src/test.sh```

## 実行結果例
![result.png](https://qiita-image-store.s3.amazonaws.com/0/139291/ed026373-8ddc-c66f-b298-dff4b5c64b2e.png)
[SQL]重複データを１件だけ残して削除する方法

いつの間にか重複データが大量に保存されていて、データメンテをSQLで対応した時のメモです。
先人の知恵、すばらしいですね。

*※注釈*
使っている環境によっては @yuba さんの[SQL](http://qiita.com/sssinsi/items/c17440cf8d0b6e7f80ff#comment-945c3eb542dd1e977853)で実行できます。
残念ながら、MySQLではdelete文にテーブル別名を指定できません。

# 環境
- MySQL 5.6.30

# 対応方法
ロジックは簡単で、重複を除いたデータを使ってそれ以外を削除します。
今回は残したい`id`(primary key)を生成して、それ以外のデータを削除します。

```
# (確認)残したいデータを検索する
select min(id) from table_a group by column1,column2;

# 残したいデータ以外を削除する
# そのままだと削除できないので、サブクエリの中でテーブルを作成
delete from table_a
 where id not in
 (
  select tmp1.id from (
    select min(id) as id
    from table_a
    group by tmp1.column1,tmp1.column2
  ) as tmp1
 );
```

#参考
- [selectした結果をdeleteする。](http://m97087yh.seesaa.net/article/206430733.html)
- [Oracle 重複行を検索して削除する](http://ext.omo3.com/oracle/delete_duplicate.html)
【Windows】仕事でつかっているツール群

# **概要**
仕事でよく使っているツール類を列挙してみようとおもいます。

# **環境**
- Windows10 64bit

# **ツール一覧**
## **Text Editor / テキスト処理**
- [Evernote](https://evernote.com/intl/jp/)
- [Notepad++](https://notepad-plus-plus.org/)
- [WinMerge](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html)
- [VS code](https://code.visualstudio.com/download)

## **開発**
- [Docker for Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows)
- [Jupyter Notebook](https://www.anaconda.com/download/#windows)

## **画像処理**
- [monosnap](https://www.monosnap.com/welcome)

## **バージョン管理**
- [Git for Windows](https://gitforwindows.org/)
- [GitHub Desktop](https://desktop.github.com/)
- [SourceTree](https://ja.atlassian.com/software/sourcetree)

## **NWツール**
- [Wireshark](https://www.wireshark.org/download.html)
- [GNS3](https://www.gns3.com/)
- [SolarWinds](http://www.solarwinds.com/)
- [NetEnum](http://www.e-realize.com/netenum.html)
 
## **コミュニケーションツール**
- [IPMsg](https://ipmsg.org/)
- [IPMsgViewer](http://forest.watch.impress.co.jp/library/software/ipmsgview/)
- [Slack](https://slack.com/)
- [LINE](https://line.me/ja/)

## **ストレージサービス**
- [Dropbox](https://www.dropbox.com/ja/)
- [GoogleDrive](https://www.google.com/intl/ja_jp/drive/)

## **ファイル転送 / 操作**
- [CoreFTP](http://www.coreftp.com/)
- [WinSCP](https://winscp.net/eng/docs/lang:jp)
- [FFFTP](https://osdn.net/projects/ffftp/)
- [EXPlzh](http://www.ponsoftware.com/)
- [Lhaplus](http://lhaplus.softonic.jp/)
- [7zip](https://sevenzip.osdn.jp/)

## **ターミナル**
- [Teraterm](https://ttssh2.osdn.jp/)
- [Putty](https://putty.org/)

## **その他管理ツール**
- [KeePass](http://keepass.info/)
- [Trello](https://trello.com/)
- [VMware vSphere Client](https://kb.vmware.com/s/article/2090544)
- [UltraVNC Viewer](http://www.uvnc.com/downloads/ultravnc.html)
- [Fiddler](http://www.telerik.com/fiddler)
- [CristalDiskInfo](http://crystalmark.info/software/CrystalDiskInfo/)

# **おわりに**
他の方が仕事で使われているツール等も知りたいなぁとか思ったりしておりますのでもしよろしければ「仕事で使ってるツール群」のタグで記事作成して下さい＾＾

他にもこういうツールあるよ～的な情報頂けると嬉しいです＾＾
GO言語の1.6.3より前のバージョンを使っている人は MacOS Sierraにアップグレードしないほうがいい話

こんにちは yoshi です。

今日Sierraにアップグレードしたのですが、急にgoプロジェクトのコンパイルができなくなりました。 
原因を追求したところ、新しいOSであるSierraでは1.6.3より前のバージョンのものは使えないそうです。


[公式HP](https://golang.org/doc/go1.7)によると

```
Go 1.7 adds support for macOS 10.12 Sierra. This support was backported to Go 1.6.3. Binaries built with versions of Go before 1.6.3 will not work correctly on Sierra.
```

とされ、SierraでGOを使いたい場合は1.7にバージョンアップを余儀なくされます。


ということで、Macをお使いの方は気をつけましょう。
Solrのハイライト表示の設定について

Solr6の前提でお話しします。

**1.schema.xmlにfieldを追加**

```xml:schema.xml
...
<field name="content" type="text_general" multiValued="true" indexed="true" stored="true">
...
```

ハイライトとして表示するためには、Indexを可視化にしてstoredをtrueにする必要があります。
nameは下記fmap.contentで設定した名称と一致すれば、任意でかまいません。

**2.solrconfig.xmlにrequesthandlerを設定**

SolrConfig.xmlでsolr.extraction.ExtractingRequestHandlerが有効になっていることを確認します。
fmap.contentは実際ハイライトに表示される内容が投入されます。
uprefixとは、取得できたフィールド名の中でschema.xmlのフィールド定義にないものの先頭に付与する文字列です、ignored_に設定したことで定義のないフィールドをIndexされないことを表します。
fmap.xxxとはxxxというフィールド名をschema.xmlで定義されたフィールドの何にマッピングするかを定義しています。

```xml:solrconfig.xml
<requestHandler name="/update/extract" startup="lazy" class="...ExtractingRequestHandler">

<lst name="default">
 <str name="lowernames">true</str>
 <str name="fmap.content">content</str>
 <str name="fmap.a">ignored_</str>
 <str name="fmap.div">ignored_</str>
 <str name="uprefix">ignored_</str>
<str name="captureAttr">true</str>
<bool name="IgnoreTikaException">true</str>
```

以上Solr側のセットアップが完了です。クロールを実行し、ハイライトとして表示されるものがcontentフィールドにて確認できるはずです。
あとはクライアント側でハイライトを表示するためのUIの作成ですが、ここでは割愛します。
Premakeで「警告をエラーとして扱う」を設定

# 環境
Windows 7
Visual Studio 2012
Premake 5.0 alpha 9

# Premake
このあたりを参照。
[ビルドツールpremakeの紹介](http://qiita.com/ousttrue/items/6d837d6daba47b51bd8e)
[Premakeで「追加の依存ファイル」を設定する](http://qiita.com/sukakako/items/b1e94f40028deaf126fc)

# 記述方法

flags {"FatalWarnings"} を追加する

```lua:premake5
workspace "sample"
  location "build_premake"
  configurations { "Debug", "Release" }

  project "sample"
    kind            "ConsoleApp"                     
    language        "C++"
    targetdir       "build_premake/%{cfg.buildcfg}"
    files           { "src/**.h", "src/**.cpp", }

    flags           { "FatalWarnings" }              -- 警告が全てエラー扱いになる。(/WX)

```
Centos7.2にRedis3.2.4をインストールしてサービス化


### redisのインストール

```sudo yum install redis```するも、バージョンが「2.8.19-2.el7」と古そうなので、公式から取得する。 
 
 
[公式サイト](http://redis.io/download)


```
$ wget http://download.redis.io/releases/redis-3.2.4.tar.gz
$ tar xzf redis-3.2.4.tar.gz
$ cd redis-3.2.4
$ make

```

```make[3]: gcc: コマンドが見つかりませんでした```と出たので、gccをインストールして全部削除してやり直し。


```
$ sudo yum install -y  gcc
$ cd ..
$ rm -Rf redis-3.2.4
$ make
$ sudo make install
$ redis-cli -v
redis-cli 3.2.4
$ redis-server -v
Redis server v=3.2.4 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=3f3e7c3156555dd9
```
インストール完了


### redisのサービス化

```$ sudo vim /etc/systemd/system/redis.service```


```ini:redis.service
[Unit]
Description = redis daemon

[Service]
ExecStart = /usr/local/bin/redis-server
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```
### サーバー稼働
```
$ sudo systemctl enable redis
$ sudo systemctl start redis
$ sudo systemctl status redis
[sudo] password for xxx: 
● redis.service - redis daemon
   Loaded: loaded (/etc/systemd/system/redis.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2016-10-17 10:54:17 JST; 12min ago
 Main PID: 8762 (redis-server)
   CGroup: /system.slice/redis.service
           └─8762 /usr/local/bin/redis-server *:6379
```
### 動作確認確認

```
$ redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> 
```
うごいた

## 参考
http://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff
Laravel HomesteadにMailcatcherを設定する

#必要なパッケージをインストール
- sudo apt-get install -y ruby
- sudo gem install eventmachine -v 1.0.9.1
- sudo gem install mime-types --version "< 3"
- sudo gem install --conservative mailcatcher


#after.sh 内に記載
必要なコマンドをafter.sh内に記載する事で、homesteadのProvisioningが終わった後に勝手にスクリプトを呼んでくれるので便利。
```
sudo apt-get install -y ruby
sudo gem install eventmachine -v 1.0.9.1
sudo gem install mime-types --version "< 3"
sudo gem install --conservative mailcatcher
mailcatcher --ip 192.168.10.10
```


#.env の設定
HOST IPは、自分の環境に合わせて変えてくださいね。
```
 MAIL_DRIVER=smtp
 MAIL_HOST=192.168.10.10
 MAIL_PORT=1025
 MAIL_USERNAME=null
 MAIL_PASSWORD=null
 MAIL_ENCRYPTION=null
```
Sierra  で XCode が固まったらやるべき事覚書

1. 以下のフォルダーを削除
   - ~/Library/Saved Application State/com.apple.dt.Xcode.savedState/
   - ~/Library/Development/
   - ~/Library/Caches
   - ~/Library/Autosave Information

2. XcodeのプロジェクトファイルがiCloud ドキュメント内に入ってる場合は、別の場所に移動
ManifoldCF2.4 Security SearchComponent pluginのセットアップ手順

参考記事：http://www.rondhuit.com/apache-manifoldcf-mcf-security-searchcomponent-plugin.html
こちらはCentOS7、Solr6とManifoldCF2.4のバージョンを使用しています。

**1.ManifoldCF（略：MCF）公式サイトからSolr6版のMCFセキュリティーサーチコンポーネントを入手**

http://manifoldcf.apache.org/en_US/download.html#Plugin+for+Apache+Solr+6.x

solr6に対応のバージョンの所在ですが、英語版Downloadページにありました（日本語ページにはなかったようです）

**2.取得したapache-manifoldcf-solr-6.x-plugin-2.2-bin.tar.gzをSolrに配置**

Solr5以降はコアがsolrのインストールした場所ではなく<code>var/solr/data/`<corename>`</code>で作成されるようになったようです。
そこにlibフォルダーを作成して、上記ファイルを解凍したjarをコピーする

<code>mkdir -p var/solr/data/`<corename>`/lib</code>
<code>cp apache-manifoldcf-solr-6.x-plugin-2.2.jar var/solr/data/`<corename>`/lib</code>

**3.Solr側のschema.xmlとsolrconfig.xmlを編集する**
場所はvar/solr/data/<corename>/conf、schema.xml名前がmanaged_schema.xmlに変わった模様

先ほど解凍したjarのフォルダーにReadme.txtがあるので、そちらを参照。

- managed_schema.xmlにフィールド追加

```xml:managed_schema.xml
... 
 <field name="allow_token_document" type="string" indexed="true" stored="true"
    multiValued="true" required="true" default="__nosecurity__"/>
  <field name="allow_token_parent" type="string" indexed="true" stored="true"
    multiValued="true" required="true" default="__nosecurity__"/>
  <field name="allow_token_share" type="string" indexed="true" stored="true"
    multiValued="true" required="true" default="__nosecurity__"/>
  <field name="deny_token_document" type="string" indexed="true" stored="true"
    multiValued="true" required="true" default="__nosecurity__"/>
  <field name="deny_token_parent" type="string" indexed="true" stored="true"
    multiValued="true" required="true" default="__nosecurity__"/>
  <field name="deny_token_share" type="string" indexed="true" stored="true"
    multiValued="true" required="true" default="__nosecurity__"/>
...
```

- solrconfig.xmlにsearchComponentとqueryParserを追加し、<requesthandler>にフックする

```xml:solrconfig.xml
...
  <!-- ManifoldCF document security enforcement component -->
<searchComponent name="manifoldCFSecurity"
  class="org.apache.solr.mcf.ManifoldCFSearchComponent">
  <str name="AuthorityServiceBaseURL">http://localhost:8345/mcf-authority-service</str>
  <int name="ConnectionPoolSize">50</int>
</searchComponent>
...
<requestHandler name="/select" class="solr.SearchHandler">
...
  <arr name="last-components">
    <str>manifoldCFSecurity</str>
  </arr>
  ...
</requestHandler>
...
```

```xml:solrconfig.xml
...
<!-- ManifoldCF document security enforcement component -->
<queryParser name="manifoldCFSecurity"
  class="org.apache.solr.mcf.ManifoldCFQParserPlugin">
  <str name="AuthorityServiceBaseURL">http://localhost:8345/mcf-authority-service</str>
  <int name="ConnectionPoolSize">50</int>
</queryParser>
...
<requestHandler name="/select" class="solr.SearchHandler">
... 
 <lst name="appends">
    <str name="fq">{!manifoldCFSecurity}</str>
  </lst>
  ...
</requestHandler>
...
```
以上で設定完了です。反映するためSolrを再起動する必要があります。
MCFのクロールを再度実行して、セキュリティー管理用フィールドのインデックスを投入します。

検索時はAuthenticatedUserNameをパラメータとして渡す必要があります。
動作確認するには以下のクエリーを投入してみてください。
http://localhost:8983/solr/corename/select?q=*:*&AuthenticatedUserName=<username@domain>
Verilog HDLでの回路記述で用いる数値表現と演算子 (授業用)

# 数値表現
数値はビット幅と基数を指定して表現する。
基数はb(2進)、o(8進)、d(10進)、h(16進)で指定する。基数の指定が無い場合は10進数とみなされる。
ビット幅を指定しないと32ビットの信号とみなされるため注意すること。(できるだけビット幅は指定すること)

| 数値表現 | ビット幅 | 基数 | 2進表現 |
|---:|:---:|:---:|---:|
| 1'b0 | 1 | 2進 | 0 |
| 1'b1 | 1 | 2進 | 1 |
| 8'b1010_0111 | 8 | 2進 | 10100111 |
| 8'ha7 | 8 | 16進 | 10100111 |
| 4'd5 | 4 | 10進 | 0101 | 
| 4'o7 | 4 | 8進 | 0111 |


# 演算子
回路として論理合成可能な主な演算子を示す。

## ビット演算

| 記号 | 演算 | 使用例 |
|:---:|:----:|:----:|
| ~ | NOT | ~x | 
| & | AND | x & y |
| &#124; | OR | x &#124; y |
| ^ | XOR | x ^ y |

ビットごとの論理演算を行う。
例えば a = 4'b1011, b = 4'b1100のとき、a & b = 4'b1000となる。

## シフト演算

| 記号 | 演算 | 使用例 |
|:---:|:----:|:----:|---|
| << | 論理左シフト | data << shift |
| >> | 論理右シフト | data >> shift | 

左辺の信号を、右辺で指定されたビット数分だけ論理シフトする。
例えば、data = 8'b10110110 のとき、data << 3'd3 = 8'b10110000 となる。

## 算術演算

| 記号 | 演算 | 使用例 |
|:---:|:----:|:----:|---|
| + | 加算 | x + y |
| - | 減算 | x - y |

算術演算を行う。
例えば a = 4'b1001, b = 4'b0011 のとき、a + b = 5'b01100 となる。

## 関係演算

| 記号 | 演算 | 使用例 |
|:---:|:----:|:----:|---|
| < | 小なり | x < y |
| <= | 小なりイコール | x <= y |
| > | 大なり | x > y |
| >= | 大なりイコール | x >= y |
| == | 一致 | x == y |
| != | 不一致 | x != y |

左辺と右辺のデータ間で指定された関係が成り立つかを判定する。
結果は1ビットの値を持ち、成立する時は1、不成立のときは0となる。
例えば x = 4'b0111, y = 4'b0101のとき、x > y = 1'b1 となる。

## その他

| 記号 | 演算 | 使用例 |
|:---:|:----:|:----:|---|
| ?: | 条件演算 | (sel==1'b0) ? x : y |
| {} | 連結演算 | {x, y} |

条件演算では、最初の信号(?の左側の信号)を条件部として、条件部に1ビットでも1があるときは条件成立として、
2番目の信号(?と:の間)の値を返す。条件が不成立のときは3番目の信号(:の右側)を返す。
例えば、sel = 1'b1, x = 4'b1100, y = 4'b0011 のとき、(sel == 1'b0) ? x : y = 4'b0011 となる。

連結演算は複数の信号を一つに束ねる。
例えば, x = 3'b110, y = 5'b11110のとき、{x, y} = 8'b11011110 となる。
wordpressにredis(Redis Object Cache)を導入すると、表示速度は速くなるか

# やりたいこと

wordpressがとてつもなく重い
redisを活用したときに、表示速度がどのくらい改善するかを検証する
今回は、redisプラグイン「Redis Object Cache」を利用する

# インストール先環境

```
cat /etc/centos-release

CentOS Linux release 7.2.1511 (Core) 
```

# redisインストール

インストールのやり方は、[こちら](http://qiita.com/tachitechi/items/225bf5dbadf19d47c27d "こちら")を参照

# wordpressプラグインをインストール

いくつか方法がある中で、今回は1番手軽にできそうな「Redis Object Cache」を使ってみる

> https://srd.wordpress.org/plugins/redis-cache/

インストール後に、プラグインを有効化する

# wp-config.phpの設定

* hostの設定（必要に応じて）

```
define('WP_REDIS_HOST', '<指定のredisサーバIP>');
```

* keyのexpireの設定（必要に応じて）

```
define('WP_REDIS_MAXTTL', 3600);
```

> その他設定も指定して変更が可能（以下リンク参照）
> https://wordpress.org/plugins/redis-cache/other_notes/

# Redis Object Cacheの設定

* wordpressの管理画面から、「設定 > Redis」を選択

* Serversの欄に、上記のwp-config.phpで指定した変更が適用されているかを確認

* 設定が問題なければ、「Enable Object Cache」を選択し、有効にさせる

* Statusが、Connectedになっていれば、設定完了

# Redisが効いているかを確認する

```
redis-cli
127.0.0.1:6379> keys * 
```

反映されていることを確認

# 結果

```
対応前：995ms
対応後：556ms
```

redisのおかげで、2回目以降のページ表示速度は速くなった！

もともと表示速度が遅いこともあり、他に改善の余地がありそうだが、
redisによって、パフォーマンスが一部改善した
[Unity][Shader Forge] World座標をScreen座標に変換する

#内容
GrabTextureを使用して後ろに描画されたオブジェクトをそのまま描画しようとしたとき
World座標をScreen座標に変換したくなります。
しかし下の画像のようにTransformノードを使用してもうまく変換されない:disappointed_relieved:

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/39e7b57b-e80d-2604-5079-e3c1e71664c7.png)

そのための対応策をメモとして残しておきます。

#環境
Unity5.4.0p4
Windows10


#結果
以下のようにすることで対応することができた。

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/039265bb-3f31-b87f-1fa3-a6cec75b1f46.png)

ここで使用したコードは[StackOverflow](http://stackoverflow.com/questions/8491247/c-opengl-convert-world-coords-to-screen2d-coords)を参考に実装した。

コードの内容は以下のとおりになる。

```glsl:
float4 clipSpacePos = mul(UNITY_MATRIX_VP, float4(worldPosition, 1.0));
float3 ndcSpacePos = clipSpacePos.xyz / clipSpacePos.w;
float2 windowSpacePos = ((ndcSpacePos.xy + 1.0) / 2.0);
#if UNITY_UV_STARTS_AT_TOP
    windowSpacePos.y = 1-windowSpacePos.y;
#endif
return windowSpacePos;
```

DirectX系とOpenGL系でのY軸の位置が違うためにプリプロセスを導入している。
Windows環境とAndroid環境での動作確認をした。

##補足
ちなみに変換後の値についてはScreen Positionノードから出力される値と同じになります。:laughing:
Ojbect PositionはWorld座標だけどスクリーン座標に変換する術をもたない
そういった値で使用することを想定しています。


#試行錯誤
ShaderForgeで提供されているノードだけで実装できないか試した。
実装方法は以下の通り。

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/6636bdae-0e8e-62b8-996d-11b4de4e7217.png)

結果は画像のとおり。
何がダメかというとTransformのViewへの変換は以下のコードに変換されていた。

```glsl:
mul( UNITY_MATRIX_V, float4(i.posWorld.rgb,0) )
```

OH!:weary:
キノコならわかる！IBM Bluemix と Facebookメッセンジャー

Facebookメッセンジャーを試してみた。何かよくわからないけど動いたので記録。

# 必要なもの
* Facebookページ
　Facebookアプリを動かすためのページが必要。

* Facebookアプリ
　メッセンジャーを使うためには受け口となるアプリが必要で、このアプリに対してMessengerを設定する。　　

* サーバーアプリ
　実際にメッセージを受信してアレコレする部分。

# Facebookページの作成
下記より作成のほどを。
https://www.facebook.com/pages/create.php
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/7ce0902a-5b67-a3e3-2fbd-713e34fda5f4.png)

# Facebookアプリの作成
下記より作成のほどを。開発者登録が必要なので登録のほどを。
https://developers.facebook.com/
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/3454e2bf-6b31-6e38-e83a-87d5e651fe27.png)


# サーバーアプリ
+ Bluemixサンプルアプリ
色々見てるとherokuを使ったという人が多かったけど、IBM Bluemixでお試し。
まずはそもそもIBM Bluemix上でアプリを動作させる方法がわからなかったので、
下記のサンプルアプリMemoAppを動かしてみた！
https://www.ibm.com/developerworks/jp/cloud/library/j_cl-bluemix-nodejs-app/

あまり理解をしようともせず、ほぼコピペで実行！動いた！！何かがすごい！

+ Facebookアプリをあれこれ設定

　1.Messengerの追加
　左メニューにある`プロダクト`から`製品を追加`を選択し、`Messenger`の`スタート`をぽち
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/42f7a73f-99bb-1954-9fa8-cfec6fbbd4c4.png)

　2.もう一度`スタート`をぽち
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/9c591048-6af7-a319-0d1c-d272fdbbab4e.png)



+ 追加後の画面
こんな感じになる。このあと、主に`トークンの生成`と`Webhooks`を操作していく。
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/c8693322-b6a2-bfcb-c832-c7c4dad23cc0.png)



#### トークンの生成
`Facebookページを選択`をドロップダウンすると、自身が管理するページがでてくるので
メッセージ送受信の口となるページを選択。トークンをメモメモ
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/67ec4bf7-b7c7-4a48-75ba-ed4a9c691d9d.png)



#### WebHooksの設定
下記の画面が表示される。
コールバックURL＝IBM Bluemix上で動作していたアプリのURL
トークンを確認＝任意の文字列。後述するソースで使用
フォロー入力欄＝不明・・。とりあえず全チェックオン！
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/eec7bb3b-a5d4-6f7d-a902-f14b620df1bf.png)

この状態で、`確認して保存`を押しても駄目なんです。。
この画面を開いたまま、次へ。


#### routes/index.jsの修正
アプリにMessengerの設定をする際に、Webhooksを登録するのだが、
下記の通りレスポンスを返す必要がある。よくわからないけど。。
`トークンを確認`に、先程入力したトークン文字列をセットし、Bluemixにアップロード！
```
router.get('/', function(req, res, next) {
  if (req.query['hub.verify_token'] === 'トークンを確認') {
    res.send(req.query['hub.challenge']);
  }
  res.send('Error, wrong validation token');
});
```

#### WebHooksの設定に戻り`確認して保存`をぽち
正しく設定できていれば、`完了`となる！
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/2ecaa257-28e3-693d-09bf-44e07c66e4e2.png)
 
#### オウム返し
pochi-sato さんのを参考に。
http://qiita.com/pochi-sato/items/f3f5598e36c1fa92d840

`body-parser`が必要だったので、そこだけ修正。

```
var bodyParser = require('body-parser');
var jsonParser = bodyParser.json();

router.post('/', jsonParser, function(req, res, next) {
}
```
BotKitを利用したSlack Botの開発環境を5分～15分位で構築する(Windows)

# 前提

* タイトルにもある通りOSはWindows
* SlackでTeamが作られていること
* Gitがインストールされていること

# 1. SlackでBot Usersの作成

https://yourTeamName.slack.com/apps
※yourTeamNameは自分のチーム名に読み替える
へアクセスして、「bots」で検索。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/23101/2e368e90-5270-fc5a-d9f0-14f8053ebd99.png)


一番上に表示された「Bots」を選択して次の画面で「Add Configuration」ボタンをポチる。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/23101/d4da9378-4991-5b8d-1f9c-f1e89bd962ad.png)

「username」に任意の名前を入力して(これがBotの名前になる)、「Add bot integration」ボタンをポチる。ちなみに「username」に日本語は設定できない。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/23101/9a96e969-d623-7887-6411-6712f46d49d6.png)

Botの設定画面でBotのアイコンだったりをカスタマイズする(これは必須ではない)。API Tokenは「4.サンプルBotの動作確認」で必要になるので控えておく。最後に一番下の「Save Integration」ボタンをポチる。

以上で終了。作成したBotは、「/invite @設定したBotの名前」でチャンネルに招待できる。

# 2. node.jsのインストール

BotKit は Node.js のアプリケーションとして動作するのでnode.jsを入れる必要がある。

https://nodejs.org/en/
からnode.jsをDLしてきてインストールする。基本的に全てデフォルト設定のままインストールを進めてしまって問題ない。
インストールが完了したら、念のためちゃんとインストールされていることを確認する。コマンドは以下。

```
node --version
```

![4.png](https://qiita-image-store.s3.amazonaws.com/0/23101/89a23b71-b479-0707-faa5-5b6a143879b7.png)

node.jsと一緒にnpmもインストールされているので、それの確認もする。
※[npmとは](http://team-lab.github.io/skillup-nodejs/2/4.html)
コマンドは以下。

```
npm --version
```

![5.png](https://qiita-image-store.s3.amazonaws.com/0/23101/f4e80cb6-8b58-5bc1-66f4-9851eb4e2be7.png)


# 3. BotKitのインストール

BotkitはGithub上で公開されているのでcloneして入手する。cloneしたいディレクトリへ移動して以下のコマンドでcloneする。

```
git clone https://github.com/howdyai/botkit.git
```

botkitディレクトリへ移動して依存パッケージをインストールする。

```
cd botkit
npm install
```

# 4.Botのサンプルコマンドの動作確認

Botkitにはサンプルコマンドがいくつか用意されているので、インストールしたBotkitを起動して動作確認してみる。以下のコマンドで起動する。

```
set token=YOUR_API_TOKEN
node slack_bot.js
```
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/a19d6efa-1ae4-ebf0-6c2b-8dea1fb086f9.png)


※YOUR_API_TOKENは、Botの設定画面で控えておいたAPI Token

/invite @your_bot_name
でbotを任意のチャンネルに招待して、
@your_bot_name hello
とBotに話かけてみる。すると、以下のような感じでサンプルコマンドに反応してBotが返事をくれる。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/23101/03b76cd9-cad4-893a-b0dc-484b7d361e06.png)

なお、サンプルコマンドは、botkit/slack_bot.jsの「controller.hears」の第一引数。
※helloの他に、hi、what is my name、who am i、、等が存在する。詳細はソースを見てみるとよい。

# 最後に

node.jsをDLしたり等、ネットワーク環境により若干前後はあるものの、ここまでで大体5分～15分位でできると思う。また、基本的にslack_bot.jsに自作コマンドを作っていくことになるかと思うが、エディタは秀丸でもSakuraでもWebStormでも何でもいいと思う。

# 参考
http://toach.click/slack-botkit/
http://joesbar.blog.jp/archives/1058864418.html
android-apt becomes obsolete

これまでAndroid開発でannotation processingを実行したい場合は[hvisser/android-apt](https://bitbucket.org/hvisser/android-apt)を利用するのが王道となっていましたが、Android Gradle plugin version 2.2から公式にサポートが開始されました。

Migrationの[wiki](https://bitbucket.org/hvisser/android-apt/wiki/Migration)を見れば移行はスムーズである事が分かるかと思います。基本的には`apt`を`annotationProcessor`に置き換えるだけで利用できます。

DroidKaigi2016のリポジトリにもPRを作りましたので合わせて参照下さい。

- https://github.com/konifar/droidkaigi2016/pull/420

機能面では原則同等のものが提供されており、android pluginの方では`javac`と`jack`両方に対応しています。

現在認識されている問題としては、Test configurations絡みの[バグ](https://code.google.com/p/android/issues/detail?id=224272)がある事とAndroid Groovy pluginをサポートしてない事が挙げられていますが、今後は原則として公式の機能を利用していった方が良さそうです。
ddskk で絵文字を入力する

Emacs 上の ddskk で SKK-JISYO.L を使って日本語入力しており、git のコミットメッセージに絵文字を入れるのが流行っているようなので入力できるように設定してみました。

環境: Emacs 25.1 / macOS Sierra

# うまく行った手順

1. [skk-emoji-jisyo](https://github.com/uasi/skk-emoji-jisyo) の SKK-JISYO.emoji.utf8 をダウンロードする。
2. `nkf -w -Lu SKK-JISYO.L > SKK-JISYO.L.utf8` で large-jisyo のエンコーディングを utf8 にする
3. `nkf -w -Lu ~/.skk-jisyo > ~/.skk-jisyo.utf8` で個人辞書のエンコーディングを utf8 にする
4. https://github.com/skk-dev/skktools を git clone して `./configure && make` して skkdic-expr2 をビルド
5. `skkdic-expr2 SKK-JISYO.L.utf8 SKK-JISYO.emoji.utf8 > SKK-JISYO.L+emoji.utf8` で辞書ファイルを連結
6. 絵文字が表示できるように http://users.teilar.gr/~g1951d/ から Symbola をダウンロードしてインストール

7. ~/.emacs.d/init.el に以下の設定を入れる

```el
(setq skk-large-jisyo "辞書置き場/SKK-JISYO.L+emoji.utf8")
(setq skk-jisyo "~/.skk-jisyo.utf8")
(setq skk-jisyo-code 'utf-8)
```

![スクリーンショット 2016-10-17 5.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/64323/8ca461e4-2114-b078-2d81-e19d87dc9769.png)

![スクリーンショット 2016-10-17 5.17.15.png](https://qiita-image-store.s3.amazonaws.com/0/64323/a6dccc10-79e9-8db5-7917-44ab4394a39b.png)


# ハマったことなど

* SKK-JISYO.L のエンコーディングが euc-jp だったので単純に連結すると壊れた
* 辞書ファイルは cat で単に連結しただけでは駄目で、skkdic-expr2 などを使う必要があった
* 以下を参考にしました。
 * [ponkotuyの日記 / 辞書結合 ～SKK-JISYO.LLを作ってみる～](http://d.hatena.ne.jp/ponkotuy/20101214/1292343807)
 * [My備忘録 / Emacsで使用するSKKの辞書の文字コードをutf-8にする](http://arat.xyz/wordpress/?p=129)
 * [Linux とかでも Unicode 絵文字を表示するためのフォント](http://qiita.com/polamjag/items/7295a15fca6a9eeb5d84)
* Github でコミットメッセージに絵文字を出すだけなら単に `:sushi:` とか入れとけばよいことに後で気付いた
HerokuでMySQLを使うときはDATABASE_URLを書き換える

##環境

- OS X El Capitan 10.11.16
- ruby 2.3.0
- rails 4.2.5.2

##前提

[無料枠内でのHerokuの準備とデプロイ（Mac 10 + Rails 4.2 + MySQL 5.6）](http://ruby-rails.hatenadiary.com/entry/20150314/1426332751)を参考に
HerokuでMySQLを使うための設定をしていたところ
`heroku run rake db:migrate`を実行したところで以下のようなエラー発生

```
$ heroku run rake db:migrate
Running rake db:migrate on ⬢ <アプリ名>... up, run.2205 (Free)
rake aborted!
Gem::LoadError: Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)
...
```

##問題と原因

HerokuのaddonでMySQLを追加したはずだが、うまく接続できていなさそう
database adapterがpostgresqlに設定されたままなのが原因か

##解決策
そこで[HerokuでMySQLを使おうとして詰まったところ - Qiita](http://qiita.com/hiyoko/items/108ef1d94dcb5b227b4f)を参考に解決を試みたところ、どうやら
>**1. CLEARDB_DATABASE_URLの`mysql`を`mysql2`に書き換えて、**
>**2. DATABASE_URLもpostgresじゃなくてmysql2のURLに変える**
必要がありそう

```
$ heroku config
=== flagmap Config Vars
CLEARDB_DATABASE_URL: mysql://~~~~~ #1の方
DATABASE_URL: postgres://~~~~~ #2の方
#..
```

以下のようにして1の方は書き換えられた

`$ heroku config:set CLEARDB_DATABASE_URL='mysql2://~~~~~'`

しかし2の方が上手くいかない、、

```
$ heroku config:set DATABASE_URL='mysql2://~~~~~'
Setting DATABASE_URL and restarting ⬢ <アプリ名>... !
 ▸    Cannot overwrite attachment values DATABASE_URL.
```

```
$ heroku addons:detach DATABASE -a <アプリ名>
Detaching DATABASE to postgresql-cylindrical-92240 from ⬢ mysterious-peak-72912... !
 ▸    Cannot destroy last attachment to billing app for resource postgresql-cylindrical-92240
```


ググりまくった末、[mysql - Heroku and ClearDB error - Stack Overflow](http://stackoverflow.com/questions/36082472/heroku-and-cleardb-error)で解決できた
**`addons:detach`ではなく`addons:destroy`**でやったら上手くいった

```
$ heroku addons:destroy heroku-postgresql -a <アプリ名>
 ▸    WARNING: Destructive Action
 ▸    This command will affect the app <アプリ名>
 ▸    To proceed, type flagmap or re-run this command with --confirm
 ▸    <アプリ名>

> <アプリ名>
Destroying postgresql-cylindrical-92240 on ⬢ <アプリ名>... done
```

最後に再び以下のコマンドで書き換え成功！

`heroku config:set DATABASE_URL='mysql2://~~~~~'`

herokuの設定を確認すると

```
$ heroku config
=== flagmap Config Vars
CLEARDB_DATABASE_URL: mysql2://~~~~~
DATABASE_URL: mysql2://~~~~~
...
```

無事変更できてます

`$ heroku run rake db:migrate`

これでデプロイ成功しました！

##参考にしたサイト
- [無料枠内でのHerokuの準備とデプロイ（Mac 10 + Rails 4.2 + MySQL 5.6）](http://ruby-rails.hatenadiary.com/entry/20150314/1426332751)
- [HerokuでMySQLを使おうとして詰まったところ - Qiita](http://qiita.com/hiyoko/items/108ef1d94dcb5b227b4f)
- [mysql - Heroku and ClearDB error - Stack Overflow](http://stackoverflow.com/questions/36082472/heroku-and-cleardb-error)
Instantiateしたオブジェクトが表示されない

# 概要
Instantiateしたオブジェクトが適正位置（表示の位置関係も正常）に生成されているにも関わらず、画面に表示されない問題が発生しました。その時の解決策を備忘録として残します。

# 問題
- 生成したオブジェクトが画面に表示されない。  
アクティブ状態をあらかじめ非表示にしたプレファブを生成して生成時にアクティブをONにすると正常に表示されたがかっこいいやり方とはいえず。

```GameObject hogeObj = Instantiate(hogehoge) as GameObject;
hogeObj.transform.SetParent(this.textViewArea.transform, false);
hogeObj.SetActive(true); ```

# 前提
- 2016/10/17時点の情報です。
- 画面解像度：750*1334
- Unity 5.4.1f1
- OS：Windows
- 実機確認：Android

# 解決策
- pivotを0.5にすると正常な動作になりました。
    - pivotを1のオブジェクトの子階層にプレファブを配置しようとすると不具合が発生。  
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/9137ea76-dbed-b457-9ee2-4b7a05a1c804.png)  
　
    - pivotを0.5にすると正常な動作になりました。  
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/31236b05-82dc-5f20-599a-2499627769a9.png)
[めも]Bitbucketの課題のコメントで、課題番号を書きたい時

```
\#課題番号
```
普通にエスケープするだけですが、`#`だけだと太字になって、残念なことになるので。
ちなみに、リンクの上にマウスを乗せると、課題のタイトルを表示してくれます。便利。

ステータスがResolvedの場合は、取消線が入ります。
一瞬、書き間違えたかと思いますが、仕様です。

---
おまけ。
改行したい時：行末に半角スペース2個。(または空行を1行はさむ。)
pythonでwebsocketを使ったポーカーのゲームサーバ chat-holdemを作った

友達とポーカー(テキサスホールデム)の対戦がしたかったけど、アプリやソフトでちょうど良いのがみつからなかったので、自分で簡単なものを作りました。

#特徴
- コマンドベース
- ユーザが手動で(コマンドで)ディーリングする（プログラムを簡素化するため）
- ブラウザで遊べる
- チャットでお話しながらプレイできる

#サーバの立ち上げ方
> pip install gevent gevent-websocket
> git clone https://github.com/ryogrid/chat-holdem.git
> して、chat_holdem.htmlの中のIPアドレスを自分のサーバのアドレスに変えて
> python chat_holdem.py
> で、デフォルトだと8080番ポートにサーバが起動するのでブラウザでアクセスする

#プレイの様子
![d2dec0ea62ca9b1a76f1fd1e2f19178f.png](https://qiita-image-store.s3.amazonaws.com/0/12325/cd32d530-714c-8f81-b5a6-d13e5fe1882c.png)

#遊び方
- 基本は察してください（爆）
- 最初にプレイヤー全員がjoinしてからngでゲームを始めてください
- 手抜き実装なのでSB, BBの人も明にbetをする必要があります (プリフロップ時)
- 次のフロップに移る時や一回のゲームが終わったらコマンドで次のそれに移って下さい
- 勝者が決まった時のチップの移動もpmvを使ってディーラーがやる必要があります
- ディーラー用コマンドは参加者誰でも打てます
- プレイ可能人数は今のところ5人まで

#TODO
- バグってるかもしれないので頑張る(爆)
- ~~foldしたプレイヤを抜かす処理がまだ入っていないので書く(今はb 0で次に回す必要あり)~~
- プレイヤーが離席した・する場合のコマンドなり処理を書く
- ~~テーブルをリセットするコマンドを書く~~
- プルリク歓迎！

#pythonでwebsocketを使うのに参考にしたページ
http://blanktar.jp/blog/2014/05/python-gevent-websocket.html
http://python.matrix.jp/pages/web/chat_sample.html
Alfred Workflowで キー2回押し を 他のキーに転送する

[Contexts](https://contexts.co/) というアプリ切り替え用のソフトを **Ctrl 2回押し** で起動したかったのですが、Contextsの設定画面ではキー2回押しの割り当てができませんでした。

そこで、 2回押しを検知できる [Alfred](https://www.alfredapp.com/) を利用して実現しました。
ただし、Alfred Workflowを使うため **AlfredのPowerPack（有料） が必要** となります。

## 解説
![image](https://qiita-image-store.s3.amazonaws.com/0/10713/a81abeb8-2987-af0d-d0ee-ad2f9f21db30.png)

内容はとてもシンプルです。Alfred Workflowでは 2回押し のHotkeyをトリガーにできるので、ここから任意のキーを押すスクリプトを呼び出すだけです。

```applescript
# Ctrl + S を呼び出す
on run argv
  tell application "System Events" to keystroke "s" using {control down}
end run
```
MyBatis JPetStoreのSpring Boot版を作ってみた

MyBatisが提供しているサンプルWebアプリケーション([MyBatis JPetStore](https://github.com/mybatis/jpetstore-6))をSpring Boot(Spring MVC, Spring Security) + Thymeleafで作り直してみました。
画面仕様や機能仕様は基本的にはオリジナル版と同じですが、微妙にかえているところもあります（あしからず・・・）。

# 主なスタック

* MyBatis Spring Boot Starter 1.1 (MyBatis 3.4, MyBatis Spring 1.3)
* Spring Boot 1.4 (Spring Framework 4.3)
* Spring Security 4.2
* Thymeleaf 3.0
* HSQLDB 2.3 (Embed Database)
* Tomcat 8.5 (Embed Application Server)
* Java 8
* Groovy 2.4 (Mapperメソッドのアノテーション内で複数行文字列を使うために利用)
* Lombok 1.6

# ソースコード

GitHubで公開してます。

* https://github.com/kazuki43zoo/mybatis-spring-boot-jpetstore

# 解説

ソースみてください！！
（気が向いたら書きます・・・:sweat_smile:）


# その他

入力チェックや排他処理など・・・いくつか改善した方がよさそうな箇所があるので、予告なく変更すると思います。あと、テストも追加したいと思っています。
Thymeleafは詳しくないので・・・へんな実装があるかもしれません。（いや、たぶんある・・・:sweat_smile:）


# まとめ

Spring Boot(Spring MVC,Spring Security) + Thymeleaf + MyBatisを使った画面系アプリのサンプルでした。
このサンプルアプリケーションを理解することで、Spring MVCを利用した画面遷移処理、Spring Securityを利用した認証・認可、Bean Validationを利用した入力チェック、Springのセッション管理、Springのイベント通知、Thymeleafを利用したView実装、MyBatisを利用したDBのCRUD操作ができるようになります。
ホットウォレットとコールドウォレットとは？

# ホットウォレットとコールドウォレットとは？

ウォレットの管理方法です

## ホットウォレットとは？

常時ネットワークに接続された環境にあるウォレットのこと
不正アクセスによってビットコインを第三者に送金されてしまう可能性がある

### メリット

外部からの指示によっていつでも手軽にビットコインを引き出せる

### デメリット

外部からの攻撃によって侵入の成功＝即ビットコインの盗難となる

### 例

* bitcoindにあるウォレット
* mysqlに秘密鍵を保存する
* 設定ファイルに秘密鍵やニーモニックを保存する

## コールドウォレットとは？

ネットワークから隔離された環境に秘密鍵を保存しておくこと
または残高確認専用のウォレットのこと

### メリット

鍵の管理をきちんとすれば安全である

### デメリット

送金するのに不便
鍵の管理方法、入出金のやりかたを考える必要がある

### 例

* [QRコードを印刷したペーパーウォレット](https://www.bitaddress.org/bitaddress.org-v3.2.2-SHA256-f4d047c264a2b71946de319482a9365e56d8d7289dd85a352da3b1448b7647df.html)
* [ニーモニックを紙や鉄板に記録したウォレット](http://doublehash.me/cryptosteel-review/)
* [TREZORなどのハードウェアウォレット（秘密鍵をネットワークから切り離せる）](http://cryptocurrencymagazine.com/trezor-secure-for-bitcoin)
* [フレーズを暗記して都度入力するウォレット（ブレインウォレット、あまり安全じゃないらしい）](https://brainwallet.io/)
composer-plugin-qaでphpunitコマンドを実行

https://packagist.org/packages/webysther/composer-plugin-qa

composer-pluginの一種なんだけど、ちょっと面白いなと思った。
インストール(グローバルでもいいし、パッケージローカルでもOK)すると、composerのサブコマンドに、`qa:`から始まるものが色々生える。

```bash
$ composer global require webysther/composer-plugin-qa
```

![](https://camo.githubusercontent.com/3b98029c23b3a4475330390397007702d5257e2f/68747470733a2f2f7062732e7477696d672e636f6d2f6d656469612f43744f62327a66585941415132314f2e6a7067)

`webysther/composer-plugin-qa` 自体は、特に何かをrequireしているわけではなく、このサブコマンドを生やすという機能単体で実装されている。

`composer qa:test`がPHPUnitに対応していて、ローカルにインストールされた `vendor/bin/phpunit` と同等の意味になる。

他にもphpcbf, phpcsなどのツールも、composerのサブコマンドから叩ける用にしてくれる。

[vendor/bin/phpunitの代替手段 - Qiita](http://qiita.com/Hiraku/items/242ec516139f2c755a27)

scriptsで頑張って`composer test`などのサブコマンドを生やしている人も多いと思うんだけど、まあプロジェクトごとにセットアップし直さないと駄目なので面倒くさかった。

こうやってプラグインとして切り出していけば、composer-scriptsの設定も再利用しやすくなってすごい便利、最高な感じだ。
Vimでクオートの中身を選択するには

自分用メモです。

### クオート(`'`)やダブルクオート（`"`）で囲まれた部分を選択するには
`vi'`というコマンド
(ビジュアルモードに移行し、`i'`(inner of ' = 「'」の中身を選択するという意味のようだ)

### 参考リンク
 - [vimのvisualモードを有効に使いたい \| Scimpr Blog](http://blog.scimpr.com/2014/01/26/vim%E3%81%AEvisual%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84/)
Vimで全体をリインデント（インデントし直す）するには

自分用メモです。


### ファイル全体をリインデントする
`gg=G`で、開いているファイル全体をリインデント（再度インデントし直してくれる）


### 参考リンク
 - [cl\.pocari\.org \- Vim でインデントを整える](http://cl.pocari.org/2002-12-06-9.html)
JavaScript(Node.js)初心者事始めメモ

#背景
会社の研修の課題をJavaScrip(Node.js)で提出せよと言われましたが、研究・開発が主な業務でフロントエンドエンジニアではない自分は正直使ったことがないので四苦八苦しています。
いい機会なので勉強がてらメモを残します。
※課題提出はきっと間に合わぬ

#環境構築
OS:Mac OSX EI Captian
Memory: 4 GB 1600 MHz DDR3

Node.jsのdownloadからinstallまで

```
wget -N http://nodejs.org/dist/node-latest.tar.gz
tar xzvf node-latest.tar.gz
cd node-v[バージョン番号]
./configure
make
sudo make install
```
参考：[Node.js入門](http://rfs.jp/sb/javascript/node)

`./cofigure` の所でもし

```
  File "./configure", line 486
    except OSError, e:
                  ^
SyntaxError: invalid syntax
```
と出たら`python`のバージョンを`python -V`で確認して、3系になっているようでしたら `pyenv global` などで2系にしてみてください。私の環境ではそれで通りました。

#超基本コマンドメモ
当たり前すぎるのかあまり端的な記述がない。

- 実行*

```
node xxx.js
```
- 外部ライブラリの利用*

```
npm install xxx@x.x.x ※@以下はバージョン情報オプション
```
でインストール後、

```
var ex_lib = require('xxx')
```

- コンソール表示

```
console.log('hoge')
```

- 標準入力(2016/10/18追記)

```
var reader = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});
reader.on('line', function (line) {
  console.log(line);
});
reader.on('close', function () {
  console.log('close')
});
```

- コメントアウト

```
//一行だけコメント
/*複数行
　コメントアウト*/
```
*直下のコードはコンソールに打ち込むコマンド、それ以外はxxx.jsに書き込むプログラムコード

#Bufferについて
外部ライブラリを実行した戻り値として`Buffer`が返ってきていたのですが、エンコードされた値の取り出し方がわからずにずっと、

```
console.log(buff)
 <Buffer 31 f3 0d db cb 1b f8 44 65 76 f0 e6 4a a4 c8 8a 9f 05 5e 3c>
```

のような表示のさせ方をしていました。2日程悩んでいたのですが、これは16進数で表示された文字列とのことで、以下のようにすればStringで取り出せます。

```
console.log(buff.toString('hex'))
　31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c
```

参考：[Node.js v0.11.11 マニュアル & ドキュメンテーション](http://nodejs.jp/nodejs.org_ja/api/buffer.html)

以下、随時更新予定
iOSアプリ開発:実機にアプリ転送出来ない

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2016/10/17/ios_dev_app_transfer/)のほうで更新します。

## 現象
シミュレータで動作確認は出来ました。
実機に転送しようと実行してみたところ下記のようなエラーが出ました。

>Ld /Users/〜/Build/Products/Debug-iphoneos/App.app/app normal arm64
    cd /Users/test/app
    export IPHONEOS_DEPLOYMENT_TARGET=5.0
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk -L/Users/〜/Build/Products/Debug-iphoneos -F/Users/〜/Build/Products/Debug-iphoneos -filelist /Users/〜/Build/Intermediates/app.build/Debug-iphoneos/app.build/Objects-normal/arm64/app.LinkFileList -miphoneos-version-min=5.0 -dead_strip -Xlinker -no_deduplicate -fembed-bitcode-marker -fobjc-arc -fobjc-link-runtime -framework QuartzCore -framework UIKit -framework Foundation -framework CoreGraphics -framework GLKit -framework OpenGLES -framework AudioToolbox -framework OpenAL -Xlinker -dependency_info -Xlinker /Users/〜/Build/Intermediates/app.build/Debug-iphoneos/app.build/Objects-normal/arm64/app_dependency_info.dat -o /Users/〜/Build/Products/Debug-iphoneos/App.app/app

>clang: error: -fembed-bitcode is not supported on versions of iOS prior to 6.0


## 調査
Xcode->プロジェクトファイル->General->Deployment InfoのDeployment Infoが5.0になっていた。

## 対応
調査で見た、Xcode->プロジェクトファイル->General->Deployment InfoのDeployment Infoを7.0に変更。
すると、実機に転送時にエラーが出なくなりました。
古いXcodeプロジェクトだったので、デフォルト5.0だったようです。
シェルスクリプトでの変数定義

シェルスクリプトを使っているときに、変数 `VAR` が定義されていない場合の初期値を設定する方法

# if文を使った方法
これが一般的かもしれないが、書き方としては冗長になってしまう
変数 `VAR` がNULL（文字列の長さが0）かどうかを判定して、NULLであれば値を代入する

``` bash
if [ -z "$VAR" ]; then
VAR=hoge
fi
echo $val
#=> hoge
```

# 変数展開{}中で演算子を使って、変数の存在や値をチェックする
`-` 、 `=` 、 `?` 、 `+` 演算子と `:` を使う

## `${VAR:-hoge}`
変数 `VAR` が未定義 or NULL の場合、指定した値 `hoge` を返す
このとき、`VAR` に `hoge` は **代入されない**

``` bash
# VAR は未定義
echo $VAR
#=>
echo ${VAR:-hoge}
#=> hoge
echo $VAR
#=>
```

## `${VAR:=hoge}`
変数 `VAR` が未定義 or NULL の場合、指定した値 `hoge` を返す
さらに、`VAR` に `hoge` が **代入される**

``` bash
# VAR は未定義
echo $VAR
#=>
echo ${VAR:=hoge}
#=> hoge
echo $VAR
#=> hoge
```

## `${VAR:?hoge}`
変数 `VAR` が未定義 or NULL の場合、標準エラー出力に出力され、シェルスクリプトの実行を終了する

``` bash
# VAR は未定義
echo $VAR
#=>
echo ${VAR:?hoge}
#=> -bash: VAR: hoge
```

変数 `VAR` が定義されている場合は、定義済みの値が出力される

``` bash
VAR=fuga
echo $VAR
#=> fuga
echo ${VAR:?hoge}
#=> fuga
```

## `${VAR:+hoge}`
変数 `VAR` が定義されている場合、指定した値 `hoge` を返す

``` bash
VAR=fuga
echo $VAR
#=> fuga
echo ${VAR:+hoge}
#=> hoge
```

変数が未定義 or NULL の場合には NULL を返す

``` bash
# VAR は未定義
echo $VAR
#=>
echo ${VAR:+hoge}
#=>
```
ionic emulate android実行でエラーになった場合


### エラー内容
```
emulator: ERROR: unknown skin name 'WVGA800'
```

### 解決方法
 - Android Studio実行 -> 'Tools -> Android -> AVD Manager' -> WVGA追加
 - 
<img width="536" alt="スクリーンショット 2016-10-16 23.56.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/88511/4a2d34d6-ddff-7455-6320-118d5406b593.png">

<img width="620" alt="スクリーンショット 2016-10-16 23.56.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/88511/9762fba3-6562-8f66-0da5-6f222aab8563.png">
MMDサンプル



Three.jsのMikuMikuDanceサンプルを、ディスコ風なライティングにしてみただけ。

デモ：https://mo49.github.io/qiita/20161016/

コード：https://github.com/mo49/qiita/blob/master/docs/20161016/index.html

![スクリーンショット 2016-10-16 23.32.34.png](https://qiita-image-store.s3.amazonaws.com/0/136286/7caad51c-0916-24bf-428e-e3d9c30b1629.png "スクリーンショット 2016-10-16 23.32.34.png")


```javascript:モデルのロードとデータの紐付け
createMMD() {

	const onProgress = ( xhr ) => {
		if ( xhr.lengthComputable ) {
			const percentComplete = xhr.loaded / xhr.total * 100;
			console.log( Math.round(percentComplete, 2) + '% downloaded' );
		}
	};

	const onError = ( xhr ) => {
		console.log('error');
	};

	const modelFile = 'models/model/model.pmd'; // モデルデータ（キャラ）
	const stageFile = 'models/stage/stage.pmd'; // モデルデータ（ステージ）
	const vmdFiles = [ 'vmds/dance.vmd' ];      // モーションデータ（キャラ）
	const cameraFiles = [ 'vmds/camera.vmd' ];  // モーションデータ（カメラ）
	const audioFile = 'audios/audio.mp3';

	this.helper = new THREE.MMDHelper( this.renderer );

	const loader = new THREE.MMDLoader();
	loader.setDefaultTexturePath( './models/default/' );

	loader.loadModel( modelFile, ( object ) => { // SkinnedMeshを生成

		this.mesh = object;

		loader.loadModel( stageFile, ( stage ) => {

			loader.loadVmds( vmdFiles, ( vmd ) => {

				loader.loadVmds( cameraFiles, ( vmd2 ) => {

					loader.loadAudio( audioFile, ( audio, listener ) => {

						listener.position.z = 10;

						this.helper.add( this.mesh );
						loader.pourVmdIntoModel( this.mesh, vmd ); // アニメーションデータを流し込む
						this.helper.setAnimation( this.mesh );

						this.helper.setCamera( this.camera );
						loader.pourVmdIntoCamera( this.camera, vmd2 );
						this.helper.setCameraAnimation( this.camera );

						this.helper.setAudio( audio, listener );

						this.helper.unifyAnimationDuration(); // 各種アニメーション、音楽データの時間をそろえる

						this.helper.setPhysics( this.mesh ); // 物理演算

						this.scene.add( this.mesh );
						this.scene.add( stage );
						this.scene.add( audio );
						this.scene.add( listener );

					}, onProgress, onError );

				}, onProgress, onError );

			}, onProgress, onError );

		}, onProgress, onError );

	}, onProgress, onError );
}
```

```javascript:レンダリング
// WebGLRendererではなくMMDHelper
this.helper.animate( this.clock.getDelta() );
this.helper.render( this.scene, this.camera );
```


- 公式サンプル
	- https://threejs.org/examples/?q=mmd
	- https://takahirox.github.io/MMDLoader-app/



> 参考
[VPVP wiki](https://www6.atwiki.jp/vpvpwiki)
[Three.jsでMMDを使ってみる](http://cly7796.net/wp/javascript/try-the-mmd-in-three-js/)
Pythonのスライスについて

# スライスってなに？

Pythonをある程度触っていると、スライスという言葉を目にするかとは思いますが、よく使うから理解できていると思いきや、実は結構複雑なものだったので、記事にしてみました。

スライスとは、シーケンスの要素について部分的に簡単にアクセスできる構文（？）です。

スライス演算は、listやstrなどのよく使う型で利用できるので、スライスを知っておくとかなり便利なものになります。


# 基本の使い方

a[始まりの位置: 終わりの位置]みたいに使います。

たとえば、

```py3
a = [1, 2, 3, 4, 5]
print(a[0: 4])
print(a[: 4])
print(a[-3:])
print(a[2: -1])

>>>
[1, 2, 3, 4]
[1, 2, 3, 4]
[3, 4, 5]
[3, 4]
```

こういう感じです。始まりの位置に何も入力しないと0、終わりの位置に何も入力しないと末尾として処理されるので、そういうときは書かない方がいいです。

マイナスが入ると少しわかりにくいかもですが、これを用いるとリストと末尾についての指定が簡単にできるので使い慣れると世界が変わると思います（ちょっと大げさな言い方ですかね）。


ここまでは私も知っていたスライスなんですが、実はこれよりも複雑な書き方が存在したのです……！


# 最近勉強したスライスのやり方

a[始まりの位置: 終わりの位置: スライスの増分]です。

スライスの増分を指定することで、「n番目ごとに要素を得る」こととかができます。

たとえば、

```py3
a = [1, 2, 3, 4, 5]
print(a[:: 2])
print(a[1:: 2])
print(a[::-1])
print(a[1::-1])

>>>
[1, 3, 5]
[2, 4]
[5, 4, 3, 2, 1]
[2, 1]
```

です。こういうことです。
複雑だけど、これ使いこなせたらかなり良さげですよね！
特に-1とかかなり使えそう。

ただこれ、3つを組み合わせるとちょっと理解するのに時間かかりますね多分。
前に作ったプログラムを見直したときに、「あれ？ これどうなるんだっけ？」ってなるやつです。

可読性を考えたらいいのかどうかわかりませんが、知っておいて損はないとおもいます。


そんなわけで、スライスも奥が深いなーという話でした。
Node.jsのbunyan互換のRuby用JSON Loggerを作った

* https://github.com/tilfin/ougai
* https://rubygems.org/gems/ougai

### 動機
最近、ログを全て JSON 化しようといて、Node.js のアプリケーションでは [bunyan](https://github.com/trentm/node-bunyan) を使っている。このモジュールの良いところは整形して見るためのコマンドを持っている。そのため JSON ログを fluentd やサードパーティサービスに送りつつも、ターミナルで見たい場合は `bunyan output.log` なり `~ | bunyan` で確認できる。

Node.js と Ruby のプログラムを作ることが多いため Ruby も JSON でログを出力したかったが、ビューコマンドまで持つものが見つからなかったので、bunyan 互換のロガーを自作してみた。

### 使い方
純正の Logger のサブクラスとなっており各種ログメソッドに対して、メッセージとともに例外や含めたいデータを付加できる。

```ruby
require 'rubygems'
require 'ougai'

logger = Ougai::Logger.new(STDOUT)
logger.debug('Debugging', data_id: 1, data_flag: true, data: { value: 100 })

begin
  1 /0
rescue => ex
  logger.error('Caught error', ex)
end
```

#### ログ出力
```json
{
  "name": "main",
  "hostname": "mint",
  "pid": 14607,
  "level": 20,
  "time": "2016-10-16T22:26:48.836+09:00",
  "v": 0,
  "msg": "Debugging",
  "data_id": 1,
  "data_flag": true,
  "data": {
    "value": 100
  }
}
{
  "name": "main",
  "hostname": "mint",
  "pid": 14607,
  "level": 50,
  "time": "2016-10-16T22:26:48.836+09:00",
  "v": 0,
  "msg": "Caught error",
  "err": {
    "name": "ZeroDivisionError",
    "message": "divided by 0",
    "stack": "main.rb:18:in `/'\n  main.rb:18:in `<main>'"
  },
  "reason": "zero spec"
}
```
※実際には各JSON毎に一行で出力されるので整形はされない。

#### bunyan コマンドで見たときの出力
```
[2016-10-16T22:26:48.836+09:00] DEBUG: main/14607 on mint: Debugging (data_id=1, data_flag=true)
    data: {
      "value": 100
    }
[2016-10-16T22:26:48.836+09:00] ERROR: main/14607 on mint: Caught error (reason="z
    main.rb:10:in `/'
      main.rb:10:in `<main>'
```
※実際にはターミナルでは色付けされる

### 名前の由来
bunyan（バニヤン）が作家の名前らしい（もしくは神話の巨人名？）ので、日本製ということで ougai にしてみた。bunyan という名前の Gem は既に MongoDB 向けで存在していたため。
普段マネジメントしている人から、Webアプリケーションの作成方法を聞かれた話

### 作成したい動機
------------------------------------------------------------

- WEBアプリケーションを自分でも開発できるようになりたい（特にスタートアップフェーズのプロダクトの場合）
- エンジニアと同じ目線でコミュニケーションしたい

### 作成したいと言ってきた人のスペック
------------------------------------------------------------

- 素人レベルですが、htmlとcss（SCSS）は少し書ける
- javaを少し研修で触ったことがある
- pythonを少し勉強している

出来れば、完全素人向けに書いてほしいとのこと。

本人も結構無茶を言っていると認識していましたが、聞かれたので真面目に考えてみた。でも、到底ペライチで説明できる代物では無いので、ざっくりと最短で行けそうな方向性を示そうかと。

### Webアプリケーションを作成する上で必要なもの、ざっくりと
------------------------------------------------------------

- httpのプロトコル
- フロント（html, css, js）（chromeなどのブラウザに表示する部分を担当）
- Webサーバー＆アプリケーションサーバー（Java, Node.js, Ruby）（フロントとミドルウェアや外部サーバーとのやり取りをしたりする）
- ミドルウェア（Database, Nginx, Redis）（データ格納用のソフトウェアなど、用途に応じたソフトウェアのこと）
- インフラ（クラウド、物理サーバーやネットワーク、スイッチなど）（主にハードウェアのこと）

かなり大雑把な説明ですが、ざっくりこんな感じでしょうか？細かく言うとさらに色々あるので、こんなもので。。。

### 学習コストが少なめな組み合わせ
------------------------------------------------------------

#### ■httpプロトコル（Webの通信原理となります）

とりあえず、getとpostの違いだけ分かればよいかと。

#### ■フロント（jQuery）

Reactとかモダンなのやったほうが良いのでしょうが、覚えることが多すぎるので、最初はこれでシンプルにやって、慣れてきたらReactとかのほうが良い気がします。（jQueryなら聞いた場合、答えられる人多いでしょうし。）

#### ■Webサーバー＆アプリケーションサーバー（Node.js）

JavaとかPHPだと、Webサーバーが必要で、そちらの設定も覚える必要があり大変です。Node.jsは、単体で動作します。また、フロントでjs使うので学習コストは低くなるかと。

jsの学習は、[JavaScript 第6版（サイ本）](https://www.oreilly.co.jp/books/9784873115733/)を読んでおくと良いです。ES2015の仕様には対応していないのですが、基本を知るには問題無いかと。

#### ■ミドルウェア

Mysqlが良いと思います。奥が深過ぎるので、さらりとやると良いかと。

#### ■インフラ

とりあえず、ローカルでやると思うので、クラウドは使わない方向で。LinuxMintとかUbuntuとかWindowsとかMacとか、好きなの使えばいいと思います。

もし、クラウドを使うならPaaSとか呼ばれている、OSとか言語とか準備済みのクラウドが良いと思います。Node.jsが使える中でおすすめは、Google App Engineです。

#### ■Github（ソースコード管理ツール）

マストでは無いです。でも、こちらはプライベートでもGistなど色々と使えるので、使えるようになっておくと良いかと。こちらに上げてくれれば、コメントしたり、修正したりすることが出来るようになります。

### やる順番
------------------------------------------------------------
とりあえず、フロントとNode.jsだけでシンプルに始めるのが良いかと。
その後、徐々にMysqlと繋いでみたり、GAEに乗っけてみたりしてみるとよいかと思います。

### あとはググってひたすら、手を動かすのみ
------------------------------------------------------------

現在のコンピュータの動作原理である、「ノイマン型コンピュータ」を作ったフォン・ノイマン氏いわく、

> In mathematics you don't understand things. You just get used to them.
> 「数学では物事を理解するということはなくて、慣れるにすぎないのだ。」

とのことです。超天才でも理解せずに慣れているにすぎないなら、僕らも慣れるしかない。手を動かそう！！

昔に、Pythonやろうとして、本をしっかり読んでからやったけど、結局手を動かして必要な部分だけ本を読んだほうが、覚えが速かった経験があります。。。（今思えばググれば、本要らなかった気すらします。。。）

### まとめ
------------------------------------------------------------

こんな解説じゃ、ダメですかね？とりあえず、来週感想を聞いてみます。ダメそうなら修正します。

→　追記しました。2016-10-17