OmniAICreator/Qiita-1.07M huggingface dataset:
Chefでのデプロイ時にcallbackを活用する

# はじめに

* ```<my cookbooks>/<my application name>/deploy.rb```
* ```<my cookbooks>/deploy/<my application name>.rb```

上記のような、デプロイするアプリにべったりなレシピは（というかアプリ名が入るようなレシピ）は、再利用しにくいのであんまりcookbookのレポジトリに入れたくない...

という場合に、他のアプリと共通化できないアプリ固有の内容は、逆にアプリのリポジトリに持ってもらいたいなぁ、というシチュエーションで。


## Chefにおけるデプロイフェーズとcallback

詳しくは[このあたり](https://docs.chef.io/resource_deploy.html#callbacks)を参照。

各callbackに対応するファイル（before_migrate.rb等）をアプリケーションの ```<application root>/deploy``` 以下に入れておけば勝手に実行される。（なければスキップされる）

各デプロイフェーズとcallbackは、ざっくりこんな順番で実行される。

checkout → callback(before migrate)
→ migrate → callback(before symlink)
→ symlink → callback(before restart)
→ restart → callback(after restart)


# 例題

例えばsupervisorで何かのワーカーみたいなものを起動したいとする
（supervisor自体は、サーバのセットアップ時に入れているとする）

## まずは愚直に

```<application root>/config``` 以下にsupervisor向けの設定ファイルが既にあるという前提。

checkout後にデプロイしたアプリ内の設定ファイルをコピー

```deploy/before_migrate.rb
file_name = 'my_supervisor_program.conf'

execute "cp #{release_path}/config/#{file_name}.conf /etc/supervisor.d/#{file_name}.conf"
execute "chown root:root /etc/supervisor.d/#{file_name}.conf"
```

アプリrestart後にワーカープロセス再起動

```deploy/after_restart.rb
program_name = 'my_supervisor_program'

execute "supervisorctl update"
execute "supervisorctl restart #{program_name}"
```

## もうちょっとchefっぽくしたい

cookbookのリポジトリに、下記ファイルがあるとする

```supervisor/template/default/program.conf.erb
[program<%= @program_name %>]
user=<%= @user %>
command=<%= @command %>
directory<%= @directory %>
environment<%= @environment %>
```

before_migrate.rbでtemplateブロックを使う
（デプロイに利用しているrecipeのmetadata.rbで```depends 'supervisor'```を忘れずに）

```deploy/before_migrate.rb
file_name = 'my_supervisor_program.conf'
program_name = 'my_supervisor_program'

template "/etc/supervisor.d/#{file_name}" do
  cookbook 'supervisor'
  source   'program.conf.erb'
  mode     '0644'
  owner    'root'
  group    'root'
  variables(
    :program_name => program_name,
    :user         => 'deploy',
    :command      => '/user/bin/hoge fugapiyo',
    :directory    => release_path,
    :environment  => 'PATH="/usr/local/bin:/usr/bin:$PATH"'
  )
end
```

after_restartは余り代わり映えしない

```deploy/after_restart.rb
execute "supervisorctl update"
```

# callback内からアクセスできる値について

さっきの[ここ](https://docs.chef.io/resource_deploy.html#callbacks)を見るに、```release_path``` および ```new_resource``` （と、nodeオブジェクト）にアクセス出来る。```new_resource``` については、[ここらへん](https://github.com/opscode/chef/blob/master/lib/chef/resource/deploy.rb)を追いかけるとわかる。

面倒であれば、callbackの中で、 ```new_resource.to_hash.to_s``` とかをログに出力すればどんな値があるのかわかる。

## 参考：opsworksの場合

opsworksの場合、[この値](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/deploy/definitions/opsworks_deploy.rb#L2-L3)が ```new_resource.params``` として入ってくるので、callbackの最初に↓これ書いてしまえば他のレシピと一緒のように書ける

```
application = new_resource.params[:app]
deploy = new_resource.params[:deploy_data]
```

# まとめ

* 今回はsupervisorを例にしたけれど、他に使い道はいろいろあると思う。（よく利用されているのはrailsでのassets precompileとか）
* cookbookは見通し良くなるけど、テスト困難（良い方法があれば教えて下さい）
* roll-back時の挙動とか完全に不明（検証してません…）
カスタムのカメラモジュールを作ってみる

とりあえず３次元のグラフを作る。

![camera.png](https://qiita-image-store.s3.amazonaws.com/0/59664/3a933f86-843e-3085-f691-3425ce429ac2.png)

左の方がシーンのオブジェクト関連

* AxisGrid
* Teapot->PhongDirectional
* Groupで複数のオブジェクトを束にする

右側がカメラ行列。
vvvvで特徴的なのが一般的にはひとまとめの投影行列がProjectionとAspectRatioに分かれているところ。なのでRendererの幅・高さをAspectRatioに入力して結果をRendererのAspectRatioにもう一度投入するという感じになっている。２次元の使い勝手との兼ね合いですかね。

# カメラ
CameraというノードはCamera(Transform Orbit)を使っている。
左横ドラッグでYaw、左縦ドラッグでPitch、右縦ドラッグで前進・更新という操作。他にもCamera(Transform Softimage)などが存在して独自のマウス操作とキーボードショートカットを実装している。
しかし、自分はメタセコ風の右ドラッグがYaw/Pitchかつホイールが前後進が好きなのでそういうノードを作ってみる。

# 既存のモジュールを改造して新しいモジュールを作る
Camera(Transform Orbit)が使えそうなのでこれをベースに改造することにする。
まず、Camera(Transform Orbit)を右クリックしてサブパッチを開きます。
![Camera (Transform Orbit)_2015.01.12-20.13.09.png](https://qiita-image-store.s3.amazonaws.com/0/59664/31fd4e6b-2df0-4c68-b3a3-37a31dfdfb42.png)
思ったより複雑！

とりあえず改造版を違うモジュールとして認識させる準備をする。c-Mを押してモジュールの設定画面を開く。Authorを違う名前に変えます。他はお好みで。次に中ボタンクリックでメニューを出して右上のSave Asを選びます。
保存する場所はとりあえずvvvv/packs/custom/nodes/modulesにします。
customは変えてもOK。他は変えると検索パスから外れるっぽい？(完全に把握していない)。

vvvv/contributions等を設定済みの場合は、vvvv/contributions/modulesでもOK。

ファイル名は、Camera (Transform MyOrbit).v4pとでもしておきます。
保存するとダイアログが出てくるのでReloadを選んでおく。

このままだと新モジュールが認識されないのでウインドウをすべて閉じてquitします。
モジュールをリロードする方法はあると思うが知らない。
再起動して、左ダブルクリックのノードブラウザで"camera orbit"と入力すると
さっきのノードが現れます。
![クリップボード02.png](https://qiita-image-store.s3.amazonaws.com/0/59664/a10f8c14-813c-52be-ca42-73a8708f69e1.png)

(ファイル名)[tag, author]

という表示になるっぽい。
命名規則は[こちら](http://vvvv.org/documentation/conventions.nodeandpinnaming)。
どうやら決まった場所にパッチを保存するとそれはモジュールになるらしい。

パッチに入出力を作るにはIOBoxに名前を付ければよろしいらしい。
http://vvvv.org/documentation/subpatches#parameters

#改造
ちょっと違う(回転中心が違う)がなんとなくそういう感じのができた。
<https://gist.github.com/ousttrue/ace2c2f653d2fc99dcb2>

* 右ドラッグがDistanceに結びついていたのを切った
* ホイールがFovに結びついていたのを切った
* 左ドラッグがYaw, Pitchに結びついていたのを切った
* ホイールをDistanceに接続
* 右ドラッグをYaw, Pitchに接続

#初期値積算パターン

Camera(Transform Orbit)はわりと複雑なのだが中心となるロジックは下記のようなものだった。
![InitialAcc.png](https://qiita-image-store.s3.amazonaws.com/0/59664/b54dca81-61d5-815c-772a-999830f176e2.png)

毎フレーム左側から供給される現在値と右側から供給されるマウスの状態による値(正もしくは負の差分値)を中央で加算して結果として使う。左側は、OnOpen(1フレーム目だけ1)とSwitch(左が使用する値のindex。0のとき左の値を使い、1の時右の値を使う)の組み合わせで１フレーム目だけ初期値を使い、以降FrameDelayに入れた足し算の結果を使う。
右側はFrameDifferenceで前のフレームとのDeltaを得て"*"で係数をかけた(とりあえず0.5とWindowの高さをかけてPixel単位にしてみた)
値を供給する。
意外とLINQとか関数型っぽいかつパワポっぽい感じ。
リンクがからまないように綺麗にレイアウトする技が必要ですな。

ということで次回はPMDローダーを作ってみるかもしれない。
docker でポート範囲指定をして、外部にサービスを公開する

FTP のコンテナを作るとき(しかない)
需要ないけど、困ってる人がきっと居ると信じて書く。

どうやらポート範囲指定は現在リリースされていません。
なので、力技で指定してあげる必要があります。

vsftpd のコンフィグを例に。
passive モードで接続するときのポート範囲を FTP コンテナ内で指定してあげる

```
# vi /etc/vsftpd/vsftpd.conf
listen_port=50021
pasv_enable=YES
pasv_min_port=50030
pasv_max_port=50100
```

docker run(Dockerfile に書くときも)するときにポートを指定する。
(地獄だ、これ)

```
EXPOSE 50030 50031 50032 50033 50034 50035 50036 50037 50038 50039 50040 50041 50042 50043 50044 50045 50046 50047 50048 50049 50050 50051 50052 50053 50054 50055 50056 50057 50058 50059 50060 50061 50062 50063 50064 50065 50066 50067 50068 50069 50070 50071 50072 50073 50074 50075 50076 50077 50078 50079 50080 50081 50082 50083 50084 50085 50086 50087 50088 50089 50090 50091 50092 50093 50094 50095 50096 50097 50098 50099 50100
```

元ネタの記事がここ(https://github.com/docker/docker/issues/1834) なんですが、
まぁ、同じことやってる人もイマス(´･ω･`)

docker 本体で現在、ポート範囲指定はないようです。
merge されたのがごく最近なので、そのうちリリースされるかも！

* https://github.com/docker/docker/issues/1834
[JavaScript]文字列中に含まれるある文字の個数を簡単に返す。

ちょっと思いついたので、メモ。

```js

var counter = function(str,seq){
    return str.split(seq).length - 1;
}

var str = "Qiita";
var str2 = "Qiiiiiiiiiiiiiiiiiiita";
var str3 = "a1b2c3d4e5f"

console.log(str+":"+counter(str,"i")); 
console.log(str2+":"+counter(str2,"i")); 
//正規表現も使える
console.log(str3+":"+counter(str3,/\d/)); 
console.log(str3+":"+counter(str3,/[a-z]/)); 


```

splitなので正規表現も使えます。

[確認する[runstant]](http://goo.gl/ykv209)
outlookで受信したメールの添付ファイルを自動解凍する（パスワード付zip対応）


* outlookで受信したメールに添付されているzipファイルを任意のフォルダに格納する。
* 格納したzipファイルを解凍する（パスワード付の場合は予め決められたパスワードを使う）
* zipファイル解凍には7zipのdllを用いる。

# 事前準備
## 64bit OS (Windows8等）
* http://www.madobe.net/archiver/index.html から7-ZIP32.DLL をダウンロード
* 「7-zip32.dll」を「C:\Windows\SysWOW64」に格納する。

## 32bit OS (Windows XX)
* http://www.madobe.net/archiver/index.html から7-ZIP32.DLL をダウンロード
* 「7-zip32.dll」を「C:\Windows\System32」に格納する。

# コード

``` saveZip.vba

Option Explicit

Private Declare Function SevenZip Lib "7-zip32.DLL" ( _
    ByVal hWnd As Long, _
    ByVal szCmdLine As String, _
    ByVal szOutput As String, _
    ByVal dwSize As Long) As Long
 
Const SAVE_PATH = "C:\mail_attach\"

Public Sub CustomRule_SaveFile(Item As Outlook.MailItem)
    Dim SaveStatus

    SaveStatus = SaveAttachFile(Item.Attachments)

End Sub

Function SaveAttachFile(Attachments As Outlook.Attachments)
    Dim UnzipStatus
    Dim sh As Object
    Dim ItemNumber, i As Long
    ItemNumber = Attachments.Count


    For i = 1 To ItemNumber
        Attachments.Item(i).SaveAsFile (SAVE_PATH & Attachments.Item(i).DisplayName)
        UnzipStatus = ExtractZIP(SAVE_PATH, SAVE_PATH & Attachments.Item(i).DisplayName, "test")
        
        
    Next i
    
    SaveAttachFile = True
    
End Function


'ZIPファイルを解凍
'引数 sDstPath：解凍先のフォルダーのパス
'     sZIPFile：ZIPファイルのパス
'     sPassWord：パスワード　省略可
'返り値　成功したら True、失敗したらFalse
Public Function ExtractZIP(sDstPath As String, sZIPFile As String, Optional sPassWord As String = "") As Boolean
    Dim sCmd As String
    sCmd = "X -hide -aoa "
    If sPassWord <> "" Then sCmd = sCmd & "-P" & sPassWord & " "
    sCmd = sCmd & Q2(sZIPFile) & " -o" & Q2(sDstPath)
    
    Debug.Print (sCmd)
    
    ExtractZIP = DoSevenZip(sCmd) = 0
End Function
 
Private Function DoSevenZip(sCmd As String) As Long
    Dim sRet As String * 1024
    DoSevenZip = SevenZip(0, sCmd, sRet, 1024)
    If DoSevenZip <> 0 Then MsgBox (Left(sRet, InStr(sRet, vbNullChar) - 1))
End Function
 
Public Function Q2(ByVal Text As String) As String
    Q2 = """" & Replace(Text, """", """""") & """"
End Function

```


# 参考サイト
* http://hatenachips.blog34.fc2.com/blog-entry-376.html
* https://gist.github.com/hatena19/6052894
音声APIをリアルタイムに再生するにはiframeだっけか

[HOYAのVoiceText](https://cloud.voicetext.jp/webapi)や[ドコモの音声合成](https://dev.smt.docomo.ne.jp/)といった音声ファイルを生成するAPIが面白い。

面白いが、例えば別のAPIを叩いて、その返ってきた値を喋らせるという非同期な使い方を色々と試した結果、BASE64で自動再生にしたファイルをiframeに突っ込むことしか思いつかなかったが、とりあえず紹介してみる。（書いたら、ほかのひとが素晴らしい方法を教えてくれるのでは、と期待して）

なお、１ファイルで自分自身をtest.php?mode=tts&text=Helloとパラメータを付けて呼び出すという書き方をしている。

```html+php
<?php

if( isset($_GET["mode"]) ){

    if( $_GET["mode"] == "tts" ){

        $text = $_GET["text"];
        $apiUrl = "https://api.apigw.smt.docomo.ne.jp/virtualNarrator/v1/textToSpeech?APIKEY=xxxx";

        $data = [
            "Command"=>"AP_Synth",
            "TextData"=>$text
        ];
        $data = http_build_query($data,"","&");
        $header = [
            "Content-Type: application/x-www-form-urlencoded",
            "Content-Length: ".strlen($data)
        ];
        $context = [
            "http"=>[
                "method"=>"POST",
                "header"=>implode("¥r¥n",$header),
                "content"=>$data
            ]
        ];
        $response = file_get_contents($apiUrl,false,stream_context_create($context));
        echo '<audio autoplay src="data:audio/wav;base64,'.base64_encode($response).'"/>';
        echo $response;
    }
    exit();
}
?>
<html>
<head>
    <meta charset="UTF-8">
    <script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
    <script>
        $(document).ready(function() {
            playVoice = function(text){
                text = $("#text").val();
                url = "test.php?mode=tts&text="+text
                $("#iframe").attr("src",url);
            }
        });
    </script>
</head>
<body>
    <input id="text" type="text" value="こんにちは">
    <button onclick="playVoice();">再生</button>
    <iframe id="iframe" src="" width="1" height="1"></iframe>
</body>
</html>
```
以前作ったスケッチがArduino Leonardoで動かない時（シリアル編）

すでに同様の情報はあふれていてFAQくさいと思われるが念のため記す。

以前[MIDIシールド](https://www.switch-science.com/catalog/387/)を使ったスケッチを作ったのだが、Arduino Leonardoを買ってきて書き込んでみたら動かない。

[Sparkfunの製品ページ（英語)](https://www.sparkfun.com/products/9595)のコメントにあるとおり、結論としてはLeonardoではMIDIシールドが利用している`Serial`の位置づけが変わっているので、代わりに`Serial1`を使えばよい。

ただし古いサンプルなどでは`Serial.print(c, BYTE);`のようになっている部分はArduino1.0以降は`write`メソッドを使うように改められたので、結局以下のように変更することになる。

```diff
< Serial.print(c, BYTE);
> Serial1.write(c);
```

これで動作した。
emoji 関連記事 #emoji

# emoji 関連記事 #emoji

更新日: 2015/02/28 21:34:48

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Sublime Text  Markdown Preview Plugin で fontawesome を利用できるようにする](http://qiita.com/tbpgr/items/d224fd3154cd210800a8)|2014/11/26 03:40:17|3|
|2|[Sublime Text  Font Awesome のタグを snippet 化して楽に入力する](http://qiita.com/tbpgr/items/24dae69a1884d1a54daa)|2014/11/26 22:22:11|4|
|3|[Qiita の記事の見出しに Font-Awesome を利用して見栄えを良くする #qiita](http://qiita.com/tbpgr/items/361d8aaa38fb57d75216)|2014/12/15 22:38:03|73|
|4|[Sublime Text  emoji を snippet 化して楽に入力する](http://qiita.com/tbpgr/items/b1ce7de3cc84a1548734)|2014/12/18 22:55:48|1|
|5|[GitHub の README の見出しに emoji を利用して見栄えが良く・・・なるといいですね #github #emoji](http://qiita.com/tbpgr/items/e748c24b87c28031d715)|2014/12/18 23:08:12|2|
|6|[emoji 用途辞書](http://qiita.com/tbpgr/items/47f745c4bd93c741f6e6)|2015/01/12 22:41:20|3|
|7|[Font-Awesome 用途辞書](http://qiita.com/tbpgr/items/1df3ba8c402b404144f8)|2015/01/12 22:51:05|4|
|8|[Git  Emoji を利用した Git の commit フォーマットの一例 #git #emoji](http://qiita.com/tbpgr/items/9c9bddc3be084a7651f3)|2015/01/31 04:33:37|7|
|9|[ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第1回 お題「 Red =&gt; Green =&gt; Refactor 」 }](http://qiita.com/tbpgr/items/58422895800865250a73)|2015/02/22 03:02:37|0|
|10|[ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第2回 お題「 ねこあつめ 」 }](http://qiita.com/tbpgr/items/bf56a9ea2944557386eb)|2015/02/22 20:44:20|0|
|11|[ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第3回 お題「 IT 系の勉強会あるある 」 }](http://qiita.com/tbpgr/items/86e2a859272f4141f6c7)|2015/02/24 01:15:58|0|
|12|[ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第4回 お題「 Ruby 22 歳の誕生日（ 2015/02/24 ） 」 }](http://qiita.com/tbpgr/items/51ab57071896766a70da)|2015/02/24 22:24:26|0|
|13|[ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第5回 お題「 esa.io 」 } #esa_io](http://qiita.com/tbpgr/items/5ab85ba5bd2f82623fad)|2015/02/27 00:40:37|0|
|14|[ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第6回 お題「 トライアングルアタック 」 } #esa_io](http://qiita.com/tbpgr/items/5beb60684529cd324e0f)|2015/02/28 02:41:07|0|
|15|[ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第7回 お題「 配管工の彼らと良く連行される姫 」 } #emoji](http://qiita.com/tbpgr/items/123f072dd509abe6225b)|2015/02/28 21:29:17|0|
CSV ファイルの特定の列を取り出す

こんなファイルがあったとき

```
$ cat member.csv

id,name,age
1,taro,21
2,jiro,18
3,saburo,16
4,shiro,15
5,goro,12
```

id だけ取り出したいという場合がありますよね？
そんな時は cut コマンドと sed コマンドを使えば簡単に取り出せます。

まず cut します。

```
cut -d ',' -f 1 member.csv
```

cut コマンドはその名の通り文字列を切り出すコマンドです。それぞれのオプションの意味は、、、

`-d` は区切り文字の指定です。今回はカンマ区切りの入力ファイルなので、カンマを指定しています。何も指定しないとタブが区切り文字となります。

`-f` は何番目の文字列を取得するかを指定します。例えば id は一列目なので、`-f 1` となります。同じように name なら 2 、age なら 3 を指定すれば取得できます。



上記のコマンドを実行すると以下のようになります。

```
id
1
2
3
4
5
```

これで id が取り出せました。
しかし、今回取り出したいのは値だけなので、id という行は不要です。そこで、sed コマンドで消します。

sed コマンドは文字列の置換や削除を行うためのコマンドです。
今回は一行目を削除したいので、

```
cut -d ',' -f 1 member.csv | sed -e '1d'
```

とします。
`-e` はスクリプトを記述するためのオプションです。そして、`d` が削除を表します。一行目を削除したい場合は `1d` となります。一から五行目を削除したければ `1,5d` という様に指定します。

上のスクリプトを実行すると

```
1
2
3
4
5
```

無事 id だけを取り出せました。

#### 余談

ちなみに sed コマンドで文字列の置換を行い場合は以下の様にします。

```
sed -e 's/,/|/g' member.csv
```

`s/置換条件/置換文字/g` です。

```
id|name|age
1|taro|21
2|jiro|18
3|saburo|16
4|shiro|15
5|goro|12
```

こうなります。
emoji 用途辞書

# :musical_score: 概要
emoji 用途辞書
# <i class="fa fa-question-circle" style="font-size:1em;"></i> emoji 用途辞書 とは？
emoji 用途辞書とは、 [emoji](http://www.emoji-cheat-sheet.com/) を技術ドキュメントに使う場合の
emoji と 用途（対応する用語） の辞書です。

# <i class="fa fa-external-link" style="font-size:1em;"></i> 関連記事
* [GitHub の README の見出しに emoji を利用して見栄えが良く・・・なるといいですね](http://qiita.com/tbpgr/items/e748c24b87c28031d715)
* [Sublime Text | emoji を snippet 化して楽に入力する](http://qiita.com/tbpgr/items/b1ce7de3cc84a1548734)

## :book: emoji 用途辞書
|key|preview|キーワード|メモ|
|:--|:--|:--|:--|
|baby_chick + baby_chick + bird + baby_chick + baby_chick|:baby_chick::baby_chick::bird::baby_chick::baby_chick:|例外|1羽だけ異なる。|
|baby_chick|:baby_chick:|最初、最小|chicken とセットで使った場合|
|baby|:baby:|インスタンス|生み出された、というイメージから|
|book + end|:book::end:|読了|--|
|chart_with_downwards_trend|:chart_with_downwards_trend:|デメリット|下降グラフ|
|chart_with_upwards_trend|:chart_with_upwards_trend:|メリット|上昇グラフ|
|chicken|:chicken:|最後、最大|baby_chick とセットで使った場合|
|closed_book|:closed_book:|ルール|赤い本でルールブックを連想|
|cloud + arrow_down|:cloud::arrow_down:|ダウンロード|クラウドから落としているイメージ|
|cloud + arrow_up|:cloud::arrow_up:|アップロード|クラウドに上げているイメージ|
|coffee + flushed|:coffee::flushed:|invacation / 起動|寝てるところから起きるところをイメージ|
|crown|:crown:|達成|豪華な王冠で達成を連想|
|deciduous_tree|:deciduous_tree:|環境|木＝＞環境で連想|
|deciduous_tree|:deciduous_tree:|落葉樹|--|
|evergreen_tree|:evergreen_tree:|常緑樹|--|
|full_moon|:full_moon:|表示する|new_moon とセットで使った場合|
|hand|:hand:|XX の前に|「まぁ待て、その前に」的なイメージ|
|link|:link:|Bind / バインド|クリップでバインドするところからイメージ|
|memo|:memo:|メモ|--|
|memo|:memo:|補足|補足メモ|
|musical_note|:musical_note:|個別|musical_score と組み合わせて 全体・個別 、概要・詳細のイメージで|
|musical_note|:musical_note:|詳細|musical_score と組み合わせて 全体・個別 、概要・詳細のイメージで|
|musical_score|:musical_score:|全体|musical_note と組み合わせて 全体・個別 、概要・詳細のイメージで|
|musical_score|:musical_score:|概要|musical_note と組み合わせて 全体・個別 、概要・詳細のイメージで|
|new_moon|:new_moon:|隠す|full_moon とセットで使った場合|
|red_circle|:red_circle:|テストの失敗|--|
|red_circle|:red_circle:|バックアップ|録画ボタンのイメージから|
|red_circle|:red_circle:|録画|--|
|rocket|:rocket:|ロケット|--|
|rocket|:rocket:|早い|--|
|running|:running:|起動 / 起動中|実行中 => Running から|
|scream|:scream:|Problem|顔文字３種で KPT を表す|
|scroll|:scroll:|Usage|説明書っぽいものを読むイメージ|
|skull|:skull:|テンプレート|スケルトンから連想|
|smirk|:smirk:|Keep|顔文字３種で KPT を表す|
|sound + seat + wrench + car|:sound::seat::wrench::car:|カスタマイズ|自動車の部品を組み替えてカスタマイズ、のイメージ|
|speedboat|:speedboat:|はやい|ボート|
|thought_balloon|:thought_balloon:|イメージ|考えている様子|
|toilet|:toilet:|廃棄|トイレから流す。廃棄を連想|
|triumph|:triumph:|Try|顔文字３種で KPT を表す|
|two_women_holding_hands + two_men_holding_hands|:two_women_holding_hands: Contributing :two_men_holding_hands:|Contribute|多くの人が貢献している様子|
|walking|:walking:|起動からの停止|歩いてるので、停止ではないのだが、 running との対比で停止に見せる|

## :memo: メモ
* 量が多くなってきたら、この情報を 辞書 Web アプリなどに移行するかも

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [EMOJI CHEAT SHEET](http://www.emoji-cheat-sheet.com/)
Entity Frameworkで非公開のプロパティをテーブルに追加する方法

案外EntityTypeConfiguration\<T\>クラスの応用的な使い方について言及している日本語記事が少ないようなのでコードファースト布教のためここに記す。

### 導入

Entity Frameworkをコードファーストで使う場合、チュートリアルを見ながら作ったモデルクラスはたいていpublicなプロパティをいかにもな感じの命名規則にしたがって並べたものになるだろう。Entity Frameworkにはそれだけのコードでリレーションシップの解決を含めたデータベース定義を生成する能力がある。

しかし現実には徐々に不満が出てくるものだ。たとえばURLプロパティの型をUriクラスにする事はできない。[SQL Server Compact 3.5を使用している場合、string型のプロパティはデータベースではntext型](http://support.microsoft.com/kb/958478/ja)となり[クエリ内での使用が制限される](http://technet.microsoft.com/ja-jp/library/bb896140%28v=sql.110%29.aspx)。運悪くデータベースの命名規則がC#のそれと矛盾する場合、マッピングに不都合が出るかもしれない。このままではコードファーストなどORマッパーと割り切るにも微妙なプロトタイピング用の機能にすぎない。しかしEntity Frameworkにはデータベースのマッピング方法をコードで定義する手段も存在する。[Fluent API](http://msdn.microsoft.com/ja-jp/data/jj591617.aspx)だ。

### EntityTypeConfiguration\<T\>クラスとは
Fluent APIは適用したいDbContextの[OnModelCreatingメソッド](http://msdn.microsoft.com/ja-jp/library/system.data.entity.dbcontext.onmodelcreating%28v=vs.113%29.aspx)で使うものだが、このとき第一引数に渡されるDbModelBuilderオブジェクトには型ごとのモデル構成を格納するConfigurationsというプロパティがある。

モデル構成クラスはエンティティ型用のEntityTypeConfiguraion\<T\>と複合型用のComplexTypeConfiguration\<T\>がある。これらのモデル構成クラスも当然Fluent APIの一部で、DbModelBuilderと似たようなメソッドが使える。このクラスを継承したカスタム構成クラスを対象のクラスの内部に定義することで、非公開メンバをモデルに追加することが出来る。

これでURLプロパティの型をこんなふうにUriクラスにすることが可能だ。

```csharp
using System;
using System.Data.Entity.ModelConfiguration;

public class Bookmark {
	public virtual int ID { get; private set; }
	public virtual string Title { get; set; }
	public virtual string Description { get; set; }
	protected virtual string RawURL { get; set; }
	public Uri URL
	{
		get { return new Uri(RawURL); }
		set { RawURL = value.ToString(); }
	}

	public class Configuration : EntityTypeConfiguration<Bookmark> {
		public Configuration()
		{
			Property(entity => entity.ID);
			Property(entity => entity.Title).HasColumnType("nvarchar").HasMaxLength(1024);
			Property(entity => entity.Description);
			Property(entity => entity.RawURL).HasColumnName("URL");
			Ignore(entity => entity.URL);
			HasKey(entity => entity.ID);
		}
	}
}
```

### 備考

- この方法で追加されたURLプロパティがEntity Frameworkから無視(Ignore)されていることに注意されたし。このプロパティはクエリに使用できないので、多くの場合RawURLのゲッターのみをクエリのために公開したほうが実用的である。
- 最後にコンテキストクラスのOnModelCreatingメソッドを継承して、`modelBuilder.Configurations.Add(new Bookmark.Configuration());`を追加するのを忘れないこと。
- コードファーストは生成されるデータベースのスキーマの確認が面倒くさいと思うかもしれない。コードファーストマイグレーションを使用して移行コードを観察しよう。マイグレーションコードではインデックスの追加なども可能なのでチューニングにも有益だ。
- この程度でデータベースアプリを書く上での実用性のハードルを完全に越えられるわけではない。しかしSQL Server Compactでデスクトップアプリを作成するような用途ならコードファーストは十分あなたの期待に応える働きをできると思う。
さくらVPSのカスタムインストールは完了時に電源がOFFになるので「起動」してあげればよい

タイトルですべて言い切ってしまいました。

さくらVPSの「カスタムOSインストール機能」を使ってCentOS7をインストールしたところ、インストール完了後にVNCコンソールのウィンドウが"disconnected"と表示されてしまい、何もできない状態になりました。

あれおかしいな？と思って何回やりなおしても同じ現象に遭遇しました。

ぐぐって調べてみたら、公式マニュアルにちゃんと説明がありました。


[カスタムOSインストールガイド - CentOS 7｜さくらインターネット公式サポートサイト](https://help.sakura.ad.jp/app/answers/detail/a_id/2397/~/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0os%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89---centos-7)

> すべてのインストールが完了したら、仮想サーバは自動的に電源がOFFの状態になりますので、 
VPSコントロールパネルのホーム画面より起動を行ってください。

とのことです。

「起動」ボタンを押したらちゃんと起動しました。
そして下記のように sshでログインできました。


```
ssh -p 22 root@www0000xx.sakura.ne.jp
```
ansible_spec 機能追加


下の記事で紹介した`ansible_spec`をバージョンアップしました。
[Ansibleの設定ファイルを使ってServerspecを実行するテンプレート作成用Gem(ansible_spec)を作りました。](http://qiita.com/volanja/items/5e97432d6b231dbb31c1)


## 機能的な変更点
- Serverspec v2の対応
- InventoryParametersの対応(※)  
  - ansible_ssh_port
  - ansible_ssh_user
  - ansible_ssh_host
  - ansible_ssh_private_key_file
- [hostlist expressionsの対応](http://docs.ansible.com/intro_inventory.html#hosts-and-groups)
- Dynamic Inventoryの対応

※ 注意
ansibleでは`ansible_ssh_pass`と`ansible_sudo_pass`は[非推奨となっている](http://docs.ansible.com/intro_inventory.html#list-of-behavioral-inventory-parameters)ので、非対応です。
SSH鍵で認証を行ってください。Redhat系は`ssh-copy-id`コマンドがあるので、それほど手間ではないと思います。

## 内部的な変更点
### Rakefileの短縮
従来はコピペして使えるように、処理を全てRakefileにしていました。
しかしながら、機能の追加で内部処理のテストケースが増えたので、モジュール化とrspecのテスト追加を行いました。
結果として、Rakefileが短縮されています。

# 移行方法

```
# update
gem update ansible_spec
# delete old file
rm Rakefile
rm -rf spec
# run init
ansiblespec-init
```

# インベントリファイルのサンプル
v0.1でインベントリファイルの書式対応が増えました。


```hosts
[server]
# skip line(comment)
# normal
192.168.0.1
# use port 5309
192.168.0.3:5309
# use port 22
192.168.0.2 ansible_ssh_port=22
# use Private-key ~/.ssh/id_rsa
192.168.0.4 ansible_ssh_private_key_file=~/.ssh/id_rsa
# use user `git`
192.168.0.5 ansible_ssh_user=git
# use port 5555 & host 192.168.1.50
jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50

[web]
# www1.example.com to www99.example.com
www[1:99].example.com
# www01.example.com to www99.example.com
www[01:99].example.com

[databases]
# db-a.example.com to db-z.example.com
db-[a:z].example.com
# db-A.example.com to db-Z.example.com
db-[A:Z].example.com

# Multi Group. use server & databases
[parent:children]
server
databases
```
# Dynamic Inventoryを使う場合

実行権限のあるファイルを`.ansiblespec`に書きます。

```
--- 
- 
  playbook: site.yml
  inventory: load_host.sh   # 実行権限を付けておく。
```

以上
人間として、エンジニアとしてのキャリアの形成とスキル習得についてお勉強


未熟ながらに自分の成長課題を考えるために背伸びをして調べたのでメモ
調べて読んでみて、こういうフレームワークが継承されつつ、
もう少し簡単なモノに落とし込めて運用コストが小さくなったらうれしいなと思いました

## ライフキャリア

	www.mext.go.jp/component/a_menu/education/detail/__icsFiles/afieldfile/2012/05/21/1320712_04.pdf
	http://goo.gl/uqdJKo

		ライフキャリア、仕事よりも広い枠組みで、大学の教育課程を思い出させる。
		人間として、自己の能力分析や成長課題を考える指標・材料にはなると思う。
		付録的にライフ・キャリアの虹という一般男性のロールモデルもある。

		キャリア発達に関わる諸能力（4領域8能力）
			人間関係形成能力
				自他の理解能力
				コミュニケーション能力
			情報活用能力
				情報収集・探索能力
				職業理解能力
			将来設計能力
				役割把握・認識能力
				計画実行能力
			意思決定能力
				選択能力
				課題解決能力
		基礎的・汎用的能力
			人間関係形成・社会形成能力
			自己理解・自己管理能力
			課題対応能力
			キャリアプランニング能力

		関連情報資料
		
			www.nier.go.jp/shido/centerhp/kyouiku_career/siensiryou4-5.pdf
			http://goo.gl/eBqDu

			www.nier.go.jp/shido/centerhp/22career_shiryou/pdf/3-02.pdf
			http://goo.gl/CmDibH

			www.hiroshima-c.ed.jp/center/wp-content/uploads/kenkyu/choken/h25_kouki/kou19.pdf
			http://goo.gl/KSVi4z

## ITスキル標準

	IPA 独立行政法人 情報処理推進機構：ITスキル標準概要
	http://goo.gl/FWKUG

		www.ipa.go.jp/files/000027171.pdf
		http://goo.gl/5yWzo6

			IPA発行
			キャリア・スキルの標準化を目的としている。
			4ページに3つの人材類型と6つの人材像の分類表
			レベルについては7段階評価
			知識を3分野にわけている
				テクノロジ知識：コンピュータ言語やアルゴリズム、システム設計・開発
				マネジメント知識：開発は運用に関わる
				ストラテジ知識：ビジネス知識や製品知識あるいはコンプライアンスや関連法令知識や経営戦略知識等
			レベル4までの知識はBOKとして体系化してある
				ITスキル知識、組み込みスキル標準、情報システムユーザースキル標準
			情報処理技術者試験はこのフレームワークに準拠する
			17ページの図の３の支援部分を自力で補えるか。
			IT関連のキャリアがモデル化されている。
			モデルには、23ページのような相互関係がある
			3モデル
				タスクモデル
				人材モデル
				スキルモデル
			BOK
				26ページから最後まで

		www.deos.co.jp/itssken/h17/hp/giziroku/docs/kenkyukai-050920-2.pdf
		http://goo.gl/mRYNCj

			IPAのフレームワークの導入をしている高度な一例だと思う
			実績管理表など、実践的に参考になりそう

		共通キャリア・スキルフレームワークと関連資料のダウンロード：IPA 独立行政法人 情報処理推進機構
		http://goo.gl/Hes85W

			テンプレートシートのダウンロードなどがある
Org-mode で挿入する日時の曜日を英語表記にしたい

Homebrew の Emacs から Emacs Mac Port に乗り換えたら Org mode の `C-c C-s` で挿入する日付の曜日がなぜか日本語表記になってしまったので、英語曜日表記を強制するようにしました。

```el
(setq system-time-locale "C")
```
Windows 使いの Mac 初導入 | アプリケーションスイッチャ #win2mac

# <i class="fa fa-windows" style="font-size:1em;"></i> Windows 使いの <i class="fa fa-apple" style="font-size:1em;"></i> Mac 初導入 | :recycle: アプリケーションスイッチャ
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
:recycle: アプリケーションスイッチャ
## <i class="fa fa-question-circle" style="font-size:1em;"></i> アプリケーションスイッチャとは？
複数のアプリケーションを切り替える機能です。

## <i class="fa fa-windows" style="font-size:1em;"></i> Windows では
Alt + Tab で、切り替えを行います。
Alt + Shift + Tab で逆順で切り替えます。

## <i class="fa fa-apple" style="font-size:1em;"></i> Mac では
command + Tab で、切り替えを行います。
command + Shift + Tab で逆順で切り替えます。

## <i class="fa fa-plus-circle" style="font-size:1em;"></i> さらに
### :computer: アプリウインドウのプレビュー
Alt + Tab でアプリケーションスイッチャを選択中に 上下どちらかのカーソルで
アプリウインドウのプレビューを行います。
再度切り替えを行うには command + Tab を実行します。

### :baby_chick: <i class="fa fa-arrow-right" style="font-size:1em;"></i> :chicken: 最小化したウインドウを戻す
command + tab の最中に切り替え対象のアプリケーションが最小化されていた場合、
option を押して command を話すと元の大きさに戻る。

### :new_moon: / :full_moon: 隠す
command + tab の最中に
H キーウインドウを隠し、再度 H キーで再表示します。
`s3_website push`がs3_website.jarのダウンロード時にSSL証明書エラーになる問題とその解決策


## 問題

`s3_website push` を実行できなくなった。

```
[info] Downloading https://github.com/laurilehmijoki/s3_website/releases/download/v2.7.3/s3_website.jar into /home/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/s3_website-2.7.3.jar
```

と表示される「s3_website.jarダウンロード処理」の際に、

```
SSL_connect returned=1 errno=0 state=SSLv3 read serv
er certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
```

というエラーが出て異常終了するようになってしまった。

要するにOpenSSLで証明書エラーが生じている。

## 解決策

個人的に「最も簡単」と感じる解決策が、[GitHub上のs3_websiteのissue #142のコメント](https://github.com/laurilehmijoki/s3_website/issues/142#issuecomment-68676380)に書かれていた。

具体的には、ダウンロードエラーになるs3_website.jarをブラウザでダウンロードして、gemのディレクトリ (~/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/s3_website-2.7.3) に設置した。

これで `s3_website push` できるようになった。

## 代案

ウェブ検索すれば、いろいろな代案が紹介されている。

今回紹介した方法には、「gemをupdateする度にやらなければならない」という欠点がある。本来自動で行われべき処理を手作業で代替しているのだから当然だが。

より「真っ当な解決策」としては、

- OpenSSLが利用する証明書を正しく設定する
- 証明書が古ければ更新する

などが挙げられる。
「File Managerが起動中です」が大量発生したときの対処法

# 現象
* CentOS(6.5)を久しぶりに起動したら「File Managerが起動中です」というプロセスがべらぼ～に出始めたのです
* なんだこれとググってみると以下のコマンド打ってみたらヒントがあるよと書いてあった
 * ```$ sudo tail -f /var/log/Xorg.0.log```
* 見たけどdisconnectedとでてただけで特にこんなの試してみてねとかいうアドバイスはなかった
* そして、これのせいか動作が妙に重くなっている気がした

# 対応
* 以下を実行

```
$ xauth list
localhost.localdomain/unix:10  MIT-MAGIC-COOKIE-1  07f9514232522d197d16268953be1070
$ xauth remove localhost.localdomain/unix:10
$ xauth list #表示されたくなった(消えたらしい)
```

* 「File Managerが起動中です」が一気になくなった！

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
いまさら始めるgitbook インストール編

最近いろいろと話題となっている[gitbook](https://github.com/GitbookIO/gitbook)を始めるための準備とかのまとめです。

# gitbookとは
markdownで書いたファイルをhtml/pdf/epub/mobi[^1]に変換して公開するためのツールです。Excel仕様書のようなにVer管理が難しいアレげなツールに比べmarkdownで表記されたファイルなのでVer管理も簡単に行うことができます。
また[gitbook.com](https://gitbook.com/)というgitbookのホスティングを行うサービスもあり、ここでは自分で作成したgitbookの販売も可能です。

# 必要なもの
- node.js
    - nvmなりでinstallしておくと便利
- [calibre](http://calibre-ebook.com/) (option)
    - html変換だけの場合は必要ありません
    - pdf/epub/mobi変換を行うときに必要となります

## 今回利用するもの
- mac OSX Yosemite
- node.js
    - 0.11.13
    - nvm経由でinstall
- calibre

# gitbookをglobal installする場合
1. node.jsをインストール
    - [nvm](https://github.com/creationix/nvm#install-script)をインストール
    - ```nvm install v0.11.13 ``` でインストール
2. gitbookをインストール
    - ```npm install -g gitbook```
3. calibreをインストール
    - pdf/epub/mobi変換を利用しない場合はしなくて良い
    - [ダウンロードサイト](http://calibre-ebook.com/download)からバイナリをダウンロードしてインストール
    - インストール後にPATHを通しておく
        - ```export PATH=/Applications/calibre.app/Contents/MacOS:$PATH ```

# gitbookをlocal installする場合
1. 適当にディレクトリを作成
    - ```mkdir gitbook_test```
2. ディレクトリに移動してnpm initしてpackage.jsonを作成
    - ``` cd gitbook_test && npm init ```
3. gitbookをインストール
    - ``` npm install --save gitbook ```
4. calibreのインストール
    - 上と一緒

gitbookをlocal installした場合にgitbookコマンドを実行する場合は```node_modules/.bin/gitbook```で実行します。git管理するときはnode_modules以下は除外するように設定することが必要です。

# まとめ
特に問題なければglobal installしたほうが楽。次はgitbookコマンドについてまとめていきます。

[^1]: kindleとかで読める電子書籍フォーマット
Xcode6でStoryboardを使わずにObjective-CでiOSアプリを開発する #1

## プロジェクトを作る
適当に作ったら、Main Interfaceを空欄にする（もともと"Main"が入ってる）
![スクリーンショット 2015-01-12 20.00.11.png](https://qiita-image-store.s3.amazonaws.com/0/65686/aa3c682c-7186-0157-a47c-48360f7d7fa4.png)

## コードを変える

作成されたAppDelegete.mのapplicationメソッドを以下のように変更する

```ruby:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    UIViewController *viewController = [[UIViewController alloc] init];
    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
```

以上で環境は整う。実行すると、iOS Simulatorが立ち上がって真っ白な画面が出てくるはず。
SeleniumIDE で　イメージが壊れていないか確認する

# はじめに
seleniumを使ったテストでは見た目のテストは基本的に対象外です。
ピクセル単位でずれている、とか　色合いが違う　といったものは人の目視で確認するしか判断できないですからね、

が、Seleniumのユーザーグループに興味深い情報が載っていたので試してみました。

載っていた元はこちら
http://elementalselenium.com/tips/67-broken-images


元記事はRubyで記述されているので、これをSeleniumIDEを使ってやる前提で。


## プロキシを使用

プロキシを立ててという時点でSeleniumIDEだけでチェックできないので断念


## DOMで調べる
DOMのプロパティを根拠にイメージが壊れていないかをチェック しています

```lang:html
<tr>
	<td>getEval</td>
	<td>
    storedVars.imgck= function(xpath){
    var elem = selenium.browserbot.findElement(xpath);
    return elem.complete && typeof elem.naturalWidth != 'undefined( && elem.naturalWidth < 0 }
        </td>
	<td></td>
</tr>
<tr>
	<td>open</td>
	<td>http://www.yahoo.co.jp/</td>
	<td></td>
</tr>
<tr>
	<td>assertEval</td>
	<td>storedVars.imgck('//div/div[1]/div[1]/h1/a/img');</td>
	<td>true</td>
</tr>
```

なるほど、と言う方法ですね。

## HTTPで調べる
もう一つはHTTPのレスポンスコードを根拠にチェックしています

```lang:html
<tr>
	<td>getEval</td>
	<td>
	storedVars.ajax= function(url){
		var req = new Ajax.Request(url, {method : 'get',asynchronous:false,onComplete : function() { }} ) ;
		return req.transport.status;
	}
	</td>
	<td></td>
</tr>
<tr>
	<td>open</td>
	<td>http://www.yahoo.co.jp/</td>
	<td></td>
</tr>
<tr>
	<td>storeAttribute</td>
	<td>css=img[alt='Yahoo! JAPAN']@src</td>
	<td>imgsrcurl</td>
</tr>
<tr>
	<td>assertEval</td>
	<td>storedVars.ajax(storedVars.imgsrcurl);</td>
	<td>200</td>
</tr>
```
実際には　ページを表示したタイミングとずれてチェックしていることになりますね。


## おわりに
意図したイメージかという観点ではなくあくまで表示されていることを間接的にチェックというところがミソなのかもしれませんね。
YubiKeyでTOTP

ハードウェアが時計に該当するものを持たないため、YubiKey単体でTOTPに基づいた入力を得ることは出来ない。ただ、OSから時間を受け取ることでTOTPも一応発行できる。言い換えるとGoogle Authenticatorアプリ等なしにGoogle2段階認証ができる。

ただし、YubiKeyハードウェアについているボタンからの操作でTOTPを生成することは出来るわけではない。クライアントソフトをOS上で起動して時刻をそのソフトから送信することで数値を得る。ユーザはクライアントソフト経由でトークンを得るわけで、HOTPの時と比べると利便性は大分落ちると思う。

Windows向けには、公式のクライアントソフトが存在し、システムに常駐させられる。(Personalization Tool等と異なり)、このツール自体は他のプラットフォームで直接動作するものではない。
https://www.yubico.com/applications/internet-services/gmail/

Mac上のVirtual BoxでWindows 8.1を起動した状態でVM内で使うことができることを確認した。値は別途QRコード経由でGoogle Authenticatorにインストールしたアプリが生成するものと同じため、正しく動作しているように見える。

![スクリーンショット 2015-01-12 19.38.11.png](https://qiita-image-store.s3.amazonaws.com/0/14365/855ab128-1905-d1f6-5879-7f2ee0df1110.png)

![スクリーンショット 2015-01-12 19.42.23.png](https://qiita-image-store.s3.amazonaws.com/0/14365/cf5cc8fb-c154-dcf8-639b-6887d07806f3.png)

![スクリーンショット 2015-01-12 19.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/14365/7e68dd85-7b6a-99bf-cb12-05df606967bb.png)

常駐ソフトではないが、Yubico自らPythonスクリプトを公開しているため、Linux等でもこれに似たフローを行うことは出来る。

https://github.com/Yubico/python-yubico

yubico-cやyubikey-personalizationといったプロジェクト(もしくは関連パッケージ)を利用することで別途初期化する必要はあるだろう。Windows版の常駐クライアントはTOTPフローのための初期化ツールも内蔵しており(スクリーンショット参照)、YubiKey PersonalizationのGUIクライアントを必要としない。
retryable gem 触ってみた



## 例外処理書く時あるよね

クローラを書いていると、「Webページから情報を取得する」動作を書くわけだが、ここは相手サーバの都合で様々なエラーを吐く。こんなときしばしば「n回トライしてだめだったら次いくよ」という例外処理を書く。

```ruby
url_array.each do |url|
  counter = 0
  upto = 5

  begin
    html = open(url, &:read) # サーバ側の問題で、例外を吐く可能性がある部分
  rescue
    counter += 1
    retry if counter < upto
    next
  end

  # nokogiri = Nokogiri::HTML(html)
  # ...
end
```

retryable gemで簡潔な記述にすることができる。



## Example

```ruby
require "retryable"

# 例1) 最も単純な例

# ブロック引数はそれぞれ retries: 現在再試行回数(0〜n-1), 
# exception: 例外オブジェクト ( retries == 0 のとき exception == nil )

# 引数なしのとき、デフォルトのオプション
# （「全ての例外を捕まえる」「試行回数2回まで」「sleep 1秒」等）で動作
Retryable.retryable do |retries, exception|
  puts "run crazy code"
  1/0
end

# 例2) 「ZeroDivisionErrorだけを捕まえる」「試行回数5回まで」
Retryable.retryable(:on => [ ZeroDivisionError ], :tries => 5) do |retries, exception|
  # 例外による再試行状態にあるとき（retries > 0）、メッセージを出力
  puts "try #{retries} failed with exception: #{exception}" if retries > 0
  1/0
end
```

冒頭のコードと同じことをやりたければ、こう書けば良い。
ブロックの最後の値が返り値になる。

```ruby
# 例3) 5回試行しても失敗するような場合は次のループ処理に移る
url_array.each do |url|
  html = Retryable.retryable(:tries => 6) do |r, e|
    next if r == 5
    open(url, &:read)
  end

  # nokogiri = Nokogiri::HTML(html)
  # ...
end
```

## 参考
- [Ruby - retryable gemでretry回数を指定したrescueを簡単に - Qiita
](http://qiita.com/riocampos/items/b2bf78c5e37280a1f8ff)
- [File: README — Documentation for retryable (1.3.5)](
http://www.rubydoc.info/gems/retryable/1.3.5/frames)
mac で perl のワンライナー #2


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4


##### 初っ端から
題名に偽りあり。ruby のワンライナーがメインです、、、

## google の検索をデフォルトブラウザで
* うちの地域の災害通知メールが、マップへのリンクも何も無い状態で届いて不便でしかたない
* 都市名無しで、マップを検索させると、長崎とか出ちゃう
* google の検索で日本語が邪魔な時が多々ある
* safari で開くのは好ましくない

と言うことで、数年前に作成したサービスメニュー
同じ様なものは、いくらでも転がっている

日本語以外、 map 、都市名 + map 
三種作るが、シェルスクリプト部分以外は共通なので、纏めて

### 最初の画面
Automator で「サービス」を新規作成

### ワークフローのウィンドウ
（なにも変えなくて良いと思う）
* テキストを受けとる
* すべてのアプリケーションを対象に

### アクションの追加

「シェルスクリプトを実行」アクションを
* シェル: `/bin/sh`
* 入力の引き渡し: stdin へ

に設定し追加

### スクリプトの記入

以下の三種類を作成

```bash:日本語抜きで検索
open "http://www.google.com/search?q=`ruby -rcgi -e 'print CGI.escape($<.read.chomp)'`&lr=-lang_ja"
```

```bash:mapを開く
open "https://maps.google.co.jp/maps?q=`ruby -rcgi -e 'print CGI.escape($<.read.chomp)'`"
```

```bash:東京都のmapを開く
open "https://maps.google.co.jp/maps?q=%E6%9D%B1%E4%BA%AC%E9%83%BD`ruby -rcgi -e 'print  CGI.escape( $<.read.chomp)'`"
```
実際に「東京都」で利用してるわけでは無い。
ruby ワンライナー前の URL エスケープ部分を好みの都市名で置き換えれば良い

```bash:
 $ ruby -rcgi -e 'print CGI.escape("長万部")' | pbcopy 
 ```

### 保存

`~/Library/Services` に、それぞれ任意の名前で保存

### 使い方
文字列選択して、コンテキストメニューから、呼び出せ

## 短縮 URL を確認する
短縮 URL を貼り付けてくるメールの URL を展開したいが、わざわざそのために解析ウェブページを開くのも、、、
てな訳で、これもサービスに。

### 最初の画面
Automator で「サービス」を新規作成

### ワークフローのウィンドウ
（なにも変えなくて良いと思う）
* テキストを受けとる
* すべてのアプリケーションを対象に

### アクションの追加

「シェルスクリプトを実行」アクションを
* シェル: `/bin/sh`
* 入力の引き渡し: 引数として

に設定し追加

### スクリプトの記入

```bash:短縮URLを確認する
/PATH/TO/wget --max-redirect=0  --spider -qS $@ 2>&1 | perl -lne 'print $1 if /Location:\s+(.*?)$/i'  
```

`curl` では力不足なので `wget` を使ってます。
`wget` は有名なので、homebrew や MacPorts にあるでしょう


### アクションの追加
「クリップボードにコピー」を追加

### 保存

`~/Library/Services` に任意の名前で保存

### 使い方

文字列選択して以下略

## wget ソースから
~/cmd 以下へのインストール

一応のメモ 
[配布元](http://ftp.gnu.org/gnu/wget/)より、wget-1.16.tar.gzをダウンロード

```bash:
$ export PERL5OPT=''

$ mv ~/Download/wget-1.16.tar.gz .
$ tar xzf wget-1.16.tar.gz
$ ./configure --prefix=/Users/XXX/cmd/ --with-ssl=openssl
$ make
$ make install
$ cd ../
$ rm -rf wget-1.16
```

* make 途中で、 `use strict; use warnings;` が通らないスクリプトを使うコマンドは星の数ほどあります、、、
* ああ、別に短縮 URL の確認のみのために、インストールした訳じゃありません。
perl で項目数が一定しない場合の多段ソート


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4




## GRT

例えば、[ここ](http://journal.frontiersin.org/Journal/10.3389/fmicb.2012.00441/full)の TABLE A1 の一番右のセルみたいの。
データからの生物分類は、全て、つまり種に至るまできっちり類推されてくれれば良いのですが、「網まではわかるが後は判らん！」とか、「分類でけんかった」とか、そーいうのがざらに出ます。で、それらをソートするののメモ。

一言で言えば、「[guttman rosler transform](http://www.sysarch.com/Perl/sort_paper.html) を使う。」だけなんですが。

で、文字列だけのソートだと、有難味が薄いので、数値と文字列とが混った可変長セルのソートを

### まずは、例用のテーブル作り。

```bash:
$ perl -le 'my %h = map { $_, 1 } <{a,b,c,,},{1,2,3,10,7,,},{a,b,c,,},{1,2,3,10,20,,}> ; print for keys %h' > example.txt
```

hash 出力に頼って、ランダム擬きの表を作成しました。例なので CSV です。

```bash:example.txt
c,7,,1
a,2,a,3
c,2,a,20
,,a,3
a,10,a,10
b,10,c,2
b,7,,3
c,10,b,2
c,,b,20
a,2,,
```

### コンセプト
では、これをソート
* 優先順位は、左のカラムから
* 昇順
* 大文字小文字は区別
* 数字は当然、数値ソート
* 今回は小数点に関しては考慮してない
* 空欄は最後に
* 文字列は、可変長想定

### コード

```perl:GRT.pl
#!/usr/bin/env perl
use warnings;
use strict;
my @arr ;

LINE:
while ( <> ){
    chomp;
    my @col = split /,/, $_ , 4 ;  #1
    my $sort_str = q{} ;

    for my $i ( 0 .. $#col ){      #2
        $sort_str 
            .= $i % 2  == 0 
            ?  pack q{A30}, $col[$i] || '|'  #3 
            :  pack q{L*},  $col[$i] || 100  #4
            ;
    }
    push @arr, [ $_, $sort_str ];
}

printf "%s\n",  $_->[0] for sort { $a->[1] cmp $b->[1] } @arr; #5
```

これを普通にコマンドラインから実行するだけ

```bash:
$ perl GRT.pl example.txt
```

##### #1 CSV ですので当然、`/,/` で `split`
* LIMIT は重要。コレを付け忘れただけでドツボに嵌る
* LIMIT 無しだと、後ろの空カラムを無視する

「`split` 前に `chomp` しなきゃいいじゃん」
「アアソウデスネ」

##### #2 各カラムの内容を舐めます。
* index で回す事にしたのは、今回の例の条件分岐の為 

##### #3 ソート文字列の作成。
* 空白は最後にもって来たいので `|` （ascii 124）を代替文字として pack
    * 例えば、"Unclassified" を最後から二番目にソートしたいなら、 `{` （ascii 123）を代替文字に
* `A*` ではなく `A30` にしたのは以下のコード参照
	* 運用時には文字列長に留意が必要


```bash:
$ perl -le 'my @a = ( [qw(a z)], [qw(ab a)] )  ; print $_->[0] for sort { $a->[1] cmp $b->[1] } map{ [ ( join "\t", @{$_} ), ( join "", map { pack q{A*}, $_ } @{$_} )] }  @a ;'
ab      a
a       z
```

##### #4 ソート文字列の作成（数値）
`Q` の方が良いのかも。

>整数 pack コード sSlLqQ のそれぞれは、どこでプログラムが 実行されたとしても固定長のバイト列となります
[引用元](http://perldoc.jp/docs/perl/5.20.1/perlpacktut.pod)

右詰め 0 でフィルされた固定長数値ならば、#3 のコードに渡してしまえば良いが、往々にしてソートの事を考えて数値入力はされていない。ファイル名とかファイル名とか、ファイル名とか、、、

##### #5 ソートの実行
二次元配列の '[X][1]' に入れた、ソート文字列を、文字列比較するだけ。
`sort` ブロックに `or` を重ねるのを想像したら、どれだけ楽だか。


## 生物の階級で。
それでは、最初のサイトで見た様な、生物の階級による表のソートをした場合

* 中間的分類を除いて domain から 7 階級。文字列のみを期待。
* 'Unclassified' は一回のみ、 domain に表示

のケースを想定してコードを書く。

なお最初に書いたコードは確実にトラブるコードだった、、、
ので、ついでに、より GRT っぽくリライト

```bash:
$ perl -F';\s*' -Mvars='@a' -lane 'push @a, join q{}, (( map{ pack q{A30}, /^$/ ? q{|} : /^Unclassified$/ ? q{\{} : $_ } (@F, (q{}) x 6)[0 .. 6 ]), $_ )}{ print substr $_, 210 for sort @a ' SOMETHING.txt
```
* `'; '` は空白が入ってる。入ってないものがあるかも知れないので `';\s*'` の方が適切
* ~~`-F'; ' -a` では `split` のリミット指定が出来ないから、 `(@F, (q{}) x 6)[0 .. 6 ]` で補わなきゃならない~~
* 最初は、`-a` 使わず `split /; /, $_, 7` で書いていたが `split` 失敗時（区切り文字が出現しない）に、要素数 1 のリストになるので、 `(@F, (q{}) x 6)[0 .. 6 ]` の方にせざるを得ない
プログラミング(JAVA)でのコールするの意味についての質問です

プログラミング(JAVA)でのコールするの意味について

プログラミングについての質問です。
javaの初心者なのですが、
よくコールするという言葉を先輩方から聞きます。
これはどういう意味 なのでしょうか？

状況としてはjunitでテストしてるときに「メソッドをコールする」のような使い方をしていたと思います。わかる方がいらっしゃればお答えいただけると幸いです。
GNU Octaveをコマンドラインでファイルから読み込むときにグラフを出す

GNU Octaveをコマンドラインで使うときに、

```
$ octave hoge.m
```

とすると、`hoge.m`内にplot等のグラフ描画命令があると一応グラフのウィンドウが出来るが、一瞬で消えてしまう。

これを解決するには

```
$ octave --persist hoge.m
```

とするか、`hoge.m`の末尾に`pause`を追記すれば、グラフウィンドウが出るところでプログラムが止まる

グラフウィンドウが出た後にインタラクティブモードになるので前者のほうがオススメ
Androidプロジェクトの作成から,Gitのインストール,Githubとの連携までの環境構築手順

#はじめに
ここではGitのインストール,Androidプロジェクトの作成,Githubに上げるまでの環境構築をご紹介します。

##Gitのインストール
まずはサクッとGitのインストール

```bash:shell
$ sudo yum install git
```
##Androidプロジェクト作成
次に開発していくプロジェクトを作成
下記サイトを参考にさせて頂きました。有難うございます。
http://techacademy.jp/magazine/3257

##Gitの初期化
先ほど作成したAndroidプロジェクトのルートディレクトリにて、下記コマンドでGitの初期化

```bash:shell
cd ルートディレクトリ
$ git init
```

##gitignoreの作成
不要なファイル、ディレクトリ省くために.gitignoreを作成

```bash:shell
$ vi .gitignore
```
下記をコピー・アンド・ペースト

```vim:.gitignore
#built application filess
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties

# eclipse settings
.classpath
.project
.settings/

#Mac cache
.DS_Store
```


## ファースト・コミット
不要なファイルを省いたので安心してadd,commit

```bash:shell
$ git add .
$ git commit -m 'first commit'
```

## githubにてレポジトリ作成
ここからはブラウザ上での作業になります。
下記リンクからgithubにアクセス
https://github.com/


①githubアカウント作成
下記を参考にさせて頂きました。有難うございます。
http://fnya.cocolog-nifty.com/blog/2014/01/github-185e.html

②レポジトリ新規作成
メニューバーの「＋」→「New repository」からレポジトリの新規作成

![Shoichi-Kakizaki.png](https://qiita-image-store.s3.amazonaws.com/0/49347/e3b0b501-4b51-6c4e-7c5c-d0790f36d4e6.png)


③ レポジトリ名決定
レポジトリ名を決めてレポジトリの作成

![Create_a_New_Repository.png](https://qiita-image-store.s3.amazonaws.com/0/49347/a9292690-94f8-3eb3-d744-566d19264ecd.png)


## レポジトリにプッシュ
ターミナルに戻り、下記コマンドで先ほどgithubに作成したリポジトリにプッシュ

```bash:shell
$ git remote add origin git@github.com:username/ProjectName.git
$ git push origin master

#エラーが出る場合は下記で試してください
# $ git push -f origin master
```

以上です。これで安心してAndroidアプリが開発出来そうです
【Andorid】アプリアイコンは「mipmap-」というリソースディレクトリに入れるのがいいらしい

Androidのアプリアイコンは、リソースディレクトリ(resディレクトリ)の「drawable-xhdpi」とか「drawable-xxhdpi」に入れるのが当たり前だと思ってた。

しかし、どうやら最近では**「mipmap-」**というリソースディレクトリに入れるのを推奨しているらしい。

「mipmap-xhdpi」とか「mipmap-xxhdpi」とかを作って、その中にアプリアイコンを配置しろってことらしい。

以下の公式ブログの書かれていた。

**[アプリを Nexus 6 と Nexus 9 に備えましょう](http://googledevjp.blogspot.jp/2014/11/nexus-6-nexus-9.html)**


## mipmapが実際に使われている例

ちなみに、2014年のGoogle IOのリソースディレクトリを確認してみた。

確かに「mipmap-hdpi」から「mipmap-xxxhdpi」までのリソースディレクトリが作成されていて、その中にアプリアイコンが配置されている。

**[iosched - res](https://github.com/google/iosched/tree/master/android/src/main/res:embed)**


ここまで確認していなかったので、全く気づかなかった。。。

## mipmapディレクトリの注意点?

mipmapディレクトリについて過去にG+で質問されているものがあった。

この回答がとても参考になる。

**https://plus.google.com/109167540865998371620/posts/U9TLZ65yJ6S**

注意点として、以下のようなことが書かれている。

> ただ、mipmap- フォルダーは Android 4.0 以降で追加されたため

> 古い端末も対象とするアプリでは同じアイコンを drawable- フォルダーにも入れておく必要があります。﻿

mipmapディレクトリとdrawableディレクトリの両方にアプリアイコンを配置する必要はあるみたい。

Android4.3以上の対象にしたアプリ等であればmipmapディレクトリだけでも良さそうな感じがします。

## アプリアイコンだけに限った話ではなさそう

mipmapディレクトリは別にアプリアイコンだけに限った話ではなさそう。

Android4.3で追加されたもの？らしく、APIの説明がちょっとのっている。

**https://developer.android.com/about/versions/android-4.3.html#MipMap**

G+の回答でも書かれていたとおり、アニメーション等の拡大によりmipmapディレクトリに配置したリソースが使用されるような実装ができるのではないかと想定する。

どうやら公式のランチャーアプリでそんなような実装をしてるらしいので、コードを読んでみるといいかもしれない。

時間がある時に、実装とコードを含め確認してみたい。
vlanが作成出来ない時はvtp modeを変更すればよい

* [VLAN - ステータス確認方法](http://www.infraexpert.com/study/vlanz4.html)

```bash:
#show vtp stat
...
VTP Operating Mode              : Client
...
```

## vtp modeをserverに変更

```bash:serverモードに変更
(config)#vtp mode server
Setting device to VTP SERVER mode
```

```bash:vlan作成
(config)#interface FastEthernet1/0/1
(config-if)#switchport access vlan 123
```

## vtp modeをclientに戻す

```bash:clientモードに変更
(config)#vtp mode client
```
vvvv事始め

年末に別件の検索をしているときに偶然に発見した[vvvv](http://vvvv.org/)にポテンシャルを感じたのでやってみる。

vvvvというのはドイツ製のProcessingとかopenFrameworksなどのメディアアート方面のツールなのだけど、ノードのグラフでビジュアルにプログラムを構築していくという特徴をもっていてCG方面に類似品はないアプリです(音響方面にはある)。
![teapot.png](https://qiita-image-store.s3.amazonaws.com/0/59664/9f677857-a063-02f6-9763-275d45a45ea1.png)
こういう感じ。

コンパイル+実行というのではなく実行状態でどんどんエディットしていくツールなので不特定多数に完成品を配布するゲームのような用途ではなく、実験的なものをプロトタイピングしたりライブ的な即興性が求められる時に向いている。シェーダーの修行にもよさそう。

# インストール
<http://vvvv.org/downloads>からvvvvとaddonsをダウンロードする。最初は両方32bitにしておくのがよいのではないか。まずインストール予定のディレクトリにvvvvの方のvvvv_45beta33.3_x86.zipを解凍する。
次にaddons_45beta33.3_x86.zipをvvvvの中に解凍する。
ディレクトリ構成はこうなる。
```
vvvv
  ├ addonpack
  ├ girlpower
  ├ lib
  └ licences
```
ディレクトリ構成と後から追加する機能の配置については、<http://vvvv.org/documentation/nodes-and-paths>に書いてある。

setup.exeを実行する。setup.exeを終わる。

start_with_demo.batを実行してみる。
![demo.png](https://qiita-image-store.s3.amazonaws.com/0/59664/f61d6498-83cc-1ea0-b934-a2c35d55b977.png)
この画面が出てきたら動いている。
ちなみにxボタンが無いので、c-wとかalt+F4で終了するべし。
以上でインストール完了。

この時点でvvvvディレクトリをgit管理にしておくとよいかもしれぬ。
packsとcontributionsというディレクトリを足して機能をどんどん追加していくことになるのだがぐちゃぐちゃになりうる。

特徴を列挙してみる。

* 本体はオープンじゃないがノードはオープンソースでSDKがある
* UIが独特なので慣れが必要。ある意味Blender的。中クリックと右クリックをよく使う。ドイツ語圏は右クリックが好きなのか。vvvvookを2周くらい読んだらやっと慣れた
* さくさく線が引けるようになって人様のグラフのスクリーンショットから情報を読めるようになると楽しくなってくるのではないか
* D3D9がメイン。(この手のツールはOpenGLが主流でMacが多いのだが、Windows専用でDirectX。D3D11機能も最近出た)
* Spreadという機能がパーティクルと親和性が高くてよさげ
* CSharpで拡張する。ノードにcsprojが含まれていたりする
* DirectShow完備
* OpenCVもあるよ
* 生hlslではなくEffectの方。Techniqueとか
* XとColladaは読めるらしい。Assimpを組み込んでいるぽい
* MidiとかKinectとかleap motionなどのデバイスのサポートが豊富(Kinect2とかOculusのノードを作っている人もいた)
* OSCとか通信がある
* ODEとかBulletもある
* アニメーション機能がある
* グラフを保存するv4pはxml。バージョン管理できる

しばらくこいつで遊びながら備忘録を兼ねて3Dプログラマ的な観点からメモを残していきたい。
CentOSにSymfony2をインストールしてみる

環境
CentOS:6.6
Symfony:2.3
PHP:5.5

※PHP5.3だとComposerのプロジェクト作成で失敗したのでPHP5.5を使用しました。
# Composerのインストール
Composerをつかってプロジェクトを作成するので、まずはComposerのインストールをします。

```
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
```

# プロジェクトの作成
Composerのインストールが完了したらプロジェクトを作成します。
　※ path/ の部分をプロジェクト名に変更
`composer create-project symfony/framework-standard-edition path/ "2.3.*"`

プロジェクトの作成途中に、DB等の設定ががいろいろ聞かれるので設定します。

```
database_driver (pdo_mysql):
database_host (127.0.0.1):
database_port (null):
database_name (symfony): ddss
database_user (root): ddss
database_password (null): ddss
mailer_transport (smtp):
mailer_host (127.0.0.1):
mailer_user (null):
mailer_password (null):
locale (en):
secret (ThisTokenIsNotSoSecretChangeIt):
Clearing the cache for the dev environment with debug true
Installing assets using the hard copy option
Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework
Installing assets for Acme\DemoBundle into web/bundles/acmedemo
Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution
```
UML入門


## UMLの概要
#### UMLとは
* UML (Unified Modeling Language)
* グラフィカルな記法の一種 (モデリング言語)
* オブジェクト指向スタイルを使って構成するシステムの記述や設計において特に便利

#### UMLの使い方
* スケッチ、設計図面、プログラミング言語という3種類の局面のうち、スケッチのときに便利
* スケッチはフォワードエンジニアリングとリバースエンジニアリングに使用できる
	* フォワードエンジニアリング：コードを記述する前にUMLダイアグラムを作成する
	* リバースエンジニアリング：既存コードを理解する補助手段としてコードからUMLダイアグラムを作成する
* スケッチをする目的は、アイデアを他のメンバーに伝えること

※ UMLの使用方法については様々な立場があるものの、本記事ではUMLをスケッチとして利用する
※ バージョンはUML2

#### UMLのなんのダイアグラムを使うか
* UMLにはたくさんのダイアグラムがあるが、そのうち自分のプロジェクトに適していると思ったものを使う
* 最も一般的なダイアグラムは、クラス図とシーケンス図であり、本記事で紹介するのは左記2図

## 開発プロセス
#### UMLを開発プロセスに適合させる
##### 要求分析
|使用するUML技法|概要|
|:--|:--|
|ユースケース|ユーザーとシステムの相互作用を記述する|
|概念的観点から書かれたクラス図|ドメインの厳密な用語体系を構築するのに便利|
|アクティビティ図|組織のワークフローを示し、ソフトウェアとユーザーアクティビティの対話方法を示す|
|状態図|複雑なライフサイクルが概念の中に含まれている場合に使用すると便利|

##### 設計
|使用するUML技法|概要|
|:--|:--|
|ソフトウェア的観点から見たクラス図|ソフトウェア内のクラスとその相互関係を示す|
|一般的なシナリオのシーケンス図|最も重要なシナリオをユースケースから選び出し、ソフトウェアの動作を把握する|
|パッケージ図|ソフトウェアの大規模な構造を示す|
|クラスの状態図|複雑に変化するクラスの状態を示す|
|配置図|ソフトウェアの物理的なレイアウトを示す|

## クラス図
図は[Addison Wesley - UML Distilled, 3rd Ed](http://www.saeedsh.com/resources/UML%20Distilled%203rd%20Ed.pdf)より引用しています。

#### クラス
![class.png](https://qiita-image-store.s3.amazonaws.com/0/56499/0d12dbd4-b34e-218b-b0eb-1b83d50b8103.png "class.png")

#### 関連
![relation.png](https://qiita-image-store.s3.amazonaws.com/0/56499/20724aec-008c-7379-ec58-032aa9eee383.png "relation.png")

#### 誘導可能性 (関連の方向性)
![navigability.png](https://qiita-image-store.s3.amazonaws.com/0/56499/a8effbb4-a601-a773-143c-ac91d7cb86b6.png "navigability.png")


#### 多重度
![multiplicates.png](https://qiita-image-store.s3.amazonaws.com/0/56499/e25e12fa-8d1a-af04-a141-5831b5ba40bd.png "multiplicates.png")

#### 汎化
![generalization.png](https://qiita-image-store.s3.amazonaws.com/0/56499/5b97ef49-b909-22e7-ca80-16dda67557a2.png "generalization.png")

#### ノート
![note.png](https://qiita-image-store.s3.amazonaws.com/0/56499/2b1ac6e8-c7c0-c422-8f90-faaffd80a939.png "note.png")

#### 依存関係
![dependency.png](https://qiita-image-store.s3.amazonaws.com/0/56499/3ef6316c-d1a7-bab5-bb82-8c7de1873c16.png "dependency.png")

#### クラス図使用の方針
* 利用可能な表記をすべて使おうとせず、簡単な要素から始める
* 記法をできるだけ単純にする
* 主要なモデルに対してのみダイアグラムを作成する

## シーケンス図
* シーケンス図は、1つのユースケースにおけるオブジェクト群の振る舞いを見たいときに使う
* シーケンス図が得意なのは、オブジェクト間のコラボレーションを示すことであり、振る舞いを正確に定義するには不向き

![sequence.png](https://qiita-image-store.s3.amazonaws.com/0/56499/e1736e37-89e8-f736-8328-ca61b4dab528.png "sequence.png")


## 参考
* [UMLモデリングのエッセンス 第3版](http://www.amazon.co.jp/dp/4798107956)
* [Addison Wesley - UML Distilled, 3rd Ed](http://www.saeedsh.com/resources/UML%20Distilled%203rd%20Ed.pdf)