OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsバッチファイルで使える小技集(環境判定編)

#概説
Windowsのバッチファイルを書く時に役に立つかもしれない小技のテンプレートです。
そのままコピペで動かせるよう極力少ない記述で動作するようにしています。
なお7以前は考慮していません。またARM環境は正直詳しくないのでここでの手法が通じないかもしれません。

##「管理者として実行」されているか判定する（簡易版）
```bat
net session >NUL 2>nul
if ERRORLEVEL 1 echo 管理者として実行していません & goto :EOF
```
**net session**コマンドはネットワークセッション管理用コマンドで、引数なしだと単にセッションを表示するのみでシステム変更が伴わないはずですが、これだけでも管理者特権が無いと拒否されエラーになります。
それを利用しコマンドが成功(ERRORLEVEL==0)なら**特権あり**、エラー(ERRORLEVEL!=0)の場合は**特権なし**と判定しできます。

ちなみに

```bat
net session >NUL 2>nul || (ECHO 管理者として実行していません & goto :EOF)
```
とワンライナーな書き方も可能。


##「管理者として実行」されているか判定する（PE対応版）

```bat
if not exist "%SYSTEMROOT%\system32\wpeutil.exe" ( net session >nul 2>nul
if ERRORLEVEL 1 echo 管理者として実行していません & goto :EOF )
```
前項の方法をWindows PEセッションから利用すると、net sessionは常にエラーになり判定に使えません。(serverサービスが動いていない為？)
またPEでは常に特権が有るため判定自体が無意味です。よってPE上では管理者判定を回避するようにします。
**WPEUTIL.EXE**はWindows PEセッションにしか存在しないコマンドなので、これの有無により**Windows PEセッションか判定する**事が可能です。
これを前項の方法と組み合わせれば非PE、PE依存しない管理者権限判定が可能です。

