OmniAICreator/Qiita-1.07M huggingface dataset:
【自分用】バッチファイルで選択肢をＧＵＩ表示するときのテンプレ

複数の選択肢。どれを選ぶかＷＡＳＤで操作させたいときにこれをコピペする
Vista以降

見た目
![無題 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/52542/7e928fc7-d31f-b437-6ce8-ca0856fd1469.png)

#準備
##①
どこにどの選択肢を配置するかをあらかじめ設定しておく
・可読性を上げるために配列風の記述をする
・[0][0]始まりではなく[1][1]にする。計算時に負の数を発生させないようにするため
・文字列の幅が違うとがたがたになる。事前に直しておくこと
　*展望：選択肢ごとの文字列の幅を調べて最大のものに合わせて自動で空白埋めさせたい*
　*　　　選択肢をそれぞれテキストファイルに突っ込んで、順にバイト数を取っていくのが確実か。*
　*　　　欠点は要素数に比例して時間がかかることと一時的なファイルの量産*

|**command[1][1]**|**command[1][2]**|**command[1][3]**|**…**|
|:-----------:|:-----------:|:-----------:|:-----------:|
|**command[2][1]**|**command[2][2]**|**command[2][3]**|**…**|
|**command[3][1]**|**command[3][2]**|**command[3][3]**|**…**|
|**：**|**：**|**：**||

##②
以下のコマンドを実行しておく。

```batch
call :cursor 0 （縦のサイズ） （横のサイズ）
rem 例：call :cursor 0 3 2
```
##③
選択肢の上に表示したい文章があれば、それを適当な名前のテキストファイルに突っ込む
予め突っ込んでおいたファイルを用意してもいい
・半角パーセントの個数に気を付ける
・バッチ内で用意する場合はecho 文章>>hoge.txt
　**予め用意しておく場合、%%変数名%%と書いておくことでバッチ内で設定した変数を読み込める。**

#実行
以下のコマンドを実行する。

```bat
call :select （WASD以外の選択肢） （さっき作ったテキストファイルの.txt以前）
```
・当然、txtを使わない場合は引数２は要らない。
・txtのディレクトリが異なる場合、フルパスで記入。フルパスの場合、スペースがあるとバグる。無くせ

#結果
WASD以外の選択肢が選ばれると、何番目が選ばれたかをerrorlevelに入れて出してくる。
```call :select jk```としたなら、JかKが押されたときに5,6が帰ってくる
その時選ばれていたコマンドは[cursorm] [cursorn]に出力。

#使っている変数（重複防止用）
arraym...縦のサイズ
arrayn...横のサイズ
cursorl[m][n]...全角スペースか【
cursorr[m][n]...全角スペースか】
cursorm...今指してる縦
cursorn...今指してる横
command[m][n]...各コマンド
commandline[m]...選択肢を横に一列ずつならべたやつ

#以下コピペ

```bat
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0




:select
	for /l %%i in (1,1,%arraym%) do (
		set commandlist[%%i]=　
		for /l %%j in (1,1,%arrayn%) do (
			set commandlist[%%i]=!commandlist[%%i]!!cursorl[%%i][%%j]!!command[%%i][%%j]!!cursorr[%%i][%%j]!
		)
	)
	cls
	if exist "%2.txt" type "%2.txt"
	for /l %%i in (1,1,%arraym%) do (
		echo !commandlist[%%i]!
	)
	choice /c wasd%1 >nul
	if %errorlevel% leq 4 (
		call :cursor %errorlevel%
		goto select
	)
	exit /b

:cursor
	if not "%3" == "" set /a arraym=%2,arrayn=%3
	set cursorl[%cursorm%][%cursorn%]=　
	set cursorr[%cursorm%][%cursorn%]=　
	call :cursor_%1
	set cursorl[%cursorm%][%cursorn%]=【
	set cursorr[%cursorm%][%cursorn%]=】
	exit /b
:cursor_0
	for /l %%i in (1,1,!arraym!) do (
		for /l %%j in (1,1,!arrayn!) do (
			set cursorl[%%i][%%j]=　
			set cursorr[%%i][%%j]=　
		)
	)
	set /a cursorm=1,cursorn=1
	exit /b
:cursor_1
	set /a cursorm=(cursorm+arraym-2)%%arraym+1
	exit /b
:cursor_2
	set /a cursorn=(cursorn+arrayn-2)%%arrayn+1
	exit /b
:cursor_3
	set /a cursorm=cursorm%%arraym+1
	exit /b
:cursor_4
	set /a cursorn=cursorn%%arrayn+1
	exit /b
```
ジーズアカデミー2016年展望②

#ジーズアカデミーの2016年！

一回SKIPしてしまいましたので、今日こそジーズの2016年展望を書きます！
ジーズ大忘年会で先ほどお話済みですが、以下に整理します。

ジーズは在学中に学ぶだけでなく、卒業してから「一緒に成長していく場所」でありたいと強く思っています。
そのためのシステムはもっともっと拡充させていくつもりです。

もう卒業した1期生、これから卒業する2期生・3期生のみなさん、2016年はもちろん、これからずっと、
超末永くよろしくお願いします！


##①G's ACADEMY **"TOKYO BASE"** in Omotesando##

2016年6月、ジーズアカデミーTOKYOの本拠地**『TOKYO BASE』**が表参道徒歩3分にできます！

