OmniAICreator/Qiita-1.07M huggingface dataset:
Githubを使って競合解決手続きを ぼっちシミュレーション

チーム作業を円滑に行えるようになるために、競合解決手続きをぼっちシミュレーション。

#Githubでレポジトリを作成

レポジトリ名を「[gitsim](https://github.com/kota7/gitsim)」として、テスト用のファイルとして「conflict.txt」という空のファイルを作成しました。

![gitsim.png](https://qiita-image-store.s3.amazonaws.com/0/80588/aa2f2b72-2021-d78e-ead4-b83530d78ea8.png)




#二人の仮想ユーザーを準備

適当なディレクトリに２つのディレクトリを用意します。これらを各ユーザーのローカル環境と想定して、それぞれにgitsimレポジトリのクローンを導入します。

```bash
mkdir user1
mkdir user2

cd user1
git clone https://github.com/kota7/gitsim.git
cd ../user2
git clone https://github.com/kota7/gitsim.git
```

#二人が独立して作業・競合を発生させる

ユーザー１がローカルで作業、githubへpushします。

```bash
cd ../user1/gitsim
echo コーヒーを１つ > conflict.txt
git add .
git commit -m 'edited conflict.txt'
git push  # ここで認証が必要
```

一方、ユーザー２もまた独立して作業し、githubへpushしたとします。すると、gitは、ユーザー２の環境にあるファイルが最新のものではない（ユーザー１の作業を反映していないので）ことを指摘して、先にpullやfetchで最新の状態にしてからpushするように指摘します。

```bash
cd ../../user2/gitsim
echo 紅茶を１つ > conflict.txt
git add .
git commit -m 'edited conflict.txt'
git push  # ここで認証が必要

# ! [rejected]        master -> master (fetch first)
#error: failed to push some refs to 'https://github.com/kota7/gitsim.git'
#hint: Updates were rejected because the remote contains work that you do
#hint: not have locally. This is usually caused by another repository pushing
#hint: to the same ref. You may want to first integrate the remote changes
#hint: (e.g., 'git pull ...') before pushing again.
#hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

そこで、fetch + "merge FETCH_HEAD" で最新の状態への更新を試みます(pullでも同じことになります)。この時、ユーザー１と２の編集が競合している（つまり互いに相容れない）と判断されると、該当するファイルの箇所が下記のように自動的に変更されます。

```bash
git fetch
git merge FETCH_HEAD
#Auto-merging conflict.txt
#CONFLICT (content): Merge conflict in conflict.txt
#Automatic merge failed; fix conflicts and then commit the result.

cat conflict.txt
#<<<<<<< HEAD
#紅茶を１つ
#=======
#コーヒーを１つ
#>>>>>>> FETCH_HEAD
```

# 競合の解決とその結果

競合の解決とは、```<<<< ~ >>>>``` とされた箇所をどうするかを決定していく作業です。具体的には、ファイル内の該当する箇所を編集して再コミットします。その際、通常はそのコミットが競合を解決するためのものであることを明記するとプロセスの透明性が高くなります。

```bash
echo 紅ヒーを２つ > conflict.txt
git add .
git commit -m 'resolved the conflict'
git push
```

ログには、ユーザー１と２がそれぞれ独自に行ったコミットも残っているし、その後競合を解決したコミットも残ります。

```bash
git log --oneline

#9ada39b resolved the conflict
#4f939d1 edited conflict.txt
#b45b03b edited conflict.txt
#ac1a498 Create conflict.txt
#7674da8 Initial commit
```
Fedora Rawhideをインストールしてみた

#Fedora Rawhideとは？
Fedoraのローリング・リリース版です。日々最新のソフトを配信しているらしいです。

#Fedora22(もしくは最新安定版版)のインストール
ネットインストールのISOはありますが、画面真っ黒なまま先に進めないということが起こることがあります。実際起こりました。そのためまず最新安定版のFedoraをインストールします。
デスクトップとしてGNOMEを使いたい人は
https://getfedora.org/ja/workstation/
ここから、それ以外を使いたい人は
https://spins.fedoraproject.org/
ここからISOを落としてインストールします。個人的な好みからいくとMATEかXfceがおすすめです。~~GNOME3は改悪、はっきりわかんだね。~~

#Rawhideへのアップグレード

インストールしたらデスクトップかホームディレクトリで次のコマンドを実行します。

```bash
echo "#!/bin/sh" >> rawhide
echo "dnf system-upgrade download --releasever rawhide --nogpgcheck" >> rawhide
chmod +x rawhide
```
これで次のような内容のシェルスクリプトができました。

```sh
#!/bin/sh
dnf system-upgrade download --releasever rawhide --nogpgcheck
```

そしてこれを管理者権限で実行します。

```bash
sudo ./rawhide
```

実行するタイミングによって成功したり失敗したりします。失敗した場合には時間をおいてリトライします。シェルスクリプトを作成したのはそのためです。成功したらRawhideへの移行は完了です。あとは`sudo dnf update`などをしてください。

#Rawhideの特徴
とにかくソフトが新しく、ほとんどが最新安定版かその1個手前(・先)です。Windowsで最新安定版のバイナリが(主に公式サイトから)ダウンロードできるのは当たり前の状況ですが、Linuxではなかなかそうはいきません。とにかく最新版のソフトを使いたいけどソースビルドはこりごりだ！めんどくさいから公式リポジトリで提供してくれ！といった方にはおすすめだと思います。(導入初日の感想)

#ソフトのバージョン抜粋(2015/9/27現在)
GCC 5.1.1(1つ前)
gnuplot 5.0.1(最新)
Emacs 24.5(最新)
Ruby 2.2.3(最新)
Python 2.7.10(最新)/3.4.3(1つ前)
PHP 5.6.14(1つ先; RC1)
Perl 5.22.0(最新)
Git 2.5.3(最新)
Vim 7.4(最新)
Apache 2.4.16(最新)

PHPだけフライングしていますがあとは最新版か1つ前・・・っょぃ。

#Mozcのインストール
Fedora22(アプデ前)でMozcが使えることを確認しました。iBusを使用している場合は

```
sudo dnf -y install ibus-mozc
```

でインストールできます。インストール後はiBusなどの再起動をした後、設定画面を開いてMozcを有効化してください。

#安定版に戻したい時
**戻れない可能性大です。**公式に書いてある方法で戻そうとしましたがダメでした。ご注意ください。
Arduino Leonardo LCD's HelloWorld！

#材料（千石電商）
・ARDUINO LEONARDO（メイン基板ですね）
・GROVE STARTER KIT for Arduino（ググったら...これ販売終了？）

# 物理的に接続
ArduinoはUSBで接続できる

# Aruduinoプログラミングツールをインストール
[Arduino Leonardoで始めよう (２)　インストール、ドライバーとLED点滅](http://blog.livedoor.jp/meloom/archives/20249923.html)
モノが動くっていいっすねー。
（ソース編集はVisualStudioでやりたいけど失敗中）

# 設定
「.zipファイルをunzipして、arduinoといつフォルダがすべて」というOSに影響しないエディタのようだ（2019/7/14追記: Chrome版があるらしい？？だったらそっちのほうがいいな...）
この辺のIDEの設定もちゃんとやってくださいね
![4.JPG](https://qiita-image-store.s3.amazonaws.com/0/94562/eef53343-af73-6a44-7623-2b08d619b016.jpeg)

で、スターターキットの基盤がLEONARDOにジョイントできるってのに
気づくまでにしばらくかかった（まるで重箱弁当だ！）。
このスターターキットの基盤って電源どこだ？とか思ってた（説明書全部英語）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/a7f391e6-31d4-5f01-a63c-5df930d857f5.png)

おおっ！噛みこんだぞ！？
と感動したもののそこから先がわからない。

# LCDライブラリのインストール
なんとなく [秋月のHP](http://akizukidenshi.com/catalog/g/gK-09167/) を見ていると（買ったのは千石だけど...）ありました。
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/94562/7e1231d3-7abd-63cb-3cb0-09357527a7b9.jpeg)
[こちら(github.com)](https://github.com/Seeed-Studio/Sketchbook_Starter_Kit_for_Arduino/tree/master/libraries/Grove_LCD_RGB_Backlight) のほうを見たら「Grove_LCD_RGB_Backlight」のフォルダを発見。
「LICENSE」とか「README」とかのほかになにやら必要そうなものがあります。
・keywords.txt
・rgb_lcd.cpp
・rgb_lcd.h

とりあえずこれらをまとめるフォルダを作る必要があるようなので、
下図は、Librariesという既定フォルダに「LCD」というフォルダを作成。
そのなかにさっきの3ファイルを保存。中身はみんなgithubを生で開いてコピペした、ただのテキストです。
![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/94562/82e84d9c-3a5d-6717-5657-e9448e3eecdb.jpeg)

次にこの辺を見るが...現時点のIDEは Arduino 1.6.5 で、画面表示が齟齬してる。
一番下にあった！これでライブラリが使えるようになった。
（追記：ん？勝手に使えるようになってるな...この写真は不要だったかも。
「libraries」の既定フォルダは「読んでくれる」のかも）
![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/94562/1143576e-9dd4-0242-d694-a65a05cb70a5.jpeg)

なお、Arduinoライブラリのインストールには [いくつかのアプローチ方法](http://www.humblesoft.com/wiki/?Arduino%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) がある。
・git コマンドでインストール
・Arduino-IDE ライブラリ・マネージャーでインストール
・zipファイルでインストール

※当記事を作成した当時はあまりにもわかっていなかったため「zipファイルでインストール」に限りなく近いカタチでインストールを行ったがいまなら「ライブラリ・マネージャーでインストール」がいいかもね。
ライブラリを使用するには Arduino-IDE を再起動する必要がある。

#ソース
```text
#include <Wire.h>
#include <rgb_lcd.h>

#define LED 13

const int colorR = 0;
const int colorG = 0;
const int colorB = 255;

rgb_lcd lcd;

void setup() 
{
    // set up the LED（13番ピンを出力モードとして定義します）
    pinMode(LED,OUTPUT);
    
    // set up the LCD（LCDは16文字2行です）
    lcd.begin(16, 2);

    // LCDのカラーを決定します
    lcd.setRGB(colorR, colorG, colorB);
    
    // LCDにメッセージを表示します
    lcd.print("hello, world!");

    delay(1000);
}

void loop() 
{
    //PART:LEDの点滅
    digitalWrite(LED,HIGH);
    delay(1000);
    digitalWrite(LED,LOW);
    delay(1000);

    //PART:LCDへの表示 Note：LCDの行は0ベースでできていて、1を指定すると2行目という意味です
    lcd.setCursor(0, 1);
    lcd.print(millis()/1000);
    delay(100);    
}
```

#動作確認
ここまでハンダ付けなし！
2種類の練習プロジェクトが混ざってます（Lチカ・LCD表示）
LEDは13番pinを指定して、13番とGNDにシュッと差し込んだだけだし、
LCDもケーブル(?)を差すとこだけ英語確認してシュッと差しただけ。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/94562/438a531f-ebef-9e42-3f7c-d90a91ec0632.jpeg)

#つぎは？
「土壌湿度センサー」http://akizukidenshi.com/catalog/g/gM-07047/
があるのでこれをなんとかくっつけて、土に刺して乾燥具合をLCD表示する。
Android Javaのリソース節約術

AndroidではJavaでプログラムを書きますが、ふつうのコンピューターと比べればリソースの少ない環境ですので、特に気をつけてプログラミングする必要があります。

# 通常のJavaとも共通すること
## 定数は`static final`にする
まず、`final`にしなければ、変更可能になってしまうので**定数になりません**[^1]。そして、一般に定数はインスタンスを問わず一定ですが、`static`にしなければインスタンスごとに生成される無駄が発生してしまいます。さらに、`public static final`な定数は、他のクラスから呼び出した場合も埋め込まれて効率的に処理できることがあります。

## ラッパーオブジェクトに注意する
Javaでは、`int`や`double`といった型はクラスでない基本型ですが、それらをオブジェクトとして扱えるようにするために、`Integer`や`Double`などの型があります。Java 5からは、自動で基本型とラッパーオブジェクトを変換してくれるようになりました（オートボクシング/アンボクシング）。

それはいいのですが、ラッパーオブジェクトはイミュータブルなので、これを使って計算すると「アンボクシング→演算→ボクシング」という過程を経てしまうので、無駄にラッパーオブジェクトの生成が続くこととなります。ジェネリクスの引数など、どうしても`Object`として扱いたい場面でだけラッパーオブジェクトを使って、一般的なコードでは基本型の数値を使いましょう。

## ループで回すような文字列生成には`StringBuilder`を使う
Javaでは`String`もイミュータブルなので、文字列連結を`+`演算子で行った時には、「その都度新たな`StringBuilder`オブジェクトを生成して、それを使って連結を行い、結果の`String`オブジェクトを得る」処理が走っています。もちろんこれは必要なことなのですが、ループで継ぎ足して文字列を生成し続けると、ループ1回ごとに`StringBuilder`と`String`が生成してしまって非効率になります。

そのような場合には、明示的に`StringBuilder`を宣言して、連結する文字列を`.append()`していって、最後に`toString()`として文字列を得ましょう。もっとも、1行内で済むような文字列連結であれば、わざわざ出すほどのことでもありません。

# Androidの場合、特に注意が必要な点
## ガベージコレクタ
ふつうのパソコン向けのプログラムを書く場合、大きなメモリを使う場面以外ではそれほどガベージコレクタを意識する必要はありませんが、Androidの場合は、絶対的な性能・メモリの使用可能量がパソコンより低いため、すぐにメモリは少なくなり、より負荷になるガベージコレクタが走るようになるので、意識する必要があります。

なお、LogCatにもGCの進行状況が出るので、様子を見ることができます。

### 大原則
基本的に、Java上で一度確保したメモリを解放できるのはGCだけなので、一時的でも何でもいったん生成したオブジェクトはGCに「解放してもらう」しか手段がありません。また、`System.gc()`という関数があって、ガベージコレクタの動作を**促す**（動き出す保証はありませんが）ことは一応できます。ただし、解放すべきものがなくてもガベージコレクションは負荷のかかる操作であって、そしてシステム側でもメモリ不足のとき、アイドル時間などに適宜行なっているので、プログラムのメインループで定期的に呼び出すようなことはしてはいけません。初期化の完了時、動作モードが大きく切り替わるときなど、不要オブジェクトが多数発生する場面かつ、ユーザーがガベージコレクションによる待ち時間を負担視しないような場面であれば、有効かもしれません。

### 具体策
ガベージコレクタに負荷をかけないようにするには、「必要ないオブジェクトを生成しないようにする」のがいちばんの方法です。ループ内や画面書き換えごとなど、頻繁にオブジェクトを使う場合、むしろそれをフィールドに持たせるなどして再利用したほうが、毎回生成してはガベージコレクタに投げなくて済むようになるので、負荷が減るかもしれません。


[^1]: `final`にしても、配列やミュータブルなオブジェクトでは中身を書き換えられてしまいますが、とりあえずその問題は置いておきます。
AWS EC2でインスタンスを立てる

基礎的なところではありますが、
EC2でWebサーバ用のインスタンスを立てる手順を紹介致します。

AWSアカウントの登録手順は、ここでは省きます。

##インスタンスを立てる
下記リンクから、"AWS マネジメントコンソール"にログインします。
http://aws.amazon.com
![awsコンソール入り口.png](https://qiita-image-store.s3.amazonaws.com/0/85797/d3bf6286-91d1-1e35-b14b-596d179a8ef2.png)

赤丸の箇所からログイン可能です。
ログイン後、リージョンを東京にしておくことをおすすめします。
この設定は、どの地域のデータセンターを利用するか、というものです。
日本からアクセスするなら、国内のほうが当然、高速に通信できます。
（インスタンスの価格が地域によって少し異なったりと、
場合によって別リージョンが適している場合もあります。）

![AWSコンソールトップ.png](https://qiita-image-store.s3.amazonaws.com/0/85797/aadb4d27-1714-2e55-9f61-d82cc1fd76af.png)

左上にある、EC2をクリックしてください。

![EC2コンソールトップ.png](https://qiita-image-store.s3.amazonaws.com/0/85797/9aa7a783-6877-e2b5-9420-ef211fd9400c.png)

左のメニューから、”インスタンス”を選択し、
その後、”インスタンスの作成”ボタンをクリックしてください。

次の画面は、”マシンイメージの選択”です。
いろいろな仮想方式とOSの組み合わせがありますが、
今回はAmazon Linux AMI(HVM)を選択します。

![クイックスタート.png](https://qiita-image-store.s3.amazonaws.com/0/85797/1d01db36-38cc-8a89-78af-be75036e0403.png)

その後、インスタンスタイプを選択します。
今回は、一番安い”t2.micro”を利用します。
とりあえずインスタンスを立てるだけなら、”確認と作成”をクリックして完了してもよいのですが、今回はそれなりにWebサーバとして最初から利用可能なインスタンスを作成するために、詳細も設定していきます。

![EC2インスタンスタイプ.png](https://qiita-image-store.s3.amazonaws.com/0/85797/70b60ce3-b5f4-bb49-def6-3046503fe09a.png)


詳細設定では、サブネットと削除保護、モニタリングの設定を変更します。
サブネットでは,"ap-northeast-1a"を選択しました。
"ap-northeast-1c"でも、どちらでもよいですが、
その他のインスタンス（例えばRDSなど）と共通したサブネットを利用したほうが、最適化されているといえます。

削除保護は、誤操作によるインスタンス削除から、保護する設定です。

モニタリングは、AWS CloudWatchで、CPU利用率などの情報を見るために設定します。

その次の”ストレージの追加”では、特にデフォルトから変更していません。
その次の”インスタンスのタグ付け”では、Nameとして、わかりやすい名前をつければ良いと思います。（適宜）

その次は”セキュリティグループの設定”です。
これは、どこで、どのようにアクセスされるのか、考える必要があります。

とりあえず、セキュリティグループ名と説明には、わかりやすい名称・説明を記述します。

今回は、サーバの操作のためSSHと、ウェブサーバとしての利用を考え、HTTPとHTTPSを開放する設定をします。

SSHはデフォルトで設定されているので、画面左下”ルールの追加”ボタンを押し、
タイプからHTTP,HTTPSを選択してください。

![security-group.png](https://qiita-image-store.s3.amazonaws.com/0/85797/3863064c-61d7-54b4-d96f-ad96ba904e83.png)

送信元として、今回はすべてのルールで”任意の場所”を選択しています。
実際は、SSH接続するIPアドレスが限られているなら、そのIPアドレスを指定すべきです。
また、特定のIPアドレスにだけHTTPアクセスを許可したい、ということもあるでしょう。
そのような場合は、開発拠点で固定IPアドレスなど取得して、送信元を”カスタムIP”変更する必要があります。

次は確認画面です。
設定内容に間違いがないことを確認し、作成を押します。
初回であれば、SSH接続用のキーペアが存在しないので、
新しいキーペアを作成し、キーペアをダウンロードをする必要があります。

![keypair.png](https://qiita-image-store.s3.amazonaws.com/0/85797/0d67c806-dfaa-4edc-f888-cf81fe98efdb.png)


"キーペアのダウンロード"後、"インスタンスの作成"ボタンをクリックしてください。

しばらくすると、インスタンスの作成が完了します。
先ほどダウンロードしたキーペアを利用して、SSH接続を試してみてください。
（デフォルトのログインユーザ名は、"ec2-user"です。）
初心者PHPerがオペコードをvldを使って覗いてみた


最近発売された[PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石](http://www.amazon.co.jp/exec/obidos/ASIN/4774176427/mijuku-22/ref=nosim/)を初心者ながらに読んでいると、PHPのオペコードをvldというパッケージを使ってダンプする、といったことをしていました。

こりゃ面白そうと思ったのでちょっとやってみました。

## vldの導入

vldはpeclを使ってインストールします。

````console
$ pecl install channel://pecl.php.net/vld-0.13.0
````

もしインストール出来ねー！って方は`sudo`で実行してみるといいかも。

次に、`php.ini`に１行追加します。

````PHP:php.ini
extension=vld.so
````

これで準備はOKです。

## vldの実行

ではvldを使ってみます。
用意するPHPはこちら。

````PHP:test.php
<?php
	echo "Hello, PHP.";
````

では、この`test.php`のオペコードをダンプしてみましょう。

````console
$ php -d vld.active=1 -d vld.execute=0 test.php

Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /Users/bps/test-php/test.php
function name:  (null)
number of ops:  2
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ECHO                                                     'Hello%2C+PHP.'
   3     1      > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     1; out1:  -2
path #1: 0, 
````

おー！出てますね！

`echo`は単純に値をechoで実行するだけなので

````console
   2     0  E >   ECHO                                                     'Hello%2C+PHP.'
````

の１文だけで終わってますね。

では次に`print`を実行してみましょう。

````PHP:test.php
<?php
	print "Hello, PHP.";
````

````console
$ php -d vld.active=1 -d vld.execute=0 test.php

Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /Users/bps/test-php/test.php
function name:  (null)
number of ops:  3
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   PRINT                                            ~0      'Hello%2C+PHP.'
         1        FREE                                                     ~0
   3     2      > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     2; out1:  -2
path #1: 0, 
````

はい出ました！さっきとは少し違うオペコードが出ましたね。
`print`は戻り値を返すため、その戻り値分のメモリを`FREE`で解放しているために`echo`より１文冗長的になっています。

## まとめ

ということで、初心者が背伸びしてオペコードを触ってみました。
本読んで実際やってみたら「なぁーんだ、そんなことか」と今まで難しく考えていたことが馬鹿みたいに思えました。

PHPの勉強やってて「オペコードってなんだ？」って思った人は本を読んで、一度オペコードに触れてみることをオススメします。
重複しない乱数配列(Java版／ArrayList使用版)

[ArrayList不使用版](http://qiita.com/AinoMegumi/items/98e5d1a453d1a0587778)を作ったので、続いてArrayList使用版を作ってみました。
例によってまたRandomクラスの乱数生成器を使いました。

```java:MakeRandomArray.java
import java.util.ArrayList;
import java.util.Random;
public class MakeRandomArray {
	public ArrayList<Integer> makeRandomArray(ArrayList<Integer> array, Random rand, int arraySize, int randMax, int randMin){
		for(int i = 1; i <= arraySize; i++){
			array.add(random(rand, randMax, randMin));
		}
		boolean isAllNoConflict = false;
		do{
			isAllNoConflict = true;
			for(int j = 0; j <= arraySize - 1; j++){
				for(int k = j + 1; k <= arraySize - 1; k++){
					if(array.get(k) == array.get(j)){
						array.set(k, random(rand, randMax, randMin));
						isAllNoConflict = false;
					}
				}
			}
		}while(!isAllNoConflict);
		return array;
	}
	private int random(Random rand, int max,int min){
		if(max < min) return rand.nextInt(min - max) + max;
		else return rand.nextInt(max - min) + min;
	}
}
```
使用例

```java:Main.java
import java.util.Random;
public class Main {
	public static void main(String[] args){
		MakeRandomArray mkrandArr = new MakeRandomArray();
		ArrayList<Integer> arr = mkrandArr.makeRandomArray(new ArrayList<Integer>(), new Random(), 10, 100, 1);
		for(int x = 0; x <= 9; x++) System.out.println(arr.get(x));
		
	}
}
```
別に行数変わんないのがね…。
これ作ってる時、そのことに気づいてすごく虚しかったです。
あ…そうだ。今回は１回しかmakeRandomArray呼んでないから引数にnew書いてますが、何回も呼ぶ場合は変数作ったほうがいいですからね。資源と労力は有効的に使いましょう。
ちなみにArrayList不使用版もそうですからね。

>## 追記１
>書いてから１年１ヶ月経ってますが、改良しました。たぶんこっちのほうが処理は速く、軽いです。

>```java:MakeRandArray.java
import java.util.ArrayList;
import java.util.Random;
public class MakeRandomArray {
	public ArrayList<Integer> makeRandomArray(int arraySize, int randMax, int randMin) {
		if (randMax < randMin) return this.makeRandomArray(arraySize, randMin, randMax);
		ArrayList<Integer> arr = new ArrayList<Integer>(randMax - randMin);
		for (int i = randMin; i <= randMax; i++) arr.add(i);
		Collections.shuffle(arr);
		return new ArrayList<Integer>(arr.subList(0, arraySize));
	}
}
>```
>mainメソッドは同じで大丈夫です。

>## 追記２
>なんか初歩的な書き間違いしてましたので修正してくださった方がいたのでそれを適用しました
（個人的メモ）YAML使って タグを含む記述を読み込めないかなー

# 設定とかでおなじみの・・・

Ruby on Railsでデータベースの設定を記述したりするYAML。
いろんな設定とかが記述しやすいです。

データベース構築するほどでもないけど、ページテンプレートに沿って、このページならこれを呼び出す。みたいな処理ができないかなー？って。考えてみた。

# YAMLファイルの記述

こんな感じで、YAMLファイルを記述します。
仮に hash_test.yml とでもします。
※わざとタグの記号を全角にしています。
<pre>
keyword: Ruby YAML YML 学習
title: YAMLの読み込みと加工
content: |-
        ＜p＞YAMLファイルの操作＜/p＞``
        ＜div＞システム操作です
        スクリプト使って処理します＜／div＞
        改行いっぱい
</pre>
検索用キーワードやタイトル（記述パターンが固定）、本文部分（タグや改行の記述パターンが、固定ではない）箇所が混在していると仮定します。

なお、本文部分は最終行以外改行したいので
最終行以外改行の設定をしています。

# YAMLファイルを読み込み、加工するRubyスクリプト

指定したYAMLファイルを読み込んで、ハッシュとする。
そのうち、本文のデータを抜き出し、改行コードで配列分割するコードを試しに作って見ました。

<pre>
require 'yaml'

str = ARGV[0]
data = YAML.load_file(str)

data.each do |key, value|
 puts "key:#{key} value:#{value}" 
end

hoge =data['content']

fuga = hoge.split("\n")

p fuga
</pre>

# 実行例

`$ ruby yml-print.rb hash_test.yml`

<pre>
key:keyword value:Ruby YAML YML 学習
key:title value:YAMLの読み込みと加工
key:content value:<p>YAMLファイルの操作</p>
<div>システム操作です</div>
スクリプト使って処理します</br>
改行いっぱい
["<p>YAMLファイルの操作</p>", "<div>システム操作です</div>", "スクリプト使って処理します</br>", "改行いっぱい"]
</pre>

改行できましたー。

# 参考
プログラマーのための YAML 入門 (初級編)
http://magazine.rubyist.net/?0009-YAML

YAMLで改行する方法
http://d.hatena.ne.jp/shunsuk/20090822/1250937310

YMLファイルを読み込んで、特定の値を取り出す
http://blog.codebook-10000.com/entry/20140322/1395499315
Xcode7にアップデートしてコミットができなくなった場合の対処法

Xcode6.xから7にアップデートしたら、ファイルのコミット時に以下のようなエラーが出て失敗するようになりました。

"Couldn’t communicate with a helper application."

Terminalを起動し、どこからでもいいので以下のコマンドを実行すれば直ります。

`xcrun git config --global user.email めーるあどれす`
`xcrun git config --global user.name なまえ`
重複しない乱数配列(Java版／ArrayList不使用版)

C++14版で書いたのと同じ感じでJava版も書いてみました。
ただし、今回はタイトルの通り、ArrayListを使わないで静的配列で書きました。

はいそこの変態、性的配列じゃなくて静的配列だよ。
てか性的配列ってどんな配列だろうね…。String型のえっちな言葉が入ってる配列かな？まあいいや。

乱数生成器はRandomクラスのを使いました。

```java:MakeRandomArray.java
import java.util.Random;
public class MakeRandomArray {
	public int[] makeArray(Random rand, int size, int randMax, int randMin){
		int[] arr = new int[size];
		for(int i = 0; i <= size - 1; i++){
			arr[i] = random(rand, randMax, randMin);
		}
		boolean isAllNoConflict = false;
		do{
			isAllNoConflict = true;
			for(int j = 0; j <= size - 1; j++){
				for(int k = j + 1; k <= size - 1; k++){
					if(arr[k] == arr[j]){
						arr[k] = random(rand, randMax, randMin);
						isAllNoConflict = false;
					}
				}
			}
		}while(!isAllNoConflict);
		return arr;
	}
	private int random(Random rand, int max,int min){
		if(max < min) return rand.nextInt(min - max) + max;
		else return rand.nextInt(max - min) + min;
	}
}
```
使用例

```java:Main.java
import java.util.Random;
public class Main {
	public static void main(String[] args){
		MakeRandomArray mkRandArr = new MakeRandomArray();
		int[] arr = mkRandArr.makeArray(new Random(), 10, 100, 1);
		for(int x = 0; x <= 9; x++) System.out.println(arr[x]);
	}
}
```
C++のほうが楽だと思いました…。

ArrayList使用版は[こちら](http://qiita.com/AinoMegumi/items/d3db3cff4c57d2544201)

>ArrayList使用版の改良版みたいにまーぜまーぜってやる方式を取る場合、どうしてもArrayListやListを使わざるを得なくなるみたいです。まあ戻り値の型をただのint配列にしてやることはできますが。
>たぶんこれも上に書いたものよりは速く、軽いです。


>```java:MakeRandomArray.java
import java.util.ArrayList;
import java.util.Collections;
class MakeRandomArray {
	public int[] makeRandomArray(int arraySize, int randMax, int randMin) {
		if (randMax < randMin) return this.makeRandomArray(arraySize, randMin, randMax);
		ArrayList<Integer> arr = new ArrayList<Integer>(randMax - randMin);
		for (int i = randMin; i <= randMax; i++) arr.add(i);
		Collections.shuffle(arr);
		ArrayList<Integer> newArr = new ArrayList<Integer>(arr.subList(0, arraySize));
		int[] data = new int[arraySize];
		for (int i = 0; i < arraySize; i++) data[i] = newArr.get(i);
		return data;
	}
}
>```
こちらもmainメソッドは同じで大丈夫です。
【Unity】 UniRxでFPSカウンタを作ってみる

**UniRxについての記事のまとめは[こちら](http://qiita.com/toRisouP/items/48b9fa25df64d3c6a392)**

---

UniRxを使ってFPSカウンタを作ってみました。

```csharp:FPSカウンタ
using UnityEngine;
using System.Linq;
using UniRx;
using UniRx.Triggers;

public class FPSCounter : MonoBehaviour
{
    [SerializeField] private int bufferSize = 5; //バッファサイズ
    public ReadOnlyReactiveProperty<float> FpsReactiveProperty;

    private void Awake()
    {
        FpsReactiveProperty = this.UpdateAsObservable()
            .Select(_ => Time.deltaTime)   //Time.deltaTimeに変換
            .Buffer(bufferSize, 1)         //過去bufferSize分バッファ
            .Select(x => 1.0f/x.Average()) //平均値からfps算出
            .ToReadOnlyReactiveProperty();

        FpsReactiveProperty.Subscribe(x => Debug.Log(x));
    }
}
```

##解説

上記のコードは、過去bufferSize分のTime.deltaTimeの平均値を取りそこからFPSを算出しています。
そしてストリームをReadOnlyReactivePropertyに変換し、publicとして公開しています。

注意すべき点としては、FpsReactivePropertyの初期化のタイミングです。
FpsReactivePropertyの初期化が終わる前に別のコンポーネントがFpsReactivePropertyをSubscribeしてしまうとNullReferenceExceptionが発生してしまうので注意しましょう。

#追記

Static Propertyにしてしまったほうが取り回しが良いとのご指摘を@neueccさんより受けましたのでそちらのバージョンを記載します。

```csharp
public static class FPSCounter
{
    const int BufferSize = 5; //サンプル数を変えたい場合はここを変える
    public static IReadOnlyReactiveProperty<float> Current { get; private set; }

    static FPSCounter()
    {
        Current = Observable.EveryUpdate()
            .Select(_ => Time.deltaTime)
            .Buffer(BufferSize, 1)
            .Select(x => 1.0f / x.Average())
            .ToReadOnlyReactiveProperty();
    }
}
```

こちらのメリットとしては、MonoBehaviourに全く関係ない場所から何も考えずに呼び出してfpsが取得できるという点です。

```csharp:呼び出し方
FPSCounter.Current.Subscribe( fps => Debug.Log(fps) );
```
Raspberry Pi 2（略してパイ２）を無線LAN化


# 概要
Raspberry Pi 2 に BUFFALO WLI-UC-GNME を付けて無線LAN化します。

# 用意したもの
+ 無線LAN子機：http://www.amazon.co.jp/gp/product/B010EGTPVY

# Raspbianの設定

無線LAN子機をUSBポートに接続したら、lsusbコマンドでハードウェアが認識されたかを確認します。

```bash
$ lsusb
	Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
	Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
	Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
	Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
```

認識されたことを確認できたら、iwlistコマンドでアクセスポイントを確認します。

```bash
$ sudo iwlist wlan0 scan
	          Cell 02 - Address: XX:XX:XX:XX:XX:XX
	                    Channel:4
	                    Frequency:2.427 GHz (Channel 4)
	                    Quality=51/70  Signal level=-59 dBm
	                    Encryption key:on
	                    ESSID:"MY-SSID"
	                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 9 Mb/s
	                              18 Mb/s; 36 Mb/s; 54 Mb/s
	                    Bit Rates:6 Mb/s; 12 Mb/s; 24 Mb/s; 48 Mb/s
	                    ..........
```

SSIDとパスワードを使って、認証情報をファイルに出力します。
パスワードは暗号化して保存するため、wpa_passphraseコマンドを利用します。

```bash
$ sudo wpa_passphrase MY-SSID MY-PASSWORD | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf
```

出力されたwpa_supplicant.confを編集して、認証方式を追記します。
また、コメントアウトされた「#psk」の行には暗号化前のパスワードが記載されていますが、この行は削除してしまってかまいません。

```bash
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
	ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
	update_config=1
	network={
	        ssid="MY-SSID"
	        proto=WPA2
	        key_mgmt=WPA-PSK
	        #psk="MY-PASSWORD"
	        psk==***************************************************
	}
```

ネットワークインターフェースファイルを変更し、無線LAN子機に固定IPを付与します。
無線LAN用の定義はwlan0とwlan1が存在していますが、1つの場合はwlan1は削除してしまってかまいません。

```bash
$ sudo vi /etc/network/interfaces
	auto eth0
	allow-hotplug eth0
	iface eth0 inet manual

	auto wlan0
	allow-hotplug wlan0
	iface wlan0 inet static
	address 192.168.24.xxx
	netmask 255.255.255.0
	gateway 192.168.24.1
	wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

	#auto wlan1
	#allow-hotplug wlan1
	#iface wlan1 inet manual
	#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

最後にRaspberry Pi を再起動して、無線LANに割り当てたIPで接続できれば完了です。

```bash
$ sudo reboot
```

有線／無線 両方に固定IPを付与する場合は、ルーティングが多少面倒になりますので、ご注意下さい。

# BUFFALO WLI-UC-GNME が高温になる問題
熱いです。
ずっとさわっていると火傷すると思います。
Raspberry Piをケースに入れずむき出しで使っている場合は子供がさわらないようにするなど注意した方がいいです。
d3.jsでSVG要素の属性を取得する


SVG要素の属性の設定方法は調べたらすぐ出てきますが、取得方法はなかなか見つからなかったのでまとめておきます。

###設定方法
```javascript
d3.select('svg').select('g').attr('id', 'example')
```

###取得方法
```javascript
// id = 'example'
var id = d3.select('svg').select('g').attr('id')
```

第2引数を指定しないだけで、指定属性の値を取得できます。
PHP 配列操作あれこれ

# PHPでよく使う配列操作のまとめ

### 各要素に同じ操作を適用する
例：配列の各要素を二倍にする

```php:example1.php
$tmp = [1, 2, 3];
$ary = array_map(function($r){return $r*2;}, $tmp);
// $ary = [2, 4, 6]
```

各要素に第一引数に指定したコールバック関数を適用し、返り値のすべての要素をもつ配列を返す。

### 連想配列を要素に持つ配列（多次元配列）で、連想配列の特定の要素に同じ操作を適用する
例：連想引数の要素：priceを二倍にする

```php:example2.php
$tmp = [
    ['id' => 1, 'price' => 100],
    ['id' => 2, 'price' => 200],
    ['id' => 3, 'price' => 300],
];
$double_price = function($r){
    $r['price'] = $r['price']*2;
    return $r;
};
$ary = array_map($double_price, $tmp);
/*
$ary = [
    ['id' => 1, 'price' => 200],
    ['id' => 2, 'price' => 400],
    ['id' => 3, 'price' => 600],
]
*/
```

### 連想配列を要素に持つ配列（多次元配列）で、連想配列の特定の要素のみを取り出す
例：連想配列の要素：idのみを取り出す

```php:example3.php
$tmp = [
    ['id' => 1, 'price' => 100],
    ['id' => 2, 'price' => 200],
    ['id' => 3, 'price' => 300],
];
$ary = array_column($tmp, 'id');
// $ary = [1, 2, 3]
```

ただし、array_column関数はPHP5.5以上でないと使えない。
5.5未満のときは`array_map(function($r){return $r['id'];}, $tmp)`

### 配列をフィルタする
例：連想配列の要素：priceが200以上のもののみを取り出す

```php:example4.php
$tmp = [
    ['id' => 1, 'price' => 100],
    ['id' => 2, 'price' => 200],
    ['id' => 3, 'price' => 300],
];
$ary = array_filter($tmp, function($r){return $r['price'] >= 200;});
/*
$ary = [
    ['id' => 2, 'price' => 400],
    ['id' => 3, 'price' => 600],
]
*/
```
Carthageを使ってビルド時間を短縮しよう

## Carthageとは
Carthage（カーセッジ）は、Swift製のライブラリ管理ツールです。

Cocoaのライブラリ管理ツールとして有名なCocoaPodsは、自動的にワークスペースの生成と更新を行うなど、多くの機能を搭載していますが、
Carthageはそうでない、シンプルで柔軟性があり、余計なことをしないツールとして作られました。


## なぜCarthageを使うのか

先ほどCarthageにはシンプルで余計なことをしないという特徴があると述べましたが、
いま自分としては **コンパイル時間が短くなる** という点に最も魅力を感じて使用しています。

Carthageはライブラリをインストールすると、そのライブラリを事前にビルドをし、フレームワークを作成してくれるため、
CocoaPodsを使うのに比べ、コンパイル時間を短くすることができるんですね。

実際に[メッセージングアプリSync開発の舞台裏(iOS)](http://qiita.com/susieyy/items/079be0df5cd72953b21b)などでも、コンパイル時間を短縮するために

> - Cartage対応のライブラリはPodsでインストールしない

といった施策が行われています。

---

以下、実際の導入作業に入ります。

## Homebrewの導入

既に完了している方は不要です。

### 1.ダウンロードとインストール

```bash
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### 2.更新

```bash
brew update
```


## Carthageの導入

先ほどインストールしたbrew経由でcarthageをインストールします。

```bash
brew install carthage
```


## Carthageで外部ライブラリを導入

### 1.ライブラリを導入したいプロジェクトのディレクトリへ移動

```bash
cd ios-projects/application/ShiftViewer
```

### 2.Cartfileを作成

touchコマンドなどでファイルを作成。

```bash
touch Cartfile
```


### 3.Cartfileを編集

vimなどでCartfileを編集します。

```bash
vim Cartfile
```

外部ライブラリの情報は以下のように記述。

```bash
github "Alamofire/Alamofire"
github "SwiftyJSON/SwiftyJSON"
```


念のためvimでの操作も書いておきます。

`i`を押し、入力モードにして、外部ライブラリの情報を記述。
記述ができたら`esc`を押して入力モードを解除。
`:wq`を実行し、保存して終了。
保存したくない場合は`:q`で保存せず終了もできます。

（ビルドがはじまらなかったらスペルミスの可能性などが考えられます。）


### 4.外部ライブラリをビルド

以下のコマンドからビルド。
ちょっと時間がかかります。

```bash
carthage update --platform iOS
```

`carthage update`だけでもビルドはされますが、OSX用や、watchOS用もビルドされちゃうので、今回はiOS用のみをビルドするよう指定します。


### 5.プロジェクトに外部ライブラリを追加

まずプロジェクトファイルのGeneralタブから、
「Linked Frameworks and Library」にある＋ボタンを押します。

![carthage01.png](https://qiita-image-store.s3.amazonaws.com/0/66391/abc33308-a5f0-e4aa-af9d-7d0fe3774e6b.png "carthage01.png")

Frameworksを選択する画面になるので、「Add Other...」を選択。

![carthage02.png](https://qiita-image-store.s3.amazonaws.com/0/66391/78bf08be-9b1b-892c-5153-fd52f6d7a0b9.png "carthage02.png")

プロジェクトのディレクトリ内から、Carthage/Build/iOSと移動し、
ライブラリの.frameworkファイルを選択します。

![carthage03.png](https://qiita-image-store.s3.amazonaws.com/0/66391/67fd11d5-8e03-ea62-1be1-7d55f8a20174.png "carthage03.png")

ライブラリが追加できたら、Build Phasesタブに移動し、
＋ボタンから、「New Run Script Phase」を選択します。

![carthage04.png](https://qiita-image-store.s3.amazonaws.com/0/66391/15ce97c1-bf18-08d5-7fee-9373050b6451.png "carthage04.png")

すると「Run Script」が現れます。

ここでまず「Shell」の下にある黒い部分に以下のコマンドを記述します。

```bash
/usr/local/bin/carthage copy-frameworks
```

そして次に「input Files」にて＋ボタンを押し、以下のようにframeworkの情報を記述します。


```bash
$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
```

![carthage05.png](https://qiita-image-store.s3.amazonaws.com/0/66391/1141d1f1-8b92-4f9a-e1d2-fa6e724a946b.png "carthage05.png")

これで全ての設定が完了しました。

あとは必要なところでimportして使うだけです。

## 参考

[Github Carthage/Carthage Readme.md](https://github.com/Carthage/Carthage/blob/master/README.md)

[Carthage Tutorial: Getting Started](http://www.raywenderlich.com/109330/carthage-tutorial-getting-started)
[AWS]アカウントの削除と再取得の方法[アカウント再取得編]


ネタで吹き飛ばしたawsアカウント
アカウントないと何もできなくて夜中一人で(´･ω･`)ｼｮﾎﾞｰﾝ とするだけの人生になってしまいます。
####これはまずい、ヒジョーにマズイ！
ってことでアカウント取り直します。

[アカウントの削除と再取得の方法[アカウント削除編]](http://qiita.com/Yuki_BB3/items/a3cd54caac4c080c12c5)はこちら

---

###アカウント取得
![アカウント作成１.png](https://qiita-image-store.s3.amazonaws.com/0/52141/2145b9d4-93d5-5fb4-0b3b-734d6f85b1d6.png "アカウント作成１.png")
AWSの公式サイトから[無料ではじめる]を選択

![アカウント作成２.png](https://qiita-image-store.s3.amazonaws.com/0/52141/d8650084-adb3-7ba5-a84f-e3768ea359eb.png "アカウント作成２.png")

・・・ん？
何かがおかしい？？？

![アカウント取得４.png](https://qiita-image-store.s3.amazonaws.com/0/52141/dfec34a9-9112-b4cd-849e-45928d8ee56a.png "アカウント取得４.png")

---
chromeを使ってる人はここを参考に消してください
[キャッシュと Cookie のクリア](https://support.google.com/accounts/answer/32050?hl=ja&ref_topic=2373959&vid=1-635788569326243453-1527756317)

---
####さて、気を取り直してリトライ

![アカウント取得５.png](https://qiita-image-store.s3.amazonaws.com/0/52141/2ad6c99f-6e48-ddd6-00a5-b0a232c54866.png "アカウント取得５.png")

####前回同様メールアドレスを入力します。

![アカウント取得６.png](https://qiita-image-store.s3.amazonaws.com/0/52141/a68bf36b-a36b-db74-de45-7852e7fb8a28.png "アカウント取得６.png")

![アカウント取得８.png](https://qiita-image-store.s3.amazonaws.com/0/52141/1eaf5b77-0a08-17c3-eaa9-0d273c77c3c6.png "アカウント取得８.png")



![アカウント取得７.png](https://qiita-image-store.s3.amazonaws.com/0/52141/91638fb2-31cd-da53-e3fc-0effe980438a.png "アカウント取得７.png")

![アカウント取得９.png](https://qiita-image-store.s3.amazonaws.com/0/52141/fe383417-511b-d9b0-0aee-6ef7f1fe04b4.png "アカウント取得９.png")
クレジットカード情報を入力します。一度登録したカードって使えないでしょ？と言っている人がいましたが
***前回使用したクレカで問題なかったです。***

![アカウント取得１０.png](https://qiita-image-store.s3.amazonaws.com/0/52141/ca2c5fd7-fc89-b9e3-77bd-dfe5d949edd7.png "アカウント取得１０.png")

本人認証。電話がきます。日本語できました！
自動音声に従ってPINコードを入力します。

![アカウント取得11.png](https://qiita-image-store.s3.amazonaws.com/0/52141/22e46ee5-2587-cdc6-9438-525e4f2ff61a.png "アカウント取得11.png")

![アカウント取得12.png](https://qiita-image-store.s3.amazonaws.com/0/52141/9dc76ac4-c693-e318-5966-bc43554ba4d1.png "アカウント取得12.png")
プラン選択。ベーシックで・・・

ここまででアカウントの再取得は完了！
####再びAWSを弄りながらビールを飲む日々がやってきました！


---
###ログイン確認

![完成AWS_マネジメントコンソール.png](https://qiita-image-store.s3.amazonaws.com/0/52141/9a0fbf2d-0f32-d20a-1acd-8b1c693fba42.png "完成AWS_マネジメントコンソール.png")

以上でAWSアカウントの再取得ができました。
書いていて思いましたがほとんどAWSアカウントの取り方説明でしたね！
これからAWSを始めてみる方、簡単にアカウント開設できるのでぜひ、やってみてください！


###2015年9月現在のアカウント開設方法でした〜
重複しない乱数配列(C++14版)

yumetodo氏が[C++11規格の重複しない乱数配列の生成法](http://qiita.com/yumetodo/items/48d77f5d554df84f66f7)を書いていたので、C++14規格のものを作ってみました。

```cpp:
#include <random>
#include <vector>
#include <iostream>

auto random() {
	std::random_device rnd;     // 非決定的な乱数生成器を生成
	return std::mt19937 (rnd());     //  メルセンヌ・ツイスタの32ビット版、引数は初期シード値
}

auto make_rand_arr(const size_t size, int rand_min, int rand_max) {
	std::vector<int> re(size);
	std::uniform_int_distribution<int> rand(rand_min, rand_max);
	auto mt = random();
	for (auto& i : re) {
		i = rand(mt);
	}
	bool is_all_no_conflict = false;
	do {	
		is_all_no_conflict = true;
		for (auto j = re.begin(); j != re.end(); ++j) {
			for (auto k = j + 1; k != re.end(); ++k) {
				if (*k == *j) {
					*k = rand(mt);
					is_all_no_conflict = false;
				}
			}
		}
	} while (!is_all_no_conflict);
	return re;
}
```
使用例

```cpp:
int main() {
	const auto arr = make_rand_arr(12, 1, 1000);
	for (auto i : arr) std::cout << i << ", ";
	std::cout << std::endl;
	return 0;
}
```
OS X YosemiteでIllustrator CS6をJava SE 8で動作させる。

##はじめに
OS X YosemiteでIllustrator CS6を起動すると以下のような警告ダイアログが表示される。

![警告ダイアログ](https://qiita-image-store.s3.amazonaws.com/0/13477/97bca348-9ede-ffaf-1eb2-b1c2aeaadb53.png)

「詳しい情報」をクリックするとAppleのサイトに飛ばされて、Java 6をインストールしろと言われるが、今更Java 6というのも何なので、Java 8でなんとかする方法をまとめておく。

##手順
1. Java 8が入っていなければ、[Oracleのサイト](https://java.com/ja/download/mac_download.jsp)から最新のインストラーを入手してインストールしておく。
2. ターミナルを開いて、以下の空ディレクトリを作成する。

```lang:bash
$ sudo mkdir -p /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
$ sudo mkdir -p /System/Library/Java/Support/Deploy.bundle
```

これでおしまい。

##参考
Java for OS X 2015-001
https://support.apple.com/kb/DL1572

Java SE 8 on Mac OS X
https://oliverdowling.com.au/2014/03/28/java-se-8-on-mac-os-x/

Eclipse Kepler for OS X Mavericks request Java SE 6
http://stackoverflow.com/questions/19563766/eclipse-kepler-for-os-x-mavericks-request-java-se-6/

Issue 65730: DDMS requests JRE installation on OSX 10.9.1 with JDK 1.7.0_51 installed
https://code.google.com/p/android/issues/detail?id=65730
Raspberry Pi 2（略してパイ２）からメール送信できるようにする

# 概要
Raspberry Pi 2からメール送信できるようPostfixを導入します。
またシェルからメール送信できるようmailコマンドを実行できるようにします。

# Postfixの導入
postfixをインストールします。

```bash
$ sudo apt-get install postfix
```

![pi003.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/8e3bd0e7-aade-26cb-5e63-b5713d8157f5.png)

![pi004.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/05c0bf4f-3250-8140-b736-b0464f4d1f6c.png)

![pi005.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/31984707-77a0-790b-50ef-d39433924612.png)

postfixの初期設定を行います。
現状ではIPv6が有効になっているとトラブルが多いためIPv4のみに設定します。
経験上SPFレコード関連なのですがIPv6のSPF設定は情報がまだ少ない気がするので。

```bash
$ sudo vi /etc/postfix/main.cf
	inet_protocols = ipv4
```

最後にpostfixを再起動して設定を反映します。
```bash
$ sudo service postfix restart
```
# メール送信テスト
mailコマンドが使えるようにmailutilsパッケージをインストールします。

```bash
$ sudo apt-get install mailutils
```

mailコマンドでメール送信を行い、宛先にメールが届けば完了です。
届かない場合は、/var/log/mail.log を確認し対処します。

```bash
$ echo "This is test mail." | mail -s "test" root
```
jQueryしか触ったことのない人がやった React.js チュートリアル vol.1

# ご指摘大歓迎
間違っていたらコメントくださいお願いします...m(_ _)m

# 教材
- https://facebook.github.io/react/docs/tutorial.html

# What React.js？
下記にあるスライドが大変理解に助かりました...。
http://reactjs-meetup.connpass.com/event/11232/presentation/

## スライドを追うのがめんどくさい人向けの ざっくりまとめ
- Ajaxでサーバからデータを取得し、jQueryでゴリゴリ表示させるのはいいが、データの更新等の問題がめんどくさい。それはDOMにしかデータを持ってないせいだ。
- React.jsでは**どのDOM要素**に**どのJSON等の要素**を入れ込むかを指定しておき、データが更新されたら**必要なDOM**だけ書き換えてくれる。必要なDOMだけ描画するので、高速に描画できる。
- React.jsは描画部分だけ
- HTMLを直接吐き出さないので、セキュリティ的に良いらしい(React.jsで描画させたページを、右クリック->ページソース表示などをしてもHTMLが追加されていない)

## これだけ聞くとこんな問題が想定できます
- Consoleを用いたデバックは通用しないのでは...
- JavascriptにHTML要素をゴリゴリ書くのがヤダ...

この伏線が回収できるかはわかりませんが、とりあえず進みます。


# 1. react-tutorialってのがあります
https://github.com/reactjs/react-tutorial

cloneするなりzipでDLするなりしてくださいませ。

# 2. まずは動かす
```zsh
# 上記のリポジトリルート上で
$ ruby ./server.rb # Ruby以外にも多数の言語でサーバサイドプログラムが用意されてます
```

でサーバを起動したら、```public/index.html```を開けば、今から作ろうとしているものが分かります。

![スクリーンショット 2015-09-26 20.26.22.png](https://qiita-image-store.s3.amazonaws.com/0/3377/10ce213d-4051-dec6-6126-af7f4a0e5099.png)

とどのつまり、**コメントを書いたら、すぐに表示するそういうサンプルアプリケーション**を制作していきます。

コメントを書いたら保存...みたいな処理は、すでにExampleで用意されているものを使用します。React.jsはあくまでも**表示部分**を書きやすくするものなので、別途必要なわけです。
ちなみに、書き加えたコメントはcomments.jsonに保存されていくそうです。

# 3. ゴリゴリ書くJavascriptファイルを用意する
```html:public/index.html
<script type="text/babel" src="scripts/example.js"></script>
↓
<script type="text/babel" src="scripts/tutorial.js"></script>
```

そして、

```zsh
$ touch ./public/scripts/tutorial.js
```

これで今回あなたの書くJavascriptファイルが生成されました。次回、ゴリゴリ書いてきます。
固定IPアドレスの申し込みと、設定をしてみた

##はじめに
最近趣味でも、AWSを利用した開発を行っています。

AWSでセキュアに開発を行いたい場合、
セキュリティグループの設定で、
SSHのInboundを許可するのは家からののみとしたいところです。

そんなわけで、固定IPを契約して、遊んでみる事にしました。

我が家の回線環境は下記のとおりです

回線: フレッツ光ネクスト(マンション)
プロバイダ: So-net
ルータ：PR-500MI
（環境によって、設定項目の名称など異ることもあります。
適宜読み替えていただく必要があります。）

##必要事項
設定上の必要事項をここで挙げて起きます。

1.ルータ設定画面にログインできることの確認
固定IP用の別の接続情報を利用しなければなりません。
もしルータを利用しているならば、
ルータにログイン出来なければ、接続先情報を変更することが出来ません。

2.プロバイダの接続情報
So-netであれば、回線契約時に「入会証」という紙が届いているはずです。それに記載されています。
それがなくても、接続用IDやパスワードがわかっていれば、なんとかなります。
（大事にとっておくべきものではありますが。）

##申し込み

プロバイダ名＋固定IPなどでググると出てきます。
ちなみに、So-netの固定IP割当サービスのURLは、こちらです。
https://www.so-net.ne.jp/cgi-bin/optionservice/staticip/sip_apltopu.cgi

このページで、自分の環境を選択していきます。
ここで詰まりやすいのは、利用コースの選択画面だと思います。
So-netでのサービス名は、入会証に記載されています。
（入会証がなくても、So-netのマイページにログインできれば、"接続サービス・高速モバイル"の項目から確認可能です。）
このサービス名を、ページ上部の表から見つけ出して、それを選択してください。
![サービス一覧.png](https://qiita-image-store.s3.amazonaws.com/0/85797/a8ae2fdf-fd7c-0a93-e76c-efdfefdbcfa1.png)

その後、パスワードを設定し、申し込み完了です。
下記画面がでれば、申し込み完了です。
印刷するなどして、大事に保存してください。
![FixedIPAddressForBlog.png](https://qiita-image-store.s3.amazonaws.com/0/85797/cd81a4aa-d064-9158-3abb-4be6bbda7992.png)

##ルータの設定
ルータ設定は、申し込み後2時間ほど時間を置くことをおすすめします。
（僕の場合、それくらい待たないと、うまく接続出来ませんでした。）

ブラウザから、ルータの設定画面にログインしましょう。
設定画面のURLは、基本的にはゲートウェイのアドレスです。
PR-500MIを利用していて、特に設定変更していないのであれば、
http://192.168.1.1
でアクセスできるはずです。

ベーシック認証を求められた場合、デフォルトの値か、設定済みの値を入力します。
（デフォルトのID・パスワードは、取扱説明書に記載されています）

ログインできたら、接続先の設定を行います。
設定画面で、接続先の設定を行います。
マルチセッションに対応している場合、メインセッションを変更します。
下画像はPR-500MIの設定画面です。
赤く囲った箇所で接続先の設定が可能です。

![設定トップ.png](https://qiita-image-store.s3.amazonaws.com/0/85797/6bb0a7e9-dd7e-3254-cf1c-bbd3f66ee0cd.png)


![接続先設定.png](https://qiita-image-store.s3.amazonaws.com/0/85797/14803f62-4446-962b-e9cd-62d864533ed2.png)

PR-500MIで変更が必要なのは、赤く囲った箇所のみだと思います。
接続先ユーザ名、接続先パスワードを、申し込み完了時に表示されたとおりに設定します。
（So-netでは、ユーザ名を"[数字]@sip2.so-net.jp"という形に直す必要があります）
IPアドレスは手動設定を選択し、割り振られたIPアドレスを入力してください。
接続モードでは、常時接続を選択してください。

設定を保存します。

以上で設定完了です。
インターネットに接続できるか、IPアドレスが指定したものに変更されたか、確認してみてください。
もし接続できなかった場合、ルータの設定画面で接続中になっているかなど、確認してみてください。
【しずおかアプリ部】活動ログ　第八回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/9597e27b-a873-ea83-ad3e-4be4d3d7a2be.jpeg)

■タイトル
第八回

■開催日
２０１５年９月２６日（土）　１６：００～１８：００

■参加者
５名

■活動内容（概要）
・保坂プレゼンの入り口「Cocos2d-xで作る物理演算ゲーム　～引っ張って飛ばす編～」
・菅原プレゼン「Unityはじめるよ　～基礎３～＆～応用１～」

※活動内容（詳細）
【実演・プレゼン】

・「Cocos2d-xで作る物理演算ゲーム　～引っ張って飛ばす編～」
　　チキンを引っ張って飛ばすところまでの、実現方法と実装方法の紹介。
　　
　　①画面へのタッチイベントを取得する。
　　　Cocos2d-xでのタップイベントの処理方法を説明＆実践

　　②チキンにタッチを判定する。
　　　タップイベント内でのあたり判定処理の説明＆実践

　　③スライドして引っ張るとチキンが飛ぶ！
　　　タップした位置と指を離した位置から、飛ばす方向と力を求める方法＆実践

　　上記を説明しつつ、コールバックの仕組みと、Cocos2d-xのスプライトの扱い方を紹介。

　　今回のプロジェクト一式
　　http://monolizm.com/sab/src/AngryChicken.zip

<A href="http://monolizm.com/sab/pdf/第八回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～引っ張って飛ばす編～).pdf">第八回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～引っ張って飛ばす編～).pdf</A>



・「Unityはじめるよ　～基礎３～＆～応用１～」
　基礎：Prefab、コライダー
　応用：uGUI概要

　プレハブについて
　　・特徴
　　・使い方
　　・利用シーン
　　を紹介。

　コライダーについて
　　・形状
　　・種類
　　・トリガーコライダーと非トリガーコライダー
　　・レイヤー
　　・スクリプトとの連携

　uGUI概要
　　uGUIの紹介
　　Canvasについて
　　RectTransformについて
　　　アンカー
　　　ピボット
　　RenderMode
　　CanvasScaler
　　の利用方法と利用シーンの紹介

<a href="http://monolizm.com/sab/pdf/第八回_プレゼン資料(Unityはじめるよ　～基礎３～＆～応用１～).pdf">第八回_プレゼン資料(Unityはじめるよ　～基礎３～＆～応用１～).pdf</a>
jetty-maven-pluginでnewrelicを使う


MAVEN_OPTSで指定してやればOK. 
ymlファイルはカレントディレクトリに置いてやる.

```title:実行手順
cp /path/to/newrelic.yml .
export MAVEN_OPTS=-javaagent:/path/to/newrelic.jar
mvn jetty:run
```

## 参考
https://docs.newrelic.com/docs/agents/java-agent/frameworks/maven-installation-java#h2-agent
http://stackoverflow.com/questions/2007192/maven-jetty-plugin-how-to-control-vm-arguments
CentOS に Scala をインストール

## Java のインストール

Scala を動作させるには Java が必要なので、まずは Java をインストール。

`$ sudo yum list \*java-1\* | grep open`

上記で出力される中からお好みのバージョンを。

```
$ sudo yum -y install java-1.8.0-openjdk.x86_64
$ sudo yum -y install java-1.8.0-openjdk-devel.x86_64
```

## Scala のインストール

### ダウンロード

[公式サイト](http://www.scala-lang.org/download/)から最新版をダウンロード。※バージョンは適宜選択

```
$ wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
$ tar xvzf scala-2.11.7.tgz
$ sudo mv scala-2.11.7 /usr/local/scala
```

ダウンロードして、解凍して任意のパスへ。

### パスを通す

```
$ export PATH=$PATH:/usr/local/scala/bin
$ echo $PATH
```

## 確認してみよう 

```
$ scala -version
Scala code runner version 2.11.7 -- Copyright 2002-2013, LAMP/EPFL
```

まあ、 scalaenv のが便利だろうが。
Raspberry Pi 2（略してパイ２）でnslookupとdig

Raspberry Pi 2の初期状態ではnslookupやdigなどのDNS関連コマンドが利用できません。

dnsutilsパッケージをインストールすることで利用可能になります。

```bash
$ sudo apt-get install dnsutils
```

```bash
$ nslookup example.com
$ dig example.com
```
もう一度bundle install, update について考え直してみた

# もう一度Bundlerについて考え直してみた

みなさんご存知の通りBundlerはRuby/Railsにおけるgemのバージョン管理ツールです。

開発時にうかつに`bundle update`を行ってしまって不具合が出たことをきっかけに、もう一度Bundlerについて、自戒の意味も込めて振り返ってみることにしました。

現在Gemをホスティングしているのは、RubyGems.orgです。
gemをインストール、アップデートするためにアクセスするリモートは常にここになります。
[RubyGems.org | your community gem host](https://rubygems.org/)


```
Fetching gem metadata from https://rubygems.org/............
```


## Bundle install

### 1. Gemfile.lockがない時

つまり開発環境構築時などの、最初の`bundle install`の時ですね。

デフォルトでは、Bundlerは`gem install`と同じ場所にGemをインストールします。

もしGemfile.lockがまだ存在しない場合は、`bundle install`によって**全てのリモートからのgemのインストール**、依存問題の解決を行った後、Gemfile.lockが作成されます。
その中に実際にインストールされたgemのバージョンが記載されます。

◎coffee-railsを例に取って見てみましょう。

▼ gem coffee-railsのgem依存関係

```rb:coffee-rails.gemspec
s.add_runtime_dependency 'coffee-script', '>= 2.2.0'
s.add_runtime_dependency 'railties',      '>= 4.0.0', '< 5.0'
```

▼`bundle install`後のGemfile.lock

```rb:Gemfile.lock
coffee-rails (4.1.0)
      coffee-script (>= 2.2.0)
      railties (>= 4.0.0, < 5.0)
```

### ２. Gemfileに新たにgemを追加したとき

まずインストールのために`bundle install`を実行することになると思います。

この時に初回の`bundle install`と異なるのは、**追加されたgemのみのインストールと、そのgemの依存関係の解決が行われることです。**
更新されていないgemに関してはGemfile.lockの依存関係を使用し、Gemfileが更新されたor内容が追加されたgemに関しては依存関係の解決が行われます。

### ３. GemfileもGemfile.lockも変えずにbundle install

リモートからgem再インストール。
インストールするバージョンと依存関係は現在のGemfile.lockを使用します。

つまり何も変わりません。


## Bundle update

### 1. 引数なしでbundle update

引数なしで行うと、それまでインストールされたgemのバージョン、つまりGemfile.lockを無視して、リモートで利用可能な最新のgemをinstallしてきて、依存関係の解決を行うことになります。

全てのgemに対して行う結果、相当数のgemのバージョンが変更されるので、今まで開発していたアプリケーションの挙動が変わってしまう可能性があります。

**何の考えも無しに`bundle update`を行うのはやめましょう！**

### 2. 特定のgemの新しいバージョンがリリースされて、そのgemのみを更新したい

シチュエーション的にはこちらが最も多いケースだと思います。

決め撃ちするには`bundle update nokogiri`。これだけです。

この場合はnokogiriと、nokogiriが依存しているgemのみがアップデートされます。
アプリケーションに与える影響を少なくしたいなら、こうするべきでしょう。

## まとめ

1. その環境で実際にインストールされて使用されるgemのバージョンは、Gemfile.lockに記載されたものであること。
2. `bundle install`では同ディレクトリのGemfile.lockを使用するので、環境が変わっても同じgemのバージョンをインストールして使用できること。
3. Gemfileはこれからインストールしたいgemの管理、Gemfile.lockは実際にインストールされたgemのバージョンの管理を担当していること。

なので、 githubのレポジトリやプロダクション環境では必ず開発で使用した特定のGemfile.lockが必要であることが分かります。その点に関しては分かりやすく下記のリンク先にまとめられています↓

[ちょっと待った! Railsでgitリポジトリから除外すべきでないファイル:Gemfile.lockとdb/schema.rb | TechRacho](http://techracho.bpsinc.jp/hachi8833/2014_02_07/15390)

## 参考

http://ruby.studio-kingdom.com/bundler/bundle_install#conservative_updating
http://ruby.studio-kingdom.com/bundler/bundle_update
[AWS]アカウントの削除と再取得の方法[アカウント削除編]


デフォルトのVPC消したりいろいろしててめんどくさいからアカウント取り直すのってどうすればいいの？
そんな話をふと聞きました。
多段階認証設定しててiPhone交換したらRootが使えなくなるとかいろいろやっちゃってますがアカウント削除と再取得ってやったことない・・・

###試してみましょう！
ってことでやってみた。

##1.AWSアカウントの削除
awsアカウントの削除方法についてみていきましょう。
###普通にログインします。

![ログイン画面1.png](https://qiita-image-store.s3.amazonaws.com/0/52141/b4296127-86b4-f267-c182-b0c12e1437be.png "ログイン画面1.png")

![ログイン画面2.png](https://qiita-image-store.s3.amazonaws.com/0/52141/0da01dce-bd06-2247-8153-47c362e0bae3.png "ログイン画面2.png")

(ಠ益ಠ)＜ さようならAWSアカウント〜

###マネジメントコンソールからアカウント情報を編集します
![AWS_マネジメントコンソール1.png](https://qiita-image-store.s3.amazonaws.com/0/52141/15e8d079-73b1-a2f3-f3fe-6822cb6e4a57.png "AWS_マネジメントコンソール1.png")

![アカウント解約１.png](https://qiita-image-store.s3.amazonaws.com/0/52141/7d5f33dc-af12-7ec1-f55a-5868f8ce637f.png "アカウント解約１.png")

ボタンを押すと・・・

![アカウント解約２.png](https://qiita-image-store.s3.amazonaws.com/0/52141/893f3e2b-e216-a23c-f088-f04cc1b5714e.png "アカウント解約２.png")

最終確認されます。
ここで「はい」を押すと本当にラピュタが崩壊するので心残りがある人はリターンしてください。
本当に消し飛びます。

![アカウント解約３.png](https://qiita-image-store.s3.amazonaws.com/0/52141/43a1f9a6-c638-d207-fe3a-2da081d5aec8.png "アカウント解約３.png")
実際に押すと画面上にホップアップが！？

![アカウント解約４.png](https://qiita-image-store.s3.amazonaws.com/0/52141/137964ac-0c7d-3a2b-a128-061d83814e96.png "アカウント解約４.png")

本当かなー？と思いリロードを仕掛けてみると実際に使えなくなっています。
以上、アカウントの削除方法でした。

簡単ですね。
注意点としてはちゃんとRootアカウントでログインしてください。当たり前ですが、最上位権限がないと削除できません。

---

こんなネタ見る人いるのかな？って思いますが・・・

[アカウントの削除と再取得の方法[アカウント再取得編]](http://qiita.com/Yuki_BB3/items/a816b0cf1679d9cc536c)ではアカウントを再取得します。
実際アカウント作るだけなので初めてやるひとにもおすすめだったり・・・
S3のファイルをコピーしてそのまま公開

画像ファイルを別バケットにコピーしたが、URLを叩いてもAccess Deniedになっていた.
そのまま公開させたい場合コピー時に権限設定が出来たのでメモ.

AWS SDK for PHP ver.2を使用
		
```php

$s3 = Aws::factory([
			'key' => S3_ACCESS_KEY,
			'secret' => S3_SECRET_KEY,
			'region' => S3_REGION,
		])->get('s3');

		$s3->copyObject([
			'Bucket' => $from_bucket,
			'Key' => "path/to/$file_name",
			'CopySource' => "$to_bucket/path/to/$file_name",
			'ACL' => 'public-read',   <- この権限設定を追加
		]);
```
ansibleのtemplateモジュールでテンプレート継承してみる


## はじめに
ansibleのtemplateモジュールの[ドキュメント](http://docs.ansible.com/ansible/template_module.html)を見ると、

```
Templates are processed by the Jinja2 templating language (http://jinja.pocoo.org/docs/) - documentation on the template formatting can be found in the Template Designer Documentation (http://jinja.pocoo.org/docs/templates/). 
```

と記載があり、`Jinja2`というテンプレート記法が使えることがわかります。
ansibleのtemplateモジュールはこれまでも使っていたけど、`Jinja2`のテンプレート記法、中でも、テンプレート継承を使ってみたら、実際いろいろ捗ったので、ここで紹介したいと思います。

## Example Playbook

記法についての詳細は、[Template Inheritance - Jinja2 Documentation](http://jinja.pocoo.org/docs/dev/templates/#template-inheritance)の説明を見ていただいた上で、AnsibleのPlaybookに当てはめると下記のようになります。

### やっていること

- テンプレートからファイルを生成（ローカル）
  base.j2を継承したextended.j2を元に、ファイルを生成（extended.txt）
  
- ファイルをコピー（リモート）

### ファイル構成

```
├── inventory_example
├── roles
│   └── example
│       ├── files
│       │   └── extended.txt
│       ├── tasks
│       │   └── create_file.yml
│       │   └── copy_file.j2
│       └── templates
│           ├── base.j2
│           └── extended.j2
```

### inventory

- inventory_example

  ```yml
  - hosts: localhost
      tasks:
        - include: roles/example/tasks/create_file.yml

  - hosts: remote_host
      tasks:
        - include: roles/example/tasks/copy_file.yml
  ```

### tasks

- roles/example/tasks/create_file.yml

  ```yml
  - name: Create file from template
      template: src=extended.j2 dest=roles/example/files/extended.txt
  ```

- roles/example/tasks/copy_file.yml

  ```yml
  - name: Copy file to remote host
      copy: src=extended.txt dest={{ path_to_root }}/extended.txt
  ```

### templates

- roles/example/templates/base.j2

  ```html+jinja
  This is default contents.
  {% block additional_contents %}{% endblock %}
  ```

- roles/example/templates/extended.j2

  ```html+jinja
  {% extends "roles/example/templates/base.j2" %}

  {% block additional_contents %}
  This is additional contents.
  {% endblock %}
  ```

### files

- roles/example/files/extended.txt

  ```
  This is default contents.
  This is additional contents.
  ```


## おわりに
普段からphpのTwigというテンプレートを使っていて、Jinjaを見たときに、「Twigとそっくり！」と思ったら、[TwigのREADME](https://github.com/twigphp/Twig)に、

```
Twig uses a syntax similar to the Django and Jinja template languages which inspired the Twig runtime environment.
```

ときっちり書いてありました。

Jinja inspiredなテンプレートエンジンは他にも[Nunjucks](http://mozilla.github.io/nunjucks/)など、複数の言語で実装されているようです。
asana  のプロジェクト機能でWBSやチェックリストを表現

TODO管理ツール「asana」で
WBSを表現する場合のやり方についてまとめてみました。

まずasanaの"プロジェクト"とはタスクの集まりです。
開発者が一般的にイメージする"プロジェクト"とは少々異なります。
※勿論、同様の括りで扱うことも可能です。

上記を踏まえて、
asana　のプロジェクト機能について活用方法を考えてみました。

# WBS表
## １つの表で表現するパターン
フェーズ毎で管理、よくあるパターン。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/48623/28194517-e48b-2adb-b200-4b9279f67f26.png)

操作性としてもExcelに近い感覚で作成可能。
カレンダー表示上でもタスクの入れ替えがドラッグ&ドロップで簡単にできる。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/48623/b48cd3ea-2603-bc33-8d30-3f52587fe017.png)


ガントチャートで見たい場合は
[instagantt](http://instagantt.com/app/) で連携させてみることも可能です。
サンプルイメージはこんな感じ。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/48623/b2f4cee8-8be3-e926-3475-36d45acb986b.png)

## 2. 複数の定常業務をプロジェクト(タスク単位)で
機能別などで表現する場合などで採用できる。
asanaのプロジェクトテンプレート機能を使うと高速で対応可。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/48623/5b5357e2-c9eb-8ee3-dfd9-8514b57a5286.png)


![12.png](https://qiita-image-store.s3.amazonaws.com/0/48623/00b80dea-0283-4528-6ecb-942320757890.png)

![13.png](https://qiita-image-store.s3.amazonaws.com/0/48623/f8fa68c7-37e5-7032-607e-676cb84f1613.png)



# チェックリスト

プロジェクトテンプレートを活用すれば定常業務の他、
チェックリストなどでも利用可能。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/48623/1ea7ad7f-da40-809e-ac77-3874d49a244e.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/48623/e72929e4-e68f-f7bf-5d53-7bdc7c6eb59d.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/48623/4ff86e2d-8254-23ec-b1bf-9bc034eef205.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/48623/5d3e2c7d-1f1c-f7d9-eaee-f08a9f08afe1.png)

レビューアの担当がほぼ固定の場合などは、
コピー時にTask Followersにはチェック済にすると
担当者もコピーされるため有効。