OmniAICreator/Qiita-1.07M huggingface dataset:
Git | .gitconfig を Github レポジトリで公開しよう！ ( .gitconfig の include を使う )

設定ファイルは「秘伝のタレ」になりがちですが、どんどん公開しみてはいかがでしょうか！

と言っても個人名とか、プロジェクト専用の部分とか、公開したくないものもあると思います。
そこで .gitconfig の include 機能を使います。

# 公開用ファイル

.gitconfig とは別に、好きなディレクトリに include 用ファイルを作って、 git 管理しておきます。
ファイル名はなんでも良いです。

たとえばエイリアス設定だけを公開する場合は、次のような感じで。

```bash:~/my_configs/.gitconfig_for_include

[alias]
  ck = checkout
  st = status -s
```

# include する

前記のファイルを .gitconfig 本体から include します。

```bash:~/.gitconfig
+ [include]
+ path = ~/my_configs/.gitconfig_for_include

- [alias]
-  ck = checkout
-  st = status -s

[user]
  name  = yinaura
  email = example@email.com
```

# 結果

こうすることで「公開したい部分」だけを独立させて、レポジトリ管理できます。
わざわざ公普段の .gitconfig を、コピペしたりする必要はありません。

あとは Github に push するだけです！

# 参考

- [gitconfigのincludeが便利](http://qiita.com/knt45/items/51b8a8645f36fb0a6d01)
- https://github.com/Yinaura/private_configs/blob/master/.gitconfig_for_include



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Bashで小技（パイプ・リダイレクトまわり）

Bashで使えるパイプ・リダイレクト関連の小技集。アップデートしていきたいなぁ。

## コマンドの出力をdiff
比べたい内容の片方がファイルで、もう片方がコマンド出力の場合は、`-`引数を使ってコマンド出力を標準入力に流してやればよい。しかし両方がコマンド出力の場合はこのような事はできないので、代わりに**プロセス置換**(`<(...)`)を使う。これで一時ファイルに格納してやる必要が無くなる。

```bash
$ diff <(ps -A) <(ps -e)
238d237
< 31640 pts/1    00:00:00 bash
241d239
< 31643 pts/1    00:00:00 ps
```
`-e`と`-A`が本当に同じか比べるつもりだったが･･･ま、そうなりますよね。

## ps + grepでヘッダを表示する
`ps`コマンドの出力を単純に`grep`するとヘッダが失われてしまう。

```bash
$ ps -e | grep solaar
 2743 ?        00:03:30 solaar
```
ヘッダも出力するには**グループコマンド**を使えばよい。最後の`;`は必須。

```bash
$ ps -e | { head -n 1; grep solaar; }
  PID TTY          TIME CMD
 2743 ?        00:03:30 solaar
```
`grep`の代わりに`sed`を使うというのもアリ。

```bash
$ ps -e | sed -e '1p;1d;/solaar/p;d'
  PID TTY          TIME CMD
 2743 ?        00:03:32 solaar

```

ただ、大抵の場合は`ps -C`で事足りるかもしれない。

```bash
$ ps -C solaar
  PID TTY          TIME CMD
 2743 ?        00:03:32 solaar
```

## ちょっとした文字列を標準入力する
例えば`sed`は標準入力を受け付けてくれるが、`Ctrl-d`を押すまでは停止しない。しかし、スクリプトのデバッグ中は結果だけ表示して、さっさと終了して欲しい。かと言って一時ファイルを作るのも面倒くさい。そんな時は**ヒアストリング**(`<<<`)が使える。

```bash
$ sed -e 's/\(..\)\/\(..\)\/\(....\)/\3\/\1\/\2/' <<<06/03/2016
2016/06/03
```
Zybo > TTC > Prescaler > XTtcPs_SetPrescaler() > 0から16の値

http://qiita.com/7of9/items/ace300523ac2521237b7
で気になったPrescalerについて。


```
    XTtcPs_SetPrescaler(&ttcInst, tmrSetup->Prescaler);
```

にてtmrSetupでセットしたPrescaler値が使われている。


XTtcPs_SetPrescaler()は以下で実装とコメントが見つかった。

https://weble.upc.edu/asig/ESDC/XAPP1026/zc702_GigE/SW/fsbl_bsp/ps7_cortexa9_0/libsrc/ttcps_v2_0/src/xttcps.c

```
/*****************************************************************************/
/**
*
* This function sets the prescaler enable bit and if needed sets the prescaler
* bits in the control register.
*
* @param	InstancePtr is a pointer to the XTtcPs instance.
* @param	PrescalerValue is a number from 0-16 that sets the prescaler
*		to use.
*		If the parameter is 0 - 15, use a prescaler on the clock of
*		2^(PrescalerValue+1), or 2-65536.
*		If the parameter is XTTCPS_CLK_CNTRL_PS_DISABLE, do not use a
*		prescaler.
*
* @return	None
*
* @note		None
*
****************************************************************************/
void XTtcPs_SetPrescaler(XTtcPs *InstancePtr, u8 PrescalerValue)
{
```

- 0から16の値が使える
XSDK > 実行中の処理を停止する > Debug > ARM Cortex-A9 MPCore #0 (Running)上で右クリック > Suspend

```txt:動作環境
Vivado 2015.4 on Windows 8.1 pro
```

XSDKで動かしたソフトの停止（終了）処理がよく分からない。

とりあえず以下で停止はできたようだ。

- Window > Open Perspective > Debugを選択してDebug画面を表示
- 左上にあるDebugウィンドウ?にて APU > ARM Cortex-A9 MPCore #0 (Running)上にて右クリック、Suspendを選択

以上で、System Debuggerで実行した処理の停止は確認できた。

終了時には Disconnect でいいのだろうか。
関連資料を探しているが、まだよく分からない。
SSH接続ができない場合の対処法

#はじめに
原因解明には至っていませんが,ひとまず問題は解決しました

#状況
MacからRaspberryPiにssh接続をしようとしましたが、繋がらない
pingで確認するもタイムアウトしている
IPアドレスは合っている

#解決策
**ルーターを再起動させる**

まさかのこれで解決しました
原因はよくわかっていませんが,もし同様の現象が起こった場合,ルーターにも目を向けてみることをおすすめします
ExcelでPythonプログラミング

#【環境】
　windows8.1
　python2.7

#【概要】
　ExcelをIDE（統合開発環境）のように使います。

#【フォルダ構成】
　excel_python
　　　　|---code_gene.py
　　　　|---code_gene.xlsx

#【Excel】
　フィボナッチ数列を出力するプログラムを書きました。
　Excelのセル1つがpythonでのインデント1つになります。
<img width="415" alt="exce..png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/ab87f75d-255c-a21b-6e39-555f41ba37e7.png">

#【プログラム】
```py:code_gene.py
# -*- coding: utf-8 -*-

from excel import OpenExcel 

# ファイル読み込み
f = OpenExcel('code_generation.xlsx') 

# cell_valueに行ごとにセルの値を追加
cell_value = []
for row in xrange(1, len(f.read('A')) + 1):
    cell_value.append(f.read(row))

# 改行のみの行に改行コードを代入
for row in xrange(len(cell_value)):
    kaigyo = ""
    for col in xrange(len(cell_value[0])):
        kaigyo += kaigyo + cell_value[row][col]
    if kaigyo == "":
        cell_value[row][0] = "\n"

# コード生成
for row in xrange(len(cell_value)):
    for col in xrange(len(cell_value[0])):
        if not len(cell_value[row][col]) == 0:
            print cell_value[row][col]
            break
        else:
            print "    ",
```

　このプログラムを実行します。
　実行方法は
　　`python code_gene.py > code.py & python code.py`

#【実行結果】
　1
　1
　2
　3
　5
　8
　13
　21
　34
　55

```py:code.py
# -*- coding: utf-8 -*-
def fib(n):
     if n < 2:
          return 1
     else:
          return fib(n-1) + fib(n-2)


for i in xrange(10):
     print fib(i)

```

#【問題】
　Excelでの改行１つが、出力したpythonファイルでは改行２つになってしまう。

#【参考サイト】
　[めざせpythonライブラリマスター （12）excel](http://qiita.com/Algebra_nobu/items/bdf437b9e1c53f710f03)
Herokuにバックグラウンド処理をさせる with Python


日本語のバックグラウンド処理の記事は、HerokuでRailsを使う人が多いのか、Rubyが中心です。
Pythonの記事も欲しいな〜と思ったので、自分のメモを含めて記録を残しておきます。

## そもそも、なぜバックグラウンドで処理させるの？
Herokuでは、普通のHTTPアクセスの場合は`web dyno`さんが捌いてくれるのですが[(参考 Dynos and the Dyno Manager)](https://devcenter.heroku.com/articles/dynos)、
`web dyno`さんは30秒でタイムアウトになってしまいます。
普通に考えたら、webの処理で30秒かかるって相当重い処理だったり時間がかかる特殊な処理なのかなと思います。


しかしながら、そんな処理をしたい場合もあると思います。


## いざ、実装
HerokuのdevcenterにきちんとRuby以外の言語についても、
[Worker Dynos, Background Jobs and Queueing](https://devcenter.heroku.com/articles/background-jobs-queueing)に書いてありました。
ここでは、Pythonについて書きます。

言っておきますが、ほぼ[ここ](https://devcenter.heroku.com/articles/python-rq)のままです。



### 準備
####1.Redisのインストール

```bash
$ brew install redis #ローカルで開発しないなら入れなくてよい
$ pip install redis
```

####2.RQ(Redis Queue)をインストール

``` bash
$ pip install rq
```

####3.必要なライブラリを記載

``` bash
$ pip freeze > requirements.txt
```

####4.バックグラウンド処理を呼び出してくれるやつを作る。
こいつが、redisに貯まった仕事を１つずつ呼び出してくれるみたい。

```python:worker.py
import os

import redis
from rq import Worker, Queue, Connection

listen = ['high', 'default', 'low']

redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')

conn = redis.from_url(redis_url)

if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

```


####5.バックグラウンドでさせたい処理を書く

```python:main.py
from rq import Queue
from worker import conn
from bottle import route, run


q = Queue(connection=conn)

@route('/index')
def index():
	result = q.enqueue(background_process, '引数１')
	return result

def background_process(name):
	# ここに時間のかかる処理を書く
	return name * 10
	
	
run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))

```

####6.Procfileにworker.pyを記述する
```txt:Procfile
web:python main.py
worker:python worker.py
```

####7.herokuのアドオンにredistogoを追加する
```bash
$ heroku addons:create redistogo
```
####8.デプロイする
```bash
$ git add .
$ git commit -m "add worker"
$ git push heroku master
```
####9.ワーカーを起動させる
```bash
$  heroku scale worker=1
```

##お疲れ様です、手順は完了です
ここまでくれば、きちんとバックグラウンド処理が動くと思います。
あと、ローカル環境にちゃんとredisのサーバーを入れておくと、main.pyとworker.pyをちゃんと起動しておけば、バックグラウンド処理が動くのの確認ができます。

##困ったときは
ログを見て解決しましょう。

```bash
$ heroku logs -t -p worker
```
めざせpythonライブラリマスター （12）excel

#【ライブラリ説明】
　今のところエクセル読み込みのみ対応
　書き込みも対応できる予定みたい・・・

#【プログラム】
```py:excel.py
from excel import OpenExcel 

# ファイル読み込み
f = OpenExcel('test.xls') 

# A列読み込み
f.read('A')

# 1行目読み込み
f.read(1)

# A5セル読み込み
f.read('A5')
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/excel/1.0.0)
　[github](https://github.com/twz915/excel)
[Siv3d]エスケープキーで終了しないようにする

初投稿っす。
Siv3Dでゲーム作りの練習中だけど、まともにゲームを作ろうとするとメニューが必要になる。
一般的なPCゲームだとエスケープキーでメニューが表示されるのが多いけど、Siv3Dのデフォルトではエスケープキーに終了が割り振られていて、押した瞬間終わる。まぁデバッグ中とかだったら楽でいいんだけど、家庭用機でたとえるならスタートボタンを押すと電源OFFみたいなかなりちょっとアレな仕様。
真っ先に変えたいところだけれど、チュートリアルにある設定変更が「右クリックで終了」とか鬼畜にも程がある内容だったので、普通の設定への変更の仕方を記録しておく。

# 問題点
件のエスケープキーの振る舞いを規定しているのはこちら、System.hpp。

```cpp:System.hpp
struct WindowEvent
{
	enum Flag : uint32
	{
		/// <summary>
		/// ウィンドウの [x] ボタンが押される
		/// </summary>
		CloseButton = 0x01,

		/// <summary>
		/// エスケープキーが押される
		/// </summary>
		EscapeKey = 0x02,

		/// <summary>
		/// マウスの左クリック
		/// </summary>
		LeftClick = 0x04,

		/// <summary>
		/// マウスの右クリック
		/// </summary>
		RightClick = 0x08,

		/// <summary>
		/// ウィンドウのフォーカスが外れる
		/// </summary>
		Unfocus = 0x10,

		/// <summary>
		/// 何らかのキーが押される
		/// </summary>
		AnyKey = 0x20,

		/// <summary>
		/// デフォルト（ウィンドウの [x] ボタンが押されるか、エスケープキーが押される）
		/// </summary>
		Default = CloseButton | EscapeKey,

		/// <summary>
		/// 設定しない
		/// </summary>
		/// <remarks>
		/// 必ず System::Exit() を実行して終了する必要があります。
		/// </remarks>
		Manual = 0x00,
	};
};
```


このWindowsEventをSystem::SetExitEvent()へ渡してあげれば設定完了。ちなみにこのDefaultが妖怪「エスケープで終了」の正体ぢゃ。

マウスカーソルが使える＆ウィンドウモードだったらCloseButtonのみにするのがいいんだろう。フルスクリーン前提のゲームやマウスカーソルを消して使う場合は×ボタンがクリック出来ないわけだけど、そういう場合もこの設定のままSystem::Exit()をコールすれば問題なく終了できるので、常にこの設定を入れるようにしちゃってもいいと思う。

# 本題：エスケープキーで終了しないようにする
ゲームプレイ中に変更するものでもないので、メイン関数の初めのほうで設定変更しちゃうのがいいんじゃないでしょうか。

```cpp:Main.cpp
void Main()
{
	...
	System::SetExitEvent(WindowEvent::CloseButton);
	...
	while(System::Update())
	{
		...
	}
}
```
Google Cloud SDKの設定


Google Cloud SDKを利用するとDeveloperコンソール相当の操作以上のことが可能になる。DeveloperコンソールがWebUIなのに対してCloud SDKはCLIである。
Cloud SDKにGCPのサービスを操作及び管理するためのツールやライブラリ、開発用のエミュレータが含まれている。

|コマンド|備考|
|:-----------------|:------------------|
|gcloud|GCPリソースと開発者ワークフローの管理|
|gsutil|GCSを操作するためのCLI。Pythonのスクリプト|
|bq|BigQueryをインタラクティブに操作するためのCLI。Pythonスクリプト|
|kubectl|Kubernetes のコマンドラインツール|

インストール

```
$ curl https://sdk.cloud.google.com | bash
```
ただし、AppeEngineSDKは別管理なので、以下のサイトからダウンロードしてインストールする必要がある。
https://cloud.google.com/appengine/downloads

Googleアカウントの認証と設定
以下の3つの方法がある
手段１：gcloud initで認証と初期設定（プロジェクトの設定）などが行われる。※ブラウザ必須
手段２：gcloud auth loginで認証し、gcloud config set projectでプロジェクトIDを設定　※ブラウザ必要なし。
手段3:サービスアカウントの秘密鍵を事前にダウンロードし、以下のコマンドを実行

```
gcloud auth activate-service-account {サービスアカウントのメールアドレス} --key-file
{サービスアカウントの秘密鍵}を実行
```
現在設定されている認証情報を表示

```
gcloud auth list
```

認証情報を削除

```
gcloud auth revoke
```

インストール済みのコンポーネント一覧表示

```
gcloud components list
```
Rails ページネーションのperとpageを一つのscopeで実現する

## やりたいこと

ページングを実施する際に、pageやperを渡すのですが、下記のように`params`とそれに対応したキーを渡す必要があり、少しコードが長くなり気味。

```rb
Item.page(params[:page]).per(params[:per])
```

そこで、一つのチェインでpaginateを実現する方法を紹介します。

## Concernsを使って、paginateのscopeを追加

```rb:models/concerns/paginate.rb
module Paginate
  extend ActiveSupport::Concern
  include Kaminari::PageScopeMethods

  included do
    scope :paginate, ->(p) { page(p[:page]).per(p[:per]) }
  end
end
```

使うときは、Modelにmoduleをincludeします。

```rb
class Item < ActiveRecord::Base
  include Paginate
end
```

すると、下記のように一つのscopeでpaginateを実現できます。

```rb
Item.paginate(params)
```
Apache PDFBoxでPDFページを画像にする（ラスタライズ）

[Apache PDFBoxが日本語出力できるようになった](http://qiita.com/ota-meshi/items/55a6c379544b33728b58)のでちょっとPDFBoxどんなことできるのっていうのを少しずつ調べようかと思いました。

今回はPDFを画像にする（ラスタライズ）方法です。

https://pdfbox.apache.org/2.0/migration.html#pdf-rendering
に記載されている方法です。
（ネットで調べると「convertToImage使え」っていう記事が多く出てきますが、2系で方法が変わったようですね。）

# コード

```java
	public static void main(String[] args) throws IOException {
		Path path = Paths.get("pdf.jpg");
		try (InputStream in = new FileInputStream("pdf.pdf");
				OutputStream out = Files.newOutputStream(path);) {
			rasterize(in, out);
		}

		System.out.println(path.toAbsolutePath());
	}

	public static void rasterize(InputStream in, OutputStream out) throws IOException {
		try (PDDocument doc = PDDocument.load(in)) {

			PDFRenderer pdfRenderer = new PDFRenderer(doc);

			BufferedImage bim = pdfRenderer.renderImageWithDPI(0/*1ページ目を対象にする*/, 300, ImageType.RGB);

			ImageIO.write(bim, "JPEG", out);
		}
	}
```

# 結果

jpgになった。

![image](https://qiita-image-store.s3.amazonaws.com/0/84259/d202ac15-e2df-5528-76d8-69c333c03f91.png)
[メモ] (らずぱい) iPhoneテザリングでインターネット


[How to Tether Your Raspberry Pi with your iPhone 5](http://www.daveconroy.com/how-to-tether-your-raspberry-pi-with-your-iphone-5/)
http://www.daveconroy.com/how-to-tether-your-raspberry-pi-with-your-iphone-5/
を元に最近のJessieにて。

## 環境
- Raspberry Pi 2
- Raspbian: 2016-05-10-raspbian-jessie-lite.img (素の状態から)
- iPhone 5s 
- Lightning USB ケーブル


## 手順

1. 必要なパッケージを入れて、`/media/iPhone`フォルダ作成

    ```txt:実行
sudo apt-get install -y ipheth-utils ifuse libimobiledevice-utils
sudo ifuse /media/iPhone
```

2. ファイル編集(2ファイル変更、1ファイル追加)

     ```txt:/etc/network/interfacesへ2行追加
...
allow-hotplug eth1
iface eth1 inet dhcp
```

    ```txt:/lib/udev/iphoneconnectというファイルを作成。実行属性をつける
#!/bin/bash
umount /media/iPhone #when the iPhone is unplugged, it is not automatically unmounted.
ifuse /media/iPhone
ipheth-pair
```

    ```txt:/lib/udev/rules.d/90-iphone-tether.rulesを開いて、RUN+=のとこの、ipheth-pairをiphoneconnectへ
...
...
# Execute pairing program when appropriate
#ACTION=="add", SUBSYSTEM=="net", ENV{ID_USB_DRIVER}=="ipheth", SYMLINK+="iphone", RUN+="ipheth-pair"
ACTION=="add", SUBSYSTEM=="net", ENV{ID_USB_DRIVER}=="ipheth", SYMLINK+="iphone", RUN+="iphoneconnect"
...
```

3. らずぱい再起動
4. インターネット共有をONにしたiPhoneつないで、"このコンピュータを信頼しますか？" => "信頼"
5. 確認 : IPアドレス=>172.20.10.4, pingも通る。

    ```shell-session
pi@raspberrypi:~$ /sbin/ifconfig eth1 | grep 'inet addr:'
          inet addr:172.20.10.4  Bcast:172.20.10.255  Mask:255.255.255.0
pi@raspberrypi:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=2 ttl=50 time=209 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 1 received, 66% packet loss, time 2000ms
rtt min/avg/max/mdev = 209.999/209.999/209.999/0.000 ms
pi@raspberrypi:~$
...
# ケーブル引っこ抜く
...
pi@raspberrypi:~$ /sbin/ifconfig eth1 | grep 'inet addr:'
eth1: error fetching interface information: Device not found
```


## パッケージ

```shell-session
$ apt-cache show ipheth-utils ifuse libimobiledevice-utils | grep Description:
Description: USB tethering driver support utilities for the iPhone
Description: FUSE module for iPhone and iPod Touch devices
Description: Library for communicating with iPhone and iPod Touch devices
```
技術英語 > when - and if - the details get settled

@ LOE > May 31, 2013
http://loe.org/shows/shows.html?programID=13-P13-00022
>  even though we don’t know exactly what the market will be <font color=red>when — and if —the details get settled</font>.

http://eow.alc.co.jp/search?q=get+settled

「when:いつ詳細が決まるか（if:そもそも決まるのか）」ということだろうか。

<hr>
関連して思い出したのは

> I'm not willing to settle for that.

http://qiita.com/7of9/items/fd68eb2ac509b439ed7d
めざせpythonライブラリマスター （11）nlist

#【ライブラリ説明】
　多重リストを簡単操作

#【プログラム】
```py:nlist.py
# -*- coding: utf-8 -*-

from nlist import NList

lis = NList([[1, 2], [3, 4]])
lis[1, 0] = 42
print (lis.index(42))
# (1, 0)

lis2 = NList(shape=(2, 3))
lis2[1, 2] = 66
print (lis2)
# NList([[None, None, None], [None, None, 66]], shape=(2, 3))
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/nlist/0.1)
　[github](https://github.com/swarmer/nlist)
　[document](http://nlist.readthedocs.io/en/latest/index.html)
めざせpythonライブラリマスター （10）timeit

#【ライブラリ説明】
　コードの実行時間を計測します

#【プログラム】
```py:timeit1.py
# -*- coding: utf-8 -*-

def test():
    L = []
    for i in range(100):
        L.append(i)

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))
    # 10.1292455843
```

```py:timeit2.py
# -*- coding: utf-8 -*-

def test():
    L = []
    for i in range(10):
        L.append(i)

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))
    # 1.57425508033
```

#【参考サイト】
　[timeit](http://docs.python.jp/2/library/timeit.html)
Raspberry PiにAK-020を3Gモデムとして自動で認識させる

# この記事について

ソラコムのスターターキットに含まれるAK-020はRaspberry Piに挿しただけではCDドライブとして認識されます。USB\_ModeSwitchを使用して自動で3Gモデムとして認識させる設定を記載しています。

3Gモデムとして認識させたあとに実際にネットワークに接続する設定については記載していません。

# 使用した環境

**Raspberry Pi**

* Raspberry Pi 2 Model B (V1.1)
* Raspbian Jessie Lite (Release date: 2016-05-27)

**主なパッケージ**

* udev (215-17+deb8u4)
* usb-modeswitch (2.2.0+repack0-2)

# USB_ModeSwitchの設定

USB\_ModeSwitchをインストールします(前述の環境であればデフォルトでインストールされています)。

```shell-session
$ sudo apt-get install usb-modeswitch
```

`/lib/udev/rules.d/40-usb_modeswitch.rules`の末尾の`LABEL="modeswitch_rules_end"`の前の行に以下の内容を追加します。

```
# ABIT AK-020
ATTR{idVendor}=="15eb", ATTR{idProduct}=="a403", RUN+="usb_modeswitch '%b/%k'"
```

次に`/etc/usb_modeswitch.d/15eb:a403`というファイルを作成して、以下の内容を記述します。

```
DefaultVendor = 0x15eb
DefaultProduct = 0xa403
TargetVendor = 0x15eb
TargetProduct = 0x7d0e
StandardEject = 1
WaitBefore=2
```

再起動後、AK-020を挿して数秒待ってから`lsusb`コマンドを実行して以下の内容が出力されたら設定が正しく行えています(`15eb:7d0e`の箇所が`15eb:a403`がなっている場合、CDドライブとして認識されたままになっています)。

```shell-session
$ lsusb
Bus 001 Device 007: ID 15eb:7d0e
(省略)
```

# 補足

## USB\_ModeSwitchについて

AK-020は[ゼロインストール](http://itpro.nikkeibp.co.jp/article/Keyword/20090829/336194/ "Linuxキーワード - ゼロインストール：ITpro")という機能を備えています。そのため、Windows、MACであれば最初はCDドライブとして認識され、そのドライブに含まれているソフトウェア・ドライバをインストールすることで、以降は3Gモデムとして認識されるようになります。ただし、Linux向けのドライバは提供されていないため、メーカーの説明書には`eject`コマンドを使用してCDドライブとして認識されたAK-020を取り外し、手動で3Gモデムとして認識させる手順が記載されています。

USB\_ModeSwitchを使用することでAK-020のようなゼロインストールの機能を持ったUSBデバイスを自動で3Gモデムとして認識させてくれます。USB\_ModeSwitchがデフォルトでサポートしているUSBデバイスであれば、設定不要で3Gモデムとして認識されます。最新のバージョンでサポートされているUSBデバイスは[ここ](http://www.draisberghof.de/usb_modeswitch/#hardware "Draisberghof - Software - USB_ModeSwitch")で確認できます。

## USB\_ModwSwitchの設定について

### `/lib/udev/rules.d/40-usb_modeswitch.rules`の変更
このファイルの変更はUSB_ModeSwitchがAK-020をデフォルトでサポートしていないことに対する対応です。USB\_ModeSwitchがAK-020をサポートした段階で手動で設定を行う必要はなくなります。

### `/etc/usb_modeswitch.d/`に作成するファイル
このファイルの作成はUSB\_ModeSwitchがAK-020をデフォルトでサポートした場合、作成する必要がなくなるかもしれません。ただし、上手く認識されない場合などは、ファイルを作成してデフォルトの設定をオーバーライドする必要があります。

また、`StandardEject = 1`という記述により、単純なドライブの取り外しを行っているようなのですが、SniffUsbなどのWindowsのソフトを使用して、AK-020特有のデータのやりとりを解析して、そのデータを送信させる設定を含めるほうが良いようです。下記のフォーラムのやりとりから解析の手順などが確認できるようなのですが未調査です。

* [USB_ModeSwitch • View topic - How to find MessageContent by SniffUSB](http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?f=3&amp;t=1368 "USB_ModeSwitch • View topic - How to find MessageContent by SniffUSB")で

# 参考リンク

* [NetworkManagerでカンタン！SORACOM SIM自動接続環境を作ろう | Japanese Raspberry Pi Users Group](http://www.raspi.jp/2016/05/soracom-networkmanager/ "NetworkManagerでカンタン！SORACOM SIM自動接続環境を作ろう | Japanese Raspberry Pi Users Group")
* [(Raspbian) AK-020で3Gモデム自動接続(毎回のejectとmodprobeなし) - Qiita](http://qiita.com/aquahika/items/dc7d8ad8f481414d3528 "(Raspbian) AK-020で3Gモデム自動接続(毎回のejectとmodprobeなし) - Qiita")
Node.jsのインタプリタ内でJSファイルを読み込む

備忘録

単にインタプリタ内で `.load <js file>` と入力することで、コンソールに `<js file>` の中身が全て吐き出されてそのまま実行される

```node:インタプリタ
> .load <js file>
> console.log("hello, world!"); // こいつが<js file>の内容
hello, world!
undefined
> 
```
opcacheの管理画面比較

OSSとしてリリースされているopcacheの管理画面を比較してみます。
（ネタとしてはだいぶ古いですが）

## 主な管理画面

* ocp  
https://gist.githubusercontent.com/ck-on/4959032/raw/ad6362bff017f3c59c96ab395e3308ed52650cab/ocp.php
* rlerdorf/opcache-status  
https://github.com/rlerdorf/opcache-status
* amnuts/opcache-gui  
https://github.com/amnuts/opcache-gui
* PeeHaa/OpCacheGUI  
https://github.com/PeeHaa/OpCacheGUI

## 概要比較表

|名前|ライセンス|first commit|導入|統計値|グラフ|ファイル一覧|キャッシュ操作|
|---|---|---|---|---|---|---|---|---|
|ocp|不明（フリー？）|2013/02/15|容易|あり|:star::star::star:|:star::star:|あり|
|rlerdorf/opcache-status|不明|2013/03/17|容易|あり|:star::star::star:|:star:|なし|
|amnuts/opcache-gui|MIT|2013/04/09|容易|あり|:star::star:|:star::star:|あり|
|PeeHaa/OpCacheGUI|MIT|2013/06/23|やや容易|あり|:star::star::star:|:star::star::star:|あり|

## 詳細

### ocp

* 一番はじめにリリースされた
* 1ファイルのみで導入可能
* 統計値表示あり、設定値表示あり
* メモリ/キャッシュキー/ヒット率の棒グラフ
* ファイル一覧の検索なし、ソートあり
* キャッシュ操作あり
* phpinfo風UI
* ocp.phpに以下のようなライセンス？の記述あり  
```
Free for any kind of use or modification, I am not responsible for anything, please share your improvements
```

### rlerdorf/opcache-status

![opcache-status](https://raw.githubusercontent.com/jamesrwhite/opcache-status/improve-readme/screenshot.png)

* 1ファイルのみで導入可能
* 統計値表示あり、設定値表示あり
* メモリ/キャッシュキー/ヒット率の円グラフ
* キャッシュファイルの可視化グラフあり
* ファイル一覧の検索なし、ソートなし
* キャッシュ操作なし
* opcache.phpにはライセンス表記なし

### amnuts/opcache-gui

![opcache-gui](https://camo.githubusercontent.com/68e0e3c30ea59c4e7d98545df86d192151dd1865/687474703a2f2f616d6e7574732e636f6d2f696d616765732f6f7063616368652f73637265656e73686f742f6f766572766965772d76322e312e312e706e67)

* 1ファイルのみで導入可能
* 統計値表示あり、設定値表示あり
* メモリ/ヒット率の円グラフあり  
キャッシュキーのグラフはなし
* ファイル一覧の検索あり、ソート固定（キャッシュヒット数）
* キャッシュ操作あり
* MITライセンス

### PeeHaa/OpCacheGUI

![OpCacheGUI](http://i.imgur.com/Py4YtsC.png)

* 1ファイルのみでは導入不可。リポジトリ全体を配置する
* 統計値表示あり、設定値表示あり
* メモリ/キャッシュキー/ヒット率の円グラフあり  
ただしグラフにパーセント表記がない
* ファイル一覧の検索あり、ソートあり
* キャッシュ操作あり
* MITライセンス
* 多言語対応しているけど日本語には対応していない
* 初期状態ではログイン画面になるのでinit.example.phpをちょっといじる必要がある
* 4つの中で一番リッチなUI。スマートフォンにも対応している
* index.phpでsession_start()を使っている

## どれを使うか
細かい違いはありますがどれも主な統計情報（メモリ使用量、キャッシュヒット率）は表示できるので機能的に大きな差はないように思えます。
なので最終的には好きなものを使う。でもよさそうです。
ライセンスを気にするのであればMITと明記されているamnuts/opcache-guiかPeeHaa/OpCacheGUIのどちらかでしょうか。
Webフロントエンドまとめ

Webフロントエンドの情報をまとめてみます。

## Webフロントエンド

あまり詳しくないのだけど、Webフロントエンドとは、Webサイト表の部分全般の構築を意味する感じだと思っています。

表というのは、デザインからレイアウト、フォーム機能などそういったものですね。ちなみに、裏はサーバーサイドっていうのでしょうか。

で、個人的にはこの辺り、毎年頻繁に新しい技術が出てきて、使ったりしているのですが、使ったものなどをまとめとこうかなと思いました。

ちなみに、かなり適当なことを言っています。なので、気になったら自分で調べてみることをおすすめします。

### [riot.js](http://riotjs.com/ja/)

riotは、ミニマムかつシンプルで、コード類がわけられているので分かりやすいです。詳しくは、以下の記事を参考にしてください。

[Riot vs React & Polymer](http://riotjs.com/ja/compare/)

### [angular.js](https://github.com/angular/angular.js)

JS Frameworkの一つ。人気らしいけど、あまり使いたくない。HTMLユーザーは、Reactよりもこっちを選べばいいと思います。たぶん。

### [react.js](https://github.com/facebook/React)

JS Frameworkの一つ。私は、AngularよりもReactのほうが好きです。Virtual DOM。DOMはUAより偽装が難しく、DOMよって操作するjQueryが嫌がられた結果、Virtual DOMが注目されているぽい。理由は以下。

ただし、`react-cli`より`angular-cli`のほうが使いやすいような気がします。

一方は、Organizationでリリースされていますが、もう一方はContributorの方がリリースされている感じです。

```bash:
# https://github.com/angular/angular-cli
$ npm install -g angular-cli
$ ng new PROJECT_NAME
$ cd PROJECT_NAME
$ ng serve

# https://github.com/mzabriskie/rackt-cli
$ npm install -g rackt-cli
```

### [flux](https://github.com/facebook/flux)

[こちら](https://github.com/facebook/flux/tree/master/examples/flux-todomvc/)を見れば誰でも`flux`が何となくわかると思います。API処理の流れを作るぽい。

[redux-flux](https://github.com/Reactjs/redux)

[fluxxor-flux](https://github.com/BinaryMuse/fluxxor)

[arda-flux](https://github.com/mizchi/arda)

### [phoenix-elixir](https://github.com/phoenixframework/phoenix)

リアルタイム構築。

### [socketio-node](https://github.com/socketio/socket.io/)

同じく。

### [elm-html](https://github.com/evancz/elm-html)

React, FluxのVirtual DOM上で使うHTML言語という感じぽいです。適当。

## まとめ

多分、上記のようなものはみんなが使ってるもので、どれも目新しいものでは全く無く、むしろ古臭い感じのものですが、一般的なものを挙げてみました。

多分、紹介したものは誰でも簡単に使えるようになっていると思います。

とりあえず触ってみればわかると思われますので、知らないツールがあれば触ってみることをおすすめします。

Examplesなどが用意されている場合、それを見ると大体わかると思います。

## その他、補足

[jquery-ajax](http://semooh.jp/jquery/api/ajax/jQuery.ajax/options/)

[slim-html](https://github.com/slim-template/slim)

[sass-css](https://github.com/sass/sass)
React+Webpack


ReactとWebpackが便利です。

## ReactとWebpackを使ってテンプレートを作成する

例えば、[react-terminal](https://github.com/wmdmark/react-terminal)というものがあります。

これは`jquery.terminal`のような動きをします。

具体的には、Webからユーザーのリクエストを受けて表示内容を決める Web Terminal のようなページを作成するためのツールですね。

```bash:
$ git clone https://github.com/wmdmark/react-terminal

$ cd react-terminal

$ npm i -g react-tools webpack webpack-dev-server 
$ npm i

$ webpack

$ webpack-dev-server --content-base build/ -d
or
$ cd ./build
$ jekyll server

$ curl -sL localhost:8080
```

何がどのように動作しているのかは、コードを見ればだいたい分かると思います。例えば、新しいコマンドを追加してみましょう。

```bash:
$ vim src/commands/basic.coffee

+ ls = (state, args...)->
+   output = "index.coffee"
+   state.buffer.push(output)
+   {buffer: state.buffer}
- module.exports = {help, clear, echo, su}
+ module.exports = {help, clear, echo, su, ls}
```

これで、`localhost:8080`にアクセスし、`ls`を実行してみましょう。`index.coffee`があれば成功です。もちろん、実際にあるわけではなく見せかけです。

ちなみに、`webpack-dev-server`が動作している間は、変更が反映されますので、わざわざ`webpack`コマンドでビルドする必要はありません。最終的には`webpack`でビルドします。
Dockerでプロキシサーバーを立てる


基本的にサーバーで設定すべき事柄はDockerで代替すると便利です。

イメージはAlpineです。非常に早く、容量も少ないのでおすすめです。

## Blocklist(AdBlock)を設定したプロキシサーバー経由でアクセスする

```bash:
# https://hub.docker.com/r/syui/docker-alpine-privoxy-block/
$ sudo docker run -d -p 8119:8119 syui/docker-alpine-privoxy-block

$ curl -sL -x localhost:8119 ipinfo.io
```

## Torへの接続にPrivoxyを経由させる

```bash:
# https://hub.docker.com/r/syui/docker-alpine-privoxy-block-tor/
$ sudo docker run -d -p 8118:8118 -p 9050:9050 syui/docker-alpine-privoxy-block-tor

$ curl -sL -x localhost:8118 ipinfo.io
$ echo "proxy = localhost:8118" >> ~/.curlrc
$ curl -sL ipinfo.io
```

参考

https://github.com/rdsubhas/docker-tor-privoxy-alpine
Windowsで使っているツールまとめ


BusyBoxというものがあります。Androidに入れて使ってますが、ashを使うデバイスではBusyBoxが使われているのをよく見かけます。いわばアーキテクト系というのでしょうか。

もちろん、WindowsでもBusyBoxバイナリを動かせます。

最小構成ですね。MinGWを使ったことがありますが、それと似たようなものというイメージ。

Windowsではchocoを使えば簡単にインストールできると思います。

ついでに私がWindowsで使ってるツールの一部を載せときます。

choco [https://chocolatey.org](https://chocolatey.org)

msys2 [https://msys2.github.io/](https://msys2.github.io/)

boxstarter [http://boxstarter.org/](http://boxstarter.org/)

sysinternals [https://technet.microsoft.com/ja-jp/sysinternals/bb545027.aspx](https://technet.microsoft.com/ja-jp/sysinternals/bb545027.aspx)

virtualstudio [https://www.microsoft.com/ja-jp/dev/products/visual-studio-2015.aspx](https://www.microsoft.com/ja-jp/dev/products/visual-studio-2015.aspx)

mingw [http://www.mingw.org/](http://www.mingw.org/)

busybox [https://github.com/pclouds/busybox-w32](https://github.com/pclouds/busybox-w32)

cygwin [https://www.cygwin.com/](https://www.cygwin.com/)

powershell [https://github.com/PowerShell](https://github.com/PowerShell)

openssh [https://github.com/PowerShell/Win32-OpenSSH](https://github.com/PowerShell/Win32-OpenSSH)
2DでSpriteStudioのススメ


SpriteStudioでドロイドくんを動かしてみました。

[SpriteStudio](http://www.webtech.co.jp/spritestudio/)は、2D画像をアニメーションするためのアプリで、UnityやUE4とも連携でき、そのためのプラグインがいくつか用意されています。

https://github.com/SpriteStudio

(...ところで、なぜOrgではなくUserなのだろうか)

補助ツールなども豊富で、分かりやすく説明されているためすぐに使えました。

http://www.webtech.co.jp/help/ja/spritestudio/download/fordesigner/

### GIMPからPSDを作成し、それをSpriteStudioで読み込む

以下のツールを使います。これにより`.psd`から`.ssce(ssae,sspj)`ができます。

(正確には、`.psd`からレイヤーごとの`.png`が作られ、その構成を記した`.txt`から`.ssce`などが作成されます)

https://github.com/SpriteStudio/PSDtoSS/wiki


### SpriteStudioで.ssceを読み込む

先ほど作成した`.ssce`を開きます。当該アプリと拡張子が関連付けされていると思います。

しかし、Mac(Free版)ではアプリを開いた後に再度読み込まないと、できたりできなかったりでした。

また、当該環境下では、GIMPプラグインである`GIMPWin_PSDtoSS_PNGExport.py`で作成し、`PSDtoSS for Mac`で作成した`.ssce`は「セルマップ画像とパーツ毎のX,Y座標、縦横サイズを含む.SSCEファイルとパーツのレイアウト情報」を正確には含んでいませんでした。したがって、「セルマップの登録とパーツの配置まで自動で行」われませんでしたので、手動で配置しました。

![](https://raw.githubusercontent.com/mba-hack/images/master/game_spritestudio_undroid.png)

### アニメーションの振り付け

自動(私の場合は手動)でパーツの配置を完了した後は、アニメーションをつけていきます。

![](https://raw.githubusercontent.com/mba-hack/images/master/game_spritestudio_undroid.gif)

ヒント : 手の重心を下のほうに変更すれば、もう少しスムーズに手をふることが出来ます!

### Live2DとSpriteStudio

まず、SpriteStudioは[Live2D](http://www.live2d.com/ja/)より遥かに使いやすい印象でした。ただし、Live2Dは完全無料版があるのに対し、SpriteStudioは基本有料です。

しかし、Live2D(Free)は制限がきつくて実際はあまり使いものにならないような気がします。

次に、Live2Dが使えない理由は他にもあります。

具体的には、`QuickTime`と`Java`に依存しているからです。Windowsの場合もMacの場合も、これは最悪です

Macの場合は`Java SE6`をインストールしなければいけません。Windowsは脆弱な`QuickTime`が必要になるため使いたくありません。

さらに、Live2DはViewerなどにAdobe Airが必要だったりと、技術者が使うにはとても抵抗があるアプリです。

なので、2Dを作るならSpriteStudioのほうが良いと私は思いました。これは、使いやすさや依存関係などを見て総合的に判断しています。

### SpriteStudioの基本的な使い方

まず、[こちら](http://www.webtech.co.jp/help/ja/spritestudio/download/fordesigner/)にサンプルが用意されていると思います。それを読み込んで動作を確認してみても良いし、イチから作ってみても良いです。

私の場合、イラストから作成し、アニメーションを付けてみました。

使い方は、画像ファイルを読み込んで、一つ一つのパーツに時間軸のアニメーションを付けていきます。この際、[プラグイン](https://github.com/SpriteStudio/PSDtoSS)を使っても構いません。

アニメーションの付け方ですが、パーツをダブルクリックすると重心を設定できます。重心は基本的に胸や腰の方向に向けて設定すると良いでしょう。

![](https://raw.githubusercontent.com/mba-hack/images/master/game_spritestudio_sample_04.png)

また、アニメーションを付ける際には、ツールバーの下記にマーク(的?のマーク)されたものを使うと設定しやすいです。

![](https://raw.githubusercontent.com/mba-hack/images/master/game_spritestudio_sample_03.png)
初心者でもイチから作曲する方法


イチから始める作曲入門です。今回はBGMから歌詞まで全部自分で作ります。


## 作曲の流れ

作曲の基本的な流れは、(1)BGMを作る、(2)BGMからリズムを作る、(3)リズムに歌詞を入れるという流れになります。あくまで個人的なものなので、各々が好きなように歌詞から作ったり、リズムから作ったりして良いと思っています。

まず、BGMをとっかかりとして作曲することを考えるわけですが、[Chordana Trackformer](https://itunes.apple.com/jp/app/chordana-trackformer/id1054301386)を使うと便利です。

次に、殆どの作業は、DTMである[Studio One](http://www.mi7.co.jp/products/presonus/studioone/)から行います。

これは、[初音ミクV3](http://www.crypton.co.jp/mp/pages/prod/vocaloid/mikuv3.jsp)に付属しているものです。

ちなみに、このアプリは個人的にはあまりおすすめしません。両方をちょっとだけ触ってみた感触でいうと、私は[Cubase](http://japan.steinberg.net/jp/products/cubase/start.html)のほうが良いかなと思っています。

ただし、ボーカロイドである初音ミクと連携できているため私は`Cubase`ではなく`Studio One`を使っています。

まあ、私は初心者ですし、アプリにはあまりこだわりとかありません。しかし、Studio Oneはなかなかにバグがあるアプリだとは思っていますし、割りとバグを踏んでたりします。

## BGMを作ろう

私は作曲の知識、音楽の知識はゼロです。といっても、それ以外のすべての分野における知識は割りとゼロなので音楽知識もゼロだというだけですが、音符すら読めません。

私の音楽知識では、取っ掛かりとなるものがなければどうしようもありません。

したがって、まずはBGMをとっかかりとして作曲することを考えるわけですが、[Chordana Trackformer](https://itunes.apple.com/jp/app/chordana-trackformer/id1054301386)を使って作ったものを使います。

このアプリは、マイクから音を読み取って自動で作曲(BGM)してくれるアプリで、適当に好きな曲でも流してアプリで読み取って調整します。

![](https://raw.githubusercontent.com/mba-hack/images/master/ios_chordana_trackformer.png)

出来上がったものは、`.mid`形式でメールにでも下書き保存し、あとからそれをPCでダウンロードするのが良いでしょう。

## リズムを作ろう

次に、先ほど保存した.midをStudio Oneで読み込みます。

読み込んだ後は、ライブラリから初音ミクを追加(起動)しましょう。

ここからはボカロエディタ(初音ミク)での作業になります。

ボカロエディタからも.midを読み込みます。

すると、色々な音階が付いたチャンネルが追加されます。

![](https://raw.githubusercontent.com/mba-hack/images/master/ios_chordana_trackformer_02.png)

この中から良いものを探し、組み合わせ、修正してBGMに合ったリズムを作ります。リズムにはその後、歌詞を乗せることになります。

ここからは感覚的な判断が重要になってきます。サンプルとして作った曲は以下になります。

https://github.com/syui/vocaloid/tree/master/t

## 歌詞を入れよう

最後に先ほど作ったリズミに歌詞を入れていきます。

歌詞の入れ方ですが、とりあえず思いついた単語を適当に入れていきます。文章でも構いません。

そして、流してみて1/10くらいの確率で音と歌詞がマッチする部分があります。

それを残して、あとは消します。歌詞を消すというのは、`ら`や`ー`を入れると良いでしょう。

これを繰り返していくうちに、なんとか聞けるようになってきたと思ったら完成間近です。

一旦、作業をやめて明日もう一度聞いてみることにしましょう。理由は後述します。

## 次の日に修正しよう

作ってる時は良いと思った曲でも、一日間を置くことで、「なんでこれがいいと思ったんだろう」ということになります。

なので、次の日にまた修正します。

だいたいここまでやると完成ですね。

もちろん、「まだまだ」という場合もあるでしょうし、クオリティをもっともっと高めたいという場合もあるでしょう。

そのような場合は、新しい曲を作っている合間にでも作業すると良いでしょう。

## なぜクオリティを高めるより新しい曲を作ったほうが良いのか

これは初心者前提の話なのですが、クオリティを高める作業は、同じ場所を行ったり来たりするような非常に非効率な作業でした。他の人は違うかもしれませんが、私の場合はそうでした。

同じ箇所に同じ修正を入れたり、消したりの繰り返し。クオリティといってもなにをどうすればいいのか全く分かりません。

なので、新しい曲をクオリティを意識し作り始めたほうが気付きは多いだろうと思います。

何度も作ることで自然に新しい気付きは芽生えると思います。そのほうが無駄な作業をするより効率が良いと考えました。

もちろん、やり方は人それぞれです。

なので、クオリティを高める作業に集中したい人もいると思います。

その場合、既存の曲を参考に、ある程度当たりをつけてみると良いかもしれませんね。

でも、時間がかかりそうなので、私は苦手です...。
Creat.jsとParticle.jsで波のエフェクトを作成する


[particle.js](https://github.com/ics-creative/ParticleJS)と[creatjs](http://www.createjs.com/)を使って波のエフェクトを作成できます。


![](https://raw.githubusercontent.com/mba-hack/images/master/particlejs-creatjs-wave.png)

前者が星や泡みたいなエフェクトで後者が線を表現する感じですね。これを組み合わせることで、[https://ics.media](https://ics.media)のトップページにあるエフェクトを表現できます。

ここで紹介したParticleJSはこちらの[particle.js](https://github.com/VincentGarreau/particles.js/)を参考に作られている感じですが、本家ではなく、ここで紹介したものののほうが個人的にはオススメです。

```bash:
$ git clone https://github.com/ics-creative/ParticleJS
$ cd ParticleJS/examples
$ open demo.html
```

ブラウザからも値を調整できます。


http://ics-web.jp/projects/particle-develop/



```bash:
$ git clone https://github.com/ics-creative/151124_createjs_waves
$ cd  151124_createjs_waves/examples
$ open 5_finish.html
```

素晴らしいですね。解説は以下の記事で詳しくなされています。

https://ics.media/entry/10141
フロントエンドのCLI開発環境を整える


Node.jsの開発環境を中心に解説していきます。具体的には、shelljs,shelljs-nodecli,eslintなどを使います。

[shelljs](https://github.com/shelljs/shelljs)は、Shell上からNodeコマンドなどをCLIから使いやすくしてくれるツールです。読み込むことで特定の書き方ができたりします。

[shelljs-nodecli](https://www.npmjs.com/package/shelljs-nodecli)は、shelljsと連携して書き方が分かりやすく出来ます。shelljs拡張機能です。

[eslint](http://eslint.org/)は、言わずと知れたjsの構文チェックツール。

各ツールの基本的な使い方を紹介します。

```bash:
$ npm i shelljs-nodecli eslint shelljs
$ npm init --scope=linclark
$ sed -i "" '$d' package.json
$ echo '
,"bin": {
    "eslintt": "bin/test.js"
  }
}' >> package.json
$ mkdir bin
$ vim bin/test.js
```

こんな感じでパスにリンクを貼って実行できます。ここでは`eslintt`コマンドを発行。

次に、`shelljs-nodecli`を使って`eslint`による`foo.js`のチェックを行います。

```js:bin/test.js
#! /usr/bin/env node
var nodeCLI = require("shelljs-nodecli");
var version = nodeCLI.exec('eslint', '-v', {silent:true}).output;
console.log(version);
nodeCLI.exec('eslint', 'foo.js');
```

設定ファイルは、通常はProject Rootに置きます。`node_modules/shelljs-nodecli/.eslintrc`もチェックしておきましょう。

```json:.eslintrc
{
    "parser": "esprima",
    "rules": {
        "semi": "error"
    }
}
```

`foo.js`はわざと末尾の`;`を忘れて作ります。そして、チェックを開始。想定通りエラーを出します。

```bash:
$ npm link
$ echo 'var foo = "foo"' >> foo.js
$ eslintt
/path/to/foo.js
  1:5   error  'foo' is defined but never used  no-unused-vars
  1:16  error  Missing semicolon                semi

✖ 2 problems (2 errors, 0 warnings)

$ echo ';' >> foo.js
$ eslintt
...ok
```
[ESX 5.5][無償版]仮想マシンにESXをたてる


## 目次

1. 概要
1. VMware Workstation PlayerをDL
1. ESXのOSをDL
1. 仮想マシンにESXをインストール
1. ESXのネットワーク設定
1. VMware vSphere ClientをDL
1. ESXに仮想マシンを作成
1. 仮想マシンのネットワーク設定

----
## 概要
自宅PCに仮想の開発環境を作りたい。
でも遊びたいだけだから高額のソフトやサーバを買ってまではやりたくない。
VMware Workstation Playerはスナップショットが面倒
VirtualBoxは良かったけど、どうせならGUIの使い勝手が良いESXが使いたい。
でもESXをたてるためには別途サーバが必要
⇒仮想マシンにESXたてられないの？

そんな感じで、仮想マシンにESXをたててみた。
※メモリ4GB以下のPCだと厳しいかも。

## VMware Workstation PlayerをDL
仮想マシン上に仮想マシンをたてることをNested Virtualizationというらしく、
VirtualBoxはこれに対応していない。
ESXに仮想マシンを作るところまでは可能だが、仮想マシンを起動するとエラーが出てしまって起動できない。
そのため、ESXは[VMware Workstation Player](https://www.vmware.com/jp/products/player/playerpro-evaluation.html)にたてる。

## ESXのOSをDL
※[vmware](https://my.vmware.com/jp/web/vmware/login)にアカウント登録してログインしておくこと

- [ここ](https://my.vmware.com/jp/group/vmware/evalcenter?p=free-esxi5&lp=default)からESX5.5をDL
    - ※VMware vSphere Hypervisor 5.5 にある「ESXi ISO image (Includes VMware Tools)をDLする

クライアントはバージョンの違いがあるので、ここではDLしない。

## 仮想マシンにESXをインストール
以下の設定で仮想マシンを作成

- メモリ：なるべく多め（8GBのPCで4GBにしたら普通に使えてる）
- プロセッサ：2個以上
    - 「Intel VT-x/EPT または AMD-V/RVIを仮想化」にチェックが入っていること
- バージョン：Red Hat Enterprise Linux 7 64bit
- ディスク：SCSIでなるべく多め（最低でも50GBくらい無いとたぶん辛い）
- ネットワークアダプタ：今回はNATで1個のみ
    - 「接続済み」, 「パワーオン時に接続」にチェックが入っていること
- CD/DVD：「ISOイメージファイルを使用する」でDLしたESXのISOを指定
    - 「接続済み」, 「起動時に接続 」にチェックが入っていること

仮想マシンを作成したら、後は起動して画面に従ってインストールを行うだけ。

## ESXのネットワーク設定

- ※WindowsのVMware Network Adapter VMnet(数字)にふられているIPを確認しておく。
  - 以降は、IPが192.168.141.1/24だったとする。

ESXを起動すると黄色い画面が表示されるので、F2で設定画面へ。

- Configure Management NetworkでNWの設定を行う
    - Network Adaptersでvmnic0を選択
    - IP ConfigurationでSet static～を選択
        - IP：192.168.141.xxx（3～254の間で適当に）
        - Subnet Mask：255.255.255.0
        - Default Gateway：192.168.141.2（※なぜか1では無い）
    - IPv6 ConfigurationでIPv6をdisabledにする
    - Escキーで戻る（変更の確認をされるのでyを押す）
- Restart Management Networkでネットワークサービスを再起動
- Test Management NetworkでPing確認
    - NATにしているので、192.168.141.2と8.8.8.8(Google)に通る
- Escキーで最初の画面に戻る
- 一応Windows側からも設定したIPにPing確認しておく

## VMware vSphere ClientをDL

- Windows側のブラウザで[https://192.168.141.xxx(ESXに設定したIP)](https://192.168.141.xxx)にアクセスする
    - ※ブラウザによっては「安全な接続ではありません」と警告ページが出るので、例外登録をする
        - Firafoxの場合は「エラーを表示」から例外登録できる
    - アクセスしたら、Download vSphere ClientからクライアントをDL

普通にネットからDLしているだけなので、直接以下のアドレスへアクセスしてもDLできる。

```
ttp://vsphereclient.vmware.com/vsphereclient/1/2/8/1/6/5/0/VMware-viclient-all-5.5.0-1281650.exe
```

## クライアントからESXに接続

- クライアントを起動
  - ESXに設定したIP, user, passwordを入力して接続
  - 何か表示されたら「無視」をクリック

これでESXに接続できれば導入完了！
vCenterは残念ながら無償版が無いようなので、ESX上でクローンとかWeb Client使ったりとかはできないです。
OVFエクスポートしてOVFからデプロイで我慢

以下はおまけなので適当

## ESXに仮想マシンを作成

- ディスク追加
    - インベントリをクリック
    - 構成->ストレージ->右上の方にあるストレージの追加をクリック
    - ディスク/LUMを選択して次へをクリック
    - ESXのローカルのディスクが表示されるはずなので、すべて追加する
- 仮想マシン作成
    - 新規->仮想マシンから、適当に設定して作成
        - ディスクはThin Provisionにしておくのを推奨

## 仮想マシンのネットワーク設定
NATで作成する場合は、ESXの場合と同様にデフォゲとサブネットに注意してIPを設定する。
WindowsからPingが通れば、以後はTeratermやRLogin等でSSH接続できる。
エンジニアの小言

| 親父の小言<br>親父の小言と冷酒は後で効く | エンジニアの小言<br>エンジニアの小言と潜在バグは後で効く |
|:---------:|:-----------:|
|火は粗末にするな|エラーは粗末にするな|
|人には腹を立てるな|新人には腹を立てるな|
|恩は遠くからかへせ|恩は技術でかへせ|
|人には馬鹿にされていろ|PMには馬鹿にされていろ|
|年忌法事は怠るな|CIは怠るな|
|家業には精を出せ|リファクタリングには精を出せ|
|働いて儲けて使へ|書いて楽になった時間で書け|
|人には貸してやれ|grepは機械に頼れ|
|女房は早くもて|得意な言語は早くもて|
|ばくちは打つな|全角英数字は打つな|
|大めしは喰うな|大メモリは喰うな|
|世話やきにこるな|メディアやきにこるな|
|火事は覚悟しておけ|ハード障害は覚悟しておけ|
|戸締りに氣をつけろ|セルフチェックに氣をつけろ|
|拾は届け身につけるな|バグは届け身につけるな|
|何事も身分相応にしろ|クラスの責務は身分相応にしろ|
|神仏はよく拝ませ|サーバはよく拝ませ|
|人の苦労は助けてやれ|人のissueは助けてやれ|
|朝はきげんよくしろ|デイリースクラムはきげんよくしろ|
|風吹きに遠出するな|リリース前に大量コミットするな|
|年寄りはいたわれ|シニアエンジニアはいたわれ|
|子の云うことは八九きくな|新人の云うことは八九きくな|
|初心は忘れる勿れ|Hello, Worldから始めよう|
|借りては使うな|コピペコードは使うな|
|不吉は言うべ可ら須|ぬるぽは言うべ可ら須|
|難渋な人には施せ|寝不足な人には翼を授けよ|
|義理は欠かすな|プルリクは欠かすな|
|大酒は飲むな|大容量ファイルは飲むな|
|判事はきつく断れ|仕様変更はきつく断れ|
|貧乏は苦にするな|残業は苦にするな|
|水は絶やさぬようにしろ|バックアップは絶やさぬようにしろ|
|怪我と災は恥と思へ|タイポとシンタックスエラーは恥と思へ|
|小商ものは値切るな|テスト項目数は値切るな|
|産前産後大切にしろ|リリース前後大切にしろ|
|病気は仰山にしろ|アラートは仰山にしろ|
|家内は笑うて封せ|バグは笑うて封せ|
jqを使ってJsonの深いネストにあるキーの値を抽出する方法(上の階層のキーがわからない時)

[jq](https://stedolan.github.io/jq/)でJSONを整形してる時に、深いネストのキーを検索する方法のメモ
ただ、この記事はjq歴3時間のド素人書いたやつなので、もっといい方法が絶対あるはず(と言うか誰かおしえてください)

#キー名でのフィルターのかけ方

例えば以下のJsonファイルで「key1」というキーを持つ文字列だけを取り出したい場合は以下のように書く。

```test.json
{
    "key1":{
        "key2":"value1",
        "key3":"value2"
    },
    "foo":"bar"
}
```


```.sh:Terminal
$ jq '.key1' test.json
{
  "key2": "value1",
  "key3": "value2"
}
```

要するに.hogeって書けば、ドットの後に続けた文字列のキーに該当する値を返してくれる。これは連続で書くこともできて、例えば以下のように書くと、ネストを掘りながらフィルターを掛けることができる。

```.sh:Terminal
$ jq '.key1.key2' test.json
"value1"
```

ただしこのフィルターは1階層目のキーしか見てくれないので、例えば以下のように書いてしまうとnullが帰ってきてしまう。

```.sh:Terminal
$ jq '.key2' test.json
null
```

つまりこのフィルターで値をとってきたい場合、「抽出したいキーの名前はわかってるんだけど、その上の階層でどんなキーが指定されてるのかわからなくて、そもそも何階層目にあるかわからない」って時には上手く動かない。

要するにどんな階層にいても目的のキーを抽出してくれるgrep的な何かがほしいわけです。(まあそれこそgrep使えばいいのかもしれないけど)。

#recurseを使う
resurseってのはJsonのオブジェクトの中身を再帰的に展開してくれるフィルター。たぶん見てみるのが一番早いと思う。

```test.json
{
    "key1":{
        "key2":"value1",
        "key3":"value2"
    },
    "foo":"bar"
}
```

```.sh:Terminal
$ jq 'recurse' test.json
{
  "key1": {
    "key2": "value1",
    "key3": "value2"
  },
  "foo": "bar"
}
{
  "key2": "value1",
  "key3": "value2"
}
"value1"
"value2"
"bar"
```

とまあこんな感じでオブジェクトの中身を展開してくれる。こいつを使うと、どんなに深いネストの中にあるキーで強制的に1階層目に持ってこれるわけです。代わりに余計なものがいっぱいくっついてくるけど。

なので、select関数を使って、「key2」を一階層目のキーに持たないオブジェクトを削除する。

```test.json
{
    "key1":{
        "key2":"value1",
        "key3":"value2"
    },
    "foo":"bar"
}
```

```.sh:Terminal
$ jq 'recurse | select(.key2)' test.json
{
  "key2": "value1",
  "key3": "value2"
}
```

ここでの「|」は、シェルの「|」とほぼ同じ意味で、左の出力結果をそのまま右のフィルターの入力パラメータに利用する事ができる。

ここまでくればあとはフィルターをかけるだけ

```.sh:Terminal
$ jq 'recurse | select(.key2)　| .key2' test.json
"value1"
```

略式でこう書くこともできる。

```.sh:Terminal
$ jq 'recurse | select(.key2).key2' test.json
"value1"
```

こんな感じで無事「key2」の値を取ってくることができた。

ちなみにselect関数を使わないと、以下の様な感じで「key2」を持たないオブジェクトに対するフィルター結果であるnullが残ってしまう。

```test.json
{
    "key1":{
        "key2":"value1",
        "key3":"value2"
    },
    "foo":"bar"
}
```

```.sh:Terminal
$ jq 'recurse | .key2' test.json
null
"value1"
```

#recurse応用
recurse関数は以下のように再帰的にフィルターをかけながら展開することもできる(と言うかこっちが本来の使い方？)

```test.json
{
    "key1":{
        "key2":"value1",
        "key3":"value2"
    },
    "foo":"bar"
}
```

```.sh:Terminal
$ jq 'recurse(.key1)' test.json
{
  "key1": {
    "key2": "value1",
    "key3": "value2"
  },
  "foo": "bar"
}
{
  "key2": "value1",
  "key3": "value2"
}
```
おんなじキー名が連続してネストされているような場合に使うらしい。そんな時あるのかな・・・

より詳しい使い方は[公式サイトのマニュアル](https://stedolan.github.io/jq/manual/)見てください。
[日本語訳してくれているページ](http://dev.classmethod.jp/tool/jq-manual-japanese-translation-roughly/)も参考になりました。感謝
ブラウザでjqを試し打ちできる[ページ](https://jqplay.org/)もあるので、いろいろ遊ぶと楽しいです。
iOS:加速度センサーに触れてみる

最近、Androidで加速度センサーに触れる機会があった。

その時iOSでまだ一回もセンサー関連触れたことがないなと思ったので、触れてみることにした。

```swift
import UIkit
import CoreMotion
```
使うのは上記の二つ。

```swift
var _motionManager: CMMotionManager!

    var _x: Float = 0
    
    var _y: Float = 0

```
今回は回転はさせないのでZは省く。

次にセンサー情報を通知を開始させる

```swift
_motionManager = CMMotionManager()
_motionManager.deviceMotionUpdateInterval = 1.0 / 60.0 //60FPS                    
_motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: {(motion, error) in self.updateMotion(motion!)})
```
最後に更新する部分を作る

```swift
func updateMotion(motion: CMDeviceMotion) {
　　　　//端末の加速度を取得する
　　　　let gravity = motion.gravity
　　　　//ローバスフィルターを当てる
　　　_x = (Float(gravity.x) * RowPathFilter) + (_x * (1.0 - RowPathFilter))
　　　_y = (Float(gravity.x) * RowPathFilter) + (_y * (1.0 - RowPathFilter))

}
```
アプリ開始時
<img width="1024" alt="IMG_0012.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/84002/4e559a9a-5008-6011-3058-834c2f2bd50a.png">
右に傾ける
<img width="1024" alt="IMG_0013.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/84002/a9c90ca9-9eb4-70ba-0b3e-eeb79859167b.png">
左に傾ける
![IMG_0014.PNG](https://qiita-image-store.s3.amazonaws.com/0/84002/e4a11697-5b2f-9508-e997-3abd7aea369d.png)

使用機器：IpadPro iOS9.3.1
Capistrano で.bash_profileに書いてある環境変数が読まれない件

Capistrano ド初心者の僕が、表題の問題にぶつかったので、解決策と、ついでにそこに至るまでに調べたことをメモ書きしておきます。
ちょっと散文気味ですが Capistrano の情報ぐぐっても少なかったので、こんなのでも誰かの足しにはなるかなと。

## TL;DR: .bash_profile は読まれないから .bashrc に書く

「.bash_profile は読まれないから .bashrc に書く」 それだけです。超・シンプルです。

### 元ネタ：Stackoverflowでの質問

http://stackoverflow.com/questions/25479348/how-can-i-instruct-capistrano-3-to-load-my-shell-environment-variables-set-at-re

色々と調べたんですけど、結局このStackoverflowに書いてました。何か回答者が最初書き間違えたみたいで「 `.bashrc` じゃなく. `bash_profile` に書くといいよ」って書いてあったりで紛らわしいですが、コメント欄を見ると「For me it reads .bashrc and does not read .bash_profile. I'm using CentOS.」とか言ってますね。

ところで

> since it's not interactive shell

ということらしくて、インタラクティブシェルじゃないから読まれないってのは分かったんですけど、じゃあ何シェルなんですかね？ 詳しい人いたら教えて頂けると嬉しいです。


## ほか余談

Capistranoのお勉強・デバッグってどうしたらええんや…というので手探りして、この辺から理解していくと良さそうだと思いました。ということで余談ですが書いておきます。

### Capistrano のドキュメントつまみ読み

もちろんCapistrano自体のREADMEは最初に読んだ方がいいんですけど、README自体は内容が薄めで、いまいちその次に何を読んだら良いのかのとっかかりがないように思えた。

SSHでのコマンド実行系のメソッド(`execute`,`capture`,`test`)はCapistranoから切り離されたSSHKitっていうライブラリの管轄らしい。なので以下の2つのドキュメントを読むととりあえずCapistranoでのコマンド実行がどういう仕組みなのか分かってくると思う。

- Capistrano Tasksについてのドキュメント http://capistranorb.com/documentation/getting-started/tasks/
- SSHKit のREADME https://github.com/capistrano/sshkit

### Capistrano console がデバッグに便利

Capfileなりdeploy.rbなりに `require 'capistrano/console'` って書いて `cap foobar console` などと実行すると、capistranoと限りなく近い環境のコンソールを立ち上げる事が出来ます。
単にsshログインした場合と何が異なっているのか確認しやすくて良いです。
RaspberryPi 2で外付けHDD

# 概要
RaspberryPiに転がっているUSBメモリーを増設します。
やるたびにググっている自分向けの備忘録です

# 手順
1. フォーマット用のコマンドをつかえるようにする
すでに施してある場合は不要。
```$sudo apt-get install ntfs-3g```
 
2. ラズパイにUSBメモリーを挿す

3. 挿したUSBメモリーのデバイス名を確認
```sudo fdisk -l```
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/71261/761f72a8-a81b-2ec6-5bf9-108deb3b4e85.jpeg)
おそらく`/dev/sda1`

4. フォーマットコマンドを発行する
```sudo mkntfs /dev/sda1```
しばし待つ
…おせぇ

5. マウントする
```
$sudo mkdir /mnt/usbhdd
$sudo mount -t  /dev/sda1 /mnt/usbhdd
```
`$df -h` でマウントされていることを確認できます

6. 再起動時に自動マウントするように設定する
```
/dev/sda1 /mnt/usbhdd/ ntfs-3g defaults 1 1  
```
Armadillo

CentOS 6にc++の行列演算ライブラリのArmadillo 7.0をインストール

puias computational repositoryをセットアップ（しなくてもよい）
openblas,SuperLU,arpackをインストールするため

gcc4.8をDevtoolset-2リポジトリからインストール
この記事を参考にした
http://www.task-notes.com/entry/20151114/1447492231

その後、

```
$ sudo yum install lapack-devel openblas-devel SuperLU-devel arpack-devel cmake
$ cmake .
$ make 
$ sudo make install
```

cmake時にインストール先が/usr/local/libであることを確認する
SuperLU-develはversion 5でないためarmadilloのインストール時に参照されない。。
LD_LIBRARY_PATHにlibarmadillo.soの場所を通しておく。
[Android]LruCacheのコンストラクタでのサイズ指定とsizeOfとの関係

わかってしまえば簡単なことなんですが、[StackOverflowでも、sizeOfをoverrideしなかったらどうなるの？！って言っている人が居た](http://stackoverflow.com/questions/25608497/what-happen-if-i-dont-override-sizeof-when-using-lrucache-class) ので、ああ僕以外にも初歩的なことで悩んでる人いるんだと思って一応この記事を書きます。

#LruCache(android.util.LruCache)とは
Androidでメモリキャッシュを行う際に使用するクラスです。例えばBitmapをメモリキャッシュする際、こんな風にサイズを指定して使用します。

```java
mMemCache = new LruCache<String, Bitmap>(10);
```
この状態だと、キャッシュに入れるBitmapは10個までとなります。sizeOfメソッドがデフォルトの実装になっており、返される値が必ず1だからです。

#sizeOfの値
LruCacheのsizeOfメソッドは、このキャッシュにデータが追加される際に、<b>追加されようとしているデータのサイズを逐一計測し、総サイズを積んでいく</b>メソッドです。デフォルトでは固定で1を返すようになっています。
上記の例でいうと、データが追加される度に1を積んでいき、コンストラクタで指定してあるmaxサイズの"10"まで積まれると、「もう入れませーん」という悲鳴をあげます。
#コンストラクタで指定する値
コンストラクタで指定するのは、あくまでmaxのサイズです。単位は、個数かもしれないし、byteかもしれないし、わかりませんが、とにかく最大のサイズです。中身にどれだけ保持できるかは、sizeOfとの兼ね合いによって決まってきます。ここで指定したサイズのメモリが最初にどかっと確保されてしまうわけではないのです。sizeOfで積んでいった値が指定されたサイズを超えた際に悲鳴をあげるための設定値となります。

#具体的に、どう実装するか
##1.キャッシュに10個しかオブジェクト保持させなくてイイ、っていう場合
コンストラクタに10を渡し、sizeOfはデフォルトのまま1を返す、とすればよいことになります。sizeOfについては何もしなくて良いです。
追加される度に、サイズを図った結果として1が返され、その値が積まれていきます。積まれた値が10になったとき、つまり、キャッシュにアイテムが10個追加された時、もうこれ以上は無理、と意思表示されます。

##2.追加されるオブジェクトのメモリ量を都度測りつつ、指定したmaxメモリ量まではキャッシュできるようにしたい、っていう場合

```java
int maxMemory = Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
mMemCache = new LruCache<String, Bitmap>(cacheSize){
    @Override
    protected int sizeOf(String key, Bitmap bitmap) {
        return bitmap.getByteCount()
    }
}

```

例えば、アプリごとに割り当てられたメモリサイズを取得し、余裕を持ってその1/8のメモリまではキャッシュに使用できるようにする、っていうLruCacheの実装例でよくあるパターンです。こういった場合は、sizeOfをoverrideして、

```java
return bitmap.getByteCount()
```

と書けばOKです。
キャッシュにビットマップが追加される度に、サイズを図った結果として適当な値が返され(700byte程度の画像をキャッシュしたら、3KBという計測結果が帰ってきました）、その値が積まれていきます。積まれた値が指定サイズに達したとき、もうこれ以上は無理、と意思表示されます。この時、キャッシュされている個数は、中身のビットマップのサイズによって動的に変化します。

#まとめ
ネットを見ているとRuntimeから取得した値を/1024してKBにしたり、/1024/1024してMBにしてからコンストラクタに渡しているサンプルをよく見かけます。「コンストラクタに指定する値＝メモリ確保量」だと勝手に勘違いをして混乱してしまいましたが、コンストラクタに指定するのは初期確保量ではありませんでした。　最大値（コンストラクタに渡す値）と計測値（sizeOfで返ってくる値）の単位さえ合っていれば、MBで計算しようがKBで計算しようが、byteで計算しようが個数で計算しようが、適切なキャッシュサイズを設計することができます。