OmniAICreator/Qiita-1.07M huggingface dataset:
VirtualBoxでROSを動かしてみる

# VirtualBox上にROS環境を構築する
* 手順は公式の日本語翻訳を参考にした
 * http://wiki.ros.org/ja/
     * [インストール](http://wiki.ros.org/ja/indigo/Installation/Ubuntu)
* プロキシ環境下で構築するため、プロキシ特有の問題があれば書いていく

## 環境
* VirtualBox： 4.3.18
* Ubuntu：14.04
* ホストOS： OSX 10.10.4

## ROS.orgからのソフトウェアのインストールを許可

```
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
```

## ROSのパッケージを入手するための公開鍵を入手

```
$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
```

## システムをアップデートとROSのインストール

```
$ sudo apt-get update 
$ sudo apt-get install ros-indigo-desktop-full # 難度が[y]を押す作業
```

## rosdep の初期化

```
$ sudo rosdep init
$ rosdep update 
```

* proxy環境下ではエラーが出たので-E付きで実行する必要がある  =>  ```$ sudo -E rosdep init```
 * http_proxy,HTTP_PROXYなどの環境変数は設定済み

```
$ sudo rosdep init
ERROR: cannot download default sources list from:
https://raw.github.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.
```

## 環境変数の設定

```
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```

## rosinstallのインストール

```
$ sudo apt-get install python-rosinstall 
```

## 正しくインストールされていることの確認

```
$ roscd
$ pwd
/opt/ros/indigo
```

* エラーが出なければインストールは成功している
* コマンドを実行するとROSのワークスペースに移動する

## 環境の確認

```
$ export | grep ROS
declare -x ROSLISP_PACKAGE_DIRECTORIES=""
declare -x ROS_DISTRO="indigo"
declare -x ROS_ETC_DIR="/opt/ros/indigo/etc/ros"
declare -x ROS_MASTER_URI="http://localhost:11311"
declare -x ROS_PACKAGE_PATH="/opt/ros/indigo/share:/opt/ros/indigo/stacks"
declare -x ROS_ROOT="/opt/ros/indigo/share/ros"
```

* ROSの環境変数を表示させる機能で、表示されたということはセットアップがきちんと行われたということ

# 最後に、軽く亀シミュレータを動かしてみる
* ターミナルを３つ使います

```
### ターミナル１
$ roscore

### ターミナル２
$ rosrun turtlesim turtlesim_node #=> 亀が表示される

### ターミナル3
$ rosrun turtlesim turtle_teleop_key #=> 矢印キーで亀が動かせる

```

![スクリーンショット 2015-10-16 15.59.33.png](https://qiita-image-store.s3.amazonaws.com/0/19778/99b0d09a-6763-149a-cd47-b07edc25d1fc.png)


* 自分がはまったのは、3つ目のコマンドを実行したターミナルを一番手前に持ってこないと亀が動かせないこと
* また、亀が表示されているエリアは単に表示エリアなので、そこで矢印キーを押しても動かない

# まとめ
* 公式のガイドのとおりでできました
reveal.js のHTMLのスライドL内のマークダウンのJavaScriptにESLintをテキストにtextlintをVimのmakeでかける方法

reveal.jsでhtml内でmarkdownでスライドを作っている際の

- ```jsで始まるコードブロックのESLintをかける
- スライド内の文言が技評の文言表記に沿っているかどうかtextlintでチェックする
- 「、」が4つ以上連続で一文に入っていないかtextlintでチェックする

これらをやってくれるvimのmakeコマンドを用意する。

以下をシェルで打つ。

```sh
cd ~
npm install eslint
npm install git+ssh://git@github.com/sifue/eslint-plugin-markdown.git
npm install textlint
npm install textlint-rule-max-ten
npm install textlint-rule-prh
curl -o term_rule.yaml https://raw.githubusercontent.com/azu/technical-word-rules/master/dict/web%2Bdb.yml
```

以下のファイルを用意する。

```json:~/.eslintrc
{
    "rules": {
        "indent": [
            2,
            "tab"
        ],
        "quotes": [
            2,
            "single"
        ],
        "linebreak-style": [
            2,
            "unix"
        ],
        "semi": [
            2,
            "always"
        ],
        "no-console": 0,
        "no-undef" : 0,
        "no-unused-vars" : 0
    },
    "env": {
        "es6": true,
        "browser": true
    },
    "extends": "eslint:recommended",
    "plugins": [
        "markdown"
    ]
}
```

```json:.textlintrc
{
  "rules": {
    "max-ten": {
      "max": 4
    },
    "prh": {
            "rulePaths" :["~/term_rule.yaml"]
    }
  }
}
```

最後に.vimrcの設定を追記する。

```vim:~/.vimrc
au FileType html setlocal makeprg=~/node_modules/.bin/eslint\ %;\ ~/node_modules/.bin/textlint -c\ ~/.textlintrc\ %
```

あとは、htmlを開いて:makeするだけでチェックしてくれるようになる。とても便利。
IISログをC#で操作する。

IISログをC#から取得する必要に迫られたので、ノウハウを残します。
一番古いログが取れてくるため、日付け順に並び替える処理がどうしても遅くなるので、Count取得して要素を取得した方が良いです。

```csharp:IISLog.cs
                //取得するイベントログ名
                string logName = "Application";
                //コンピュータ名
                string machineName = "XXXXXX";

                //指定したイベントログが存在しているか調べる
                if (System.Diagnostics.EventLog.Exists(logName, machineName))
                {
                    //EventLogオブジェクトを作成する
                    System.Diagnostics.EventLog log =
                        new System.Diagnostics.EventLog(logName, machineName);

                    // ログエントリをすべて取得する
                    var count = 0;
                    foreach (EventLogEntry entry in log.Entries.Cast<EventLogEntry>().OrderByDescending(x => x.TimeGenerated))
                    {
                    // 対象のログを判断する方法を記述
                        if (entry.ReplacementStrings.Any(x => x == "hoge"))
                        {
                             //何か処理
                        }
                    }
                    //閉じる
                    log.Close();
                }
```
OSXのdocker環境でROSを動かしてみる

OSX 10.11とDockerToolbox-1.8.3環境でROSの亀シミュレータを動かしてみたので手順をメモしておく。

# Docker環境の構築

## Dockerインストール

boot2dockerからdocker toolboxを使うようになったようなのでdocker toolboxを入れた。
※ [Installation on Mac OS X](http://docs.docker.com/installation/mac/)に以下のようにある。

```
Note: This release of Docker deprecates the Boot2Docker command line in favor of Docker Machine. Use the Docker Toolbox to install Docker Machine as well as the other Docker tools.
```

[Docker Toolbox | docker](https://www.docker.com/toolbox)からpkgをダウンロードしてインストールした。
※ 試していないが[Dockerのインストール - 74th](http://www.j74th.com/docker/start/)を見ると単体のツールをhomebrewでも入れられそう(アップデートが楽そう)。

## proxyのための対応

構築環境がproxy環境下なので以下のページを参照して対応を行った。
[how to set proxy in docker toolbox? #102](https://github.com/docker/toolbox/issues/102)

```
$ docker-machine rm default
$ docker-machine create -d virtualbox --engine-env HTTP_PROXY=http://example.com:8080 --engine-env HTTPS_PROXY=http://example.com:8080 default

# docker-machine env default で表示される内容を~/.bash_profileあたりに設定
# export no_proxy=$no_proxy,192.168.99.103 のような設定もする必要があった(192.168.99.103はDOKCER_HOST環境変数に設定されているIP)
```

# ROSで亀シミュレータを動かす

以下の手順を参照してGUIを出すようにしてみた。
[how to use -e DISPLAY flag on osx? #8710 ](https://github.com/docker/docker/issues/8710)

以下の手順も試してみたがうまくいかなかった。
[docker/Tutorials/GUI - ROS Wiki](http://wiki.ros.org/docker/Tutorials/GUI)
[dockerでGUIアプリを動かしてみた - Qiita](qiita.com/mechamogera/items/4c01347f4590005af616)
[osx - ssh -X does not work on Yosemite - Ask Different](http://apple.stackexchange.com/questions/169657/ssh-x-does-not-work-on-yosemite)

dockerイメージはここを参照して取得した。
[osrf/docker_images](https://github.com/osrf/docker_images)
[Docker Hub](https://hub.docker.com/r/osrf/ros/)

## 最終的な手順
### 1) 出力ディスプレイの設定

```
# xquartzをインストールしてなかったらする
$ brew install socat
$ docker pull osrf/ros:indigo-desktop-full

$ open -a XQuartz
$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\”
```

### 2) 子コンテナ(ros-test)でroscoreを起動する
```
# roscoreの起動(他の端末で実行)
$ docker run --rm -e DISPLAY=192.168.99.1:0 -e http_proxy=http://example.com:8080 -e https_proxy=http://example.com:8080 --name ros-test osrf/ros:indigo-desktop-full roscore
```

### 3) ros-testでシミュレータ用ノードを起動

```
# 亀シミュレータの起動(他の端末で実行)
$ docker exec -it ros-test /bin/bash
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
$ rosrun turtlesim turtlesim_node
```

### 4) キーボード入力送信のための Teleoperation Node (teleop)を起動
```
# 亀シミュレータのキーボード操作用(他の端末で実行)
$ docker exec -it ros-test /bin/bash 
$ rosrun turtlesim turtle_teleop_key
```
AllJoynとは？


[LEARN](https://allseenalliance.org/developers/learn)をざっくり要約してみた。

# AllJoynの概要

* オープンソースのフレームワーク
* ブランドやトランスポート、OSなどの枠を超えて、近隣のデバイスを発見し、お互いに直接通信することができる。
* クラウド側の仕様（または実装）は含まれない。

# Proximal Network

* AllJoynフレームワークは、以下に示す複雑さをハンドリングすることができ、物理的なトランスポートの詳細を抽象化する。利用者はシンプルなAPIを使うだけでよい。
    * デバイス間のセッション生成
    * デバイス間のセキュアな通信
* グループセッションや、１体１の通信を含む、複数のセッション接続をサポートする。

# Flexible

* RTOSからリッチなOSまで、マルチプラットフォームで動作するようにデザインされている。
* 複数の言語バインディングを提供する。
    * Transports
        * Wi-Fi, Ethernet, Serial, Power Line (PLC)
    * Bindings
        * C, C++, Obj-C, Java
    * Platforms
        * RTOS, Arduino, Linux, Android, iOS, Windows, Mac
* Security
    * peer-to-peer encryption (AES128) and authentication (PSK, ECDSA)

# Common language for Internet of Things

* AllJoynは、異なるOSで動作する異なる言語で記述されたアプリケーションや、異なるブランドのデバイスが、お互いに対話するための糊付けとなる共通言語を提供することを目的としている。
* AllSeen Allianceは、共通のサービスの実装、特定のユースケースを満たすためのインタフェースを規定する。例えば、以下のようなサービス。
    * [OnBoarding Service](https://allseenalliance.org/developers/learn/base-services/onboarding)
    * [Notification Service](https://allseenalliance.org/developers/learn/base-services/notification)
    * [Control Panel Service](https://allseenalliance.org/developers/learn/base-services/controlpanel)
    * ... etc
* 開発者は、上記のサービスを利用することにより、AllJoynのエコシステムの中、デバイスやアプリケーションに互換性を持たせることができる。

# Optional Cloud

* AllJoynのフレームワークは、ローカルネットワーク上で動作するフレームワークであり、クラウドへの接続機能は提供しない。(ローカルネットワークで実現可能なことは、ローカルネットワークで実現するというポリシーぽい。)
* クラウドへの接続が必要な場合は、Gateway Agent を介して接続する。
* このアプローチの利点は、インターネットへの接続をGateway Agentのみに制限することにより、多数のデバイスがインターネットへ接続することを抑止し、脅威となり得る可能性を減らすことができることである。
【メモ】Collabnet Subversion がいつのまにか Rest API に対応していたから curl でユーザ登録ができるすごい

https://ctf.open.collab.net/sf/wiki/do/viewPage/projects.svnedge/wiki/UserApi

`curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST  -u admin:adminpass -d '{"username":"Example01",  "password":"Example01",  "fullName":"Example01",  "emailAddress":"example1@collab.net"}'  http://serverfqdn:3343/csvn/api/1/user
`
この状態だとロールが登録されていないので、ユーザは自分のパスワードすら変える事ができない
レスポンスからユーザIDを取得して以下のリクエストを投げる。

`curl -v -H "Accept: application/json" -H "Content-type: application/json" -X PUT  -u admin:adminpass -d '{"userId":3,"action":"add"}'  http://serverfqdn:3343/csvn/api/1/role/2?format=json`

リクエスト投げまくれば大量のユーザ登録なんで屁でもないぜうひょー
 (°ω°≡°ω°)
mysqlを5.5 -> 5.6にバージョンアップしたら、Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)で起動こける

##起動こけるのでエラーログ見ると
```bash
cat /usr/local/var/mysql/user.local.err

2015-10-16 14:26:50 13796 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive
2015-10-16 14:26:50 13796 [Note] Plugin 'FEDERATED' is disabled.
/usr/local/Cellar/mysql/5.6.27/bin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied) #←あやしい！！！
2015-10-16 14:26:50 13796 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
2015-10-16 14:26:50 13796 [Note] InnoDB: Using atomics to ref count buffer pool pages
2015-10-16 14:26:50 13796 [Note] InnoDB: The InnoDB memory heap is disabled
2015-10-16 14:26:50 13796 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-10-16 14:26:50 13796 [Note] InnoDB: Memory barrier is not used
2015-10-16 14:26:50 13796 [Note] InnoDB: Compressed tables use zlib 1.2.3
2015-10-16 14:26:50 13796 [Note] InnoDB: Using CPU crc32 instructions
2015-10-16 14:26:50 13796 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-10-16 14:26:50 13796 [Note] InnoDB: Completed initialization of buffer pool
2015-10-16 14:26:50 13796 [ERROR] InnoDB: ./ibdata1 can't be opened in read-write mode
2015-10-16 14:26:50 13796 [ERROR] InnoDB: The system tablespace must be writable!
2015-10-16 14:26:50 13796 [ERROR] Plugin 'InnoDB' init function returned error.
2015-10-16 14:26:50 13796 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2015-10-16 14:26:50 13796 [ERROR] Unknown/unsupported storage engine: InnoDB
2015-10-16 14:26:50 13796 [ERROR] Aborting
```

##権限とオーナーを変える
```bash
sudo chown -R _mysql /usr/local/var/mysql
sudo chmod -R g+rwx /usr/local/var/mysql
```
で解決。

参考
http://stackoverflow.com/questions/21470193/mysql-server-start-issues-on-mavericks
Gmail をサブジェクトと期間で検索

# 問題
SEARCH_KEY というキーワードをタイトルに含むメールのうち
2014/1/1 から 2014/1/31 までのものを Gmail に欲しい。


# 解決策
こんな感じで検索欄に入力するとうまくいった。

```
subject:(SEARCH_KEY) after:2014/1/1 before:2014/1/31
```
Kotlin Android Extensionsを試してみた

## Kotlin始めました
- 久しぶりにAndroidを書くのですが、せっかくなのでKotlinを始めてみるかと思い、Android Studioにplugin入れようとしたところKotlin Android ExtensionsというPluginも合わせて検索結果に表示されて、なんぞ？と思い使ってみました。
- 検索するとKotlinのチュートリアルにも出てきました。どうやら`findViewById`をいい感じにしてくれるみたい。
- 公式はこちら。https://kotlinlang.org/docs/tutorials/android-plugin.html

## 使い方

1) Pluginを追加して`build.gradle`にdependencyを追加

