OmniAICreator/Qiita-1.07M huggingface dataset:
sshのパスフレーズ入力を、keychainで省略する

sshログインの方式に公開鍵認証(パスフレーズあり)を使用していますが、パスフレーズを毎回入力するのが面倒です。このパスフレーズ入力を省略するため、`keychain`を使います。

# keychainとは

Windowsアプリならpagent、OS Xなら標準のキーチェーンでパスフレーズ入力を省略できますが、CygwinやLinuxシェルでは使えません。`.ssh/config`にパスフレーズを書くという方法もありますが、これはちょっと…(それを言ったらOS Xのキーチェーンもどうなのという話ですが)。

そこで、`ssh-agent`というツールで秘密鍵とパスフレーズをキャッシュすることで、パスフレーズ入力を省略することができます。しかし、この`ssh-agent`は少々使い勝手が悪く、色々と小細工する必要があります。そこで、`keychain`という`ssh-agent`フロントエンドを使用することで、`ssh-agent`の面倒な事を引き受けてくれます。

つまり、`keychain`を使用すると、秘密鍵とパスフレーズを良い感じにキャッシュしてくれて、パスフレーズ入力を省略することができます。

# 使い方、設定方法

以下のように使用します。

```
keychain -q ~/.ssh/id_rsa ~/.ssh/id_rsa_2
source ~/.keychain/$HOSTNAME-sh
```

`keychain`には、複数の秘密鍵を指定することができます。例えば、サービスごとに異なる鍵を運用している場合などに役立ちます。

`keychain`をそのまま呼び出すと色々カラフルなログを出力するので、`-q`で黙らせます。

`keychain`を呼び出すと、`~/.keychain/`に色々とファイルを出力します。これらは`ssh-agent`が必要とする環境変数で、お約束として`source`で反映します。

# 起動時にkeychainを呼ぶ

ログイン時やCygwin起動時に`keychain`を呼び出して鍵をキャッシュさせたい場合、`.bash_profile`などに書いておくと良いです。

# 参考