![Portalpoint](http://jeek.s3.amazonaws.com/article/img/1319/arti_img1_1319.jpg)

トランジットジェネラルオフィスさんと共同で運営します。トランジットさんは、日の出の[TABLOID](http://www.tabloid-tcd.com/rent)（DJIさんが入っています）や中目黒の[The Works](http://theworks.tokyo/office-floor)（Pinterestがはいっています）などを運用するイケてるシェアオフィスブランドです。この写真は我々のTOKYO BASEが入るビルの３Fに既にあるシェアオフィス[PORTAL POINT](http://portalpoint.jp/)。この雰囲気になるはずです。

![portalpoint_map](http://portalpoint.jp/wp-content/uploads/2013/06/PORTALPOINT_MAP.jpg)

場所はココ。フロアは…まだそのテナントさんが入っているので秘密ですが、このビルのどこかのフロアです。
共有が40坪、ジースが100坪弱、その周りに5坪～15坪ぐらいのシェアオフィスがたくさん入るような間取りで、トータル300坪強の広さのシェアオフィスになります。

その中の目玉は**『G's CLUB ZONE（仮）』**  。
ジーズアカデミーは『日本から世界を変えるようなサービスを産み出すような人が生まれ・集う』そんなコミュニティでありたい続けたいと思っています。
ですので、ジーズで教鞭を振るっていただくことができるスタートアップ企業にこのシェアオフィス入居の優先権を与え、会社メンバーみんなで持ち回りで「ジーズの授業で講師・チューター」してもらうことで、**「賃料を割引（最大で無料）」**していけるZONEもセットしていきます。もちろん、ジーズ卒業生は優先。

スタートアップにとってはコスト面のメリットだけでなく、スタッフの研究、将来のエンジニア採用も含めて幅広く活用できるものと思います。ぜひ「教えながら起業」検討してみてください。

細かな使用ルールはこれから整備しますが、在校生だけでなく、**卒業生・チューターも自習スペースとして利用していただき、東京中の“セカイを変えるGEEK”たちが集まる基地（BASE）になることを目指します！**

徐々に決定事項は告知していきますので、6月までお楽しみにお待ちください！


##②卒業生のためのシードアクセラレーター（VC）を設立します##

「セカイを変えるGEEKのためのシードアクセラレーター」を2016年6月設立に向けて準備始まりました。
いわゆるコーポレート・ベンチャー・キャピタル（CVC）ですが、ジーズ・デジハリ大学院などの卒業生支援を
中心として運用します。

Webサービス・アプリ、ロボット含むIoTプロダクト、EdTech、Fintech、VRなどTECH分野に限りますが、シェアオフィスやファイナンスの支援を行って行く予定です。

デジハリ大学院のメンタープログラムもセットアップされるのでプロダクトの魅力をより高めてほしいとおもっています。


##③ジーズパーカー製作中です！。##


![parker](http://tiurf.com/blog/wp-content/uploads/o0450033011150571797.jpg)

ジーズのパーカーを制作中。出来たらG's CLUBで告知します。
めっちゃイケてるやつにします。ほしい方には販売予定！！3000~5000円くらい。



##④その他##

ジーズとの連携には多くの引き合いがあり、とりあえず1月にセブもいってきます。
またC Channelさんと連携した女子向けG'sや、現在進行中の大学生向けBootCAMPなど、今後も「セカイを変えるGEEK」を一緒に育てたい企業さんと様々ななタイアップを行う予定です。

色々なプロジェクトが走りだしますが、ぜひみなさんにもジョインしていただき、一緒にやりたいと思っています。
ご一緒いただける方、ぜひお声がけください！！


スターウォーズは明日見に行ってきます！もうはやく明日になってほしい！

![sw](http://wired.jp/wp-content/gallery/151218theday/theater001.jpg)
ESP-WROOM-02 > シリアル出力のサンプル実行まで

ESP-WROOM-02がユニーバル基板でも動き出したので、シリアル出力プログラムを書き込んでみる。

## 基板実装

使用基板は以下のもの. RSTスイッチ追加したもの。
http://qiita.com/7of9/items/bc96d1cf17d4d87e1fcd


## プログラム

プログラムの参考
http://www.vstone.co.jp/vs_wiki/main/wiki.cgi?page=Arduino+IDE%A4%CE%BB%C8%A4%A4%CA%FD%A4%F2%B3%D0%A4%A8%A4%E8%A4%A6

```sketch:hello
void setup() {
  Serial.begin(115200);
}

void loop() {
  char szbuf[] = "hello";

  Serial.println(szbuf);
  delay(3000);
}
```

## プログラム書込み手順

以下で書き込める

1. IO0をGNDの方にスライドスイッチを入れる (UART Download Mode)
2. 電源をONにする
3. RSTにつけたプッシュスイッチでGNDにして、スイッチを離す
4. Sketchで書込みを行う

以上で書込みが完了したら

1. 電源をOFFにする
2. IO0をプルアップの方にスライドスイッチを入れる (Flash Boot Mode)
3. 電源をONにする

以上でシリアル通信(115200bps)で3秒ごとにhelloが表示される。
【FuelPHP】ORMモデルのFieldsetに変数で選択肢を指定する

現在私は参考書（[改訂FuelPHP入門](http://www.amazon.co.jp/dp/4800710642/)）でFuelPHPを勉強しているのですが、タイトルの内容でハマりました。

#`Orm\Model`の`$_properties`はstatic
```php:これを加えたい
$選択肢 = array(
	'value' => 'ラベル',
	//...
)
```
```php:これがやりたい
class Model_Example extends \Orm\Model
{
	protected static $_properties = array(
		'id',
		'answer' => array(
			'data_type'  => 'varchar',
			'label'      => 'セレクトボックス',
			'form'       => array('type' => 'select'),
			'options'    => $選択肢
		),
		'created_at',
		'updated_at',
	);
	//...
}
```
この方法を企んでいたのですがもちろん`$_properties`はstaticなフィールドなので例外を投げられておしまいです。

#`Controller`で対処する
`Model`側で解決できなかたので、`Controller`に選択肢追加のコードを書きます。

```php:解決法
class Controller_Example extends Controller_Template
{
	function action_example()
	{
		//...
		$fieldset = Fieldset::forge()->add_model('Model_Example');
		$fieldset->field('type')
		         ->set_options($選択肢);
		//...
	}
	//...
}
```
選択肢を`$_properties`の`options`として設定するのではなくて、
`Fieldset_Field`（`Fieldset`の`field()`でインスタンスを得られる）の
`set_options()`で設定することができるようです。
ほかにもこのようにFieldset_Fieldを抽出すれば任意の設定を与えられるようです。

Fieldset_Fieldのドキュメントは[こちら](http://fuelphp.jp/docs/1.8/classes/fieldset/field.html)
RStudioで気軽にLGTM

みんな大好きRStudioの新しいPreview版 (v0.99.825) が[リリースされました](https://www.rstudio.com/products/rstudio/download/preview/)。いくつか新しい機能がありますが、中でも注目したいのは"**RStudio Addins**"です。

プロセスとしての一連の処理を実行することが実行できたり、インタラクティブにRオブジェクトの操作ができたりと、これまでにない新しい機能で楽しむことができそうです。詳しいことはRStudioの[公式ページ](http://rstudio.github.io/rstudioaddins/)を見てもらうとして、今回はタイトルの通り、**RStudioでLGTM画像を出力する**、という話になります。

### 動作例

何はともあれこちらをご覧ください。

![eNu7cjUZRe.gif](https://raw.githubusercontent.com/uribo/uri.qiita/master/Figure/rstudio_addins_lgtm.gif)


楽しいですね。

今回はShiny Gadgets として作成しました。RStudio Addinsを配布させるためにはパッケージとしてまとめることが必要ですが、単純に呼び出すだけなら次のコードをコピペして**通常の関数の実行で済みます**。LGTMしたくなった際にはぜひお試しください。

### Rコード

``` r
# 必要なパッケージを読み込む
library(shiny)
library(shinygadgets)
library(rstudioaddins)
```

``` r
# 関数を定義する
rlgtm <- function(user = NULL, height = 400) {
  # 画像用に一時ファイルを作成
  tmpf <- tempfile()
  
  # LGTM画像のURLを取得
  #   ユーザー名を指定した場合、ユーザーのお気に入りからランダムにLGTM画像を表示
  image_url <- ifelse(is.null(user), "http://lgtm.in/g", paste("http://lgtm.in/g", user, sep = "/")) %>% 
    xml2::read_html() %>% 
    rvest::html_nodes(css = "form input") %>% 
    extract(1) %>%
    rvest::html_attr("value")
  image_ext <- tools::file_ext(image_url)
  
  # URLからファイルをダウンロード
  download.file(url      = image_url,
                destfile = paste(tmpf, image_ext, sep = "."),
                quiet    = TRUE)
  
  # 画像サイズを変更
  image <- paste(tmpf, image_ext, sep = ".") %>% 
    webshot::resize(paste0("x", height))
  
  # Shiny の部分
  ui <- imageOutput("image")
  server <- function(input, output, session) {
    output$image <- renderImage({
      list(src = image, height = height)
    })
  }
  # Viewerの起動。paneViewer()関数で出力時のviewerのサイズ（最低の高さ）を指定
  runGadget(ui, server, viewer = paneViewer(height))
}
```

``` r
# 関数の実行
rlgtm()

# ユーザー名を指定して実行
rlgtm(user = "uribo")
```

### 仕組み

簡単です。

1.  LGTM画像を <http://lgtm.in> から取得する。出力するLGTM画像は[ランダムに一枚表示してくれるページ](http://lgtm.in/g)から選ぶようにする。
    -   *user*引数により、GitHubのアカウントでお気に入りを登録している場合、そのユーザーのお気に入りから画像を表示する。

2.  `webshot::resize()`により画像のサイズ（高さ）を変更。初期値として400pxに設定。
    -   この高さがviewerの高さ（`paneViewer()`での*minHeight*引数になるので、viewerを小さくしていても拡大されるようになる。

![スクリーンショット 2015-12-19 17.00.42.png](https://qiita-image-store.s3.amazonaws.com/0/19462/8f136156-5476-d88c-77f5-a4a21ae46681.png)

LGTM!
ESP-WROOM-02 > ユニバーサル基板でも動いた > 使用部品 / 実装の写真 / 回路図

http://qiita.com/7of9/items/a24430f4a43390ae8b9f
でブレッドボードで動いたESP-WROOM-02をユニバーサル基板で実装しなおした。


## 部品

1. ESP-WROOM-02 : スイッチサイエンスさんより購入
2. FTDI Adapter : akafuguというメーカー品 (1230円)
  - http://www.akafugu.jp/ja/posts/products/ftdi-adapter/
3. その他部品
  - ストレートピンヘッダ
  - 8ピン x 2列のソケット
  - スライドスイッチ
  - 10kΩ抵抗 x 4
  - XHPコネクタ
  - CR-123A用ソケット
  - CR-123A
  - リード線 : AWG28

## 部品面

左上の抵抗１つはスライドスイッチを上にした時にIO0をプルアップするため。

右側の３つの抵抗は、右上から

  - ENのプルアップ抵抗
  - IO15のプルダウン抵抗
  - IO2のプルアップ抵抗

![DSC_0033.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/2ded89e2-56fa-8f2e-bd72-0456629dc0e0.jpeg)

## ハンダ面

- 上から2行目のF列からK列にはFTDI Adapter接続用のピンヘッダをつけている
  - 一番左はGND
  - その右の２本（オレンジ線と赤線）はTX,RXの結線
- 基板右の赤色は3V3の接続。XHPのホットに接続
- 基板右のオレンジ線３本はプルアップ抵抗の先から3V3への接続
- R列の下から4つめから2つめはスライドスイッチがついている
  - スイッチの上は右のオレンジ線に接続
  - スイッチの下はGNDに接続. プルダウン抵抗をつけていない

![DSC_0034.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/ebd3997e-d6bc-734b-f4f5-4464002d3884.jpeg)

線の色選択は失敗している。
プルアップ接続用のオレンジ線は別の色にしておけばよかった。

## 接続状態

スライドスイッチを上にすることで、IO0はHレベルになる (Flash Boot Mode)。
FTDI Adapterは3.3V設定にしている。

これでTera TermでATコマンドの応答が見られた。

![DSC_0032.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/9d4d6be7-db04-68f4-6835-b88a393ab1fb.jpeg)


## リセットスイッチ追加
(追記)

以下のようにリセットも追加した。

- RSTの端子から10k経由で3V3へ接続
- RSTの端子からプッシュスイッチ経由でGNDへ接続

プッシュスイッチを押した時にGNDに接続され、Active Lowのリセットが有効になる。


RST用のプッシュスイッチとプルアップ抵抗は右側に実装した。

以下の写真は右側の参照用。ESP-8266の左側の抵抗は見えてないので上の写真を参照ください。

![DSC_0035.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/d3751fc7-5964-af8f-7897-ce628f17427f.jpeg)



## 回路図

ESP-WROOM-02そのもののfritzingパーツは見つけていないので、似たようなものを使用した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d135964a-368a-ba31-43a3-649910a1f5b2.png)
scpコマンドを使ってローカルファイルをリモートに転送する

scpコマンドを使ってローカルファイルをリモートに転送する、またはその逆にリモートにあるファイルをローカルに落とす方法を書きます。

## なぜscpコマンドを使わなければいけないか？
scpコマンドを使わなくてもGUIでドラッグ&ドロップして、ファイルを転送することはできます。
しかし、`.git`などの隠しファイルはscpファイルを使ってでしか転送することはできません。
（隠しファイルが入ったディレクトリごとドラッグ&ドロップしても移動してくれない。）

例えばcakePHPとかをダウンロードした後に、ドラック&ドロップで丸ごとサーバーにあげても、`.htaccess`などのファイルが移動してくれないので、サーバー上でうまく動きません。

## ローカル→リモート
```unix
scp -P <ポート番号> <ローカルのパス> <ユーザ名@リモートのホスト名>:<リモートのパス>
```

ファイルを移動させる時は以上のコマンドでも大丈夫ですが、ディレクトリごと移動させたい時は、ポート番号の後に、オプション`-r`をつけてください。
<ユーザ名@リモートのホスト名>のところがわかりにくいと思いますが、リモートにssh接続ができているなら、`ssh XXXX@YYYY`の部分をコピペすれば大丈夫だと思います。ポート番号もssh接続する時のものを使えば通るかと・・


## リモート→ローカル
```unix
scp -P <ポート番号> <ユーザ名@リモートのホスト名>:<リモートのパス> <ローカルのパス>
```
これは単純にローカルとリモートの順番を逆にするだけです。

## 注意
ローカル→リモート、リモート→ローカルどちらの場合もコマンド入力はローカルでするようにしましょう。
フロントエンドエンジニアになった話

本記事はマイネット[Advent Calender](http://qiita.com/advent-calendar/2015/mynet)19日目の記事です。
今回は@hinagata_tがお送りさせていただきます。
#はじめに
簡単に自己紹介です。
web界隈に足を入れて５ヶ月ぐらい経ちました。以前はある会社でスマートフォン向けのゲーム開発を２年程携わっていました。
今はソーシャルゲームの運営、開発を行っています。
そんな私が昔と今の現状の違いを開発者として感じたことを書きます。

#環境
一番大きな変化は開発環境だったと思います。
以前
C/C++/Java/VisualStudio/eclipse/Xcode/社内フレームワーク
現在
html/css/SCSS/javascript/FreeMarkerj/Query/sublimetext/Github...

現在私はフロントエンドエンジニアとして働いているため上記のようなものを使い業務に取り組んでいます。
見ていただければ分かりますがまったく別の畑からきました。
最初はWEBエンジニアとして知ってて当然のような知識は何一つ知らずに入社したため始めはちんぷんかんぷんでした。
しかし、プログラマーとしての考えかや働き方の経験は今に活かされています。

#学ぶ
基本的な部分は同じです。
知らない知識や技術について自分で調べ、どうしても分からない時は先輩方に聞く。
技術書の他に、はてなBlogやQiitaは見るようにしています。
Web界隈に足を踏み入れて感じる事は勉強会や発表会などが毎日のように行われていて驚きました。タイミングが良い時に参加してより知識を学びモチベーションを上げるのに良いです。

フロントエンドエンジニア養成読本
リーダブルコード
辺りはフロントエンドエンジニア初心者なら読んでおいて損はないです。

#働き方
エンジニアとして新しい技術や知識を学ぶためには時間が必要不可欠です。
業務で必要な知識や趣味の開発など…

以前
・定時10時~23時
・終わらないタスク、増え続ける仕様。
・基本新規開発のため時間があればひたすらコーディング。
・19時定時、あれは嘘だ。皆頑張ってるんだから残業しよう精神。

現在
・定時10時~19時
・安定運営を目指す。新規機能の実装や不具合対応などの場合残業。
・業務の合間に技術、知識を学び共有する時間がある。


IT,ゲーム業界じゃその程度の残業時間ではまだまだぬるいと思われる方もいると思いますが一つ例として見て頂ければ助かります。
弊社はスマート化と言って業務を効率的に行う取り組みが行われています。
よりスマート化を実現するためには考える時間、知識技術を蓄える事によってより実現に向かうと私は考えているので良い取り組みだと感じでいます。
サービス影響するバグや緊急対応が必要になる場合が少なからずあります。
すべての残業＝悪とは思えませんが無くす努力をする事も大切だと感じます。

#終わりに
知識が浅く技術的な事は今回は余り書けませんでしたが今の働き方を考える良い機会になったのではないかと思います。今後は技術的な事も書けるように精進したいところです。
新しい事を学ぶという事は労力も時間も消費してしまう事ですが少なからずエンジニア的には楽しい事なのではないでしょうか。前のめりに今後も励んでいきたいです。
phpMyAdminにログインできないとき

PHPです。PHPでMySQLを使いたい。そんな最初の段階です。
MySQLを使うときにphpMyAdminがあると便利だというのを聞きつけて、早速導入。

# phpMyAdminのインストール
こちらを参考にさせていただきました。
http://www.futomi.com/lecture/macosx/phpmyadmin.html
ざっくり言えば、公式 ( https://www.phpmyadmin.net ) からzipを落として、Document Rootに移動させる。設定ファイルのテンプレートをコピーして、ちょちょいと修正。

# phpMyAdminにログイン
ここから本題。phpMyAdmin ( http://localhost/phpMyAdmin/index.php )にアクセスするも・・・ログインできない！！！
そのときのエラーメッセージはこちら。
> MySQLサーバにログインできません

ユーザもパスワードも合ってるし、もちろんサーバも立ち上がってる。

結論としては、**phpの設定ファイル php.ini が原因でした。**

以下のように、MySQLのsocketの場所を確認。

```shell-session:terminal
$ mysql_config --socket
/tmp/mysql.sock
```

php.iniで以下の3箇所を探して設定します。

```php:php.ini
...
pdo_mysql.default_socket = /tmp/mysql.sock
...
mysql.default_socket = /tmp/mysql.sock
...
mysqli.default_socket = /tmp/mysql.sock
...
```

無事ログイン成功〜

# こちらを参考にさせていただきました
http://www.mixp.net/php/121
http://tweeeety.hateblo.jp/entry/2015/07/11/191823
Unity5でのTransform参照速度比較

MonoBehaviourからTransformを参照する処理時間比較してみる

#【検証環境】
・Unity5.2.4f1（Personal Edition）
・Nexus7(Android 5.0.2)
・10万回参照した際にかかった時間を比較

#【比較項目】
①キャッシュされたメンバ
②通常
③GetComponent（ジェネリック）
④GetComponent（データ型）
⑤GetComponent（文字列）
⑥NGUI式キャッシュプロパティ
⑦ifでのnullチェック
⑧null合体演算子でのnullチェック

#【テストコード】

```
using UnityEngine;

public class Test : MonoBehaviour {
	Transform trans_ = null;
	Transform cachedTransform { get { if (this.trans_ == null) this.trans_ = this.transform; return this.trans_; } }

	void Start () {
		int count = 100000;
		float prevTime, nowTime;
		Transform tr;
		this.trans_ = this.transform;
		// ①
		prevTime = Time.realtimeSinceStartup;
		for (int i = 0; i < count; ++i) {
			tr = this.trans_;
		}
		nowTime = Time.realtimeSinceStartup;
		Debug.LogError("① this.trans_ : " + (nowTime-prevTime));
		// ②
		prevTime = Time.realtimeSinceStartup;
		for (int i = 0; i < count; ++i) {
			tr = this.transform;
		}
		nowTime = Time.realtimeSinceStartup;
		Debug.LogError("② this.transform : " + (nowTime-prevTime));
		// ③
		prevTime = Time.realtimeSinceStartup;
		for (int i = 0; i < count; ++i) {
			tr = this.GetComponent<Transform>();
		}
		nowTime = Time.realtimeSinceStartup;
		Debug.LogError("③ GetComponent<> : " + (nowTime-prevTime));
		// ④
		prevTime = Time.realtimeSinceStartup;
		for (int i = 0; i < count; ++i) {
			tr = this.GetComponent(typeof(Transform)) as Transform;
		}
		nowTime = Time.realtimeSinceStartup;
		Debug.LogError("④ GetComponent(typeof) : " + (nowTime-prevTime));
		// ⑤
		prevTime = Time.realtimeSinceStartup;
		for (int i = 0; i < count; ++i) {
			tr = this.GetComponent("Transform") as Transform;
		}
		nowTime = Time.realtimeSinceStartup;
		Debug.LogError("⑤ GetComponent(\"\") : " + (nowTime-prevTime));
		// ⑥
		prevTime = Time.realtimeSinceStartup;
		for (int i = 0; i < count; ++i) {
			tr = this.cachedTransform;
		}
		nowTime = Time.realtimeSinceStartup;
		Debug.LogError("⑥ cachedTransform : " + (nowTime-prevTime));
		// ⑦
		prevTime = Time.realtimeSinceStartup;
		for (int i = 0; i < count; ++i) {
			if (this.trans_ == null)
				this.trans_ = this.transform;
			tr = this.trans_;
		}
		nowTime = Time.realtimeSinceStartup;
		Debug.LogError("⑦ if : " + (nowTime-prevTime));
		// ⑧
		prevTime = Time.realtimeSinceStartup;
		for (int i = 0; i < count; ++i) {
			tr = this.trans_ ?? (this.trans_ = this.transform);
		}
		nowTime = Time.realtimeSinceStartup;
		Debug.LogError("⑧ ?? : " + (nowTime-prevTime));
	}
}

```

#【結果】
① this.trans_ : 0.0003967285
② this.transform : 0.008666992
③ GetComponent<> : 0.01818848
④ GetComponent(typeof) : 0.03417969
⑤ GetComponent("") : 1.000092
⑥ cachedTransform : 0.005523682
⑦ if : 0.004394531
⑧ ?? : 0.0007324219

#【まとめ】
「Transformはキャッシュすれば早い」というのは公式でも言われている通り。
NGUIで良く見るcahcedTransformは確かに効果が見られるが
UnityEditor上だと通常参照の速度が速くなっていて効果がなくなっていた。
通常参照速度はPlatform毎でそんなに違うのだろうか･･･？
またifによるnullチェックはよく言われている通りDestroyチェックが走るようなのでコストが高い。
null合体演算子はDestroyチェックが走らないので早いが使いどころは難しい。
GetComponentでTransformを参照することはまずないが比較すると倍ぐらい遅い。

セキュアか速度かのトレードオフをどこでとるかでキャッシュの設計は変わってくるだろう。
正直Transformのキャッシュにこだわるぐらいなら
文字列操作などのボトルネックになりやすい箇所を見直した方が恩恵は大きいと思う。
ChromeOSのUserAgent

「useragent 一覧」でググって見つけたページには、Chrome OSの情報が載っていませんでした。あまり利用用途のないニッチな情報ですが、備忘として残します。

## 調査環境

+ 機器：Acer ChromeBook C720  
[C720 | ノートブック - 最強の 11 インチ Chromebook | Acer](http://www.acer.co.jp/ac/ja/JP/content/series/c720)
+ 調査日：2015年12月19日

## Chrome OSのUserAgent

>Mozilla/5.0 (X11; CrOS x86_64 7520.63.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36

CrOSを含んでいて、OSのバージョン(上記の例でいうと、"x86_64 7520.63.0")が記載されているのが特徴。Linux全般と酷似してますね。

確認方法としてはベタに[診断くん](http://taruo.net/e/)でも良いですが、画面でも確認できます。

設定-Chrome OSについて-ユーザーエージェント
![Screenshot 2015-12-19 at 16.08.49.png](https://qiita-image-store.s3.amazonaws.com/0/82307/448f7f37-3940-7075-4dfc-ed28ffadcac6.png)

## ChromeOS以外のUA一覧

ググッて上位にあったものをいくつか。

+ [userAgent一覧/ユーザーエージェント一覧](http://www.openspc2.org/userAgent/)
+ [歌うキツネ : User-Agent (ユーザー エージェント) 一覧](http://utaukitune.ldblog.jp/archives/65696057.html)
+ [UserAgentからOS/ブラウザなどの調べかたのまとめ - Qiita](http://qiita.com/nightyknite/items/b2590a69f2e0135756dc)
+ [ユーザーエージェント - 早見表・一覧表 - Auroral Rays](https://sites.google.com/site/auroralrays/hayamihyou/user_agent)
How to use AppVeyor (AppVeyorの使い方)

Travis CIやCircle CIなど、GitHubと連携したCIサービスが広く使われつつあります。しかしながら、これらはWindows環境をサポートしていません。そこで、Windows環境のCIができるAppVeyor (https://www.appveyor.com/) の使い方を紹介します。

## Sign Up / ログインする

AppVeyorはGitHubアカウントで認証＆レポジトリ連携できるので、GitHubアカウントでログインします。

まず https://www.appveyor.com にアクセスします。

Topページに「SIGN UP FOR FREE」というボタンがあるので、クリックします。

![appv01.png](https://qiita-image-store.s3.amazonaws.com/0/4293/cbbf7e94-e3a1-ee5f-6d75-d71ee7842b0c.png "appv01.png")

Sign Up画面になるので、左上のプルダウンで「FREE（OSSプロジェクト用）」のコースを選んで、左下のML登録のチェックボックスを（必要なければ）外し、左中のGitHubのボタンをクリックします。

![appv02.png](https://qiita-image-store.s3.amazonaws.com/0/4293/e3c52477-b744-f1d7-bf04-d8244f95d947.png "appv02.png")

あとはGitHubの認証画面になる（はずな）ので、そこでOKを押してログインします。

## Add Project / プロジェクトを追加する

ログインができたら、新しいプロジェクトを作成します。

AppVeyorに戻ると、新規プロジェクトを追加する画面になるので、「NEW PROJECT」を選択します。

![appv03.png](https://qiita-image-store.s3.amazonaws.com/0/4293/baebdd6d-02f2-d8e0-d58d-4bd982dcfba6.png "appv03.png")

レポジトリを選択する画面になるので、AppVeyorでCIしたいレポジトリを選択します。

![appv04.png](https://qiita-image-store.s3.amazonaws.com/0/4293/c446491f-8a96-ada2-0323-bf7953e88c05.png "appv04.png")

これで新しいプロジェクトが作成されます。

## Build and Test / ビルドする

リポジトリと紐ついたプロジェクトが追加されれば、デフォルトの設定のままでもcommitやpull requestがあればCIが走るようになるはずですが、手動で最新版をビルドすることも可能です。その場合、プロジェクトのページで「NEW BUILD」ボタンをクリックします。

![appv05.png](https://qiita-image-store.s3.amazonaws.com/0/4293/da25588d-dc1e-e363-f573-1be993dc11cb.png "appv05.png")

ただし、この時にレポジトリにappveyor.ymlが登録されていなければエラーになります。appveyor.ymlを追加してpushするなり、appveyor.ymlを追加するPull Requestを作ってマージするなりすると、設定された情報を元にCIが走るはずです。
初めてDockerについて調べたのでMacで例えてみる

[Vagrant](http://qiita.com/segawa/items/e77985ed2c107505930e)、[Chef](http://qiita.com/segawa/items/1e23df98fbb54f70d467)と触ってきたので、Docker で開発環境を構築して見たいと思います。
この記事では実際に環境を構築する前に Docker について調べたことをまとめています。


# Docker について

## Docker とは？

私が最初に仕入れた Docker（ドッカー）の特徴は下記のようなものです。

- **Linux上でしか動作しない**
- **Go で書かれている**
- **アプリケーションとミドルウェアとどまらず、OS やネットワークまで含めたインフラ環境をまとめてコンテナとして管理できる**
- **一度イメージを作ってしまえば、Docker がインストールされている環境であれば、どこでも同じ状態を復元できる**

うーん、なんかわかったようなわからないような、、、
上の情報だけだと、Vagratn + Chef の上位版（もっとすごいやつ）みたいな印象を持ちました。


## コンテナとは？

Docker がコンテナでインフラ環境を管理しているとのことですが、コンテナとはいったい何なのでしょうか。
コンテナとは仮想環境をつくる際の **仮想化の方法のひとつ** で、2000年ごろからある古い技術です。

### 仮想化技術

代表的は仮想化技術には以下のものがあります。

**1. ホスト型仮想化**
ホスト OS の上に仮想化ソフトウェアをインストールし仮想環境を構築、仮想環境にゲスト OS をインストールする方法です。**VirtualBox** がホスト型の仮想化ソフトウェアです。
手軽に構築できる反面、同じマシンでOSが複数稼働するため、サーバリソースを無駄に消費します。

**2. コンテナ型仮想化**
ホストOS上にコンテナ管理ソフトウェアをインストールし、その上でコンテナを動作させる方法です。ゲストOSはインストールされず、ホストOSを論理的に分割して利用します。
**Docker** はこのコンテナ型仮想化を採用しています。
※Docker は Linux 上でした動かないため、Mac で Docker を使うにはゲストOS（Linux）が必要になります

**3. ハイパーバイザー型仮想化**
ハードウェア上に直接、ハイパーバイザーと呼ばれる仮想化ソフトウェアをインストールする方法です。このハイパーバイザーが複数の仮想環境を制御します。ホストOSがないマシンで様々なゲストOSが複数稼働している状態ですね。
**AWSのEC2** などがハイパーバイザー型仮想化になります。


というわけで Docker は VirtualBox + Vagrant + Chef の構成とは、仮想化の方法が違うということがわかりました。


## イメージとは？

Docker について理解するために、コンテナの話だけではなく **Dockerイメージ** について覚える必要があります。
Docker イメージはPCのバックアップを取る際などに利用する、ディスクイメージと似たようなものだと考えて良さそうです。つまり、ある時点のサーバの状態をそのまま保存しておけるものです。
しかも Docker だとその状態をコードで管理することもできるとか。

Vagrant + Chef では `vagrant up` 時に Vagratnfile とレシピに記述された状態にサーバを収束させるようインストール等が行われますが、Docker ではインストールするのではなく Docker イメージの状態がそのまま復元されるようです。

# なぜ Docker が話題なのか

コンテナ型仮想化は古くからある技術ですが、クラウドシステムの普及によって需要が高まったのですね。
サーバを簡単に構築・破棄できるようになったため、構築作業の自動化が加速しました。

Vagrant のような仮想環境と OS インストールを自動化するツール、Chef のようなミドルウェアのインストールや設定を自動化するツール、そして複数のサーバの自動化を管理するツール（Capistrano など）が開発されました。
Docker はこれらのすべてをカバーしているため、話題になっているようです。このカバーしている範囲の広さから最初に「上位版？」と感じたのだと思います。


# Docker の危険性

ただ、良いことばかりではないようです。

>Dockerの諸問題とRocket登場の経緯
http://deeeet.com/writing/2015/02/17/docker-bad-points/ 

こちらの記事には Docker の危険性がいろいろと挙げられています。
この辺を改善できないと、後発のサービスに一気に取って代わられる可能性がありますね。


# おわりに：Docker を Mac で例えると

Vagrant が OS X のインストーラー、Chef が AppStore だとして、**Docker は Time Machine** ですね。

Mac の任意の状態をバックアップとして取得しておけるし、新しい Mac を買ってきたら Time Machine から復元して古い Mac と全く同じ状態を再現できる。そんなツールだと理解しました。


次の記事では、実際にインストールして使ってみます。
Mac の Atom で Latex

### Mac の Atom で Latex
(2015.12.19 El Capitan) 

Mac の Atom で tex ファイルをコンパイルして、 
作成された pdf ファイルを見れるようにしました。

---
#### MacTeX の導入

[OS X El CapitanへのLaTex環境のインストール](http://nemupm.hatenablog.com/entry/2015/10/08/162629) などを参考にさせてもらいました

```
brew install caskroom/cask/brew-cask
brew cask install mactex
```

`vim ~/.zshenv` として以下を追記してパスを通す

```
# for MacTeX
export PATH="/Library/TeX/texbin:$PATH"
```

アップデート（かなり時間がかかりました。1時間半くらい。）

```
source ~/.zshenv
sudo tlmgr update --self --all
```

---
#### Atom に LaTeX, PDF View パッケージを導入

[Atom LaTeX package](https://atom.io/packages/latex) 
[Atom PDF View package](https://github.com/izuzak/atom-pdf-view/issues/45) より

```
apm install latex
apm install pdf-view
apm list --installed
```

作成された pdf を Atom で見れるようにする 
-> メニューの Atom をクリック 
-> Preferences 
-> Packages 
-> latex 
-> Settings 
-> Always Open Result in Atom にチェックを入れる

---
#### テスト

Atom を起動 
-> `Ctrl + 0` でツリーに移動 
-> `a` と押して、"test.tex" を新規作成 
-> test.tex を以下のように作成して `Ctrl + Option + b` と入力 (or Packages -> LaTeX -> Build)

```test.tex
\documentclass{article}
\begin{document}
Hello \LaTeX
\end{document}
```
CSS Tips: CSSで地味にハマったコト

地味にハマることがあったので自分のCSS Tipsとして逐次更新していきます。

# スマホサイトの右側に謎の余白
自分の所属しているサークルの公式サイトを運営しているんですが、パソコンだと綺麗に表示されるのに、何故かスマホでサイトを見ると右側に謎の余白が(´･ω･`)

## 解決策
### 1. viewport入れてみよう 

```html
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
```

### 2. box-sizing:border-boxで
width:100%とかにしてるとborderの太さとかpaddingではみ出しちゃったりするのでbox-sizingを使いましょう。これ使うとなんか勝手にborderの太さとかも考慮してくれるらしい。

```css
* {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -o-box-sizing: border-box;
    -ms-box-sizing: border-box;
    box-sizing: border-box;
}
```

### 3. overflow:hiddenしよう
自分は最終的にこれで解決しました。

```html
<html>
    <head>
    ...
    </head>

    <div class="wrap">
        <body>
            /* ここに何やら書きましょう */
        </body>
    </div>
</html>
```

bodyを適当にラッピングして

```css
.wrap { overflow: hidden; }
```

# position: absoluteが上手くいかない
![スクリーンショット 2015-12-19 16.06.50.png](https://qiita-image-store.s3.amazonaws.com/0/85665/f427e7a9-a009-4cf0-2e30-2993480c3399.png)

```html
<div class="parent">
    <div class="child">
    </div>
</div>
```

```css
.parent { background-color: red; width: 300px; height: 300px; }
.child { position: absolute; top: 5px; right: 5px; width: 50px; height: 50px; background-color: blue; }
```

カード型デザインとかで常に右上にあるボタンみたいな感じで表示したい！`position:absolute;`で親要素に対して絶対的な位置で配置したいのに...何故かbodyタグが親要素として認識されちゃう(´･ω･`)

## 解決策
### 1. 親要素をrelativeで明示する
上の場合だと親ボックスがどれかを明示していないので、bodyタグが親だと勘違いしてる感じなので、ちゃんと「これが親ボックスだよ〜」って明示してやればok
親ボックスを指定するには、指定したいボックスに`position: static`以外のpositionを指定してやればいいが、たいていは`relative`

なのでさっきの.parentに `position: relative;` をつけるだけ。

```css
.parent { position: relative; background-color: red; width: 300px; height: 300px; }
.child { position: absolute; top: 5px; right: 5px; width: 50px; height: 50px; background-color: blue; }
```

![スクリーンショット 2015-12-19 16.16.27.png](https://qiita-image-store.s3.amazonaws.com/0/85665/56dd0028-cef4-9d19-1d1a-5cb2c868ea61.png)


# bootstrapでcol使ってもなんかレイアウトが崩れちゃう
bootstrapの基本ごとを忘れていました。containerクラスで固定エリアを作成してからrowクラスを使うように徹底したら、変な感じにはならなくなりました。bootstrapの基本形忘れていました。

## 解決策
### 1. containerで囲む
ちゃんとrowクラスはcontainerクラスで囲みましょう。

```html
<div class="container">
    <div class="row">
        <div class="col-md-4">col-md-4</div>
        <div class="col-md-8">col-md-8</div>
    </div>
</div>
```

レスポンシブなら

```html
<div class="container-fluid">
    <div class="row-fluid">
        <div class="col-md-4">col-md-4</div>
        <div class="col-md-8">col-md-8</div>
    </div>
</div>
```
脱WebStorage! ハイブリッドアプリのデータ永続化(PouchDBでSQLite on Ionic)

### はじめに
[ここ](http://gonehybrid.com/dont-assume-localstorage-will-always-work-in-your-hybrid-app/)で行ってるように、ハイブリッドアプリでlocalstorageを使うのはよろしくない。
なのでSQLiteを使う。
慣れ親しんだJSONで扱える[PouchDB](http://pouchdb.com/)がよさ気なので使ってみた。

### 基本チュートリアル(これが１番わかりやすい)
- [ionic+PouchDB+SQLite](http://gonehybrid.com/how-to-use-pouchdb-sqlite-for-local-storage-in-your-ionic-app/)


### 補足
- [テーブルは`type`プロパティで表現](http://stackoverflow.com/questions/30066753/pouchdb-structure)
- DB保存場所:`/Users/[username]/Library/Developer/CoreSimulator/Devices/[id]/data/Containers/Data/Application/[id]/Documents`
- 全件取得:`DB.allDocs({ include_docs: true, attachments: true })`

``` 例)DB.allDocsの返却値
{"total_rows":253,
"offset":0,
"rows":[
	{"id":"000C105E-A22C-F4EA-A184-85C22E979B99",
	"key":"000C105E-A22C-F4EA-A184-85C22E979B99",
	"value":{"rev":"1-cc517b7f911eedde487b9a0bf4e520fb"},
	"doc":{"id":68,
			"name":"test",
			"age":25,
			"type":"users",
			"_id":"000C105E-A22C-F4EA-A184-85C22E979B99",
			"_rev":"1-cc517b7f911eedde487b9a0bf4e520fb"
			}
	},..
```
- DBに変更があるごとに`_rev`が変わるので変更した後帰ってくる`rev`を`_rev`に入れなおす必要あり。


### パフォーマンス(on iOS Simulator)
SQLiteは遅いらしいので計測

``` 全件削除(81rows)
// 397ms かかった
function removeAll(){
            var data = [];
            return $q.when(_db.allDocs({
                include_docs: true,
                attachments: true
            })).then(function(res){
                var rows = res.rows;
                for(var i=0;i<rows.length;i++){
                    var doc = rows[i].doc;
                    doc._deleted = true;
                    data.push(doc);
                }
                return $q.when(_db.bulkDocs(data));
            });
        }
```
確かにlocalstorageよりは遅い
[特にwindowsとかはもっと遅いらしい](http://sqlite.1065341.n5.nabble.com/Windows-slow-vs-iOS-OSX-fast-Performance-td65794.html)
##### 工夫
- 毎回DBにアクセスするのは時間もかかるし、angularのdata-bindingも生かせないんで、`$rootScope.$VM`にDBと同期させて保持させておく。それをラッピングしたModelFactoryでも作って、findの時は全て$VMから取得。変更を加える場合はDBに変更を加えて、返ってきたobjectの`rev`を$VMにある`_rev`をそれぞれ`id`と`_id`で比較ループして入れなおす。最後に`_rev`が新しくなったobjectを$VMに入れなおすって行く形をとる。起動時に全て`$VM`に入れてからこれらを行えばうまく少ないDBアクセス回数で運用できそう。
- `_id`以外の検索がめんどくさいので`_id`の[prefix検索](http://pouchdb.com/api.html#prefix-search)を使ってtable全件取得とか出来るように、`{_id:"users-1"}`みたいにするといい。

``` 例)変更が完了した後帰ってくるobject
{"ok":true,"id":"users-1","rev":"84-1092ef4c3c55010372d3b86ee96e2aa4"}
```

### 公式API等
- [PouchDB API](http://pouchdb.com/api.html)
- [iOS Data Storage Guide](https://developer.apple.com/icloud/documentation/data-storage/index.html)
f.date_select haml化　- haml化メモ

###erb => haml時の書き方がわからなかったので、実際にhaml化してみた
#f.date_select haml化
```lang:元のhogehoge.html.erb
<%= form_for(@job) do |f| %>
    <div>
      <%= raw sprintf(f.date_select(:audition_date, use_month_numbers: true, start_year: (Time.now.year), end_year: (Time.now.year + 2), default: Time.now(), date_separator: '%s'), '年 ', '月 ') + '日' %>
    </div>
<% end %>
```

```lang:生成されたhtml.haml
= raw sprintf(f.date_select(:audition_date, use_month_numbers: true, start_year: (Time.now.year), end_year: (Time.now.year + 2), default: Time.now(),:class =>"bootstrap-date-only-width" ,date_separator: '%s'), '年 ', '月 ') + '日'

```

**classの適用方法が分からないので困っています。どなかたご存知でしたらご教示頂けると幸いです。**



***
hamlは便利だけど、毎回どうやって書けばいいのかわからなくなり悪戦苦闘しています。

###
ベースのerbのコードは下記を参考にさせていただきました
http://qiita.com/satomin/items/6a64280eb41c2881fa31

###
erb=>hamlは下記を参考にさせていただいています。
http://qiita.com/m_doi/items/1f01fd2b1a52c2c43f1f
AWS の設定用JSONで少し幸せになる方法


昨年後半から スーツなお仕事などが入って忙しくなり、技術的なお遊びの時間が減ってたので、１年半ぶりの投稿です。

久しぶり（数年ぶり）にAWSをマジメに触ってみて、いろいろ進化してるなぁと感心してます。で、そんな中、CloudFormation を使ってみようと思ったのだけど、ちょっとした構成になると、巨大な JSONファイルになってしまって見るのがツライ…

世の中、やっぱりそう思う人は多いようで、JSONの重複キーを使ったトリッキーなコメント表現やYAML、JSON5 など、いろいろ苦労されているようです。

* [JSONにはコメント行が付けられない？ネットで見つけた方法の有用性を試してみた](http://dev.classmethod.jp/etc/adding-comment-to-json/)
* [CloudFormationテンプレートをYAMLで書いてみる【remarshal】](http://dev.classmethod.jp/cloud/aws/yaml-cloudformation-template-with-remarshal/)

* [JSON5でCloudFormationのテンプレートを書いてみる](http://dev.classmethod.jp/cloud/aws/json5-for-cfn/)

他にもいろんなDSLやツール類が出ていますが、進化の早いAWSでは公式のドキュメントを見ながら設定することが多いので、やっぱり公式ツールを使いつつ JSONに近い設定が出来る方が嬉しいです。

JSON拡張っぽいところで、[JSON5](http://json5.org/), [CSON](https://github.com/bevry/cson), [Jsonnet]() などいろいろ見てみたものの、yum くらいでさくっと入ってお手軽に使えるものがイマイチ見当たりません。自分１人で使うなら、まぁいいのですが、複数人でメンテしていくことを考えると、導入が面倒なのは避けたいところ。

はてさてどうしたものやら　と思っていたんですが、単にコメントつけたいだけ　っていうレベルであれば、正規表現でもそこそこ行けちゃうんじゃない？　ってことで、もともと AWS SDK for Rubyを使おうかと思っていたので、Ruby で書いてみました。

```ruby:
require 'json'

module JSON_cfg
	def self.load(file)
		str = ""
		file.each_line do |line|
			str = str + strip_comments(line)
		end
		return JSON.parse(str)
	end

	def self.strip_comments(str)
		return str.gsub(/\/\/[^'"]*$/, "\n")
	end
end
```

いろんなケースのコメントを考えると正規表現とか面倒になるけど、これだけでもかなり幸せになりました。
もし、コメントの中で 「'」 や 「"」 を使いたいとか、「/* 〜 */」に対応したいなら、正規表現の工夫が必要です。

使い方は単純で、Ruby でJSONファイルを読み込む時に、

```ruby:普通のJSONファイルを読み込む
open(cfg_file) do |file|
	result = JSON.load(file)
end
puts JSON.pretty_generate( result )
```

みたいにやるところを下記のように書き換えるだけ。

```ruby:コメント付きJSONっぽいファイルを読み込む
open(cfg_file) do |file|
	result = JSON_cfg.load(file)
end
puts JSON.pretty_generate( result )
```

これで、例えば下記のようなコメント付きの JSONっぽいファイルを、コメントのない正しい JSONファイルに変換出来ます。

```:変換前
{
		"name": "json_cfg",   // comments..
		"version": "0.0.1",
// from top..
		"description": "JSON for config.",
		"check": "// 消えない? "
}
```

```:変換後
{
  "name": "json_cfg",
  "version": "0.0.1",
  "description": "JSON for config.",
  "check": "// 消えない？ "
}
```

AWS SDK for Ruby を使うなら、共通のライブラリっぽくして読み込んでおいて、load のところだけ書き換えればOKです。他にも便利系メソッド、いろいろ増やせそうですね。

Ruby なので、テンプレートっぽいもので記述をDRYにする　とかも出来ると思いますが、このレベルの工夫だけでも、少し幸せになれました。ほんとにシンプルな正規表現による置換だけなので、cli の人でも ワンライナーで工夫すれば ちょっと幸せになれるんじゃないかな :-)
CakePHP3.1.xでContent-Tranfer-Encoding:base64のEmailを送る


## CakePHP3のEmailクラス

CakePHP3系ではEmailを送信を行うために、Emailクラスが用意されている。
3.0.xと3.1.xでnamespaceが異なり、3.0.xでは`Cake/Network\Email\Email`、3.1.xでは`Cake\Mailer\Email`となっている。

### 設定ファイル

`config/app.php`に設定を記述する。
app.phpの中でEmailクラスの動作に関する設定のキーは`'EmailTransport'`と`'Email'`の2つに分かれている。

#### `EmailTransport`に設定する内容
- 使用するTransport (Mail | Smtp | debug)
- Smtpを使用する際の各種パラメータ

#### `Email`に設定する内容
- 送信するメールに関する各種パラメータ

#### 設定の記述例

```php:config/app.php
'EmailTransport' => [
    'test-transport' => [ //任意の設定名
        'className' => 'Mail', //Mail or SMTP
        // SMTPの場合には、接続先に関する設定を記述
    ],
],

'Email' => [
    'default' => [ //任意の設定名
        'transport' => 'test-transport', // 'EmailTransport'で指定した設定名
        'from' => 'from@example.com',
        'bcc' => 'bcc@example.com',
    ],
],
```

### Emailクラスを使用したメールの送信例

#### コード
```
<?php
namespace App\Shell;

use Cake\Console\Shell;
use Cake\Mailer\Email;

class MailShell extends Shell
{

    public function main()
    {
        $email = new Cakephp3Base64Email('default');
        $mail = $email->to('to@example.com')
                      ->subject('日本語のSubject')
                      ->send('こんにちは');
        debug($mail);
    }
}
```

#### 実行結果
```
########## DEBUG ##########
[
        'headers' => 'From: from@example.com
To: to@example.com
Date: Sat, 19 Dec 2015 05:47:01 +0000
Message-ID: <1539be147f13422484f56c9797600168@localhost>
Subject: =?UTF-8?B?5pel5pys6Kqe44GuU3ViamVjdA==?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit',
        'message' => 'こんにちは

'
]
###########################
```

# Content-Transfer-Encoding:base64 でメールを送りたい
Emailの環境は様々で、Emailクラスを使用したの例のようにcharset=UTF-8でContent-Transfer-Encoding:8bitのメールを正常に受信・表示できない環境も存在する。
Content-Transfer-EncodingはBase64にしたいというケースはまだまだあるだろうと思う。

## Cakephp3Base64Emailクラス
メールの本文をBase64エンコードし、Content-Transfer-Encoding: Base64 で送信をするCakehphp3Base64Emailクラスを作成した。
[Packagistで公開している](https://packagist.org/packages/oh-sky/cakephp3-base64-email)ので、comporserでインストールできる。

### インストール
```sh:how-to-install
composer require oh-sky/cakephp3-base64-email
```

### 設定
Emailクラスと共通

### 使用例

#### コード
```
<?php
namespace App\Shell;

use Cake\Console\Shell;
use OhSky\Cakephp3Base64Email;

class MailShell extends Shell
{

    public function main()
    {
        $email = new Cakephp3Base64Email('default');
        $mail = $email
                      ->to('to@example.com')
                      ->subject('日本語のSubject')
                      ->send('こんにちは');
        debug($mail);
    }

}
```
#### 実行結果
```
########## DEBUG ##########
[
        'headers' => 'From: from@example.com
To: to@example.com
Date: Sat, 19 Dec 2015 06:12:52 +0000
Message-ID: <641683d921924f7ea3006b8cc7f95475@localhost>
Subject: =?UTF-8?B?5pel5pys6Kqe44GuU3ViamVjdA==?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64',
        'message' => '44GT44KT44Gr44Gh44GvCg==

'
]
###########################
```
このように、本文がBase64でエンコードされ、ヘッダのContent-Transfer-Encodingの値がbase64になる。
アドビスカウトを使用してみた

iPhoneアプリの機能を使用中にアプリが落ちる不具合があったので、AdobeScoutを使用して調査してみた。

①AdobeScoutをPCマシンに導入する。
Adobeサイトに入って、インストールする場所があるので、そこでインストール。

②iPhoneアプリにAdobeScoutを導入する。
AppleStoreでAdobeScoutアプリが無料で置いてあるので、そこでインストール。

③PCマシンとiPhoneのネットワーク環境を同じに設定する。

④マシンのAdobeScoutを起動している状態で、iPhoneのアプリを起動すれば、
自動でPCマシンのAdobeScout上にデータが入ってくる。

⑤プロファイルを行う。

「補足」
アプリが落ちた原因は、別の機能の画像のキャッシュがメモリリークを起こしていて、メモリがパンパンのまま
その機能に遷移することでメモリがいっぱいになり、アプリが堕ちました。
遠因だったので、原因を特定するのに時間がかかりました。
Excel  備忘録(ショートカットと関数)

今まで知らなかった機能の備忘録

【ショートカット】
F4　：　絶対参照設定
参照元を選択するときにF4を押すと$マークがつく
二回以上押すとマークの付け方を変更できる
Ctrl　＋　；　：　日付入力
ctrl　＋　：　：　時刻入力
Shift　＋　F11　：　シート追加
Ctrl　＋　Space　：　アクティブセルの列選択
Shift　＋　Space　：　アクティブセルの行選択（入力モードが半角英数の時のみ）
Ctrl　＋　－　：　セル、行、列の削除
Ctrl　＋　Shift　＋　＋　：　セル、行、列の挿入

【関数】
=PRODUCT(選択)　：　選択の掛け算
=CONCATENATE(選択)　：　選択の結合
=SUMIF(選択1,選択2,選択3)　：　選択1が選択2なら選択3を足す
=VLOOKUP(選択,範囲,位置,0)　：
![VLOOK.png](https://qiita-image-store.s3.amazonaws.com/0/103010/f6153829-80e5-b753-3553-5d7918604172.png)

範囲には参照したいグラフをすべて入れる
この例ではA1セルとD列を比較して同じ文字があれば位置分右の値を参照する

=IFERROR(式,””)　：　式がエラーなら空白を返す
=MATCH(検索値,検索範囲,0)　：　検索値が検索範囲で何番目に出てくるか返す
=OFFSET(基準セル,ずらす行数,ずらす列数)　：　基準から行数と列数ずれた値を取得
=DATE(LEFT(セル,4),MID(セル,5,2),RIGHT(セル,2))　：　セルに記入した20151201を日付データにする
=TODAY()　：　今日の日付を返す(年齢を計算したり残日数を計算するのに便利)
=TEXT(日付,方法)　：　方法に応じて曜日を返す
方法="aaa"：日
方法="aaaa"：日曜日
方法="ddd"：Sun
方法="dddd"：Sunday
=FIND(検索文字,文字列)　：　検索文字が文字列の左から何番目かを返す
=SUBSTITUTE(文字,置換前文字,置換後文字)　：　文字列の置換前文字を置換後文字に置き換える
=CHAR(65)　：　Aを返す(65は文字コードの数字)


【そのほか】
A:A　列選択　

データの入力規則のリストはすごく便利

数式タブ→名前の定義でセルに名前が付けられる
git merge --no-ff

# ブランチの履歴を統合する場合、mergeとrebaseがある。

# merge

git merge branch_name
とすることで、branch_nameをfast-fowardで取り込むことができる。
fast-forwardとは、両方の変更を取り込んだマージコミットが作成されます。

ただ、何をマージしたか明示的に示しておきたい場合、
git merge --no-ff branch_name
とすれば、ブランチがのこったままになります。

--no-ff > no fast forward 、fast forwardをしないようにしてマージします
【Swift】作成済みのUIColorのalpha値のみを変えたい

## **追記**
タイトルを満たすextensionを後述の通り作成しましたが、
`colorWithAlphaComponent(_:)`で満たせるとのコメントをいただきました。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIColor_Class/#//apple_ref/occ/instm/UIColor/colorWithAlphaComponent:

一応使い方を、、

```swift
let redColor = UIColor.red
let transparentRedColor = redColor.withAlphaComponent(0.6)
```
まだまだ知らないことばかりですね、、
もっとしっかり調べよう :sweat: 


追記終了

---

すでに作成したカラー(UIColor)に対して、alpha値のみを変えたカラーを取得するためのextensionです。

## 使い方

```swift
let redColor = UIColor.redColor()
let transparentRedColor = redColor.setAlpha(alpha: 0.6)
```

## コード

```swift

import UIKit

extension UIColor {

    func setAlpha(alpha a: CGFloat) -> UIColor {
        var red: CGFloat = 1.0
        var green: CGFloat = 1.0
        var blue: CGFloat = 1.0
        var alpha: CGFloat = 1.0
        self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        
        return UIColor(red: red, green: green, blue: blue, alpha: a)
    }

}
```

もっといいやり方があればご教授ください :raised_hands: 

## その他

UIKitで便利になりそうなExtensionを少しずつこちらに更新していっています。
https://github.com/taji-taji/TJExtension
仕事の仕方

# 仕事の仕方

プログラミングの仕事をしていく上でいくつか仕事の仕方を改善したら、
よくなった実感があったので書いてみる

①ソースコードをコピペして、プログラムを書く　＞　ソースコードを１から作成

今までプログラムを書く際、似たようなプログラムを他のソースから漁って、
コピペして一部修正という仕事の進め方をしていた。これだと、いつまでも上達しなかった。
ソースコードを１から作成することで（他のソースコードを参考にするのはおk）、その言語の書き方を覚えれるのですごくいいと思った。

②マシンのメモリを食っていないか監視しつつ作業を進める

今までマシンのメモリを気にせず使っていたので、マシンが重たいまま作業をしていた。
ディスクトップ上を綺麗にする。再起動する。いらないデータはゴミ箱に置いて、常にゴミ箱を空状態にする。マックを使用しているなら、アクティビティモニタで常に監視して、メモリを綺麗な状態にすることで、作業に集中できるようになった。

③仕事の初めに予定を書いて、仕事の進捗を自分で管理する

朝に、仕事の内容、仕事の終了時刻を記入。
その仕事をするときに、仕事開始時間を記入。
仕事が終わるたびに、仕事終了時間を記入。
その日の最後に、それぞれの仕事にどれだけ時間がかかったかを分単位で記入する。

以上をすることで、どこに時間がかかったかを自分で管理することができ、仕事にどれだけ時間がかかったかを知ることができる。

④アウトプット

なんらかの形でアウトプットする。アウトプットするためには、インプットする必要がある。さらに、アウトプットする段階でインプットした内容が整理される。そうすることで、自分が獲得した情報を吸収できる。


すごく人間的な話だけれども、どれもすごく重要な話だと思った。

---
***2017.10に更新***

⑤ファイル整理・自学自習

自学自習しないと技術力の伸びが頭打ちになると感じた
->自学自習する必要が有る

仕事をすると扱う情報量が多くなるので、いらないものはすぐ削除する癖、整理する癖が必要と感じた
->ファイル整理が必要

自学自習用のフォルダをカテゴライズしてみた
(右クリックでフォルダ作成、もしくはmkdirでフォルダ作成)

<blockquote>
<p>Desktops<br>
　├ programming/<br>
　　├ ruby/<br>
　　　　├ ruby_on_rails/<br>
　　　　└ silver/<br>
　　├ javascript/<br>
　　　　├ closure/<br>
　　　　└ jQuery/<br>
　　└ html/<br>
</p>
</blockquote>

例えば、上記のようにすること(=学習対象ごとにフォルダ分け)で、自習しやすい環境を作れた。
古いカーネルの削除方法メモ

Ubuntuの```apt-get```でカーネル更新をかけると、通常は「もう使われません」と出て```apt-get autoremove```の対象となるのですが、時として対象のはずの古いカーネル（及びカーネルヘッダ）が残ってしまう事があります。いろいろやり方はあると思われ、紹介もたくさんありますが、自分がやった方法をメモがてら書きます。

まず、最新のカーネルがあればそれに更新します。

デスクトップ版

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install linux-generic
```

サーバー版

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install linux-server
```

再起動後、稼働中の最新カーネルと、インストール済みカーネルのリストを確認します。

```
$ uname -r
3.13.0-74-generic

$ dpkg --get-selections | grep linux-
linux-firmware                                  install
linux-generic                                   install
linux-headers-3.13.0-67                         install
linux-headers-3.13.0-67-generic                 install
linux-headers-3.13.0-71                         install
linux-headers-3.13.0-71-generic                 install
linux-headers-3.13.0-74                         install
linux-headers-3.13.0-74-generic                 install
linux-headers-generic                           install
linux-headers-server                            install
linux-image-3.13.0-65-generic                   deinstall
linux-image-3.13.0-67-generic                   install
linux-image-3.13.0-71-generic                   install
linux-image-3.13.0-74-generic                   install
linux-image-extra-3.13.0-65-generic             deinstall
linux-image-extra-3.13.0-67-generic             install
linux-image-extra-3.13.0-71-generic             install
linux-image-extra-3.13.0-74-generic             install
linux-image-generic                             install
linux-image-server                              install
linux-libc-dev:amd64                            install
linux-server                                    install

```
この例では3.13.0-{65,67,71}が対象となります。
まず、ヘッダを消します。
```
$ sudo apt-get autoremove --purge linux-headers-3.13.0-{65,67,71}
```
まとめて消す場合はこのように~~正規表現~~シェルのブレース展開を使うとよいでしょう（この場合。もっと多い場合で連番であれば正規表現もあり？）。
ここで依存があればイメージも巻き込んで削除してくれます。この例ではリビジョン67は依存されていてヘッダと一緒に削除されましたが、リビジョン65とリビジョン71は対象となりませんでした。

この消えなかったイメージは次のコマンドで削除します。
```
$ sudo apt-get autoremove --purge linux-image-3.13.0-{65,71}
```

二度目の再起動後、```dpkg --get-selections | grep linux-```で綺麗になっているか確認します。
英語できない日本人のためのAWSのMFAリセット

# 英語できない日本人のためのAWSのMFAリセット

## 対象読者

+ AWSのアカウントを保持している
+ AWSのアカウントをMFAしていた
+ 認証機器壊れた・無くした
+ 英語苦手だからサポートの流れを先に知っておきたい

※事前注意　英会話する必要は有り

## 状況

飲み会の後に全力で転けてiPhone画面が割れたので修理に出す。

GoogleAuthenticatorはデータを引き継がないのでシードキーをロスト

QRコードを保存していたPCはデータ抹消済み←これが一番の失態

TOEIC320点の英語力

## 基本

[AWSのFAQ](https://aws.amazon.com/jp/iam/faqs/)で、基本的には下記の内容が記載されているので、ここに書いてある感じで対応してもらえる。

> Q: AWS アカウントまたは IAM ユーザーに対して AWS MFA が有効になっている場合は、AWS ポータルや AWS マネジメントコンソールにサインインするとき常に認証コードを使用する必要があるのですか?

>はい。AWS アカウントおよび IAM ユーザーは、どんな AWS サイトでもサインインする必要がある際には常に、自分の MFA デバイスを持っている必要があります。
> AWS アカウントに関連付けられている認証デバイスが損傷または紛失した、盗まれた、またはデバイスが機能しなくなった場合は、当社に連絡を入れて、アカウントの AWS MFA を無効にする必要があります。そうすれば、一時的に AWS アカウントのユーザー名とパスワードだけを使って AWS にサインインすることができるようになります。
>お客様の IAM ユーザーが認証デバイスを損傷または紛失した、盗まれた、またはデバイスが機能しなくなった場合は、IAM コンソールまたは IAM CLI を使用して、お客様が自分で AWS MFA を無効にすることができます。

ただし、現在日本語は対応していないので、英語の対応で乗り切るか、「Japanese Support Please等と言っていただけたら、平日日中に日本語で折り返しするぜ」的な感じなので、そっちでリセットしてもらうか。

平日は厳しいが、どう考えても完全に自分の責任なので英語でがんばってみると決意(Japanese Support Pleaseと言うのはなんかプライドが…ってのもある)。

## 流れ

+ rootアカウントでログインしようとする
+ MFAのコードを聞かれる
+ フォームの下らへんにある「MFAデバイスに問題起きたぜ！」的なボタンを押す
+ Contact us！みたいなボタンから、救援要請。
+ 何が起こったか(自分の場合はDevice Damaged)選択
+ 電話番号記入
+ CAPCHA的なやつを入力

すると15分弱で米国と思わしき電話番号からTEL

英語苦手な人でも、ここから後の流れさえわかってたら多分大丈夫

+ Hello的なスタートで「My deviceがBrokenだぜ！I want to reset MFAな設定」って感じの英語を伝えると
+ 「OK！ほんならメール送ったから書いてあること読み上げてや！」って言ってくれるので
+ 「OK!　XXXXXX」と読み上げる、そんだけでリセットしてくれて
+ 「ほな、問題あったらまたメールしてくれよな！See you！」って感じになるので
+ 「OK！！マジでThankyou！And マジでお手数書けて申し訳ない！！」

といった一連の流れでリセット完了。

あとはパスワード変更とかしっかりしてねーって感じです。

## まとめ

+ 携帯は大事に
+ MFAデバイスは1つだけだと心配(複数あると別の意味で心配)
+ 英語ができなくてもある程度はなんとかなる(勉強するに越したことはない)

メールアドレス変わってたら、この流れで終わらんやろなーと怯えながらここまで記述しましたとさ。
Java8の日付APIを使って年齢計算したら、UnsupportedOperationExceptionが発生して嵌ったお話

# 1. コンテキスト/状況/背景
データベースから取得した誕生日から、Java8で導入された日付APIを用いて年齢計算をしようとすると、UnsupportedOperationExceptionがスローされます

java.util.DateからLocalDateへ変換しようとすると、UnsupportedOperationExceptionが発生

```lang:java
Instant instant = birthday.toInstant();　// UnsupportedOperationExceptionが発生
LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneOffset.systemDefault());
```
ぐぬぬと、２時間ぐらいスタバで唸っていました。
[java.util.Dateのjavadoc](http://docs.oracle.com/javase/jp/8/api/java/util/Date.html)には何も書いていない。ぐぐっても出てこない。。。。。
しかし、[java.sql.Dateのjavadoc](http://docs.oracle.com/javase/jp/8/api/java/sql/Date.html)には、以下の記載があります。

>toInstant()
>このメソッドは常にUnsupportedOperationExceptionをスローします。SQL Date値は時間コンポーネン>トを持たないので、このメソッドは使わないでください。

納得感がないですが、時間コンポーネントがないのが犯人のようです。

# 2. コード
ちょっと残念なのですが、以下のように文字列型に変換して日付計算するのが素直です。

```lang:java
	private Integer getAge(Date birthday){
		LocalDate today = LocalDate.now();
		return Period.between(LocalDate.parse(birthday.toString()), today).getYears();
	}
```

嵌ってはしまったのですが、簡潔に書けるのでJava8気持ちいいですね。
ピョンキー漫画（続き）

# 先日の[ピョンキー](http://www.softumeya.com/pyonkee/ja/)漫画の続きです。
（前回の記事は[こちら](http://qiita.com/drafts/df4303394f40cb31cda7)から。）


![001hello-02.png](https://qiita-image-store.s3.amazonaws.com/0/105275/ed97efb7-d3f9-04c5-fbdb-3eff3e8dc0c1.png)
![001hello-03.png](https://qiita-image-store.s3.amazonaws.com/0/105275/cec07bfa-95be-d305-6cba-3e8a534d2f83.png)
![001hello-04.png](https://qiita-image-store.s3.amazonaws.com/0/105275/8c7eaf2d-a840-2df8-ec58-980798056508.png)


クリスマスはPyonkeeでエンジョイ！


盃　ちよ子
myThingsの組み合わせを簡単に紹介できるブロガーツールをつくったよ

この記事は [myThings Advent Calendar](http://qiita.com/advent-calendar/2015/mythings) の19日目の記事です。

# はじめに

[myThings](http://mythings.yahoo.co.jp/)は「Twitterである単語にヒットしたらSlackのこの部屋に投稿する」のように、複数サービスを組み合わせることができるサービスです。

そして最近追加された**「シェア機能」**を使うと、自分のつくった組み合わせをURLに変えて家族や仕事仲間などに共有することができます。

* [組み合わせを簡単に共有できる「シェア機能」が追加されました | myThings公式ブログ](http://blogs.yahoo.co.jp/mythings_staff/39718252.html)

# つくったもの

シェア機能によって生成されたURLを埋め込みコードに変換する「[embed-things](http://embed-things.mashroom.in)」という非公式ツールを作りました。

http://embed-things.mashroom.in

[![image](https://qiita-image-store.s3.amazonaws.com/0/10057/fbb74883-1fc3-b873-0b0a-af81a0626469.png)](http://embed-things.mashroom.in)

### 使い方

とてもシンプルです。

myThingsアプリ（[iOS](https://itunes.apple.com/jp/app/id987874862) / [Android](https://play.google.com/store/apps/details?id=jp.co.yahoo.android.yiot&hl=ja)）で生成したURLを入力して「変換ボタン」を押すだけです。HTMLタグのコードが生成されますので、それをブログに貼り付ければ完了です。


# なぜつくったか

自分は結構組み合わせを作っているのですが、それを気軽にブログとかでまとめれたらいいな、と思って作りました。

例えばこんな感じで、自分のお気に入りの組み合わせを紹介できます。

[![東京に雪が降る日につぶやきます - myThings](https://qiita-image-store.s3.amazonaws.com/0/10057/7bc1f90e-b333-4a3f-f3a5-eb92b3c7ff1b.png "東京に雪が降る日につぶやきます - myThings")](http://mythings.yahoo.co.jp/share/recipe?id=QxAw7VScJEzO4z7H8AoHFQ%2D%2D)

[![表参道の電源カフェ情報を探してまとめます - myThings](https://qiita-image-store.s3.amazonaws.com/0/10057/89ae41ed-eece-7c49-a27d-1ba8f969a25c.png "表参道の電源カフェ情報を探してまとめます - myThings")](http://mythings.yahoo.co.jp/share/recipe?id=ROHSBa6HLSJ5Hg3mHzMbKw%2D%2D)

[![お知らせブログが更新されたら、プッシュ通知でお知らせします！ - myThings](https://qiita-image-store.s3.amazonaws.com/0/10057/faee3672-ff0f-da7c-82f8-331ccba8eba9.png "myThingsお知らせブログが更新されたら、プッシュ通知でお知らせします！ - myThings")](http://mythings.yahoo.co.jp/share/recipe?id=eaai%2EtOHJnBz%5FX1f1%5Fwo)

使用する場合はスマートフォンで上記のリンクをタップすると使えます。
PCでご覧の方は、[QRコードに変換して](http://www.kenjisugimoto.com/qrcode/)、スマートフォンからご利用ください。

とても簡単に使えますので、ぜひお試しくださいませ！


# どうつくったか（技術的に）

Ruby + Sinatra でつくりました。
画像や組み合わせの情報は embed-things 自体では持っておらず、OGP（facebookなどにURLを貼ると展開されるタイトルや画像の情報）から取得しています。

ステップにすると以下のような感じです：
(1) 入力されたURLを取得する
(2) URLにリクエストして、OGP情報を取得してパースする
(3) 埋め込み用のHTMLタグを整形して出力

2つ目のステップでは [Nokogiri](https://github.com/sparklemotion/nokogiri) というライブラリを利用しました。


構想自体は前からあって、勉強も兼ねてつくってみたいなと思っていました。
シェア機能がリリースされた週末に時間があったので、土曜日の夕方から夜くらいの時間で実装しました。

とりあえず動くものをつくって、HTML/CSSが得意な方に見た目を整形してもらって、現在のものに仕上がりました。


# まとめ

ブロガーツールを作った話でした。
embed-thingsを使って、みなさんの好きな組み合わせを教えてくれると嬉しいです！

まだmyThingsで組み合わせつくってないよ、という方はこちらに連携サービス一覧がありますので参考にしてみてください→ 
[【永久保存版！? 中の人がmyThingsで使えるトリガー・アクション一覧を全力で書いてみた　2015年12月】](http://qiita.com/ekawamur/items/1503b5d5b786ffef2ae6)


以上、19日目の記事でした！
Thunderbirdのprofileの場所

## Windows

C:\Users\User1

* メールボックス
    * AppData\Local\Thunderbird\Profiles\
* profileファイル
    * AppData\Roaming\Thunderbird\Profiles\

にコピー。

`thunderbird.exe -p`
＞ユーザプロファイルの選択
＞新しいプロファイルを作成
＞フォルダの指定
でもよい。

![profile.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f3217d51-467a-1b7e-ca7b-d2fd5f4f3176.png)

### ThunderbirdPortable の場合

* ThunderbirdPortable\Data\profile\ にコピー


## Linux

以下にprofileデータあり。

* ~/.thunderbird/
* ~/.icedove/  (debianの場合)

## Mac

* ~/Library/Thunderbird/
CoreOS で LVS を有効にする 

> 注) 本記事で取り扱っている CoreOS のバージョンは stable (835.9.0) です．

CoreOS に限らず，Linux カーネルを用いたシステムでロードバランシングを行う場合，最もお手軽な手段として LVS があります．
しかしながら，CoreOS に含まれる Linux カーネルは，LVS を担う ip_vs がカーネルモジュールとなっています．

```shell-session
# lsmod | grep ip_vs
#
```

もちろん，modprobe でロード可能です．

```shell-session
# modprobe ip_vs
# lsmod | grep ip_vs
ip_vs                 135168  0 
nf_conntrack           90112  1 ip_vs
libcrc32c              16384  1 ip_vs
#
```

しかし，このままでは再起動したとき， ip_vs モジュールはロードされません．

起動時に ip_vs モジュールをロードさせる
====

cloud-config.yml を編集します．

ip_vs.conf の書き出し
-------------------

まず，先頭付近で下記のように記述して，/etc/module-load.d/ip_vs.conf を書きます．

```yaml
write_files:
  - path: /etc/modules-load.d/ip_vs.conf
    content: ip_vs
```

サービスの実行指示
----------------

次に，coreos: の下に， systemd-modules-load.service を置きます．

```yaml
coreos:
  units:
    - name: systemd-modules-load.service
      command: restart
```

クラウド事業者など OEM 先の手が入っている場合には，もしかしたら既に記述があるかもしれません．(Azure の場合にはありませんでした)

再起動と確認
===========

cloud-config.yml をセーブして閉じたら，リブートしてください．

再度ログインして，ip_vs モジュールがロードされていることが確認できたら，作業は終了です．

```shell-session
# lsmod | grep ip_vs
ip_vs                 135168  0 
nf_conntrack           90112  1 ip_vs
libcrc32c              16384  1 ip_vs
#
```

LVS を使う
=========

LVS  は有効になりましたが，CoreOS には LVS の基本的な操作を行うためのコマンドである `ipvsadm` コマンドが含まれていません．
CoreOS で LVS を効果的に使うための方法は，[こちらに書きました](http://qiita.com/monamour555/items/2e7441de89a4b7df9ccb).