OmniAICreator/Qiita-1.07M huggingface dataset:
systemdでOS起動時に任意のプログラムを実行する

やりたかったこと：CentOS7起動時にChefを一回だけ実行したい
 
CentOS7からサービス管理がinitiscriptsからsystemdになっています。
initscriptsでは`/etc/rc.d/rc.local`にコマンドを書いておけばOSの起動時に実行してくれますが、systemdでは違うようなので（今更ですが）調べました。

CentOS7にも一応`/etc/rc.d/rc.local`もあるのですが、中身を見てみると以下のようになっています。

```
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
```

ということで、自分でsystemdのサービス作るかudevのルールを書くのが超おすすめみたいです。

書いた。
`/etc/systemd/system/chef-client.service`を配置して`systemctl daemon-reload`すればサービスに登録されます。

```/etc/systemd/system/chef-client.service
[Unit]
Description=run Chef Client during boot
After=network.target

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/bin/chef-client -z

[Install]
WantedBy=multi-user.target
```

ポイントとしては`Unit`セクションの`After`で先に起動しておいてほしいサービスを定義してます。
また、`Type`で起動プロセスの種類を書いておきます。`Type=simple`では、コマンドを実行したタイミングで起動完了となります。`oneshot`だと、指定したコマンドが完了したタイミングで起動完了・サービス終了と判断します。
コマンドが完了したあともサービスとしては起動状態として認識させたい場合に`RemainAfterExit=yes`を指定します。

`.service`ファイルの詳細はman pageでどうぞ。
http://www.freedesktop.org/software/systemd/man/systemd.service.html

起動設定、動作確認

```
[root@centos7-01 chef]# systemctl daemon-reload
[root@centos7-01 chef]# systemctl enable chef-client
[root@centos7-01 chef]# systemctl stop chef-client
[root@centos7-01 chef]# systemctl start chef-client
[root@centos7-01 chef]# systemctl status chef-client
● chef-client.service - Chef Client
   Loaded: loaded (/etc/systemd/system/chef-client.service; disabled; vendor preset: disabled)
   Active: active (exited) since Fri 2016-01-29 19:05:52 EST; 7s ago
  Process: 6397 ExecStart=/bin/chef-client -z (code=exited, status=0/SUCCESS)
 Main PID: 6397 (code=exited, status=0/SUCCESS)

Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] INFO: Starting Chef Run for centos7-01
Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] INFO: Running start handlers
Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] INFO: Start handlers complete.
Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] INFO: HTTP Request Returned 404 Not Found: Object not found:
Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] INFO: Loading cookbooks []
Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] WARN: Node centos7-01 has an empty run list.
Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] INFO: Chef Run complete in 0.053521516 seconds
Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] INFO: Running report handlers
Jan 29 19:05:51 centos7-01 chef-client[6397]: [2016-01-29T19:05:51-05:00] INFO: Report handlers complete
Jan 29 19:05:52 centos7-01 systemd[1]: Started Chef Client.
```

うまく動いているようです！
bitbucket > フリー版の使用継続方法が分かりにくい > 毎月自動更新のようです

https://my.atlassian.com/products/index
を見ると

> Bitbucket (Cloud) 5 Users (Monthly Payments)

という項目があり、サポート終了期間が「23 2 2016」となっている。僕のライセンスの場合は2月23日で切れるようだ。

その後の対応を調べているが、無料での使用継続についての記載が今のところ見つかっていない。

bitbucketのユーザがAtlassianのユーザに切り替えがあるという連絡が2015年12月9日にメールで連絡があったが、こういう準備をしていたのだろうか。

bitbucketで無料でプライベートリポジトリが作れなくなるとしたら（あるいはリポジトリ数に制限がつくようになるとしたら）、githubなど他のサービス含めて使うものを選択しなおすことになりそうだ。

サポートに問い合わせた。回答があればこちらに記載をする。

別途、ライセンス更新方法を探しているが、いまいちわからない。

ライセンス更新方法をもっと明確にしてほしい。

<hr>
(追記 2016/02/01)

以下のページに書いている条件を守る限り、そのまま使用できるという回答をサポートからいただきました。
https://confluence.atlassian.com/bitbucket/plans-and-billing-224395568.html
Powershell > stringが(NULLまたはempty)かどうか > if ( [string]::IsNullOrEmpty($scriptDir) ) { ... / Powershellでコピペ: コメント参照

```txt:動作確認
Windows 8.1 pro (64bit)
```

http://qiita.com/7of9/items/eac10683cdcca10b34f6
でParamにてフォルダ情報を渡せることが分かった。

次はフォルダ情報が渡されていないときにgracefullyに処理を終えるための対策として、stringのNULL, emptyチェック。

http://stackoverflow.com/questions/13738634/how-can-i-check-if-a-string-is-null-or-empty-in-powershell
にある回答のうちstringのstaticメソッドである
`[string]::IsNullOrEmpty($scriptDir)`
を使ってみた。

## code

```160130_nullStringCheck.ps1
Param(
[String]$scriptDir
)

function checkStringIsNull()
{
    if ( [string]::IsNullOrEmpty($scriptDir) ) {
        "NULL"
    } else {
        "$scriptDir"     
    }
}

function main()
{
    checkStringIsNull
}

main
```

```txt:実行結果
> powershell .\160130_nullStringCheck.ps1
NULL
> powershell .\160130_nullStringCheck.ps1 -scriptDir C:\ZyboDev
C:\ZyboDev
```

動いた。これでいこう。

それにしても、PowerShellのウィンドウ内の文字列をコピペできない問題はどうにかしたい。Qiitaの記事にするために再度入力するのは面倒だし、打ち間違いもしそうだ。
Powershell > フォルダ情報を渡す > Param使用

```txt:動作環境
Windows 8.1 pro (64bit)
```

ps1をバックグラウンドで実行した時に、実行場所がスクリプトのあるフォルダから変わってしまう問題の対応中。

なんらかの方法でフォルダ情報を渡さないといけない。その一つとしてParamを使用してみる。 

参考 https://technet.microsoft.com/ja-jp/magazine/jj554301.aspx

## Code

```160130_parameter.ps1
Param(
[String]$targetDir
)

function test_parameter()
{
    $targetDir
}

function main()
{
    test_parameter
}

main
```

```txt:実行例
> powershell .\160130_parameter.ps1 -targetDir C:\ZyboDev\zybo_160112_baseDesign
C:\ZyboDev\zybo_160112_baseDesign
```

フォルダ情報を渡せた。

日常的に使う場合、フォルダを指定したバッチファイルを使うことになるのだろうか。

スコープがどれくらい広いのかは今のところよくわかっていない。
kintoneでのデータリカバリ勘所~標準機能で出来ること出来ないことを切り分けておく

**※2016/1/30時点での仕様を元に記事にしています**

#つい手元が滑って・・・#

一括削除の設定を有効にしている場合、ついうっかり一括削除をしてしまったりとオペレーションミスをしてしまうことがありがちです。

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/76660/b665959b-c016-aa37-6788-a8d5b994cb17.png)

そんな時、過去にバックアップを取ってあったCSVファイルからデータの復旧（リカバリ）を行いたい所ですが、総ての項目がCSVファイルからリカバリーできるわけではありません。

#リカバリーできない主な項目#

- 添付ファイル
- サブテーブル
- レコード番号
- 作成者
- 作成日時
- 更新者
- 更新日時
- 作業者
- コメント

添付ファイルやテーブルは、復旧できないと結構困る場合があります。
手打ちで復元・・・ゾッとしますね・・・＾＾；

#対応法#

添付ファイルとサブテーブルをどうしても復元したい場合は・・・kintone API経由で復元するのが良いかと思います。

添付ファイル→[ファイルアップロードで必須となる3つの手順|cybozu.com developer network](https://cybozudev.zendesk.com/hc/ja/articles/200724665)

サブテーブル→[テーブルデータをCSVでインポートしてみよう！|cybozu.com developer network](https://cybozudev.zendesk.com/hc/ja/articles/204972070-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92CSV%E3%81%A7%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-)

もしくは[kbackup](https://kb.kintoneapp.com/)などの連携サービスを使う、などですね。

-----
参考：入出力できるデータの一覧[kintone]
https://help.cybozu.com/ja/k/admin/import_export.html

参考２：フィールドの制限[kbackup]
https://kb.kintoneapp.com/user/formdescription.html
SmartAR for Unityの補足情報とプラクティス

#はじめに
本ドキュメントでは、SmartARをアプリケーションに組み込むことを想定して記述しています。
そのため、技術部分以外、正確性に欠ける表現や、私個人の主観が含まれています。あらかじめご了承ください。

#SmartARとは
> SmartAR®は、ソニーが従来から研究開発を進めてきた「物体認識技術」と、ソニー独自の「3D空間認識技術」を統合した高機能・高精度なARエンジンです。 ARにとって重要な初期認識性能、高速追随性能に優れ、また、3D空間認識により三次元構造を認識し、空間全体を利用した大規模でリアルなARを実現することが可能です。

[Cybernet社HP](http://www.cybernet.co.jp/ar-vr/products/smartar/)より


尚、SmartAR for Unityの使用事例としては、

デジアイAR
http://jp.rohto.com/digieye/ar/

AAAR（一般販売前のSmartAR SDKバージョン）
http://avex.jp/aaa/special/aaar/

などがあります。

#認識モードに関する補足
##SceneMapping
SceneMappingは、検出したマーカーの**中心座標を原点**にして空間認識を行う機能です。
周囲環境の特徴点を取り込みながら自己位置推定を行うので、**十分に特徴点を検出した状態に限り**、
カメラ入力にマーカー画像が含まれていなくても自己位置推定が可能です。

###SceneMappingのメリット
SceneMappingでは、マーカーの特徴点に加えて周囲環境の特徴点も取り込むので、
安定性が高く、**定位感**があるのが特徴です。
そのため、dictoolで提示されるscoreが多少低くても（70点以下などでも）、ある程度は安定した動作感が得られます。

###SceneMappingのデメリットと対応
動作させていくにつれ、結果的にマーカーよりも周囲環境の特徴点の影響が強くなります。
そのため、**マーカーを動かしてもAR重畳物が動かない**現象が発生します。
また、**最初の平面推定に失敗していた場合、それを検出するのが困難**です。

マーカーを動かしてもAR重畳物が動かない現象については、そもそも認識後にマーカー自体を動かさないようにアナウンスする、
マーカーが動いても問題ないデザインにする、などの対応が考えられます。
最初の平面推定に失敗していた場合については、アプリケーション内に、**ユーザが任意のタイミングで空間をリセットする機能**を入れておくことが推奨されます。
（Unityであればシーン自体を読み直すのが一番手っ取り早いです）

##HFG/VFG
HFGとVFGは、完全マーカーレスでARを実現させる（周囲環境の特徴点のみで空間を構築する）モードです。
ただし、HFGとVFGがSceneMappingやTargetTrackingの"認識"に相当する状態に遷移するには、**十分な特徴点の取り込み**が必要です。

具体的には、カメラ（端末）を回転させず、その場でゆっくり上下左右に移動させる動作が必要になります。

###HFG/VFGのメリット
完全マーカーレスのため、**印刷物を用意する必要がない**のが最大のメリットです。

###HFG/VFGのデメリットと対応
**ユーザに謎の動作を強要する**ことと、物理サイズの基準がないので、**AR重畳物の大きさをコントロールできない**ことがデメリットです。
アプリケーション側でしっかりとしたチュートリアルを提示する、大きさにこだわらないものを表示する、
ユーザが大きさを変えられるようにするなど、フォローをしっかり行うことが求められます。
// 「完全マーカーレス」はロマンですが、使いどころが難しいです。

#SmartAR Controllerのプロパティに関する補足
##Scene Mapping Init Mode
**Recogniton ModeをRECOGNITION_MODE_SCENE_MAPPINGに設定した際のみ有効**です。
RECOGNITION_MODE_TARGET_TRACKINGに設定されていると無視されます。

##Search Policy
マーカーを**FAST＝処理速度優先でざっくり探す**か、**PRECISIVE＝じっくり探す**かの設定です。
通常はPRECISIVEで問題ないと思いますが、Targetsの数が8～10個を超えるようであればFASTにする選択肢もありだと思います（体感的に）。

##Dense Map Mode
Dense Map Modeとは、**特徴点をたくさん登録するモード**です。SceneMappingで使用します。
SmartARの**特徴点の最大登録数は512個**なので、広い範囲を空間認識させる際には不向きです。
卓上のARなど、局所的な空間でロバストネスを確保したい場合には有効にするといいかもしれません。
// とはいえ、この機能の恩恵をあまり体感できたことはありません……

#その他
##Targetsに登録するFileName
辞書ファイルの拡張子は*.v9.dicですが、UnityEditor上だと.dicが省略されて表示されます。
この問題については、内部でちゃんと.dicが付いていなかったら勝手に付けてくれるので気にする必要はありません。

**StreamingAssetsフォルダのファイル名をコピペすれば問題ない**です。

##辞書のスコア
大体80点以上が推奨されますが、SceneMappingに限り、検出さえできれば周囲環境で自己位置推定はフォローできるので、
**40点や60点などでも、使えないことはない**です。
さすがに20点を切ってくると厳しいですが、**スコアは信頼せずに体感で調整する**と意外といけます。
もちろん、辞書のスコアが高いことに越したことはないです。

##SceneMappingの平面推定を安定させるには
辞書ツールを使用する際、検出した特徴点を描画したppmファイルを出力する-outimageオプションがあります。
このオプションをつけて出力すると、どのコーナーポイントが認識に使われるかを確認することができます。

出力されたppmファイルの**赤丸が満遍なく付いていると、平面推定が安定します**。
逆に、辞書画像矩形の**対角に赤丸が不足していると、平面推定に失敗しやすくなります**。
Pythonで日本語形態素解析

Pythonで日本語形態素解析をしてみようと思います。
APIがYahooから出ているのでそれを利用していきます。

http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html

まず、POSTする際に必須であるパラメーターは
・appid
・sentence
・results
の３点です。
詳しくPOSTしたい人はパラメーター追加してください。

appidはYahooで登録すれば取得できます。
sentenceは形態素解析する本文です。
resultsはレスポンスの形式指定用です。

```py:形態素解析.py
#coding: utf-8

import requests
from xml.etree.ElementTree import *

def POST(body):
	request_URL = "http://jlp.yahooapis.jp/MAService/V1/parse"

	parameter = {'appid': 'Your appid!',
				'sentence': body,
				'results': 'ma'}
	r = requests.get(request_URL, params=parameter)
	yield (r, r.text)

def XML_parse(body):
	elem = fromstring(body)
	for e in elem.getiterator("{urn:yahoo:jp:jlp}surface"):
		print e.text

if __name__ == '__main__':
	for response in POST(body="今日はいい天気ですね"):
		r = response[0]
		text = response[1]
	XML_parse(text.encode('utf-8'))#encodeしないとUnicode-error
```
Mac OS X > 10.8.5からEl capitanへのアップデート > バグリストへのリンク / 使用ソフトの対応検討

# 編集中


```txt:動作環境
Mac OS X 10.8.5
```

Chromeを立ち上げたら以下のメッセージが出た。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c8d7146b-12fe-e93f-6ec9-cfc28cc05b1e.png)

Mac OS Xを10.8.5からバージョンアップする時期が来たかもしれない。

問題はEl Capitanは大丈夫か？ということ。

これまでアップデートしなかった理由として、<font color=red>アップデートした時に自分が日常的に使っている機能に不具合が含まれたり使えなくなったりする</font>のが心配だったから。

実際に10.8.5から10.9へ移行しようとした時に ideone がまともに動かなくなった。カーソル位置の5つ右に入力キーが打ち込まれるというバグが長い間残っていた（店頭のMacで確認）。僕は曲芸師ではないので、そういう使い方はできない。

Marvericks や Yosemite の不具合情報を時々見るが、自分が使いそうな機能の不具合が残っていたりで結局10.8.5のままとしてきた。

外付けHDDにインストールして試す手も検討する。

自分が一番に使う道具は整備を続けないといけないが、その整備のタイミングは十分に検討しないといけない。


El capitanの最新版のバグ一覧情報をまずは探そう。


## bug list link

- [11 Common OS X El Capitan Problems & How to Fix Them
](http://www.gottabemobile.com/2016/01/18/common-os-x-el-capitan-problems-fixes/)

- [Apple Support Communities](https://discussions.apple.com/community/mac_os/os_x_el_capitan)


## 使用ソフトの対応検討

### VMWare Fusion 6.0.4
- [Yosemite(OSX10.10) でVMware Fusion6を使う](http://bellx2.hateblo.jp/entry/2014/10/23/121736)
  - 6.0.5でYosemiteでは動いた。El Capitanは?
  - 最新版は[6.0.6](https://my.vmware.com/jp/web/vmware/info/slug/desktop_end_user_computing/vmware_fusion/6_0) > 2015-04-23リリース
  - El Capitan 1stリリース > 2015-09-30

[Fusion 8](http://store.vmware.com/store/vmwjapan/ja_JP/pd/productID.323689500)のアップグレード版を買うことになるのか?

- 6,290円
- 技術者全員解雇（という話が出ている）会社の製品をそのまま使い続けていいかは悩む
- Parallelsは過去にトライしてうまく動かない状況に出たので、クリティカルなアプリとしては使うのは躊躇する

### astah think

- 最近はmindmupばかり使うようになったので、このソフトの動作は低優先度
- ローカルにインストール、かつ追加のインストールが必要なのでブラウザベースのソフトの方を選択するようになった

### KeyRemap4MacBook

VMWareで動かしているゲストOSのキー対応はこれが鍵をにぎっているため、これがトラブルと結構問題だ。

[@hasenさんのツイート](http://hasen.hatenablog.com/entry/2015/09/13/123043)
> てかまだKeyRemap4MacBookのままやから，これを更新しよ
...

https://pqrs.org/osx/karabiner/index.html.ja

> OS X 10.11, 10.10, 10.9用
> Karabinerはバージョン9.3.0までKeyRemap4MacBookという名前でした。

### Unity

これが一番ひっかかりそうだ。

現在 5.1.3-f1を使っている。これより後のバージョンにアップデートした時にいくつかの不具合に遭遇したので戻したという経緯がある。さらに他のバージョンでもstackoverflowやanswers.unity3dなどでよくないように見ている。

一方で、El Capitan上で5.1.3-f1が動く可能性が低いと思われるのでバージョンアップ版使用を検討しないといけない。

- [Android > Unity 5.3.1での問題](http://answers.unity3d.com/questions/1131072/can-not-pass-unity-splash-screen-on-android-when-f.html)

Unityのどのバージョンが一番安定するか調べないといけない。

5.3.2p1と5.3.1p4はどちらが安定しているのだろうか?
- https://unity3d.com/jp/unity/qa/patch-releases

### その他

- ideone > 店頭で試そうと思うが、しばらく行く時間がない
   + 問題はsyntax highlightをON状態で、入力場所とカーソル位置が一致しているかどうか
   + 近場のEl Capitanユーザに見せてもらおう
- Sublime Text 2 > 問題ないだろう
- Evernote > 問題ないだろう
- LTSpice > 未調査
- Fritzing > 未調査
- Microsoft Remote Desktop > 未調査
- Android Studio > Unity関連で必要 > 未調査
- Skitch > 未調査
- Caffeine > 未調査
- coconutBattery > 未調査
- Cyberduck > 未調査
技術英語 > with an air of reserve / IMHO: in my humble opinion


@ LOE > October 12, 2012
http://loe.org/shows/shows.html?programID=12-P13-00041
> “Outsourcing Hot Air.”

airと言うキーワードで思い出したのは

<font color=red>with an air of reserve</font>

http://ejje.weblio.jp/content/reserve+air
> 遠慮がちな様子[態度]で

<hr>
元々は13年くらい前に「遠慮がちに、というのはどう英訳するのか？」という興味で調べたが、実際にこの上記フレーズを口に出している場面にはその後出くわしていない。あえて「遠慮がちに」と自分で口に出す人はいないからかもしれない。
小説などではでくるかも。途中で読むのをやめたアシモフの Foundation などにはあるかもしれない。

代わりに最近stackoverflowのやり取りなどで目につくのは

<font color=red>IMHO
In my humble opinion,</font>

http://ejje.weblio.jp/content/in+my+humble+opinion
> 私の控えめな意見では

意見を強く主張していると思われないようにしたい意図で使われているようだ。
Vuforia5.0.10 + Unity5.3.1f1 + Xcode7.2でMobile Movie Texture2.1.2を使う

# 何がしたかったか
**iPhone**上で、**AR**で、**動画再生**をしたかったのですが、
なかなか手ごわい部分があったので、解決方法を含めて共有します。

# 使用したライブラリについて
- Unity
これは皆さんお馴染かと思いますので、説明は割愛します。
http://japan.unity3d.com/

- Mobile Movie Texture(MMT)
モバイル端末上で動画再生するための有料のUnityAssetです。
https://www.assetstore.unity3d.com/jp/#!/content/2449

- Vuforia
PTC社が提供しているAR向けライブラリです。Android/iOS両方で手軽に使用できるARライブラリです。
ウォーターマーク入りの無料版から、有料プランまで揃っています。
https://developer.vuforia.com/

***
ARやモバイル端末上での動画再生を実現させるには、他にもいくつかオプションがありますが、
本稿では上記のアセットを利用した際に陥りやすい問題と、その解決方法について記載します。

#VuforiaとMMTを共存させる
プラグインに含まれる**VuforiaNaviveRendererController.mm**と、
**MMTAppController.mm**をマージする必要があります。

マージの情報は、MMTのフォーラムにも投稿がありますが、古いバージョンに対するもので、
そのままコピペしても動作しません。

##マージ方法
1. VuforiaNativeRendererController.mmを削除
2. 残った方に以下のソースをコピペ

```
#import <UIKit/UIKit.h>
#import "UnityAppController.h"
#import "VuforiaRenderDelegate.h"

extern "C" void MMTUnitySetGraphicsDevice(void* device, int deviceType, int eventType);
extern "C" void MMTUnityRenderEvent(int marker);
extern "C" void VuforiaRenderEvent(int marker);

@interface MMTAppController : UnityAppController
{
}
- (void)shouldAttachRenderDelegate;
@end

@implementation MMTAppController
- (void)shouldAttachRenderDelegate;
{
	self.renderDelegate = [[VuforiaRenderDelegate alloc] init];
	UnityRegisterRenderingPlugin(NULL, &VuforiaRenderEvent)
	UnityRegisterRenderingPlugin(&MMTUnitySetGraphicsDevice, &MMTUnityRenderEvent);
}
@end

IMPL_APP_CONTROLLER_SUBCLASS(MMTAppController)
```

今回はVuforiaNativeRendererController.mmを削除して
MMTAppController.mmに記述していますが、どちらでも構いません。
（その場合、適宜修正してください）

#armv7をビルドターゲットから除外する
全くスマートじゃない解決方法ですが、libtheorawrapper関連がビルド時にエラーを吐くので、
とりあえずarmv7をビルドターゲットから除外することで回避できます。

恐らく、もっとちゃんとした解決方法があると思いますので、ご存知の方はフォローお願いします……

#VuforiaのPlugin設定
Vuforiaを使用したプロジェクトでは、UnityEditor上で以下の作業を行わないと
CodeSign Failedのエラーで、Xcode上のValidateやExportに失敗します。
##Platforms for pluginの変更
1. UnityEditorのProjectタブからPlugins > QCARWrapperを選択
2. Inspector上でAny PlatformになっているのをEditor + Standaloneに変更する

***
上記の対応を行うことで、実機動作が確認できました。
PageSpeed Moduleのバージョン表記を隠す

##PageSpeed Moduleのバージョン表記

Google謹製のページ高速化ツール「[PageSpeed Module](https://developers.google.com/speed/pagespeed/module/)」は応答ヘッダにバージョンを追加する

>X-Page-Speed : 1.9.32.6-7321

![X-Page-Speed.PNG](https://qiita-image-store.s3.amazonaws.com/0/107155/621d75aa-f53f-dba3-d080-3f6392c88a6a.png)

##隠す方法
ヘッダ自体を消す方法はなし

###Apacheの場合
```
ModPagespeedXHeaderValue "Powered By mod_pagespeed"
```

###Nginxの場合
```
pagespeed XHeaderValue "Powered By ngx_pagespeed";
```
Rust環境構築(2016)


もう何度目かわからないが、またRustをやりたくなったので環境を作ることにした。

- multirustを入れる
- そのために昔入れてたrustを削除
- atomで補完できる環境を作る

## 昔インストーラからインスコしたことがある人向け

mulitrustで邪魔なので消す。multirustが消せと言ってくる。興味あるが使ってない人は1.0あたりが入ってると思う。

```sh
curl -s https://static.rust-lang.org/rustup.sh | sudo sh -s -- --uninstall
```

消し方探してたらここで言及されてて気づいた。 https://github.com/rust-lang/rust/issues/20283

## multirust

```sh
curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh
```

途中なんか訊かれたが  y と答えた。

デフォルトだとstable を勝手にインストールするっぽく、今1.6.0が入った。

## プロジェクトを作成する

```sh
~/sandbox $ cargo new myapp --bin
~/sandbox $ cd myapp/
~/s/myapp (master) $ ls -l
total 16
drwxr-xr-x   6 mizchi  staff   204B  1 30 02:42 .
drwxr-xr-x  31 mizchi  staff   1.0K  1 30 02:42 ..
drwxr-xr-x   9 mizchi  staff   306B  1 30 02:42 .git
-rw-r--r--   1 mizchi  staff     7B  1 30 02:42 .gitignore
-rw-r--r--   1 mizchi  staff   109B  1 30 02:42 Cargo.toml
drwxr-xr-x   3 mizchi  staff   102B  1 30 02:42 src
~/s/myapp (master) $ cargo run
   Compiling myapp v0.1.0 (file:///Users/mizchi/sandbox/myapp)
     Running `target/debug/myapp`
Hello, world!
```

とりあえず実行可能なことを確認。

## Atom

まあ好きなエディタを使ってくれという感じだが、自分はAtomがメインなのでAtom環境を作る。

基本的には http://qiita.com/nacika_ins/items/044c87fd8bd1d7c41191 を1.6.0に変えて実行した。

いじった点

- apm uninstall rust-ctags は deprecated
- 補完は出るようになったが、racerの警告出続けてうっとおしかったので `~/.atom/packages/racer/lib/racer-client.coffee` の `atom.notifications.addWarning "racer returned a non-zero exit code: #{code}\n#{@last_stderr}"` をコメントアウトした。racerのビルド環境がおかしいのかもしれない。

## 参考

http://gifnksm.hatenablog.jp/entry/2015/05/16/235043
OS X、Chrome - 悪質なポップアップ広告を除去する。

# 環境
- OS X 10.11.3
- Google Chrome Version 48.0.2564.97 (64-bit)

# 経緯
-「Free *」という英語のサイトでうっかりと間違ったダウンロードボタンを押して、怪しいアプリがインストールされてしまった。

# 症状
Chromeを立ち上げ、例えばQiitaを開くと直後にいかにも偽物もカスタマーサポートページもしくは、いろんな商品の写真が閲覧中の画面上に表示される。

# 初期に確認したこと

## Chrome > Preferences > Extensions
- 何もインストールされていなかった。

## ~/Applications/
- 怪しいアプリを削除。　症状に変化なし。

## ActivityMonitor
- 怪しいプロセスを削除。　症状に変化なし。

## Chromeアンインストール
- 再度インストール。
　症状に変化なし。

# 学んだこと

## `~/Library/LaunchAgents/`に怪しいファイルがないか？

```bash
$ ls ~/Library/LaunchAgents/
```

## `~/Application Support/`に怪しいファイルがないか？

```
$ ls ~/Library/Application Support/
```

## ディレクトリに特定のマルウェア名が含まれているか確認

```
$ cd ~/Library/Application Support/Google/Chrome
$ grep -r '.' -e '<MALWARE_NAME>'
```

## トロイの木馬の一種、"Flashmall" trojan

- このリンクが大変参考になった。（[手がかりリンク](https://discussions.apple.com/thread/6776161?start=135&tstart=0)）

```
$ ls ~/Library/LaunchAgents
```

- トロイの木馬の一種、"Flashmall" trojanらしい。
- ~/Library/LaunchAgentsディレクトリ内に怪しいplistが存在していた。
- 怪しいのを削除したら即、治った。

![F37E9B15-05A8-48D6-A19E-BFDB744F45C5.png](https://qiita-image-store.s3.amazonaws.com/0/82804/2b56f95a-0eb1-e21b-7bcb-f0ce09ec2e4c.png)

![84AA624C-1D8D-4AE4-9250-D573FB75AA08.png](https://qiita-image-store.s3.amazonaws.com/0/82804/9d6fb713-5058-9bb4-4b18-8c7018c0ee8a.png)

## spigot

```
/Users/<USERNAME>/Library/LaunchAgents/com.spigot.SearchProtection.plist
/Users/<USERNAME>/Library/LaunchAgents/com.spigot.ApplicationManager.plist
/Users/<USERNAME>/Library/Application Support/Spigot/
```
- http://www.thesafemac.com/arg-spigot/
- http://apple.stackexchange.com/questions/171941/yahoo-search-has-hijacked-all-my-internet-browsers-safari-firefox-how-to-rem


以上。
標準入力を2箇所以上に同時出力したい

# 一時ファイルを作りたくない
例えばこんなデータが`hoge`コマンドから出力されるとして、

```text:
# comment line 1
# comment line 2
code line 1
code line 2
# comment line 3
code line 3
```
これを2つのコマンドに入力したい場合、

```zsh:一時ファイルを使う
$ hoge > source.txt
$ grep -v \# source.txt > code.txt
$ grep \# source.txt > comment.txt
```
のように一時ファイルを作ればいいのだが、こんなことをせず2箇所に直接`hoge`の出力を渡したくなった。
出力の分岐といえば`tee`コマンド。本来の出力先はファイルだが、これをストリームに出力するようにしてあげよう。

# 名前付きパイプ
名前付きパイプで`code.txt`と`comment.txt`を同時に得る方法。

```zsh:名前付きパイプを使う
$ mkfifo named-pipe
$ (grep -v \# < named-pipe > code.txt) &
$ hoge | tee named-pipe | grep \# > comment.txt
```

# プロセス置換
プロセス置換を使う方法。名前付きパイプを使わなくてもいいなら簡素に書けていい感じ。

```zsh:プロセス置換を使う
$ hoge | tee >(grep -v \# > code.txt) | grep \# > comment.txt
```

# もっと同時出力する
teeは複数のファイルに出力できるので3箇所以上に流すこともできる。

```zsh:名前付きパイプで
$ mkfifo named-pipe1 named-pipe2
$ (grep -v \# < named-pipe1 > code.txt) &
$ (grep \# < named-pipe1 > comment.txt) &
$ hoge | tee named-pipe1 named-pipe2 > source.txt
```

```zsh:プロセス置換で
$ hoge | tee >(grep -v \# > code.txt) >(grep \# > comment.txt) > source.txt
```

便利〜
word2vecの環境構築

#始めに
pipでバージョンを指定してインストールできることすら知らなかった情弱が書いた記事です。お気をつけ下さい。

#pythonの環境構築が上手く行かなかった
サーバが2つ稼動していて、片方の環境に合わせてもう片方のpythonの環境(主にword2vec)を構築したかったが、上手くいかない。
例)pip installが上手くいかない、ベクトル空間を読み込もうとするとUnicodeEncodeErrorが出る

どうやらgensimとword2vecの相性が悪かったらしい。

#pipでバージョン指定
pipでバージョンを指定したら一発だった。

```lang:元サーバ
pip list | grep word2vec #バージョンを確認
pip list | grep gensim
```

かみ合ってる環境が`word2vec (0.5.1)`と`gensim (0.10.1)`だったのでこれに揃える。

```lang:新たに環境を整えたいサーバ
pip install gensim==0.10.1
pip install word2vec==0.5.1
```
Robolectricで GooglePlayServiceいりアプリをテストする

Google Play Serviceが入ったアプリを Robolectric (正確には Robospock) でテストしようとしたらハマったのでメモ。

追加: 偉そうに長々書きましたが、正しくは [`RobolectricGradleTestRunner`](https://github.com/robolectric/robolectric/blob/master/robolectric/src/main/java/org/robolectric/RobolectricGradleTestRunner.java) や [`GradleRoboSputnik`](https://github.com/robospock/RoboSpock/blob/64b88b11abd895be25bf13af03a28a34934bbb3b/robospock/src/main/java/org/robospock/internal/GradleRoboSputnik.java) を使うのがいいのかもしれません。でも一々 `@RunWith` で指定するのは面倒そうな気もする。

# 問題1:正しい AndroidManifestを見つけてくれない
GooglePlayServiceを使うには AndroidManifestに metaタグで versionを仕込まなくてはいけません。でも、正しい AndroidManifestを見てくれないと、それが定義されてないのでテストの初期化で以下のように言って落ちます:

```
java.lang.RuntimeException: java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist.  You must have the following declaration within the <application> element:
```

# 問題2: `@integer/google_play_services_version` を見つけてくれない
単純に [`@Config`](http://robolectric.org/configuring/) とかで `src/main/AndroidManifest.xml` を指定すると今度は次のようなエラーが出ます。

```
Caused by: java.lang.NullPointerException
	at org.robolectric.manifest.MetaData.init(MetaData.java:55)
	at org.robolectric.manifest.AndroidManifest.initMetaData(AndroidManifest.java:343)
```

これは、`google_play_services_version` が `src/main/res` 以下ではなく、Google Play service の aarで定義されてるためです。そのため、参照を解決できなくて NPEになるようです。

# 解法: Gradleが処理してくれた manifest, resourceを使う

これらの問題を解決するには実際の Android端末で起こることの真似をして、Robolectricが APKに含まれるのと同じファイルを参照するようにすればいいのです。具体的には manifest, resource, assetのディレクトリを正しく指定してやればいいのです。

また、こうすればそれ以外の問題 (flavorごとにレイアウトの違いもテストしたいとか) も解消できて一挙両得です。

しかしそれらのファイルが生成されるディレクトリは buildTypeや flavorで違うので `@Config`でソース中に指定するわけにも行きません。というわけで、お馴染みの gradle hackで乗り切ります。

```
testOptions {
        unitTests {
            all {
                // Google Play Service requires meta tag in manifest
                // and merged resource referred by it.
                def words = it.name.split("(?=[A-Z])")*.toLowerCase()
                def variantDir = "${words[1]}/${words[2]}"
                def dir='build/intermediates'
                def manifest="${dir}/manifests/full/${variantDir}/AndroidManifest.xml"
                def resourceDir="${dir}/res/merged/${variantDir}"
                def assetDir="${dir}/assets/${variantDir}"
                jvmArgs "-Dandroid.manifest=${manifest}"
                jvmArgs "-Dandroid.resources=${resourceDir}"
                jvmArgs "-Dandroid.assets=${assetDir}"
            }
        }
    }
```

これで無事ただしい Manifestやらを読んでくれるようになりました。
ちなみに、build variantごとに applicationIdを変えてる場合、やや面倒なことになるというのを聞きましたが、よくわかっておりません。

# 注意書き

ちなみに自分は Robospockで試しました。多分素の Robolectricでも使えると思いますが、試してませんので各自注意してお使いください。

また、書いていて気が付きましたが、上の例は flavor と buildTypeを組み合わせている例です。flavorを使っていないとちょこっと書き換えないと行けないとは思います。すみません。
Webを使った新人研修　～Linuxコマンド編 - psコマンド～

######[Webを使った新人研修　～Linuxコマンド編～](http://qiita.com/fujisystem/items/63b787ac71e9bdcaf3f6)

#psコマンド 「プロセスを一覧表示する」
manによると、「現在実行されているプロセスのスナップショットを表示する。」
となっていますが、非常によく使うコマンドのひとつと思います。
まずは、「実践」してみましょう。

##実践する
LinuxマシンのエミュレートされているWebページを開きましょう。
・jor1k
http://s-macke.github.io/jor1k

早速「プロセスを一覧表示」してみましょう。
左側の黒いウィンドウで「ps aux」と入力して、エンターキーを押します。
```ps aux```

![psaux.png](https://qiita-image-store.s3.amazonaws.com/0/110729/3d897d1b-5fc9-c3da-3208-c498e667cf1b.png)

上記のように現在実行されているプロセスの一覧が表示されるはずです。
ここで、このコマンドの簡単な解説を入れると良いと思います。

##解説
学習の前提として、「プロセス」についての説明から行います。
[プロセス - wiki](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)
基本的には、「Linux上で動作中のプログラムのこと」と説明します。

大別して、プログラムの実行パターンは
・一度実行して完了するタイプ
・起動して常駐するタイプ
の２種類がある旨を説明します。

Man page of PS
https://linuxjm.osdn.jp/html/procps/man1/ps.1.html

auxオプションと表示結果のPIDなどについての簡単に解説します。

実際このpsコマンドはどのような場面で使うことが多いのか、例題を示して記憶の定着を図ってみます。

##例題
sleepコマンドをバックグラウンド実行して、そのプロセスを発見して、killする。

```
sleep 30 &
ps aux
kill {PID}
```

「sleep 30 &」が上述した、「起動して常駐するタイプ」のプログラムを模したコマンドになります。
killコマンドは、そのプロセスを終了させるコマンドです。PIDでプロセスを指定してkillしています。
ここではフォーカスをpsコマンドに絞って説明し、sleepとkillコマンドについては、詳細に説明しないようにしたほうが良いと思います。

余談としてですが、killコマンドの危険性も伝えます。
誤って違うプロセスをkillしてしまうと環境を壊してしまう可能性があります。
（ipc資源を回収できなくなったりといった問題が発生する可能性）
危険性が低いコマンド
・ps
・pwd
・ls
・cd

危険性があるコマンド
・mkdir・rmdir
・cp
・mv
・rm
・shutdown

危険性があるコマンドは、「指差し確認をする」「読み上げさせる」「クロスチェックする」などを今のうちから、意識付けを行うことで後々泣くことにならずに済むと思います。

～本日はここまで
DOMのElementをJAXBでunmarshalする

意外にもサンプルプログラムが簡単に見つからなかったのでメモ。

```java:
package example.xml;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.ByteArrayInputStream;
import java.io.IOException;

public class DomJaxb {
    public static void main(
            final String[] args) throws ParserConfigurationException, IOException, SAXException, JAXBException {
        final String xml = "<person><name>hoge</name><age>35</age></person>";
        final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                .newInstance();
        final DocumentBuilder documentBuilder = documentBuilderFactory
                .newDocumentBuilder();
        final Document document = documentBuilder
                .parse(new ByteArrayInputStream(xml.getBytes()));

        final JAXBContext jc = JAXBContext.newInstance(Person.class);
        final Unmarshaller unmarshaller = jc.createUnmarshaller();

        final JAXBElement<Person> jaxbElement = unmarshaller
                .unmarshal(document, Person.class);
        System.out.println("JAXBElement: " + jaxbElement.getValue());

        final Person person = (Person) unmarshaller.unmarshal(document);
        System.out.println("unmarshal: " + person);
    }

    @XmlRootElement
    public static class Person {
        @XmlElement
        private String name;
        @XmlElement
        private int age;

        @Override
        public String toString() {
            return String.join("", name + ":" + Integer.toString(age));
        }

    }
}
```

何がポイントかというと@XmlRootElementのアノテーションをつけるところだった。DOMにしないでstreamなどからそのままunmarshalするときには @XmlRootElement を付けないでも大丈夫だった。
生バイナリデータを逆アセンブル(IA-32,x64)

ヘッダ等がついていない生のバイナリデータを逆アセンブルする。

Intelスタイル

```
$ objdump -D -Mintel,i386 -b binary -m i386 input32.bin
$ objdump -D -Mintel,x86-64 -b binary -m i386 input64.bin
```

AT&Tスタイル：

```
$ objdump -D -Matt,i386 -b binary -m i386 input32.bin
$ objdump -D -Matt,x86-64 -b binary -m i386 input64.bin
```


Macの場合は`gobjdump`（`binutils`パッケージ）を利用。
PostGISで緯度経度付きデータを扱う

緯度経度付きデータを入れた後にGeometory型にするときのSQLでよく忘れるのでメモ。

`SELECT AddGeometryColumn('schema','table','geom',4326, 'POINT', 2);`
もしくは
`ALTER TABLE schema.table ADD geom GEOMETRY(POINT,4326);`
その後Geometory型のデータを作るため
`UPDATE schema.table SET geom=ST_GeometryFromText('SRID=4326;POINT('||lng||' '||lat||')')`
でGeometory型のデータが作られる。（latとlngはカラム名）

あとは
`SELECT * FROM schema.table 
WHERE ST_DWithin(geom, ST_GeomFromText('POINT(135 35)', 4326), 500, true)
LIMIT 100;`
みたいな感じで緯度経度（35,135）の位置で500m以内のデータを取得できる。

indexを作るには
`CREATE INDEX indexname ON schema.table USING GIST (geom);`


あと本題と違うけどPostGISをMacでPythonから使うのにPsycopg2を使うためのメモ。
インストールはpipでできるが少しだけはまったので
`pip install psycopg2`
でインストールできるとあるが、PATHにPostgresの設定をしてないと
`Error: pg_config executable not found.`
というエラーでインストールできない。PATH設定は
`$ export PATH=/usr/lib/postgresql/X.Y/bin/:$PATH`
`source ~/.bash_profile`
20行ちょっとで高速な数独ソルバーとPropLogic

Rubyで数独ソルバーを作ってみましたが、ささっと作っただけですぐ解けるものができました。

# 作っていたGem
先日から[PropLogic](https://github.com/jkr2255/prop_logic)というGemを作っていました。これはどういうことに使おうと思って作ったのかというと、いろんな問題を解く上でSATソルバーが便利だったのですが、いちいちCNFを考えたり、変換コードを書くのも面倒になってきたので、そのあたりを自動化して、ついでにRubyの演算子オーバーロードを使って`a | (b & ~c)`のように書ければ便利だなと思って、Gemにしてみました。

# 解き方の方針
というわけで、「方針」なんてものはなくて、ただSATソルバー任せにするだけです。幸い、数独の場合は81マス×数字9つに対応する729本の変数を立てて、

- どのマスにも数字が1つずつ入る
- 縦の列の中で同じ数字が1つずつ入る
- 横の行の中で同じ数字が1つずつ入る
- 3*3のブロックの中で同じ数字が1つずつ入る
- もともと入っている数字については、そのまま条件にする

このようにすんなり条件化できます。

# 作ってみた数独ソルバー
```rb
require 'prop_logic/minisat'

# 初期盤面を入れておく
arr = [
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0]
]

conds=[]
vars=(0..728).map{PropLogic.new_variable}
81.times do |i|
  # 最初からの数字
  conds << vars[i*9+arr[i/9][i%9]-1] if arr[i/9][i%9] != 0
  # 各マスに1つ以上数字が入る
  conds << PropLogic.all_or(*(0..8).map{|j| vars[i*9+j]})
  [*0..8].combination(2) do |a,b|
    # 同じマスの数字は1つ以下
    conds << (~vars[i*9+a]|~vars[i*9+b])
    # 行に同じ数字は1つ以下
    conds << (~vars[(u=i/9)*81+a*9+(d=i%9)]|~vars[(i/9)*81+b*9+i%9])
    # 列に同じ数字は1つ以下
    conds << (~vars[a*81+i]|~vars[b*81+i])
    # ブロックに同じ数字は1つ以下
    conds << (~vars[(u/3)*243+(a/3)*81+(u%3)*27+(a%3)*9+d]|~vars[(u/3)*243+(b/3)*81+(u%3)*27+(b%3)*9+d])
  end
end
# SATソルバーを実行
sat=(expr=PropLogic.all_and(*conds)).sat?
if sat
  # trueのものだけ抽出して、元のところに書き戻し
  sat.terms.select{|t| t.is_a?(PropLogic::Variable)}.each do |v|
    num = vars.index(v)
    arr[num/81][(num/9)%9] = num % 9 +1
  end
  # 別解チェック
  puts 'unique' if (expr & ~sat).unsat?
  arr.each{|row| puts row * '|'}
else
  puts 'not found'
end
```

行を削るために3重ループにすべきところを1つのループで回して、変数の桁ごとに意味を分けているので少々読みづらいですが、これだけのコードで[世界一難しい数独](http://qiita.com/saihon2013/items/254239b4586d8acbe66d)も数秒で一意解を確認できました。

# PropLogicの使い方
ReadMeにも書いたのですが、PropLogic標準のSATソルバーは全探索するというデバッグ用のもので、実用性能が出ません。ということで、[ruby-minisat](https://github.com/mame/ruby-minisat)を呼ぶ形にした[prop_logic-minisat](https://github.com/jkr2255/prop_logic-minisat)を`require`しています。

そして、基本的には`PropLogic.new_variable`で変数を宣言して、あとはそれらの変数をNOT（`~`、`-@`）、AND（`&`）、OR（`|`）して条件を組み立てていきます。そして最後に`sat?`とすると、その条件式がSATソルバーに投げられて、充足可能であれば充足するように与えた変数とその否定をANDしたものが、充足不能なら`false`が返ってきます。

もっとも、この数独程度であれば、ruby-minisatを直接使ってもそこまで面倒なことにはなりません。
ターミナルでCentOS 6.x のシステム情報をカラフルに表示するには

## 実現したいこと

ターミナルで CentOS 6.x を操作している際にインデント付きのカラフルなフォーマットでシステム情報を表示する。

## 実現方法および解決方法

　xsosというコマンドを利用する
　https://github.com/ryran/xsos


## セットアップ手順

```
$ mkdir -p ~Bin/
$ cd ~Bin/
$ curl -Lo ./xsos bit.ly/xsos-direct; chmod +x ./xsos;
```

## 実行コマンド

```
$ cd ~Bin/
$ ./xsos
```

## 実行結果

<img width="1408" alt="スクリーンショット 2016-01-29 23.15.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/49795/25210ad7-4eb2-ae97-54fc-cb5a223e5f2a.png">

## 情報源

* https://access.redhat.com/discussions/469323
* https://github.com/ryran/xsos
あれっ？降順ってASC？DESC？そんな時は、reverse_orderを使ってみましょう！

Railsは、デフォルトでは、primary keyの昇順でデータが取得されます。

例えば、primary keyがidのComment Modelがあったとすると、こうなります。

```rb
pry(main)> Comment.all
=>
[#<
  id: 1,
  content: "あ">,
 #<
  id: 2,
  content: "い">,
 #<
  id: 3,
  content: "う">
]

```
※分かりやすいように、改良しています。従って、実際のpryの表示とは異なります。

ここまでは、簡単です。次に、降順でデータを取得するとしましょう。
さて、どうコードを書きましょうか。

```rb
Comment.order(id: "DESC")
Comment.order("id DESC")
Comment.all.order(id: "DESC")
Comment.all.order("id DESC")
```

```rb
Comment.order(id: "ASC")
Comment.order("id ASC")
Comment.all.order(id: "ASC")
Comment.all.order("id ASC")
```

あれ？どれだっけ？となってなってしまうことがあります。
※　上4つは、正解です。

## そんな時は、reverse_orderを使ってみましょう！

```reverse_order``` を使用すれば、悩むことなく、逆順に並び替えることができます！

ASC？DESC?と悩む必要は、ありません。最後に```reverse_order```をつけとけばいいんです！

```Comment.all``` で全部取得して、```reverse_order```で逆順にする！

orderメソッドを使う時に、「あれ？all前につけとかないといけなかったっけ？」と悩むこともなくなります！

```rb
Comment.all.reverse_order
```

是非使ってみてください（笑）
WEB制作会社のフロントエンドエンジニアとして生きていくために最低限必要と思われること。そしてより生きやすくしていくために。


# WEB制作会社のフロントエンドエンジニアとして生きていくために最低限必要と思われること。そしてより生きやすくしていくために。


現場（WEB制作会社）からお送りいたします。


## 必要と思われる技術・知識・能力

### マークアップ
- HTML
  - セマンティックなマークアップ
  - HTML5の理解
- CSS
  - 基本的なプロパティの理解
  - CSS3の理解
  - CSSフレームワークの使い方
  - メンテナンス性を考えて書ける
  - sassの知識（またはless, stylus, postcss）

### プログラミング
- JavaScript
  - ライブラリの使い方
  - 各種APIの知識
  - パフォーマンスを考えて書ける
  - テンプレートエンジンの知識（Jade, EJSなど）
- PHPの知識（WordPressとかで使う）
- DBの知識
- Node.js
  - Gulpの知識（Gruntは用済）
  - 自動化できるところは自動化できる
- MVCの理解
  
### デザイン
- ある程度のセンス
- Photoshopなどツールの知識

### ツール
- PCの効率的な操作（WindowsとかMacとか）
- エディター, IDEの効率的な操作
- バージョン管理ツールの知識（Git, Subversion）
- ブラウザの開発者ツール
- Photoshop
- Illustrator, flash（Photoshopほどではない）

### その他
- タッチタイピング
- 各ブラウザの挙動・特徴（特にIE）
- 各モバイルデバイスの挙動・特徴
- SEO対策の知識
- 設計力（構造化力）
- 国語力、英語力（命名力、理解力）
- 折衝力、ディレクション力
- CMSの仕組み
- 画像に関する知識
 

## 技術を伸ばすには

### 行動
- 情報収集
- 勉強会（コミュニティ）に参加してみる
- コードを読む（技術の上限を上げる）
- コードを書く（技術の下限を上げる）


### 学習法
- トレンドの技術を試してみる
- 仕事以外でなにか作ってみる
- 自分が目指す環境に身をおく
- コピペせずトレースする。繰り返し書く
- レビューしてもらう
- 自分の頭だけで考えて作ってみる
- 参考書を読む→サンプルを作る
- 「リーダブルコード」みたいな本を読む
  - 人月の神話
  - 闘うプログラマー
- 短期集中
- 公式ドキュメントを読む
- 座学＜実践
- ライブラリの中身をのぞいてみる（自分で書いてみる）
- UNIXの勉強
- 頑張ればできそうなくらいの仕事をこなしていく
- 英語の勉強（公式ドキュメントとか読めるようになる）


### こころがけ
- なんのために作るかはっきりさせてから作る
- ほかの人がぱっと見て理解できるように書く
- 拡張・変更がしやすいように書く
- 動けばいい、では無い
- 難しいことに挑戦する
- やることを絞る
- ビジョンを持つ
  - キャリアパス（方向性）を考える
  - 目標を持つ
  - 1ヶ月後にどうなるか
  - 1年後にどうなるか
- 小さな成功体験を積み重ねることを意識
- コピペしない
- やっつけな仕事をしない
- 全体像を把握する


### メンタル
- 楽しむ
- 自主性
- なにか作りたい


## エンジニア育成
- レビューしてフィードバックする
- 出来る限り任せる。けど最終的な責任は取るよ的なスタンス
- 継続性・一貫性のある指導をこころがける
- 具体的な方法を指示するではなく、自然と成功にたどりつけるように導く
- 行動で示す
- 本気で人を育てようという意識をもつ



## おわりに

とりあえず思いつく限りあげてみました。  
随時更新予定です。

また、いつか社内でブレストするかもしれないので、そしたらまとめ直します。
elasticの「The Beats」でシステム監視をサクッと可視化する

[前回](http://qiita.com/takaheraw@github/items/55ce661e651e18586f4a)、nginx→fluentd→elasticsearch→kibanaでアクセスログを可視化したが、fluentdの設定やpluginを調べたり、kibanaの設定やら正直めんどくさかった。そこで「[The Beats](https://www.elastic.co/products/beats)」。agentをインストールするだけでサクッと可視化できる。予想以上に便利だった。

# The Beats

以下の３つのBeatが正式に用意されていてる。

## [Topbeat](https://github.com/elastic/beats/tree/master/topbeat)

topコマンドの様なものを可視化

## [Packetbeat](https://github.com/elastic/beats/tree/master/packetbeat)

ネットワークのアプリケーショントラフィックを可視化

## [Filebeat](https://github.com/elastic/beats/tree/master/filebeat)

ログを直接またはLogstash経由でElasticsearchに転送

# kibana

Beats用のDashboardが用意されているのでインストールしておく。

```
# curl -L -O http://download.elastic.co/beats/dashboards/beats-dashboards-1.0.1.tar.gz
# tar xzvf beats-dashboards-1.0.1.tar.gz
# cd beats-dashboards-1.0.1/
# ./load.sh
```

# Packetbeat

## install

```
# curl -L -O https://download.elastic.co/beats/packetbeat/packetbeat-1.0.1-x86_64.rpm
# rpm -vi packetbeat-1.0.1-x86_64.rpm
```

## config

elasticsearchのIPを設定

```
# vi /etc/packetbeat/packetbeat.yml
```
```
output:

  ### Elasticsearch as output
  elasticsearch:
    # Array of hosts to connect to.
    # Scheme and port can be left out and will be set to the default (http and 9200)
    # In case you specify and additional path, the scheme is required: http://localhost:9200/path
    # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200
    hosts: ["localhost:9200"]
```

## index template をLoad

```
# curl -XPUT 'http://localhost:9200/_template/packetbeat' -d@/etc/packetbeat/packetbeat.template.json
```

## 起動

```
# /etc/init.d/packetbeat start
```

## kibana

![1.png](https://qiita-image-store.s3.amazonaws.com/0/7086/b89762d3-8649-0278-2bd5-b2a9c6dc3012.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/7086/4572a8cb-050b-f0dc-3c2e-fdf0525f41d0.png)


# Topbeat

## install

```
# curl -L -O https://download.elastic.co/beats/topbeat/topbeat-1.0.1-x86_64.rpm
# rpm -vi topbeat-1.0.1-x86_64.rpm
```

## config

elasticsearchのIPを設定

```
# vi /etc/topbeat/topbeat.yml
```
```
output:

  ### Elasticsearch as output
  elasticsearch:
    # Array of hosts to connect to.
    # Scheme and port can be left out and will be set to the default (http and 9200)
    # In case you specify and additional path, the scheme is required: http://localhost:9200/path
    # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200
    hosts: ["localhost:9200"]
```

## index template をLoad

```
# curl -XPUT 'http://localhost:9200/_template/topbeat' -d@/etc/topbeat/topbeat.template.json
```

## 起動

```
# /etc/init.d/topbeat start
```

## kibana

![3.png](https://qiita-image-store.s3.amazonaws.com/0/7086/e158df63-fa9d-b788-7b2b-07b59dc36ed9.png)

# Filebeat

これの良さがわからなかった。ログをゴニョゴニョして計測は、fluentdで良さそう。
gnome3で日本語入力の切替を右Altにする(AXキーボード風)

Linux(Fedora)を普段使いのDesktop用途で使いはじめましたっ！ずっと英語キーボードを使っていて、かつAXキーボード配列を使っていたので、右Altで日本語入力と英語入力を切り替えたい！というのをやってみました。

# 既存バグとの遭遇

xmodmapで、キー配列を変更しようと思い、以下の要領で変更しました！

1. `ibus-mozc` をインストール
2. `Settings` → `Region & Language` の `Input Sources` の設定を `Japanese (Mozc)` のみにします。
3. OS再起動
4. `xev` コマンドを実行して、右Altのkeycodeを確認します。（私は108でした）
5. `xmodmap` コマンドで右Altがmodifierに設定されていないか確認。（私はmod1に設定されていました）設定されている場合は、次の手順でremoveが必要です。
6. `~/.Xmodmap` ファイルを作成し、以下の内容を入力
    remove mod1 = Alt_R
    keycode 108 = Zenkaku_Hankaku Kanji

7. `xmodmap ~/.Xmodmap` を実行すると変更した配列が読み込まれ、無事右Altで変換できるようになりました〜！

めでたし、めでたし。

さて、OS再起動。

・・・反応しない。。。

設定消えてる。。。

調べたところ、gnome3では、`.Xmodmap` はOS起動時に自動で読み込まれない[バグがある](https://bugzilla.redhat.com/show_bug.cgi?id=873656)ようです。。

# autostartで起動時に設定読み込みコマンド実行

そこで、autostartで、xmodmapコマンドを実行するように設定することにしましたっ！

1. `~/.config/autostart/xmodmap.desktop` ファイルを作成し、以下の内容を入力
    [Desktop Entry]
    Name=Keymapping Modification
    Comment=Modify keymapping for user
    Version=1.0
    Encoding=UTF-8
    Type=Application
    NoDisplay=true
    Exec=/usr/bin/xmodmap /path/to/.Xmodmap

2. 以上！笑

あとは、OS再起動して、反映されていることを確認！

↑のdesktopファイルは、`/usr/share/applications/` 配下に参考になるファイルがいっぱいありますっ！


これで、快適な日本語入力生活になりましたー笑
セクションとは

ページ内の文章で章、節、項などにまとめられるところを明確に分類し、読みやすく区切りを付けるものと考えると良いでしょう。

セッションを示すタグ
　　＃タグとは（あらかじめ定められた特殊な記法により文書に埋め込む形で記述される付加情報。）

article:　内容が単体で完結するセクション。ブログの１つのエントリー、新聞や雑誌の１つの記事など

aside: 前後の内容と関連はあるが、本物からは外れる内容を示すセクション、そのページの補足情報や広告など

nav: サイトの主要なナビゲーションを示すセクション

section: 上記のどれにも当てはまらないセクション
Vagrant コマンドラインインターフェース UP

#UP

##command: vagrant up

[Vagrantfile](https://www.vagrantup.com/docs/vagrantfile/)の設定に従い、ゲストマシンを起動・セットアップする際に使うコマンド。

マシンがどのように起動するかを決める、Vagrantの中で最も重要なコマンドである。Vagrantを使う人なら誰でも頻繁に使うことになる。

####オプション

<dl>
<dt>--destroy-on-error / --no-destroy-on-error</dt>
<dd>新規に作られたマシンに致命的な想定外のエラーが発生した場合、それを破棄する。初回の「vagrant up」時のみ使用する。デフォルトでは破棄。</dd>

<dt>--install-provider / --no-install-provider</dt>
<dd>要求されたプロバイダがインストールされていない場合、Vagrantは自動的にそれをインストールする。デフォルトは自動的にインストール。</dd>

<dt>--parallel / --no-parallel</dt>
<dd>プロバイダがサポートしている場合、複数のマシンをパラレルで起動する。サポート状況は各プロバイダのドキュメントで要確認。</dd>

<dt>--provider ${x}</dt>
<dd>${x}プロバイダでマシンを起動する。デフォルトは「virtualbox」</dd>

<dt>--provision</dt>
<dd>プロビジョニングが走る。</dd>

<dt>--provision-with \${x},\${y},${z}</dt>
<dd>指定したプロビジョンのみ走る。例えば、「:shell」と「:chef_solo」がある場合、「vagrant provision --provision-with shell」を実行した場合、「shell」プロビジョンのみ走る。</dd>
</dl>
Module (Class) が特定の Module を include しているかを判断する

# <i class="fa fa-fw fa-file-text-o"></i> サンプルコード

```rb
module Cuteness
end

module SoulGem
end

class Girl
  include Cuteness
end

class MagicalGirl < Girl
  include SoulGem
end
```

# <i class="fa fa-fw fa-cubes"></i> 判断方法

## <i class="fa fa-fw fa-exclamation-triangle"></i> 注意

* 各方法の「イケてる度」と「意外度」は、僕の独断と偏見に基づいています。
* それぞれの方法で行っていることは、必ずしも等価とは限りません。

## <i class="fa fa-fw fa-cube"></i> 方法 1

イケてる度 : <i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>
意外度 : <i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>

[Module#ancestors](http://docs.ruby-lang.org/ja/2.3.0/method/Module/i/ancestors.html) と [Array#include?](http://docs.ruby-lang.org/ja/2.3.0/method/Array/i/include=3f.html) を使う。

```rb
MagicalGirl.ancestors
#=> [MagicalGirl, SoulGem, Girl, Cuteness, Object, PP::ObjectMixin, Kernel, BasicObject]

MagicalGirl.ancestors.include?(Cuteness) #=> true
MagicalGirl.ancestors.include?(SoulGem) #=> true
Girl.ancestors.include?(SoulGem) #=> false
```

## <i class="fa fa-fw fa-cube"></i> 方法 2

イケてる度 : <i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>
意外度 : <i class="fa fa-star"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>

[Module#included_modules](http://docs.ruby-lang.org/ja/2.3.0/class/Module.html#I_INCLUDED_MODULES) と [Array#include?](http://docs.ruby-lang.org/ja/2.3.0/method/Array/i/include=3f.html) を使う

```rb
MagicalGirl.included_modules
#=> [SoulGem, Cuteness, PP::ObjectMixin, Kernel]

MagicalGirl.included_modules.include?(Cuteness) #=> true
MagicalGirl.included_modules.include?(SoulGem) #=> true
Girl.included_modules.include?(SoulGem) #=> false
```

## <i class="fa fa-fw fa-cube"></i> 方法 3

イケてる度 : <i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i>
意外度 : <i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star-o"></i>

[Module#include?](http://docs.ruby-lang.org/ja/2.3.0/class/Module.html#I_INCLUDE--3F) を使う。

```rb
MagicalGirl.include?(Cuteness) #=> true
MagicalGirl.include?(SoulGem) #=> true
Girl.include?(SoulGem) #=> false
```


## <i class="fa fa-fw fa-cube"></i> 方法 4

イケてる度 : <i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star-o"></i>
意外度 : <i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i>

[Module#<](http://docs.ruby-lang.org/ja/2.3.0/class/Module.html#I_--3C) を使う。

```rb
MagicalGirl < Cuteness #=> true
MagicalGirl < SoulGem #=> true
Girl < SoulGem #=> nil
```
特定のSpecでだけトランザクションのロールバックを無効にする

テストを書いていると、マルチスレッドでデータベースを参照したくなることがあります。

たとえば

- Capybaraなどによるヘッドレステストを行いたい
- データベースのロック確認
- 複数スレッドでの同時アクセス時の動作

などです。

## 課題

しかしながら、通常、テスト中のデータベース操作はトランザクション内で行われ、コミットされません。

このため、メインスレッドで行ったデータベース操作は、他のスレッドでは参照できず、テストに失敗します。

こんなときは、

```rb 
  # config.use_transactional_fixtures = true
  config.use_transactional_fixtures = false
```

としてた上で`config.after(:each)`（あるいはDatabaseCleanerで）データベースを空にするのが定番のやりかたです。
フィクスチャ制御にトランザクションを使わないようにすることで、他のスレッドからも利用できるようになるわけです。

ただし、このやりかただと、テストの度にデータベースを空にする必要があり、トランザクションのロールバックを利用するよりもかなり遅くなってしまう重大な問題がありました。

ほとんどのテストは通常のトランザクションを用いた方法で問題がないわけで、一部のテストのために全体が遅くなるのは許容しがたいです。

## 特定のSpecでのみuse_transactional_fixtures = falseにする方法

最近はこんな風に、contextごとに`use_truncation: true`というので、使う使わないを選べる様にしています。

```rb
require 'rails_helper'

RSpec.describe MyJob, type: :job do
  context 'マルチスレッドで複数のコネクションで同時に処理を行う', use_truncation: true do
    # この中はテストの実行にトランザクションを使いません。
    describe '重複処理があった場合に一方をスキップする' do 
      # マルチスレッドでActiveRecordを操作するようなテスト
      # (snip)
    end 
    describe '...' do 
      # (snip)
    end 
  end 
  
  context 'マルチスレッドで操作しない普通のやつ' do 
    # この中はテストの実行にトランザクションを使います。（デフォルト動作）
  end 
end
```

テスト毎にデータベースを空にするため、DatabaseCleanerを使いますので、そちらも`use_truncation: true`のときは`TRANSACTION`ではなく`TRUNCATION`を使うようにしておきました。

2017/1/5修正

`use_transactional_fixtures = true`の場合にフィクスチャが読み込まれるタイミングと`config.before(:each) do`のタイミングの問題で正しく初期化できないケースがあったので、`use_transactional_fixtures = false`の構成に変更しました。

### spec/rails_helper.rb

```rb
# spec/rails_helper.rb
# (snip)
require 'spec_helper'
require 'support/use_truncation_context'
# (snip)

RSpec.configure do |config|
  # (snip)
  config.use_transactional_fixtures = false
  # (snip)
end
```

### spec/use_truncation_context.rb

```rb
require 'database_cleaner'

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.start
  end

  config.before(:each, use_truncation: true) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.after(:all) do
    DatabaseCleaner.clean_with(:truncation)
  end
end
```
UnityのText Mesh Proアセットで日本語を使うときの手順

[2018/09/16]もともと公開していたCharacter Setの値には常用漢字の抜けがあったようで、別記事にて指摘を頂いたため更新しました。
[2019/07/16]さらにCharacter Setの抜けを指摘頂いたので、別記事へのリンクを追加しました。

Unityでテキストに対してちょっと凝ったエフェクトを加えるときのAssetは[Text Mesh Pro](https://www.assetstore.unity3d.com/jp/#!/content/17662)が定番っぽいですが、日本語を扱う方法が見つからなかったのでメモ。

主に以下の動画で説明されていることの日本語まとめです。
[Text Mesh Pro - Creating Large Custom Font Asset](https://www.youtube.com/watch?v=w0No_E9vqAk)

# Font Asset Creator
Text Mesh Proではttfやotfなどをそのまま扱うことはせず、独自の形式で保存されたassetを扱います。Text Mesh ProにはデフォルトでArial,Bangars,Impactの3種類のフォントのassetが含まれていますが、日本語フォントなどを使うときはfont asset creatorというツールを使用して、ttfやotfからassetを生成する必要があります。

# Font Asset Creatorの使用方法
UnityにText Mesh Proが追加してある前提で、メニューからWindow->TextMeshPro - Font Asset Creatorを選択します

![font asset creator](https://qiita-image-store.s3.amazonaws.com/0/42169/cebe390c-2358-563a-6f19-789501dee252.png)

このツールは元となるフォントファイルからアトラス画像[^1]を生成するものです。ascii文字のように使用する文字数が少なければデフォルトの設定でもうまく生成できるのですが、日本語のように文字数が多い場合、自分でいい感じの値を設定しないと使えるassetになりません。いくつかコツがあるので列挙します。

- font source
元となる日本語font(Unityにインポートされたttfかotf)を選択。

- font size
Auto Sizingだと時間がかかるのでCustom Sizeを選択します。値は48くらい。

- font padding
5のまま。この値を小さくし過ぎると、後でoutlineなどをつけるときに大きなoutlineなどをつけられない。

- Packing Method
FastのままでOK

- Atlas Resolution
デフォルトの512*512だと日本語全体が収まりきらないので、4096*4096に変更します。

- Character Set & Custom Range
ascii・ひらがな・仮名・よく使う漢字を全て登録したい場合はCharacter Setを「Custom Range」に変更し、Custom Range(Dec)に~~[ここの値](https://gist.github.com/thorikawa/2856a7cf912349c0b6b7)を入力します。[^2]~~ ~~[2018/09/16更新]もともと公開しているCharacter Setの値には常用漢字の抜けがあったようなので、[こちら](https://qiita.com/su10/items/67ff8f48e03539a69e31#_reference-8b3eab2bd7bd25b5245a)のリストを参照してください。~~ [2019/07/16更新]さらに補完してくれた方がいたので[こちら](https://qiita.com/kgsi/items/08a1c78b3bee71136156)のリストを参照してください。
実際に使う文字が決まっている場合は、Custom Charactersを選択して、使う文字列を貼り付ける方法もあります。

- Font Style
デフォルトでOK

- Font Render Mode
試しで生成してみる場合はHinted Smoothを選択すると生成が速い。本番用のファイルを生成する場合はDistance Field 16などを選択。

- Get Kerning Pairs
チェックを外してOK

上記を設定して「Generate Font Atlas」をクリックします。Font Render ModeでDistance Field 16などを選択していると4〜5分ほどかかると思います。

生成結果を見て、Characters packedの値をチェックします。ひらがなの範囲に入っている文字の一部がフォントに含まれていないことがあるため、100%生成されることはないと思いますが、数百文字以上欠けている場合は、アトラス画像にフォントが収まりきらなかった可能性がありますので、Font Sizeの値を小さくしたりAtlas Resolutinoの値を大きくするなどの調整します。

ちなみに私の環境で、ヒラギノ角ゴフォントを試したところ以下のような結果になりました。

![generated.png](https://qiita-image-store.s3.amazonaws.com/0/42169/0c836422-9cc3-478f-8e30-fb9f9197c280.png)

最後に「Save TextMeshPro Font Asset」ボタンを押して生成されたassetを保存します。Unityのプロジェクト外のフォルダに保存しようとするとエラーになりますので注意してください。

# Text Mesh Proのオブジェクト作成
あとは、Text Mesh Proのオブジェクトをゲーム内に配置するだけです。
メニューのGameObject->3D Object->Text Mesh Proでオブジェクトを作成し、InspectorのFont Setting->Font Assetで先ほど作成したassetを指定します。
Text Input Boxで日本語を入れて、プレビュー画面で無事表示されることを確認します。

![japanese_unity.png](https://qiita-image-store.s3.amazonaws.com/0/42169/388c8129-adac-9fbe-3b63-3ef652feb5d5.png)

# まとめ
Unityで日本語にかっこいいフォントエフェクトをつけることができてHappy！

[^1]: 複数の画像を１つの画像にまとめたもの
[^2]: よく使う漢字のリストは http://www.tonypottier.info/Unicode_And_Japanese_Kanji/ から拝借しました。