OmniAICreator/Qiita-1.07M huggingface dataset:
はじめての深層学習]Deelインストール後のサンプル実行時のメモ②

Chainerが上手く動かない時のメモ②
GUIの別件でGPUで学習が進まないので
Chainerのアンインストールをかけたり
入れなおしたりしてましたら何かのタイミングで
Protobufの前のバージョンが入ったっぽい


##エラーメッセージ
```
$ python tiny.py
Traceback (most recent call last):
  File "tiny.py", line 2, in <module>
    from deel.network import *
  File "/home/keigo/Development/deel/deel/network/__init__.py", line 4, in <module>
    from chainer.links import caffe
  File "/usr/local/lib/python2.7/dist-packages/chainer/links/caffe/__init__.py", line 1, in <module>
    from chainer.links.caffe import caffe_function
  File "/usr/local/lib/python2.7/dist-packages/chainer/links/caffe/caffe_function.py", line 37, in <module>
    from chainer.links.caffe.protobuf2 import caffe_pb2 as caffe_pb
  File "/usr/local/lib/python2.7/dist-packages/chainer/links/caffe/protobuf2/caffe_pb2.py", line 10, in <module>
    from google.protobuf import symbol_database as _symbol_database
ImportError: cannot import name symbol_database
```


##修正方法　protobufのアップグレード

```
sudo pip install --upgrade protobuf
```

```
Installing collected packages: setuptools, protobuf
  Found existing installation: setuptools 30.2.0
    Uninstalling setuptools-30.2.0:
      Successfully uninstalled setuptools-30.2.0
  Found existing installation: protobuf 2.6.1
    Uninstalling protobuf-2.6.1:
      Successfully uninstalled protobuf-2.6.1
Successfully installed protobuf-3.1.0.post1 setuptools-32.2.0
```