```groovy:build.gradle
    apply plugin: 'kotlin-android-extensions'

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
```

2) importする

```kotlin:MainActivity.kt
import kotlinx.android.synthetic.main.activity_main.*
```

- syntheticの次はLayoutのxml名を指定する。この場合はactivity_main.xmlを取り込んでいる。
- これで準備完了。importしたxmlのコンポーネントを簡単に参照できるようになります。

3) コードを書いてみる

- `hello`でIDを振ってあるTextViewにテキストをセットするコード。
- Android Javaで書いたコード

```java:MainActivity.java
TextView textView = findViewById(R.id.hello);
textView.setText("Hello Kotlin !!");
```

- Kotlin Android Extensionsを使ったコード

```kotlin:MainActivity.kt
hello.text = "Hello Kotlin !!"
```

- という感じで幸せになれるのでKotlinを新しく始める方はセットで入れておくといいと思います。

## 2015/10/19追記
- 早速書き始めたらこけた。。。下のようにViewに追加するとクラスが見つからないと言われて死にます。

```xml
    <AppCompatButton
        android:id="@+id/open_hogehoge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="なんか開く" />
```

- AppCompatButtonをフルパスで指定したらビルド通りました。Support library系のコンポーネント使うときは注意しないといけないですねー

```xml
    <android.support.v7.widget.AppCompatButton
        android:id="@+id/open_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Open sample of listView" />
```
セッション変数を機能ごとに名前空間で管理する

