OmniAICreator/Qiita-1.07M huggingface dataset:
[Windows]ライセンス認証

いっつも認証時どうだったかわからなくなるので備忘録的に。

### 評価版から製品版へのアップグレード
最近よく使うのはもっぱらWindows Server 2012R2だが、これは普通に評価版を入手してインストールしてアクティベートすると、**180日間**の評価期間がついてくる。
![lic0-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/73604/86cd12a6-5d5d-15d0-e2a7-265d83b8282d.jpeg)

180日間を超過すると、ライセンス有効期限切れでOSが勝手にシャットダウンされてしまうが、ライセンスのアクティベーションまでの猶予期間というなんとも都合のいい（？）期間が設けられているため、実はMAX5回まで評価期間を延長する事が可能。

延長するコマンドは下記。
```slmgr.vbs -rearm```

つまり、タイミング良くリセットをかけることで、実質**180日間 * 5回 = 900日間**も無償で利用できてしまう計算に...（そんなんしてるうちに次のバージョン出そうだが

しかし正規に利用するマシンを評価版のまま利用するわけにはいかないのでアクティベートする。


### ライセンス認証の種類
ボリュームライセンスだとこのへんかな。
http://www.microsoft.com/ja-jp/licensing/existing-customers/product-activation-faq.aspx
https://technet.microsoft.com/ja-jp/library/hh831612.aspx

  * キー管理サービス (KMS)
  * マルチ ライセンス認証キー (MAK) 
  * Active Directory によるライセンス認証

個人的に便利だと思ったのはADのライセンス認証。
ADで一度ライセンス登録をしてしまえば、その後ドメインに参加したサーバーは自動的にライセンス認証がかかる。

しかし今回はドメインに参加していないスタンドアロンのサーバーなので、MAKライセンス認証で1台1台アクティベートすることに。。。

ちなみに、直接GUIのWindowsのライセンスキーの入力画面にMAKキー情報を入れても受け付けてもらえなかった。
デフォルトで評価版のライセンスが適用になっていて、これがMAK方式じゃないから？
厳密には謎。

なのでコマンドラインで以下のように設定する。
```DISM /online /Set-Edition:ServerStandard /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula```
![lic1.jpg](https://qiita-image-store.s3.amazonaws.com/0/73604/ad8d4e92-d98e-ee38-23f7-fd3ad6069ca9.jpeg)


この後システムを再起動してライセンス情報を確認すると、従来のEval editionからStandard editionへ切り替わっている。
![lic4.jpg](https://qiita-image-store.s3.amazonaws.com/0/73604/8bca8ddf-0356-0322-37bd-2f13d6f7801f.jpeg)



...しかしこれだけではアクティベートは完了していない。
デスクトップにこんな風に表示される。
![lic3.jpg](https://qiita-image-store.s3.amazonaws.com/0/73604/c81f75d4-8ac3-3f51-0880-791e87dfd4d2.jpeg)



しかしこの時点で↑で一度失敗しているGUIのライセンスキーの入力画面でMAKキーを入力すると無事アクティベートが完了。



Windowsはライセンス関連がいろいろ大変(๑・౩・๑）
.regファイルによるレジストリの編集

レジストリ エディタを使って.regファイルをエクスポートし、インポートすることはWindows環境で作業する開発者やエンジニアならよくやると思うが、キーや値の削除ができることを自分は最近まで知らなかった。[Microsoft サポート][1]の「[.reg ファイルを使用してレジストリ サブキーおよび値を追加、変更または削除する方法][2]」によると、マイナス記号（-）を使うことでキー、値の削除ができる。
なお、WindowsXPからは、レジストリを編集するツールとして、レジストリ エディタのほかにコマンドライン ツールのregコマンドが追加されており、reg importでレジストリ エントリをインポートする際、レジストリ エディタで扱っていたものと同じフォーマットの.regファイルを受け付けるようである。regeditはコマンドラインから実行した場合、成否をerrorlevel環境変数に設定しないため、バッチファイルから使用する場合はregコマンドを使うことが望ましい。

#参考文献

1. [.reg ファイルを使用してレジストリ サブキーおよび値を追加、変更または削除する方法][2]
1. [TechNet ライブラリ - Reg][3]
1. [Windows TIPS：コマンドプロンプトでレジストリを操作する - ＠IT][4]
1. [TechNet ライブラリ - If][5]

[1]: (https://support.microsoft.com/ja-jp)
[2]: (https://support.microsoft.com/ja-jp/kb/310516/ja)
[3]: (https://technet.microsoft.com/ja-jp/library/cc732643.aspx)
[4]: (http://www.atmarkit.co.jp/ait/articles/0402/21/news005.html)
[5]: (https://technet.microsoft.com/ja-JP/library/cc754335.aspx)
Googleにスマートフォンサイトを正しく認識してもらう方法

Googleは、2015/04/21から、"ページがモバイルフレンドリーかどうか"を、検索順位の決定の要素として利用することを発表しました。

[Finding more mobile-friendly search results](http://googlewebmastercentral.blogspot.jp/2015/02/finding-more-mobile-friendly-search.html)

今後、スマートフォンユーザが重要なサイトは、スマートフォンに最適化されたページを用意することはもちろんのこと、Googleに存在を正しく認識させることがより重要となります。

# 正しく認識されているかのチェック方法

## ページがモバイルフレンドリーかどうかの判定

まず、ページがスマートフォンに対応できているかをチェックします。
Googleが用意してくれている以下ツールで、該当ページのURLを入れれば判定できます。

https://www.google.com/webmasters/tools/mobile-friendly/?hl=ja

まずは、これに合格することが重要で、NGであればGoogleに正しく認識させる以前の問題です。

※ サイト単位での判定ではなく、ページ単位で判定が行われます。

## 正しく認識しているかどうかの識別方法

スマートフォンでGoogleを検索した場合に、「スマホ対応」と表示されれば正しく認識されています。
もし、該当ページがモバイルフレンドリーに合格しているにもかかわらず、「スマホ対応」と表示されない場合は、なんらかの設定が間違っている可能性がありますので、後述の対策が必要です。

![image](https://qiita-image-store.s3.amazonaws.com/0/30521/47dede82-190b-34ed-84d5-ee2aff222696.png)

# 正しく認識してもらう方法

## スマートフォン向けサイトの構築のパターン

スマートフォン向けサイトを作成している場合は、以下のいずれかのパターンで構築されているケースがほとんどかと思います。これらのパターンに応じて、異なる対策が必要となります。

- レスポンシブウェブデザインで作成している。
- PCサイトとスマートフォンサイトのURLが同じで、UAでHTMLを出し分けしている。
- PCサイトとスマートフォンサイトのURLが異なる。

## レスポンシブウェブデザインで作成している場合

Googleが一番推奨している方法であり、特別な対策は不要です。
Googlebotをブロックするなど、よほどおかしなことをしてない限り、正しくGoogleは認識してくれます。

##  PCサイトとスマートフォンサイトのURLが同じで、UAでHTMLを出し分けしている場合

User-AgentによってHTMLを出し分けしていることを、Googleに教える必要がありますが、
対象の全てのページのレスポンスで、「Vary HTTP ヘッダ」にUser-Agentを設定することで対応可能です。

対応としてはこれだけですが、User-AgentによるPCページ・スマートフォンページの振り分けを正確に行う必要があります。
振り分けのミスにより、スマートフォン端末でPC用のHTMLを返してしまうと、Googleが正しく認識されなくなりますので、
リスクを減らすために、User-Agent振り分け処理は独自実装せずに、ライブラリの利用をおすすめします。

## PCサイトとスマートフォンサイトのURLが異なる場合

この方法は、おすすめしません。
対応が最も複雑でミスが発生しやすく、PCとスマートフォン間でのURLのシェアがしづらいなど、ユーザにとっても使いづらいです。

対応方法をここで書くと少し長くなるので、Googleの公式サイトを参照ください。

https://developers.google.com/webmasters/mobile-sites/mobile-seo/configurations/separate-urls?hl=ja

# まとめ

- スマートフォンユーザが重要な場合は、まずスマートフォンに最適化されたサイトの作成が必要。
- その上で、Googleからの検索流入が重要な場合は、適切にGoogleにスマートフォンサイトの存在を認識させる。
- 新たにスマートフォンサイトを作る場合は、PCとURLを同じにすることがお勧め。(レスポンシブがよいか、UAによる出し分けがよいかは、サイトに構成などで異なります。)
XAMMPのセキュリティ画面の文字化けにはまった

xamppでさくっとwordpressの動作確認をしてみたいと思い、xamppをダウンロードしたところセキュリティ画面の文字化けではまってしまったのでメモ。

バージョン：xampp 5.6.3

#やったこと
・navi.phpに一行追加
・ja.phpに数行追加

##navi.phpに一行追加
C:\xampp\security\htdocsのnavi.phpに一行追加。（C:\xampp\htdocs\xamppにもnavi.phpがあってこれで何時間もはまった）

```navi.php
<td align="right" class="navi">
<a target=_parent class=n href="lang.php?de"><?php print $TEXT['navi-german']; ?></a><br>
<a target=_parent class=n href="lang.php?en"><?php print $TEXT['navi-english']; ?></a><br>
<a target=_parent class=n href="lang.php?es"><?php print $TEXT['navi-spanish']; ?></a><br>
<a target=_parent class=n href="lang.php?fr"><?php print $TEXT['navi-french']; ?></a><br>
<a target=_parent class=n href="lang.php?it"><?php print $TEXT['navi-italian']; ?></a><br>
<a target=_parent class=n href="lang.php?nl"><?php print $TEXT['navi-dutch']; ?></a><br>
<a target=_parent class=n href="lang.php?no"><?php print $TEXT['navi-norwegian']; ?></a><br>
<a target=_parent class=n href="lang.php?pl"><?php print $TEXT['navi-polish']; ?></a><br>
<a target=_parent class=n href="lang.php?pt"><?php print $TEXT['navi-portuguese']; ?></a><br>
<a target=_parent class=n href="lang.php?sl"><?php print $TEXT['navi-slovenian']; ?></a><br>
<a target=_parent class=n href="lang.php?zh"><?php print $TEXT['navi-chinese']; ?></a><br>
<a target=_parent class=n href="lang.php?jp"><?php print $TEXT['navi-japanese']; ?></a><p>
```
最後の行に
`<a target=_parent class=n href="lang.php?jp"><?php print $TEXT['navi-japanese']; ?></a><p>`
を追加している。

##・ja.phpに数行追加
C:\xampp\security\htdocs\langのjp.phpに数行追加

```ja.php
$TEXT['navi-languages'] = "各国語";
```
を

```ja.php
$TEXT['navi-languages'] = "各国語";
$TEXT['navi-english'] = "English";
$TEXT['navi-german'] = "Deutsch";
$TEXT['navi-spanish'] = "Espanol";
$TEXT['navi-french'] = "Francais";
$TEXT['navi-italian'] = "Italiano";
$TEXT['navi-dutch'] = "Nederlands";
$TEXT['navi-norwegian'] = "Norsk";
$TEXT['navi-polish'] = "Polski";
$TEXT['navi-portuguese'] = "Portugues";
$TEXT['navi-slovenian'] = "Slovenian";
$TEXT['navi-chinese'] = "中文";
$TEXT['navi-japanese'] = "日本語";
```

にする。以上。 :smirk_cat: :smirk_cat:
Raspberry PiにMosquittoのインストールとGPGキーの削除

Raspberry PiにMosquittoのクライアントをインストールしてMeshbluと直接MQTT通信してみます。MosquittoはRaspbianからデフォルトで`apt-get install`もできますが、`mosquitto_pub`に`--help`フラグをつけてもバージョンが表示されないので`Mosquitto Debian repository`を使うことにします。


## インストール

[Mosquitto Debian repository](http://mosquitto.org/2013/01/mosquitto-debian-repository/)という記事に手順があるので従います。

``` bash
$ curl -O http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
$ sudo apt-key add mosquitto-repo.gpg.key
$ rm mosquitto-repo.gpg.key
$ cd /etc/apt/sources.list.d/
$ sudo curl -O http://repo.mosquitto.org/debian/mosquitto-repo.list
$ sudo apt-get update
```

MQTTブローカーはRaspberry Piに不要なのでMQTTクライアントのみインストールします。

``` bash
$ sudo apt-get install mosquitto-clients
```

`--help`フラグをつけてバージョンを確認します。

```
$ mosquitto_pub --help
mosquitto_pub is a simple mqtt client that will publish a message on a single topic and exit.
mosquitto_pub version 1.3.5 running on libmosquitto 1.3.5.
```

## パッケージとGPGキーの削除

一度きれいにパッケージを削除したかったのですが、GPGキーの削除方法がわからなかったので調べました。まずは普通にパッケージの削除と`sources.list`の削除をします。

``` bash
$ sudo apt-get remove --purge mosquitto-clients
$ sudo sudo rm /etc/apt/sources.list.d/mosquitto-repo.list
```

GPGキーの削除は`apt-key del`コマンドを使います。引数に`keyid`を指定しますが何がkeyidなのかよくわかりません。[Removing an unused GPG key?](http://forums.debian.net/viewtopic.php?f=10&t=52480)を参考にします。`apt-key list`を実行してMosquittoリポジトリを探します。`4096R/30993623`のスラッシュより後半部分が`keyid`のようです。

``` bash
$ sudo apt-key list
pub   4096R/30993623 2013-01-04 [expires: 2018-01-03]
uid                  Mosquitto Apt Repository <repo@mosquitto.org>
```

`apt-key del`に`keyid`を指定するとGPGキーが削除できました。`apt-key list`を実行してもMosquittoリポジトリが表示されなくなります。

```
$ sudo apt-key del 30993623
OK
```
Lotusを使った日本で初めてのアプリケーション(Part2)

[Lotusを使った日本で初めてのアプリケーション(Part1)](http://qiita.com/yamadagenki/items/5e90a6781496b6995ecc)の続き

#Part2（ルートの設定）
今回は、基本となるベースルートの作成から、ルーティングの設定について説明して行く。
（環境は前回と同じ[Vagrant](https://github.com/yamadagenki/ubuntu_server)環境を使う）
より詳細なことは[Lotus::Router](https://github.com/lotus/router/blob/master/README.md)を参照。

##準備
[lotus](http://lotusrb.org/)に書いてあるのを参考に

```bash
$ lotus new lotus_blog
$ cd lotus_blog && bundle install
$ lotus server -p 2300 --host=0.0.0.0
```
をする。そうしたら、http://192.168.33.10:2300/
にアクセスすると
![lotus basic view](https://qiita-image-store.s3.amazonaws.com/0/69406/65d7890f-43f9-bfc4-4e31-081c5e3d4cdb.png)
という画面がでる。

##基本的なアクセス
ルーティングは基本的に上記のlotus_blogの場合、
lotus_blog/apps/web/config/routes.rbに各種ルーティングの設定をしていく。
例えば、ルートディレクトリのコントローラをlotus_blog/apps/web/controllers/home/index.rbに設定しようとしたら

```rb
get  '/',            to: 'home#index'
```
と追加する。（getの場合）
他にも、パラメータを受け取りたかったら

```rb
get  '/article/:id', to: 'home#article'
```
などとする。
http://192.168.33.10:2300/article/1
にアクセスすると、パラメータ(id=1)を渡すことになる。

また、postアクセスも簡単に

```rb
post '/api/tags',    to: 'api#tags'
```
のように指定することができる。（この場合、コントローラの場所はlotus_blog/apps/web/controllers/api/tags.rb）

##コントローラの指定
基本的にはMVCの考え方でいいので、各ルートが各コントローラに対応する。
コントローラの指定は、

```rb
post '/api/delete/article', to: Web::Controllers::Api::Delete::Article
```
のように、直にクラスから指定することもできる。
その他に、下記のようなルートの設定方法がある。（[Lotus::Router](https://github.com/lotus/router/blob/master/README.md)）からの引用

### RESTful Resource:

```ruby
router = Lotus::Router.new
router.resource 'identity'
```

It will map:

<table>
  <tr>
    <th>Verb</th>
    <th>Path</th>
    <th>Action</th>
    <th>Name</th>
    <th>Named Route</th>
  </tr>
  <tr>
    <td>GET</td>
    <td>/identity</td>
    <td>Identity::Show</td>
    <td>:show</td>
    <td>:identity</td>
  </tr>
  <tr>
    <td>GET</td>
    <td>/identity/new</td>
    <td>Identity::New</td>
    <td>:new</td>
    <td>:new_identity</td>
  </tr>
  <tr>
    <td>POST</td>
    <td>/identity</td>
    <td>Identity::Create</td>
    <td>:create</td>
    <td>:identity</td>
  </tr>
  <tr>
    <td>GET</td>
    <td>/identity/edit</td>
    <td>Identity::Edit</td>
    <td>:edit</td>
    <td>:edit_identity</td>
  </tr>
  <tr>
    <td>PATCH</td>
    <td>/identity</td>
    <td>Identity::Update</td>
    <td>:update</td>
    <td>:identity</td>
  </tr>
  <tr>
    <td>DELETE</td>
    <td>/identity</td>
    <td>Identity::Destroy</td>
    <td>:destroy</td>
    <td>:identity</td>
  </tr>
</table>

もしも、全てのアクセスポイントが必要でない場合には下記のように個別指定もできる。

```rb
router = Lotus::Router.new
router.resource 'identity', only: [:edit, :update]
```

※ 基本的な部分はRuby on Railsと同じなので、参考にされたし。
※※ より詳細な説明が必要な場合は、[Lotus::Router](https://github.com/lotus/router)を参照
Office 2013 の「VBA プロジェクトのデジタル証明書」はどこに?

## 答え

C:\Program Files\Microsoft Office 15\root\office15\SELFCERT.EXE

※ インストール場所や 64bit/32bit で多少異なるので、そこは検索するなどしてよしなに。

## 経緯
### デジタル署名の必要性
Excel で自動処理を行いたい場合は VBA 一択であるが、マクロウィルスなどの対策のため、無条件に動作させるのは問題がある。
セキュリティセンターでのマクロの設定を見ると、

1. **[警告を表示せずにすべてのマクロを無効にする]** ... マクロは無効
2. **[警告を表示してすべてのマクロを無効にする]** ... やっぱりマクロは無効
3. **[デジタル署名されたマクロを除き、すべてのマクロを無効にする]** ... デジタル署名のみマクロを実行
4. **[すべてのマクロを有効にする (推奨しません。危険なコードが実行される可能性があります)]** ... サイバーノーガード戦法

となっており、マクロを使うのであれば、デジタル署名が事実上必須となっている。

### デジタル署名の選択肢

お金のある人は、パブリック認証局(CA)から買ってください。技術力のある人は、プライベート認証局を構築してオレオレ認証してください。
私はどちらもないので、「VBA プロジェクトのデジタル署名」を使うことにする。

### Office 2010 までの話

[スタート] →[すべてのプログラム] →[Microsoft Office]→[Microso ft Office ツール]→[VBA プロジェクトのデジタル証明書] で、実行すればOKだった。

### Office 2013 の話

Office 2013(実際には、Office 356 Solo だが)のセットアップ後に、メニューを開いても、[スタート] →[すべてのプログラム] →[Microsoft Office 2013]→[Microso ft Office 2013ツール] に [VBA プロジェクトのデジタル証明書]や、それっぽいものが存在しない。
しかし、ヘルプで検索すると、[「マクロ プロジェクトにデジタル署名を追加する」](http://office.microsoft.com/ja-jp/excel-help/HA010354312.aspx)が表示され、それには

> [スタート] をクリックし、[すべてのプログラム] をポイントします。[Microsoft Office]、[Microsoft Office ツール]、[VBA プロジェクトのデジタル証明書] の順にクリックします。
[デジタル証明書の作成] ダイアログ ボックスが表示されます。

と書いてあり、さらに

> 適用対象: Visio 2013, Office Shared 2013, **Excel 2013**, Excel 2010, PowerPoint 2010, Visio 2016 Preview, Visio 2010, Word 2013, Word 2010, Visio Standard 2010, PowerPoint 2013

と、Office 2013 でこの方法で良さそうにみえるのだが... (関係ないが、Visio 2016 Preview ってのは興味深い。）

### 検索の結果

Office 2010 や 2007 では、SELFCERT.EXE ファイルだったので、HDD を検索することで、Office 2013 の「デジタル証明書の作成」が C:\Program Files\Microsoft Office 15\root\office15\SELFCERT.EXE にあることを発見する。
 
## おまけ、マイクロソフトサポートからの回答

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/nakadanobuhiro">@nakadanobuhiro</a> 恐れ入りますが、Office2013での起動方法はEXEファイルからのみとなります。このファイルを右クリックしてショートカットを作成し、スタートメニューなど任意の場所に追加してはいかがでしょうか。よろしければお試し下さい。 ^NNY</p>&mdash; マイクロソフトサポート (@MSHelpsJP) <a href="https://twitter.com/MSHelpsJP/status/582356041649823745">2015, 3月 30</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

とのこと。
Ruby 文字列をハッシュに変換

"x: 100, y: 200, z: 300" のような文字列を
{x: 100, y: 200, z: 300 }のようなハッシュ{sym: int}に変換する方法
ruby2.2で探してみたところ、それ用のメソッドが無いようなので書いてみた。  


##補足
2.1以降 Array#to_h
それ以前 Hash[ ]


#パターン1 一旦配列にする
文字列を":"と","区切りで二次元配列にして、それを二個ずつ取り出してハッシュに変換する。

```rb
def to_hash(str)
  array = str.delete(' ').split(/[:,]/)
  array.each_slice(2).map {|k, v| [k.to_sym, v.to_i] }.to_h 
end
```

#パターン2 eval使う(要注意)
超簡単、ruby怖い。

```rb
def to_hash(str)
  eval("{#{str}}")
end
```

#パターン3 scanで正規表現を使う (追記)
@jnchitoさんより。

```rb
def to_hash(str)
  str.scan(/(\w+):\s+(\d+)/).map{|k, v| [k.to_sym, v.to_i] }.to_h
end
```

#速度比較
上記の２つをそれぞれ1000回実行した平均(小数点2桁目以降は誤差みたいなものなので省略)
※パターン3を追記

* "x: 100, y: 200, z: 300"

```
パターン1  4.2e-06
パターン2  4.8e-06
パターン3  3.6e-06
```

* "x: 100, y: 200, z: 300, a: 1000, b: 20"

```
パターン1  5.7e-06
パターン2  5.7e-06
パターン3  4.8e-06
```

* "x: 100, y: 200, z: 300, a: 1000, b: 20, c: 800"

```
パターン1  6.4e-06
パターン2  6.3e-06
パターン3  5.6e-06
```

追記したパターン3が最も速い結果になった。
要素が増えるにつれパターン3と他との差が開いていく。

もっと良い方法があったりしたらおねがいします!
js-sequence-diagrams を用いて、プレーンテキストからシーケンス図を生成を試すための遊び場的 Heroku アプリケーションを作成する

##<i class="fa fa-area-chart" style="font-size:1em;"></i> 概要
js-sequence-diagrams を用いて、
プレーンテキストからシーケンス図を生成する Heroku アプリケーションを作成します

## <i class="fa fa-code-fork" style="font-size:1em;"></i> js-sequence-diagrams とは？
UML のシーケンス図をプレーンテキストで記述できる JavaScript のライブラリです。
js-sequence-diagrams は underscore.js と Raphaël に依存しています。
詳しくは、以下の公式サイトを参照

* <i class="fa fa-external-link" style="font-size:1em;"></i> [js-sequence-diagrams](https://github.com/bramp/js-sequence-diagrams)

## <i class="fa fa-cubes" style="font-size:1em;"></i> 構成
* Heroku
* Ruby
* Sinatra
* js-sequence-diagrams
* raphael.js
* underscore-min.js
* jQuery

## <i class="fa fa-check-circle" style="font-size:1em;"></i> Heroku にデプロイしたアプリケーションの確認

![sequence-dialog-app.png](https://qiita-image-store.s3.amazonaws.com/0/43480/a9bd2323-998d-8e84-05ba-8ee54f9deede.png)

## :memo: 補足
* 例の如く Heroku ボタンを用意したので、自分で試したい方は Fork して使ってください。

<i class="fa fa-github" style="font-size:1em;"></i> [sequence-dialog-app GitHub](https://github.com/tbpgr/sequence-dialog-app)

## <i class="fa fa-comment" style="font-size:1em;"></i> ぼそっ
ぶっちゃけ、わざわざ Heroku アプリケーションを作らなくても
公式サイトで試せたりしますどね。

## :books: 関連
* <i class="fa fa-github" style="font-size:1em;"></i> [sequence-dialog-app GitHub](https://github.com/tbpgr/sequence-dialog-app)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [raphaeljs](http://raphaeljs.com/)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [js-sequence-diagrams Official](http://bramp.github.io/js-sequence-diagrams/)
* <i class="fa fa-github" style="font-size:1em;"></i> [js-sequence-diagrams GitHub](https://github.com/bramp/js-sequence-diagrams)
WordPressにて、別にインストールしたWordPressのDBを参照するケース

<h3>動機：動的に別のWordPressサイトの記事を表示したい</h3>
微妙にややこしい話です。

複数のWordPressで作成したサイトに関して、最新情報をまとめて表示するページが必要になりました。

それぞれのサイトのデータは、
別々のデータベースに保存されています。

さて、どうやって取得するか？

<h3>wpdbが使えるので、別の名前で有効な接続を生成</h3>

新しい接続を作って、そこで使われているプレフィックス("wp_"とかの接頭語）を指定すれば良いです。

参考元ではグローバル変数で実施してますが
グローバル宣言しなくとも動作しました。
記載されている関数の中で、一時的に有効になればよかったので・・・。

<h4>新しい接続の作り方</h4>
 
<pre>
注：変数の値は
$another_db_name = 新しく接続するデータベース名
$another_db_user = 同、ユーザ名
$another_db_pass = 同ユーザのパスワード$another_db_name = 接続するDBのホスト
$another_tb_prefix = 新しいく接続する対象のプレフィックス（ "wp_" など ）
</pre>
<h4>以下、設定〜簡単な処理のサンプルコード</h4>

<pre>
/*DB設定を行います。*/
$another_db_name = 'dbname';
$another_db_user = 'dbuser';
$another_db_pass = 'dbpass';
$another_db_host = 'another_host';
$another_tb_prefix = 'wp_hoge_';

$anoteher_wpdb = new wpdb($another_db_user, $another_db_pass, $another_db_name, $another_db_host);

//プレフィックスの設定（忘れがち）
$anoteher_wpdb->set_prefix($another_tb_prefix);

/*
例えば、別のWordPressで利用しているDBのカテゴリ設定から、特定のスラッグとそのスラッグのIDを取得する場合
*/

$sql ="SELECT term_id, slug FROM $anoteher_wpdb->terms WHERE slug = 'pr' or slug='foo' ";

</pre>

<h3>参考<h3>

https://javelinadevil.wordpress.com/2014/03/06/wordpressで同じデータベース内の他のwordpressからデータ取得/
ホバーでキューブ状にクルッと回転する CSS


パッと見は普通のボタンですが、ホバー時にキューブ状にクルッと回転するように。


##html

```html:hover_rotate.html
	<a class="button" href="#"><span>Hover</span><span>Button</span></a>
```

##CSS

```css:hover_rotate.css
 	.button {
	position: relative;
	-webkit-perspective: 300px;
	perspective: 300px;
	}
	.button span {
	display: block;
	position: absolute;
	width: 200px;
	height: 60px;
	border: 2px solid #333;
	text-align: center;
	line-height: 56px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
	-webkit-transition: all .3s;
	transition: all .3s;
	pointer-events: none;
	}
	.button span:nth-child(1) {
	background-color: #333;
	color: #fff;
	-webkit-transform: rotateX(90deg);
	-moz-transform: rotateX(90deg);
	transform: rotateX(90deg);
	-webkit-transform-origin: 50% 50% -30px;
	-moz-transform-origin: 50% 50% -30px;
	transform-origin: 50% 50% -30px;
	}
	.button span:nth-child(2) {
	background-color: #fff;
	color: #333;
	-webkit-transform: rotateX(0deg);
	-moz-transform: rotateX(0deg);
	transform: rotateX(0deg);
	-webkit-transform-origin: 50% 50% -30px;
	-moz-transform-origin: 50% 50% -30px;
	transform-origin: 50% 50% -30px;
	}
	.button:hover span:nth-child(1) {
	-webkit-transform: rotateX(0deg);
	-moz-transform: rotateX(0deg);
	transform: rotateX(0deg);
	z-index: 1;
	}
	.button:hover span:nth-child(2) {
	background-color: #333;
	-webkit-transform: rotateX(-90deg);
	-moz-transform: rotateX(-90deg);
	transform: rotateX(-90deg);
	z-index: 0;
	}
```
データベースからエンティティを生成する

doctrine orm でエンティティのクラスをDBから生成する際のメモ

# 参考
doctrineの公式ドキュメントが以下
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/tools.html

# 使えるコマンド一覧
```
$ cd ec-cube
$ vendor/bin/doctrine list

Available commands:
 help                             Displays help for a command
 list                             Lists commands
dbal
 dbal:import                      Import SQL file(s) directly to Database.
 dbal:run-sql                     Executes arbitrary SQL directly from the command line.
orm
 orm:clear-cache:metadata         Clear all metadata cache of the various cache drivers.
 orm:clear-cache:query            Clear all query cache of the various cache drivers.
 orm:clear-cache:result           Clear all result cache of the various cache drivers.
 orm:convert-d1-schema            Converts Doctrine 1.X schema into a Doctrine 2.X schema.
 orm:convert-mapping              Convert mapping information between supported formats.
 orm:convert:d1-schema            Converts Doctrine 1.X schema into a Doctrine 2.X schema.
 orm:convert:mapping              Convert mapping information between supported formats.
 orm:ensure-production-settings   Verify that Doctrine is properly configured for a production environment.
 orm:generate-entities            Generate entity classes and method stubs from your mapping information.
 orm:generate-proxies             Generates proxy classes for entity classes.
 orm:generate-repositories        Generate repository classes from your mapping information.
.
.
.
```
listオプションで利用出来るコマンドができる　

orm:convert:mapping, orm:generate:entitiesがそれぞれ該当するのコマンド

# orm:convert:mapping

```vendor/bin/doctrine orm:convert:mapping --namespace="Eccube\Entity\\" --from-database yml src/Eccube/Resource/doctrine```

上記でsrc/Eccube/Resource/doctrine以下にorm.ymlを生成してくれる

--from-database でDBのスキーマをymlに落とす
--namespaceでnamespaceつける

※--from-databaseで参照する接続先は、app/config/eccube/config.ymlに定義されているDB情報をみる
※リレーションは手動で定義する必要がある。外部キー張っていれば勝手にやってくれる？

# orm:genereta:entities

```vendor/bin/doctrine orm:generate:entities --extend="Eccube\\Entity\\AbstractEntity" src/```

--extendでベースクラス継承したエンティティも作れる

# その他
リレーション貼るときは、orm.ymlに以下のように定義してからエンティティ作る

```
    oneToMany:
        Delivtimes:
            targetEntity: Eccube\Entity\Delivtime
            mappedBy: Delivtime

    oneToMany:
        PaymentOptions:
            targetEntity: Eccube\Entity\PaymentOption
            mappedBy: PaymentOption
    oneToMany:
        Delivtimes:
            targetEntity: Eccube\Entity\Delivtime
            mappedBy: Delivtime
```

レポジトリ作る場合は、orm.ymlに定義して、generate:repositoriesする

```
repositoryClass: Eccube\Repository\XXXRepository
```

```
vendor/bin/doctrine orm:generate:repositories src/Eccube/Repository
```

# 参考ぷるりく
https://github.com/EC-CUBE/ec-cube/pull/80/files
AVAudioPlayer でバックグラウンド再生

シミュレータだとバックグラウンドにいっても音楽が再生され続けますが、実機だともろもろ設定や実装をしとかないと動かない。

# Background Modes 追加
必要なスキーマすべてで以下を設定。
- Xcode の Project Navigator -> プロジェクト選択 -> target の Capabilities タブ -> Background Modes を ON -> Audio and Airplay にチェック

# AVAudioSession の設定
- Xcode の Project Navigator -> プロジェクト選択 -> target の Build Phases タブ -> Link Binary With Libraries で AVFoundation.framework 追加
- カテゴリ設定を適当なタイミングで。AppDelegate なり AVAudioPlayer を alloc する前なり。  

```objc
    AVAudioSession* session = [AVAudioSession sharedInstance];
    NSError* error = nil;
    [session setCategory:AVAudioSessionCategoryPlayback error:&error];
    [session setActive:YES error:&error];
```

# リモートコントロールイベントを受け取る && ファーストレスポンダになる
これやってなくてハマりました。  

```objc
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self endReceivingRemoteControlEvents];
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self beginReceivingRemoteControlEvents];
}

- (void) beginReceivingRemoteControlEvents {
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}
- (void) endReceivingRemoteControlEvents {
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];
}

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    if (event.type == UIEventTypeRemoteControl) {
        switch (event.subtype) {
             // do something...
        }
    }
}
```
エラー設計についての参考

# エラーハンドリングについて

エラー設計なんてまともにやったことないので、
勉強してみようと思いチラチラWEBをみて集めた記事です。

「老プログラマの備忘録より」
http://a-programmer.blog.so-net.ne.jp/2007-01-30-1

「エラー処理設計：対処方法をシステム全体で定める」
http://www.st.rim.or.jp/~k-kazuma/SD/SD561.html

エラー処理の方針を基本設計の段階でやっておかないと
プログラマが適当にエラー処理を書いてしまうもんだから可読性が悪くなる。

ということで、コードの書き方とかエラー処理の仕組みが云々以前に
エラーの種類やレベル、対処方法を整理して体系立てて設計することの重要性を感じました。
python システム停止時に電話で自動通知する方法

#背景
個人PJでサーバ運用中。致命的なエラー起きたときに、すぐ復旧したい。
通知方法どうしよう

#よくある解決手段
Djangoなら[エラーメール通知](http://django-docs-ja.readthedocs.org/en/latest/howto/error-reporting.html)がある。

#よくある解決手段の問題点
gmailならSPAM扱いで迷惑メールに突っ込まれる。
キャリアメールでも同じ。SPAM扱いされる。
SPAM扱いされないよう、サーバのメール設定を行うのはとても面倒だ。

#Twilio使ってみた
アメリカの会社で、日本ではKDDIが代理店になっている
API経由で電話を掛けるサービス。[日本公式ページ Twilio](https://jp.twilio.com/docs/python/install)

#電話代破産やパケ死しないか
料金プランがSMS発信や着信、発信を中心としており
コールして着信を残すという形態を想定していない作りになっている。
ある程度なら無料で使える。発信して着信履歴残すのみなら無料分で運用できそう。

課金する場合は月189円になる模様。高い。無料分のみで使うのが安定。
![スクリーンショット 2015-03-30 23.00.43.png](https://qiita-image-store.s3.amazonaws.com/0/65312/e15cfccf-94ff-0a8e-5fb1-b0316d8d0615.png)

#アカウント登録
[アカウント登録](https://jp.twilio.com/try-twilio/kddi-web)して次の３点セットを発行する
・発信用電話番号
・ACCOUNT_SID
・AUTH_TOKEN

#インストール
```lang:shell
pip install twilio
```

# 電話掛ける
```py
from twilio.rest import TwilioRestClient
ACCOUNT_SID = "ABCDEFG"
AUTH_TOKEN = "0x0x0x0x0x0x"
FROM_CALL_NUMBER = "8109012345678"
TO_CALL_NUMBER = "8109011223344"

client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN)
call = client.calls.create(to=TO_CALL_NUMBER, from_=FROM_CALL_NUMBER,
                           url="http://foo.com/call.xml")
print call.length
print call.sid
```

#電話きた
API叩いてから15秒くらいで着信
![スクリーンショット 2015-03-30 23.17.23.png](https://qiita-image-store.s3.amazonaws.com/0/65312/2da0c41d-ef83-cd7e-a2af-3c1862de736e.png)
iOS でプッシュ通知から起動したときのハンドリング

たとえば、リモートプッシュを受け取ったら、ペイロードに記載の url を webview で開くために presentViewController したい、みたいなとき。

# NSNotificationQueue で通知を遅延させる
NSNotificationCenter の postNotification だと、メインの ViewController が observer になる前に notification が伝搬しちゃう。
なので、[NSNotificationQueue Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationQueue_Class/index.html) にあるように、NSNotificationQueue を使って遅延させる。

```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if ( userInfo ) {
        NSNotification *notification = [NSNotification notificationWithName:@"HogeNotification"
                                                                     object:self
                                                                   userInfo:userInfo];
        NSNotificationQueue *queue = [NSNotificationQueue defaultQueue];
        [queue enqueueNotification:notification postingStyle:NSPostWhenIdle];
    }

    // do something...
}
```

# メインとなる ViewController で observe する
```objc:MainViewController.pm
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self
                           selector:@selector(handleRemotePush:)
                               name:@"HogeNotification"
                             object:nil];

    // do something...
}
- (void) handleRemotePush:(NSNotification *)notification {
    NSURL *url = [NSURL URLWithString:notification.userInfo[@"url"] ];

    // show the url in web view...
}
```

# プッシュ通知からの起動をデバッグする
ふつうに Run するとアプリ起動しちゃうし、かといって終了させるとデバッガも終了しちゃうし詰むので、以下のようにする。
- Edit Scheme -> Info タブ -> Launch を Automatically から Wait for Hoge.app to be launched manually へ
Debian7.8にpython3.4系をインストールして、virtualenvを動かす

タイトルのとおり

Pythonのインストール

```
apt-get install libssl-dev openssl
wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
tar -xzvf Python-3.4.3.tgz
cd Python-3.4.3
./configure --prefix=/usr/local/python-3.4
make
make install
```

virtualenvのインストール

```
/usr/local/python-3.4/bin/pip3 install virtualenv
mkdir project
/usr/local/python3.4/bin/virtualenv-3.4 project
cd project
source bin/activate
```

前まで、--no-site-packagesオプションつけてたんだけど、どうもいらなくなったみたい。
uninitialized constant AWS (NameError)の対処

aws-sdk for rubyのメジャーバージョンが上がっていた事が原因です。
```gem install aws-sdk```や```bundle install```などを実行するとver.1では無く、ver.2がインストールされてしまいます。

**1. rubyのソースコードでaws-sdk for rubyのver.1を明示的にrequireする**

```rb:config/initializers/aws.rb
require 'aws-sdk-v1'

AWS.config({
  :access_key_id => 'xxxxxxxxxxxxx',
  :secret_access_key => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
})
```

**2. aws-sdk for rubyのver.1を明示的にインストールする**

```rb:Gemfile
# Use AWS SDK
gem 'aws-sdk', '~>1'
```
として
``bundle update``または``bunlde install``する。
JAWS-UG関西女子会　第2回勉強会資料「AWS アカウントの取得方法」

【準備するもの】
・クレジットカード
・AWSログインメールアドレス
・本人確認電話番号（実際に自動音声でかかってきます）

http://aws.amazon.com/jp/

##１）サインイン
![img01.png](https://qiita-image-store.s3.amazonaws.com/0/73804/c34a6528-a4fb-fdc5-cb57-32698c99ab22.png)

##２）メールアドレスの入力と新規ユーザの作成
メールアドレスを入力して**「I am a new user.」**　を選択して次の画面へ。
![img02.png](https://qiita-image-store.s3.amazonaws.com/0/73804/66da844e-e14b-c395-8401-99ae84cb58fc.png)

##３）アカウント設定
名前やパスワードなど入力して**「アカウントの作成」**を押下します。
![img03.png](https://qiita-image-store.s3.amazonaws.com/0/73804/4caa85f1-1828-42b7-193f-151aa33ae8c1.png)

##４）連絡先情報の入力
![img04.png](https://qiita-image-store.s3.amazonaws.com/0/73804/81e05c90-ec7a-9d24-f411-3304206b8951.png)

##５）クレジットカード情報の入力
**※無料プランを利用予定ですので制限を超えない限り引き落としされません。**
![img05.png](https://qiita-image-store.s3.amazonaws.com/0/73804/afda46b5-9f24-ec91-03ba-9627a03cb441.png)

##６）電話番号入力
電話番号を入力後は、実際に電話がかかってきますのですぐに応答できるようにします。
日本語の自動音声ですので安心ください。**「確認用に自分に電話をする」**を押下します。
![img06.png](https://qiita-image-store.s3.amazonaws.com/0/73804/4191018e-e4ed-d7fd-4868-b669996aed3c.png)

##７）電話をとる
電話にでたあとは、ブラウザに表示されているPINを電話からプッシュして入力します。
![img07.png](https://qiita-image-store.s3.amazonaws.com/0/73804/6fc033b5-64db-bea0-2a87-be438b541da1.png)

##８）電話入力完了後は、本人確認完了画面が表示されます。
続けるをクリックします。

##９）プラン選択・完了
**ベーシック無料プラン**を選択して**「続行」**を押下します。
![img08.png](https://qiita-image-store.s3.amazonaws.com/0/73804/71728b05-dd29-fb47-490e-c773173a7c4e.png)

アカウント取得完了！お疲れ様でした。
AnsibleのDynamic InventoryでAWS EC2管理

# やりたいこと
AnsibleのInventoryをファイルではなく、EC2インスタンスに付けた**タグ**で管理したい

## 背景
* AWS Auto Scaling を使うとIPアドレスが動的にインスタンスに割り当てられるため、Inventoryファイルもその都度、メンテナンスしないといけないのだが、やりたくない
* AnsibleのDynamic Inventory：
http://docs.ansible.com/intro_dynamic_inventory.html

## 手順
1. EC2インスタンスにenvとroleタグ（タグ名は何でも構わない）を付けておく
予め、AutoScalingGroupにタグを設定しておくと便利（Tag New Instancesを**Yes**に設定）
![asg.png](https://qiita-image-store.s3.amazonaws.com/0/70901/cf33d4b7-b6df-7771-1a07-b401320c9fb0.png)

2. 本番（production）とステージング（stage）のDynamic Inventory作成 

* Inventory directoryはこんな感じ

```bash
hosts/
├── production
│   ├── ec2.ini
│   ├── ec2.py
│   └── group_vars
│       └── tag_role_webserver
└── stage
    ├── ec2.ini
    ├── ec2.py
    └── group_vars
        └── tag_role_webserver
```

* ansibleに付属している下記の二つのファイルをInventoryディレクトリにコピーして使う

```bash
 $ANSIBLE_HOME/ansible/plugins/inventory/ec2.py
 $ANSIBLE_HOME/ansible/plugins/inventory/ec2.ini
```
* ec2.ini はどのインスタンスを対象にするかをいろいろ設定できる。
* 例えば、東京リージョンで、envタグがstageのインスタンスを対象にする場合

```ini:ec2.ini
regions = ap-northeast-1
instance_filters = tag:env=stage
```
* instance_filtersはカンマ区切りで複数設定できるが、OR条件となる
* 今のところ、AND条件設定はできない
* private ip address を取得したい場合

```ini:ec2.ini
vpc_destination_variable = private_ip_address
```
* Cacheしたくない場合は

```ini:ec2.ini
cache_max_age = 0
```

* ```group_vars/tag_<タグ名>_<タグ値>``` というファイル名でVariableを設定可能（タグと関連付けられている）

## コマンド
* 対象インスタンス一覧

```bash
./hosts/stage/ec2.py --list
```
* 詳細情報取得

```bash
./hosts/stage/ec2.py --host 10.0.5.5
```
* ステージング環境の全インスタンスにdateコマンドを実行する例

```bash
ansible -i hosts/stage all -a "date"
```
* ステージング環境の10.0.5.5サーバにwebserverのplaybookのnginxタグを実行する

```bash
ansible-playbook -i stage webserver.yml -l 10.0.5.5 -t nginx
```
* playbookはこんな感じ

```yaml
---
- hosts: tag_role_webserver
  remote_user: root
  roles:
    - { role: nginx, tags: [ "nginx"] }
```
* ```hosts: tag_<タグ名>_<タブ値>``` 形式

## 結論
* AWS Auto Scalingを使って自動的にインスタンス数を増やしたりする場合はとても便利
* AWS Auto Scalingではインスタンスが古いAMIからlaunchされる課題があるが、Auto Scaling ライフサイクルフックと組み合わせてInService状態になる前にansbleを実行することで最新状態にすることができる
[めもめも]ターゲットの方へ向く、移動する　uGui 2D

自分用めもめも

2Dの話
2Dの話
2Dの話！！！！！


```lang:sample
	
		//2Dだけ 
		Transform playerTrans = null;　		//自分自身  transform
		Transform targetTrans = null;		//見たいものtransform



		//目標までのベクトルを求める;
		Vector3 subVec = targetTrans.localPosition -　playerTrans.localPosition;

		//角度を変える;
		float angle = Mathf.Atan2(subVec.y, subVec.x) * Mathf.Rad2Deg;

        //これで目的のほうへ向いてくれる;
		playerTrans.localEulerAngles = new Vector3(0, 0, angle);


		//右クリックしている間 目的地のほうにすすみます;
		if(Input.GetMouseButton(1)){

			Vector3 v = Vector3.zero;
#if false
			//角度から移動方向を求める
			float radAngle = angle * Mathf.Deg2Rad;
			v.x = Mathf.Cos(radAngle);
			v.y = Mathf.Sin(radAngle);
#else
			//2点間の距離から移動方向を求める;
			v = subVec.normalized;
#endif
			//ここで好きな速さにできる;
			//v *= speed;	
			playerTrans.transform.localPosition += v;
		}
```

2点間の距離から移動を求めたほうが計算そんなしなくていいかもしれません


おまけ

タッチ位置の取得

```lang:omake
	Vector2 getMousePos()
	{

		//public int screenW = 1136;
		//public int screenH = 640;
		
		Vector2 pos = (Vector2)Input.mousePosition - new Vector2(Screen.width / 2, Screen.height / 2);
		float aspect = (float)Screen.width / (float)Screen.height;
		pos.x = pos.x * ((float)screenH / (float)Screen.width) * aspect;
		pos.y = pos.y * ((float)screenH / (float)Screen.height);

		pos.x = Mathf.Min(pos.x, screenW / 2);
		pos.y = Mathf.Min(pos.y, screenH / 2);

		pos.x = Mathf.Max(pos.x, screenW / -2);
		pos.y = Mathf.Max(pos.y, screenH / -2);



		return pos;
	}
```
Atomのメニュー日本語化(Windows向け?)

#前置き
ちと会社のPCのエディタをAtomに変更しようかなと思い、いろいろ調べている。
メニューの英語は別に日本語であろうがどうでもいいのだが、検索した結果はMacではできるがWindowsでは出来ていないかのような記述をちらほら見かけた。

#実践
PackageのLocalizationで一発だぜ！というのが日本語化できるという記事の内容であった。
会社PC(Windows7 32bit)でLocalization入れてJapanese設定にしてみると・・

出来ねー！！

#なぜか？
アプリのあるフォルダを覗いてみると、そもそもresourse/app/menus/ 以下にメニューの表示項目が存在する。

```json:win32.json
{
  "menu": [
    {
      "label": "&File",
      "submenu": [
        {
          "label": "New &Window",
          "command": "application:new-window"
        },
        {
          "label": "&New File",
          "command": "application:new-file"
        },
        {


```

みたいなのがね。
つかまあこれを直接いじればいいという話ではあるが。
で、Localizationの設定ファイルは

```json:japanese.json
    "File":{
        "value":"ファイル",
        "submenu":{
            "New Window":{"value":"新規ウインドウ"},
            "New File":{"value":"新規ファイル"},
            "Open...":{"value":"開く…"},
            "Reopen Last Item":{"value":"最後に使用したファイルを開く"},
            "Save":{"value":"保存"},
            "Save As...":{"value":"別名で保存…"},
            "Save All":{"value":"すべて保存"},
            "Close Tab":{"value":"バッファを閉じる"},
            "Close Pane":{"value":"ペインを閉じる"},
            "Close Window":{"value":"ウインドウを閉じる"}
        }
    },
```

ってことで。これをみる限り labelに設定された文字列を置換してるんだろこのpackage。で、このmenuの設定ファイルがmac,Windows用で記述が違うんだよ。で、localizationがmacの記載に合わせてる。マッチング取れてないだけや・・・

まあ、Windowsは更新毎にフォルダ掘ってそこにアプリを置いていくようだからいちいち差し替えるのは向いてなくてpackage対応なんだろうけど、これって記述が変わったらマッチングがまた取れなくなるということにならんのかなあ。

でバージョンも進んでいるのにこういったレベルのpackageなのねえ。

GitHubに関連コメント発見
[i dont have the menu Packages -> Localization #20 ](https://github.com/pandarison/Atom-Localization/issues/20)

※っていうかまあこの&の関係でメニューの　Package　にも Localizationが表示されないの。


ただ、Windowsのメニューには"&"が表示されていないんだからどっかで除去されて最終表示されてると思うのだけどね。
なんとなくLocalizationの起動シーケンスあたりに問題がありそうな気はする。もしくは参照している値つかtemplateあたりかな。
大概のpackageは menus/以下にメニュー用の記載を入れてるからこのpackageの書き方が？という気もしたり。

#※4/6追記：コメント欄より
[こちら](https://github.com/pandarison/Atom-Localization/pull/12)で差し替え用のファイルが公開されているそうなので、Localizationお使いの方で困っている方は差し替えると幸せになるかと思います。

情報どもです。

#※4/14追記
[Japanese-menu](https://atom.io/packages/japanese-menu) というpackageがリリースされてますね。
実装自体は似たようなもんですけど、&をテンプレから取っ払って win32やlinux向けのテンプレも準備して置換表示させてるpackageですかね。あとコンテキストメニューも日本語化されるので、アクセスキー使わないのでってのはこのpackageが簡単かも。（僕は使わないのでこれでも良いですけど）
 実装自体見てると別に&抜かなくてもテンプレ対応すればいいだけな気もしますが。

#4/22追記
[Japanese-menu](https://atom.io/packages/japanese-menu) が 0.5.0で&の置換をやめてアクセスキー残す方向にした模様です。日本語化という点ではこっちが主流ですかね。keybindingは[アクセスキー対応でoff](http://qiita.com/Naoto_H/items/cb7c69310775a036949c)れば幸せですね。
forループからStream API移行に関する適当な感想

Java 8から鳴物入りで導入されたStream APIと、古き良きforループからの移行論争について適当な感想。「※個人の感想です。」

適当にググって出てくる紹介ページの基本論調としては、「forループなんて時代遅れ！これからは全部Stream APIで処理すべし！forループは全部書き換えろ！」が多数派な印象。まあ、新技術の紹介が目的だからそうだよねという感じ。

一方で、無理やりStream APIで書くために`peek()`中間操作を副作用のあるロジック記述に使ってたり、`forEach`/`forEachOrdered`終端操作の違いも気にせず使ってたりするのを見かけると、そこまでしてStream APIを積極推進すべきかぁ？とも思う。

結構な割合で、ちょっとparallelストリームに変えるだけで「正しく動く保証のない」Stream処理が書かれている気がする。sequentialにしか正常動作しないなら、気張ってStream APIで書き換えなくてもいいのではという気分になる。インデクス値必須なら古典的forループも悪くないし、単純な要素走査なら拡張forループで十分なこともあるでしょ？（ループ内処理は適切に構造化されている前提）

Stream APIの真価は逐次／並列処理のシームレス統合で、それはJSR-335でも掲げられていたはず。一方で、高速化を目的とする並列処理で捉えると、そのループは最適化対象に値する処理量・データ量なのかに疑問符。最内ループだけいくら頑張っても駄目。早すぎる最適化は諸悪の根源。

その意味で、よくあるStream APIのサンプルは局所化されすぎてるし（サンプルだから仕方ないけど…）、上位の処理構造でデータ並列を効果的に使えるのかという疑問はある。大局的にはFork/Joinタスク並列の方がずっと効果あるんじゃない？残念ながら使い勝手は今一つで、だからこそStream APIが導入されたんだけど。

あとStream API並列処理でちゃんと処理性能出すには、裏方の仕組みを理解していないとやっぱり無理だと思う。Spliterator特性とかCollector特性とか、まだ解説記事も少ない印象。あと並列化オーバーヘッド無視されすぎ。並列処理は魔法じゃないんですよ。

結局のところは、手続型で副作用ベースの記述がされていたforループを、関数型へのパラダイムシフトなしに見た目だけStream API使っても上手くないという話か。表層的な新機能紹介よりも、考え方がなにより重要ではという感想。関数型云々言い出すと怖いからこのへんで。

参考資料：

- [Java SE 8 Lambda & Stream API Overview from History](http://www.slideshare.net/OracleMiddleJP/java-se-8-overview-from-history)
- [Java8基礎勉強会 ラムダ式とストリームAPI](http://www.slideshare.net/zoetrope/java8-lambdaandstream)
R でベクトルが整数からなるかどうかを判定する #rstatsj

次のようなベクトルがあったとします。

```r:R
values1 <- c(1, 2, 3, 4, 5)
values2 <- c(1, 2, 3.3, 4, 5)
```

`values1` はすべて整数からなるベクトルですが、`values2` には小数(3.3)が含まれています。

ベクトルがすべて整数かどうかを判定したかったので、次のような関数を作りました。

```r:R
is_integer <- function(values) {
  all(values %% 1 == 0)
}
```

```r:R
is_integer(values1)
is_integer(values2)
```

```:結果
TRUE
FALSE
```

うまくいきました。

ところで、私が本当に欲しかったものは、整数もしくは Inf からなるベクトルに対して TRUE を返す関数です。

なので、次のように書き換えました。

```r:R
is_integer_or_infinite <- function(values) {
  all(ifelse(is.finite(values), values %% 1 == 0, TRUE))
}
```

```r:R
values3 <- c(-Inf, 1, 2, 3, 4, 5, Inf)
values4 <- c(-Inf, 1, 2, 3.3, 4, 5, Inf)

is_integer_or_infinite(values3)
is_integer_or_infinite(values4)
```

```:結果
TRUE
FALSE
```

うまくいきました。

以上です。
デザインスプリント80分版レポート

*デザインスプリントがいまいちよく分からないという方はまずはこちらをご覧ください。[THE DESIGN SPRINT(和訳)](https://github.com/crossnode/DesignSprint)*

# お題

「OSSカフェのドアノブの貼り紙」が今回のお題でした。
![11091331_708698892574398_5509279920737013946_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/27176/77904c4e-270b-711d-1a52-5e259b220f41.jpeg)

# タイムテーブル

課題の現状理解から始まりプロトタイピングして設置するまでを80分に収めるメソッドを組みました。

1. 現状把握 (10分)
  - 現物確認（会場の[下北沢オープンソースカフェ](http://www.osscafe.net/ja/)のドアの開閉方法がちょっと珍しいスタイルなのです）
  - 問題共有（どういうつまずきパターンがあるのか）
2. 目標設定 (5分)
  - プロトタイプの制限事項・条件の明文化
  - 貼り紙を見て自己解決する人を増やす等
  - ユーザーテスト（カウント方法等）効果測定方法の設定
3. ノート作成 (5分)
  - 問題やアイデアに関連するキーワードや絵を思いつくだけ書き出す
4. クレイジー8 (5分)
  - 30秒くらいで1つ書く＆10秒くらい休むを繰り返してアイデアを8つ紙に書き出す
5. サイレント投票 (5分)
  - 何個投票してもOK
6. 3分ディスカッション (10分)
  - 票が集まったアイデアについて3分以内ずつディスカッション
7. 最終投票 (5分)
  - 手持ち1票だけ投票
8. アイデア採択 (5分)
  - 採用するアイデアを決定
9. プロトタイピング (30分)
  - 内側用チームと外側用チームに分かれて作業
  - ドアに貼るところまで時間内に収める

![Evernote Snapshot 20150326 213239.jpg](https://qiita-image-store.s3.amazonaws.com/0/27176/5df2aff5-8258-91a9-59f7-bed96ac2d95c.jpeg)

![2015-03-29 16.04.58.jpg](https://qiita-image-store.s3.amazonaws.com/0/27176/23f89f5a-ea35-d663-2da3-f55656fc46a6.jpeg)


# 気づいたこと

前回挙げた大事ポイントは大体今回も同じく大事でした。それ以外だと手を動かす作業や難しい選択があったりして発生したポイントがいくつかありました。

1. フェーズの意味を伝える
今の時間は「何をすべきか」「何をすべきでないか」「どんな目的や意味があるのか」「以降のフェーズにどうつながるのか」をハッキリと伝えることはとても大事だと感じました。

2. すぐに軌道修正できるように目を配る
次のフェーズでやることまでしているメンバーに「それは次のフェーズでやるから今はこの作業だけに集中すればいいんだよ」と伝える場面がありましたが、すぐに軌道修正してあげないと大幅にずれてしまう可能性もあるのでみんなが何をしているのか良く目を配らないとダメですね。

3. 決断を促す
アイデア採択のフェーズで、アイデアがなかなか決められないまま時間が迫ってきたのでリーダー的メンバーに決めてもらいましたが本人は戸惑いもあったのかかなり悩んでいました。次からはリーダーには事前に個別で「決めきれない時はあなたに決めてもらいます」と伝えて、本人だけは心の準備をしてもらうと戸惑わず思い切って決められるかなと思いました。

4. アジャスト
内側用貼り紙と外側用貼り紙の2つプロトタイピングする予定でしたが、外側用貼り紙が殊の外難問でどのアイデアも採用に至らなかったので、今回は内側用だけ作ることにしました。状況によってはこういうアジャストも必要かと思いますが、時間配分とかフェーズとかは変更しだすとスプリントプランが崩壊するだけだと思うのでそこは死守すべきかなとは思います。

5. 練習大事
今回は全員が既に30分のピザスプリントをしたメンバーだったので、だいたいスプリントの流れややることは想像がついたようでスムーズに進行しました。30分のピザスプリントでもいいのでやはり一度練習しておくと本番の進行がうまくいくのだと思います。

# あとがき

やはり予想通り採用するアイデアを決めるフェーズで苦戦しました。出だしはディスカッションが活発で順調なようにみえるけどそれは「決定する」のとは別の話で、残り時間が少なくなるにつれて徐々に「早く決めなくては」という雰囲気は出てくるけどなかなか決められない。「決めるための議論」に慣れている人って実は少ないのかもしれない。と思いました。

次回は、これまでに分かったファシリテーションのポイントをまとめたいと思います。
UnityでPublishしてXCodeでアプリを実行すると「You are using Unity iPhone Basic. You are not allowed to remove the Unity splash screen from your game」なるエラーが出る問題。


Unityでシミュレータや実機デバッグする際に、

```
You are using Unity iPhone Basic. You are not allowed to remove the Unity splash screen from your game
```
なるエラーが発生。

エラーの内容は、ベーシックライセンスの奴はスプラッシュ画像を差し替えるんじゃねーよっておっしゃってるが、そんなのやってないよ(´Д⊂ｸﾞｽﾝ

というわけで、スプラッシュの設定が入っていそうな所を削除して対応。

XCodeのプロジェクト内にある、Info.plistに

```
UILaunchStoryboardName
```

のキーがあるので、これを削除して、Runしたら正常に実行ができるようになりました。
Newrelic使ってるRailsサイトでガラケーのSSLは無理？？

いくら自前のサイトをSSL証明書買って頑張っても、newrelicのJSを取りに行くので「このサイトは安全でない可能性があります」というあの嫌なメッセージが多発する気がするのですが。。。調査中

[Ignoring specific transactions](https://docs.newrelic.com/docs/agents/ruby-agent/installation-configuration/ignoring-specific-transactions)

とか読んでみたもののControllerレベルではなくViewレベルでJS取ってくるのを抑止したいんですけど、誰か教えて
UIViewをCGGradientでグラデーションさせる

@takabosoft さんとの議論で色々わかったので更新しました。
ありがとうございます！

---
CAGradientLayerを使っても綺麗にディザリングされず、シマシマになってハマった。

以下で綺麗にできる。

```swift:GradientView.swift
final class GradientView: UIView {
  override func draw(_ rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()!
    
    let startColor = UIColor.black.cgColor
    let endColor = UIColor.darkGray.cgColor
    let colors = [startColor, endColor] as CFArray
    
    let locations = [0, 1] as [CGFloat]
    
    let space = CGColorSpaceCreateDeviceRGB()
    
    let gradient = CGGradient(colorsSpace: space, colors: colors, locations: locations)!
    context.drawLinearGradient(gradient, start: .zero, end: CGPoint(x: rect.width, y: rect.height), options: [])
  }
}
```

UIViewを継承したクラスを作って、drawRectメソッドをオーバーライドする。
その中でUIGraphicsGetCurrentContext()を呼び出すとそのViewのContextが取得出来るので、
そこにグラデーションを書き込む。これで、綺麗にディザリングがかかる。

以下はでもディザリングはかかるっぽいが、iPhone6やMacのRetinaディスプレイで見た時に、シマシマが見えてしまう。

```swift:ViewController.swift
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let rect = UIScreen.mainScreen().bounds
        let space = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
        let context = CGBitmapContextCreate(nil, UInt(rect.width), UInt(rect.height), 8, 0, space, bitmapInfo)
        
        let startColor = UIColor.blackColor().CGColor
        let endColor = UIColor.darkGrayColor().CGColor
        let colors = [startColor, endColor]
        let locations = [0, 1] as [CGFloat]
        let gradient = CGGradientCreateWithColors(space, colors, locations)
        CGContextDrawLinearGradient(context, gradient, .zeroPoint, CGPointMake(rect.width, rect.height), .allZeros)
        
        let image = UIImage(CGImage: CGBitmapContextCreateImage(context))
        view.backgroundColor = UIColor(patternImage: image!)
    }
}
```

contextの作り方とか、UIImageの作り方とかが悪いのかもしれない。
[ここ](https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_shadings/dq_shadings.html)に何か書いてありそうだけど、読む気にならない。

##画像比較
左が、UIViewを継承してかけたもの、右が、Bitmapを生成したもの。(方向を合わせるために多少実装を変えている）
そもそも、発色が全然違う。MacのRetinaディスプレイで比較すると分かりやすいと思う。
<img src="https://qiita-image-store.s3.amazonaws.com/0/44356/c7a413f4-cb18-3afd-5eb4-e6e7704ce2f4.png" width="50%"/><img src="https://qiita-image-store.s3.amazonaws.com/0/44356/3688b367-2429-2dae-2f9b-b49d44aaaa24.png" width="50%"/>

##参考にしたページ
[リファレンス](https://developer.apple.com/library/prerelease/ios/documentation/GraphicsImaging/Reference/CGGradient/index.html)
[UIGraphicsGetCurrentContextについて](http://d.hatena.ne.jp/haraguroblog/20091028/1256712479)
[グラデーションの作り方](http://akisute.com/2009/07/cggradientuitableviewcell.html)
Rails gem CarrierWave + fog を利用して AWS S3 へ画像をアップロードする

Heroku とかの Paas を利用していると発生するファイルのアップロード問題を解決するため、AWS S3 を利用し、ファイルの保存、配信を行う。

ファイルのアップロードについては gem CarrierWave を利用する。

CarrierWave の利用については以下を。

[Rails gem CarrierWave を利用してファイルをアップロードする]
(http://qiita.com/ryo-ichikawa/items/9ea8a03d78dbaa3106f4)

CarrierWave で、ファイルの保存先を AWS S3 に指定するため fog という gem を利用する。
fog は AWS S3 に限らず、様々なクラウドのサービスを Ruby から利用しやすくするためのライブラリ。

[fog : The Ruby cloud services library]
(http://fog.io/)

[GitHub リポジトリ : fog]
(https://github.com/fog/fog)


## 前提

||バージョン|
|:--|:--|
|Ruby|2.1.1|
|Rails|4.2.0|
|CarrierWave|0.10.0|
|fog|1.28.0|


## 1. AWS アカウントを作成

AWS のアカウントを持っていない場合は、以下のページをもとにアカウントを作成。

[AWS アカウント作成の流れ](http://aws.amazon.com/jp/register-flow/)


## 2. S3 へのバケット作成と IAM ユーザ作成

S3 でファイルを保管するためのバケットを作成し、同時に S3 へのアクセス用に IAM ユーザを作成。

cloudpack さんのブログがわかりやすいので参考にするとよいかも。

[Amazon S3 再入門 – AWS IAMでアクセスしてみよう！(Cyberduck 編)](http://blog.cloudpack.jp/2014/08/12/revival-amazon-s3-using-aws-iam-with-cyberduck/)


## 3. インストール

Gemfile へ fog を追記

```rb:Gemfile
gem 'fog'
```

Gemfile をインストール。
( rails プロジェクトに閉じた状態で gem をインストールしたいため --path オプションを利用 )

`$ bundle install --path vendor/bundle`


## 2. CarrierWave uploader クラスの修正

storage を fog へ変更

```app/uploaders/image_uploader.rb
storage :fog
```


## 3. CarrierWave 設定ファイルの作成

CarrierWave から fog 経由で AWS を利用するための設定。
production 環境用、development 環境用、test 環境用と、環境別にバケットを作成しておくと便利。


```config/initialize/carrierwave.rb
CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: 'アクセスキー',
    aws_secret_access_key: 'シークレットキー',
    region: 'ap-northeast-1'
  }

  case Rails.env
    when 'production'
      config.fog_directory = 'dummy'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/dummy'

    when 'development'
      config.fog_directory = 'dev.dummy'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/dev.dummy'

    when 'test'
      config.fog_directory = 'test.dummy'
      config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/test.dummy'
  end
end
```

aws_access_key と aws_secret_access_key へは 2. で作成した IAM ユーザのアクセスキーとシークレットキーを指定。

region は Tokyo リージョンなら ap-northeaset-1 となる。
詳しくは以下を参照。

[aws documentation リージョンとエンドポイント](http://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#s3_region)

fog_directory へは S3 のバケット名を指定。

asset_host へはエンドポイントとバケット名を元に指定。

---

以上。
論理削除gemをacts_as_paranoidからkakurenbo-putiに乗り換えようとした、そして諦めた

世間では論理削除そのものの是非を問うている昨今ですが
rails4にしたらacts_as_paranoidが上手くいかなくなったので[kakurenbo-puti](https://github.com/alfa-jpn/kakurenbo-puti)に乗り換え~~ました~~ようとして諦めました。
本文書は大体エッセイですｗ

kakurenbo-putiについては http://alfa.hatenablog.jp/entry/2015/02/02/233552 も御覧ください

## 何が辛かったか

* 一言で言ってしまうと **設計思想の違い**
    * acts_as_paranoid(paranoid)は利用者に論理削除を意識させないように設計されています
        * 削除のメソッドは既存のAR#destroyメソッドですし論理削除されたオブジェクトはAR#findなどではヒットしないようになってます
    * 対してkakurenbo-putiは利用者に強く物理削除とは異なることを意識させる設計となっています
        * AR#findなどで論理削除したオブジェクトがヒットするようになります、除外したい場合は用意されたスコープ(without_soft_destroyed)を使うことになりこれはacts_as_paranoidの場合と逆です
        * これは上記ブログでも作者の方が言ってるとおりです

> kakurenbo(acts_as_paranoid系のgem)はrailsの削除機能を論理削除に置き換えることを目的に作られたgemですが、kakurenbo-putiはrailsに論理削除機能を追加する目的で作られたgemです。

## kakurenbo-putiはダメなのか

* そうではないです
    * 既存のそれなりの大きさのプロジェクトに対しての置換えは正直オススメできません
        * 上記の通りスコープがparanoidと逆になるため、コードの大幅な置換えが生じます
            * 特にRailsの場合はfindとかだけではなく関連を使ってhoge.fugeのように関連モデルを呼び出すことが多々あると思われます、こういった書き方とkakurenbo-putiは相性が良くないように思えました
            * paranoidの罪なところは利用者に意識させないところで、書き方によっては物理削除されていないといけないテストが論理削除で通ってしまっていたなんてこともありそうです

        * 漏れ無くミスなく変更する自信がなくて考えてるうちに心が折れましたｗ
    * 新規プロジェクト/小さなプロジェクトなら**アリ**です
        * おすすめできないのは変更が必要な箇所が把握できないほど多いプロジェクトです
        * 論理削除の箇所を把握しながら進められるのであれば採用しても良いと思います
        * 少なくともacts_as_paranoidのような既存の機能の置き換え型のgemよりは将来性があるかと思います
              * ※*論理削除自体の是非は一旦置いときますｗ*

## kakurenbo-putiを使わない場合どうするのか

* 削除フラグではなく 削除テーブル を使うのが良いのではないでしょうか
    * 別に新しい技術でもなんでもないのです
    * 論理削除したいタイミングで元のテーブルから別テーブルにコピーするやつです
    * テーブル構成は複雑になりますが、SQLなどはシンプルになるので変なミスが少なくなるんじゃないでしょうか
    * 論理削除相当のメソッドや復活の呪文(メソッド)は提供されてないと思うので自前で用意しないといけないってのはありますが、これが一番ラクな気がします
    * http://blog.webcreativepark.net/2008/05/26-103152.html に少し記述があるのを見つけました、たぶん探せば沢山情報出てくると思います