* [using keychain under cygwin](https://thomaswabner.wordpress.com/2009/11/06/using-keychain-under-cygwin/)
    * `.keychain/master-sh`と書いてありますが、2016/2/9時点では`.keychain/$HOSTNAME-sh`です。
* [keychainとssh-agentを使用しパスフレーズ無しにsshログイン](http://qiita.com/yyamamot/items/1bc1dd93692bf9379f3e)
* [ssh-agentとkeychain](http://iamapen.hatenablog.com/entry/2014/02/14/055644)
* [keychainでsshのprivate鍵パスワード入力回数を減らそう](http://qiita.com/tukiyo3/items/045f86c4242ec53953e2)
* [ssh-agent & keychain の勉強](http://www.hasta-pronto.org/2006/12/10/sshagent-keycha/)
Device Listのメモ(Notes)欄に作成者を記録するサンプルスクリプト

#はじめに
みんなでテスト・開発環境を共有していると、「このサーバー、誰が作ったんやー！」となりませんか？残念ながらSoftLayerでは、Device Listを見ても、誰がどのサーバーを作ったのかがすぐには分かりません。いろいろやり方はあるのかもしれませんが、、、

- 台帳で管理する記録する -> 守ってもらうのが大変。。。
- APIで管理者の人が記録する -> メンバーの人が認知できない。

というので、１つの代替策として、メモ欄に作成者（username）を記録するサンプルスクリプトを作ってみました。

#メモ欄とは？
実は、デフォルトではメモ欄は非表示になっています。以下のように、列のカスタマイズボタンを押して、メモを表示して下さい。ここに、誰が作成したのか、利用目的や何時まで使うのかを書いてもらえばよさそうですね。
※とはいっても、テスト・開発環境ではなかなか徹底するのは難しいので、せめて作成者（username）だけでも自動的に記録してしまおうというのがこの記事の趣旨ですが。
![memo.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/8f4f12fd-05b7-5402-0fd4-91250eef9066.jpeg)


#仮想サーバー用のサンプルスクリプト
以下のサンプルスクリプトは、メモ欄にusernameが入っていなければ自動的に挿入するスクリプトです（既存のメモは消さないように追記します）。とりあえず一番用途が多そうな仮想サーバーに対して書いてみました。これを定期的にcronで流すだけで、勝手にメモ欄にusernameが埋まっていきます！

```py:updateNotes.py
#-------
from datetime import datetime
print datetime.now().strftime("%Y/%m/%d %H:%M:%S")
#-------

import SoftLayer

_mask = '''
    id,
    fullyQualifiedDomainName,
    notes,
    billingItem.orderItem.order.userRecord.username
    '''

client = SoftLayer.create_client_from_env()
virtualGuests = client['Account'].getVirtualGuests(mask=_mask)
for vg in virtualGuests:
    try:
        username = vg['billingItem']['orderItem']['order']['userRecord']['username'].lower()
    except KeyError:
        print ("key is not found")
        print(str(vg['id']) + " : " + vg['fullyQualifiedDomainName'])
        continue

    if vg.get('notes') is None :
        print(str(vg['id']) + " : " + vg['fullyQualifiedDomainName'])
        obj = {'notes': username}
        print(obj)
        client['Virtual_Guest'].editObject(obj, id=vg['id'])
    elif username not in vg['notes'].lower():
        print(str(vg['id']) + " : " + vg['fullyQualifiedDomainName'])
        obj = {'notes': username + ", " + vg['notes']}
        print(obj)
        client['Virtual_Guest'].editObject(obj, id=vg['id'])

```

![memo2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/8e2e2944-54cb-69bc-ccb8-e5dde6c1a2a3.jpeg)
Raspberry Pi をMacでセットアップ忘備録 6 - VNCでリモートデスクトップ

Raspberry PiのiMacを利用したセットアップ忘備録です。

1.  [初期設定](http://qiita.com/PonDad/items/bfb1cc6ddc18ccf08208) 
2. [無線LANと接続](http://qiita.com/PonDad/items/c0f559962d4108774424) 
3. [SFTPと接続](http://qiita.com/PonDad/items/516e0ef5295f47228a5c) 
4. [USBスピーカーと接続](http://qiita.com/PonDad/items/80fb3abebb5adaa7888d)
5. [USBマイクと接続](http://qiita.com/PonDad/items/565f816dc1ebcbe2467e) 
6. [VNCでリモートデスクトップ](http://qiita.com/PonDad/items/232f1aacbef2c4fcb746) <<

## 環境

- iMac Late 2013 （OSX 10.11.3）
- Raspberry Pi2 ModelB （raspbian-wheezy）
- PLANEX 無線LAN子機 (USBアダプター型) GW-USNANO2A (FFP)

## MacにVNCクライアントをダウンロード

[Download VNC® software](https://www.realvnc.com/download/)

上記よりMac向けのクライアントを選択してダウンロードする。

※　余談だが、Chromebookには[VNC® Viewer for Google Chrome™ - Chromeウェブストア](https://chrome.google.com/webstore/detail/vnc%C2%AE-viewer-for-google-ch/iabmpiboiopbgfabjmgeedhcmjenhbla)、iPhoneには[VNC Viewer - iTunes](https://itunes.apple.com/jp/app/vnc-viewer/id352019548?mt=8)といったクライアントアプリが用意されているので、様々な機器でRaspberry Piのデスクトップ画面をリモート操作する事が出来る。

## Paspberry PiからVNCサーバーを起動させる

VNCサーバーを立てるには、Linuxのパッケージソフト`tight vnc`を利用されるケースが多いらしい。

```bash:ssh
$ sudo apt-get install tightvncserver
```

でインストール。まずはパスワードの設定をする。

```bash:ssh
$ vncserver

You will require a password to access your desktops.

Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n

New 'X' desktop is raspberrypi:1

Starting applications specified in /home/pi/.vnc/xstartup
Log file is /home/pi/.vnc/raspberrypi:1.log
```

パスワードは４〜6文字で設定する。この場合はディスプレイ番号:1という事。

解像度などのオプションをコマンドから設定する事が出来る。

```bash:ssh
$ vncserver :1 -geometry 1280x800 -depth 24
A VNC server is already running as :1
```

この場合はディスプレイ番号:1 で -画面1280X800ピクセル -色深度24ビット という設定をしている。

## Macから受信する

VNCクライアントアプリを立ち上げ、VNCアドレスを指定する。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/47128/afd95309-5b44-965b-6dcb-bf911f5331fc.png)

先ほど確認したディスプレイ番号を指定。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/47128/0d917bd3-2f0e-37a2-a4de-8c246889ab18.png)

先ほど設定したパスワードを指定。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/47128/bd49f6a3-5101-561a-128d-4c8bb42259b4.png)

動作は機敏とは言いがたいので確認作業などの利用が良いと思う。

## 参考にさせていただきました

[Raspberry PiにVNCで接続する](http://d.hatena.ne.jp/pasela/20121225/raspi_vnc)

[Raspberry Piの設定【VNCサーバ（tightVNC）の設定】](http://yamaryu0508.hatenablog.com/entry/2014/08/16/202441)
[Linux]ファイルの圧縮、解凍方法

Linuxでファイルの圧縮、解凍方法をよく忘れるのでまとめておく。

忘れてもググればすぐ出てくるけど。

# tar解凍全般
optionにz,j,J等の圧縮形式を指定しなくても、~~拡張子~~ファイル先頭の数バイトで判別して解凍してくれる
※@tetsu_kobaさんからコメントにより教えてもらいました
tar -xvf xxx.tar.yy


# tar.gz
圧縮
tar -zcvf xxxx.tar.gz directory
解凍
tar -zxvf xxxx.tar.gz
# tar.bz2
圧縮
tar -jcvf xxxx.tar.bz2 directory
解凍
tar -jxvf xxxx.tar.bz2
# tar.xz
圧縮
tar -Jcvf xxxx.tar.xz directory
解凍
tar -Jxvf xxxx.tar.xz
# tar
圧縮
tar -cvf xxxx.tar directory
解凍
tar -xvf xxxx.tar
# zip
圧縮
zip -r xxxx.zip directory
解凍
unzip xxxx.zip


※unarコマンドを@Hayakuchi0さんから教えてもらいました。
Windows上で日本語ファイル名のファイルをzipで圧縮して、Linux上でunzipにより解凍すると文字化けすることがありますが、unarで解凍すると文字化けしないようです。

unar xxxx.zip

私が確認した環境CentOS7にはunarはインストールされていなかったので、
インストールして試しました。

unarはzip以外も解凍できるようです。


# optionの意味

|option |description |
|:-----------:|:--|
|c     | 新しいtarファイルを作る (create) |
|v | 圧縮・解凍状況を表示（基本的にvは指定しなくてもいいが状況がわからないので精神衛生上良くない）(verbose) |
|f | 圧縮ファイル名指定 (filename) |
|x | 解凍 (extract)|
|z | gz  |
|j | bz2 |
|J | xz  |
[Python]scikit-imageによる画像処理


## 画像ファイルの読み込み

```ipython
In [5]: from skimage import io

In [6]: I = io.imread('lena512color.tiff')

In [7]: print I.shape
(512, 512, 3)
```

## 画像ファイルの書き込み

```ipython
In [12]: io.imsave('output.bmp', I)
```

## 複数の画像ファイルの書き込み
tiffフォーマットでは下記のように複数の画像ファイルを一つのファイルとして保存することができる。

```ipython
In [13]: I1 = io.imread('Lenna.bmp')

In [14]: I2 = io.imread('Mandrill.bmp')

In [15]: I3 = io.imread('Parrots.bmp')

In [16]: io.imsave('output.tiff', [I1, I2, I3])

In [17]: I4 = io.imread('output.tif')

In [18]: I4.shape
Out[18]: (3, 256, 256, 3)

In [19]: io.imshow(I4[0])

In [20]: io.imshow(I4[1])

In [21]: io.imshow(I4[2])

```
![skimage_03.png](https://qiita-image-store.s3.amazonaws.com/0/100523/f2c92e13-8b4e-3068-6e1e-d0e6e54af769.png)
![skimage_04.png](https://qiita-image-store.s3.amazonaws.com/0/100523/0de310b1-9100-d20b-5e1e-b9e6f7e15b81.png)
![skimage_05.png](https://qiita-image-store.s3.amazonaws.com/0/100523/4cb2461a-21c1-397f-7bdf-dc8e7551abfb.png)




## 画像の表示

```ipython
In [8]: io.imshow(I)
```

![skimage_01.png](https://qiita-image-store.s3.amazonaws.com/0/100523/22b99c4c-29c6-468e-5eaf-689a529adc0a.png)

## 色変換
### RGB → Gray

```ipython
In [9]: from skimage.color import rgb2gray

In [10]: G = rgb2gray(I)

In [11]: io.imshow(G)
```
![skimage_02.png](https://qiita-image-store.s3.amazonaws.com/0/100523/24ae9bab-fcc4-33ce-6e62-e4b661d41ca6.png)

その他の色変換は[ここ](http://scikit-image.org/docs/dev/api/skimage.color.html?highlight=color#module-skimage.color)を参照

## 型と値の変更
型の変換と値の変換を同時に行う。
値の変換はimg_as_floatの場合、255~0の値を1.0~0.0の値に変換する。
ただ型の変換をしたい場合は、astypeを使う。

```ipython
In [50]: from skimage import img_as_float, img_as_int, img_as_ubyte, img_as_uint

In [51]: I_float = img_as_float(I)

In [52]: print I_float.dtype, I_float.max(), I_float.min()
float64 1.0 0.0117647058824

In [53]: I_int   = img_as_int(I)

In [54]: print I_int.dtype, I_int.max(), I_int.min()
int16 32767 385

In [55]: I_ubyte = img_as_ubyte(I)

In [56]: print I_ubyte.dtype, I_ubyte.max(), I_ubyte.min()
uint8 255 3

In [57]: I_uint  = img_as_uint(I)

In [58]: print I_uint.dtype, I_uint.max(), I_uint.min()
uint16 65535 771
```

## 画像のリサイズ
scikit-imageにもtransform.resizeがあるが、変換方式が指定できないので、scipyのimresizeを使用する。


```ipython
In [79]: from skimage import io

In [80]: import numpy as np

In [81]: from scipy.misc import imresize

In [82]: I = io.imread('Lenna.bmp')

In [83]: IN = imresize(I,(I.shape[0]*2, I.shape[1]*2), interp='nearest')

In [84]: IB = imresize(I,(I.shape[0]*2, I.shape[1]*2), interp='bilinear')

In [85]: IC = imresize(I,(I.shape[0]*2, I.shape[1]*2), interp='bicubic')

In [86]: io.imshow(np.hstack((IN[200:264,200:264], IB[200:264,200:264], IC[200:264,200:264])))
```
![skimage_06.png](https://qiita-image-store.s3.amazonaws.com/0/100523/9d953e48-da1b-39b1-3bff-4b8ce7770850.png)
電子工作 > UEW線 > 実装例 / 特徴 / youtubeでの実装動画

USB microB線の実装や、AQM0802の実装を考えていた時、これまで使ってきたAWG28の他の案というのが気になっていた。

ふと、以下のページを見つけた。
http://ore-kb.net/archives/330

UEW線というのがあるらしい。

その特徴などについては以下のページを見つけた。
http://elm-chan.org/docs/wire/wiring.html

上記ページで他にも興味を持ったのは

- ピン間隔が狭いICをユニーバル基板上に実装する時、カプトンテープを使っている
- カプトンテープ上にICを載せた場合、どこでそのICを固定するのか不明. DIP型は端のピンをランドにハンダ付けしているようだが、QFPの方はよく分からない。

実装の動画は以下を見つけた。
[youtube](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwjZ2dik4uvKAhVGipQKHcQcCWAQtwIIJzAC&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D4ieCGsxGiwc&usg=AFQjCNEm185MC-4dR8dBb3m4ut9dnIwCZw&sig2=Dx8HLSBrLIgSFRVUPcnASQ)
Docker上のCentOS6でMySQL Cluster 環境を構築する

# Overview
 PandoraFMSの検証でバックエンドにMySQLが必要なのだが、
PandoraFMS環境が、スケールアウト。最低でも冗長化を前提としていたのでMySQLも冗長化を前提として環境構築することにした。
　調べてみるとMySQLをMulti-masterで構築したりMaster-Slaveで作るよりMySQL Clusterで作った方が面白そうなので、まずはMySQL Cluster環境を作ることにした。

## Purpose
　PandoraFMSのバックエンドとしての環境作りだけで無く、以下の点も考慮して作業を行う

- MySQL運用負荷の軽減
    - 可能な限りパッケージを活用し、パッケージ管理の手間を省く
- 全体としての環境作り負荷の軽減
    - Ansibleを使い、インストールの自動化を図る
        - 単にAnsibleにも興味があり使ってみたかったという話

# Sytems
　物理環境で用意するのは様々な点で無理があるため、Dockerを使う。
また、OSはCentOS7が枯れ始めているが、PandoraFMSの公式ドキュメントを見る限りCentOS6が推奨されている様子なのでCentOS6を採択する（※）

※）見る限りCentOS7でも動くような気がする。

# How to setup

## Set up Docker container
　手始めに構築環境を用意する。前述の通りDockerで作るので3つぐらいノードを作っておく
<pre>
# docker run --name="mysqlc1" -d -it --hostname="mysqlc1.docker" docker.io/centos:6 /sbin/init                                                            
32ee96a85195d642dea99cad224303e0125e42b0871c000e87b181f948e686ed
# docker run --name="mysqlc2" -d -it --hostname="mysqlc2.docker" docker.io/centos:6 /sbin/init 
6a62870b2c17e0e3be586569ccbd2a81c5975298488387f7297d0ca1fd3119a1
# docker run --name="mysqlc3" -d -it --hostname="mysqlc3.docker" docker.io/centos:6 /sbin/init 
ea200d4e68083d358fdb67e2d42daa07f61e51c03de36fd9c84ed13eaf5a90d3
</pre>

## Install MySQL Cluster
JavaFx WebViewでサイトのスクリーンショットを撮ってすぐ終わる

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:WebViewTest.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Scene;
import javafx.scene.image.WritableImage;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javax.imageio.ImageIO;

/**
 *
 * @author tool-taro.com
 */
public class WebViewTest extends Application {

	public static void main(String[] args) {
		WebViewTest.launch(args);
	}

	@Override
	public void start(Stage stage) throws IOException {
		//スクリーンショットを撮るサイト
		String url = "http://tool-taro.com/";
		//画像ファイルの保存先
		String filePath = "webview.png";

		WebView webView = new WebView();
		webView.setPrefSize(1440, 900);

		WebEngine webEngine = webView.getEngine();
		webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
			@Override
			public void changed(ObservableValue ov, State oldState, State newState) {
				//changeイベントが完了した時点でスクリーンショットを撮る
				if (newState == Worker.State.SUCCEEDED) {
					stage.setTitle(webEngine.getLocation());

					WritableImage image = webView.snapshot(null, null);
					BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
					try {
						ImageIO.write(bufferedImage, "png", new File(filePath));
					}
					catch (IOException e) {
						e.printStackTrace();
					}
					finally {
						//アプリケーションを終了する
						Platform.exit();
					}
				}
			}
		});

		//サイトにアクセスしてコンテンツをロードする
		webEngine.load(url);
		//WebViewをSceneに入れてStageにのせて表示する(そうしないとWebEngineのchangeイベントは成功しない)
		stage.setScene(new Scene(webView));
		stage.show();
	}
}
```
## 動作確認

```
$ javac WebViewTest.java
$ java WebViewTest
```
撮影された画像ファイルです。
![webview.png](https://qiita-image-store.s3.amazonaws.com/0/111947/e326010f-7b10-cd0f-dfb3-5d43f2c4526b.png)
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- Windows 10 Pro
	- JDK 1.8.0_112


Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
電子工作 > チップコンデンサのセット

チップコンデンサのセットについて調べた。

見つかったのは以下のようなものだった。

## google検索　

以下を見つけた。
http://ay-3-8910.at.webry.info/201409/article_1.html

サトー電気というところで売っているらしい。
http://www.maroon.dti.ne.jp/satodenki/cap.html

- チップセラミック・コンデンサ
  - サイズは 2125(1200円) と 1005(2380円)がある. 
  - 耐圧は50V, 一部25V
  
## @ digikey

digikeyにて chip capacitor で検索して、「コンデンサキット」というファミリーを選択すると15くらいリスト表示された。

そのうち一番安い以下のものを見てみると
http://www.digikey.jp/product-detail/ja/TANTTAC001D/478-3450-ND/992232

- タンタルコンデンサ
  - 6661円 + 送料
  - タンタルは故障モードがショート、くらいしか覚えていない (@ トラ技スペシャル No.102)
  - タンタルコンデンサの使いどころは未学習
  - 漏れ電流が小さい。温度特性が良い、らしい (@ トラ技スペシャル No.102)

個人的に買うとしたら、やはりタンタルコンデンサでなくセラミックコンデンサんのような気がする(よく分かっていない)。

## @ チップワンストップ

http://sp.chip1stop.com/c1s_samplekit/

コンデンサセレクションというのがある。

- 7000円程度のもの
  - 0.5pF - 2.2uF
  - ファイルが場所をとりそうだ
  - データシートは会員登録すれば見れる（未登録なので今は見れない)
- 1000円程度のもの
  - 入門はこれくらいでいい、としてそれを10年くらい使うことになる罠
2016-02-10 電子工作 > AQM0802到着 > 変換基板なしを買ってしまった > 動いた!

I2C接続のキャラクタディスプレイを注文していて昨日届いた。

開封して気づいたのは、変換基板なしのものを買ってしまっていたこと。
http://akizukidenshi.com/catalog/g/gP-06669/

送料＋手数料 800円を出して、追加で[変換基板](http://akizukidenshi.com/catalog/g/gP-06794/)を買うか、[ピッチ変換キット](http://akizukidenshi.com/catalog/g/gK-06795/)を買うか、手持ちのものにハンダ付けするか悩みどころ。

変換基板なしのものに自分でハンダ付けする場合は[データシート](http://akizukidenshi.com/download/ds/xiamen/AQM0802.pdf)の2ページ目の接続例にあるように、1uFのコンデンサと0.1uFのコンデンサが必要。

0.1uFの(チップでない)コンデンサは持っているが、1uFのコンデンサは手持ちではない。

フラットケーブルとチッブコンデンサ？での実装例が以下にあった。
http://ore-kb.net/archives/195

## ハンダ付けした

(追記 2016/02/11)

上記のマネをしてハンダ付けした。ただし、チップコンデンサは見た瞬間「無理！」と分かったので、リード線のものにした。

コードは @exabugs さんのものをそのまま流用させていただいた。
http://qiita.com/exabugs/items/9d1b66aa1d22805afbc8

そして、動いた。

ハンダ付けが立体的なのは気にしない。

![DSC_0070.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/c284f425-e890-b38f-8b74-b2ab28bc64e6.jpeg)
技術英語 > I thought ... it had flowers on it. / I can see it on your face.

@ Star Trek Voyager > PERSISTENCE OF VISION

過去の状況を思い出そうとしてJanewayがカップの柄について

> I thought ... it had flowers on it.

花の柄が描かれたカップだった。

こういう言い回し(had xxx on it)で「柄はxxxです」という意味として使われるのは今回初めて意識した。

<hr>

関連して思い出したのは

> I can see it on your face.

「顔に出ている」という意味だったと思うが良いリンクが見つからない。
[iOS]bitcode対応のlibrary/frameworkを作成する


# はじめに

OS、デバイスに最適化する機能 [App Thinning](https://developer.apple.com/library/tvos/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html) が実装されていくとのことで、ライブラリの bitcode 対応の必要があった為、簡単ですがまとめました。

なお、現時点（2016/02/10）では iOS の bitcode 対応は任意です。
申請時のバイナリアップロードの際にチェックボックスがあるので、対応している場合はチェックをして提出します。

Xcode 7.2.1

# ビルド設定

Build Settings で Custom Compiler Flags 項目の Other C Flags に -fembed-bitcode を指定してビルドする。

![スクリーンショット 2016-02-10 5.06.27.png](https://qiita-image-store.s3.amazonaws.com/0/69402/2b6d0371-7c88-e05f-28bf-1be01107121c.png "スクリーンショット 2016-02-10 5.06.27.png")

コマンドラインで直接指定する場合は、

```
xcodebuild OTHER_CFLAGS="-fembed-bitcode"
```


# バイナリの bitcode 確認

otool を利用してバイナリの内容で bitcode セクションを調べ、size を確認します。

```
$ otool -l [library file]
```

以下の例は、複数アーキテクチャを含んだバイナリのため -arch でアーキテクチャを指定して確認しています。
また、出力結果の一部抜粋になりますので、grep なり more なりで必要箇所を確認してください。

- bitcode セクションは含まれているが対応ビルドではない場合の例

```
$ otool -arch armv7 -l libSample.a
Section
  sectname __bitcode
   segname __LLVM
      addr 0x00016804
      size 0x00000001
    offset 95420
     align 2^0 (1)
    reloff 0
    nreloc 0
     flags 0x00000000
 reserved1 0
 reserved2 0
```


- bitcode 対応ビルドの例

```
$ otool -arch armv7 -l libSample.a
Section
  sectname __bitcode
   segname __LLVM
      addr 0x00017cb0
      size 0x000314f0
    offset 100712
     align 2^4 (16)
    reloff 0
    nreloc 0
     flags 0x00000000
 reserved1 0
 reserved2 0
```

以上
DockerのオフィシャルイメージがUbuntuからAlpineに変更される?

[Docker、オフィシャルイメージのOSをAlpine Linuxへ切り替える計画が明らかに。OSの軽量化に傾倒するDocker](http://www.publickey1.jp/blog/16/docker_alpine_linux.html)

Docker Hubの[alpine](https://hub.docker.com/r/_/alpine/)にも書かれている通り、UbuntuとAlpineを使った場合のイメージを比較すると、大きな差があります。

```bash:16M
FROM alpine:3.1
RUN apk add --update mysql-client && rm -rf /var/cache/apk/*
ENTRYPOINT ["mysql"]
```

```bash:232M
FROM ubuntu:14.04
RUN apt-get update \
    && apt-get install -y mysql-client \
    && rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["mysql"]
```


基本的には、`Dockerfile`を書いて、ビルド、テストしてみて、動作するか確かめられます。

```bash:
$ docker -d
$ docker build -t mysql .
```

[Alpine Linux](http://www.alpinelinux.org/)は最近注目を浴びているセキュアで軽量な Linux ディストリビューションで、以下の様な構成になっています。

```bash:
$ docker run progrium/busybox opkg-install nodejs

$ docker run gliderlabs/alpine apk add --no-cache nodejs
```
描画処理を楽にしてくれるライブラリ

## [BGRABitmap](http://wiki.freepascal.org/BGRABitmap)
Lazarus でグラデーションなどを描画する際に使用できるライブラリ。
このライブラリは、設計時パッケージにはなっていません。
クラス、関数群のライブラリとなっていて、これらを利用してカスタムコントロールを作成したパッケージが[BGRAControls](http://wiki.freepascal.org/BGRAControls)になっています。
私は、BGRAControls 内のカスタムコントロールは利用していないのですが、BGRAControls 内に持っているクラス、関数群が BGRABitmap を直接利用するよりも容易に使用できるので、パッケージインストールしています。
自分でカスタムコントロールを作成する際に、グラデーション描画や、丸み処理、アルファブレンドなどを簡単に実装できます。
BGRABitmap では、LazPaint というペイントアプリのソースコードも含まれていますが、残念ながら Mac ではコンパイルできませんでした。（Windows ではコンパイルできました）
ただ、BGRABitmap 内のクラス、関数群は、Mac でも使用可能なので、自分でカスタムコントロールを作成し、それを利用したアプリは Mac でも動作可能です。
（もちろん、BGRAControls 内のクラス、関数群も Mac で利用可能です）

Mizuna で使用するコントロールは、カスタムコントロールを多数作成する予定なのですが、そこでも、BGRABitmap・BGRAControls のクラス、関数群を使用させて頂く予定です。
DataBindingで引数にcontextを渡すメソッドを扱う

[DataBinding](http://developer.android.com/intl/ja/tools/data-binding/guide.html)を使うと、xml内でtextやsrcをバインドできます。

```xml
<TextView
    android:text="@{user.name}" />
```

Contextを引数に持つメソッドを扱いたい場合は、 `context` とそのまま渡せば動作します。


```xml
<TextView
    android:text="@{user.getTranslatedName(context)}" />
```

以上です。
UIViewでAlertを出す方法(ViewController非経由？）

タイトル、非経由だと語弊がありそうですけど以下の事情です

<hr>

UIView上でアラートを出そうとした際に、iOS8以降での仕様変更のおかげさまでUIAlertViewが非推薦になり、ViewControllerを経由しなければならなくなりました

ただViewを別で作ってViewControllerで表示させていたり、NibでつくったUIViewの上にまたUIViewを載せていたりするとViewControllerに到達するのが非常にめんどくさく、なんとかアラートを発火させるView上でアラートを表示できないものかと思い探してたら以下の方法が見つかりました

## まずは非推薦の方法

```swift
UIAlertView(title: "Missing Text", message: "テキストを入力してください。", delegate: nil, cancelButtonTitle: "OK").show()
```

なんて簡単・・・ただしこれでは黄色い三角がでかでかとで続けてしまいます

## ViewControllerを取得して実装する方法

```swift

let alertController = UIAlertController(title: "Missing!", message: "テキストを入力してください。", preferredStyle: .Alert)
let alertAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertController.addAction(OKAction)

var baseView = UIApplication.sharedApplication().keyWindow?.rootViewController
while ((baseView?.presentedViewController) != nil)  {
  baseView = baseView?.presentedViewController
}
    
baseView?.presentViewController(alertController, animated: true, completion: nil)

```

ここではそのViewが載っているViewControllerを取得してそいつのpresentViewControllerメソッドを使っています
whileのとこの仕組みは調査中です・・・

> 参考: http://swift-salaryman.com/topmost.php
Electron と Ruby でネイティブアプリを作る場合のボタンの配置時の落とし穴



<h2>概要</h2>
こんにちはアレクスです!

今回は「ボタン配置時の注意」というお話です。

詳しい解説は追記していくとしまして、
簡単に注意点を記載しておきます。


<h2>GUIには欠かせないボタンの落とし穴</h2>

<!--more-->

WebデザインやWebアプリの流れから行くと、
自然に<code>a</code>要素を使ってしまうでしょうし、
jQueryなどのUI系のライブラリにも、動的に挿入される要素として
<code>a</code>を使うようにしている場合は良く有りますね。

しかし、ElectronでのGUI製作に<code>a</code>を使用してしまうと、
なんともアグリーな状態になってしまいます。

chromeで見ているWEBページ、このページでも良いですので、
アンカー要素をドラッグしてみてください。

アンカーテキストと代替テキスト、リンク先アドレスが表示されている、バルーンみたいなものをドラッグできます。

### :open_mouth: 

せっかく綺麗にGUI作っているのに台無しです・・・

いろいろ調べてみましたが、<code>a</code>を使っている以上、回避策はないようです。
<code>-webkit-app-region-: no-drag;</code>ももちろん効果ありません。

Electron製のネイティブアプリを幾つか調べてみようと、
<a href="https://atom.io/">Atom</a> と <a href="http://kobito.qiita.com/win">Kobito</a> のソースを見させていただきましたが、
<code>a</code>要素を使用している部分は見受けられませんでした。
※全部チェックできていないので、確実ではありません。

<code>span</code>, <code>div</code>, <code>li</code>などの要素指定で<code>onclick</code>を設定するか、
<code>button</code>を使用しています。

<h2>個人的見解と結論</h2>
<strong>Electronで<code>a</code>タグは使用しない方が良い</strong>

また、更に言うと<code>button</code>も極力使用したくないなと感じています。

要素に<code>focus</code>した時に、<code>outline</code>が表示されてしまい。
これもクールじゃないと思いますね。

今回開発中でどうしても使わないといけなかった部分は、
スタイルシートで<code>outline: 0</code>を指定することで対処しています。

今回はご紹介だけ、後日追記か別投稿いたします。

#### [Original Post](http://arri-ba.net/devlog/2016/02/05/electron-ruby-place-button-hints/)

## 追記

### 2016/10/21 追記
この問題は、バージョンによってはprebuildで起動している時に限定されるようです。明確にどのバージョン以降かは確認できていません。
terraform output variablesで複数の値を返すtips

俺です。

terraformのoutput variablesの戻り値はsingle valueです。
aws_instanceリソース内でEC2を複数台起動して、それぞれのパラメータをoutputで返す場合は、
count数分のoutputを記述しないといけません。

### 間違い

- ec2.tf

```
resource "aws_instance" "fueruwakame" {
  ami = "${lookup(var.fueruwakame, "ami")}"
  ..省略..
  private_ip = "172.16.10.${count.index+21}"
  root_block_device {
      volume_type = "${lookup(var.fueruwakame,"root_block_device")}"
      volume_size = "${lookup(var.fueruwakame,"root_block_device_size")}"
  }
  count = "9"
  tags {
    Name  = "fueruwakame${count.index + 1}-${aws_subnet.private-1c-subnet.availability_zone}"
    Role = "db"
    Service = "fueruwakame"
  }
}

output "fueruwakame_private_ips" {
    value = "${aws_instance.fueruwakame.*.private_ip}"
}
```

```
orenomac$ terraform plan

Errors:

  * 1 error(s) occurred:

* module root: 1 error(s) occurred:

* output 'fueruwakame_private_ips': multi-variable must be in a slice
```

### 汚いけど一つのoutput variableで複数の値を返す方法

あんま綺麗じゃないけどjoin()を使ってしまえばOKです。
 
- ec2.tf

```
resource "aws_instance" "fueruwakame" {
  ami = "${lookup(var.fueruwakame, "ami")}"
  ..省略..
  private_ip = "172.16.10.${count.index+21}"
  root_block_device {
      volume_type = "${lookup(var.fueruwakame,"root_block_device")}"
      volume_size = "${lookup(var.fueruwakame,"root_block_device_size")}"
  }
  count = "9"
  tags {
    Name  = "fueruwakame${count.index + 1}-${aws_subnet.private-1c-subnet.availability_zone}"
    Role = "db"
    Service = "fueruwakame"
  }
}

output "fueruwakame_private_ips" {
  value = "${join(",",aws_instance.fueruwakame.*.private_ip)}"
}
```

- apply

```
orenomac$ terraform apply
Outputs:

  fueruwakame_private_ips   = 172.16.10.21,172.16.10.22,172.16.10.23,172.16.10.24,172.16.10.25,172.16.10.26,172.16.10.27,172.16.10.28,172.16.10.29
```

多分他にも方法あるはずー。

おわり。
git archive を用いて clone せずに特定のディレクトリだけを取得する(そして SHA-IDで取得したいときとか)

# `git archive`を用いると、 clone せずに特定のディレクトリを取得できる。

詳細は [git-archive](https://git-scm.com/docs/git-archive) のコマンドを用いると、対象レポジトリを clone せずとも、特定の branch の特定のディレクトリだけを取得することができる。

```
git archive --remote=git@github.com:UserName/repo-name.git \
    master:subdir/foo | tar -x
```

上記コマンドを実行すると、対象リモートレポジトリの、 `master`ブランチの`subdir/foo`ディレクトリの中身を取得して、現在のディレクトリに展開してくれる。

# デフォルトだと、ブランチやタグなど ref名でしか取得できない

`master` や `v1.5.0` などといった、ブランチやタグであるならば、上記のコマンドによってレポジトリのサブディレクトリを clone することなく取得できる。もっと具体的にいうと、 ref としての名前が付いているリビジョンであるならば、 clone することなく取得できる。

普通に考えると、ancestry references を利用して `master^:subdir`とか、任意SHA-IDを指定した、 `8fa4963ad7c43053767cca04eb42202c08ecebb1:subdir`とかで取得できると期待するのだけれども、残念ながらそうはなっていない。

# その理由と回避方法

なんでそうなるかについては、 [git-upload-archive](https://git-scm.com/docs/git-upload-archive) に記述がある。簡単にいうと、それを許してしまうとサーバー側の処理が大変になってしまうから、だと。

なので、サーバー側で `uploadArchive.allowUnreachable` の config を設定してやると、任意 SHA-ID 指定ができるようにはなるよ、とかいてある。ただし、その場合はそのリビジョンが、正当なものであるかの検証(つまり、どこかしらのブランチ・タグから歴史をたどって到達可能か)はスキップされるよ、とのこと。
Dockerfileのbuildで簡単にGithubのプライベートリポジトリをクローンする方法


Github上にプロジェクトを分散管理している場合、デプロイの際の選択肢の一つにDockerが挙げられるようになってきました。
この記事では、簡単にDockerfileをbuildしただけで、コンテナ上でプライベートリポジトがクローンできる方法を共有します。
結論からいくと、GithubのOAuthトークンを利用すると最高に楽でした。
簡単というのは、一般的な秘密鍵とsshを活用した方法と比較して簡単という意味です。
ちなみに、簡単どころか今のところはssh経由での方法による解法がつきとめられませんでした(ベースイメージはalpine:3.3)。

[こちら](https://devops.profitbricks.com/tutorials/configure-a-docker-container-to-automatically-pull-from-github-using-oauth/)の記事がとても最高に参考になったのですが、多少Github上での作業が変わった(?)ようなので、補足しながら説明します。

## OAuthトークンの作成

Githubにログインした上で、次の箇所まで進んでください。

1. Setteings(右上ドロップダウン) -> Developer settings(左) -> Personal access tokens(左) -> Generate new token(右上の方)

2. Generate new tokens のボタンをクリック
3. Token description に何か一言
4. Select scopesパネルのrepoの項にチェックを入れる(下図)

![tmp.png](https://qiita-image-store.s3.amazonaws.com/0/104478/acc1d2c9-294d-0718-3ffb-347f2a47d9d6.png "tmp.png")
5. 下部のGenerate tokenをクリック

![tmp2.png](https://qiita-image-store.s3.amazonaws.com/0/104478/e621ba47-317a-6793-d934-f5cefbe82a10.png "tmp2.png")


上図にあるように、ランダムな文字列が得られたと思います。
このトークンは一回だけしか表示されないので気をつけてください。
紛失しても、何回でも作り直せるので、同じ手順を踏んでください。
コピーをしたら、次にいきましょう。

## Githubのプライベートリポジトリからclone

先ほどのランダム文字列がxyz、github上のユーザ名がhoge、リポジトリの名前がfooの場合次のようになります。

`git clone https://xyz:x-oauth-basic@github.com/hoge/foo.git`

この状態で端末でcloneができることを確認したら、次はDockerfileの編集に移ります。

```Dockerfile:Dockerfile
FROM alpine:3.3
RUN apk update && apk add git
RUN git clone https://xyz:x-oauth-basic@github.com/hoge/foo.git
```

Docker Imageの作成
`docker build -t github-repo:1.0 .`


これで、リポジトリのcloneがDocker上で出来たと思います。
ここまでの作業をベースにして、アプリのビルドなどをDockerfileに付け足していきましょう。

以上です。
Vimでファイルを開き直してもUndoができるように正しく設定する

# はじめに
## ファイルをVimで開きなおすと、Undoが使えなくなります
Vimは編集履歴を保持して、Undoが使えるようになっています。しかし、ファイルを一度閉じると、履歴がクリアされてUndoができなくなります。

この履歴をファイルに記録する(`set undodir`)ことで、**ファイルを閉じてもファイルを閉じる前の操作をUndoできるようになります。**

## 環境
- Vim version 7.4.335
- Mac OS X El Captan 10.11.3

# VimのUndoを永続化する（ファイルの変更を記録します）
vimrcを変更して、編集履歴をファイルに記録します。これにより、ファイルを閉じたあとでも、過去の編集履歴をUndoコマンドで遡れるようになります。

## Vimの永続的Undoを有効にします。
.vimrcに以下を記述します。そして**ディレクトリを作ります**（`mkdir -p ~/.vim/undo`）。

```vim:.vimrc
if has('persistent_undo')
  set undodir=~/.vim/undo
  set undofile                                                                                                                                   
endif
```

## ディレクトリを用意しないといけません
`:help undodir`を読んでみるとわかりますが、エラーが起きた場合は処理を中断して何もしません。例えば、ディレクトリが存在しない場合には、エラーメッセージも出力せずに終了します。

# おわりに
## ファイルを開き直してもUndoが行えるようになりました
この設定のおかげで、ファイルを開き直してもUndoが行えるようになりました。いつまでも戻すことができると安心してファイルを編集できます！

# 参考文献
- `:help undodir`
- [Persistent undo history in Vim | Electricmonk.nl weblog](http://www.electricmonk.nl/log/2012/07/26/persistent-undo-history-in-vim/)
- [vim-jp » Hack #162: Vimを終了しても undo 履歴を復元する](http://vim-jp.org/vim-users-jp/2010/07/19/Hack-162.html)
- [Using vim's persistent undo? - Stack Overflow](http://stackoverflow.com/questions/5700389/using-vims-persistent-undo)
- [Vim documentation: undo](http://vim-jp.org/vimdoc-ja/undo.html#undo-persistence)
Git勉強(2つのマージ編)

<h2>Gitのマージ2種類</h2>
1. Fast-Forward (早送り)
1. Non Fast-Forward

<h2>Fast-Forward(早送り)</h2>

+ コミットしたという**歴史**(コミットグラフ)が残らない
+ ブランチのマージを取り消しずらい




<h2>Non Fast-Forward</h2>
+ **歴史**(コミットグラフ)に残る



<h2>コマンド</h2>

***


```
//早送りマージができれば早送りマージする、できなければ普通にマージする
git merge [ブランチ]
```


***
```
//普通にマージする
git merge --no-ff [ブランチ]
```


***
```
//早送りマージする (できなければエラー)
git merge --ff-only [ブランチ]
```

<h2>参考サイト</h2>
+ [こわくない Git](http://www.slideshare.net/kotas/git-15276118)
2016年2月最新のFDR（Failures Divergence Refinement）はどこにあるか？

## 実現したいこと

並行システムの検証と実装: 形式手法CSPに基づく高信頼並行システム開発入門 に記載されているFDR2ではなく、最新のモデル検査ツールの動向を知るために、FDRの最新版を利用したい

並行システムの検証と実装: 形式手法CSPに基づく高信頼並行システム開発入門
http://www.amazon.co.jp/gp/product/4764904357

## 実現方法および解決方法

http://www.cs.ox.ac.uk/projects/fdr/
上記のURLにアクセスし、FDR3を利用する。

## 実行コマンド

なし

## 情報源

http://www.cs.ox.ac.uk/projects/concurrency-tools/
https://staff.aist.go.jp/y-isobe/topse/vic/
http://www.cs.ox.ac.uk/projects/fdr/


並行システムの検証と実装: 形式手法CSPに基づく高信頼並行システム開発入門
http://www.amazon.co.jp/gp/product/4764904357
![41USg4GGd7L._SX388_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/49795/0779a6f9-cda8-f4cf-d709-7b873568eb1e.jpeg)

## 補足

なし
[Algorithm] 高效求素数

最近在写leetcode上的[题目](https://leetcode.com/problems/count-primes/)的时候发现自己写的筛法求素数的个数的程序并不够快。
我之前写的代码是这样的：

```cpp
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = is_prime[1] = false;
for (int i = 2; i < N; ++i) {
    if (is_prime[i]) {
        for (int j = 2; j * i < N; ++j)
            is_prime[j] = false;
        ++cnt;
    }
}
```

其实这里有一些地方可以优化的，首先第二个循环里，j并不需要从2开始，以为在j小于i的情况下其实j*i里面肯定含有比i小的素数，因此，都已经被筛掉了。因此第二个循环可以改成这个样子：

```
for (int j = i; j * i < N; ++j)
```

其次，第一个循环里，由于大于$\sqrt{N}$的素数的倍数肯定小于$\sqrt{N}$。因此第一个循环只需要到$\sqrt{N}$就可以了。

最后就是这个样子：

```cpp
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i < n; ++i) {
    if (is_prime[i]) {
        for (int j = i * i; j < n; j += i)
            is_prime[j] = false;
    }
}
```
yUMLでQiitaにテキストベースでUMLを埋め込んでみる。Qiita, esa, GitHub Wiki なんでもござれ

## <i class="fa fa-question-circle" style="font-size:1em;"></i> yUMLとは？
>Create and share simple UML diagrams in your 
>blogs, wikis, forums, bug-trackers and emails.

<a href="http://yuml.me/" target="_blank">yUML</a><i class="fa fa-external-link" style="font-size:1em;"></i>はシンプルなUMLを作成し、ブログやWikiやフォーラムやバグトラッカーやEmailでシェアします。

## <i class="fa fa-smile-o" style="font-size:1em;"></i> yUMLでできること
### <i class="fa fa-angellist" style="font-size:1em;"></i> 無料範囲
* プレーンテキストで作図ができる
* 作図結果をリンクとして貼り付けることで画像を埋め込むことができる
* 作図対象のテキスト自体をURLに埋め込み、画像を埋め込むこともできる
  * 作図に使ったテキストと記事本体を同じ場所で管理できる

つまり、esaやGitHubのWikiやHatena BlogなどにUMLをテキストベースで埋め込むことができます。

### <i class="fa fa-dollar" style="font-size:1em;"></i> 有料範囲
* yUMLサーバーをセルフホスティングすることでセキュリティを確保できる

![pricing.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b864eed3-027a-4183-8b08-d954bfb931e2.png)

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
```markdown
![alt](http://yuml.me/diagram/plain/class/[User|name:string;age:number|save(){bg:green}]<>-orders*>[Order], [Order{bg:blue}]++-0..*>[Items{bg:red}], [Order]-[note:ノート\n2行目{bg:yellow}])
```

↑これが
↓こう表示されます

![alt](http://yuml.me/diagram/plain/class/[User|name:string;age:number|save(){bg:green}]<>-orders*>[Order], [Order{bg:blue}]++-0..*>[Items{bg:red}], [Order]-[note:ノート\n2行目{bg:yellow}])

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <a href="http://yuml.me/" target="_blank">yUML</a><i class="fa fa-external-link" style="font-size:1em;"></i>
Qiitaの投稿カテゴリの円グラフ、いつのまにやらToggle機能がついていたのですね

Qiitaの投稿カテゴリの円グラフ、いつのまにやらToggle機能がついていたのですね

![qiita_toggle.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/b48d5d7a-4a1b-c582-d38c-0fb6a8c7c325.gif)
【Ruby de GUI】FxRubyを使ってGUIアプリケーションを作ってみよう！


# FxRuby
[FxRuby](http://www.fxruby.org/)はRubyのGUIツール、ライブラリです。もともとRubyが好きでやっていたのですが、GUIを作ってみたいなぁと思った時に、ふと目に入ったのがこれでした。Rubyはスクリプト言語なのでGUIアプリケーションでも簡単なコードの記述で作ることができます。

# FxRubyの導入
Rubyとgemが入っている前提でのインストールの方法を示します。Rubyは[こちら](http://www.ruby-lang.org/ja/)からDLできます。
まず、コマンドプロンプトを開き、

```
gem search fxruby
```
と入力
するとこんな具合に

```
C:\Users\User>gem search fxruby

*** REMOTE GEMS ***

fxruby (1.6.33 ruby x64-mingw32 x86-mingw32, 1.6.20 universal-darwin-10 x86-linux, 1.6.19 universal-darwin-9 x86-mswin32-60, 1.6.14 mswin32)
```

fxrubyを発見

```
C:\Users\User>gem install fxruby
```

```
Successfully installed fxruby-1.6.33-x64-mingw32
Parsing documentation for fxruby-1.6.33-x64-mingw32
Done installing documentation for fxruby after 2 seconds
1 gem installed
```
これでインストールは完了です。

# Hello!プログラム

## どのようなプログラム？
hello, Worldのプログラムはいくらでもバリエーションがあるのですが、今回はメッセージボックスを使ってHello!と表示させましょう。

## コーディング
ではさっそくプログラムを記述してみましょう。[こちら](http://www.fxruby.org/doc/api/)にドキュメンテーションありますので、是非参考になさってください。

まず、

```rb
require "fox16"
include "Fox"
```
という感じに、プログラムの先頭で”fox16”のなかのFoxモジュールをインクルードします。Foxモジュールの中には

```
FXMainWindow
```
というMainWindowを作るクラスがあります。

```rb
app=FXApp.new
main=FXMainWindow.new(app, "Hello", :width=>323, :height=>200)
app.create
main.show(PLACEMENT_SCREEN)
app.run
```

というコードでウィンドウが作成されます。単にこの中にボタンを配置しても良いのですが、オブジェクト指向スクリプト言語の神髄を味わうため、これを継承してMyHelloというクラスを作りましょう。

```rb
class MyHello < FXMainWindow
	def initialize(app, title="Hello!")
		# main is window class
		main=super(app, title, :width=>323, :height=>200)

		btnHello=FXButton.new(main, "Click and say Hello!") # create the button

		# Event
		btnHello.connect(SEL_COMMAND) do |sender, sel, data|
			msgBox=FXMessageBox.new(btnHello, "Hello from FxRuby", "Hello!", :opts=>MBOX_OK)
			msgBox.execute
		end
	end
end
```

（ウィンドウのサイズを黄金比に近似させていたのがお分かりになりましたか？）では、これらのことを踏まえて最終的なコードととしては

```rb:　Hello_MessageBox.rb
require "fox16"
include Fox

class MyHello < FXMainWindow
	def initialize(app, title="Hello!")
		main=super(app, title, :width=>323, :height=>200)

		btnHello=FXButton.new(main, "Click and say Hello!", :opts=>BUTTON_NORMAL|LAYOUT_CENTER_X|LAYOUT_CENTER_Y)

		btnHello.connect(SEL_COMMAND) do |sender, sel, data|
			msgBox=FXMessageBox.new(btnHello, "Hello from FxRuby", "Hello!", :opts=>MBOX_OK)
			# FXMessageBox.question(main, MBOX_OK, "Hello", "Hello")
			msgBox.execute
		end
	end
end
app=FXApp.new
main=MyHello.new(app)
app.create
main.show(PLACEMENT_SCREEN)
app.run
```

こうなります。実行すると
Hello!というタイトルのウィンドウが表示され、ボタンを押すとメッセージボックスが表示されます。
![2016-02-09.png](https://qiita-image-store.s3.amazonaws.com/0/86191/e756e781-3225-23d6-b249-bab9aa6de5b2.png)

# 最後に
今回、このような記事を書かせていただいたのですが、実際私はFxRubyを使ってまだ1か月もたっていません。それゆえこの記事を更新したり、別の記事でFxRubyの話題を取り上げるかもしれません。日本語の資料があまりないため、手探りでFxRubyを習得していこうと思います！
Rubyの二次元配列について

## Rubyの二次元配列に要素を追加するときにハマったのでメモ

普通にpushすると以下のようになる。

``` ruby
[18] pry(main)> test = Array.new(4, Array.new)
=> [[], [], [], []]
[19] pry(main)> test[0].push(1)
=> [1]
[20] pry(main)> test
=> [[1], [1], [1], [1]]
```

ので以下のようにした。

``` ruby
[21] pry(main)> test[0] = test[0] + [1]
=> [1, 1]
[22] pry(main)> test
=> [[1, 1], [1], [1], [1]]
```

でもこれ絶対おかしいと思うので詳しい方もっといい方法あれば教えてください。
[SHELL] Build & Run a cpp file

I wrote a script that integrates the building and running for a cpp file. At the program end, output the executed time.

```bash
#!/bin/bash

file=$1
ext="${file##*.}"
out="${file%.*}.o"

g++ -std=c++11 $1 -o $out # support c++11

if [ $? -ne 0 ]
then
  echo "Compile Failed!"
else
  echo "Compile Successed!"
  st=$(($(gdate +%s%N)/1000000))
  ./$out
  ed=$(($(gdate +%s%N)/1000000))
  echo "$ed $st" | awk '{printf "Total running time: %.5fs.\n", ($1 - $2) / 1000.0f}'
fi
```

After adding this file to the bin path such as `/usr/local/bin/` or `/usr/bin` and adding executable right to this file, you will just use this script like this:

```bash
run main.cpp
```

For MacOS, if you got `gdate: command not found` error. Try to install coreutils with brew.

```bash
brew install coreutils
```
Raspberry Pi をMacでセットアップ忘備録 5 - USBマイクと接続

Raspberry PiのiMacを利用したセットアップ忘備録です。


1.  [初期設定](http://qiita.com/PonDad/items/bfb1cc6ddc18ccf08208) 
2. [無線LANと接続](http://qiita.com/PonDad/items/c0f559962d4108774424) 
3. [SFTPと接続](http://qiita.com/PonDad/items/516e0ef5295f47228a5c) 
4. [USBスピーカーと接続](http://qiita.com/PonDad/items/80fb3abebb5adaa7888d)
5. [USBマイクと接続](http://qiita.com/PonDad/items/565f816dc1ebcbe2467e) <<
6. [VNCでリモートデスクトップ](http://qiita.com/PonDad/items/232f1aacbef2c4fcb746) 

## 環境

- iMac Late 2013 （OSX 10.11.3）
- Raspberry Pi2 ModelB （raspbian-wheezy）
- PLANEX 無線LAN子機 (USBアダプター型) GW-USNANO2A (FFP)
- サンワサプライ USBスピーカー(ブラック) MM-SPU8BK
- SANWA SUPPLY MM-MCUSB16 USBマイクロホン

## Rasberry PiのUSBマイク

USBマイクは使用実績の多いサンワサプライのものを購入した。

## USBマイクの接続

あまり日本語記事の投稿もなかったが、以下の記事がわかりやすかったので、全面的に利用させていただいた。

[Raspberry Piで音声認識- Qiita](http://qiita.com/t_oginogin/items/f0ba9d2eb622c05558f4)

linuxの音声ツールは、録音が`arecord`で再生は`aplay`を利用するようだ。

まずは自分のカードナンバーを調べる。

```bash:ssh
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: Device [USB PnP Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```

私はカード1、デバイス0だということが分かった。

```bash:ssh
$ sudo vim ~/.asoundrc
```

`.asoundrc`というファイルで接続デバイスの設定を細かく行うことが出来る。

```bash:ssh
defaluts.pcm.card 1
defaultsii.ctl.card 1

pcm!default {
        type hw
        card 1
}

ctl.!default {
        type hw
        card 1
}
```
デフォルトをカード1に設定した。

## USBマイクで録音

`arecord`コマンドを利用して、カード1、デバイス0で録音し、デスクトップに`sample.wav`を生成するように指示を出す。

```bash:ssh
$ arecord -D plughw:1,0 -d 10 -f cd /home/pi/Desktop/sample.wav

```

![5.png](https://qiita-image-store.s3.amazonaws.com/0/47128/28a8d361-8a31-0293-3e88-7ac152291b70.png)

wavファイルが生成された。

## USBスピーカーで再生

ファイルを指定して`aplay`コマンドを実行すれば再生される。

```bash:ssh
$ aplay /home/pi/Desktop/sample.wav

```

## 参考にさせていただきました

[Raspberry Piで音声認識- Qiita](http://qiita.com/t_oginogin/items/f0ba9d2eb622c05558f4)
GNU Screen で複数サーバに一発でssh接続


以前、[Terminalで複数サーバに一発でssh接続](http://qiita.com/tearoom6/items/e3c8b27bc4de9985e471) という投稿をしましたが、今回はそのGNU Screen版です。

## やりたいこと

- コマンド1つで、Screenを起動し、画面を4分割し、さらにそれぞれの画面で別々のサーバに接続した状態にさせます。

## 手順

以下のようなScreen用のスクリプトを記述します。

- `^M`という記載がありますが、これは特殊文字(CR)で、Vim上から`<C-v><C-m>`(Control-vの後にControl-m)と入力すれば、打込めます。(通常のコピペでは無理?)
- `^M`を省略したとしても、下記のスクリプトは動きます。ただし、最後のコマンドの部分は入力どまりで実行はされないので、手動で実行する必要があります。

```~/.screenrc_init
# もともとの起動ファイルを読み込む
source ~/.screenrc

# 4つのウィンドウをタイトル付きで立ち上げる
screen -t local 0
screen -t server1 1
screen -t server2 2
screen -t server3 3
# 画面を4分割し、それぞれにウィンドウを配置
split -v
split
focus
select 1
focus
split
select 2
focus
select 3
focus
select 0
# 各ウィンドウで別々のコマンドを実行
stuff 'date^M'
focus
stuff 'ssh server001^M'
focus
stuff 'ssh server002^M'
focus
stuff 'ssh server003^M'
```

- そして、シェル上で以下のように実行すれば、画面4分割されたScreenが起動するかと思います。

```Bash
$ screen -c ~/.screenrc_init
```
雲やシャボン玉がふわふわする動き


```css
.c1{
    animation: cloudMove 5s ease-in-out infinite;
    -webkit-animation: cloudMove 5s ease-in-out infinite;
    -moz-animation: cloudMove 5s ease-in-out infinite;
}
@keyframes cloudMove {
    0% {background-position: 0 0; }
    25% {background-position: 0 10px;}
    50% {background-position: 0 0; }
    75% {background-position: 0 15px;}
    100% {background-position: 0 0; }
}
@-webkit-keyframes cloudMove {
    0% {background-position: 0 0; }
    25% {background-position: 0 10px;}
    50% {background-position: 0 0; }
    75% {background-position: 0 15px;}
    100% {background-position: 0 0; }
}
@-moz-keyframes cloudMove {
    0% {background-position: 0 0; }
    25% {background-position: 0 10px;}
    50% {background-position: 0 0; }
    75% {background-position: 0 15px;}
    100% {background-position: 0 0; }
}
```

<sub>[1](#1)</sub>バグ
IE10ではbackground-positionのアニメーションがうまくいかなかった。
代わりにtop指定をしていた画像にmargin-topで動かした。
（bottom指定のものにはmargin-topしても効かないので注意）
LinuxでCPUの温度を取得する

# TL;DR
LinuxでCPU温度を取得する方法メモ

# sysfs経由で温度を取得する
例えば以下のように取得できる。

```bash
$ cat /sys/class/thermal/thermal_zone0/temp
48154 # -> 48.154℃
```

温度観測用のファイルがどこに存在するかが、CPUのアーキテクチャ依存かは未確認。(存在しない場合もある)

|ターゲット名      | ファイルパス                                        |
|:----------------|:--------------------------------------------------|
| intel系         |  /sys/devices/platform/coretemp.0/temp[0-9]_input |
| i.mx6           |  /sys/class/thermal/thermal_zone0/temp            |
| RaspberryPi     |  /sys/class/thermal/thermal_zone0/temp            |

# `lm_sensors` を使用する
パッケージをインストールできる環境なら `lm_sensors` を使うと良さそうです。
`lm_sensors` の使い方は検索するとたくさん出てくるので省略します。例として以下などを参照すると良いと思います。

[lm sensors - ArchWiki](https://wiki.archlinuxjp.org/index.php/Lm_sensors)
[CentOS 6.5 - サーバ監視ツール（munin）でCPU温度・電圧・ファン回転数測定！ - mk-mode BLOG](http://www.mk-mode.com/octopress/2014/01/15/centos-6-5-munin-setting-of-cpu-fan/)

※自分の試した範囲ではVirtualBox等のVM環境上では取得できませんでした。

![FVEip.png](https://qiita-image-store.s3.amazonaws.com/0/37721/f27a4c37-860e-5c15-16a1-15626ce6d0fe.png)

`xsensors` 等と併用すればよりみやすいかもしれません。

[XSensors CPUのコアごとの温度を表示するコンパクトなシステムモニタ | Ubuntuアプリのいいところ](http://ubuntuapps.info/blog-entry-533.html)

# CPUの耐熱温度について
DataSheetはあるんですが、結局何度まで大丈夫なのかはいまいち読み方が不明。
70℃前後あたりが想定温度で、Maxは100℃ぐらいまで？
ただし、温度が高くなるとプロセッサによってはクロックを下げる機能があるので、その閾値を参考にする必要がありそう。

## intel
[Intel® Core™ Processors Technical Resources](http://www.intel.com/content/www/us/en/processors/core/core-technical-resources.html)

# 参考
## 全般
[Generic Thermal Sysfs driver How To](https://www.kernel.org/doc/Documentation/thermal/sysfs-api.txt)
[monitoring - How do I get the CPU temperature? - Ask Ubuntu](http://askubuntu.com/questions/15832/how-do-i-get-the-cpu-temperature)

## intel
[sensors - How to get core temperature of haswell i7 cores in i3status - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/85468/how-to-get-core-temperature-of-haswell-i7-cores-in-i3status)
[How to read CPU Temperature on Android platform](https://software.intel.com/en-us/forums/android-applications-on-intel-architecture/topic/532221)

## i.mx6 (freescale/NXP)
[Get the temperature of i.mx6 | NXP Community](https://community.freescale.com/thread/322937)

## RaspberryPi
[Raspberry Pi に熱対策してみる : アジャイル株式会社](https://www.agilegroup.co.jp/technote/heatsink-for-rpi.html)
[RaspberryPi(Raspbian)のCPUの温度をcatを使わないで取得してみた - Qiita](http://qiita.com/neipia2/items/5f3f0e6fdb55e7164deb)
VS CodeでJavaScript Salsaを使う

##はじめに

最近、TypeScript界隈で、**Salsa**というキーワードが出ているのは目にしていたのですが、ついにVisual Studio CodeでPreview版が使えるようになったので、調べてみました。
ざっくっと言ってしまえば、**Salsa**はTypeScriptの機能を流用して、JavaScriptのインテリセンス機能の向上を図るプロジェクトです。TypeScriptまでは使いたくないけれど、JSのインテリセンスの弱さに困っていた方には朗報といえます。

##Salsaが必要な理由

TypeScriptのIssueにSalsaが必要な理由が列挙されていたので、適訳します。

- JSのインテリセンスは不正確で使いにくい
- TypeScriptを使うのがベストだけど、JSからTSへの移行にはコストがかかる
- JSDoc形式のコメントは便利だが、IDEによって対応状況がまちまちである

Salsaは、TSの機能を取り込んでこれらの弱点を克服しようというプロジェクトです。そのため、開発環境にTSが必須になりますが、JS単独でもTSのメリットを一部引き継げるようになります。

##環境設定
VS CodeのSalsaはPreview版です。そのため、環境設定が少々必要になります。（正式版になって手順が変わった場合にはUpdateする予定です）

###環境
- Visual Studio Code 0.10.8以上
- TypeScript 1.8以上

###設定

**2016/3/9追記**
VS Code 0.10.10がリリースされました。
これ以降のバージョンでは、既定でSalsaが有効になっているため、以下の設定は不要です。


SalsaはTSに依存しているため、TSのインストールが必要にります。 ~~2016/2/9現在、TSの正式版は1.7系統なので、以下のように`typescript@next`をつけて、1.8系統をインストールします。~~ 2016/2/24に1.8が正式リリースされたため、`@next`は不要になりました。
```
npm install -g typescript
```
続いて、Windows環境の場合には、環境変数に`VSCODE_TSJS`を追加します。（MACだと手順が異なるので、公式サイトで確認してください）

![envvar.png](https://qiita-image-store.s3.amazonaws.com/0/67429/8bedbb6f-f45c-0478-579d-e4a761feb4cc.png)

つづいて、VSCodeからTSを参照させます。そのためには、`typescript.tsdk`にTSの`tsserver.js`ファイルへの参照を記述します。なお、tsserver.jsはグローバルインストール（-g）でインストールした場合は、以下の例のパスに格納されているはずです。設定を埋めるには、VS Codeで、[File]-[Preferences]-[User Settings]を開いて以下を記述します。

```json:setting.json
{
    "typescript.tsdk":"C:\\Users\\ユーザーアカウント名\\AppData\\Roaming\\npm\\node_modules\\typescript\\lib"
}
```

設定が完了後、VS Codeでjsファイルを開くと、ステータスバーの表示がJavaScript (Salsa)に変わります。

![salsapng.png](https://qiita-image-store.s3.amazonaws.com/0/67429/0b3c2159-cdef-e3e4-feb5-1cdeffbddb39.png)

##Salsaのメリット
上述の手順でSalsaが有効になりました。Salsaを使えば、VS Codeで、JSファイルのインテリセンスの精度が向上したり、JSDOCがヒントに反映されたりするようになります。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/67429/aee657a8-614c-92ca-ac2a-692c57fba48c.png)

##参考サイト
[0.10.8 (January 2016)](https://code.visualstudio.com/updates/)
[JavaScript powered by TypeScript](https://github.com/Microsoft/TypeScript/issues/4789)
あ、zabbixのadmin のパスワード忘れた


MySQLで以下の方法でリセットできます。

userid=1のときに限ります。

MySQLにログイン

```
>use zabbix;
>update users set passwd = '5fce1b3e34b520afeffb37ce08c7cd66' WHERE userid = 1;
```

初期インストールして、パスワード変更したものの、あれ？なんだっけな？っておもったときに書き換える。
空白スペースが+になってしまうのをどうにかしたい


GETのquery(?key=value の部分)は
application/x-www-form-urlencoded
という形式に従う。

application/x-www-form-urlencoded
の形式において、空白スペースを+で表すのが独特の方式であるものの、webブラウザーはapplication/x-www-form-urlencodedの符号化アルゴリズムに従うため、自然状態では空白スペースは+になる。

railsでも、GETやPOSTのときのパラメータはapplication/x-www-form-urlencodedの形式に従うように用意するため、
url_helpersメソッドの引数のparamsをapplication/x-www-form-urlencodedに従って変換するコードがおそらく裏で書かれているのだろう。

よって、空白スペースは自然状態では+に変わってしまう。

自分でここのロジックを変えることはできないので、+にかわってしまったものを%20に変えるほかない。

もしくは、application/x-www-form-urlencodedの形式の文字列をdecodeできるURI.decode_www_form_componentを使うくらいしか道がない。

```
URI.decode("%E3%81%AA%E3%81%9C%E3%81%8B+%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84")

# => "なぜか+デコードできない"

---

URI.decode_www_form_component("%E3%81%AA%E3%81%9C%E3%81%8B+%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84")

# => "なぜか デコードできない"
```


### 参考
https://wiki.suikawiki.org/n/application%2Fx-www-form-urlencoded
Raspberry Pi をMacでセットアップ忘備録 4 - USBスピーカーと接続

Raspberry PiのiMacを利用したセットアップ忘備録です。

1.  [初期設定](http://qiita.com/PonDad/items/bfb1cc6ddc18ccf08208) 
2. [無線LANと接続](http://qiita.com/PonDad/items/c0f559962d4108774424) 
3. [SFTPと接続](http://qiita.com/PonDad/items/516e0ef5295f47228a5c) 
4. [USBスピーカーと接続](http://qiita.com/PonDad/items/80fb3abebb5adaa7888d) <<
5. [USBマイクと接続](http://qiita.com/PonDad/items/565f816dc1ebcbe2467e) 
6. [VNCでリモートデスクトップ](http://qiita.com/PonDad/items/232f1aacbef2c4fcb746) 

## 環境

- iMac Late 2013 （OSX 10.11.3）
- Raspberry Pi2 ModelB （raspbian-wheezy）
- PLANEX 無線LAN子機 (USBアダプター型) GW-USNANO2A (FFP)
- サンワサプライ USBスピーカー(ブラック) MM-SPU8BK

## Rasberry Piのスピーカー

USB給電でMic端子に刺すものよりUSBだけで音源も給電出来るものの方が音質は良い様です。

特に音質にこだわりはないので私はサンワサプライの小型のものを購入してみました。

##  mp.3をアップロードする

SFTPクライアントアプリを利用してアップロードする。

![Raspberry Pi 2016-02-09 22-06-04.png](https://qiita-image-store.s3.amazonaws.com/0/47128/ea738b49-cc6a-d0cb-f719-98fc8415084b.png)

リモートデスクトップアプリを利用して確認してみる。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/47128/6414dca1-05cb-503b-e27a-547fa5536565.png)

アップロードされた。

## USBスピーカーをデフォルトにする

Raspberry Piの`etc`ファイルの中に出力先を指定するファイルがあるのでこれを変更する。

```bash:ssh
$ sudo vim /etc/modprobe.d/alsa-base.conf
```

`alsa-base.conf`というファイルの設定を変更する。

```bash:ssh
# Keep snd-pcsp from beeing loaded as first soundcard
options snd-pcsp index=-2
# Keep snd-usb-audio from beeing loaded as first soundcard
options snd-usb-audio index=0
```

`options snd-usb-audio`というパラメーターをコメントアウトするか0にすれば良いらしい。

再起動すればデフォルトスピーカーがUSBスピーカーになってるはず。

## mp3を再生する

色んなプレーヤーがあるようだが、比較的スタンダードだと思われるパッケージをダウンロードする。

```bash:ssh
$ apt-get install mpg321
```

パッケージがダウンロードされたらファイルを指定して再生する。

```bash:ssh
$ mpg321 /home/pi/Desktop/osanpobiyori.mp3
```

これで再生される。

[サンプル動画](https://vine.co/v/i1M7ZF1Kr1D)

## ブラウザからの再生

OSは一世代前のraspbian-wheezyを利用している。デフォルトブラウザEpiphanyはHTML5に対応しているそうなので、音源の再生位は出来そうだと思い試してみる。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/47128/70952cae-8b82-91e8-cd85-12a2ae8a465e.png)

リモートデスクトップからEpiphanyを開き、Soundcloudにアクセス、再生したら普通に聴けた。

##（追記）2016/3/6

OSをraspbian jessieにアップデートしたらUSBより音声が出なくなりました。

`alsa-base.conf`がなくなっているのが原因です。困ったのですが、[Raspberry Pi を AirPlay サーバとして利用する - qiita](http://qiita.com/ikai/items/3df3cfd26f70eb08c0cb) こちらの記事の通り実施して再生できました。

```bash:ssh
$ sudo aplay -l
card 1: MicroII [Audio Advantage MicroII], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```

```bash:ssh
$ sudo vim /etc/modprobe.d/alsa-base.conf

options snd_usb_audio index=0

```


## 参考にさせていただきました

[第12回「Raspberry Piで音遊び！」](http://deviceplus.jp/hobby/raspberrypi_entry_012/)

[【2016/01/07追記】Raspberry Pi2でUSBスピーカーがやっと使えた](http://shinogasa.hatenablog.com/entry/2015/06/19/004452)

[Raspberry Pi でUSBスピーカーを動かす](http://takuya-1st.hatenablog.jp/entry/2014/06/15/180632)