OmniAICreator/Qiita-1.07M huggingface dataset:
nonlocal一題

以下の ``nonlocal_1.py`` を実行すると何が起きるでしょうか。
環境は Python 3.6.0とします (多少古いPython3でも変わりません)

```nonlocal_1.py
def func():
    nonlocal a
    a = 10

a = 2
func()
print(a)
```

 1. 2 と表示される
 2. 10 と表示される
 3. ランタイムエラー (``RuntimeError``) を送出する
 4. それ以外

答えは見えにくいように下の方にあります。

## 解説

そもそも ``nonlocal`` の使う場所が変です。

[nonlocalの仕様](http://docs.python.jp/3/reference/simple_stmts.html#the-nonlocal-statement) によると

> nonlocal 文は、列挙された識別子がグローバルを除く一つ外側のスコープで先に束縛された変数を参照するようにします。これは、束縛のデフォルトの動作がまずローカル名前空間を探索するので重要です。この文は、中にあるコードが、グローバル (モジュール) スコープ以外のローカルスコープの外側の変数を再束縛できるようにします。
>
> nonlocal 文で列挙された名前は、 global 文で列挙された名前と違い、外側のスコープですでに存在する束縛を参照しなければなりません (新しい束縛が作られるべきスコープの選択が曖昧さを排除できません)。

よって上記のコードは文法エラーにて死にます。``a = 2`` を関数の前に置いたって無駄です。

ちなみに以下は動作します。

```nonlocal_2.py
def func():
    def func1():
        nonlocal a
        a = 10

    a = 2
    func1()
    print(a)

func()
```

また、普通ならこんな場所に ``nonlocal`` なんて書きませんということで

```global_1.py
def func():
    global a
    a = 10

a = 2
func()
print(a)
```

これは動作します。 ``global`` は指定された変数をglobal変数として解釈するのであって、存在する変数の有無は気にしません。

もう少し「使った」感じのする ``nonlocal`` の例

```nonlocal_3.py
import random

def func():
    called = 0  # func1()が呼ばれた回数を記録したい
    def func1(a):
        nonlocal called
        called += 1
        return a + random.randrange(10)

    tmp = 0
    t = random.randrange(10)
    for i in range(t):
       tmp = func1(tmp)
    print('func1()は{}回呼ばれた。結果は{}'.format(called, tmp))

func()
```

```shell-session
$ python nonlocal_3.py
func1()は8回呼ばれた。結果は39
$ python nonlocal_3.py
func1()は9回呼ばれた。結果は48
$ python nonlocal_3.py
func1()は1回呼ばれた。結果は8
$ python nonlocal_3.py
func1()は4回呼ばれた。結果は24
```

## (答え)

```shell-session
$ python nonlocal_1.py
  File "nonlocal_1.py", line 2
    nonlocal a
SyntaxError: no binding for nonlocal 'a' found
```

## 感想

ちょっと人為的過ぎる例題でした。
JetBrains製品起動時にJVMのエラー

# JetBrains製品起動時のJVMエラー対処

## does not point to valid JVM

### エラーの詳細

![image](https://qiita-image-store.s3.amazonaws.com/0/53477/ec729d8e-93a7-c115-c2db-112982b08327.png)

```
Error launching PyCharm
The environment variable JAVA_HOME (with the value of C:\ProgramFiles\Java\jdk1.8.x_xxx\bin) does not point to valid JVM installation.
```

### 対応

* JAVA_HOME のパスを確認する。
    * **binまで指定しない！**
        * 誤：C:\ProgramFiles\Java\jdk1.8.x_xxx\bin
        * 正：C:\ProgramFiles\Java\jdk1.8.x_xxx
    * 末尾に;が入っていないか確認する！
        * 誤：C:\ProgramFiles\Java\jdk1.8.x_xxx;
        * 正：C:\ProgramFiles\Java\jdk1.8.x_xxx
OpenCV/numpyで扱う画像データをQt Widget上に表示する

ということで、表題通り、OpenCV/numpyなどで扱ってる画像データをQt(pyqt5)のウィジェット上に表示する方法。
そんなに難しくもないのだけど、メモとして投稿してみる。

ここでは、Pythonから使えるQtラッパーであるPyQt5を使った例。
C++とかでも記述方法が変わるだけで要点は同じである。

まずは、イメージの配列(メモリ上に展開されている)を、`QPixmap`に変換。
下記ソースを見てもらえれば分かるように、ARGB形式のデータである必要がある。なので、もしGrayscaleやRGB形式のデータであれば、OpenCVの`cvtColor()`などで、事前にARGB形態に変換しておく必要がある。

```python
import PyQt5.QtCore as QtCore
import PyQt5.QtGui as QtGui
import PyQt5.QtWidgets as QtWidgets

def create_QPixmap(image):
  qimage = QtGui.QImage(image.data, image.shape[1], image.shape[0], image.shape[1] * 4, QtGui.QImage.Format_ARGB32_Premultiplied)
  pixmap = QtGui.QPixmap.fromImage(image)
  return pixmap
```

で、表示するためには、何らかの`QWidget`上に、この`QPixmap`を描画する必要がある。
なので、`QWidget`を拡張して1つ、クラスを作っておくと便利である。
このクラスでは、ウィジェットが描画されるタイミングで呼び出される`paintEvent()`を拡張して、その中でイメージを描画するようにしてみた。さらなる高速描画が必要なら、OpenGLなどの利用も検討かな。
`QtGui.QPainter`を利用するところがポイント。

```python
class ImageWidget(QtWidgets.QWidget):
  def __init__(self, image):
    super(ImageWidget, self).__init__()
    self.image = image

  def paintEvent(self, event):
    painter = QtGui.QPainter(self)
    if self.image is None:
      painter.setPen(QtCore.Qt.black)
      painter.setBrush(QtCore.Qt.black)
      painter.drawRect(0, 0, self.width(), self.height())
      return
    pixmap = create_QPixmap(self.image)
    painter.drawPixmap(0, 0, self.image.shape[1], self.image.shape[0], pixmap)

  def set_image(self, image):
    self.image = image
    self.update()
```

ということで、以上！
`matplotlib`使うよりスピードはダンチだし、OpenCVの`imshow()`みたいな簡易的な感じでもないし、`pygame`使うよりはちゃんとしたGUI形態に出来る。用途に応じて使い分けましょう。
MacキーボードでWindowsのGoogle日本語入力をうまいこと使う

# 参考
gogatz's blog - VMWare Fusionで英数/かなキーを使う
http://gogatz.hatenablog.com/entry/2016/02/22/141827

# 症状
MacのなかのVMWare FusionではWin10が動いている
ただ、変換時に英数とかなを叩くクセのある当方としては、そこでMacのように切り替えたいものである。
しかもgoogleInputをつかっている現状では、英数入力になっていて、英語を打つためにはエンターで確定する必要がある。
これではエディタで編集するときに、予測変換も効かず、ものすごく邪魔。
さらに最近は職場でWindowsにMagic Keyboardをつないだもんだから、もう我慢ならん。

# 対処
「英数」をIME無効、「かな」をIME有効に割り当てる
GoogleInputのプロパティ > キー設定
キーでソートすると Eisu というキーが有る。
（最初Muhenkanだと思ってやっても使えなかった。BootCampのときはMuhenkanかもしれない）
ここのキーバインドを「IME無効」に変える。

■ 2019/01/23 追記
何故かたまにカタカナしか打てなくなる現象があったので、キーバインドを確認してみたところ、変換中の Shift Hiragana が「全角カナに変換」というものであった。
これか！と思い、一思いに削除。
カタカナは現れなくなったのでした。
私はカタカナ変換するぐらいなら打ち直して上連打する人間なので、このキーバインドはいらなかった。

おわり。
SQLアンチパターン：リーダブルパスワード

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

# アンチパターン

- パスワードを平文で格納する
  - 重大なセキュリティ欠陥

- 通信を傍受、SQLの実行ログなど、パスワードに関するSQLを見つけて、パスワードを取得できるチャンスがある
- パスワードをメールで送るのも、セキュリティ欠陥

## 用いてもいいパターン

- 作っているアプリケーションが、クライアントになる場合
  - ただし、アプリケーションが解読できる暗号化して保存

# 解決策

- ソルトをつけてパスワードハッシュを格納する
  - ソルトとは、暗号化前のパスワードに連結する無意味な文字列のこと。
- SQLでパスワードを平文として扱わないこと。アプリケーション側でソルトを用いたハッシュを生成して、SQLで扱うこと
- パスワードをリカバリーするのではなく、リセットする
- 一意なtokenを識別子として用いる

# まとめ

あなたが読み取れるものは、攻撃者にも読み取れます。

# 感想

同意。

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
VisualStudioCode 統合コンソール のbash.exe でファイル名の日本語文字化け対応

VSCodeの統合コンソールで cmd じゃなくて Bashを使いながら作業をしたい！と思ったけど、ls したときに Windowsのディレクトリ名などの表示で日本語が化けてハマったのでメモ。

# やりたいこと
* VisualStudioCode の統合コンソールでBashを使いたい
* bash on windowsだとそのまま Windows の exe を実行できなくてデバッグが面倒だったので今回は git for windows に同梱のbash.exe を使う。 https://git-for-windows.github.io/
* ディレクトリ名やファイル名の日本語が化けるので対策したい

# 手元の環境
* Windows10
* VisualStdioCode 1.9.1
* git for windows のインストール先が "C:\Program Files\Git"

# 統合コンソールで使うシェルの設定

* VScode のメニューから ファイル → 基本設定 → 設定でユーザ設定に下記を1行追加

```
   "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
```

* 設定を保存、VScodeを再起動。
* Ctrl+` で起動する統合コンソールで指定した bash.exe が起動するようになる。
* ls などで文字化けるか確認する
* locale の状態を見ると 日本語設定がない事を確認できるので確認する

# bashrc の設定追加
* bash.exe が起動時に見る %home%/.bashrc へ下記を追記

```
export LC_ALL=ja_JP.utf8
export LANG=ja_JP.utf8
export LANGUAGE=ja_JP.utf8
export LC_CTYPE="ja_JP.utf8"
export LC_NUMERIC="ja_JP.utf8"
export LC_TIME="ja_JP.utf8"
export LC_COLLATE="ja_JP.utf8"
export LC_MONETARY="ja_JP.utf8"
export LC_MESSAGES="ja_JP.utf8"
```
* VScode の統合コンソールを再起動して locale の状態、ls で文字化けが解消したかを見る

### 今回参考にしたサイトなど
* http://qiita.com/m_zuma/items/6b2ee25001109a6506c4
* https://ygkb.jp/windows/3494
ローカルクラスタ実行中のKubernetesのログをscreenでいい感じにモニタリングする

## はじめに

「[Kubernetesをソースコードからビルドしてローカル環境にkubernetes clusterを構築する](http://qiita.com/mittjp1129/items/aaba9c93086e7d598121)」で構築した環境では、/tmp以下に各種サービスのログが出力されています。これらのログをいちいちtail -fするのが面倒なのと、色付けされていないため高速に流れていくログでは何が問題なのかが直観的で分からないため、OpenStackのdevstack風に、ログをscreenに表示して色付けする方法を試してみました。

公式でいい方法があればうれしいのですが、少し探した限りでは見つからず断念。

```
Logs:
  /tmp/kube-apiserver.log
  /tmp/kube-controller-manager.log
  /tmp/kube-proxy.log
  /tmp/kube-scheduler.log
  /tmp/kubelet.log
```

## パッケージのインストールとスクリプトの配置
ログの色付けには、cczeというツールを使います。予め定義されているキーワードと配色、例えばERRORは赤色で表示などの設定を使ってログをカラーで表示してくれます。

```bash
% wget https://dl.fedoraproject.org/pub/epel/7Server/x86_64/c/ccze-0.2.1-11.el7.x86_64.rpm
% rpm -ivh ccze-0.2.1-11.el7.x86_64.rpm
```

あと、screenパッケージもない場合は追加が必要です。

sreenを起動するための設定ファイル。stuff行末尾の^Mは、ctrl+v ctrl +mで入力出来ます。

```bash
% cat k8s-screenrc
sessionname k8s-debug
hardstatus alwayslastline '%{= .} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
setenv PROMPT_COMMAND /bin/true
screen -t shell bash
screen -t kube-apiserver bash
stuff "sudo tail -f /tmp/kube-apiserver.log | ccze -A^M"
screen -t kubelet bash
stuff "sudo tail -f /tmp/kubelet.log | ccze -A^M"
screen -t kube-controller-manage bash
stuff "sudo tail -f /tmp/kube-controller-manager.log | ccze -A^M"
screen -t kube-proxy bash
stuff "sudo tail -f /tmp/kube-proxy.log | ccze -A^M"
screen -t kube-scheduler bash
stuff "sudo tail -f /tmp/kube-scheduler.log | ccze -A^M"
```

screenを起動するためのスクリプトです。screenセッションがあれば既存のものを、なければ新規に作ります。(ベースは、devstackのrejoin.shです。)

```bash
% cat k8s-screen.sh
#! /usr/bin/env bash

TOP_DIR=`dirname $0`
SCREEN_NAME="k8s-debug"
SCREEN_FILE="k8s-screenrc"

SCREENRC=$TOP_DIR/$SCREEN_FILE
# if screenrc exists, run screen
if [[ -e $SCREENRC ]]; then
    if screen -ls | egrep -q "[0-9]+.${SCREEN_NAME}"; then
        echo "Attaching to already started screen session.."
        exec screen -r $SCREEN_NAME
    fi
    exec screen -c $SCREENRC
fi

echo "Couldn't find $SCREENRC file;"
exit 1
```

## k8s-screen.sh実行結果
本当はE0xxx行を強調するなどできればいいのですが、最低限エラーに気づけるようになったのでよしとします。

![k8s-debug.png](https://qiita-image-store.s3.amazonaws.com/0/166844/f373fb19-f7e2-bcb0-a701-edd56b471588.png)
rails new 'appName'

cd ~/projects
rails new appName -B -C -T -d sqlite3

-B bundle installスキップ
-C ActiveCable関連ソースコードを生成しない
-T　テスト関連ソースコードを生成しない
-d sqlite3 DBMSとしてSqlite3を選択

cd appName

```ruby:
/rails
-/app
	--/assets :(javascript,stylesheets,img)
		---/images
		---/javascripts
		---/stylesheets
	--/controllers
		---/application_controller.rb
	--/helpers
		---/application_helper.rb
	--/mailers
	--/models
	--/views
		---/layouts
			----/application.html.erb
-/config
	--/environments
	--/initialisers
	--/locales
-/db
-/doc
-/lib
	--/assets
	--/tasks
-/log
-/public
-/script
-/test
-/tmp
-/vendor
	--/assets
	--/plugins
-/config.ru
-/Gemfile
-/Rakefile
-/README
```
rails db:seed

cd ~/projects
git clone -b volume03 git://github.com/.../aaa.git pp
git -b :volume03ブランチ　を指定
git 指定なし　:masterブランチ　を指定
#pp :ディレクトリ名


rails db:setup
データベース初期化
rails db:seed シードファイルの実行


```ruby:seed.rb
coding: utf-8
#articlesテーブルにデータ投入
Article.create(
 :url => 'Script',
 :title => 'Script', category => 'Script',
 :published => 'Script', :access => 'Script', :closed 'Script')
```

rails db:setup データベースの作成、スキーマ構築、初期データ投入


rails s
http://localhost:3000
Paper > link > Image Orientation Estimation with Convolutional Networks > 画像の傾き補正 / COCO dataset

Image Orientation Estimation with Convolutional Networks
Philipp Fischer et al.
http://lmb.informatik.uni-freiburg.de/Publications/2015/FDB15/image_orientation.pdf

画像の本来あるべき方向への補正をConvNet(CNN)を用いて学習するというものらしい。
realtimeでの補正に使えるとのこと。

### 学習データセット

学習に関しては`3.1 Data`に記載がある。
> Hence, we rather use the publicly available Microsoft COCO dataset [1] as training set and apply rotations artificially.

[COCO dataset](http://mscoco.org/)自体はノイズデータ（方向が不明なデータ）を除くと、本来あるべき方向の画像となっている。
それらの画像を意図的に回転させたものをinputに使って、outputに回転前画像を使うということのようだ。

### 回転の角度

`3.2 Tasks and networks`に記載がある。

±３０度、±４５度、３６０度回転などを考慮している。

### networks

`3.2 Tasks and networks`に記載がある。

> For all three tasks we built upon the AlexNet architecture from Krizhevsky et al. [8] implemented in Caffe [6] and pretrained on ImageNet. This architecture consists of 5 convolutional layers, followed by 3 fully connected layers. After each fully connected layer, a rectified linear unit is used as nonlinearity. Additionally normalization and dropout are applied. For more details see [8].

AlexNetの構造は以下にFigure　2として例示されている。
https://www.saagie.com/blog/object-detection-part1
Github | ユーザー名の再取得・交換は出来るのか試してみた

# 結論

- 再取得: 出来る。
- 交換: 出来る。


# 検証

## やりたいこと

- ユーザー名A
- ユーザー名B

の中身を交換したい。

## 場所

Settings　=> Account から変更する。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/0622ba87-8aae-b83c-1620-c3e57c255527.png)

## 警告

- プロフィールページはリダイレクトされない
- レポジトリはリダイレクトされる (すげえ！)

と説明される。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b122e997-6b6e-c25e-3fa3-747f6352bbcc.png)


## ユーザー名B => ユーザー名C 

一旦てきとうなユーザー名を作って、既存のユーザー名を空ける。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b207ea25-d5f3-1144-2c63-85a0b5ae45ac.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/c421b96a-f9aa-7dd9-4d81-95bcc187a28a.png)


![スクリーンショット 2017-02-25 午前7.52.18.png](https://qiita-image-store.s3.amazonaws.com/0/89618/01a6a51d-0630-3aaa-d7a1-0daf2cc72896.png)

出来た。

## ユーザー名A => ユーザー名B

ユーザー名空間が空いたはずので、それを埋める。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/103c4989-81c2-8d88-9b89-b482ca72f4f1.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/ca430f72-a5ed-27b7-0bbb-e2b3ab394908.png)

![スクリーンショット 2017-02-25 午前7.55.22.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a9c568fc-14a6-1097-42a2-7b6e1a0b7c3d.png)

これも出来た。

## ユーザー名C => ユーザー名A

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/d2f27971-8213-0298-982e-96c27f6b9d58.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/ba740f4d-f2e3-9bab-b73c-88ecc86b1947.png)


これも出来た。

## プロフィールページ

同じURLに対して、中身が入れ替わる。（ 警告の通り ）

クールなURIではなくなるが、これは仕方ない。

>クールなURIは変わらない
http://www.kanzaki.com/docs/Style/URI

## Pull Request

以前に送ったPullRequestも、ちゃんと新しいユーザー名に紐付けられている。 ( レポジトリがうまくリダイレクトされている )

![スクリーンショット 2017-02-25 午前7.55.22.png](https://qiita-image-
store.s3.amazonaws.com/0/89618/cc2be1d3-6bc2-5b26-863c-540027417ba6.png)

![スクリーンショット 2017-02-25 午前7.55.58.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e36969e0-8f2c-8731-0d09-8026f1646da9.png)

# 動機

名前重要。
自分のユーザー名がしっきり来てないと、テンションが15%ぐらい下がる気がする。

# 備考

- 2017年2月 情報

# 参考

- http://qiita.com/delphinus/items/7ebba704b3bad4603e81








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Python / Numpy > Link > numpy.random と random.randomの違い > thread-safe かどうか

`numpy.random`と`random.random`の違いについて
http://stackoverflow.com/questions/7029993/differences-between-numpy-random-and-random-random-in-python

### thread-safeかどうか

回答の中で気になったのは以下。
> answered Aug 11 '11 at 17:56
> Hannele
>...
> For numpy.random.seed(), the main difficulty is that it is not thread-safe -
>...
As far as I can tell, random.random.seed() is thread-safe (or at least, I haven't found any evidence to the contrary).

### 他の違い

> The numpy.random library contains a few extra probability distributions commonly used in scientific research, as well as a couple of convenience functions for generating arrays of random data. The random.random library is a little more lightweight, and should be fine if you're not doing scientific research or other kinds of work in statistics.


### Mersenne twister

> Otherwise, they both use the Mersenne twister sequence to generate their random numbers

### crypt関連

上記のリンク先においては、crypt関連の場合は。。。という表記がいくつか見つかる。
deterministic(決定論的な)方法を使っているMersenne twisterなどではcrypt関連では問題になるとのこと。

cryptは使うことはないだろう。
[めも]mochaとchaiの使い方

[ユニットテストって何?って人向けのmochaとchaiの使い方](http://qiita.com/y_hokkey/items/f73ea6b3d5f6902396b6) を見ていて、
MochaとChaiの事が気になったので、簡単な使いかたをメモ。

#フォルダ構成 (Nodeが動く環境用)
/
L package.json
L /test

**package.json (抜粋)**
```
  "scripts": {
    "test": "mocha"
  },
```

テスト用のコードは、`/test` **直下**に置きます。
(mochaの自動検索対象は、`/test`直下のみ。)

Visual Studio Codeにnpm用の拡張機能を入れておくと、
`Ctrl+R T`でテストが実行できるので便利！
(`npm run-script test test`が呼ばれます。)

参照：
[Mocha: Getting Started](http://mochajs.org/#getting-started)

以上！　・・で終わってもよいのですが、以下おまけ。

##Chaiの使いどころ：assert以外のものも使える

Mochaに組込まれているのは、Nodeのassertのみ。
expect()などを使いたい場合は、Chaiなどのライブラリが必要になります。
[Mocha: Assertions](http://mochajs.org/#assertions)
>chai - expect(), assert() and should-style assertions



##テスト用のコードの例 (Mocha + Chai)
ベースは、[Mocha: Dynamically Generating Tests](http://mochajs.org/#dynamically-generating-tests)

```
"use strict";

const chai = require('chai');
const expect = chai.expect;
const tgt = require('../dist/tgt'); // テスト対象のモジュール

describe('モジュール名とか', function()
{
    describe('関数名とか', function()
    {
        const fnc = tgt.fnc; // テスト対象の関数
        const arr = [
            { value: 'あってる', comp: true },
            { value: '間違い', comp: false }
        ];

        arr.forEach(function(test)
        {
            const msg = 'value:' + test.value; // テスト結果の各行に表示されるメッセージ
            it (msg, function()
            {
                expect(fnc(test.value)).to.be.equal(test.comp);
            });
        });
    });
});
```
[Javascript] ある条件が満たされるまでループする

例えば、あるライブラリ``lib.js``を読み込んだ後にそのライブラリの関数``func``に引数``[1, 2]``を入れて実行したいとする。
その場合以下のように書けばよい。

```html
<!-- 読み込み終わると、グローバル変数 MYLIB にライブラリが代入されるものとする -->
<script async src="lib.js">

<script>
(function loop(args, interval) {
	if(typeof MYLIB !== "undefined") { // ループを抜ける条件を入れる
		return MYLIB.func(args); // func(args); return true; などと書いてもいい
	}
	setTimeout(loop, interval, args);
})([1, 2], 100); // 100ミリ秒ごとにチェックする
</script>
```

これを一般化すると以下のようになる。

```javascript
(function loop(args, interval) {
	if(condition) { // ループを抜ける条件を入れる
		return func(args);
	}
	setTimeout(loop, interval, args);
})();
```

さらに一般化を進め、任意の関数を条件達成後に実行する関数は以下となる。

```javascript
/**
 * 100ミリ秒毎にライブラリの読み込みが終わったかチェックし、その後関数funcを実行するループを作成する。
 * @param {function} func      ループを抜ける際に実行される関数 
 * @param {function} condition ループを抜ける条件。この関数は true か false を返さなければならない
 * @param {array}    args      func に適用される引数の配列
 * @param {number}   interval  ループする感覚（ミリ秒）
 */
let makeLoop = (func, condition = () => {return true}, args = [], interval = 100) => {
	(function loop() {
		if(condition() === true) {
			return func(args)
		}
		setTimeout(loop, interval, args);
	})();
};


// 読み込み終わると、グローバル変数 MYLIB にライブラリが代入されるものとする
$.getScript("lib.js");

let [f, c, a, i] = [
	(args) => { MYLIB.func(args) }, // Uncaught ReferenceError を回避するため
	() => {
		return typeof MYLIB !== "undefined";
	},
	[1, 2],
	100
];

makeLoop(f, c, a, i); // MYLIB に値が代入された後100ミリ秒以内に MYLIB.func([1, 2]) が実行される
```
技術英語 > lined up on the left

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1972 / 12833)

> , lined up on the left

前の文章から続けると

> the lines need to be indented the same amount, **lined up on the left**

左側でインデントをあわせているということだろう。

<hr>
関連して思い出したのは

> a road lined with trees

両脇に木々が連なる道をイメージする。
Agdaで困ったら

# インストール
http://agda.readthedocs.io/en/latest/getting-started/installation.html

# Unicodeで困ったら
http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Docs.UnicodeInput

# Emacsのキーバインディングの一覧
http://agda.readthedocs.io/en/latest/tools/emacs-mode.html
NefryでGrove温湿度センサー(DHT11)を使うメモ


[前回](http://qiita.com/n0bisuke/items/3ec65674696f94bc1e96)に続き、今回はGroveの温湿度センサーを使ってみます。

## Grove - Temperature&Humidity Sensor

http://wiki.seeed.cc/Grove-TemperatureAndHumidity_Sensor/

![](https://i.gyazo.com/2b187ec5a764bda68c2ef2368a8cbeb6.png)

ライブラリなどを調べるときは`DHT11`で調べましょう。

## ライブラリ追加

`Arduino IDE > スケッチ > ライブラリのインクルード > ライブラリの管理`からライブラリマネージャを開きます。

![スクリーンショット 2017-02-25 5.59.19.png](https://qiita-image-store.s3.amazonaws.com/0/35387/2b6c6adb-214c-06ed-9e36-58f03828373a.png "スクリーンショット 2017-02-25 5.59.19.png")

`DHT11`で検索しましょう。
`DHT sensor library by Adafruit`をインストールします。

![](https://i.gyazo.com/aa75dc33f87c16807fad3a330ddf61c0.png)


次に https://github.com/adafruit/Adafruit_Sensor から.zipファイルをダウンロードして、Arduino IDEから `Arduino IDE > スケッチ > ライブラリのインクルード > .zip形式のライブラリをインストール`を選択します。

## 温度を計測しつつ、湿度によってLEDを変化させる

見出し通りですが、湿度が60%を超えたら青く、59%以下なら赤くするプログラムです。

![](https://i.gyazo.com/4fe63d8a27fb0bf398427fb58f012352.gif)

```
#include <Nefry.h>
#include "DHT.h"
#define DHTPIN D4     // what digital pin we're connected to

#define DHTTYPE DHT11   // DHT 11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Nefry.println("DHTxx test!");
  Nefry.setLed(0,0,0);
  dht.begin();
}

void loop() {
  Nefry.ndelay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);

  if (isnan(h) || isnan(t) || isnan(f)) {
    Nefry.println("Failed to read from DHT sensor!");
    return;
  }

  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);

  Nefry.print("Humidity: ");
  Nefry.print(h);
  Nefry.print(" %\t");
  Nefry.print("Temperature: ");
  Nefry.print(t);
  Nefry.print(" *C ");
  Nefry.print(f);
  Nefry.print(" *F\t");
  Nefry.print("Heat index: ");
  Nefry.print(hic);
  Nefry.print(" *C ");
  Nefry.print(hif);
  Nefry.println(" *F");

  //湿度が60%を超えたらLEDが青く光り、59%以下だと赤く光る
  if(h > 60){
     Nefry.setLed(0,0,200,50);
  }else{
     Nefry.setLed(200,0,0,50);
  }
}
```
Ruby | Faker で 重複しないユニークな値を生成する

Faker 1.7.3  からユニーク値の生成がサポートされたようだ。（素晴らしい）

READMEのTOPにも書かれているので、かなり重要な変更と認識されているようだ。

# 検証

従来の書き方だと値が重複する。

```rb
Array.new(10000) { Faker::Name.name }.uniq.size
=> 9984
```

unique をつけると重複しない。

```rb
Array.new(10000) { Faker::Name.unique.name }.uniq.size
=> 10000
```

# ユニーク値の枯渇とリセット

ユニーク値が尽きると例外が起こる。( method_missing だと。。？ )

```rb
[23] pry(main)> Faker::Number.unique.number(1)
=> "7"
[24] pry(main)> Faker::Number.unique.number(1)
=> "3"
[25] pry(main)> Faker::Number.unique.number(1)
=> "5"
[26] pry(main)> Faker::Number.unique.number(1)
=> "9"
[27] pry(main)> Faker::Number.unique.number(1)
=> "4"
[28] pry(main)> Faker::Number.unique.number(1)
=> "8"
[29] pry(main)> Faker::Number.unique.number(1)
=> "2"
[30] pry(main)> Faker::Number.unique.number(1)
=> "1"
[31] pry(main)> Faker::Number.unique.number(1)
=> "0"
[32] pry(main)> Faker::Number.unique.number(1)
=> "6"
[33] pry(main)> Faker::Number.unique.number(1)
Faker::UniqueGenerator::RetryLimitExceeded: Faker::UniqueGenerator::RetryLimitExceeded
from /Users/yuma/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/faker-1.7.3/lib/helpers/unique_generator.rb:19:in `method_missing'
```

