OmniAICreator/Qiita-1.07M huggingface dataset:
Multi-Consumer/Multi-Producer Blocking Queue実装

セマフォ(Semaphore)または条件変数(Condition Variable)同期プリミティブを利用した、並行処理Blocking Queueの実装例（疑似コード）。

## 条件変数版
```c
condition not_full;
condition not_empty;
mutex guard;

void queue(data item) {
    lock(guard);
    while (!has_empty_slot())
        cv_wait(not_full, guard);
    put(item);
    cv_broadcast(not_empty);
    unlock(guard);
}

data dequeue() {
    lock(guard);
    while (!has_avail_item())
        cv_wait(not_empty, guard);
    data item = pop();
    cv_broadcast(not_full);
    unlock(guard);
    return item;
}
```

## セマフォ版

```c
semaphore fill_count = 0;
semaphore empty_count = QUEUE_SIZE;
semaphore guard = 1; // or mutex

void queue(data item) {
    sem_down(empty_count);
    sem_down(guard);
    put(item);
    sem_up(guard);
    sem_up(fill_count);
}

data dequeue() {
   sem_down(fill_count);
   sem_down(guard);
   data item = pop();
   sem_up(guard);
   sem_up(empty_count);
   return item;
}
```
sem_up＝V操作/signal操作
sem_down＝P操作/wait操作
ionic（AngularJSベース）のアプリケーション開発環境を構築


- ionic は AngularJS ベースの UIライブラリです。
	- ionic の公式ページ：http://ionicframework.com
	- GitHub：https://github.com/driftyco/ionic/
- 今回は、公式ページにあるような Cordova（PhoneGap）等からの利用ではなく、単純にスマホWEBサイト（非ネィティブアプリ）でUIライブラリとして利用することを想定しています。

# デモ

- 公式で提供のデモアプリケーションは、下記で説明する雛形に含まれています。よろしければどんなもんかご覧ください。
	- http://hkusu.github.io/AngularJS_ionicjs_demo
	- GitHub Pages に載せてます。
	- ファイルは minify していません
	- ionic のモバイル対応ブラウザは『iOS 6+, Android 4+』とのことなので、Android 2系などでは動かないかもしれません

# 環境構築の方針

- Yeoman の雛形ジェネレータを利用する
- 基本的にはここの手順に従う
	- https://github.com/diegonetto/generator-ionic
