OmniAICreator/Qiita-1.07M huggingface dataset:
BluemixのNode-REDで、ラズパイにつないだTIセンサータグのデータを取り込む

手元のTIセンサータグのデータをBluemixを使ってビジュアルに表現してみました。
Bluemixの IoT FoundationとNode-REDと、Gitなどにあるサンプルプログラムを使ってわりと簡単に実現できたので、まとめておこうと思います。

###今回使用したもの###
- Raspberry Pi 2 model B
- Bluetoothドングル
- TI Sensor Tag CC2541
・・・もっと簡単に使えるCC2560というのが出ているようですが持っていないので。。。
- IBM Bluemix フリートライアル・アカウント

###データを発信する側：ラズパイ＋センサータグのセットアップ###
Bluez をインストールして、Bluetoothでラズパイとセンサータグと接続します。
こちらにまとまっていますので、リンクを掲載させていただきます。
[Bluez を使用したSensorTagへのアクセス](http://tomosoft.jp/design/?p=3978)

ラズパイとセンサータグの接続の確認ができたら、IoTF へデータを発信するプログラムをラズパイにインストールします。今回はセンサータグのデータをMQTTへパブリッシュする Node.js のプログラムがあったのでそれを使いました。
ということで、まずは Node.js をインストールします。
Node.js インストールもここにまとまっていますので、リンクを掲載させていただきます。
[node.jsのversionを管理するためにnodebrewを利用する](http://qiita.com/sinmetal/items/154e81823f386279b33c)
[Raspberry PiにNode.jsをインストールしてCylon.jsでLチカする](http://qiita.com/masato/items/399a3b6c22a109c579cc)

Node.js をインストールしたら、プログラムをGitからクローンします。
`$ git clone git://github.com/IBM-Bluemix/iot-sensor-tag`
このプログラムを動かすために、config.properties というファイルを作成し、publishディレクトリに置く必要がありますが、その設定は後ほど。
設定ファイルが作成できたら、publishディレクトリに移動してプログラムを起動します。
`$ node sensor-tag.js`

###データを受信する側：Bluemixでのデバイス接続###
Bluemixにログインします。アカウントがない場合は次のリンクから登録ください。少し時間がかかる場合があります。
[Bluemix フリートライアル サインアップ手順](http://ibm.biz/bluemixfree)

ログイン後、画面右上の表示が「地域：英国」となっている場合は、地域のところをクリックして「米国南部」に切り替えます。スペース名を要求されたら dev と入力します。
次に「カタログ」をクリックし、ずっと下までスクロールして「モノのインターネット」というサービスをクリックします。
![BM0001.PNG](https://qiita-image-store.s3.amazonaws.com/0/77971/8e2e26f8-c344-be17-add2-ddfef84128aa.png)
クリック後の画面で、次のようにして作成ボタンをクリックします。
- スペース名：デフォルトのまま
- アプリ：アンバインドのまま
- サービス名：日本語表記の部分をアルファベットで適宜変更

こうしてIoTサービスが起動しWelcome画面が表示されるので、左下の `Launch dashboard` をクリックします。-ここでデバイスを登録します。
次の画面の `Devices`タブをクリックし、`Add device`をクリックします。ここでdevice typeに CC2541 Sensor Tagと入力し、MACアドレスを入力します。 
`Continue`をクリックすると、登録したデバイスのプロパティが表示されるのでコピーします。

**重要** ここでメモっておかないと、後で参照できません。

コピーした内容を、ラズパイにクローンしたレポジトリのpublishディレクトリ内の config.propertiesファイルにペーストします。

    org = your Organization Code
    type = your device type id
    id = your device ID
    auth-method = token
    auth-token = yourAuthToken


###データを受信する側：Bluemixでのアプリのデプロイ###

Bluemixのカタログから「Internet of Things」のボイラープレートをクリックします。実行中にステータスが変わったら、用意ができたらアイコンをクリックし、Node-REDフロー･エディターを起動します。

次にWebSocket経由でデバイスのデータを受け取り、ブラウザに表示するプログラムを使います。
以下の手順にしたがってアプリを実装します。
[Node-REDを使ってセンサーデータをWebSocketで出力する](http://qiita.com/asmanabu/items/03fcced66fd850a10061)
この投稿にあるNode-REDサンプルの内容を、先ほど起動したIoTのフロー･エディターに貼り付けます。（Node-REDでデバイス･データをWebSocketに出力し、ここで実装したアプリで受け取る、という構造です）

アプリがデプロイできたら、上記投稿に記載のあるとおり、センサー･シミュレーターを使って動きを確認します。

センサー・シミュレーターでの稼動確認が終わったら、接続先をシミュレーターからセンサータグに変更します。
Bluemixのダッシュボードに移動し、「Internet of Things」ボイラープレートから作成したアイコンをクリックします。ここで、「＋サービスまたはAPIのバインド」をクリックし、デバイス接続時に作成した「モノのインターネット」サービスを選択してバインドします。

次にNode-REDフローエディター画面で、
1. IoT Sensor というラベルのついたノードの内容をIoT Foundationで登録した内容に変更
2. Create Message というラベルのついたノードで、センサータグのデータを出力するように変更 (Functionノードで出力として送るデータを整形します。)

以上で、WebSocket経由でセンサータグのデータを計器(メーター)のように表示できるようになります。あとは、メーター上限・下限や表示するラベルなど、Socketからデータを受け取るアプリのソースを適宜修正して、見た目をブラッシュアップします。
Javaで競技プログラミングするときの雛形(未完成)

```lang:Main.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.IOException;

public class Main
{
    public static void main(String[] args) throws NumberFormatException, IOException 
    {
	ContestScanner cs = new ContestScanner();
    }

}

class ContestScanner 
{
    private BufferedReader reader;
    private String[] line;
    private int idx;
 
    public ContestScanner() throws FileNotFoundException 
    {
	reader = new BufferedReader(new InputStreamReader(System.in));
    }
 
    public ContestScanner(String filename) throws FileNotFoundException 
    {
	reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
    }
 
    public String nextToken() throws IOException 
    {
	if (line == null || line.length <= idx) 
	    {
		line = reader.readLine().trim().split(" ");
		idx = 0;
	    }
	return line[idx++];
    }
 
    public long nextLong() throws IOException, NumberFormatException 
    {
	return Long.parseLong(nextToken());
    }
 
    public int nextInt() throws NumberFormatException, IOException 
    {
	return (int) nextLong();
    }
 
    public double nextDouble() throws NumberFormatException, IOException 
    {
	return Double.parseDouble(nextToken());
    }
}
```
How to place bid/ buyout on yahoo japan auction ? #ydnjp

I'm making a website which allow user to browse, bid and buy goods from yahoo japan auction. And I can't find any api for place bid or buyout. Now i'm using website automation to submit place bid or buyout but Yahoo always block my ip address.

Does yahoo provide any api for place bid or buyout ?

please help me. thank you

best regards
Map Siwapun Siwaporn
Ruby + JS の Web アプリでビルドした JS をコミットせずに Heroku へデプロイする方法

自分の Ruby 製の Web アプリでいつも JS ファイルをコミットして `git push heroku master` しているのがダサいのでやめたいなーと思い、やり方を調べてみた。

すごく簡単だったのでこれからは JS も提供するような Ruby の Web アプリケーションを提供するようなときには必ずこのやり方を使おうと思った。

## heroku-buildpack-multi

heroku のデフォルトでは 1 つのアプリに対して 1 つの buildpack しか使えないけど、[ddollar/heroku-buildpack-multi](https://github.com/ddollar/heroku-buildpack-multi) を使うと 2 つの buildpack を使い、node.js + gulp でクライアントサイドの JS をビルドし、ruby + rack でサーバーサイドの Web アプリを提供する、ということができるっぽい。

アプリを作るときに heroku-buildpack-multi を指定するか、

```bash
$ heroku create your-app-name --buildpack https://github.com/ddollar/heroku-buildpack-multi.git
```

すでに作成したアプリに設定を追加してもよい。

```bash
$ heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
```

で、`.buildpacks` ファイルに buildpack の Git URL を 1 行 1 つで書いておく。

```bash
$ cat .buildpacks
https://github.com/heroku/heroku-buildpack-nodejs.git
https://github.com/heroku/heroku-buildpack-ruby.git
```

## 試すためのアプリ

`gulp build` で `src/index.jade` から `public/index.html` を生成し、rack で `public/index.html` を提供するという最小限の構成で試してみた。

**Gemfile**

```ruby
source 'https://rubygems.org'
gem 'thin'
```

**config.ru**

```rb
use Rack::Static, urls: [''], root: 'public', index: 'index.html'
run Rack::Directory.new 'public'
```

**gulpfile.coffee**

```coffeescript
gulp = require 'gulp'
jade = require 'gulp-jade'

gulp.task 'build', ->
  gulp.src('./src/index.jade')
    .pipe jade()
    .pipe gulp.dest('public')
```

**src/index.jade**

```jade
doctype html
html
  head
    title hello
  body
    #app world
```

## Procfile

このやり方がいいのかはよく分からないけど、`Procfile` には下記のように書いてみた。

```yaml
web: gulp build && bundle exec thin start -p $PORT
```

こう書いておくと `heroku push origin master` するときにも `gulp build` が実行されるし、`heroku restart` でアプリを再起動するときにも `gulp build` が実行されるので、heroku の ephemeral filesystem でも `index.html` が消失してしまうという問題は起きなさそう。

うまく動いた例を [tily/testing-heroku-buildpack-multi](https://github.com/tily/testing-heroku-buildpack-multi) に置いておいた。

## 参考資料

* [Getting Started with Ruby on Heroku | Heroku Dev Center](https://devcenter.heroku.com/articles/getting-started-with-ruby-o "Getting Started with Ruby on Heroku | Heroku Dev Center")
  * $PORT
* [Dynos and the Dyno Manager | Heroku Dev Center](https://devcenter.heroku.com/articles/dynos "Dynos and the Dyno Manager | Heroku Dev Center")
  * ephemeral file system
  * Procfile に gulp build を書けば大丈夫なことを確認した
* [ddollar/heroku-buildpack-multi](https://github.com/ddollar/heroku-buildpack-multi)
* [Buildpacks | Heroku Dev Center](https://devcenter.heroku.com/articles/buildpacks)
* [ダメ男のブログ: Herokuのwebサーバをthinに変更する](http://edywrite.blogspot.jp/2012/08/herokuwebthin.html)
* [CoreOS のパブリックイメージをリリースしました！ : ニフティクラウド ユーザーブログ](http://blog.cloud.nifty.com/2756/)
* [React.js、やっと使えるようになった - ただのにっき(2015-04-18)](http://sho.tdiary.net/20150418.html#p01)
Elixir Mix.Configの使い方

データベースのユーザー名とパスワードなどの情報をハードコーディングしたくないときにconfig/config.exsファイルに保存するすることができる。ソースコードのなかで、`Mix.Config.read!("config/config.exs")`でファイルの中身を読み込む。

新しいプロジェクト`pro`を作成する

```
$ mix new pro
```

`pro/config/config.exs`ファイルの中に下の内容で保存する

```
use Mix.Config
config  :test_db1,
  username: "root",
  password: "123"

config :test_db2,
  username: "toor",
  password: "321"

```

`lib/pro.ex`ファイルの中に下の内容で保存する

```
defmodule Pro do

  def main() do

    # config.exsファイルの中の設定を取得する
    conf = Mix.Config.read!("config/config.exs")

    IO.inspect conf[:test_db1][:username]
    IO.inspect conf[:test_db1][:password]
    IO.inspect conf[:test_db2][:username]
    IO.inspect conf[:test_db2][:password]
  end
end
```

実行する

```
$ mix run -e "Pro.main()"
"root"
"123"
"toor"
"321"
```

これで設定ファイルconfig.exsの設定は取得することができた

下のリンクを参照して、Mix.Config.read!を使うことが分かる

http://stackoverflow.com/questions/23897199/how-to-read-config-files-on-elixir-mix-project
クライアント版 Hyper-V を使って、外部から直接アクセスできないように仮想マシンを作る

# tl;dr

Windows 8 以降の Pro 以上なら使えるクライアント版 Hyper-V で外部から直接アクセスできないように仮想マシンを増やします。


# Motivation

会社で使ってると、社内の DHCP 使うと、他の人から見えるところに仮想マシンが増えてしまって、ちょっとテストでローカルに仮想マシン立てたいだけなのに、面倒な社内ルールに巻き込まれたりしそうで、いろいろアレなので、会社から割り当てられている Windows の開発機の中からだけアクセスできるような状態で仮想マシンを作っていきたい。
VirtualBox とかだと個人利用じゃないと、ライセンス料かかるとかあるし、ライセンス料かかると、社内の ~~クソ面倒くさい~~ 手続きｶﾞｰみたいになるので、Windows 8 以降の Pro 以上ならデフォルトで使えるクライアント版 Hyper-V でがんばる方向で。
会社での利用なら、普通は Pro 以上で入ってるはず。
あと、ﾃｹﾄｰにググると、外部スイッチ使った例ばっかり出てくるので、今回メモることにした。


# Hyper-V を有効にする

デフォルトだと無効になっているので有効化します。
UAC 昇格した PowerShell で

``` ps1
Enable-WindowsOptionalFeature –Online –FeatureName Microsoft-Hyper-V
Restart-Computer
```


# Hyper-V のスイッチ作る

UAC 昇格している PowerShell で

``` ps1
New-VMSwitch -Name InternalSwitch -SwitchType Internal
```

マウスポチポチ派なら、仮想スイッチマネージャで画像のような感じで作成。

![virtual-switch-manager-of-hyper-v.png](https://qiita-image-store.s3.amazonaws.com/0/24596/39565968-21d5-b59a-5137-64d333999167.png)


# スイッチをインターネットにつなげる

コントロールパネル＞ネットワークとインターネット＞ネットワークと共有センター＞アダプターの設定と変更 でインターネットに繋がっているアダプターを右クリックして、プロパティ開いて、「ネットワークのほかのユーザーに、このコンピューターのインターネット接続をとおしての接続を許可する」にチェックいれて、プライベート ネットワーク接続の選択で、さっき作った Hyper-V の仮想スイッチを選択する。

![share-internet-connection.png](https://qiita-image-store.s3.amazonaws.com/0/24596/84625614-deaa-e3f1-5b8c-919935283c5e.png)

この設定をすると、Hyper-V の仮想スイッチに 192.168.137.1 が割り当てられて、これが DHCP とかの役割をやってくれるみたい。
DHCP だけど、これを使った仮想マシンの IP アドレスは、めったに変わらないから、たいして困ってないけど、名前解決できると良さそう。
固定 IP にはできないって、どこかに書いてあった気がする。
`/etc/hostname` に、 `foobar.mshome.net` とか書いておくと、mDNS(?) で名前解決できて、ssh するときに便利だった。


# 仮想マシンを作る

仮想マシン新規作成ウィザードに沿って作成します。
個人的に変更しているところは、

* 動的メモリの使用にチェック
* ネットワークは、さっき作った内部スイッチを使う。
* 第2世代にして仮想マシン作成後に、セキュアブートを無効にしてから起動（セキュアブート無効にしないと起動に失敗する？（調べてない

インストールする Linux の設定とかは、それっぽくやっておいてください。
というか、仮想スイッチの設定だけやっておけば、割と自動で設定してくれる（投げやり
会社で使う場合は、プロキシの設定とか必要な気がするので、その辺の設定とかはやっておいてください。


# 終わりに

これで、ローカルに Linux 等の仮想マシンをモリモリ作れるので、サーバは *nix てきな何かなのに、開発環境が Windows で辛いということも減りそうです。


# 参考リンク

* [Use PowerShell to Create Virtual Switches - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs](http://blogs.technet.com/b/heyscriptingguy/archive/2013/10/09/use-powershell-to-create-virtual-switches.aspx)
* [Windows PowerShell: Hyper-V 仮想マシンを作成する](https://technet.microsoft.com/ja-jp/magazine/jj933287.aspx)
ansible-playbookのYAMLを読みやすくする工夫

Ansibleは勉強中の身なので初歩的な内容かもしれませんが、チュートリアルを見ていて気になったので。

## なるべくYAML構文で書く

モジュールのオプションをfoo=varみたいに書いている例をたまに見かけますが、横に長くなって読みにくいように思います。
YAMLの「>」(folded block構文)を使えば改行もできますが、そこまでやるなら素直にYAMLの構文で書いた方がいいと思いました。（素のYAMLの方がansible以外のプログラムでも扱いやすくなりますよね）

### before

```yaml
- name: configure sshd_config
  lineinfile: dest=/etc/ssh/sshd_config owner=root group=root mode=0600 backup=yes regexp="{{ item.regexp }}" line="{{ item.line }}" insertafter="{{ item.insertafter }}"
  with_items:
    - regexp: '^PasswordAuthentication'
      line: 'PasswordAuthentication no'
      insertafter: '#PasswordAuthentication'
```

### after

```yaml
- name: configure sshd_config
  lineinfile:
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: "0600"
    backup: yes
    regexp: "{{ item.regexp }}"
    line: "{{ item.line }}"
    insertafter: "{{ item.insertafter }}"
  with_items:
    - regexp: '^PasswordAuthentication'
      line: 'PasswordAuthentication no'
      insertafter: '#PasswordAuthentication'
```

## shellモジュールは「|」とargsで分解

たぶん一番お世話になる？[shellモジュール](http://docs.ansible.com/shell_module.html)は、shell: にシェルスクリプトの文字列を直接渡すスタイルなので、ちょっと変則的です。YAML記法にしたいなら、argsオプションを使います。

また、YAMLの「|」(literal block記法)を使うことで、複数行のシェルスクリプトもそのまま書くことができます。
「"」も「'」もシェルスクリプト中では多用するので、YAML上ではシェルスクリプトの文字列自体はクオートしない方がよいと思います。

### before

```yaml
- name: なにか実行
  shell: echo hoge >> somelog.txt; echo foo; echo baa chdir=somedir/
```

### after

```yaml

- name: なにか実行
  shell: |
    echo hoge >> somelog.txt
    echo foo
    echo baa
  args:
    chdir: somedir/
```
kobito-cli


自分用のマークダウンメモは kobito に蓄積していたのだけれど、
html 化する必要が出た。
で、kobito => html で一番簡単そうなのが、[kobito-cli](https://github.com/suin/kobito-cli)
pdf 化やら、なんやらあるけど自分の必要なとこだけメモ

##インストール
brew で。

```shell-session:
$ brew tap suin/suin
$ brew install kobito-cli
```

##アイテム登録
```shell-session:
$ kobito link foo.txt
```

foo.txt を新規エントリーとして登録し、kobito(GUI) 上で表示。
標準入力[^1]でも登録可能なので、`open -a Kobito foo.txt` より便利。
[^1]: パイプ経由とか。

##html 出力
###スタイルシートなどのコピー
```shell-session:
$ pwd
/PATH/TO/html
$ cp /Applications/Kobito.app/Contents/Resources/*{.css,.js} .
```

###出力

```shell-session:
$ kobito ls
# 登録アイテムの番号確認
$ kobito html 42 > 42.html
# アイテム番号 42 番を html 化
```
Perl：サブルーチンをOptionalみたいに異なる引数で呼びたい

（問）
１、２、３を渡すと６が返ってくる
１、２を渡すと３が返ってくる

```pl:hoge.pl
use strict;
use warnings;
use utf8;
use 5.014;

my $result;

# 引数３つ
$result = hoge(1, 2, 3);
print $result, "\n"; # result = 6

# 引数２つ
$result = hoge(1, 2);
print $result, "\n"; # result = 3

sub hoge {
    my ($a, $b, $c) = @_;

    my $result = 0;
    $result += $a if defined $a;
    $result += $b if defined $b;
    $result += $c if defined $c;

    return $result;
}

1;
```


**@_** は受け取った引数を順番に格納していく
引数を無作為にしたい場合や変数名を指定したい場合は使えない

Maybeを使った方法もある
spray-clientでBASIC認証


spray-clientでBASIC認証のかかっているサーバにアクセスする。
ひらたく言えば、sendReceiveする前にBASIC認証のヘッダを加えればよい。

addCredentialsという関数で加えられる。

```scala
var pipeline = addCredentials(BasicHttpCredentials("bob", "secret")) 
~> sendReceive
```

~> 演算子は RequestTransformerを結合できるようだ。

sendReceveは非常にHTTPアクセスするシンプルな関数な模様。
`spray.http.HttpRequest -> scala.concurrent.Future[spray.http.HttpResponse` な関数。
RequestをいれるとResPonseがでてくる的な。

あとは GET とか POST とかで HttpRequest を作成してpipelineに渡してあげたら実際のリクエストが発生するようだ。

```scala
pipeline(Get("/"))
```

正直なんとなくしかわかっていない。

# 参考

http://spray.io/documentation/1.2.2/spray-client/#simple-spray-client
ターミナル接続できない仮想マシンでシングルユーザーモード作業するには

クラウドだVPSだということで、実は増えているんじゃないかと思うのが **シングルユーザーモードで作業できないサーバー** なんですよ。

シングルユーザーモードって「ランレベル1」のこと。`root`さんがひとりログインしてるだけで、ほかには誰も入ってないし、よけいなプロセスも当然動いてない状態。ネットワークも落としてる感じ。したがって、サーバー実体のターミナル画面で操作する状態です。

でも、一部のVPSを除くとターミナル画面なんて提供されていません。すべての作業はリモートから`ssh`でおこなうのがふつうですね。でも`sshd`はマルチユーザーモード（ランレベル3以上）で動作している。困ったな…。

なにがしたいかというと、某金髪クラウドのインスタンスで、ハードディスクが足りなくなって…。

````shell
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        29G   24G  3.9G  86% /
````

ﾋｨ…。
`/var` 以下が膨らみすぎやねん…。
これを解決するには、

1. 新たなディスクを追加する（これは各業者の指示どおりで）
2. 新たなディスクを一時マウントする
3. `/var` から新たなディスクに内容をコピーする
4. 新たなディスクを `/var` として `fstab` を書き直してリブート（かなんか）

とするしかない！

問題は3番。
シングルユーザーモードじゃないと、`/var` 以下はヘンなデーモンのファイルやあれこれがうごめいているので、 **コピーしても不完全になってしまうかもしれない。** でもシングルユーザーモードにはできない…。

実は解決方法はかんたん。
CentOS 6.xの場合だけれど、**`network` と `sshd`サービスをランレベル1でも動作させる** だけ！

たとえば、ふつうは…

````shell
# for i in network sshd; do chkconfig --list $i; done
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
````

こんなんだけど、とりあえず `--level 1` で `on` にしてみましょう。

````shell
# for i in network sshd; do chkconfig --level 1 $i on; done
# for i in network sshd; do chkconfig --list $i; done
network         0:off   1:on    2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:on    2:on    3:on    4:on    5:on    6:off
````

それではシングルユーザーモードに落ちてみます。その前に3点：

* むりに `sudo` 使わないで `root` で作業しましょう（たぶん）
* `screen` などを使っている人は閉じたほうがいいと思います
* `Docker` 使ってる人は以下のように、自前で先にコンテナをすべて消してください。なぜかランレベルを変えてもコンテナは落ちてくれません…

````shell
# docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
````

ということで、ここまで来たらランレベル1の世界へGo！

````shell
# telinit 1
````

`ps` して、あんまり重要そうなプロセスが残ってなければ成功でしょう。

````shell
# ps auxww | grep '[^]]$'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.0  19356  1636 ?        Ss   20:04   0:00 /sbin/init
root       396  0.0  0.0  10868   972 ?        S<s  20:04   0:00 /sbin/udevd -d
    :
````

ということで心置きなく `/var` 以下のコピーを開始！

````shell
# mkdir -p /mnt/tmp-var
# mount /dev/sdc1 /mnt/tmp-var
# cd /var
# find . -print | cpio -pdmua /mnt/tmp-var
````

…時間かかるなあ。
終わったら、念のため、

````shell
# mv /var /var.old
````

してから、`/etc/fstab` に以下を追記して、

````shell
/dev/sdc1  /var  ext4  defaults  0 0
````

リブートしてやればいいかな？
そうそう。後始末で、

````shell
# for i in network sshd; do chkconfig --level 1 $i off; done
# for i in network sshd; do chkconfig --list $i; done
network         0:off   1:off    2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off    2:on    3:on    4:on    5:on    6:off
````

しておくのと、気がすんだら `/var.old` を消しておきましょう。
では、また。あでゅー。
PHPでのDTO作成時のgetter,setterについて

PHPのDTOを作ってる時にgetter,setterで何か効率的な方法は無いかと模索していたら、こうなった。

とりあえずIDEでの恩恵が受けられることが必須だったので、それぞれのメンバ変数に共通のメソッドを追加した。

まずは一般的なDTOから

#一般的な定義
```php
/**
* setterとgetter通常バージョン
*/
class DTO {
  private $title;
  private $comment;

  public function getTitle() {
    return $this->title;
  }

  public function getComment() {
    return $this->comment_num;
  }

  public function setTitle($title) {
    $this->title = $title;
  }

  public function setComment($comment) {
    $this->comment = $comment;
  }
}
```

何度見ても冗長ですね。

次はちょっと工夫したバージョン
以下を参考にしました。
http://qiita.com/mikakane/items/00c798964f7c2c122e7d
#工夫バージョン
```php
/**
* setterとgetter工夫バージョン
*/
class DTO {
  private $title;
  private $comment;

  public function title($value = null) {
    if(is_null($value)){
      return $this->title;
    } else {
      $this->title = $value;
    }
  }

  public function comment($value = null) {
    if(is_null($value)){
      return $this->comment;
    } else {
      $this->comment = $value;
    }
  }
}
```
dnsmasq:内向けサーバー（Aterm）

まずdnsmasqをインストール
`# yum -y install dnsmasq`（インストールされているかもしれない）

**resolv.conf**を編集
```# vi /etc/resolv.conf
nameserver 127.0.0.1`となるように編集

**dnsmasq.conf**を編集
```# vi /etc/dnsmasq.conf
no-dhcp-interface=p2p1```を追記

**hosts**を編集
`# vi /etc/hosts
 192.168.11.100 hogehoge.hoge`を追記（IPはサーバーを指定）

dnsmasqを起動・登録
`# systemctl start dnsmasq
 # systemctl enable dnsmasq`

AtemrのDNSルーティングに登録
宛先ドメイン名:hogehoge.hoge
ゲートウェイ:192.168.11.1
プライマリDNS:192.168.11.100
Mac OS X (yosemise)でBurp Proxyを使ったWi-Fi 透過型Proxyを作る

# やること
Mac OS X (yosemite)で、Burp Proxyを使ったWi-Fi 透過型Proxyを構築する。

# 目的
burp proxyのよくある使い方説明は、通常のFoward Proxyとして、クライアント側でProxyとしてBurpを利用するように設定して利用している。けどスマホ（iOSやAndroidなどなど）の脆弱性試験とかだと、いちいち設定するの面倒だし、そもそもProxy設定が出来なかったり無視したり（Androidとか）するで不便だったりする。

透過型とすることで、強制的に全てBurpを通すようすることが出来る。


# 構成
Mac を無線LAN APとして、無線APにきたhttp(s)通信を全てBurpにリダイレクトさせる

```
device ---> mac[ wifi --PFでリダイレクト--> burp --> ether ] ---> internet
```


# 必要な物

* Burp Proxy : http://portswigger.net/burp/proxy.html
* 無線LAN IFと、有線LAN IFの両方（Mac Bookなら、USBかThunderboltのEthernetアダプタ）

# 使う物

* ネットワーク共有
* PF : http://ftp.tuwien.ac.at/.vhost/www.openbsd.org/xxx/faq/pf/ja/index.html


# 設定
## 無線LANアクセスポイント化する
ネットワーク共有でWiFiを共有する

1. 有線LANをつないでおく
1. システム環境設定 -> 共有 -> インターネット共有 で
    1. 共有する接続経路を有線LANのポート（USB Ethernetなど）
    1. 相手のコンピュータが使用するポートをWi-Fi
    1. Wi-Fiオプションを設定。（セキュリティなしだと接続され放題になる）
        1. セキュリティを WPA2パーソナル
        1. 	パスワードを設定
    1. インターネット共有にチェック

## Burp Proxyを起動する
1. Burp Proxy を起動する
    * 本例では 127.0.0.1:8080
1. invisible に設定する
    * Proxy -> Options -> Proxy Liseners -> Edit -> Request handling -> Support invisible proxying をONにする


## PFを使ってポートフォワーディングする
※yosemite未満の場合にはipfwでフォワーディングする。詳細は省略

PFを使う前に、IPフォワーディング許可の設定をする

```
% sudo sysctl -w net.inet.ip.forwarding=1
```

Burp Proxyを127.0.0.1:8080で起動。ネットワーク共有のBridgeがbrige100 の場合
（on bridge100 を省略してしまって全部のインターフェースを対象にしちゃっても動くので困らなければそれでもOK）

PFの設定ファイルを作る

```text:pf_transproxy_8080.conf
rdr on bridge100 inet proto tcp from any to port 80 -> 127.0.0.1 port 8080
rdr on bridge100 inet proto tcp from any to port 443 -> 127.0.0.1 port 8080
```

実行する

```
% sudo pfctl -ef pf_transproxy_8080.conf
```

これで、ネットワーク共有にきたport 80, 443 宛のTCPパケットは全て、Burp Proxy にフォワードされるようになる

なおPFの設定確認は

```
% sudo pfctl -sn
```

でできる

## 使う
これで共有している無線LANアクセスポイントにつないだ端末からのhttp, httpsアクセスは全てBurp Proxyを通るようになるので、あとは焼くなり煮るなりする。



# 検証環境構築で参考にした情報

* Windowsを無線LANアクセスポイントにする http://www.atmarkit.co.jp/ait/articles/1005/27/news096_2.html
* Max OS X を無線LANアクセスポイントにする : http://weekly.ascii.jp/elem/000/000/136/136392/
* Linuxでの透過型Proxyの構築 : http://blog.tokumaru.org/2013/09/cookie-manipulation-is-possible-even-on-ssl.html
* Mac OS XでのWiFi透過型Proxy : http://lucumr.pocoo.org/2013/1/6/osx-wifi-proxy/
* Mac OS X でのポートフォワーディング : http://serverfault.com/questions/97117/how-do-i-enable-ip-forwarding-in-macos-x
* ipfwとPF : http://riatw.me/blog/vagrant_on_yosemite.html
* PF : http://ftp.tuwien.ac.at/.vhost/www.openbsd.org/xxx/faq/pf/ja/index.html



# 最後に
色々調べて作ったけど、、、、
mitmproxyには公式ドキュメントに方法が載っていた、、、orz
http://docs.mitmproxy.org/en/stable/transparent/osx.html
AWS EC2インスタンスをPV形式からHVM形式に変換する（≒t1からt2に移行する）

# 参考URL
1. [EC2のt1.microをt2.microへ移行する](http://www.agilegroup.co.jp/technote/t1micro-to-t2micro-migration.html)
手作業でPV -> HVMへの変換を行う方法<br>

2. [AWSで仮想化方式 PV(paravirtual) の既存 CentOS AMIを HVMにする](http://qiita.com/cs_sonar/items/21dbb3462708e146a426)
1の作業手順をベースに、少し改変を加えたもの
シンボリックリンク追加のところが一番のミソ

3. [PV-&gt;HVM変換ツール pv2hvm.rbを試してみた](http://dev.classmethod.jp/etc/pv2hvm-rb/)
・Rubyスクリプトに変換作業を代行してもらう方法
・2015-05現在では、`sudo gem install aws-sdk --no-ri --no-rdoc`のところは、aws-sdkのv1を明示してインストールする必要があることに注意（参考：[AWS SDK for Ruby V2](http://qiita.com/ryo0301/items/08a2a0451ab8d568b8b0)）
・色々と問題が起きた（ルートデバイス名とブロックデバイス名を合わせないと動かない等）ため採用しなかった

4. [EC2編～PVインスタンスからHVMインスタンスに移行してみた～](http://recipe.kc-cloud.jp/archives/7071)
1と3の概念の違いについて説明したページ

# 変換手順
1. 旧インスタンスのAMIを作成する（バックアップ用）
2. 旧インスタンスにgrubをインストールする<br>
`sudo yum install grub`
3. 旧インスタンスのルートデバイスEBSからスナップショットを作成する
4. 3で作成したスナップショットからボリュームを作成する（PV vol）
5. 新規ボリュームを作成する（HVM vol）<br>
※HVM volは、PV volより1GB大きいサイズで作成する方がいい（同サイズだと、後に実行するddコマンドが容量不足で途中終了してしまう可能性がある）
6. 作業用インスタンスを用意し、 **インスタンスを起動してから** PV volとHVM volをアタッチする<br>
※起動前にアタッチしてしまうとPV volからOSが立ち上がってしまう可能性があるので注意<br>
※デバイス名は参考URLに合わせて、PV volを/dev/sdm、HVM volを/dev/sdoとする
7. 作業用インスタンスにSSHログインして、 [AWSで仮想化方式 PV(paravirtual) の既存 CentOS AMIを HVMにする](http://qiita.com/cs_sonar/items/21dbb3462708e146a426) の「パーティションを作成してディスクをコピー」から「chrootを抜けてアンマウント」までの作業を実施<br>
※chroot先での`yum install -y grub`は、こちらの環境では/dev配下に必要なファイルがない的なエラーが出て失敗した（そのため手順2で先にインストールしている）<br>
※lnでシンボリックリンクを作る際、/etc/grub.confや/boot/grub/grub.confが既に存在していると怒られるので、その場合はそのファイルをrmしてからlnする<br>
※menu.lstの編集の際、もしkernel行のroot=部分がLABEL=/以外になっていたらLABEL=/に直すこと<br>
※fstabの編集は、1行目の1番目がLABEL=/以外になっていたらLABEL=/に直すだけでいいと思われる
8. PV volとHVM volをデタッチして、後者のスナップショットを作成する
9. 8で作成したスナップショットからAMIを作成する<br>
このとき「仮想化タイプ」は「ハードウェアアシストの仮想化」を選択する
10. 9で作成したAMIから新インスタンス立ち上げ
11. 新インスタンスの動作確認
12. 作業用インスタンス、PV vol、HVM volの削除

# 参考知識書き殴り
AWSは仮想化を実現する上でXenというソフトを使っていて、PVやHVMというのは、このXenにおける仮想化実装方式のこと

ざっくり言うと、PVはカーネルやらブートローダのことをあまり気にしなくていい（AWS側が用意したものを使える）が、HVMは物理サーバ同様すべてを自前で賄う必要がある（だからgrubのインストール作業等が必要になる）
詳しくは [仮想化方式(HVM と PV)についてまとめ](http://kanny.hateblo.jp/entry/2014/01/19/182759) を参照

Linuxの起動の流れ
電源入れる→BIOS起動→BIOSがブートローダを呼び出す→ブートローダがカーネルを呼び出す→カーネルが/sbin/initを実行することで色々サービスが起動する

ブートローダの代表格がgrubで、grubの設定ファイルは/etc/grub.confないし/boot/grub/grub.conf

/etc/grub.conf, /boot/grub/grub.conf, /boot/grub/menu.lstの内容は同一（シンボリックリンクにしておくことが多いっぽい）
同じ内容のファイルが複数あるのは歴史的経緯によるものらしい

OSが起動したとき、どのデバイスをどこにマウントするかについての設定ファイルが/etc/fstab

/etc/fstabにおけるデバイスの指定方法は以下の3種類
1. /dev/xvda1のようにデバイスファイル名を直接書く
2. LABEL=/のようにラベル名を指定する（ラベル名はe2labelコマンドで確認・設定可能）
3. UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26のようにUUIDを指定する
GitHubでIPython Notebookがレンダリング表示されるようになった!

ありがたや!

Project Jupyterのブログに以下のような記事が載りました。

[Rendering IPython notebooks on GitHub:](http://blog.jupyter.org/2015/05/07/rendering-notebooks-on-github/)

GitHubの中でもIPython Notebook(正確にはJupyter)のノートブックがレンダリングされて表示できるようになりました。これまではnbviewerで見ていたものも、その場でさっと見ることができるようになったので、便利になりましたね。

ただ、現在のところまだ問題があって、レンダリングスピードが遅いことと、プレゼン表示には対応していないこと、数式の表示が崩れる問題があります。しかしこれらはすぐ改善されることかと思いますし、Jupyterを使うことの利点はどんどん大きくなっていっているように思います。

これを期にIPython Notebook、Jupyterを使ってみてはいかがでしょうか??
URLのステータスコードをチェックするmunin 自作プラグイン

## ことのはじまり

muninのプラグインで指定された、URLのhttpステータスコードを返すプラグインって無いかなー？って探していたのですが結局なかったので自作してみようと試みて、はや一週間・・・・。いろいろなサイトを参考にしましたが、詳しくは、muninのページへというのが多くでリンクをたどるとすべて英語だったのでかなり苦戦した結果・・・できた・・いや、中途半端な気もするけど、できたよお。。ってことでソースを公開したいと思います。記述してよくわからんことがあったので、とりあえず入れてみました的な部分が多いのですが、好きになおしてくださいませ。

## ソース

チェックしたいURLはいっぱいあり、それごとに、プラグインを作成するのも、なんかかっこわるかったので、ワイルドカードプライグインっぽい形で作ってみました。

* /usr/share/munin/plugins/url_status_

```bash

# cat /usr/share/munin/plugins/url_status_                                                             
#!/bin/sh                                                                                                                              

#%# family=auto
#%# capabilities=autoconf suggest

_url=`basename $0 | sed 's/^url_status_//g' | sed 's/--/\//g'`

if [ "$1" = "autoconf" ]; then

  _CNT=`rpm -qa | grep -i "^curl" | grep -v grep | wc -l`

  if [ $_CNT -eq 0 ]; then
    echo no
  else
    echo yes
  fi

  exit 0

fi

if [ "$1" = "config" ]; then
  STAT_WARNING=300
  STAT_CRITICAL=400
  echo "graph_title URL Status ${_url}"  
  echo 'graph_args --base 1000 -l 0' 
  echo 'graph_vlabel status_code' 
  echo 'graph_category http_status' 
  echo 'graph_info http status code.' 

  echo 'http_status.label status' # value
  echo 'http_status.draw AREA' # (AREA or STACK or LINE2)
  echo "http_status.warning $STAT_WARNING"
  echo "http_status.critical $STAT_CRITICAL"
  echo 'http_status.info http status.' 

  exit 0
fi

_wait=1
_retry=3
_err_cnt=0

  for X in `seq ${_retry}`; do
    _htstat=`curl -k -LI ${_url} -o /dev/null -w '%{http_code}' -s `

    sleep ${_wait}

    if [ "$_htstat" -gt "400" ] ; then
      _err_cnt=`expr ${_err_cnt} + 1` 
    else
      if [ "$_htstat" -eq "000" ] ; then
        _htstat=999
        _err_cnt=`expr ${_err_cnt} + 1` 
      fi
    fi

  done

  echo -n "http_status.value "
  echo $_htstat 

exit 0
```

## 利用方法

前述の通り、ワイルドカードプラグインっぽいことをやっております。たとえば、http://www.google.co.jp/intl/ja/about のhttpステータス監視をしたい場合は、以下な感じでエイリアスをはってくれればと思います。

```bash
# cd /etc/munin/plugins
# ln -s /usr/share/munin/plugins/url_status_ url_status_www.google.co.jp--intl--ja--about
```

なんか、/をファイル名に使うのが、若干面倒臭かったため、/の部分に関しては--にするようにしました。
なので
http://www.google.co.jp/intl/ja/about
は
www.google.co.jp--intl--ja--about
になるイメージですね。

シンボリックリンクを張り終わったら、munin-nodeを再起動します。

```bash
# /etc/init.d/munin-node restart
```

あ、とりあえず動くか確認してみましょうか・・・うまくいっている感じっす

```bash
# munin-run url_status_www.google.co.jp--intl--ja--about
----
http_status.value 200
```
メタプログラミングruby DSL編のメモ


DSL の完成品の前段階で、そもそもの　DSL 文を　ruby が拾えるようになる瞬間
---


```ruby
# オブジェクトの能力値の判定する DSL文 を作る。
# 最初は判定オブジェクトの存在さえも気にせずに書き下してよい。

def dsl_sample()
  # watchman も setup も作っていなくても、あとから環境を与えられるのが ruby。
  watchman "you are tough" do
    @strength > 100
  end
  watchman "you are feeble" do
    @strength < 50
  end
  watchman "you are rapid" do
    @agility > 100
  end
  watchman "you are slow" do
    @agility < 50
  end
  watchman "upper limit" do
    @level > 20
  end
  watchman "lower limit" do
    @level < 5
  end
  setup do
    @strength = 80
    @agility = 120
  end
  setup do
    @level = 30
  end
end

# 適当に作った、watchman, setup を動かす。すべてのブロックは、環境（ローカル変数、インスタンス変数、self）が与えられて動くので、それを後から自在に与えればよい。

# 無駄な名前空間汚染を防ぐ。
lambda {
  # ファイルの読み込み後、全 DSL を格納する配列とハッシュを用意する。あとで適切な実行行うため。
  setups = []
  events = {}

  # def キーワードを使わないことが、スコープゲートの回避
  Kernel.module_eval do
    # setup と watchman を拾うために、Kernel にメソッドを作る。setups と events に格納したいのでスコープゲートを回避する define_method を使う。
    define_method :setup do |&block|
      setups << block
    end
    define_method :watchman do |event_name, &block|
      events[event_name] = block
    end
  end
}.call

dsl_sample() # 動く！DSLのブロックは実行されていない。
```


任意の each 文を実装する場面
---


event毎に調査していき、「環境」を新しく作り setup をかまして、調査したい場合、以下のようなメインコードになったとする。Cleanroom 技術を使っている。

```ruby

each_event do |event_name, event|
  environment = Cleanroom.new
  each_setup do |setup|
    environment.instance_eval(&setup)
  end
  puts event_name if environment.instance_eval(&event)
end

```

each_event と each_setup を動かすために Kernel の define_method を追加する。

```ruby

lambda {
  setups = []
  events = {}

  Kernel.module_eval do
    define_method :setup do |&block|
      setups << block
    end
    define_method :watchman do |event_name, &block|
      events[event_name] = block
    end
    # スコープに setup が渡るようにする。
    # block.call setup を作れば、第１引数に setup が渡ってくる。
    define_method :each_setup do |&block|
      setups.each do |setup|
        block.call setup
      end
    end
    # 第１引数に イベント名、第２引数にイベントProc が渡ってくるようにする。
    define_method :each_event do |&block|
      # すでに Proc が渡ってくるので、& は不必要
      events.each_pair do |entry_name, event|
        block.call entry_name, event
      end
    end
  end

  class Cleanroom
  end
}.call

```
AとBのブランチを比べてAブランチにしかないコミットを探したかった

合わせてどうぞ

- [指定のブランチやタグの間でマージされたプルリク一覧表示する one-liner](http://qiita.com/luckypool/items/e16e5e57fe9c592c112b)

----

たとえば `master` と `development` というブランチがあったとする。

- `development` にモリモリさぶんをいれる
- `master` に merge するようにプルリクする
- ある程度差分が固まったら `master` にいれる

としたとき、

```
*   6b9fcd6 (HEAD, master) Merge branch 'development'
|\
| * 62cb795 (development) bbb
* | bd6bfb1 add hogehoge
|/
* 45bcdd0 aaa
* ec6985e Add README.md
```


マージしたタイミングで、`master`にしか入っていないコミットがいつのまにやらできていた。

`development` ブランチは基本的に `master` と根っこは一緒でいたいのに。
なので、単に `development` に `master` を merge すればいいだけの話。
プルリクだせば差分もみれるしね :)

けど、なんのコミットが入っていないのかを調べたい気持ちがあった。

そこで [git rev-list](http://git-scm.com/docs/git-rev-list) の `--no-merges` オプションをつけて確認できる

```
$ git rev-list --no-merges development..master
bd6bfb14a3a973d8063eabf436ed8675a3c49b90
```

`xargs git show -q` とかパイプでくっつけても良いかも。

以上。
FOAM Frameworkを使ってみる その1


FOAMという新しいJavaScriptのMVCフレームワークが出てきたようです。

どこで出てきたのかあまり良くわかっていませんが、僕は[Front-end Dev Weekly](https://frontenddevweekly.curated.co/issues/53)で知りました。

ちょっと本題から逸れますが、僕はFront-end Dev Weeklyを毎週日本語に翻訳して、公開しています。
よかったら[こちら](http://front-end-dev-weekly-jp.github.io/)からどうぞ。


本題に戻ります。

[github.io](http://foam-framework.github.io/foam/) 
[github](https://github.com/foam-framework/foam)

Google（の中の人？）が開発したみたいです。 
調べてみようと思いましたが、日本語の情報はおろか、英語の情報すら上記の公式ページ以外はあまり出てきませんでした。

ちょうど上記の公式ページにTutorialがあるのでそれをやってみようと思いましたが、ただ自分でやるのもアレなので、 
日本人に向けての情報発信の意味も込めて、日本語に翻訳しつつやってみようと思います。

まぁそれは明日以降に置いておいて、今日は説明のページを翻訳していきたいと思います。 
僕自身もFOAMフレームワークについて全く理解してないので、翻訳しながら理解していきたいと思います。 
もし何か間違いやおかしい点などありましたら、コメントを頂けると幸いです。 
原文は[github.io](http://foam-framework.github.io/foam/)の `FOAM is` から始まる文章で、 
ライセンスは[こちら](https://github.com/foam-framework/foam/blob/master/COPYRIGHT)に準拠します。

以下翻訳

--- 

FOAMはJavaScriptで書かれたオープンソースのモデリングフレームワークです。 
FOAMを使用すると、他の言語や環境に書き換えたりコンパイルすることが可能な高レベルのモデルである、ドメイン固有言語 (DSLs)を作成することができます。 
現在、FOAMはエンティティやクラス、パーサ、アニメーション、データベースクエリ、インタラクティブなドキュメント、 
そして最も重要な、新しいDSLsのためのDSLsをサポートしています。

FOAMは、それ自身がFOAMでモデル化された小さなMVCライブラリを使用することでDSLsのためにテキストやHTMLやグラフィカルなビューをサポートしています。 
このライブラリはモデル化されたJavaScriptのアプリケーションからも使用できます。

このMVCライブラリの特徴は、Functional Reactive Programmingを使った、簡易で動的な値のバインディングです。 
それは、アニメーションや、統一されたcanvasやDOMのビューモデルやコンポーザブルなデータアクセスオブジェクトを強くサポートします。

FOAMは解決策を高くて、簡易なレベルで表現することを可能にして、開発者の生産性を高めます。 
このMVCライブラリは効率的なデータバインディングやキャッシング、クエリ最適化のメカニズムによってアプリケーションのパフォーマンスも高めます。 
端的に言うと、FOAMは開発者とアプリケーションの両方をさらに効率的にするのです。

詳細は[Aboutページ](http://foam-framework.github.io/foam/about/)をご覧ください。

---
以上翻訳

何か分かったような分からないような感じですが、
どうやらAboutページがあるようなので、[次の記事](http://qiita.com/tako-black/items/6e5613867135215a67f2)ではAboutページを翻訳しようかと思います。
Karabinerの__KeyOverlaidModifier__の使い方を覚えた


## __KeyOverlaidModifier__とは
* 任意のキーを修飾キーとして利用できる機能
* 「s」を押している間だけ、「hjkl」が「←↓↑→」になる、とかできる
* `__SimultaneousKeyPresses__`との違いは、上の例で言えば「sを押したままh連打」が「←連打」になること
	* `__SimultaneousKeyPresses__`で「sとh同時押し」を「←」に割り当てても「←hhhhh...」になってしまう

## 使い方
* ある`item`要素内で`__BlockUntilKeyUp__`を記述し、「定義した修飾キーを押している間」のみ有効なリマップを定義する
	* `hidden="true"`プロパティを与えることで、これ自体は設定画面に表示されず、また常に有効になる
	* 子要素の`identifier`に`vk_config="true"`プロパティを与えることで、別の`item`から参照できる
* 別の`item`要素内で、任意のキーを、蒸気の`item`を参照する修飾キーに割り当てる

## 最初から入っている例
* 設定画面のチェックボックス一覧にある、「Simple Vi Mode v2」が該当する
	* コード：[Karabiner/vi_mode.xml at 9950919eb7fc6fe631b61cf8acdc409aa93ed6f4 · tekezo/Karabiner](https://github.com/tekezo/Karabiner/blob/9950919eb7fc6fe631b61cf8acdc409aa93ed6f4/src/core/server/Resources/include/checkbox/vi_mode.xml)
	* 「Simple Vi Mode v2」が「notsave.simple_vi_mode」を参照している
* コピペして適当にキーを書き換えたら好みの組み合わせで使える

## 応用
### `__KeyOverlaidModifier__`の書き方
* そこだけ取り出すと以下のようになっている。

```xml
    <autogen>
      __KeyOverlaidModifier__
      KeyCode::S, ModifierFlag::NONE, <!-- 対象キーコンビネーション -->
      @begin <!-- 修飾キーとしての（ホールド時の）送信されるキーコンビネーション -->
      KeyCode::VK_CONFIG_SYNC_KEYDOWNUP_notsave_custom_vi_mode,
      @end
      @begin <!-- 通常の（プッシュ時の）送信されるキーコンビネーション -->
      KeyCode::S
      @end
    </autogen>
```

* `__KeyOverlaidModifier__`は、厳密には、あるキーの「通常動作」と「修飾キーとしての動作」を、**それぞれに**指定する機能だと言える。

### 修飾キー「のみ」を複数パターン用意する
* 例えば、**「aまたはs」を押している間だけ、「hjkl」を「←↓↑→」にする**にはどうすればよいか？

```private.xml
<?xml version="1.0"?>
<root>
  <item>
    <name>Custom Vi mode</name>
    <identifier>remap.custom_vi_mode</identifier>
    <autogen>
      __KeyOverlaidModifier__
      KeyCode::S, ModifierFlag::NONE,
      @begin
      KeyCode::VK_CONFIG_SYNC_KEYDOWNUP_notsave_custom_vi_mode,
      @end
      @begin
      KeyCode::S
      @end
    </autogen>
  </item>
    <autogen>
      __KeyOverlaidModifier__
      KeyCode::A, ModifierFlag::NONE,
      @begin
      KeyCode::VK_CONFIG_SYNC_KEYDOWNUP_notsave_custom_vi_mode,
      @end
      @begin
      KeyCode::A
      @end
    </autogen>
  <item hidden="true">
    <identifier vk_config="true">notsave_custom_vi_mode</identifier>
    <autogen>
      __BlockUntilKeyUp__ KeyCode::S
    </autogen>
    <autogen>__KeyToKey__ KeyCode::H, KeyCode::CURSOR_LEFT</autogen>
    <autogen>__KeyToKey__ KeyCode::J, KeyCode::CURSOR_DOWN</autogen>
    <autogen>__KeyToKey__ KeyCode::K, KeyCode::CURSOR_UP</autogen>
    <autogen>__KeyToKey__ KeyCode::L, KeyCode::CURSOR_RIGHT</autogen>
    <autogen>__KeyToKey__ KeyCode::F, KeyCode::FN</autogen>
  </item>
</root>
```

* `notsave_custom_vi_mode`が、ふたつの`item`から参照されていることに着目して欲しい。
	* `__BlockUntilKeyUp__`は一種類しかないんだけどね？　よくわからないね。
* 上記の`__KeyOverlaidModifier__`の指定方法を踏まえると、「a」をホールドしたときは「左コマンドキー」も押されてることにする、とかもできる。
git pullやgit fetchをしようとしたらエラーが出るとき

# 現象
gitでリモートブランチをチェックアウトしようとしたら下記エラー。

```vim:
$ git fetch && git checkout mybranch1

error: Unable to append to .git/logs/refs/remotes/origin/mybranch2: ????????
From bitbucket.org:user1/myrepository
! 6aa2ddf..28743b7 mybranch2 -> origin/mybranch2 (unable to update local ref)
error: Unable to append to .git/logs/refs/remotes/origin/mybranch3: ????????
! 9b502e2..5c229bd mybranch3 -> origin/mybranch3 (unable to update local ref)
```

# 原因
.git/logs/refs/heads
.git/logs/refs/remotes

ここにあるファイルへの書き込み権限が無い。

# 対処
.git/logs/refs/heads
.git/logs/refs/remotes

ここのファイルの中で、エラーで名前が挙がっているブランチ名のファイルの権限をchownコマンド等で変更する。
（この場合はmybranch2とmybranch3）  

または、権限のあるユーザーになってからgitコマンドを実行する。
swiftでlibharuをつかい、リソースにあるttfフォントをpdfに埋め込むとき



```swift
 var fontname:String="MS-Gothic"
 if let path:NSString=NSBundle.mainBundle().pathForResource("hogeFont", ofType:"ttf"){
     let cchr:UnsafePointer<CChar>=path.cStringUsingEncoding(NSUTF8StringEncoding)
     if let name=String.fromCString( HPDF_LoadTTFontFromFile(_pdf, cchr, HPDF_TRUE) ){
         fontname=name
     }else{
         println("埋め込みフォント名が不明")
     }
 }else{
     println("埋め込みフォントが見つからない")
 }
 let fontJp = HPDF_GetFont(_pdf, fontname, "90ms-RKSJ-H")//sjis
 HPDF_Page_SetFontAndSize(_currentPage, fontJp, a_fontSize)
```
LibgdxのPoolを使ってみた。（オブジェクトの使い回し）

#概要
new しては　消して、 new しては　消してを繰り返すとgcがいっぱい走って遅くなってしまう！
そんなあなたにはぴったりの解決方法があります。
Poolを使って一度作ったオブジェクトを使い回そう！

#実際のユースケース
たとえば、武器の弾を実装するとき、「発射のときにnewして、ヒットしたら削除する　」みたいにつくるけど、
違いは座標以外だけで動作は同じだし、数は多いし、作っても数秒できえてしまう、はかなきオブジェクトを
うまいこと速度を落とさずうまい方法はないか・・。

#Pools
Libgdx側でPoolsが用意されていて、簡単に利用できます。
newしたときは直接つくらず、Pools.obtain(Class)でnewInstaceを作ってもらいます。
Classは引数なしのコンストラクタがないとダメかも。
そうするとPool内にそのインスタンスが登録されます。
弾がヒットした時など不必要になった時は、freeでもうつかってないよって教えてあげます。
そうすると次回Pools.obtain(Class)でnew Instanceを作る際はfreeの中のオブジェクトが返されて
新たにnewされません。(freeなものがあれば・・・。)

ただし、対象Classには、Pool.Poolable のインターフェイスの実装が必要です。
/** Resets the object for reuse. Object references should be nulled and fields may be set to default values. */
resetの時には不必要なメンバー変数をnullなどで参照をはずしましょう！
使いまわされたときに、変な挙動しないように。

```Pool.java
abstract public class Pool<T> {
	/** Objects implementing this interface will have {@link #reset()} called when passed to {@link #free(Object)}. */
	static public interface Poolable {
		/** Resets the object for reuse. Object references should be nulled and fields may be set to default values. */
		public void reset ();
	}
}
```


#使用例

(本家より一部改変)

```java:Bullet.java
public class Bullet implements Poolable {

    public Vector2 position;
    public boolean alive;

    /**
     * Bullet constructor. Just initialize variables.
     */
    public Bullet() {
        this.position = new Vector2();
        this.alive = false;
    }


    /**
     * Callback method when the object is freed. It is automatically called by Pool.free()
     * Must reset every meaningful field of this bullet.
     */
    @Override
    public void reset() {
        position.set(0,0);
        alive = false;
    }

   //act(float delta)とかで玉の動きとか実装するけど割愛。最小限のみ
}
```

利用側

```java:Unit
public class Unit {

　　//弾を打つ
   public Bullet shoot(){
      return Pools.obtain(Bullet.class);
   }
　　//弾があたった時
     public void hit(Bullet bullet){
       Pools.free(bullet);
   }
}

```

#資料

- 本家:Memory management : https://github.com/libgdx/libgdx/wiki/Memory-management
- Pools リファレンス : http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/Pools.html
[Metal] 半透明の処理（Blending）


Metalでブレンディングをする方法をメモ。

`MTLRenderPipelineDescriptor`のプロパティにある`MTLRenderPipelineColorAttachmentDescriptor`の値を適切に設定することで、様々なブレンディングができます。

ちなみに値についてはこちら（[Translucency and Transparency in Metal](http://metalbyexample.com/translucency-and-transparency/)）を参考にしました。



```metal
MTLRenderPipelineColorAttachmentDescriptor *colorAttachment = pipelineStateDescriptor.colorAttachments[0];
colorAttachment.blendingEnabled             = YES;
colorAttachment.rgbBlendOperation           = MTLBlendOperationAdd;
colorAttachment.alphaBlendOperation         = MTLBlendOperationAdd;
colorAttachment.sourceRGBBlendFactor        = MTLBlendFactorSourceAlpha;
colorAttachment.sourceAlphaBlendFactor      = MTLBlendFactorSourceAlpha;
colorAttachment.destinationRGBBlendFactor   = MTLBlendFactorOneMinusSourceAlpha;
colorAttachment.destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
```

一般的なアルファブレンディングは`OneMinusSourceAlpha`を利用します。

式は以下のようになります。

```math
C_f = \alpha_s \times C_s + (1 - \alpha_s) \times C_d
```

$._s$となっている部分は`source`の`s`です。
$._d$となっている部分は`destination`の`d`、つまりブレンド対象の色、ということになります。
*（`C`はColorの`C`です）*

式を見てもらうと分かるように、計算の要が$\alpha_s$となっているのが分かると思います。今まさにレンダリングしようとしている色のアルファ値が、最終的な色に影響を与えているわけです。
式でもOneMinusAlpha（$1 - \alpha_s$）となっていますね。

そしてそれらを適切に表現した設定が上記のもの、ということになります。

ちなみにこちらの記事（[Cocos2d-x で BlendFunc](http://wonderpla.net/blog/engineer/cocos2d-x-BlendFunc/)）が色々なブレンディングについて書かれていました。
*（内容はCocos2d-xのものですが、基本的な考え方はどれも同じです）*
Redis Clusterメモ


## はじめに

[Redis cluster tutorial](http://redis.io/topics/cluster-tutorial#creating-and-using-a-redis-cluster)を読んだときのメモ。

## 雑多なメモ

* Redisのクラスタは、以下の機能を提供する。
	* 複数のノード間でデータセットを自動的に分割する。
	* ノードが障害に直面したり残りのクラスタと通信できなくなったときに、操作を継続する。
* ただし、マスターノードの大部分がダウンしているような状況では、Clusterは停止する。
* 二つのTCPポートを使用する。一つは、クライアントとの対話のための通常のポート、もう一つはノード間のクラスタバス通信で使用する。
	* クラスタバス通信は、誤り検出や、設定更新などの目的で行う。
	* クライアントとの対話のためのポート番号が`6379`の場合、クラスタバスのポートは`16379`となる。
	* オフセットは`10000`固定である。
* Redisクラスタは、一貫性のあるハッシュは使わないが、ハッシュスロットと呼ばれるシャーディング形式を使う。
* ハッシュスロットは、`16384`個ある。
* ノードは、簡単に追加や削除が可能である。
* ノードを削除する場合は、削除するノードのハッシュスロットを他のノードに割り当てることにより、削除することが出来る。
* ダウンタイム無しに、ノードの操作することができる。
* `ハッシュタグ`と呼ばれる概念を使うことにより、複数キーを強制的に同じスロットに割り当てることが出来る。
	* ハッシュタグとは、`{}`で囲まれた部分文字列である。
	* 例えば、`this{foo}key`と`another{foo}key`は、同じハッシュスロットに割り当てられることが保証される。
* マスターノードの一部が落ちたり、大部分のノードと通信できなくなったとき、継続して利用できるように、Redisクラスタは、マスタースレーブモデルを利用する。全てのハッシュスロットは、1（マスターノード）からN（スレーブノード）のレプリカを持つ。
	* 例えば、マスター`B`のスレーブを`B1`とすると、`B`が落ちた場合、B1がマスターに昇格する。
	* ただし、`B`と`B1`が同時に落ちた場合は、処理を継続することはできない。
* Redisクラスタは、強い一貫性を担保することは出来ない。つまり、特定の条件において、Redisクラスタは書き込みに失敗する。それは、非同期レプリケーションを利用するためである。
	* 例えば、あるデータのスレーブへの書き込みが失敗し、その後、そのスレーブがマスターに昇格した場合は、そのデータは永遠に失われる。
	* 速度と一貫性のトレードオフである。どうしても同期書き込みを使いたい場合は、`WAIT`コマンドを使う。
Circle CI で Swift 1.2 を Quick でテストする [2015/5/8]


Circle CI 上で Swift 1.2 をビルド、Quick でテストする手順をまとめました。

流れとしてはこんな感じです。全部 circle.yml に記述します。

1. CicleCI 上で実行する Xcode のバージョンを 6.3 に指定
1. Quick, Nimble を取得
1. テスト実行

## 1.CicleCI 上で実行する Xcode のバージョンを 6.3 に指定

Swift 1.2 が用いられたプロジェクトをビルドするには Xcode6.3系が必要です。
現在の Circle CI のデフォルトの XCode は 6.1系かなにかでそのままではビルドできないので指定します。

```circle.yml
machine:
  xcode:
    version: "6.3.1"
```

参考
https://circleci.com/mobile/ios

## Quick, Nimble を取得

Swift のテストフレームワークの Quick, Nimble を git submodule で追加して開発している場合、
テストする前に github から落としてくる必要があります。

circle.yml の checkout 時に実行します。

```circle.yml
checkout:
  post:
    - git submodule sync
    - git submodule update --init # use submodules
```

## テスト実行

Circle CI のテスト実行は [xctool](https://github.com/facebook/xctool) が使われていますが、
Quick などのフレームワークをうまくロードできないようです。

### xctool でテストを実行した時のエラー
```
━━━━
Failed to query the list of test cases in the test bundle: 2015-05-08 14:51:23.603 sim[1317:6502] /Applications/Xcode-6.3.1.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/sim: No simulator devices appear to be running.  Setting data directories to /var/empty.
2015-05-08 14:51:23.604 sim[1317:6502] DYLD_INSERT_LIBRARIES contains possible bad values.  Caller beware: /usr/local/Cellar/xctool/0.2.2/libexec/lib/otest-query-lib-ios.dylib
dlopen(/Users/distiller/Library/Developer/Xcode/DerivedData/app-ajcxbdyabbxjdehfvjcyhjeozxbd/Build/Products/Debug-iphonesimulator/appTests.xctest/appTests, 1): Library not loaded: @rpath/Nimble.framework/Nimble
  Referenced from: /Users/distiller/Library/Developer/Xcode/DerivedData/app-ajcxbdyabbxjdehfvjcyhjeozxbd/Build/Products/Debug-iphonesimulator/appTests.xctest/appTests
  Reason: image not found
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

そこでテスト実行時は xcodebuild で実行します。

```circle.yml
test:
  override:
    -  xcodebuild -workspace "app.xcworkspace" -scheme "schema_name" -sdk "iphonesimulator" test 

```
Swiftのクロージャについて


GWを利用してSwiftの勉強をしたので、覚え書きとしてまとめてみました。

## Swiftでのクロージャの書き方

基本の書き方は下記のような感じ。

``` swift
// 仮引数・戻り値あり
{
	(hoge: String) -> String in 
	// 何かすごい処理
}

// 仮引数・戻り値なし
{
	() -> Void in
	// 何かすごい処理
}

```

## クロージャを引数とした関数を定義する場合

クロージャを引数とした関数を定義する場合は、下記のように書きます。

``` swift
func extract(list: [String], filter: String -> Bool) -> [String] {
	var sel = [String]()
	for s in list {
		if filter(s) {
			sel.append(s)
		}
	}
	return sel
}
```

### 接尾クロージャについて

末尾引数にクロージャを指定した関数を呼び出す際、カッコ書きを省略できます。

これを接尾クロージャ(Trailing Closure)というらしいです。

``` swift

var an = ["TSUBUAN", "DAMEAN", "TSUBUAN"]
let shiko_no_an: [String] = extract(an){
    if $0 == "TSUBUAN" {
        return true
    }
    return false
}

// ["TSUBUAN", "TSUBUAN"]
shiko_no_an

```

Swiftはやりたいことが直感的に書けて、素敵ですね!

心の底からOSSになってほしいです...

2015/12/09 追記
OSSになりましたね！
ActiveDirectory で管理されているユーザーの情報を取得する

まずはシンプルに、ドメインユーザーでログインしている場合に、表示名を条件にメールアドレスを取得する C# のサンプルコードです。

System.DirectoryServices.dll を使います。
![参照の追加.png](https://qiita-image-store.s3.amazonaws.com/0/40622/adbe5719-bed6-8cd5-8235-3f2c1d9bad2e.png)


```csharp
var directoryEntry = new System.DirectoryServices.DirectoryEntry();
var directorySearcher = new System.DirectoryServices.DirectorySearcher(directoryEntry); //引数を渡さなくてもいいかも

var displayName = "山田太郎"; // 「*」をワイルドカードとして使える

directorySearcher.Filter = String.Format("(&(objectClass=user)(DisplayName={0}))", displayName);

var result = directorySearcher.FindOne();
// null -> 該当 user が見つからない

var entry = result.GetDirectoryEntry();

var mailAddress = (string)entry.Properties["mail"].Value;
// "" -> mail が登録されていない
```

アカウント名で検索する場合は
`DisplayName` を `samAccountName` に変えればいいです。

アカウント名と表示名を OR で検索したい場合は、
`DisplayName={0}` を `|(samAccountName={0})(DisplayName={0})` にすればいいです。

逆にメールアドレスがわかっている場合は
 `DisplayName={0}` を `mail={0}` にすればいいです。

問い合わせ先のドメインを指定する場合は、
`directoryEntry.Path = "LDAP://hoge.co.jp";`
のように指定すればいけるようです。

このあたりは、 LDAP で検索をかけるといろいろ情報が出てきます。
（が、体系的にまとまった解りやすいサイトは見つけられませんでした）

メールアドレス以外の情報も `entry.Properties` に含まれているので
応用してみてください。
DMM.com英会話フットボール好き講師メモ




以前フィリピンのレナ先生という20代前半のキュートな女の講師とサッカーの話しが合って
やたら楽しかったので継続してた。
いろいろあってサボっていたが、もう一度勉強のやる気を出すために、フットボールの助けを借りてみる。
そういえば英会話の勉強を始めたのは、「プレミアの(ひどく下品な意味の）チャントが聞き取れるようになりたい」という理由だった。
目的に近づいていこう。


Rooney
http://eikaiwa.dmm.com/teacher/index/4029/

My name is Rooney , Rooney is nick name. Because i teach english for children, they say i looks like Rooney . Do you think so?

自己紹介でいきなりルーニーと呼ばれる理由を説明してくれる.
ウェイン・ルーニーを知らない人には「は？」だと思うが、
そもそもこれだけ講師がいてフィルタリングできる仕組みになってるので、
よっぽどの事がないかぎり迷子は来ないと思うのでノープロブレム ！



Andy G
http://eikaiwa.dmm.com/teacher/index/2791/
未履修
マンチェスターユナイテッドのファン。
だいぶ前から「お気に入り登録」してるが予約の枠が空いていた事がない。
イケメンだしな.. 

Marko M
http://eikaiwa.dmm.com/teacher/index/5005/
未履修。
セルビア。
チェルシーのファン。
どことなくバイエルンのラームに似ている.


Edin
http://eikaiwa.dmm.com/teacher/index/2695/
未履修
ボスニアヘルツェゴビナ、エディン、というとジェコが真っ先に浮かぶが、
似ていなくもない。



なんか気づきがあったら足します.
chefをEC2上で使いたいんやぁぁぁぁ

どこを見てもどこを見てもMac+Vagrant
####Mac+Vagrant \\(><)/

なんでじゃぁぁぁぁぁぁ
Mac持ってますけど。。。違うんや。わしはAWS上で全部完結させたいだけなんや・・・
Macの容量がゴニョゴニョ・・・

***
今回はchef-soloを使ってみました。
構成としてはworkstation/nodeをec2インスタンスでやってみます。

workstation/Node
AMI:AmazonLinux
インスタンス：t2micro
SG:ssh/http/https

***
###Chef-solo導入
（コピペしやすいようにするため＃や$は省略して書いています）

```:workstation(c2-user)
curl -L https://www.opscode.com/chef/install.sh | sudo bash
/opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc
```

＜説明＞
１行目は公式サイトからchef本体をインストールするためものも。
ec2−userなんで｜で渡す時sudo書いてあげないと怒られます。
２行目AmazonLinux使ってるのでRubyなんかは標準でインストールされとりますが、Chefをインストールするとrubyが付いてきます。そっちのRubyを使ってKnifeをインストールするためChefをインストールした/opt/chef/以下のgemを使っています。
>普通に『gem insatll knife-solo』でインストールした時は御術のリポジトリ作成でムリィィィィって言われました。なぜか・・・余力があったら調べます。

*Node用インスタンスの秘密鍵をworkstationインスタンスに格納します*
自分はわかりやすいように
`~/.ssh/`に格納しました。

```:workstation(c2-user)
knife configure
knife solo prepare ec2-user@<NodeインスタンスのpublicIP> -i [格納した秘密鍵のフルパス]
```

＜説明＞
kinfe configureはなんか色々聞かれますがとりあえずエンターぱぱぱーん！って押下すれば良いです。
２行目はNodeにChefをインストールしてくれます。このコマンド打たないで公式からSDK持ってきて自分でやっても良いです。

####リポジトリを作成します

```:workstation(c2-user)
cd ~
knife solo init <好きなリポジトリ名>
```

＜説明＞
こうするとホームディレクトリにレポジトリが作成されます。

```:workstation(c2-user)
cd <レポジトリ名>
knife cookbook create <好きなクックブック名> -o cookbooks
```

＜説明＞
作成したリポジトリの中に移動します。
移動しないと今自分がいる場所にクックブックが作成されてしまうので注意しましょう。
２行目はクックブック作成のコマンドです。
−oでどこに書き出すかを指定しています。お作法的に cookbooks の中に入れるようなのでそうしています。

以下のようにファイルを編集します。
今回は試しにhttpd、mysql,mysql−serverをインストールしてみました。

vi cookbooks/<クックブック名>/recipes/default.rb

```:default.rb
["httpd","mysql","mysql-server"].each do |pkg|
  package "#{pkg}" do
    action :install
  end
end
```

＜説明＞
Rubyで内容を記述していきます。自分のRuby力はドットインストールを流し見ただけなので深く突っ込んではラメェ・・・勉強します。

リポジトリの中のnodeを見てみるとNode用インスタンスのIPから始まるファイルができているのでそいつを編集します

vi ~/<リポジトリ名>/nodes/******.json

```:******.json
{
  "run_list" : [
    "recipe[<クックブック名>]"
  ],
  "automatic" : {
    "ipaddress" : "<Node用インスタンスのpublicIP>"
  }
}
```

＜説明＞
recipeに自分でつけたクックブックの名前を書いてください。

###これで準備完了！調理を開始します！

```:workstation(c2-user)
cd ~/<リポジトリ名>
knife solo cook ec2-user@<Node用インスタンスIP> -i [秘密鍵のフルパス]
```

＜説明＞
ちゃんとリポジトリの中にいないと実行時にみつからねぇぞ！？って慌てられます。
移動すれば解消するはずです。

これでいろいろなログが出てきてちゃんと動いているのが確認できれば成功です！
さらにもう一回実行してみてください。先ほどインストールが完了しているので今度は何も実行されません。*べき等性！マーベラス！*

ファイルの編集とかRubyの書き方だとかまだまだ問題山積みですが、とりあえず操作をすることができました。
千里の道も一歩から。自動化のはじめの一歩と思ってこれから勉強していきたいと思います。


***
今回参考にしたサイト
http://ch.nicovideo.jp/dwango-engineer/blomaga/ar322283
http://hivecolor.com/id/126
SQLServerでゼロパディング(2012以降)

SQLServer2012以降で追加された[FORMAT関数](https://msdn.microsoft.com/ja-jp/library/hh213505.aspx)を利用することでゼロパディングできます。

例えば4桁0詰したい場合だと以下のようになります

```sql
SELECT FORMAT(1,'D4')
-- 出力結果:0001

SELECT FORMAT(1,'0000')
-- 出力結果:0001
```
sudoを実行するにはttyがなければいけません対策

ssh越しに鍵認証で色々することがあるのですが、
sudoがttyがなくてssh越しにできなくてタイトルのようなエラーがでて強制終了するという場合、
対策は2通りあって、
いままでvisudoとかでrequirettyを無効にする方法しか知らなかったんですが、
単にsshに-tオプション付けて強制的に仮想端末を割り当てればいいんじゃないのという話です。

```
----------------------------
Defaults    requiretty
----------------------------
↓
----------------------------
#Defaults    requiretty
or
Defaults    !requiretty
----------------------------
```

とか、特定のユーザだけ以下のようにしなくても大丈夫だった。

```
echo -e 'Defaults:user1 !requiretty\nuser1 ALL=(ALL)       ALL' > /etc/sudoers.d/user1
```

sshコマンドに-tオプションつけるだけのほうが設定変えなくて済んでよさそうです。
それだけ。

シェルスクリプト内からの実行だと-t2つつけて成功ということもある模様。

参考：
http://takat.exblog.jp/12216326/