OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルの最終更新日時を変更する方法(UNIXコマンド)

**ファイルの最終更新日時を変更する方法(UNIXコマンド)**
--------------------------------------------------------------------
UNIXコマンドでファイルの最終更新日時を変更する方法をメモ。

ファイルの最終更新日時を使用してファイル削除を行う処理等の検証を行う時等に便利。

**■実行方法**

コマンドラインで以下コマンドを実行することで変更が可能。
```
touch -t yyyyMMddhhmm [ファイル名]
```

例）ファイルの更新日時を2014年01月01日12時30分に変更する場合
```
touch -t 201401011230 sample.log
```

以上参考まで。
tomcatとの連携時に一部ディレクトリのみapacheに応答させる

apacheをリバースプロキシとして使用し、tomcatにすべてを引渡している場合、
静的ファイル（画像やPDF等）は、apacheのディレクトリ上に配置し、
デプロイせずとも、ファイルの入れ替えを行いたいというようなときに使います。

#apacheの設定

httpd-proxy.confを下記のようにします。
Location があると、エラーになるので、記述しないでください。。

```apache
ProxyPass /html/ !
ProxyPass / ajp://localhost:8009/
```

のように設定すると、htmlファイルはtomcatへ振られず、apache側の処理となります。
あとは、apacheのhttpd.confにて、ディレクトリの設定等を行ってください。
easydictを使ってみた(メモ)。

ドットで辞書の要素にアクセスできるようになる。
こんな感じ。

```py
d = edict({'foo':3, 'bar':{'x':1, 'y':2}})
print d.foo
print d.bar.x
#出力 3
#出力 1
```

windows7(python 2.7系) で試した。

ここにある。
https://github.com/makinacorpus/easydict
ここのreadmeをいじる。

インストール
python setup.py install
easy_install easyjson　ついでに入れる。

キーに日本語を入れるとエラー。クォートしててもエラー。
何かの時に、これでやられるかもしれん…
値に日本語は通る。

asってこういう風に使えたのか…
readmeのEasyDictは、全部 edictにしないと、この場合ダメなようだ。

テスト
`code`

```py
from easydict import EasyDict as edict
from simplejson import loads
#from prettyprint import pp

d = edict({'foo':3, 'bar':{'x':1, 'y':2}})

print d.foo
print d.bar.x

#出力 3
#出力 1

j = """{
        "Buffer": 12,
        "name":"アレグラ",
        "List1": [
            {"type" : "point", "coordinates" : [100.1,54.9] },
            {"type" : "point", "coordinates" : [109.4,65.1] },
            {"type" : "point", "coordinates" : [115.2,80.2] },
            {"aaa" : "ポイント", "coordinates" : [150.9,97.8] }
          
                ]
    }"""
d = edict(loads(j))
print d.Buffer
print d.name
print d.List1[0].coordinates[1]
print d.List1[3].aaa
#pp(d)

#出力 12
#出力 アレグラ
#出力 54.9
#出力 ポイント

b = edict()
b.debug = True
b.foo = 7
b.zzz = u"ガンダム"

print b.items()

#出力 [('debug', True), ('foo', 7), ('log', False), ('zzz', u'\u30ac\u30f3\u30c0\u30e0')]
#出力 ガンダム 

class Flower(edict):
     power = 1

f = Flower({'height': 12})
print f.power
print f['power']
print f.items()

#出力 1
#出力 1
#出力 [('power', 1), ('height', 12)]
```
コマンドラインショートカット

# コマンドラインショートカット