Rails で個人的に使っている小技を紹介します。
ツッコミあればご遠慮なく。

# 名前空間とは

セッション変数は便利ですが、ある意味でグローバル変数のようなものです。
というか、コードパスを追いかければいつかは見つかる分、グローバル変数の方がまだマシだといえます。
取り扱いには気をつける必要があります。

そこで便利なのが名前空間を導入することです。
要は機能ごとにキーを分けてその中だけを使うようにするだけです。

```rb
# セッション変数のイメージ
{
  'my'         => {...}, # MyController で使うセッション変数
  'my.account' => {...}, # My::AccountController で使うセッション変数
}
```

簡単ですね。

# 気をつけるべきこと

## できる限りセッション変数をクリーンにしておく

プログラミングにおいて、状態 (ステート) はできる限りクリーンにしておくが好ましいでしょう。
Web アプリにおけるセッション変数はまさに状態 (ステート) なので、同じことが言えます。

というわけで、Controller に以下のようなメソッドを作ります。

```rb
  private
    def clear_my_account_session
      session.delete 'my.account'
    end
```

そしてこれを必要に応じて呼び出します。
フロー開始画面や、完了処理の後に呼び出しておくとよいでしょう。

# 実装イメージ

```rb
class My::AccountController
  def edit
    # フローの開始画面なのでセッションをクリアしておく
    clear_my_account_session
  end

  def confirm
    current_user.assign_attributes my_account_params
    my_account_session['user'] = my_account_params
  end

  def update
    current_user.update_attributes! my_account_session['user']

    # フローが完了したのでセッションをクリアしておく
    clear_my_account_session
  end

  private
    def my_account_session
      session['my.account'] = {} unless session.key? 'my.account'
      session['my.account']
    end

    def clear_my_account_session
      session.delete 'my.account'
    end

    def my_account_params
      params.require(:user).permit(:name, :age)
    end
end
```

gem にしてもいいんだけどまぁするまでもないかなという感じ...
【Excel】アドインをインストールするスクリプト

# 概要

Excelアドインを追加するには、通常「C:\Users\{user名}\AppData\Roaming\Microsoft\AddIns」等のフォルダにアドインをファイルを格納し、Excelを開いてアドインの追加操作をする必要があります。
自分で作ったアドインを配布する場合、Excelのアドイン追加方法を知らない人のために、上記の手順をいちいち説明するのがめんどくさいのでスクリプト化してみました。

# ソース

vbscriptで記述してます。

```vbnet:Install.vbs
Const FILLE_NAME="sample.xlam"

Call Exec

Sub Exec()
    Dim objExcel
    Dim strAdPath
    Dim strMyPath
    Dim strAdCp
    Dim strMyCp
    Dim objFileSys
    Dim oAdd
    
    Set objExcel   = CreateObject("Excel.Application")
    Set objFileSys = CreateObject("Scripting.FileSystemObject")
   
    strAdPath = objExcel.Application.UserLibraryPath
    strMyPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
    strAdCp   = objFileSys.BuildPath(strAdPath, FILLE_NAME)
    strMyCp   = objFileSys.BuildPath(strMyPath, FILLE_NAME)
   
    objFileSys.CopyFile strMyCp, strAdCp
  
    objExcel.Workbooks.Add
    Set oAdd = objExcel.AddIns.Add(strAdCp,True)
    oAdd.Installed = True
    objExcel.Quit
 
    Set objExcel   = Nothing
    Set objFileSys = Nothing
   
    MsgBox "Complete!"
End Sub
```

# 説明
```vbnet:
Const FILLE_NAME="sample.xlam"
```
1行目にインストールしたいアドインのパスを定義しておきます。

```vbnet:
    strAdPath = objExcel.Application.UserLibraryPath
    strMyPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
    strAdCp   = objFileSys.BuildPath(strAdPath, FILLE_NAME)
    strMyCp   = objFileSys.BuildPath(strMyPath, FILLE_NAME)
   
    objFileSys.CopyFile strMyCp, strAdCp
```

Application.UserLibraryPathでアドイン格納先のフォルダを取得し、
そのフォルダにインストールするファイルをコピーしています。

```vbnet:
    objExcel.Workbooks.Add
    Set oAdd = objExcel.AddIns.Add(strAdCp,True)
    oAdd.Installed = True
```

Excelオブジェクトをvbsから操作し、AddIns.Addでアドインを追加、
AddInオブジェクトのInstalledをtrueにすることでアドインが有効化されます。

# 実行方法

上記のソースをメモ帳などにコピーし、Install.vbsという名前で保存してください。
ダブルクリックでスクリプトを実行すると、「Complete」とメッセージが表示され、
アドインが追加されていることを確認できると思います。

# 実例

https://github.com/fuku2014/VBAFormatter/blob/master/Install.vbs
GitLabにリポジトリを移動する

すぐにやり方忘れるのでメモ

権限を上げる

/var/opt/gitlab/git-data/repositories　に移動

リポジトリを作りたいユーザ、もしくはグループのフォルダに移動

Git clone --mirror リポジトリアドレス

sudo chown -R git:git フォルダパス でオーナー変更

sudo gitlab-rake gitlab:import:repos たぶんGitlabのインポート

でオッケー
Linuxでdirenvを使う