##その後サンプル実行したらちゃんと動きました
```
$ python tiny.py
Loading bvlc_googlenet.caffemodel
#1 | stole | 39.1%
#2 | kimono | 18.2%
#3 | poncho | 14.4%
#4 | cardigan | 13.9%
#5 | wool, |  4.9%
#6 | bonnet, |  2.8%
#7 | mitten |  1.5%
#8 | bow |  0.8%
#9 | sock |  0.5%
#10 | cloak |  0.4%
#11 | overskirt |  0.3%
#12 | sarong |  0.2%
#13 | velvet |  0.2%
#14 | handkerchief, |  0.2%
#15 | apron |  0.1%
#16 | cellular |  0.1%
#17 | Christmas |  0.1%
#18 | panpipe, |  0.1%
#19 | fur |  0.1%
#20 | sweatshirt |  0.1%
```
前回
[はじめての深層学習Deelインストール後のサンプル実行時のメモ](http://qiita.com/manjiroukeigo/items/d14ef357aaef0296f650)

参考書
[はじめての深層学習(ディープラーニング)プログラミング](https://www.amazon.co.jp/exec/obidos/ASIN/4774185345/minatokuakasa-22/)
[github uei/deel](https://github.com/uei/deel/tree/master/examples)
PKCS#1、改定される

PKCS#1を改定するRFCが出ました。

2016年11月、[RFC8017](https://tools.ietf.org/html/rfc8017)が発行され、PKCS#1 v2.2になりました。PKCS#1といえば公開鍵・秘密鍵のファイルフォーマットですが、今回変わったのはそこではなく、署名のフォーマットであるRSASSA-PKCS-v1_5です。

#改定の内容

旧規格[RFC3447](https://tools.ietf.org/html/rfc3447#appendix-A.2.4)と新規格[RFC8017](https://tools.ietf.org/html/rfc8017#appendix-A.2.4)それぞれのAppendix A.2.4を見比べると分かりますが、ハッシュ方式にSHA-224、SHA-512/224、SHA-512/256の3者が追加されています。SHA-2ファミリーのハッシュ関数としては、従来のv2.1にもSHA-256、SHA-384、SHA-512が定義されていましたので、旧規格の暗号強度が不足だったわけではありません。[FIPS 180-4](http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf)に合わせるための改定のようです。

EMC社（旧RSA社）のPKCS#1規格としては、既に2012年の段階で[PKCS#1 v2.2](https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf)が出ていましたので、4年遅れでRFCに反映されたことになります。

#互換性

今回の改定で削除されたハッシュ方式はありませんので、互換性としては、従来のv2.1と上位互換を保っています。RSASSA-PKCS-v1_5にはバージョン番号フィールドといったものはありませんので、新しいハッシュ方式を使わなければ、v2.1形式の署名とv2.2形式の署名は全く同じです。

#心の叫び

__ああまったく余計なことをしてくれた！！__

改定されてしまったものは仕方がないので、今後どう対応するかですが、[RFC791](https://tools.ietf.org/html/rfc791#section-3.2)のいう「送信は厳密に、受信は寛容に」というポステルの原則に従うならば、署名生成ではSHA-224, SHA-512/224, SHA-512/256を使わず、署名検証側ではなるべく受け入れる、という方向で考えるしかなさそうです。

#参考文献

RFC8017 （新規格）
PKCS #1: RSA Cryptography Specifications Version 2.2
https://tools.ietf.org/html/rfc8017 ([Google翻訳](https://rfcs.web.fc2.com/rfc8017.html))

RFC3447 （旧規格）
Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1
https://tools.ietf.org/html/rfc3447 ([Google翻訳](https://rfcs.web.fc2.com/rfc3447.html))

RSA Laboratories (2012)
PKCS #1 v2.2: RSA Cryptography Standard 
https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf ([Google翻訳](https://translate.google.com/translate?sl=en&tl=ja&u=https%3A%2F%2Fwww.emc.com%2Fcollateral%2Fwhite-papers%2Fh11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf))

FIPS PUB 180-4 
Secure Hash Standard (SHS)
http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf ([Google翻訳](https://translate.google.com/translate?sl=en&tl=ja&u=http%3A%2F%2Fnvlpubs.nist.gov%2Fnistpubs%2FFIPS%2FNIST.FIPS.180-4.pdf))

RFC791
INTERNET PROTOCOL
https://tools.ietf.org/html/rfc791 ([Google翻訳](https://rfcs.web.fc2.com/rfc791.html))
SketchUp Make v17 / Ruby > GroupのWidth, Height, Depth[mm]を表示する実装

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

Groupのサイズを取得したい。

google検索してようやく以下の方法を見つけた。
> Vector3d - SketchUp Ruby API Google Developers
www.sketchupdocs.com/docs/ourdoc/boundingbox
このページを訳す
You can get the bounding box on a model. model = Sketchup.active_model model_bb = model.bounds # Or you can get the ... first_entity.bounds # Or you can create an empty bounding box of your own. boundbox = Geom::BoundingBox.new ...

**<font color=red>ただし、上記のリンク先はすでになくなっている。</font>**
とりあえずキャッシュで記載されたコード(上記の文字列のこと)を参考にした。

```measureGroup161224.rb
require 'sketchup.rb'

def measure_group()
	model = Sketchup.active_model
	my_selection = model.selection

	my_selection.each do |ent|
		if ent.is_a? Sketchup::Group
			bnd = ent.bounds
			print("W:",bnd.width)
			print(",H:",bnd.height)
			print(",D:",bnd.depth,"\n")
		end
	end
end
```

立方体を作成し、Group化する。

上記のスクリプトをRubyコンソールにて読込む。
(スクリプトの置き場所は[こちら](http://qiita.com/7of9/items/ff5921cf65b5f88d9311)参照)

```
> load "measureGroup161224.rb"
true
```

Groupにしたオブジェクトを選択後、measure_group()を実行する。

```txt:実行
> measure_group()
W:3000.000000mm,H:1000.000000mm,D:4000.000000mm
#<Sketchup::Selection:0x007fcfabe8d208>
```

作成したサイズを取得できた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e7b9f208-5a8e-4610-6d34-1c4c7948325f.png)

オブジェクト？を回転している場合は`local_bounds`を使え、というようなメモを見た気もする。

今回はboundsというもので間に合った。


### 測定２

今日、立体ずらしスクリプトを使って作成したlaundry rackの案１。
それぞれがGroup化したオブジェクトなので、うまく動けば、NIC directに注文する情報が簡単に得られるはず。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e6bdadf6-e3c6-d261-76c2-6942462c6685.png)

全Groupを選択して`measure_group()`してみた。

```txt:結果
> measure_group()
W:900.000000mm,H:20.000000mm,D:20.000000mm
W:650.000000mm,H:20.303132mm,D:20.305539mm
W:20.000000mm,H:900.000000mm,D:20.000000mm
W:20.000000mm,H:20.000000mm,D:900.000000mm
W:650.000000mm,H:20.000000mm,D:20.000000mm
W:20.000000mm,H:900.000000mm,D:20.000000mm
W:20.000000mm,H:20.000000mm,D:650.305575mm
W:900.000000mm,H:20.000000mm,D:20.000000mm
W:20.000000mm,H:900.000000mm,D:20.000000mm
W:20.000000mm,H:20.000000mm,D:650.000000mm
W:20.000000mm,H:20.000000mm,D:900.000000mm
#<Sketchup::Selection:0x007fcfabe8d208>
```

少し誤差が出ているが、欲しい情報が簡単に得られようになった。
(誤差はモデリング時の失敗に起因するだろう)

900mmと650mmで統一することで、再利用性を検討している。
もしくかするとBorg Sensor System1の測定装置のフレームとして使うかもしれないので。
マグネトロンスキャナとか（原理を考える必要がある)。

### 測定3

多数の直方体から構成される構造物のサイズも一覧取得できる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c9d1b608-f302-e60f-000a-73b07e790448.png)

ただし、回転しているGroupはサイズ取得を失敗するようだ（値が正しく出力されない)。

### link

以下のスクリプトの方が見やすい結果を生成しています。
http://qiita.com/yasuraok/items/8e69234f96178c2d48f7
Reduxのファイル構成は『Ducks』がオススメ


## 問題

redux wayで書いていくと

```
|_ containers
|_ constants
|_ reducers
|_ actions
```

とかって大量の登場人物が登場してきてうざい。わかるけど複雑になります。

（ここでいう`Constants`はActionの値などの定数の集まりを指します。）

## Ducksという考え方

「そこでDucksですよ！」
https://medium.com/@scbarrus/the-ducks-file-structure-for-redux-d63c41b7035c

これを使うと、上記のややこしいのが、

```
|_ containers
|_ modules
```

となります。
どういうことかというと、modulesの中の1ファイルに`Reducer`, `Action Creator`, `Constants` などをまとめて1ファイルで扱ってしまおう（そしてそれをmodulesとして管理しよう）という解決法になります。


### なぜコレが嬉しいのか？

Reduxはfluxの実装として筋がよく、一気に普及しました。
そこで用いられている`Reducer`, `Action Creator`などの登場人物は、役割としては別であるものの実際にはお互いに`Constants`で紐付けられていて実質的に密結合です。それぞれ単体では存在しえません。
なので１ファイルで扱ってしまっても不都合はないのです。

ちなみにテストはどう書くかというと、上記の通り登場人物は変わらないため、Reduxの定石通りに`Reducer`, `Action Creator`の単位でテストを書くことができます。

## まとめ

reduxは最初の取っ掛かりがわかりにくいですが、これを使うともっとシンプルに、管理しやすい設計ができます。
特にデメリットはないので導入することをオススメします。
CakePHP3のMigration記述備忘録

CakePHP3(Phinx)のMigrationファイルの記述備忘録

bakeでmigrationファイルの作成

```
$ bin/cake bake migration MigrationName
```

## カラムの追加
`users`テーブルに`photo`というカラムを文字型255文字で追加。

```php
public function change()
{
  $table = $this->table('users');
  $table->addColumn('photo', 'string', ['limit' => 255])
        ->update();
}
```

## カラムの制約を変更

nullを許容する。

```php
public function change()
{
  $table = $this->table('users');
  $table->changeColumn('photo', 'string', ['limit' => 255, 'null' => true])
        ->update();
}
```
質問応答システムの基盤にElasticsearchを使ってみる

この記事は、Elastic stack Advent Calendar 2016の24日目です。

# 自己紹介
- Acroquest Technology という会社でエンジニアをしています。
- 学生時代は自然言語処理や情報検索などをしていました。

# 概要
### Elasticsearchを基盤にして、質問応答システム的な物を作りたい。  
- 日本語で書かれた質問に対して勝手に答えを吐き出すようなもの。  

- 知識源になり得るソースは世の中にいくらでもある。可能なら柔軟に選択できて、なおかつ情報が常にアップデートされてくのが理想。

- 知識源が膨大になったときに、スケールしやすいElasticsearchは良いかもしれないと思ってます。(もちろん個人で大きいクラスタ組んでやる気合いはありませんが)

- 複数記事に分けて書きます。
→今回の記事では下準備として色々試してみたことなどを書きます。

# 環境
- mac OS Sierra 10.12.2
- elasticsearch-5.1.1
- kibana-5.1.1
- python-3.5.2
- mecab 0.996  

# 今回の流れ
1. 方針書く
2. 知識源となるデータをとりあえずelasticsearchに投入
3. Python側から関連ドキュメントを取得できるようにする

# 方針
まず前提として、「質問応答」といっても定義がふわっとしている。
質問の種類によって難易度の幅も大きく違うので、
今回は第一段階として、最も簡単と思われる「真偽判定問題」を対象にしてみます。

たとえば特定の事実をあらわす「徳川家康は江戸幕府をひらいた」といった文に対して、
真偽判定を行うものです。

これなら
1. 知識源データが正しく保持されている
2. 質問の解釈ができる
3. 知識源から正しい情報を検索できる
という条件がそろえば百発百中で正解できるはずです。


理論上は。




# 知識源となるデータをとりあえずelasticsearchに投入

今回はある程度のサンプルデータを作成して、Elasticsearchに投入します。
とりあえずテキストデータそのものと、分かち書きしたものを突っ込んでみました。
(キーワードを視覚的に見れたほうが嬉しいけど、
あとで構文解析したくなるだろうなぁと思ってテキストも残してます)

データの流れとしては
データソース → Python → elasticsearch → Python → 出力 
とするのが良いかと思っています。

### 突っ込んだデータはこんな感じ
![スクリーンショット 2016-12-24 19.25.41.png](https://qiita-image-store.s3.amazonaws.com/0/146387/2e94d412-caa5-c271-2e39-d3d0a95f2d46.png)


今回やりたいことに直接関係ないですが、配列で持っとくとGraph使えて楽しいです

![スクリーンショット 2016-12-24 21.08.13.png](https://qiita-image-store.s3.amazonaws.com/0/146387/b1bd7f5f-b8a3-d041-cabd-59a4a2fccba4.png)

Graph今回は意味ないと思ったけど割と重要でした...
これを見ると「19」と「世紀」が別々で出てきたり「化」という謎の単語が抽出されていることが一目でわかります。(「化」ってなんだよ....)
処理としては間違ってないけれど「○○世紀」はセットになってくれた方が嬉しい。
分かち書きのやり方を改善する必要がありそうです。
辞書は別途見直してみます。

とりあえず適当なキーワードでpython側から検索できることを確認します。

```ruby::
from elasticsearch import Elasticsearch
import json

es = Elasticsearch(['http://USER:PASSWORD@localhost:9200'])


request_body="{\"size\":10,\"query\":{\"term\":{\"words.keyword\":\"日本\"}}}"

output = open("search_result.json","w")
json.dump(es.search(index="test",body=request_body),output, ensure_ascii=False, indent=4, sort_keys=True, separators=(',', ': '))
```

こんな感じで書けば「日本」というワードを含むドキュメントが引っ張れます。
結果は↓のように返ってきます
![スクリーンショット 2016-12-24 21.51.06.png](https://qiita-image-store.s3.amazonaws.com/0/146387/eb1e062d-a2f3-6c40-dfe9-f801c732e088.png)


真偽判定という点に関して言えば、
あとは質問文と、返ってきたドキュメントのテキストを解析すれば判定できそうです。
とりあえず下準備ということで今回はここまでにします。
続きをご期待ください。

# まとめ

とりあえず質問応答システムを作る下準備をしました
(下準備の下準備くらいかもしれませんが。。。)

次の記事ではちゃんと質問に答えてくれる子を作りたいものです。
シス管系女子みたくなりたくて

シス管系女子 Advent Calendar 2016の12月23日を担当します！
http://www.adventar.org/calendars/1692

シス管系女子の本を購入したのは、Linuxもよく分からなくて、なんか、勉強のきっかけになりそうな本を探して本屋さんをウロウロしてた時に、たまたま見つけた感じでした。

最初は、きっとマンガだから、難しいことは書いてないだろうという感じで買ったのですが、ページをめくってみると、字も細かくて、黒い画面怖いって感じの私には、ハードルが高かったです。

それから、しばらくは、他の技術書と同じように、積読な状態で買ったことも忘れていたのですが、時々思い出したように、Linuxができる女子ってカッコイイのではないかという思いで、今年になって、Linuxの勉強をはじめた次第です。

おかげで、今年になって、Red Hat系やDebian系があるってことをはじめて学びました。
Linuxは、本当勉強することもいっぱいあるけど、発見もいっぱいあって楽しいです。

今は、Vimの勉強をはじめたくて、ちょうど調べてたとこでした。
普段は、Atomが大好きな私ですが、Linuxって言ったら、やっぱり、Viなんじゃないかと勝手に思い込んで、Vi使えるようになりたくて。

まずは、
http://dotinstall.com/lessons/basic_vim
からはじめて、
vimtutorを、まず日本語版からはじめて、それが終わったら、英語版もやってみるという、計画だけ立ててます。うん、来年のやることリストに追加！

シス管系女子の本にも、みんとちゃんがvi怖いよう～とか言って、チートシートを使えばいいわと先輩にアドバイスをうけてます。
http://vim.rtorr.com/lang/ja/

来年こそは、みんとちゃんみたいに、シス管系女子みたくなって、Linuxにもどんどん詳しくなって、ラズパイとかLPICとかできるように成長したいなぁ。あと、みんとちゃんみたいに、おしゃれにも気をつかって可愛くなれたらいいなぁ（最近めんどくさくて、ネックレスもつけたことないから）とか思う、2016年の12月現在であります。


![ZYOSI.jpg](https://qiita-image-store.s3.amazonaws.com/0/131990/fb6131b5-741e-8566-27b3-a121b1cbaa04.jpeg)
SketchUp Make v17 / Ruby > Groupのgeometryを表示するスクリプトを試した

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

Groupのサイズを取得したい。
Groupの扱いをまず学習することになる。

以下の`by honoluludesktop » Wed Nov 03, 2010 11:35 am`さんによるコードが良さそう。
http://sketchucation.com/forums/viewtopic.php?f=180&t=32237

少し書き直した。

```test161224.rb
require 'sketchup.rb'

def measure_group()
	model = Sketchup.active_model
	my_selection = model.selection

	my_selection.each do |ent|
		if ent.is_a? Sketchup::Group
			tr = ent.transformation
			print(tr.origin.to_a)
		end
	end
end
```

上記のスクリプトをRubyコンソールにて読込む。
(スクリプトの置き場所は[こちら](http://qiita.com/7of9/items/ff5921cf65b5f88d9311)参照)

```
> load "test161224.rb"
true
```

Groupにしたオブジェクトを選択後、`measure_group()`を実行する。

```txt:実行
> measure_group()
#<Sketchup::Selection:0x007fcfabe8d208>
> measure_group()
[3.3208915333693483, -132.2488688610533, 0.0]#<Sketchup::Selection:0x007fcfabe8d208>
```

何かの数値（３つ）が得られた。
単位は何かは不明。
Android Studio2.2でC/C++を利用するには

[前々回](http://qiita.com/s_s_k/items/a4b09f68ef3ca994d827)、[前回](http://qiita.com/s_s_k/items/ab33f029c9bdd13e8c9e)とOpenGL環境を構築してきましたが、C/C++を利用するにあたっては思っている以上に環境構築が手間取りました。

近年はIDEやスクリプト言語を利用することが多いため、ビルドやコンパイル周りの知識のなさにがっかりです。基礎がないとちょっとした応用すらできないなと反省しきりです。

ということで、もう少しAndroid StuidoでC/C++の利用方法を調べます。

## 環境
Android2.2を利用します。
Mac OSx10.10

## プロジェクト作成
[前回同様](http://qiita.com/s_s_k/items/ab33f029c9bdd13e8c9e)、"include C++ Support"のチェックを入れて作成します。

次にC/C++のビルド環境を設定します。

### ビルドはCMakeで
Android StudioではC/C++のビルド環境設定は複数あるようです。詰まるの大体ここかと思います。
今回はAndroid2.2のデフォルトの<b>CMake</b>を利用してビルド環境を構築します。
これが一番簡単でした。

C/C++のビルド方法はいろいろあるので、興味があれば是非確認してみてください。より深く理解できます。

ちなみにCMakeとは
>CMakeはコンパイラに依存しないビルド自動化のためのフリーソフトウェアであり、様々なオペレーティングシステムで動作させることもできます。


## CMakeLists.txtの編集
デフォルトでcppディレクトリにnative-lib.cppファイルがあると思います。
ここがエントリープログラムになります。
ビルドの設定はCMakeLists.txtに記述します。一旦全て消して、最小構成で追記していきます。

```cmake
# CMake version
cmake_minimum_required(VERSION 3.4.1)

# Add library
add_library(
	 native-lib
	 SHARED
	 src/main/cpp/native-lib.cpp
)

# log
find_library(log-lib log)

# リンク設定
target_link_libraries(
   native-lib
   ${log-lib}
)
```

## 自作コードを追加する
テストコードとして、AndroidのLog出力を、C/C++側から実行します。
cppディレクトリ内に適当にディレクトリを作ります。
例えば"log"としましょう。

CMakeの便利な所は、自作コード用のビルド設定を別のCMakeLists.txtファイルに記述することができます。

プログラムファイルが如何にあるとすると
cpp/log/log.cpp

同一改装などに新しいCMakeLists.txtを配置します。
cpp/log/CMakeLists.txt

CMakeLists.txtは以下のとおりです。

```cmake
# CMake version
cmake_minimum_required(VERSION 3.4.1)

# .hファイルがあれば、パスを指定します。
include_directories(
	./log/include
)

# Add cpp files
add_library(
	mylog
	STATIC
	./log/log.cpp
)
```

これでlogディレクトリ内のビルド設定はできたので、これをnative-lib側にひも付けます。

```cmake
# Add Sub Directory
add_subdirectory(src/main/cpp/log)
```

add_subdirectoryで自作コードのパスを設定します。
あとは、リンク設定を入れればOKです。

```cmake
target_link_libraries(
   native-lib
   
   mylog
)
```

これでひも付けもOKです。無事にビルドができることが確認できると思います。
ちなみにLog出力のコードは

```cpp
#include <android/log.h>

__android_log_print(ANDROID_LOG_INFO, "識別子みたいなもの？適当に設定してください。", "%s\n", val.c_str());

```

これでINFOで表示できます。
第一引数は、ANDROID_LOG_DEBUG、ANDROID_LOG_ERRORなどもあるので、適宜設定してください。


## OpenGLのビルド設定

native-libのCMakeLists.txtに以下を追記してください。

```cmake
# Setup OpenGL
add_definitions("-DDYNAMIC_ES3")
set(OPENGL_LIB GLESv2)


target_link_libraries(
   native-lib

   ${log-lib}
   ${OPENGL_LIB}
)

```

これでOpenGLの関数を実行できると思います。
【three.jsのヘルパー解説集】 ⑩ VertexNormalsHelperの使い方

## VertexNormalsHelper
継承：THREE.Line
解説：頂点法線を確認できるヘルパーです。**blenderなどからモデルを出力した時の確認として使用すると便利です。**

### デモ

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/42248/60dd12b4-9f4c-599e-ba24-e7281271015f.gif)

- [jsdo.itで確認する。](http://jsdo.it/sawa-zen/iJO5)
- [ソースコードを確認する。](https://github.com/sawa-zen/three_js_demo/blob/master/helper/src/helper/VertexNormalsHelper.ts)　

### 実装例

```js:javascript
var geometry = new THREE.BoxGeometry(2, 2, 2, 2, 2, 2);
var material = new THREE.MeshBasicMaterial({
  color: 0xff0000,
  wireframe: true
});
var object = new THREE.Mesh(geometry, material);
scene.add(object);

var edges = new THREE.VertexNormalsHelper(object, 0.5, 0x00ff00, 1);
scene.add(edges);
```

VertexNormalsHelper(object, size, color, linewidth)

- object：頂点法線を確認したいオブジェクト
- size：法線の長さ
- color：法線の色
- linewidth：先の太さ
React Native のバージョンアップ方法

既存 React Native プロジェクトの `react-native` パッケージのバージョンをあげる方法をまとめておく。

できれば 2 週間にいっぺん、時間があるときにやるとよい。バージョンが開くと変更点が多くなってしまうので追っかけていきたい。ただし JavaScript コードの書き換えが必要なバージョンアップは最近めったにない。

最新バージョンにあげたい場合
----------------------------

### `react-native upgrade`

これは `package.json` に書かれた `react-native` バージョンのテンプレートファイルを現プロジェクトにコピーするコマンド。書き換えていいかのプロンプトが出るが、勝手に merge してくれたりといったことはなく既存設定はまったく考慮されない。

これを実行したあとで `.babelrc` や `.flowconfig` などの設定ファイルから Xcode のプロジェクトファイル、 gradle の設定ファイル群までが対象なのでその後でプロジェクトセットアップをいちからやり直す必要がある。

盲点なのが com ではじまらない Java パッケージ名を使っているときに com ではじまるテンプレートがコピーされてしまうこと。これは聞かれないのでいつの間にかいてビルドが失敗してあせる。要注意。

### 手動

`react-native upgrade` がやっていることを手でやっていく。

```sh
cd /tmp
react-native init a
```

`/tmp/a` 以下の各種ファイルと現ファイルの diff をみながら変更部分を更新していく。慣れるとそんなでもない。

### 新規プロジェクトに移植

別ディレクトリーに `react-native init` したあと既存プロジェクトから JavaScript コードをコピー、各種設定を再度する。


特定バージョンにあげたい場合
----------------------------

**オススメしない**。

`package.json` の `react-native` バージョンをお好みのものに書き換えて `yarn` もしくは `npm install` 。このあと最新バージョンの手動版と同様、各種設定ファイルの書き換えなどを手でやっていく。


すべての方法で共通の注意点
--------------------------

### `.flowconfig`

`.flowconfig` の更新時は新バージョンにあわせるのだが、いくつか注意点があるのであげておく。

#### `[version]`

まず最後の行 `[version]` セクションに指定されているバージョンをきっちり確認すること。変更したら `package.json` 内の flow バージョンを指定したものにあわせてインストールしておく

#### `suppress_comment`

各種 `suppress_comment` を react-native で定義されているものにあわせること。正規表現パターンがバージョンごとに微妙に異なっているためか、ここが抜けると react-native 本体のソースに対して flow が怒ることがある。

### flow

既存コードの変更は flow のバージョンアップによって通らなくなった部分の修正のみだが、 node_modules の下も気を使う必要がある。独自で定義している private package など使っている場合はそちらも要チェック。
型による制約

## はじめに

ScalaCheckについて少し書こうと思います。

まず、なぜ今回ScalaCheckについて書こうと思ったのかですが、これは[#7 市ヶ谷Geek★Night「Scala大名の平成維新〜殿中でScala！〜」](https://ichigayageek.connpass.com/event/29781/)で[Qiita:@mtoyoshi](http://qiita.com/mtoyoshi)さんの発表や[twitter:@gakuzzzz](https://twitter.com/gakuzzzz)さんの発表によるところが大きいです。

- http://www.slideshare.net/MasakiToyoshima/ss-61358550
- http://gakuzzzz.github.io/slides/logic_or_types_as_constraint_short/#1

どちらの発表も型による制約を取り扱っていて、がくぞさんの資料にはScalaCheckを使ったサンプルコードがあります。

このへんの話を自分なりに整理するために書きます。イメージとしては豊島さんの資料でScalaCheckを使ったらどうなるかという感じで整理しようと思います。

次の2つのケースについてサンプルコードを用意します。

- 型で制約を表現しないケース
- 型で制約を表現したケース

制約と一言で言ってしまうと雲をつかむような話になってしまいがちですが、親しみのある道路の信号機(交通信号機)を使ったものを用意しました。多分、通じると思います。

物語としては自動車を運転する話です。信号が青ならばRun、赤ならばStop、黄ならば運転手の性格によってRunだったりStopになる。そういう話です。

まずは型による制約がないほうから紹介します。

## 型で制約を表現しないケース

ちょっと雑かもしれませんが、サンプルコードは下記URL先になります。

https://github.com/t-mochizuki/scala-study/commit/c4b6f4c73dcd2025ad92925d53feebe1cce963e3

今回話したいところは`def drive(red: Option[Signal], yellow: Option[Signal], blue: Option[Signal]): DrivingState`なので、それ以外は飾りです。

信号は赤、黄、青の3色です。これをOption型で表現しています。

テストにはそれを反映して、3種のテストデータだけが生成されるようになっています。

`def genOptionSignal = Gen.oneOf((Some(Signal), None, None), (None, Some(Signal), None), (None, None, Some(Signal)))`

sbtのconsoleで(None, None, None)のようなケースを試すと、次のような例外になります。

```
Type in expressions for evaluation. Or try :help.

scala> val person = new Person(Gentle)
person: Person = Person@648c416d

scala> val car = new Car(person)
car: Car = Car@4fa6918f

scala> car.drive(None, None, None)
scala.MatchError: (None,None,None) (of class scala.Tuple3)
  at Car.drive(Car.scala:3)
  ... 42 elided

scala> 
```

つまり、ありえないケースでは例外になります。

sbtのtestを試すと、次のような警告が表示されます。

```
[warn] It would fail on the following inputs: (None, None, None), (None, Some(_), Some(_)), (Some(_), None, Some(_)), (Some(_), Some(_), None), (Some(_), Some(_), Some(_))
[warn]     val result = signal match {
[warn]                  ^
[warn] one warning found
[info] + Car.constraint: OK, passed 100 tests.
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 3 s, completed 2016/12/24 20:18:27
```

親切な警告です。「次の入力で失敗するでしょう」という警告です。そうです失敗します。

これは型による制約が必要であることの手がかりになります。この警告を見たら、型による制約を検討することをおすすめします。

次に、どこをどう修正すれば型による制約を取り入れることができるかを紹介します。

## 型で制約を表現するケース

こちらもちょっと雑ですが、差分は下記URL先になります。

https://github.com/t-mochizuki/scala-study/commit/607224c4c9e2a66cf7bbf57292ebd8c9cd37559f

sbtのtestを試しても、警告は表示されません。

## ScalaCheckのコツ

最後にScalaCheckのコツについて少し書きます。

ScalaCheckのサンプルコードをみると、chooseを使ったものが多いのですが、個人的にはoneOfが馴染みやすいと思います。あと、for式を使うと型クラスと仲良くなれます。

詳しくは[ScalaCheck Documentation](https://www.scalacheck.org/documentation.html)を参照していただくのがよいと思います。

ScalaCheckを使ったことがないようであれば、APIを確認するためにソースコードを参照することをお勧めします。API Documentationからソースコードを参照するのがよいと思います。ちなみに、API Documentationは更新されていないようでchooseなどが記載されていません(私の確認の仕方が悪いのかもしれませんが)。

IntelliJを使っているようであれば、直接ソースコードを参照するのが良いと思います。

テストの話ですが、ScalaCheckを使うと入力に何が来るのかがわからないのでテストケースにテスト対象のメソッドの実装を書くことになったりします。そういう場合はScalaCheckを使うべきではないかもしれません。

ScalaCheckはシリアライズとデシリアライズ、エンコードとデコードのようなペアーの処理に対して有効なようです。

## まとめ

自分で確かめてみることが一番確実で一番役に立つので、手を動かして確認していただけると幸いです。
Eclipseでデバッグ

デバッガでブレークポイントを設定して値を確認のための方法

## Javaアプリケーションのデバッグを起動

Alt + Shift + d,j


### ステップオーバー（F6）

次の一行を実行します。次の1行にメソッド呼び出しが含まれている場合でも、そのメソッド呼び出しを終えた状態でプログラムが中断します。
Pythonでリストの連続する要素でグループ化するgroupby

```python
from itertools import groupby

a = [1, 2, 3, 2, 2, 2, 3, 3, 4, 4, 4, 3, 1, 1]
a = sorted(a)

# 連続する要素をグループ化する
for key, group in groupby(a):
    print list(group)
```

実行結果

```
[1, 1, 1]
[2, 2, 2, 2]
[3, 3, 3, 3]
[4, 4, 4]
```
NanoPi NEO で動いた/動かない USB WiFi ドングル


試したものを順次追記していきます。

# 動いた

## BUFFALO WLI-UC-GNM2

メーカー商品ページ: http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm2/
価格コム: http://kakaku.com/item/K0000273353/
Amazon: http://amzn.asia/5HJ21bD

挿すだけで`wlan0`として認識

```bash
root@FriendlyARM:~# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 88:57:ee:9a:da:58  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```

接続する

```bash
root@FriendlyARM:~# wpa_passphrase SSID WPAKEY >> /etc/wpa_supplicant/wpa_supplicant.conf
root@FriendlyARM:~# ifdown wlan0
root@FriendlyARM:~# ifup wlan0
```

接続できた

```bash
root@FriendlyARM:~# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 88:57:ee:9a:da:58  
          inet addr:192.168.10.138  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: 2408:210:2ce3:800:e83c:8eb6:4bf7:1fc4/64 Scope:Global
          inet6 addr: 2408:210:2ce3:800:8a57:eeff:fe9a:da58/64 Scope:Global
          inet6 addr: fe80::8a57:eeff:fe9a:da58/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:503 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:68198 (68.1 KB)  TX bytes:1518 (1.5 KB)
```


# 動かない

## BUFFALO WI-U2-433DM

挿しただけだと認識しない。
暇ができたら調べる。
配列を配列でFilterする。

#配列を配列でフィルタする。
二つの配列があり、元の配列とフィルタ用の配列両方に含まれていれば新しい配列に追加する。
[1,2,3,3,4,5] [3,4,5,6]　の二つがあれば [3,3,4,5]が出力される。
filterを使うと思いの外短く書けたのでメモ
＊ソートされている必要はない。

```swift

//元の配列
let Nums = [1,2,3,3,4,5]
//フィルタ用配列
let Filter = [3,4,5,6]

//フィルタする
let Result = Nums.filter({(a: Int) -> Bool in return Filter.contains(a) })

print(Result) // [3, 3, 4, 5]

```
Unity 5.4+のVR最適化機能Single Pass Stereo Renderingの使い方と注意点

# UnityのSingle Pass Stereo Renderingについて
　Unity 5.4で新しくSingle Pass Stereo Renderingという機能が追加されました。Unity 5.5.0現在、Player SettingsのOther Settings内**Stereo Rendering Method**で有効化することができます。

![Stereo.PNG](https://qiita-image-store.s3.amazonaws.com/0/11166/4cee8ef2-953c-d3d7-4fee-d3c9100f10fe.png)

# 何をやってくれるのか
　通常、VRでは両眼視差のある映像を表示するために片目のカメラごとに描画処理が行われます。以下は**Multi Pass**に設定した場合にFrame Debuggerを使用してレンダリング途中の画面をキャプチャしたものになります。

## Multi Pass描画中
![DebuggerMPS.png](https://qiita-image-store.s3.amazonaws.com/0/11166/ab0b2b6a-f48d-000e-6dc1-6015055d035f.png)

## Multi Pass描画後
![DebuggerMPSFinal.png](https://qiita-image-store.s3.amazonaws.com/0/11166/a5cb0584-7f6a-0896-40db-73a7bb71ffec.png)

　見事に左目の映像のみが表示され、この後右目の描画処理をもう一度ゼロから始めて最後に左右繋ぎ合わせるのが従来の**Multi Pass Stereo Rendering**となります。

では**Single Pass Stereo Rendering**を有効にした場合はどうなるでしょうか。Single Pass(単一パス)という名前通り、
両目の描画を一度に行ってくれます。

## Single Pass描画中
![DebuggerSPS2.png](https://qiita-image-store.s3.amazonaws.com/0/11166/ccd463c7-fd7e-e441-0a1b-a6bad593c40b.png)

## Single Pass描画後
![DebuggerSPS2Final.png](https://qiita-image-store.s3.amazonaws.com/0/11166/446a104f-93a6-a7ef-0920-dcf422583a5e.png)

# Single Pass Stereo Renderingのメリット
## 画質を向上させる

　今回サンプルで使ったガンナーオブドラグーンは元々のレベルデザイン時点で描画が重いオブジェクトを減らしているため元々パフォーマンスについては問題はありませんが、**Single Pass Stereo Rendering**を有効にすることで非VR Ready PCであるGTX 980Mノートにてポストエフェクトを多用し敵を十数体同時に出現させた際にも90fpsを維持することができています。

![dejige 2016-12-24 20-02-13-306.png](https://qiita-image-store.s3.amazonaws.com/0/11166/8060ac5b-b78c-4eda-ec9d-4cdbb8dcc80c.png)

　ポストエフェクトをオフにした場合はSingle Pass Stereo Rendering無しでもfpsを稼げますが違いは一目瞭然ということが分かると思います。Single Pass Stereo Renderingで軽くなった分、よりオブジェクトを増やしたり、シェーダを複雑化したり、ポストエフェクトに割くコストを増やすといった事が可能になります。
![dejige 2016-12-24 20-51-12-835.png](https://qiita-image-store.s3.amazonaws.com/0/11166/f5adcb66-ed15-2710-694d-7a2c0fac7a3c.png)



## 動作環境を広げる
　UnityによるプレゼンではSingle Pass Stereo Renderingによってメインスレッド7ms、レンダースレッド11msの処理が4.0／7.3msに削減されたと言われています。2つの処理を1つにまとめて描画処理の時間が約33％減というと少ない気がしますが、PC業界で最も有名なGPUベンチマークである3DMarkにおいて例えばGTX970とGTX960の差はおよそ33%です。
Oculus Rift・HTC ViveといったPC HMDの問題は推奨動作PCの価格が高すぎる事ですが、Single Pass Stereo Renderingと従来のUnityグラフィックス最適化を合わせて行うと1ランク下のGPUでも動かす事が十分可能になります。

# Single Pass Stereo Renderingのデメリット
## 描画バグ
　Single Pass Stereo Renderingは本来片目ごとに行う描画処理を1度に省略して行う技術なので、対応していないポストエフェクトを使用すると画面が崩壊します。
以下は旧来のBloomエフェクトをSingle Pass Stereo Renderingで使用した際の画像です。

![Bug.PNG](https://qiita-image-store.s3.amazonaws.com/0/11166/79db72c8-269e-8c48-d703-2abfb9738800.png)

Graphics.Blitを使ったエフェクトの場合はこのように画面が二重に描画されてしまいます。（HMDの中も二重に表示されます）
これは非対応エフェクトが重なるごとに増えていくので、非対応エフェクトを数えるのには逆に楽です。

![Bug2.PNG](https://qiita-image-store.s3.amazonaws.com/0/11166/74319f91-a462-936c-d2e2-b582663a9c57.png)

逆に現状ではこれ以外のデメリットはまず確認できません。
Unity5.4リリースから時間が経ちAsset StoreのポストエフェクトにもSingle Pass Stereo Rendering対応のものが増えつつありますし、UnityのSingle Pass Stereo Renderingと併用して高品質なBloomやDoFなどを使いたい場合はGitHubのUnity公式リポジトリである[Post Processing Stack](https://github.com/Unity-Technologies/PostProcessing)を使用するのがおすすめです。

# まとめ
　UnityのSingle Pass Stereo Renderingはまだ制約もありますが効果は非常に高くボタン1つでパフォーマンスが向上する素晴らしい機能です。ぜひ活用してUnityで軽快に動くVRアプリケーションを作りましょう。
Python2.xをインストール（ソースからコンパイル）for CentOS7.3

最近よく利用されるPython。Pythonの普及版である2.xのインストール方法をご紹介します。尚OpenIPMIでは、2.x系を必要とします。
2016年12月時点では、「2.7.13」が最新版となります。

##インストール

```bash:Python2.7インストール方法
cd /usr/local/src
wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
tar xvzf Python-2.7.13.tgz
cd Python-2.7.13
./configure --with-ensurepip
make
make install
```

以上で、インストールは完了です。
【Fuse】FirebaseでPush通知を！(Android編)

遅れてしまいましたが、[Fusetoolsアドベントカレンダー](http://qiita.com/advent-calendar/2016/fusetools)23日目の記事です。今日はFirebaseを使ったPush通知について書きます。

Push通知を実装する場合、Google Play Serviceライブラリを事前にインストールしておく必要があります。[こちら](https://www.fusetools.com/docs/preview-and-export/installing-google-play-services)を参考に準備しておいてください。また、アプリのターゲットAPIレベルに応じたシステムイメージ等もインストールされていないと、コンパイルエラーになってしまうので、ここで一緒にインストールすることをオススメします。

一応[公式サイト](https://www.fusetools.com/docs/fuse/pushnotifications/push)に、Push通知の実装の仕方がありますが、このままやってもうまくいきません。2016年の9月から、GCMを使う場合はFirebaseに移行する必要があるみたいです。Firebaseでの設定を行わないと、401 Authentication Errorが返されます。詳細は[GCMのリファレンス](https://developers.google.com/cloud-messaging/http-server-ref#error-codes)をご覧ください。

それで、FuseでFirebaseを使ったプッシュ通知を実装したいのですが、今のところは公式にサポートしてないっぽかったので、[Community packages](https://www.fusetools.com/docs/packages)の[Fuse.Firebase](https://github.com/cbaggers/Fuse.Firebase)のFirebaseを使った認証サンプル（Fuseの社員の人が作ったやつっぽい）を参考に進めました。

※ macOSの場合はCocoapodsが必要らしいので、インストールしておきます。

```
sudo gem install cocoapods
```

まずはリポジトリをローカルに落とします。その内、必要なのは下記です。

- /AuthExample/AndroidImpl.uxl
- /AuthExample/generate_xml_from_google_services_json.py

`AndroidImpl.uxl`は、ビルド時に行くつかのファイルを正しい場所に入れるための設定ファイルです。

`generate_xml_from_google_services_json.py`は、Firebaseにアプリを追加した際に生成される.jsonファイルからXMLファイルを作ってくれる、Googleが出している、Gradleのプラグインです。

上記2つのファイルを、自分のFuseプロジェクト内の`.unoproj`と同階層に入れてください。

それがおわったら、Firebaseにプロジェクトを作り、アプリを追加します。ここも説明していると長くなっちゃうので、[@SnowMonkey](http://qiita.com/SnowMonkey)による[【Android】30分で実装するPush通知【Firebase】](http://qiita.com/SnowMonkey/items/7f08eb0275f2420c29eb)などを参考に進めてください。（デバッグ用のSHAキーの設定や、gradleへの追加は今回は不要です。）必要なのは、途中でダウンロードされる.jsonファイルです。こちらをプロジェクトフォルダに追加して、さきほどダウンロードしたpythonファイルを実行します。

```
python generate_xml_from_google_services_json.py
```

実行後は.pythonは不要なので消しちゃいます。ここまででプロジェクトファイルの構成は下記のようになります。

```tree
sample
|- AndroidImpl.uxl
|- google-services.json
|- googleservices.xml
|- sample.unoproj
|- MainView.ux
```

ここまでできたら、ビルドしてアプリを立ち上げます。

```
fuse build -t=Android -r
```

後はfirebaseコンソールから、notificationを送るだけです！！！アプリがバックグラウンドでないと、通知がきません。フォアグラウンドの場合は、別で実装が必要らしいです。

![Screenshot_20161224-195430.png](https://qiita-image-store.s3.amazonaws.com/0/100937/dca0c552-f844-6fb4-5c86-7e475f57b450.png)


途中からこれ、あんまFuse関係なくね！？と思いましたが、まぁそんなことはいいのです。Firebaseの手軽さを実感しました。
WordPressのショートコードでやる夫を表示するプラグイン

# 紹介

WordPressのショートコードでやる夫を表示するプラグインを作成しました。
スマホからもAA用フォントで表示されます。
ちょっとしたアクセントに使えるんじゃないかと思います。

プラグインの管理ページから**Yaruo**で検索するとヒットします。


# 作例
![SS01.png](https://qiita-image-store.s3.amazonaws.com/0/27198/1c27b495-b995-0cb1-9e49-5cd7a48ce73e.png)

上記のようなページを作成するとき、以下のように記述します。

```
[aa_mode version="1"]

[aa_panel name="yaranaio_01" id="8" class="aa_words"]
じゃー、

さっそく始めっとすっか。
[/aa_panel]

今日はサーバーのメンテのために休日出勤である。

[aa_panel name="yaruo_01" id="2" class="words_aa" padding="200"]
あいよー
[/aa_panel]

[/aa_mode]
````

* `aa_mode`で始まりを宣言します。フォントがAA用に指定されます。
* `aa_panel`でAAの挿入です。
* `aa_panel`の`name``id`でキャラクターとその種類を指定します。登録されているリストがプラグインに同梱されていますのでそれを参照してください。
* `aa_panel`の`class_aa`は`aa_words`か`words_aa`をどちらかを指定します。これで科白を左右どちらかに表示させるか指定します。これはfloatによるものです。スマホなど横幅が狭いと上下にずれます。
* `padding`は左側に空白をつけます。位置を調整したいときに使用します。100,200,300,400,500,600があります。
* 会話が不要なときには`aa_panel`ではなく`aa`ショートコードがあります。


# AAを増やしたいとき
AAを追加できるよに変換用のスクリプト`mlt2txt.pl`も同梱しています。
perlでNKFモジュールをインストールしている必要があります。debianだと`libnkf-perl`です。

AAデータは[AAMZ Viewer](https://aa.yaruyomi.com/)にて配布されています。
ここのmltファイルから変換できます。

mltファイルは掲示板での使用を想定しているので空白が邪魔になるかもしれません。
そのときには [OrinrinEditor](https://github.com/SikigamiHNQ/OrinrinEditor) で「1ドットずらす」ボタンなどで除去するといいです。


よろしくお願いします。
Python3.xをインストール（ソースからビルド）for RockyLinux 9.x

簡易アプリ作成等々でよく使われるPython。Linuxで利用する際に必要な、Python3.xのインストール方法を紹介します。
2025年2月現在の最新版は「3.13.1」になります。
本作業はRockyLinuxで行っていますが、RHEL互換であれば、同様に作業可能です。

##準備
あらかじめ以下のパッケージを入れておく（でないと「No module named '_ctypes'」とメッセージが出てpipでインストールできないパッケージがある

```bash:
dnf install libffi-devel
```

また、OpenSSL及び、SQLite、libbzを入れないと、一部アプリケーション利用時にエラーとなる。

## 1. OpenSSLのインストール

[Rocky Linux 9.4にOpenSSL 3.4をインストールする（ソースからビルド）](https://qiita.com/shadowhat/items/557aff78ef0eddcbd257)

## 2.zlibのインストール
[zlibをインストール（ソースからビルド）for RockyLinux 9.x]
(https://qiita.com/shadowhat/items/867d9e06bc42cf862b9a)


## 3.SQLiteのインストール

```
cd /usr/local/src
wget https://www.sqlite.org/src/tarball/sqlite.tar.gz --no-check-certificate
tar xvzf sqlite.tar.gz
cd sqlite
./configure
make -j 4
make install
```

## 4.bz2のインストール

```
cd /usr/local/src
wget https://www.sourceware.org/pub/bzip2/bzip2-latest.tar.gz --no-check-certificate
tar xvzf bzip2-latest.tar.gz
cd bzip2-1.0.8
make
make install
make clean
make -f Makefile-libbz2_so
make install
```

## 5.Pythonのインストール

```bash:
export CFLAGS="-I/usr/local/include -I/usr/local/ssl/include -L/usr/local/src/bzip2-1.0.8"
export LDFLAGS="-L/usr/local/lib64 -L/usr/local/lib -L/usr/local/lib64 -L/usr/local/mysql/lib -L/usr/local/ssl/lib -L/usr/local/lib/sqlite3.47.2"
export LD_RUN_PATH=/usr/local/lib64:/usr/local/lib:/usr/local/ssl/lib:/usr/local/lib/sqlite3.47.2:/usr/lib:/usr/lib64
export LD_LIBRARY_PATH=/usr/local/ssl/lib::/usr/local/ssl:/usr/local/lib64:/usr/local/lib:/usr/local/lib/sqlite3.47.2:/usr/lib:/usr/lib64
export PKG_CONFIG_PATH=/usr/local/ssl/pkgconfig:/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib:/usr/lib64/pkgconfig

cd /usr/local/src
wget https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tgz
tar xvzf Python-3.13.2.tgz
cd Python-3.13.2
./configure \
--with-ensurepip \
--enable-shared \
--enable-ipv6 \
--with-openssl=/usr/local/ssl \
--enable-optimizations \
--enable-threads \
--prefix=/usr/local/python-3.13.2 \
--with-system-ffi=/usr/local/lib64 \
--enable-loadable-sqlite-extensions
make -j 8
make install
```

インストール後に、python3のライブラリが見えているかを確認する

```bash:
ldd /usr/local/python-3.13.2/bin/python3
ldd ./python3
        linux-vdso.so.1 (0x00007ffd66bbf000)
        libpython3.10.so.1.0 => not found #★ライブラリが見えていない
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fa97bbd0000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa97b9b0000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fa97b7ac000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007fa97b5a8000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fa97b226000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fa97ae61000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa97bdf9000)
```

この場合、以下のコマンドでライブラリをみえるようにする

```bash:
ln -s /usr/local/python-3.13.2/lib/libpython3.13.so.1.0 /usr/local/lib64/libpython3.13.so.1.0
export LD_LIBRARY_PATH=/usr/local/lib64:/usr/lib64
```




これだけで、インストールは完了です。
sharedにしているため、ライブラリが見えない場合は、/etc/ld.so.confに、「/usr/local/lib」を追加し、「ldconfig」を実行しパスが見えるようにするとよい。
2016年の一大決心。ジーズアカデミーに飛び込んだ私

ちょうど2016年も残りわずか。
気づいたらあっという間にクリスマス:evergreen_tree:と年末:snowman:です。

今回はジーズとの出逢いを中心に2016年を振り返りたいと思います。

![表紙.jpg](https://qiita-image-store.s3.amazonaws.com/0/152277/da628b02-a934-066c-bb9f-f66f1ce7345d.jpeg)


#■2016年ジーズアカデミーとの出逢い
一言で言うならば、**『新しい世界に飛び込んだ』**そんな1年でした。

2016年も折り返しになる6月、私は新たな職場へと転職。
それが「ジーズアカデミー」です。

長年勤めた人材業界からの新規一転未知へのセカイに飛び込みました！:point_up:


でも・・・・実はJOINするときに不安だったことも。
##■エンジニアって・・？？？？？


![image](https://qiita-image-store.s3.amazonaws.com/0/152277/6dd4dc4d-e59d-9edd-acae-b737a9934071.png)


約30年生きてきて、『エンジニア』という方々に接したことがほぼ皆無だったのです。
加えてPCへの抵抗感:cry:
どちらかというとITリテラシーは低めの方でした。

そんな私がプログラミングスクールにJOINして良いのか？？
不安:sob:。ドキドキ。え、、、大丈夫かな、、、迷い迷い:confounded:
正直今だからいうと、めちゃくちゃありました。


##■なぜジーズに来たのか？
よく聞かれますが、、簡単に言うとこの２つ。
**①もともと何か夢や目標を持っている人のサポートをしたいと思っていたこと
②これからのWEBサービスとジーズの事業にワクワクしたから。**
~~（児玉さんがジーズの事業をあまりに楽しそうに話していたというのもあります。笑）~~

どうせ働くならいつまでもキラキラ:star:したいし夢を追いかけたい、人と一緒に何かを
創り上げたい:v:そう思っています。


##■今は・・・
そんな私が今ジーズアカデミーでPRとコミュニティマネージャー他諸々の仕事を
やっています。
とても強く感じているのは、ほんと人に助けられているなぁということ。
一緒に働く上司・スタッフはもちろん、卒業生や在校生であるG'sのメンバーに
助けられています。

ちょいちょいミスをしたりなぜか何もないところで~~よく~~転んだりしていますが、、
みなさま温かく迎えて頂きいつも**感謝感激**:relaxed:です。

新しく飛び込むことによって得られた出会いに感謝、というのがこの1年です。




![image](https://qiita-image-store.s3.amazonaws.com/0/152277/3df1a023-f447-f204-f42b-f90ec7ffa6a0.png)






#■【蛇足】女子必見！「エンジニア男子は結婚に向いている」について考えよう。


![image](https://qiita-image-store.s3.amazonaws.com/0/152277/7aff5e84-c165-44b2-7c8e-102bb1b7e633.png)


現在私はエンジニア（プログラミングをやる人々）に囲まれて日々を過ごしておりますが
先日こんな記事が飛び込んできました。

◎http://www.womaninsight.jp/archives/224875
「エンジニア男子は結婚に向いている！その理由と正しい出会い方とは」



ほう、これは・・・！:eyes:
ということで早速クリック。



:closed_book:（記事参照中・・・）:blue_book:



要するにエンジニアは
◎勉強好き(真面目）で
◎周囲に女子が少ないので浮気の心配もさほどなく
◎手に職だからくいっぱぐれることがない
ということです。


確かに。:grinning::tada:
![image](https://qiita-image-store.s3.amazonaws.com/0/152277/ed4b19c4-9984-277c-e007-da4e5f2e8164.png)



エンジニアはモテない、彼女いない人が多い、などいわれることもありますが
私が思うに身近にいないから「わからない」、よくないイメージ先行している
だけだと思います。

（かつての私もそうでしたが、
　まったくエンジニアと接することのない女性は世の中めちゃくちゃ多いです）


女子の周りには「エンジニアが少ない→だからわからない」という図ができているのでしょう。
（あと仕事が忙しくで出会う暇もないという方も多いと思います・・:sweat_drops:）


##**世にはばたけ、エンジニア男子！**

流行ったドラマ「逃げ恥」のひらま〇さんではありませんが、
2016年下半期、女子はメロメロになっているはずです！！！
女子の受け入れ態勢が整っている今こそチャンス。

まずは接点をもつこと、
これ大事です。



※上記すべて私の主観ですのであしからず:girl_tone1:
表示改善を始める前に~レンダリングブロック~

[前回](http://qiita.com/katsuyuki/items/69fcb3e5d08c0d66b972)の続きです。
表示改善を行うにあたってやるべきことというのはググったりするとすぐ出てくるのでわかるとは思いますが、ある程度絞られてきます。その中でも今回は「レンダリングブロック」というものに関して触れてみたいと思います。

##　はじめに
### そもそもレンダリングブロックとは
言葉の通りですが、ブラウザのコンテンツの表示処理がブロックされる現象です。
ブラウザがコンテンツを表示するためには基本的にHTMLの文字列をパース（解釈）する必要があります。その上さらにスタイルシートが定義されていれば、それらもパースして、HTMLをパースして構築したDOMに紐付けなければなりません。なのでブラウザは、CSSOM の構築が完了するまで、処理済みコンテンツのレンダリングを保留します。つまり、ページをレンダリングする前に、DOMツリーとCSSOMツリーを構築する必要がありますし、CSSOMツリーとDOMツリーを組み合わせて「レンダーツリー」を構築するようです。このレンダーツリーを使って、初めて描画処理が行われますという仕組みによって起こる現象と言い換えることができます。

＊CSSOM(CSS Object Model)とは、CSSに記述されているただの文字列をそれぞれの定義しているセレクタにもとづいてノードに分類し、ツリー状に構築したオブジェクトデータのことです。

## 仕組み
### ブラウザの主な構成要素
まずはそもそもブラウザがどのような役割で構成されているのか、以下の図がかなりわかりやすいと思うので載せておきます

![スクリーンショット 2016-12-24 18.10.46.png](https://qiita-image-store.s3.amazonaws.com/0/74580/c4268320-6f4f-b351-2a21-12f16b11ed03.png)
参照先：[ブラウザってどうやって動いてるの？](http://shanon-tech.blogspot.jp/2011/09/web.html)

| コンポーネント           |役割 |
|:--------------       |:------------------|
| ユーザインターフェース     | アドレスバー、戻る/進むボタン、ブックマークメニューなど。これらの全てはブラウザのメインディスプレイから分けられています。 |
| ブラウザエンジン          |           UI とレンダリングエンジンを呼び出します。 |
| レンダリングエンジン       |           要求されたコンテンツを表示する責任を負います。たとえば、リクエストが HTML であった場合、エンジンは HTML と CSS をパースし、その内容をスクリーンに表示します。 |
| ネットワーク          　　　　　　|  　        HTTP のような通信要求から呼び出されます。これは基本的にプラットフォームから独立した (つまり共通した) インターフェースと実装を持っています。 |
| UI バックエンド          |           コンボボックスやウィンドウのような、基本的なウィジェットの描画に用いられます。これはプラットフォームに依存しない一般的なインターフェースから生成されますが、最終的にはそれぞれの OS のインターフェースを呼び出します。 |
| JavaScript インタプリタ  |           JavaScript コードをパースし、実行するために用いられます。 |
| データストレージ         　　|           これはデータの永続化に用いられるレイヤです。ブラウザはクッキーのような永続するデータのフルセットをハードディスクに保存しなければなりません。新しい HTML の仕様 (HTML5) では、WEB データベースが定義されています。これはブラウザ上での完全な DB として機能します。 |


### レンダリングエンジン
上記フローのレンダリングエンジンというところが今回の議題です。レンダリングエンジンとはWEBブラウザにおいてレンダリングエンジンの担っているのはもちろんレンダリング、すなわちブラウザのスクリーンに要求されたコンテンツを表示することです。その表示の仕方が以下のフローになります。

![スクリーンショット 2016-12-24 18.43.31.png](https://qiita-image-store.s3.amazonaws.com/0/74580/9b4850ff-0078-1e66-10f3-ac6561d2c38a.png)

つまり文章だとこんな感じになります。

1. HTMLをダウンロード
2. HTMLパーサーを通じて機械言語に翻訳し、DOMツリーを作る
3. 1・2と並行して、スタイルシートをダウンロード
4. CSSパーサーを通じてスタイルルールを作る
5. DOMツリーとスタイルルールを合わせてレンダーツリーを作る
6. 描写する
7. 表示される

ここで冒頭で述べたこと、ページのレンダリングはDOMとCSSOMの二本柱で成立しているということです。CSSのダウンロードが完了しない限り、ブラウザはページのレンダリングを開始できないというのがわかると思います。
また上記フロー図の一つ一つの仕組みや説明は以下のURLがかなり細かく書いてあります。ここまでやると別物になってしまうので興味のあるかたは見ると良いかもしれません。
http://shanon-tech.blogspot.jp/2011/09/web.html

### そもそもなぜこんな仕組みになっているのか
表示の仕方のフローをもう一度見てみると、DOMとCSSOMの両方がレンダリングツリーの構築に必要です。つまりHTMLもCSSも、レンダリングブロックリソースです。HTMLの方が明白です。DOMがなければ、何もレンダリングすることはできません。しかし、CSSはそれほど明白ではありません。これ僕も思いました。cssないだけだとただちょっと崩れるだけなのではないか？だったらこの仕組み自体ちょっとおせっかいすぎないか？と。ただ以下の図を見てこの考えは改めました。

![スクリーンショット 2016-12-24 19.19.45.png](https://qiita-image-store.s3.amazonaws.com/0/74580/99b4940d-cf71-7d95-3996-9f62821f2fe0.png)


NYTimesのウェブサイトを例にCSSがあるバージョンとCSSがないバージョンです。これを見ていただけるとわかりますがCSSがない場合、ページは実質的に利用不可能です。右側のような状態は「FOUC（Flash of Unstyled Content）」と呼ばれており、いわゆるクソサイトを揶揄する表現らしいです。ユーザー体験を損なわないためにも、ブラウザは、DOMとCSSOMの両方が揃うまでレンダリングをブロックするというものらしいです。
Python3でformatメソッドによる書式化文字列の例

Python3のformatメソッドで書式化文字列を出力する例です．

# 基本的な使い方

{}で囲まれた部分が引数で置き換えられます．
{{，}}のように二重にすることで「{」，「}」自体を出力できます．

## コード例

```Python
"My name is {} {}".format("Taro", "YAMADA")
"My name is {0} {1}".format("Taro", "YAMADA")
"My name is {firstname} {lastname}".format(firstname="Taro", lastname="YAMADA")
"My name is {{{firstname}}} {{{lastname}}}".format(firstname="Taro", lastname="YAMADA")
```

## 実行結果
```
'My name is Taro YAMADA'
'My name is Taro YAMADA'
'My name is Taro YAMADA'
'My name is {Taro} {YAMADA}'
```

# 引数にタプル，リスト，ディクショナリを指定するとき

[ ] 内に添え字を入れれば出力できます．

## コード例

```Python
"My name is {0[0]} {0[1]}".format(('Taro', 'YAMADA'))
"My name is {0[0]} {0[1]}".format(['Taro', 'YAMADA'])
"My name is {0[lastname]} {0[firstname]}".format({'lastname':'Taro', 'firstname':'YAMADA'})
```

## 実行結果
```
'My name is Taro YAMADA'
'My name is Taro YAMADA'
'My name is Taro YAMADA'
```

# 表示する文字数(桁数)を指定するとき

「:」(コロン)の後に数字を入れます．
数字自体をformatメソッドの引数から指定することも可能です．

## コード例

```Python
"My name is {0:5} {1:7}".format('Taro', 'YAMADA')
"My name is {0:{2}} {1:{3}}".format('Taro', 'YAMADA', 5, 7)
```

## 実行結果
```
'My name is Taro  YAMADA '
'My name is Taro  YAMADA '
```

# 左揃え，中央揃え，右揃え


## コード例

```Python
"{:<10}".format('Python')
"{:^10}".format('Python')
"{:<10}".format('Python')
"{:.<10}".format('Python')
```

## 実行結果
```
'Python    '
'  Python  '
'    Python'
'Python....'
```
どう書くで見る ruby の便利機能

この記事は Ruby Advent Calendar 2016の20日目の記事のつもりで書いている。

Advent Calendar というものに参加するのは初めてなので緊張している。

実務ではあまり ruby を使っていないので、私は自分が主催しているどう書く( https://yhpg.doorkeeper.jp/ )での ruby の使われ方を書こうと思う。

思いついた順なので、ごちゃごちゃするけど気にしない方向で。

## Array#transpose

行列ではないものを`transpose`できる言語が他にあるかどうか知らないんだけど、`transpose`は便利。

x方向で処理するプログラムだけを用意しておいて、y方向の処理は、データを transpose したものを渡すことで済ますとか。

あるいは、平面的なものを回転するときに役に立つ。

2次元配列を`reverse`してから`transpose`すると時計回りに、`transpose`してから`reverse`すると反時計回りに回せる。

## Object#tap〜break

メソッドチェインをしていくなかで、パスしていくオブジェクトを $x$ から $f(x)$ に変更したい場合に使う。

`foo.略{略}.略{略}.tap{ |x| break f(x) }.略{略}`

のような感じ。

標準で存在して然るべきメソッドだと思う。

## Integer#divmod

除算の結果の商と剰余がいっぺんに手に入る。

```ruby
123.divmod(100) #=> [1, 23]
```

一次元的に表現された平面から座標を取るときに活躍する。
配列でもらえるので、そのままメソッドチェインに流し込んだりするのも便利。

## Array#minmax

min と max がいっぺんに手に入る。

```ruby
"helloworld".chars.minmax # => ["d", "w"]
```

こんな感じ。
これもそのままメソッドチェインに流すことが出来る。便利。

## String#ord Integer#chr

"a"〜"z" を 0〜25 などに変換する必要がある場面は多いので、`n=c.ord-?a.ord` のような計算はよく出てくる。
逆変換は、`c=(n+?a.ord).chr`。


## Integer#[ ]

`Integer`には`123[4]` のように呼べるメソッドがあって、トラブルの原因になりやすいような気もするけど、ビット演算が簡単にできるのはとても便利。
先の例は、`( (123 & (1<<4))==0 )? 0 : 1` と同じなので、

```ruby
123[4] # => 1
```

ちなみに、`Integer#[ ]=` はない。

## Array#& と Array#|

```ruby
[1,1,2,3,4,4] & [3,4,4,5] # => [3, 4]
[1,1,2,3,4,4] | [3,4,4,5] # => [1, 2, 3, 4, 5]
```

のように、`Array#uniq` の処理を含んでいることに注意。というか、そこもわかっていると便利。

## Math.log2 と Math.cbrt

Math.log2 は、 $\frac{\ln(x)}{\ln(2)}$ の計算をする。何に使うのかというと、場合の数。
なので、`Math.log2(x).ceil` のような感じで、`ceil`や`floor` とセットで使うと思う。

`Math.log(x)/Math.log(2)` のような計算と違って、誤差が出にくい。

```ruby
Math.log(2**29)/Math.log(2) #=> 29.000000000000004
Math.log2(2**29) #=> 29.0
```

そういえば、三乗根の `Math.cbrt` が便利だったこともある：

```ruby
64**(1.0/3) # => 3.9999999999999996
Math.cbrt(64) #=> 4.0
```

こちらも誤差が出にくい。

## オープンクラスの悪用

たとえば、平面上の座標を配列で表現しようと思うとする。
そんなとき、

```ruby
class Array
  def x; self[0]; end
  def y; self[1]; end
end
```

のような悪用をすると結構便利。仕事だと許されないと思うけど、どう書くならアリだと思う。

## Array#combination と仲間たち

`Array` には、`combination`, `permutation`, `repeated_combination`, `repeated_permutation` という4つの便利メソッドがある。

それぞれ名前のとおりなんだけど、実行結果は以下の通り：

```ruby
[1,2,3].combination(2).to_a
#=> [[1, 2], [1, 3], [2, 3]]
[1,2,3].permutation(2).to_a
#=> [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
[1,2,3].repeated_combination(2).to_a
#=> [[1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]]
[1,2,3].repeated_permutation(2).to_a
#=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
```

実際に書こうとすると再帰だったりして面倒になるので、これがあるのは本当に助かる。というか、出題者としては困るぐらい便利。



## 【宣伝】
現在、私が主催するオフラインリアルタイムどう書くでは

 * F01 https://yhpg.doorkeeper.jp/events/55292
 * E11 https://yhpg.doorkeeper.jp/events/55293

の参加者を募集しています。
UnityでWebGLゲームを作ってAWSのS3で公開してみるの回

[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val) の24日目は二回目のUnityでゲームを作るお話です。

いよいよ来ました。クリスマスイヴ！
というわけで、ゲームをプレゼントしちゃいます。

プレゼント内容は・・・
当社の1Fにて常設展示している**エキスビート**です。

![Title](https://qiita-image-store.s3.amazonaws.com/0/153241/f5545b34-769b-68a3-d1d0-8626c63aa429.png)

※「*記事は良いから遊ばせろ*」って方は、下記をクリックしてください。
→http://ekisbeeeat.com/

##エキスビートってなに？

[Unite 2016 Tokyo](http://japan.unity3d.com/unite/unite2016/)のMade with Unity ギャラリーで展示も行ったことがある鉄道ダイヤを利用したリズムゲームです。

今回は展示していたゲームをタッチパネル対応し、UnityでWebGL出力しています。

#UnityでWebGLに切り替える

Unityは対応するプラットフォームがとても多いです。
WindowsでMac用のバイナリを作ったり、Android用のapkを作ったり、結構なんでもできる感じなのですが、やはりWebGLはインストールが不要で、終了もブラウザを閉じるだけというお手軽感がいいですね。

では、早速、**Build Settins**にて**WebGL**を選択し、**Switch Platform**を押してWebGLのビルドができるようにします。

![Platform](https://qiita-image-store.s3.amazonaws.com/0/153241/5f90e8c9-8d24-b691-5cf3-46c451154f25.png)

ただ、アセットがいっぱい入っていると切り替えに時間がかかります。
こればかりは仕方ないですね。

![Hold On](https://qiita-image-store.s3.amazonaws.com/0/153241/faa57516-8707-6887-20cc-e1801a7b294d.png)

#完成したファイルをS3にアップする

サーバーについてはどこでも良いのですが、お手頃なAWSのS3を利用します。
ビルドして出来上がったindex.htmlなど、ディレクトリ構造もそのままですべてアップすれば動きます。

![S3](https://qiita-image-store.s3.amazonaws.com/0/153241/bc9b2282-a74b-cc4b-9332-78fbf957ca65.png)

メタデータなども自動で設定してくれるので、簡単ですね。

![Meta](https://qiita-image-store.s3.amazonaws.com/0/153241/b45d4508-ab80-95fe-5bae-8a10c51efc76.png)

今回はさらに独自ドメインを使うため、Route53にエイリアスレコードを追加しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/f12cc381-bf28-a6e3-dc1b-307389a60ae7.png)

#ブラウザで確認してみる

早速ブラウザで下記のサイトにアクセスします。
http://ekisbeeeat.com/

![Game](https://qiita-image-store.s3.amazonaws.com/0/153241/424cb9b8-9812-9e57-c31f-748e5cfbd302.png)

ChromeやFirefoxなどのPC用ブラウザで問題なく動きます。
ロードにちょっと時間がかかりますが、アプリのインストールとか考えるとお手軽でいいですね。
ただ、スマホやタブレットのブラウザはおそらく動かないです・・・

#遊び方

**タイトル**
STARTを押します。
タッチパネルがある場合は直接、マウスの場合はカーソルを合わせてクリックしてください。

**レベルセレクト**
左右の三角マークで駅や時間帯を選んでSTARTを押します。

**チュートリアル**
準備ができたらSTARTを押します。

**ゲーム画面**
電車が左右から来ますので、中央のボタンの位置に来たタイミングで押します。
タイミングがずれたり見逃してしまうとゲージが減って、0になるとゲームオーバーです。
正確に押していって高得点を狙ってください。
たまに猫型の電車(通称デンニャ)が来ます。
この電車は何度も押すことができて、さらなる高得点が狙えます。

**リザルト画面**
結果画面が表示されます。
高得点が出たらスクリーンショットを取ってツイッターなどのSNSへアップしていただけるとうれしいです。

#まとめ

今回はお手軽に遊んでいただけるようにWebGLでビルドしましたが、UnityはiOSやAndroidなどにも出力できるため、機会があればその紹介もしたいですね。

最後にもう一度アドレスを貼っておきます。
http://ekisbeeeat.com/

#おまけ

使用したアセットの一部も紹介しておきます。
・[Game Music Pack - SUITE](https://www.assetstore.unity3d.com/jp/#!/content/20997)
素晴らしい音楽が沢山入ったアセットです。
ありがとうございました。
【勉強会メモ】UnityでVR 3Dシューティングゲームを作ってみよう in Yahoo LODGE


[Unity+VRハンズオン勉強&体験会：クリスマスイブ特別企画　UnityでVR 3Dシューティングゲームを作ってみよう in Yahoo LODGE](https://atnd.org/events/83393)

基本的に[ハンズオン資料](http://saitamagame.com/study/vrShooting/VR_Shooting.zip)に沿って作業すれば完成するが、
VR表示させるところでエラーになる。

Unity5.5以降はデフォルトでVR（オキュラスリフト）編集機能が付いたかららしい。

- ハンズオン資料通りGoogleVRForUnity.unitypackageを使用する場合
そのままだとエラーを吐くので、consoleのエラーをダブルクリック。
`return false`を`yield break`にしてあげる。
https://developers.google.com/vr/unity/download

- デフォルト機能を使用する場合
https://docs.unity3d.com/Manual/VROverview.html
libssh2をインストールする（ソースからコンパイル） for CentOS8.0

cURL等で利用される、libssh2ライブラリ。インストールには若干の癖があるため、メモを兼ねて投稿します。
2018年2月現在のバージョンは「1.9.0」となります。

尚、インストールには事前にOpenSSLとzlibがインストールされていることが条件となります。
以下の投稿を参考にしてください。

[OpenSSL(1.0.x)をインストールする（ソースからコンパイル）for CentOS 7.2](http://qiita.com/shadowhat/items/68fd55b532c04b13acf5)
[zlibをインストール（ソースからコンパイル）for CentOS7.2](http://qiita.com/shadowhat/items/867d9e06bc42cf862b9a)

##事前準備作業
configureで行われるテストで、LD_LIBRARY_PATHを無視した動作が行われるため、ライブラリをあらかじめみえる位置に置いておく必要があります。

```bash:OpenSSL系ライブラリとincludeファイルの配置
ln -s /usr/local/ssl/lib/libssl.so /usr/local/lib/libssl.so
ln -s /usr/local/ssl/lib/libcrypto.so /usr/local/lib/libcrypto.so
ln -s /usr/local/ssl/include/openssl
```


##インストール作業

```bash:インストール
cd /usr/local/src
wget https://www.libssh2.org/download/libssh2-1.9.0.tar.gz
tar xvzf libssh2-1.9.0.tar.gz
cd libssh2-1.9.0

#OpenSSLのパスを指定
export LDFLAGS="-L/usr/local/ssl/lib"
export CPPFLAGS="-I/usr/local/ssl/include"
export CFLAGS="-I/usr/local/ssl/include"
./configure \
--with-openssl=/usr/local/ssl \
--with-libssl-prefix=/usr/local/ssl/include/openssl
make
make install
```

これで、/usr/local配下にインストールが完了します。
あとは、適宜cURL等のソフトウェアから/usr/local/libを参照することで利用可能です。
マウスホイールのスクロール量を調整して指が痛いを改善

マウスのボタンの真ん中にあってコロコロと回すことのできるマウスホイール。スクロールするときとか便利なんですが、最近、指の腹（指紋があるところ）が擦れるように痛いので何とかならないかという話です。

## 世の中の人は困っていないの？
Googleで「マウスホイールが痛い」と検索してみると何件かヒットするので、どうやら私だけではないようです。

何かヒントになればと検索結果を見てみると「指サックのようなものを付けて指を守る」や「トラックボールやペンに変える」といったものが上位にヒットしますが、どうもグッときません。

## ではどうする？
「私のように指の腹が擦れるように痛いのは、きっと沢山コロコロするからだろう」と考えてコロコロする回数を減らすことを考えてみました。

この方法の嬉しいところは「見た目が何も変わらない」「マウスはそのまま」なので、他の人に気づかれることがないところかなと思います。

## という訳で調べてみました

### Windows10
設定→デバイス→マウスとタッチパッド→その他のマウスオプションの「ホイール」タブに「１度に次の行数スクロールする」という項目があります。※「コントロールパネル」→「マウス」でもいけます。
この数値を増やせば少し回すだけで沢山スクロールするようになりますので、何回も何回もコロコロしなくてすみます。

### Visual Studio Code
[Visual Studio Code](https://code.visualstudio.com/)（略してVS Code）はマイクロソフトのテキストエディターで、WindowsだけでなくLinuxにも対応しているので最近お気に入りのエディタのひとつです。

Visual Studio Codeは[ファイル] → [基本設定] → [ユーザ設定]で様々なカスタマイズが可能です。調べてみるとマウスホイールのスクロールに関する項目として`editor.mouseWheelScrollSensitivity`というのがありました。
デフォルトでは1が設定されていますので、この数値を大きくすると1度回した時のスクロール量を調整することができます。私の場合は以下のように設定しています。

```
"editor.mouseWheelScrollSensitivity": 5
```

### Firefox
FirefoxではURLの欄に「about:config」と入力すると様々な設定を行うことができます。検索してみるとマウスホイールのスクロール量に関係しそうな項目がいくつかあるようです。
試してみたところ`mousewheel.default.delta_multiplier_y`の値を変更するとホイールのスクロール量のみ変更することができました。

私の場合、Linuxでは以下のように設定しています。※Windowsの場合は上記のコントロールパネルでのマウス設定がスクロール量も影響するようですので以下の設定では動き過ぎてしまようです。

```
mousewheel.default.delta_multiplier_y: 500
```

## で結果は？
もともと[Page Up]キーや[Page Down]キーで画面半分ずつスクロールのに慣れていたこともあって、違和感はなくすぐに慣れる事ができました。

最近、指の痛みも軽減されてきているので、それなりの効果はあったようです。あくまでも私の場合ですが…。