OmniAICreator/Qiita-1.07M huggingface dataset:
PHPフレームワーク

# hitSujiクラス

[Web framework delivered as a C-extension for PHP](https://github.com/Yujiro3/hitSuji "Web framework delivered as a C-extension for PHP")

* [基底クラス](http://qiita.com/Yujiro3/items/c2700cc874188046a085)
* [Templateクラス](http://qiita.com/Yujiro3/items/7322a7d71bd5113aaff4)

PHPのフレームワーク作りました。

## ディレクトリ構成

[サンプル](https://github.com/Yujiro3/hitSuji/tree/develop/examples/skel)

```php:サンプル
app/
    libs/
    pages/
        always.php
        home.php
        user.php
    templates/
        home/
            fail.tpl
            success.tpl
        user/
            fail.tpl
            success.tpl
        always.tpl
        layout.tpl
www/
    index.php
```


## ルーター系

```php:index.php

hitSuji::router([
  '' => function () {
    echo '<html><head><title>サンプル</title></head><body></body></html>';
  },
  '/user/:id'=> [
    function ($id) {
      echo '<html><head><title>サンプル</title></head><body>'.
         'id='. $id .
         '</body></html>';
    }, 'get']
]);

```

## 結果

://sheeps.me/user/3

```php
id=3
```


## イベント処理を外部から読み込み

```php:index.php

hitSuji::router([
  ''=> 'always.php'
  '/user/:id'=> ['user.php', 'get']
]);

```

```php:always.php

$template = hitSuji::view();
$template->layout('layout.tpl');

hitSuji::delegate([
    /**
     * リクエスト定義
     *
     * @var array $data
     */
    'bind'=> [
        'signed' => ['number', 'coocke']
        'page'   => ['string', 'request'],
    ],
    /**
     * パース処理
     *
     * @access public
     * @param array $data
     * @return array
     */
    'parse' => function ($data) {
        return array_map('strtolower', $data);
    },
    /**
     * デフォルト処理
     *
     * @access public
     * @return void
     */
    'always' => function ($values) use($template) {
        $template->content('always.tpl');
        $template->display();
    }
]);
```


## 結果

://sheeps.me/

```php
デフォルトページ
```

## 経緯

PHP-Extensionでやっちゃいました。
MVCってのがPHP向きじゃない気がしてならなかったので
~~リアクティブを目指して作ってみました。~~

* PHPなんだし上から下に処理が流れるのでいいじゃないか？
* １プロセスのファイル数は極限まで抑えるべきじゃないか？
* オブジェクト指向とかわけわからんし

>アンシーを表現するのにダックスクラスとか犬クラスとかの
親クラスとかいらないし。
アンシーは唯一無二だからthe アンシーだから。

* 再利用性がどーのこーのも正直、コードの可読性のほうが重要じゃね？

>再利用性を高めるために迷路に迷い込むコードが無くなってほしい。

クラスは今後も使うけど、継承とか使わないです。
デフォルトの定義済みインターフェース以外いらん気がする。


## 主な機能

以下の流れを実現するフレームワークとしました。

１．URLの解析
２．リクエストの解析
３．アクション
４．出力
　　・デフォルト
　　・成功
　　・失敗

![001.png](https://qiita-image-store.s3.amazonaws.com/0/56661/ee125c05-d3a6-766a-99c0-cb99756c80b7.png)

内部の機能はクラスで実装してます。
C言語の構造体の扱いが楽ちんになるからと
グループ化しやすいので ~~クラス実装~~ してます。


## 修正

メモリの使用量と管理が面倒になったので配列ベースに修正しました。
Java にて XSLT を 處理す

Java にて XSLT を 處理するには javax.xml.transform.Transformer などを 用ゐる。

~~~java
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

StreamSource xsltSource = new StreamSource("hoge.xsl");
StreamSource xmlSource = new StreamSource("hoge.xml");
StreamResult xmlResult = new StreamResult(new FileOutputStream("hogeout.xml"));

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(xsltSource);
transformer.transform(xmlSource, xmlResult);
~~~

javax.xml.transform.stream.StreamSource などの ほかに javax.xml.transform.dom.DOMSource などを 用ゐ得。
Microsoft Translator APIを使ってみる

かなり前に書いた記事ですが、[動かなくなってるらしい](http://qiita.com/n0bisuke/items/350752978b16f4429b31)です。@n0bisukeさんの記事の方がわかりやすいのでそちらを見てもらったほうがいいと思いますが、ここのコードも動くように直しておきました。
ではまたね。
***

翻訳botとかで使えたりするんじゃないかなと思って翻訳APIを調べてみました。Googleの翻訳APIは有料らしいのですが、マイクロソフトのほうは月200万文字まで無料で使わせてくれるみたいです。

ということで書いてみた。

#1 準備

とりあえず http://www.microsoft.com/translator/ を開く。

Get started を押すと、"To start using the Translator API, follow these steps"と書いてあるので、これにしたがって進める（下記）といい感じ。

##1-1 Sign up for Microsoft Translator

https://datamarket.azure.com/home/ を開いて、Windows Azure Marketplaceにサインインします。（初めての人は、レジストレーションする）

Microsoft Translatorのページ https://datamarket.azure.com/dataset/bing/microsofttranslator を開き、200万文字/月の無料コースをサブスクライブします。

##1-2 Register your application and create your credentials

Translator APIを使うためには、さらにアプリケーションの登録が必要です。

https://datamarket.azure.com/developer/applications を開き、登録ボタンを押します。

なんか登録画面が出てきますので次の項目を入力します。

* クライアントID - アプリケーションの識別子です。他とぶつからない好きな文字列をどうぞ。
* 名前 - アプリケーションの名前です。わかりやすい名前をどうぞ。
* 顧客の秘密 - デフォルトで表示されているものでよいと思います。
* リダイレクトURI - Microsoft Translatorでは、無効なURLを入力します。（例: https://localhost/）
* サブドメインアクセスを有効にする - オフのままほっときましょう。
* 説明 - 別に書かなくてもいいと思います。

ここで設定したクライアントID(client id)と顧客の秘密(client secret)は、APIを実際に使うときに必要になります。

これで準備は完了です。

#2 使ってみよう

```js:translate.js

'use strict';

var http = require('http');
var https = require('https');
var qs = require('querystring');

getAccessToken(function (token) {
	translate(token, '翻訳したい文章', function (translated) {
		console.log(translated);
	});
});

function getAccessToken(callback) {
	var body = '';
	var req = https.request({
		host: 'datamarket.accesscontrol.windows.net',
		path: '/v2/OAuth2-13',
		method: 'POST'
	}, function (res) {
		res.setEncoding('utf8');
		res.on('data', function (chunk) {
			body += chunk;
		}).on('end', function () {
			var resData = JSON.parse(body);
			callback(resData.access_token);
		});
	}).on('error', function (err) {
		console.log(err);
	});
	var data = {
		'client_id': 'クライアントIDに設定した文字列',
		'client_secret': '顧客の秘密に設定した文字列',
		'scope': 'http://api.microsofttranslator.com',
		'grant_type': 'client_credentials'
	};

	req.write(qs.stringify(data));
	req.end();
}

function translate(token, text, callback) {
	var options = '&to=en' +
			'&text=' + qs.escape(text) +
			'&oncomplete=translated';
	var body = '';
	var req = http.request({
		host: 'api.microsofttranslator.com',
		path: '/V2/Ajax.svc/Translate?' + options,
		method: 'GET',
		headers: {
			Authorization: 'Bearer ' + token,
		}
	}, function (res) {
		res.setEncoding('utf8');
		res.on('data', function (chunk) {
			body += chunk;
		}).on('end', function () {
			eval(body);
		});
	}).on('error', function (err) {
		console.log(err);
	});

	req.end();

	function translated(text) {
		callback(text);
	}
}

```

ポイントは、getAccessToken() でclient idとclient secretから（600秒有効な）アクセストークンを取得し、そのトークンを使って実際の翻訳APIを呼び出すってとこかなあ。
すさまじい量のファイルを消す方法

結論から書くと`ls -f | head -n <int> | perl -lne unlink`

# どうしてこうなった
オプションを事故ったコマンドを実行して放置した結果、大量の中間ファイルを生成してしまう羽目に。

*その数***億***単位。*

`ls`コマンドがうんともすんとも言わなくなったせいで、最初は何が起きているのかさっぱり分からなかった。どうやらデフォルトでは`ls`や`rm`はファイルをリストアップしようとするせいなのか、あまりに大量のファイルを扱おうとするとメモリを食いつぶしてしまうようだ。`find`とか色々試してみたけど標準出力に帰ってきたものは誰一人としていなかった。

幸い、ファイル名が規則的だったので必要なファイルは隔離できた。ディレクトリごと削除できればいいのに。。。

# 解決方法

まず`ls`に`-f`オプションをつける。
デフォルトでは表示を整形するために`ls`コマンドはファイルをソートしたりしているのだが、このオプションを付ければディスク上にある順で逐次ファイル名を出力してくれる。
これを`head`でも使って適当な数ずつ処理する。

削除は`rm`でもいいのだが、何やら`perl`の`unlink`を使うと速いらしい[^1]。

というわけで適当にスクリプトを書くとこうなる。

```pl:remove.sh
count=0
while [ $count -lt 100 ]; do
    ls -f ./directory | head -n 1000 | perl -lne unlink
    count=`expr ${count} + 1`
    sleep 5
done
```

ファイル数に合わせてループ回数を、負荷がかかり過ぎないよう一度に消す数とお休みする時間の長さを適当に設定。今回の場合はファイルの総数を知れたのが不幸中の幸い[^2]。

もっともファイル数が分かった所で相応の時間がかかるのは変わらないので、どの道、そんな大量のファイルを消そうとするとスクリプトを走らせて放置することになる。

[^1]: [Which is the fastest method to delete files in Linux](http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux)
[^2]: ある名前を持つファイルが存在するかどうかは確認できるので、ファイル名が規則的に付いているなら二分探索か何かでどうにかできる。
mac+vagrantで/vagrantフォルダ内ファイルの大文字小文字区別

mac+vagrant+virtualbox(centOS6.5)の環境で、
PHPが大文字、小文字を識別しなくなりはまる。
file_exists()やrequire_onceが誤作動していた。

原因はbox側でマウントしている/vagrantにmacの標準のファイルシステム(?)のパーティションのフォルダをマウントしてしまっていたため、大文字小文字を区別していなかったこと。
/vagrant用には大文字小文字を区別できるファイルシステムのパーティションを使う必要があるようだ。
PLYファイルの作成方法(Visual Studio 2013, Kinect, C/C++, 3D点群処理)

# PLYとは
.plyファイルは3次元点群を格納するためのファイル形式で、[MeshLab](http://meshlab.sourceforge.net/)等で開いて、3次元点群の表示＆編集ができる。

# 色付きの3次元点群の保存

色付きの3次元点を保存するPoint3dRGB構造体の宣言

~~~
struct Point3dRGB{
	cv::Point3d point;
	uchar r;
	uchar g;
	uchar b;
};
~~~

pCloud.push_back(point3dRGB)を用いて、3次元点群の位置(x,y,z)とその色(r,g,b)が格納されているとする

~~~
Point3dRGB point3dRGB;
std::vector<Point3dRGB>　pCloud;
point3dRGB.point.x = 0.0; //double型で単位はm、mmでもいい
point3dRGB.point.y = 0.0;
point3dRGB.point.z = 0.0;
point3dRGB.r = 0; //赤：0~255
point3dRGB.g = 0; //緑：0~255
point3dRGB.b = 0; //青：0~255
pCloud.push_back(point3dRGB);
~~~

ファイルに保存する

~~~

//イテレータの設定
std::vector<Point3dRGB>::iterator begin;
std::vector<Point3dRGB>::iterator end;
begin = pCloud.begin();
end = pCloud.end();

//ファイル名の設定
int fileNum = 0;
char fileName[100];
sprintf_s(fileName, "pCloud%4d.ply", fileNum);

//ファイルオープン
FILE *fp;
fp = fopen(fileName, "w");

//ファイルに書き込む
//ヘッダの設定
fprintf(fp,
"ply\n format ascii 1.0\n comment Kinect v1 generated\n element vertex %d\n property double x\n property double y\n property double z\n property uchar red\n property uchar green\n property uchar blue\n end_header\n", begin->size());

//3次元点群
for (; begin != end; ++begin){
   fprintf(fp, "%lf %lf %lf %u %u %u\n", begin->point.x, begin->point.y, begin->point.z, begin->r, begin->g, begin->b);
}
//ファイルクローズ
fclose(fp);
//ファイル名更新
fileNum++;
~~~

.plyのヘッダファイルが重要(メモ帳などで開いてみよう)

~~~
ply
format ascii 1.0
comment Kinect v1 generated
element vertex 点群の数
property double x
property double y
property double z
property uchar red
property uchar green
property uchar blue
end_header

以下、点群の列
x y z r g b
x y z r g b
x y z r g b
…
~~~

MeshLabで開くとこんな感じ。（[freiburg1_xyz](http://vision.in.tum.de/data/datasets/rgbd-dataset/download)を使用）

![point3drgb.png](https://qiita-image-store.s3.amazonaws.com/0/63863/0b603c5b-4ce3-8fa0-94a4-0825eac7df74.png)


# 色なしの3次元点群の保存

ヘッダファイルの設定とx,y,zの数値を並べればよい。

~~~
ply
format ascii 1.0
comment Kinect v1 generated
element vertex 点群の数
property double x
property double y
property double z
end_header

x y z
x y z
x y z
…
~~~

開くとこんな感じ。
![point3d.png](https://qiita-image-store.s3.amazonaws.com/0/63863/79439abd-65db-b8a0-3eca-2530da8cedbb.png)

# Normalの表示

Normal(法線ベクトル)の表示もできる。
以下に、ヘッダの設定を示す。

~~~
ply
 format ascii 1.0
 comment VCGLIB generated
 element vertex 1769
 property float x
 property float y
 property float z
 property float nx
 property float ny
 property float nz
 end_header
x y z nx ny nz
x y z nx ny nz
x y z nx ny nz
…
~~~

MeshLabのRender->Show Normal/Curvatureで表示できる
![normal.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/ebdfdbc7-5e38-ab23-0064-925b52e53af6.png)


# まとめ
- PLYファイルの作成（C/C++）とMeshLabによる表示
- ヘッダを間違うと読み込めないので注意！
- 点群の数は、Kinect v1でDepth画像から3次元点群を生成するとき、307200(640*480)をよく使う。
- 点群のpush_backは、相当メモリを食うので気を付ける。
ローカルで立ち上げたRails4アプリにiphoneからアクセスするには

# 概要
タイトルの通りです。
ローカルで立ち上げたdevelopmentなRailsにiphone実機でアクセスしたい。コード修正する度にいちいちサーバにデプロイして確認なんて、いくらCapistranoとかで自動化しててもやりたくない。まぁよくあることですよね?

ngrokとか使う手もありますが、直接繋いでやった方が早いです。

http://qiita.com/ugtkbtk@github/items/8dfc1bb0b76f40b75ad5

上記ページにあるように、USBテザリングなり、WiFiスポットなりでつなげて、IP調べてiphoneから接続します。検証した事は無いですが、androidでも要点は一緒だと思います。

ですが、Rails4以降(かな?)、サーバ起動時のデフォルト設定が変わってしまったので、普通に

``` bash
rails s
```

しただけでは、母艦上でブラウザアクセスする事は出来てもiphoneからは接続できません。

# 手順
``` bash
rails s -b 0.0.0.0
```
以前はRailsがデフォルトで0.0.0.0でバインドしてくれていましたが。今はデフォルトでは127.0.0.1でバインドしている……のかな?
というわけで起動時に -b オプションを付けてやりましょう。

# 追記 2015/07/06
config/boot.rb で以下のように書いてやると、-bオプションいちいちつけなくてもイケルヨ、と教えてもらったので追記。

```rb
module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Host => '0.0.0.0')
    end
  end
end
```

# 注意点
運用は自己責任で！
Rails interview

---



- 如果我在路由文件` config/routes.rb` 里追加下面一段路由设置,会生成几个路由呢?


```
resources :posts do
  member do
    get 'comments'
  end
  collection do
    post 'bulk_upload'
  end
end

```

- 说说 ruby 里的 hash 和 ActiveSupport 里的 `HashWithIndifferentAccess` 的区别.

- 说说下面的这段写在控制器里的代码有什么问题,如果把它上线之后会有什么后果, 如何修复呢?

```
class MyController < ApplicationController
  def options
    options = {}
    available_option_keys = [:first_option, :second_option, :third_option]
    all_keys = params.keys.map(&:to_sym)
    set_option_keys = all_keys & available_option_keys
    set_option_keys.each do |key|
      options[key] = params[key]
    end
    options
  end
end
```


- `CSRF` 是什么, Rails 里针对它做了些什么?
- 怎么创建一个`Person` 对象,可以让他成为其他`Person` 对象的父类, 可以参考下面` Rails Console` 里的演示. 还有如果你要给这个对象定义对应数据库表, 你需要在迁移的时候定义什么字段呢?

```
irb(main):001:0> john = Person.create(name: "John")
irb(main):002:0> jim = Person.create(name: "Jim", parent: john)
irb(main):003:0> bob = Person.create(name: "Bob", parent: john)
irb(main):004:0> john.children.map(&:name)
=> ["Jim", "Bob"]
```

挑战: 如果我们想得到该`Person`的第三级子类,如下面代码中示例,改做这么修改这个对象,对于数据库表定义,需要修改什么吗?

```
irb(main):001:0> sally = Person.create(name: "Sally")
irb(main):002:0> sue = Person.create(name: "Sue", parent: sally)
irb(main):003:0> kate = Person.create(name: "Kate", parent: sally)
irb(main):004:0> lisa = Person.create(name: "Lisa", parent: sue)
irb(main):005:0> robin = Person.create(name: "Robin", parent: kate)
irb(main):006:0> donna = Person.create(name: "Donna", parent: kate)
irb(main):007:0> sally.grandchildren.map(&:name)
=> ["Lisa", "Robin", "Donna"]
```

- 创建一个路由,能够显示不同啤酒的信息,路由 URL 看上去应该是这样子的: `/beer/<beer type>`, 而且用同一个控制器和动作来处理,还需要限定啤酒的类型,可用的类型是下面提到的:
	- IPA
	- brown_ale
	- pilsner
	- lager
	- lambic
	- hefeweizen

不属于这个系列的,返回`404`信息.

- 仔细看看下面的代码, 看看他们有什么问题? 怎么修复.

```
class CommentsController < ApplicationController
  def users_comments
    posts = Post.all
    comments = posts.map(&:comments).flatten
    @user_comments = comments.select do |comment|
      comment.author.username == params[:username]
    end
  end
end
```
C++でテンプレート関数の覚書

C++はテンプレート関数を作ることができる
`template<class T>void f(){}`

##特殊化`void f<int>(){}`
特殊化はできる

```cpp
template<class T>void f(){}
template<class T>void f<int>(){}
```


しかしこのような特殊化はできない
`template<class T>void f<int,T>(){}`

特殊化したい場合、オーバーロードを工夫する、間にクラスをかませるなどすることで代用できる

```cpp
template<class>struct wrap{};

void impl(wrap<int>){std::cout<<"int";}
template<class T>void impl(T){std::cout<<"other";}
```

```cpp
template<class>
struct impl2
{
    static void output(){std::cout<<"other";}
};
template<>
struct impl2<int>
{
    static void output(){std::cout<<"int";}
};
```
そして最終的にラップしてクサいにふたをすればよい
`template<class T>void f(){impl(wrap<T>{});}`
`template<class T>void f(){impl2<T>::output());}`

##部分特殊化`void f(T*){}`
このような特殊化は可能である

```cpp
template<class T>
void f(T*){}
```
上記はポインタのみを引数にとる関数となる

```cpp
template<class,class>wrap2{};
template<class T>
void f(wrap2<int,T>){}
```
上記はwrap2<int,T>のみを引数にとるクラスとなる

これを利用してtemplateから型を引き出すこともできる

```cpp
template<class,std::size_t>
struct List{};
template<class T,std::size_t N,std::size_t M>
List<int,N+M> f(List<T,N>,List<T,M>)
{return {};}
```
```cpp:main
f(List<int,3>{},List<int,5>{});
```


##推測不可`f(typename X<T>::Y)`

```cpp
template<class T>
struct ptr
{
    using type=T*;
};
template<class T>
void f(typename ptr<T>::type)
{}
int x;
```
以下はコンパイルを通らない
`f(&x)`
`ptr<T>::type==int`からTを推測することはできない
以下は通る
`f<int>(&x)`
`ptr<int>::type==int`という問題が解決され引数int*の関数となる

```cpp
struct hoge
{
    struct piyo{};
};
template<class T>
void f(typename T::piyo)
{}
```
`f(hoge::piyo{})`
Tは推測できないためコンパイルに失敗する。piyoはhogeのことを知らない
以下は可能
`f<hoge>(hoge::piyo{})`

## 右辺値参照`f(T&&)`
```cpp
template<class T>
void f(T&& x){}
```
上記は

```cpp
int val;
f(42);//T==int x==int&&
f(val);//T==int& x==int&
```
となる



##オーバーロードの順番
オーバーロードの順番は大まかに決まってはいるが決まってないものにぶつかった場合エラーとなる(半順序)
オーバーロードのルールは複雑なので大まかに示す
`f([int的なもの])`を実行したとき
1.`f(int),f(int const),f(int&)`など参照,const系
2.`f(T)`などtemplate系
3.`f(double),f(long)`など変換可能なもの
4.`f(...)`可変長引数(printfなどで使われるアレ)
が呼ばれる

1について`{int&&,int&`}>`int const&`となる
他細かいルールについては概ね直感的に動く
紛らわしいオーバーロードはしない方がよい



##戻り値推測`auto f(),decltype(auto) f()`

戻り値が推測できる。ただしC++14から
`decltype(auto)`はdecltype(expr)のルールで動く
autoはconstや参照などが丸められる

##戻り値の型の後置`auto f()->void{}`
戻り値を後ろに書くことができる。decltype()を用いて書くときに便利、あと頭がすっきりして見やすい。戻り値の推測が使えるので必要ないかもしれない
##SFINAE`std::enable_if<>::type`
「`T::type f(T)`でTにtypeが存在しなくてもすぐにコンパイルエラーにせず合致するものを探そう」という試み。これを利用してfの処理を振り分けたりする

書き方はテンプレート引数に書いたり

```cpp
template <typename T, typename std::enable_if_t<pred>* =nullptr>
void f(T t){}
```
戻り値に書いたり

```cpp
template <typename T>
std::enable_if_t<pred,ReturnType> f(T t){}
```
引数に書いたり

```cpp
template <typename T>
void f(T t,std::enable_if_t<pred>*=nullptr){}
```
ちなみに

```cpp
template <typename T, class=std::enable_if_t<pred>>
void f(T t){}
template <typename T, class=std::enable_if_t<!pred>>
void f(T t){}
```
とすると失敗する
上の関数一つの時は問題ないが同じ関数を２度定義しようとしている扱いになり失敗する
classの時は使えるが関数の時この手法は使えない
SSL証明書(pfx形式)作成メモ

# これは何？

Microsoft Azure のカスタムドメイン用SSL証明書はpfx形式。
なのでkeyとcrtからpfxを生成しますメモ.

# keyとcrtファイルからpfx生成

```
openssl pkcs12 -export -out domain.pfx -inkey domain.key -in domain.crt
```

# Azure CDNの場合はpem形式

```
openssl pkcs12 -in domain.pfx -out domain.pem
```
# 参考
http://qiita.com/kunichiko/items/3e2ec27928a95630a73a
Encrypt-then-MAC, MAC-then-Encrypt, Encrypt-and-MAC 

共通鍵暗号とメッセージ認証コードを組み合わせてメッセージを送るときの方式は EtM、MtE、E&M の3通りがある。

どういう違いがあるか、簡単に把握したかったので http://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac を抄訳してみた。

*  Encrypt-then-MAC (EtM)
 * 暗号文の完全性が提供される
 * 平文の完全性が提供される
 * MAC が不正な暗号文を弾いてくれる (暗号を復号しなくても不正かどうかわかる)
 * MAC から平文を推測することが不可能
* MAC-then-Encrypt (MtE)
 * 暗号文の完全性が提供されないので、暗号文を復号するまでメッセージが正しいものなのか偽造されたものなのか分からない。
 * 平文の完全性は提供される
 * 偽造した暗号文を弾くことができないため、メッセージを偽造できてしまう (復号化後に判別できる)
 * MAC は暗号化されてしまっているので、MAC から平文を得ることはできない
* Encrypt-and-MAC (E&M)
 * MAC は平文に対して適用されているので、暗号文の完全性は提供しない。このせいで選択暗号文攻撃 (Chosen-ciphertext attack; CCA) に対して脆弱となる場合がある
 * 暗号文の中身の差し替えが可能となってしまう。復号時に完全性を確認できるため。
 * 平文の完全性は確認できる
 * 理論上、MACから平文を推測できる(かも)

EtM が MtE, E&M よりも良い……ということになる。各種プロトコルの状況は以下の通り。

* SSH: E&M。
 * [OpenSSH 6.2 (2013/03/22 リリース)](http://www.openssh.com/txt/release-6.2) が独自に EtM に対応している。対応しているバージョンの OpenSSH 同士ならばデフォルトで EtM が使われる。ssh_config(5) を参照するべし。
* TLS/SSL: MtE。
 * [RFC 7366 (2014年9月発行)](http://tools.ietf.org/html/rfc7366) で EtM が使えるように拡張された。まだサポートしているブラウザはない模様。
* IPsec: EtM。
【Zabbix】Zabbixでイベントログ監視(Windowsエージェント版)

#はじめに
やあ、シャアだよ。
ザビックス？　くっそーザビ家め～。。こんな感じで余計なコメント満載なページですので急いでる方は見ないでね。

初心者な私でもZabbixでWindowsログ監視について検証したんですぅ。エージェントインストールしてマネージャーと会話させて、マネージャー上でイベント検知するところまでの記録です。

上司A：「おいおまえ！部のなかで一番スキルしょぼいからよぉ、おまえみたいな役立たずでもやれそうな検証作業与えてやるから、がんばれよ！」
あまちゃん：「はい...俺どんまい...」
それでは、俺のWindos2012にzabbixエージェントインストールしてイベントログ監視です。


＊引っ越ししました。お手数ですが以下参照ねがいます。
http://amachan007.techblog.jp/archives/7571504.html
現在時刻を秒単位で表示する！

### HanderとTimerを使用して時計を表示！

Activity内で現在の時刻を表示するTextViewを作成してみます。
使用するのは、Handler、Timer、TimerTaskクラスです。

![Screenshot_2015-02-03-15-33-53.png](https://qiita-image-store.s3.amazonaws.com/0/30138/8ef3e1fd-9959-9e55-78f7-d4bc2b570bf1.png)


```java
public class MainActivity extends Activity { 
	private Handler mHandler;
	private Timer mTimer;
	// 時刻表示のフォーマット
	private static SimpleDateFormat mSimpleDataFormat = new SimpleDateFormat("yyyy年　MM月dd日　HH:mm:ss");

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);

		mHandler = new Handler(getMainLooper());
		mTimer = new Timer();

		// 一秒ごとに定期的に実行します。
		mTimer.schedule(new TimerTask() {
			@Override
			public void run() {
				mHandler.post(new Runnable() {
					public void run() {
						Calendar calendar = Calendar.getInstance();
						String nowDate = mSimpleDataFormat.format(calendar.getTime());
						// 時刻表示をするTextView
						((TextView) findViewById(R.id.clock)).setText(nowDate);
					}
				});}
		},0,1000);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 定期実行をcancelする
		if (mTimer != null) {
			mTimer.cancel();
			mTimer = null;
		}
	}
}
```
FPGAエクストリーム・コンピューティング第6回が終わりました #fpgax

[FPGAエクストリーム・コンピューティング第6回](http://connpass.com/event/10638/)、今回はドワンゴさんの会場をお借りして開催しました。80席のところ登録数は230名、[ニコ生](http://live.nicovideo.jp/gate/lv208561482)来場者はのべ1773名という盛況ぶりでした。これはやはりMS＆ドワンゴさん効果でしょうか。

![IMG_20150201_151127.jpg](https://qiita-image-store.s3.amazonaws.com/0/38290/6cdb0e09-8ab1-854b-9e3e-2f342e011109.jpeg)
![IMG_20150201_130425.jpg](https://qiita-image-store.s3.amazonaws.com/0/38290/d452364f-350e-2962-ead7-f19ff16951a3.jpeg)

## 資料・まとめなど

今回の発表資料やまとめ、ブログ記事等はこちらに集めておきました。

- [FPGAエクストリーム・コンピューティング第6回 イベント資料一覧](http://connpass.com/event/10638/presentation/)
- [Togetterまとめ](http://togetter.com/li/777661)

## 今回のおしながき

### えびさわさん：[FPGAで作るOpenFlow Switch](http://www.slideshare.net/kentaroebisawa/fpgax6)

えびさわさんはFPGAを仕事で扱い始めてまだ半年ほどだそうですが、今回の発表内容だけを見てるとばりばりハードエンジニアにしか見えませんｗ すごいーー。OpenFlow仕様は変更が多すぎてASICではとても間に合わずFPGAが適してるという点はなるほどです。また、TCAM（メモリアドレスの代わりにバイナリのパターンマッチでデータにアクセスするメモリデバイス）の使い方が設計のポイントとなるところは、いかにもネットワーク機器って感じで興味深い内容でした。

### フィックスターズ・いいづかさん：[OpenCL Programming for FPGA](https://speakerdeck.com/iitaku/opencl-programming-for-fpga)

「ソフトウェアエンジニアなのでHDLは死んでも書きたくない」というのが、OpenCLでFPGAプログラミングをする理由とのことｗ たしかにOpenCLならふつーのCっぽく書けるので、ソフトウェアエンジニアにとってはかなりハードル低くなります。私が気になったのは、OpenCLで書くようなアルゴリズムってFPGAよりGPUの方が性能的に優位なケースが多いのでは？ という疑問でしたが、今回のSHA256実装のケースではレジスタを多用するのでGPUより10倍ほど速いとのこと。なるほどー。

### 慶応・林さん：[FPGA NICによる機械学習を用いた外れ値検出](http://www.slideshare.net/ssuserd04a4e/fpgax6hayashi)

林さんの発表は、10GbE搭載のNetFPGAを使って外れ値検出を実装、8000万件／秒の性能を達成したという内容。これ、林さんの卒論です。学部4年生がFPGA触り始めて数ヶ月でこの結果です。いろいろすごすぎて、会場やニコ生で見てたおじさん達が凍りついた発表でした。林さんのようなFPGAネイティブ世代が今後どんどん増えると、世の中変わるんじゃないかと思います。なんでもCPUでもっさり実装してると「それFPGAでよくね？」って若者がさくっと実装したりする未来がきそうでこわいです。

### 北大・福田さん：FPGA NICキャッシュによるmemcached高速化

最近のWeb開発では、memcachedやRedisなどのキャッシュサービスへの依存がどんどん高まりつつあり、大規模なゲームインフラ等ではmemcached/Redisの性能や可用性がサービス品質に大きく影響するようになりました。福田さんの研究は、そのmemcachedをFPGAで実装するもので、CPU実装に比べて半分のレイテンシでの応答を実現しています。FPGAによるmemcachedの実装は、他にもXilinxやStanford等いくつかの研究がありますが、それらのアーキテクチャの違いやボトルネック等を理解できるセッションでした。

### わさらぼ・みよしさん：[ソフトウェアエンジニアにもわかる高位合成](http://www.slideshare.net/miyox/synthesijer-fpgax-20150201)

このセッションに際してみよしさんには私から「ソフトウェアエンジニアにもわかるように高位合成について噛み砕いてほしい」をお願いしまして、そもそも高位合成って何？ CPUで実行するのとどう違うの？ って点をわかりやすく解説いただきました。あざす！！ みよしさんのSynthesijerはド素人の私でも使い始められるOSSなJavaベースの高位合成ツールで、この後のLTでもSynthesijerを使った事例は2つ紹介されてました。

## Lightning Talks

LTのおしながきは以下のとおり。LTの方もかなーり濃い発表が続きました。

- 株式会社ドワンゴ「なぜドワンゴはFPGAエンジニアを募集し始めたのか」
- @kazunori_279「[FPGAとSynthesijerで作るFluentdクライアント](http://qiita.com/kazunori279/items/208e1526367426b39bbb)」
- アルテラ・竹村さん「Altera Tips」
- 慶応・徳差さん「[HDMI-TS: FPGAによる民生カメラ向け低遅延映像通信システムの設計](http://www.slideshare.net/aomtoku/hdmits-fpgax6v0)」
- 農工大・鈴木さん「[FPGA+Synthesijerでヴォコーダを作ってみた](http://www.slideshare.net/ryotasuzuki96/fpgasynthesijer)」
- @hasegawさん
- @marsee101さん「[UbuntuをインストールしたZYBOボードにカメラを付けてOpenCVで顔認証](http://marsee101.blog19.fc2.com/blog-entry-3063.html)」
- @iwag_orgさん「[Chisel+RISC-V introduction](https://speakerdeck.com/iwag/chisel-risc-v-introduction)」

またおもしろいネタが溜まってきましたら、次回を企画したいと思います。半年後くらいですかね。

会場のご提供とニコ生配信で強力にサポートいただきましたmesoさんはじめドワンゴの皆様、ありがとうございました！！
ChromeOS(ChromiumOS)のcrosh起動について

ChromeOSやChromiumOSにおいてPC内部に触ったりsshしたりするcrosh(chrome shell?)を起動するコマンドは```Ctrl+Alt+T```を同時押し。

基本的にインストール時はそこまで迷う事無いのだけど、ここだけは分からない。そしていつも忘れる。
sshオプション(よく使う物)

source:[SSH (1)](http://www.unixuser.org/~euske/doc/openssh/jman/ssh.html)

改めてsshのドキュメントを見直すと、オプションって色々あるのが分かる。だけど、とりあえず覚えておけば良いかなという物を羅列してみる。

### （個人的に）よく使うsshオプション集

 * ```-4```
    * IPv4だけ使う。
 * ```-6```
    * IPv6だけ使う。
 * ```-i identityfile```
    * 公開鍵秘密鍵認証の際に公開鍵のPATHを指定する。
 * ```-l```
    * ログインする名前を決める。hoge@example.com のhogeかな。
 * ```-p```
    * ポート指定。
 * ```-X```
    * X11転送を許可する。ちなみに小文字になると禁止。
 * ```-Y```
    * <b>信用されている</b>X11転送だけを許可する。こちらの小文字は違うオプションなので注意。

### ちなみに
```.ssh/config``` で省略出来るオプションも多い。  
1回きりのsshならともかく、よく接続する場所ならそちらに記述しよう。

## 元記事
この投稿は[なぜにぷろぐらむ](http://whywaita.hateblo.jp/entry/2014/05/19/003601)から移転されてきました。
CSV読んだよ！


・A1セルから書き出し
・エラーチェックなし
・WSHランタイム・ライブラリ参照の必要（Microsoft Scripting Runtim）

結構重い('A`)
もっと事前バインディングしたい(-＿-)


```vbnet

Option Explicit

Const Ascii As Integer = 0
Const Unicode As Integer = -1
Const SystemDefault As Integer = -2

Const ReadOnly As Integer = 1
Const CreateNew As Integer = 2
Const Append As Integer = 8

Private Sub f()
    
  Dim line As New Collection
  Dim fo As Object
  Dim fs As Object
  Dim file_name As String
  Dim data
  
  ' ファイル・ダイアログ からファイル名を取得
  
  file_name = Application.GetOpenFilename("text file(*.txt;*.csv), *.txt;*.csv")
  
  Set fo = CreateObject("Scripting.FileSystemObject")
  Set fs = fo.OpenTextFile(file_name, ReadOnly, Unicode)
 

  ' EOFまで コレクションに追加
  ' 改行コードを各行つき手当しておく
  
  Do Until fs.AtEndOfStream
    data = fs.ReadLine()
    line.Add data & vbCrLf
  Loop
  
  ' リソースの開放
  
  fs.Close
  Set fs = Nothing
  
  
  Dim w, elem
  Dim r As Long
  Dim c As Long
  Dim i As Long
  
  r = 0
  c = 0
  
  ' データの取り出し
  
  For Each w In line
    elem = Split(w, ",")
    For i = LBound(elem) To UBound(elem)
      If elem(i) = vbCrLf Then
        c = 0
        r = r + 1
      Else
        [a1].offset(r, c).Value = IIf(elem(i) <> ",", CStr(elem(i)), Empty)
        c = c + 1
      End If
    Next
  Next

      
End Sub

```
Audio MIDI設定のネットワークでiPhoneを認識する方法

MacOSXからiPhone6 iOS8.1.3にWifi経由でMIDIを送るために
MacOSX付属のAudio MIDI設定というユーティリティを使って何のMIDI機器が接続されているかを確認したかったのですが、
同一無線LAN上にいるiPhoneをAudio MIDI設定が認識するまでにタイムラグがあるのか
すんなりと認識されなかったのでやり方を書いておきます。

1. iPhoneとMacを同一無線LANにつなげる。
2. Audio MIDI設定を立ち上げる。ウィンドウから「MIDI スタジオを表示」を選択
![スクリーンショット 2015-02-03 15.17.53.png](https://qiita-image-store.s3.amazonaws.com/0/57077/946eea97-0c13-70b3-781c-f325d0875b32.png)
3. 「ネットワーク」を選択
![スクリーンショット 2015-02-03 15.19.13.png](https://qiita-image-store.s3.amazonaws.com/0/57077/f2564aab-a120-99ac-6d84-3ca3e3a8f7be.png)
4. 「ディレクトリ」の中にiPhoneが表示されていることを確認
![スクリーンショット 2015-02-03 15.20.24.png](https://qiita-image-store.s3.amazonaws.com/0/57077/7618d154-ac22-4af7-f0fd-8e8b7065ddc9.png)
5. iPhoneにMIDI Monitorというアプリをインストールして立ち上げる。

ここで表示されていなかったら、MIDI Monitorを起動し直すといいです。

参考リンク(こっちのほうが詳しいです)

http://objective-audio.jp/2011/05/ioscore-midi.html
ぱぱっと自作ローディングダイアログ

## 完成予定のダイアログ
こんな感じです！
![Screenshot_2015-02-03-14-59-35.png](https://qiita-image-store.s3.amazonaws.com/0/30138/682ba085-c60b-9e90-a37c-15b48af5c43e.png)

#### ActivityからDialogのインスタンスを取得出来るクラスを作成

```java
public class Loading {
	// Dialogを返す
	public static Dialog getDialog(Activity activity){
		Dialog dialog = new Dialog(activity);
		dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
		dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
		dialog.setContentView(R.layout.simple_progress);
		return dialog;
	}
}
```

R.layout.simple_progressの中身（res/layout/simple_progress.xml）
ProgressBarを使い、くるくる回るやつを表示
※このくるくるのデザインは、OSや指定しているテーマに依存します。

```xml
<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/simple_progress_bar"
    android:layout_width="128dp"
    android:layout_height="128dp"
    android:layout_gravity="center"
    android:background="@drawable/simple_progress_frame"
    android:gravity="center" >

</ProgressBar>
```

@drawable/simple_progress_frameの中身（res/drawable/simple_progress_frame）
Shapeを使いダイアログの四隅の角丸を指定

```xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#80808080"/>
    <corners android:radius="16dp"/>
    <padding android:left="4dp" android:top="4dp" android:right="4dp" android:bottom="4dp" />
    <stroke android:width="0dp" android:color="#a0808080" />
</shape>
```

#### Activityからの呼び出し

```java
public class MainActivity extends FragmentActivity {	
	private Dialog mDialog;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		mDialog = Loading.getDialog(MainActivity.this);
		mDialog.show();
	}
	
	@Override
	protected void onPause(){
		super.onPause();
		if(mDialog != null && mDialog.isShowing()){
			mDialog.dismiss();
		}
	}
}
```

これで色んなActivityから呼べるようになります！！
mDialog.dismiss();を忘れずにー
コンソールケーブル無しでYAMAHAルータにRARPでIPを振る

業務用ルータRTX1000を買ったけど、最近のマシンにシリアルポートは無い。

買うのも面倒なので、今回はRARPを使ってIP設定をしてみる。

## 今回の環境
- YAMAHA RTX1000
- Linuxサーバ(debian wheezy)

既にDHCPサーバが上流に動いている環境で、その下に検証用のネットワークを作る事を想定している。

## IP設定作業
同じセグメント内に居るLinuxサーバに ```rarpd``` パッケージをインストールする。

```
whywaita@debian:~$ sudo apt-get install rarpd
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  rarpd
0 upgraded, 1 newly installed, 0 to remove and 12 not upgraded.
Need to get 13.6 kB of archives.
After this operation, 74.8 kB of additional disk space will be used.
Get:1 http://ftp.jaist.ac.jp/debian/ wheezy/main rarpd amd64 0.981107-8 [13.6 kB]
Fetched 13.6 kB in 0s (83.0 kB/s)
Selecting previously unselected package rarpd.
(Reading database ... 41324 files and directories currently installed.)
Unpacking rarpd (from .../rarpd_0.981107-8_amd64.deb) ...
Processing triggers for man-db ...
Setting up rarpd (0.981107-8) ...
Starting RARP lookup daemon: rarpd.
```

新しく ```/etc/ethers``` ファイルを作って、MACアドレスとホスト名を関連づける。(MACアドレスはRTX1000なら本体背面に書いてあるはず)

```
whywaita@debian:~$ cat /etc/ethers
XX:XX:XX:XX:XX:XX       RTX1000
```
今回は「RTX1000」と付けたけど何でも良いと思う。好きな名前を付けてやろう。

次に ```/etc/hosts``` ファイルを編集して、先ほど決めた名前とIPアドレスを関連づけてやる。

```
whywaita@debian:~$ diff /etc/hosts /etc/hosts.old
+# YAMAHA setting
+192.168.XX.YY        RTX1000
```

ここまで設定したら、rarpdを再起動するだけ。

```
whywaita@debian:~$ sudo service rarpd restart
Restarting RARP lookup daemon: rarpd.
Stopping RARP lookup daemon: rarpd.
Starting RARP lookup daemon: rarpd.
```

これでRTX1000にIPが振られるので、ブラウザからweb管理画面にアクセスが出来る。

## 参考

http://www.rtpro.yamaha.co.jp/RT/FAQ/Intro/rarp.html

http://www.jp.netbsd.org/ja/docs/network/netboot/rarp.html#linux

http://ameblo.jp/k-freedom7/entry-10804060253.html

## ちなみに
最近のYAMAHAルータだと初期状態でIPをもっている事が多いのは内緒な。

## 元記事
この投稿は[なぜにぷろぐらむ](http://whywaita.hateblo.jp/entry/2015/01/08/214847)から移転されてきました。
vimにXslate(TTerse)のシンタックスハイライトをさせる方法


vimでxslate(TTerse)でコーディングするときに、デフォルトのままだとシンタックスハイライトされないので不便です。
Kolon文法のものは専用のプラグイン([motemen/xslate-vim](https://github.com/motemen/xslate-vim))が用意されているようですが、TTerse用のものは見当たりません。

今回、Template Toolkit用のものを流用することでシンタックスハイライトを設定してみます。

# 前提
パッケージマネージャとしてNeoBundleを使用します。
おそらく、他のパッケージマネージャでも手順は同様かと思います。
また、vimのファイルタイプごとの設定方法についてはここでは扱いません。

# 手順
## syntax hightlight
まずは色付けの設定をします。
perl用のプラグイン **vim-perl** の中にtt2用のファイルがあるのでこれを使います。

```vim:vimrc
NeoBundle 'vim-perl/vim-perl'
```

次にftdetectにXslate用のファイル(*.txなど)を追加します

```ftdetect/tx.vim
au! BufNewFile,BufRead *.tx setf tt2html
```
ここで *tt2html* の代わりに *tt2* を使うとhtmlタグはハイライトされないようになりますが、tt2htmlの方が便利でしょう。
.incなどの他の拡張子も紐付けたい場合には、随時設定を追加してください。

これでハイライトされるようになったかと思います。
![スクリーンショット 2015-02-03 14.52.55.png](https://qiita-image-store.s3.amazonaws.com/0/67687/020fc466-1dc2-2929-1b4a-f0fa107c459d.png "スクリーンショット 2015-02-03 14.52.55.png")


この他、適宜html用の設定を流用するといいかもしれません。

```VimL:ftplugin/tt2html.vim
runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
```

## indent
実はこのままではindentがききません。正直テンプレートエンジン構文とhtmlタグが混在するファイルでのインデントルールって好みの問題も多そうなので難しいですが、一応導入してみます。

元々のhtml用indentファイルを流用してもいいですし、[こちら](https://github.com/erbain/vim/blob/master/indent/tt2html.vim)のような設定ファイルを使わせてもらうのもいいと思います。

こいつを```.vim/indent/tt2html.vim```に保存すれば、上で設定したようなtt2に関連付けられたファイルに対して、このインデントルールが適用されます。
Amazon SNS で Invalid parameter: JSON must contain an entry for 'default' or 'APNS'.

Amazon SNS に MessageStructure: json で、Message に JSON いれると、
```
Invalid parameter: JSON must contain an entry for 'default' or 'APNS'.
```
などと言われる。APNS のキーはあるのに。。。

よくドキュメントをみると

http://docs.aws.amazon.com/ja_jp/sns/latest/dg/mobile-push-send-custommessage.html

サンプル：

```
{ 
"default": "This is the default message which must be present when publishing a message to a topic. The default message will only be used if a message is not present for 
one of the notification platforms.",     
"APNS": "{\"aps\":{\"alert\": \"Check out these awesome deals!\",\"url\":\"www.amazon.com\"} }",
"GCM":"{\"data\":{\"message\":\"Check out these awesome deals!\",\"url\":\"www.amazon.com\"}}",
"ADM": "{ \"data\": { \"message\": \"Check out these awesome deals!\",\"url\":\"www.amazon.com\" }}" 
}
     
```

・・・各キーのvalueがエスケープされてる！＼(^o^)／
つまり、

```
to_json( { APNS => to_json({ aps => { alert => "hoge" } } ) } );
```

だ！

(^q^)
AWS SDK for PHPを使って自ホストのEIPを取得するよ

```php:Util.php
<?php
namespace Model\Common\Util;

use Aws\Ec2\Ec2Client;

class Ec2Util
{
    private $ec2;
    private $ips = array();

    public function __construct($key, $secret, $region)
    {
        try {
             $this->ec2 = Ec2Client::factory(array(
                 'key' => $key,
                 'secret' => $secret,
                 'region' => $region
             ));
             $response = $this->ec2->describeAddresses();
             if ($response) {
                 $instances = $response->toArray();
                 $address = $instances['Addresses'];
                 foreach ($address as $data) {
                     $this->ips[$data['PrivateIpAddress']] = $data['PublicIp'];
                 }
             }
         } catch (\Exception $e) {
         }
    }

    public function getPublicIp($privateIp)
    {
        if (isset($this->ips[$privateIp])) {
            return $this->ips[$privateIp];
        } else {
            return '';
        }
    }
}

```

もちろんComposerでSDKをいれておく

```json:composer.json
{
    "require" : {
        "aws/aws-sdk-php" : "2.*"
    }
}
```

Ec2Utilは適当にインスタンス化して（必要な情報を渡して)
getPublicIpメソッドを呼べばOK

引数のIPはプライベートIP
PrivateなIPを簡単に取得できるはず（$_SERVER[ 'SERVER_ADDR' ]とか？）
getenv

特定の環境変数

```c

#defing _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

#if _GNU_SOURCE 1  /* 特権ないと実行できない */
  const* char path = secure_getenv("PATH");
  puts(path);
# else             /* 特権なくてもおk */
  const* char path = getenv("PATH");
  puts(path);
#endif

```

```c
  #define OVER_WRITE 0
  #define YES 0
  #define NO 1

  const char* name = "hoge";
  const char* value = "1"

  /* 同名の環境変数は上書き */
　　/* name=value 形式      */
  int ret = setenv(name, value, OVER_WRITE+YES); 

  /* 上書きしない */
  setenv(name, value, OVER_WRITE+NO); 

  switch (ret) {
     case -1:
       perror("setenv");
       break;
     case 0:
       puts("Success");
       break;
  }

```


環境変数すべて

```c
  
 {  
    extern char** environ;
    int i;
    for(i=0; environ[i] != NULL; ++i) {
        puts(environ[i]);
    }
 }

```
Azure のストレージ毎の合計サイズを取得する

Azure の StorageAccount 毎のサイズを計算する PowerShell スクリプトを作った。

```ps1
Function Get-AzureStorageSize {
    [CmdletBinding()]
    Param ()
    Process {
        Get-AzureStorageAccount | Get-AzureStorageKey | Foreach-Object {
            $context = New-AzureStorageContext -StorageAccountName $_.StorageAccountName `
                                               -StorageAccountKey $_.Primary

            $total = Get-AzureStorageContainer -Context $context |
                         Get-AzureStorageBlob |
                         Measure-Object -Sum -Property Length

            [PSCustomObject] @{
                StorageAccountName = $_.StorageAccountName
                Length = $total.Sum
            }
        }
    }
}
```
evernote > テキストの書式を削除する > Ctrl+Space

動作環境

    Windows 7 pro

Evernoteを使っているとCtrl+Vした時に書式がついたままでペーストされる。

Ctrl+Shift+Vをすれば書式なしでペーストできるのだが、いったん間違って書式付でペーストした場合の解除がわからなかった。

http://d.hatena.ne.jp/digistill/20120929/p2
にあるようにテキストを選択してCtrl+Spaceをすればいいとのこと。
aタグの無効化 - preventDefaultとreturn falseの違いとか

## `preventDefault();` を使う
親要素へのバブリング（伝達）を保ちながら、`a`タグのリンク機能を無効化する。

```html:hoge.html

<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script src="./hoge.js"></script>
  </head>
  <body>
    <section id="Container">
      <div id="Content">
        <a href="#">クリックは無効化されるけど、divにhogeクラスが追加される</a>
      </div>    
    </section>
  </body>
</html>

```

```javascript:hoge.js

$(function(){
  $('a').click(function(event){
    event.preventDefault();
    $("div#Content").addClass("hoge");
  });
});

```

`a`タグがクリックされた場合でも、
`preventDefault` メソッドを追加することで、 **`a`タグ自体のリンク機能を無効化しつつ、**
その親要素である `div#Content` へ、 **クリックイベントを伝えることが可能。**

## `return false;` を使う
親要素へのバブリングと`a`タグの機能を無効化する。

```html:hoge.html

<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script src="./hoge.js"></script>
  </head>
  <body>
    <section id="Container">
      <div id="Content">
        <a href="#">クリックは無効化されるけど、divにhogeクラスが追加される</a>
      </div>    
    </section>
  </body>
</html>

```

```javascript:hoge.js

$(function(){
  $('a').click(function(){
    $("div#Content").addClass("hoge");
    return false;
  });

});

```

実際の挙動としては、`return false;`を返したあと、
**`a`タグ自体のリンク機能を無効化し、**
**そのクリックイベントを親要素へ伝えない。**

```javascript:hoge.js

$(function(){
  $('a').click(function(){
    return false;
    $("div#Content").addClass("hoge");
  });

});

```

例えば、`return false;`を `addClass` メソッドの前に持ってくると、
クリックイベントが親要素に伝わらない。
よって、親要素にhogeクラスが付与されない。

## `stopPropagation();`
バブリングをストップして、`a`タグリンクの機能は維持する。

```html:hoge.html

<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script src="./hoge.js"></script>
  </head>
  <body>
    <section id="Container">
      <div id="Content">
        <a href="#">クリックは有効化されるけど、divにhogeクラスが追加されない</a>
      </div>    
    </section>
  </body>
</html>

```

```javascript:hoge.js

$(function(){
  $('a').click(function(event){
    event.stopPropagation();  
    $("div#Content").addClass("hoge");
  });

});

```

##参考にしたサイト
http://www.tam-tam.co.jp/tipsnote/javascript/post5050.html
http://blog.neo.jp/dnblog/index.php?module=Blog&action=Entry&blog=pg&entry=3107&rand=ef81c
ぷろぐらむを実行

注： 安易に実行しないでください。メモ書きデス。

##exeve(2)

```c

#include <unistd.h>
int execve(const char *filename, char *const argv[], char *const envp[]);  

```
　呼び出し元プロセスを <i>filename</i> で指定したプロセスに置き換える。
成功すると呼び出し元プロセスには帰ってこない。


<b>引数</b>
<i>filename</i> 
　実行可能なバイナリ・ファイルまたはスクリプトを絶対パスで渡す。
　execve(2)は環境変数を自動的に調べてはくれないため、絶対パスで渡す必要がある。

<i>argv</i> 
　実行するプログラムへの引数を渡す。
　このリストの最後はNULLで終わる必要がある。

<i>evnp</i>
　環境変数を渡す。
　このリストの最後はNULLで終わる必要がある。

<b>戻り値</b>
　成功すると帰えらない。
　失敗すると呼び出し元に -1 を返す。


###extern char** environ

```c

#include <unistd.h>
extern char** environ

```
　環境変数が入った文字列へのポインタ配列。libc, glibcで宣言されている。
この変数はNULLで終わる。
この変数はユーザープログラムの内で<b>宣言</b>する必要がある。

> 注意

> これらの中には、明らかにセキュリティ上の危険が存在する。
> ユーザーが IFS や LD_LIBRARY_PATH に異常な値を与えたことによって、
> これまで多くのシステムコマンドがだまされて、 システムをひどい目にあわせてきた。


デモ・コード

```c

#include <unistd.h>
#include <stdio.h>

int main(void)
{
  extern char **environ;
  const char* path = "/bin/ls";
  char *const arg[] = {"ls", ".", NULL};

  execve(path, arg, environ);

  return 0;
}

```

次の部分。

```c

char *const arg[] = {"ls", ".", NULL};

```

arg[0] に "ls" と書いているのは無くてもかまわない。慣例らしい。

> Note:
> 環境変数は上位に配置される（x86）

```c

 int main(int argc, char *const argv[], const char* env[]) { ... }

```

##fork(2)

```c 

#include <unistd.h>
pid_t fork(void);  

```

・fork()システムコールを発行するプロセス（親プロセス）は自身のプロセスのコピーを作成する。
・親プロセスのメモリ情報、次に実行するステップなど、あらゆる情報をコピーする（PIDは異なる）。
・子プロセスは新しいメモリ空間に割り当てられる。

　fork()を呼んだプロセスは実行ステップを一時中断、子プロセスへ実行権限を委譲する。
親プロセスは子プロセスの正常終了を待つ。

　fork()の戻り値として、親プロセスには子プロセスのPID。子プロセスには0（ゼロ）が帰る。

　子プロセスはexecve(2)を実行すると、親プロセスからコピーされたメモリ空間を開放。
新たなメモリ空間を割り当て、そこへ指定したプログラムを引き当てる。

　親プロセスはfork()を発行後、wait(2)で子プロセスを監視する。
子プロセスが終了すると、親プロセスは子プロセスのリソースを開放し、wait(2)で子プロセスが引き継いた管理情報をクリアする。

kill(2)は終了シグナルを配送するが必ずしもプロセスを終了するとは限らない。
その場合「ソンビ」になって残る。この管理情報はinitが面倒をみてくれる。

##wait(2)
子プロセスの状態監視。子プロセスの管理情報の削除。

```c

#include <sys/types.h> 
#include <sys/wait.h>

pid_t wait(int *status);

```

<b>引数</b>

　取得するステータス

<b>戻り値</b>

　　終了した子プロセスのPID。
　　エラーの場合 -1。

デモ・コード

```c

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#include <stdio.h>

int main(void)
{
  int state=0;
  pid_t child;
  pid_t parent = getpid();

  if((child=fork()) == -1) {  /* 子プロセスの終了後ここから再開 */
    perror("fork");
    _exit(1);
  }
  if(cpid==0) { /* 子プロセス */
    extern char **environ;
    const char* path = "/bin/ls";
    char *const arg[] = {"ls", ".", NULL};
    execve(path, arg, environ);
  }
  if((wait(&status)) == -1) { /* wait(2)の発行 */
     perror("wait");
     _exit(2)
  }
  printf("Parent PID %x\n", paretn);
  printf("Child PID %x Exit Status %x\n", child, status);

  retrun 0;
}

```
xinetdでポートフォワーディングしてnginxで受け取る

環境 CentOS 6.6

xinetd ... inetdの代替として開発された、インターネットスーパーサーバー。インターネットスーパーサーバーとは、特定のインターネット接続要求を待ち受け、アクセスに応じて各サービスを起動するもの。例えばftpへのアクセスがあった時点でftpサーバーを立ち上げるといったことができる。

nginx ... よく使われている httpd サーバー。

今回は、「1024以下のポートはroot権限がなければリッスンできない」というlinuxのセキュリティ的な仕様を回避するため、xinetdを使って 80番ポート -> 8000番ポート(nginx待ち受け)へのポートフォワーディングを行う。

1) xinetd をインストール。
(はじめにすでにinetdやxinetdが入ってないか、動いてないか確認すること。`ps aux | grep inetd` で何かプロセスが動いていたら怪しい。)
`yum -y install xinetd`

2) xinetd を設定。
xinetdのサービス別コンフィグファイルは、デフォルトだと /etc/xinetd.d/* に保存される。この設定は /etc/xinetd.conf で変更できる。

`vi /etc/xinetd.d/nginx`

以下のコンフィグを今回書き込んだ。
詳しいディレクティブの説明は http://linuxjm.sourceforge.jp/html/xinetd/man5/xinetd.conf.5.html を参照。

```
service nginx
{
  disable = no #スイッチ。yesかnoで指定。
  type = UNLISTED #ソフトが/etc/servicesとして登録されていない場合はこれをUNLISTEDとして指定しなければ動かない。
  socket_type = stream
  protocol = tcp # tcpかudp。
  wait = no #実行まで数秒待つ という設定もできる。
  user = root #サーバプロセスのuidを指定する。
  port = 80 #xinetdで受け付けるPort。
  redirect = 127.0.0.1 8000 #フォワード先のIPとPort。スペースで区切る。
  log_type = FILE /var/log/xinetdlog #ログファイル。
}
```

これで、Port 8000のnginx側へPort 80のアクセスが渡るようになった。
ただし、この方法だけではxinetdがX-Forwarded-Forを出力しない関係で、アクセス元の実体IPが隠蔽されすべて127.0.0.1扱いとなってしまう。
これを解決する手段は現在調査中だが、今回は開発サーバーの話なので特に問題にはならなかった。
MongoDBのスロークエリーを消す方法の備忘録


最終手段だが、しゃーない。

```javacript:killSlowQueryOps.js
// 5秒以上のスロークエリーを削除するJS
db.currentOp().inprog.forEach(
  function(op) {
    //if(op.secs_running > 5) printjson(op);
    if(op.secs_running > 5) {
    	db.killOp(op.opid);
    }
  }
)
```

```bash:command
$ mongo < killSlowQueryOps.js
```
DB2 SQLステートメントログ取得

#目的
 データベースに接続したアプリケーション情報の取得
##手順
　接続は管理者レベルで行う。
###イベントモニターの一覧を表示
SELECT EVMONNAME, TARGET_TYPE, TARGET FROM SYSCAT.EVENTMONITORS

###イベントモニターの開始
CONNECT TO [DBNAME] USER [USERID] USING
CREATE EVENT MONITOR [イベントモニター名] FOR STATEMENTS WRITE TO FILE '/XXX'
SET EVENT MONITOR [イベントモニター名] STATE 1

###SQLステートメントログ取得
DB2EVMON -DB [DBNAME] -EVM [イベントモニター名]

####イベントモニター終了・削除
CONNECT TO [DBNAME] USER [USERID] USING
FLUSH EVENT MONITOR [イベントモニター名]
SET EVENT MONITOR [イベントモニター名] STATE 0
DROP EVENT MONITOR [イベントモニター名]
Python で tail -f っぽいもの

元ネタ: [Python で tail -f]
(http://qiita.com/sakamotomsh/items/f1cc47010a90e1e790fb)

[Pythonでtailもどき]
(http://blog.liris.org/2010/01/pythontail.html) を見てもそんな大変じゃないと思う。

最近 [watchdog](https://pypi.python.org/pypi/watchdog) が便利だという記事を見かけました。

* [ファイル監視にwatchdogがかなり便利な件]
(http://qiita.com/PyYoshi@github/items/9744a138c018734c69db)

これをファイル監視に使いながらやってみました。
OS 非依存にするには [PollingObserver]
(http://pythonhosted.org//watchdog/api.html#module-watchdog.observers.polling) を使うようです。


```py3:tail-f.py
#!/usr/bin/env python
import os
import sys
import time
from os.path import dirname, exists

from watchdog.events import FileSystemEventHandler
from watchdog.observers.polling import PollingObserver


class TailHandler(FileSystemEventHandler):

    def __init__(self, path):
        self.path = path
        self.file = open(path, 'r')
        self.pos = os.stat(path)[6]

    def close(self):
        self.file.close()

    def print_line(self):
        self.file.seek(self.pos)
        for block in iter(lambda: self.file.read(32), ''):
            print(block, end='')
        self.pos = self.file.tell()

    def on_modified(self, event):
        if event.is_directory or self.path != event.src_path:
            return
        self.print_line()


def tail_like(path):
    observer = PollingObserver()
    handler = TailHandler(path)
    observer.schedule(handler, dirname(path))
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    finally:
        handler.close()
    observer.join()


def main():
    path = sys.argv[1]
    if not exists(path):
        print('{} is not found'.format(path))
        return 
    tail_like(path)


if __name__ == '__main__':
    main()
```

それぞれのターミナルで以下を実行する。

```bash
$ vm_stat -c 60 0.3 >> logs/vmstat.log
```

```bash
$ python tail-f.py logs/vmstat.log
```
APIアクセスキーを用いて、Ruby/RailsからRedmineのREST APIにアクセスする

Redmine本家にRubyからアクセスするサンプルはあったのですが、APIアクセスキーを用いてアクセスする方法がわからなかったのでちょっと調べてみました。簡単にいうと、リクエストヘッダにのせればいいようです(最初、`self.api_key`みたいなのあるのかなと思いましたが違いました）。

Authenticationの詳細は、以下のURLに掲載されています。今回は、
>passed in as a "X-Redmine-API-Key" HTTP header (added in Redmine 1.1.0)

の方法を採用しています。

- [Rest api - Redmine](http://www.redmine.org/projects/redmine/wiki/Rest_api#Authentication)

以下は、本家と同様、Redmineのリソース Issuesに対応したIssueモデルを作成する例です。以下のように設定しておけば、Railsおなじみの操作でCRUD処理ができるようになります。

```rb:issue.rb
require 'active_resource'

class Issue < ActiveResource::Base
  headers["X-Redmine-API-Key"] = 'your_api_key'
  self.site = 'https://redmine.yourdomain/'
end
```

以下はIssuesを全取得する例です。

```rb
Issue.find(:all)
```

# 参考と雑感
- [Rest api with ruby - Redmine](http://www.redmine.org/projects/redmine/wiki/Rest_api_with_ruby)
- [Trying to create issue on redmine from rails app](http://tiku.io/questions/2864224/trying-to-create-issue-on-redmine-from-rails-app)


試してはないけど、以下のようなGemもあるようです。

- [redmine_client | RubyGems.org | your community gem host](https://rubygems.org/gems/redmine_client)

REST Web APIとの連携システムをRuby/Railsで構築する際は、AcriveResouceを使っていきたいですね（APIを作成する側からしてもRESTの原則を意識して設計する必要があるので、お互いに良いと思います）。

そもそもの話では、ActiveResourceってRails4～は取り除かれたっぽいですが、これは流行ってないからなのでしょうか？Rest APIをラップするモダンな方法が何なのか気になります。
NginxとApacheのリバースプロキシのTimeOut時のHTTPステータスの違い

# これは何？
* リバースプロキシでTimeOutした場合、ApacheとNginxをHTTPのステータスに差があったのでメモしておく。

# 結論

リバースプロキシでTimeOutした場合、HTTPのステータスに差があった。

* Apacheの場合、ステータス：**502　Bad Gateway / Proxy Error**

```
xxx.xxx.xxx.xxx - - [03/Feb/2015:03:19:16 +0000] "GET / HTTP/1.0" 502 468 "-" "ApacheBench/2.3"
```

* Nginxの場合、ステータス：**504　Gateway Timeout**

```
xxx.xxx.xxx.xxx - - [03/Feb/2015:02:49:55 +0000] "GET / HTTP/1.0" 504 537 "-" "ApacheBench/2.3" "-"
```

# Conf

### nginxのConf

```nginx

location / {
      proxy_pass http://xxx.xxx.xxx.xxx;
      proxy_connect_timeout x;
      proxy_read_timeout x;
      proxy_send_timeout x;
}


```

### ApacheのConf

```apache

(略）

Timeout 1

（略）
<VirtualHost *:80>
    ProxyPass / balancer://mycluster/
    <Proxy balancer://mycluster>
        BalancerMember http://xxx.xxx.xxx.xxx/ retry=0
    </Proxy>
</VirtualHost>


```
PL/SQLでテストデータをInsertする

さくっとある程度の量のテストデータを用意したいときに使うテンプレート。

1.Insertの用意

```sql:sql1.sql
/* セッション内のトランザクションをリセット */
rollback;
/* クリーンインサートするためデータクリア */
truncate table tbl1;

begin
 for i in 1..1000 loop
  insert /*+ append */into tbl1 (id, point) values ('test' || to_char(i), i);
 end loop
 commit;
end;
/
quit
```
「/」＋「改行」がないとPL/SQLが実行されないので注意。

2.実行（Windows）

```bat:foo.bat
sqlplus user/pass@host @sql1
```
RockMotive 1.0.0.beta1 の変更点とか

メモ書き程度でしかないけど。

RockMotive 1.0.0.beta1 をついさっきリリースした。大体理想とする機能の実装が終わったので一旦 beta という形で公開するに至った。まだドキュメント等はない。

## クラス名の変更

先日の記事を書いた時点では `RM::Interaction` だったものが `RM::Context` に変更になった。素直に DCI に名前を寄せた形になる。特に抵抗のある事柄ではなかったので問題ない。

`RM::Interaction` から `RM::Context` に変わったことで `.interact` から `.execute` にメソッド名も変わってる。これも特にこだわりがあったものではないので、巷の DCI 実装に名前を寄せた形。

## `#execute` 内のロジックの変更

メタプログラミング度は上昇していて、 `#execute` 内での extend はインライン展開されるようになった。意味がわからないと思うのでこう変わったよというコード例を載せておく。

```rb
# 元の実装
args.each_with_index do |arg, n| 
  role = roles[n]
  arg.exnted(role) if role
end

# 新しい実装
eval(<<-EOF)
#{roles.each_with_index { |role, n| role.nil? ? '' : "args[#{n}].extend(#{role.name})"}
EOF
```

気持ち悪いことしてんなぁと思ったら正常。より高速にする方法を模索していて `Array#each` のコストを削れないかと考えた結果、どの引数にどのロールを当てるのかは固定なのだから事前に展開可能だということでこの形に至った。ちなみにほとんど誤差の範囲であったということも書いておく。あまりにも厳しいコードなので元の形に戻るかもしれない。

## キーワード引数への対応

推奨する利用法としてキーワード引数を推していきたいという気持ちがある。なんでかっていうと、先日の例に出てくる

```rb
def execute(shopper, seller)
```

こういうコードは、引数の名前にこそ意味があって、引数の順序に意味があるわけではない、というのが肝要な点の為。また、呼び出し元のコードでは `DealContext.execute(current_user, seller_user)` などのような形になることが想像できるが、この時、どういったロールが与えられるのか、呼び出し元では想像がつかず混乱を招くことを考えた結果。

キーワード引数に対応した現在では、上記のコードは

```rb
def execute(shopper:, seller:)
```

と書くことができるようになり、また呼び出し元では

```rb
DealContext.execute(seller: seller_user, shopper: current_user)
```

のように書くことができるようになる。引数の順序に意味はなく、与えられる名前こそに意味があるという点でこの表記に収まることが気に入っている。

以上。この辺でそろそろ引き上げて DCI 熱を一回冷まさないと……