リセットするとまた使えるようになる。

```rb
[34] pry(main)> Faker::Number.unique.clear
=> {}
[35] pry(main)> Faker::Number.unique.number(1)
=> "4"
[36] pry(main)> Faker::Number.unique.number(1)
=> "8"
```

# 環境

- faker 1.7.3
- ruby 2.3.0

# 参考

- https://github.com/stympy/faker/blob/master/CHANGELOG.md








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Git の特定の Author と Commiter を変更するシェルスクリプト。

# スクリプト
```bash
#!/bin/sh

if [ $# -ne 3 ]; then
    echo '引数は、変更元コミッターネーム、変更先名前、変更先メールアドレスの順です。' 1>&2
    exit 1
fi

git filter-branch -f --commit-filter "
if [ \"\$GIT_COMMITTER_NAME\" = '$1' ]; then
    GIT_COMMITTER_NAME='$2'
    GIT_COMMITTER_EMAIL='$3'
    GIT_AUTHOR_NAME='$2'
    GIT_AUTHOR_EMAIL='$3'
fi
git commit-tree \"\$@\"
" HEAD
```

3 行で使えます。
.git ディレクトリが置かれているディレクトリで実行してください。

```bash
curl -LSfs -o change_git_committer_and_author.sh https://raw.githubusercontent.com/wsjdev/scripts/master/change_git_committer_and_author.sh
sh change_git_committer_and_author.sh 'bad_name' 'good_name' 'good@email.dayo'
rm change_git_committer_and_author.sh
```