* 毎回、口頭で教えるの面倒なのでまとめる
* コマンドラインはbashなので、基本的にbashが対象です
* ググればいくらでも出てくるけど、これ書いておけばよかろという状態にしたい
* キーバインドをviにしているヒトは対象外
* [t]*csh使いは社史編纂でもしとけ
 * [Csh Programming Considered Harmful](http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot)
 * [Csh Programming Considered Harmful (in Japanese)](http://www0.nih.go.jp/~jun/doc/csh-whynot-jp.txt)

## Ctrl

* Ctrl + a
 * 先頭にカーソルを移動
* Ctrl + e
 * 末尾にカーソルを移動
* Ctrl + k
 * カーソルから右をカット
* Ctrl + u
 * カーソルから左をカット
* Ctrl + y
 * Ctrl + [y|k]でカットした文字列をペースト
* Ctrl + r
 * ヒストリからインクリメンタルサーチ
* Ctrl + l
 * バッファクリア(=```$ clear```)
* Ctrl + d
 * ログアウト(=```$ exit```)
* Ctrl + z
 * ジョブを一時中断。ジョブに戻る時は```$ fg```
* Ctrl + s
 * バッファを一時停止、```tail```で流れるのが困る時に使う
* Ctrl + [p|n|f|b]
 * 矢印キーが使えれば必要ない上下左右(present, next, forward, backward)
* Ctrl + t
 * 前後の文字を入れ替える

## Alt

* 単語単位の移動くらいしか使ってないので割愛

## Tab補完時に大文字小文字の区別をなくす

* .bashrcか.bash_profileに下記を記述

```
bind 'set completion-ignore-case on'
```
* zshはデフォルトで大文字小文字を区別しない

## Ctrl + sの誤射を防ぎたい
* .bashrcか.bash_profileに下記を記述

```
stty stop undef
```
【C++】10進数を2進数に変換

# はじめに

ビット単位でプログラムを構成することがあり、そのときに正しくできているか確認するために10進数から2進数に変換するプログラムを組み込もうと思って作成しました。

# プログラム

```C++:bina.cpp
#include<iostream>
#include<math.h>

using namespace std;

int binary(int bina){
	int ans = 0;
	for (int i = 0; bina>0 ; i++)
	{
		ans = ans+(bina%2)*pow(10,i);
		bina = bina/2;
	}
	return ans;
}

int main(){
	int number;
	cout<<"2進数に変換したい10進数の数字を入力して下さい"<<endl;
	cin>>number;
	cout<<"入力した10進数の数値："<<number<<endl;
	cout<<"2進数に変換した数値："<<binary(number)<<endl;
}
```
Android sourceビルドメモ

ビルド環境OS：Ubuntu 14.04.1 LTS
課題：記載されている手順ではビルドエラーとなる(12.04 LTSでビルド確認となっているので諸々バージョンが異なる)

Ubuntuはクリーンな状態。

大元となる手順
https://source.android.com/source/building.html
<code>
sudo apt-get update
sudo apt-get install openjdk-7-jdk
sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
</code>
※ openjdkをインストールする手順になっているが、後で削除することになる

The correct version is: Java SE 1.6.
上記2行目をopenjdk-6-jdkに差し替えても解消できない。
<code>
sudo apt-get purge openjdk*
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
</code>

error: ‘indexOfKey’ was not declared in this scope
を解消するためgcc・g++のバージョンを4.4にダウンする。
<code>
downgrade your gcc version to gcc 4.4
sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4
sudo rm /usr/bin/gcc
sudo rm /usr/bin/g++
sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++
sudo apt-get install g++-4.4-multilib
</code>

dalvik/vm/native/dalvik_system_Zygote.cpp:222:43: error: ‘setrlimit’ was not declared in this scope
を解消するためコードを一部修正(ヘッダファイルをひとつインクルードする)
dalvik/vm/native/dalvik_system_Zygote.cpp
にsys/resource.hをインクルードする行を追加する
<code>
 #include &lt;sys/resource.h&gt;
</code>

Can't locate Switch.pm in @INC
<code>
sudo apt-get install libswitch-perl
</code>

git設定
<code>
git config user.name "名前"
git config user.email メールアドレス
</code>

ダウンロード
<code>
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
mkdir ~/WORKING_DIRECTORY
cd ~/WORKING_DIRECTORY
repo init -u https://android.googlesource.com/platform/manifest
repo sync
repo forall -pc 'git log --no-merges --oneline android-4.4.2_r2..android-4.4.2_r1'
repo sync
</code>

ビルド
<code>
. build/envsetup.sh
lunch
 ※ 選択
make -j4
</code>
折り紙の「コツ」をGSNで記述する。重要な暗黙知を引き出し共有するには


この記事は、英語ブログエントリ["How to make it better ? - Extracting implicit knowledge via GSN"](http://changevision.wordpress.com/2014/08/24/how-to-make-it-better-extract-implicit-knowledge-via-gsn/)の日本語訳です。

<center>
![あまりうまくない「かぶと」](https://changevision.files.wordpress.com/2014/08/bad-kabuto.png?w=150)
-あまりうまくない「かぶと」-
</center>

# 折り紙をうまく折る

折り紙には上手い人とそうでない人がいます。また、外人に折り紙を教えると、手順はうまく伝えることができても、あまり奇麗にできることはありません。折り紙をうまく織るには、「ここは角がしっかり合うように気をつけて」などというコツをうまく伝える必要があります。

ソフトウェア開発においてドキュメント、コード、報告書などをレビューしていても、同じ悩みがあります。作成する手順、プロセスだけではだめ。この小記事では、折り紙を例題に、このあたりのことを考えてみたいと思います。

折り紙の「かぶと」１つ１つのステップは難しくありません。でもステップにはコツやポイントがあります（暗黙知と呼ばれるものですね）。これらが最後の出来映えを大きく左右するのです。料理に似ていますね。レシピには「材料」と「手順」が書かれていますが、 **料理が上手な人はそれ以上のことを知っている**ようです。

<center>
![この違いはどこからくるのか](https://changevision.files.wordpress.com/2014/08/whatmakesdifference1.png)
- この違いはどこからくるのか -
</center>

# GSN を使って手順とコツを同時に記述する

[デンソークリエイトの小林さん](http://www.denso-create.jp/eye/index4.html)が、GSNを使って折り紙を折る手順を書きながら、同時にこの「コツ」を書いて行くという手法を試しています。これを、「かぶと」の例でやってみます。

<center>
![「かぶと」をうまく折るGSN](http://changevision.files.wordpress.com/2014/08/gsnofkabuto.png)
-「かぶと」をうまく折るGSN -
</center>

GSN(Goal Structuring Notation)は議論の構造を可視化する手法です。エンジニアリング領域では、機能安全のセーフティーケース（ISO61508, ISO26262等）において「このシステムは安全ですよ、なぜかというと、、、」と主張を指示する議論構造と証拠を示す記述などに使われます。（詳しくは[「GSN解説」](http://blogs.itmedia.co.jp/hiranabe/2013/11/goal-structuring-network.html)などを参照）

では、この「折り紙GSN」を解説してみます。

1. ゴールは「奇麗なかぶとを折る」こと。トップの黄色の <span style="color: yellow;">■</span> <em>ゴールノード</em> (G1)で示している。
1. トップゴールはステップ毎のサブゴール(G2-G9)に分解される。サブゴールも黄色 <span style="color: yellow;">■</span>で、この「分解戦略」を、青色の <span style="color: blue;">■</span> <em>戦略ノード</em>(S1)で示している。
1. 各サブゴールの結果は緑の<span style="color: green;">■</span> <em>証拠ノード</em>(Sn1-Sn8)で絵として示している。
1. そして、Tipsというかノウハウというか「コツ」が、ピンクの <span style="color: pink;">■</span> <em>文脈ノード</em> (C1-C5)として、キーとなるステップに書き加えている。

# 技術レビューにGSNを活用

折り紙のGSNを作る際には、同僚たちに折り紙を折ってもらい、それぞれのステップで「気をつけていること」を聞き出したそうです。手順の背後にある、この知識（「気をつけていること」）が折り紙の出来映えを大きく左右するのです。そしてそれを、抽出して、明文化しています。

小林さんはGSNを使って、社内の **ソフトウェア開発におけるレビュープロセスを改善したい** と考えています。この折り紙の例は、ソフトウェア開発にどうやってマッピングできるでしょうか？

**開発プロセスを作って行くこと、その過程でノウハウを抽出すること、そしてそのノウハウを再利用可能な形にし、社内の資産にすること。**

これをGSNを使ってトライしているのです。

詳しくは、次のYouTube３分ビデオをどうぞ。

[![kobito.1409011185.142721.png](https://qiita-image-store.s3.amazonaws.com/0/51055/0eb79b22-6a6c-adc6-5113-3c708f6e6640.png "kobito.1409011185.142721.png")](https://www.youtube.com/watch?v=SmI6_FPjlaU)[技術レビューにおけるGSN, D-Caseの現場活用法(1)〜レビューの前提となる基準を作る](https://www.youtube.com/watch?v=SmI6_FPjlaU)


続編は、こちらです。
[「他の人も納得できる折り紙の「コツ」の引き出し方」 Qiita](http://qiita.com/nobuhide/items/94b65dafa15799d0507f)

---

小林さんは、組込みソフトウェア開発の現場で、ソフトウェアエンジニアリング、D-Case(Dependability Cases)の実践者です。名古屋市在住。

（平鍋）
Intentで開くアプリ一覧の中に自分自身が出ないようにする

Androidでは暗黙的Intentを用いることで「◯◯な動作をするActivity」の一覧をダイアログとしてユーザに提示することが出来ます。

これは便利な機能なのですが、[Emaki](https://play.google.com/store/apps/details?id=me.emaki&hl=ja) のように画像を外部から保存することも外部にエクスポートすることも出来るようなアプリの場合、Emaki上の画像を外部アプリにエクスポートしようとすると、アプリ選択のダイアログにEmaki自身が出てきてちょっと煩わしいです。

以下のようにPackageManagerを利用して、自分自身に対応するIntentをはじいてあげることで、これを回避出来ます。

```java
    public static Intent createChooserWithoutMe(Context context, Intent target, CharSequence title) {
        List<ResolveInfo> resolveInfoList
                = context.getPackageManager().queryIntentActivities(target, PackageManager.MATCH_DEFAULT_ONLY);
        if (resolveInfoList.isEmpty()) {
            return Intent.createChooser(target, title);
        }

        Collections.sort(resolveInfoList, new ResolveInfo.DisplayNameComparator(context.getPackageManager()));
        List<Intent> targetIntents = new ArrayList<Intent>();
        for (ResolveInfo resolveInfo : resolveInfoList) {
            if (context.getApplicationContext().getPackageName().equals(resolveInfo.activityInfo.packageName)) {
                continue;
            }
            Intent intent = new Intent(target);
            intent.setPackage(resolveInfo.activityInfo.packageName);
            intent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
            targetIntents.add(intent);
        }

        Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), title);
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{}));
        return chooserIntent;
    }
```
Choregrapheをインストール

Choregrapheとは?
=====================

Choregrapheはマルチプラットフォームなデスクトップアプリケーションで、以下の様なことができます。

- アニメーション、動作、会話の作成
- シミュレーション・実機での動作確認
- ロボット状態のモニター
- Pythonでの拡張

Choregraphのインストール
========================

ダウンロードするためには、コミュニティに登録する必要があります。

https://community.aldebaran.com/

メールでの確認があるので、メールを待って、アクティベーションしてからダウンロードしましょう。

https://community.aldebaran.com/resources/download/

自分のプラットフォームに合ったものをダウンロードしましょう。
以下のいずれかになると思います。

- choregraphe-suite-x.x-linux32-setup.run
- choregraphe-suite-x.x-linux64-setup.run
- choregraphe-suite-x.x-mac64-setup.dmg
- choregraphe-suite-x.x-win32-setup.exe

インストール途中でライセンスキーを要求されます。NAOを持っている人用だからでしょうか。
とりあえず評価版でインストールしました。

![スクリーンショット 2014-08-22 23.47.31.png](https://qiita-image-store.s3.amazonaws.com/0/52430/2a112b3f-2c17-c840-fe2d-60252b8bc00f.png)

９０日の試用になってしまいましたが、無事インストール出来ました。

Choregraphを使ってみる
========================

挨拶プログラムを作成してみます。

![create](http://i.gyazo.com/2f75c90560e1c65cf29c86c551b2ef97.gif)

実行してみます。
![execute](http://gyazo.com/2f75c90560e1c65cf29c86c551b2ef97.gif)


こんなバンザイモーションも５秒くらいで簡単に作れます。

![banzai](http://gyazo.com/b683991ae96a8594e5092bcf5c384bc6.gif)
MacでSSH鍵を作成する

※実行はMacで行いましたが、Linuxでも同じようにできるかもしれません。

##秘密鍵と公開鍵を作成する

```
$ ssh-keygen -t rsa -v
```

-t：暗号方式（type）
-v：冗長デバッグメッセージ（verbose：冗長な）

いろいろと聞かれると思いますが、すべてデフォルトでも構いません。

ホームディレクトリに.sshディレクトリが作成され、
id_rsa（秘密鍵）とid_rsa.pub（公開鍵）が作成されます。

##パーミッションを設定する

以下のようにパーミッションを設定して、所有者のみに権限を持たせます。

```
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa.pub
```
macにctagsインストールして、vimでRailsのソースコード読む


インストール

```bash
$ brew install ctags
```

そのままだと動かないので、aliasはる
参考: https://gist.github.com/nazgob/1570678

```bash:.bashrc
alias ctags="`brew --prefix`/bin/ctags"
```

```bash
$ . ~/.bashrc
```

railsアプリのルートでタグ作成
参考: http://qiita.com/joker1007/items/9c114a37560d6a29fe81

```bash
$ ctags --langmap=RUBY:.rb --exclude="*.js"  --exclude=".git*" -R .
```

準備完了。後はvimで

```
# ジャンプしたい箇所にカーソルを当てて
Ctrl + ]

# 戻る
Ctrl + t

# 該当結果が複数ある場合に、リスト表示
:tjump

# 明示してジャンプ（例:Userモデルにジャンプ）
:tag User
```
Angularの初心者から脱出するための勉強法。（知り合いからのメモ）

###dotinstallや日本版のオライリーを読んでも、初心者からは脱出できない。。。人向けに

angularにおいて。
cotroller scope directive service を理解することが大事で。
日本版のドキュメントや日本版のオライリーだと内容が薄いので、英語のドキュメントを読む必要があります。

 1. チュートリアル(https://docs.angularjs.org/tutorial) をやる
  <長いからこれは、dotinstallでもよい。全体把握するために>
 2. controllerをやる (https://docs.angularjs.org/guide/controller)
 3. scopeを読む（https://docs.angularjs.org/guide/scope）
 4. directiveを読む（https://docs.angularjs.org/guide/directive）
 4. servicesを読む（https://docs.angularjs.org/guide/services） getやpost関連のapiを扱う際はここのservicesを使うそうです。
ハッシュを無限にネストする

```rb
nested_hash = Hash.new do |hash, key|
  hash[key] = Hash.new(&hash.default_proc)
end
```

この `nested_hash` はこのように好き勝手にハッシュの入れ子を作ることができます。

```rb
nested_hash[:a][:b][:c][:d][:e][:f][:g] = 1
#=> 1
nested_hash
#=> {:a=>{:b=>{:c=>{:d=>{:e=>{:f=>{:g=>1}}}}}}}
```

### 解説

#### ハッシュのデフォルト値

Rubyのハッシュは初期化時に `Hash.new` にブロックを渡すことで、キーが無いときの初期値を設定することができます。

例えばユーザIDと得点が入った配列があるとします。

```rb
# [[user_id, score], ...]
scores = [[1, 4], [2, 3], [1, 3], [1, 3]]
```

この配列に対して各ユーザの合計点を計算する場合、例えば0に初期化されるハッシュを作ると簡単に計算できます。

```rb
score_hash = Hash.new { 0 }
scores.each { |user_id, score| score_hash[user_id] += score }
score_hash
#=> {1=>10, 2=>3}
```

そして、このデフォルトの動作は `Hash#default_proc` で参照することができます。名前からも分かるように `Proc` オブジェクトが返ります。

```rb
score_hash.default_proc.call
#=> 0
```

#### default_proc はハッシュ自身をブロック引数に渡される

```rb
hash = Hash.new { |h, k| hash == h }
hash[:unknown]
#=> true
```

そして `Hash#default_proc` は存在しないキーが渡される度に評価されます。そこで、この時にデフォルトでハッシュを代入するようなハッシュをデフォルト値として設定することで、無限ネストができることになります。
なぜクロージャ（Closure）と言うのか？

# クロージャはわかりづらい。

なんでかと言うと、以下の２つです。

* 名前
* 定義がよくわからない

Wikipediaさんなんかで調べると。

>クロージャ（クロージャー、英: closure）、関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数で実現している。

**関数閉包!!**

関数閉包、意味不明すぎる。なんかこの字面が意味分からなくしようとしているような気配すら感じる。（とはいえ、じゃあどんな名前が良いかと言えば、わかりませんし。それに一般的には「クロージャ」で通っていますから、別にいいのですが。）

関数ヘイホウってなに？初めてクロージャを学ぶような僕は、もう、むしろ笑えます。ちなみに、その先の**「関数オブジェクトの一種」**とか**「ラムダ式」**なんかも知りません。


# けど、JavaScriptのクロージャの事例は、とても分かりやすい。

関数の中に関数があります。

```js:Sample1
function outer() {

	var x = 10;

	function inner() {
		alert(x)
		x = x + 1
	}

	return inner;
}
```

これに対して、次の記述は以下のようになります。

```js:
var f = outer()

f(); // 10
f(); // 11
f(); // 12
```

この関数の中の関数（ネストされた関数）「『inner』はクロージャです。」

（※普通は、inner部分は無名関数にすることが多いと思いますが、分かりやすさのため、名前有りのネスト関数としておきます。）

もう一度書いてみます。

**『inner』はクロージャです。**


# ポイントは、何かと言うと。

「inner」は、「var x」を操作（キャプチャ）できる。


```js:
function inner() {
	alert(x)
	x = x + 1
}
```

は

```js:
var x = 10;
```

を操作しているのです。「var x = 10;」は「inner」の外に書いてあるのに。


# Closureと呼ばれる所以（ゆえん）。

「inner」は（{} の外で定義された）「var x」を操作できる。

これを英語で言うと。

*inner closes over x.*

（「関数インナー」は「変数x」をクローズオーバーしています。）

### ではクローズオーバー（close over）を辞書で調べてみます。




>close over
～を囲んで襲い掛かる

（引用元：英辞郎）


なるほど。

**「関数インナー」は「変数x」を囲んで襲いかかっている。**

(･_･*)

いえ。。
ここで言う「close over」は「take hold」くらいの意味だと思うのです。（もしかして、近寄って覆うという意味かもしれないけど。）つまり、捉えている、手にしているというような意味です。

たしかに、インナーは変数xを、捉えて操作しています。

### まとめると。

inner closes over x.

だから、

関数インナーのことを「closure」と呼ぶのだと思うのです。

いろいろ調べて、クロージャの概念は分かってきた気がするのですが。今思うと、閉包でもなかなか良いのではないかと思えて参りました。(._.)


# おまけ：Swiftのクロージャ

クロージャは次の３つのタイプのどれかになります。
（日本語にするの難しいので、スーパー適当に書きます。）

* グローバル関数（普通の関数？）はクロージャです。（ただ、操作できる対象は無い。）
* ネストされた関数はクロージャです。（上の例はコレ）
* クロージャ表現は、名前無しクロージャです。

以上、ありがとうございました。

※下記サイトのおかげで僕はクロージャを理解することができました。万謝。
[猿でもわかるクロージャ超入門](http://dqn.sakusakutto.jp/2009/01/javascript_5.html)
Swiftの変数の『?』や『!』の使い方と挙動の整理


Swiftの変数の『?』や『!』の使い方と挙動、エラーの仕組み等がよくわかっていないのでちょっとだけ整理してみた。

##検証内容
検証内容として下記を試してみた。

1. クラスのメソッド呼び出し
2. nilの代入
3. nil代入後の挙動

##『String』型変数

普通に宣言した`str01`は、当然のように`String`のメソッドである`uppercaseString`は呼び出せる。出力結果には、英小文字が英大文字となって変換表示されている。

しかし、言語仕様によって`nil`が代入できないのでエラーとなる。
そもそも`nil`が代入できないので、その後の挙動は省略。

![スクリーンショット 2014-08-24 10.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/3184/f3270589-84e3-d67d-08a9-2a2d64a608a5.png "スクリーンショット 2014-08-24 10.30.38.png")


##『String?』型変数

『?』宣言した`str02`は、そのままでは`String`のメソッドである`uppercaseString`を呼び出せない。
`uppercaseString`が無いと叱られる。


![スクリーンショット 2014-08-24 10.33.24.png](https://qiita-image-store.s3.amazonaws.com/0/3184/82622b0f-98cc-b782-4912-162f61d27864.png "スクリーンショット 2014-08-24 10.33.24.png")


その対応として、`?`を付けてみると、メソッドが呼び出せるようになった。

![スクリーンショット 2014-08-24 10.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/3184/c56b8bf5-38fa-c8de-14b8-b17994de9608.png "スクリーンショット 2014-08-24 10.34.25.png")

次に、『?』宣言した`str02`に`nil`してみると、普通に代入できる。
その後の処理では、`nil`に対してメソッドを実行するために当然エラーとなる。

![スクリーンショット 2014-08-24 11.04.55.png](https://qiita-image-store.s3.amazonaws.com/0/3184/cc165600-3bf8-b261-54eb-6301676194b0.png "スクリーンショット 2014-08-24 11.04.55.png")


##『String!』型変数

『!』宣言した`str03`は、`String`のメソッドである`uppercaseString`を呼び出せるようだ。
出力結果には英小文字が英大文字となって変換表示されている。

![スクリーンショット 2014-08-24 11.10.27.png](https://qiita-image-store.s3.amazonaws.com/0/3184/fba93576-8fa1-3ad2-ed3b-e6892ca12558.png "スクリーンショット 2014-08-24 11.10.27.png")

そして、宣言した`str03`にも`nil`が代入できる。

![スクリーンショット 2014-08-24 11.11.40.png](https://qiita-image-store.s3.amazonaws.com/0/3184/1a3c7399-8f0d-cfab-5d7a-6918a7f939a8.png "スクリーンショット 2014-08-24 11.11.40.png")

その後、`nil`を代入した後の処理でメソッドを呼び出しをするようになったら、先ほどまで呼び出せていたメソッドのポイントでエラーが発生するようになった。

よく理解できていないのであるが、これは、おそらくコンパイルは通るけど、ランタイムエラーとなるエラーパターンなのかもしれない。`Java`でいうヌルポ?

![スクリーンショット 2014-08-24 11.12.18.png](https://qiita-image-store.s3.amazonaws.com/0/3184/e0061dad-5f28-5860-a284-c4cbc5f6ed88.png "スクリーンショット 2014-08-24 11.12.18.png")

この辺りの検証はまた別の機会に行いたいと思います。とりあえず今回は挙動の整理までに。

※注意事項としては、上記はPlayground上での挙動なので、実際の言語仕様通りに動作できているかは不明です。
※尚、上記は`Xcode6-β5`で検証しています。 `Xcode6-β6`は2014/08/22現在不安定らしいので。

*Lovely Swift!!*
クラスの書き方と継承


（2018/10/15編集）この内容すごいJSビギナーの時に書いたやつでして
javascariptはclassやextends使えるので参考にしないほうがいいです。



とりあえずCompositeパターンで
なんとなくいい感じで記述できてるような気がせんでもないが
constructorとそれに付随する引数を取り入れたい…


##クラスの書き方

```javascript:Component.js
var Component= function(){};
(function(){
var _this_ = Component.prototype;
	////プロパティ////
	_this_.parent;
	_this_.name = "Component.prototype";

	////メソッド////
	//for Leaf and Conmpsite
	_this_.operation = function(){
		console.log(this.name + " : operation");
	};
	//for Composite
	_this_.addChild    = function(){};
	_this_.removeChild = function(){};
	_this_.getChild    = function(){};
	_this_.getParent   = function(){
		return this.parent;
	};
	_this_.setParent   = function(parent){
		this.parent = parent;
	};
})();
```
##継承の仕方
このモジュールを利用して継承させる。
調べたらNode.jsの中にこうやって継承しろと書かれていた。

```javascript:inherits.js
inherits = function(ctor, superCtor) {
    ctor.super_ = superCtor;
    ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
            value: ctor,
            enumerable: false,
            writable: true,
            configurable: true
        }
    });
};
```

なのでこのinheritsモジュールを利用して
なんとなく継承している風に改行せずにすぐ後ろに書いてみる

```javascript:Composite.js
var Composite= function(){}; inherits(Composite,Component);
(function(){
var _this_ = Composite.prototype;
	////プロパティ////
	_this_.child = new Array();
	_this_.name = "Composite.prototype";
	////メソッド////
	_this_.addChild = function(component){
  		this.child.push(component);
  		this.child[this.child.length - 1].setParent(this);
  	};
	_this_.removeChild = function(){
		
	};
	_this_.getChild    = function(id){
		return this.child[0];
	};
})();
```

(function(){定義})を使ってるかというと
実際のプロパティやメソッドを記入するときに
「オブジェクト指向　クラス javascript」とかで調べたら

```javascript:違うclassの書き方
var Composite= function(){};
Composite.prototype={

	////プロパティ////
	child : new Array();,
	name : "Composite.prototype",
	////メソッド////
	addChild : function(component){
  		this.child.push(component);
  		this.child[this.child.length - 1].setParent(this);
  	};,
	removeChild = function(){
		
	};,
	getChild    = function(id){
		return this.child[0];
	};
}
```

と記述されていてclassを作る分にはいいのですが
いざ継承する時にinherits(Composite,Component);
を利用して

```javascript:ダメだった継承の書き方
var Composite= function(){}; inherits(Composite,Component);
Composite.prototype={
定義　中略
}
```

とするとせっかく継承したprototypeが全部上書きされちゃったので
これはダメだとたどりついたのが(function(){定義})を使用する事
だったのです。

以下、コンポジットパターン用にメモ

```javascript:Leaf.js
var Leaf= function(){}; inherits(Leaf,Component);
(function(){
var _this_ = Leaf.prototype;
	_this_.name = "Leaf.prototype";
})();
```

（初心者です。アドバイス等あればお願いします。）
GitHubへのアクセスはSSHよりHTTPSがお勧めらしいので切り替えてみた

# はじめに

[Set Up Git · GitHub Help](https://help.github.com/articles/set-up-git)の[Next steps: Authenticating with GitHub from Git](https://help.github.com/articles/set-up-git)によると、GitHubへのアクセスはSSHよりHTTPSがお勧めらしいです。

# OSXのキーチェーンにgitで使用するパスワード/アクセストークンを保存する設定

[Caching your GitHub password in Git · GitHub Help](https://help.github.com/articles/caching-your-github-password-in-git)

私はHomebrewでgitをインストールしているのでgit-credential-osxkeychainはインストール済みでした。
ということで、設定は以下のコマンドを実行するだけです。

```shell-session
git config --global credential.helper osxkeychain
```

この設定をしておくと、GitHubからgit cloneするときにユーザ名(メールアドレス)とパスワードを聞かれて、入力するとキーチェーンに保存されます。以降はパスワードの入力は不要になります。

# GitHubの2段階認証を使っている場合はアクセストークンの作成が必要

GitHubの2段階認証を使っている場合はパスワードではなくアクセストークンが必要になります。

[Githubの2段階認証を有効にしてgitからの認証が弾かれる時の話 - 頼りないニモニック](http://nanase.hatenablog.jp/entry/2013/09/09/232529)が参考になりました。ありがとうございます！

[Two-factor Authentication](https://github.com/blog/1614-two-factor-authentication)の"How does it work for command-line Git?"に説明があります。

[GitHubのapplication settings](https://github.com/settings/applications)の"Personal access tokens"で"Generate new token"ボタンを押して作成します。

Token descriptionには"git @MacBook Pro"のような名前を入れました。scopeはデフォルトのまま(repo, public_repo, user, gist)にしました。

## アクセストークンは使用するマシンごとに作成することにした

アクセストークンは作成直後はGitHubの設定画面で確認できますが、その後は表示できなくなります。gitのコマンドラインにパスワードを聞かれた時にコピペするのですが、別のマシンで設定するときには確認できないわけです。

ということで、マシンごとにアクセストークンを作成することにしました。そうすればマシンが盗難にあったときも対応するトークンだけ無効にすれば良いという利点もあります。

CIサービスとかからアクセスさせるときもSSH鍵ではなくアクセストークンを使うと良さそうです。まあ、鍵もCIサービスからのアクセス専用に作って登録しておけば同じという話はありますが。

## 何かの都合で再度アクセストークンを入力する必要があるときはトークン再生成で対応

[GitHubのapplication settings](https://github.com/settings/applications)の"Personal access tokens"で"Edit"ボタンを押して編集画面に入り、"Regenerate token"ボタンで再生成します。

# 登録されたキーチェーンのエントリを確認

[アプリケーション]/[ユーティリティ]/[キーチェーン]で起動して、右上の検索フォームにgitと入力すると、以下のようなエントリが作成されていました。

* 名前: github.com
* 種類: インターネットパスワード
* キーチェーン: ログイン

# sshのパスフレーズのキーチェーンエントリと~/.ssh/configの設定を削除

sshのパスフレーズのキーチェーンエントリはもう不要なので削除します。

* 名前: SSH: /Users/hnakamur/.ssh/id_rsa_hnakamur_github
* 種類: アプリケーションパスワード
* キーチェーン: ログイン

~/.ssh/configの以下の設定も消しました。

```~/.ssh/config
host github.com
       User git
       Hostname github.com
       IdentityFile ~/.ssh/id_rsa_hnakamur_github
```
Mac OS XやiOSアプリのプログラムからバージョン名を取得する


バージョン名などバンドルに設定した情報を取得するときは、NSBundleのインスタンスメソッド```objectForInfoDictionaryKey:```を使う。

```objectivec
// Objective-Cの場合
NSString *version_name = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
```

```swift
// Swiftの場合
let version_name = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")
```

NSBundleには```infoDictionary```という辞書を返すインスタンスメソッドがありおそらくここからも取り出せるけど(未確認)、シンプルに値を取り出すだけなら```objectForInfoDictionaryKey:```を使う方がスマート。
Shift-JISのソースをiconvでUtf-8に変換してclangでエラー

# 背景

[Dockerで音を鳴らす](https://abrakatabura.hatenablog.com/entry/2014/08/21/062305)という記事を書く際にwavファイルが必要になり、探していたら、偶然txt2wav.cなるコードを- [コマンドラインからwaveファイルを作る方法　　（テキストを.wavに変換） - 主に言語とシステム開発に関して](http://d.hatena.ne.jp/language_and_engineering/20081107/1226080582)で発見する。

このtxt2wav.cがShift-JISで書かれていたため、そのままclangでコンパイルして実行するとMacのターミナルでは文字化けしてしまう。

# iconvでUTF-8に変換

## sjisを指定すると

```bash
iconv -f sjis -t utf8 txt2wav.c >txt2wav.utf8.c
```

※環境によっては、コメント欄にあるようにutf8の代わりにutf-8を指定する必要があるようです。


## clangでコンパイルすると

以下の様なエラーが表示される。

```
error: character too large for enclosing character literal type
    if (src[i] == '¥¥' || src[i] == ':') {
                  ^
```

## cp932を指定すると良い

オリジナルはSJISとはいえ、MSのSJISなので、cp932を元のエンコーディングとして指定することで、上手く、UTF-8に変換出来た。

```bash
iconv -f cp932 -t utf8 txt2wav.c >txt2wav.utf8.c
```

# おわりに

実は、Atom.ioで"mplus-1mn-light"をフォントファミリー指定して
いたので、円マークの横棒が一本少ない記号で表示されており、
試しにキーボードからバックスラッシュ（英語キーなので）を入力
したら、こちらはバックスラッシュのまま表示され、コードの違いに
気づくことが出来てあまりはまらなかったが、ターミナルのメッセージだけだと絶対ハマると思う。


# Link

- [トラップさんはTwitterを使っています 今更だけど、iconv で UTF-8 に変換する時は、-f SHIFT_JIS ではなくて -f CP932 を使った方がいいのか。前者だと、 \n のつもりで ¥n と書いてた物が全部円記号と解釈されて、とても悲しいことになる。](https://twitter.com/x68trap/status/18443833083)

# 関連投稿

- [SJISなgoogle.co.jpからの応答をnode.jsで文字化けさせずに受け取るには - Qiita](https://qiita.com/kjunichi/items/32d5410bab62c94db257)

# 関連記事

- [\のコードを含む2バイト文字の対応](https://abrakatabura.hatenablog.com/entry/2005/10/09/125743)
- [#trouble #unicode #utf8 ハイフンの文字コード #windows](https://abrakatabura.hatenablog.com/entry/2012/04/23/061800)
- [libiconvをemscriptenでjs化し、node.jsで使った](https://abrakatabura.hatenablog.com/entry/2015/04/18/115323)
Mac に rbenv をいれて ruby バージョンを管理する

Ruby さんバージョンで動く動かないありすぎです。

rbenv と ruby-build をインストール
----------------------------------

```zsh
brew install rbenv ruby-build
```

.zshrc あたりに以下を追加。

```zsh
# for rbenv
if which rbenv > /dev/null; then
    eval "$(rbenv init -)";
fi
```


Ruby 最新をインストール
-----------------------

インストールするバージョンは rbenv install --list で確認する。

```zsh
rbenv install 2.1.2
rbenv rehash
```

デフォルトで使うバージョンを最新にする。

```zsh
rbenv global 2.1.2
```

bundler だけはグローバルにインストールしとく。

```zsh
gem install bundler
```
Mac に Homebrew で MySQL をいれる

Oracle が提供しているものはアップデートもアンインストールもしづらいので Homebrew でインストール。

インストールと設定
------------------

```zsh
brew install mysql
```

自動起動の設定。

```zsh
ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
```

とりあえずで文字コードの設定をする。

```zsh:
sudo vim /usr/local/mysql/my.cnf
```

```
[mysqld]
character-set-server=utf8

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8
```

起動。

```zsh
mysql.server start
```


データベース設定
----------------

適当にやればいいと思うけど、最低限パスワード設定と余計なものの削除。

```zsh:
mysql -u root
```

```mysql
DROP DATABASE test;
DROP USER ''@localhost;
SET PASSWORD for root@localhost = PASSWORD('password for root');
SET PASSWORD for root@'127.0.0.1' = PASSWORD('password for root');
SET PASSWORD for root@'::1' = PASSWORD('password for root');
FLUSH PRIVILEGES;
```
Rails 環境構築メモ

1回だけ
```
brew install direnv
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
echo 'Spring.watch_method = :listen' >> ~/.spring.rb # web-consoleと組み合わせると落ちる。設定項目が増えたら変えるかも
```

アプリごと
```
rbenv local #{version}
cat <<EOF >> Gemfile
group :development do
  gem 'spring'
  gem 'listen'
  gem 'web-console'
end
EOF
bundle --path vendor/bundle
rbenv rehash
bundle exec spring binstub --all
echo 'export PATH=$PWD/bin:$PATH' > .envrc
```
TwitterのWebサイトの新着ツイートを自動で表示するブックマークレット

![スクリーンショット 2014-08-24 12.54.47.png](https://qiita-image-store.s3.amazonaws.com/0/51910/ca79909b-80bd-9f84-9b6e-3a5f8d7e10b0.png)
↑これを自分で押さなくてもツイートを読み込むようにする。30秒ごと。

```js
javascript:function update() {$('.js-new-tweets-bar').click();}setInterval('update()', 30000);
```

自分の利用シーンとしては、イベントに行った際に使っている。
通常のタイムラインをMacのTwitter.appで表示して、イベントのハッシュタグ検索結果をTwitterのWebサイトで表示した際に、Webサイトの方は自動で表示されないのでこれを使っている。

![スクリーンショット 2014-08-24 13.03.51.png](https://qiita-image-store.s3.amazonaws.com/0/51910/029ba9c2-53c6-cf10-0b2f-f50989051690.png)
importするだけで使えるgolang製kvsのgoleveldb


# 概要

[importするだけで使えるgolang製kvsのboltdb](http://qiita.com/kiida/items/6a12071ca382cac98b4d) で、インスパイアされて、
golang製kvsの[goleveldb](https://github.com/syndtr/goleveldb)を紹介します。

# goleveldbとは

goleveldbとは、[leveldb](https://code.google.com/p/leveldb/)のgolang portです。(完全に同じかどうかは調べきれてません・・・)
[levigo](https://github.com/jmhodges/levigo)等のleveldbラッパーとは違い、native golangで書かれているので、Cのleveldbライブラリを必要とせず、golangでimportするだけで簡単に利用できるのでお手軽です。
個人的には、sqliteの組み込みDBとして利用するような感覚で、組み込み永続化KVSとしての用途が向いているように思います。

leveldbについては[LevelDB入門 (基本編)](http://yosuke-furukawa.hatenablog.com/entry/2014/05/05/095207)が詳しいですが、そこから特徴を引用させてもらいます。

>* keyとvalueが任意のバイト列である
>* データはkeyでソートされて格納される
>* ソート順序を変えるために比較関数が提供されている
>* 基本的な操作は Put(key, value), Get(key), Delete(key)であり、シンプル。
>* 複数の変更をatomicな処理にすることができる
>* 一貫したデータのviewを得るため(書き込み中でもreadできるようにするため)にtransient な snapshotを作ることができる
>* Snappyという圧縮ライブラリを使ってデータを自動的に圧縮する
>* 外部のactivity (file system操作等)に対して仮想的なインタフェースを通して接続することができる。そのため、OSの操作を抽象化してカスタマイズすることができる。


# 簡単な使い方

## import


```
import "github.com/syndtr/goleveldb/leveldb"
```

## open db


```go:
db, err := leveldb.OpenFile("path/to/db", nil)
defer db.Close()
...
```

Openの第一引数はデータ書き込み先のファイルです。
第二引数がオプションのstructを渡しますが、デフォルトで良いならnilを。
ファイルが存在しない場合は作成するように等は、オプションで指定可能です。


## 読み書き

```go:
// 読み込み
// 戻り値のスライスの内容は変更してはいけません。
data, err := db.Get([]byte("key"), nil)
...

// 書き込み
err = db.Put([]byte("key"), []byte("value"), nil)
...

// 削除
err = db.Delete([]byte("key"), nil)
...
```

他にも、IterateやBatch writeやスナップショットの取得等が存在します。
[ドキュメント](http://godoc.org/github.com/syndtr/goleveldb/leveldb)を確認してみてください。
Qiitaアカウントのアイコンを変更する方法

以下は私のちょっと前のアカウント設定ページです

![2014-08-24_021756.png](https://qiita-image-store.s3.amazonaws.com/0/52104/b30f71f6-4553-d1c4-ae0e-a1ad6071ef3a.png)


実は私は少しあほなのです。
この画面を見てもどうやったらアイコンを変更できるのか見当も付きませんでした。
左のメニューからうろうろ探し回ったけど、画像をアップロードするようなところも見当たらないし、デフォルトの「Gravatar」というアイコンしか選択がない。

でも他のユーザーさんを見るといろんな画像を使っていて、どう見てもやり方があるはず。
結局分からなくて某所で聞いてきてやり方が分かったので、密かにアイコンの変更方法が分からない「Gravatar」な人のためにやり方を紹介します(`・ω・´)b

※ GitHub とか Twitter のアカウントがあれば連携出来るっぽいです


# Gravatar はアイコン名ではない！繰り返す Gravatar は（略）

Gravatar とは全世界に自分のアバターをさらけ出すための海外サービスの名称だったんだ！人類は滅亡する！
Ω　ΩΩ ＜な、なんだってー！

こんなんわかるかーヽ(｀Д´)ノ
早速、[Gravatar](http://ja.gravatar.com/) に飛んでアカウントを登録。
上部のメニューから「マイ Gravatar」を選択。
するとページ内にプロフィール画像が選択されてないよーって感じの注意書きが見つかると思うので、そこをクリックすると画像のアップロード画面に行けます。

アップロードが終わったら Qiita に戻ると、特になにもして無くてもアイコンが反映されているはずです、不思議。
もしかすると Qiita と Gravatar の両方とも同じメールアドレスで登録したから反映されたのかなぁ？
Mac OSX Vagrant/VM Fusionの導入


## Vagrantの導入
以下のURLからダウンロードする。
http://www.vagrantup.com/downloads

今回は、

```
vagrant -v
Vagrant 1.6.3
```
をインストールしました。

## VM Fusion Providerの導入
有料なので、購入する必要がありましたが、導入したVMware Fusionを利用したいので購入。送られたメールで導入もできますが、以下のURLに参考にできたので、それをもとに導入。

http://momijiame.tumblr.com/post/69361076830/vagrant-vmware-provider

### 導入とライセンス付与

```
vagrant plugin install vagrant-vmware-fusion
vagrant plugin license vagrant-vmware-fusion
```
で導入できるが、導入時にNokogiriパッケージを導入するように警告がでたので、導入しておきます。

```
rbenv exec gem install nokogiri -- --use-system-libraries
```

### Boxの導入
Rails で開発するにあたり、サーバ系、特にDBはLinux上におきたかったので、慣れているCentOSを導入。

```
vagrant box add centos64 https://dl.dropbox.com/u/5721940/vagrant-boxes/vagrant-centos-6.4-x86_64-vmware_fusion.box
```

ダウンロードに数分を待って、Box 導入完了。
Ruby | Gviz で Google画像検索で取得した地獄のミサワ画像をランダムに表示

# Ruby | Gviz で Google画像検索で取得した地獄のミサワ画像をランダムに表示

## 概要
Gviz で Google画像検索で取得した地獄のミサワ画像をランダムに表示します

## 仕様
* Google画像検索のAPIを利用
* 「地獄のミサワ」で検索した結果を取得
* 32件取得したURLの中からランダムで4件を出力対象とする

## コード

~~~ruby
require "gviz"
require 'open-uri'
require 'json'
require 'uri'
require 'fileutils'

q = '地獄のミサワ'
results = []

8.times { |i|
  uri = URI.escape("http://ajax.googleapis.com/ajax/services/search/images?q=#{q}&v=1.0&hl=ja&safe=off&start=#{i}")
  images = open(uri)
  results += JSON.parse(images.read)['responseData']['results']
}

results.delete_if { |e|File.extname(URI.parse(e['url']).path).empty? }
FileUtils.mkdir_p('images') unless FileTest.exist?('images')

def extension_from_url(url)
  extension = File.extname(URI.parse(url).path)
  extension == '.jpeg' ? '.jpg' : extension
end

filterd_results = results.shuffle.take(4)
filterd_results.each_with_index do |record, i|
  open(record['url']) do |image|
    extension = extension_from_url(record['url'])
    File.open("./images/#{i}#{extension}", 'wb') do |f|
      f.write image.read
    end
  end
end

random_size = []
records_size = filterd_results.size

Graph do
  global layout: :neato, label:"Google 画像検索", fontsize:60, size:15, overlap:false, fontname:'MS GOTHIC'
  nodes shape: :none

  records_size.times do |i|
    extension = extension_from_url(filterd_results[i]['url'])
    node :"#{i}", image: "./images/#{i}#{extension}", width: 1
  end

  save :"google_image", :png
end
~~~

## 出力
4回実行してみた

### 出力1
![google_image1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3167d204-d035-d695-94ec-4a3c79e674b6.png)

## 出力2
![google_image2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/93b8e963-c775-29ca-9b6f-de50d05ed352.png)

## 出力3
![google_image3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9e12e022-83da-2ceb-7b96-0aedc59ddef5.png)

## 出力4
![google_image4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/57e2d9a4-cfe1-4baa-e89c-64792f2e96ec.png)
goで#ifdefのような条件分岐コンパイル


概要
----

goでC言語等の`#ifdef`のように条件によってコンパイルされるコードを分けたくなり、やり方を調べました。


[build tags](http://golang.org/pkg/go/build/#hdr-Build_Constraints)を利用する
------------------

「[Golang Cafe #25 まとめ デバッグとリリースビルドの切り替え方法を考える](http://d.hatena.ne.jp/taknb2nch/20140414/1397459204)」を参考にためしてみました。
ソースファイルの先頭に、`// +build <タグ名>` や`// +build !<タグ名>` 等と入れておくと、
`go build -tags=<タグ名>` 等の指定にそってコンパイルするソースファイルを選別するようになるようです。

実際には以下のような記載になります。

```go:hoge.go
// +build hoge

pacakage main

import "fmt"

func main() {
...
```

と書いたファイルと

```go:nothoge.go
// +build !hoge

pacakage main

import "log"

func main() {
...
```

と書いた二つファイル用意すると、
`go build` を実行した場合は、`nothoge.go`が採用され、
`go build -tags=hoge`を実行した場合は、`hoge.go`が採用されます。


`go test`や`go get`も
----------------

go buildと同様に、
`go test -tags=<tag>` とすると条件にあったソースファイルを選別し、テストが行われるので、
テストコードファイル側にも同様の記載をすると良さそうです。

また、`go get -d -tags=<tag>`等も有効で、 採用されなかったソースコードのみimportしているパッケージはgetされないようになります。



注意点
-----

`// +build <tag>` の次の行は必ず空行を入れましょう。
空行を入れないとうまく動きません。これで少しハマりました。
Unityでワイヤーフレームシェーダー

単純な図形をワイヤーフレームにするだけで
なんだか、かっこ良くなるものです。
ワイヤーフレームってホントにマジックみたいなもんだな。
ということで、Unityでワイヤーフレームで描画する為のシェーダーを用意しました。

answers.unityでは奥側が表現されてなくってワイヤーフレーム表現として
物足りない感じだったので改修しました。

![スクリーンショット 2014-08-24 1.23.09.png](https://qiita-image-store.s3.amazonaws.com/0/38279/8eb5abc1-2133-c46b-4490-c7aea6501eb7.png)

<hr size="1" width="50%">
ソースはこちらダウンロードできます。
<a href="https://gist.github.com/amano-kiyoyuki/4eecea5d42e137b08834">GitHubリンク</a>

<hr size="1" width="50%">
こちら参考サイト
<a href="http://answers.unity3d.com/questions/309489/how-to-use-the-barymetric-wireframe-shader.html">answers.unity3d.com</a>
データをJSONに変換するときに任意のフォーマットを設定する

# 前置き

構造体をJSONにする場合、`encoding/json`の`func Marshal(v interface{}) ([]byte, error)`を利用する。

```go
package main

import (
  "encoding/json"
  "fmt"
  "time"
)

type Data struct {
  Id        int       `json:"id"`
  Title     string    `json:"title"`
  CreatedAt time.Time `json:"created_at"`
}

func main() {
  loc, _ := time.LoadLocation("Asia/Tokyo")
  d := Data{
    1,
    "HelloWorld",
    time.Date(2014, 8, 25, 0, 0, 0, 0, loc),
  }

  bytes, _ := json.Marshal(d)
  fmt.Printf("%s", bytes)

}
```
実行結果(本来は改行無し)

```json
{
  "id":1,
  "title":"HelloWorld",
  "created_at":"2014-08-25T00:00:00+09:00"
}
```

この場合、`created_at`のフォーマットを`2014-08-25T00:00:00+09:00`から`2014-08-25`にしたいとする。

# formatを設定する

JSONへ`Marshal()`が実行される場合、それぞれの型の`MarshalJSON()`が実行される。
上の場合`created_at`は`Time`の関数である[func UnmarshalJSON()](http://golang.org/src/pkg/time/time.go?s=27454:27507#L936)を利用している。

```go:http://golang.org/src/pkg/time/time.go?s=27454:27507#L936
func (t *Time) UnmarshalJSON(data []byte) (err error) {
	// Fractional seconds are handled implicitly by Parse.
	*t, err = Parse(`"`+RFC3339+`"`, string(data))
	return
}
```

つまりは、`RFC3339`形式のstring型に変換している。
なので、新規にUnmarshalJSON()を持った構造体を新しく作成する必要がある。

```go
// 独自のjsonTimeを作成
type jsonTime struct {
  time.Time
}

// formatを設定
func (j jsonTime) format() string {
  return j.Time.Format("2006-01-02")
}

// MarshalJSON() の実装
func (j jsonTime) MarshalJSON() ([]byte, error) {
  return []byte(`"` + j.format() + `"`), nil
}

// CreatedAtの型をtime.TimeからjsonTimeに変更
type Data struct {
  Id        int      `json:"id"`
  Title     string   `json:"title"`
  CreatedAt jsonTime `json:"created_at"`
}

func main() {
  loc, _ := time.LoadLocation("Asia/Tokyo")
  d := Data{
    1,
    "HelloWorld",
    jsonTime{time.Date(2014, 8, 25, 0, 0, 0, 0, loc)},
  }

  bytes, _ := json.Marshal(d)
  fmt.Printf("%s", bytes)
}
```

実行結果(改行は無し)

```json
{
  "id": 1,
  "title": "HelloWorld",
  "created_at": "2014-08-25"
}
```

# まとめ

* JSONのMarshalをする場合、値の型の`UnmarshalJSON()`が使われる。
* `UnmarshalJSON()`を独自で実装するために新しい型を実装する必要がある。

# 参考

* [Override the layout used by json.Marshal to format time.Time](http://stackoverflow.com/questions/20475321/override-the-layout-used-by-json-marshal-to-format-time-time)
「2の補数」「1の補数」について覚書

勉強したつもりなのに、
なぜかいつもいつも忘れたり混同したりしてしまう
「2の補数」「1の補数」について。

# 基数の補数、減基数の補数
## 基数の補数
足すと桁上がりする数のうち最小の数。

例：10進法（基数=10）の場合

　3 の補数は 7
　35 の補数は 65
　358 の補数は 642

## 減基数の補数
足しても桁上がりしない数のうち最大の数。

例：10進法（基数=10）の場合

　3 の減基数の補数は 6
　35 の減基数の補数は 64
　358 の減基数の補数は 641

>補数とは 【 complement 】 - 意味/解説/説明/定義 ： IT用語辞典
>http://e-words.jp/w/E8A39CE695B0.html


# 補数の定義

b進法において、自然数aを表現するのに必要な最小の桁数をnとしたとき、
b^n - a を、b進法におけるaに対する基数の補数（bの補数）
b^n - a - 1 を、b進法におけるaに対する減基数の補数（b-1の補数）

>補数 - Wikipedia
>http://ja.wikipedia.org/wiki/%E8%A3%9C%E6%95%B0

# 2進数における1の補数、2の補数

都合上、減基数の補数→基数の補数、と、上記10進数の補数とは逆の順番で説明する。

## 1の補数

　「足しても桁上がりしない数のうち最大の数」は
　足した後で、0になっていた桁が全て1になるような数。
　これは単純にビット反転した数。

　2進法で100（4）の1の補数は011（3）
　1001（9）の1の補数は0110（6）

## 2の補数

ビット反転した数に1を足し、桁上がりさせたもの。

　2進法で100（4）の2の補数は100（4）
　1001（9）の2の補数は0111（7）

## 1の補数、2の補数を混同してしまう

どうも混同してしまうので、自分なりの覚え方を考えた。
数学的に正しいかはともかく、自分はこう覚えることにした。

1の補数
　→「1」は「2」より少ない
　→少ないからギリギリ桁上がりしない
　→ビット反転

2の補数
　→「2」は「1」に1を加算した数
　→1の補数に1を加算した数
　→ビット反転した数に1を加算した数

## 補数の利用例

ある整数aに、別の整数bの2の補数を加算した数を求め、
その桁上がりを無視すると、
ある整数aから、整数bを減算した数になる。

一般的なプロセッサでは、
ある整数の負の数の表現を、2の補数としている。
補数を使う利点は、減算が加算で実現できること。
つまり、加算器だけで構成できること。

>2の補数 - Wikipedia
>http://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0

>１週間で学ぶIT基礎の基礎 - コンピュータにおける「データ表現」の基礎（第2回）：ITpro >http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20010719/2/
UnityのPlayerPrefsの簡単な使い方

```java
using UnityEngine;
using System.Collections;

public class TestPlayerPrefs : MonoBehaviour {

	void Start () {
		// 値を取得。第二引数はキーがない場合のデフォルト値
		int version = PlayerPrefs.GetInt ("VERSION", 1);
		Debug.Log(version); // 初めはキーがないのでデフォルト値の1

		// 値をセット。第一引数にキー名、第二引数にセットする値
		// 型に注意。この場合ほSetIntなので、int型しかセットできない
		PlayerPrefs.SetInt ("VERSION", 2);

		// ↑で2をセットしたので、2が取れる
		version = PlayerPrefs.GetInt ("VERSION", 1);
		Debug.Log(version); // 2

		// キーを全部消す
		// PlayerPrefs.DeleteAll();
	}

}
```

Unityではあんまり性能がよくないみたいなので（一つ一つにファイルアクセス？）
大量に取得したり、セットしたりするのはよくないらしい。
iOSでポップアップビューの自作を行う。


# まず最初に

ポップアップビューはvendor製の機能の充実したコードがネット上のあちこちで入手可能なので、個人的にはそちらを使うことをオススメします。

* https://github.com/martinjuhasz/MJPopupViewController

不幸なことに、自作することを迫られた人のために調査内容を共有します。

# 概要

## Storyboardのみで実装できるか？

結論から先に述べると、諦めました。（諦めただけで不可能なのかどうかまで検証してません）
最初、安易に遷移先のビューコントローラのビューを半透明化して中心に適当なビューでも配置し、modalで遷移してやればとりあえずは簡単にできるんじゃないか？とお手軽に作ってみましたが、実際はmodalアニメーションが完了したあと遷移元のビューコントローラーのビューのカラーが真っ黒に。
おそらく、ビューコントローラーが背後に回った際に描画対象から外れるのだと思います。

この時点で既存のvendorのポップアップビューのコードを覗くと、segueを使ってポップアップビューを実装しているコードがなかったので、おそらく上記の理由でダメなんだろうなと、違うアプローチでトライしました。

(追記　8/25）[こちら](http://qiita.com/g-1/items/970d9101bdd14cbceffd)にStoryboardを使ったポップアップビューについて寄稿しました。

## UIView -addSubview で実現する

単純に表示したい位置に適切なサイズのUIViewを親となるビューに addSubviewするだけ。
まぁ、これはごくごく簡単に実現できましたが、実際の使用用途を考えるとこのビューに載せたコントロールをUIViewControllerで簡単に操作したいと思うわけです。

なので、もう少しちゃんとした仕組みで考えると次のようなコードになります。

```objc:ViewController.m

- (void)viewDidLoad
{
  [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
  self.popupViewController = [[PopupViewController alloc] init];
  [self addChildViewController:self.popupViewController];
  [self.popupViewController didMoveToParentViewController:self];
  
  //
  //self.popupViewController.view.backgroundColor = [UIColor redColor];
  
}

- (IBAction)popup:(id)sender
{
  [self.view addSubview:self.popupViewController.view];  
}

```

PopupViewControllerクラスはxib等で適当に作成します。
とりあえず、これでポンと手っ取り早く表示されます。
閉じるときは

```objc:PopupViewController.m
- (IBAction)close:(id)sender
{
  [self.view removeFromSuperview];
}

```

基本的な理屈としてはこれでOK。

## アニメーションをつける

基本的なメカニズムはできましたが、さすがに飾りっけがなさすぎるのでアニメーションをつけてみました。
次のようなコードになります。

```objc:ViewController.m

- (IBAction)popup:(id)sender
{
  [self.view addSubview:self.popupViewController.view];
  
  CGPoint center = self.popupViewController.contentView.center;
  
  UIView* view = self.popupViewController.contentView;
  
  view.transform = CGAffineTransformScale(CGAffineTransformIdentity,0.5f,0.5f);
  view.center = center;
  
  [UIView animateWithDuration:0.2
                        delay:0.0
                      options:UIViewAnimationOptionCurveEaseInOut
                   animations:^{
                     view.transform = CGAffineTransformIdentity;
                     view.center = center;
                   }
                   completion:nil];
  
}

```

```objc:PopupViewController.m

- (IBAction)close:(id)sender
{
  [UIView animateWithDuration:0.2f
                   animations:^{
                     self.view.alpha = 0.2f;
                   }
                   completion:^(BOOL finished){
                     [self.view removeFromSuperview];
                     self.view.alpha = 1.f;
                   }];
}

```

開くときにはアフィン行列で拡大アニメーション、閉じるときはアルファでフェードアウトアニメーションを実装してみました。
あとは好みで好きなアニメーションで変化させればよいと思います。

###　蛇足

実はアニメーションで超苦労しており、特に閉じるアニメーションは最初、縮小アニメーションをアフィン行列演算を屈指して実現しようと思ったのですが挫折して今のアニメーションにしています。
PopupViewControllerは薄いブラックの背景に一回り小さいUIViewを載せる設計になってるのですが、背景ビューはアニメーションする必要はないので、子ビューのcontentViewだけアニメーションさせてるですが、スケールかけると左上を原点としたスケーリングしかできなくて、結局アルファを使ったアニメーションで妥協してしまいました。

今後の課題です。

# サンプルコード

https://github.com/g-1/PopupViewController/tree/xib
Rubyで%記法（パーセント記法）を使う


Rubyの%記法まとめ。
以下の例では%の後に全て「()」記号を使っているが、他の記号でも代替可能。自分が好きなものを使って問題ない。

## 1. %、%Q
ダブルクオートで囲う場合と同等。
シングルクオートやダブルクオートのエスケープが不要になる。
後述の%q()と違い、変数・定数の展開もできる。

```ruby
str = %(Programming language "Ruby")
puts str
# => Programming language "Ruby"

ruby = "Ruby"
str2 = %(Programming language "#{ruby}")
puts str2
# => Programming language "Ruby"
```

## 2. %q
シングルクオートで囲う場合と同等。
シングルクオートなので、変数や定数の展開はされない。

```ruby
ruby = "Ruby"
str = %q(Programming language "#{ruby}")
puts str
# => Programming language "#{ruby}"
```

## 3. %w
配列を作る。配列の要素はスペース区切りで指定する。
式の展開はされない。

```ruby
array = %w(one two three four)
p array
# => ["one", "two", "three", "four"]
```

## 4. %W
配列を作る。%w()と違い、式の展開がされる。

```ruby
ruby = 'Ruby'
PYTHON = 'Python'

array = %W(#{ruby} #{PYTHON} PHP)
p array
# => ["Ruby", "Python", "PHP"]
```

## 5. %i
要素がシンボルの配列を作る。

```ruby
array = %i(Ruby Python PHP)
p array
# => [:Ruby, :Python, :PHP]
```


## 6. %I
要素がシンボルの配列を作る。%i()と違い、式の展開がされる。

```
ruby = 'Ruby'
PYTHON = 'Python'

array = %I(#{ruby} #{PYTHON} PHP)
p array
# => [:Ruby, :Python, :PHP]
```

## 7. %x
コマンド出力を行う。バッククオートで囲った場合と同等。

```ruby
res = %x(date) # dateコマンドの実行
puts res
# => Sat Aug 23 23:27:01 JST 2014
```

## 8. %s
シンボル。式の展開はされない。

```ruby
sym = %s(Ruby)
p sym
# => :Ruby
```
Fragmentを使ってSplashScreenを表示させる


#はじめに
SplashScreen実装するなら、[アンドロイドアプリのスプラッシュ画面の実装例](http://qiita.com/and8-tamura/items/e89a276ac485ad3d359c)でばっちり。

せっかくまとめたので、参考程度にどうぞ。

#SplashScreen用のFragment作成
DialogFragmentを継承した`SplashScreenFragment.java`と`fragment_splash_screen.xml`を作成する。

コードの概要は、下記のとおり。

* フラグメントのサイズを画面表示領域の8割とする（任意）
* Dialogをキャンセルできないようにする
* DialogにSplashDialogThemeを適用する
* layout内でsplashscreen用のImageViewタグを作成
* splash.pngを作成し、drawalbeフォルダへ入れる

```SplashScreenFragment.java
public class SplashScreenFragment extends DialogFragment {

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Dialog dialog = getDialog();

        WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int dialogWidth = (int) (metrics.widthPixels * 0.8);
        int dialogHeight = (int) (metrics.heightPixels * 0.8);

        lp.width = dialogWidth;
        lp.height = dialogHeight;
        dialog.getWindow().setAttributes(lp);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = new Dialog(getActivity(), R.style.SplashDialogTheme);
        // ダイアログをキャンセルできないようにする
        setCancelable(false);

        return dialog;
    }
}
```

```fragment_splash_screen.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center_vertical|center_horizontal"
    android:layout_gravity="center_horizontal">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/splash" />

</LinearLayout>
```

#styles.xmlにSplashDialogThemeの追加
Splash画面のみを表示させるため、下記のようなThemeとする。

コードの概要は、下記のとおり。

* ActionBarの無効
* Titleの非表示


```styles.xml
    <style name="SplashDialogTheme" parent="@android:style/Theme.Holo.Dialog">
        <item name="android:windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
    </style>
```

#SpalashScreenFragmentを呼び出したいActivityを編集
SplashScreenFragmentを2秒表示させてから、Fragmentを閉じるため、`openSplashScreenFragment()`を`onCreate()`に追加する。

```SplashScreen.java
public class SplashScreen extends Activity {

    SplashScreenFragment dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.SplashDialogTheme);
        setContentView(R.layout.activity_splash_screen);

        openSplashScreenFragment();

    }

    private void openSplashScreenFragment(){
        dialog = new SplashScreenFragment();
        dialog.show(getFragmentManager(), "dialog");

        Handler handler = new Handler();

        handler.postDelayed(new Runnable()
        {
            @Override
            public void run() {

                dialog.dismiss();
            }

        }, 2000);
    }
}
```
Library/metadataの細々したファイルがコミット時ウザい件

「バージョン管理するのは`Assets`と`ProjectSettings`だけでOK」という話をよく聞くものの、実際やってみてうまくいかなかったので仕方なく`Library`や`Packages`もバージョン管理していました。

最近、`Library`を捨てるためには設定が必要というのを知りました。

![inspector.png](https://qiita-image-store.s3.amazonaws.com/0/1955/535b6afb-c632-b8fe-9c33-92b36fd444ab.png)

1. メニューで [`Edit`(Macの場合は`Unity`)] → `[Project Settings]` → `[Editor]` を選択
2. インスペクタが開くので、設定パネルで `Version Control Mode` を `Visible Meta Files` に設定
3. `Asset Serialization Mode` を `Force Text` に設定
4. プロジェクトを保存

これで`Library`以下のファイルをバージョン管理する必要がなくなり、`Assets`と`ProjectSettings`だけで大丈夫になりました。

4.5.2f1で確認しましたが、5.0.0f4でも同様の手順でいいようです。

これで`medadata`はこれでちまちまコミットせずにすむようになりましたが、`*.meta`ファイルは残ります。`*.meta`には[設定の一部が保存されている][unitymeta]ようなので、これらはバージョン管理しておいたほうがいいようです。

# Unityのバージョンによる細かい違い

バージョン管理するためのコツはUnityの更新のたびに細かく変わってきたようです。上の手順は4.5.2f1で確認したものです。

4.3.4以前は、`Version Control Mode` を `Hidden Meta Files` に設定したままで大丈夫だったそうです。

4.3以前は、`Version Control Mode` の選択項目は `Disabled` や `Meta Files` といった名前だったそうです。

4.5以前は、 `Unity or Edit` → `Preferences` → `Packages` → `Repository` を `External`に設定する必要があったそうです。

# 参考記事

* [Which Unity project files can be ignored for version control? - Unity Answers](http://answers.unity3d.com/questions/22604/which-unity-project-files-can-be-ignored-for-versi.html)
* [Git issues with 4.3 - Unity Answers](http://answers.unity3d.com/questions/578927/git-issues-with-43.html)
* [Unity4.3.4でのmeta fileの挙動について - Qiita](http://qiita.com/shintaness/items/7e6f7db442b64b1c3477)
* [Mastering Unity Project Folder Structure | Nravo developers](http://developers.nravo.com/mastering-unity-project-folder-structure-level-0-vcs/#.U_iWLvne4dk)
* [How to prepare a Unity project for git? - Stack Overflow](http://stackoverflow.com/questions/21573405/how-to-prepare-a-unity-project-for-git)
* [Unityプロジェクトの作成 - UnityでGithubしよう](http://keijiro.github.io/unity-github-tutor/#unity-)
* [Unityの.metaファイルに書かれているguidについて][unitymeta]

[unitymeta]: http://qiita.com/wordijp/items/3e4b87756fd11c893a9d