OmniAICreator/Qiita-1.07M huggingface dataset:
文字列を指定した区切り文字列で分割する関数

C++ の標準ライブラリには文字列を分割する関数がないので作ってみました。
boost のアルゴリズムライブラリには split 関数が入っていますがこれだけのためにインクルードするのも面倒だなと。

# コード

```cpp
#include <string>

template <typename List>
void split(const std::string& s, const std::string& delim, List& result)
{
	result.clear();
	
	using string = std::string;
    string::size_type pos = 0;
    
    while(pos != string::npos )
    {
        string::size_type p = s.find(delim, pos);
        
        if(p == string::npos)
        {
            result.push_back(s.substr(pos));
            break;
        }
        else {
            result.push_back(s.substr(pos, p - pos));
        }
        
        pos = p + delim.size();
    }
}

// ====== SAMPLE ======
#include <vector>
#include <iostream>
using namespace std;

int main(void)
{
    std::vector<string> result;
    split("私の@@名前は@@太郎@@です@@", "@@", result);
    
    for(auto s : result) {
    	cout << s << " / ";
    }
}
```

```txt:出力
私の / 名前は / 太郎 / です /  /
```

# 解説

`split` 関数の第一引数には分割対象文字列、第二引数には区切り文字列、分割結果を格納する第三引数 `result` には `std::vector`, `std::list`, `std::deque` など `push_back` が実装されているコンテナを入れます。

文字列分割関数というとカンマや空白など1文字を区切りにして分割するものが多いですが、この関数は "aaa", "XYZ", "$$" などの任意文字列を区切りに指定できるところが特徴（？）です。
Wordpressで自分で作成した固定ページだけを「親ページ」に指定できるようにする。

#固定ページの管理権限

WordPressで、固定ページの管理権限をどうにかしたいときってありますよね。
固定ページ絡みの権限について、UserRoleEditorというプラグインと、page_attributes_dropdown_pages_argsフィルターフックについて書きました。

##目次
- [自分でつくった固定ページだけを編集できるようにする](#自分でつくった固定ページだけを編集できるようにする)  
- [固定ページを作成・編集するときに「親ページ」に指定できるページを「自分で作ったページ」だけに絞る方法](#親ページを自分で作った固定ページだけに絞る方法)  

というあたりについて備忘録です。

## 自分でつくった固定ページだけを編集できるようにする

プラグインを使うのが便利です。
WordPress プラグイン [User Role Editor](https://ja.wordpress.org/plugins/user-role-editor/)
バナーというかイメージ画像の仮面が怖いんですが、とても便利なプラグインです。

プラグインの詳しい使い方はいろいろと調べていただければと思いますが、ここでは「自分で作成した固定ページだけを編集できる権限」を作成する方法を紹介します。

1. プラグインをインストールして有効化
2. ユーザー → User Role Editor の管理画面
3. ロールを作成して（仮に「test_user」とします）
4. 権限にチェックを入れる
5. 「自分で作ったページのみを編集できる」ようにするための最低限必要な権限は以下のとおり。

以下の項目にチェックをいれます。
delete_private_pages、delete_published_pages、edit_pages、edit_private_pages、edit_published_pages、publish_pages、read_private_pages、upload_files

**画面だとこのようになります。**
* * *
![scs2.png](https://qiita-image-store.s3.amazonaws.com/0/73833/1ca6aa1f-2164-9e72-c66e-dfc514aeaa46.png)
* * *

あとは、ここで設定したロールをユーザに結びつければ、自分で作った固定ページのみを編集できるユーザができあがります。

## 「親ページ」を、自分で作った固定ページだけに絞る方法
固定ページを作成・編集したりするときに「親ページ」も、自分が作ったページだけにしたい。ということありますよね。
今回は、[page_attributes_dropdown_pages_args](https://developer.wordpress.org/reference/hooks/page_attributes_dropdown_pages_args/)フィルタを使いました。

サンプルコードです。（仮に対象とする権限の名前を「test_user」とした場合）

```php:functions.php
function my_dropdown_pages_args($dropdown_args) {
  $user_info=wp_get_current_user();//ログインユーザ情報を取得
  if(in_array('test_user',$user_info->roles)){//’test_user’ロールの場合に以下を実行する
    //自分が作成したページを取得
    $pages=get_pages(array(
      'authors'=>$user_info->ID,
    ));
    $page_ids=array_map(function($p){
      return $p->ID;
    },$pages);//ページのIDを配列で取得
    $dropdown_args['include']=$page_ids;//ドロップダウンリストに表示するIDを設定
  }
  return $dropdown_args;
}
add_filter('page_attributes_dropdown_pages_args','my_dropdown_pages_args');
```

### 内容について解説
- 「test_user」は、この処理の対象とするロール名を入れてください。（前項で作成したロールの場合はそのロールIDを指定してください）
- page_attributes_dropdown_pages_args　は、親ページ設定のドロップダウンリストを作成するときに呼ばれるフィルターです。ここにフックをかけて設定します。
- フィルターの内容は「$dropdown_args」という配列を設定します。これの内容でドロップダウンリストの内容が決まります。
- 「$dropdown_args」は、[wp_dropdown_pages](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_dropdown_pages)という関数をつかってドロップダウンリストを生成します。
- なので「$dropdown_args」の内容は、[wp_dropdown_pages](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_dropdown_pages)の引数の項を参考にしてください。
- 今回は$dropdown_args['include']に値を設定しましたが、Codexにある通り実は推奨パラメータではありません。（使いやすかったので選択しましたが、利用する際にはご承知おきください）

## 参考サイト
[WordPressの固定ページなどで親選択のリストをカスタマイズ](http://www.online-inc.jp/archives/694)
[wp_dropdown_pages](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_dropdown_pages)
[page_attributes_dropdown_pages_args](https://developer.wordpress.org/reference/hooks/page_attributes_dropdown_pages_args/)
GNS3用の環境を構築してみた


ネットワークの学習するために、GNS3の環境をMBA上に構築したときのログをまとめておきます。

## 1. インストール媒体をダウンロード
![kobito.1444406358.793415.png](https://qiita-image-store.s3.amazonaws.com/0/33479/6bc6e9b3-f22a-73c6-f5da-8aa88dae6638.png "kobito.1444406358.793415.png")

↓

![kobito.1444406433.071229.png](https://qiita-image-store.s3.amazonaws.com/0/33479/86be8566-246f-2d11-56ed-9d14777298a2.png "kobito.1444406433.071229.png")


## 2. 展開
![kobito.1444406483.975683.png](https://qiita-image-store.s3.amazonaws.com/0/33479/80d3b0fd-a5cd-8118-da22-bd9cf1e9b41c.png "kobito.1444406483.975683.png")

展開したappファイルをapplicationディレクトリへ格納する。

## 3. 起動
![kobito.1444406595.857826.png](https://qiita-image-store.s3.amazonaws.com/0/33479/1f0c76c3-c48a-c094-f073-f016b8ae22f6.png "kobito.1444406595.857826.png")


## 4. 試しに使ってみる
![kobito.1444406655.914129.png](https://qiita-image-store.s3.amazonaws.com/0/33479/534e66e0-646e-7e29-76f9-86b5bf2a6fa5.png "kobito.1444406655.914129.png")

↓

![kobito.1444406699.436743.png](https://qiita-image-store.s3.amazonaws.com/0/33479/da8dd594-5b38-cf1c-c1d7-7dad12040318.png "kobito.1444406699.436743.png")

感覚で使うのは難しいぽい。。。
もうちょっと調べてから使うことに…
ハイブリッド・アプリ開発の備忘録　その１


###いろいろやったのですが、今回の結論
* 環境構築、様々な設定が面倒
* OnsenUIの動きが慣れないのでバグる
* とりあえずはmonacaを使うほうがいい。
* アプリのビルドはmonacaから簡単に無料でできるので、開発→ビルド（リリース）
* 手元で作ったものをmonacaにコピペしてビルドしてみるのもいいかもしれない。（自分でビルドしようとしたら詰まったので）


#今回やったことは以下
###使用した開発環境
前回の投稿
HTML/JS ハイブリッドアプリ開発環境について 
http://qiita.com/charlie_rebirth/items/55eca14b2c261682777b

##OnsenUIをローカル環境でいじってみた（フロント側）
####基本はwwwフォルダ以下で作業する
####"ionic serve" のコマンドでライブプレビューできます
* OnsenUIのクセがありました(フレームワークなのである程度覚えて慣れないと使えない）。解説マニュアルをちゃんと読む必要がある。

　　その点、書籍はよくまとまっていた（『クラウドでできるHTML5ハイブリッドアプリ開発』永井勝則）
* 基本的な画面はテンプレートがたくさんあってそこから選んでコピペすればOK（カスタマイズは別途CSSで）

* ページ遷移、HTMLファイル分割などで詰まった（慣れが必要）
* 裏でAngularJSが動いているので、細かいセッティングでいじる必要があった。AngularJSの知識が必要
* monacaだとそこらへんをあまりいじらなくてもいいのかもしれないが、細かい動きを制御するにはやはり必要


##mBaaS側（サーバーサイド）の動き(nifty cloud mobile backend)

目的：データの出し入れを無料のサーバーサービスを使って行う。
　　　今回はローカルファイルへの保存はやっていない。

* 必要：API操作のマニュアルを理解する
* jQueryでもできる
* データはJSON形式 {"フィールド名":"データ"}
* それぞれのフィールドにパーミッションを設定できる。（ユーザーが操作できるデータの権限の設定）
* データ暗号化の設定もできる（パスワードなど）


###テストプログラムを試した
####参考
```
チュートリアル
http://mb.cloud.nifty.com/doc/current/introduction/quickstart_javascript.html

SDKガイド(JavaScript)
http://mb.cloud.nifty.com/doc/current/sdkguide/javascript/datastore.html
```

準備 : アカウント作成。新規アプリ作成。APIキーの取得。

1.ライブラリ　ncmb.min.jsをダウンロード or コピペ。HTMLファイルで読み込む。
https://github.com/NIFTYCloud-mbaas/ncmb_js/blob/master/ncmb.min.js



2.テストコードをscriptタグで読み込んで実行
APIキーはユーザー登録して各自でもらう。

```ncmb_test.js
//1.APIキー
var APP_KEY = "";//あなたのキー
var CLIENT_KEY = "";//あなたのキー

// 2. mobile backendアプリとの連携
	var ncmb = new NCMB(APP_KEY, CLIENT_KEY);
// TestClassの作成
	var TestClass = ncmb.DataStore("TestClass");
	var testClass = new TestClass();
	testClass.set("message", "Hello, NCMB!")
		.save()
		.then(function (result) {
			// 保存後の処理
			console.log(result);
		})
		.catch(function (err) {
			// エラー処理
			console.log("error : "+err);
		});		
// 3.TestClassへの入出力
	TestClass.fetchAll()
		.then(function (results) {
			results.forEach(function(result){
				var message=result.message;
				alert("message : "+message);
			});
		})
		.catch(function (err) {
			alert(err.text);
		});
```

これを実行するとサーバーにデータが登録される。nifty mobile backendダッシュボードで確認できた。

#ToDo登録アプリ（仮）の作成
1. OnsenUIテンプレート集があるので、そこから使うものを選ぶ

* 自分でデザインしなくても、かっこいいイケてる風のがいっぱいあるのでコピペ。

* Page　Patterns
http://ja.onsen.io/patterns.html

2. UIの細かい部分をカスタマイズした（未完）
3. データの出し入れのコードを書いた（追加と削除）

wwwフォルダ以下の中身はこちら
https://bitbucket.org/satons/todoapptest/src

4. 途中のデバッグはローカルPC上で行った。"ionic serve"コマンドを使い、ブラウザでライブプレビューしながら行った。

5. 完成したソースをmonacaエディターにコピペし、monacaデバッガー上で動作確認。その後ビルドを行ってAndroidで動かした。
6. 動いたのでOK

#その他、ハマったところ
* AngularJSを使うときは、データ出し入れ関連のコールバックを$qでラップしないと動かないので気をつける。
Mockeryでメソッドをoverloadするサンプル（別メソッドでMockを作成する）

# Mockeryでできること
MockeryはPHPでテスト対象のMockを作成するためのライブラリです。詳しい使い方は下の記事がメッチャ参考になりました。

[「Mockery」を使ってサクッとPHPのテストを書いてみる | アライドアーキテクツ エンジニアブログ](http://tech.aainc.co.jp/archives/3918)

# 本記事の目的
上の記事ではMockの作成をテストケースのメソッド内に書いていますが、テスト内容と関係のないモック作成の行数が増えると凝集度が低くなり理解しづらいコードになってしまいます。
本記事では、以下のことを目的とします。

- テストケースを別メソッドに切り出すサンプルを紹介する
	- overloadした際のテストケース（上記事参照）を扱う。

ただし、上の記事を読んだことが前提となります。

# 別メソッドでMockを作成するサンプル
テスト対象のクラス

```php
<?php
 
class SampleExecuter {
	
	public function doSomething($checkType, $param) {
		$factory = new CheckerFactory($checkType); // Mock化対象
		$checker = $factory->create();
		if ($checker->checkSomething($param)) {
			return 'trueが返ったよ';
		} else {
			return 'falseが返ったよ';
		}
	}
}
```
テスト

```php:test.php
<?php
use \Mockery as M;
 
class SampleTest extends PHPUnit_Framework_TestCase
{
	// テストケースがシンプルになった
	public function test_doSomeThing_チェックOK() {
		$target = createTargetMock; // Mockを作る
		$this->assertEquals('trueが返ったよ', $target->doSomething('hoge','foo'));
	}
	
	// Mock作成部を切り出した
	private futction createMock()
	{
		$checkerMock = M::mock('XXXChecker');
		$checkerMock
			->shouldReceive('checkSomething')
			->with('foo')
			->andReturn(true);
					
		$factoryMock = M::mock('overload:CheckerFactory');
		$factoryMock->shouldReceive('create')->andReturn($checkerMock);
	
		return new SampleExecuter();
	}
}

```
## 捕捉：名前空間に気をつけよう

Mock化対象の **CheckerFactory** クラスのnamespaceが`path\to\class`だった場合はMockを作る際に以下のようにする必要がある。

```php:test.php
$factoryMock = M::mock('overload:\path\to\class\CheckerFactory');
```

あるいは次のようにもかける。

```php:test.php
namespace path\to\class\CheckerFactory; // 名前空間を追加
// 中略
$factoryMock = M::mock('overload:'. CheckerFactory::class);
```
GoogleCloudPlatform Windows インスタンススタートアップスクリプトでIIS有効化

Google Cloud Platform で Windows インスタンスが立ち上げられるようになりましたが、Googleが用意してくれているマシンイメージは初期状態でIISが有効になっていません。
幸いGoogle Compute Engine でもAWS同様インスタンス立ち上げ時スタートアップスクリプト指定ができますので、IIS初期化のコマンドを立ち上げ時スクリプトに指定しましょう。

Google Cloud PlatformでWindowsインスタンスの立ち上げはこちら。
http://qiita.com/karo-jp/items/67c8488385d83e26f705

# デベロッパーコンソールからのスクリプト指定

Google Compute Cloud のデベロッパーコンソールのVMインスタンス新規作成画面から、次の赤丸部分をクリックしてメタ情報の入力画面を開きます。

![console1.png](https://qiita-image-store.s3.amazonaws.com/0/12857/d881154a-f5f6-9d28-3bba-a7a96b8153e3.png)

開いた画面で、

![console2.png](https://qiita-image-store.s3.amazonaws.com/0/12857/c873e988-307f-08a2-8318-124724ee568f.png)

「自動化」メタデータの「キー」に *sysprep-specialize-script-ps1* 「値」に

```ps1
Install-WindowsFeature Web-Server -IncludeAllSubFeature
```

を入力してインスタンスの作成を行えば、インスタンス作成後初回にIISの機能有効化のPowerShellスクリプトが走ります。

初期化スクリプトメタデータの詳細ドキュメントはこちら。
https://cloud.google.com/compute/docs/startupscript#provide_a_startup_script_for_windows_instances


# Webサイトトップページの初期化

LAMP環境でいうところのこんなの。

```bash
#! /bin/bash
apt-get install -y apache2
cat <<EOF > /var/www/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple startup script!</p>
</body></html>
EOF
```

PowerShellではこんな感じで指定すればできます。

```ps1
Install-WindowsFeature Web-Server -IncludeAllSubFeature
Set-Content -value "<html><body><h1>hello world</h1><p>This page was created from a simple startup script!</p></body></html>" -path C:\inetpub\wwwroot\index.html
```

# RDPで入ってUIでIIS有効にしてイメージ作ってそこから起動すればいいじゃない

Googleが用意してくれたマシンイメージには Google が毎月 Windows Update をあてた最新に差し替えてくれているというメリットがあります。Windows Update 適用＞イメージ作成を自動化してもいいと思います。
$brew updateできない。


brew doctorをすると

```


Warning: Unbrewed dylibs were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
    /usr/local/lib/libecomlodr.dylib

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
    autoconf
    ruby-build
    tmux
    

```

##まず一番上の

```
Warning: Unbrewed dylibs were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
    /usr/local/lib/libecomlodr.dylib


```

のこいつは

```
rm  /usr/local/lib/libecomlodr.dylib
```


で解決
参考：[Homebrewのlibecomlodr.dylibがいらないというWarningを修正する。](http://structured-p.info/homebrew/215)


##二つ目

```
Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
    autoconf
    ruby-build
    tmux

```


```
$ brew link tmux

Linking /usr/local/Cellar/tmux/2.0... 4 symlinks created
```

$brew link　tmux
で
tmuxを有効にするそうです。

でOK
もともとtmuxが使えなく困っていたので
よかった。
他の ruby-build と　autoconf も同じ要領。

#### 参考
[【インストール】MacにHomebrewをインストールしました](http://mamiline.tumblr.com/post/98152932285/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%ABmac%E3%81%ABhomebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F)
[ＨｏｍｅＢｒｅｗの仕組みについてまとめておく](http://takuya-1st.hatenablog.jp/entry/20111224/1324750111)
【cocos2d-x】物理エンジンの重力を変更したらモンストも作れるぞ！

#背景
Cocos2dxはv3.xからChipmunk2Dに統一されて簡単に実装ができるようになりました。

重力を変更したかったのですが、少しはまってしまったので、メモをしておきます。

重力を０にすることで「[モンスターストライク](https://itunes.apple.com/jp/app/id658511662?mt=8)」のような動きをするアプリを簡単に作れてしまいます！


#物理エンジンをONにして、重力を変更

まずは物理エンジンをONにします。
Sceneの`create()`を`createWithPhysics()`に置き換えることでONになります。

次に重力を変更します。以下のようにすると重力が０になり宇宙空間のようになります。
> PhysicsWorld* world = scene->getPhysicsWorld();
world->setGravity(Vec2(0, 0));
※`Vec2(0, -980)`とすることで一般的な現実世界の重力になる。

```lang:GameScene.cpp
Scene* GameScene::createScene() {
    //auto scene = Scene::create();           //通常シーンの作成
    auto scene = Scene::createWithPhysics();  //物理エンジンのシーンの作成
    auto layer = GameScene::create();
    scene->addChild(layer);

    //gravityを変更（現実の場合0,-980）
    PhysicsWorld* world = scene->getPhysicsWorld();
    world->setGravity(Vec2(0, 0));

    return scene;
}
```


#物体（PhysicsBody）を生成する
ここでは丸型と四角型の物体を生成するサンプルを示しておきます。
このサンプルはロードする画像と同じサイズの物体を生成します。
必要に応じて変更して使うとよいと思います。

丸型の物体を生成

```lang:GameScene.cpp
// 丸(物理エンジン)を作成
Sprite* GameScene::addNewCircleAtPosition(Node *parent, Point p, bool dynamic, const char *fileName) {
    Sprite* sprite = Sprite::create(fileName);
    auto material = PHYSICSBODY_MATERIAL_DEFAULT;
    material.density     = 1.0f; // 密度
    material.restitution = 0.7f; // 反発係数
    material.friction    = 0.0f; // 摩擦係数
    sprite->setPhysicsBody(PhysicsBody::createCircle((sprite->getContentSize().width/2 - 1), material));
    sprite->getPhysicsBody()->setDynamic(dynamic);
    sprite->setPosition(p);
    parent->addChild(sprite, 10);
    return sprite;
}
```

四角型の物体を生成

```lang:GameScene.cpp
// 四角(物理エンジン)を作成
Sprite* GameScene::addNewBoxAtPosition(Node *parent, Point p, bool dynamic, const char *fileName) {
    Sprite* sprite = Sprite::create(fileName);
    auto material = PHYSICSBODY_MATERIAL_DEFAULT;
    material.density     = 1.0f; // 密度
    material.restitution = 0.7f; // 反発係数
    material.friction    = 0.0f; // 摩擦係数
    sprite->setPhysicsBody(PhysicsBody::createBox(sprite->getContentSize(), material));
    sprite->getPhysicsBody()->setDynamic(dynamic);
    sprite->setPosition(p);
    parent->addChild(sprite, 10);
    return sprite;
}
```

こんな感じで使います。

```lang:GameScene.cpp
// 固定された物体（壁などに利用）
auto map = this->addNewBoxAtPosition(this, Point(0, 100), false, "map.png");
// 物理計算されてダイナミックに動く物体（プレイヤーなどに利用）
auto player = this->addNewBoxAtPosition(this, Point(100, 100), true, "player.png");

```


#実際に動かす
実際に動かすと重力を無視した状態になり、跳ね返ってもまっすぐに移動するようになります。
パラメータを調整することで、疑似モンストのような動作が実現できます。
反発係数を`1.0`にすると、永遠に跳ね返るようにすることもできます。
係数をいろいろ変更して試して遊んでみてください。



#あとがき
この仕組みを使って最近アプリを作りました。
よかったら見てやってください。
参考：[【くまのがっこう】ジャッキーのほしあつめ](http://blog.tadamatuapps.com/2015/09/blog-post_27.html)

![IMG_2685.PNG](https://qiita-image-store.s3.amazonaws.com/0/94988/6d7b02c8-eef8-f63d-bfa6-f51acf957274.png)　![IMG_2686.PNG](https://qiita-image-store.s3.amazonaws.com/0/94988/3d35c516-c5f3-cc65-fe0d-0d9e9cd06116.png)



今回は「物理エンジンの重力を変更して遊ぶ」でした。

ではまた。
Raspberry Pi + F#でLチカ


Raspberry PiにF#で作ったアプリを実行する環境を作ったのでLチカをやってみた。

[Raspberry PiにF#の実行環境をインストールする](http://qiita.com/locatw/items/4d6bfb49ce9faee9865c)

# 開発環境
以前にUbuntuにF#の開発環境を作っていたので、プログラムはUbuntuでビルドしてRaspberry Piに転送した。

[UbuntuとVisual Studio CodeでF#の開発環境の構築 + デバッグ方法](http://qiita.com/locatw/items/cb451586540be7cb5bba)

# 回路
回路はこのようにした。

![fsharp-led-tick_ブレッドボード_small.png](https://qiita-image-store.s3.amazonaws.com/0/39729/14e3d26e-cdbd-68b8-c512-697fccdb60b5.png)

LEDのアノードとGPIO27(ピン36)、カソードとGround(ピン34)が接続されるようにして、アノードとGPIO27との間に3.3KΩの抵抗を入れた。

# 作業用ディレクトリの作成
Lチカ用のディレクトリを作って移動しておく。

    $ mkdir ~/dev/
    $ cd ~/dev/

# ライブラリのインストール
F#やC#からRaspberry PiのGPIOにアクセスするためにraspberry-sharp-ioというライブラリを使った。

[raspberry-sharp/raspberry-sharp-io](https://github.com/raspberry-sharp/raspberry-sharp-io)

このライブラリはRaspberry.IO.GeneralPurpose, Raspberry.IO.InterIntegratedCircuit, Raspberry.IO.SerialPeripheralInterface, Raspberry.IO.Componentsの4つのライブラリに分かれている。

今回はRaspberry.IO.GeneralPurposeを使うのでNuGetでインストールした。

    $ sudo apt-get install nuget
    $ nuget install Raspberry.IO.GeneralPurpose

# プロジェクトの作成
"LedTick"という名前のプロジェクトを、以前にまとめた方法で作成した。

[プロジェクトファイルを使ってF#のソースコードをビルドする](http://qiita.com/locatw/items/5806abdf961dcd5f9fda)

作成したら、Raspberry.IO.GeneralPurposeのライブラリへの参照をプロジェクトファイル("LedTick.fsproj")に追加する。

```xml
  ...
  <ItemGroup>
    <Reference Include="mscorlib" />
    <Reference Include="FSharp.Core, Version=$(TargetFSharpCoreVersion), Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
      <Private>True</Private>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Numerics" />
    <!-- この要素を追加 -->
    <Reference Include="Raspberry.IO.GeneralPurpose">
      <HintPath>../Raspberry.IO.GeneralPurpose.2.3.0/lib/net40/Raspberry.IO.GeneralPurpose.dll</HintPath>
    </Reference>
  </ItemGroup>
  ...
```

# ソースコード
LedTick.fsに500ms間隔で点灯と消灯を10回繰り返すプログラムを書く。

```F#
module LedTick

open System.Threading;
open Raspberry.IO.GeneralPurpose;

[<EntryPoint>]
let main argv =
    let led = ConnectorPin.P1Pin36.ToProcessor()
    let driver = GpioConnectionSettings.DefaultDriver
    try
        driver.Allocate(led, PinDirection.Output)
        
        for i in [1..10] do
            driver.Write(led, true)
            Thread.Sleep(500)
            driver.Write(led, false)
            Thread.Sleep(500)
    finally
        driver.Release(led)
    0
```

# ビルド
プロジェクトファイルがあるディレクトリに移動してビルドする。

    $ xbuild /p:Configuration=Release

実行ファイルは"bin/Release/"に生成される。

# 実行
実行ファイルとライブラリのDLLをRaspberry Piに転送する。

- LedTick/bin/Release/LedTick.exe
- Raspberry.IO.GeneralPurpose.2.3.0/lib/net40/Raspberry.IO.GeneralPurpose.dll
- Raspberry.IO.GeneralPurpose.2.3.0/lib/net40/Raspberry.IO.Interop.dll
- Raspberry.System.2.0.0/lib/net40/Raspberry.System.dll

Raspberry.System.dllはRaspberry.IO.GeneralPurposeと一緒にインストールされている。

    $ cd ~/dev/
    $ scp [上のファイルのパス] pi@[Raspberry PiのIPアドレス]:~/

転送できたらRaspberry Piで実行してみる。sudoが必要なことに注意する。

    $ cd ~
    $ sudo mono LedTick.exe
    
無事にLEDが10回点滅した。
Apache 2.4 で リバースプロキシの設定

## はじめに
- 古めの記事でリバースプロキシの設定をしてる記事が多いが、最近はだれもやってない？or当たり前なのか、Apache 2.4での設定方法のメモ

## httpd.conf
設定は、Apacheで受けたhttpリクエストすべてを別のサーバに転送する設定

以下のモジュールのコメントアウトを外す

```
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
```

最終行などの空いてるところに以下を追加

```
ProxyRequests Off
ProxyPass / http://test1.com/
ProxyPassReverse / http://test1.com/
```

#### ProxyRequests 
- リバースプロキシだけならOffに。フォワードプロキシならOnにしておくこと。

#### ProxyPass 
- 上の設定の場合は **/** のリクエストを http://test1.com/へと転送する。

#### ProxyPassReverse
- リダイレクトされたときにどこをルートとして持つかの設定と解釈しているが、参考のページを見てくれた方がいい。

## 参考
- [Apache モジュール mod_proxy](http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy.html)
- [[apache] Windows版Apache2.0でmod_proxyを使う](http://d.hatena.ne.jp/trench/20070501/1177997974)
- [mod_proxy再入門 – ProxyPassとProxyPassReverse](http://dev.classmethod.jp/server-side/server/introduction_mod_proxy/)
NSUserDefaultsの使い方


今回はNSUserDelfaultsの使い方について話していこう思います。
NSUserDefaultsは主に簡単なデバイス側のユーザーのデータを管理する際などに使うことが多いです。NSUserDefaultsに保存されたデータはどんなことがあっても消えることがないのに注意しながら、次の使い方を見ていきましょう。
# NSUserDefaultsに値を保存したい
ここでは簡単に例を交えながら値を保存する方法を説明しようと思います。

```swift
//hogeというインスタンスを生成します。
let hoge = NSUserDefaults.standardUserDefaluts()
//hogeに"value"という値を入れ、キーを"Key"に設定しました。
hoge.setObject("value", forKey: "Key")
//hogeの同期
hoge.synchronize()
```
このように値を設定していきます。
**簡単にするとインスタンス名.setObject(保存したい値, forKey: "キー")で保存できます。**

#　他にも

**インスタンス名.boolForKey("キー")**
キーに値が入ってない場合はnilが返ります。
if文などでNSUserDefaultsの値があるかないかで、別々の処理をしたいときはこれを使いましょう。
例

```swift
let hoge = NSUserDefaults.standardUserDefaults()
hoge.setObject("value",forKey: "Key")
//この場合Keyで保存しているhogeには値があるのでtrueが表示されます。
if hoge.objectForkey("Key") != nil {
print("true")

}
else{
print("false")

}

```

**インスタンス名.removeObjectForKey("キー")**
キーにある値を消去します。
一度入れてしまった値は消えることがないので、これで消去しましょう。
Scalaで簡易的なログファイルを出力

Scala始めました。表記に癖があってコードを読むのも一苦労しています。

デバッグを行う時に簡易的なログをファイルに吐き出す。
ファイルが無ければ勝手に作成してくれる。ログファイルは最後に追加していく。
すぐにcloseしているので、これさえ入れておけば自分がどこかでcloseすることはなくて良い。

まずはいつものインポート。

```scala:
import java.io._
```

プログラムの最初辺りに追加。

#コード

```scala:
val DEBUG_MODE=true  // trueでデバッグモード（ログを出力する）
val LOG_FILE_PATH="/home/piyo/hoge.log" // ログの出力先
def log(s: String) {
  if(DEBUG_MODE) {
    var in = new File(LOG_FILE_PATH) // ファイルオープン

    val out = new PrintWriter(new FileWriter(LOG_FILE_PATH, true))
    out.println(s)
    out.close  // ファイルクローズ
  }
}
```


#使用法

`log("てすと")`

出したい値をここに入れてファイルに出力する。これだけ。

* * *
Linux上でJavaからScalaを実行している環境だったので、とても役に立った。
Scala自体を実行している場合は特に必要のなさそうなもの・・。

自分がもう一度使う用のメモとして。
c++ builder > XE4のみヘルプが見えない


以下のヘルプページのうち、XE4だけ見えない。

http://docwiki.embarcadero.com/RADStudio/XE3/en/Main_Page
http://docwiki.embarcadero.com/RADStudio/XE4/en/Main_Page
http://docwiki.embarcadero.com/RADStudio/XE5/en/Main_Page
http://docwiki.embarcadero.com/RADStudio/XE6/en/Main_Page
http://docwiki.embarcadero.com/RADStudio/XE7/en/Main_Page
http://docwiki.embarcadero.com/RADStudio/XE8/en/Main_Page
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Main_Page

XE4のC++11対応を見つけようとしたがダメだった。

http://stackoverflow.com/questions/18909138/lambda-equation-in-c
で聞いた時には見えていたのだが、メンテナンスが失敗しているのだろうか。

<hr>
(追記 2015/10/11)

今日は見えた。メンテナンスが終わったのだろうか?
Ubuntuで毎回設定するもの　まとめ

毎回調べるの面倒なので、自分用のメモ

#Windowsで

```
・とりあえずVirtualBoxを入れる。
・Ubuntu(Mint)最新版ダウンロード
・可変フォルダ（重要）でディスク作成
・VBoxManage.exe setextradata Mint-17.1-MATE2 VBoxInternal2/SharedFoldersEnableSymlinksCreate/workspace_mint 1　でシンボリックリンク出来るように。
・共有フォルダON
・クリップボード設定を双方向で。
```

# aptitude update

```
sudo apt-get update
sudo apt-get install aptitude
sudo aptitude update
sudo aptitude upgrade
```

# Guest Additions

```
sudo apt-get install virtualbox-guest-additions-iso
```

# 日本語入力を出来るようにする

```
# http://linuxmint-jp.net/download.html
wget -q http://packages.linuxmint-jp.net/linuxmint-ja-archive-keyring.gpg -O- | sudo apt-key add -
sudo wget http://packages.linuxmint-jp.net/sources.list.d/linuxmint-ja.list -O /etc/apt/sources.list.d/linuxmint-ja.list
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mint-gnome-ja --install-recommends
・キーボード設定を英語キーボードに変更
・日本語英語変換をAlt-grave に変更
```

# Windows共有フォルダのリンク張り

```
・共有フォルダをVirtualBoxで登録
http://vboxmania.net/content/%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E8%A8%AD%E5%AE%9A
・自動マウントを有効にする
ln -s /media/sf_home sf_home
ln -s /media/sf_home/workspace_mint/ workspace
sudo gpasswd -a ユーザ名 vboxsf
```

# git

```
git config --global alias.st status
git config --global core.editor emacs
git config --global color.ui true
git config --global push.default simple
```

#ssh 設定

```
virtual box のネットワーク設定をNATにし、ポートフォーリングで2222ポートと22ポートをリンクする
sudo /etc/init.d/ssh restart
sudo /etc/init.d/networking restart
sudo vi /etc/ssh/sshd_config
で以下を編集
PermitRootLogin no
PasswordAuthentication no
・Poderosaからlocalhost:2222でログイン出来るか確認
```


# フォント
```
・consolasをWindowsから引越しして、~/.fonts以下に置く。
・Mintのシステム設定の色んなフォントをconsolasに変更
・emacsのフォント設定を変更
(set-frame-font "Consolas Bold 10")
```
 
# 時刻同期(デフォルト20分だと全く同期してくれなくて、ディスク共有時にemacsが変更できずに発狂する)

```
sudo /usr/sbin/VBoxService --timesync-set-threshold 10000
```

#inputrc追加

```
~/.inputrc
set completion-ignore-case on
```
Rails4ことはじめ ( 基本のプロジェクト作成手順 )-rbenv版

# Railsプロジェクト作成手順

上から順番に実行することで、下記の作業が完了します。
1.Ruby gemsのインストール
2.プロジェクトファイルの作成
3.データベースの作成

>ruby、rbenv、bundler等のインストールは省略
>今回はmysql使うので、mysqlインストールされている前提

## Ruby gemsの設定

プロジェクト名のフォルダを作成する

```bash
mkdir myapp
cd myapp
```

Gemfileの作成

```bash
bundle init
```

Gemfileの編集

```bash
vim Gemfile
```

```ruby:Gemfile
source "https://rubygems.org"

gem "rails" #　コメント外す
```

rbenv gemsの設定

```bash
rbenv gemset create 2.2.2 myapp
echo > .rbenv-gemsets myapp
```

```bash
rbenv gemset active
→ myapp global # 作成したgemset名が出力されるといい
```

Rails gemのインストール

```bash
bundle install
```

## Railsプロジェクトの作成

まずは、カレントフォルダを確認

```bash
 pwd
/Users/me/myapp
```

railsプロジェクトの作成

-J : javascriptファイルの作成スキップ
-T : Test::Unitファイルの作成スキップ
-d : データベースの指定
      今回はmysqlを使う。mongo使いたい人は-OオプションでActive Recordファイルのスキップ

> ※rails newコマンドのオプションについてはヘルプ参照
> bundle exec rails -h

```bash
 bundle exec rails new . -J -T -d mysql
 # Gemfileを上書きするか聞かれるので、"y"キーを押す
 Overwrite /Users/me/myapp/Gemfile? (enter "h" for help) [Ynaqdh] y
```

以下のようにプロジェクトファイルが作成される

```bash
 ls
Gemfile		README.rdoc	app		config.ru	doc		log		script		vendor
Gemfile.lock	Rakefile	config		db		lib		public		tmp
```


## DBの作成

データベース設定ファイルを編集
mysqlに接続する設定ファイルができているので、ユーザー名とパスワードの設定項目に書き込むだけでOK

```bash
 vim config/database.yml 
```

プロジェクトアプリのDBを作成

```bash
 bundle exec rake db:create
```

あとは好きなようにソースコードを書き始めればいい。
はじめに

# はじめに
技術ブログをはじめてみようと思いました。
ちょっとググったらQiitaっていうサービスがあったので、こちらを使用してみることにします。

1回目なので自己紹介をしようと思います。
技術と関係ないことになってしまって申し訳ありません。

# 自己紹介
暇人です。
↑Twitterのアカウントが @hima_zinn です。
名前の由来はTwitterをはじめたのが大学の時で、その頃単位が足りすぎていて週3時間くらいしか授業に行ってないという暇人だったからです。
現在は働いていますので、暇人ではありませんｗ。

現在はPS4, Xbox ONE向けのゲームプログラマーをしています。
一度転職をしていて、前職ではゲームではないAndroidアプリ開発をしていました。

Unityは4年、Unreal Engineは1年半くらい前から使ってます。
VRにも興味があり、1年半くらい前からOculus Rift向けアプリを作ったりしています。
現在の仕事での使用言語はC++、前職ではJavaです。

ここには普段僕が使用しているツールの紹介や技術的にメモしたい内容、参加した勉強会についての情報などを書きたいと思っています。
気が向いた時に更新する事になると思いますが、よろしくお願いします。

追伸
どうでもいいことですが、このブログは僕が産まれて10000日目からはじめました。
だから技術ブログを初めてみようと思ったのかもしれません。
c++ builder XE4, 10.2 Tokyo > String > ToCharArray() / Split() [csharpの真似]

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

http://qiita.com/7of9/items/e03083db57cb5cb77ef8
にて muroさんに教えていただいたC#での ToCharArray() と Split()をC++ Builderでも実装できないか試した。

```cpp
#include <memory>
```

```cpp
static bool ToCharArray(String srcStr, TStringList *dstSL)
{
	if (dstSL == NULL) {
		return false;
	}

	String code;
	for(int idx=1; idx <= srcStr.Length(); idx++) {
		code = srcStr.SubString(idx, 1);
		dstSL->Add(code);
	}

	return true;
}

static bool Split(String srcStr, TStringList *sepSL, TStringList *dstSL)
{
	if (sepSL == NULL || dstSL == NULL) {
		return false;
	}

	String res = L"";
	String code;
	bool isDelimiter;

	for(int idx=1; idx <= srcStr.Length(); idx++) {
		code = srcStr.SubString(idx, 1);
		isDelimiter = false;
		for(int si=0; si < sepSL->Count; si++) {
			if (code == sepSL->Strings[si]) {
				isDelimiter = true;
				break;
			}
		}
		if (isDelimiter) {
			OutputDebugString(res.c_str());
			if (res.Length() > 0) {
				dstSL->Add(res);
				res = L"";
			}
		} else {
			res = res + code;
		}
	}

	if (res.Length() > 0) {
		dstSL->Add(res);
		OutputDebugString(res.c_str());
	}
	return true;
}


void __fastcall TForm1::Button2Click(TObject *Sender)
{
	String separators = L",{:}";
	String sample = L"{\"AAA\":{\"bbb\",\"ccc\"},\"ddd\"";

	std::unique_ptr<TStringList> separator(new TStringList);
	std::unique_ptr<TStringList> element(new TStringList);

	bool res;
	res = ToCharArray( separators, separator.get() );
	if (res == false) {
		return;
	}

	res = Split( sample, separator.get(), element.get() );
	if (res == false) {
		return;
	}

	for(int idx=0; idx < element->Count; idx++) {
        Memo1->Lines->Add(element->Strings[idx]);
    }
}
```

```txt:結果
"AAA"
"bbb"
"ccc"
"ddd"
```
AndroidアプリのGoogleMap表示時に"CameraUpdateFactory is not initialized" が発生する

# 端末によって Fatal Exception java.lang.NullPointerException          CameraUpdateFactory is not initialized が発生する


## もしかしたら解決するかもしれないこと
* onCreate で MapsInitializer.initialize(context) をする
* GoogleMapを更新する
* GooglePlayServicesUtil.isGooglePlayServicesAvailable で状態を確認する
* GooglePlay 開発者サービスを更新する

## それぞれについて
#### onCreate で MapsInitializer.initialize(context) をする
* [java.lang.NullPointerException: CameraUpdateFactory is not initialized logcat exception](http://stackoverflow.com/questions/24448378/java-lang-nullpointerexception-cameraupdatefactory-is-not-initialized-logcat-ex)
* 他の端末では initialize の処理なくてもいけてるけど...
* 検索で当たるサイトでは GooglePlayServicesNotAvailableException をキャッチしているところが多いけど今は必要ないらしい。


#### GoogleMapを更新する
* [Google Maps CameraUpdateFactory not initalized](http://stackoverflow.com/questions/19541915/google-maps-cameraupdatefactory-not-initalized)


#### GooglePlayServicesUtil.isGooglePlayServicesAvailable で状態を確認する
* Success で無いならそれが原因かもしれない。

#### GooglePlay 開発者サービスを更新する
* [Google Play開発者サービス - Google Play の Android アプリ](https://play.google.com/store/apps/details?id=com.google.android.gms&hl=ja)
* 結局、今回はこれで解決。

## 今回この問題が起きた状況
* 自分の私用端末(Android 5.0)をメインに開発、4.0で確認したらことごとく動かない。
* 4.0は自分の旧私用端末なので初期化してあったことがもろもろ動かなかったことの大きな原因。
* たいていはアカウント登録したり時刻合わせたりGoogle Play ほかいろいろの同意文に同意したりでだんだん動くようになる。
* でもまさか開発者サービスとは。長い時間かけて更新していたのでかなりアップデートされているのかも。

GooglePlayのアプリ一覧で更新分として出てこないので気づきにくかったです。
mixi OpenID が終了するので omniauth-mixi に移行する

[mixi OpenID が 2016/1/25 に終了する](http://developer.mixi.co.jp/news/mixi_openid/016181.html)ため、これをログイン認証で使用しているサービスは mixi Graph API に移行する必要があります。

以下、Rails + OmniAuth (omniauth-openid) + Devise という前提で、移行する手順を書いていきます。

# Gemfile

まず、OmniAuth 用に [omniauth-mixi](https://github.com/mixi-inc/omniauth-mixi) という便利な gem があるので、これを使います。
ただ、本家の gem だと、今回の移行に必要な `server_state` パラメータの処理が行われていません (2015/10/9 現在)。ですので、修正したものを使います。

```rb:Gemfile
gem 'omniauth-mixi', github: 'milk1000cc/omniauth-mixi', branch: 'support-server-state'
```

omniauth-openid gem は使わなくなるので、他に OpenID の認証を行っていなければ削除しても大丈夫です。


# config/initializers/devise.rb

```rb:config/initializers/devise.rb
config.omniauth(:mixi,
  ENV['MIXI_CONSUMER_KEY'], ENV['MIXI_CONSUMER_SECRET'],
  scope: 'openid openid2 r_profile')
```

移行の際、mixi OpenID のユーザ ID が必要なので、scope に `openid opendid2` を指定します。([参考](http://developer.mixi.co.jp/connect/mixi_graph_api/migration_from_mixi_openid/))
ConsumerKey の取得は、以下のページなどが参考になります。
http://developer.mixi.co.jp/connect/mixi_graph_api/services/

# 移行処理

`OmniauthCallbacksController` で、認証前に以下のようなメソッドを呼べば、mixi OpenID で登録されていたユーザの uid を更新することができます。

```rb
def migrate_old_mixi_uid
  auth = request.env['omniauth.auth']
  old_uid = JWT.decode(auth.credentials.id_token, nil, false)[0]['openid2_id']
  if user = User.find_by(provider: auth.provider, uid: old_uid)
    user.update! uid: auth.uid
  end
end
```

認証処理自体は、変更する必要がありません。
Treasure Dataで特定のセグメントのユーザーのうち、特定の行動をとったUU数をdailyで取得するクエリ

# この記事の目的
特定のセグメントのユーザーのうち、ある特定の行動を行うUU数をdailyで取得するためのクエリのサンプルです。

`JOIN ON`を使い、2つのtableをつなぐのがポイントになります


# Table 構造

## user( 特定のセグメント )

| time | id | path |
| --- | --- | --- |
| Oct 07, 2015 @ 02:39:21 AM | 1 | email |
| Oct 07, 2015 @ 02:19:17 AM | 2 | email |
| Oct 07, 2015 @ 01:18:47 AM | 3 | facebook |


## follow( 特定の行動 )

| time | uid | friend_id |
| --- | --- | --- |
| Oct 02, 2015 @ 02:35:28 AM | 1 | 2 |
| Oct 02, 2015 @ 02:08:27 AM | 2 | 3 |
| Oct 02, 2015 @ 01:56:15 AM | 4 | 1 |

# 実際のクエリ

```HiveQL:HiveQl
SELECT 
  d,
  COUNT(DISTINCT you) AS NUMBER
FROM (
    SELECT 
      d,
      you,
      COUNT(you)
    FROM
      (
        SELECT 
          td_time_format(users.time,
            'yyyy-MM-dd',
            'Asia/Tokyo') AS d,
          users.id AS you,
          follow.friend_id AS they
        FROM
          users
        JOIN
          follow
          ON (
            users.id = follow.uid
          )
        WHERE
          td_time_range(users.time,
            td_time_add(td_scheduled_time(),
              '-1d'),
            td_scheduled_time())
      ) t1
    GROUP BY
      d,
      you
    HAVING
      COUNT(you)> 1
  ) t2
GROUP BY
  d
ORDER BY
  d ASC
```
Railsのsimple_form_forでエラーメッセージが画面に表示されない時

#問題点
- せっかくSimple Form BootStrap対応版いれたのに、エラーメッセージが出ない
- 醜い赤い、マジでヤバイよヤバイよ画面みたいな`ActiveRecord::RecordInvalid`に左遷される
- あまりにも自分が初心者すぎる

#結論

- エラー拾ったけど行き場がなかった
- 拾ったエラーをページに戻してあげればもんだい解決

#**修正**

>- `@user.errors.nil?`から`@user.errors.any?`に変更しました。
>- `redirect_to new_user_path`から`render :new`に変更
>- `redirect_to users_path`から`render :index`に変更
>- こっちでないと正しく動かなかった。何故だろう。
>- renderで何かと、パスが変わっても便利

```ruby:users_controller.rb
  def create
    temp = params.require(:user).permit(:employee_number, :name, :email, :password, :memo, :regular, :leader, :admin, :disable)
    @user = User.create(temp)
    if @user.errors.any?
      render :new
    else
      flash[:success] = temp[:name] + 'を新規登録しました。'
      render :index
    end
  end
```

```erb:new.html.erb
<div class="panel panel-primary">
  <div class="panel-heading">新規登録</div>
  <div class="panel-body">
    <%= simple_form_for @user do |f| %>
        <%= f.error_notification %>
        <%= f.input :name %>
        <%= f.input :email %>
        <%= f.input :password %>
        <%= f.input :employee_number %>
        <%= f.input :memo %>
        <%= f.input :regular  %>
        <%= f.input :leader %>
        <%= f.input :admin %>
        <%= f.input :disable%>
        <div class="form-actions">
          <%= f.submit nil, :class => 'btn btn-primary' %>
          <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                      users_path, :class => 'btn btn-default' %>
        </div>
    <% end %>

  </div>
</div>
```

知っている方には当たり前のことなのでしょうが、私はこれで2日つまづきました。
ちゃんといろいろなソースコードを見ていかないと壁に当たりまくりですね。
ちなみに、もっと気持よく書ける方教えて下さい。

unlessか!を使うべきか悩んでいますが…一般的にはどうされるのでしょうか。

>参考URL
>[simple_form not displaying error](http://stackoverflow.com/questions/16680930/simple-form-not-displaying-error)
>[rafaelfranca/simple_form-bootstrap](https://github.com/rafaelfranca/simple_form-bootstrap)
>[Example application with SimpleForm and Twitter Bootstrap](http://simple-form-bootstrap.plataformatec.com.br/)
Amazon API gatewayをtokyoリージョンで試してみました

tokyoリージョンにAPI gatewayがやってきたので、どのくらい速くなるのか試してみました。
AWS Lambdaでnodejsを使用して`{"hello":"world"}`と出力されるようにtokyo,oregonで仕込みました。それぞれをtokyoとoregonのAPI gatewayにgetメソッドで仕込んで呼び出しました。
レスポンスにかかった時間は以下の通り。

| | tokyo -&gt; tokyo(ms) | tokyo -&gt; oregon(ms) | oregon -&gt; oregon(ms) | oregon -&gt; tokyo(ms) |
| --- | ---: | ---: | ---: | ---: |
|1| 282 | 730 |547  | 984 |
|2| 67 | 491 | 131 | 552 |
|3| 70 | 551 | 116 | 818 |
|4| 53 | 542 | 138 | 387 |
|5| 70 | 490 | 119 | 796 |
|6| 60 | 576 | 386 | 845 |
|7| 78 | 389 | 115 | 586 |
|8| 87 | 525 | 114 | 490 |
|9| 63 | 482 | 434 | 516 |
|10| 51 | 557 | 119 | 779 |
|おそらく太平洋を渡っている回数|0|2|2|4|

色々考察はできそうですが、当たり前のようにtokyo-&gt;tokyo以外選択の余地はないのでどうでもいいかんじです。
c++ builder XE4, 10.2 Tokyo > String > 英数字文字列のみ返す処理 > getAlphaNumericString()

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

タブやエスケープシーケンスなどのない、英数字のみからなる文字列を取得したい。

ただし、括弧も取得したい。

手抜きでIndy使用。

```cpp
#include <IdGlobal.hpp> // IsAlphaNumeric();
...


static String getAlphaNumericString(String srcStr)
{
	String res;
	String code;
	for(int idx=1; idx <= srcStr.Length(); idx++) {
		code = srcStr.SubString(idx, 1);
		if (IsAlphaNumeric(code.c_str())) {
			res = res + code;
		}
		if (code.Pos(L"(") > 0 || code.Pos(L")") > 0) {
			res = res + code;
		}
	}
	return res;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String work = L"aaa-bbb\tddd(abc)";

	String res = getAlphaNumericString(work);

	Memo1->Lines->Add(res);

}
```

```txt:結果(Memo1内)
aaaabbbddd(abc)
```
Heroku PostgresのDBをローカルにコピーする方法

`heroku pg:backups`コマンドでバックアップを取ってダウンロードし、`pg_restore`コマンドでローカルにレストアすればよいです。

### 1. バックアップ取得

アプリ名がsushiの場合

```
$ heroku pg:backups capture --app sushi
```

こんな感じの出力があります

```
Use Ctrl-C at any time to stop monitoring progress; the backup
will continue running. Use heroku pg:backups info to check progress.
Stop a running backup with heroku pg:backups cancel.

DATABASE ---backup---> b001

Running... 7.30MB
```

* `DATABASE ---backup---> b001`という感じでバックアップのIDが表示されるので覚えておきます
* ちょっと時間がかかります。Ctrl+Cで止めても処理は継続されます
* Hobby Devは2個しか取れない(古い方から消える)ので、チームメイトに一言断ってからにしましょう
* Standard 0以上のプランならスケジュールバックアップがあるのでそれを使ってもいいです。チームメイトがキャプチャしたバックアップがあるならそれを使ってもいいです
    * その場合、`heroku pg:backups`でバックアップの一覧を出せるので、最新のバックアップのIDを覚えておきます

### 2. バックアップのダウンロード

アプリ名がsushiでバックアップIDがb001の場合

```
curl -o latest.dump $(heroku pg:backups public-url b001 --app sushi)
```

* `heroku pg:backups public-url b001 --app sushi`でURLを表示できます。10分間有効です
* 上のコマンドはcurlに渡してすぐにダウンロードするようにしています。latest.dumpというファイル名で保存されます

### 3. ローカルのDBにレストア

データベース名が`hogehoge_development`で、認証なしの場合(Railsならそうなってるはず)

```
pg_restore --verbose --clean --no-acl --no-owner -h localhost -d hogehoge_development latest.dump
```

* DBのスキーマとレコードがまるごとレストアされます。`rake db:migrate`などは必要ないです
* `--verbose`オプションでログ表示
* `--clean`オプションで、元々あったデータを全部消してからレストアする
* `--no-acl`と`--no-owner`は権限設定をスキップする。ローカルなのでこれでいいと思う
* `-h localhost`はレストア先のホストの指定
* `-d hogehoge_development`はレストア先のデータベース名の指定

#### 注意点

Heroku Connectを使っている場合、Heroku Connectが使うトリガーや管理テーブル(`_trigger_log`など)、管理カラム(`_hc_lastop`など)も全部レストアされます。Heroku Connectのテーブルを`ridgepole`でローカルに再現している場合、管理テーブル、管理カラムも再現するようにしないと、次に`ridgepole --apply`した時にその辺が消えてトリガーが落ちるようになります。

よーするに`ridgepole --export`する時に`--ignore-tables '\\A_'`を付けたり、エクスポートされたSchemafileをいじったりするなということです。

### 参考リンク

* http://www.postgresql.org/docs/9.4/static/app-pgrestore.html
* https://devcenter.heroku.com/articles/heroku-postgres-backups
fabricの雰囲気をつかむ

# fabricとは
Pythonでシェルスクリプトを実行できるツールです。環境設定やデプロイなど、何度も同じことを繰り返すときにfabricでまとめておくと便利になります。
操作される側はSSHさえ動いていれば使え、環境に依存しません。

## ChefとかCapistranoでいいんじゃないの？
fabricはこの2つよりシンプルで覚えやすく、すぐ使えます。
既に習得済みの方は、乗り換えずにそのまま使えばいいと思います。

# 環境構築
## ubuntu
```bash
sudo apt-get install fabric
```

## centos
```bash
sudo yum install fabric
```

## mac
```bash
brew install fabric
```

## Windows
おとなしくLinuxを使いましょう。仮想環境なら構築は非常に簡単です。
[Windows 7マシンで、VirtualBox+Vagrantを使いUbuntu 14.04を動かす](http://blog.kondoyoshiyuki.com/2014/06/12/windows7-vagrant-ubuntu14-04)

# hello, world
fabricはカレントディレクトリに置いてある、fabfile.pyを実行します。

```fabfile.py
# -*- coding: utf-8 -*

from fabric.api import *

def hello_world():
	local('echo "hello, world!') # local関数はfabricを実行している環境でシェルスクリプトを実行する
```

上記のようにファイルを作成し、下記のように「fab 関数名」をシェルで実行すると、fabfile.pyに記述した関数が実行されます。

```bash
fab hello_world
```

# SSH経由で実行する

```fabfile.py
# -*- coding: utf-8 -*

from fabric.api import *

def hello_world():
	run('echo "hello, world!') # run関数は指定したホストで実行する
```

localhostを指定していますが、適宜実行できる環境に書き換えてください。複数指定もできます。

```bash
fab hello_world -H localhost # -Hオプションで接続先を指定する
```

# 標準出力、終了コードを受け取る
デフォルトで終了コード0以外を受け取ると、その場で終了します。実行コマンドのオプションにwarn_onlyをつけると、終了せず警告を出力するだけになります。

```fabfile.py
def hoge_exists():
	local('test -d /hoge')
	local('echo done') # ここまでこない
```

```fabfile.py
def hoge_exists():
	with settings(warn_only=True):
		local('test -d /hoge')
		local('echo done') # doneと出力される
```

また、戻り値には標準出力の内容と終了コードが設定されています。

```fabfile.py
# デコレータでもいい
@with_settings(warn_only=True)
def hoge_exists():
    # failedは終了コードが0以外ならTrue。succeededなら成功したか？
	if local('test -d /hoge').failed:
		local('echo なかったよ')
	else:
		local('echo あったよ')

    # quietをつけると何も表示しない
	with quiet():
		result = local('git config user.name', capture=True)
    local("echo %s" % result) # gitのユーザ名が表示されるはず
```

# etc
なんとなく雰囲気はつかめたかと思います。

参考
[Python製デプロイツール Fabricを初めて使う際に役立つTips](http://dekokun.github.io/posts/2013-04-07.html)
PostgreSQLのJSON型を使う


PostgreSQLにはJSON型がある

配列やハッシュを格納できる。

## Rails での使い方

```
create_table :user do |t|
  t.json :foo
  t.jsonb :bar
end
```


[PostgreSQLドキュメントのJSONデータ型](https://www.postgresql.jp/document/9.4/html/datatype-json.html) からの引用

> JSONデータ型にはjson型とjsonb型という2種類のデータ型があります。 それらは ほとんど 同一の入力値セットを受け入れます。現実的に主要な違いは効率です。

> json型は入力値のコピーを格納しているので、意味的に重要でないトークン間の空白だけでなく、JSONオブジェクト内のキーの順序も維持します。これとは対照的に、jsonbは空白を保持しません。

> ほとんどのアプリケーションではJSONデータ型としてjsonb型のほうが望ましいでしょう

## おまけ

serializerを使えば他のDBでも使える。
手っ取り早い。けど遅い。

```
class Article < ActiveRecord::Base
  serialize :tags, JSON
end
```

[Railsリファレンス serialize](http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize)
InputSteamとOutputStreamとReaderとWriterのメモ

##InputSteamとOutputStreamとReaderとWriter
- InputStream, OutputStream系: バイトストリーム
    - OutPutStreamでwriteしたあとはflush()したほうがいい
- Writer, Reader系: 文字ストリーム
    - Writerの場合はclose時に勝手flush()にしてくれるらしい

```java

//  バイトストリームで取得して、文字列として読みたかったら文字コードをしていして、文字ストリームに変換する
BufferedReader reader = new BufferedReader(
    new InputStreamReader(new FileInputStream("sampledata.txt"), "Shift_JIS")); 
    
// FileReaderを使うと、一発でInputStreamReaderを取得できる            
BufferedReader reader = new BufferedReader(new FileReader("sampledata.txt"), "Shift_JIS")));
```

###クラスの関係のメモ
```
- Writer
    - BufferedWriter
    - OutputStreamWriter
        - FileWriter
    - PrintWriter

- Reader
    - BufferedWriter
    - InputStreamWriter
        - FileReader

- InputStream
    - ByteArrayInputStream
        - BufferedInputStream 
    - FileInputStream

- OutputStream
    - ByteArrayOutputStream
        - BufferedOutputStream
    - FileOutputStream
```

##参考
http://www.atmarkit.co.jp/ait/articles/0709/12/news124_2.html
Liquid


## 使い方

### セットアップ

```Gemfile
gem 'liquid'
```

を追加して、

```
$ bundle install
```

するだけ。

### 基本的な流れ

* 文字列のテンプレートを作成する
* モデルに liquid_methods を追加
* テンプレートをパースして表示

### 文字列のテンプレートを作成する

```
template = 'Hi!! {{ product.name }}'
```

### モデルに liquid_methods を追加
 * to_liquidメソッドが定義される
 * liquid_methods に定義された属性のみ使える

```Ruby:model
class Product < ActiveRecord::Base
  liquid_methods :name
end
```

### テンプレートを表示

```Ruby:controller
@template = Liquid::Template.parse('Hi!! {{ product.name }}')
@template.render('product' => Product.first)
```

* テンプレート中で文法エラーが発生すると `Liquid::SyntaxError` の例外が発生する 

```
>> Liquid::Template.parse("{{")
Liquid::SyntaxError: Liquid syntax error: Variable '{{' was not properly terminated with regexp: /\}\}/
```

## フィルタ
シェルのパイプラインのようにテキストを変換していくことができる

```
module MarkupFilter
  def textilize(string)
    Markup.new(string).to_html
  end
end
```

```template
{{ '*strong*' | textilize }} 
```


## Tags

テンプレート中にロジックを埋め込む場合に使う

```
{{ foo }}
```

## liquid-rails

Rails でファイルで呼び出せるようにする 

### コントローラからのアクセス

テンプレート中ではコントローラ中で利用可能なすべてのインスタンス変数とフィルタが利用可能となるため、制約できるメソッドが容易されている

|メソッド名| 使い方 |
|:---:|---|
| **liquid_assings** | テンプレート中で参照する名前をキーとインスタンスを値としたハッシュを渡す |
| **liquid_filters** | 利用可能とするヘルパメソッドを記述する |
Rails プラクティス


## アソシエーション

### accepts_nested_attributes_for

has_oneやhas_manyで関連する子レコードを保存するメソッドの追加

```
Company
  has_many :addresses
  accepts_nested_attributes_for :addresses, allow_destroy: true
Address
  belongs_to :company
```

とすると、Companyモデルを保存するタイミングでAddressモデルを作成・更新できる。

`addresses_attributes` のように _attributes がつけられる。

フォームなどの画面から編集した場合によく使われるが、モデルのみでも使うことができる。

コントローラーではStrong Parameterに追加しておくとよい。

```
param.require(:company).permit(
   addresses_attributes: [
      :_destroy,   # 削除する場合 trueに設定
      :id,
      :name
   ]
)
```

ビューの fields_for と組み合わせて使う。

## バリデーション

### validates のデフォルトバリデータ

[RailsAPI:ActiveModel::Validations::ClassMethods](http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html)

|項目名|ヘルパメソッド名|内容|
|---|---|---|
| acceptance | validates_acceptance_of | チェックされているか（同意している）か |
| confirmation | validates_confirmation_of | メールやパスワードが一致しているか |
| exclusion | validates_exclusion_of |
| format | validates_format_of | 
| inclusion | validates_inclusion_of |
| length | validates_length_of |
| numericality | validates_numericality_of |
| presence | validates_presence_of |
| uniqueness | x |

### オプション

|項目名|内容|例|
|---|---|---|
| on | バリデーションを有効にするときコンテキスト. <br>valid? や save? メソッド時の contextオプションで指定する.<br>省略時は :create, :update など。 | on: [:create, :update] |
| if | バリデーションを有効にするときの条件 | if: :password_required? |
| unless | バリデーションを無効にするときの条件 | |
| allow_nil | nil を通すか | allow_nil: true |
| allow_blank | 空を通すか | allow_blank: true |
| strict | エラー時に例外を投げるか | strict: false


## コントローラとビュー
[RailsGuides:Action Controller の概要](http://railsguides.jp/action_controller_overview.html)
[RailsGuides:レイアウトとレンダリング](http://railsguides.jp/layouts_and_rendering.html#render%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)

### view_context

ActionView のインスタンス。コントローラ中のデフォルトのビュークラス。

ビューの表示は `ActionController::Base#render` が行っている

### render_to_string

出力結果をブラウザに返さずに文字列を返す

### sessions

セッションを取得。ハッシュで入ってくる。

```
session[:foo]
session[:foo] = "bar"
```

### cookies

クッキーの情報を取得。ハッシュで入ってくる

## ビュー

### ローカル変数を使う

インスタンスの変数のかわりにローカル変数を使う場合

```app/models/controller
def index
  render "index", foo: 'bar'
end
```

## コンソール

## ソースを再読み込みする

development環境で開発中に読み込み直す場合

```
$ rails c
pry> reload!
```

## テスト

### JavaScript

Rspec + Capybara + ドライバ

#### selenium

Xvfb を使って selenium を起動する

#### [capybara-webkit](https://github.com/thoughtbot/capybara-webkit)

headless ドライバ. Qt が必要.

#### [poltergeist](https://github.com/teampoltergeist/poltergeist)

PhantomJS を capybara で使うドライバ. Xvfb が不要.
UNIXとシェルについて入門編

猿でもわかる用に書いてみました　途中なので後ほど追記します
#UNIXとシェルの関係性とは
###・UNIXはシェルを通して操作するもの
UNIXに何かをさせるためにはコマンドが必要で、シェルはそのコマンドの一つである。シェルが行うのは、自分たちがやりたい事をUNIXに伝える

###・シェルには種類がある
UNIXにログインしたときは、ログインシェルというシェルがUNIXとそのユーザとを仲立ちしている

```
# どういうシェルが仲立ちになっているか確認する
$ echo $SHELL 
```
ここに表示されたものがコマンドインプリタとして今自分のUNIXに実装されているもの

###・シェルには二つの側面がある
・コマンドインプリタ（ログインシェル）としてのシェル
・スクリプト言語としてのシェル

####よく使われるスクリプト言語としてのシェル
**Bシェル**：Bourne shell `/bin/sh`
どんなUNIXにも標準で装備されてて汎用性に優れる

ログインシェルにCシェル使ってる人もいるけどスクリプト書くときはみんなBシェル使うらしい　ていうかそれが当たり前になりつつあるらしい

###シェルプログラミング＝シェルスクリプトを書くこと
「シェルスクリプトを書く」＝UNIXのコマンドを組み合わせる事で新しく自分なりのコマンド（つってもただのテキストファイル）を作る
コマンドは1つずついれるけどまとめてシェルスクリプトに入れたり、条件判定によって操作を変えたりする

####なぜシェルスクリプトを書くのか？
・ルーティンワークを単純化する
・特別な処理をするコマンドを新たに作る
特に、一度作ってしまえばたいていのUNIX上で同じように動作出来る野が利点。基本的には同じシェルスクリプト野書き方で通用するから汎用性が高い

###シェルスクリプトを書くために必要なのは
・ある程度の数のコマンドを知っておくこと
こうしたい、という作業をさせるためのコマンドがわからないとシェルスクリプトを作成することができない
・シェルプログラミングのための文法を身につけておくこと
変数の使い方や条件判定、ループなどという処理のさせ方がわかっていないとシェルスクリプトは書けない＝シェルプログラミングはできない



#シェルスクリプトの基本
・拡張子は「.sh」
・コメントアウトは「#」で一行、「<<」で複数行
・スクリプトは必ず`#!/bin/sh`　で書き始める
（Bシェルをスクリプト言語として使うよ〜っていう宣言）


###クォーテーションの使い分け
文字列をシェルに書くときにシェルに読ませたくない文字列があるときはどうするか？
""とか''とか/とかを使う。これを使って記号の持つ意味を殺すことを「エスケープする」という。

・ダブルクォート（"）
囲んだ文字列の中で、変数の置き換えやコマンド置換した結果を使いたいとき
・シングルクォート(')
シェルによる解釈を全くさせたくないとき
＝「$」「/」「"」などの文字をそのままの文字として使いたいとき
sedコマンドやawkコマンドを使うときによく使う
・バックスラッシュ(/)
あんまり使わなくていい　ダブルクォート使ってるときに1文字だけエスケープしたいときに使う　でもあんまり使わなくていい

基本ダブルクォート使ってたまにバックスラッシュ、全部エスケープしたいときはシングルクォートを使うといいかも
MacのデフォルトApacheの自動起動・解除


MAMPを動かそうとした時にハマった
自動起動のコマンドはよく描いてあるけど、自動起動解除はあまりなかったので

自動起動

```bash
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```

自動起動解除

```bash
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```
loadをunloadに変えるだけ

これで無事にMAMPが動いた
[Unity5][Android][iOS]バーチャルパッドを実装する

Unity5でスマートフォンゲーム向けにバーチャルパッドを実装する方法を紹介します。
#**目標**
今回実装するバーチャルパッドは下図のようなものです。
画像左下のパッドへの入力値を表示するところまでを行います。
![手順３.png](https://qiita-image-store.s3.amazonaws.com/0/48341/32e0f3d0-9230-873e-e204-060692ffd4f9.png)


#**手順**
1. CrossPlatformInputをインポートする
2. Prefabを設置する
3. パッドからの入力を受け取るスクリプトを記述する

##1.CrossplatformInputをインポートする
上部メニューバーから、[Assets]->[Import Package]->[CrossPlatformInput]の順に選択し、パッケージをインポートします。
![手順１.png](https://qiita-image-store.s3.amazonaws.com/0/48341/e394c03c-9fa3-ef22-b841-0d5a3ef7197a.png)

##2.Prefabを設置する
Projectウィンドウから、[Standard Assets]->[CrossPlatformInput]->[Prefabs]->[MobileSingleStickControl]を選びシーン内に設置します。
![手順２_2.png](https://qiita-image-store.s3.amazonaws.com/0/48341/f3b46c56-db97-c893-075d-e681f9f426c2.png)

するとバーチャルパッドとついでにボタンが表示されます。
*注意:heavy_exclamation_mark:：このときBuild SettingでPlatformがAndroidもしくはiOSに設定されていないと、パッドは表示されません！（筆者はこれを忘れていてめっちゃつまづいた）*

この時点でシーンを実行すると、パッドをマウス左クリックでホールドすることでぐりぐり動かせるようになります。

##3.パッドからの入力を受け取るスクリプトを記述する
最後にスクリプトでパッドへの入力値を確認してみます。
冒頭に、`using UnityStandardAssets.CrossPlatformInput;` を記述することで
`CrossPlatformInputManager.GetAxisRaw`によりパッドへの入力値を受け取れます。

```csharp:Sample.cs
using UnityEngine;
using System.Collections;
using UnityStandardAssets.CrossPlatformInput; //←追加

public class Sample : MonoBehaviour {
	// Update is called once per frame
	void Update () {
        // 水平方向への入力( -1.0 ～ 1.0 )
        Debug.Log( "Horizontal : " + CrossPlatformInputManager.GetAxisRaw( "Horizontal" ) );
        // 垂直方向への入力( -1.0 ～ 1.0 )
        Debug.Log( "Vertical : " + CrossPlatformInputManager.GetAxisRaw( "Vertical" ) );

	}
}

```

実行してみると、Console画面にパッドへの入力値が表示されているのが分かります。
![手順３.png](https://qiita-image-store.s3.amazonaws.com/0/48341/c500bbc8-b632-4eb5-5ecc-56bd5b2e4c4d.png)


あとはこの値をキャラクターの移動などに用いるだけですね。