[ここにもあるよ。(GitHub)](https://github.com/wsjdev/scripts/blob/master/change_git_committer_and_author.sh)

# 効果
第一引数と **committer name** が一致したコミットの
`committer name`
`author name`
を第二引数
`committer email`
`author email`
を第三引数に変更します。
PocketCHIP을 잘 써보기 위한 삽질 기록

# 시작하기 전에
* __미완성__ 
* [PocketCHIPを使いこなすための記録](http://qiita.com/cheesekun/items/48d4e7676e6a645899c7)의 한국어판 문서입니다. 여기서는 일본어 대신 한국어 입력 설정 방법에 대해 설명합니다.

# PocketCHIPとは
[https://getchip.com/pages/pocketchip](https://getchip.com/pages/pocketchip)을 봐 주세요💕

# 초기화
초기화 / OS 재설치를 위해선 Google Chrome 계열의 브라우저로 [http://flash.getchip.com](http://flash.getchip.com) 에 접속하여 지시 사항을 따릅니다.
#### TIP
* 제 경우 PocketCHIP 종료 메뉴에 있는 Flash Mode를 사용했더니 기기 인식이 되지 않았습니다. 되도록 [http://flash.getchip.com](http://flash.getchip.com) 에 있는 방법 대로 CHIP를 PocketCHIP으로부터 분리하여, FEL 단자와 GROUND를 연결한 채로 PC에 연결하시는 것을 추천합니다.


# 한글 입력 설정
## 로케일 설정
PocketCHIP은 기본적으로 UTF-8로 로케일 설정이 되어 있지 않을 뿐더러 관련 패키지조차도 설치되어 있지 않습니다.
우선은 로케일 패키지부터 설치하고 로케일을 변경해 봅시다.

```shell-session:bash
# 로케일 패키지 설치
$ sudo apt install locales 
# 로케일 설정
$ sudo dpkg-reconfigure locales
# 재부팅
$ sudo reboot
```

* 로케일을 `en_US.UTF-8`로 지정하면 영어로, `ko_KR.UTF-8`로 지정하면 한국어로 메시지가 출력됩니다. (다음 부팅때부터)
* 복수의 로케일을 지정했을 경우 `$HOME/.bashrc`등 각 사용자의 설정 파일(dotfile)에서 `LANG` 환경 변수를 설정하면 로케일을 변경할 수 있습니다. (`export LANG=ko_KR.UTF-8`)

## 폰트 설치
한글 폰트를 설치합니다

```shell-session:bash
# 나눔 고딕
$ sudo apt install fonts-nanum fonts-nanum-coding
```

## 한글 입력 설정
다국어 입력 메소드 uim를 설치합니다.

```shell-session:bash
$ sudo apt install uim uim-byeoru

# uim을 기본 입력 메소드로 설정
$ im-config -n uim
```

### uim 설정
#### 주의
* 설정 창이 화면보다 커서 튀어 나옵니다. Alt 키를 누르면서 창을 드래그하면 창을 옮길 수 있어요💕(적당

```shell-session:bash
$ uim-pref-qt4 
```
![20170225_033608.jpg](https://qiita-image-store.s3.amazonaws.com/0/59644/12836f98-82d7-8c08-c74a-a59818e5f48c.jpeg)
![20170225_033626.jpg](https://qiita-image-store.s3.amazonaws.com/0/59644/90d56f23-bb9a-a22c-7a89-73f77f2a45e9.jpeg)

* 기본 입력 메소드를 byeoru로 설정
* byeoru 키 바인드 설정에서on off 둘 다 Shift + space로 설정
* 저장하고 재부팅
* 재부팅하면 아마 Shift + Space로 한/영 전환이 가능해 질겁니다
* 졸리니 일단 여기까지 쓰고 나중에 더 쓰도록 하지요
* 안녕히 주무세요! Zzz…

# 트러블슈팅 / TIP
## 비밀번호 뭐야
* `chip`입니다.

## 터미널이나 SSH 세션에서 하이픈(-) 키가 안 먹어요.
PocketCHIP의 하이픈(-) 키가 텐키의 하이픈 키로 바인드 되어 있어서 일어나는 문제입니다. (NumLock이 꺼지면 작동하지 않음)
`vim` 등의 텍스트 에디터로 `~/.Xmodmap`를 열고, 28~29번째 줄을 다음과 같이 변경합니다.

```
28| keycode  82 = minus underscore F11 minus
29| keycode  86 = plus equal F12 plus
```

## 터치 패널로 오른쪽 클릭 하고 싶어요.
`vim` 등의 텍스트 에디터로 `/usr/share/X11/xorg.conf.d/99-calibration.conf`를 열고, `Section "InputClass"`와 `EndSection`사이에 다음과 같은 내용을 추가합니다.

```
Option "EmulateThirdButton" "1"
Option "EmulateThirdButtonTimeout" "1000"
Option "EmulateThirdButtonMoveThreshold" "30"
``` 

## 몇몇 프로그램이 창이 화면보다 커서 안보여요
* Alt 키를 누르면서 창을 드래그하면 창을 이동시킬 수 있습니다.

## 시간이 이상해요
* `timedatectl`로 시간대를 설정할 수 있습니다.

```shell-session:bash
$ sudo timedatectl set-timezone Asia/Tokyo
```

## 동영상 재생 / 게임 관련
* 현재로써는 h264 등의 하드웨어 디코딩은 불가능한 것 같습니다..😞
* 일단 GPU driver blob은 들어가 있어서 SDL(framebuffer)+OpenGLES로 그래픽 가속은 가능한 모양입니다.
* divx/xvid로 인코딩 된 영상은 mplayer로 돌아가긴 해요(SDL)

# あとがき
* 졸리니까 나중에 고칠래
NefryでGrove加速度センサを触るメモ


[前回](http://qiita.com/n0bisuke/items/0abe67b0d293e24a5628)に続き、[Nefry](https://dotstud.io/shop/nefry-connect-internet/)でGroveの加速度センサを使ってみます。

## Grove - 3-Axis Digital Accelerometer(±1.5g)

* http://wiki.seeed.cc/Grove-3-Axis_Digital_Accelerometer-1.5g/

![](https://i.gyazo.com/279b9cb5597debbcbeb78ef02254bfe8.png)

スペックはこんな感じです。 Nefryだと3.3V対応しているセンサを使えるのでこのセンサーは問題なく使えます。

```
Working voltage: 3.0 - 5.5V
Off Mode Current: 0.4μA
Standby Mode Current: 2μA
Active Mode Current: 47 μA at 1 ODR
Test Range: ±1.5g
Sensitivity: 21LSB/g
Suli-compatible Library
```

## ライブラリを読み込む

センサーを扱うために、Seeedの公式サイト経由でAccelerometer_MMA7660ライブラリをダウンロードして使います。

> https://github.com/Seeed-Studio/Accelerometer_MMA7660

## 3軸の加速度に合わせてLEDの色を変える

こんな感じでセンサーを振ると方向によって色が変わるものを作ります。

* x軸方向 赤色
* y軸方向 緑色
* z軸方向 青色

![](https://i.gyazo.com/f4743f0d427a31aa7b7b0ea7a360e994.gif)

Arduinoのサンプルプログラムに毛が生えたくらいですが以下がプログラムになります。

```
#include <Nefry.h>
#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;

void setup()
{
  Nefry.print("Grove 3-Axis Digital Accelerometer");
  Nefry.setLed(0,0,0);
  accelemeter.init();  
}

void loop()
{
  int8_t x;
  int8_t y;
  int8_t z;
  float ax,ay,az;
  accelemeter.getXYZ(&x,&y,&z);
  Nefry.setLed(x,y,z,50);
  
  Nefry.print("x = ");
    Nefry.println(x); 
    Nefry.print("y = ");
    Nefry.println(y);   
    Nefry.print("z = ");
    Nefry.println(z);
  
  accelemeter.getAcceleration(&ax,&ay,&az);
    Nefry.println("accleration of X/Y/Z: ");
  Nefry.print(ax);
  Nefry.println(" g");
  Nefry.print(ay);
  Nefry.println(" g");
  Nefry.print(az);
  Nefry.println(" g");
  Nefry.println("*************");
  delay(500);
}
```
複数バージョンのPythonをインストール

#pyenvをインストール
```bash
$ brew install pyenv
```

#Python 2系をインストール 
```bash
$ pyenv install 2.7.5
```

#インストールしたバージョンを確認
```bash
$ pyenv versions
```

#グローバルで利用するPythonを指定
```bash
$ pyenv global バージョン
```

#特定のディレクトリで利用するPythonを指定
```bash
$ pyenv local バージョン
```
fluentdでout_fileしたテキストファイルから再度fluentdに送り直す

とあるfluent pluginのバグを踏んでしまって、フローの途中で処理されずにエラーになってしまっていた事象がありました。

しかし幸いにもout_fileでテキストファイルに退避していたためこれを再処理できるかなー？と思い以下のような書き捨てスクリプトを書いてみました。

```python
# -*- coding: utf-8 -*-
import sys
import json
import pdb
from fluent import sender
from datetime import datetime

# vars
send_tag = 'okuritai.tagdesu'
label = ''
extz = '+00:00'

# logger init
logger = sender.FluentSender(send_tag, host='localhost', port=24224)
#logger = sender.FluentSender(send_tag, host='unix:///path/to/td-agent.sock')

def parse(line):
    dt, tag, message = line.split("\t")

    dt = datetime.strptime(dt, '%Y-%m-%dT%H:%M:%S'+extz)
    message = json.loads(message)

    return dt, tag, message

def send(dt, message):
    epoch = int(dt.strftime('%s'))
    if not logger.emit_with_time(label, epoch, message):
        print(logger.last_error)

def main(fname):
    with open(fname) as f:
        for line in f:
           dt, tag, message = parse(line)
           send(dt, message)


# argv
if len(sys.argv) < 2:
    print "usage: fluentd_reprocessing.py <filename>"
    sys.exit(1)

fname = sys.argv[1]
# run main
main(fname)
```

`<timestamp>TAB<tag>TAB<message>` というフォーマットでファイルに出力されるので、それをパースしてsendし直しているだけ。
問題なく再ロード完了し、事なきを得ました :)
order(title),reorder('tilte')

#データを昇順・降順に並べ替える
```ruby:qiita.rb
render
model_controller.rb(query_sortアクション)
@articles = Article.order('published')
@articles = Article.order('published DESC, title')
@articles = Article.order('published DESC').reorder('tilte')
@articles = Article.order('published DESC').reorder('nil')

```
GCP利用登録からCloud Spannerのテーブル作成してINSERT/SELECTしてみた手順

GCPお試しがてらCloud Spannerのテーブル作成からローカル（Mac OS X）のテストコード(go)でINSERT/SELECTをしてみた手順です。

## ローカル環境
- Mac OS X El Capitan
- go v1.7.4

## やったこと一覧とテストコード

### 1 Google Cloud Platform の使用登録
1. 登録 (割愛)
2. お支払の設定(割愛)

### 2 Cloud Spannerのインスタンス作成
1. [Cloud Spanner](https://console.cloud.google.com/spanner/instances) から
    1. インスタンス `testinstance`　作成
    2. データベース　`spannertrial`　作成
    3. テーブル　`post`　作成

スキーマはこんな感じ

```
CREATE TABLE post (
	id INT64 NOT NULL,
	author_id INT64 NOT NULL,
	content STRING(MAX),
	created_at TIMESTAMP,
) PRIMARY KEY (id)
```

### 3. Spanner API の有効化
1. [API Manager](https://console.cloud.google.com/apis/dashboard)　から
2. `[+] APIを有効にする`　をClick
3. Cloud Spanner API　を検索して有効化

### 4. Google Cloud SDK の導入
1. Download (https://cloud.google.com/sdk/)
2. インストール 
3. 認証
    1. `gcloud beta auth application-default login`
    2. ブラウザで認証
    ３. https://cloud.google.com/sdk/auth_success

### 5. ドキュメントに沿ってコーディング
1. https://cloud.google.com/spanner/docs/reference/libraries
2. https://godoc.org/cloud.google.com/go/spanner

```spanner-trial.go
package main

import (
	"fmt"
	"strconv"
	"time"

	"cloud.google.com/go/spanner"
	"golang.org/x/net/context"
)

//　全体的にエラー処理は割愛
func main() {
	ctx := context.Background()
	// データベースID
	databaseID := "projects/my-project-id/instances/testinstance/databases/spannertrial"

	// クライアント生成
	client, _ := spanner.NewClient(ctx, databaseID)

	// 最大ID取得
	var lastid int64
	var newid int64
	iter := client.Single().Query(ctx, spanner.NewStatement("SELECT id FROM post order by id desc limit 1"))
	iter.Do(func(row *spanner.Row) error {
		row.Column(0, &lastid)
		newid = lastid + 1
		fmt.Printf("last id of post: %v\n", lastid)
		fmt.Printf("new id: %v\n", newid)
		return nil
	})

	// 新ポストインサート
	newcontent := "テストのポスト" + strconv.FormatInt(newid, 10)
	client.Apply(ctx, []*spanner.Mutation{
		spanner.Insert("post",
			[]string{"id", "author_id", "content", "created_at"},
			[]interface{}{newid, 1, newcontent, time.Now()})})

	// 新ポストをid指定でselect
	row, _ := client.Single().ReadRow(ctx, "post",
		spanner.Key{newid}, []string{"content"})
	var content = ""
	row.Column(0, &content)
	fmt.Printf("new post id = %v, content = %v", newid, content)

	defer client.Close()
}
```

### 6. go get & run
```bash
$ go get cloud.google.com/go/spanner/...
$ go run spanner-trial.go
```

### 7. 何回か実行してみた結果
```
last id of post: 14
new id: 15
new post id = 15, content = テストのポスト15
```

### おまけ: 上記のSpannerのインスタンスを(Free trial分内で)約一週間放置したレシート

| 日付 | 内容 | 金額（JPY） |
|---|---|---|
| 2017年2月1日～28日 | Cloud Spanner Server Node for Three-Way Replicated Regional Configuration: 149.473 時間 [Currency conversion: USD to JPY using rate 115.1]（ソース: My First Project [**********]） | ￥15,484 |
| 2017年2月1日～28日 | Credit FreeTrial:2017-02-04T00:00:00.000-08:00 [ Currency conversion: USD to JPY using rate 115.1 ]（ソース: My First Project [**********]） | −￥15,484 |
| 2017年2月1日 | 消費税 | ￥1,237 |
| 2017年2月1日 | 消費税 | −￥1,237 |
| | | 開始残高: ￥0 |
Java SE 7/8 Bronzeを勉強した中で詰まったところ

#整数同士の演算では小数点以下は切り捨てられる
```java
System.out.println(5/2);

//出力結果：2
```

#小数の型はswitch文の条件にはつかえない
```java
double num = 2.5 ;
        
switch(num){
    case 2.5:
        System.out.println("2.5");
        break;
                
    default:
        System.out.println("2.5以外");
        break;
}
//コンパイルエラー
//互換性のない型：doubleからintへの不可逆変換
```

#for文で無限ループ
for文の条件式を抜くことで無限ループになる

```java
for(int i=0;/*この部分*/;i++){　
    System.out.print(i);
}
//出力結果：012345678910........ 
```
Javaから職業プログラマをスタートするプログラミング初心者に読んでほしい技術書たち（2017年版）

## 概要
新入社員に「何から勉強すればいいですか」と言われたら、「とりあえず基本情報の資格を取りましょうか」と答えるようにしている。
資格不要論も根強いが、個人的にIPAの資格試験は全体的に良くできていると思うし、真面目に勉強すればその分得られるものも多いと思っている。

ただ、それだけでは即効性がないというか、目の前の仕事が楽にならないのも事実。


幸いJavaの書籍は数多くあり学ぶ材料には事欠かないが、多すぎるあまり「どれから手を付ければ…」という気持ちになるのも分かる。（今さらJavaの本を紹介するのもどうかと思ったが、今だからこそ必要な気もする）

そこで、これまでJavaやオブジェクト指向の本を読み漁ってきた自分が、入社１、２年目あたりで読んで良かった本、もしくは読むべきだったと今感じている本を紹介する。

## おすすめ書籍
### Javaの文法
#### 『Java言語プログラミングレッスン 第3版(上)・（下）』結城浩 / SBクリエイティブ

まずは基本的な文法を知らないと何も始まらない。自分の場合は結城さんの本を選んだが、実際入門レベルではどれもだいたい同じことが書いてあるので、立ち読みして自分にあったものを探そう。

Amazonのレビュー的には「スッキリわかる」シリーズが人気。

### UML
#### 『UML モデリングのエッセンス 第3版』マーチン・ファウラー / 翔泳社
薄いのでさらっと読める。

UMLは仕事でも使うだろうし、このあと紹介する書籍の中でもバシバシ登場する。
勉強しなくてもUMLはなんとなく読めてしまうが、はじめに正しく理解していたほうもちろん良い。

### デザインパターン
#### 『Head First Design Patterns』Eric Freeman, Elisabeth Robson, Bert Bates, Kathy Sierra / Oreilly & Associates Inc
自分は英語で原書を読んだが、翻訳もでている。（翻訳の質については知らない）
英語でも読みやすい文章だったと記憶している。

もっともわかりやすいデザインパターンの入門書だと思う。

amazon.comでのレビューも528件付いて星4.5なので相当なものだ。何だったか忘れたが有名なJavaの本で、デザインパターンのおすすめ書籍でGoF本を差し置いて、この本をすすめていたのを覚えている。

『Head First』シリーズは、Java、SQL、ネットワークあたりを読んだが、どれも良かった。

#### 『増補改訂版Java言語で学ぶデザインパターン入門』結城浩 / SBクリエイティブ
（ソフトウェア開発における）デザインパターンの原点である『Design Patterns: Elements of Reusable Object-Oriented Software』（翻訳版は『オブジェクト指向における再利用のためのデザインパターン』。通称GoF本）を１０段階くらい嚙み砕いて読みやすくしたもの。

いきなりこの『Java言語で学ぶデザインパターン入門』を読んで、内容が難しすぎて分からないってこともないとは思うが、この本はあくまでデザインパターンのカタログであって、「なぜデザインパターンが必要なんだろう」という疑問は残るし、きっと飽きてくる。

まずは『Head First Design Patterns』で軽くデザインパターンに触れておくと、その必要性が分かるため、理解が進みやすいはず。『オブジェクト指向のこころ』もデザインパターンのユースケースがいろいろ登場したと思うので、そちらでも。

### オブジェクト指向
#### 『アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技』ロバート・C・マーチン / SBクリエイティブ
今回紹介する本の中では、難易度が少し高いかもしれない。

内容は最高なので、繰り返し繰り返し読んで、少しずつでいいから身につけていきたい。

### コーディング
#### 『新装版 リファクタリング―既存のコードを安全に改善する―』マーチン・ファウラー / オーム社
読みやすく保守性の高いコードを書くための道標。
この本に登場するリファクタリングの対象となるようなコードを書かないように努めることで、自然と良いコードに書けるようになっていく。

同じジャンルで『リーダブルコード』もおすすめ。

### SQL
#### 『SQL 第2版 ゼロからはじめるデータベース操作』ミック / 翔泳社
RDB（リレーショナルデータベース）を全く使わずに開発することは稀なので、SQLの基本は知っておきたい
この本は入門書としての完成度が非常に高く、基本はこれ一冊でOK。

さらに深めたい人は、『達人に学ぶSQL徹底指南書』からの『プログラマのためのSQL』がおすすめ。

ただし、そこまで行く前に、正規化等のテーブル設計を学んだほうが良いだろう。

### フレームワーク
業務で使うものを学ぼう。会社の先輩に聞けば何か教えてくれるはず。

Springであれば、『Spring入門』がおすすめ。

### マルチスレッド
#### 『Java言語で学ぶデザインパターン入門 マルチスレッド編』結城浩 / SBクリエイティブ
この分野の入門書は少ない中で、基礎から丁寧に説明してくれている。

さらに深く知りたい人は、『Java並行処理プログラミング』へどうぞ。（翻訳版は絶版かもしれない）

## 最後に
「１、２年目で読んでほしい」というくくりで紹介したのであぶれてしまったが、内容的に素晴らしくいずれは読むべき本を最後に挙げておく

 * 『EFFECTIVE JAVA』Joshua Bloch / 丸善出版
 * 『オブジェクト指向における再利用のためのデザインパターン』Erich Gamma, Ralph Johnson, Richard Helm, John Vlissides / ソフトバンククリエイティブ
 * 『エリック・エヴァンスのドメイン駆動設計』Eric Evans / 翔泳社
Unity Null Check高速化

コードを書いていてnullチェックをすることはかなり多い。
1個1個の処理は小さくても、何千個ものオブジェクトで毎フレームnullチェックしているようでは処理時間を無駄に使っている
どうすれば処理時間を軽減できるか検証した

#結論
何も考えずif(target != null)を使え

#検証方法
Unityバージョン 5.5.0f3

3つの手法で検証した
- if(target != null)
- if(object.ReferenceEquals(target , null) == false )
- try - catch

##対象オブジェクトがnullでない場合

```csharp:NullTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NullTest : MonoBehaviour 
{	
	readonly int COUNT = 10000000;

	public class TestClass
	{
		public TestClass(){}

		public void Test (){}
	};

	TestClass _TestClass = new TestClass();
	
	// Update is called once per frame
	void Update () 
	{
		if (Input.GetKeyDown (KeyCode.A)) {

			float startTime = 0f;

			startTime = Time.realtimeSinceStartup;

			for (int i = 0; i < COUNT; i++) {
				_TestClass.Test ();    //nullチェックなし
			}

			float lap0 = Time.realtimeSinceStartup - startTime;

			startTime = Time.realtimeSinceStartup;

			for (int i = 0; i < COUNT; i++) {
				if (_TestClass != null) {
					_TestClass.Test ();
				}
			}

			float lap1 = Time.realtimeSinceStartup - startTime;

			startTime = Time.realtimeSinceStartup;

			for (int i = 0; i < COUNT; i++) {
				if (object.ReferenceEquals(_TestClass,null)==false) {
					_TestClass.Test ();
				}
			}

			float lap2 = Time.realtimeSinceStartup - startTime;

			startTime = Time.realtimeSinceStartup;

			for (int i = 0; i < COUNT; i++) {
				try{
					_TestClass.Test();
				}
				catch(System.Exception e) {

				}
			}

			float lap3 = Time.realtimeSinceStartup - startTime;
			Debug.Log (lap0);
			Debug.Log (lap1);
			Debug.Log (lap2);
			Debug.Log (lap3);
		}
	}
}


```

| 手法 | 実行時間[sec] |
|:-:|:-:|
|(参考) nullチェックなし|0.1567643|
|if(target != null)|0.163532|
|if(object.ReferenceEquals(target , null) == false )|0.2293189|
|try-catch|0.1630554|

try-catchがわずかに早い

##対象オブジェクトがnullの場合
上記コードの_TestClassをnullにして検証

| 手法 | 実行時間 |
|:-:|:-:|
|if(target != null)|0.07411861|
|if(object.ReferenceEquals(target , null) == false)|0.1276345|
|try-catch|遅すぎて実行不可|

try-catchはnullだった場合にとても遅くなる

#参考
object.ReferenceEqualsは癖がある模様
[object.ReferenceEquals(someObject, null) の方が someObject == null より早い…が、盲目的に使うのは危険](http://tsubakit1.hateblo.jp/entry/2015/05/28/014440)
Xamarin.Formsでファイルを受け取る（iOS編）

Safariで開いたPDFをXamarin.Formsアプリで受け取るというのをやってみました。

![screencast 2017-02-25 00-13-13.gif](https://qiita-image-store.s3.amazonaws.com/0/4633/17628c10-49fa-7478-b846-5be0526f34a8.gif)

まず、`info.plist`にPDFのドキュメントタイプを追加します。
これで、SafariでPDFを表示した時にアプリで開くためのメニューが表示されるようになります。

![スクリーンショット 2017-02-24 23.36.12.jpg](https://qiita-image-store.s3.amazonaws.com/0/4633/3d7b1ded-2ce6-091f-fea5-e2f98acebe33.jpeg)

![スクリーンショット 2017-02-24 23.39.06.jpg](https://qiita-image-store.s3.amazonaws.com/0/4633/a6af16eb-5961-54c7-30f4-b65751ff9a3c.jpeg)

メニューからアプリが呼び出された時に`OpenUrl(UIApplication app, NSUrl url, NSDictionary options)`が呼び出されます。ここで、`NSUrl`のプロパティ`Path`を引数にXamarin.Formsの`App`のメソッドを呼び出します。

```csharp:AppDelegate.cs
[Register("AppDelegate")]
public partial class AppDelegate : Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
	App mainForms;
	public override bool FinishedLaunching(UIApplication app, NSDictionary options)
	{
		Xamarin.Forms.Forms.Init();

		mainForms = new App();

		LoadApplication(mainForms);

		return base.FinishedLaunching(app, options);
	}

	public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
	{
		mainForms.DisplayThePDF(url.Path);

		return true;
	}
}
```

呼び出すメソッドで、PDFを表示する適当なページに遷移します。

```csharp:App.xaml.cs
public partial class App : Application
{
  public void DisplayThePDF(string url)
  {
    var openFilePage = new OpenFilesPage(url);
    Application.Current.MainPage = openFilePage;
  }
}
```

受け取ったURIを煮るなり焼くなりすればいいです。自分はサンプルなので意味もなくWebViewで表示してみます。Safariから受け取る意味なくなるけど。。。

```OpenFilePage.xaml.cs
public partial class OpenFilesPage : ContentPage
{
	public OpenFilesPage(string url)
	{
		var webView = new WebView
		{
			Source = url
		};
		Content = webView;
	}
}
```

参考：[Sending Files to a Xamarin.Forms App – Part 1: iOS](https://codemilltech.com/sending-files-to-a-xamarin-forms-app-part-1-ios/)
linuxコマンドラインで音声ファイルフォーマット変換

#概要
コマンドラインでささっと音声ファイルのフォーマットやサンプリング周波数変換したい時のコマンドを調べました。

#install
Ubuntu系ではapt-getで入ります。Ubuntu 14.04で確認。

```
sudo apt-get install libav-tools
```



#例
##サンプリング周波数変換

サンプリング周波数44.1KHzに変換します

```
avconv -i infile.wav -ar 44100 -o outfile.ogg
```


##フォーマット変換

ogg vorbisへ変換します

```
avconv -i infile.wav -acodec libvorbis -o outfile.ogg
```


#参考リンク
http://nakamat.floppy.jp/2013/05/14/avconv%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
macOS SierraのVimで日本語入力を楽にするの法

SierraのVim(MacVimではなくbrew installしたVim)で日本語を入力する際の設定について先人のお知恵を参考にした設定を共有。もしどこかで困っているVimmerのお役に立てると幸い。

### 設定

1. Google日本語入力 (https://www.google.co.jp/ime/)

　まずは定番のime無効化を設定。
　
　<img width="503" alt="スクリーンショット 2017-02-24 23.43.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/36503/b24127a9-5481-a437-a9d0-36b354b3b760.png">

　c.f.
　http://d.hatena.ne.jp/sifue/20120411/1334161078
　
2. 英かな　(https://ei-kana.appspot.com/)

　vimのinsertモードを抜けるのにescapeではなく^[を使っているため、キーリマップが必要。(Karabiner頑張れ！)
　英かなはデフォで英字配列を期待しているらしく、自分はJIS配列な人なので^]と設定されてしまうが特に気にしない。

　<img width="450" alt="スクリーンショット 2017-02-24 23.57.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/36503/38e6d532-0270-e2c1-4199-720a587d9e64.png">

　c.f.
　http://qiita.com/saboyutaka/items/33c82ef1414867d9ef6d
　
3. iTerm2 (https://www.iterm2.com)

　macの'ターミナル'は上記1.の設定をうまく受け取ってくれない。しょうがないですね。

これで^[でinsertモードを抜けるとime offとなり、ありゃりゃ・・・が無くなって快適なVim最高生活を営める。
kaoriya vimで`set imdisable`しろよという話もあるが、それだと逃げに感じたのであった。
小数の計算結果を簡単に丸めてはいけない

多少なりともプログラミングをしている方であれば、「浮動小数点数には誤差がある」という話は聞いたことがあるかもしれません。

しかし、そのことを普段から意識できているでしょうか？
僕は意識しておらず案の定踏み抜きました。

## ありがちな例

ある日、ユーザさんの預金残高に小数点以下切り捨てで 0.5% の利息をつける必要がありました。
かんたんな計算だと思って、僕はこんなコードを書きました。

```js:JavaScript
Math.floor(value * 1.005)
```

……**これ、間違いです。**

試しに `value` に `1000` を入れてみましょう。1000に 0.5% を足したら1005になるような気がしますが、実際には1004になってしまいます。上記の例は JavaScript ですが、大抵のメジャーな言語では同じ結果になります。手元で試してみましょう。

なぜこんなことになるのでしょうか。`1000 * 1.005` をそのまま出力してみると、`1004.9999999999999` となります。この値はわずかに1005に達していないので、切り捨てたら1004になってしまうのですね。浮動小数点数は1.005を正確に表現できないため、誤差が生じてしまったようです。

## 切り捨てと切り上げに気をつける

この誤差は本当に簡単に発生します。次の例は、すべて期待通りの結果にはなりません。

```js:JavaScript
Math.floor(0.6 / 0.2) // 2
0.6 / 0.2             // 2.9999999999999996
```

```js:JavaScript
// 消費税は小数点以下切り上げ
Math.ceil(900 * 1.08) // 973
900 * 1.08            // 972.0000000000001
```

```js:JavaScript
let f = 0;
for (let i = 0; i < 10; i++) {
  f += 0.1;
}
Math.floor(f) // 0
f             // 0.9999999999999999
```

浮動小数点数の計算結果は整数にならないと考えてしまったほうが良いです。

## 回避策

計算結果を丸める前に、十分下位の桁で四捨五入すれば、この問題は回避できます。

```js:JavaScript
// 小数点第4位で四捨五入
Math.floor((value * 1.005).toFixed(3))
```

```java:Java
Math.floor(String.format("%.3f", value * 1.005))
```

```php:PHP
floor(round($value * 1.005, 3))
```

厳密な計算が求められる場面には向かないかもしれませんが、大抵のアプリケーションではこれで十分でしょう。Math クラスを拡張するなどして、アプリケーション全体から呼べるようにしておくと良いかもしれません。

### 17/2/25 追記

コメントで指摘を頂きました。Decimal 型を使うことで、変な実装をすることなく誤差のない計算を行うことができます。
Java であれば標準で BigDecimal クラスが使えますし、JavaScript にも [decimal.js](https://github.com/MikeMcl/decimal.js/) というライブラリがあります。自分で実装するよりも、こういったものを使うほうが良いでしょう。
（追記ここまで）

## まとめ

小数の計算には気をつけましょう。
Numpyの配列の有効数字を揃えたい

PythonでNumpy配列の有効数字を揃える　メモ．

※ 必要なもの

* Numpy
* Pandas 

```py
import numpy as np
import pandas as pd

numpy_data = np.array([0.123456, 0.654321, 0.987654321])

# numpy配列をPandasのDataFrameに変換
panda_data = pd.DataFrame(numpy_data)

# 有効数字3桁で丸める
panda_data = panda_data.round(3)

# 必要な場合は， Numpy形式に戻す
numpy_data2 = np.array(panda_data.values)

print(numpy_data2) --> [0.123, 0.654, 0.988]
```

PandasのDataFrameで 
```
.round(有効数字)
```
とすることで，有効数字を指定することができる．

他に良い方法はないんですかねぇ．
TeXで卒論などの学術的文書を書くときに読み込ませるオススメパッケージ

# hyperrefパッケージ・pxjahyperパッケージ
出力した文書にパイパーリンクを埋め込むためのパッケージです。このパッケージを読み込むと、

- 文書にしおりがつき、添削する教授や先輩などが簡単に目当ての章・節にジャンプできる
- 本文中の「図 1」「表 1」「第1章」「式(1)」の1の部分にハイパーリンクが付き、図・表・式などの確認が容易になる

というメリットが生じます。基本的に、次のコマンドをプリアンブルに入れればOKです。

```latex
\usepackage{ifluatex,ifxetex}
\ifnum 0\ifluatex 1\fi\ifxetex 1\fi>0
\usepackage[hidelinks,bookmarksnumbered=true,unicode=true]{hyperref}
\else
\usepackage[hidelinks,bookmarksnumbered=true,dvipdfmx]{hyperref}
\usepackage{pxjahyper}
\fi
```

`hidelinks`オプションを外すと、リンクが**Acrobat ReaderなどでのPDF閲覧時など限定で**枠で囲まれます。**(印刷はされないそうです)**また、`bookmarksnumbered`オプションを外すと、しおりに「第1章」「1.1」などの章番号などが入らなくなります。これらは好みで外してください。


# citeパッケージ
$\mathsf{\TeX}$の`\cite`命令で複数の文献を引用する時、文献ラベルを書く順番によっては、[6,4]のように、逆順に文献番号が振られてしまうことがあります。しかし、このパッケージを読み込むと、`\cite{hoge114514,fuga1919,piyo810893}`のように単一の`\cite`命令で複数の文献を引用する限り、正しい順番で文献番号が振られます。使用するには単に、

```latex
\usepackage{cite}
```

をプリアンブルに入れればOKです。

# fontencパッケージ・lmodernパッケージ
$\mathsf{p\LaTeX}$などは、デフォルトでは下線などが文字としてPDFなどの文書に埋め込まれません。このパッケージを利用すると、下線などが正しく文字として埋め込まれます。`lmodern`パッケージは原則的に、`fontenc`パッケージとペアで使用します。基本的に、これらのパッケージは原則全ての文書で読み込むべきです。

```latex
\usepackage[T1]{fontenc}
\usepackage{lmodern}
```

# inputencパッケージ
特に$\mathsf{p\LaTeX}$の文書の文献リストで、「é」などが入った文献を扱うことがあります。その際にプリアンブルに

```latex
\usepackage[utf8]{inputenc}
```

を加えておけば、本文で「é」などを入力しても正しく表示されます。`fontenc`・`lmodern`パッケージと併用することを推奨します。

# tgtermesパッケージ・tgherosパッケージ
本文のフォントをTimes・Helveticaにしたい場合にそれぞれ読み込むパッケージです。Timesフォントは英語論文での採用例が多いです。次のコマンドをプリアンブルに加えます。

```latex
\usepackage{tgtermes,tgheros}
```

日本語フォントに問題が生じる場合(ゴシック体になるはずが明朝体になる)場合は、代わりに`newtxtext`・`helvet`パッケージを使うと解決する場合があります。また、$\mathsf{Lua\TeX}$・X<sub>Ǝ</sub>T<sub>E</sub>Xで使用したい場合は、代わりに

```latex
\setmainfont[Ligatures=TeX]{TeXGyreTermes}
\setsansfont[Ligatures=TeX]{TeXGyreHeros}
```

を使用してください。

# zi4パッケージ
タイプライタ体のフォントをRictyのベースであるInconsolataにします。

```latex
\usepackage{zi4}
```

をプリアンブルに入れればOKです。$\mathsf{Lua\TeX}$・X<sub>Ǝ</sub>T<sub>E</sub>Xで使用したい場合は、代わりに

```latex
\setmonofont{Inconsolatazi4}
```

を使用してください。
『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その４)

<img width="300" alt="javathread.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/165994/9d302410-0471-96c1-f097-d46649d17209.jpeg">

#Immutableパターン

Stringクラスには、文字列の内容を変更するメソッドが用意されていない。Stringのインスタンスが表している文字列の内容は決して変化しない。このことからStringクラスのメソッドは、synchronizedにする必要がない。**Immutable**は、「不変の」、「変わることがない」という意味。Immutableパターンには、インスタンスの状態が変わらないことが保証されているクラス(**immutableなクラス**)が登場する。排他制御が不要のため、うまく利用すればパフォーマンス向上を期待できる。

(コード全体は本書を参照のこと)

```java
public final class Person {
    private final String name;
    private final String hobby;

    public Person(String name, String hobby) {
        this.name = name;
        this.hobby = hobby;
    }

    public String getName() {
        return name;
    }

    public String getHobby() {
        return hobby;
    }
}
```
このクラスはPersonクラスのフィールドの値は、コンストラクタでのみ設定可能。またフィールドの値を変更するメソッドもない。したがって、Personクラスのインスタンスは、いったん作られてしまうと、フィールドの値がかわることはない。このとき、複数のスレッドから同時にアクセスされても、Personクラスは安全である。いずれのメソッドもsynchronizedにする必要がない。

##登場人部

**Immutable役**が登場する。Immutable役は、フィールドの値を変更することができず、フィールドの内容を変更するメソッドも持っていないクラス。

##どんなときに使うのか

- インスタンスの生成後、状態が変化しないとき。それは、次のときである。**フィールドがfinalになっていること、setterメソッドが存在しないこと、フィールドが参照している先のインスタンスが変化しないこと**。

以下のクラスはimmutableではないので注意。

```java
public final class Hoge {
     private final StringBuffer hoge;

     public Hoge(String a, String b) {
         this.hoge = new StringBuffer("a=" + a + ", b=" + b);
     }

     public StringBuffer getHoge() {
         return hoge;
     }
}
```

getHogeメソッドで得られるhogeフィールドが持っているインスタンスは、Stringではなく、StringBufferのインスタンス。StringBufferクラスは内部状態を変更するメソッドを持っているため、hogeフィールドの内容を外部から書き換えることができてしまう。hogeフィールドはfinal宣言されているため、フィールドの値そのものは変化しないが、そのフィールド(ポインタと思えば良い)が指している先にあるインスタンスの状態は変化する可能性がある。

- インスタンスが共有され、頻繁にアクセスされるとき。

##mutableなクラスとimmuatbleなクラス

Javaの標準クラスライブラリには、mutableなクラスとimmutableなクラスが対になっているものがある。例えば、StringBufferクラスとStringクラス。StringBufferは書き換えの際には適切にsynchronizedが使われている。一方StringクラスはSynchronizedを使用していないため、高速な参照が可能。内容を頻繁に変更するならStringBufferを使い、内容を変更する必要がなく参照するだけならStringを使う。

##不変性を守るために
Immuableパターンであることを前提にsynchronizedを取り除いている場合、不変性が失われたとたん、クラスの安全性まで失われてしまうことになってしまう。そのため、プログラムのコメントやAPIドキュメントで、不変性について明記しておくべき。

---

関連
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その１)](http://qiita.com/yoshi-yoshi/items/83ecc4476904fa144577)
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その２)](http://qiita.com/yoshi-yoshi/items/792ed2e9dc09f63c5004#_reference-5f26b880e1c02b87a1d8)
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その３)](http://qiita.com/yoshi-yoshi/items/1d2c0e1279af4adb2e9b)