##x86/x64判定
こちらを御覧ください。
[Windowsバッチファイルにおける x86/x64判定](http://qiita.com/DEV-DEBU/items/3f64a77b3ccef31e6536)

#SERVER OSの判定
```bat
systeminfo /FO CSV /NH 2>nul | find /i "SERVER" >nul
IF ERRORLEVEL 1 echo SERVER OS ではありません & goto :EOF
```
クライアント向けのOSかサーバーOSか簡易に判定する方法です。
アンチウイルスソフトなど、サーバーとクライアント用で別のパッケージが必要なアプリなどの無人インストールに使えるかもしれません。
要はsysteminfoの結果からOS名を取り出し、それに"Server"という文字列が含まれているか判定しているだけです。
厳密に判定するならwsh等を使ったほうが良いかもしれません。

#プロセス有無で続行判断
```bat
tasklist /NH |find /i "targetprocess.exe" > NUL
if not ERRORLEVEL 1 echo "インストール不要です" goto :EOF
```
プロセスが存在していることを確認する方法です。これでインストール続行を判断、またはアンインストールさせるなどの判定に使えます。
例ではインストール判定のため「無い時実行」であるのでnot ERRORLEVELとなっていますが、アンインストール判定なら「有る時実行」なのでnotを外す必要があります。
これも単にtasklistの結果からプロセス名をfindで探させてるだけです。

###応用例 プロセスが起動されるまで待機
```bat
setup.exe /XXX YYY ZZZ

echo セットアップ完了まで待機中

:WAITSTART
ping 0.0.0.0 -n5 >nul
tasklist /NH |findstr /i "appservice.exe" > nul || goto :WAITSTART

notepad "setup.log"
```
※pingコマンドはLinux等におけるsleepの代わりです。ping発行1回につき1秒なので上記例では5秒待機となります。
※インストールが失敗した時などは考慮してないです。
Cognitoの認証済みユーザーでセッションを確立する

ちょっとハマったのでまとめました。ポイントは、取得したユーザーのIdTokenをLogin Mapに入れる時に、cognito-idp.ap-northeast-1.amazonaws.com/COGNITO_USER_POOL_ID
の
COGNITO_USER_POOL_ID
の部分に、
User Pool ID(ap-northeast-1_XXXXXXX)
を入れることです。

（ここをIdentity Pool IDだと思っていてミスりました。その場合は"Invalid login token. Issuer doesn't match providerName"というエラーが返ってきます。）

AWS_REGION　→CognitoがあるAWSのリージョンです
COGNITO_IDENTITY_POOL_ID →Identity Pool IDです。
COGNITO_USER_POOL_ID　→User Pool IDです
COGNITO_CLIENT_ID →IdentityPoolに対して設定されたUser PoolのAppのClient IDです。


下はセッション確立用の関数です


```JavaScript
var validateSession = function(){
  return new Promise(function(resolve, reject){
    AWS.config.region = AWS_REGION;
    var data = {
      UserPoolId: COGNITO_USER_POOL_ID,
      ClientId: COGNITO_CLIENT_ID
    };
    var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(data);
    var cognitoUser = userPool.getCurrentUser();
    if(cognitoUser != null){
      cognitoUser.getSession(function(err, sessresult){
        if(sessresult){
          var cognitoParams = {
            IdentityPoolId: COGNITO_IDENTITY_POOL_ID,
            Logins: {'cognito-idp.ap-northeast-1.amazonaws.com/COGNITO_USER_POOL_ID': sessresult.getIdToken().getJwtToken()
            }
          };
          AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
          AWS.config.credentials.get(function(err){
            if(err){
              reject(err);
            }
          });
            resolve();
          });
        }else{
          reject(err);
        }
      });
    }else{
      reject('No cognito User');
    }
  });
};
```

##参考にしたサイト
http://dev.classmethod.jp/cloud/aws/login-form-by-using-aws-sdk-for-javascript/
http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/getting-credentials.html#getting-credentials-1.javascript
https://github.com/aws/amazon-cognito-identity-js/issues/40
kinect v2をmacのprocessingで使う

processingでkinect使いたい...!ってことで
USB繋げばOKくらいに思っていましたが
いろいろ間違えたりして手間がかかったのでメモ
(ちなみにUSB3.0じゃないとダメみたいなのでearly2011のmacじゃダメでした。)

#libfreenect
###ドライバであるlibfreenectを導入するために
homebrew(http://brew.sh/index_ja.html)

libusb(http://libusb.info/)


cmake(http://cmake.org/)


python(http://python.org/)<２と３どちらでも>


macport(https://www.macports.org/install.php)


command line tools(https://developer.apple.com/downloads/index.action)<要ログイン>


git(https://git-scm.com/book/ja/v1/使い始める-Gitのインストール)
をインストール



###ターミナルで
```brew install libfreenect```

```sudo port install git-core cmake libusb libtool
git clone https://github.com/OpenKinect/libfreenect
cd libfreenect
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=debug```

とかでとりあえずOK

#OpenKinect-for-Processing
https://github.com/shiffman/OpenKinect-for-Processing
ここからOpenKinect-for-Processingをダウンロード

で中のサンプルが動けばOK

/_/_/_/_/_/_/_/_/_/_/_/_/
libfreenectでlibusbをインストールしてくれてたりっていうのを後で知ったので
訂正しました。
FileMaker で作業ログを取得する

##破損は検知したけれど

[FileMaker で真っ白レコードを見つける](http://qiita.com/hirdot/items/8e1f0667ef0a3e82991c)で破損レコードの検知方法を見つけることが出来ました。

時間帯からバッチ処理などではなく、作業中に破損を誘引する何かがあったことは分かりましたが、はっきりとした原因究明には至りませんでした。

そこで対応の１つとして、作業ログを取ってみることにしました。


##作業ログを取る

1. 作業ログテーブルを作成
1. 作業ログ取得スクリプトを作成
1. onRecordCommit を仕込む


####作業ログテーブルを作成
まずは記録用のテーブルが必要ですので、こんな感じでつくりました。

（テーブルイメージ）
![20160928130016.png](https://qiita-image-store.s3.amazonaws.com/0/16382/70b064be-78b5-73d4-073e-0d4a79b78210.png)



####作業ログ取得スクリプトを作成
これは本当に簡素なスクリプトで、およそこんな感じにしました。

* レイアウト移動
* 新規レコードを作成
* フィールド設定
* レイアウトを元に戻す



####onRecordCommit に登録
レコードの修正タイミングでスクリプトを走らせたいので、レイアウトスクリプトトリガ onRecordCommit を使います。

詳しく知りたい方はリファレンスをお尋ねください。

* [OnRecordCommit](http://www.filemaker.com/help/13/fmp/ja/html/script_trigg.38.10.html:title)
* [レイアウトのスクリプトトリガの設定](http://www.filemaker.com/help/13/fmp/ja/html/create_layout.9.62.html#914037:title)


これで、レコードを修正したタイミングで作業ログを登録できるようになりました！！

はじめてのレイアウトスクリプトトリガにちょっとルンルン気分なのを隠して、事務チームに報告です。

「もし何かあったら言ってくださいね」と、一応予防線を貼ることも忘れず。


##事務チームからのフィードバック
```
1回カーソルを外すたびに、記録用のスクリプトが走るので、
その度に別レイアウトに裏で飛ばされてしまいます。

そこから元のレイアウトに戻ってくると、レイアウトの
1番上に引き戻されてしまうので、メンテ作業が
ものすごくしにくいです…
```
あ。。。なるほど。。
事務チームが作業しているレイアウトは縦に長いレイアウトなのですが、
裏で走る記録処理の結果、レイアウトの最上部に表示が移動してしまってやりにくい、ということでした。

たしかに使いづらいですね。。

##レイアウト移動をしない方法に修正
といっても方法が思いつかなかったので、ピティナで一番FMに詳しい noguchi に相談したところ、

「レイアウト移動せずに実装できるよ」というので、方法を教えてもらいました。

>（データベースの管理）
>・記録用テーブルを作業用テーブルの子テーブルとしてリレーションを貼る
>・その際、作業テーブルのPKと修正日時をリレーションキーとする
>・リレーションを貼る際、「このリレーションシップを使用して、このテーブルでのレコードの作成を許可(I)にチェック」
>
>（スクリプト）
>・これで"新規レコード作成"は不要になったので削除する
>・レイアウトスクリプトトリガはそのままでOK

ということでした。


説明を聞いた時は？？？という感じだったのですが、
詳しく聞くと、こういうことでした。


>今回の要点は
>・レイアウト移動＋新規レコード作成＋フィールド設定
>という処理から
>・関連レコードのフィールド設定＋関連レコードがなければ自動的にレコード作成
>という処理への変更。
>
>"関連レコードのフィールド設定"自体は、リレーションを貼ったことで出来るようになった。
>あとは、「関連レコードがなければ自動的にレコード作成」の部分だが、
>
>修正日時をリレーションキーにしているので、スクリプトで関連レコードのフィールド設定をしようとした時、必ず関連レコードがない状態になっている。
>
>この時、
>「このリレーションシップを使用して、このテーブルでのレコードの作成を許可(I)」にチェックしていることで
>・関連レコードがなければ新規レコードを作成
>をしてくれる。


うまく説明でき・・・てないと思いますが（苦笑
これで担当チームに煩わしい思いをさせずに作業ログを取れるようになりました。

参考になれば幸いです。
Raspberry PiからL-03DとBICSIM(OCN)でネット接続する

Raspberry PiとL-03Dを使用してBICSIMでLTE接続するのにトラぶったのでそのメモです。

# SIMカードのユーザ登録
SIMカードの内容に従ってユーザ登録を行います。

# L-03Dのファームウエアをupdate
L-03DをRaspberry Piに接続する前にWindows PCかMACに接続して、ファームウエアをupdateしましょう。これをやらないとRaspberry Piから正常に起動できませんでした。

こちらは表示される順番に従って作業をしていけば問題なく終了します。updateには10分以上の時間がかかりました。

# Raspberry Piの設定
Raspberry PiにL-03Dを挿入して設定をしていきます。後は既出の作業を行っていくだけです。

1. 必要なパッケージのインストール

```
sudo apt-get install pppconfig usb-modeswitch
```

2. pppconfigによる設定
```
sudo pppconfig
```

最初の画面で`Create a connection`を選択

次の画面で適当な名前を入力
（ここでは、OCNにしておきます)

矢印で"Use dynamic DNS"を選択して、スペースを押すと*が移動するので、そこでEnterキーを押します。

Authorizationは"CHAP"を選択

User nameは、簡単接続設定のユーザ名を入力
Passwordは、簡単接続設定のパスワードを入力します。

Speedは`115200`のままEnterを押します。

次は"Tone"のままEnterを押します。

番号は`*99***11#`を入力

Modem configは"No"を選択

Modem portは`/dev/ttyUSB2`と入力します。

"Finished Write files and return to main menu."を選択し、OK, Quitを選択していきpppconfigを終了します。

3. ATコマンドの編集
次のコマンドを入力してファイルを開きます。
`sudo vi /etc/chatscripts/`

「''ATZ」の下に「''ATH」を追加します。
```
'' ATZ
''ATH
```

ここまでで設定は完了です。

# 起動
次のコマンドで起動します。
`sudo pon OCN`

# おまけ
電源投入時に起動するように設定するときは、次のコマンドで起動時のスクリプトを編集します。

`sudo vi /etc/rc.local`

exit0の前に
```
pon OCN
sleep 10
node-red-start
```

と追加して、起動したらLTE通信とnode-redを起動してゲートウェイとして機能が動くようにしました。

# おまけ2
この後、Wi-FiのUSBドングル　「GW-USNANO2A」を使用してWi-Fiアクセスポイントにしようとしているのですが、デザリングした機器からインターネットが接続できないというトラブルに見舞われており、うまく行っていません。解決したら投稿します。ゲートウェイにsshでログインすることはできています。
Windows IoT Core 事始め

流行のキュレーションメディアっぽく、記事を埋めておきましょう。

# Windows IoT Core とは何か？

初日の記事になるので、ざっと Windows IoT Core とは何かをお話しておきましょう。
ポイントはいくつかありますが、通常の Windows 10 とは異なるもので、スマートフォンの Windows Mobile とも異なるものです。
主に組み込み系の評価ボード（Raspberry Piなど）で動作しますが、将来的には mini PC のようなボードにも乗るかもしれません、というところです。

具体的な用途についは、

[Raspberry Pi 3 と Arduino での Windows 10 IoT アプリの開発 | Windows IoT](https://developer.microsoft.com/ja-jp/windows/iot "Raspberry Pi 3 と Arduino での Windows 10 IoT アプリの開発 | Windows IoT")


![Windows IoT](https://hackster.imgix.net/uploads/cover_image/file/126322/IMG_4278.JPG?auto=compress%2Cformat&w=900&h=675&fit=min)


を眺めていくとよいでしょう。定番の Lチカ（LEDをチカチカさせるだけ）のものから、
サーボモーターを動作させたり、温度センサーの読み取りをしたりするものがあります。

Microsoft 社的には各種センサーと Azure の組み合わせを奨めていますが、別にクラウド環境を使う必要はありません。
Azure を使ったほうがデータの取得等がやりやすいということです。このあたりは、

[Azure IoT Hub | Microsoft Azure](https://azure.microsoft.com/ja-jp/services/iot-hub/ "Azure IoT Hub | Microsoft Azure")

を参考にしてみてください。

# どのようなものができるのか？

当初、Windows IoT Core を使うと、Raspberry Pi で Windows が動いてプログラミングが C# で書けて...
ということになりますが、IoT というか、GPIO を使ってあれこれやる場合には、諸先輩方（Arduino とか Raspberry Pi とか）の作品を参考にするとよいのです。

[Hackster.io - The community dedicated to learning hardware.](https://www.hackster.io/ "Hackster.io - The community dedicated to learning hardware.")

というサイトがあります。

![Windows 10 IoT Core Speech Recognition](https://hackster.imgix.net/uploads/cover_image/file/54386/wiring.JPG?auto=compress%2Cformat&w=900&h=675&fit=min)

組み込み系の投稿サイトなのですが、去年だったか宣伝も兼ねて Windows IoT Core のコンテストをやりました。
このため、カテゴリを「Windows IoT Core」で検索すると、あれこれと 400 ぐらい出てきます

[Windows 10 IoT Core's community hub - Hackster.io](https://www.hackster.io/windows-10-iot-core "Windows 10 IoT Core's community hub - Hackster.io")

...というハズだったのですが、あれ？移動されてますね。

Projects で「Microsft」を選ぶと 500 ぐらい出てきます。

[Microsoft projects - Hackster.io](https://www.hackster.io/microsoft/projects "Microsoft projects - Hackster.io")

これ、Windows IoT Core に限らず、Arduino/Raspberry Pi 単体も混ざっていますが、まあ、これぐらいのものが作れるというところです。

# 自作するということ

hackster.io のサイトを眺めるとわかりますが、「何かを自分で創ること」の要素が入っています。
昔と違って、電子回路をちまちまと半田付けしなくても、ブレッドボードを使えば、なんとなく「自作なもの」できるようになってきています。

一時期、GROVE のように完成されたセンサー（コネクタが取り付けられている意味で）が流行りましたが、ちょっと高めでした（今でも十分高いけど）。
最近だと、少し工夫すれば比較的安く手に入るようになったので、手を出しやすい価格帯になったのかなと思っています。ああ、電子おもちゃの場合は別なんですけどね。

それはさておき、自分で持っているスマートフォンの組み合わせとか、PC との組み合わせとか、
自前の LAMP が動いている安いホスティングサーバーと繋げるというのも、この手の自作組み込み系の醍醐味/楽しみです。

次回は、ちょっとそのあたりをお話ししましょう。
ワンライナー使いだしたら、作業が簡単になった話

#はじめに
「[新人AdventCalendar2016](http://qiita.com/advent-calendar/2016/freshman_engineer)」10日目の記事です。
過去の学生時代の苦労が、上司のアドバイスによって、あっという間に解決された話です。

#これまで
昨年度まで大学生やっていた私。自然言語処理を主にしていたので、とりあえずperlを使っていました。
perlでプログラミングして、TwitterAPI叩いてデータ集めて、データ眺めて分析といった作業。そのときの自分に教えたいテクニック。
そう、**ワンライナー**で書くこと。
ここから紹介することは、「おいおい、それくらい当たり前だろ」と言われることばかりを列挙しています。新人というPowerWordで流してください。

#環境
* Windows7 32bit
* [CentOS-7 64bit](https://www.centos.org/)
* [VirtualBoX](https://www.virtualbox.org/)

#劇的ビフォー・アフター
* 文字列置換

```pikotaro.txt
Pen
Pineapple
Apple
Pen
```

いちいちファイルを開いて、ループさせていた処理がこちら。

```sample.pl
use strict;
use warnings;

$filename = $ARGV[0];
open(IN,$filename);

while(<IN>){
$word =~ s/Pen/book/;
print "$word\n";
}

close IN;
```
と書いていたのが、こう

`cat pikotaro.txt | perl -pe 's/Pen/book/g'`

み、みじかい…

* エンコード

URL叩くために、URLエンコードの処理をしていたのがこちら

```drama.txt
逃げ恥
レンタル救世主
校閲ガール
ドクターX
相棒
```

```encode.pl
use strict;
use warnings;
use Encode;

$filename = $ARGV[0];
open(IN,$filename);

while(<IN>){
$url = ;
print "https://example.com/tv?"."drama=".$url."&conut=10"."\n";
}

close IN;
```

と、書いていたのが

``←明後日追記予定

とか
`echo '逃げ恥' | nkf -WwMQ | tr = %`

デコードは確認程度で端折ります。

* デコード

`echo '%E9%80%83%E3%81%92%E6%81%A5' | nkf -w --url-input`

* 単語数の集計

`cat pikotaro.txt | grep Pen | wc`


#環境周りを確認するワンライナー

* ファイルディスクリプタの確認

`while true;do lsof -p pgrep -l java |cut -d " "  -f1 |wc -l|awk '{print strftime("%y/%m/%d %H:%M:%S"), $0} {fflush() }';sleep 1;done;`
 
* ログをリアルタイムで確認

`tail -f sample.log`

コマンドラインが流れていくので、注意
`Ctrl + c`で終了

#おわりに

ファイルいちいち開いて、集計なり整形していたのが嘘のようにすぐ終わるようになりました。
ワンライナーで書けるようになると、業務の効率化につながることでしょう。

紹介したいものは他にもありますが、私事につき
「[新人AdventCalendar2016](http://qiita.com/advent-calendar/2016/freshman_engineer)」10日目の記事としてはここで〆ます。
来週の平日でまた増やすのと整理しますので。
FileMaker で真っ白レコードを見つける

# FileMaker で困ったことNo.1  
といえば、たぶん破損レコードです。
idなどで検索したら見つけることはできるのですが、データが見えない。。
いわゆる「真っ白レコード」になってしまう現象です。  
こんな感じ。
![真っ白レコード.png](https://qiita-image-store.s3.amazonaws.com/0/16382/9e59d87d-3262-6982-708b-fb3a2358a6c6.png)
未入力なのではなく、データが見えなくなってしまう状態です。

## 破損理由が分からない
さて、データが見えないのはもちろん困るのですが、
一番困るのは、、「破損理由が分からない」ということです。  
  
何かのスクリプトで壊しているのか・・
はたまた作業の仕方が悪く（作業途中でLANを引きちぎるとかね）壊れてしまうのか・・  
  
  
## どれくらい頻繁に起きるのか
PTNAでは、多い時で１０日で７件くらいのペースで壊れていきます。
※ もちろんデータは<b>すぐに復旧出来る</b>ようにしていますが。  

そのため、担当者は毎日新しく破損したレコードがないか、チェックをしているとのことでした。  
  
# 破損レコードを防止するまでの道
ということで、9月に調査をしたのでその方法をまとめます。


* 壊れたタイミングを調査する　　← イマココ
* 壊れた直前の作業を担当者に確認して、根本原因を把握する
* 解決する

  
##  壊れたタイミングを調査する
大分前置きが長くなりましたが、ここからが本題です。


## 破損レコードの検索方法
### onRecordBroken
いつ壊れたのかを知りたいので、onRecordBroken というトリガがあれば最適だったのですが、未実装なようでした。


#### 破損レコードだけを検索する
ならば、破損レコードだけを検索する方法を調査しました。[^1]
[^1]: 破損レコード数をチェックできれば、定期的にチェックしてレコード数が増えた期間に壊れたことが分かるので、その期間に行われたオペレーションから根本原因が探れるだろうという魂胆です。

これは分かってみれば単純で、

* 修正時刻が空になっているレコード

でした。

#### どゆこと？
レコード破損が頻発しているファイルでは、  

* 修正時刻をフィールドに持ち  
* FileMakerの"修正情報：時刻" を保持するよう定義  

しています。
![20160907201836.png](https://qiita-image-store.s3.amazonaws.com/0/16382/7f97fb7e-b339-0de0-b401-2f38e8a63e50.png)


つまり、なにか修正したらFileMakerが勝手に修正時刻を入れてくれる設定にしています。  

そしてこの "修正情報" はレコードが破損する時に、空白が入ってしまうようです。[^2]  
[^2]: その他のフィールドは、見えないし取得もできないけれど、データは入っているらしく、検索には使えるという謎の仕様です。


ということで、修正日時フィールドが空のレコードを検索することで、破損レコード数をチェックすることができるようになりました！
ubuntu16.04LTSのアンダーバーが入力できないとき

ホストOS:windows10
ゲストOS:ubuntu16.04(GUI)

・system setting→Language
英語削除
日本語インストール

・input system
fcitx

・テキスト入力
fcitx

後は英語にもどしてOK
たぶん，最初からテキスト入力の変更だけでよかった
人間はwhile();の幅があれば生きていけるか？

（注：しょーもない小ネタです）
K&Rで有名な、このコードスタイル。

```c:
while(*dst++ = *src++);
```

コレのように、`while();`の`()`内の制御式だけでプログラムを書くことは可能か？

言い換えれば･･･人間は`while();`の幅があれば生きていけるのだろうか？（←これが言いたかった）

```c:Hello_world!
#include <stdio.h>
while(!printf("Hello world!\n"));
//Hello world!
```

```c:「ピザ」って10回言ってみて
int i=0;
while(printf(++i<n?"ピザ,":"ピザ\n"),i-n);
//ピザ,ピザ,ピザ,ピザ,ピザ,ピザ,ピザ,ピザ,ピザ,ピザ
```

```c:nの階乗
#include <stdio.h>

int i=0,n=10;
while(n<=1?!(n=1):(i||(i=n-1),(n*=i,--i)));
// n==3628800
```
```c:FizzBuzz
#include <stdio.h>

int i=0,n=15;
while(++i,printf(i%15?(i%3?(i%5?"%d":"Buzz"):"Fizz"):"FizzBuzz",i),printf(i<n?" ":"\n"),i-n);
// 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
```

```c:nを2進数で出力
#include <stdio.h>
#include <limits.h>

int i=0,n=255;
while(i--||(i=sizeof n*CHAR_BIT-1),printf(i?"%d":"%d\n",!!(n&1<<i)),i);
//n=255         -> 00...011111111
//n=2147483647  -> 01...1
//n=-1          -> 11...1
//n=-2147483648 -> 10...0
```

#結論
（ヘッダのインクルードと変数宣言定義を見なかったことにすれば）
生きていける。
RettyTechCafe#8 Kotlin開発TipsLT会 まとめ

RettyTechCafeに参加したので内容や感想などをざっくばらんにまとめてみます。

Kotlinは今年はv1.0.0もリリースされ、業務で使う会社も増えてきていると思うので、個人的にはとても熱い言語だと思います。

### 株式会社エウレカ 愛澤 萌「layout xml?なにそれおいしいの?」
https://speakerdeck.com/lvla/layout-xml-try-anko

##### 内容
- ankoが実際にどうやって動いているかについてのお話
- 拡張関数と関数リテラルを駆使して動いている

##### 感想
ankoを見るとKotlinの柔軟さと表現の可能性を感じられて、素敵です。

### エムスリー株式会社 長澤太郎「Double Context Extension」
https://speakerdeck.com/ntaro/double-context-extension-kotlin-number-retty-tech-cafe

##### 内容
趣味はディズニーとビールとKotliのエバンジェリストな太郎さんの発表です。
拡張関数では実現できないケースで「DoubleContextExtension(太郎さんが命名)を使えるかも」
DoubleContextExtension＝拡張関数を返す拡張プロパティを宣言する。

##### 質問
- Kotlinの最新動向を知るには？
    - 公式ブログ、頑張れるんだったらチケットを見る

##### 感想
Kotlinではアイデア次第でいろいろ実現できそう！

### 株式会社インタースペース 岩井 大志「Kotlinでテストコードを書く」
##### 内容
- UIテストも書けるぞ。

##### 感想
Kotlinは既存プロジェクトの場合、テストコードやDTOからの導入が比較的しやすいと思います。
UIテストでもKotlinのよさがあるよということで、テストはKotlinで行くと低コストでかけそうです。

### 株式会社エウレカ 海藤 優弥「Kotlin × Dagger × DataBinding」
https://speakerdeck.com/yuyakaido/retty-tech-cafe-8

##### 内容
- generateStubsとkotlin-kaptで、現状だとgenerateStubsのほうが安定してそう
- BindingAdapterが動かない問題
    - 「JvmStaticアノテーションをつける」 or 「拡張関数」

##### 感想
DaggerやDataBindingはAndroid開発において非常に強力なものですが、実際は罠が多いです。
そんな罠を回避するためのこういう発表はとてもためになります🙏
これからこれらの組み合わせの導入を検討している方は要チェックです。

### 株式会社メルカリ 岡野 忍「Kotlinでマッチョする話」
http://www.slideshare.net/shinobuokano7/kotlin-69985133

##### 内容
- KotlinでTupleを実現するためにPairに拡張関数を生やす

##### 感想
毎日30分Kotlinして最後は祈る時間が増えそうな岡野さんの発表でした。
TupleをPairの拡張関数で定義すると非常に直感的で、ライブラリとして公開されている（jecenterなどには2016/12/9時点では未登録）のでとてもありがたいです。

### Retty株式会社 酒多優太「明日使えないKotlin技法(仮)」
##### 内容
- Kotlin、Protobuf、JAX-RSを組み合わせ
    - API変更に伴って、クライアント側のデータ型の更新が大変=>Protobuf使おう

##### 感想
僕もAndroid開発においてProtobufを導入した経験があるのですが、実際に「API変更に伴って、クライアント側のデータ型の更新が大変」という問題に対してProtobufはとてもいい解決策でした。


### まとめ
Kotlinは各社で導入が進んでいる言語ですが、ハマリポイントも多い言語です。
しかし、安全で柔軟な言語なので導入したい方は情報も増えてきているので導入して、素敵なKotlinライフを楽しみましょう！！
今すぐ使えるpandas高速化テクニック

pandasを使って大量データ処理する場合、
数GBの処理に数十分〜数時間、下手したら数日かかるということが往々にしてある
処理が遅いと進む作業も進まなくなるので
簡単なソースコード修正で高速化出来る方法をメモ

## DataFrameのsumやmeanは数値データのみで行う

| index   | name    | weight | height |
|:-------:|:-------:|:------:|:------:|
| 0       | Tanaka  | 160.1  | 60.1   |
| 1       | Suzuki  | 172.4  | 75.0   |
| 2       | Saitou  | 155.8  | 42.2   |
| ...     |         |        |        |
| 999998  | Morita  | 167.9  | 94.07  |
| 999999  | Satou   | 177.7  | 80.3   |

例えば、上記のようなデータフレームがあり、
weightとheightの平均値を求める場合、下記のように処理を記述すると思われる

```python:Badパターン
import pandas as pd

sr_means = df.mean()
mean_height = sr_means['height'] 
mean_weight = sr_means['weight']
```

しかし、文字列を含む列 name のせいで上記コードの場合、計算に非常に時間がかかる

下記のように記述を変更することで、処理が桁違いに高速になる

```python:Goodパターン
import pandas as pd

sr_means = df[['height', 'weight']].mean()
mean_height = sr_means['height'] 
mean_weight = sr_means['weight']
```

#### 追記：書いた後に気になって調べたら、数値だけで行うオプションが合った

```python:追記：Goodパターン
import pandas as pd

sr_means = df.mean(numeric_only = True)
mean_height = sr_means['height'] 
mean_weight = sr_means['weight']
```

実際に時間を計ってみる

```python:実測
import pandas as pd
import numpy as np

N = 100000
df_test = pd.DataFrame(
    {
        'name':['abc'] * N,
        'weight': np.random.normal(60, 5, N),
        'height': np.random.normal(160, 5, N)
    }
)

print("df_test.mean()")
%time df_test.mean()

print("df_test[['height', 'weight']].mean()")
%time df_test[['height', 'weight']].mean()
```

上記の結果が下記。
計算する列が一つ減ったということを考慮しても、後者の方が4桁ぐらい桁違いに早い。


```結果:結果
df_test.mean()
Wall time: 3.06 s

df_test[['height', 'weight']].mean()
Wall time: 4 ms
```

## 高階関数(map)を使おう
例えば、列 weight を整数に丸める処理を行うとき round関数 を使いますが
pythonや今時ぽい書き方に慣れていないと、for文を使った方法で書きがち
高階関数 map を使っていきましょう。
（高階関数が何なのかについてはこの記事では割愛）

```python:Badパターン
# 要素に対して round関数 を適用する
for idx in range(len(df_test['weight'].index)):
    df_test['weight'][idx] = round(df_test['weight'][idx])
```

map を使った下記に書き直す

```python:Goodパターン
# 要素に対して round関数 を適用する
df_test['weight'] = df_test['weight'].map(round)
```

今回も実際に時間を測る。for文が遅すぎるのでデータ数を先ほどより減らす

```python:実測
def func(sr):
    for idx in range(len(sr.index)):
        sr[idx] = round(sr[idx])
    return(sr)


N = 1000
df_test = pd.DataFrame(
    {
        'name':['abc'] * N,
        'weight': np.random.normal(60, 5, N),
        'height': np.random.normal(160, 5, N)
    }
)

print("forの場合")
%time df_test['weight'] = func(df_test['weight'])
print("mapの場合")
%time df_test['weight'] = df_test['weight'].map(round)
```

その結果が下記。
mapなら光の速さで処理できることを、for文だととんでもなく遅くなる
たった100個のデータでこれなのだから、
100万〜1億のデータ扱うことを考えると恐ろしくなる


```結果:結果
forの場合
Wall time: 22.1 s

mapの場合
Wall time: 0 ns
```

上記２つの処理を改善するだけで、
データ処理１日かかっていたところを、数分で処理できるようになったということがあったので、
どんどん改善していきたいですね。
TensorFlow > sine curveの学習 > weight,biasからの学習結果の再現 v0.1 (失敗)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

関連　http://qiita.com/7of9/items/b364d897b95476a30754

[sine curveを学習した時のweightとbias](http://qiita.com/7of9/items/f7b2e0eeea3b7fdc632c)をもとに自分でネットワークを再現して出力を計算しようとしている。

http://qiita.com/7of9/items/ee9d866eee453c94d519
にてconvolutionを実装したので、実際にsine curveを再現しようとした。

## code v0.1

```reproduce_sine.py
'''
v0.1 Dec. 10, 2016
	- add calc_sigmoid()
	- add fully_connected network
	- add input data for sine curve
=== [read_model_var.py] branched to [reproduce_sine.py] ===

v0.4 Dec. 10, 2016
	- add 2x2 network example
v0.3 Dec. 07, 2016
	- calc_conv() > add bias
v0.2 Dec. 07, 2016
	- fix calc_conv() treating src as a list
v0.1 Dec. 07, 2016
	- add calc_conv()
'''

import numpy as np
import math

model_var = np.load('model_variables.npy')

print "all shape:",(model_var.shape)

def calc_sigmoid(x):
	return 1.0 / (1.0 + math.exp(x))

def calc_conv(src, weight, bias):
	wgt = weight.shape
#	print wgt # debug
	#conv = list(range(bias.size))
	conv = [0.0] * bias.size
	# weight
	for idx1 in range(wgt[0]):
		for idx2 in range(wgt[1]):
			conv[idx2] = conv[idx2] + src[idx1] * weight[idx1,idx2]
	# bias
	for idx2 in range(wgt[1]):
		conv[idx2] = conv[idx2] + bias[idx2]
	# activation function
	for idx2 in range(wgt[1]):
		conv[idx2] = calc_sigmoid(conv[idx2])

	return conv # return list

inpdata = np.linspace(0, 1, 10).astype(float).tolist()

for din in inpdata:
	# input layer (1 node)
	inlist = [ din ]
	outdata = calc_conv(inlist, model_var[0], model_var[1])
	# hidden layer 1 (1 node)
	outdata = calc_conv(outdata, model_var[2], model_var[3])
	# hidden layer 2 (7 node)
	outdata = calc_conv(outdata, model_var[4], model_var[5])
	# hidden layer 3 (7 node)
	outdata = calc_conv(outdata, model_var[6], model_var[7])
	# output layer (1 node)
	outdata = calc_conv(outdata, model_var[8], model_var[9])
	dout = outdata[0] # ouput is 1 node
	print '%.3f, %.3f' % (din,dout)
```

いでよ！マイsine curve!!!

```txt:結果
$ python reproduce_sine.py 
all shape: (10,)
0.000, 0.705
0.111, 0.991
0.222, 0.999
0.333, 0.999
0.444, 0.999
0.556, 0.999
0.667, 0.999
0.778, 0.999
0.889, 0.999
1.000, 0.999
```

きれいなsine curveが再現されました（棒読み)。

### TODO

以下のいずれか

- TensorFlowで途中計算の値を出力する
  - validationのnetworkを用意するとか[stackoverflowで見た](http://stackoverflow.com/questions/35387109/validation-and-test-with-tensorflow)
- TensorBoardを利用するようにして、計算過程を確認する
  - TensorBoardの扱いが面倒だったりする
- Fully connectedの計算資料を探す
  - sigmoid関数の適用・不適用など確認
OpenCV3.1+VTK7.1でopencv_vizを有効にしてコンパイルする (Windows, Visual Studio 2015)

OpenCV3.1で，VTK7.1を使ってopencv_vizをコンパイルしようとすると，vtkOBJReader::New()等の実体が無くてLNK2019が出ました．
これはvtkIOGeometry.libがリンクされていないことによるもので，どうやらcmake\OpenCVDetectVTK.cmakeがVTK7に対応していないようです．

対処として，cmake\OpenCVDetectVTK.cmakeの

    # VTK 6.x components
    find_package(VTK QUIET COMPONENTS vtkRenderingOpenGL vtkInteractionStyle vtkRenderingLOD vtkIOPLY vtkFiltersTexture vtkRenderingFreeType vtkIOExport NO_MODULE)

を

    # VTK 6.x components
    #find_package(VTK QUIET COMPONENTS vtkRenderingOpenGL vtkInteractionStyle vtkRenderingLOD vtkIOPLY vtkFiltersTexture vtkRenderingFreeType vtkIOExport NO_MODULE)
    find_package(VTK QUIET COMPONENTS vtkRenderingOpenGL vtkInteractionStyle vtkRenderingLOD vtkIOPLY vtkFiltersTexture vtkRenderingFreeType vtkIOExport vtkIOGeometry NO_MODULE)

にするなどして，vtkIOGeometryをリンクするよう指定してあげればOKです．
技術英語 > attempted to make this catalog [exhaustive] / Once in a life time opportunity.

@ Code Complete (No. 18347 / 36077)

> I have not, however, attempted to make this catalog **<font color=red>exhaustive</font>**.

https://www.merriam-webster.com/dictionary/exhaustive
> including all possibilities 

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

> Once in a life time opportunity.

一生に一度だけの機会。
Rails で Controller の特定の Action にプロファイラを仕掛ける

Rails で特定のエンドポイントにプロファイラを仕掛けたいときに、どのようにコードを埋め込めば良いか、書いておきます。

# stackprof

https://github.com/tmm1/stackprof

```ruby
class FooController < ApplicationController
  around_action :stackprofile

  def index
  end

  :

  private

  def stackprofile(&action)
    profile_dump = Rails.root.join('tmp', "stackprof-cpu-#{$$}.#{Time.current.to_i}.dump")
    StackProf.run(mode: :cpu, out: profile_dump, &action)
  end
end
```

参考:

- [Profile rails controller with ruby-prof](https://gist.github.com/teamon/5714502 "Profile rails controller with ruby-prof")
- [StackProfを使ってrubyプログラムのプロファイリングをする方法 - Qiita](http://qiita.com/shunsakai/items/28182914389a156199cd "StackProfを使ってrubyプログラムのプロファイリングをする方法 - Qiita")

# memprof2

https://github.com/sonots/memprof2

```ruby
class FooController < ApplicationController
  require 'memprof2' # Do not require by default
  around_action :memprof2

  def index
  end

  :

  private

  def memprof2
    Memprof2.run do
      begin
        yield
      ensure
        Memprof2.report(out: Rails.root.join('tmp', "memprof-report.#{$$}.#{Time.current.to_i}.txt")
      end
    end
  end
end
```

参考:

- [Ruby でラインメモリプロファイラ - Qiita](http://qiita.com/sonots/items/c14b3e3ca8e6f7dfb651#memprof2-gem-dancers "Ruby でラインメモリプロファイラ - Qiita")

# 参考
- [Ruby プロセスを追いかけるツール(プロファイラとか)10選 - sonots:blog](http://blog.livedoor.jp/sonots/archives/39380434.html "Ruby プロセスを追いかけるツール(プロファイラとか)10選 - sonots:blog")
ElectronでローカルのJSONファイルを読み込んで変数に代入する方法

わけあってローカルデータ管理をJSONでやっているわけですが、<code>XMLHttpRequest</code>とかに翻弄されながらさまよってましたがやっと解決策を。

Electronのときはfs（ファイルシステムモジュール）便利。ローカルのJSONひとつ読み込むのに時間を使いすぎてしまった。

```
var data = JSON.parse(fs.readFileSync('hoge/hoge/hoge.json', 'utf8'));
```
コンソールに呼び出して確認を。

```
console.log(data);
```

これでJSONを変数に渡すことができました。
のでHTMLへパースしたり、煮るなり焼くなりなんでもいけますね。

最初「javascript json parse」とか「local json parse」とかググってたけど、意外と「node json perse」とかであっさり見つかることがある。Node.js便利。
Kindle本をGoogle Booksに移動させたときのメモ

Kindleに課金しすぎたので、バックアップのため
Google Booksに本を移行した時のメモ。環境はmacOS

# 手順
1. ClibreとDeDRM_toolsのインスコ
2. Clibreを使ってDRMの解除とePub形式に変更

# 拡張子メモ
| 拡張子|説明|
|---|---|
|ePub|自由で無料で使える、電子書籍の拡張子|
|OPF| Open Packaging Format、電子書籍のメタ情報をXMLで記述したもの|
|Mobi|Mobiファイルは主にMobiPocket Readerが使用する電子書籍の形式で、現在Amazon社に買収され、Kindle電子書籍の形式|
|AZW| KindleのAZWファイル形式はMobi形式にDRM(著作権保護)を採用しているもの |
|AZW3|AZW3ファイルはAZWのバリエーションともKF8としても知られている。AZWまたはMobiに比べると、AZW3はより多くのスタイル、フォント、及びレイアウトをサポートしている|

# 1. ClibreとDeDRM_toolsをインスコ
Calibreとはフリー・アンド・オープンソースの電子書籍ソフトウェア。 
DeDRM_toolsはDRM(Digital Rights Management)の解除プラグイン。

0. Calibreをhttps://calibre-ebook.com/download からインスコする
1. DeDRM_plugin.zipをhttps://github.com/apprenticeharper/DeDRM_tools/tree/master/DeDRM_calibre_plugin からDL
2. calibre を起動
3. DeDRM_plugin.zipを calibre Menu > Preferences > Advanced > Plugins > Load plugin from file からインスコ
4. calibre を再起動


# 2. DeDRM_toolsを使ってDRMの解除
1. Kindleの中の書籍ファイルをを見つける。フォルダは~/Library/Application\ Support/Kindle/My\ Kindle\ Content/にある
2. azwファイルをcalibreにドラッグ・アンド・ドロップで入れる。この時点でDRMの解除がされる。
3. 右クリックのメニューのConvert booksから、azwからepubに変換する
4. 右クリックのメニューのSave to diskから、本をepub形式で保存する

# 3. コマンドラインから変換メモ
本が何百冊ある場合はGUIからチマチマやるのは面倒くさいので、CUIでやる。
Cliが用意されているので、以下の感じでスクリプト組めば、一発変換できる。

```:terminal
$ cd /Applications/calibre.app/Contents/console.app/Contents/MacOS/ # ここにCliへのリンクがある
$ calibredb add ~/Desktop/test.azw # これでcalibreのライブラリにDRM解除済みかつazwからawz3に変換されたものが保存される
$ ebook-convert ~/Calibre\ Library/hoge/hoge.azw3 ~/Calibre\ Library/hoge/hoge.epub # azwからepubへの変換
# open ~/Calibre\ Library/hoge/hoge.epub # 変換の確認テスト
```

## 参考文献
https://www.quora.com/How-can-I-convert-azw-to-pdf-or-epub-for-free
https://ja.wikipedia.org/wiki/Calibrea
https://github.com/kovidgoyal/calibre
https://github.com/apprenticeharper/DeDRM_tools
https://apprenticealf.wordpress.com/2012/09/10/calibre-plugins-the-simplest-option-for-removing-most-ebook-drm/
http://jp.epubor.com/guide/kindleコンテンツazwazw3とmobiの違い/
http://jp.epubor.com/guide/mobiファイルを閲覧する方法/
http://www.mobileread.com/forums/showthread.php?t=108856
http://k-airyuu.hatenablog.com/entry/2014/03/07/152655
CSS attr() で color 指定ができない・・・ ならば

[attr - CSS | MDN](https://developer.mozilla.org/en/docs/Web/CSS/attr)

```css:Syntax:
/* Simple usage */
attr(data-count);
attr(title);

/* With type */
attr(src url);
attr(data-count number);
attr(data-width px);

/* With fallback */
attr(data-count number, 0);
attr(src url, '');
attr(data-width px, inherit);
attr(data-something, 'default');
```

**ほほお便利そうな機能があるな～！使ってみるか！**


```css:css
.members .member:before {
    position: relative;
    font-family: "FontAwesome";
    font-size: 18px;
    font-weight: lighter;
    content: '\f2be';
    color: attr(data-color color);
    margin: 2px;
}
```

```html:html
<div class="members">
	<span class='member' data-color='#f0f'>高橋さん</span>
	<span class='member' data-color='#080'>鈴木さん</span>
	<span class='member' data-color='#f00'>田中さん</span>
	<span class='member' data-color='#00f'>山下さん</span>
	<span class='member' data-color='#f80'>橋本さん</span>
</div>
```

**あれ？！**
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/9644ef48-a739-0194-26e4-8676f59ab439.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/102207/348f0b77-c317-d4ba-a0d0-21810b42bbfd.png)

・・・まだ未対応でしたとさ。
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/8ccdbd58-f598-c08c-732f-29b930e79f43.png)

#対応策

```css:css
.members .member:before {
    position: relative;
    font-family: "FontAwesome";
    font-size: 18px;
    font-weight: lighter;
    content: '\f2be';
    margin: 2px;
}

.member[clr='1']:before {
	color: #f0f;
}
.member[clr='2']:before {
	color: #080;
}
.member[clr='3']:before {
	color: #f00;
}
.member[clr='4']:before {
	color: #00f;
}
.member[clr='5']:before {
	color: #f80;
}
```

```html:html
<div class="members">
	<span class='member' clr='1'>高橋さん</span>
	<span class='member' clr='2'>鈴木さん</span>
	<span class='member' clr='3'>田中さん</span>
	<span class='member' clr='4'>山下さん</span>
	<span class='member' clr='5'>橋本さん</span>
</div>
```

できた！
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/69d0a9a4-d41c-8a41-4b86-799eb86c0f09.png)

ダサいとかJavascriptでやれとか言わないで・・・。
Nutanixのサイジングツール『Sizer』を使ってみよう(後編)


この記事はNutanix Advent Calendar 2016、9日目の分として作成しました。

前回のエントリではSizerについて、Server Virtualizationのワークロードを例に解説しました。
今回は、前回紹介していなかったワークロードタイプ「VDI」「RDSH/XenApp」「RAW Input」について解説します。

![11-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/a1b585e3-9184-9600-fbcf-383c4c9b3ab0.png)


# VDI
VDIは、デスクトップ仮想化環境向けのワークロードタイプです。
設定項目は以下のとおりです。
1. VDI Brokerの選択
2. ユーザータイプ、ユーザー数、展開方式の選択

VDI BrokerとしてはVMware Horizon ViewとCitrix XenDesktopが選択できます。
ここで選択したBrokerにより、次のステップで選択可能な展開方式が変わります。
![13.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/203337dc-d056-3540-e2b9-0e5ad3b9faf9.png)

ユーザータイプ、ユーザー数、展開方式の選択を行います。
![14.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/1450d6a3-df9f-8e27-fcbd-ccaa7e7f7134.png)

ユーザータイプは、VDIが要求するリソースのひな形です。
使用リソースが小さい順に、Task Worker, Knowledge Worker, Power User, Developerの４種類から選択可能です。
![15.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/251d29e1-fecc-8f06-657b-ff6398f528a7.png)

VDIソリューションごとに、各々が対応している展開方式を選択可能です。選択した方式に基づき、必要となるストレージ容量が計算されます。

Viewの場合
![16-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/458781d9-6031-3661-4c4e-73c217910ac2.png)

XenDesktopの場合
![16.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/cb4d8ee1-4fe2-93d0-c33b-1bfe9e8558af.png)



# RDSH/XenApp
RDSH/XenAppは、アプリケーション仮想化環境向けのワークロードタイプです。
設定項目は以下のとおりです。
1. アプリケーション仮想化ソリューション、アプリケーションをホストするOSの選択
2. ユーザー数、展開方式、システムデータ容量、ユーザープロファイル容量、（差分データ容量）、GPUカードタイプの選択

RDSH/XenAppについては、リソース計算の元になる情報がVDIとは異なっています。
VDIの場合には、1VMを1ユーザーが使用しますが、RDSH/XenAppでは複数のユーザーが同一のVM上でアプリケーションを使用します。
VMのサイズや割当てるリソース、ユーザー何人あたり1VMを作成するか、といった値がNutanixの経験則に基づいて自動設定されています。

RDSH/XenAppはVMサイズをスケールアップすることで無限にたくさんのユーザーのセッションを捌けるというわけではありません。仮想環境ではWindowsの1VMあたりの処理効率を考慮し、程々なサイズのVMの数を増やすことでスケールアウトしていった方が効率的に多くのユーザーセッションを捌けるようになります。この考え方に基づき、Sizerでも2012R2と2008R2のどちらを選択したかによって、異なる設定値が使用されるようになっています。

| | 2012 R2 | 2008 R2 | 説明 |
|:-:|:-:|:-:|:-:|
| Estimated # of RDSH/XenApp VMs | - | - | すべての接続ユーザーの処理を捌くのに必要なRDSH/XenAppサーバーVM数 |
| RAM per RDSH/XenApp Server | 23 | 16 |RDSH/XenAppサーバーVMに割り当てるメモリ容量  |
| vCPUs per RDSH/XenApp Server | 8 | 4 | RDSH/XenAppサーバーVMに割り当てるvCPU数 |
| Users per RDSH/XenApp Server | 50 | 25 |  RDSH/XenAppサーバーあたりの接続ユーザー数 |


# RAW Input
ここまではユースケースに合わせたワークロードタイプを紹介しましたが、RAW Inputは少し位置づけの異なります。
このワークロードタイプは、あらかじめサイジング済みの必要リソース情報をそのまま入力する方式です。
Sierの独自のノウハウに基づいてリソース計算をしたい場合や、あらかじめ他のツールで必要リソース調査を実施済みの場合には、こちらのワークロードタイプに各パラメータをそのまま入力することで、即座にハードウェア構成例を出力可能です。

![42.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/fc830edf-0506-df84-dc8f-ee9fcbd659f0.png)

# まとめ
２回にわたってSizerについて紹介してきましたが、Nutanixのサイジングにおいてポイントとなるのは、「その基盤で何を動かすのか」「どの程度リソースが必要か」という視点です。

ハードウェアの選定を行うとなると、ついついハードウェアの一覧を眺めながら「どの機種がいいのだろう…」というところからスタートしがちですが、前編でもご紹介したとおりNutanixには数万通り以上のハードウェア構成が存在するため、ハードウェア起点で物事を考えてしまうのは混乱の元になります。

実際にNutanixを導入いただく時には、最初から「この機種をこのスペックで○台ほしい」という形を考えるのではなく、まずは想定用途や必要リソースを元にSizerを使ってみたり、Nutanixやパートナーにご相談頂いたりするのが、最適な構成にたどり着く一番の近道だと思います。
サブスクライバ名とパブリッシャ名の最初のスラッシュの必要性について

#初めのスラッシュは必要なの？
ROSのパブリッシャーやサブスクライバーを作成する時に、
パブリッシャーなら、「どんな名前でパブリッシュするか」、
サブスクライバーなら、「何という名前のものをサブスクライブするのか」を必ず決めると思います。

コードで言うと

```
pub = rospy.Publisher("pub_name", Image, queue_size=1)
sub = rospy.Subscriber("sub_name", Image, img_cb)
```
の"pub_name"と"sub_name"にあたる部分です。

この時のパブリッシャ名やサブスクライバ名の頭にスラッシュが入ったり入らなかったりする場合があって、なんの意味があるのかな？と思っていました。
"/pub_name"
"pub_name"
"/sub_name"
"sub_name"　　こんな感じです
入れても入れなくても動作が変わらないので、何のためなのか分からなかったのですが、つい最近判明しました。

#結論

launchで呼び出して起動するときに、パブリッシャー名やサブスクライバ名にネームスペースをつけることができるのですが、これを反映させるかさせないか、と言うものでした。
スラッシュをつけたならば、ネームスペースが適用されません。
逆に、スラッシュをつけない場合のみ、ネームスペースが反映されます。

#具体例
具体例を交えて説明しますと、

```python:hoge.py
#!/usr/bin/env python
#coding: utf-8
import rospy
from sensor_msgs.msg import Image

def img1_cb(a):
	print "1"
def img2_cb(b):
	print "2"

if __name__ == '__main__':
	rospy.init_node('hoge')	#node作成

	pub1 = rospy.Publisher('/pub_name1', Image, queue_size=1)
	pub2 = rospy.Publisher('pub_name2', Image, queue_size=1)
	sub1 = rospy.Subscriber("/sub_name1", Image, img1_cb)
	sub2 = rospy.Subscriber("sub_name2", Image, img2_cb)

	while not rospy.is_shutdown():	
		rospy.spin()

```

と記述して、パブリッシャとサブスクライバを2つずつ作ります。

そして、launchファイルで

```launch:hoge.launch
<launch>
	<group ns="namespace">
		<node pkg="tttest" name="new_name" type="hoge.py" />
	</group>
</launch>
```
としたものを記述し、
ネームスペースをnamespace、ノード名をnew_nameとして起動するようにします。そしてこれを

```
roslaunch test hoge.launch
```
で起動します。
なんという名前をパブリッシュ、サブスクライブしているか確認するために、

```
rosnode info /namespace/new_name
```
と実行して確認してみると、

```
Node [/name_space/new_name]
Publications: 
 * /pub_name1 [sensor_msgs/Image]
 * /rosout [rosgraph_msgs/Log]
 * /name_space/pub_name2 [sensor_msgs/Image]

Subscriptions: 
 * /name_space/sub_name2 [unknown type]
 * 
 * /sub_name1 [unknown type]
```
となっています(一部抜粋)。
スラッシュをつけたものは、hoge.pyで設定した名前そのままになっており、
スラッシュをつけないものは、hoge.launchで設定したネームスペースが頭についていることが分かります。


ずっと疑問に思っていたものが分かってすっきりしました。
同じように疑問に思っている人の疑問が晴れたなら幸いです。
テストしやすいようにメソッド分割するといい感じになったという話

この記事は、[Student Advent Calendar 2016](http://qiita.com/advent-calendar/2016/student)の第10日目の記事です。

メソッド分割の粒度はいつも迷うところですが、一つの目安として、テスト（単体テスト）が書きやすい粒度で分割すると、割りとスッキリと分割出来ました。

#テストが書きやすいメソッドとは？

基本的には、何らかの値を与えたら1つの値を返すor1つに影響を与えるメソッドかつ、1つのことしか行わないメソッドです。

影響を与えるとは、DBへの書き込みや、APIへのPOSTなど、値は返さないが何らかの変更がなされることと考えてください。

値を返しつつ、DBへの書き込みもしたい（例えば、そのメソッドで算出した値をDBにログとして保存したいなど）場合は、DBへの書き込み部分を切り出してメソッド化し、そのメソッドを呼び出す形にしましょう。

1つのことしかしないとは、例えばそのメソッド内で何らかのWebAPIやDBを呼び出す必要があるとします。

取得した値をそのまま返すのであれば、1つのことといえますが、大体はデータの取捨選択やデータ構造を変更するかと思いますので、そのような場合はデータの取得と値の加工という2つのことをしています。

#なぜそうするのか

ここまで分離するのめんどくさいと思う方も居るかと思います

ではここで例え話をしてみます。

DBのユーザー情報テーブルからユーザーidとユーザー名をとってきて、それぞれのキーの値を変更して呼び出し元に返すような動作のメソッドを作成しました

ところが、そのメソッドを呼び出すとNullが返ってきてしまいました。

もちろんバグなのですが、この場合、問題がDB部なのかDBから取ってきた値を変更する部分なのかの切り分け、すぐできますか？

もし分離していた場合、とりあえずDB部から値を取ってくるだけのメソッドを一度試しに呼んでみるとどちらのバグかすぐわかります（両方にバグが有るという可能性もありますが。）

メソッド数が少ないうちは有り難みがわかりづらいですが、メソッド数が増えてきてDB呼び出しやAPI呼び出しが増えてくると分離していないときに比べてとても楽になります。

#Dependency Injection

メソッドを上のように分離すると、Dependency Injectionができるというメリットもあります。

特にTwitterAPIなんか顕著ですが、リクエスト制限数が厳しく、テストのたびに実際のAPIにリクエスト飛ばしてたらリクエスト数オーバーどころかBANされてもおかしくありません。

そこで、APIを呼び出しているメソッドだけをもう一つ作り、そこの中身は予め用意しておいたJSONを返すだけのメソッドを作ってしまえばAPIの制限なんか恐れずに何回でもテストできます。

実際に動かすときになっても変えるのはメソッドコール部分だけ。

わざわざコメントアウトを戻してテストコード部分をコメントアウトする・・・・なんて面倒なことは止めましょう。


#最後に

メソッド分割は頭使いますし面倒ですが、肥大化した多数のメソッドからバグを探す。のような拷問のようなことに比べれば圧倒的に楽でしょう。

また、DBやAPIも呼び出し部と加工部に分離していれば、例えばMySQLじゃなくてPostgreSQLを使いたいときでもメソッドコール部分を変更するだけです。APIも回数制限気にせずテストし放題。

みなさんもどんどんメソッド分割してテストコード書いて開発を楽にしましょう。

結局のところ、単一責任の原則をしっかり守ろうってことです。
シェルでASCII制御文字を扱う

# 制御文字の概要
通常は見えない特殊な文字のことを「制御文字」と呼びます。
ASCIIコードの場合は、0番目から31番目、127番目が制御文字です。
ここでは、シェル上で制御文字を扱う方法をまとめます。

# 制御文字の表現
| キャレット記法 | 8進 | 10進 | 16進 |
|:-:|:-:|:-:|:-:|
|^@   |0   |0   |0   |
|^A   |1   |1   |1   |
|^B   |2   |2   |2   |
|^C   |3   |3   |3   |
|^D   |4   |4   |4   |
|^E   |5   |5   |5   |
|^F   |6   |6   |6   |
|^G   |7   |7   |7   |
|^H   |10   |8   |8   |
|^I   |11   |9   |9   |
|^J   |12   |10   |a   |
|^K   |13   |11   |b   |
|^L   |14   |12   |c   |
|^M   |15   |13   |d   |
|^N   |16   |14   |e   |
|^O   |17   |15   |f   |
|^P   |20   |16   |10   |
|^Q   |21   |17   |11   |
|^R   |22   |18   |12   |
|^S   |23   |19   |13   |
|^T   |24   |20   |14   |
|^U   |25   |21   |15   |
|^V   |26   |22   |16   |
|^W   |27   |23   |17   |
|^X   |30   |24   |18   |
|^Y   |31   |25   |19   |
|^Z   |32   |26   |1a   |
|^[   |33   |27   |1b   |
|^\   |34   |28   |1c   |
|^]   |35   |29   |1d   |
|^^   |36   |30   |1e   |
|^_   |37   |31   |1f   |
|   |   |   |   |
|^?   |177   |127   |7f   |

# 制御文字の入力方法
```bash
# Ctrl+V Ctrl+A
^A

# Ctrl+V Ctrl+V
^V
```

# 制御文字を表示する

```bash:catコマンドの場合
# 制御文字は見えない
$cat ctrl.txt
cat2013
horse014
sheep2015
monkey2016

# -vオプションを付与すると制御文字が見える
$cat -v ctrl.txt
cat^A2013
horse^B014
sheep^A2015
monkey^B2016
```

less, moreコマンドの場合、制御文字は見える
![image](https://qiita-image-store.s3.amazonaws.com/0/18646/564619cd-493e-ff33-ffeb-5473cd5e36f4.png)

# エスケープシーケンスと利用例
```bash:^Xの表記いろいろ
# 8進表記
$echo $'\030' | more
^X

# 16進表記
$echo $'\x18' | more
^X

# 文字表記
$echo $'\cX' | more
^X
```

```bash:利用例(grep)

# ^A を検索
$cat ctrl.txt | grep $'\cA' | more
cat^A2013
sheep^A2015

# sheep^A を検索
$cat ctrl.txt | grep $'sheep\cA' | more
sheep^A2015
```

```bash:利用例(sed)
# ^B を ^A に置換
$cat ctrl.txt | sed $'s/\x2/\x1/g' | more
cat^A2013
horse^A014
sheep^A2015
monkey^A2016
```
BBC micro:bit(chibi:bit)+scratch でのプログラミングテスト

※追記(2018-07-20): [Scratch3.0+micro:bitの接続方法](https://qiita.com/asondemita/items/b8e7f3ad63ccb0baec3a
)
※追記(2017-06-23)：macだけですが https://llk.github.io/microbit-extension/ ならば特殊なUSBドングルは不用になりました
※追記(2017-12-07)：コードレスではないですが[s2m](https://mryslab.github.io/s2m/s2m/)という方法もあります。日本語化もされたようですhttp://blog.champierre.com/1112 。

「BBC micro:bitにはマイクロソフトの素晴らしい[統合開発環境](https://www.microbit.co.uk/create-code)があるのに何でscratchとつなげる必要があるの？」というツッコミは置いておいて、イギリスPICAXE社のS2Botを使って、chibi:bitとscratch2を接続してみました。

#用意するもの

- BBC micro:bit or chibi:bit 本体
    - スイッチサイエンスさんの[chibi:bit](https://www.switch-science.com/catalog/2778/)は現在在庫無し(2016/10/7現在)
    - ~~micro:bitはBluetoothの技適の問題があるためおすすめは出来ませんが[ebay](http://www.ebay.com/sch/i.html?_nkw=BBC+micro%3Abit)等で入手は可能です~~ 追記(2017-12-07):micro:bitは2017年8月より国内販売を開始しています
- Bluetooth USBドングル BLED112
    - 仮想COMポートとして通信を可能にするドングル(USB CDC)
    - LEGO WeDo2.0でもこれが推奨ドングルだったりします
    - 980円ぐらいで手にいれられたら素敵なのですが東京デバイセズさんで[3,980円](https://tokyodevices.jp/items/172) で購入しました(2016/10/07現在)
    - chromebookならUSBドングルは不用という事になっていますが、手物のacer c720ではダメでした
- chrome
    - S2Botがchromeアプリなので

#しくみ

- scratch2には専用テンプレートを読み込ませchromeアプリS2Botと通信
- S2BotはBLED112が提供する仮想COMポートを介してBluetoothでchibi:bitと通信
- chibi:bitには専用プログラムを入れてセンサーデータをBluetoothで送信

#セットアップ手順

- 基本 [http://www.picaxe.com/BBC-microbit](http://www.picaxe.com/BBC-microbit) のInitial Installationの通りになります
- 特に罠はありませんでしたが、小学生にこの手順をさせるのはスキルによってはかなり時間がかかるかもしれません。

#動作テスト

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/pHY9M-tw94U/0.jpg)](https://www.youtube.com/watch?v=pHY9M-tw94U)
https://www.youtube.com/watch?v=pHY9M-tw94U

#感想

　scratchでワイヤレスな道具の代表格はWeDo2.0あたりだと思いますが2万円以上します。scratchに慣れてしまった子供に与える場合は、これはこれでアリかなと思いました。ただ、せっかくのmicro:bitの良さや面白さを活かしきれていない気はしますし、3,980円もするUSBドングルを買わなければならないのはなんとなく負けた気がしました(^^
gitlab同士をうまく連携させたかった話

2つのgitlabをうまく連携させたかった話

## 前提条件
次のポリシーで各環境のコードマネジメントをしたい、ということがありました

* 開発環境は複数ありそれぞれにgitlabがある(複数システムを開発する)
* それをまとめるための共通用のgitlabがある
* 開発環境 -> 共通環境はNW的に疎通不可（FWで落とす）
* 共通環境 -> 開発環境は疎通可

## 結論
* こんなことになった

![image.png](https://qiita-image-store.s3.amazonaws.com/0/121326/35c61a5e-5de3-db52-07ad-202cfb20c588.png)

## これって変?
私はgitでの大規模開発をしたことがないので、始めに前提条件を聞いたときイケてるのかイケてないのかよくわからなかったのですが、
https://git-scm.com/book/ja/v2/Git-での分散作業-分散作業の流れ#統合マネージャー型のワークフロー
というプラクティスもあり(NW要件を除けば)大規模な複数システムの開発をまとめていくやり方としては悪くないように感じました。(詳しい人助けてください)

## 実際の実装
結論の図では若干省略していますが実際には以下のように流れるものを作りました。
1. 開発環境でdevelopへのmergeが起きると,開発環境にいるjenkinsが開発環境のサーバにデプロイしてテストを回す
2. 1. が成功したら(自動で|手動で)masterへmerge
3. 共通git環境のjenkinsが2. を監視していてmasterに差分があればclone --mirrorを実行
4. 共通git環境のgitlabにpush --mirrorを実施
5. 4.が成功したら共通gitから検証サーバにデプロイしてテスト->商用サーバにデプロイしてテスト


## 良くない点
* 開発でmasterにマージがあるたびにcloneしてきてしまうので開発環境がすごい増えたら耐えきれなくなるかもしれませんし、帯域を圧迫しかねません
* clone --mirror & push --mirrorを使っているのですが、完全に理解して使っていないので良くない手法である可能性があります。
* jenkinsからshellでclone --mirror & push --mirrorをしているため属人化する可能性が否めません(jenkinsおじさんの誕生)
* デプロイ＆テストはansibleやserverspecを使ってコードマネジメントできるようにしていますがshellを使っちゃってるのでjenkinsのコードマネジメントができていません

## 終わりに
今回はあまり触れませんでしたが、git-flowなどのブランチモデルも考えつつ今回の構築を行いました。
gitを使った複数人開発でのベストプラクティスを学びつつできたので自身のために良かったです。
Unity初心者の絵描きが勉強のために作成したゲームアプリ紹介

二度目の投稿、失礼します。アオキです。
先日は【[自分がゲーム業界で働くまでの話](http://qiita.com/takyahashi/items/920d25f204ee771d2462)】をサクッと書き込ませて頂きました。
本日はそんな自分が【勉強のために作ったゲームアプリの紹介】をします。

＝＝＝＝＝＝＝＝＝＝＝＝＝
<b>■簡単に自己紹介</b>
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/152568/ff482db9-da6d-604a-b2cc-dbf574d650f7.jpeg)

アオキです。フリーランスのイラストレーターしてました。
現在有名なゲーム会社にて派遣で働いてます。プランナーやってます。
＝＝＝＝＝＝＝＝＝＝＝＝＝

<b>■ゲーム第一号ができました</b>
そんなわけで、初めて作ったのがこちら。
![promo2.png](https://qiita-image-store.s3.amazonaws.com/0/152568/ad4eb2d9-1857-8adc-1ca1-ccb46b2b7219.png)
https://play.google.com/store/apps/details?id=saitama.usagi&hl=ja

ただただザコウサギという名の謎のウサギ（？）を地面に落とさぬよう
ヒヨコ（フリー素材です）を使って受け止めるゲームです。


![sc1.png](https://qiita-image-store.s3.amazonaws.com/0/152568/0a2ca1fb-ad29-5c44-c90d-241f0ce9dbce.png)

私はまず、さいたまげーむすのもくもく会にて
「なんでもいいからゲームを作って、公開までやってみよう」と思いました。
更に、参考書に書いてない・とにかく単純・目標2日でアプリ自体は完成という条件付きです。
自分の力量と得られる経験値を踏まえた上での勝手に自分の中で設定した条件でした。

さいたまげーむすの人に聞きながら、搭載すると勉強になる機能を教えてもらって
最終的に、下記の機能がついたゲームアプリになりました。

・ツイッター投稿
・ハイスコア
・他のアプリの紹介のリンク

結局条件と比べてストア公開まで1ヶ月かかりましたが、とても勉強になりました。
想定以上の機能を搭載する経験ができたので、結果オーライです。
ひとつ悔しかったのが、ゲームバランスが甘かったところです。（無理ゲーです）

＝＝＝＝＝＝＝＝＝＝＝＝＝

<b>■第二号もできました</b>
師匠と相談しつつ更にもう一個ゲーム作りました。
![promo2.png](https://qiita-image-store.s3.amazonaws.com/0/152568/1bcf4241-e984-79c9-dd24-bad09702fce3.png)
https://play.google.com/store/apps/details?id=com.saitama.wanko_soba&hl=ja

こちらは天ぷらそばが出た時だけOK、他はNOを押すという
いわゆる○☓ゲームです。

![sc1.png](https://qiita-image-store.s3.amazonaws.com/0/152568/383209a0-a600-54dd-44e1-de78d8e24f9b.png)


前のアプリ「うさぎをおとすな」より新たに追加（勉強）した機能がこちら。
・キャラクターのアニメーション
・画像のポップアップ（チュートリアル）
・ボタンタッチの反応
・残機数
・時間で減るバーのUI（制限時間の追加）
・難易度上昇（成功数により、NGソバの種類が増加）
・サーバーによる、ハイスコア管理（オンラインランキング）
・広告表示

こちらは公開まで約6ヶ月かかりました。
が、前よりもかなりゲームらしくなり、得られるものも本当に多かったです。

＝＝＝＝＝＝＝＝＝＝＝＝＝

<b>■勉強のためには実践がいちばん！</b>
前回の記事にて、さいたまげーむすに入る前は参考書を写経していたことを書きましたが、
ぶっちゃけ「進歩において実践に勝るものはない」と思います。

教科書で「こうしてね、ああしてね」というのをそのままやるだけでなく、
応用して独自のものを作ると本当にいい経験になりました。（達成感も生まれます）

更に「こういうゲームが作りたい！」から必要な知識・方法を勉強していくので
人に聞くときも漠然とせず、具体的な質問がしやすく、お互いにスムーズです。

複雑じゃなくていいので、応用・活用させながらゲームを完成させるのは
達成感と経験値をいっぱい感じることができるのです。
さいたまげーむすでは「さいたまげーむすライト」という、
自作のアプリを公開することが可能な場があるので、最初から最後までスムーズに学べてよかったです。

＝＝＝＝＝＝＝＝＝＝＝＝＝
<b>■実践のきっかけを作りましょう</b>
![115.jpg](https://qiita-image-store.s3.amazonaws.com/0/152568/bb4bc2b9-5faa-2372-18f6-1d4204ee488e.jpeg)

とはいえ、未知の分野に唐突に飛び込んでも何をしていいか全くわからないことでしょう。
応用して独自のものを作るには、まず基礎を知ることも重要です。
基礎を「パーフェクト」にするのではなく、なんとなくでも「知る」だけで
「自分はこうしてみようかな」という発想が生まれて、実践することができるのです。

今月の24日に行われる勉強会も、実践の良いきっかけになると思います。
話題のVRをハンズオンで作れるので、VRのしくみを感覚的に知ることが出来ます。

懇親会で、集まった人たちと発想の意見交換をするのもおすすめです。
自分ではない視野からの意見が、実践のヒントになることも良くあることです。
当日は皆様、どうぞお楽しみくださいませ！
IDEとフレームワークの違い

今までVisual Studio IDE（統合開発環境）で開発していたためか、フレームワーク自体を意識せず開発していたが、ここ1年WEBプログラミングし始めフレームワークを意識するようになったので、同じようにWEBへシフトする機会のある方の参考になればと思います。

#IDE（統合開発環境）とは？
ソフトウェア開発に必要なソフトウェアを一つに組み合わせ、同じ操作画面から統一的な操作法で利用できるようにしたソフトウェアパッケージ。
一般的にはコードエディタやコンパイラ、リンカ、デバッガ、テストツール、バージョン管理ソフトなどで構成される。

#フレームワークとは？
開発を行う際に、頻繁に必要とされる基礎的な機能をまとめて提供してくれるもの。
機能が部品化されており、それらを組み合わせることで容易に開発ができる。
アプリケーションのひな型

#IDEとフレームワークの違い
この時点で既に異なる物だとお気づきかもしれませんが、IDEは開発環境を提供し、フレームワークは作る工程を楽にしてくれる関係になります。
それならばフレームワークはライブラリじゃないの？と思う人もいるかもしれません。

ライブラリ：機能を部品化したもので単独では動かない
フレームワーク：基礎などが整ったもので、ユーザーが好きに組み合わせて完成させるブロック的イメージ

#フレームワークってどんなのがあるの？
1.Laravel
　特徴：コードが読み書きしやすく学習が容易
　　　　強力なルーティングフィルター・柔軟なオートローダー
　欠点：ベンチマークが遅い
　　　　自由度が高すぎて、設計が苦手な人には向かない
　http://laravel.jp/

2.cakePHP
　特徴：簡単シンプルで開発コストやコード量を減らすことができる
　　　　日本語ドキュメントも比較的多く、学習コストが低い
　欠点：バージョンによって命名規則や設定が異なるため、安易にバージョンアップできない。
　http://cakephp.org/

3.symfony
　特徴：パーツ単位のものが組み合わさってフルスタックな形を実現しているため再利用性が高い
　欠点：設計の自由度が高すぎて、設計が苦手な人には向かない
　　　　設定によるが基本キャッシュして動かすため、キャッシュ問題にはまりやすい
　http://symfony.com/

#まとめ
IDEにしろフレームワークにしろ開発を補助し品質をある程度保てるところにある。
特に一から十まで知らなくとも開発できるようになるのは良いが、ここは賛否両論に分かれるとこかもしれません。
フレームワークは結構トレンドがあり人気度が上下し、種類も多くどれを使うか悩んでしまう印象をうけました。
トレンドに合わせてフレームワークを取得していくのは学習コストがかかりすぎるので、流行り廃りに流されず作りたい物の内容に合わせて、適したフレームワークを探すのが一番だと思います。
現在時刻をRFC/ISO/エオルゼア時間など多表記で表示する

[okisanjp/homebrew-utex: date and time are displayed in various formats.](https://github.com/okisanjp/homebrew-utex "okisanjp/homebrew-utex: date and time are displayed in various formats.")

例によって自分用ツールの共有。

### homebrew::utex

unixtimeを渡すといろいろな形式で日時を表示します

引数無しで実行すると現在の時刻を表示します

エオルゼアタイムも表示します。プログラム書いててもETは気になります。

<!-- more -->


#### install

```
$ brew tap okisanjp/utex
$ brew install utex
```

#### usage

```
$ utex 2147483648
NORMAL    : 2038/01/19 12:14:08 JST
UTC       : 2038-01-19 03:14:08 UTC
RFC2822   : Tue, 19 Jan 2038 12:14:08 +0900
RFC1123   : Tue, 19 Jan 2038 03:14:08 GMT
ISO8601   : 2038-01-19T12:14:08+09:00
CTIME     : Tue Jan 19 12:14:08 2038
EORZEA    : 07/10 15:07
```

```
$ utex
usage : utex [unixtime]
---------------------------------------------------------
NORMAL    : 2016/12/10 02:02:16 JST
UTC       : 2016-12-09 17:02:16 UTC
RFC2822   : Sat, 10 Dec 2016 02:02:16 +0900
RFC1123   : Fri, 09 Dec 2016 17:02:16 GMT
ISO8601   : 2016-12-10T02:02:16+09:00
CTIME     : Sat Dec 10 02:02:16 2016
EORZEA    : 06/20 04:12
```

引数無しで実行すると現在時刻を参照します

バグがあったらプルリクいただけれると幸いです
文字列の連結と改行

```java:filename.rb
class Abc
    public static void main(String[] args) {
        System.out.println("こんにちは。" + "元気ですか？\n僕は元気です。");
    }
}
```

文字列を連結するには「+」を使用する。
文字列リテラルの途中で改行ができないため、文字列が長くて１行に入りきらない時に使用するとインデントを綺麗にすることができる。
改行するには「\n」という改行文字も利用できる。
この場合「僕は元気です。」が改行されて表示される。
SourceTreeとGitサービスでSSHキーを設定した話(備忘録)

先日、仕事のお手伝いをさせていただいたときの話です。
私はGitHubしか使ったことが無いので知らなかったことで、たまにある話らしいのですが有名なGitHub以外だと自身でGitの設定をする項目があったりで大変なのだとか。

そのときにたまたまGitHub以外のモノを使うことになり、すこし試したのでメモにまとめました。

参考にしたページです。
http://azunobu.hatenablog.com/entry/2015/08/06/201449

参考記事の方がかなり丁寧に書いていらっしゃるのでぶっちゃけほとんどここに書くことはないのですが、私のPC環境で設定していた際にぶつかった問題点と解決方法をのせていきます。

１．さっきの参考ページをもとにとりあえず鍵を作成する
２．Git側にパブリックキーを設定する画面まで進める

ここでパブリックキーを登録する際にぶつかってしまった問題です。
下のような形式で～入力と書かれていますが・・・※適当な乱数
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAjCjNe7MJo3iOtdG74U7r4GVuh9znjFXw85fjKfGFDWj9/lC8HFo4H92NdJD52lswVP+JSpXFm9QuoXQ6W/zWAQKLnSLMgJvsggmO6wnnLXFaWyTBM0YiEesKtBz6Q778OFk9KAbkvS9G1lV9bMkZmvX+mltdxDDkrRfaBaNNXAU=

うまく登録できませんでした。

ところがいろいろ試した結果・・・
実は、Gitサービスの種類によってはこのようにコピペすると一発で登録できたりします。
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAjCjNe7MJo3iOtdG74U7r4GVuh9znjFXw85fjKfGFDWj9/lC8HFo4H92NdJD52lswVP+JSpXFm9QuoXQ6W/zWAQKLnSLMgJvsggmO6wnnLXFaWyTBM0YiEesKtBz6Q778OFk9KAbkvS9G1lV9bMkZmvX+mltdxDDkrRfaBaNNXAU= rsa-key-20161210

こんな風にそのままコピペしたらあとは”Title”の入力欄を適当にクリック
そうするとこのキーの場合なら”rsa-key-20161210”と入力欄に勝手に入力されます。
そしたら決定ボタンをﾎﾟﾁｰ　これで設定完了。

Qiita初めてなので時間を見つけたら紹介ページを整理します！
JDKのインストールと設定、ソースコードの基本構造

#JDKのインストールと設定(Win10使用)
1．JDKをDLする
http://www.oracle.com/technetwork/jp/java/javase/downloads/index.html
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

2．パスを通す
システム→詳細設定→詳細設定タブの環境変数→システム環境変数のPathを編集

変数値を一旦メモへコピーしておく。（変数値を一文字でも間違えると動かなくなってしまうため注意すること。）

JDKがあるフォルダまでを道筋をコピーして、先ほどコピーした変数値の頭に張り付ける。
C:\Program Files\Java\jdk1.8.0_111\bin

#プログラムの基本構造

```java.filename.rb
class Abc {                               //クラス宣言
    public static void main(String[] args) {    //メインメソッド
        System.out.print("ABC");                //文
        System.out.println("DEF");
    }
}
```

クラス宣言があって、その中にメインメソッドがある。
メインメソッドに記述した文が上から順番に実行される。

「System.out」はコンソール画面と結びつく標準出力ストリーム。
「print」は表示させるという意味があり、「ln」は改行させる意味を持つ。
したがって「System.out.println」はコンソール画面に改行して表示するということになる。

文末の「;」は日本語の句点と同様で、ソースコードでは「;」で終わる。

なお、この実行結果はコンソール画面に「ABCDEF」と表示される。