OmniAICreator/Qiita-1.07M huggingface dataset:
python in リスト の参照とin リストから作った辞書内包の参照との速度を比較してみた。

はじめに
---
前回、要素 in リストの参照が辞書、セット型と比べ、実験にて非常に遅いことを確認した。
http://qiita.com/cof/items/05f6ffc6d4e5b062aaa9
しかるに、辞書内包表記は結構速いはずである。
もしや、参照前に毎回辞書内包を作ったら爆速なんじゃないだろうかと思ったので、調べてみた。

実行環境
---
python2.7
windows7
Intel Core i5 CPU 2.4GHz
メモリ 4.0 GB

実行条件
---
以下の二つのコードの10000要素参照、10回実行時の時間を計測することで調べてみた。要素数10000
要素 in リスト
要素 in {要素:True for 要素 in リスト}

結果(10回実行時の合計時間)
---
要素 in リスト 10.226
要素 in {要素:True for 要素 in リスト} 124.887

結論
---
辞書内包を毎回つくるのが速いわけがなかった。

実験コードたち
---

```py
def in_list(n):
  ls = [i for i in range(n)]
  for i in range(n): i in ls
  
def in_dict(n):
  ls = [i for i in range(n)]
  for i in range(n): i in {i:True for i in ls}

def exe(func,num=100):
  from timeit import timeit
  setup = 'from __main__ import ' + func.split('(')[0]
  print "%s: %s" % (func, timeit(func, setup, number=num))
if __name__=='__main__':
  q = 10**4
  exe('in_list(%d)'%q,10)
  exe('in_dict(%d)'%q,10)
```
Python で Project Euler #17「数字の文字数」

[Problem 16 「数字の文字数」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2017)

> 1 から 5 までの数字を英単語で書けば one, two, three, four, five であり, 全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている.
> では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば, 全部で何文字になるか.
> 注: 空白文字やハイフンを数えないこと. 例えば, 342 (three hundred and forty-two) は 23 文字, 115 (one hundred and fifteen) は20文字と数える. なお, "and" を使用するのは英国の慣習.

```py:Python
# n = 5
n = 1000

numbers = {1:"one", 2:"two", 3:"three", 4:"four", 5:"five", 
           6:"six", 7:"seven", 8:"eight", 9:"nine", 10:"ten", 
           11:"eleven", 12:"twelve", 13:"thirteen", 14:"fourteen", 15:"fifteen", 
           16:"sixteen", 17:"seventeen", 18:"eighteen", 19:"nineteen", 20:"twenty", 
           30:"thirty", 40:"forty", 50:"fifty", 60:"sixty", 70:"seventy", 
           80:"eighty", 90:"ninety", 1000:"one thousand"}

def number_to_word(num):
  if num in numbers:
    return numbers[num]
  elif num < 100:
    a = num % 10
    b = (num // 10) * 10
    return number_to_word(b) + "-" + number_to_word(a)
  else:
    a = num % 100
    b = num // 100
    if a == 0:
      return number_to_word(b) + " hundred"
    else:
      return number_to_word(b) + " hundred and " + number_to_word(a)

def to_character_num(word):
  return len(word.replace(" ", "").replace("-", ""))

seq = range(1, n+1)
words = map(number_to_word, seq)
result = sum(map(to_character_num, words))

print result
print result == 21124
print words[:6]
print words[-3:]
```

```:結果
21124
True
['one', 'two', 'three', 'four', 'five', 'six']
['nine hundred and ninety-eight', 'nine hundred and ninety-nine', 'one thousand']
```
lubuntu-15.04-beta1をVirtualBoxにインストールしてみた

lubuntu-15.04-beta1-desktop-amd64.iso
をインストールしてみた。

日本語フォントが入っていないので日本語が化ける。
インストーラでは言語をEnglishにする。

## インストール完了後

```bash:GuestAdditionsをインストール
sudo apt install -y build-essential
sudo ./VboxLinuxAdditions
sudo reboot
```

## 日本語設定

```bash:
sudo apt install -y fonts-vlgothic
sudo apt install -y fcitx-mozc
sudo reboot
```

* ibus-mozcだと日本語ON/OFFを切り替えてもアイコンが切り替わらないため使いづらかった。
* ibusがすでに入っている場合は、言語サポートで切り替える