- そのほか Yeoman や Bower、Grunt、WebStorm など周辺環境については[私の前の投稿](http://qiita.com/hkusu/items/7d748b55ba73cc8a3675)を参照ください。

# 手順

- ionic の雛形ジェネレータをインストール

```
$ npm install -g generator-ionicjs
```

- 適当なディレクトリを作成し配下へ移動して、

```
$ yo ionicjs [今回つくるアプリケーション名]
```

- 例： `$ yo ionicjs test`
	- この `test` が AnugularJS上のアプリケーション名となる（後からでも書き換えは可能）

- すでに雛形のアプリケーションは入ってるので、動作確認

`$ grunt serve`

- そうするとブラウザが起動して次のように雛形アプリケーションが開きます。

![スクリーンショット 2014-03-15 15.40.22.png](https://qiita-image-store.s3.amazonaws.com/0/35733/7ec7fe14-569a-c92d-f76e-b1344e8189cd.png "スクリーンショット 2014-03-15 15.40.22.png")

- こちらへアップしてますので、よろしければご覧ください。
	- http://hkusu.github.io/AngularJS_ionicjs_demo
	- ソースはこちら
		- https://github.com/hkusu/AngularJS_ionicjs_demo

# 動作確認が終わったら

- 雛形のロジックやVIEWは下記のように格納されているので、これらを自分用のアプリケーション用に書き換えていけばOKです！

- マークアップしていく為の参考URL
	- http://ionicframework.com/docs/components/
	- http://ionicframework.com/docs/controllers/
	- http://ionicframework.com/html5-input-types/

![スクリーンショット 2014-03-15 15.37.42.png](https://qiita-image-store.s3.amazonaws.com/0/35733/2eed922f-a131-ee4d-b3ec-cf01885da3f1.png "スクリーンショット 2014-03-15 15.37.42.png")

# おまけ：ionic 公式の方法（Cordova等と連携）でやる場合

- 一応メモ。ただ今回は PhoneGap などでネィティブアプリ化するわけではないので参考程度に。
	- 余分なライブラリとか入っちゃったら嫌だし..

## 手順

- これどおりに
	- http://ionicframework.com/getting-started/
- もし途中でエラーがでたら下記のように追加でインストールする
	- `npm install -g ios-sim`
	- `npm install -g ios-deploy`
- `ionic start [アプリ名]` で雛形がつくられる模様
- Android向けのエミュレートは ant が必要？（未検証）

# そのほか参考

- ionic で作成されたアプリケーションのサンプル（on GitHub）
	- https://github.com/driftyco/ionic-angular-cordova-seed
		- `yo ionicjs` や `ionic start` で生成されるやつと一緒
	- https://github.com/driftyco/ionic-tutorial-status-fade
	- https://github.com/driftyco/ionic-weather
[Objective-C] UIViewControllerの回転周りのまとめ


##コードによる回転の制御

どうもiOS6あたりから制御方法が変わったらしい。
それまでは`shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation`メソッドで制御していたが、今はふたつのメソッドで制御するぽい。

```objc
//ここで回転していいかの判別をする
- (BOOL)shouldAutorotate
{
	if (/* なにがしかの回転していいかの判定処理 */) {
		return YES;
	}

	return NO;
}

//どの方向に回転していいかを返す（例ではすべての方向に回転OK）
- (NSUInteger)supportedInterfaceOrientations
{
	return UIInterfaceOrientationMaskAll;
}
```

ちなみに回転のタイミングでなにかしたい場合。

```objc
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
	//回転時に処理したい内容
}
```

###shouldAutorotateが呼ばれない場合

[こちらの記事](http://ken-plus.blogspot.jp/2012/09/ios6-uinavigationcontrollerautorotate.html)に書いてありました。
記事では、`self.window.rootViewController`に、自分で作成した`UINavigationController`を設定していると動作しないようです。
回転をコードから制御したい場合は、UINavigationControllerのサブクラスを作り、そちらに上記デリゲートメソッドを実装することで制御可能なようです。

####サンプルコード

```objc
@interface HogeNavigationController : UINavigationController

@end

/////////////

@implementation HogeNavigationController

- (BOOL)shouldAutorotate
{
	return YES; // or NO
}

- (NSUInteger)supportedInterfaceOrientations
{
	// ポートレイトだけ許可
	return UIInterfaceOrientationMaskPortrait;
}

@end
```

####UINavigationControllerのカテゴリで対処する

ただ、回転のためだけに継承するのもあれなので、ということでカテゴリで対応する方法のほうがスマートかもしれません。

【UINavigationControllerの子ViewControllerにも回転イベントを伝える】
これには、カテゴリによる拡張を使うことでシンプルに解決できます。

```objc
@implementation UINavigationController (Rotation)

- (NSUInteger)supportedInterfaceOrientations
{
	return [self.viewControllers.lastObject supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate
{
	return [self.viewControllers.lastObject shouldAutorotate];
}
@end
```


#####参考

* [UIViewController iOS6での画面回転への対応](http://qiita.com/yusuga_/items/8cc82376edb40e09f0e7)
* [iOS6の画面回転対応をしたのに画面が思うように回転できない場合のチェックポイント](http://www.ict-fractal.com/blog/2012/09/ios6.html)

#####解説

UINavigationControllerのカテゴリで回転に関するdelegateをオーバーライドします。

その上で、自身の`viewControllers`の最後のViewControllerにも回転系のメッセージを送ります。
理由としては、（ *上記リンクの下の記事を見てもらうと分かりますが* ）仕様的に`rootViewController`にUINavigationControllerが設定されている場合、その子ViewControllerには回転系のメッセージは送られないようです。
そのために、カテゴリで拡張し、最後ViewControllerの（つまり現在表示されてる）ViewControllerにメッセージを送っている、というわけです。

--------------------------


##イベントの発生順

1. `shouldAutorote`
2. `supportedInterfaceOrientations`
3. `willRotateToInterfaceOrientaion:duration:`


----------------------------------


## 起動時の取得

起動時の画面の向きを取得するには、UIViewControllerのプロパティ`interfaceOrientation`を利用すればいいようです。

```objc
UIInterfaceOrientation direction = self.interfaceOrientation;
if(direction == UIInterfaceOrientationPortrait){
    // 縦（ホームボタンが下）
}
else if(direction == UIInterfaceOrientationPortraitUpsideDown){
    // 縦（ホームボタンが上）
}
else if(direction == UIInterfaceOrientationLandscapeLeft){
    // 横（ホームボタンが左）
}
else if(direction == UIInterfaceOrientationLandscapeRight){
    // 横（ホームボタン右）
}
```
酷いHTMLを書かないために




##リストにsectionやarticle、見だしを書かない

```html
<ul class="article-link">
…
</ul>
```

こんな要素があったとします。
大抵はこの要素をみてリンク集かな？と思いますよね。

実際リンク集なのですが

```html
<ul class="article-link">
<li>
<a href="permlink">
<article>
  <header>
    <p class="date">2014-12-01</p>
    <h1>タイトル</h1>
  </header>
  <figure>
	<img src="">
  </figure>
   <p>サマリー</p>
</article>
</a>
</li>
<li>…以下繰り返し</li>
</ul>
```
というようなサムネイル記事が書かれていることがあります。コード自体はもっと酷いこと多く、sectionやarticle、asideでラップせずにh1が現れることが多いです。文中リストから新たなsectionが始まるとか何考えてるのかわからないですよね。


```html
<div class="article-link">
<artcile class="description">
  <a href="permlink">
  <header>
    <p class="date">2014-12-01</p>
    <h1>タイトル</h1>
  </header>
  <figure>
	<img src="">
  </figure>
   <p>サマリー</p>
  </a>
</article>
<article>
..
</div>
```
こういった記事一覧はDIVで囲めば十分なんです。HTMLスクラップしたときの汎用性も考えるとリンクは中にあった方がいいでしょう。

文章データを配列化する要素はありません。

## sectionをdivの代わりに使わない

sectionあるあるですが

``` html:sectionとして使い方がなってない
<section>
<h2>見だし見出し</h2>
<h2>見だし見出し</h2>
</section>
```
sectionの中にセクショニングの書きだしとなる見だしがありません。
WEB制作会社などが得意とする書き方のようですがこれではテキストをどう保守していくのか疑問です。もしこのような囲みがほしい場合はデザインとしてなのでDIVでいいんです。

``` html:改善したセクション
<section>
<h2>見だし見出し</h2>
<p>段落段落</p>
</section>
```
こういった指摘をするとこれだといいんでしょ？上のようになりがちですが駄目です。
これは複数人で編集を加えるとどこかで

``` html:結局こうなる
<section>
<h2>見だし見出し</h2>
<p>段落段落</p>
<h2>見だし見出し</h2>
<p>段落段落</p>
</section>
```
なります。結局同じです。
sectionをDIV代わりに使っているからh2から始めたがるのです。


###section要素の見だしは必ずh1から始める
セクショニングは見出しによって生成されるのでトップレベルの見出しが複数あることはありません。

h2やh3から始めてしまうとそのセクショニング内で同一レベルの見だしを複数書いてしまうミスが発生します。書いた本人が間違えなくても他人が間違え始めます。HTML5はHTML4とは違うので割り切ってh1から書きましょう。

そうすることでCSSとともに適切にモジュール化することもできるようになります。文章データとしてもキレイなデータになるのでリニューアルごとに大きな変更が必要なくなります。

sectionごとにMarkdown文章を書くとルール化すればだいたい解決します。新しいMarkdownを書き始めたら次のsectionとして構造化するそれだけなのです。


```html:module化
<section class="module">
<h1></h1>
<h2></h2>
<p></p>
</section>

```
```css:moduleクラス
.module{

}
.module h1{

}
.module h2{

}
.module p{

}
```


```md:markdownによるセクショニング運用
<section markdown="1">
#markdown化による運用 見だしレベル1から始まる
##このような書式

段落段落
</section>

<section markdown="1">
#次のsectionには新しいmarkdown 見だしレベル1から始める

文章文章
</section>

```

## ついでにaddressについて
そのHTML文章を書いた人の奥付です。

## a nameでなくidを使いましょう

これいつの時代の人の主張なの？。楽天ルールでしょうか？。
どのブラウザがIDフラグメントに対応してなかったのか気になりますよね。

## 制作上におけるXHTMLへの誤解
ウェブサービスやWEB制作で使われているXHTMLというものは実はXHTMLじゃありません。基本的にHTML4.01互換です。

XHTMLは存在すること自体に失敗し、諦められ切り捨てられたのです。Web上で使われているXHTMLはHTML4互換としても動くXHTML1.0 TraditionalでHTML互換としてしか使われていませんのでXMLは関係ありません。XMLの機能が使われることもありません。常にHTML4.01相当のものです。XHTML、XMLとは無関係のものとして運用されていてこれからも関係することはありません。事実上の現役とされる運用フォーマットはHTML4.01とHTML5です。ガラケーはしらん。

あとXHTMLをHTMLとして配信する場合、XML宣言を省略するほうが文章の運用として正しいです。




## HTML5 への簡単なとらえ方
XHTMLは普及しなかったのでXMLにHTML機能をもってくるんではなくHTMLにXML機能を持ってくればいいんだとXMLのいくつかの実装を持ってきて「ブラウザで動くこと」と「ブラウザの仕様」を優先させた物がHTML5です。XMLの整形式に変わりブラウザで気軽に使える次世代整形式フォーマットとしてHTML5をみてみるのもいいでしょう。
rbenvの動作概要（※readmeより）


* PATHの先頭にrbenvのシムを追加
* ruby, rake, gem とかruby関連のコマンドが実行されたら、rbenvのシムが最初に見つかるのでそれが実行される
* シムはrbenvの設定に従って、該当するバージョンのコマンドを探して実行する

# バージョンの決定方法

以下の順番で探す

* RBENV_VERSION 環境変数が設定されていたら、それを使用する
* 実行するスクリプトが格納されているディレクトリから.ruby-version を探し、無かったらその親ディレクトリ..というようにrootまでを探、見つかったらそれに記述されているバージョンを使用
* カレントディレクトリから .ruby-version を探し、無かったらその親ディレクトリ..というようにrootまでを探、見つかったらそれに記述されているバージョンを使用
* ~/.rbenv/version を探し、見つかったらそれに記述されているバージョンを使用

# 各バージョンのRubyコマンドのインストール場所

各バージョンのRubyコマンドは`.rbenv/versions` 配下に各バージョン毎のディレクトリが作られてインストールされる
Androidのビルド用にSun JDK 6をUbuntu 12.04 LTSへインストールする

# 概要

Ubuntu 12.04 LTS上でAndroidをビルドしようとしたところ、Sun JDK 6のインストールに手こずってしまいました。OAB-Javaを使用することで解決できたので、本記事では、その解決方法をメモします。

# はじめに

Android 2.3以上のビルドには、Sun JDK 6のインストールが必要です。[Android Open Source Project](http://source.android.com/index.html)の「[Initializing a Build Environment](http://source.android.com/source/initializing.html)」には、リモートのAPTリポジトリを追加する方法が示されています。しかし、この方法でインストールを実行すると、下記のエラーメッセージが出て失敗してしまいました。

>Package sun-java6-jdk is not available, but is referred to by another package.
>This may mean that the package is missing, has been obsoleted, or
>is only available from another source
>
>E: Package 'sun-java6-jdk' has no installation candidate

つまり、Android Open Source Projectに記載の方法では、Sun JDK 6をUbuntu 12.04 LTSにインストールできません。そのため、他の方法を探しました。

# 解決方法

下記の方法で、Sun JDK 6をインストールできることがわかりました。

* Oracleから提供されているインストーラを使用する（[http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR](http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR)）。インストールは簡単ですが、アンインストール時には手作業でファイルを削除しなければなりません。
* [OAB-Java](https://github.com/flexiondotorg/oab-java6)を使用してAPTリポジトリを構築し、インストールする。スクリプトの実行に多少の手間がかかりますが、APTにJDKが登録されるため、インストールされたバイナリの管理やアンインストールが容易になります。

APTにJDKを登録したかったので、今回はOAB-Javaを使用しました。以下では、OAB-Javaを使用してSun JDK 6をインストールする方法を示します。

# OAB-Javaを使ってSun JDK 6をインストール

下記の手順で、Sun JDK 6をインストールします。今回使用したのは、OAB-Java 0.3.0です。

1. oab-java.shのダウンロード
1. oab-java.shの実行
1. sun-java6-jdkパッケージのインストール

## oab-java.shのダウンロード

[OAB-Java](https://github.com/flexiondotorg/oab-java6)のGitHubプロジェクトページにある「Releases」から、oab-java.shをダウンロードします。例えば、OAB-Java 0.3.0をwgetでダウンロードするには、次のようにします。

```bash
wget https://github.com/flexiondotorg/oab-java6/raw/0.3.0/oab-java.sh
```

## oab-java.shの実行

ダウンロードしたoab-java.shに実行権限を付けます。管理者権限でスクリプトを実行し、完了するのを待ちます。

```bash
chmod a+x oab-java.sh
sudo ./oab-java.sh
```

もしも、エラーが出て失敗した場合は、oab-java.sh.logを確認してください。「Unmet build dependencies」や「command not found」というメッセージが出ている場合は、そのメッセージに示されているパッケージをインストールします。

## sun-java6-jdkパッケージのインストール

以上で、apt-getコマンドからSun JDK 6をインストールする準備が整いました。下記のコマンドで、Sun JDK 6をインストールできます。

```bash
sudo apt-get install sun-java6-jdk
```

すでに他のJDKやJREがインストールされている場合は、下記のコマンドを実行し、Sun JDK 6を使用するように設定します。

```bash
sudo update-alternatives --config javac
sudo update-alternatives --config java
```
【JavaScript】プロパティへのアクセス

JavaScriptでのオブジェクトは名前と値を持つプロパティの集合である。

```js
// taroオブジェクト生成
// {プロパティ名:プロパティ値, ...}
var taro = {living : true, age : 25, gender : 'male'};
```

オブジェクトの各プロパティを操作するには、操作対象のプロパティにアクセスする必要があるが、そのアクセス方法は2種類存在する。

##ドット記法によるアクセス
```js
// プロパティの取得
console.log(taro.living, taro.age, taro.gender);
// 出力：true 25 'male'

// プロパティの更新（設定）
taro.living = false;
taro.age = 40;
taro.gender = 'female';
console.log(taro);
// 出力：Object {living: false, age: 40, gender: 'female'}
```

##ブラケット記法によるアクセス
```js
// プロパティの取得
console.log(taro['living'], taro['age'], taro['gender']);
// 出力：true 25 'male'

// プロパティの更新（設定）
taro['living'] = false;
taro['age'] = 40;
taro['gender'] = 'female';
console.log(taro);
// 出力：Object {living: false, age: 40, gender: 'female'}
```

##で、どうやって使い分ける？
記述の単純さから、基本はドットによるアクセスにすべき。
しかしながら、ブラケットが有利な場合も存在する。

例えば変数を使用してアクセスしたい場合。
変数の値を変えればアクセスするプロパティを変更することも可能になる。

```js
var obj1 = { TaroTanaka: 'male',
             HanakoTanaka: 'female' };
var first = 'Hanako', last = 'Tanaka';
console.log(obj1[first + last]); // 出力：female
first = 'Taro';
console.log(obj1[first + last]); // 出力：male
```
また、数値や予約語などといった、不正な名前を持つプロパティへアクセスする場合も有効である。

```js
// プロパティ名に数値や予約後は使用できない（文字列は可）
var obj2 = { '123': '数値', 'class' : '予約語'};
console.log(obj['123'], obj['class']); // 出力：数値 予約語
```
exportsOverrideでライブラリ名のディレクトリ直下にファイルを配置する

微妙に不思議な挙動なのでメモ。

exportsOverrideを設定する際、ライブラリ名のディレクトリ直下にファイルを配置したい場合、ディレクトリ名を空にする必要がある。

```bower.json
{
  "name": "dummy",
  "devDependencies": {
    "font-awesome":  "*"
  },
  "exportsOverride": {
    "font-awesome": {
      "": [
        "**/*.eot",
        "**/*.svg",
        "**/*.ttf",
        "**/*.woff"
      ]
    }
  }
}
```

上記のように設定すると、ディレクトリ構造は以下のようになる。

```
font-awesome/
    font-awesome.eot
    font-awesome.svg
    font-awesome.ttf
    font-awesome.woff
```
WindowsのProxy設定を全ユーザ共通化する

##前提

WindowsのバージョンはProfessional edition等グループポリシーエディタが使えること。

##グループポリシーエディタを起動
[Windows]+[R]　で"ファイル名を指定して実行"のウィンドウが表示されるので
名前(O):　欄に "gpedit.msc"　で起動出来る。

##設定
コンピュータの構成 -> 管理用テンプレート -> Windowsコンポーネント -> Internet Explorer

コンピュータ別にプロキシを設定する(ユーザ別ではなく)　を　"有効"　にしてプロキシ設定をやり直す。

![Proxy共通化.PNG](https://qiita-image-store.s3.amazonaws.com/0/36514/e46b3c3f-99a4-c421-cf60-b33f42cc9ff1.png)

この設定をすると普通にIEを起動してもインターネットオプションのプロキシ設定がグレーアウトして変更出来なくなる。
設定を変更するにはIEを"管理者として実行"で起動する必要がある。
Python で整数を可逆スクランブルする


# 発端

## ケース1

とあるサービスで, ユーザ ID を整数の連番で採番しており, ユーザにユーザ ID を見せる際, そのままユーザに見せてしまうと, ユーザ数が予測されてしまう.
そこで, ユーザ ID を別の整数に可逆変換し, その値をユーザに見せたい.

## ケース2

雑誌などに, 整数のみで構成されたシリアルキーを掲載する際, ランダムでシリアルキーを生成したいが, 件数が増えると重複チェックで大量にリソースを消費する.
そこで 連番の整数を別の整数に可逆変換し, その値をシリアルキーとしたい.

# 解決策

## 偉大な先人の知恵を借りる

[整数を可逆スクランブルする - C Sharpens you up](http://cs.hatenablog.jp/entry/2013/06/19/135527)

## 数値を変換する関数を Python で実装

先人の知恵を拝借し, 全単射な変換関数を Python で実装する.

```python:scramble.py
def scramble(number, salt, inverse_salt):

    """
    数値を相互変換する.

    :param int number: 変換する整数
    :param int salt: 変換のキーとなる整数
    :param int inverse_salt: 変換のキーとなる整数の 2^32 を法とする逆数
    :return: 変換後の整数
    """

    _assert_number(number)
    _assert_salt(salt, inverse_salt)
    return _trim32bit(_reverse32bit(_trim32bit(number * salt)) * inverse_salt)


def _assert_number(number):
    assert 1 <= number <= 0xFFFFFFFF


def _assert_salt(salt, inverse_salt):
    assert _trim32bit(salt * inverse_salt) == 1


def _reverse32bit(number):
    number = ((number >> 1) & 0x55555555) | ((number & 0x55555555) << 1)
    number = ((number >> 2) & 0x33333333) | ((number & 0x33333333) << 2)
    number = ((number >> 4) & 0x0F0F0F0F) | ((number & 0x0F0F0F0F) << 4)
    number = ((number >> 8) & 0x00FF00FF) | ((number & 0x00FF00FF) << 8)
    number = (number >> 16) | (number << 16)
    return number


def _trim32bit(number):
    return number & 0xFFFFFFFF
```

## 変換キーと, その逆数を得る関数を Python で実装

逆数の簡単な算出方法が判らず, 社内チャットで @melponn に相談したら, 次の記事を紹介された.
[Modular multiplicative inverse function in Python - Stack Overflow](http://stackoverflow.com/questions/4798654/modular-multiplicative-inverse-function-in-python)

変換キーはランダムで決定し, その逆数を拡張ユークリッド互除法で算出する.

```python:generate.py
import random


class InverseDoesNotExist(Exception):
    pass


def generate_salt():

    """
    scramble で使用する salt と inverse_salt を生成する.

    :return: salt, inverse_salt
    """

    salt = _gen_salt()
    return salt, _modinv(salt, 0x100000000)


def _gen_salt():
    salt = random.randint(3, 0xFFFFFFFF)
    if salt % 2 == 0:
        salt += 1
    return salt


def _egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = _egcd(b % a, a)
        return (g, x - (b // a) * y, y)


def _modinv(a, m):
    g, x, y = _egcd(a, m)
    if g != 1:
        raise InverseDoesNotExist()
    else:
        return x % m
```

## 動作確認

```python:test.py
salt, inverse_salt = generate_salt()

def f(number):
    return scramble(number, salt, inverse_salt)

for n in xrange(1, 0xFFFFFFFF):
    assert f(f(n)) == n
```

# 注意点

雑誌のシリアルコードなどで使用する場合, 下記を考慮すること.

- 連番を避けるため, 2^32 個発行しない
- CRC 値を混ぜ, もう一段, 別の可逆変換を行う
Node.jsで文字コードの自動判別と自動変換


* 文字コードの自動判別 - [jschardet](https://www.npmjs.org/package/jschardet)
* 文字コードの変換 - [iconv](https://www.npmjs.org/package/iconv)

流れとしては`jschardet`を使って文字コードを自動判別し、その文字コードから`iconv`を使ってUTF-8に変換します。

[shoma2daをフォロー](https://twitter.com/intent/user?screen_name=shoma2da)

まずはモジュールのインストール。

```bash
$ npm install jschardet --save
$ npm install iconv --save
```

文字コード判定をしてみます。

```js	
//test.jsに書きました
var jschardet = require('jschardet');

var notUtf8String = /* どこかから持ってきたUTF-8じゃなさそうな文字列 */;

var detectResult = jschardet.detect(notUtf8String);
console.log(detectResult);
```

実行してみます。

```bash
$ node test.js
{ encoding: 'ISO-8859-2', confidence: 0.7299161297501421 }
```

今回の例では`ISO-8859-2`っぽいよ！というのが出ました。

続いて変換です。
`iconv`を使えばこちらもシンプルにできます。

```js
var Iconv = require('iconv').Iconv;
var iconv = new Iconv('ISO-8859-2', 'UTF-8//TRANSLIT//IGNORE');
var convertedString = iconv.convert(notUtf8String).toString();
```

### 合わせて書くと

```js
var jschardet = require('jschardet');
var Iconv = require('iconv').Iconv;

var notUtf8String = /* どこかから持ってきたUTF-8じゃなさそうな文字列 */;

//文字コード判定
var detectResult = jschardet.detect(notUtf8String);

//判定した文字コードからUTF-8に変換
var iconv = new Iconv(detectResult.encoding,'UTF-8//TRANSLIT//IGNORE');
var convertedString = iconv.convert(notUtf8String).toString();
```

[shoma2daをフォロー](https://twitter.com/intent/user?screen_name=shoma2da)
MySQL プロシージャサンプル   

```lang:Function@MySQL
CREATE PROCEDURE `p.resource-update`(
     OUT _ret         VARCHAR(255),
     IN  resource      INT,
     IN  resource_name VARCHAR(255),
     IN  resource_note TEXT       
)
BEGIN

   DECLARE val BOOLEAN;
   DECLARE EXIT HANDLER FOR SQLEXCEPTION
   BEGIN
     ROLLBACK;
   END;
 
   SET _ret = 'ERROR00';
 
   START TRANSACTION;
 
   main_proc: BEGIN

      /* resource の存在チェック */
      IF NOT `baihu`.`f.resource-p`(resource) THEN
         SET _ret = 'ERROR02';
         LEAVE main_proc;
      END IF;

      /* update */
      UPDATE `baihu`.`rs_resource`
         SET `update-datetime` = now()
           , `name`            = resource_name
           , `note`            = resource_note
       WHERE `resource-id`     = resource;

      SET _ret = NULL; 

   END main_proc;
 
   IF _ret IS NULL THEN
      COMMIT;
   ELSE
      ROLLBACK;
   END IF;

END
```
MySQL ファンクション(述語) 

```lang:Function@MySQL
CREATE FUNCTION `f-resource-p`(
   resource INT
) RETURNS tinyint(1)
BEGIN

  DECLARE cnt INT;

  SELECT count(*) INTO cnt 
    FROM schema.rs_resource
   WHERE `resource-id` = resource;

  IF cnt=0 THEN
     RETURN FALSE;
  END IF;

  RETURN TRUE;

END
```
36進数でちょっと遊ぶ (簡単な英文を書く)

16進数は[a-f]までですが、36進数なら全てのアルファベットを使えます
英単語なら完全に数値として読めます

#10進数との相互変換

```rb:Ruby
"apple".to_i(36) #=>17995730

17995730.to_s(36) #=>"apple"
```

```js:JavaScript
parseInt("apple", 36) //=>17995730

(17995730).toString(36) //=>"apple"
```
「apple」という単語が書かれているのでは無い
「17995730」という10進数の36進表記なのだ...

## JavaScriptの整数の計算誤差について
JavaScriptの場合、桁数が多いと誤差が出ます
自然数の場合は2^53 (9,007,199,254,740,992)までなら問題無いです

- [JavaScriptの大きな数と小さな数の仕組みを理解する ～ IEEE754入門 ～](http://d.hatena.ne.jp/mindcat/20091108/1257677412)
- [数値 - JavaScript プログラミング解説](http://www.crystal-creation.com/web-appli/technical-information/programming/javascript/grammar/data-type/number/)

#記号も使いたい
36進数の文字種は0-9の数値と、a-zのアルファベットのみです

記号を使いたい場合、記号リストを用意して、0-9に割り当てて置換します
これで簡単な英文なら表現できます

```rb:lm.rb
base10 = 121448246333169538562105956741709730840134098137499009964148600669661648586559384734426780238529123084195348

base36 = base10.to_s(36)
#=> "i0thought0what0i1d0do0was20i1d0pretend0i0was0one0of0those0deaf3mutes4"

symbols = " ',-."

puts base36.gsub(/[0-9]/){|d|symbols[d.to_i]}
#=> "i thought what i'd do was, i'd pretend i was one of those deaf-mutes."
```
最初は`base36.tr("0-9", symbols)`としてましたが「^-\」を含んでいた場合にうまく変換できない可能性があるのでgsubにしました
(エスケープするにしても結局gsubしなければならないと思うので)

## 記号含めて変換する

```rb:base36utils.rb
module Base36Utils
  def get_symbols(str)
    syms = str.scan(/[^a-zA-Z]/).uniq.sort.join
  end

  def to_base36(base10, symbols="")
    base10.to_s(36).gsub(/[0-9]/){|d|symbols[d.to_i]}
  end

  def to_base10(base36, symbols="")
    base36.gsub(/[^a-zA-Z]/){|c|symbols.index(c)}.to_i(36)
  end
end
```


```rb:sample.rb
require_relative 'base36utils'

include Base36Utils

str = "You know what I'd like to be? I mean if I had my goddamn choice, I'd just be the catcher in the rye and all."

syms = get_symbols(str)

base10 = to_base10(str, syms)
base36 = to_base36(base10, syms)

print "original: "; p str
#=> "You know what I'd like to be? I mean if I had my goddamn choice, I'd just be the catcher in the rye and all."
print "symbols: "; p syms
#=> " ',.?"

puts
puts "encoded (base10): "; p base10
#=> 1160298464533611188100561590112133834453448123656789220667590285674166764197329933937388578689862569716412816858127688041239872565463587711302882017935722749774989021127

puts "decoded (base36): "; p base36
#=> "you know what i'd like to be? i mean if i had my goddamn choice, i'd just be the catcher in the rye and all."
```

## アンダーバー
Rubyの場合、36進数の文字列にアンダーバーを入れても読んでくれます
(ただの目印なので10進数に変換したら元に戻す方法はありません)

```rb:double_compile.rb
num = "double_compile".to_i(36) #=>64868740571137744994

puts num.to_s(36) #=> "doublecompile" 
```

# 参考
[Wikipedia: Base 36](http://en.wikipedia.org/wiki/Base_36)
extendの優先度

##概要
元classとextendするmoduleに同名メソッドがあった場合、どれが使われるのか調べてみた。

##準備

```first_module.rb
module FirstModule
  def befo
    p 'first'
  end

  def say
    p 'first'
  end

  def modu
    p 'first'
  end

  def first
    p 'first'
  end
end
```
```last_module.rb
module LastModule
  def befo
    p 'last'
  end

  def say
    p 'last'
  end

  def modu
    p 'last'
  end

  def last
    p 'last'
  end
end
```
```sasaki.rb
require 'first_module'
require 'last_module'

class Sasaki
  def self.befo
    p 'original'
  end

  extend FirstModule
  extend LastModule

  def self.say
    p 'original'
  end

  def self.orig
    p 'original'
  end
end
```

## 結果
元classのメソッドは使える（当然）
`Sasaki.orig   #=> "original"`

moduleの各メソッドも使える（extendの確認）
`Sasaki.first  #=> "first"`
`Sasaki.last   #=> "last"`

moduleの同名メソッドは後にextendされた方が採用される
`Sasaki.modu   #=> "last"`

同名メソッドは元classでの定義が一番優先される
`Sasaki.say   #=> "original"`

extend指定の方が後でも元classの定義が一番優先される
`Sasaki.befo   #=> "original"`

## まとめ
優先度は以下の通り。
**元ファイル ＞ 最後にextendされたmodule ＞ 最初にextendされたmodule**
コマンドラインならファイルの検索がこんなに簡単に! (zsh編)

引数が多くて機能を把握できないfind。
でも大丈夫、zshがあればそんなの覚えなくても簡単！

- 現在のディレクトリ以下のPDFファイルを一覧する

```zsh
ls **/*.pdf
```

- あるディレクトリ(dir1)以下にあるであろうファイル(func1.cpp)を探す

```zsh
ls dir1/**/func1.cpp
```

- 現在のディレクトリ以下のソースファイルから特定の関数名を探す

```zsh
grep "func1" **/*.cpp
```

- ゴミファイル(func.cpp~とかのバックアップファイル)を削除する

```zsh
rm **/*~
```
Railsで2つのカラムの入れ替え

Railsでカラムをbefore_createで入れ替えるという処理をしたくて、

```rb
date2, date1 = date1, date2
```

と書いたはいいが値の入れ替えは行われなかった。それどころかnilになってしまった。

```rb
self.date2, self.date1 = self.date1, self.date2
```

と、`self`を付けると入れ替えができた。以下のプログラムでも同様の現象が起きた。

```rb
class Hoge
  attr_accessor :a, :b

  def func
    a, b = b, a
    p a, b #=> nil nil
    p self.a, self.b #=> 1 2
  end
end

h = Hoge.new
h.a, h.b = 1, 2
puts "#{h.a}, #{h.b}" #=> 1, 2
h.func
puts "#{h.a}, #{h.b}" #=> 1, 2
```

`a, b = b, a`の左辺値がローカル変数になってるからだと思うのだけれども、その直後の`a, b`がnilだった。バグ?
Scaloidで画像表示～ネットワーク利用篇

前回は画像をフォルダに格納して表示させました。

今回はインターネット上の画像を表示させてみましょう。

というわけで、一つメソッドを作りましょう。

```scala:Main.scala
  def getImage(surl: String): Drawable = {
    val url = new URL(surl)
    val inputStream = url.openStream
    Drawable.createFromStream(inputStream, "webimg")
  }
```

呼び出す側はこんな感じ

```scala:Main.scala
SImageView(getImage("http://e.blog.xuite.net/e/7/5/f/10880041/blog_1807248/txt/62586664/16.jpg"))
```

さて、ではこれで上手くいくかというとそうでもなくて
AndroidManifest.xmlに
`<uses-permission android:name="android.permission.INTERNET" />`
の記述をしておかないといけません。
設定がきちんとされていれば
`android:run`
で走らせた時に以下のように画像が表示されます。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/6da8e1a6-0197-41fd-07cb-036267ec0391.jpeg)

可愛いですね。
git pull は安全ではない?

[Is `git pull` the least problematic way of updating a git repository?](http://stackoverflow.com/questions/15316601/is-git-pull-the-least-problematic-way-of-updating-a-git-repository) と云ふ Stack Overflow の Q&A を見掛けたんだが、 `git pull` は考へ無しにローカルブランチとリモートブランチをマージするから良くないんだと。う～ん、どうですかねえ。

ブランチをマージしたら動かなくなったと言ふのは可能性としてはありうるけれども、コンフリクトが発生しない様な簡単なマージでさういふことが起こることはかなり稀なので、いちいちマージして良いかどうかをマージ前に検討するのは割と無駄骨である様な気がする。

もっとも、俺は普段 `git remote update --prune` を使ふことが多いので `git pull` の有害性に関しては特に考へたことは無かったのだが。

そもそも「変更は常に master 以外の開発用ブランチを作ってそこで行ふ」のと「master へのマージは常に pull request のマージボタンを使ふ」といふポリシーだとローカルレポジトリに master ブランチは無くて良いので、ローカルの master にリモートの master をマージするといふ作業自体が発生しないのであった。

結局、 `git pull` を危険とみなすかどうかはそのレポジトリの運用方針次第だと思ふ。
AWS Gameday 2014 参加してきた

##事前準備
#予習(1週前)

対戦型システム信頼性向上策体感イベント『GAME DAY』は前日3/14(金)、4箇所(東京/大阪/名古屋/仙台)同時開催!! 
http://dev.classmethod.jp/cloud/aws/jaws-days-2014-game-day-at-4-places/

リンク先にあるレポート。
雰囲気もつかめてとても参考になりました。

#一夜漬け(前日)

募集ページのFAQより、第2回(東京)、第3回(re:Invent)と同様、SQS中心のシステムと推定。

>http://jaws-days.doorkeeper.jp/events/8945
>
>Q. どんな種類のシステムを構築するのですか？
>A. システムの詳細はGame Day当日に発表されますが、EC2、SQS、SNS、>PythonおよびAWS CLIツールに慣れておくことをオススメいたします。

過去資料を参考しながらテスト構築を実施。

>第2回の資料
>https://s3.amazonaws.com/www.awsgameday.com/Japan/20130608/index.html
>第3回の構築ガイド
>http://www.awsgameday.com/instructions.html
>CloudFormationテンプレート
>https://github.com/Answers4AWS/aws-gameday-2013

ひと通りの動作確認と、攻撃、防御方針の目処がたちました。

* ワーカー用として提供されるサンプルのpythonスクリプトは、米国東海岸(us-east-1)専用。一応一行パッチで他リージョンでも動く。
* オートスケール関連、現在のAWSコンソールならCLIより効率良く設定できそう。
* 2013年末リリースのAWSのAPIログを記録するCloudTrail、JSONパーサーを用意しなくても、jqで概要は把握できそう。
* 2014年1月リリースされたSQSのDead Letter Queue、Inputキューの無効化に使える。

##当日
#チーム分け
東京会場の参加者は30名強。
席が近かったメンバ3,4名でのチーム分け。
自分は、@sora_h さん、とささんの3名、チーム名Blue light of deathでの参戦となりました。

#システム構築、守りを固める

今回のゲーム、システムは過去開催のものと同じでした。
ワーカーのEC2インスタンス、オートスケール周りの設定はメンバに任せ、自分は周辺作業に専念。

* ワーカー出力先のs3バケット作成
* ワーカー入出力用のSQSキュー設置、テストメッセージ投入。
* AWS APIログ取得の為、us-east-1,us-west-2でCloudTrail を有効化
* ワーカー用AMI、us-east-1からus-west-2にコピー
* us-west-2(Oregon)でワーカーインスタンスを起動、ワーカー化の準備。
* Oregonインスタンスにjqなどをインストール、s3のCloudTrailログ表示を確認。
* CloudFomerを起動し、テンプレート生成とローカルにも退避。

GoogleDocsのスプレッドシートやチャットも活用し、時間内に余裕を残して構築は完了。

また余った時間で、メンバはインスタンスの公開鍵(authorized_keys)の改竄対策や、各種設定値の再確認など実施。

アンフェア、時間不足などで実施は見送ったけど、
* MaketPlaceのCentOSでワーカーを作成。EBSのマウント回避
* 攻撃者のPoweruser権限をIAMロールで制限。AWSコンソールなどのアクセスを絞る。
などとアイデアは次々と。

実業務もこんな感じで出来たなら、きっと愉しいです。






#相手チームのシステムを攻撃

マッチングシステムで案内された攻撃対象、名古屋の「ゴゴーひつまぶし」さん。

自分の施した攻撃内容は以下のとおり。

* dead letter queues用として、新規SQSキューを作成
* InputQueは、Timeout1秒、Maximum Receives1回、Dead Letter queuesに誘導。
* s3上に保存されていたCloudFormationテンプレート、AMIのIDをAmazon Linux→Ubuntuに差替えたものに差替。
* 画像出力先のs3バケットの参照制限。RequesterPayのオプションを有効とし、通常の参照を制限し、併せてバケットポリシーにgetObjectを反映。
* SQSのInputCue、CloudWatchアラーム用SNSの通知先とし、ゴミメッセージを蓄積させる。

メンバは
* オートスケールグループ設定変更
* VPCのルーティングテーブル変更
* ダミーのEC2インスタンス、s3バケットなどの設置
などを実施。

IAM権限持たないPowerUserの為、IAM Roleが設定できず
userdataを改変したLounchConfigを作れないのを見て、
今回OSレベルでの攻撃はあまり出来ず。
聞くと他に策はあったようなので、ちょっと勿体なかったかもです。

#システム修復

AWSコンソールにログインしてみると、何も起きていない様子。
CloudTrailも無効化されていないのに攻撃時間中の出力はなし。

マッチングの不具合で東京の2チームが攻撃対象から外れ、
運悪く?その2つに該当してしまった模様。

あっという間にゲームは終了となってしまったけど、
CloudTrailなどの備え、攻撃を受けていない事の証明になった点で、多分無駄にはなりませんでした。

一応想定していた復旧フローは下記の通り。
* CloudTrail設定有効確認
* CloudTrailログ確認
* CloudFormerで、CloudFormationテンプレート差分確認
* 破損サービスの撤去、再作成
* 最悪、別リージョン(us-west-2)で再構築


#SAからのプレゼン・システム構築の勘所

進行が遅れ、時短のため大幅省略。
何らかの形で講評については聴いてみたい所です。

後、出来れば
* 各チームから、攻撃、防御の内容について発表
* 質疑応答
* SAの方からの講評
と振り返りの時間があれば、もっと良かった様に思えます。


#戦果発表

今回の最優秀賞は大阪のチーム。
SQS,s3などのサービスだけでなく、AWSコンソールまで
攻撃で使えなくなっていたとの事。
IAMロールなくどんな方法をとったのか気になります。

#感想

マッチングの不具合や時間不足により、若干不完全燃焼な感じは残りましたが、非常に愉しい時間を過ごすことが出来ました。
また準備として、普段触れない機能や新機能について、APIリファレンスなどを眺めつつ試せ、良い勉強にもなりました。

主催、会場提供のAJ、JAWS方面の方々、ありがとうございました。
次のGamedayは、お題も一新されるとの事。
ラスベガスは無理としても、次の機会があれば参加したいと思います。

また併せて、今回、敵方にまわす事がなく、本当に良かったと思えるメンバに恵まれた事にも感謝です。
ScalaとApache Commons Daemonで常駐プログラムを作る


なにかと常駐プログラムを書くときがありますよね!

この記事では、Apache Commons Daemonを使ってデーモンを作り、SBTのAssemblyプラグインを使って実行可能なJarを作ります。

## 実装

SBTの依存に```"commons-daemon" % "commons-daemon" % "1.0.10"```を追加して、reloadとupdateを事前にしておきます。

```scala
object Service extends App {
  val akuma = new Akuma
  akuma.start
}
```

```scala
import org.apache.commons.daemon.Daemon
import org.apache.commons.daemon.DaemonContext

import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors

class Akuma extends Daemon {
  val executorService = Executors.newSingleThreadExecutor

  override def init(dc: DaemonContext) {
  }

  override def start {
    println("start daemon")

    executorService.execute(new Runnable() {
      def run() {
        try {
          // do something.
        } catch {
          case e: InterruptedException => println(e)
        }
      }
    })
  }

  override def stop {
    println("halt daemon")
    executorService.shutdown()
  }

  override def destroy {
  }
}

```

ExecutorServiceを使ってスレッドを実行します。

## build.sbt

```build.sbt
import AssemblyKeys._

name := "daemon"

organization := "daemon"

version := "0.1.0-SNAPSHOT"

scalaVersion := "2.10.3"


libraryDependencies ++= {
    "commons-daemon" % "commons-daemon" % "1.0.10"
}

seq(Revolver.settings: _*)

assemblySettings

jarName in assembly := "jarname.jar" // 出力されるjarの名前

test in assembly := {} // テストをスキップする時はこれを指定

mainClass in assembly := Some("com.foo.Main") // メインクラスの指定

```

## Assembly

```
% sbt
> assembly
```
とやると、target/scala-2.10/jarname.jar にJarファイルができるので、```java -jar target/scala-2.10/jarname.jar```とやってやると常駐プログラムが走ります。
AndroidのScrollViewにsetContentSizeがなくて困った

Androidで、ScrollViewを使っていたのですが、setContentSizeみたいな中のViewのサイズを指定する方法がわからなくて困ってます。

なので、中の要素のサイズが後から変わったときにスクロールされずに見切れてしまいます。

iOSの考え方だとうまくいかないんでしょうか。

困った。。
アプリを実機で動かそうとしたら CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 7.1'エラー

# 問題
* アプリを実機でRUN実行しようとしたら、以下のエラーが出て転送できない。

## エラーメッセージ

```text:error
*** CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 7.1'
```

参考サイトには以下の解決策が載っている

> プロジェクトの Code Sigining > Code Sigining Identifer > Any iOS SDK を Don't code sign から適切なプロビジョニングプロファイルへへ変更する(意訳)
http://stackoverflow.com/questions/15852542/code-signing-is-required-for-product-type-application-in-sdk-ios-6-0

が、何度確認してもちゃんと設定してある……と思っていたら落とし穴。

# 原因
* まちがって PROJECT の Code Sigining Identifer を変更していた。
* TARGET の Code Sigining Identifer は　Don't code sign のままだった。


# 解決法
* PROJECT ではなく、その下の TARGET の Code Sigining Identifer を適切なものへ変更する。

![スクリーンショット 2014-03-14 22.26.01.png](https://qiita-image-store.s3.amazonaws.com/0/25820/dc927ab7-f7ec-67e7-e90a-e07842312739.png)

これでOK.
ちょっと調べてしまいました。

気になる点があれば、気軽にコメントください。

# 参考サイト
* certificate - code signing is required for product type 'Application' in SDK 'iOS 6.0' - Stack Overflow
http://stackoverflow.com/questions/15852542/code-signing-is-required-for-product-type-application-in-sdk-ios-6-0
initWithCoderとアップデートの仲の悪さ

独自のクラスで

```objc
- (id)initWithCoder:(NSCoder *)coder {
    if (self = [self init]) {
       hoge = [coder decodeBoolForKey:@"hoge"];
    }
    return self;
}
```
と実装したとします。

アップデートでじゃあpiyoというプロパティを増やそう。となると

```objc
- (id)initWithCoder:(NSCoder *)coder {
    if (self = [self init]) {
       hoge = [coder decodeBoolForKey:@"hoge"];
       piyo = [coder decodeBoolForKey:@"piyo"];
    }
    return self;
}
```

と、普通に増やすと思います。
これ、piyoの初期値をTrueにしたい場合って、どうすりゃいいんだろという…。

```objc
self = [self init]
```
で、piyoは初期値trueをセットされても、

```objc
piyo = [coder decodeBoolForKey:@"piyo"];
```
でdecodeBoolForKey:はnilを返し、poyoはfalseに上書きされてしまうのです。
いちいちサブクラスを見てnilかどうか判別しないといけないのでしょうか…。
なんかいい方法がありそうだけどなぁ…。
解決しましたら更新します。
.htaccessで特定のページのみhttpsからhttpにリダイレクトする（あるいはその逆）

SSLのかかっているお問い合わせフォームからリンク移動する場合に、相対URLの指定になっていると、SSLではない通常のページもhttpsのURLとなってしまい、外部URL呼び出し部分で警告が表示されたりする。

そこで、特定のURLはSSLありのページにリダイレクトするなどの方法をhtaccessを用いて実現してみます。

/form/をhttpsにリダイレクト

```:.htaccess
RewriteEngine On

RewriteCond %{REQUEST_URI} ^/form/
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
```

NOT条件。lpではじまる場合はリダイレクトしない。ついでに301リダイレクトを明示

```:.htaccess
RewriteEngine On

RewriteCond %{REQUEST_URI} !^/lp/*
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

OR条件。/profile/または/sp/profile/をhttpにリダイレクト

```:.htaccess
RewriteEngine On

RewriteCond %{REQUEST_URI} ^/profile/ [OR]
RewriteCond %{REQUEST_URI} ^/sp/profile/
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
```
WordPressをComposerでインストールする

## WordPressのインストールをComposerでお手軽に（普通にやっても難しくないけどｗ）

まずcomposer.jsonを作る。（composer init だとうまく出来なかったので）

```shell-session
mkdir wp-install-dir && cd $_
vi composer.json
```

composer.jsonを以下の内容で保存してください。

```json
{
    "name": "organization-name/project-name",
    "require": {
        "php": ">=5.3.0"
    },
    "extra": {
        "installer-paths": {
            "vendor/wordpress/wp-content/plugins/{$name}/": [
                "type:wordpress-plugin",
                "type:wordpress-muplugin"
            ]
        }
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://wpackagist.org"
        },
        {
            "type": "package",
            "package": {
                "name": "wordpress",
                "version": "4.9.8",
                "source": {
                    "type": "git",
                    "url": "https://github.com/WordPress/WordPress.git",
                    "reference": "4.9.8"
                }
            }
        }
    ]
}
```

後は、`composer require wordpress`を実行すればWordPressをダウンロードできます。

`composer require wpackagist-plugin/akismet`とすればakismetをダウンロードできます。
([wpackagist](https://wpackagist.org/)からダウンロードされます)

`extra.installer-paths`の`"vendor/wordpress/wp-content/plugins/{$name}/"`はwordpressのpluginがinstallされるpathです。
`WP_CONTENT_DIR`定数でdirectoryを変更する際は、このpathも変更してください。


## すごく簡単にやりたい人向け

[atomita/wordpress-composer-template](https://github.com/atomita/wordpress-composer-template)を使ってください

```sh
wget https://raw.github.com/atomita/wordpress-composer-template/master/composer.json
wget https://raw.github.com/atomita/wordpress-composer-template/master/env-example -O .env
wget https://raw.github.com/atomita/wordpress-composer-template/master/index.php
composer run-script update-repositories-for-wordpress
composer require wordpress
```

これだけでcurrent directoryがpublic directory 兼 `wp-content` directoryとして動作する状態になります
fb_graph でサポートされていない graph api 用の拡張をする

fb_graph でサポートされていない /me/books.read や /me/video_wants_to_watch 等の graph api を呼び出したい場合に、fb_graph のフレームワークに乗っかって、 User クラスを mix-in で拡張してやれば手っ取り早く実装できる。

例えば以下のような感じ。
fb_graph/lib/fb_graph/connections 以下のファイルを参考に実装すればよい。

```user_ext.rb

module FbGraph
  class User
    def books_reads(options = {})
      books = self.connection 'books.reads', options
      books.map! do |book|
        Page.new book[:id], book.merge(
            :access_token => options[:access_token] || self.access_token
        )
      end
    end

    def books_wants_to_read(options = {})
      books = self.connection 'books.wants_to_read', options
      books.map! do |book|
        Page.new book[:id], book.merge(
          :access_token => options[:access_token] || self.access_token
        )
      end
    end

    def video_watches(options = {})
      videos = self.connection 'video.watches', options
      videos.map! do |video|
        Page.new video[:id], video.merge(
            :access_token => options[:access_token] || self.access_token
        )
      end
    end

    def video_wants_to_watch(options = {})
      videos = self.connection 'video.wants_to_watch', options
      videos.map! do |video|
        Page.new video[:id], video.merge(
            :access_token => options[:access_token] || self.access_token
        )
      end
    end
  end
end

```
GitHub Organization: Issues+Pull Requestでチケット駆動開発する手順


GitHub OrganizationでGitHubのIssuesとPull Requestを使ってチケット駆動開発をする手順を説明する。

# 手順



## Organizationのリポジトリからローカルにチェックアウトする

```
hub clone `org名`/`リポジトリ名`
```

## OrganizationでIssueを作る

ここで `issue番号` が発番される


## トピックブランチを作る

```
git checkout -b issues/`issue番号`
```

## 開発する

コードを書いて、テストを通す

## トピックブランチをOrganizationのリポジトリにpushする

```
git push -u origin issues/`issue番号`
```

## プルリクエストする

```
hub pull-request -i `issue番号` -h issues/`issue番号`
```

## コードレビュー

メンバ全員にレビューを依頼する(大人数のチームならレビュアーを指名したほうがいい)。依頼するときはメンションする。

> **GitHubのPRでのコメント例**
> ![](https://qiita-image-store.s3.amazonaws.com/0/889/5ad6728e-7cff-64da-b46f-ce50947f90bf.png)

レビューを依頼してもなかなかレビューをしてもらえない場合は、Slackやチャットなどで、**メンションを飛ばしつつしつこく依頼する**。

レビューを依頼された側は、自分ができそうになければ、辞退することができる。他に適任の人を指名してもいい。その場合は、GitHubのissueにコメントを残す。


ここで、コード修正が必要になったらコードを直して、`git push`して、再度コードレビューへ。

コードレビューはブランチがマージ可能であることが前提。もしここでconflictしていたら、レビュー者は開発者に通知する。開発者はそれを解消してから再度コードレビューを依頼する。解消する方法は『[Git - プルリクエストの画面でMerge出来ない事がわかった場合にどうすればよいか考える。 - Qiita](http://qiita.com/mapyo/items/a3ab9ef0c011b6757d49)』を参照。

## マージ

レビューが通ったらレビュー者がGitHubウェブサイト上でマージする。
ここで master ブランチに取り込まれる


## リモートのトピックブランチを削除する

マージすると、GitHubの画面上に「Delete Branch」ボタンが出るので押す。

## ローカルの master ブランチを最新にする

```
git pull --prune
```

`--prune` をつけることで前のステップで消したリモートトピックブランチのローカルにある情報が消える

## ローカルのトピックブランチを削除する

masterに取り込まれたトピックブランチは削除してしまおう

```
git branch -d issues/`issue番号`
```
def mainを書くのが面倒くさい!! ScalaのAppトレイトを使ってmainを書くのを省略する


実行可能にするには通常```main```を書いたobjectを用意する必要があるのだけど、Appトレイトを使うと、コンストラクタ部分をmainとして実行してくれるようになる。

```scala
object Application extends App {
	Console.println("Hello World: " + (args mkString ", "))
}
```

http://www.scala-lang.org/api/current/#scala.App


実行方法:

```scala
scalac Application.scala && scala Application foo bar
Hello World: foo, bar
```
初回button押下後からvalidationをして見た目を変える。

css擬似セレクタ :valid, :invalid でみためをかえると、フォーム表示直後からinputが赤かったりしてわただたしい感じがするので、初回submitボタンを押すまでは見た目を変えず、初回submit後からvalidationにより見た目の変更を開始したい。そしてもちろんメッセージは独自のものにしたい。

こんなかんじで、inpuタグにoninvalidで

```coffeescript:hoge.coffee.js
$("input").bind 'invalid', (e)->
  e.target.setCustomValidity( $(this).data("validation-message") )
  $(e.target).addClass("with_validation")
```

```scss:hoge.css.scss
input.with_validation:valid{
  background-color: #ddffdd;
}
input.with_validation:invalid{
  background-color: #ffdddd;
  border: red 1px solid;
}
```

とすると、できる。

ただsetCustomeValidity()で設定すると、inputに何をいれてもvalidにならないので、いったん解除しなければいけない。
解除するとvalidにはなるが、エラーメッセージもデフォルトのもになる。それはかっこ悪い。

なので

```coffeescript:hoge.coffee.js
$("input").bind 'input', (e)->
  return unless $(e.target).hasClass("with_validation")
  e.target.setCustomValidity("")
  unless e.target.validity.valid
    e.target.setCustomValidity( $(this).data("validation-message") )
    $(e.target).addClass("with_validation")
```

を追加。

オリジナルのメッセージのまま、中身が正しくなるとちゃんとvalidになる。
Qt5 WebKit調査メモ

Qt5のWebKit対応、主に描画部分に関する調査メモ。

## WebKitとWebKit2の違い

Webkit2は"Webkit version 2"という意味ではなく、マルチプロセスモデルを採用した別種の存在であり、APIはWebkitと大幅に異なっている。
ただしWebkitとWebkit2は同一リポジトリ上で管理されており、コア部分であるWebCoreはWebkitとWebkit2で共通である。

## QtのWebKit対応

http://qt-project.org/doc/qt-5.0/qtdoc/modules.html

Qt5ではWebkit2に対応したQtWebkitと、Webkitに対応したQtWebKitWidgetが存在している。
両者の違いとしては、QtWebKitはQMLからの使用が想定されており、従来のC++ APIとしてはQtWebKitWidgetを使用することになる。
C++からQtWebKitを使用するにはQQmlComponent経由で呼び出す必要がある。

### QtWebKitWidget(WebKit)での描画

QWebViewはQWidgetを継承しており、QWebView::paintEventでは自身をQPaintDeviceとしてQPainterを生成して描画処理を行っている。
基本的にその他のQWidgetと同様の描画処理が行われると考えられる。

### QtWebKit(WebKit2)での描画

http://trac.webkit.org/wiki/CoordinatedGraphicsSystem

(調査途中)
WebKit2ではUIプロセスとWebプロセスが分離しており描画データをShareableBitmap(またはGraphicsSurface)で受け渡ししている。
QtWebKitではSahreableBitmap(またはGraphicsSurface)はQImageで実装されている。
C++でのフルパス(std::string)から拡張子を抽出

[参考URL]stringによる文字列処理
http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?string%A4%CB%A4%E8%A4%EB%CA%B8%BB%FA%CE%F3%BD%E8%CD%FD


```cpp
/*!
 * パスから拡張子を小文字にして取り出す
 * @param[in] path ファイルパス
 * @return (小文字化した)拡張子
 */
inline string GetExtension(const string &path) {
    string ext;
    size_t pos1 = path.rfind('.');
    if(pos1 != string::npos){
        ext = path.substr(pos1+1, path.size()-pos1);
        string::iterator itr = ext.begin();
        while(itr != ext.end()){
            *itr = tolower(*itr);
            itr++;
        }
        itr = ext.end()-1;
        while(itr != ext.begin()){    // パスの最後に\0やスペースがあったときの対策
            if(*itr == 0 || *itr == 32){
                ext.erase(itr--);
            }
            else{
                itr--;
            }
        }
    }
 
    return ext;
}

```
Parallella で OpenCL


漢なら Parallella で OpenCL ですね!

Parallella(epiphany core)用 OpenCL SDK である CORPTHR をインストールして Parallella で OpenCL をたしなみましょう.

## インストール

http://www.browndeertechnology.com/coprthr_download.htm

から Parallella build を落とします(ver 1.6.0)

適当に展開してインストールスクリプトを実行して /usr/local/browndeer にインストールします.

```
$ tar -zxvf coprthr-1.6.0-parallella.tgz
$ sudo sh ./browndeer/scripts/install_coprthr_parallella.sh
```


.bashrc あたりに

```
export PATH=$PATH:/usr/local/browndeer/bin
export LD_LIBRARY_PATH=/usr/local/browndeer/lib
```

としてパスを通します.

```
$ clcc
```

としてなにか反応があるのを確認しておきます.

## サンプル

Parallella 用のサンプルコードが, tgz を展開した browndeer/examples/parallella にあります.

```
$ cd browndeer/examples/parallella/hello_stdcl
```

Makefile の OPENCL_INCS あたりを適当に編集して直しておきます.
(サンプル全部が正しくコンパイルして実行できるようではないようです. 安定するにはもう少し待ちでしょうか)

ビルドして実行してみます. 

```
$ make
$ ./hello_stdcl.x 
coprthr-1.6.0 (Freewill)
[13971] clmesg WARNING: command_queue.c(39): __do_create_command_queue_1: cmdq exists
[13971] clmesg info: cmdsched.c(86): cmdqx1: run
[13971] clmesg WARNING: ocl_enqueue.c(893): clEnqueueNDRangeKernel: ignoring global_work_offset
[13971] clmesg info: sl_engine.c(112): sl_engine_startup: nengines=2
[13971] clmesg WARNING: ocl_flush.c(35): clFlush: warning: unsupported
0 0.000000 0.000000
1 2.200000 3000.800049
2 4.400000 6001.600098
3 6.600000 9002.400391
4 8.800000 12003.200195
5 11.000000 15004.000000
6 13.200001 18004.800781
7 15.400001 21005.601562
8 17.600000 24006.400391
9 19.800001 27007.203125
10 22.000000 30008.000000
11 24.200001 33008.800781
12 26.400002 36009.601562
13 28.600000 39010.398438
14 30.800001 42011.203125
15 33.000000 45012.000000
```

Voila!

eCore で OpenCL カーネルが動いた瞬間です. 素晴らしいですね.

Happy OpenCL coding!
.bashrcの設定ミスでターミナルコマンドが使えなくなった時の対処方法

.bashrcの設定ミスをしてしまうとターミナルのコマンドがほとんど使えなくなり、<br />肝心の.bashrcの修正すらできなくなります。
この場合は

```bash
$ mv ~/.bashrc ~/.bashrc_
```
で一回リネームすればコマンドが復活するので、
.bashrc_ を修正してから再度 .bashrc にリネームしましょう。
Zabbix 監視対象の自動登録

#監視対象の自動登録

Zabbixエージェントのアクティブチェックを利用してホスト登録していない監視対象を自動で登録する。

##1. アクションの作成

[設定]－[アクション]画面の[イベントソース]にて「自動登録」を選択後、
[アクションの作成]をクリックする。

##2. アクションタブの設定

|設定項目          |設定             |
|:----------------|:----------------|
| 名前             | 適当な名前       |

##3. アクションの実行条件

設定なし

##4. アクションの実行内容

|設定項目          |設定                                       |
|:----------------|:------------------------------------------|
| アクションの実行内容|ホストを追加                               |
| 　　　　　　　　　　|ホストグループに追加：任意のホストグループ     |
| 　　　　　　　　　　|テンプレートとリンク：任意のテンプレート       |

##5.zabbixエージェント設定 

zabbix_agentd.confに設定する。

```shell-session
Hostname=ホスト名（zabbixエージェント）
または
HostnameItem=system.hostname

ServerActive=zabbixホストのIP or ホスト名
```
Scala: 2つのリストを掛け合わせる処理の書き方(手続き型から関数型への書き換え)


あるリスト1にあるリスト2を掛け合わせるような処理を書こうとすると、どうしても mutable な変数が1つできてしまう。そのようなコードは大抵こんなかんじに、foreachやforを使っている。(`.map` がない言語では `for` ループを二重にするようなシーン)

```scala
val list1 = List(1, 2, 3)
val list2 = List(10, 10, 10, 10)
def operation(item1:Int, item2:Int):Int = item1 * item2

// mutableな変数ができてしまう実装
def code1 = {
	var newlist1 = list1

   list2.foreach { item2 =>
	   newlist1 = newlist1.map(operation(_, item2))
	}
	
	newlist1
} 
```

上記ののコードは、`foldLeft`を使うとmutableな変数を使わずに実装することができる:


```scala
val list1 = List(1, 2, 3)
val list2 = List(10, 10, 10, 10)
def operation(item1:Int, item2:Int):Int = item1 * item2

// mutableな変数が不要な実装
def code2 = (list1 /: list2) { (list1, item2) => list1.map(operation(_, item2)) }

// code2と同じ
def code3 = list2.foldLeft(list1){ (list1, item2) => list1.map(operation(_, item2)) }
```

実行結果

```scala
code1
//> res0: List[Int] = List(10000, 20000, 30000)
code2
//> res1: List[Int] = List(10000, 20000, 30000)
code3
//> res2: List[Int] = List(10000, 20000, 30000)
```
Scala: foldLeftとfoldRightの演算子の覚え方


# foldRight `:\`

![Threestairs8.jpg](https://qiita-image-store.s3.amazonaws.com/0/889/fe66512f-36e7-ccfe-02d0-343d510056e8.jpeg "Threestairs8.jpg")

# foldLeft `/:`

![Threestairs8_copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/889/a971e4b9-8993-56ba-b6ca-0be3c6a4a3f4.jpeg "Threestairs8_copy.jpg")
git rebase -i の途中では commit --amend しない方が良さげ

`git rebase -i` で edit を指定して途中のコミットをちょっと弄ったとき、 `git status` のメッセージに `(use "git commit --amend" to amend the current commit)` とか出てきますが、 `git commit --amend` せずにそのまま `git rebase --continue` した方が良さげな気がします。

なぜ? `git rebase` は、edit を指定した時の他にコンフリクトが発生した時も止まります。この時は必ず、 `git commit --amend` せずに `git rebase --continue` しないと行けません。もし amend すると、コンフリクトしたコミットとその一つ前のコミットが統合されて一つのコミットになります。なんてこった!

なので、rebase の途中で止まった時はいつも、

1. 編集する
1. `git add` する
1. `git rebase --continue` する

のパターンで行く様にしておくと良いのではないかと感じました。
WinSCPからTeratermを起動する。

# teraterm 起動コマンドの作成

```bat:c:\teraterm\ttermpro.cmd
@echo off
rem C:\Users\username\Documents\winscp-teraterm.cmd -x !@ !U  !P

PATH=C:\Program Files\teraterm;%PATH%


IF "%1"=="-x" GOTO :EOF1
IF "%2"=="-x" GOTO :EOF2
IF "%3"=="-x" GOTO :EOF3

:EOF1
	start /b ttermpro.exe %2 /ssh /2/ /auth=password /user=%3 /passwd=%4
	GOTO :EOF

:EOF2
	start /b ttermpro.exe %3 /ssh /2/ /auth=password /user=%4 /passwd=%5
	GOTO :EOF

:EOF3
	start /b ttermpro.exe %4 /ssh /2/ /auth=password /user=%5 /passwd=%6
	GOTO :EOF

:EOF
```

# winscp の設定

## Tools > Preferences...> Integration > Applications

| name | value |
|:-----|:------|
| **PuTTY/Terminal client path:** | c:\teraterm\ttermpro.cmd -x !@ !U !P |
| **Remember session password and pass it toPuTTY (SSH)** | true |
| **Automatically open new sessions in PuTTY** | true |
Chef-Clientの実行が15分を超えるとファイル系リソースがエラーになる件の対応策2つ

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

FAQなので書いておく。ファイル系ってのはこのへん。

- cookbook_file
- template


問題の詳細は[CHEF-3045](https://tickets.opscode.com/browse/CHEF-3045)のチケットで確認できます。

要約すると。

1. Chef-Clientが実行されたら、最初にChef-Server/Client間の認証が行われる
2. ↑の有効期限はデフォルトで15分
3. ファイル系のリソースはCookbookロード時にはChef-Client実行NodeのCacheには落ちてこない
4. Chef-Clientのリソース収束の段階で、必要なファイルがあったら1で作った認証情報を使ってChef-Server(Bookchelf API)に取りに行く
5. 15分超えてたら4の挙動が403でアウトー

キャッシュがある場合はそもそも取りに行かないが、NodeでのChef-Client初回実行時、いっぺんに色々やっていると良くある。



## 1. Chef-Serverの認証期限デフォルト15分を伸ばす

Chef-Serverの設定ファイル`/etc/chef-server/chef-server.rb`で、有効期限を伸ばす。

```ruby:/etc/chef-server/chef-server.rb

erchef['s3_url_ttl'] = 3600  # 例
```

で、設定の適用すればOK。

`chef-server-ctl reconfigure`


## 2. Chef-Clientで遅延ダウンロードを無効にする

Chef-Clientが`10.28.0`以降、または`11.6.0`以降なら、`no_lazy_load `オプションが使える。

```ruby:/etc/chef/client.rb
Chef::Config[:no_lazy_load] = true
```

こちらはChef-ClientがCookbookをダウンロードする時に`files/`、`templates/`を除外しないオプション。
関係ないファイルも全部Nodeに落ちてくるので注意。
SceneKit日和（２）

今回はSceneKitの２回目の記事として、10.9から新しく追加された、

「shaderModifiers」

というもので遊んでみましょう。
これはどういう機能かというと、
SceneKitの既定のシェーダーに、GLSLコードを挟み込んだり、上書きしてしまうものです。

数種類の定数によって、どのように書き換えを行うのか？を定義します。
今回はわかりやすく、WWDC2013で紹介されている、

SCNShaderModifierEntryPointGeometry

を試してみます。

これは頂点シェーダーを通過する際に、計算を挟み込むことができるものです。
使える変数としては、
ヘッダーファイルに以下のような記述がありました。

| struct SCNShaderGeometry {
| vec3 position;
| vec3 normal;
| vec4 tangent;
| vec2 texcoords[kSCNTexcoordCount];
| } _geometry;
|
| Access: ReadWrite
| Stages: Vertex shader only

今回は、これを使って、

「平面をねじる」

エフェクトにチャレンジします。

続きはこちらでどうぞ

http://wowdev.jp/?p=1108
オレオレ証明書の作成

#オレオレ証明書の作成

opensslを利用し、オレオレ証明書を作成する。

##1. 秘密鍵の作成
2048bitの秘密鍵を作成する。


```shell-session
openssl genrsa -des3 -out server.key 2048
```

##2. 証明書署名要求の作成

コマンド入力後、設定を聞かれるがオレオレ証明書のため、適当でOK。

```shell-session
openssl req -new -key server.key -out server.csr
```

##3. パスフレーズ解除
起動するたびにパスフレーズを聞かれるのでパスフレーズを解除する。

```shell-session
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
```

##4. サーバ証明書の発行

```shell-session
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
```