OmniAICreator/Qiita-1.07M huggingface dataset:
学習を維持するための方法 ~プログラマとして生きていく~

## はじめに

こちら [How to maintain the habit to learn coding skills](http://www.webcodegeeks.com/web-development/maintain-habit-learn-coding-skills/?utm_content=buffer7660f&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer) の翻訳記事です。

プログラマとして学習を続けていくこと。について書いてあります。
意訳や誤訳も多いかもしれませんが、非常に参考になる内容でしたので翻訳しました。

以下、翻訳です。

## やる気の炎を失うな

「勉強をする」、ということは当然他のことに費やす時間を減らさなければなりません。
もし、学習に対する意欲を失いたくないのなら。コンピューターの前から離れて家族といる時間を増やしたり、大好きな趣味に時間を費やしたり、運動したりする時間は決して捨てるべきではありません。

## 学ぶことは大変だ

さて、あなたがコンピューターの前に戻ってきても困難なことが待ち受けています。
それは１つのことを**完璧に学習しきること**です。
他の言語はとても輝かしいものに見えるし、新しい技術は今のプロジェクトを革新できるものに感じるでしょう。
さらに、もしあなたが「良いプログラマになるための方法」を信じるのなら。
多くのデザインパターンとそれの実装方法を学び、オープンソースプロジェクトに加わり、時代においていかれないためにコンピューターサイエンスを身につけ、もちろん業務の進捗も遅らせてはならなりません。

とても不可能なことに感じます。
我々には(最低でも)週５日のフルタイムの仕事があり、休日は自の時間を満喫しなければなりません。
　
ですが実際には、あらゆる知識に精通し、自分の時間を満喫するプログラマーがいます。(あなたの周りにもいることでしょう。)
彼らは**学ぶことの方法**を知っているのです。

## **「やる気」** ではなく **「習慣」** で勉強する。
　
今、あなたが新しい言語を学ぼうとしているとします。コードスキルを常に磨き続け、より深い仕様を理解しようとするでしょう。
**あなたはいつまでそれを続けられますか？**
前述の通り、あなたの脳は常に新しいことを求めます。
**「やる気」**だけで学習を続けることは非常に困難です。あなたにとって素晴らしい学習になる予定であったものも、いつかは全く触ろうとしなくなってしまうでしょう。（あなたの部屋にもし、１ページしか読まずに置きっぱなしになっている技術書があればまさにそれの話です。）

一方、**「習慣」**はあなたの人生の学習の支えとなります。ここで**「習慣」**を形作るための幾つかの方法を記します。


### 1. 学ぶことを絞る。
プログラミング言語、フレームワーク、コンピューターサイエンス、ソフトウェア。なんの勉強をしても構いません。ただ、広く浅く知ろうとすればあなたの身になることは何もないでしょう。
大切なことは、**「あなたが今、本当に学びたいこと」**を選びそれに集中することです。決して**「今流行っているから」**という理由で学ぶことを選んではいけません。

### 2. ゴールと再評価
学びたいことが決まったら大枠と中継地点を含んだ、**学習プランを計画**しましょう。
例えば数ヶ月といった時間制限とゴールを設定します。ゴールに到達したらあなたの**学習を再評価**しましょう。
再評価してもっと学びたいと思えば、また新しいゴールを設定して学習を続けましょう。
もし、十分だと感じたら後ろめたく感じる必要はありません、最初に設定したゴールに到達しているのですから胸を張って別のゴールに向けて出発しましょう。

さらにより良い学習のためには、

* 数個先のゴールを設定しておく

一つのゴールに到達した時に、また学び始めるために「やる気」の炎に火を灯す必要がなくなります。

* 細かいタスクも計算しておく


もし日々に学習に取れる時間が少ないのなら、悩んでいる時間は30分でももったいないです。本を１章読む、チュートリアルをこなす、動画学習を行う。などの時間も設定しておくとゴールへの到達がより明確になります。

### 3. 毎日時間を作る。
学習を**「習慣」**にするためには、たとえどんなに短い時間でも毎日学習のための時間をとるべきです。
趣味や他のことをする時間を減らす必要はありません。そうするとあなたの「やる気」はいつか枯れてしまいます。ですが、**他の何かをする前に学習の時間を少しとる**ようにしましょう。

大丈夫、ゆっくり。落ち着いて。それが「習慣」を作る秘訣です。

もし「暇な時にやろう」や「今夜は星が綺麗だから勉強しよう」では「習慣」を作ることはできません。
毎日少しの時間でも学習を続ければ、(「やる気」の炎を燃やさずに)学ぶべきことに簡単に没頭できるでしょう。

### 4. 継続するプロジェクトを持とう。
「習慣」で学習するには、一つの分野を100％まで学び切る必要はありません。
一つの学習を終えたら、**楽しかったことを次の学習に持ち越しましょう**。
「ペットプロジェクト」を持っているプログラマーがいます。
彼らは（例えばブログやTODOといったアプリを）新しい言語を学ぶたびに作成します。そうやってコツをつかんでいくことが重要です。製品レベルであったりバグがないようにテストしたり、どこかに公開する必要は特にありません。
言語でなくても学んだ新しいことはあなたの**「ペットプロジェクト」**に組み込んでいくようにしましょう。

## 最後に

学ぶことはプログラマの一生の課題です。常に学ぶべきことはあり続けます。
ですから楽しんでこの旅を続けましょう。
この広い世界では、目的地に到着してもまた新しい目的地が無限にあなたの前に広がるでしょう。
忘れないでください。あなたは人間で、世界の全てを見て回ることはできないのです。

## 参考

http://www.webcodegeeks.com/web-development/maintain-habit-learn-coding-skills/?utm_content=buffer7660f&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer
iOSアプリをリリースするまでに参考にしたリソース等のメモ（初学者向け）

# 学習の姿勢など
* ひたすらググる  
問題に関わる技術用語（"Storyboard 入門"等）でググると、基礎知識に関する記事や解決法や出てくることが多い。参考になる情報が出てこない場合は、ワードを変えてまたググる。  
  また、適宜英語で調べる。公式ドキュメントをはじめ、Web上の情報は英語で出まわるのが早い。日本語では情報が無いことがある。
* 人に聞く、教えてもらう
  経験者ならすぐ気がつく事でも、初学者にとっては分かり辛い問題（Storyboard関連で起こるクラッシュ等）がある。
理想的なのは、同じプロジェクトに取り組んで、物を作りながら困った所を教えてもらう機会を持つこと。

* Xcodeや言語のバージョンに気をつける
  サンプルコードの通りに実装しても動かない場合、Swiftのバージョンが異なる等の原因が考えられる。


# 書籍を読む
自分のレベルに合っていそうなものを選び、何冊か読む。
Swiftは言語仕様がどんどん新しくなっているので、書籍よりWebのリソースを参照した方がいいかもしれない。
中級者くらいになると、[iOS開発におけるパターンによるオートマティズム](http://www.amazon.co.jp/iOS%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%86%E3%82%A3%E3%82%BA%E3%83%A0-%E6%9C%A8%E4%B8%8B-%E8%AA%A0/dp/4861007348/)（Objective-C）が設計の参考になる。

# 公式ドキュメントを読む
* [iOSヒューマンインターフェースガイドライン](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/BasicsPart/BasicsPart.html)
* [iOS Developer Library](https://developer.apple.com/library/ios/navigation/)
* [日本語ドキュメント](https://developer.apple.com/jp/documentation/)
* [The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html)

# 実際に作る
実際に何かを作ろうとすると、あれやこれやと考えることになる。分からない事があれば、基礎知識や実装例について調べる。
チュートリアルの例としては、[ドットインストール](http://dotinstall.com/lessons)や[Rey Wenderlich](http://www.raywenderlich.com/)（英語）等がある。  

# 実装例を調べる
* [Swift Docs](https://sites.google.com/a/gclue.jp/swift-docs/)  
  UIKit等、フレームワークの利用方法が参照できる。
* [Swiftサラリーマン](http://swift-salaryman.com/)  
  言語やUI等、項目数が多い。
* [iPhoneアプリ開発虎の巻](http://iphone-tora.sakura.ne.jp/index.html)  
  Objective-Cだが、UIの設定項目等を参照できる。
* [Github](https://github.com/)  
"Search Github"にコード入れて検索すると、実装例を見つけられることがある。
* [Cocoa Controls](https://www.cocoacontrols.com/)  
UIのライブラリを紹介しているサービス。ソースコードを読んで実装の参考に。

# 問題の解決方法を調べる
* [Stack Overflow](http://stackoverflow.com/)  
  新しい情報や、個別のマニアックな問題の解決方法が共有されていることが多い。英語が分からなくてもコードを読む。
* [Qiita](http://qiita.com/)  
実装方法だけでなく、設計や、学習法などについても学べる。

# App Storeにアプリをリリースする
* 証明書等を用意する  
がんばる。
* レビューガイドラインを守る  
  守っていないアプリはリジェクトされる。  
  [Apple Review Guidelines](https://developer.apple.com/app-store/review/guidelines/)  
  [iOSのアプリ審査規約 (日本語翻訳)](http://qiita.com/yosikata/items/12d87d5af5933d657c76)
* クラッシュを無くす  
  クラッシュするアプリはリジェクトされる。
* アプリを申請する  
  詰まったらググる。iTunes Connectのサーバーエラー等で操作が行えなかったり挙動が怪しいことがある。Twitter検索で、同じ内容で困っている人がいるかどうかを確認できるかもしれない。
* レビューの待ち日数を把握する  
  [Average App Store Review Times](http://appreviewtimes.com/)  
  申請から審査までにかかった日数の報告をまとめたサイト。
migrateの履歴を見る方法

modelから作らないと行けないのに間違ってmigrateしてしまった時とか履歴をみたいのにその方法が思い出せない事がありました。
そして、調べてみると意外と[参照ページ](http://railsdoc.com/rake)を全部読む必要があったりして面倒だったので、覚書です。
[参照元]
http://railsdoc.com/rake

###migreteの履歴を表示するコマンド
`rake db:migrate:status`

覚えとけよって話ですが、たまにしかしないので、また忘れた時のためにw
DockerでPHP7

PHP7の実行環境をDockerコンテナで構築します。

PHP5のプロジェクトをPHP7に移行する話しがありました。
作業環境をDockerを利用して準備することにします。

# PHP7+apach
Docker hubにオフィシャルのイメージがあるので、なにも考えずに

```lang:index.php
<?php
phpinfo();
?>
```

```
$ docker run -p 8001:80 -d --name my-apache-php-app -v $PWD:/var/www/html php:7.0.2-apache
```

終了。
ホストで、http://localhost:8001/index.php
と思いきや。。。

```
Forbidden

You don't have permission to access /index.php on this server.
```

-vでマウントしたディレクトリのpermissionを調べてみます。

```
$ docker exec -it 0529f214f6bd /bin/bash
->ここからコンテナ内
# ls -la /var/www
total 4
drwxr-xr-x.  3 root root   17 Jan  7 18:05 .
drwxr-xr-x. 12 root root 4096 Jan  7 23:17 ..
drwxrwxr-x.  2 1000 1000   39 Jan 17 18:29 html
```
-vでマウントすると、
uid=1000, gid=1000, 775
ってことです。

で、対応策としてはホストのSElinuxをdisableにするか、コンテナ起動時に `--privileged=true` を追加するかのどちらかです。
ホストの設定を変更するのは嫌なので、起動オプションを追加します。

```
docker run -p 8001:80 -d --privileged=true --name my-apache-php-app -v $PWD:/var/www/html php:7.0.2-apache
```
もう一度アクセスしてみます。
![スクリーンショット 2016-01-23 15.49.55.png](https://qiita-image-store.s3.amazonaws.com/0/93508/86e88dce-bdce-a250-26f8-7dda60cdd573.png)


## Extensionの追加
OFFICIALのコンテナイメージにはExtensionを追加する術が用意されています。

先ほどはrunで直接実行しましたが、Extensionを追加するためにDockerfileを作成します。
試しにmbstringをインストールしてみます。

```lang:Dockerfile
FROM php:7.0.2-apache
RUN apt-get update
RUN docker-php-ext-install mbstring
```

上記のようにDockerfileを作成し、ビルドします。

```
$docker build -t asia.gcr.io/my_project_id/php7:0.1 .
[vagrant@host01 php7]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
asia.gcr.io/my_project_id/php7     0.1                 7c1d36229408        41 seconds ago      536.1 MB
php                             7.0.2-apache        2f16964f48ba        2 weeks ago         521 MB
gcr.io/my_project_id/centos7base   latest              c8a648134623        4 weeks ago         196.6 MB

$ docker run -p 8001:80 -d --privileged=true --name php7 -v $PWD:/var/www/html asia.gcr.io/my_project_id/php7:0.1
```
[こちら](http://qiita.com/zum/items/1904ccd280879ca481c5)で設定したGoogle Container Registryに保存するためにタグを`asia.gcr.io/my_project_id/php7:0.1`としています。

無事、mbstring。

![スクリーンショット 2016-01-23 16.27.19.png](https://qiita-image-store.s3.amazonaws.com/0/93508/e5301c69-edec-9b0d-beef-02d74e3b1f69.png)


## Container RegistryにPUSH

```
$ gcloud docker push asia.gcr.io/my_project_id/php7:0.1
```

前回はgcr.io（アメリカ）リージョンにPUSHしましたが、今回はアジアリージョンにPUSHしてみました。
Developer Consoleではこんな感じになりました。

![スクリーンショット 2016-01-23 16.57.27.png](https://qiita-image-store.s3.amazonaws.com/0/93508/50a0936b-2bf6-1a32-e1b9-dd98c99a89f1.png)

「場所」がUSとASIAになってますね。

NGINXを使うとか、こまかな設定をしようと思うともう少し頑張らないとですが、さくっと利用するには簡単した。
Pythonでプロセス間の排他ファイルアクセス

Pythonでプロセス間の排他ファイル制御をするための方法を調べたのでメモ。
[lockfile](https://pypi.python.org/pypi/lockfile)というものがあるが、そのドキュメントに

> This package is **deprecated**. It is highly preferred that instead of
using this code base that instead `fasteners` or `oslo.concurrency` is
used instead.

とあるので[fasteners](https://github.com/harlowja/fasteners)を使ってみる。
[PyPI](https://pypi.python.org/pypi/fasteners/)にあるので`pip`で簡単にインストールできる:

```command
pip install fasteners
```

[document](http://fasteners.readthedocs.org/en/latest/)の[Examples](http://fasteners.readthedocs.org/en/latest/examples.html)のうち、今回はinterprocess lockを使ってみる。
`with`を使う方法とデコレータにする方法がある。

```python
import os
import time
import fasteners

def main():
    pid = os.getpid()
    while True:
        print("Waiting...")
        with fasteners.InterProcessLock('/tmp/tmp_lock_file'):
            print('Locked by {}'.format(pid))
            time.sleep(2)
        time.sleep(1)

if __name__ == '__main__':
    main()
```

`with`の中の部分が排他的に実行される。

```python
import os
import time
import fasteners

@fasteners.interprocess_locked("/tmp/tmp_lock_file")
def action_with_lock():
    pid = os.getpid()
    print("{} has a lock".format(pid))
    time.sleep(1)

if __name__ == '__main__':
    action_with_lock()
```

一つの関数を排他的に実行したい場合はこっち。
いずれも簡単に実装できる。
予め`/tmp/tmp_lock_file`を作っておく必要も無いし便利。
Androidで画面回転時にActivityを維持する方法

##説明
AndroidのActivityは、端末回転時に縦レイアウト、横レイアウトの切り替えをするために、写真投稿アプリなどで画像が消えてしまう場合があります。
端末の状態が変更された場合のハンドリングを設定する「android:configChanges」属性を使うとこの問題を簡単に回避できます。
##手順
AndroidManifest.xmlで画面回転時の処理を設定したいactivityタグに「android:configChanges="orientation|screenSize"」を追記するだけです。
例

        <activity android:name=".PostActivity"
            android:configChanges="orientation|screenSize"></activity>
##参考URL
http://kobegdg.blogspot.jp/2012/11/activity.html
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
emacs起動時に出るWarningを抑制する

これずーっと放置してたんですが、一旦回避だけする手が分かったのでメモです。

私の.emacs/init.elの中身は現状こんな感じになってまして

```el
(when (locate-library "cask")
  (require 'cask)
  (require 'cask "~/.cask/cask.el")
  )

(cask-initialize)
(require 'pallet)

(require 'init-loader)
(setq init-loader-show-log-after-init nil)
(init-loader-load "~/.emacs.d/conf")

(load "init-common")
(load "init-elscreen")
(load "init-anything")
(load "init-webmode")
(load "init-sql-indent")
(load "init-ext")
(load "init-js3")
(load "init-webmode")
(load "init-linum")
(load "init-maxframe")
(load "init-auto-complete")
(load "init-csharpmode")
(load "init-omnisharp")
```

で、これで起動しますと、以下のようなワーニングがベロベロ出てくるんですよね。
起動時だけじゃなくて、ウィンドウ操作する度にも出てきて、かなり煩わしいです。

```
Warning (initialization): Your `load-path' seems to contain
your `.emacs.d' directory: ~/.emacs.d
This is likely to cause problems...
Consider using a subdirectory instead, e.g.: /Users/kakikubo/.emacs.d/lisp
```

根本的な解決策ではない(※末尾のコメント欄にて根本的な解決方法あります)のですが、次のような設定をくわえておく事でこれを回避する事ができます。

```el
;; shut up, emacs!
'(setq display-warning-minimum-level :error))
```


本来的には別の解があるようなんですが、サブディレクトリをきったところでワーニングは出続けてしまいますし、とりあえずこれでしばらく凌ぐ事にしようかなと。
Mac で CUDA, xhyve などを動かす場合（ハードウェア要件）

こんにちは。
Mac で下記を動かす場合にはハードウェアを選ぶので調べました[^1]。

- CUDA
 - Nvidia dGPU が必要
 - 例： MacBook Pro Retina 15-inch Mid 2014 など

- OS X Yosemite (10.10) [Hypervisor.framework](https://developer.apple.com/library/mac/releasenotes/MacOSX/WhatsNewInOSX/Articles/MacOSX10_10.html)[^2]
 - xhyve, Veertu, Docker for Mac で利用
 - Nehalem (Core i7 and i5) 以降が必要
 - 例： MacBook Pro 15-inch Mid 2010 or later, MacMini Mid 2011 or later, Mac Pro Early 2009 or later

- OS X El Capitan (10.11) [Metal](https://developer.apple.com/library/mac/releasenotes/MacOSX/WhatsNewInOSX/Articles/MacOSX10_11.html)
 - 例： MacBook Pro Retina 15-inch Mid 2012 or later
 - 参考情報： http://www.imore.com/here-are-macs-work-os-x-el-capitans-metal
- AVX2
 - Haswell 以降が必要
 - 例： MacBook Pro Retina 15-inch Mid 2013 or later
- AVX-512
 - Skylake 以降が必要
 - 例： MacBook Pro Retina 15-inch Mid 2016 or later
- 大量メモリ使用
 - 32 GB 以上を搭載
 - 例： Mac Pro
 
----------------
[^1]: MacTracker 利用などでも調べられます。
[^2]: Terminal 上で、```$ sysctl kern.hv_support```の出力が、```kern.hv_support: 1```
php の exit における終了ステータスは何番を返すといいのか

## 結論

* 正常は0
* エラーは1~254
* 255はPHP予約が予約してるから使わない

にしておくまぁ、0は、書かないで普通に `exit;`ってかくでしょ。
フレームワークつかってたらあんまり`exit;`って直接かくことないだろうけど

## 詳細 

詳細はPHPマニュアルにかいてある


http://www.php.net/exit

```
status が integer の場合は その値が終了ステータスとして使われ、表示はされません。終了ステータスは 0 から 254 までの値でなければなりません。
終了ステータス 255 は PHP に予約されており、使用してはいけません。ステータス 0 は、 プログラムを正常終了させる際に使用します。
```

> 終了ステータス 255 は PHP に予約されており、使用してはいけません。

ほほう。

```php:test.php
<?php

exit(255);
```

255を指定すると127に変換される。なんでや工藤。

```zsh
~#  php test.php
~# echo $?
127
```

ちなみに255はパースエラーとかExceptionをキャッチしないとかで発生する

```zsh
~# php test.php
PHP Parse error: xxx
~# echo $?     
255
```

```
~# php test.php 
PHP Fatal error:  Uncaught exception 'Exception' in /Users/cocoiti/test.php:2
Stack trace:
#0 {main}
  thrown in /Users/cocoiti/test.php on line 2

Fatal error: Uncaught exception 'Exception' in /Users/cocoiti/test.php:2
Stack trace:
#0 {main}
  thrown in /Users/cocoiti/test.php on line 2
~# echo $?     
255
```

3へぇ
Redmine3.2のdockerイメージ作った(UML、ナリッジベース、Gitlab連携）

* Githubには[3.2が用意されている](https://github.com/docker-library/redmine/tree/master/3.2)が、officialの[dockerイメージが3.0止まり](https://hub.docker.com/_/redmine/)だったので作った。
* https://github.com/tukiyo/redmine
* https://hub.docker.com/r/tukiyo3/redmine/tags/

## 3.2で良くなった点

* スマホ表示対応
* UPした画像のサムネイルが下にも表示されるようになった。

----

## Gitlab連携

Redmineにhookプラグインを入れるのではなく、
Gitlabのリポジトリをマウントし参照することにした。


### Gitlab起動

```ruby:/data/gitlab/docker-compose.yml
gitlab:
  hostname: labce
  image: gitlab/gitlab-ce:latest
  volumes:
    - ./etc:/etc/gitlab
    - ./logs:/var/log/gitlab
    - ./data:/var/opt/gitlab
  ports:
    - "10080:80"
    - "10022:22"
```

```bash:起動
cd /data/gitlab && docker-compose up -d
```

### Redmine起動

```ruby:/data/redmine3/docker-compose.yml
redmine3:
  image: tukiyo3/redmine:3.2-kb
  volumes:
    - ./sqlite:/usr/src/redmine/sqlite
    - ./files:/usr/src/redmine/files
    - ../gitlab/data/git-data/repositories:/gitlab:ro
  ports:
    - 3000:3000
```

```bash:起動
cd /data/redmine3 && docker-compose up -d
```

![repo-gitlab.png](https://qiita-image-store.s3.amazonaws.com/0/25728/65a138f8-76af-82e0-7919-1523123aebe4.png)

![repo-redmine0.png](https://qiita-image-store.s3.amazonaws.com/0/25728/396d7346-d643-6874-450c-5ab2df9334e8.png)

![repo-redmine.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f750d049-8e30-6298-10fa-ca4edea04e28.png)

----

## 設定

* 管理＞設定
    * 全般＞テキストの書式＞Markdown
    * 表示＞添付ファイルのサムネイル画像を表示＞チェック
    * プラグイン＞設定＞記事要約の非表示＞チェック
        * タグを複数書くのはカンマ区切り。

## ナリッジベースを既存DB流用する場合

* migrateが必要。

```bash:migrate
rake redmine:plugins:migrate NAME=redmine_knowledgebase
```

----

## PlantUML

* [RedmineのWikiでUMLを記述する方法 - Qiita](http://qiita.com/mima_ita/items/fd556aef74fe9252457d)
* http://ja.plantuml.com/
* Cache expiration time : `360000` (100日)に設定 ＞ `適用`

![uml.png](https://qiita-image-store.s3.amazonaws.com/0/25728/12c8cf19-b1ea-6579-6743-407b4cde30aa.png)

```php:書き方
{{plantuml
3-> 3.2: スマホ対応,
3.2-> 3.2kb: ナリッジベース
3.2kb-> 3.2kbuml: PlantUML使用,日本語フォント
}}
```

![wiki_external_filter.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ecee4498-bf20-53de-5bd9-f9a6823252cb.png)
Unity GameObject命名 & Inspectorのグッドプラクティス・バッドプラクティス

UnityのGameObjectの名前のつけかたとかInspectorについて言及しました。

# ベストプラクティス

<img width="187" alt="Screen Shot 2016-01-23 at 3.56.46 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/2f9d9f52-9be0-07e1-e7bc-908462fb1e90.png">

### 0から開始の方が便利。プログラマ的に。

*デザイナーが絵だけかければいいと思ったらダメ。スキルがないとかではなくても、きちんとこういう心遣いが出来るのが重要。*

![oyako.png](https://qiita-image-store.s3.amazonaws.com/0/11951/f9cb9d97-02e8-04c3-f647-36c87bfeb609.png)

### 明らかに親子関係がある場合は、GameObjectも親子関係にしたほうが便利

Button01の中にラベルがあるので明らかにTextが子ども。
uGUIでのUI/ButtonやNGUIでのUIButtonの場合は勝手にUnityがやってくれる。

### Editor拡張でコンポーネント表示

<img width="239" alt="Screen Shot 2016-01-23 at 4.02.41 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/5c9a59cf-ff30-0ea2-d18d-05a1884a6ca8.png">

https://gist.github.com/shinriyo/542d8cef6fc7c579470f

これをダウンロードして解凍して、Editorフォルダの中に入れておく。

### 中途半端なプレハブを強制的に外す

これで出来ます。
https://gist.github.com/shinriyo/c4a347f391870611fc51

### NGUI使っててdepthの調整が面倒なときはこれ使いましょう。

https://gist.github.com/shinriyo/60695aa652ac9a8dabae

ショートカットでdepthをかえられます。
 1増やす・・・Control + Shift + k  1減らす・・・Control + Shift + j

# バッドプラクティス

もし、あなたの会社にいればクビにしましょうみたいなバッドプラクティス。
それによって、エンジニアのスピードも上がりリリースが早くなること請け合い。
採用時にUnityのアプリが提出であればこの辺を見て不採用にするのが吉。

## 悪い名前

### 論外

<img width="160" alt="Screen Shot 2016-01-23 at 3.55.58 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/f82c0da4-8205-a697-e83f-3348b339fafc.png">

`Button01 (1)`・・・？？はぁ？(1)とか残ってる。

これは仕事サボってるレベル。
`command` + `D`とかで複製したのをそのままにしてる時。


### 混乱を招く命名

これは**GameObjectのDQNネーム**の私が命名したい。

**tex**

テクスチャなのかテキストなのか区別できないようになっている。

**col**

`Collider`なのか`Color`なのかわかりにくい。

**まだあれば追記する**

## 悪い数字

<img width="184" alt="Screen Shot 2016-01-23 at 3.55.53 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/664cff0d-626a-6128-ef16-c89c0385bfa8.png">

00 -> 02 -> 01って？？？

画面上揃ってるように見えるが名前がめちゃくちゃ。
もしインスペクタでドラッグするときに間違ってしまい、バグの温床となる。
特に、そのままGameObject[]の変数にInspectorでドラッグするときにそのまま入れてしまう。

### シリアライズしないのにInspectorに公開

```
public class Title : MonoBehaviour
{
	public bool hoge;
```
ってやってる場合、しかしInspectorにて使わない場合、これは放置しないこと。
Unityが勝手にシリアライズしてしまいます。(Inspector上に出てしまう)

```
public class Title : MonoBehaviour
{
	[HideInInspector] public bool hoge;
```
のように、`[HideInInspector]`をつけましょう。
または、↓のようにプロパティがベスト！
```
public class Title : MonoBehaviour
{
	[HideInInspector] public bool Hoge {get; set;}
```

### 無駄に可視性を広げた変数

```
public Gameobject[] bar;
```

やたらとpublicにする人が多いが、
日本の出版社が入門書出しまくったせいでの弊害。
publicはいらない。

`[SerializeField]` + `private`でOK。

```
[SerializeField] Gameobject[] bar;
```

まだ、たくさんあると思うので編集リクエストやコメントがあれば採用します。
[SwiftLint]コードの中で無効にするルールを指定する

SwiftLintの記事もこれで最後になるかと思います。
仕上げは[Disable a rule in code](https://github.com/realm/SwiftLint#disable-a-rule-in-code)です。

# コード中で無効にするルールを指定する

## disable-enable

基本的には.swiftlint.ymlの中で無効にするルールの記述をしますが、コード中のコメントで指定することもできます。
フォーマットは以下の通りです。

`// swiftlint:disable <ルール名>`

これによって無効にしたルールは、以下のルールを有効にするフォーマットの記述が現れるまで適用されます。

`// swiftlint:enable <ルール名>`

よって、以下のようになります(例文自体は公式から抜粋)。

```swift
// swiftlint:disable colon
let noWarning :String = "" // No warning about colons immediately after variable names!
// swiftlint:enable colon
let hasWarning :String = "" // Warning generated about colons immediately after variable names
```

![スクリーンショット 2016-01-23 14.07.54.png](https://qiita-image-store.s3.amazonaws.com/0/100736/63d2454d-9bc0-7df5-556a-14dcdff88b75.png)

※ちなみにルールに沿った書き方にして警告を解消する場合は
`let hasWarning: String = ""`
にすればいいですね。


## next, this, previous

もう一つルールの無効/有効の設定をする方法として、:previous, :this, :nextを使う方法があります。
これを用いると、前の行、今の行、次の行限定でルールを無効/有効にすることができます。
下の例では前、今、次の行でforce_castを無効にしています。


```swift
// swiftlint:disable:next force_cast
let noWarning = NSNumber() as! Int
let hasWarning = NSNumber() as! Int
let noWarning2 = NSNumber() as! Int // swiftlint:disable:this force_cast
let noWarning3 = NSNumber() as! Int
// swiftlint:disable:previous force_cast
```

![スクリーンショット 2016-01-23 15.04.00.png](https://qiita-image-store.s3.amazonaws.com/0/100736/f5bcb65a-5620-1009-139c-a88885749268.png)

有効にする方法も同様です。

```swift
// swiftlint:enable:next force_cast
let noWarning = NSNumber() as! Int
let hasWarning = NSNumber() as! Int
```

![スクリーンショット 2016-01-23 15.19.43.png](https://qiita-image-store.s3.amazonaws.com/0/100736/f59767ad-af1a-a547-781e-b35091488960.png)

# 複数指定

例えばある1行に対して2つdisableにしたいとします。その時はどのように書けば良いのでしょうか。
公式のREADMEには特に何も書かれていないのでちょっと調べてみました。

コード上で
`// swiftlint:disable:next colon, line_length`、
`// swiftlint:disable:next colon:line_length`
などとやってみるものの、期待する結果は得られませんでした。

そこで[Command.swift](https://github.com/realm/SwiftLint/blob/8cc8c634141f0f6802692480261a03f97e82161d/Source/SwiftLintFramework/Models/Command.swift)を見てみると、1行で複数のルールをdisableにすることは厳しそうな雰囲気が出てきました。
なので1行であろうと、おそらくこのように指定するのが現状の解決策なのではないかと思います。

```swift
// swiftlint:disable colon
// swiftlint:disable line_length
let noWarning :String = "" // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
// swiftlint:enable line_length
// swiftlint:enable colon
 ```
webkit-animationのプロパティを書き換える

cssのwebkit-animationは，アニメーションのキーフレームを細かく指定できる，ループ指定が簡単等非常に便利ですが，duration等を途中で変更する方法で詰まってしまいなかなか解決策が見つからなかったのでメモ

## 要件
動いているwebkit-animationをjsから操作して途中で止めたい or duration等のプロパティを途中で変更したい．

## 解決策

webkitの処理を記載しているidやclassを書き換えても効果なし．
animationを止める場合は-webkit-animation-nameを空にする．
プロパティを変更したい場合は，duration等を書き換えた後，
-webkit-animation-nameを変更する．


```css

/*anime.css*/
 
@-webkit-keyframes anime0{
    0%{-webkit-transform:rotate(-90deg)}
    100%{-webkit-transform:rotate(270deg)}
}
 
@-webkit-keyframes anime1{
    0%{-webkit-transform:rotate(-90deg)}
    100%{-webkit-transform:rotate(270deg)}
}
 
.anime-class{
    -webkit-animation:anime0 20s linear 0 infinite;
}
 
.anime-class2{
    -webkit-animation:anime0 10s linear 0 infinite;
}
```

```js

function changeanimetionspeed() {
$(".anime-class").css("-webkit-animation-name", "");
$(".anime-class").css("-webkit-animation-duration", "10s");
$(".anime-class").css("-webkit-animation-name", "anime1");
}
```

この際，一度animationを止めずに連続的にプロパティを変更したい場合，-webkit-animation-nameを一度空にして同じ名前を登録しても効果はなく，別の名前を登録する必要がありました
(キーフレーム自体には変更が無くとも同じ内容で別名の-webkit-keyframesを用意し，切り替える必要があった)．

上の例では，changeanimetionspeedを呼ぶとキーフレームの挙動はそのままに，アニメーション1ループにかかる時間が20sから10sに変更されます(クラスをanime-class2に切り替えるのは効果なし)．

ただもっといい方法があると思うのですが．．．
shell scriptでoxゲームを作ってみた

# shell scriptでoxゲーム

Shellを触る機会があったので試しに作ってみたというだけの記事。
コードは以下のgitにあります。
[oxgame_bash](https://github.com/aratakokubun/oxgame_bash)

### 動機
最近Linux/Unixマシンの使い方入門みたいな研修を受け、その中でちょっとしたscriptを組む機会があった。
せっかくだからこの知識を何かに活かせないかということで、とりあえずゲームでも作ってみるかってなった。

### はまったところ
* 独特の記法(制御構文, 条件文)
今までまともにスクリプトを組んだことがないので、まず
```
if [ 条件文 ]; then
fi
```
みたいな構文に苦戦した。
また、条件文も数値の場合は -eq(equal), -ne(not equal), -a(and), -o(or)など今までにない感じだった。

<br>
* 2次元配列の扱い
調べて最初に出てきた方法でやったが、結構力技っぽいらしくて色々苦戦したのがここ。
- 初期化・代入
eval使わないとできないのか・・・
```
for ((x=0; x<$size; x++)) {
	for ((y=0; y<$size; y++)) {
		eval ARRAY${x}${y}=$none
	}
}
```
- 参照
こっちも普通に$ARRAY${x}${y}にするとうまくいかず・・・
```
if [ $((ARRAY${x}${y})) -eq $none ]; then
``` 

<br>
* 関数の返り値
もともと正常終了かどうかのコードを返すものなので、1-255までの値しか返せないとのこと。（http://shellscript.sunone.me/function.html）
今回はこの制限は特に問題なかったが、返り値の取得でちょっと詰まってしまった。(以下は"judge_winner"関数の返り値をwinnerで取得する場合の例)
```
judge_winner$
winner=$?$
```


### 感想
こういうものを作るのものでは無いとわかってはいたが、予想以上の苦戦を強いられた。研修ではsu時にユーザが存在しない場合、自動作成するスクリプトを書いてみて、うまくbashのコマンドを使えば便利なものが作れそうな気がした。なので、今度は時間があればこっちの方向で何か作ってみたい。
gulpfile.jsのここを直したい

## 課題

1. `watch`中にファイルを追加しても自動的には管理対象にならないので、どうにかしたい
2. Node.jsの4.0からES6が使えるようになっているので、書き直したい
3. Jadeのコンパイルが1分以上も続くようになってきたので、必要なファイルだけがコンパイルされるように直したい
4. この機会にグローバルへのインストールが必須なものは排除したい

## 1. `watch`中にファイルを追加しても自動的には管理対象にならないので、どうにかしたい

`watch`中にファイルを追加しても何も起こらない例：

```js:gulpfile.js
gulp.task('watch', function() {
  gulp.watch(['./src/**/*.styl'], ['build-stylus']);
});
```

`gulp`の`watch`メソッドではなく、[`gulp-watch`](https://www.npmjs.com/package/gulp-watch)を使うことで解決できます。

```js:gulpfile.js
var gulpWatch = require('gulp-watch');

gulp.task('watch', function() {
  gulpWatch(['./src/**/*.styl'], function() {
    gulp.start('build-stylus');
  });
});
```

## 2. Node.jsの4.0からES6が使えるようになっているので、書き直したい

ES5で書かれている例：

```js:gulpfile.js
var gulpWatch = require('gulp-watch');

gulp.task('watch', function() {
  gulpWatch(['./src/**/*.styl'], function() {
    gulp.start('build-stylus');
  });
});
```

とりあえず`const`と`=>`を使って、`var`と`function`を置き換えればOK。

```js:gulpfile.js
const gulpWatch = require('gulp-watch');

gulp.task('watch', () => {
  gulpWatch(['./src/**/*.styl'], () => {
    gulp.start('build-stylus');
  });
});
```

処理が一行だけなら、もう少しだけ短く書けますね。

```js:gulpfile.js
const gulpWatch = require('gulp-watch');

gulp.task('watch', () => {
  gulpWatch(['./src/**/*.styl'], () => gulp.start('build-stylus'));
});
```

## 3. Jadeのコンパイルが1分以上も続くようになってきたので、必要なファイルだけがコンパイルされるように直したい

ファイルを保存するたびに全ファイルが更新されてしまう例：

```js:gulpfile.js
var gulpJade = require('gulp-jade');

gulp.task('jade', function() {
  return gulp.src(['./src/**/*.jade'])
    .pipe(gulpJade())
    .pipe(gulp.dest('./dist/'));
});

gulp.task('watch', function() {
  gulp.watch(['./src/**/*.jade'], ['jade']);
});
```

`watch`系のタスクの中で、コンパイル処理を続けて書けばOK。

```js:gulpfile.js
const gulpJade = require('gulp-jade');
const gulpWatch = require('gulp-watch');

gulp.task('jade', () => {
  return gulp.src(['./src/**/*.jade'])
    .pipe(gulpJade())
    .pipe(gulp.dest('./dist/'));
});

gulp.task('watch', () => {
  gulpWatch(['./src/**/*.jade'])
    .pipe(gulpJade())
    .pipe(gulp.dest('./dist/'));
});
```

## 4. この機会にグローバルへのインストールが必須なものは排除したい

グローバルへのインストールが必要なものの例：

- gulp本体
- [Autoprefixer](https://github.com/postcss/autoprefixer)

```
$ npm install --global gulp
$ npm install --global postcss-cli autoprefixer
```

一方で、gulpプラグインのgulp-autoprefixerの方はグローバルへのインストールが不要です。

- [gulp-autoprefixer](https://www.npmjs.com/package/gulp-autoprefixer)

```
$ npm install --save-dev gulp-autoprefixer
```

gulp本体も`gulp`タスクを`npm`コマンド経由で叩くようにすれば、グローバルへのインストールが不要になります。

↓こうするのを止めて、

```
$ gulp build
```

↓こう叩く

```
$ npm run build
```

必要な作業は`package.json`にエイリアスを張るだけです。

```json:package.json
{
  "name": "my-awesome-project",
  "version": "1.0.0",
  "scripts": {
    "build": "gulp build",
    "watch": "gulp watch"
  },
  "devDependencies": {
    "gulp": "~3.9.0"
  }
}
```

## まとめ

とりあえず以上ですが、読みやすくするために色々と端折りました。
長いバージョンは[こちら](https://github.com/internets-inc/small-web/blob/gh-pages/gulpfile.js)で確認できます。[^1] [^2]

ご清聴、ありがとうございました。

[^1]: 本物の方では`Autoprefixer`は使わずに、[`kouto-swiss`](http://kouto-swiss.io/docs.html)を使用しています。
[^2]: ディレクトリ構成がやや特殊なので参考にされる際は気をつけて下さい。
delayed_job で backtrace を出す

Rails のジョブキュー機能として使える、delayed_job だが、標準ではエラーが発生した際に、一番最近のエラーメッセージしか情報をつかむことができない。log でも握りつぶらされた情報しか出てこない。

# 対処法


`config/initializers/delayed_job_config.rb` に以下を追加

```rb
if Rails.env == "development"
  class Delayed::Worker
    def handle_failed_job_with_loggin(job, error)
      handle_failed_job_without_loggin(job,error)
      Delayed::Worker.logger.error(error.message)
      Delayed::Worker.logger.error(error.backtrace.join("\n"))
    end 
    alias_method_chain :handle_failed_job, :loggin
  end 
end
```

これで、失敗時はログに backtrace が書き出されるようになる。

# 参考にした資料

- https://www.redhat.com/archives/katello-devel/2011-October/msg00150.html
FlashCC HTML5 Canvas で インスタンスに画像を読み込んだ時の設定

# まえがき
FlashプラットフォームでHTML5 Canvasを使いインスタンスに画像を読み込んだ時の位置の設定に関して、よくよく考えてみると当たり前だけれども、ちょっとメモしておきたいので書きます。

# 事例
## 検証
### インスタンスをライブラリから形成
※for文で回して複製しているので、[iii]がついています。
<pre>
container[iii] = new lib.container();
container[iii].name = objName;
stage.addChild(container[iii]);

container[iii].scaleX = 0.35;
container[iii].scaleY = 0.35;
stage.setChildIndex(container[iii],(stage.getNumChildren())-iii);
</pre>
ちなみに、ライブラリに格納しているインスタンスの設定は以下のよう。左右中央が中心で準備。
トランプの裏の画像サイズは 455px × 680px。
大きい画像を配置して、３５％に縮小して画面に配置します。
![スクリーンショット 2016-01-23 13.03.18.png](https://qiita-image-store.s3.amazonaws.com/0/70116/dc6c8898-5cbf-05b9-8750-3b6213c40f4f.png)


### 外部の画像をインスタンス内へ配置
※for文で回して複製たインスタンスの[iii]をカードの位置[left][right]でカウントしています。
何の設定も無しに読み込みのみ。
<pre>
container[left].addChild(leftCardImage);
</pre>

### 読み込むトランプ画像
![trump04.png](https://qiita-image-store.s3.amazonaws.com/0/70116/22a07012-faaf-e5ba-8ee3-442770a0c00e.png)

サイズ：455px × 680px
かなり大きめの画像を読み込みます。トランプの裏の画像と同じ大きさです。
（素材提供：http://www.xn--eckzb3bzhw32znfcp1zduw.com/data/trump.php）

### 配置の設定
<pre>
container[left].addChild(leftCardImage);
</pre>
で読み込み。読み込む先のインスタンスは上下左右中央が（0,0）の場合、読み込んだ画像が上下左右中央を起点として表示されます。
![スクリーンショット-2016-01-23-0.56.01.png](https://qiita-image-store.s3.amazonaws.com/0/70116/80c0850d-89f9-dee2-2fcf-a13861cfacb3.png)

画像の場合、スペードの５が外部から読み込んだ画像。
少し分かりにくくすみません。赤枠のトランプ２枚を見て頂きたいです。
左上に配置されたトランプの裏画像が読み込み先のインスタンス。
読み込み先の左上に配置された画像の上下左右中心に対してスペードの５のファイルが起点の左上を読み込み先のインスタンスの起点(0,0)に向けているのが分かります。なので、読み込む画像としてサイズや座標を調節します。

### 配置の調節
配置を調節します。
画像の読み込み部分に座標の指定をいれると１行で調節ができます。
<pre>
container[left].addChild(leftCardImage).setTransform(-228, -342, 1, 1, 0, 0, 0, 0, 0);
</pre>
注意して欲しいのが、最初の引数の２つxとyの座標の部分。
ここは、縮小前の読み込み元の画像の大きさで画像と位置合わせをします。
なお、読み込み元でscaleにて縮小した割合をそのまま引き継いでいるのでscaleの設定は読み込むもとの「0.35」ではなく「1」になります。
![スクリーンショット-2016-01-23-22.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/70116/3e388666-ea1a-82b8-75f4-ce3a5508cbfd.png)


# まとめ
今回は１つのケースでの設定に関して気がついた事を書きましたが、１つのケースによりなにを継承したのかどういうしくみになっているのかを理解できたので、別のパターンを想像する事が出来るので、他のパターンでコンテンツを作る時にどのように設定したら良いのか以下のように想像する事が出来きます。

**読み込み元が原寸「１」の場合**

* 読み込む画像が大きい：setTransformで縮小指定
* 読み込む画像が同じ大きさ：setTransformで指定「１」
* 読み込む画像が小さい：setTransformで拡大指定

**読み込み元が原寸「２」で拡大している場合**

* 読み込む画像が大きい：setTransformで縮小指定（@2の大きさの場合「0.5」を指定すれば同じ大きさ）
* 読み込む画像が同じ大きさ：setTransformで指定「１」
* 読み込む画像が小さい：setTransformで拡大指定（1/4の大きさの場合「２」を指定すれば同じ大きさ）

# あとがき
今回は読み込み先のインスタンスに大きい画像を読み込んだ場合の設定に関してでした。他のパターンの時を想定できるのですが検証してみないとほんとうの事は分かりません。なので、検証する機会があったら、この記事に追記したいと思います。
bashだけ動かない！ヘンな仕様orバグコレクション ver.0.2

# 「bashだけで動かない記述」が結構ある

他のシェルだと問題無く動くのに、bashに持ってきたら動かなくなるシェルスクリプトがあってこれまで何度か悩まされてきたので、そろそろここらでまとめることにした。

bashのバグなのか仕様なのか定かではないが、どちらにせよ、どの環境でも動く究極のポータビリティーを目指すシェルスクリプト、すなわちPOSIX原理主義を実践するうえではこの知識は避けては通れないだろう。

# `$(〜)`の中の`$$`と`'〜'`

```bash:
$ echo $(echo $$'')   # PIDが出ない！
                      #
$ 
```

## 対策

`$$`をダブルクォーテーションで囲んだり、$()の中で使わなかったり、直後にシングルクォーテーションを書かなければよい。逆にそれらの条件がすべて重なると起こるようだ。

```bash:
$ echo $$''           # $()の外なら出る
12345                 # 
$ echo $(echo "$$''") # ダブルクォーテーションで囲えば出る
12345                 #
$ echo $(echo $$)     # 直後に'〜'がなくても出る
12345                 #
$ 
```

## 備考

ちなみに`$?`等の他のシステム変数では起こらない。

```bash:
$ echo $(echo $?'')
0
$ 
```

# [`$(〜)`の中でcase文が使えない（ver.3まで）](http://qiita.com/richmikan@github/items/8eebbacc73f80c18a728)

```bash:
$ echo $(case 1 in 1) echo OK;; esac)
-bash: syntax error near unexpected token `;;'
$ 
```

これはどうやらcase文におけるパターン指定に使う`)`を、`$(〜)`の閉じ括弧と誤認してしまうことが原因のようだ。この問題はバージョン4以降のbashでは解消されているようだ。

## 対策

`$(〜)`の代わりにバッククォートを使えばよい。

```bash:
$ echo `case 1 in 1) echo OK;; esac`
OK
$ 
```

# [ifやcase構文におけるアクションがコメントだけでは済まされない](http://qiita.com/richmikan@github/items/eefbaed716e5ed198973)

ifやcase構文で、ある条件が満たされた時に実行させたい動作を記述する場所に、何もコマンドが書かれていないとエラーになる。コメントだけ書いてもダメ。

```bash:
$ if true; then
>   # 何もしない
> fi
-bash: syntax error near unexpected token `fi'
$ 
```

## 対策

最も差し障りの無いヌルコマンド`:`を書けばよい。

```bash:
$ if true; then
>   # 何もしない
>   :
> fi
$ 
```

# 未定義変数参照が見逃される

起動時に`-u`オプションをつけたり起動後に`set -u`を実行すると、未定義なシェル変数を参照した時にエラー扱いにしてくれる。……はずなのだが、`${filepath%/*}`のようにパラメーター展開により間接的な参照をした時は見逃してしまう。

```bash:
$ set -u
$ echo $filepath
-bash: filepath: unbound variable
$ echo ${filepath%/*}

$ 
```

もちろん`${filepath:-/DEFAULTPATH}`などとして、「シェル変数`$filepath`が未定義だったら“/DEFAULTPATH”を返す」ということがしたい場合はエラー扱いしなくてよいし、実際、他のシェルでもそうなっているのだが、[POSIX文書に載っている-uオプションの原義](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_25_03)を汲み取るなら、今例示したような例外を除いて原則的にエラー扱いすべきだ。

ただ、この問題に関しては「bashのみ」ではなく、少なくともzsh、kshでも起こることを確認した。
AndroidでiOSのNSNotificationCenter的なことをやる


# 目的

Androidで、アプリ内のインスタンスに対してイベントを通知したいが
クラス間でListenerを介するようなやり方は適さないような場合の通知方法。

iOSでは`NSNotificationCenter`が利用できるが
Androidでは`LocalBroadcastManager`というものがある。

※「そもそもNSNotificationCenterってどういうときに使うんだっけ？」
というのが気になる人は以下が参考になると思う。

[DelegateとNotificationの使い分け](http://blogios.stack3.net/archives/31)

# 実装

## 受信側

```java:ReceiverActivity

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // レシーバーの登録
  // NSNotificationCenter.defaultCenter().addObserver(...)の役割
  // "MY_EVENT"という名前のIntentを受取る
 LocalBroadcastManager.getInstance(this)
 	.registerReceiver(mMessageReceiver, new IntentFilter("MY_EVENT"));
}

// 登録するレシーバー
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Extraから値を得る
    String message = intent.getStringExtra("message");
    Log.d("receiver", "受信メッセージ: " + message);
  }
};

@Override
protected void onDestroy() {
  // レシーバーの削除
  // NSNotificationCenter.defaultCenter().removeObserver(...)の役割
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}
```

## 送信側

```java:SenderActivity.java

void sendMessage(Context context) {
  Log.d("sender", "メッセージ送信実行");
  // "MY_EVENT"という名前でIntentを送る
  Intent intent = new Intent("MY_EVENT");
  // IntentなのでExtraの利用が可能
  intent.putExtra("message", "ガルパンはいいぞ");
  // 送信
  // NSNotificationCenter.defaultCenter().postNotificationName(...)の役割
  LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
```

## 備考

同じレシーバーを複数のイベントに対して登録した場合も問題なく動作した。
ソースを見てみたところ、レシーバーの削除も一回で全て削除される。

# 参考

iphone - Android equivalent to NSNotificationCenter - Stack Overflow
http://stackoverflow.com/questions/3947641/android-equivalent-to-nsnotificationcenter/8875275#8875275

DelegateとNotificationの使い分け | Cyber Passion for iOS
http://blogios.stack3.net/archives/31
UITapGestureRecognizer を設定すると他ViewへのTapを認識しなくなる


よくあるtapGestureを仕込んだとき、
同じViewに表示されている他のUIButtonやCellをタップしても認識されなくなったことはありませんか？

タップでキーボードを閉じる簡単な処理を書いたのですが、
CollectionViewCellへのタップ効かなくなってしまい、この問題について調べてみました。

# なぜ他Viewのタップを認識しなくなるか
[UIGestureRecognizeのリファレンス](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/)を読んでみると、
以下のプロパティがあります。

## cancelsTouchesInView
> A Boolean value affecting whether touches are delivered to a view when a gesture is recognized.
ジェスチャーが認識されたときのタッチがビューに配信されるかどうかに影響するブール値。

>Discussion
When this property is YES (the default) and the receiver recognizes its gesture, the touches of that gesture that are pending are not delivered to the view and previously delivered touches are cancelled through a touchesCancelled:withEvent: message sent to the view. If a gesture recognizer doesn’t recognize its gesture or if the value of this property is NO, the view receives all touches in the multi-touch sequence.
このプロパティがYES（デフォルト）で、受信機がそのジェスチャーを認識すると、保留されているジェスチャーのタッチは、ビューに配信されず、以前に配信タッチはtouchesCancelledを通じて相殺される： withEvent ：ビューに送信されたメッセージ。ジェスチャ認識は、そのジェスチャーを認識しないか、このプロパティの値がNOの場合、ビューは、マルチタッチシーケンス内のすべてのタッチを受信した場合。
(Google翻訳)

つまり、このプロパティのデフォルト値がtrueになっていまして、
gestureのないViewをタップしたつもりになっていても、キャンセルされていたようです。


# 解決
gestureを設定するときに、上記プロパティの設定を一行加えてあげることで解決します。

```swift:setTapGesutre
let tapGestureRecognizer= UITapGestureRecognizer(target: self, action: "tapGesture:")
tapGestureRecognizer.cancelsTouchesInView = false
```

cancelsTouchesInView プロパティにfalseを渡せばOK。

### 補足
UIGestureRecognizerのプロパティなので、
タップだけでなく諸々のgestureに使えます。


***
参考ページ

[UITapGestureRecognizerとUICollectionViewが競合した場合](http://blog.fujimisakari.com/UITapGestureRecognizer%E3%81%A8UICollectionView%E3%81%8B%E3%82%99%E7%AB%B6%E5%90%88%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88/)
[タップ認識](http://montan.hateblo.jp/entry/2012/12/12/101012)
[UIGestureRecognizer Class Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/#//apple_ref/occ/instp/UIGestureRecognizer/cancelsTouchesInView)
Vivado > Generate Bitstream終了時の最終更新ファイル

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

Generate Bistream終了時に最後に更新されるファイルのリスト。Powershellで取得した。
http://qiita.com/7of9/items/132d38ea5a4586eccf94


```
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\.vivado.begin.rst:01/23/2016 12:26:44
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\vivado.jou:01/23/2016 12:26:46
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper.bit:01/23/2016 12:27:10
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.cache\wt\project.wpc:01/23/2016 12:27:11
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\usage_statistics_webtalk.html:01/23/2016 12:27:11
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\usage_statistics_webtalk.xml:01/23/2016 12:27:11
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\.Xil:01/23/2016 12:27:16
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\.write_bitstream.end.rst:01/23/2016 12:27:16
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\write_bitstream.pb:01/23/2016 12:27:16
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1:01/23/2016 12:27:16
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper.sysdef:01/23/2016 12:27:16
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper.vdi:01/23/2016 12:27:17
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\vivado.pb:01/23/2016 12:27:17
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\runme.log:01/23/2016 12:27:17
```

ここで気づいたのがimpl_1\system_wrapper.vdiまで更新されている点。これをRun Synthesis終了通知に使うのはまずいのだろうか。

write_bitstream.pbは１つなのでこれを終了検知に使おう。
I2Cで通信可能なUVセンサー

# UVセンサーとは

UV-B, UV-Aを計測可能なセンサー。

<img width="948" alt="uv.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/b488cf06-36f0-96e5-2871-826693ccd56f.png">

# UVセンサーの用途

火炎検出や、紫外線検出で用いられる。

# I2Cに対応したUVセンサー

## デジタルセンサー(I2C対応)
- [Si1132](https://octopart.com/search?q=si1132) (UV-A, UV-Bに反応)
- [VEML6070](https://octopart.com/search?q=VEML6070) (UV-Aに反応)
- [UVIS25](http://www.st.com/web/jp/catalog/sense_power/FM89/SC2014/PF261045)(UV-A, UV-Bに反応)

## アナログセンサー(I2C非対応)
- [ML8511](http://www.lapis-semi.com/jp/semicon/sensor/ml8511.html)

# ピンアサイン

## Si1132
<img width="202" alt="pin-si1132.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/a0f00833-4928-40ee-97b3-9442b6f2a712.png">

## VEML6070
<img width="258" alt="pin-veml6070.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/6d6e31da-c496-2dcb-654d-0c19ec2afc09.png">

## UVIS25
<img width="595" alt="pin-uvis25.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/93dfd704-0aff-a9d9-975e-8c283d57aca3.png">


# 回路図例

## Si1132

<img width="385" alt="ri-si1132.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/b889e788-ca5a-bcf8-0af8-7c3763ed3a84.png">

## VEML6070

<img width="692" alt="ri-veml6070.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/fbb172df-854a-b409-9963-56dd7ff55559.png">

## UVIS25
<img width="591" alt="ri-uvis25.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/292ad227-6737-89c2-1b59-898c988f1b8f.png">


# センサー特性

## Si1132

<img width="513" alt="graph-Si1132.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/cec3ee54-2ee0-efc0-39f5-5ba40856de43.png">

## VEML6070

<img width="318" alt="graph-veml6070.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/a9d51fda-a930-feaa-33fa-012bdecb9b54.png">

# UVインデックス
UVインデックスとは、紫外線が人体に及ぼす影響の度合いをわかりやすく示すために、紫外線の強さと紫外線の強さをあらわしたもの。

WHOでは、UVインデックスで表される紫外線の強さを下記のように分類している。

<img width="621" alt="uv-index.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/d0fdc8fd-576b-d647-1d96-33660ca7c6fe.png">
([紫外線環境保健マニュアル2015より](http://www.env.go.jp/chemi/matsigaisen2015/full.pdf]))

#　サンプル
- [UVセンサーSi1132をArduinoから制御する(I2C)](http://qiita.com/akira-sasaki/items/2a6db0f3c16e5e4704cc)

# プレスリリース
- [(VEML6070)新しい統合型の紫外線(UV)光センサーを発表](http://www.elisnet.or.jp/news/news_detail.cfm?select_news_id=25825)
- [(UVIS25)モバイル、ウェアラブル、IoT機器向けにデジタルUVセンサを発表](http://prtimes.jp/main/html/rd/p/000000588.000001337.html)
- [(Si1132)シリコンラボ、業界初のデジタル UV インデックス・センサ
「Si1132/Si114x」を発表](http://news.silabs.com/sites/silabs.newshq.businesswire.com/files/press_release/additional/Si1132_4x_UV_Sensors_-_J.pdf)
homestead でPHP5とPHP7の環境を選択する。

 
最近古いhomesteadが立ち上がらなくなった人向け

homesteadは最近PHP7に切り替わりました。

変なhomesteadの入れ方とかしてると、勝手に最新のboxファイルとかが使われたりとかで、
phpfpm周りのエラーが出て使えなかったりするかもしれません。

と、困っていた所、

>  homestead.ymlでボックスバージョン指定できますよ

とTwitterで教えてもらったのでその辺りまとめておきます。

## box_version

調べてみるとどうやらVagrantには`box_version`の指定オプションがあるらしい。

https://www.vagrantup.com/docs/boxes/versioning.html

homestead.rbを見ると、17行目アタリに`box_version`の指定がある。

https://github.com/laravel/homestead/blob/master/scripts/homestead.rb

見る限り`version`の指定で`Homestead.yml`から設定する事が可能みたいです。

## homestead boxファイルのバージョン

homesteadのboxバージョンは下記から確認できます。

https://atlas.hashicorp.com/laravel/boxes/homestead

なので、PHP5の環境を明示的に使いたい場合には、

````
# Homestead.yml
setting: "= 0.3.3"
````

とかしてやれば良いっぽい。
I2Cで通信可能な湿度/温度センサー

# I2Cで通信可能な湿度/温度センサー

## 表面実装
- [HI6130](https://octopart.com/search?q=HIH6130&start=0)
- [HTS221](https://octopart.com/search?q=HTS221&start=0)
- [SHT21](https://octopart.com/search?q=SHT21&start=0)
- [Si7034](https://octopart.com/search?q=Si7034&start=0)
- [HDC1000](https://octopart.com/search?q=HDC1000)
- [HDC1050](https://octopart.com/search?q=HDC1050)
- [HTU21D](https://octopart.com/search?q=HTU21D)
- [SHTW1](https://www.sensirion.com/products/digital-humidity-sensors-for-reliable-measurements/smallest-digital-humidity-sensor-for-iot-applications/)

## スルーホール
- [AM2321](https://octopart.com/search?q=AM2321)
- [AM2320](https://octopart.com/search?q=AM2320)

# 回路例

## HTS221
<img width="359" alt="HTS221.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/7c445cd3-7b54-09d6-8ba7-11cb9e2abc89.png">

## SHT21
<img width="340" alt="SHT21.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/e8c957e8-0fa9-8386-4c6e-432602ab637f.png">

## Si7034
<img width="584" alt="si7034.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/c93bd8ce-e3c4-91d0-ce0c-4d6ebdd46efb.png">

## HDC1050
<img width="680" alt="hdc1050.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/cdff9405-13be-2123-6aa2-67fc4b3d6eba.png">

## HTU21D
<img width="374" alt="htu21d.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/402ebbd6-4747-5806-f93b-fc2067e809da.png">

# レイアウト例

## SHT21
<img width="231" alt="sht21_layout.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/c303bbf1-ce98-4bcc-e5ba-6fd76c939d60.png">

## HTU21D
<img width="151" alt="htu21d_layout.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/cfa070f2-2f4d-d14e-c81f-08bb24cf48cc.png">

## HDC1050
<img width="464" alt="hdu1050_layout.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/c5f9a07b-2f85-ecdf-f900-a0b154007692.png">

# サンプル

- [湿度/温度センサー HTS221をArduinoから制御する(I2C)](http://qiita.com/akira-sasaki/items/90aa0f74fc292621087a)

## リンク
http://www.electronics-lab.com/tag/humidity/page/1/
Vivado > Run Implementation終了時の最終更新ファイル

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

Run Implementation終了時に最後に更新されるファイルのリスト。Powershellで取得した。
http://qiita.com/7of9/items/132d38ea5a4586eccf94

```
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_control_sets_placed.rpt:01/23/2016 12:10:12
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\.route_design.begin.rst:01/23/2016 12:10:12
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_routed.dcp:01/23/2016 12:10:35
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_drc_routed.pb:01/23/2016 12:10:36
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_drc_routed.rpt:01/23/2016 12:10:36
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_timing_summary_routed.rpt:01/23/2016 12:10:38
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_timing_summary_routed.rpx:01/23/2016 12:10:38
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_power_routed.rpt:01/23/2016 12:10:40
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_power_summary_routed.pb:01/23/2016 12:10:40
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_route_status.pb:01/23/2016 12:10:40
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_route_status.rpt:01/23/2016 12:10:40
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\route_design.pb:01/23/2016 12:10:41
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper_clock_utilization_routed.rpt:01/23/2016 12:10:41
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\.route_design.end.rst:01/23/2016 12:10:41
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\vivado.pb:01/23/2016 12:10:41
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\system_wrapper.vdi:01/23/2016 12:10:41
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\runme.log:01/23/2016 12:10:41
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1:01/23/2016 12:10:41
C:\ZyboDev\zybo_160112_baseDesign\hw\zybo_bsd\zybo_bsd.runs\impl_1\.vivado.end.rst:01/23/2016 12:10:41
```

system_wrapper.vdiファイルが終了確認に使えそう。

使ってみたが、このファイルは別の処理でも上書きされるようだ。

代わりに .vivado.end.rst がよさそう。このファイルは複数あるため、フォルダチェックが必要になる。
【Swift2】iOSの端末モデル名を取得する


# 目的

iOSアプリで利用している端末のモデル名(「iPhone 5S」とか「iPad Air」とか)を取得したい。

基本的には[【Swift】使っている端末の情報を取得](http://qiita.com/ryokosuge/items/9d954f54ffc6692c89c4)の情報で良いのだが、Swift2だと微妙に修正しないと動かなかったので修正後のコードを記載する。
ついでにiPhone6S PlusやiPad Proなんかのマッピングも追記。

# 実装

UIDeviceクラスを拡張してあげる方向。


```swift:UIDevice+platform.swift

// cf. http://www.enterpriseios.com/wiki/iOS_Devices
private let DeviceList = [
    /* iPod Touch 5 */    "iPod5,1": "iPod Touch 5",
    /* iPod Touch 6 */    "iPod7,1": "iPod Touch 6",
    /* iPhone 4 */        "iPhone3,1": "iPhone 4", "iPhone3,2": "iPhone 4", "iPhone3,3": "iPhone 4",
    /* iPhone 4S */       "iPhone4,1": "iPhone 4S",
    /* iPhone 5 */        "iPhone5,1": "iPhone 5", "iPhone5,2": "iPhone 5",
    /* iPhone 5C */       "iPhone5,3": "iPhone 5C", "iPhone5,4": "iPhone 5C",
    /* iPhone 5S */       "iPhone6,1": "iPhone 5S", "iPhone6,2": "iPhone 5S",
    /* iPhone 6 */        "iPhone7,2": "iPhone 6",
    /* iPhone 6 Plus */   "iPhone7,1": "iPhone 6 Plus",
    /* iPhone 6S */       "iPhone8,1": "iPhone 6S",
    /* iPhone 6S Plus */  "iPhone8,2": "iPhone 6S Plus",
    /* iPad 2 */          "iPad2,1": "iPad 2", "iPad2,2": "iPad 2", "iPad2,3": "iPad 2", "iPad2,4": "iPad 2",
    /* iPad 3 */          "iPad3,1": "iPad 3", "iPad3,2": "iPad 3", "iPad3,3": "iPad 3",
    /* iPad 4 */          "iPad3,4": "iPad 4", "iPad3,5": "iPad 4", "iPad3,6": "iPad 4",
    /* iPad Air */        "iPad4,1": "iPad Air", "iPad4,2": "iPad Air", "iPad4,3": "iPad Air",
    /* iPad Air 2 */      "iPad5,3": "iPad Air 2", "iPad5,4": "iPad Air 2",
    /* iPad Mini */       "iPad2,5": "iPad Mini", "iPad2,6": "iPad Mini", "iPad2,7": "iPad Mini",
    /* iPad Mini 2 */     "iPad4,4": "iPad Mini 2", "iPad4,5": "iPad Mini 2", "iPad4,6": "iPad Mini 2",
    /* iPad Mini 3 */     "iPad4,7": "iPad Mini 3", "iPad4,8": "iPad Mini 3", "iPad4,9": "iPad Mini 3",
    /* iPad Mini 4 */     "iPad5,1": "iPad Mini 4", "iPad5,2": "iPad Mini 4",
    /* iPad Pro */        "iPad6,7": "iPad Pro", "iPad6,8": "iPad Pro",
    /* Simulator */       "x86_64": "Simulator", "i386": "Simulator",    
]

extension UIDevice {
    
    var platform: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        
        let mirror = Mirror(reflecting: systemInfo.machine)
        var identifier = ""
        
        for child in mirror.children {
            if let value = child.value as? Int8 where value != 0 {
                identifier.append(UnicodeScalar(UInt8(value)))
            }
        }
        return identifier
    }
    
    var modelName: String {
        let identifier = platform
        return DeviceList[identifier] ?? identifier
    }
}
```

# 使い方

```swift:
let device = UIDevice.currentDevice()
print(device.platform) // iPhone8,2
print(device.modelName) // iPhone 6S Plus
```

# 参考

【Swift】使っている端末の情報を取得 - Qiita
http://qiita.com/ryokosuge/items/9d954f54ffc6692c89c4

iOS Devices | Enterprise iOS
http://www.enterpriseios.com/wiki/iOS_Devices