![fcitx.png](https://qiita-image-store.s3.amazonaws.com/0/25728/951ff894-7975-fddc-8039-3463772af417.png)

## emacs

```bash:
sudo apt install -y emacs emacs-mozc
```

### フォントがカクカクなのを治す

```el:~/.emacs
(set-language-environment "Japanese")
```

### 日本語入力

```el:~/.emacs
(require 'mozc)
(setq default-input-method "japanese-mozc")
(global-set-key (kbd "C-o") 'toggle-input-method)
(global-set-key (kbd "<zenkaku-hankaku>") 'toggle-input-method)
```

* Ctrl-o で日本語入力切り替え
* 全角/半角 で日本語入力切り替え
PHPでメールを送る


日本語対応でメールを送るなら、下記のようにすれば良い。

```php
<?php

mb_language("Japanese");
mb_internal_encoding("UTF-8");

$to      = 'to@hoge.co.jp';
$subject = 'タイトル';
$message = '本文';
$headers = 'From: from@hoge.co.jp' . "\r\n";

mb_send_mail($to, $subject, $message, $headers);
```

日本語対応の必要がなければ下記でOK！

```php
<?php

$to      = 'to@hoge.co.jp';
$subject = 'title';
$message = 'body';
$headers = 'From: from@hoge.co.jp' . "\r\n";

mail($to, $subject, $message, $headers);
```

ToやCcを複数に送りたい場合は下記参照。

```php
<?php

$to      = 'asdf@hoge.co.jp' . ', ';
$to      .= 'ghjk@hoge.co.jp'
$subject = 'title';
$message = 'body';
$headers = 'From: from@hoge.co.jp' . "\r\n";
$headers .= 'Cc: qwer@hoge.co.jp' . "\r\n";
$headers .= 'Cc: tyui@hoge.co.jp' . "\r\n";

mail($to, $subject, $message, $headers);
```

（参考URL）
▼mb_send_mail：エンコード変換を行ってメールを送信する
http://php.net/manual/ja/function.mb-send-mail.php
▼mail：メールを送信する
http://php.net/manual/ja/function.mail.php
c言語でmrubyを使ってフルパスを取得する

# 前提

mruby-ioが組み込まれたmrubyである事が必要です。

# Rubyだと

```rb
puts File.realpath("./foo.txt")
```
# やってみた
mrb_module_getとmrb_class_getの使い分けが実行時に怒られるか怒られないかで
体で覚えてる段階です。

```c
#include <stdio.h>
#include "mruby.h"
#include "mruby/compile.h"
#include "mruby/string.h"

void main() {
mrb_state *mrb;
mrb_value val;
char *filepath = "./foo.txt";

mrb = mrb_open();

val = mrb_funcall(mrb, mrb_obj_value(mrb_class_get(mrb, "File")), "realpath", 1,
mrb_str_new_cstr(mrb, filepath));

char *fullpath = mrb_string_value_ptr(mrb, val);
printf("%s\n", fullpath);
}
```

# 必要になったmrubyのAPI

- mrb_open
- mrb_funcall
- mrb_obj_value
- mrb_class_get
- mrb_str_new_cstr
- mrb_string_value_ptr

# ビルド

mrubyにもpkg-config風のmruby-configがあるので、意外と簡単。

```
gcc mrubyFile.c `mruby/bin/mruby-config --cflags --ldflags --libs --ldflags-before-libs`   
```

# 関連投稿

- [mrubyでC言語のソースにrubyスクリプトを埋め込むには - Qiita](https://qiita.com/kjunichi/items/3cdea65ac3c22563b6e7)
- [mrubyにCで追加したメソッドで文字列を返すには - Qiita](https://qiita.com/kjunichi/items/916145653121779d1c77)
- [mrbgemsでC++のAPIを呼ぶgemを作るには - Qiita](https://qiita.com/kjunichi/items/c9c9b15d5c3f9d89bb05)

# 関連記事

- [mrubyでWebカメラを黒い画面にそのまま表示できるようにした](http://abrakatabura.hatenablog.com/entry/2017/02/25/080830)
- [mruby-ioでclose_writeを実装したが、不要だった件](http://abrakatabura.hatenablog.com/entry/2016/11/08/203704)
- [iOSでもCordovaプラグインを作ってmrubyを動かした](http://abrakatabura.hatenablog.com/entry/2016/10/08/072147)
- [mrubyでaobenchを動かし、GIFアニメを出力できるようにした](http://abrakatabura.hatenablog.com/entry/2016/07/23/175937)
- [mrubyのFile.openをちょっと調べたメモ](http://abrakatabura.hatenablog.com/entry/2016/10/04/065646)
- [WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した](http://abrakatabura.hatenablog.com/entry/2017/09/01/072123)
俺がmongoDBに「画像データ」として保存してみた件

mongoDBにcanvasの描画を画像データとして保存してみる。
``toDataURL()``を使う。


```py:app.py

from bottle import run, get, post, request, redirect
from bottle import TEMPLATE_PATH, jinja2_template as template
import bottle
import pymongo


app = bottle.app()
TEMPLATE_PATH.append("./templates")

@app.route('/')
def index():
	return template("index.html")

@app.route('/post', method=['POST'])
def getimg():
	img = request.forms.get('img');
	name = request.forms.get('name');

	conn=pymongo.Connection()
	db=conn.mydb
	db.imgcol
	db.imgcol.save({"name":name,"img":img})

	return redirect('/imgview')

@app.route('/imgview',method=['GET'])
def img():

	conn=pymongo.Connection()
	db=conn.mydb
	db.imgcol
	result = db.imgcol.find()

	return template("imgview.html", result=result)


if __name__=='__main__':
    app.run(host='localhost', port=8080, reloader=True)


```

canvasで四角を描画するのと名前の入力部分。

```html:index.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>

	<script src="app.js"></script>

<script>
function draw() {
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = "rgb(200, 100, 0)";
ctx.fillRect(20, 30, 60, 40);
};


function myToDataUrl(){
var canvas = document.getElementById('canvas');
var img_png_src = canvas.toDataURL();
var myname = document.getElementById('myname').value;
gotoNext('/post','img',img_png_src,'name',myname);
};


function gotoNext(action,name,value,name2,value2){
	
    var form = document.createElement("form");
    form.setAttribute("action", action);
    form.setAttribute("method", "post");
    form.style.display = "none";
    document.body.appendChild(form);

    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', name);
    input.setAttribute('value', value);
    form.appendChild(input);

    var input2 = document.createElement('input');
    input2.setAttribute('type', 'hidden');
    input2.setAttribute('name', name2);
    input2.setAttribute('value', value2);
    form.appendChild(input2);

    form.submit();
};

</script>

</head>
<body onload="draw();">

<canvas id="canvas" width="150" height="150"></canvas>
<br>
<p>name: <input id="myname" type="text" name="name" size="50"></p>
<button  onClick="myToDataUrl();">PUSH</button>

</body>
</html>

```


画像と名前をリスト表示するテンプレート

```html:imgview.html

<ul>
{% for item in result %}
<li><img src={{item.img}} alt="">{{item.name}}</li>
{% endfor %}
</ul>

```
Sublime TextでScalaを実行する

![スクリーンショット 2015-03-05 3.01.34 AM.png](https://qiita-image-store.s3.amazonaws.com/0/3305/9959e3a6-cdc9-75f9-5d6e-bfa500e0e60f.png)

Tools -> Build System -> New Build Systemを選択
下記を入力。/usr/local/bin/scalaの箇所は各々のscalaのパスに置き換えてください

```scala.sublime-build
{
    "cmd": ["/usr/local/bin/scala", "$file"],
    "working_dir": "${project_path:${folder}}",
    "selector": "source.scala"
}
```

あとはscala.sublime-buildとか名前をつけてセーブするとBuild Systemの選択肢にでてくるので、そこで選択して[Command + B]で実行できる
[Android] コマンドラインからプロファイリングする方法



## やり方


プロファイリング・スタート
プロセスIDとAndroid内部の出力ファイル名を指定する

```
adb shell am profile <プロセスID> start <出力ファイル名(Android側)>
```

サンプル
```
adb shell am profile 5397 start /sdcard/my.app.trace
```


プロセスIDの調べ方

```
adb shell ps | grep hoge
```


プロファイリング停止
```
adb shell am profile <プロセスID> stop
```


Android内からファイルを自分のPCに持ってくる
```
adb pull <出力ファイル名> <ローカルPCのフォルダorファイル名>
```

## traceviewで見る

```
traceview <ローカルでのファイル名>
```



## 参考

[Profiling Android Applications - JPCT](http://www.jpct.net/wiki/index.php/Profiling_Android_Applications "Profiling Android Applications - JPCT")


## 用語

アンドロイド、デバッグ、トレースビュー、プロファイリング、デバッギング
android, debug, debugging, traceview, profiling, adb
PacketFuでのパケットキャプチャ


rubyでパケットキャプチャツールってないのかなの思ったら[Qiitaの記事:PacketFuでARPリクエストのモニタリング](http://qiita.com/tsunolab/items/e6a15f915be62fbb31e2)でPacketFuを見つけたので試しに動かしてみた。


# 環境

- OS: Mac X 10.9.3
- Ruby: 2.2.1
- packetfu: 1.1.10
- pcaprub: 0.12.0

# インストール

gemでインストール。

```
$ gem install packetfu pcaprub
```

# とりあえず動かす

[Qiitaの記事:PacketFuでARPリクエストのモニタリング](http://qiita.com/tsunolab/items/e6a15f915be62fbb31e2)を見る限り、ディスプレイフィルタリングを利用できるらしい。

まずは本当にキャプチャできるのかを試すために以下のサンプルスクリプトを作成してみた。


```capure.rb
#!/usr/bin/env ruby

require "packetfu"
include PacketFu

def get_capture(iface,filter)
  cap = Capture.new(:iface=>iface, :start=>true,
                  :filter=>filter)
  cap.stream.each do |pkt|
    puts pkt
  end
end

if $0 == __FILE__
  iface = ARGV[0]
  filter = ARGV[1]
  get_capture(iface, filter)
end
```

以下実行結果。
root権限がないとキャプチャはできないのでご注意を。
バイナリで何かを取得しているのがわかる。

```
$ sudo ruby capture.rb en0 tcp
<??^*>????E(?a-_⢟?Ӭ
??? ???U٪1P?#
>????d<??^E(?@@?l?
???????U٪1 ??@P@?J
R??^*>????Ea??K??
??W?Y??pOj???
^Ccapture.rb:9:in `each': Interrupt
	from capture.rb:9:in `get_capture'
	from capture.rb:19:in `<main>'
$
```

# TCPパケットのパース
さてパケットをキャプチャをしているっぽいので次はTCPパケットをパースしてやる。

[PacketFuのソース](https://github.com/todb/packetfu/tree/master/lib/packetfu/protos)を見ると、L7以下の各種プロトコルのヘッダーは用意されていそう。

以下に`時刻、SrcMac, DstMac, SrcIP, SrcPort, DestIP, DestPort`を取得するスクリプトを作成した。

```capure.rb
#!/usr/bin/env ruby

require "packetfu"
include PacketFu

def get_capture(iface,filter)
  cap = Capture.new(:iface=>iface, :start=>true,
                  :filter=>filter)
  cap.stream.each do |pkt|
    next unless TCPPacket.can_parse?(pkt)
    t_stamp  = Time.now.strftime("%Y-%m-%d %H:%M:%S.%6N")
    tcp_packet = TCPPacket.parse(pkt)
    src_mac = EthHeader.str2mac(tcp_packet.eth_src)
    dst_mac = EthHeader.str2mac(tcp_packet.eth_dst)
    src_ip = IPHeader.octet_array(tcp_packet.ip_src).join('.')
    dst_ip = IPHeader.octet_array(tcp_packet.ip_dst).join('.')
    src_port = tcp_packet.tcp_src
    dst_port = tcp_packet.tcp_dst
    puts "time:#{t_stamp},src_mac:#{src_mac},dst_mac:#{dst_mac},src_ip:#{src_ip},dst_ip:#{dst_ip},src_port:#{src_port},dst_port:#{dst_port}"
  end

end


if $0 == __FILE__
  iface = ARGV[0]
  filter = ARGV[1]
  get_capture(iface, filter)
end
```

簡単に説明すると、`next unless TCPPacket.can_parse?(pkt)`でTCPパケット以外は読み飛ばして、`TCPPacket.parse(pkt)`でTCPパケットをパースしL2->L4までの構造体にいい感じに値を格納してくれているみたい。
その後は見やすいように変換処理をしているだけ。

実行すると以下のように表示される。

```
$ sudo ruby capture.rb en0 tcp
time:2015-03-05 01:24:07.268786,src_mac:xx:xx:c2:d3:5e:2a,dst_mac:xx:xx:8e:98:df:64,src_ip:172.20.10.5,dst_ip:118.151.171.74,src_port:50338,dst_port:80
```

これは結構便利そう。
狭義のVirtualDOMと広義のVirtualDOM

## TL;DR

VirtualDOMを狭義と広義に分けて定義すると、

* 狭義のVirtualDOMとは、実際のDOMを表象する構造体
* 広義のVirtualDOMとは、狭義のVirtualDOMに加えてdiff, patchメカニズム

とすることができ、React.js（及びVirtualDOM実装と呼ばれる[Matt-Esch/virtual-dom](https://github.com/Matt-Esch/virtual-dom)や[segmentio/deku](https://github.com/segmentio/deku)）がシンプルなのは後者を実装しているからである。

## Ractive.jsとReact.jsはどう違うか、という話

なるほどRactive.jsのリポジトリにはvirtualdomという名のディレクトリがある。このvirtualdomディレクトリの中では、構造体をDOMへと投影するような実装がされている。このことを根拠に、Ractive.jsはVirtualDOMと呼ぶこともできる。

Ractive.jsにおける実際のDOM変更処理はViewModel（端的に説明するとRactiveインスタンス生成時に`data`をラップしたもの）のうち、変更された部分をマークしておいて、紐付いたDOMパーツをアップデートするというアプローチが採用されている。これはReact.jsの「実際のDOMに対応する構造体を`state`変更ごとに生成し、変更前後の構造体を比較することでDOM変更の回数を小さくする」アプローチとは全く異なる。

Ractive.jsはVue.jsのようにドラスティックな変更をViewModelに対して施さないので、手触りとしてはより直感的だった（それでも`data`に置かれたArrayのプロトタイプチェーンがいじられたりする）。Ractiveインスタンスを実DOMの世界にマウントする際、内部的にはテンプレートのどの部分がViewModelのどのキーとバインドされるかを計算しており、そういう意味でもReact.jsより他の2way bindingに近い。

Ractive.jsのこの実装が抱える最大の問題は、ViewModelにテンプレートの内容（テンプレートのうちどんなパーツがViewModel上のどこと関係しているかという情報）を知らせるために、コードが複雑になりがちということである。

その一方で、ある値を用いて実DOMを表象する構造体を計算するのは単純な関数として実装できる。これが`React.createClass`における`render`の意味するところである。実DOMの変更が必要かは、関数の結果として得られる構造体を`state`の変更前後について比較する段階で判断される。つまり、`state` (data) が出力されるDOMや具体的なテンプレートについて関知することは不要となる。

ひいては、React.jsやその他VirtualDOM実装は`state` (data) のどこがどう変更されたかについては鈍感でも構わないということになる。単に変更されたことが通知され、DOMを表象する構造体を計算する関数さえ呼び出されればよくなる。

ということで、React.jsに代表されるVirtualDOM実装がシンプル（特に[segmentio/deku](https://github.com/segmentio/deku)はコードも少ないのですぐ読める）なのは、構造体の比較によりDOMのどの部分を変更すればいいか判断する仕組み（diff, patchのメカニズム）があるからであって、実DOMを表象する構造体の存在が実装をシンプルにするわけではない（なお、ここで指すシンプルは実装のシンプルさであり、ライブラリ利用者がシンプルに使えることを意味してはないない）。

なので、混乱を避けるために自分の中では以下のように定義している。

* 狭義のVirtualDOMとは、実際のDOMを表象する構造体
* 広義のVirtualDOMとは、狭義のVirtualDOMに加えてdiff, patchメカニズム

## で、Ractive.jsどうなの

前述したとおり、VirtualDOM実装は内部的にシンプルな実装ではあるが、ライブラリ利用者がシンプルに使えるわけではない。`render`するまでの道のりにしても、JavaScriptの知識がないとゴールまでたどり着けない。ゴールへたどり着く早さはやはりRactive.js含む2way bindingに一日の長がある。

## 参考資料

[Virtual DOM and diffing algorithm](https://gist.github.com/Raynos/8414846)
python リスト、辞書、セット型のinを使った時の参照速度を調べてみた。

はじめに
---
下記サイトには次のことが記載されている。
setsや辞書を使った要素の検証（O(1)）は、配列の検索（O(n)）よりも高速です。 a in b を調べるとき、bはリストやタプルではなくsetsや辞書であるべきです。
http://www.peignot.net/python-speed

本当なのかしらん？と思ったのと、本当だとしてどれくらい違うんじゃい？と気になったので実際に試してみた。

実行環境
---
python2.7
windows7
Intel Core i5 CPU 2.4GHz
メモリ 4.0 GB

実行条件
---
リスト、辞書、セット型で、1の倍数ごと、2の倍数ごと、3の倍数ごとの整数列（要素数100万個）を作り、1から1万までのinでの参照を行った。1の倍数ごと、2の倍数ごと、3の倍数ごとの整数列を作ったのはヒット率の処理速度への影響を調べるためである。
なお、各テスト回数は合計10回ずつである。
詳細は下記コード参照。

結果
---
死ぬほどリストの参照が遅い反面、辞書、セット型については超高速であった。リストにおいては、ヒット率が高い場合よりも、ヒット率が低い場合には処理速度が明らかに落ちることが見受けられた。なお、単位は秒であり、10回実行した時の合計時間である。
他方、辞書型、セット型に関してはそこまでの処理速度の低下は見受けられなかった。（3/5 8:08　範囲が誤っていたため図を修正）
![speed_in.png](https://qiita-image-store.s3.amazonaws.com/0/70480/80e0ad8b-6d68-a204-ec49-51b2e250aa0c.png)


結論
---
要素数が多いリストで
要素 in リスト
的な文を書くのはできる限り避けるべきである。本当に死ぬほど遅い。

実験コードたち
---

```py
def lists(q,h):
  ls = [i for i in range(0,q*h,h)]
  for i in range(q): i in ls

def dicts(q,h):
  dc = {i:i for i in range(0,q*h,h)}
  for i in range(q): i in dc  

def setts(q,h):
  st = set(i for i in range(0,q*h,h))
  for i in range(q): i in st

def exe(func,num=100):
  from timeit import timeit
  setup = 'from __main__ import ' + func[:5]
  print "%s: %s" % (func, timeit(func, setup, number=num))

if __name__=='__main__':
  q = 10**4
  funcs = ['lists','dicts','setts']
  hits = [1,2,3]
  for h in hits:
    for f in funcs:
      func = '%s(%s, %s)'  % (f,q,h)
      print func
      exe(func,10)
```
HP Chromebook 11の電源が入らない

そういえば一昨日からHP Chromebook 11に電源アダプタを挿していても「低電力の充電器に接続されています。」と表示されていて気になっていたのですが、今日はついに作業中に電源が落ちてLEDも点灯しなくなり電源が入らなくなりました。困ってしまいググったところ[Unable to Charge or Turn on HP Chromebook 11](http://h30434.www3.hp.com/t5/Notebook-Lockups-Freezes-Hangs/Unable-to-Charge-or-Turn-on-HP-Chromebook-11/td-p/3513907)という投稿を見つけました。結構同じ現象で困っている人がいるようです。なんとか充電が開始されるようになったのですが、教育機関などで大量に購入したところはここに書いてある復旧手順は現実的ではないです。コンセプトはよい端末なのですが。


## 裏蓋を外す

まず基盤に触れるように裏蓋を外すのですが、結構大変です。青色のゴム足を下にあるねじを外さないと裏蓋が取れません。大きい方はマイナスドライバをてこにしてなんとか外れたのですが、小さい方はどうしても外せず半分だけ裏蓋が開いた状態で作業しました。[ココ](https://plus.google.com/photos/109955481989177063222/albums/6012256117845139825/6012256117803552962?pid=6012256117803552962&oid=109955481989177063222)の画像だと全部外せるようなのですが。

## 復旧手順

[Unable to Charge or Turn on HP Chromebook 11](http://h30434.www3.hp.com/t5/Notebook-Lockups-Freezes-Hangs/Unable-to-Charge-or-Turn-on-HP-Chromebook-11/td-p/3513907)のスレッドにある手順で復旧作業をします。

1. 電源アダプタを外す
2. バッテリーコネクタを外し少しの間そのままにする
3. 電源アダプタを挿してLEDが点灯するまで待つ
4. LEDが赤く点灯した後、黄色く点灯して充電が開始する

![battery-connector.png](https://qiita-image-store.s3.amazonaws.com/0/43745/254ecfb1-7355-023a-3e76-ec53fcafa25e.png)
wordpressでデフォルトの管理画面(wp-admin)以外に管理者用のページを書きたいけどadmin-barはとっておきたい、という時の対処方法

以下のコードをfunctions.php あたりに実装すればOK。

この場合、WPにログインした状態で、http://yourdomain.com/hogehoge
にアクセスした場合に、WP謹製のadmin-barが表示される。

 ```lang:functions.php
add_filter("show_admin_bar", function(){
  return is_page("hogehoge") AND is_user_logged_in()? true: false;
});
```

なにが嬉しいかと；

たとえば、サイト固有の管理ページを作ったとして、でも、WPのそなえつけの管理画面に埋め込みたくない(例えばwp-admin/some_plugin_page/みたいに)、管理ページのデザインを自由に作りたい、でも、ユーザーにはWPにログインしていることをアピールしたい、ってな場合には有効だと、思う。

ああ、まわりくどい、要は、つまり、WPの固有ページに、自由にWPのadmin-barを設置できますよ、と。しかも、それはけっこう嬉しくね？！って話。
ロック画面のスライドでロック解除みたいな文字の作り方

# なんのこと？

ロック画面でこういう風に光るテキストのこと

![AnimatedGradationText.gif](https://qiita-image-store.s3.amazonaws.com/0/32599/31280004-9d94-a6e2-0811-93841b1dd097.gif)

FacebookのPaperやRoomsでもローディング中のアニメーションとして使われています。
つくってみました。

![animated_gradation_text.gif](https://qiita-image-store.s3.amazonaws.com/0/32599/66aabb72-eadb-6a05-e20b-28821a6a9b83.gif)

# つくりかた
### 概要
Storyboard上で
1. UIViewControllerにUILabelをくっつけて、好きなプロパティを設定する
2. 設定したUILabelをコードと結びつける
 
StoryboardのUILabelと結びつけたコード上で 
3. CAGradientLayerでグラデーションするレイヤーをつくる
4. CATextLayerでStoryboardで設定したUILabelと同じテキストをつくる
5. 3のGradientLayerのmaskに4のTextLayerをいれる
6. グラデーションをアニメーションさせる
7. Storyboardで設定したテキストはClearColorにして見えなくする


## 1. UIViewControllerにUILabelをくっつけて、好きなプロパティを設定する。
 
こんな感じで適当にやりましょう。
![スクリーンショット 2015-03-04 22.13.49.png](https://qiita-image-store.s3.amazonaws.com/0/32599/faf745bb-e4b1-984b-d0cb-e14d57c4aa10.png)

## 2. コードと結びつける
Identity Inspector の Classにコードで書くクラス名を記述します。
![スクリーンショット 2015-03-04 22.16.33.png](https://qiita-image-store.s3.amazonaws.com/0/32599/6cedc5ec-20d8-3553-c0b7-982b56be935b.png)

## 3. CAGradientLayerでグラデーションするレイヤーをつくる

```
    _gradientLayer = [CAGradientLayer layer];
    _gradientLayer.startPoint = (CGPoint){0.0, 0.5}; //デフォルトだと縦にグラデーションするので設定
    _gradientLayer.endPoint = (CGPoint){1.0, 0.5};
    _gradientLayer.colors = @[
            (id)UIColor.blackColor.CGColor,
            (id)UIColor.whiteColor.CGColor,
            (id)UIColor.blackColor.CGColor
    ];
    _gradientLayer.locations = @[@0.0, @0.5, @1.0];
    _gradientLayer.frame = CGRectInset(self.bounds, - self.bounds.size.width, 0); //グラデーションをアニメーションさせたいので幅を大きめにしておきます。
    [self.layer addSublayer:_gradientLayer];

```


## 4. CATextLayerでテキストをつくる

```
    _maskLayer = [CATextLayer layer];
    _maskLayer.frame = CGRectMake(self.bounds.size.width, 0, self.bounds.size.width, self.bounds.size.height); //gradientlayer.mask に入れるので、gradientLayerからの相対座標にする。
    _maskLayer.string = self.text; //こういう風に書くとStoryboardで設定した値を取ってこれて便利。
    _maskLayer.font = (__bridge CFTypeRef)self.font;
    _maskLayer.fontSize = self.font.pointSize;
    _maskLayer.alignmentMode = kCAAlignmentCenter;
    _maskLayer.contentsScale = [[UIScreen mainScreen] scale];
```
## 5. 3のGradientLayerのmaskに4のTextLayerをいれる
グラデーションがテキストの形にマスクされます。

```
    _gradientLayer.mask = _maskLayer;
```

## 6. グラデーションをアニメーションさせる

CABasicAnimationやCAKeyframeAnimationを使うとCALayerのプロパティをアニメーションさせられます。今回はCAGradientLayerのlocationsをアニメーションさせます。

```
    CABasicAnimation *gradientAnimation= [CABasicAnimation animationWithKeyPath:@"locations"];
    gradientAnimation.fromValue = @[@0.0, @0.0, @0.25];
    gradientAnimation.toValue = @[@0.75, @1.0, @1.0];
    gradientAnimation.duration = 2.0;
    gradientAnimation.repeatCount = HUGE_VALF;
    [_gradientLayer addAnimation: gradientAnimation forKey:nil];
```

## 7. storyboardで設定したテキストはClearColorにして見えなくする
textLayerのテキストを見せるのでUILabelのテキストは見えなくしましょう。

```
   self.textColor = [UIColor clearColor]; // textlayerのtextをみせるため
```

## サンプルコード

書きました。
https://github.com/TomohikoSato/AnimatedGradationText
配列から空行を削除する

フィルターをかけると読みかえれば簡単です。

```pl
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @list = (
  "",
  "\t",
  "      ",
  " aaa",
);

@list = grep $_ !~ /^\s*$/, @list;
print Dumper \@list;
__END__
$VAR1 = [
          ' aaa'
        ];
```

Perl の map と grep を使う
http://perl-users.jp/articles/advent-calendar/2008/16.html
>grep: 配列をフィルターする
>map: 配列の要素を変換する
oslo.config 設定ファイルの検索パス

OpenStackで設定ファイル周りを簡単に操作するために開発、利用されているoslo.config。

参照する設定ファイルをcliのオプションで指定しなかった場合、規定のフォルダから、決められたファイル名で設定ファイルを検索してくれる。

フォルダはまず以下の順番で参照される。(https://github.com/openstack/oslo.config/blob/2.5.0/oslo_config/cfg.py#L498 _get_config_dirs関数)

1. ```~/.${project}/```
2. ```~/```
3. ```/etc/${project}/```
4. ```/etc/```

``` ${project} ```は初期化時に指定した値。
以下のように指定していた場合、```~/.foo/```等から検索される。

```py
from oslo.config import cfg

def init_oslo_config():
    cfg.CONF(project='foo')
```

ファイル名は以下のものか検索される。(https://github.com/openstack/oslo.config/blob/2.5.0/oslo_config/cfg.py#L542 find_config_files関数)

* ```${project}.conf```
* ```${prog}.conf ```

``` ${project} ```は上と同じで、``` ${prog} ```はコレもまた、初期化時に指定するもの。

```py
from oslo.config import cfg

def init_oslo_config():
    cfg.CONF(project='foo', prog='bar')
```

ただし、初期化時にprogを指定していなかった場合はプロセス名(  ```os.path.basename(sys.argv[0])```)が``` ${prog} ```となる。

参照のルールは、

* ファイルは**両方**参照する
* 検索するファイル名で上記フォルダを順番にさがす。

例えば、``` ${project} ```が*foo*, ``` ${prog} ```が*bar*で以下のようにファイルが存在する場合、設定ファイルとして参照されるのは``` /etc/foo/foo.conf ```, ``` ~/bar.conf ```になる。

* ``` ~/bar.conf ```
* ``` /etc/foo/foo.conf ```
* ``` /etc/foo/bar.conf ```
* ``` /etc/foo.conf ```
* ``` /etc/bar.conf ```

この挙動は以下のようにして確認が出来るので、想定外の設定ファイルが参照されている場合にやってみると良い。

```py
from oslo.config import cfg
print cfg.find_config_files('foo', 'bar')
```

参照された設定ファイルに同じオプションが指定されている場合、``` ${prog} ```が優先される。読み込まれる設定ファイルは後勝ちであり、``` ${project} ```, ``` ${prog} ```の順に参照されるため。

ただし、これらのファイルはプロセス起動時のパラメータに``` --config-file ```を一つでも指定していると使われない。
MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 vol.07

# Heroku 公開するまでの事前準備

MacOS X Yosemite で Heroku にアプリを公開するまでの環境構築を何回かに分けて書きます。

vol.01 [VirtualBox インストール編](http://qiita.com/hirolog/items/560ce489dce08f555876) 
vol.02 [Vagrant インストール編](http://qiita.com/hirolog/items/79c294da5225827f3f75)
vol.03 [Vagrant box作成編](http://qiita.com/hirolog/items/a57692eae892e7cdb6a7)
vol.04 [VagrantのCentOS 6.5 仮想マシン(box）起動まで](http://qiita.com/hirolog/items/0603c0b8a8c7b89a0cd4)
vol.05 [Rails 開発環境準備](http://qiita.com/hirolog/items/759f15ce91ce4e783091)
vol.06 [Git 環境を整備](http://qiita.com/hirolog/items/b2a117402c6cc0d02829)

も合わせてお読み下さい。（というか、先にこれらの操作が必要です）

ここまでやったことで、もう Ruby on Rails でアプリを開発する準備は整ってます。
先にRailsでアプリを作ったあとに Heroku にアップしても良いのですが、ここでは Heroku に公開する前提で先に設定をしてしまいます。

## Herokuアカウント取得

[Heroku 公式サイト](https://www.heroku.com/)

公式サイトに右上か、トップページにある [Sign up] からアカウントを取得します。
必要なのは 姓、名、メールアドレス ぐらいです。社名を登録しても問題無いですし、学生ならStudent、家で仕事してるなら Home office とかですね。

ですが、アドオンを追加したり、サーバーのスペックをスケールしたり、後々はクレジットカードの登録が必要になる可能性あります。あまりに適当な登録は避けたほうが良いです。

![Heroku_sign_up.png](https://qiita-image-store.s3.amazonaws.com/0/57389/4686d36d-b3bd-814f-517a-8cb16eb1314f.png)

## heroku toolbelt インストール

herokuは、ブラウザでオンライン上での操作もできるのですが、原則、操作は全てコマンドで行うと統一しておいた方が混乱が少ないです。
ネットにはオンライン操作とコマンド操作の情報が混在していて、初心者は混乱しがちですが、ほぼ全ての操作はコマンドで完結します。状況確認にブラウザアクセスでダッシュボードを見る、という使い方がオススメです。

そのコマンド操作のために、heroku toolbelt を入れる必要あります。
今回は Mac を使うと言っても、Vagrantの仮想マシン上で開発するので **Mac版 の heroku toolbelt ではない**ことに注意してください。

[heroku toolbelt Standalone 公式ダウンロードページ](https://toolbelt.heroku.com/standalone)

繰り返しますが、MacOS用ではなく Stand alone をインストールします。

仮想OSにログインしてない方は先にログインします。以降、必ず仮想OS内で作業してください。

```
vagrant up
vagrant ssh
```

先ほどのダウンロードページに記載されているコマンドを実行します。但し、管理者権限で実行しておいた方が良いかもしれないので、sudo にて実行。

```
sudo wget -qO- https://toolbelt.heroku.com/install.sh | sh
```

以下の様なメッセージが表示されるかもしれないけど、インストールはされてます。

```
This script requires superuser access to install software.
You will be prompted for your password by sudo.
Add the Heroku CLI to your PATH using:
$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.profile
```

profileにパスを追加するように言われているけど、ここでは .zshrc にパスを追加して反映しておきます。

```
echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```

これで heroku コマンドが使えるようになったと思うので試しにバージョンを表示させてみます。

```
heroku version
heroku-toolbelt/3.28.2 (x86_64-linux) ruby/2.1.5
You have no installed plugins.
```

みたいな表示がされればOK。

次はコマンドでログインしましょう。

```
heroku login
```

メアドとパスワードを求められるので入力し、Authentication successful.と表示されれば Heroku の準備完了です。

### キーワード

* MacOS X
* VirtualBox
* Vagrant
* CentOS
* Ruby on Rails
* RVM (Ruby Version Manager)
* Heroku
powershellの権限を変更する


現在の権限の取得
Get-ExecutionPolicy

権限を変更する
Set-ExecutionPolicy 設定するポリシー

Restricted 全てのスクリプトが実行禁止。デフォルト設定
Allsigned 署名されているスクリプトのみが実行可能。
Remotesigned ローカルに保存されているスクリプトは実行可能。
Unrestricted 全てのスクリプトが実行可能。
TestLinkのテストスイートとテストケースを表形式で表示するSQL文

```sql
SELECT
  ifnull(NH1.name, "") as Level1,
  ifnull(NH2.name, "") as Level2,
  ifnull(NH3.name, "") as Level3,
  ifnull(NH4.name, "") as Level4,
  ifnull(NH5.name, "") as Level5,
  ifnull(NH6.name, "") as `Test Case Name`,
  ifnull(TCV.tc_external_id, "") as `ext_id`
FROM 
  `nodes_hierarchy` as NH1
  LEFT JOIN
    `nodes_hierarchy` as NH2
  ON
    NH1.id = NH2.parent_id
    and
    NH2.node_type_id = 2
  LEFT JOIN
    `nodes_hierarchy` as NH3
  ON
    NH2.id = NH3.parent_id
    and
    NH3.node_type_id = 2
  LEFT JOIN
    `nodes_hierarchy` as NH4
  ON
    NH3.id = NH4.parent_id
    and
    NH4.node_type_id = 2
  LEFT JOIN
    `nodes_hierarchy` as NH5
  ON
    NH4.id = NH5.parent_id
    and
    NH5.node_type_id = 2
  LEFT JOIN
    `nodes_hierarchy` as NH6
  ON
    coalesce(NH5.id, NH4.id, NH3.id, NH2.id, NH1.id) = NH6.parent_id
    and
    NH6.node_type_id = 3
  LEFT JOIN
    (select * from `nodes_hierarchy` as NH7 where NH7.node_type_id = 4 group by NH7.parent_id) as NH8
  ON NH6.id = NH8.parent_id
  LEFT JOIN
    `tcversions` as TCV
  ON
    TCV.id = NH8.id
WHERE
  NH1.parent_id = 1 /* ここにプロジェクトの番号を指定 */
  and
  NH1.node_type_id = 2
```
Cookieの有効期限を設定する

1. [実行時設定](http://php.net/manual/ja/session.configuration.php)を更新する

    ```php
// 有効期限を20分
ini_set('session.gc_maxlifetime', 1200);
ini_set('session.cookie_lifetime', 1200);
```
    サーバーとクライアントの時刻が異なると、ブラウザーによっては有効期限が意図したとおりに設定されない。
上記設定のとき

    |ブラウザ|Cookieの有効期限(Expires)|
|:--|:--|
|firefox、Chrome|クライアント時刻+20分
|IE8|サーバー時刻+20分。<BR>有効期限がクライアント時刻より古いときはCookie自体が保存されない。|
__※__バージョンにより有効期限の設定方式が変わる可能性あり
1. サーバー側のセッションで有効期限を管理する

    ```php:sample
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // 最終リクエスト時刻から30分経過した
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // 最終リクエスト時刻を更新
```

> [How do I expire a PHP session after 30 minutes?](http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960)

Cookieを意図的に破棄する方法はこちらで丁寧に解説
> [PHP] リクエストパラメータ・セッションに関するまとめ
[セッションを破棄させるにはどうしたらいいか？](http://qiita.com/mpyw/items/7852213f478e8c5a2802#2-27)

```php
# サーバー側で保管しているセッションを破棄
$_SESSION = array();
session_destroy();

# クライアントのCookieを破棄（有効期限を過去日にする）
# （サーバー時刻が進んでいるとIE8では破棄されないかも）
$sess_name = session_name(); // php.iniのデフォルトは 'PHPSESSID'
if (isset($_COOKIE[$sess_name])) {
	setcookie($sess_name, '', 1, '/');
}
```
[baserCMS]メールフォームに簡単に「同意する」チェックを設ける


メールフォームでちょいちょい見かける「同意する」のチェック。
「同意する」にチェックを入れると送信できて、チェックしてないとアラートを出したり、確認画面へのボタンが無効化されていて遷移できない仕組みのアレは簡単にできます。
そう、baserCMSならね。


## 状況
1. メールフォームに「同意する」チェックを設けたい
 - 同意するにチェックを入れないと、確認ボタンをクリックした際にアラートを表示して、確認画面へ遷移させない
 - 同意するにチェックを入れるまで、確認ボタンを無効化する

パターン別に作ってみました。


### 環境
- baserCMS 3.0.6.1


## 同意するにチェックを入れないと、確認ボタンをクリックした際にアラートを表示して、確認画面へ遷移させない

以下の内容を /theme/YOUR_THEME/Elements/mail_form.php に記載する。
※ mail_form.php は、コア（/lib/Baser/Plugin/Mail/View/Elements/mail_form.php）ファイルコピーしたもの
※ $freezed は、確認画面かどうか？を判定している変数です。

```php:mail_form.php
<?php if (!$freezed): ?>
<script>
$(function () {
	/**
	 * 同意するチェックの動作制御
	 * - 同意チェックのチェック状態を判定し、
	 * - チェックが入ってない場合はアラートを表示して、確認画面へ遷移させない
	 */
	var $checkBoxAgree = $('#BtnAgreeCheck');
	var $BtnMessageConfirm = $('#BtnMessageConfirm');
	$BtnMessageConfirm.on('click', function() {
		if (!($checkBoxAgree.prop('checked'))) {
			alert('当フォームをご利用の際には、ご同意いただくことが必要です。');
			return false;
		}
	});
});
</script>

<div class="agree-check-box">
<p>ご同意いただければ、下の「同意する」にチェックを入れてお進みください。</p>
<p class="agree-check">
	<label for="BtnAgreeCheck">
		<input type="checkbox" id="BtnAgreeCheck" />同意する
	</label>
</p>
</div>
<?php endif ?>
```


### 確認画面へ遷移させない動作のシンプルパターン

```
<?php if (!$freezed): ?>
<div class="privacy_agree" id="PrivacyAgreeArea">
    <p>同意のうえ、フォームを送信してください。</p>
    <p><label><input name="" type="checkbox" value="">上記内容に同意する</label></p>
</div>
<script>
    $(function(){
        $("#PrivacyAgreeArea").parents("form").on('submit', function(){
            if(!$("#PrivacyAgreeArea").find("[type=checkbox]").prop("checked")) {
                alert("同意のうえ、フォームを送信してください。");
                return false;
            }
        return true;
        });
    });
</script>
<?php endif; ?>
```



## 同意するにチェックを入れるまで、確認ボタンを無効化する

以下の内容を /theme/YOUR_THEME/Elements/mail_form.php に記載する。
※ mail_form.php は、コア（/lib/Baser/Plugin/Mail/View/Elements/mail_form.php）ファイルコピーしたもの
※ $freezed は、確認画面かどうか？を判定している変数です。

```php:mail_form.php
<?php if (!$freezed): ?>
<script>
$(function () {
	/**
	 * 同意するチェックの動作制御
	 * - フォームを開いたタイミングでは確認ボタンを無効化する
	 * - 同意するにチェックを入れると確認ボタンを有効化する
	 * - 確認画面では、同意チェックは表示しない
	 */
	var $checkBoxAgree = $('#BtnAgreeCheck');
	var $BtnMessageConfirm = $('#BtnMessageConfirm');
	/* 同意チェックのチェック状態を判定し、確認ボタンを無効化・有効化する */
	var agreeCheck = function() {
		var isCheck = $checkBoxAgree.prop('checked');
		if (isCheck) {
			$BtnMessageConfirm.prop('disabled', false);
		} else {
			$BtnMessageConfirm.prop('disabled', true);
		}
		return isCheck;
	};
	$BtnMessageConfirm.on('click', function() {
		if (!agreeCheck()) {
			alert('当フォームをご利用の際には、ご同意いただくことが必要です。');
			return false;
		}
	});
	$checkBoxAgree.on('change', function() {
		agreeCheck();
	});
	agreeCheck();
});
</script>

<div class="agree-check-box">
<p>ご同意いただければ、下の「同意する」にチェックを入れてお進みください。</p>
<p class="agree-check">
	<label for="BtnAgreeCheck">
		<input type="checkbox" id="BtnAgreeCheck" />同意する
	</label>
</p>
</div>
<?php endif ?>
```


## 他の仕方
メールフィールド設定で、マルチチェックボックスを利用して「同意する」チェックを作るっていうのも良さそうですね。
必須項目にして、チェックなしチェック の判定を利用するカタチでしょうか。

誰かTipsとして書いてくれるかもしれませんし、そんなことはないかもしれません。


### 参考記事

- http://api.jquery.com/prop/
http_build_query の結果の文字列が"&amp;"で連結される

連結文字はPHPの設定ファイル、php.iniのarg_separator.outputを使用する

> XAMPPの場合、*php.ini* は以下のデフォルト値

> ```ini
arg_separator.output = "&amp;"
```


php.iniの上記の設定を&amp;へ変更してサービス再起動するか、一時的に&amp;へ変更する

```php
$def_sep = ini_get('arg_separator.output');
ini_set('arg_separator.output', '&');
$q = http_build_query($data);
ini_set('arg_separator.output', $def_sep); // ini_restore("arg_separator.output");でもOK
```

[PHP: http_build_query – Manual](http://jp.php.net/http_build_query)
[http_build_queryを使うときの注意点(PHP)](http://www.multiburst.net/sometime-php/2008/12/http_build_query/)
ほげほげパターンごった煮

# Design Patterns (GoF)
http://www.hyuki.com/dp/
http://www.hyuki.com/dp/cat_index.html

# Pattern-Oriented Software Architecture (POSA)
http://c2.com/cgi/wiki?PatternOrientedSoftwareArchitectureOne

# Patterns of Enterprise Application Architecture (PofEAA)
http://www.martinfowler.com/eaaCatalog/index.html

# Multithread Design Patterns
http://www.hyuki.com/dp/dp2.html
http://www.hyuki.com/dp/cat_index.html#thread

# Patterns for Concurrent, Parallel, and Distributed Systems
http://www.cs.wustl.edu/~schmidt/patterns-ace.html

# Architectural Patterns and Styles
https://msdn.microsoft.com/en-us/library/ee658117.aspx

# Service Design Patterns
http://www.servicedesignpatterns.com/

# Enterprise Integration Patterns
http://www.enterpriseintegrationpatterns.com/

# Cloud Computing Patterns
http://www.cloudcomputingpatterns.org/

# AWS Cloud Design Pattern
http://aws.clouddesignpattern.org/
Android Wearでアプリをオーバーレイ表示する。

みなさんAndroid Wear使ってますか？
迷惑メールがその場でアーカイブ出来て便利ですよね。

Android Wearはまだまだアーリーアダプター層のデバイス感が否めません。
なので、Googleが提唱するWearUIも必ずしも正しいとは限りませんしいくつかのアプリでは新しいアプローチを仕掛けてきています。

![screenshot-2014-07-14-at-11-42-25-am.jpg](https://qiita-image-store.s3.amazonaws.com/0/24979/d3d66745-ee75-fb28-32d4-2ba5ed311f5e.jpeg)
`Wear Mini Launcherは画面に半透明のランチャーを表示する`
![yahoonews_androidwear_app01.jpg](https://qiita-image-store.s3.amazonaws.com/0/24979/a1db3bf0-9341-500b-177f-48bdf8914dc9.jpeg)
`Yahoo!ニュースは画面端からのスワイプでニュースを表示できる`

今回は新しいUIの実装の足掛けとしてAndroidWearの画面上に常に表示されるビューを実装してみます。
これさえできれば、Android Wearの制約（例えばカードUIに縛られたUI）を受けず広い発想で開発することが出来ます。

#仕組み
Android同様、アプリの実行時以外でコードを実行し続けるにはServiceを利用します。
Serviceで生成したViewをWindowManagerから画面レイヤーに差し込む事で、常にビューを表示させることが出来ます。

#手順
##１．Android Wear Moduleを追加
手動で追加しても、Android Studioなどのウィザードからセットでプロジェクトを作っても良いです。

##２．サービスを作る
Serviceクラスを継承したクラスを作ります。ここではViewService.javaという名称で作りました。

```ViewService.java
public class ViewService extends Service {
    private WindowManager windowManager;
    private View view;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onCreate() {
        windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = layoutInflater.inflate(R.layout.service_view, null);
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN,
                PixelFormat.TRANSPARENT);
        params.gravity = Gravity.CENTER;
        windowManager.addView(view, params);
    }

    @Override
    public void onDestroy() {
        windowManager.removeView(view);
        super.onDestroy();
    }
}

```
onCreate時にWindowManagerへViewを差し込んでいます。
R.layout.service_viewには、オーバーレイするViewのxmlを指定してください。

##３．サービスを開始する
```MainActivity.java
Intent i = new Intent(MainActivity.this, ViewService.class);
startService(i);
```
任意の場所でstartServiceを呼ぶことでオーバーレイが開始されます。
停止する際は`stopService(intent)`です。

##４．パーミッションとサービスの宣言
```AndroidManifest.xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
~
<service android:name=".ViewService"/>
```
Serviceを実行するためにServiceを宣言します。
また、WindowManagerからビューの貼り付けを行ったりするのでパーミッションも宣言してください。


----

以上でAndroidWearへのオーバーレイが実装できます。
素敵な時計向けUIを作ってみましょう！
ジェネリック使ったTryParse

[TypeDescriptor クラス](https://msdn.microsoft.com/ja-jp/library/system.componentmodel.typedescriptor(v=vs.110).aspx)を使用

第2引数resultに初期値を設定したくなかったので、outからrefに変更。

```csharp
using System.ComponentModel;

public static class MyTryParse
{
    public static bool TryParse<T>(string input, ref T result)
    {
        try
        {



            var converter = TypeDescriptor.GetConverter(typeof(T));
            if(converter != null)
            {
                //ConvertFromString(string text)の戻りは object なので T型でキャストする
                result = (T)converter.ConvertFromString(input);
                return true;
            }
            return false;
        }
        catch
        {
            return false;
        }
    }
}
```
__サンプル__

```csharp
int i=0, j=0;
float f = 0.0f;
double d = 0.0d;
decimal m = 0.0m;
bool a = false;

// int変換
a = MyTryParse.TryParse<int>("a", ref i);
Console.WriteLine(a + ":" + i); // False:0
a = MyTryParse.TryParse<int>("1", ref i);
Console.WriteLine(a + ":" + i); // True:1
a = MyTryParse.TryParse<int>("0.1", ref j);
Console.WriteLine(a + ":" + j); // False:0
// float変換
a = MyTryParse.TryParse<float>("0.1", ref f);
Console.WriteLine(a + ":" + f); // True:0.1
// double変換
a = MyTryParse.TryParse<double>("0.1", ref d);
Console.WriteLine(a + ":" + d); // True:0.1
// decimal変換
a = MyTryParse.TryParse<decimal>("79228162514264337593543950335", ref m);
Console.WriteLine(a + ":" + m); // True:79228162514264337593543950335
```

### 型変換できるかどうかだけ確認する

> [Generic TryParse](http://stackoverflow.com/questions/2961656/generic-tryparse)

```csharp
public static bool Is<T>(this string input)
{
    try
    {
        TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
    }
    catch
    {
        return false;
    }

    return true;
}
```

ジェネリックを使わない

```csharp
public static bool Is(this string input, Type targetType)
{
    try
    {
        TypeDescriptor.GetConverter(targetType).ConvertFromString(input);
        return true;
    }
    catch
    {
        return false;
    }
}
```
Pixi.js v2って何が変わったの? <メモだけ>

ここに書いてあった。という今更ネタ。

[Pixi.js v2 is here!](http://www.goodboydigital.com/pixi-js-v2-fastest-2d-webgl-renderer/)

というか、しばらく見ないうちに、Pixi.js v3のリリース秒読みっぽいし。。。。

[Pixi v3 Bunnymark](http://www.goodboydigital.com/pixi-v3-bunnymark/)

これ、現在開発中版のv3を使ってる模様。(console.logで確認できる)

早！というか、速！！！

[GoodBoyDigital/pixi.js(github)](https://github.com/GoodBoyDigital/pixi.js)も、猛烈に更新されてるので、要チェック！
ฅ(・ω・ฅ){ Thor を利用した CLI Application を DRY にするちょっとやり過ぎな enel gem } #ruby #thor

## :zap: 概要
Thor を利用した CLI Application を DRY にするちょっとやり過ぎな enel gem を作成した

## :baby_chick: enel gem 利用前
Thor を利用した CLI アプリケーション を作成するとき、各コマンドの呼び出しは似たようなものになりがち。
Thor を継承したクラスのロジックはできるだけ薄くする。
テスタビリティ向上のため。

すると、似たようなクラスの呼び出しロジックばかりが残る。
何度も書きたくない。
DRY にしたい。

~~~ruby:hoge.rb
require 'thor'

class Hoge < Thor
  desc 'hoge1', 'hoge1'
  def hoge1
    Hoge::Commands::Hoge1.new.run
  end

  desc 'hoge2', 'hoge2'
  def hoge2(args1)
    Hoge::Commands::Hoge2.new.run(args1)
  end

  desc 'hoge3', 'hoge3'
  def hoge3(args1, *options)
    Hoge::Commands::Hoge3.new.run(args1, *options)
  end

  # hoge4, hoge5... more!
end

Hoge.start(ARGV)
~~~

~~~ruby:./commands/hoges.rb
module Hoge::Commands
  class Hoge1
    def run
    end
  end
end
~~~

## :chicken: enel gem 利用後
こう書けるようにします。
※ Thor の仕組み上、メソッドの宣言は省略できない。
   この部分に関しては別途別のコードジェネレータを作るのが良いかな、と思っている

~~~ruby:hoge.rb
require 'thor'
require 'active_support/inflector'
require 'enel'
require_relative 'commands/hoges'

class Hoge < ::Thor
  extend Enel

  desc 'hoge1', 'hoge1'
  def hoge1
  end

  desc 'hoge2', 'hoge2'
  def hoge2(args1)
  end

  desc 'hoge3', 'hoge3'
  def hoge3(args1, *options)
  end

  # hoge4, hoge5... more!

  # ここに自分で考えた Command 呼び出し規約に基づいたロジックを記述する
  define_call_command(proc { |*args|
    command = args.first.to_s.camelize
    params = args[1..-1]
    puts Object.const_get("Commands::#{command}").new.run(*params)
  })
end

Hoge.start(ARGV)
~~~

~~~ruby:./commands/hoges.rb
module Hoge::Commands
  class Hoge1
    def run
    end
  end
end
~~~


* 実行結果

~~~bash
$ ruby hoge.rb hoge1
hoge1
$ ruby hoge.rb hoge2 a
a
$ ruby hoge.rb hoge3 a b c
a
b
c
~~~

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [enel gem GitHub](https://github.com/tbpgr/enel)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [enel gem RubyGems](https://rubygems.org/gems/enel)
Windowsパスワード復号用の鍵ペアを全リージョンで共通化する


AWS EC2のWindowsインスタンスのAdministratorパスワードはKey Pairを使って復号するが、
マネージメントコンソールでKey Pairを作成すると、リージョンごとに鍵がバラバラになって管理が面倒。

そこで、手元で作成した公開鍵を全リージョンにインストールすることにする。

# 手順

まず秘密鍵と公開鍵のペアを作成。マネージメントコンソールに貼り付けるため、パスフレーズは空にする。

~~~
cd ~/.ssh
ssh-keygen -b 2048 -t rsa -C "windows only" -N "" -f windows.pem
~~~

作成されたキーを全リージョンにimportする。

~~~
#!/bin/bash
for region in $(aws ec2 describe-regions --query 'Regions[].RegionName' --output text); do
  echo $region
  aws --region $region ec2 import-key-pair --key-name windows --public-key-material file://~/.ssh/windows.pub
done
~~~

# 注意点

この秘密鍵はパスフレーズで保護されていないので、セキュリティレベルが低い。
LinuxインスタンスのSSH鍵には使わないこと。
goemon + pandocでmarkdownを快適に書く

twitterで↓のようにつぶやいたら、すぐにmdのひな形対応が入ってた。
@mattnさんすごい。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p>goemonでREADME.mdをpandocでhtml化してますが、とても便利です。&quot;<a href="https://twitter.com/mattn_jp">@mattn_jp</a>: goemon で *.cxx、command に make とかやってフツーに便利だった&quot;</p>&mdash; takasago (@sago35tk) <a href="https://twitter.com/sago35tk/status/573062336417693697">March 4, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


ということで、markdownをvimで書くためにgoemonを使ってみました。
goemonは、いろいろなことに使えて便利ですね。

  * [Big Sky :: 開発速度を加速するツール、goemon を書いた。](http://mattn.kaoriya.net/software/lang/go/20150223224545.htm "Big Sky :: 開発速度を加速するツール、goemon を書いた。")

## Goal

好きなエディタでmarkdownを書いて、リアルタイムプレビューできるようにする。

## きっかけ

職場で一部GitBucketを使っていますが、

  * ローカルである程度整形してからgit pushしたい
  * 社外に持ち出せない情報がある
  * atomは重かった

ので、vim + 何かで編集したくなり goemon + pandoc を使ってみました。

## 環境

Windows 8.1
go version go1.4.2 windows/amd64

## インストール

### goemon

[mattn/goemon](https://github.com/mattn/goemon "mattn/goemon") に従いgo getします。

    $ go get github.com/mattn/goemon/cmd/goemon

### pandoc

ダウンロードは [Pandoc - Installing](http://johnmacfarlane.net/pandoc/installing.html "Pandoc - Installing") から。
インストーラを実行するだけ。

#### htmlテンプレートの更新

そのままでは、goemonのライブリロードを使えない＋css無しなので以下の作業を実施します。
まずはテンプレートを書き出します。

    $ pandoc -D html > %APPDATA%\pandoc\templates\gfm.html

上記のgfm.htmlのheadタグ内に適当なcssを埋め込みます。
ここでは[sindresorhus/github-markdown-css](https://github.com/sindresorhus/github-markdown-css "sindresorhus/github-markdown-css")からgithub-markdown.cssを拝借しました。
cssの埋め込みはbodyタグ内にmarkdown-bodyを書けば完成です。

```html
<body>
    <article class="markdown-body">
    省略 (変更不要)
    </article>
</body>
</html>
```

最後に、goemonのlivereloadの設定を行います。
以下をheadタグ内に入れておきます。

```html
<script src="http://localhost:35730/livereload.js"></script>
```

## 使い方

以下のようにgoemon.ymlのひな形を作ります。
2015/3/4の更新で、mdのテンプレートをはけるようになっています。

    $ goemon -g md > goemon.yml

上記で作った設定ファイルを以下のように変更します。
変更点は、

  * pandocのオプションにtemplateを追加
  * livereloadを追加

の2点です。

```yaml
# Generated by goemon -g
tasks:
- match: '*.md'
  commands:
    - pandoc -f markdown -t html --template=gfm.html -o ${GOEMON_TARGET_DIR}/${GOEMON_TARGET_NAME}.html ${GOEMON_TARGET_FILE}
    - :livereload /
```

次に、goemonを立ち上げます。

    $ goemon --

README.md等を更新すればREADME.htmlが生成されるのでブラウザで開きます。
以降、README.mdに書き込む度にlivereloadでブラウザに反映／自動更新されます。

## 最後に

goemonは、ファイルの変更を検知 → 何かを実行という形なので、いろんなことに使えそうです。
markdown previewは他にも選択肢がありますが、ひとまず目的達成。

htmlページが長くなってくると、リロード後の表示がページトップ(一番上)になってしまうのがアレですが。。。

## リンク

  * [mattn/goemon](https://github.com/mattn/goemon "mattn/goemon")
  * [Big Sky :: 開発速度を加速するツール、goemon を書いた。](http://mattn.kaoriya.net/software/lang/go/20150223224545.htm "Big Sky :: 開発速度を加速するツール、goemon を書いた。")
  * [Pandoc - About pandoc](http://johnmacfarlane.net/pandoc/ "Pandoc - About pandoc")
  * [HTML - 多様なフォーマットに対応！ドキュメント変換ツールPandocを知ろう - Qiita](http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee "HTML - 多様なフォーマットに対応！ドキュメント変換ツールPandocを知ろう - Qiita")
UGUI multiple設定で分割した画像を動的に切り替える

#対象

　・ケットシーウェアさんの簡易SpritePackerを使うかた 　http://caitsithware.com/wordpress/archives/263
　・spriteModeをmultipleにして1枚の画像で複数の表示をしたい方　

#準備
　・Resourcesフォルダの作成
　・multiple設定で分割した画像を上記フォルダに入れます


![0001.png](https://qiita-image-store.s3.amazonaws.com/0/64558/2a8fae7b-cfbf-4aef-5f44-ce286e88588b.png)






※分割方法は省きます。気が向いたら追記します


#読み込む
　　・複数割り当てられた1枚画像を1つ1つ分解して読み込んでる
　　・↑それで読み込んだやつをDictionalyで管理
　　・対象画像は必ずResuorseフォルダ以下に置くこと

```sample
    static Dictionary<string, Dictionary<string, Sprite>> spriteMstDic 
        = new Dictionary<string, Dictionary<string, Sprite>>();



    //読み込み;
    static void loadSprite(string atlasName)
    {
        if(spriteMstDic.ContainsKey(atlasName))return;
        
        Sprite[] s = Resources.LoadAll<Sprite>(atlasName);
        int len = s.Length;        
        if(len > 0){

            Dictionary<string , Sprite> sDic = new Dictionary<string,Sprite>();
       
            for( int i = 0 ; i < len ; i++){
                sDic[s[i].name] = s[i];
            }
            spriteMstDic[atlasName] = sDic;

            Debug.Log(atlasName + "アトラスを読み込みました");
        }

```


#使う

　・アトラス名と分割した名前を投げてほしい画像を取得する; 
　・例：アトラス名：spriteAtlas　スプライト名：texture001 ←ファイル名が混同してわかりにくいと思います　すみません
    
```sample
    static Sprite getSprite( string atlasName , string spriteName)
    {
        //既に登録されているならそのまま返す;
        if (spriteMstDic.ContainsKey(atlasName))
        {
            Dictionary<string , Sprite> sDic = spriteMstDic[atlasName];
            if(sDic.ContainsKey(spriteName)){
                return sDic[spriteName];
            }else{
                Debug.Log(atlasName + "に" + spriteName + "は含まれていません");
                return null;
            }
        }
        else
        {
            // 読み込んでおく
            loadAtlas(atlasName);
            //再度呼び出してみる;
            return getSprite(atlasName , spriteName);
        }
    }


```
複数ドメインで運用するRailsアプリのcookieのドメイン指定

# 状況

１つのRailsアプリを複数ドメインで運用する、
というケースがどの程度あるかはわからないが、
`www.foo.com`と`www.bar.org`で運用しているときの
`cookies`の`domain`に対する制約を適切に設定したい

# `cookies`の基本的な使い方

```rb
cookies[:foo] = {
                  value: 'xxx',
                  path: '/qiita',
                  secure: true,
                  domain: 'www.foo.com',
                  expires: 1.second.from_now
                }
```

# 設定方法

[こちら](https://github.com/rails/rails/blob/v4.2.0/actionpack/lib/action_dispatch/middleware/cookies.rb#L286-298)を参考に、以下のように記述

```rb
cookies[:foo] = {
                  value: 'xxx',
                  domain: %w(.foo.com .bar.org)
                }
```

どうやら[Rails3.1](https://github.com/rails/rails/commit/91a4193ee002d20e1b9bd637a5f14ac6213c8f39)から設定できるようになっているようですね :smiley: