OmniAICreator/Qiita-1.07M huggingface dataset:
Qt を用いたD-Bus通信(QtDBus) - その１

# この記事の概要

DBus を調べる際、利用の仕方、され方については解説がなされているのですが、<br>開発向けの内容で、日本語でまとまった資料が少なく、イメージをつかむのに苦労しました。
また、実際にコードとして書く際、一部のソースを自動生成させる工程があるのですが、<br>何を、どこまで手作業で行い、どこから自動生成させるのか
わかりやすくまとまったサイトなどに巡り会えなかったため、一連の作業をまとめようと思います。

DBus の概要や利用方法については Qiita 以外のサイトでは以下にお世話になりました。

* [いますぐ実践! Linux システム管理 - D-Bus の存在を感じてみる](http://www.usupi.org/sysad/175.html)
* [いますぐ実践! Linux システム管理 - D-Bus の存在をもう少し感じてみる](http://www.usupi.org/sysad/176.html)
* [IBM DeveloperWorks - D-BUSを使用してデスクトップ・アプリケーションを接続](https://www.ibm.com/developerworks/jp/linux/library/l-dbus/) (glib版のDBus)
* [本家 freedesktop.org](http://www.freedesktop.org/wiki/Software/dbus/) 

## DBus 概要の補足

DBus は、Unix系の環境で動作する IPC の一種です。DBus の特徴として、

* 1対1(非同期通信)のみではなく1対多(同期通信)のブロードキャストも可能
* 相手を意識せず、特定のサービス・機能を提供するために利用される傾向
 * 相手を意識せず、がキモで相手の開発言語に依らず、特定の機能(関数)を呼び出すこともできる
* 謳い文句としてバイナリ(≠テキスト)通信のため「軽量」
 * (なのですが実はそうでもない？[本の虫 - Linus Torvalds、「dbusはマジでクソだ」](http://cpplover.blogspot.jp/2015/04/linus-torvaldsdbus.html)ただ、Linus の言い分だと改善の余地がありそう？)

通信確認用コマンドツールとして dbus-monitor があり、このコマンドで通信内容を傍受することができます。
同様に dbus 送信用のコマンドとして dbus-send がありますが、これらは各所で説明されており、
今回は GUI ツールの qdbusviewer を用いて説明を行いたいと思います。

ubuntu 14.04 だと インストールは以下のコマンドで行えます。

``$ sudo apt-get install qttools5-dev-tools``

# DBus に出てくる用語について

DBus と QtDBus で同じ名称の用語が異なる意味で使われており、ここで一旦整理しておきます。

* Bus (DBus/QtDBus共通)
 * システムバス／セッションバス
 * 前者はネットワーク設定の変更やデバイス検知など、システム内部の通信に、後者はデスクトップ上のアプリ間通信という住み分け(絶対的なルールではない)
* Path (DBus) == Service (QtDBus)
 * 各コネクションは、それぞれ固有の名称で Path == Service 名として DBus-daemon に登録されます。<br>明示的に登録しなかった場合は、番号での名称(下記画像の:1.493など)が自動的に割り当てられます。
* Object (DBus) == Path (QtDBus)
 * 通常、Path == Service 名を明示的に登録した場合、そのドット(.)をスラッシュ(/)に置き換えた名称を Object == Path として習慣的に登録します。<br>QtDBus における登録は、Path 名がそのまま Object 名として登録されており、Path と Object は同義と解釈して良さそうです。<br>(ただ、Path という用語は多用されているため、この用語には注意が必要です)
* Interface (DBus/QtDBus共通)
 * 各コネクション内における機能毎に区分けした名称
* Signal／Method (DBus/QtDBus共通)
 * 呼び出し側／呼び出される側の名称ですが、シグナルは非同期通信(ブロードキャスト)で使う送信者側の識別子で、<br>メソッドは同期通信(1対1通信)の受信者側の関数名になり、対にはなっていません。
* SIGNAL/SLOT (Qt固有)
 * DBus とは直接関係ありませんが、Qt 固有の機能に SIGNAL/SLOT があり、SIGNAL が呼ばれると SLOT が呼ばれる、という対の関係を作りコールバックを実現しています。

## qdbusviewer 上の各機能名称(DBus)
![qdbusviewer_dbus.png](https://qiita-image-store.s3.amazonaws.com/0/38092/a069b411-67d0-5c74-edf3-8505131da109.png)

## qdbusviewer 上の各機能名称(QtDBus)
![qdbusviewer_qt.png](https://qiita-image-store.s3.amazonaws.com/0/38092/dc4a8c3d-0497-2961-175f-1b88d44e38cf.png)


開発の流れ
===
(タイトルが仰々しいですが)コードの自動生成を用いた開発方法について流れをおって説明していきます。
大まかには以下の流れになります。

※ 以降、QtDBus における用語を用います。

1. XML で Interface 名や Signal ／ Method の関数(引数の数と種別、戻り値も含む)の定義
2. 1. で作成した XML ファイルを qdbusxml2cpp に食わせ、Interface/Adaptor部のソース＆ヘッダーファイルを自動生成
3. QtDBus を用いたコーディング
 4. Adaptor のインスタンスを生成
 5. Service と Object に登録
 6. 送信側：同期通信なら送信主を名乗るための登録、非同期通信ならそれ用のインターフェースのインスタンスを生成
 7. 受信側：同期通信なら受信したい送信主のサービス・オブジェクト・シグナルなどを Qt固有のSIGNAL/SLOT で接続。<br>非同期通信なら XML で定義した関数と同じものを、SLOT として定義し、受信処理を作成(QObject::connectでの登録は不要)

長くなってしまったので、実作業は[その２](http://qiita.com/Corgeek/items/0693f48f0dcd454979fa)として投稿します。
operator==()が定義してあればoperator!=()を書かなくてもよくするやつ

C++でクラスに演算子`==`をオーバーロード定義してあげても、`a != b`という比較はできません。演算子`!=`を別途定義する必要があります。
でもほとんどの場合、`!=`の働きは`==`の否定でしょう。それなら共通ヘッダにこんなテンプレートを置いておけば

```cpp
template<class T, class F = decltype(!(std::declval<T>()==std::declval<T>()))>
// 自動的に定義される!=演算子。==演算子の結果に!演算子を適用した結果を返します。
F operator!=(T a, T b)
{
    return !(a==b);
}
```

`==`演算子が定義されていて`!=`が未定義のすべての型について、`!=`演算子が自動定義されます。戻り値が`bool`であるとは限りません。`==`と`!`の定義次第です。
`==`演算子の定義はこのテンプレートより前でも後ろでも構いません。
また、自力定義の`!=`演算子があれば、このテンプレートより前にあっても後ろにあってもそちらが有効なままとなります。
TextMesh入りGameObjectのテキストがカメラに向かうようにする


参考にしました。
http://spi8823.hatenablog.com/entry/2015/05/31/025903


TextMesh入りの GameObjectが作成されているという前提. GameObjectを置く位置によっては、テキストが明後日の方向に向いてしまうことがある。
カメラの方を向いてほしい。

__transform.LookAt__ を使えとのこと！

```C#
using UnityEngine;
using System.Collections;

public class lookatcenter : MonoBehaviour {

	// Use this for initialization
	void Start () {
		GameObject MainCamera = GameObject.Find("MainCamera");
		Vector3 cameraPosition = new Vector3 (MainCamera.transform.position.x, MainCamera.transform.position.y, MainCamera.transform.position.z);
		
		transform.LookAt(cameraPosition);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
```

中央を向く。という lookatcenter.cs を作成

Add Component -> Script でGameObjectに割り当てる
![スクリーンショット 2015-11-14 15.39.08.png](https://qiita-image-store.s3.amazonaws.com/0/92491/aef73ff9-b92c-7033-4085-fda8299fe4a0.png "スクリーンショット 2015-11-14 15.39.08.png")


できた。
Python で、LibreOffice アプリを使う（１）マクロはどこにあるの？

データを扱うちょっとしたデスクトップアプリがこれから重宝される時代になると思っていますが、皆さんどうでしょうか？

今、念頭においているのは、サーバ設定などの設定情報をチェックしたりするツールです。phpinfo をチェックして、設定あっているかどうかなどですね。それから、AWSの設定用JSONファイルをつくるとか。

これらの作業などを行うデスクトップアプリをLibreOffice 、python を使ってつくろうと思っています。クロスプラットフォームで使えるようにする予定です。

libreoffice を使うのは、ユーザーインターフェースの部分を作る手間を省くためです。それで、言語が、python かというと、java はちょっと重いので、手軽な言語として、python を選択しました。データマイニング系の言語でもありますし、AWSや、fabric でも使えるのがいいです。バージョンは、いろいろ迷いましたが、2.7 を基本にしています。libreoffice は、３系になってしまいますが、仕方がないところです。

# *マクロはどこにあるの？*
まず、マクロをpythonで書くところからはじめます。まずつまずくのは、どこにマクロが保存されているのかです。とりあえず、調べた結果です。

### windows 7　LibreOffice 5.0.3
AppData は隠しファイルなんで、フォルダオプションで見られるようにしておくと便利です。
**自作マクロ** 
C:\Users\ユーザ名\AppData\Roaming\LibreOffice\4\user\Scripts\python
**サンプルマクロ**
C:\Program Files (x86)\LibreOffice 5\share\Scripts\python

### ubuntu14.04　LibreOffice 5.0.3.2-2 パッケージによって、ディレクトリ変わるみたいです。
**自作マクロ** 
/home/ユーザ名/.config/libreoffice/4/user/Scripts/python
**サンプルマクロ**
/opt/libreoffice5.0/share/Scripts/python

### OSX10.9.5 　LibreOffice 5.0.3
**自作マクロ** 
/Users/ユーザ名/Library/Application Support/LibreOffice/4/user/Scripts/python
**サンプルマクロ**
/Applications/LibreOffice.app/Contents/Resources/Scripts/python
画像のノイズ除去～Non-local means filter

# はじめに
画像のノイズ除去手法であるNon-local means filterについて記載します。

# Non-local means filter
$u(\vec{r})$をフィルタ前のデータとします。$v(\vec{r})$をフィルタ後のデータとします。
$\vec{r},\vec{s}$は位置ベクトルです。$w(\vec{r},\vec{s})$は類似度に基づいた重みです。$I$は画像全体です。
フィルタ後のデータ($v(\vec{r})$)は注目点($\vec{r}$)と画像全体($\vec{s} \in I$)の重み付け和になります。
画像全体に対して重み付け和をとっていることに注目してください。これがNon-localといわれる理由です。

```math
v(\vec{r}) = \sum_{\vec{s} \in I}{w(\vec{r},\vec{s})u(\vec{s})}
```

類似度に基づく重み付けは次のように行います。$\vec{N}(\vec{r})$は$\vec{r}$の周辺画素を並べたベクトルです。
$d = ||\vec{N}(\vec{r})-\vec{N}(\vec{s})||$は周辺画素ベクトルのユークリッド距離です。
ガウス関数$exp(- \frac{d^2}{\sigma ^2})$を使うことで距離0が最も重く、0から遠ざかるにしたがって軽くする重み付けをすることができます。
$\sigma$はパラメータになります。$Z(\vec{r})$は重みの総和です。規格化に使われます。

```math
w(\vec{r},\vec{s}) = \frac{1}{Z(\vec{r})}exp(- \frac{||\vec{N}(\vec{r})-\vec{N}(\vec{s})||^2}{\sigma ^2}) \\
Z(\vec{r}) = \sum_{\vec{s} \in I} {exp(- \frac{||\vec{N}(\vec{r})-\vec{N}(\vec{s})||^2}{\sigma ^2})}
```

ガウス関数 $\sigma = 1$
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/84205/02711405-5512-0542-d1ed-04d5105a7bac.jpeg)

# 計算例
式だけでは分かりにくいので具体例を示します。
画像サイズは幅$w=8$,高さ$h=15$です。$0\le x \le7$, $0\le y \le 14$
$\vec{r}=(4,5), \vec{s}=(1,1)$のときの図です。
![image](https://qiita-image-store.s3.amazonaws.com/0/84205/b1096c8a-d8de-9e03-86d2-da5bb8c8afa2.png)

簡単にするため端を含まないようにします。
つまり$\vec{r},\vec{s}$が動く範囲を$1\le x \le6$, $1\le y \le 13$に制限します。
ここでは周辺画素は注目点の周り1画素とします。
どのくらいの範囲の周辺画素を考えるかはフィルタのパラメータになります。

$\vec{r}=(4,5)$周辺画素ベクトルは次の通りです。

```math
\vec{N}(4,5) = [u(3,4),u(3,5),u(3,6),u(4,4),u(4,5),u(4,6),u(5,4),u(5,5),u(5,6)] 
```

$\vec{s}=(1,1)$周辺画素ベクトルは次の通りです。

```math
\vec{N}(1,1) = [u(0,0),u(0,1),u(0,2),u(1,0),u(1,1),u(1,2),u(2,0),u(2,1),u(2,2)] 
```

ユークリッド距離は次の通りです。

```math
||\vec{N}(4,5) - \vec{N}(1,1)||^2 = \\
(u(3,4)-u(0,0))^2 + (u(3,5)-u(0,1))^2 + (u(3,6)-u(0,2))^2 + \\
(u(4,4)-u(1,0))^2 + (u(4,5)-u(1,1))^2 + (u(4,6)-u(1,2))^2 + \\
(u(5,4)-u(2,0))^2 + (u(5,5)-u(2,1))^2 + (u(5,6)-u(2,2))^2\\
```

$\vec{s}$を$1\le x \le6$, $1\le y \le 13$の範囲で動かして上記と同じ処理を行います。
その結果を使うと次の計算ができます。

```math
Z(4,5) = \sum_{1 \le x \le 6} \sum_{1 \le y \le 13} {exp(- \frac{||\vec{N}(4,5)-\vec{N}(x,y)||^2}{\sigma ^2})}
```

```math
w((4,5),(x,y)) = \frac{1}{Z(4,5)} exp(- \frac{||\vec{N}(4,5) - \vec{N}(x,y)||^2}{\sigma ^2})
```

重みが決定できたのでフィルタリングを行います。

```math
v(4,5) = \sum_{1 \le x \le 6} \sum_{1 \le y \le 13} {w((4,5),(x,y))u(x,y)}
```

以上で$v(4,5)$のフィルタリングができました。

$\vec{r}$を$1\le x \le6$, $1\le y \le 13$の範囲で動かして上記と同じ処理を行うとフィルタリング処理が完了します。
imaxima: emacs 上で数式のきれいな maxima を使う

#ふつうの maxima は便利だけど数式がきれいじゃない
Mathematica や Maple のフリー版として maxima を使うんだけど、ふつうの maxima はこんな感じで美しくない。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/98718/d9b0ef80-b429-ca59-3853-e915f9e2786b.png)

このままではイライラで罪のないキーボードがクラッシュされかねないので、imaxima を使う。
というわけで maxima の結果をTeXな感じで表示してくれる、emacs 上で走る imaxima をインストールする話。

#imaxima のインストール
Ubuntu ユーザーなので Ubuntu での場合。とりあえず以下の5つ
`$ sudo apt-get install emacs24 texlive texlive-math-extra maxima maxima-emacs`
をインストール。emacs23 でも機能するはず。TeXのインストールはそれなりに長いかも。

次の3行を .emacs に追加

```lang:.emacs
(autoload 'imaxima "imaxima" "Frontend of Maxima CAS" t)
(autoload 'imath "imath" "Interactive Math mode" t)
(autoload 'imath-mode "imath" "Interactive Math mode" t)
```

これでOK。

#使い方
`$ emacs -f imaxima`
で emacs の起動と同時に imaxima を起動。
emacs 上から立ち上げるには
` M-x imaxima`
でOK。これでめでたくきれいな式が出力され、世界に平和が訪れる。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/98718/8a7def71-0208-bf20-3eed-97705dd1d531.png)


終了する場合は
`quit();`
で imaxima を抜けて通常の emacs に戻ってくる。

#参考文献
[Easy Install on major Linux OS](https://sites.google.com/site/imaximaimath/download-and-install/easy-install-on-linux)
Rails ActiveAdmin JpPrefecture

ActiveAdminのフォームでJpPrefectureを使って良い感じにプルダウンを出すにはこうする。

```lang:app/admin/human.rb
form do |f|
  f.inputs "Human" do
    f.input :name
    f.input :prefecture_code,
            as: :select,
            collection: JpPrefecture::Prefecture.all.map {
              |value| [value.name, value.code]
            },
            prompt: true
  end
  f.actions
end
```
Qiita:Team からエクスポートした記事アーカイブを HTML に変換するスクリプト

Qiita:Team には、今までに書いた記事をエクスポートする機能があります。しかし、エクスポートされるのは巨大な json ファイル1個で、とても人間が読めるようなものではありません。

ということで、QiitaTeam からエクスポートした json ファイルを記事HTMLに変換するスクリプトを作ってみました。相当マニアックなニーズとは思いますが、せっかくなのでgithubで公開しておきます。

コマンドラインから以下を実行すると、フォルダqiita-team-htmlに全記事とプロジェクトのHTMLファイルが生成されます。

```
$ npm install -g https://github.com/okaxaki/quiita-team
$ quiita-team foobar.json
```

より詳しくはgitリポジトリをごらんください → https://github.com/okaxaki/quiita-team

生成したHTMLは↓のような感じです。タグ、コメント、画像、記事一覧のindex.htmlも出力されますので、内容的にはほぼローカルミラーです。

![q.png](https://qiita-image-store.s3.amazonaws.com/0/43781/fe392a11-2fbf-a800-0f24-002b4db4aa24.png)

Qiita:Teamからエクスポートできる json ファイルは日々変化するようなので、最新のjsonファイルで動作しなかったらすみません。筆者の環境では 2015年10月末ごろの json ファイルで動作を確認しました。
Hello hubot


hubot(https://hubot.github.com/)をインストールした時のメモ。

# 準備
ref: http://qiita.com/sinmetal/items/154e81823f386279b33c

## node アンインストール
node が既にインストール済みだったので、アンインストール

```command
$ curl -o uninstall-node.sh https://gist.githubusercontent.com/nicerobot/2697848/raw/uninstall-node.sh
$ chmod u+x uninstall-node.sh 
$ ./uninstall-node.sh 
$ rm uninstall-node.sh 
$ sudo rm -rf /usr/local/include/node
$ sudo rm -rf /usr/local/lib/dtrace/
```

## nodebrew インストール
nodebrew をインストール

```command
$ curl -L git.io/nodebrew | perl - setup
...
========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

## node インストール
```command
$ nodebrew install-binary v4.2.2
$ nodebrew use v4.2.2
```
## hubot インストール
ref: https://hubot.github.com/docs/

```command
$ npm install -g yo generator-hubot
```

## SlackBot 作成
```command
$ cd workspace
$ mkdir myhubot
$ cd myhubot
$ yo hubot
? Owner marty.marron@gmail.com
? Bot name SlackBot
? Description A simple helpful robot for your Company
? Bot adapter (campfire) slackgot back false
? Bot adapter slack
```
MilkcocoaをPromiseでよりDB的に使う

# 元ネタ
[milkcocoa] milkcocoa コネクションを切断する方法
http://qiita.com/simiraaaa/items/fa21870be7f8e6fc7639

を@printf_moriken さんがツイートで
> データベース的に使いたかったら、Promise で囲っといたほうがよさそう。
https://twitter.com/printf_moriken/status/658666233210912768

とおっしゃってたのを見て、できるか試してみた。

# 検証のしかた

- Milkcocoaインスタンス生成～データ取得部分をPromiseで囲う
- getでid指定してデータ取得
- コネクションがget時だけになるか(get前後のコネクション数をダッシュボードで確認)

# コード

```index.html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>DB的に使うサンプル</title>
</head>

<body>
    <script src="https://cdn.mlkcca.com/v2.0.0/milkcocoa.js"></script>
    <script src="index.js"></script>
</body>

</html>
```

```index.js
function getData(id) {
    return new Promise(function (resolve, reject) {
        var mk = new MilkCocoa('{YOUR-APP-ID}.mlkcca.com');
        mk.onConnected(function () {

            // データ取得
            var ds = mk.dataStore("chat");
            ds.get(id, function (err, datum) {
                mk.disconnect();
                resolve(datum);
            });
        })
    })
}

getData("ifezvqhgRyS87ba").then(function (data) {
    //データを使う
    console.log(data);
});
```

# 結果
指定したidのデータがJSONで返ってきました。つまり通常のds.getと同じ動きをしました。
コネクションもちゃんと切れてました。

# まとめとか注意とか
Milkcocoaのインスタンス生成～各処理をPromiseで囲うことでDB的に使うことができそうというのがわかりました。コネクションを通信時のみに限定することで制限をかいくぐることができそうです。
ただこのやり方はインスタンスを生成してコネクション張るのにかかるコストとかがどうなのかわからないので、Milkcocoaもともとのきびきびしたデータのやり取りができるかは不明です。
また、そもそもプランの制限を超える不正さもあるやり方ですので、使う際は自己責任でお願いします。
dockerコンテナ内のlessコマンドで「WARNING: terminal is not fully functional」が表示される場合の解決策

# 問題
DockerのCentOS7イメージ利用時に

```
$ docker run -it --name=sample docker.io/centos:7 /bin/bash
```
でコンテナを起動すると`systemctl`が使用できません。
その場合、

```
$ docker run -d --privileged --name=sample docker.io/centos /sbin/init
```

とコンテナを起動し、

```
$ docker exec -it sample /bin/bash
```
でコンテナ内に接続すると`systemctl`が使えるのですが、`less`コマンドで

```
WARNING: terminal is not fully functional
```

という警告が表示されてたり、topコマンドが使えなくなってしまいます。

# 原因
Dockerコンテナ起動時にttyが生成されないため。

# 解決策

`docker run`するときに`-t`オプションを使用追加します。

```
$ docker run -td --privileged --name=sample docker.io/centos /sbin/init
$ docker exec -it sample /bin/bash
```
これで`less`や`top`が使えるようになります。


# 参考
 - [dumb terminal when using docker exec](https://github.com/docker/docker/issues/8631)
シンボリックリンク（フォルダ）を作成する

## コマンドプロンプトを管理者権限で実行する

## 次のコマンドを実行する

```bat:
mklink /D リンク元 リンク先
```

例：

```bat:
mklink /D "C:\Program Files\MyApp" "D:\MyApp"
```
よく使用するフォルダーを非表示にする

# 背景
表示の邪魔になっているので、消したい。
私はあまり使っていないし。。。

# 手順

## 1. エクスプローラーより「ファイル」タブを選択

## 2.「フォルダーと検索のオプションの変更」を選択

## 3. 「最近使ったファイルをクイック アクセスに表示する」のチェックをはずす

## 4. 「よく使うフォルダーをクイック アクセスに表示する」のチェックをはずす
CentOSのsudoまとめ

# 設定

## 設定ファイル

設定ファイルは`/etc/sudoers`。設定を変更するには`visudo`コマンドを使うべき。シンタックスエラーなどをチェックしてくれる。`/etc/sudoers.d`にファイルをおいてもインクルードされる。

基本的な書き方は

```
ユーザー名　　ホスト名=なれるユーザー　　許可するコマンド
```

実際にはかなり複雑な文法があり、詳しくは`man sudoers`に多くの例付きで書いてある。

また、主に`Defaults`で始まる行でオプションを設定でき、それも`man sudoers`に書いてある。

よく使うであろうオプション：

```
requiretty   端末が必要
timestamp_timeout   パスワードのキャッシュ時間（分単位）
```


## wheelグループに入っているユーザーのsudoを許可する

```
%wheel        ALL=(ALL)       ALL
```

この状態だとsudoしたときにパスワードを聞かれる（rootでなくsudoを実行したユーザーのパスワード）。
入力したパスワードは5分間キャッシュされ、その間は再度sudoしても聞かれなくなる。
このキャッシュ（というかcredential）が保存される場所は`/var/db/sudo`。


パスワードなしで実行できるようにしたければ

```
%wheel ALL=(ALL)       NOPASSWD: ALL
```


## sshからのsudo

CentOSのデフォルトでは、制御端末を持たないプロセスからのsudoが禁止されている。つまり、

```
$ ssh ホスト名 "sudo whoami"
sudo: sorry, you must have a tty to run sudo
```

のように怒られてしまう。対策としては下記のように`ssh -t`として端末を割りつけるか、

```
$ ssh -t ホスト名 "sudo whoami"
root
```

またはサーバの`/etc/sudoers`に

```
Defaults    !requiretty
```

と書いておく。


# sudoコマンド

## 基本的な使い方

```
$ sudo -u ユーザー名 コマンド

$ sudo -u yamada ls /var/www/html
```

## コマンドをクォートで囲って1個の引数として渡す

```
$ sudo sh -c "ls /"

### -Eをつけると現在の環境変数を引続
$ sudo -E sh -c 'echo $HOME'
```

## 複数のコマンドを実行する

```
$ sudo sh -c 'whoami; whoami'
```

## ログインシェルの状態で実行するには`-i`

```
$ sudo -i pwd
```

`-i`をつけると`/etc/passwd`からログインシェルを取得してそれをシミュレートするので、~/.bash_profileなども読み込まれる。

## バッチ処理でsudoするときは`-n (non-interactive)`がオススメ

パスワードが必要な場合、入力を待つことなしにすぐにエラーになる。

# 環境変数について

CentOSのデフォルトでは

* 環境変数はリセットされる（実効ユーザーのHOMEになる）
* ただしHOSTNAMEなど一部の環境変数は変わらない
* その辺は`/etc/sudoers`の`always_set_home`、`env_reset`、`env_keep`で設定されている
* 環境変数の扱いはFreeBSDでは違ったような気がする（少なくとも10年位前のでは）

# 参考
[Sudo - ArchWiki](https://wiki.archlinuxjp.org/index.php/Sudo#.E3.82.A8.E3.82.A4.E3.83.AA.E3.82.A2.E3.82.B9.E3.82.92.E6.B8.A1.E3.81.99)
Kotlinのライブラリをbintray-releaseを使ってアップロードするときにハマったこと


##bintray-releaseとは
bintray-releaseは、[bintray](https://bintray.com/)にAndroidなどのライブラリをリリースするのが超カンタンになるライブラリです。リリースに関する設定の部分は5,6行ですぐに記述できます。

###GitHubリポジトリ
説明：Super duper easy way to release your Android and other artifacts to bintray.
[GitHub](https://github.com/novoda/bintray-release)

###bintray-releaseの使い方
bintray-releaseの使い方は、すごく簡単です。

#### まずは、プロジェクト直下の **build.gradle**　のdependenciesに新たにパスを追加します。

```build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
    	classpath 'com.android.tools.build:gradle:1.3.1'
    	classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.0-beta-2422'
    	classpath 'com.novoda:bintray-release:0.3.4' // 新たに追加
    }
}
```

#### 次に、ライブラリフォルダ内の **build.gradle** の任意の場所に以下のような文を追加します。

```library/build.gradle
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'com.novoda.bintray-release' // 新たに追加

android {
	// 省略
}

// publicブロックを新たに追加します。ここがbintrayにリリースする際の情報になります
public {
	userOrg = 'novoda'
    groupId = 'com.novoda'
    artifactId = 'bintray-release'
    publishVersion = '0.3.4'
    desc = 'Oh hi, this is a nice description for a project, right?'
    website = 'https://github.com/novoda/bintray-release'
}
```

[他に設定できるパラメーター](https://github.com/novoda/bintray-release/wiki/Configuration-of-the-publish-closure)

#### 最後に、gradleコマンドを書きます。
bintrayのユーザー名とAPIキーの取得の仕方については、割愛します。
こちらについては、bintrayに登録し、APIキーを書きます。

```
$ ./gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
```

##ハマったこと
###kotlinのフォルダにおいて、javadoc生成タスクで失敗する

###回避策
gradleの中からjavadocの生成タスクを消します。
gradleからの特定のタスクの消しかたは、StachOverflowの記事を参考にしました。[StackOverflow](http://stackoverflow.com/questions/29809868/android-studio-how-to-remove-or-disable-javadoc-generation-from-project-build)

tasksに関する処理は、そのライブラリ内のbuild.gradle内に新たにafterEvaluateタグを追加して、その中に記述します。
もし、プロジェクト直下に記述したい場合はtasksの前にproject(":{モデュール名}").task~~と追加します。

```library/build.gradle
afterEvaluate {
    tasks.findByPath(":{タスク名}").enabled = false
}
```

これで、見事にうまくいきました。
かなり簡単に記述できるので、みなさんもbintray-release使ってみてください！


## 最後に
RxAnimationというライブラリをJavaとKotlin両方でリリースしました。
今回のgradleの部分もかかれているので、見ていただけたらと思います。
https://github.com/Reyurnible/RxAnimation
zshを5.1.1にしたらつまづいた

小ネタですが

ちょっと前にもzsh5.1.1にして、起動してみるとエラーとか出てしまったので、今回はちょっと調べました。といってもすごい簡単な事でした。

```
Last login: Sat Nov 14 14:58:47 on ttys009
/Users/kakikubo/.zshrc:25: parse error near `}'
kair%
```

ターミナル起動時に出力されたメッセージは上記でした。
該当行は以下です。

```
function history-all {history -E l } # 全履歴の一覧を出力する関数定義
```

で、解決したのが以下です

```
function history-all { history -E l } # 全履歴の一覧を出力する関数定義
```

{と}の横はスペースが入らなくてはならないようです。といってもこれ、以前の5.0.xの時のzshでは何も言われなかったので、厳格さがましたのかもしれません。ひとまず解決してよかった。
CentOS 7でユーザ権限のデーモンを作成する(SysVinit)

CentOS 7はSysVinitによるサービス管理をsystemdがサポートしている．
今回は1プロセスのみ起動するプログラムをデーモン化する．

# デーモン化までの処理
ProgramのPIDをユーザ領域に記録するため，Shellを挟む流れとした．
`SysVinit -> Shell -> Program`

## 構成

```
/etc/init.d/
tick ... デーモン起動スクリプト

/home/username/daemon-sample/
exec-tick.sh ... Shell
tick ... プログラム
ick.pid ... PIDファイル
```


## Program
10秒毎に標準出力に”Tick”と表示するだけ．

```c:tick.c
#include <stdio.h>

int main(int argc, char* argv) {
  while(1) {
    printf("Tick\n");
    sleep(10);
  }
}
```

## Shell
バックグラウンドでプログラムを起動させ，PIDを記録する．

```bash:exec-tick.sh
#!/bin/bash
PROG_PATH="/home/username/daemon-sample/"
PROG="tick"
PID="tick.pid"

echo -n "arg:"
echo $*

"${PROG_PATH}${PROG}" $* &

echo -n "pid: "
echo $!

echo $! > "${PROG_PATH}${PID}"
```

## SysVinit

start()で`--user`オプションを付ければ，指定ユーザで起動する．
`daemon`, `killproc`は`. /etc/init.d/functions` で定義されたスクリプトの関数．

```bash:/etc/init.d/tick
# Source function library.
. /etc/init.d/functions

PROG_PATH="/home/username/daemon-sample/"
SCRIPT_NAME="exec-tick.sh"
SCRIPT="${PROG_PATH}${SCRIPT_NAME}"
PROG_NAME="tick"
EXEC_USER=username

start() {
	echo -n "Starting tick: "
	touch /var/lock/subsys/tick
	daemon --user=$EXEC_USER $SCRIPT hoge fuga foo
	echo -n "pid "
	echo $!
	return 0 
}	

stop() {
	echo -n "Shutting down tick: "
	rm -f /var/lock/subsys/tick
	killproc $PROG_NAME
	echo $!
	return $! 
}

case "$1" in
    start)
	start
	;;
    stop)
	stop
	;;
    status)
	echo -n "/var/log/subsy/tick "
	cat /var/log/subsys/tick
	;;
    restart)
    	stop
	start
	;;
    *)
	echo "Usage: <servicename> {start|stop|status|reload|restart[|probe]"
	exit 1
	;;
esac
exit $?
```

お手本になる起動スクリプトは以下@ CentOS Linux release 7.1.1503 (Core)
`/usr/share/doc/initscripts-9.49.24/sysvinitfiles`

# 動作確認

root権限で起動

```bash
# /etc/init.d/tick start
Starting tick (via systemctl):                             [  OK  ]

```

ユーザ権限で実行されており．制御端末とも切り離されている．(`?`となっている部分)

```bash
$ps ux
username   15788  0.0  0.0   4164   352 ?        S    14:57   0:00 /home/username/daemon-sample/tick hoge fuga foo
```

root権限で停止

```bash
# /etc/init.d/tick stop
Stopping tick (via systemctl):                             [  OK  ]
```
Unity+Vuforiaでマーカーが認識されない時

ARCamera の Dataset Load Behaviour コンポーネントの下記項目にチェックをつける。新しくpackage追加した時忘れがちorz

- Load Dataset <データセット名>
- Active

<img width="299" alt="arcamera.png" src="https://qiita-image-store.s3.amazonaws.com/0/39561/5cd4ee43-501e-59e5-27f1-c61fe04ff002.png">
この画像の赤丸の部分です
Macに10分でHadoop,Hive環境を作る

Hadoopのデモや検証環境を作るにはおそらくMacは私の知るか限り最も手軽な環境かと。
Standaloneなら1分。擬似分散、Hiveを入れても10分以内。ホントお手軽。

##環境

* Homebrewを利用しますので、berwコマンドが使えるようにしておきます。
* OSはEl Capitan
* Java(JDK)を入れておきましょう。6以上なら良いみたいですが。私はJava8です。

##前提知識

* HiveはHDFSに依存しているので、擬似分散モードに設定する必要があるので、そうします。
* 2015年11月14日現在、2.7.1がインストールされるみたいです。

##Hadoopインストール

```bash
brew install hadoop
```

以上。これで、Standaloneなら動きます。
インストールは/usr/local/Cellar/hadoop/以下にされます。
いわゆるHADOOP_HOMEは、/usr/local/Cellar/hadoop/2.7.1/libexecのもよう。

##設定ファイルの編集
最低限なら、いじるファイルは2つ。/usr/local/Cellar/hadoop/2.7.1/libexec/etc/hadoop以下にあります。

* core-site.xml
* hdfs-site.xml

これらを編集します。

core-site.xml

```xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>
```


hdfs-site.xml

```xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>
```

##初期化（HDFSフォーマット）

```bash
hadoop namenode -format
```

##起動

制御スクリプトは/usr/local/Cellar/hadoop/2.7.1/libexec/sbin以下にあります。

```bash
./start-dfs.sh
```
>start-all.shでも。

###終了

```bash
./stop-dfs.sh
```
>stop-all.shで。

##Hiveのインストール

```bash
brew instll hive
```

以上。MetaDBをMySQLにするとかもいらない。

##動作テスト

hiveと入力し、hive>コンソールが表示され、create dbできれば、ほぼ動いている。

```bash
hive
.
.
hive>
hive> create database testdb;
hive> show databases;
OK
default
testdb
Time taken: 0.024 seconds, Fetched: 2 row(s)
```
>hive> コンソールはHDFSが初期化されてなくても表示されるので、試しにcreate dbしてチェックしてみるのが無難。

ここまで約5分。簡単過ぎて商売にならない。

##Hadoop,Hiveの削除

```bash
brew remove hive
brew remove hadoop
```
ちなみに、デフォルトでデータ領域は/tmp/hadoop-*>以下にできるので、再起動などすれば、消えます。
cakephp 2.5.1  Viewディレクトリ名の大文字と小文字

cakephpのローカル環境で、新規コントローラとViewでページを作ったら
開発サーバにpushしてもページが見つからないと怒られた。

**Error:An Internal Error Has Occurred.**

ググると、DBの接続がうまく行ってないとかなんとか出てきたが、初歩的なミスだった


View/Hoge/index.ctp としないといけないところを
View/hoge/index.ctp としていたのですね。

ローカルでは普通に動いていて気づかなかった。
環境によって、これで使えたり使えなかったりするのだろうか？

ローカルと開発サーバはバージョンや、coreの設定が微妙に違うので検証はしていないが
こんなことがありましたよと報告

***

余談ですが、ファイルやディレクトリの大文字と小文字の差だけではGitが変更を認識してくれないみたいなので、気づいたあとの修正でも若干困った。
[Gitでファイル名&ディレクトリ名の大文字/小文字を変更方法](http://qiita.com/narumi888/items/95b5a050cd3d20dab81c)

結局上記URLのようにリネームしたコミットを2回やって解決したけど、なんだかダサいなぁ
npm install gulpした時にgulp以外のものがnode_modulesの中にたくさん入る

```$ brew update```と```$ brew upgrade```をしてからgulpを使ってみたらタイトルにあるような現象がおきた。  
使えない事はないけれど気持ち悪いので直した。   

##環境
OS X 10.10.5 Yosemite
MacBook Pro

##原因
node.jsのversionが5.0.0になっていたことが原因だった。
(node.jsを4.2.2に戻したら直ったので上記が原因かと思う。細かい検証はしていない)  
なのでnodebrewを使ってNode.jsのversionを管理出来るようにする。


##まずはNode.jsをuninstall
もともとHomebrewは使っていたのでhomeberwを使ってuninstall

```
$ brew uninstall node
```

これで```npm```も一緒にuninstallされる  

##nodebrewをinstall
これもHomebrewを使ってinstallする

```
$ brew install nodebrew
```
installの確認

```
$ nodebrew
```
以下の表記が出ればinstallはOK
versionは記事公開時点のものなので、そこは変動すると思う。

```
nodebrew 0.9.2

Usage:
    nodebrew help                         Show this message
    nodebrew install <version>            Download and install a <version> (compile from source)
    nodebrew install-binary <version>     Download and install a <version> (binary file)
    nodebrew uninstall <version>          Uninstall a version
    nodebrew use <version>                Use <version>
    nodebrew list                         List installed versions
    nodebrew ls                           Alias for `list`
    nodebrew ls-remote                    List remote versions
    nodebrew ls-all                       List remote and installed versions
    nodebrew alias <key> <version>        Set alias to version
    nodebrew unalias <key>                Remove alias
    nodebrew clean <version> | all        Remove source file
    nodebrew selfupdate                   Update nodebrew
    nodebrew migrate-package <version>    Install global NPM packages contained in <version> to current version
    nodebrew exec <version> -- <command>  Execute <command> specified <version>

Example:
    # install from binary
    nodebrew install-binary v0.10.22

    # use a specific version number
    nodebrew use v0.10.22

    # io.js
    nodebrew install-binary io@v1.0.0
    nodebrew use io@v1.0.0
```

##PATHを通すのとコマンドの設定

```
$ export PATH=$HOME/.nodebrew/current/bin:$PATH
$ source ~/bash_profile
```

##Node.jsをinstallする
あとは自分の使いたいNode.jsをinstallするだけ

```
$ nodebrew ls-all
```
でinstall出来るNode.jsの一覧を表示   
私はv4.2.2を使いたかったので

```
$ nodebrew install-binary v4.2.2
```

例) v5.0.0を使うときは

```
$ nodebrew install-binary v5.0.0
```

あとは使いたいNode.jsを指定する

```
$ nodebrew use v4.2.2
```
確認

```
$ node -v 
```

指定したversionが表記されればOK  
今回は4.2.2を指定したので

```
v4.2.2
```

以上。
はじめてのPython ではまったこと

python を使い始めて、はまったところを書いていきます。

### 参照渡し

x=['a','b','c']

y=x

ここで、y は、['a', 'b', 'c'] です。

でも、

x[0]="xxx" をいれて、x を、['xxx', 'b', 'c'] にします。そうすると、
yも、['xxx', 'b', 'c'] 　になります。'a' の部分が、'xxx' になってしまいます。

気をつけましょう。
Androidアプリの個人開発にCIを導入してみよう！


![20151114.jpg](https://qiita-image-store.s3.amazonaws.com/0/92038/6026c5a3-1e83-7dcf-256e-9e86c64b7b78.jpeg "20151114.jpg")


* [CentOS7 Jenkinsインストール 1/2](http://qiita.com/m1takahashi/items/ac7f28259d8ac3e74ec8)
* [CentOS7 Jenkinsインストール 2/2 (VirtualHost + mod_proxy + Basic認証)](http://qiita.com/m1takahashi/items/4673cf97ec6665951e35)
* [CentOS7 JenkinsでAndroidアプリをビルドする 1/2](http://qiita.com/m1takahashi/items/9af403bda2ddd207c4b5)
* CentOS7 JenkinsでAndroidアプリをビルドする 2/2（Jenkins設定）
* Jenkinsから、GooglePlayへのapkファイルアップロード


私の場合、集中してコーディングしたい（楽しみたい）と考えています。
しかし、現実には断片的にしか時間が取れません。
ソースコードをローカルに置いておくと、大抵、どこにやったか、どこまでやったか忘れてしまいます。

1. コーディング
2. テスト
3. 評価（ステップ数、カバレッジレポート、チェックスタイル）
4. 成果物（APKファイル）の配布

あらかじめ、これら一連の作業フローを、自動化しておくことで、一番の楽しみに時間を取れるようにしています。
個人開発の場合、ランニングコストはできれば低く抑えたいので、有料のGitHubではなくBitBucketを利用しています。
GooglePlayの登録料（25ドルくらいだっけ？）と、Jenkins用のサーバー代ぐらいは、まぁ、仕方がないです。
現状、ステップ数も少なく、ユニットテストやビルドに時間がかからないので、さくらVPSの512Mプランで十分です。


[CloudBees](https://www.cloudbees.com)
本家、クラウドサービス、いつかは使ってみたいねぇ。
PyCharmでtabインデントを許可する方法

<img width="1047" alt="スクリーンショット 2015-11-14 13.56.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/100729/f015992d-e504-e569-3c70-22e1b3f04589.png">


右下の+buttonを押して、indentaiton contains tab と入力するだけ
ブラウザからの音声入力を認識してテキスト化する (Web Speech API)


Chromeすごいわ。ブラウザだけでここまでできるとは。
こんな簡単なHTMLだけで音声認識→ テキスト化ができます。 日本語もOK。

![speech.png](https://qiita-image-store.s3.amazonaws.com/0/18743/00d9ccf6-6304-b26d-c397-7e7c1a89f434.png "speech.png")


デモをこちらに起きました。
http://inouet.github.io/sample_html/001.speech_recognition.html

コード

```html
<html>
<head>
  <meta charset="UTF-8" />
  <title>Web Speech API</title>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script>
window.SpeechRecognition = window.SpeechRecognition || webkitSpeechRecognition;
var recognition = new webkitSpeechRecognition();
recognition.lang = 'ja';

// 録音終了時トリガー
recognition.addEventListener('result', function(event){
    var text = event.results.item(0).item(0).transcript;
    $("#result_text").val(text);
}, false);

// 録音開始
function record()
{
    recognition.start();
}
</script>
</head>

<body>

<textarea id="result_text" cols="100" rows="10">
</textarea>
<br />
<input type="button" onClick="record()" value="録音開始" />
</body>
</html>
```

※ ローカルに保存したHTMLをchromeで表示したらうごかず。WEBサーバー経由で表示しないとだめみたい。ハマった。

## 参考ページ
* [ブラウザのみで音声認識とテキスト読み上げを実現する Web Speech API | CYOKODOG](http://www.cyokodog.net/blog/web-speechi-api/)
* [Webアプリに高機能な音声認識を追加するWeb Speech API - Kesin's diary](http://kesin.hatenablog.com/entry/2013/08/27/Web%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AB%E9%AB%98%E6%A9%9F%E8%83%BD%E3%81%AA%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8BWeb_Speech_API)
layout_weight

layout_weightの留意点

layout_weightは、複数のViewを任意の大きさの割合で配置することができるコマンドであり、とても有益である。このコマンドの留意点は次のとおりである。
絶対の位置では無く、相対的な位置を設定する。このため、物理画面の大きさの違いに関係無く、全てのサイズの画面に対応できる。
横方向で使う場合：layout_widthの値を"0dp"にすること。具体的には次のように書く。android:layout_width="0dp"
この値を"fill_parent"にした場合、layout_weightの数値が低いViewが大きく配置される。物好きな人はお試しください。
この値を"wrap_content"にした場合、各Viewの配置割合は不正確になる。
縦方向で使う場合には、(layout_widthを0dpにするのではなく)layout_heightの値を"0dp"にする。
layout_weightで指定した大きさを超える長い文字列がViewに代入された場合、layout_weightの指定が優先適用され、指定された方向にはサイズは伸びない。そして、Viewは、layout_weightによる指定が無い方向に伸びていく。
android:weightSumに代入する値が、各layout_weightの値の合計よりも多い場合、その多い分が余白となる。つまり、 android:weightSumは余白を設けるコマンドである。
android:weightSumは設けなくても良い。この値が、各layout_weightの値の合計と同一であるならば、android:weightSumを書く意味は無い。
LinearLayoutの子Viewにだけしか使えない。ただし、LinearLayoutを継承したViewGroupの子Viewにも使える。例えば、RadioGroupの子ViewであるRadioButtonにも使える。
LayoutInflaterを用いて追加するViewでは、inflater()の第二引数に親のLinearLayoutを指定することによって、layout_weightが有効に機能する。
DatePickerが勝手にカレンダー表示になる件

        android:calendarViewShown="false"
        android:datePickerMode="spinner"

この２文がいるようだ

つまりこんな感じ

    <DatePicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/datePicker"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:calendarViewShown="false"
        android:datePickerMode="spinner" />
brewでLTSのVersionのnodeをインストールする

普通に`brew install node`するとStable(現時点で5.0.0)のバージョンがインストールされてしまって、対応してないモージュールでエラー吐きまくるので、LTS版をインストールしたいです。

```
$ brew search node
homebrew/versions/node010         homebrew/versions/node08          node-build
homebrew/versions/node012         homebrew/versions/node4-lts       nodebrew
homebrew/versions/node04          leafnode                          nodeenv
homebrew/versions/node06          node                              nodenv
Caskroom/cask/mindnode-pro        Caskroom/cask/nodebox             Caskroom/cask/soundnode
Caskroom/cask/node-profiler       Caskroom/cask/nodeclipse
Caskroom/cask/node                Caskroom/cask/printnode
```

homebrew/versions/node4-ltsというのがあるので、それを使えば良さそうです。

```
$ brew install homebrew/versions/node4-lts
==> Installing node4-lts from homebrew/homebrew-versions
==> Downloading https://homebrew.bintray.com/bottles-versions/node4-lts-4.2.2.el_capitan.bottle.tar.g
######################################################################## 100.0%
==> Pouring node4-lts-4.2.2.el_capitan.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/node4-lts/4.2.2: 2738 files, 36M
```

確認してみます。

```
$ node -v
v4.2.2
```

ちゃんとLTSの最新版が入りました。
Google Drive APIを使うためのクライアントID等の取得

# はじめに
RubyでGoogle Driveを使いたいと思っていろいろ調べていたのだけど，最近Google Developers Consoleがだいぶ変わったらしく，巷にある情報が実情に合わなくなっているようなので，自分で少しまとめてみました．

# プロジェクト作成

[Google Developers Console](https://console.developers.google.com/)にアクセス．

左のサイドバーの「プロジェクトを作成」をクリック．

![createProject.PNG](https://qiita-image-store.s3.amazonaws.com/0/91537/bc30dde7-c4e5-e46d-500d-8920b9fbce9c.png)


適当な名前を付けて「作成」ボタンをクリック．

# Drive APIの有効化

作成後，作成したプロジェクトが選択された状態になっているはず．その状態で左のサイドバーの「APIと認証」をクリックして展開し，「API」をクリック．右側にAPIの一覧が出てくるので，「Google Apps API」から「Drive API」をクリックする．すると以下のようにページになるので，ここで「APIを有効にする」ボタンをクリック．

![enableDriveAPI.PNG](https://qiita-image-store.s3.amazonaws.com/0/91537/2c90d4de-7597-735c-cd7b-1aaad98c664a.png)


多くの情報では，さらに「Drive SDK」も有効にするように書かれているが，現在のGoogle Developers Consoleにはこの「Drive SDK」なるものが見つからない．

# クライアントID等の取得

次に左のサイドバーの「認証情報」クリック．右側の領域の左上にあるOAuth同意画面をクリックして，メールアドレス（デフォルトで入っているはず）と「Production neme shown to users」のところを入力する（他は省略可能）．保存ボタンをクリック．

![oauth2.PNG](https://qiita-image-store.s3.amazonaws.com/0/91537/f8f31fb1-fa74-bd3a-afba-817ae0dfb65d.png)


すると，右側の領域に以下の図のようなものが表示されるので「認証情報を追加」ボタンをクリックして，「OAuth 2.0 クライアント ID」を選択．

![clientID.png](https://qiita-image-store.s3.amazonaws.com/0/91537/915e082d-daf5-b0da-927b-66b068792424.png)


とりあえず，以下の図のようにその他を選び，名前を適当につける．ここも以前のものとだいぶ変わってしまっている．あとは「作成」ボタンをクリック．

![createClientID.PNG](https://qiita-image-store.s3.amazonaws.com/0/91537/cb0eb97b-9257-f20a-5f07-5fe61dd5855c.png)


これでクライアントIDとクライアントシークレットが取得できた．

# 最後に

巷にある情報では「Drive SDK」も有効化すると書いてありますが，見つからないのでやっていませんが，ちゃんとGoogle DriveにRubyからアクセスできました．

こうして，得たクライアントID等を使ってRubyからGoogle Driveにアクセスする方法は[[*Ruby*] RubyでGoogle Drive APIを使ってファイル一覧取得＆ファイルアップロード](http://qiita.com/cigalecigales/items/470e81c78cf3ef350b0c)が分かりやすいです．

但し，Windowsで上記のサイトのやり方で行うには，curl（[Windows - curl のインストール](http://web-develop.hatenablog.jp/entry/2015/10/18/214855)参照）をインストールする必要があります．

またWindowsのRubyではSSLの証明書関係のエラーが出るので，対処が必要です．対処法は上記サイトにコメント残しましたのでそれを参照してください．
gulp-ruby-sassでfont-awesomeをコンパイルしたら文字化けした件

# はじめに
**gulp-ruby-sassでfont-awesomeをコンパイルした時に、出力されるcssで文字化けする**という現象に遭遇しました。現象とその対処法をまとめてみたので、何かの役に立てば幸いです。なお普通のsassでのコンパイルでも同様に再現しました。

**対処法はスマートではない気もするので、もっとよい方法があればご教授ください！**

> 遭遇した環境は以下になります
> - windows7
> - gulp-ruby-sass": "^2.0.5",
> - sass 3.4.4

なお既にissuesに上がっているようです
https://github.com/sass/sass/issues/1395


# 何をしようとして、何が起こったのか

font-awesomeを使ったmixin()を作成しようと以下のようなコードを書いていました

```背景にアイコンを設定する.scss
@mixin bgFontAwesome($content) {
	font-family: FontAwesome;
	content: $content;
	/* ... */
}
.icon {
	&:before {
		@include bgFontAwesome($fa-var-android);
		// 変数はfont-awesome.scss内で既に↓のように定義
		// $fa-var-android: "\f17b";
	}
}
```

ところがコンパイルしてみると、`content`の中が文字化けしていました。
※ブラウザでは問題なくアイコンが表示されています（chromeでのみ確認）。

```コンパイルされた.css
.icon:before {
	content: "";
	/* ... */
}
```




# 色々試してみた
問題を抽出・整理するために色々と試してみました。

## 1. mixinをやめて直接変数を指定してみる

```1.scss
.icon:before {content: $fa-var-android;}
```

```1.css
.icon:before {content: "";}
```

**文字化けしてしまいました**


## 2. 変数をやめて直接文字列を指定してみる

```2.scss
.icon:before {content: "\f17b";}
```

```2.css
.icon:before {content: "\f17b";}
```

**正常にコンパイルされました！**


## 3. mixinの引数に直接文字列を指定してみる

```3.scss
.icon:before {@include bgFontAwesome("\f17b");}
```

```3.css
.icon:before {content: "";}
```

**文字化けしてしまいました**

## 4. エスケープを試してみる

```4.scss
// mixin側
@mixin bgFontAwesome($content) {
	content: #{$content};
}

// include側
.icon:before {@include bgFontAwesome(#{$fa-var-android});}
```

```4.css
// どちらの場合でも
.icon:before {content: ;}
```

**文字化けしてしまいました**

## 5. mixinの引数に`""`を使わないでみる

```5.scss
.icon:before {@include bgFontAwesome(\f17b);}
```

```5.css
.icon:before {content: \f17b;}
```

**正常にコンパイルされました**が、`""`で囲まれていないため、そもそも正常に表示されません。

## 6. 5に加え、mixin内で`""`を追加するようにしてみる

```6.scss
@mixin bgFontAwesome($content) {
	content: unquote("\"") + $content + unquote("\"");
}
.icon:before {@include bgFontAwesome(\f17b);}
```

```6.css
.icon:before {content: "\f17b";}
```

**正常にコンパイルされました！**

> `$fa-var-android: \f17b;` のように変数定義してやれば、引数に変数を渡しても動作しました

## 7. 引数に`""`を使う代わりにエスケープ`\`を外し、mixin内でエスケープを追加するようにしてみた

```7.scss
@mixin bgFontAwesome($content) {
	// 引数に \ を追加し、全体を "" で囲みなおす
	content: unquote("\"") + unquote(str-insert($content, "\\", 1)) + unquote("\"");
}
.icon:before {@include bgFontAwesome("f17b");}
```

```7.css
.icon:before {content: "\f17b";}
```

**正常にコンパイルされました！**





# 問題と対処法
`content`の値としてそのまま出力する分には問題なく、変数や関数などsassの機能を挟むと生じることが分かりました。font-awesomeだからというわけではなく、Asciiコードが含まれる時に再現すると考えられます。

> 理由については既出のissuesで議論がされているので、そちらをご覧いただければと思います・・・^^;

対処法としては上記6, 7が使えそうです。ですが6のように`""`を使用しないのは、バージョンによってエラーが出る気がしないでもないので、7の方が安心かもしれません。。（もちろん`unquote()`メソッド等が使える前提ですが）

ただし6, 7いずれにせよ、せっかくfont-awesomeで定義されている`$fa-var-android: "\f17b";`のような変数を使用しないか、もしくは再定義しなければなりません。これがスマートではないと述べた理由になります。





# 終わりに
というわけで、もっと良い案がある、もしくは何か勘違いしていることがあればご指摘いただけると幸いでごわす。
Xperia Z5 ADB interfaceの更新

この作業はググラビリティが低く初心者の私はかなり苦労したので
既存の情報に加えもう少し初心者向けに補足を書きます

インストールに際し
*Xperia A (SO-04E) の adb ドライバインストール方法
http://qiita.com/pik/items/88db97c4df5924c1cbeb
を参考にしました
<hr>
1.adbドライバを落としましょう

adbドライバはこちらから自分の機種に合ったものを選びます
以降、Z5以外もおおよそ同じ手順です
http://developer.sonymobile.com/downloads/drivers/

今回はXperia Z5のadbドライバなので
*Xperia Z5 driver
http://developer.sonymobile.com/downloads/drivers/xperia-z5-driver/
を選びましょう
*Download Xperia Z5 driver (14.23 MB)
をクリックしzipファイルをダウンロードします
<hr>
2.infの編集

編集する前準備として
*デバイスマネージャー
を開きましょう

スタートから「デバイスマネージャー」で検索すると出ます

<b>端末をUSBで接続した状態で</b>
その他のデバイスにある
*ADB interface
を見つけましょう
右クリックしてプロパティを開きます
上の詳細タブを選択するとデフォルトでは
プロパティ(p)の欄が「デバイスの説明」になっているのを
「ハードウェアID」に変えましょう
値の欄の表示が切り替わるので「<font color = "red">USB\VID_0FCE&PID_51D9&MI_01</font>」
をコピーしておきます
![20151114122618.png](https://qiita-image-store.s3.amazonaws.com/0/75309/2b66f3eb-8975-9621-b628-0e7dcd0fabd8.png)

それではダウンロードしたzipファイルを解凍しましょう
きっと中身はこんな感じ
![20151114121509.png](https://qiita-image-store.s3.amazonaws.com/0/75309/3d5ef4a4-8004-59ba-b0f7-9f07e625fbf9.png)

infファイルが２つあるのですが編集するのは
*sa0113adb.inf
です
エディタ等で開いてみましょう
編集する部分なのですが
*[AdbDevice.NTx86]
*[AdbDevice.NTamd64]
の部分にそれぞれ１行ずつ追加します
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
![inf.png](https://qiita-image-store.s3.amazonaws.com/0/75309/3ba42264-e4fb-3f74-8d63-15285347ec52.png)
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

追加する内容は
;Xperia Z5
%CompositeAdbInterface%     = USB_Install, <font color = "red">USB\VID_0FCE&PID_51D9&MI_01</font>

赤い部分が先程コピーした内容なので機種によって変わります
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
![inf2.png](https://qiita-image-store.s3.amazonaws.com/0/75309/72523712-d5b0-dba2-1619-e4dcddae52f2.png)
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

こんなふうになります

;（セミコロン)で始まっている部分はコメント扱いになるので
追加した場所や機種を忘れない程度にメモとして使いましょう

同じ作業を
*[AdbDevice.NTamd64]
にも行ってください。追加する内容は同じで構いません
それではファイルを閉じましょう
<hr>
3.ドライバーの更新
では更新を行います
先ほどのデバイスマネージャーを開きましょう
その他のデバイスにある
*ADB Interface
を右クリックしては次は
ドライバーソフトウェアの更新を開きます

コンピュータを参照してドライバーソフトウェアを検索します（R）を選択しましょう
参照場所は手順2で解凍したフォルダにあるXperia_Z5_driverを指定しましょう。
先ほど編集したinfファイルがあるフォルダです

そして[次へ]を押すとインストールが始まります。
更新が終了するとデバイスマネージャに
*Sony sa0113
と表示されていれば成功です
iTunesConnectに2015年11月に施された大きな改善

一昨日くらいに、iTunesConnectに、[What's New in iTunes Connect - WWDC 2015 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2015-302/) で発表された内容が反映されました。

ログイン周りが変わったことはけっこう気付いたのでは無いかと思います。
Fastlaneは数時間で対応していてさすがだなと思いました。
[Release 1.39.0 New Actions and Features · fastlane/fastlane](https://github.com/fastlane/fastlane/releases/tag/1.39.0)
> Updated spaceship to work with the new iTunes Connect login architecture

iOSアプリ開発者にはメールが来たと思いますが、けっこうスルーしちゃっている方も多そうなのでご紹介します。
原文はWebに無さそうだったので、メール検索するかWWDCのPDF見ると良いと思います。


# Provider Switching 

違うチームなどのiTunes Connectアカウントに同一メールアドレスを利用出来るようになりました :tada: 

<img width="652" alt="Screen Shot 2015-11-14 at 12.29.10 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/19398/38c89c66-b820-5960-6b05-958ddb680fec.png">


今までチームごとに一意のアドレスを入力しなければならず不便でしたが、とっても便利になりました。
~~Apple Dev Centerと似たような感じに、右上のこちらから切り替え可能です。~~
Apple Dev Centerは、ログイン直後にチームを選択しますが、iTunes Connectではスイッチがいつでも出来て便利です！

<img width="252" alt="Screen Shot 2015-11-14 at 12.29.42 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/19398/da390b7f-31bb-1a62-518f-32c5db66f265.png">


僕は、既存のバラバラになっているものを同じアドレスでまとめちゃおうかなと思います。

# App-Specific User Roles 

- アプリごとにロールを割り当て可能となりました
- あと細かいロールの追加・変更などあったようです

# TestFlight Updates 

TestFlight配信版の諸々の制約が緩和されました。
緩いに越したこと無いですね(　´･‿･｀)
個人的にはビルドの有効期限が60日に拡充されたのが嬉しいです。

<img width="962" alt="Screen Shot 2015-11-14 at 12.32.29 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/19398/3bc9699a-8d17-35dd-28cc-54c7fe09205b.png">


# Parallax Previewer and Parallax Exporter (Beta) 

tvOS向けに、以下が提供されました。

- [Parallax Exporter](https://itunespartner.apple.com/assets/downloads/ParallaxExporter_Apps.zip)
- [Parallax Previewer](https://itunespartner.apple.com/assets/downloads/Parallax%20Previewer.dmg)

# Sales and Trends Updates

Sales・Trendsが、Apple TV対応されたようです。
詳細: [iTunes Connect Sales and Trends Guide](http://help.apple.com/itc/appssalesandtrends/)

また[Reporter](https://itunespartner.apple.com/assets/downloads/Reporter.zip)が提供されました。
詳細: [Reporter and Autoingestion User Guide](http://help.apple.com/itc/appsreporterguide/)

レポートがコマンドラインで取得出来るようになりました :tada: 

例として、こんな感じでセールスレポートを取得するコマンドで、

```sh
# VENDAR_NUMBERは書き換え
java -jar Reporter.jar p=Reporter.properties m=Robot.XML Sales.getReport VENDAR_NUMBER, Sales, Summary, Daily, 20151112
```

このように、該当データ(txtのgzファイル)がダウンロードされました。
JSON形式のレスポンスなど期待していましたが、まあこれでも今までよりずっと良いですね（｀・ω・´）

```xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Output>     <Message>Successfully downloaded S_D_86276908_20151112.txt.gz</Message> </Output>
```

# New Shopping Category 

Shoppingカテゴリーが追加されました。
該当するアプリリリースしている場合は、カテゴリ変更など要検討ですね。
OpenCV3で画像キャプチャして顔検出してモザイク処理してから表示

http://qiita.com/yohhoy/items/313da1bbddb782fd3d7f で自分の顔がいきなり映ったときの精神的ダメージの軽減をもとめて。

```cpp:facemoz.cpp
#include <vector>
#include <string>
#include <iostream>
#include <opencv2/opencv.hpp>


cv::CascadeClassifier classifier;
const char * const file = "./haarcascade.xml";
cv::Size min_face;

//! initialize
void init(int w, int h)
{
    std::cout << "frame=" << w << 'x' << h << std::endl;

    if (!classifier.load(file)) {
        std::cout << "fail to load: " << file << std::endl;
        std::exit(1);
    }
    const double scale = 0.10;
    min_face = cv::Size(w * scale, h * scale);
    std::cout << "min_face=" << min_face << std::endl;
}

//! process image frame
cv::Mat process(cv::Mat& frame)
{
    std::vector<cv::Rect> faces;
    classifier.detectMultiScale(frame, faces, 1.1, 3, 0, min_face);
    for (const auto& r : faces) {
        // mosaic filter
        const double f = 0.05;
        cv::Mat tmp;
        cv::resize(frame(r), tmp, {}, f, f);
        cv::resize(tmp, frame(r), r.size(), 0, 0, cv::INTER_NEAREST);
        // draw area border
        cv::rectangle(frame, r.tl(), r.br(), {0,0,0});
    }
    return frame;
}

int main()
{
    const char * const window = "Capture (Press ESC to exit)";
    const double scale = 0.75;
    const int delay = 32;   // [msec]

    cv::VideoCapture cap(0);
    if (!cap.isOpened()) {
        std::cerr << "fail to open cv::VideoCapture" << std::endl;
        return 2; 
    }

    const double width = cap.get(cv::CAP_PROP_FRAME_WIDTH) * scale;
    const double height = cap.get(cv::CAP_PROP_FRAME_HEIGHT) * scale;
    cap.set(cv::CAP_PROP_FRAME_WIDTH, width);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, height);
    init(width, height);

    cv::namedWindow(window);
    cv::Mat frame;
    do {
        cap >> frame;
        cv::imshow(window, process(frame));
    } while (cv::waitKey(delay) != '\x1b');

    return 0;
}
```

```
$ brew install science/opencv3
...
$ clang++ -std=c++14 -W -Wall -O2 -o facemoz facemoz.cpp -I/usr/local/opt/opencv3/include -L/usr/local/opt/opencv3/lib -lopencv_core -lopencv_highgui -lopencv_videoio -lopencv_objdetect -lopencv_imgproc
$ cp /usr/local/opt/opencv3/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml haarsascade.xml
$ ./facemoz
```
設定アプリの各画面に一発で遷移するURLスキームを使ってSafariの検索エンジン設定画面を開いてみる

# 設定アプリを開く方法
定数のUIApplicationOpenSettingsURLStringをNSURLにしてopenURLを実行

```
@available(iOS 8.0, *)
public let UIApplicationOpenSettingsURLString: String
```
## Swift
```
if let url = NSURL(string:UIApplicationOpenSettingsURLString) {
    UIApplication.sharedApplication().openURL(url)
}
```
## Objective-C
```
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
```

## 実行
実行してみると設定 -> MyApp の画面が開く

# 本題
設定 -> MyApp の画面に遷移したところでできることが限られている。
本当にやりたいことは、設定アプリの各画面へ遷移させることです。
ex) 設定 -> 壁紙 に遷移し、画像を壁紙に設定してもらうなど。

## 方法
### URL Scheme 設定
Target -> Info -> URLTypes ->URL Schemes に **prefs** を設定
![](https://raw.githubusercontent.com/tochiba/images/master/test.png)

### 実装
画面に対応するスキームをNSURLにしてopenURLを実行
この場合は設定 -> プライバシー -> カメラ の画面を開く
#### Swift
```
if let url = NSURL(string:"prefs:root=Privacy&path=CAMERA") {
    UIApplication.sharedApplication().openURL(url)
}
```
#### Objective-C
```
NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy&path=CAMERA"];
[[UIApplication sharedApplication] openURL:url];
```

## Safariの検索エンジン設定画面を開いてみた
![](https://raw.githubusercontent.com/tochiba/images/master/Untitled.gif)

## スキーム例
- 一般 "prets:root=General"
- Wi-Fi "prefs:root=WIFI"
- ソフトウェアアップデート "prefs:root=General&path=SOFTWARE_UPDATE_LINK"
- プロファイル "prefs:root=General&path=ManagedConfigurationList"
- キーボード "prefs:root=General&path=Keyboard"
- 位置情報 "prefs:root=LOCATION_SERVICES"
- 通知 "prefs:root=NOTIFICATIONS_ID"
- TouchID "prefs:root=TOUCHID_PASSCODE"
- 壁紙 "prefs:root=Wallpaper"

他にもたくさんあるので検索かけるなり、pathがそのまんまなので推測すると面白い画面に遷移させることができるかもしれませんね。

## Sample Code
Safariの検索エンジン設定画面を開くサンプルでございます。
https://github.com/tochiba/OpenSettingApp

## さいご
公式な方法ではないと思うので、この方法を使う際は気をつけてください！
あと面白いスキームを見つけたら教えてください！
## 参考
- [swiftでSettingAppを開く方法](http://qiita.com/SatoTakeshiX/items/a2c82ad73a756ef461ae)
- [iOS8で復活した設定画面へのURLスキーム](http://qiita.com/Night___/items/3d689d657ee691d2cabe)
- [iOS Launching Settings -> Restrictions URL Scheme.](http://stackoverflow.com/questions/8246070/ios-launching-settings-restrictions-url-scheme)
Python3 + urllib + BeautifulSoupでネット上の情報を取得する

ウィキペディアのプログラミング言語一覧のページからプログラミング言語の名前とそのページヘのリンクを取得したのでまとめ。
このページ >> https://en.wikipedia.org/wiki/List_of_programming_languages

使ったものは「Python3, urllib, BeautifulSoup4」。

* Python 3.5.0 :: Anaconda 2.4.0
* BeautifulSoup4 4.4.1

まず、urllibを使って目的のページのHTML情報を取得。

```py
import urllib.request
html = urllib.request.urlopen('https://en.wikipedia.org/wiki/List_of_programming_languages').read()
```

Python2.x系と違い、Python3では`urllib.request`というパッケージを使用する。
`urllib.request.urlopen('<url>')`で指定したURLにアクセスした際のレスポンスに含まれるヘッダー情報なども取得できる。
今回は`read`メソッドを使いHTML部分だけを使う。

次に、このHTMLをBeautifulSoupにくわせてスクレイピングの準備をする。

```py
from bs4 import BeautifulSoup 
soup = BeautifulSoup(html, 'lxml')
```

BeautifulSoupのコンストラクタに`'lxml'`を渡している。
これは第1引数がどうゆうファイルかを記述しておかないとwarningが出るので指定している。（warningメッセージを見る限り、なくても動作する模様。）

今回ほしいのは、各プログラミング言語の名称とそのページヘのaタグのhrefの情報。
先ほどのリンクのソースコードを確認してみると、*multcolクラス属性のtableタグ内にあるli要素からaタグの部分を取ってくれば良さそう*ということがわかる。（ここは人力。）

BeautifulSoupでは、`findAll`メソッドにタグとクラスの指定を引数として渡せば、特定のクラスの付いているタグのみを一括で取得するということができる。

```py
tables = soup.findAll('table', class_='multicol') 
# 第一引数: 取得したいタグの指定、class_: クラス属性の指定
```

ここで、`findAll`メソッドで取得した場合、取得結果が`ResultSet`というまとまった形で取得される。この中の各要素を取得するには、インデックスを指定するかループを回す。

tableタグに含まれる要素が取得できたので、今度はtableタグの中身を確認する。
各プログラミング言語のリンクにアクセスするには、tableタグ内のli要素を取ってきて、その中のaタグの情報を見れば良さそう。

各table内にliタグが複数あるのでこれを`findAll`メソッドで取ってきたあとに、各li要素のaタグの情報を`find`メソッドで取ってくる。

```py
for table in tables:
	for li in table.findAll('li'):
		a = li.find('a')
		print("%s's url is %s" % (a.text, a.attrs['href']))
```

`findAll`メソッドの結果に対してループを回しに各要素にアクセスし、さらに`find`メソッドを使って特定のタグの情報に取得する。
`text`メソッドはタグの間に記述されている文字列（`<a>ここ！</a>`）を取得し、`attrs`メソッドはタグにつけられている属性の情報（attrs['href'] => `<a href='ここ！'>...</a>`）を取得する。

以上で、今回の目的の情報を取得することができた。