[direnv](https://github.com/direnv/direnv)

direnvとはディレクトリに設定ファイルを置くことで、カレントディレクトリでのみ有効になる環境変数を設定できるツールです。開発中のアプリケーションごとに環境変数を変えたいといった場合や、設定ファイルをGitリポジトリに含めることでアプリケーションのソースコードと一緒に配布して開発者間で環境変数を揃えるといった用途に使っています。
Macではhomebrewを使って簡単にインストールして使っていましたが、Linux環境でも使いたくなったのでインストール方法を残しておきます。

# 環境
今回試したのは普段開発で使っている `CentOS6.7 x86_64` の環境です。

# インストール
Linuxでのインストール方法は2通りあります

- コンパイル済みのパッケージのインストール
- ソースコードからコンパイルしてインストール

## コンパイル済みのパッケージのインストール
direnvはGitHubのReleasesページでコンパイル済みのパッケージを配布しています。
https://github.com/direnv/direnv/releases

今回はOSに合わせて `direnv.linux-amd64`を使用します。

```sh
$ wget -O direnv https://github.com/direnv/direnv/releases/download/v2.6.0/direnv.linux-amd64

$ chmod +x direnv

$ sudo mv direnv /usr/local/bin/
```

これでインストールは完了です。
ただし、配布しているパッケージのバージョンはこの記事を書いた2015年10月時点で `2.6`、最新版は`2.7`と若干古いので、どうせなら最新版を入れてみます。
最新版をインストールするにはソースコードからコンパイルが必要です。

## ソースコードからコンパイルしてインストール

direnvはgolang製なのでコンパイルのためにgolangをインストールします。

```sh
$ sudo yum install go
```

続いてdirenvをインストールします

```sh
$ git clone https://github.com/direnv/direnv

$ cd direnv

$ make install
```
ソースコードからコンパイルしてインストールもこれで完了です。
続いてdirenvがシェルにフックされるように設定します

# シェルにフック
```sh
$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
```
zsh等を使用している場合は、`bash`部分を適宜書き換えます
https://github.com/direnv/direnv#setup

# .envrcファイルの作成
環境変数を設定したいディレクトリに移動して `.envrc`ファイルを作成します。
今回はRails環境で `bundle exec` や `bin/rails` を省略できるように、Railsプロジェクトの `/bin`ディレクトリにパスを通します。

```sh
$ cd /path/to/rails_project/

$ echo -n 'export PATH=$PWD/bin:$PATH' >> .envrc
```

これでシェルを起動し直すか、.envrcを作成したディレクトリに移動し直します。
するとこのようなメッセージが出て怒られます。

```sh
$ cd /path/to/rails_project/

$ direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
```

メッセージの通りに `direnv allow`コマンドを実行してみます

```sh
$ direnv allow
direnv: loading .envrc
direnv: export ~PATH
```

`.envrc`がロードされて中に記述した環境変数が使えるようになりました。
もちろんこのディレクトリを出ると無効になるので、外の開発プロジェクトに影響を与えることもありません。
MacアプリでNSNibからViewを初期化する


UINibとやり方が違ってどハマりしたので共有します。

## ViewController

```swift
import Cocoa
class ViewController: NSViewController {

    @IBOutlet weak var myv: NSView!

    override func viewDidLoad() {
        super.viewDidLoad()
        if let success = NSNib(nibNamed: "View", bundle: NSBundle.mainBundle())?.instantiateWithOwner(self, topLevelObjects: nil) where success {
            // instantiateWithOwnerで myvにインスタンスが入る
            // What a magic !
            view.addSubview(myv)
        }
    }
}
```

## xibの定義

![File's OwnerをViewControllerにセット](https://qiita-image-store.s3.amazonaws.com/0/35008/26880e98-ccfe-b0e6-4f0b-1b554cfa1dda.png "File's OwnerをViewControllerにセット")

![ViewControllerのIBOutletにつなぐ](https://qiita-image-store.s3.amazonaws.com/0/35008/2d924b96-1477-1569-e8f3-40d009f48170.png "ViewControllerのIBOutletにつなぐ")

## 動作確認

![実行するとちゃんとxibに貼った画像が表示されました](https://qiita-image-store.s3.amazonaws.com/0/35008/644cfde9-b133-d548-399a-77136fa1b2c7.png "実行するとちゃんとxibに貼った画像が表示されました")
cocos2d-x v3のEventListener登録、解除

#タッチイベント
登録

```lang:TestNode.cpp
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(TestNode::onTouchBegan, this);
listener->onTouchEnded = CC_CALLBACK_2(TestNode::onTouchEnded, this);
getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
```

解除

```
getEventDispatcher()->removeEventListenersForTarget(this);
```

NodeのデストラクタでremoveEventListenersForTarget(this)が呼ばれるため、
通常は自分で解除する必要はない。

#カスタムイベント
登録

```
_listenerCustom = getEventDispatcher()->addCustomEventListener("test", CC_CALLBACK_1(TestNode::customEventCallback, this));
```

解除

```
getEventDispatcher()->removeEventListener(_listenerCustom);
```

この方法で登録したカスタムイベントリスナーはremoveEventListenersForTargetでは解除されないので、addCustomEventListenerが返すEventListenerCustomのポインタを持っておいて、解除する時に指定する。

または、EventListenerCustomを作ってから、addEventListenerWithSceneGraphPriorityで登録すれば、removeEventListenersForTargetで解除されるようになり、自分で解除する必要がなくなる。

```
EventListenerCustom* listenerCustom =
EventListenerCustom::create("test2",                                                                    [](EventCustom* event){
    CCLOG("test2");
});
_eventDispatcher->addEventListenerWithSceneGraphPriority(listenerCustom, this);
```
Windows 10にしたらPICKit3がMPLABから使えなくなった。

#課題#
Windows 10にアップデートしたPCでPICの書き込み/デバッグを使用としたらPICKit3に接続できなくなった。
書き込みまたはデバッグ開始を実行するとPICKit3の出力ペインに<font color="red">connection failed</font>と表示される。
また、PICKit自体の認識が不安定になることがある。

#環境#
- Windows 10
- MPLAB X v3.05
- PICKit3

#解決#
レジストリを書き換える。
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_04D8&PID_900A\\{シリアル番号}\\Device Parameters
の中のEnhancedPowerManagementEnabledの値を1から0に変更する。

#参照#
http://www.microchip.com/forums/m883106.aspx

#その他#
Windows 8でも同様らしい。
【Unity Editor拡張】Camera選択時にSceneビューにグリッドを描画する


Sceneビューにグリッドを出したくなったので作りました。

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/aac1f558-6318-2b5f-1572-7ba35186dacc.png)

##ソースコード
```CameraEditor.cs
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Camera))]
public class CameraEditor : Editor
{
    void OnSceneGUI()
    {
        //SceneビューのCamera取得
        Camera camera = SceneView.GetAllSceneCameras()[0];

        //グリッド線の中心座標
        Vector3 pos = camera.transform.position;

        //Debug.DrawLine()は原点から離れすぎるとなぜか表示されなくなるので中心を原点に近づける
        pos += camera.transform.forward * pos.magnitude;

        float size = 99999f;
        Debug.DrawLine(pos - camera.transform.right * size, pos + camera.transform.right * size, Color.yellow);
        Debug.DrawLine(pos - camera.transform.up * size,    pos  + camera.transform.up * size, Color.yellow);

        //Sceneビュー更新
        EditorUtility.SetDirty(target);
    }

    //Cameraからフォーカスが外れたときに実行
    void OnDisable()
    {
        //Sceneビュー更新
        EditorUtility.SetDirty(target);
    }
}
```


##参考
UnityのSceneViewにラベルやボタンを表示する - テラシュールブログ
http://tsubakit1.hateblo.jp/entry/2014/07/26/220458

けいごのなんとか - SceneViewクラスについて
http://anchan828.hatenablog.jp/entry/2013/03/13/004726
checkboxをチェックしたらラベルを太字にする

コピぺ自分用

```js

 $('input[type=checkbox]').filter(":checked").each(function() {
        $(this).closest('label').css('font-weight', 'bold');
    })
    .end().on('change', function() {
        $(this).prop('checked') ? $(this).closest('label').css('font-weight', 'bold') : $(this).closest('label').css('font-weight', 'normal');
    });

```

-----
※追記

HTMLは下記のようなlabelでinputを囲っているとき用です

```html
<label><input type="checkbox" name="checkbox" value="value">Text</label>
```

下記のHTMLでは動作しません（この場合はコメント欄のtypistaさんが記述しているCSSを使うのが良いと思います）

```html
<input type="checkbox" name="checkbox" id="checkbox_id" value="value">
<label for="checkbox_id">Text</label>
```
Capistranoでリモートサーバ上でバックグラウンドプロセスを実行する


Capistrano v3対応で、やり方を調べたのでメモ。
通常のコマンドと同様に実行すると、Capistrano自体が終わらなくなってしまうので特殊な方法をとる必要がありました。


[Starting background tasks with Capistrano](http://stackoverflow.com/questions/1109274/starting-background-tasks-with-capistrano)

に投稿されてましたが

```ruby
execute "nohup CMD > /dev/null 2>&1 &"
```

としないといけないようです。
単純にアンパサンド(&)をつけても影響しないので
`nohup` でプロセスを実行して、標準(エラー)出力を破棄しないといけないようですね。


で、実行したやつをCapistranoから終了する方法を書いてみたのでついでにメモっておく。

```ruby:kill
namespace :task do
  task :start do
    # abbrev
  end

  task :finish do
    on roles(:role) do
      # pgrep -a じゃないと取れない環境もある
      res = capture "pgrep -f CMD -l |grep '..(abbrev)..' |grep #{current_path}"

      pid_list = []
      res.split("\n").each do |row|
        # capistranoで実行したpgrepコマンドがbashとかで実行されてるので無視
        pid = row.split[0]
        unless row.include?("bash")
          pid_list.push(pid)
        end
      end

      unless pid_list.empty?
        pid_list.each do |pid|
          execute "kill -9 #{pid}"
        end
      end
    end
  end
end
```
slackの今日の会話をcurlで取得しjqで解析


## 今日の会話を取得

```bash:
#!/bin/sh
TOKEN="XXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXX"
DAY="2015-10-16"
URL="https://slack.com/api/search.all?token=${TOKEN}&query=on%3A${DAY}%20&pretty=1"

curl -s -X GET "${URL}" \
| jq -r '.messages.matches[].text'
# 時間の降順に出力されるので、昇順に変える場合は以下(作りかけ)
# | jq '[.messages.matches[] | {ts: .ts, username: .username, text:.text}] | group_by(.ts)'
```

## jq使い方

* 参考: [jq コマンドを使う日常のご紹介 - Qiita](http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)
* `-r` : `"text"`ではなく`text`で表示する。
PythonでAzure StorageのBLOBストレージにCache-Controlを指定する方法

Azure Storageを使い始めて1週間が経ちました。

先日、[PythonでAzureストレージサービスのCORS設定をする方法](http://qiita.com/masutaro/items/615121fa9ac66679a8a6)というのを書きましたが、今日はCache-Controlの設定方法について書きたいと思います。

Azure Storageを使う前は、Nginxで`expires`を指定して画像やその他静的ファイルをブラウザ側にキャッシュするようにしていたのですが、Azure Storage導入後から毎回静的ファイルへのリクエストが飛んでいることに気づきました。

さくさくブラウジングのためにブラウザキャッシュはかかせません。調べた結果、BLOBを保存するときに`x-ms-blob-cache-control`というプロパティを指定してやればいいようです。

[Set Blob Properties | MSDN](https://msdn.microsoft.com/ja-jp/library/azure/ee691966.aspx?f=255&MSPPError=-2147217396)

結果、pythonで書くと以下のようなコードになりました。

```py
from azure.storage.blob import BlobService

destination = 'ファイルの設置場所'
name = 'ファイル名'
source = 'Azure Storageにアップロードするファイルのパス'
content_type = 'image/jpeg' # アップロードするファイルの種類に応じて適宜設定

client = BlobService(
    account_name='アカウント名',
    account_key='キー'
)
client.put_block_blob_from_path(
    destination,
    name,
    source,
    x_ms_blob_content_type=content_type,
    x_ms_blob_cache_control='public, max-age=0'
)
```
React+Reduxでreducerのテスト

#**概要**

reduxでreducerのテストをしたく、以下の様な記事を書いた。

* <a href="http://qiita.com/okmttdhr/items/180c25a4a1188d55f842" target="_blank">React+ReduxのAction、Reducerを個別にテストする - Qiita</a>

モックしたデータをstore.dispatchするという方法をとっていたが、これも、reducer実行終了時まで待つ必要があるため、タイミングを担保するのが難しい。そこで、別の方針でテストすることにした。

#**方針**

reduxのドキュメントを参考にすると、dispatchをせず、直接reducer関数を実行している。同じように実装することにした。

* <a href="http://rackt.org/redux/docs/recipes/WritingTests.html" target="_blank">Writing Tests | Redux</a>

```js:reducer.js

// createReducerは以下の様なutilメソッドを用意しておく
// export function createReducer (initialState, reducerMap) {
//   return (state = initialState, action) => {
//     const reducer = reducerMap[action.type];
//     return reducer ? reducer(state, action.payload) : state;
//   };
// }
import { createReducer } from 'utils';

import {
  REQUEST,
  REQUEST_SUCCESS,
} from 'constants';

const initialState = {
  items: [],
  isFetching: false,
};

export default createReducer(initialState, {
  [REQUEST]: (state) => {
    return {
      ...state,
      isFetching: true,
    };
  },
  [REQUEST_SUCCESS]: (state, action) => {
    return {
      ...state,
      items: action.items,
      isFetching: false,
    };
  },
});
```

テストは以下のようになった。

```js:reducer.spec.js
import {
  REQUEST,
  REQUEST_SUCCESS,
} from 'constants';
import someReducer from './reducer.js';

describe('(Reducer)', function() {
  const initialState = {
    items: [],
    isFetching: false,
  };

  it('REQUEST', () => {
    expect(
      someReducer(initialState, {
        type: REQUEST,
      })
    ).toEqual({
      items: [],
      isFetching: true,
    });
  });

  it('REQUEST_SUCCESS', () => {
    expect(
      someReducer(initialState, {
        type: REQUEST_SUCCESS,
        items: ['items'],
      })
    ).toEqual({
      items: ['items'],
      isFetching: false,
    });
  });
});

```

<a href="http://qiita.com/okmttdhr/items/decedca042e161980220" target="_blank">actionのテスト</a>よりもシンプルに実装できた。
has_manyをeager_load/includesするときの注意点


`eager_load`はJOINしてキャッシュもしてくれるActiveRecordのメソッドだが、この仕様を正しくイメージできてなかったのではまった.
`has_many`に対してIN句検索したときに一部の`has_many`データのみがキャッシュされて意図しない結果となった.

`joins`ではキャッシュされないためこの問題は起こらないが、当然キャッシュされないので後から追加クエリが発行される.
`includes`は条件によって`eager_load`と同じ動きをするため今回の用途だと同じ問題が発生する.
[ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い](http://qiita.com/k0kubun/items/80c5a5494f53bb88dc58 "ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い")

# 再現

超簡単な`has_many`関連を作成する.

```rb
class User < ActiveRecord::Base
  has_many :roles
end

class Role < ActiveRecord::Base
  belongs_to :user
end
```

```rb
user = User.create(name: "test")
  # id=17
user.roles.build(name: "programmer").save
user.roles.build(name: "designer").save
user.roles.build(name: "infra").save
```

![スクリーンショット 2015-10-16 10.53.56.png](https://qiita-image-store.s3.amazonaws.com/0/36978/81527681-3ea6-6af1-eb88-1f958140307a.png "スクリーンショット 2015-10-16 10.53.56.png")

"programmer","designer","infra"をひもづけたので`user.roles`は当然3件とれてほしい

```rb
User.find(17).roles.length
  # => 3
```

しかしprogrammerを含むuser一覧を取得すると、rolesの件数がおかしくなる. これはjoinでマッチした一部のデータのみがキャッシュされてしまうため.

```rb
User.eager_load(:roles).where(roles: { name: ["programmer"] }).find(17).roles.length
  # => 1
User.eager_load(:roles).where(roles: { name: ["programmer","designer"] }).find(17).roles.length
  # => 2
User.eager_load(:roles).where(roles: { name: ["programmer","designer","infra"] }).find(17).roles.length
  # => 3
```

前述のとおり`includes`でも同じ問題が起きる.

```rb
User.includes(:roles).where(roles: { name: ["programmer"] }).find(17).roles.length
  # => 1
```

解決策を考えてみたけど、キャッシュさせないまたはキャッシュを捨てるしか思いつかない.
追記：コメント欄にキャッシュもしつつすべての`has_many`を取得する解決策を記載いただきました。@jnchitoさんありがとうございます。

```rb
User.joins(:roles).where(roles: { name: ["programmer"] }).find(17).roles.length
  # => 3
  # joinsはキャッシュしないためこの問題発生しない
User.includes(:roles).where(roles: { name: ["programmer"] }).find(17).roles(true).length
  # => 3
  # roles(true)とするとforce_reloadになるのでキャッシュを捨てて強制的にSQL発行される
```

# References

* [ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い](http://qiita.com/k0kubun/items/80c5a5494f53bb88dc58 "ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い")

# Environment

```
% rails -v
Rails 4.1.9
```
JAVA Integer.parseInt (); = Integer.valueOf();

▪️ソースコード

```java
public class Sample2 {
	public static void main(String[] args){
		int i =0;
		String str = "100";
		i =Integer.valueOf(str);
		System.out.println(i);
	}
}
```

▪️int n = Integer.parseInt (①);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int n = Integer.valueOf(①);
①は数字として解釈させたい文字列("24"など)

▪️実行結果
100
nodist を用いた Node.js環境構築(for Windows)

## 前置き、概要説明
職場によってはWindowsマシンしか用意してもらえない場合があります。普段Macintoshを使っている人間からすると、開発環境の構築すら難儀。まさにそんな状況に陥った為、Windows向け開発環境の構築方法を備忘録として残します。

Mac版は「[nodebrew を用いた Node.js環境構築](http://qiita.com/HayneRyo/items/326de7231d907447834d
)」を参照して下さい。

## nodistを用いたNode.jsインストール

### 1. nodistをインストールする

nodistをダウンロード(インストール)します。便宜上、インストール先はホームディレクトリ(~/)とします。エクスプローラー上では`C:\Users\aso`です

```lang:ターミナル
$ cd ~/
$ git clone git://github.com/marcelklehr/nodist.git
```

これにより`~/nodist`(`C:\Users\aso\nodist`)にインストールされました。

### 2. nodist向けの設定を行う

nodistを使う為に環境変数を設定します。下記の順で、環境変数の設定画面を開きます。

```
コントロールパネル
  → システムとセキュリティ
    → システム
      → システムの詳細設定
        → 環境変数
```

![image](https://qiita-image-store.s3.amazonaws.com/0/72553/4c7cdf5a-9aa2-4135-33d0-d03b9a21e5de.png)

まず初めにパスを通します。パスを通すとはコンピュータに実行ファイルの在り処を教えてあげることで、この設定を行うことでどこからでもその実行ファイルを呼び出せます。

具体的には環境変数`PATH`に対して、実行ファイルが収納されたディレクトリ`C:\Users\aso\nodist\bin`を指定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/72553/47d36cda-d34a-dab5-c374-64c52b26d07a.png)

次に`NODIST_PREFIX`という環境変数を設定します。
値にはnodistをインストールしたディレクトリ`C:\Users\aso\nodist`を入力します。

![image](https://qiita-image-store.s3.amazonaws.com/0/72553/9d225aa1-a430-f1b5-8683-0934f87f8799.png)

### 3. Node.jsを適用する

特定のディレクトリにバージョンを指定して適用します。

```lang:ターミナル
$ nodist local v0.12.2
```

適用されたかを確認しましょう。

```lang:ターミナル
$ nodist list                      
nodev0.12.2

$ node-v
v0.12.2
```

最新版や安定板を明示的に使用する場合は下記のようなコマンドを実行します。

```lang:最新版インストール
$ nodist latest
```

```lang:安定板インストール
$ nodist stable
```
ContentsBridge Utility for Macintoshを使ってMac OSからDocuCentre-IIIで印刷する


# 背景
[Mac OS X用プリンタードライバー操作ガイド 概要 富士ゼロックス](https://www.fujixerox.co.jp/download/apeosport/download/4_c5570series/prt_macx105_guide/)によるとDocuCentre-IIIのMac OS用プリンタードライバーはありません。
DocuCentre-IVからはあります。

# ContentsBridge Utility for Macintosh
[ContentsBridge Utility for Macintosh](https://www.fujixerox.co.jp/download/utl/cb/macx105/)を使うと、PDFファイルを印刷できます。

- DocuCentre-IIIに対応
- OS X 10.10 Yosemite

これを使って印刷しましょう。

## インストール
ダウンロードして、インストーラーの手順に従います。

## 起動
アプリケーションフォルダーの`ContentsBridge 4.1`を起動します。

![スクリーンショット 2015-10-16 10.49.07.png](https://qiita-image-store.s3.amazonaws.com/0/15964/0d26cc43-a163-267c-0c3c-5c97a7319a42.png "スクリーンショット 2015-10-16 10.49.07.png")

## ファイル選択
起動しても特にウィンドウは開かないので、メニューからファイルを選択します。

![スクリーンショット 2015-10-16 10.50.31.png](https://qiita-image-store.s3.amazonaws.com/0/15964/7b1d7f34-8397-fad3-7d33-2a7cc2964945.png "スクリーンショット 2015-10-16 10.50.31.png")


## 設定
`出力先の変更`からIPアドレスを指定します。

![スクリーンショット 2015-10-16 10.34.14.png](https://qiita-image-store.s3.amazonaws.com/0/15964/37282111-2f08-a5e0-9ca1-738f30ac0c39.png "スクリーンショット 2015-10-16 10.34.14.png")

## 印刷
印刷ボタンを押せば印刷できます:sushi:
【Jupyter】MathJaxの設定をいじる

# 動機

お馴染みの $\mathrm{grad}, \mathrm{div}, \mathrm{rot}$をいちいち`\mathrm{grad}, \mathrm{div}, \mathrm{rot}`と書くのが面倒なので、普段$\TeX$を使うときはマクロを設定しています。研究するにはもう手放すことのできないipython notebookでもマクロを設定したいですよね。

# 方法

## 設定ファイルの置き場所

 `(pythonのインストール場所)/site-packages/IPython/html/static/notebook/js/mathjaxutils.js`

にあります。私は[pyenv](https://github.com/yyuu/pyenv)を使っているので`~/.pyenv/versions/XXX/lib/pythonXX/site-packages/IPython/html/static/notebook/js/mathjaxutils.js` (XX=バージョン)になります。

## 編集

`MathJax.Hub.Config`というオブジェクトに色々追加すればよい。例えば、マクロを追加するなら

```js
            // MathJax loaded
            MathJax.Hub.Config({
                tex2jax: {
                  ...
                },
                // Added by me!!!
                TeX: {
                  Macros:{
                    grad:   ['\\mathrm{grad}\\,'],
                    diver:  ['\\mathrm{div}\\,'],
                    rot:    ['\\mathrm{rot}\\,'],
                    bm:     ['{\\boldsymbol{#1}}', 1],
                  }
                },
                ...
            });

```
これで再起動しても大丈夫！tmux-resurrectの導入



tmuxを使っていると再起動するとセッションが消えてしまうので保存できないか調べてみたところ、tmux-resurrectというプラグインで可能になるらしい。
ついでにプラグイン管理にtpm(tmux plugin manager)も導入する。


#tpmとプラグインの導入

```terminal
$ git clone github.com/tmux-plugins/tpm
```

```.tmux.conf
#追加する
if-shell "test -d ~/path/to/dir" "run-shell '~/path/to/dir/tpm'"

set -g @tpm_plugins '                \
  tmux-plugins/tpm                   \
  tmux-plugins/tmux-resurrect        \
  tmux-plugins/tmux-resurrect-auto   \
'
```

```terminal
$ tmux source-file ~/.tmux.conf #リロード
```

#使い方
`prefix+I`でプラグインのインストール。新しくプラグインを追加したら実行する。
`prefix+ctrl-S`で現在のsessionを保存する。
`prefix+ctrl-R`で保存したsessionをリストアする。

手動で保存とか絶対忘れるのでtmux-resurrect-autoも導入した。
これで１分に1回自動で保存してくれる。

tpm自体まだ開発がされているものらしくpluginの数も少ないけどこれからに期待。
なにか便利なpluginがあったら教えてほしい。
pyenvでpythonのコンパイルオプションを設定する

`OSX`で`pyenv`を使って`python`を使っていると以下の様なエラーが出てくることがあります。
(OSX標準でついてくる`python`ではこの問題は発生しないようです。)

```
LookupError: unknown encoding: x-mac-japanese
```

この問題は以下のようにしてコンパイルオプションをつけて`python`をビルドし直すと解決します。

```
PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs4" pyenv install 2.6.9 
```
【iOS】UIDocumentInteractionControllerでアプリのDocuments配下ファイルを別のアプリに託す

iOSアプリで、自分のアプリで作成・保存したファイルを他のアプリで開く操作。
URLスキームではなく、渡すファイルだけ指定して後はOSによろぴこする方法です。

# UIDocumentInteractionController

サンプルはPDFファイルを渡しています。
以下コード

```lang:実装.m

// URLはフルパス（今回はDocumentsフォルダ内のファイル）
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask,
                                                         YES);
NSString *docPath = [arrayPaths objectAtIndex:0];
NSString *fullPath = [path stringByAppendingPathComponent:@"xxx.pdf"];
NSURL *url = [NSURL fileURLWithPath:fullPath];

// URLを使ってUIDocumentInteractionControllerを生成
UIDocumentInteractionController docInteractionController= [UIDocumentInteractionController interactionControllerWithURL:url];

// UIDocumentInteractionControllerDelegateをセット
docInteractionController.delegate = self;

// 委譲開始
// 第一引数でアプリ選択ポップアップの表示位置を設定
BOOL result = [docInteractionController presentOptionsMenuFromRect:CGRectZero
                                     inView:self.view animated:YES];

if (!result){
    // ファイルを開けるアプリが存在しなかったら返り値がfalse
}
```
git logコマンドまとめ

git logコマンドのオプションをよく忘れるので備忘録的に。随時追加予定。

# `$ git log`
引数なしの場合、リポジトリのコミットを新しい順で表示。
得られる情報は各コミットの、コミットID,作者の名前(Author),メールアドレス,コミット日時(Date),コミットメッセージ。
# `$ git log --oneline`
commitを一行で表示。得られる情報はコミットID（省略形）,コミットメッセージ。
# `$ git log --graph`
commitをアスキーグラフで表示。merge後とかの確認で使う。
`$ git log --oneline --graph`みたいに組み合わせると見やすい。
# `$ git log -p`
各コミットの差分（変更点）を表示。
# `$ git log --stat`
変更されたファイルの行数を表示。
# `$ git log -2`
-の後に指定した数だけ直近のコミットを表示。
` $ git log --oneline -5`は直近のコミット5つを一行で表示する。
# `$ git log --decorate`
現在のHEADやブランチ名、タグを表示。
Android Design Support library 23.1.0でNavigationViewのヘッダー内Viewが取得できない

## Android Design Support library 23.1.1 追記
Android Design Support library 23.1.1ではNavigationViewも更新されています。
ヘッダーを

```java
View headerView = navigationView.getHeaderView(0);
```
のように取得出来るため、下記の例であれば

```java:MainActivity.java
View headerView = navigationView.getHeaderView(0);
ImageView header = (ImageView)headerView.findViewById(R.id.header_image);
```
とすることでヘッダー内のViewを扱うことが出来ます。

## 以下は23.1.0の頃の古い情報になります。

例えば、

```xml:activity_main.xml
<android.support.design.widget.NavigationView
        android:id="@+id/navi_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/header"
        app:menu="@menu/menu_main" />
```

```xml:header.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:background="@color/primaryColor">

    <ImageView
        android:id="@+id/header_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>
```

のようなレイアウトの場合、コード上で

```java:MainActivity.java
ImageView header = (ImageView)findViewById(R.id.header_image);
```

といった形で平易にViewを取得出来たのですが、23.1.0ではこれがnullとなり取得出来なくなりました……。
[調べると既に報告がありましたが](https://code.google.com/p/android/issues/detail?id=190226)、現状の対応策としては下記のようにNavigationViewのリスナーで取得するほかないようです。

>```java
>navigationView.addOnLayoutChangeListener( new View.OnLayoutChangeListener()
>{
>    @Override
>    public void onLayoutChange( ... )
>    {
>        navigationView.removeOnLayoutChangeListener( this );
>
>        View view = navigationView.findViewById( ... );
>    }
>} );
>```
OSX YosemiteにAutodesk Fusion 360 をインストールする



# はじめに
Fusion 360は最近流行りの３D CADソフトである。
詳しい解説は、例えば[こちらのサイト](http://fusion360.blog.jp/beginner/about-fusion360)を参照されたい。

ちょっとした回転放物面を３Dプリンタで出力したいと思いたち、インストールを行った。


# インストール
全体的に[無料3DCAD「Fusion360」のインストール方法](http://makerslove.com/7482.html0)を参考にした。


1. 公式ページからdmgをダウンロード、ダブルクリックでインストール。ここで２分位かかる。
2. サインインを促される。アカウントを持っていない場合は新規作成。
3. 電子メールが届くので、認証URLを踏んで承認。
4. 設定完了まで待つ。

# ポイント
- 4の設定完了までが長かった。
 - メール認証が有効化されるのに時間がかかっていたようなので（要検証）、気長に待つと良いかもしれない。自分の場合はそのまま寝て、朝再度Fusion360を起動＆サインインしたところ無事に起動した。

# 参考になったサイト
- [日本語公式ページ](http://www.autodesk.co.jp/products/fusion-360/overview)
- [無料3DCAD「Fusion360」のインストール方法](http://makerslove.com/7482.html0)
    - 2015/03の記事（情報鮮度は大切）



# これから参考にしたいサイト
- [初心者にとって実質無料だった凄い3DCAD「Autodesk Fusion360」が登場！ということで使い倒してみたまとめ](http://blog.goo.ne.jp/t2com1230/e/5b75825ffc56e3b737744befc33aa98e)
- [Fusion360でアイディアをかたちにしよう！](http://make1010.com/)

ysd
Lynx導入のための覚書

## インストール

Ubuntu 14.04での導入を想定する。APTのリポジトリからインストールが可能である。

```bash
$ sudo apt-get install lynx
```

## 設定

次に任意の設定を行う。

```bash
$ lynx https://www.google.com/
```

このコマンドで一度開いて`o`を押すと、設定画面に行ける。その設定画面で任意の設定を行う。設定を永続的に保存するには以下の方法を取る。

```
Accept Changes - Reset Changes - Left Arrow cancels changes - HELP!

Save options to disk: [X]
```

この`Save options to disk: [ ]`の項目でEnterキーを押すと`X`がつく。その状態で、`Accept Changes`にカーソルを合わせてEnterキーを押すとHomeディレクトリに~/.lynxrcというファイルが作成される。このファイルを読み込むことで、次回から同じ設定で起動することが可能となる。

このファイルを読み込むために、`.profile`、もしくは`.bash_profile`に

```bash
export LYNX_CFG=~/.lynxrc
```

この1行を追加する。

Proxy設定をしたい場合には、`.profile`か`.bash_profile`にProxyの設定を追加するか、もしくは、`~/.lynxrc`に設定を追加するとよい。

#### `.profile`か`.bash_profile`に設定する場合

```bash
export http_proxy="http://my_proxy:proxy_port"
export https_proxy="http://my_proxy:proxy_port"
export ftp_proxy="http://my_proxy:proxy_port"
```

#### `~/.lynxrc`に設定する場合

```bash
http_proxy:http://my_proxy:proxy_port
https_proxy:http://my_proxy:proxy_port
ftp_proxy:http://my_proxy:proxy_port
```
AndroidStudio gradle build高速化

5分とかかかっててとても遅いので調べつついろいろやってみました
最終的に早ければ1分切るぐらいになったので満足

AndroidStudio 1.4
gradle 1.3.0

## root/gradle.properties追加
```
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true
```
|プロパティ|意味|
|----|----|----|
|org.gradle.daemon|デーモンプロセスを使うか|
|org.gradle.jvmargs|実行時のJVM引数|
|org.gradle.parallel|gradleの並列ビルドモードを有効にする|
|org.gradle.configureondemand|関連するプロジェクトがある場合に必要な部分だけビルドする|

## オフライン化
AndroidStudio > Preference > Build, Ececution, Deploymente > Build Tools > Gradle を開きOffline work にチェック


## インクリメンタルビルド化
各モジュールの build.gradle でインクリメンタルビルドを有効化
```
android {
    (いろいろ)
    dexOptions {
        incremental true
    }
}
```
pacman -Syuでハマった点(2015/10/16) libncursesw.so.5, if_name

* [archLinux - pacman -Syu で ハマった点(2015/04/30) - Qiita](http://qiita.com/tukiyo3/items/4ac825c5f34ec88c405f)

# ログインができなくなる(libncursesw.so.5がない)

> /usr/bin/bash: error while loading shared libraries: libncursesw.so.5: cannot open shared object file: No such file or directory
> error: command failed to execute correctly

* [[SOLVED] ncurses, readline update error / Newbie Corner / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=202562)

```bash:
sudo ln -s /usr/lib/libncursesw.so.6  /usr/lib/libncursesw.so.5
```

これでログインできるようになった。


# ネットワークデバイス名が変わった(KVM)

* proxmox3上のKVMではeth0からens18 に認識が変更になり通信ができなくなった。
* [[SOLVED] Archlinux as Proxmox VM Network Adapter issues / Networking, Server, and Protection / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=202849)

## ネットワーク再設定

```bash:
cd /etc/netctl/
sudo mv eth0 ens18
```

```diff:/etc/netctl/ens18
-Interface='eth0'
+Interface='ens18'
```

## 有効化

```bash:ens18をstart
systemctl start netctl@ens18
```

```bash:ens18を有効化
# sudo netctl enable 
ln -s '/etc/systemd/system/netctl@ens18.service' '/etc/systemd/system/multi-user.target.wants/netctl@ens18.service'
```

```bash:eth0を無効化
# netctl disable eth0                           
Removed symlink /etc/systemd/system/multi-user.target.wants/netctl@eth0.service.
```
技術英語 > Perhaps the ship's stabilizers are not [operating at peak efficiency].

@ Star Trek Voyager > JETREL

http://qiita.com/7of9/items/326f69d135efc46f9be4
の続き。

Tuvokの打ったビリヤードのショットは Logic would dictate that ...というものにはならずにcorner pocket にまっすぐに落下。

そこでTuvokの言った言葉

> Perhaps the ship's stabilizers are not <font color=red>operating at peak efficiency.</font>

論理的人種であるTuvokはジョークも言わないというドラマの設定であるので、上記の言葉が真面目な分析から来たのかは不明。

<hr>
> at peak efficiency

上記は `at the peak efficiency`のように定冠詞はつかない。
文法的にどういうものなのかは把握できていない。

theなしの実例はgoogle検索でいくつも出てくる。[google](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=at%20peak%20efficiency%22)

http://www.ghd.com/global/about-us/peak-efficiency/
> keep the power plant operating at peak efficiency

<hr>

> at the peak of construction

の形で of xxxという場合は（おそらく）限定用法になり、theがつく。

[linguee](http://www.linguee.jp/%E8%8B%B1%E8%AA%9E-%E6%97%A5%E6%9C%AC%E8%AA%9E/%E7%BF%BB%E8%A8%B3/at+the+peak+of+construction.html)
> environmental and health training to as many as 75,000 construction workers from over 80 countries at the peak of construction. 

同様に `at the peak of efficiency`と言えなくもないと思う。
syncコマンドの進捗を確認

* [linux - Can I watch the progress of a `sync` operation? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/48235/can-i-watch-the-progress-of-a-sync-operation)

```bash:確認コマンド
watch grep -e Dirty: -e Writeback: /proc/meminfo
```

> Dirty:              2000 kB
> Writeback:        487844 kB

Writeback が 0 になったらsync完了


## 解説

* [I/O waitが発生する原理(dirtyメモリ、write back) - 脳汁portal](http://portaltan.hatenablog.com/entry/2015/10/15/145823)

> 書き込み処理はいったんメモリにdirtyメモリとして保存されて
> vm.dirty_background_ratioの割合を超えるか
> vm.dirty_expire_centisecsの時間が経過すると
> pdflushが実行されてwrite back処理によって物理ディスクに書き込まれる

> 書き込み処理が終わる前に次のpdflushが実行されても
> 前回の書き込みが終了するまでは待たなければいけない。(I/O wait)
PCから沢山の機器を制御したいと思った時に

# 制御したいもの
MAX/MSPで制御したい

- 電球: 30台ぐらい
- スピーカー: 5台ぐらい

# 問題
- イヤホンジャック1個しかねえ
- PCに何十個もの機器を直接つなげない
- 電球のオンオフはどうやるんだ

# どうするか
## スピーカー
- USB-オーディオ変換器なるものを使う
    - http://www.amazon.co.jp/dp/B00NMXY2MO
    - http://www.amazon.co.jp/dp/B007WPMIN8
    - もう少し高いのも安いのもある
- USBハブ-(変換器-スピーカー)×5でいくか

### 気になること
- USB-オーディオ変換器って使えるの？
    - これDA変換だよね、規格は？
    - Winで動くけどMacで動かないとかあるらしい
- USBハブ介して5個の音声信号を同時に送って、帯域大丈夫か

## 電球
- Arduinoと[ACリレースイッチ](http://www.amazon.co.jp/dp/B0057OC66U)を介する
- (8台のリレーをつないだArduino)が5台ぐらいか
- [Arduino使わなくても近いことはできる](http://www.h6.dion.ne.jp/~garakuta/labo/usb-io/usb-io.htm)

### 気になること
- Arduinoへの電力供給とArduinoからリレーへの電力供給
- USBの帯域

# まとめ
## 構成
あとで図のっけよう

- PC -- USBハブ (-- USBオーディオ変換器 -- スピーカー)*5
- PC -- USBハブ (-- Arduino (-- ACリレー -- 電球)*8)*5

## 気になること
1. USB-オーディオ変換器が使い物になるか
2. 帯域と電力
3. あと配線が長くなりそうだからそこらへんの調整も

## 対応策
1. => 買って試す
2. => 「USBたくさん繋ぎたいけど電力と帯域ってどうなってるの？」参照
3. => あとで考える
ArduinoからLED電球のON/OFFを制御する



Arduinoから100V AC電源駆動のLED電球を駆動させたいと思って調べてみました。

# 必要なもの

- Arduino
- ACリレー（こいつが重要）
 - [サインスマート製ACリレー](http://www.amazon.co.jp/dp/B0057OC6D8)
 - DCとしてだけど[実際に使っている動画](https://www.youtube.com/watch?v=0nhX9iqbkKk)
- LED電球


# 配線

エレキジャックの[こちらのページ](http://www.eleki-jack.com/KitsandKids2/2012/11/post_118.html)を参考にした。実体配線図が非常にわかりやすい。
ACリレーを配線している[ブログ記事](http://blog.livedoor.jp/hardyboy/archives/5958235.html)も参考になる。