OmniAICreator/Qiita-1.07M huggingface dataset:
より安全なstoi（文字列を数値に変換する関数）

[std::stoi](http://www.cplusplus.com/reference/string/stoi/)では余分の文字が入ってる場合でも変換できます、例えばstd::stoi("123x1")は123を返します。
ここでより安全なstoiを作ってみました。

ソースコード

```c++
template <class T>
inline void stoi_s(const std::string& str, T& result, int base = 10) {
	char* end = nullptr;
	errno = 0;
	long long i = ::strtoll(str.c_str(), &end, base);
	if (end != (str.c_str() + str.size()) || str.size() <= 0 || errno != 0) {
		throw std::invalid_argument("stoi_s");
	}
	if (i < 0 && !std::numeric_limits<T>::is_signed) {
		// if T is unsigned, i will convert to unsigned before compare to result_test
		// make sure i is not negative here
		throw std::out_of_range("stoi_s");
	}
	T result_test = static_cast<T>(i);
	if (result_test != i) {
		throw std::out_of_range("stoi_s");
	}
	result = result_test;
}
```

テスト

```c++
template <class TException, class TFunction>
bool exception_catched(TFunction function) {
	try {
		function();
	} catch(TException&) {
		return true;
	}
	return false;
}

void test() {
	uint8_t a = 0;
	int32_t b = 0;
	uint64_t c = 0;

	stoi_s("100", a);
	assert(a == 100);
	stoi_s("-100", b);
	assert(b == -100);
	stoi_s("-0x80000000", b, 16);
	assert(b == -0x80000000);
	assert(exception_catched<std::invalid_argument>([&] { stoi_s("asd", a); }));
	assert(exception_catched<std::invalid_argument>([&] { stoi_s("1asd", a); })); 
	assert(exception_catched<std::out_of_range>([&] { stoi_s("-1", a); })); 
	assert(exception_catched<std::out_of_range>([&] { stoi_s("300", a); })); 
	assert(exception_catched<std::out_of_range>([&] { stoi_s("-0x80000001", b, 16); }));
	assert(exception_catched<std::out_of_range>([&] { stoi_s("-1", c); }));
	assert(exception_catched<std::invalid_argument>([&] {
		stoi_s("0x8000000000000000", c, 16);
	}));
}
```

manページ
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/strtoll.3.html
Mavenビルドの成果物のバージョンをタイムスタンプにする方法

## はじめに

"hoge" という名前のJARパッケージを開発している際に、
成果物の名前を「hoge-0.0.1-SNAPSHOT」等ではなくタイムスタンプを入れたい場合があります。

下記のサンプルのPOMファイルのように "gmaven-plugin" を利用すると実現する事が可能です。

## サンプルのPOMファイル

```xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>org.hirokapi</groupId>
  <artifactId>hirokapi</artifactId>
  <packaging>jar</packaging>
  <name>The Hirokapi Project</name>
  <version>0.0.1</version>

    :    :    :

  <build>

    :    :    :

    <!-- <finalName>${artifactId}-${version}</finalName> -->
    <finalName>${artifactId}-${timestamp}</finalName>

    :    :    :

    <plugins>

    :    :    :

      <plugin>
        <groupId>org.codehaus.gmaven</groupId>
        <artifactId>gmaven-plugin</artifactId>
        <executions>
          <execution>
            <id>set-custom-property</id>
            <phase>initialize</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <source>
                def timestamp = new Date().format('yyyyMMdd.HHmmss')
                project.properties.setProperty('timestamp', timestamp)
              </source>
            </configuration>
          </execution>
        </executions>
      </plugin>

    :    :    :

    </plugins>
  </build>

    :    :    :

</project>
```

## 成果物

上記のPOMでビルドすると、「hirokapi-20141129.200650.jar」のようなJARが生成されます。
rails & railsプロジェクトのローカル環境へのインストール・構築

以下，Ruby on Rails自体をローカル環境にインストールし，railsプロジェクトのひな形をそのローカル環境に構築した際の覚え書き．

# rbenvをインストール

http://qiita.com/kerug/items/0a941fc4f8e9f6932729

# 利用したいrubyバージョンをインストール 

```bash
$ rbenv install 2.1.5
```

グローバル環境に`bundler`だけをインストール

```bash
$ gem install bundler
```

# プロジェクトフォルダを作成

```
$ mkdir example
$ cd example
$ rbenv local 2.1.5
```

# railsをローカル環境にインストール

下記の内容で`Gemfile`を作成

```rb
source "http://rubygems.org"
gem "rails", "4.1.8"
```

railsを`./vendor/bundle`にインストール

```bash
$ bundle install --path vendor/bundle
```

# プロジェクトのひな形を作成

```bash
$ bundle exec rails new .
```

このとき，Gemfileを上書きするか聞いてくるので上書きする．

```bash
$ bundle exec rails server
```

で正常に動作することを確認．

# References
- http://qiita.com/emadurandal/items/a60886152a4c99ce1017
Ascii art maker


phonopyというプログラムでプログラムの最初と最後にascii artの文字が出てくるのが良かったので，ascii art文字を作るウェブサイトを探したら良いのが見つかった．

[Text to ASCII Art Generator (TAAG)](http://www.patorjk.com/software/taag/#p=testall&f=Slide&t=end)

ここで **Lean** というフォントで作ったのが以下．

```                                                        
      _/_/  _/    _/                            _/      
   _/          _/_/_/_/  _/_/_/      _/_/    _/_/_/_/   
_/_/_/_/  _/    _/      _/    _/  _/    _/    _/        
 _/      _/    _/      _/    _/  _/    _/    _/         
_/      _/      _/_/  _/_/_/      _/_/        _/_/      
                     _/                                 
                    _/                                  
```

```
                             _/   
    _/_/    _/_/_/      _/_/_/    
 _/_/_/_/  _/    _/  _/    _/     
_/        _/    _/  _/    _/      
 _/_/_/  _/    _/    _/_/_/   
```

色が付いているように見えてもそれはウソ．
VPCピアリングを使用してみる

#VPCピアリング

VPCピアリングは、同一リージョン内のVPC同士を接続するサービスです。

接続の作成は無料ですが、VPC同士の通信には費用がかかります。

##使用例

・AWSコンテンツの集約
　　Redshiftなどを複数のVPCからアクセスし１つに集約したいときに使用する。

・アカウント間の通信
　　AWSアカウントが複数ある場合で通信を行いたい際に使用する。

・VPNを使用する場合
　　AWSとVPNを使用する際には、同一IPで２つのVPNを作成できない制約があります。
　　VPCピアリングと踏み台サーバを利用することでVPN経由でSSHなどを使用することができます。
　　※踏み台を挟まないとVPCを跨いで直接通信することはできない。


##使用する際の注意

・重複するネットワークを接続することはできない。
・異なるリージョンとの接続はできない。
・VPCピアリングの上限はデフォルト50、最大125。
・MTUは1500バイト
・プレイスメントグループはVPCをまたぐことはできない。
・プライベードDNSはVPC間では解決できない。
・VPC_A→VPC_B→VPC_C　のようなVPCをまたぐルーティングはできない(やりたいならフルメッシュで作るとよい)
・VPCPeer経由でインターネットやVPNに接続することはできない(NATすればできそうな気がする)

利用する際には、ネットワークセグメント設計をしっかりやることは忘れずに。

##利用方法

コンソールからPeering Connectionsを使用して作成する。
![VPC_Management_Console_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/ec4be00b-f2fa-eaa2-db50-0ceb247d0627.jpeg)

別のアカウントの際
![VPC_Management_Console_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/48bf26b4-8113-85dd-68d8-6ab34b086ee2.jpeg)

自分のアカウントの際
![VPC_Management_Console_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/281b13a4-e52c-c963-0d7b-ea4e5c4c8d01.jpeg)

リクエストが送られるので許可してあげる
![VPC_Management_Console_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/978ad3cb-d7c8-6c2c-8d42-8af9f04bfc7a.jpeg)

お互いのルーティングテーブルにルートを追加する
![VPC_Management_Console_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/cba3165d-65ca-6525-0b16-c5249a1cb5ec.jpeg)


##etc

レイテンシーは2ms〜5msぐらい
特定のサービスを提供するアカウントに紐付けたりすることで、威力を発揮するが
ネットワーク設計をしっかりしておくことが前提となる。
CakePHPのPrefix Routingで$this->Form->createに勝手にprefixがついてしまう時の対応

そんなやついねぇとは思うが、
例えば、/user/post/add でアクセスしても /post/add でアクセスしても同じコントローラ、アクションが呼ばれるようにしたい場合。

routes.php にこう書く。

```php:Config/routes.php
	Router::connect('/user/:controller/:action/*', array());
```

これでまあ一応動くんだが、この状態でフォームヘルパーとかで

```php
	echo $this->Form->create(null, array('id' => false, 'url' => array('controller' => 'post', 'action' => 'edit')));
```
	
みたいなのを書くと、何故か

```html
<form accept-charset="utf-8" method="post" action="/user/post/edit">
```

と生成されてくれる。これを防ぐには

```php:Config/routes.php
	Router::connect('/user/:controller/:action/*', array('user' => true));
```

とする。理由は不明。
JBehaveのExamplesTableのパラメータにハイフンを入れるとコケる顛末

まだまだ未知の機能が多いJBehave。
今回はExamplesTableのパラメータで詰まった。

#ExamplesTableで何かコケる

落ちてたのはここ。

```
Then 入力画面の入力欄が以下の通りになっている:
|カテゴリー|
|-- 選択してください --|
```

(FAILED)
(java.lang.AssertionError: org.jbehave.core.model.ExamplesTable$RowNotFound: 0)

何故だ！

で、ハイフン消したらすんなり動いた。
つまりハイフンはダメなんですね。。。

さて、なぜだめなのかちょっとソースを追っかけてみる。


```ExamplesTable.java
public class ExamplesTable {
    private static final Map<String, String> EMPTY_MAP = Collections.emptyMap();
    private static final String EMPTY_VALUE = "";

    public static final ExamplesTable EMPTY = new ExamplesTable("");

    private static final String ROW_SEPARATOR = "\r?\n";
    private static final String NEW_LINE = "\n";
    private static final String HEADER_SEPARATOR = "|";
    private static final String VALUE_SEPARATOR = "|";
    private static final String IGNORABLE_SEPARATOR = "|--";

```

なんと、|--は無視レコードになるのですか。

しかしなー、画面仕様上、プルダウンのデフォルトは「-- 選択してください --」なのだよ。

改めてJBehaveのTabular Parametersのページを確認してみるとこんな記述が。

```
Specifying inlined separators

The separators are also configurable via inlined properties:


{ignorableSeparator=!--,headerSeparator=!,valueSeparator=!,commentSeparator=#}
!header 1!header 2! .... !header n!
!-- An ignored row --!
!value 11#comment in value!value 12! .... !value 1n!
...
!-- Another ignored row --!
!value m1!value m2! .... !value mn!

```
http://jbehave.org/reference/stable/tabular-parameters.html

ということは無視レコードの書式は変更できるのかな？
やってみよう。

```
Then 入力画面の入力欄が以下の通りになっている:
{ignorableSeparator=|**}
|カテゴリー|
|-- 選択してください --|
```

通った！
マルチディスプレイでエアロスナップする方法

## マルチディスプレイにおけるエアロスナップ

マルチディスプレイの場合、画面のつなぎ目の部分はマウスアクションでは一画面とみなされるのでエアロスナップされない。これはちょっと困る。

![20141128.png](https://qiita-image-store.s3.amazonaws.com/0/28815/72791fb1-7833-3de9-5ca5-30420faa8798.png)


##解決方法

対象ウィンドウをアクティブにして、ウィンドウショートカットキーで解決。
<kbd>Windows</kbd> + <kbd>→</kbd>
<kbd>Windows</kbd> + <kbd>←</kbd>
![2014112801.png](https://qiita-image-store.s3.amazonaws.com/0/28815/c535bfc5-1947-7720-f134-24e8dfa2483e.png)

今までこれを知らなかったので苦労してました。。感動したのでポスト。
スレッドとタスクについて

http://ufcpp.net/study/csharp/misc_task.html の内容を簡単にまとめてみました。


## スレッド

従来の非同期処理として、Threadクラスを使用していた。

これは新規にワーカースレッドを作成・実行させることでバックグラウンド処理を行うものである。

ただし、スレッド(の切り替え)は高コストであり、基本的は直接スレッド作成することは推奨されない。

## スレッドの切り替え

「マルチスレッド」処理は並列に処理が行われているように見えるが、実際には一定間隔で実行するスレッドを切り替えしながら各スレッドを少しずつ処理している。

この切り替えは「コンテキストスイッチ」と呼ばれる。以下のようなことを行っている。

1. 現在スレッドのメモリ状態・CPUのレジスター内容の退避

2. 切替先スレッドのメモリ状態・CPUのレジスター内容の復元

コンテキストスイッチ発生回数が減ると、CPUを効率よく利用することができるようになる！これを実現しているのがスレッドプールの仕組みとなる。


## スレッドプール

スレッドを有効利用するための仕組み。以下のようなことを行う。

+ 予めいくらかのスレッドを作成しておく。

+ 各スレッドではスレッドプールが持つキューに追加されたタスクを取り出し実行する。


## タスク

.NET4.0では、Task.Factory.StartNewメソッド でタスクの生成・スレッドプールへのキューイングを行う。

.NET4.5からは、前述のメソッドに追加して Task.Runメソッド が追加された。(機能的にはStartNew()と変わらない。複雑であった引数体系をシンプルにしたものとのこと。)

http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
Grunt 導入についてまとめ（node.js + npm @ windows)

#1.Grunt導入にあたって ( Windows )
社内用にGrunt導入にあたっての手順書いていきます。
##1-1.node.jsのインストール
下記URLを参考にnode.jsをインストールします。
>http://qiita.com/roana0229/items/29232508e71559d0fd5f
>
>2.パッケージをインストールするための下準備

>```cmd
>@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
>```
>
>3.Node.jsをインストール

>```cmd
>cinst nodejs.install
>```
>
>4.Node.jsが正しくインストールされたか確認

>```cmd
>node -v
>```

##1-2.Gruntのインストール
下記URL中ごろの「Gruntのインストール」を参考にGruntをインストールします。
実際には下記のみでOK

>http://www.atmarkit.co.jp/ait/articles/1403/04/news020_2.html
>
>```
>% npm install -g grunt-cli
>```


##1-3.Gruntのモジュールをインストール
同じく上記URLを参考にGruntのモジュールをインストールしていきます。
>http://www.atmarkit.co.jp/ait/articles/1403/04/news020_2.html
>###1-3-1.package.jsonを作成

>
>```cmd
>% npm init
>```

>###1-3-2.gruntモジュールを登録

>```cmd
>% npm install grunt --save-dev
>```

#2.プラグイン等のインストールをする
下記URLを参考に進めてください。
http://www.atmarkit.co.jp/ait/articles/1404/08/news033.html

##2-1.画像最適化
TinyPNGで、PNG・JPGを最適化、
grunt-contrib-imageminで、GIFを最適化していきます。
###2-1-1.TinyPNGのAPIキーを取得
下記ページでAPIキーを取得してください。
無料ライセンスだと、1か月で500アイテムまで最適化できます。
https://tinypng.com/developers
###2-1-2.プラグインをインストールする

```cmd
npm install grunt-contrib-imagemin --save-dev
npm install grunt-tinypng --save-dev
```

###2-1-3.Gruntに記述していきます。
Grunt用のソースは下記を参考に記述。
コード中の"APIキー"に「I」にて取得したAPIキーをいれます。

>http://memo.sanographix.net/post/89148648990
>
>```js:Gruntfile.js
>module.exports = function(grunt){
>    grunt.loadNpmTasks("grunt-contrib-watch");
>    grunt.loadNpmTasks('grunt-contrib-imagemin');
>    grunt.loadNpmTasks('grunt-tinypng');
>    grunt.initConfig({
>        paths: {
>            img: 'images/', //元画像
>            imgdist: 'dist/images/' //出力先
>        },
>        imagemin: {
>            dynamic: {
>                files: [{
>                    expand: true,
>                    cwd: '<%= paths.img %>',
>                    src: '**/*.{jpg,gif}',
>                    dest: '<%= paths.imgdist %>'
>                }]
>            }
>        },
>        // tinypng
>        tinypng: {
>            options: {
>                apiKey: "APIキー"
>            },
>            files: {
>                expand: true,
>                cwd: '<%= paths.img %>',
>                src: '**/*.png',
>                dest: '<%= paths.imgdist %>'
>            }
>        },
>        // watch
>        watch : {
>            img : {
>                files: ['<%= paths.img %>**/*.{png,jpg,gif}'],
>                tasks: ['imagemin', 'tinypng']
>            }
>        }
>    });
>    grunt.registerTask('default', ['watch', 'imagemin', 'tinypng']);
>};
>```
https://github.com/gruntjs/grunt-contrib-imagemin

###2-1-4.実行する
Gruntを実行してください。
これで、「images」ディレクトリのファイルが更新されるたび、
「dist/images」ディレクトリに最適化された画像が入ります。

>```cmd
>grunt
>```
constructorプロパティを使ってみる

constructorプロパティについては以下のページが分かりやすかったです。
[Object.prototype.constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor)

###実際に使ってみる
constructorプロパティについてなんとなく理解したところで、[前回](http://qiita.com/kanamin/items/63b9fcd705e680372dfb)の宿題を解いてみる。

**宿題**

```js:js
sum(1,2,3,4,5,"test",[],10,"xxx",false,3,true);
```
みたいに文字列、配列、真偽値などが入ったときに、
数字は足して、真偽値のときは×2する
のをconstructorプロパティを使ってなんとかする（result:106になったら正解）
<br>

**解答**

```js:js
var sum = function(){
  var total = 0;
  for (var i=0 ; i<arguments.length ; i++){

    if(arguments[i].constructor == Number){
      total += arguments[i];
      
    }else if(arguments[i].constructor == Boolean){
      total *= 2;
    }

  }
  return total;
}

var result = sum(1,2,3,4,5,"test",[],10,"xxx",false,3,true);

console.log("result: " + result);  //result:106
```
前回コメントいただいた、nullチェックやtypeofを使ってなんとかするのを今度やってみます
<br>

###ユーザ定義のコンストラクタ関数でも同様に動作する

```js:js
function aClass () {}
var aInstance = new aClass();
aInstance.constructor === aClass //true
aInstance.constructor // function aClass () {}
```

<br>
###次回までの宿題
(e)の使い方がよくわからなかったので、理解を深めるために以下の問題に挑戦です。
 ↓を実行してクリックした対象のconstructorがHTMLDivElementのときにconsole.log("success");を実行する

```js:js
document.body.addEventListener("click", function (e) {
  // -- 解答ここから  

  // -- ここまで
  e.preventDefault();
  e.returnValue = true;
});
```
Chatwork で長いメッセージを折りたたむハック

メールなどを Chatwork に自動転送とかしてると、長いメールを折りたたんで一覧したくなってきた

結論としては、以下のようにすれば実現できた

```
[task aid=000000 st=done lt=0000000000]
なが～いメッセージ…
…
[/task]
```

これはタスクの完了時のフォーマットを利用している
`aid`はおそらくユーザーIDで、`lt`はタスクの期限っぽい
`st`は`done`か`open`の2値を取り、`done`のとき折りたたまれて表示される
`aid`に顔アイコンの`data-aid`属性を指定すると下部にアイコンが表示される
Redmine / Jenkinsを80番ポートで接続するためのhtaccess設定

#１台のマシンで複数のアプリを建てたい

Redmineとジェンキンスとでの自動化を行いつつ、仮環境を構築したい！
そのための方法をメモしておきます。

環境：Ubuntu on AWS



### mod_proxy

mod_proxyという外部から特定のフロー（サブドメイン）で来たアクセスを内部では別のポートに流す機能です。この設定は、下記コマンドで一発で出来るようで簡単ですね！

>$ sudo a2enmod proxy_http

その後は、httpd.confの設定です。


### confファイルの編集

/etc/apache2/sites-available
/etc/apache2/sites-enabled

Apacheが読み込む.confファイルの中に下記の内容を入れます。
※enabledの方はシンボリックリンクを貼っておく作法との事です。
jenkinsは8080ポート、redmineは8081ポートに設定をしています。

--

 #jenkins
<VirtualHost *:80>
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName jenkins.domain.com
  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/
</VirtualHost>

--

 #redmine
<VirtualHost *:80>
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName redmine.domain.com 
  ProxyPass / http://localhost:8081/
  ProxyPassReverse / http://localhost:8081/
</VirtualHost>

###再起動する

再機能コマンドもイロイロありますね。

>$ sudo /etc/init.d/apache2 reload


これで各サービスにアクセスする際の方法がスマートになりましたー
http://jenkins.domain.com/
http://redmine.domain.com/

書くクセをつけるためにちょっと頑張りますー

##参考

Ubuntuでmod_proxyを設定する方法
http://kumagonjp2.blog.fc2.com/blog-entry-54.html
gulp watchでCPU使用率100超


##gulp watchでCPU使用率100超

`browser-sync`を使ってLiveReloadをしていたところ、`node`プロセスのCPU使用率が異常に高く(100%超)なっていた。

※topで確認したところ

![top.jpg](https://qiita-image-store.s3.amazonaws.com/0/15980/f9923865-4df8-b3bb-a010-1820d813d5e4.jpeg "top.jpg")


最初は`browser-sync`の問題？と思ったけど、よくよく見るとCPUを使っている犯人は`watch`の方でした。
なんてことはない、`watch`の対象範囲が拡すぎるだけで、それはそうだよな、という話。

+ 修正前

```gulpfile.js
gulp.task('default', ['browser-sync'], function() {
    gulp.watch(["./**/*"], ['bs-reload']);
});
```

のようにgulpfileの設定でwatch対象がルート以下全ファイルに。。
htmlもcssもjsも全て監視するのだからと、安易に全対象にしてしまうと、watchがきつくなります。（当然）

+ 修正後

```gulpfile.js
gulp.task('default', ['browser-sync'], function() {
    gulp.watch(["./**/*.html", "./**/*.css", "./**/*.js"], ['bs-reload']);
});
```

##watch interval
この問題で解決策探っていた時に見つけた情報ですが、`gulp.watch`のオプションに`interval`
というオプションがあり、対象ファイルが多いときはこのintervalを指定することでCPU負荷を下げられるとのこと。

+ intervalオプション


```gulpfile.js
gulp.task('default', ['browser-sync'], function() {
    gulp.watch(["./**/*.html", "./**/*.css", "./**/*.js"], {interval: 500} ,['bs-reload']);
});
```

[constant CPU usage on watch #634　(GitHub)](https://github.com/gulpjs/gulp/issues/634)

+ 監視対象を限定していても対象ファイルが多い
+ マシンのスペックが低い

などの場合はこの`interval`オプションを使うことでCPU使用量を抑えられそうです。
500ms程度のインターバルなら使用感はあまり変わらないのでCPU消費が気になるならデフォルトで指定していてもよいかもしれません。

問題から少し外れますが、gulpのwatch自体CPU消費が大きい点は問題として認識されているようで、現在対応中とのことのよう。

>I'm merging all file watching related issues into one issue, since there is one solution. The next version of gaze is under development and we are waiting for it to come out before we can fix the following issues:

>+ high cpu usage
+ doesnt catch new files
+ globs get matched even though it was a file change that shouldn't match it
+ new files arent watched
stops on error (unrelated to gaze, but fixed already in gulp 4)


[file watcher has problems #651 (GitHub)](https://github.com/gulpjs/gulp/issues/651)
curlでファイルアップロードする方法と注意点


以下のように`-F`オプションを使った上(ファイルのところだけでなく、全パラメータ`-F`)、 `@/path..`でファイル指定するだけ。ラクラク。curl++

```
curl -X PUT http://hoge.com/path -F hoge=fuga -F foo=bar -F "file=@/path/to/file.ext;type=image/jpg"
```

ただし、以下を注意。

- `-d`と`-F`を混在させない。混在すると`Warning: You can only select one HTTP request!` という謎エラーになる。
- `-F`のときは `-d`みたいに`"hoge=fuga&foo=bar"`とは書けない。おとなしくパラメータ一個ずつ書く。
- content-typeを指定する。指定しないと `application/octet-stream` になる。そのときは""でくくるのを忘れずに。
Ruby でOAuth認証のあれこれ with Twitter

環境：Windows7(64), ruby2.1


色々サイトと見たんだが、dev.twitter.comのUIが変わったらしく、
今作業している画面とちょっと違っていたり、項目名が変わっていてよく分からなかったのでメモ。

- まず最初に

https://dev.twitter.com/
ログイン後、右上のアイコンをクリックすると

・My subscriptions
・My applications
・Sign out

の３つがあるが真ん中の
・My applications
をクリック。


- アプリ登録

Create New App というボタンがあるのでぽちっとな。
それからいろんな入力項目が出てくるがここは適当(後で変更できる)。
サイト、面倒だったから自分のtwitterのURLにしてしまったぜ。


- アプリ登録準備

登録後にアプリのリンクをクリックすると、
・Details(activeのタブ)
・Settings
・API Keys
・Permissions

のタブがあるページが開く。

ここで一旦
Permissions
のタブをクリックして
Permissionを　Read から Read and Write に変更しておく。


- 認証開始

API Keysのタブを開くをAPI keyとAPI secretに文字列があるのが見える。
サイトみたらConsumer Keyがどうたらってあったけど、どこにもないじゃん。。。って思ってたら
このAPI key が Consumer Keyのことなんですって。
うーん。

ここで発行するために　irb でやろうとしたらNet::HTTPRetriableErrorが出てうまく行かない。HTTP ステータスコード 3xx って何をどうしたらいいのかちょっと分からず調べていたら、URLの指定先が間違っていたもよう。
× :site => "http://twitter.com"
○ :site=>"https://api.twitter.com"

↑twitterのdevelperサイトと書いてあるブログもあったので何が正しいか分からんかった。
とりあえずいろいろ試したらうまくいった。

key発行：
>
require 'oauth'
require 'oauth/consumer'
@consumer=OAuth::Consumer.new( 'CONSUMER_KEY','CONSUMER_SECRET', {
    :site=>"https://api.twitter.com"
    })



- PIN発行


ここで
>
@request_token=@consumer.get_request_token
@request_token.authorize_url

とたたく。

するとURLが出てくる。

>
[7] pry(main)> @request_token.authorize_url
=> "https://api.twitter.com/oauth/authorize?oauth_token=hogehogehogehoge"

これをブラウザに張り付けてたたくと、今作ったbotが認証を求めている、と言われるのでOKを押下するとPINが発行される。

この数値をメモ。


- access_token GET

PINを下記のコードに張り付けるとaccess_token が表示される。
これでOK。

>
@access_token = @request_token.get_access_token(:oauth_verifier => 'PINの番号')
puts @access_token.token
puts @access_token.secret
簡単なタスク管理にGistを使うと

GitHub のGistのMarkdown、メモに便利なのは周知の通りなのだが、

* チェックボックス記法が使える
* チェックボックス、チェックを入れたこともRevisionに入って記録される

と言う特徴があるので、項目に締め切り日時などを入れとくと予実管理にもなる。

https://gist.github.com/udzura/04e43374d57625a63f7d/revisions

こんな感じ。チェック日時が分かる（上の「3 minutes ago」にマウスオーバーでタイムスタンプが見えるのですよ）。

![スクリーンショット 2014-11-28 14.03.35.png](https://qiita-image-store.s3.amazonaws.com/0/569/ee371f46-6809-73a8-23e4-9c93ef1281de.png)
PhoneGap Androidアプリ mp3オーディオ再生

##概要
PhoneGap で Android アプリを書き出すと、ローカルにある音声ファイルを audio タグで再生できません。
PhoneGap 標準の Media プラグインを使う必要があります。

##プラグインのインストール
アプリのプロジェクトに Media プラグインを追加します。
PowerShellから以下のコマンドで追加できます。

```
phonegap plugin add org.apache.cordova.media
```

##コード
JavaScriptで鳴らします。

```html:html
<button onclick="audioplay()">AUDIO PLAY</button>
```

```js:js
//絶対パスの取得
function getPath(){
	var str = location.pathname;
	var i = str.lastIndexOf('/');
	return str.substring(0,i+1);
}

//音声再生
function audioplay(){
	var path = getPath()+"sound.mp3";
	var media = new Media (path);
	media.play();
}
```

以上。
audioタグで動作させたいのですが、そちらは、まだ未解決。
Vimiumで快適なコピペ生活(Title/URL)

## 内容
現在見ているページのTitle/URLをクリップボードに保存するための方法です。

## やり方
### ブックマークレットを登録
`copy_markdown` という名前でブックマークを登録します。

```
javascript:(function(){prompt('Copy to Clipboard','['+document.title.replace(/([\[\]])/g,'\\$1')+']'+'('+location.href+')');})();
```

### Chrome拡張のVimiumを使って呼び出す
[Vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)という便利なChrome拡張があります。
普段のブラウジングをvimライクにすることが出来て、その中で
```
b	:	Open a bookmark
B	:	Open a bookmark in a new tab
```
というのがあるので b(またはB)を押すことでBookmarkを呼び出すことで出来ます。

![copy_markdown.png](https://qiita-image-store.s3.amazonaws.com/0/15209/7c50b1eb-fca6-9f9d-bffd-aadd8f1595db.png)

Keyboardだけで作業が完結するので
作業報告する際は重宝しますね! :sunny: 
![markdown_report.png](https://qiita-image-store.s3.amazonaws.com/0/15209/be9cff40-8496-ca4f-da7d-4365ad92b18e.png)
.ssh/configをファイル分割管理するようにした

他の投稿をちらほら見かけますが、自分もやってみた。

```bash:~/.bashrc
sshconfig() {
        mv ~/.ssh/config{,.bak}
        cat ~/.ssh/conf.d/*.conf > ~/.ssh/config
}
```

```bash:
sshconfig
```

と打てば.ssh/configが.ssh/conf.d/*.confを結合し生成します。

## 使用例

この際、ファイル名を連番にすることで結合の順番を決められます。

* ~/.ssh/conf.d/01-config.conf
* ~/.ssh/conf.d/02-service1.conf
* ~/.ssh/conf.d/03-office.conf
* ~/.ssh/conf.d/04-home.conf
* ~/.ssh/conf.d/05-global2.conf

というファイルがある場合、上から順番に結合されます。
Holo テーマのアプリを Material テーマのアプリにするまで

3.x 以前を綺麗に忘れ去って、4.x 以降に対応するアプリを作っている場合、support.v7.appcompat の存在を気にかけないでも普通に ActionBar が使えるので、かなり楽ができるのですが、ここへ来てマテリアルデザインが登場し、それ用に support.v7.appcompat もアップデートされ、マテリアルデザインに対応するには support.v7.appcompat の使用が必須要件になったので、そのあたりの備忘録として書き残しておきます。

## テーマを、Theme.AppCompat のものにする

Lollipop だけマテリアルデザインで古いやつは Holo でいいんじゃね？という道を選択するならば、もはやここに書いてあることはほぼすべてやらなくても良いことになります（ただし、ActionBarDrawerToggle だけは、v4 版と v7 版を、Lollipop 以前と以後で使い分ける処理を各必要がある）。

テーマを変える話は、Gingerbread までの頃から IceCreamSandwich 以降へ対応するため、android.support.v7.appcompat ライブラリが登場した時にしたことと同じですね。懐かしいですね。

## すべての Activity の親を android.support.v7.app.ActionBarActivity にする

うっかり FragmentActivity のままにしても動かないことはないですが、ActionBar が無かったことになったりします。すべて ActionBarActivity にしましょう。

そうすると、PreferencesActivity が困ったことになります。未だに公式の support library に入ってこないため使えません。有志で PreferenceFragment をバックポートしている人がいるので、それを代わりに使用し、PreferencesActivity は ActionBarActivity として Fragment で Preferences を管理する方法があります。

https://github.com/kolavar/android-support-v4-preferencefragment

v4 なんて知らねーぜ！な場合は普通に PreferenceFragment を使えば良いと思います。

もちろん、いままで Activity#getActionBar() していたものはすべて ActionBarActivity#getSupportActionBar() にする必要があります。でないとクラッシュします。

## MenuItem の showAsAction のネームスペースを変える

標準のネームスペースが使えて欲しいですが、使えないのでカスタムアトリビュートのものにします。

## ActionBarDrawerToggle を android.support.v7.app のものに変える

ネームスペースを v4 から v7 に変えます。また、コンストラクタが変わっていて、drawer 用に三本線のハンバーガーアイコンのリソースを指定しなくてもよくなったので、これを消します。

ちなみに、最新の v4 では TargetSDK を 21 にして、Lollipop 上で動かすと、三本線のハンバーガーアイコンはアニメーションしないようになっています。
さらに、v7 のものを使用しながら Kitkat 以前で Holo テーマを使うようにしていると、ハンバーガーアイコンだけがマテリアルデザインのものになり、アニメーションもマテリアルデザイン化されます。完全に余談ですし多分誰もやらないと思いますが…

## 結論

はじめから v7 の appcompat を使えば話は早かった
【15秒で説明】オブジェクト指向

# あいさつ
「オブジェクト指向て何？」という質問はオブジェクト指向を知らない人間からしたら至極当然の質問で、僕たちは誤解のない範疇で理解に足るだけの情報を短く簡潔に「ホワッ」とでもかまわないので伝える必要があると思うんですよね.
（ググれカスとは言わずに）

様々なコンテキスト（文脈）を含んだ技術用語をサクッとホワッとまとめたいっていうアレ

15秒ていうのは何気ない会話の中で「オブジェクト指向て何？」て聞かれ答える時に与えられ得る時間と想定した.

# オブジェクト指向

（説明開始）

## さっそく白旗 (0秒経過)
15秒でオブジェクト指向の何たるかを説明するのは僕に無理です.

それくらい色々な文脈を含む複雑で便利な言葉なんだよというのはまず心に留めて頂きたく.

## プログラミング言語をカテゴリ分けする言葉 (3秒経過)
プログラミング言語は掃いて捨てるほどあるので、カテゴリ分けをしたくなるのが人間の常です.

## モノ感 (5秒経過)
オブジェクトというのだから「モノ」がすごく大事で、
ここでいう「モノ」はこの言葉から皆さんがごく普通に連想される「モノ」として差し支えありません.

## モノは状態持つし何かふるまう (8秒経過)
「モノ」は状態を持ちますよね. あるモノは赤いかもしれないし、タイヤが６個くらいついてるかもしれないし、放水ポンプを搭載しているかもしれない.（これを消防車と我々は呼ぶのかもしれない）

何かしらの方法でモノを作ります（それは車という型からつくるのかもしれない）

この（消防車と一般的に呼ばれる）モノが別のモノ（僕たちが火と呼ぶモノ）に対して放水という行為をすれば火と呼ばれるモノは恐らく消えたという状態に変化するものとします.
（これがプログラムをするという行為にあたる）

現実世界で火事が起きて消防車が火を消してくれたら嬉しいですよね.

そんな感じ.

(15秒経過)

# 感想
15秒じゃ全然無理やな.

15秒で説明シリーズは個人的になんかはまってるので続けていきます.
MySQLのdump作成・データ投入コマンド

すぐ忘れるので書いておく。。

◆Databaseをdumpする
```mysqldump -u [ユーザー名] -p [DB名] > `date +%Y%m%d_Database.sql`
```※「date +%Y%m%d」
→日付の文字列。上の例だと"20141128_Database.sql"というようなファイル名になる

◆一部tableだけ除外する
```mysqldump -u [ユーザー名] -p --ignore-table=[DB名].[テーブル名] Database > `date +%Y%m%d_Database.sql`
```

◆tableをdumpする
```mysqldump -u [ユーザー名] -p [DB名] [テーブル名] > `date +%Y%m%d_Table.sql`
```※テーブルは複数指定できる

◆dumpからデータ投入
```mysql -u [ユーザー名] -p --default-character-set=utf8 [DB名] < 20141128_Database.sql
```
◆tableのdumpからデータ投入
```mysql -u [ユーザー名] -p --default-character-set=utf8 [DB名] [テーブル名] < 20141128_Table.sql
```※「--default-character-set=utf8」
→デフォルトの文字コードを指定。何も指定しないとutf8らしい。
[iOS] Change the constraints value when use the auto layout

When you use the auto layout, you will set some constraints  to some view. Also maybe you want to change the value in the code. Just do this:

First drag the constraint you want to change to the code area to generate a constraint property. 

![Screen Shot 2014-11-28 at 12.03.52.png](https://qiita-image-store.s3.amazonaws.com/0/51455/c73b6773-a854-0f60-e19b-b65d18cae316.png)

Then do something like this:

```swift
//change the value of the constraint
bottomMarginConstraint.constant = 10
self.view.layoutIfNeeded()
```
【古い情報です】 pull は本当に fetch + merge なの？

__※ 【追記】もうだいぶ古い情報です。__

Git の pull は fetch + merge と同じというのをよく目にしますが、自分の中では違う気がしていて混乱しているので整理してみます。
認識が誤っている点などがございましたら、ご指摘いただければ幸いです。

# 3種類のブランチ

この記事では Git の 3 種類のブランチを以下のように表現します。

* リモートブランチ
* トラッキングブランチ
* ローカルブランチ

## リモートブランチ

リモートのリポジトリで定義されているブランチのことを指します。

## トラッキングブランチ

リモートブランチを追跡するローカルリポジトリで定義されているブランチを指します。

## ローカルブランチ

ブランチを切ったり、コミットなどをしていく実際に作業をするローカルリポジトリで定義されているブランチを指します。
これらを図にすると以下のような感じです。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/10443/9e55ad08-92ef-6d5f-455b-4a4837519aeb.png)

# fetch + merge の挙動

git fetch はリモートブランチの内容を取得し、トラッキングブランチに反映します。
```git fetch origin```を実施した場合は以下の図のようになります。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/10443/9d2aedf1-45b9-4bd8-bb02-fb4f5a8f8159.png)

git merge でトラッキングブランチをローカルブランチに反映します。
```git merge origin/master```を実施した場合は以下の図のようになります。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/10443/4a746e39-bd69-ca9a-a75c-6dd4e0849320.png)

このように fetch + merge をすると、トラッキングブランチを経由してリモートブランチの内容をローカルブランチに反映させることができます。

# pull の挙動

git pull はリモートブランチの内容を直接ローカルブランチに反映します。
```git pull origin master```を実施した場合は以下の図のようになります。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/10443/22a46320-87f7-fc70-05cc-d413fbf6a31a.png)

前述した fetch + merge とは異なり、pull の場合はトラッキングブランチにはリモートブランチの内容が反映されていません。
ですので、pull は fetch + merge と同じであると表現するのは違う気がしています。

# 追記 (2014/11/28)

上記の調査で動作確認したのは```git pull origin <ブランチ名>```だけだったのですが、```git pull origin```だとトラッキングブランチにもリモートの内容が反映されます。

なので、```git pull origin```は fetch + merge と同じ挙動であるという表現は誤っていないと思います。

このように自己解決しましたが、ログとして文章はこのまま残しておきます。

# 追記 (2019/11/13)

git version 2.12.0 では `git pull origin master` でも origin/master が更新されているという[コメント](https://qiita.com/Teloo/items/95a860ae276b49edb040#comment-043f00cc320e02b2ed2e)をいただきました。

現状は pull の挙動についてはこの記事の情報は参考になりませんが、3種類のブランチがあることの理解になれば幸いです。
Androidのoptions menuまわりのtips


- ActionBarメニューの表示/非表示を切り替える
- Fragmentにメニューを表示させる

# ActionBarメニューの表示/非表示を切り替える

## 概要

`ActionBarActivity`なActivityのActionBarにあるメニュー(options menu)について、

```java
MenuItem item = menu.findItem(R.id.menu_id);
item.setVisible(false);
```

をしても消えてくれなかったoptions menuを何とかして消す

## やり方

```java:Activity
// 初期状態ではmenuを表示させる
private boolean menuVisible = true;
private MenuItem menuToggleVisible;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_activity, menu);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    menuToggleVisible = menu.findItem(R.id.menu_toggle_visible);
    menuToggleVisible.setVisible(menuVisible);
    return true;
}

private void toggleMenuVisible() {
    menuVisible != menuVisible;
    invalidateOptionsMenu();
}
```

このように`onPrepareOptionsMenu`の中で`setVisible`を呼び出せるようにしておく
そして、`invalidateOptionsMenu()`によって内部で`onPrepareOptionsMenu`がcallされ、
menuの表示/非表示が切り替えられる

## 参考
- [Menus | Android Developers](http://developer.android.com/guide/topics/ui/menus.html#ChangingTheMenu)
- [Adding ActionBar Items From Within Your Fragments | Grokking Android](https://www.grokkingandroid.com/adding-action-items-from-within-fragments/)

# Fragmentにメニューを表示させる

Activityの上に乗せたFragmentごとにmenuを表示させたい

## やり方

```java:Fragment
private MenuItem menuItem;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    // ...
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
    super.onCreateOptionsMenu(menu, menuInflater);
    // menu.add(groupId, itemId, order, title);
    menuItem = menu.add(Menu.NONE, 0, 100, getString(R.string.menu_item));
    menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
```

まず`onCreate`で`setHasOptionsMenu(true)`をcallしておく
そして、`onCreateOptionsMenu`でoptions menuを作成する
ここではJavaだけでmenuを作成している

## 参考

- [Fragment | Android Developers](http://developer.android.com/reference/android/app/Fragment.html#onCreateOptionsMenu(android.view.Menu,%20android.view.MenuInflater))
- [HasOptionMenu](http://y-anz-m.blogspot.jp/2011/05/androidfragment_19.html)
【iPhone6対応】XcodeのAutolayoutサイズクラスについて


まずサイズの変更AnyAnyからストーリーボードでAutolayout作成






その後、例えばiPhone6で横画面の時だけ、Viewの位置を変えたい場合は



・まず、Constaintsのすべてを選択した状態にすると、右にプラスの標識がでるそこをクリック
・wRhC【RegularWide　CompactHeight】を選択
・その後AnyAnyである一番上のチェックを外し、wRhCのAutolayoutを作成する



するとiPhone6の横画面の時だけ、レイアウトが変更する



同じ要領で色んなサイズに対応したレイアウトを追加していく下の画像がその表

![table-01.png](https://qiita-image-store.s3.amazonaws.com/0/36362/9f411339-1343-d198-dafe-eb2114011a38.png)
OpenStackインスタンスコンソールに接続エラー

>「DNSサーバが見つかりません」

といったエラーが出ているときは、ブラウザを開いているホストからnoVNC Proxyへの接続に失敗している時がある。

computeノードとcontrollerノード（nova-novncproxy）とで分かれている時のcomputeのnova.confが以下のようにホスト名で設定している際、ブラウザを開いているホストで名前解決出来ない場合は上記のエラーになるので、IPアドレスで設定すればよい。

```text:nova.conf
(変更前)
novncproxy_base_url = http://controller:6080/vnc_auto.html
(変更後例)
novncproxy_base_url = http://192.168.1.1:6080/vnc_auto.html
```
MacでコマンドラインからVPN接続


仕事上VPN接続をすることが多く、その度にマウスなりトラックパッドでメニューバーから選択するのが億劫だったのでコマンドラインからVPN接続できないかずっと探していましたが、なかなか無かった。
（VPN接続->サーバ作業が多いので、ターミナル操作してることが多い）

下記のように`networksetup` コマンドを使う方法が見つかりましたが接続はできても切断がなぜかできない。

```
$ networksetup -connectpppoeservice [VPNサービス名]
```

```
$ networksetup -disconnectpppoeservice [VPNサービス名]
```

>[コマンドラインからの VPN 接続](http://qiita.com/imos/items/ff3e475b9ae70411ffbd)


それでまた諦めていましたが、VPN接続をする機会がある度にやっぱり気になってさらに探してみた結果行き着いた答えが下記に。

[http://superuser.com/questions/358513/start-configured-vpn-from-command-line-osx](http://superuser.com/questions/358513/start-configured-vpn-from-command-line-osx)

`scutil`というコマンドを使うらしいです。

* 接続

```
$ scutil --nc start Foo
```

* 切断

```
$ scutil --nc stop Foo
```

これでエイリスを設定しておくとターミナル操作しながらコマンドラインからさくっとつなげます。

```shell:.zshrc
alias vc='scutil --nc start'
alias vd='scutil --nc stop'
```

* 接続

```
$ vc [VPNサービス名]
```

* 切断

```
$ vd [VPNサービス名]
```
再帰をfoldrで書き換えて確認

[Haskellの実験メモ](http://qiita.com/7shi/items/b6cbb7df2dd969c84f49)です。

再帰を`foldr`で書き換えた実装が同じ動きをするかどうか、ランダムデータで確認しました。

自前で乱数生成せずにQuickCheckを使うべき、というかそもそも定理証明支援系を使うべきなんでしょうけど。

```hs
import System.Random
import Control.Monad

shuffle [] = return []
shuffle xs = do
    n <- getStdRandom $ randomR (0, length xs - 1) :: IO Int
    xs' <- shuffle $ take n xs ++ drop (n + 1) xs
    return $ (xs !! n) : xs'

bswap [x] = [x]
bswap (x:xs)
    | x > y     = y:x:ys
    | otherwise = x:y:ys
    where
        (y:ys) = bswap xs

bswap' = foldr (\x xs -> case xs of
    [] -> [x]
    (y:ys) | x > y     -> y:x:ys
           | otherwise -> x:y:ys) []

main = do
    a <- forM [1..1000] $ \_ -> do
        len <- getStdRandom $ randomR (5, 200) :: IO Int
        xs <- shuffle [1..len]
        let a  = bswap  xs
            a' = bswap' xs
        --print (a == a', xs, a, a')
        return $ if a == a' then 1 else 0
    let ok = sum a
        ng = length a - ok
    putStrLn $ "OK: " ++ show ok ++ ", NG: " ++ show ng
```
```text:実行結果
OK: 1000, NG: 0
```
MacOS X の Yosemite (10.10) で Sites ディレクトリを使って localhost をアカウント別に利用する方法

Yosemiteの場合はMavericksのときと状況が少し変わっています。
Apacheのバージョンも違い、設定内容も幾つか違うのでご注意を。

```apache
$ apachectl -v
Server version: Apache/2.4.9 (Unix)
Server built:   Sep  9 2014 14:48:20
```

以前は2.2系だったような。


なおMavericksの場合はこちら↓
[MacOS X の Mavericks (10.9) で Sites ディレクトリを使って localhost をアカウント別に利用する方法](http://qiita.com/tsumekoara/items/d4e25eedfc22900b5487)

MacOSはMavericksやYosemiteだとWeb共有が環境設定に表示されなくなったり、 Sites ディレクトリがなくなったりします。

![Screen Shot 2014-04-24 at 12.07.35.png](https://qiita-image-store.s3.amazonaws.com/0/18705/3e2183a7-d256-3e38-e841-abb2e3b193d8.png)


localhostを使って開発したいときは、とりあえず、ターミナルから apache を立ち上げたら大丈夫です。

```shell-session
$ sudo apachectl start
```

### 問題点

Apacheを起動すると、http://localhost/をブラウザで開けるようになる。
http://localhost/ で閲覧できる中身は /Library/WebServer/Documents/ に配置されています。
でも、このディレクトリのownerはrootになっているので、なにかと使い勝手が悪い。
複数ユーザが一つのPCを使っているときには、confの影響が他のユーザに及ぶのも好ましくない。
できれば ユーザーディレクトリのSitesを使いたい。

## アカウント別に設定する

**個々のユーザー毎にSitesディレクトリを作って、設定ファイルをを作成し、apacheに反映させて、 http://localhost/~USERNAME/ で、~/Sites/ 以下のファイルを閲覧できるようにします。**

### ユーザーディレクトリを有効にする

/etc/apache2/httpd.conf の以下の行のコメントアウトを外します。先頭に#が入っていると思うので、その#を削除します。

```rb
$ sudo vi /etc/apache2/httpd.conf
```

```html+myghty
# 以下の4行のコメントアウトを外します。すでに外れているものもあるかもしれません。
LoadModule userdir_module libexec/apache2/mod_userdir.so
LoadModule authz_core_module libexec/apache2/mod_authz_core.so
LoadModule authz_host_module libexec/apache2/mod_authz_host.so

# User home directories
Include /private/etc/apache2/extra/httpd-userdir.conf
```

### ユーザーごとの設定ファイルを読み込む様に設定

Includeの行のコメントアウトを外します。

```rb
$ sudo vi /etc/apache2/extra/httpd-userdir.conf
---
Include /private/etc/apache2/users/*.conf
<IfModule bonjour_module>
       RegisterUserSite customized-users
</IfModule>
```

### ユーザー名の確認

```rb
$ whoami
```

このコマンドで表示されるはずです。


### ユーザーごとの設定ファイルを作成

```rb
Order allow,deny
Allow from all
 ↓　↓　↓
Require all granted
```

```shell-session
$ sudo vim /etc/apache2/users/username.conf
```

```apache
<Directory "/Users/username/Sites/">
    AllowOverride All
    Options Indexes FollowSymLinks Multiviews
    Require all granted
</Directory>
```

### ユーザー毎のSitesディレクトリを作成してapacheを再起動

```shell-session
$ mkdir ~/Sites
$ sudo apachectl configtest
$ sudo apachectl restart
```

この流れで大丈夫だと思います。
以下にアクセスしたら、表示されるはず。

![Screen Shot 2014-04-24 at 12.06.36.png](https://qiita-image-store.s3.amazonaws.com/0/18705/7443218e-a446-8e4f-c9cf-740fb28684c2.png)


```http
http://localhost/~username
```

あとは、Sites/ 以下にファイルを置いていって、そのURLにアクセスすれば見れるはずです。



## References

- [Forbidden permissionの問題について](http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/)
- [Sitesディレクトリの設定について](http://nantekottai.com/2014/10/26/os-x-10-10-sites/)
【HTTP】Webサーバでiframeを使用できない・表示できない時【サーバ】

Movabletypeで画像アップロードなどをする際モーダルが表示されるんですけど、
そのモーダルが開いた後ローディング画像が表示され・・・その後真っ白！っていう現象が起きました。

##原因は？

そもそもなんで表示されないかっていう部分、最初は500エラーでも出ちゃってるのかと思いましたがエラーログは綺麗なまま。
よくよく見てみるとiframeの読み込もうとはしてる、が、その先が空！
ChromeとFirefoxでは真っ白でしたがIEで見ると「このコンテンツはフレーム内では表示できません」と。。
つまり、IframeでのWebサイト読み込みができない！

##対処方法

どうも調べてみるとX-Frame-Optionsっていう項目がDenyに設定されているのが原因でした。（こんな設定あるの知らなかったYO）
というわけで、こいつをそもそも記述しなければいい、もしくは記述したとしてもDeny（全面禁止）からSAMEORIGIN（同じサイト内のページなら許可）ってすればOK。
http.confに記述してもよし、.htaccessでもいいっぽい。

```
Header always append X-Frame-Options SAMEORIGIN
```


MT本体のファイル欠損か？とか設定か？とかプラグインか？ってアレコレ調べてまくってみたらもう。。
てかよくみたらChromeとかFFのJSエラーで書いてましたね。。しょぼん。。
cocos2d-x 3.3 rc0 で OpenGL error 0x0506

### 開発環境
iOS向けビルド
Xcode 6.1
cocos2d-x 3.3 rc0

### エラー内容
cocos2d-xのOpenGLからUIKitのViewControllerに遷移し、再度Cocos2d-xに戻った際に発生。(広告動画再生など)
その後、アプリがフリーズしたようになる。
実際にはログに下記のOpenGL errorが吐かれ続ける。

```
cocos2d: OpenGL error 0x0506 in /Users/unkodaisuki/lib/cocos2d-x-3.3rc0/projects/MyApp/cocos2d/cocos/renderer/CCTextureAtlas.cpp drawNumberOfQuads 689

OpenGL error 0x0506 in -[CCEAGLView swapBuffers] 324
```

エラーコード 0x0506 は[OpenGLのエラーコードリファレンス](https://www.opengl.org/wiki/OpenGL_Error, "OpenGL_Error")を見ると下記のように書いてある。

```
GL_INVALID_FRAMEBUFFER_OPERATION​, 0x0506
Given when doing anything that would attempt to read from or write/render to a framebuffer that is not complete.
```

### 対処法
下記を追加。
これまでは、特にこの記述がなくても問題なく動作していた。
考えられる契機としては、cocos2d-xのバージョンアップか、Xcodeのバージョンアップ。

```objc:RootViewController.mm

-(void)viewWillAppear:(BOOL)animated
{
    cocos2d::Director::getInstance()->resume();
    cocos2d::Director::getInstance()->startAnimation();
}

- (void)viewWillDisappear:(BOOL)animated
{
    cocos2d::Director::getInstance()->pause();
    cocos2d::Director::getInstance()->stopAnimation();
}

```
Nginx + Tomcatのリバースプロキシでのリダイレクト対応

※ 同タイトルの記事を削除してしまったので、再作成しました。

## 事象
表題の通りのことをやってたら、Tomcat上のアプリケーションで発生したSSLページへのリダイレクトがうまくいかなかったため、
その時に対応したことのメモ書きです。

環境は以下の通りです。
Nginx : ver.1.6.2
Tomcat : ver.7.0.54
OS : CentOS 6.5

## 事象発生時の設定イメージ
こんな感じでした。

### Nginx側
```nginx.conf(IP,URLは適当に変えてあります）
　　 # HTTP用
    server {
        server_name 210.xxx.yyy.zz;
        listen 80;

        location /app/ {
            proxy_http_version 1.1;
            proxy_pass http://210.xxx.yyy.zz:8080/app/;
            proxy_redirect http://210. xxx.yyy.zz:8080/app/ /;
            proxy_cookie_path /app /;
        }
	}

　　 # HTTPS用
    server {
        server_name 210.xxx.yyy.zz;
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;

        location /app/ {
            proxy_http_version 1.1;
            proxy_pass http://210.xxx.yyy.zz:58080/app/;
            proxy_redirect http://210.xxx.yyy.zz:58080/app/ /;
            proxy_cookie_path /app /;
        }
	}
```

### Tomcat側

```server.xml(IP,URLは適当に変えてあります）
...中略
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               maxThreads="450"
               URIEncoding="UTF-8" />
    <Connector port="58080" protocol="HTTP/1.1"
               proxyPort="443" redirectPort="443"
               scheme="https"
               secure="true"
               connectionTimeout="20000"
               maxThreads="450"
               URIEncoding="UTF-8" />
...中略
```

この状態でTomcat上のアプリがSSLページヘのリダイレクトを発生させると、locationヘッダ上はHTTPとなってしまいました。

## 設定変更

Tomcat側で「X-Forwarded-Proto」によるプロトコル判定を有効化します。

### Tomcat側
```server.xml

...中略
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               maxThreads="450"
               URIEncoding="UTF-8" />
    <Connector port="58080" protocol="HTTP/1.1"
               proxyPort="443" redirectPort="443"
               scheme="https"
               secure="true"
               connectionTimeout="20000"
               maxThreads="450"
               URIEncoding="UTF-8" />
...中略
     <Valve className="org.apache.catalina.valves.RemoteIpValve"
           protocolHeader="x-forwarded-proto"/>

```

※ 参考にしたページでは「X-Forwarded-For」なども設定していましたが、リダイレクトの挙動には直接関係無さそうだったので省略しています。

### Nginx側
X-Forwarded-Protoを明示的に設定します。

```nginx.conf(IP,URLは適当に変えてあります）
　　 # HTTP用
    server {
        server_name 210.xxx.yyy.zz;
        listen 80;

        location /app/ {
            proxy_http_version 1.1;
            proxy_pass http://210.xxx.yyy.zz:8080/app/;
            proxy_redirect http://210. xxx.yyy.zz:8080/app/ /;
            proxy_cookie_path /app /;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
	}
```

これでHTTPSでのリダイレクトが動作することを確認しました。

## 参考ページ
以下を参考にさせていただきました。
ありがとうございました。

http://stackoverflow.com/questions/19916906/nginx-managed-ssl-with-tomcat-7
DockerHub公式RubyイメージでInvalid Byte Sequenceが出る場合の対処法

DockerHubの[公式Rubyイメージ](https://registry.hub.docker.com/u/dockerfile/ruby/)上で、UTF-8の文字列を読み込んだ場合、Invalid Byte Sequenceエラーが出る。外部エンコーディングがASCIIになっているからなのだが、```LANG```や```LC_ALL```に```en_US.UTF-8```をセットしても有効にならない。
```$ locale -a```で確認したところ、```C.UTF-8```のみUTF-8が有効になっていたので、```LANG```に```C.UTF-8```をセットしてやればよい。

```
$ LANG=C.UTF-8 ruby -e "p Encoding.default_external"
```
error description not available で Validation に通らない


# Validation に失敗する

iOS アプリを archive して validation を実施したところ、下記のようなエラーが発生しました。

![スクリーンショット 2014-11-27 22.08.42.png](https://qiita-image-store.s3.amazonaws.com/0/27210/0096ca51-4677-b423-0ab2-907e96cfc69c.png "スクリーンショット 2014-11-27 22.08.42.png")

# 時間を置いて再度 Validation を実施

apple のサーバー側でエラーが起きているようで、時間を置いて同じ archive を再度 validation すると通りました。

![スクリーンショット 2014-11-28 8.53.13.png](https://qiita-image-store.s3.amazonaws.com/0/27210/c8325a77-7d4c-d1ad-c9dc-347e2588f8ee.png "スクリーンショット 2014-11-28 8.53.13.png")

原因不明ですが同じエラーに遭遇された場合、時間を置いて再度試してみてください。
SwiftでSKActionTimingModeを設定する

```swift
let moveAction:SKAction = SKAction.moveTo(samplePosition,duration:moveDuration)
moveAction.timingMode = SKActionTimingMode.EaseInEaseOut
```
timingModeを設定したいSKActionがあったら、上のように記述すればできます。

「samplePosition」と「moveDuration」は例として書いただけなので、自分の好きな値を書いてもらえれば大丈夫です。



・参考
https://developer.apple.com/Library/ios/documentation/SpriteKit/Reference/SKAction_Ref/index.html#//apple_ref/c/tdef/SKActionTimingFunction
https://github.com/Thinkful-Ed/Llamas-in-Pajamas-Assignment/blob/master/Llamas%20in%20Pajamas/Lion.swift
gulp-csscombで任意のプロパティ記述順序を設定する

#設定ファイルの内容を定義
##整形方法
こちらのジェネレーターでファイルの整形方法を定義できます。

(例)カラーコードの表記方法(小文字 or 大文字)
\#aaa or \#AAA

http://csscomb.com/config

##プロパティ記述順序
これにはジェネレーターはないので、自分で定義することになります。以下を参考にしました。
・記述順序の参考
https://github.com/csscomb/csscomb.js/blob/master/config/csscomb.json
https://github.com/csscomb/csscomb.js/blob/master/config/yandex.json
https://github.com/csscomb/csscomb.js/blob/master/config/zen.json

#.csscomb.jsonを作成
gulpfile.jsと同じ階層、もしくはプロジェクトのルートフォルダに「.csscomb.json」を置けばできます。

・整形方法
ジェネレーターで適当に作成

・記述順序
sort-orderのところに自分の好きなプロパティ順序をどんどん書いていく形になります。ここではposition関係のものだけ書いてみました。

```json
.csscomb.json
{
    "remove-empty-rulesets": true,
    "always-semicolon": true,
    "color-case": "lower",
    "block-indent": "  ",
    "color-shorthand": false,
    "element-case": "upper",
    "eof-newline": true,
    "leading-zero": false,
    "quotes": "single",
    "sort-order-fallback": "abc",
    "space-before-colon": "",
    "space-after-colon": " ",
    "space-before-combinator": "",
    "space-after-combinator": " ",
    "space-between-declarations": " ",
    "space-before-opening-brace": "",
    "space-after-opening-brace": " ",
    "space-after-selector-delimiter": "",
    "space-before-selector-delimiter": " ",
    "space-before-closing-brace": " ",
    "strip-spaces": true,
    "tab-size": true,
    "unitless-zero": true,
    "vendor-prefix-align": true,
    "sort-order": [ [
        "position",
        "top",
        "right",
        "bottom",
        "left"
    ]]
}
```

#gulpfile.jsの書き方
```javascript:gulpfile.js
var gulp = require('gulp');
var csscomb = require('gulp-csscomb');

gulp.task('styles', function() {
  return gulp.src('src/styles/main.css')
    .pipe(csscomb())
    .pipe(gulp.dest('./build/css'));
});
```
特別な書き方はありません。普通にcsscombを実行するだけです。
・参考
http://increment-log.com/csscomb-setting/
d3.js で対数グラフを書くときに底を 10 以外にしたい

d3.js で対数グラフを書きたいときは、`d3.scale.log()` を使う。このとき対数の底は 10 である。

この底を変更したい場合は 3.1.0 から導入された `#base(n)` を使う。たとえば、底 2 のグラフを書きたい場合は以下になる。

```
d3.scale.log().base(2)
```
PhoneGap Androidアプリ html5 videoタグで動画再生

##概要
PhoneGap で Android アプリを書き出すと、ローカルにある動画ファイルを video タグで再生しようとしても、再生できません。
プラグイン等を使わず、video タグで再生させる方法です。

(ざっくりと文字だけ説明です。分かりづらければコメントいただければ改善します。)

##前提
video タグを使って html 単体であれば動画再生できる状態のソースがある前提です。

```lang:html
<video src="mymovie.mp4" controls></video>
```

##ファイルの移動
html ファイルと同じフォルダにある動画ファイル mymovie.mp4 を
platforms\android\res\raw
フォルダに移動します。

platforms\android フォルダがない場合は、一度 Android 用にビルドすれば生成されます。
platforms\android\res\raw フォルダは最初ないので、フォルダを作成します。

##コード書き換え
html を以下のように書き換えます。

```lang:html
<video src="android.resource://com.phonegap.helloworld/raw/mymovie" controls></video>
```

com.phonegap.helloworld 部分は、アプリIDです。

これで再生できました。

注：
・拡張子をつけないこと！
・raw フォルダに入れること！（勝手な名前つけない）
・ファイル名に使えるのは、小文字アルファベットと数字。
[ruby] 文字列から Integer や Float に変換できるか調べる

## 文字列から Integer や Float に変換できるか調べる
`to_i` や `to_f` だと無理やり変換して、`Kernel#Integer` 、`Kernel#Float` だと変換できないときに例外投げるんだよね

```rb
"5foo".to_i #=> 5
"foo5".to_i #=> 0

Integer "5foo" #~> invalid value for Integer(): "5foo" (ArgumentError)
```

文字列から Integer や float に変換できるか調べるためのメソッドをモンキーパッチ

```rb
class String
  def int_valid?
    Integer(self)
    true
  rescue ArgumentError
    false
  end
  
  def float_valid?
    Float(self)
    true
  rescue ArgumentError
    false
  end
end
```
windowsでSDLを使う

・開発環境
　　visual studio 2013

・使い方
　　1.SDLのHP( http://www.libsdl.org )からDevelopment Librariesのvc++のものをダウンロードします。

　　2.ダウンロードしたファイルを適当な場所に解凍してSDL.dllにパスを通します。

　　3.SDLのincludディレクトリの指定。visual studioを開きプロパティ/*のプロパティ/構成プロパティ/c/c++/全般/追加のインクルードディレクトリ/

　　4.ランタイムライブラリをマルチスレッドDLL(/MD)に変更します。c/c++/コード生成/ランタイムライブラリ/

　　5.libファイルの指定。リンカー/全般/追加のライブラリディレクトリ

　　6.追加の依存ファイルの指定。リンカー/入力/追加の依存ファイル/　"SDL.lib;SDLmain.lib"と入力


```c

#include <SDL.h>

int main(int argc, char* argv[]){
	SDL_Init(SDL_INIT_EVERYTHING);

	SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);

	SDL_Delay(3000);

	SDL_Quit();

	return 0;
}


```
上記のコードが正常に実行できれば完了。
openFrameworksでジェネラティブ系の静止画像を描画する

openFrameworksでフレームごとにランダムな値をつかって描画するプログラムを書くと、静止画を作れなくて困ります。
一度配列に値をいれてしまって毎回その配列から読み出す、とかも考えられますが、さくっと書くには面倒です。draw関数内に一回だけ実行するようにしたとしても、すぐ消えてしまいます。

以下のように書けば静止画の描画を何度も好きなタイミングで行えます。
これでグラフィックデザインでもopenFrameworksが大活躍！

```cpp:ofApp.h
class ofApp : public ofBaseApp{
     public
         void draw_once();
         bool once;
}
```

```cpp:ofApp.cpp
void ofApp::setup(){
     once = true;
     // フレーム更新時に前のフレームで描画したものを消さない
     ofSetBackgroundAuto(false); 
}

void ofApp::draw(){
     if(once){
         draw_once();
         once = false;
     }
}
void ofApp::draw_once(){
     // ここに描画するプログラムを書く
}
void ofApp::keyPressed(int key){
    once = true;
}
```
SVN導入

vagrantで作成したローカル仮想サーバでとあるプロジェクトをsvnでバージョン管理しよう、ということでsvnを導入することにしました。自宅PC内の仮想サーバということでセキュリティ面はおいといてとりあえず導入して、Eclipse上で作成したプロジェクトをバージョン管理できるようにしてみようと思います。

環境
OS: CentOS 6.4
webサーバ：apache 2.2.15

<h3>SVNインストールから設定</h3>

```
$ yum -y install subversion mod_dav_svn
```

を実行してsubversionのモジュールをインストールする。すると、

```
/etc/httpd/conf.d/subversion.conf
```

というファイルが作成されるので、エディタで開いて設定をしていく。


```
<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn
   SVNAutoversioning on
   Order deny,allow
   Deny from all
   Allow from all
   <LimitExcept GET PROPFIND OPTIONS REPORT>
      AuthType Basic
      AuthName "Authorization Realm"
      AuthUserFile /var/www/svn/.htpasswd
      Require valid-user
   </LimitExcept>
</Location>
```

上記設定を簡単に説明すると、
・ /var/www/svn 配下に作成されたディレクトリをバージョン管理できるようにする
・ どこからでもアクセスできる
・ 認証はベーシック認証形式
・ 認証ユーザとパスワードは /var/www/svn/.htpasswd に格納する

ということ。

ここで、まだ認証ユーザの設定をしていないのでユーザとパスワードの設定を行う。

```
$ htpasswd -c -b /var/www/svn/.htpasswd ユーザ名 パスワード
```

次にリポジトリを作成する。

```
$ svnadmin create /var/www/svn/testsvn
$ chown -R apache:apache /var/www/svn/testsvn/
$ service httpd restart
```

ここでは適当にtestsvnというリポジトリを作成しました。

これで準備万端です。eclipseから接続してみましょう。

<h3>EclipseからSVN</h3>
*Eclipse 4.3 Keplerを使用

・適当なプロジェクトを作成する
・作成したプロジェクトを右クリック ＞　「チーム」　＞　「プロジェクトの共用」　を選択する。

![スクリーンショット 2014-11-28 1.27.16.png](https://qiita-image-store.s3.amazonaws.com/0/58014/3b7f6718-bbf7-bb27-5fa5-6aa703c55ac6.png)

・ウィザードが出るので「新しいリポジトリー・ロケーションを作成」を選択した状態で「次へ」をクリック

![スクリーンショット 2014-11-28 1.28.34.png](https://qiita-image-store.s3.amazonaws.com/0/58014/2dbb8a41-6cd0-f0bd-54ba-1b439db40628.png)

・URLを指定して、先ほど設定したユーザ名とパスワードを入力して「完了」をクリックする。

・すると、最初のコミットを求められるので、任意でコミットメッセージを入力し「OK」をクリックする。

![スクリーンショット 2014-11-28 1.31.47.png](https://qiita-image-store.s3.amazonaws.com/0/58014/2e3b4e25-a0b3-cb54-3e75-63e5beb9917e.png)

・成功すると上記SSのようにプロジェクト名の隣にリポジトリ名が表示されます。（このSSを撮ったときはすでに３回コミットしている。）

・ブラウザ上でリポジトリ内のディレクトリを見たい場合は、このURL(この場合、

```
http://192.168.33.10/svn/testsvn/ 
```

)で見ることができる。

![スクリーンショット 2014-11-28 1.34.36.png](https://qiita-image-store.s3.amazonaws.com/0/58014/c3ed8bdb-49e2-c9ad-b7b4-aac021a56d89.png)


これでEclipse連動でプロジェクトのバージョン管理をすることができます。
最後までお読みいただきありがとうございました。