OmniAICreator/Qiita-1.07M huggingface dataset:
PHP 4 / Mysql 5 の接続失敗

古い環境移行でそのままという制約がありエラーになる。


# 使用環境

【WEBサーバー】

|NAME|VALUE|
|:--|:--|
|OS|CentOS 5.10/64bit|
|PHP|4.3.11|
|MySQL-Client|5.0.95|

【DBサーバー】

|NAME|VALUE|
|:--|:--|
|OS|CentOS 5.10/64bit|
|MySQL-Server|5.0.95|
|MySQL-Client|5.0.95|


# 設定

```mysql:mysql.user
mysql> select Host, User, Password from mysql.user where user = 'root';
+--------------+------+-------------------------------------------+
| Host         | User | Password password('password')             |
+--------------+------+-------------------------------------------+
| 192.168.1.%  | root | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+--------------+------+-------------------------------------------+
```

# 接続テスト

```bash:connection(password-unmatch)
php -r "echo mysql_connect('192.168.1.2', 'root', '');"
# PHP Warning:  mysql_connect(): Access denied for user 'root'@'192.168.1.3' (using password: NO) in Command line code on line 1
```

```bash:connection(password-match)
php -r "echo mysql_connect('192.168.1.2', 'root', 'password');"
# PHP Warning:  mysql_connect(): Client does not support authentication protocol requested by server; consider upgrading MySQL client in Command line code on line 1
```


# 処理条件
1. /etc/my.cnf の変更可 : old_password=0 として設定済み
1. mysql.user  の変更不可 ( mysql root user 使用不可能 )
1. PHPのバージョンアップ不可
1. MySQLのバージョンアップ不可

別のサーバーでは動作していたらしいため動くはずなんだが動かない。（製作者行方知れず）

```sql:以下はできない
UPDATE mysql.user SET password = old_password('password') Where User = 'root';
```

どうも libmysql が古い場合にコレになるようだ。


# 実験（Yum から install )

```bash
yum -y install php
php -r "echo mysql_connect('', 'root', 'password');";
# PHP Warning:  mysql_connect(): Client does not support authentication protocol requested by server; consider upgrading MySQL client in Command line code on line 1
```

yum から最新版をインストールした場合でも同現象は発生し


```bash
yum -y install php-mysql
php -r "echo mysql_connect('', 'root', 'password');";
# Resource id #2
```

yum から php-mysql をインストールした場合は 正常につながった。

# ソースからインストール（コメント参考に）

```bash
wget http://*******/**/php.4.3.11.tar.gz
tar -zxf php.4.3.11.tar.gz
./configure --prefix=/usr/local/php4-test/ --with-mysql
# mysql を ソースからインストールした場合は
# ./configure --prefix=/usr/local/php4-test/ --with-mysql=$mysql_prefix
/usr/local/php4-test/bin/php -r "echo mysql_connect('', 'root', 'password');";
# Resource id #3
```
# 解決

原因としては 別の人が install していたのだが パッケージからインストールされた古い mysql が存在したためのようだ。ソースからインストールされた mysql が参照されていなかったため。
iPhone5 ペーパープロトタイプ用のPDF　A4サイズ iOS7, 8

iPhone5, 5sサイズのペーパープロトタイプのフォームを作成しました。

![スクリーンショット 2015-02-02 11.54.44.png](https://qiita-image-store.s3.amazonaws.com/0/6688/9ab9de2e-e3e3-672a-99bb-0f85166a6d78.png)


iPhone5サイズのPDFはこちらから。
http://www.hugkey.com/302/

A4でプリントアウトすると、大体iPhone5と同じぐらいのサイズになります。
私はこれに書き込んだものをプロトタイピング用のアプリ「POP」で撮影して、画面遷移を見たりしています。


(iPhone6サイズはこちら。)
http://www.hugkey.com/798/
MySQLのダンプで忘れがち...


ロジックをアプリケーションに集約している場合は、データのダンプだけで大丈夫だったりする。
でも、一部ストアドなどの機能に依存している場合は、うっかりすると **移行時にテストや処理が失敗**するので注意。
(ストアドのソースがSCMとかに保存してあれば良いのだけれど、作り方が消えてしまったら大変！）

### 対策
 --routines もしくは -R オプションを付けること。

気持ち的には、デフォルトで付いてて欲しいかも(^^;
HerokuでServer-Sent Events使うときのタイムアウト対策


HerokuでSSE使ったら途中で切れることがあるなーと思ったら単なるリクエストタイムアウトだった。

https://devcenter.heroku.com/articles/request-timeout#long-polling-and-streaming-responses

ロングポーリング系は30秒最初のレスポンスがないか、途中で55秒何も送らなかっらコネクション切られるらしい。

SSEではコロンで始まる行はコメントとみなされるので、これをタイムアウト対策で定期的におくるのがよい。

例えばPOSTされたデータを定期的に通知するようなNode.jsのサーバーをこんな感じで書いてみた。

```javascript:app.js
var express = require('express');
var http = require('http');
var app = express();
var EventEmitter = require('events').EventEmitter;
var ev = new EventEmitter();

app.use(express.bodyParser());
app.use(express.static(__dirname + '/public'));

app.get('/stream', function(req, res) {
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'no-cache');

  // 55秒のタイムアウト対策
  var timer = setInterval(function() {
    res.write(':\n\n');
  }, 50000);

  // 最初の30秒のタイムアウト対策
  res.write(':\n\n');

  ev.on('data', function(data) {
    res.write('data: ' + data + '\n\n');
  });

  req.on('close', function() {
    clearTimeout(timer);
  });
});

app.post('/stream', function(req, res) {
  ev.emit('data', JSON.stringify(req.body));
  res.end();
});

var port = process.env.PORT || 3000;
http.createServer(app).listen(port, function() {
  console.log('Express server listening on port ' + port);
});
```

このサーバー起動してクライアント側をこんな感じで書いたら

```html:public/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>SSE Sample</title>
</head>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script>
var es = new EventSource('/stream');
 
es.onmessage = function(event) {
  $('<div>').text(event.data).appendTo('body');
};
</script>
</body>
</html>
```

HTTPでPOSTしたらブラウザに表示されるはず。

```
$ curl -d 'foo=bar' http://localhost:3000/stream
```

ちなみにSSEの仕様に、Proxyのタイムアウトを防ぐためにコメント使うといいよって書いてあるので間違った使い方ではない。

http://www.w3.org/TR/2011/WD-eventsource-20110208/#notes
ECMAScriptでは基数変換に2進数から36進数まで使える

よく忘れるので書くことにした。10進数から36進数の計算、ふつうに実装しても良いのだけど、ほとんどのJavaScript処理系では1メソッドで書ける。

ECMAScript 5.1を読むと、次の様に書いてある。

> 15.7.4.2 Number.prototype.toString ( [ radix ] )
> The optional radix should be an integer value in the inclusive range 2 to 36.
> 
> - [5.1 Edition/June 2011, ECMAScript® Language Specification](http://www.ecma-international.org/ecma-262/5.1/)

はい。そして現在使われているほとんどの処理系（Node.js、Chrome、MSIE、Opera、Safari）は36進数変換に対応している。逆に36進数をNumberするには、`parseInt(string, radix)`で良い。

```js:
n = 300;
console.log(n, n.toString(36)); // -> 300 "8c" 
console.log("8c", parseInt("8c", 36)); // -> 8c 300 
```
八面体を転がす

問題：https://codeiq.jp/ace/nabetani_takenori/q708

※https://twitter.com/Nabetani/status/432110418635395072 の「水曜」って2/19ではなく2/12で良いのですよね…？

ちなみにmap{|e|a[e]}はmap(&a.method(:[]))でもok。だから何って感じですが(ブロックを一段減らすことは可能なのかな？)。

```rb
#!/usr/bin/ruby
#面のマッピング
C='YRBGYRBG'
#初期状態から2時、6時、10時の方向に転がし、60度右に回転させた結果
T=[[3,6,0,5,7,2,4,1],[1,6,7,0,5,2,3,4],[2,0,7,5,6,4,3,1]]
D={'D'=>0,'2'=>0,'4'=>1,'6'=>1,'8'=>2,'T'=>2}

while gets
	r='Y'
	a=[*0..7]
	$_.chomp.each_char.with_index{|c,i|
		a=T[(D[c]+i/2)%3].map{|e|a[e]} # 60度ずつ右に回転させるから、i/2を足す必要がある
		r<<C[a[0]]
	}
	puts r
end
```
WordPressで表示をちょっとだけ早くする

WordPressのテーマファイル内で同じ関数を何回も使用している場合は、
テーマファイルの先頭で値を変数に入れてしまうことで表示をやや高速化することができます。

たとえば、home_urlやbloginfo('template_url')などが該当するかもしれません。

以下では$infoという連想配列を作成して使用した場合です。
連想配列のキーを元の関数に近づけておくことで、読み替えの違和感も少なくなると思います。

```php:index.php
<?php
$info = array(
    'home_url' => home_url('/'),
    'template_directory_uri' => get_template_directory_uri(),
    'template_url' => get_bloginfo('template_url'),
    'stylesheet_url' => get_bloginfo('stylesheet_url'),
);
?>
<!doctype html>
<html lang="ja">
（省略）
<a href="<?php echo $info['home_url']; ?>">ホームへ</a>
```

キャッシュプラグイン等に比べると効果は少ないですが、
同じ関数の呼び出しが多いなぁ、と感じているなら試してみると良いと思います。
SSL証明書導入時、秘密鍵のパスフレーズを外す


SSL導入時に、Apacheを再起動すると秘密鍵のパスフレーズを求められる。
サーバー再起動時とかに不便(セキュリティ的には別として)なので、
パスを聞かれないようにする。

```
cp [鍵ファイル] [別名鍵ファイル]
openssl rsa -in [鍵ファイル] -out [鍵ファイル]
```

セキュリティ的にはよろしく無いと思うので、あくまでも自己責任で。。。

***
参考サイト

* [Ssl証明書を設定したらapacheが起動しない？](http://www.slideshare.net/denet1999/sslapache)
BrowserifyでBackbone.jsを使うときのjQueryの解決


Browserifyで次のように書いたら動かなかった。（bowerとdebowerifyも使ってる）

```javascript:app.js
var Backbone = require('backbone');

var view = new Backbone.View(); //=> Uncaught TypeError: Property '$' of object #<Object> is not a function
```

これはBackbone.jsの現在のバージョン（1.1.0）での`$`の解決が`require`を使わずに次のようになっているから。

```javascript:backbone.js
Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$;
```

https://github.com/jashkenas/backbone/blob/1.1.0/backbone.js#L46

※ ちなみにUnderscore.jsは`require`で解決されてる。（[source](https://github.com/jashkenas/backbone/blob/1.1.0/backbone.js#L40-L42)）

なのでjQueryは自分で解決してあげないとだめ。

```javascript:app.js
var $ = require('jquery');
var Backbone = require('backbone');
Backbone.$ = $;

var view = new Backbone.View();
```

せっかくBrowserifyとBowerでいい感じに依存関係解決できるのにつらい感じはある。

と思ってたけど、Backboneのmasterではこの問題が解決されてる（[source](https://github.com/jashkenas/backbone/blob/722bee4684019e8a52b2bbcae2afa5705c910182/backbone.js#L22)）。

ので、

```
$ bower install backbone#master
```

すれば、自動的にjQueryを解決してくれる。

はよリリースしてほしい。
Selenium+Jenkins+Safariで「File exists - ~/Library/Safari/Extensions.bak」というエラーが出た時にすること

### 現象
* Jenkinsのコンソールに「File exists - /Users/jenkins/Library/Safari/Extensions.bak (Errno::EEXIST)」というエラーがでていた
                                                                                      
### 環境
* selenium-webdriver：2.39.0
* OS：Mac OS X 10.9
* ブラウザ：Safari 7.0.1

### 検証
* Extensions.bakを削除して、テスト実行とともに実験して挙動を確認してみた
 * 1. ~/Library/Safari/Extensions.bakがあれば削除
 * 2. テスト実行(Jenkinsぽち)
 * 3. テスト開始とともにExtensionsディレクトリは自動作成される
 * 4. テスト終了後はExtensionsディレクトリは自動削除される
* どういうときに.bakファイルが作られるかは追ってないが、なくてテスト実行できないとかではなかった
 * むしろあればエラーでてますし

### 対策
* [参考になるサイト1](https://groups.google.com/forum/#!topic/webdriver/CLms2kIFAoE)と[参考になるサイト2](https://gist.github.com/richdownie/5628183)にも書いてあるが「消しちゃえ！」だそうです
* 結論として、 ```$ rm -fr ~/Library/Safari/Extensions.bak``` をやっておけば良さそう
 * 動作確認済

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
CentOSとTeratermとScreenでウインドウタイトルに表示されるのがうざいとき

/etc/screenrc の
termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'
の行をコメントアウトすると、画面下に表示されるようになった。

詳しくないから副作用はわかんない。

Cygwin
------
Cygwinのscreenでも同じ行があったのでコメントアウトして画面下に出せるようになった。
RMySQLで500件以上のレコードを取得する


fetch関数の第2引数に-1を渡すと取得レコード数の上限が解除される、とヘルプに書かれていた。

```
> ? fetch

...

Usage:

       fetch(res, n, ...)
     
Arguments:

     res: a result set object (one whose class extends ‘DBIResult’).
          This object needs to be the result of a statement that
          produces output, such as SQL's ‘SELECT’ or ‘SELECT’-like
          statement, this object ‘res’ is typically produced by a
          call to or ‘dbSendQuery’.

       n: maximum number of records to retrieve per fetch.  Use ‘n =
          -1’ to retrieve all pending records.  Some implementations
          may recognize other special values.

    ... : any other database-engine specific arguments.
```


こんな感じで使う

```
library(RMySQL)
connect <- dbConnect(MySQL(), dbname="hogehoge", user="hoge", password="hoge", host="127.0.0.1", port=3306)
sql_str <- "SELECT DISTINCT user_id FROM hoges WHERE created >= '2014-01-01 00:00:00'"
res <- dbSendQuery(connect, sql_str)
user_ids.table <- fetch(res,-1)
```
【読書会】オンラインゲームを支える技術


![オンラインゲームを支える技術](http://image.gihyo.co.jp/assets/images/cover/2011/9784774145808.jpg)

## 作者

* 中嶋謙互

## 2/10 まで【読んだ内容】

### 【0章】【速習】オンラインゲームプログラミング p15まで

## 感想

* ネットワークの題材がまず0章にきた事を考えると、古来からオンラインゲームはネットワークの負荷、トラフィックと闘い続けてきてるだと感じている。(まあ、WEBも比較的そうだけど)ネットワークを詳しく把握している人は世の中にあんまりいないはずで自分もその中の一人なんで改めてお勉強しているが、やっぱり苦手な分野なんでちょっと苦痛。。。。

* 元々PHPerなんで並列に関する事をcurlでネット通信を並列ぐらいしかしていなかったんで並列プログラミング(スレッドとか)の扱いは今後重要と感じる今日この頃。

* 0章は読書会のとある人も言っていた通り、一人で読むと読み飛ばしそうなんで読書会としては「アリ」だと思った


## 2/12 まで【読んだ内容】

### 【0章】【速習】オンラインゲームプログラミング p31まで

## 感想

* ネットワークの負荷試験の参考とかになるぁぁ。という印象(ネットワークは以外と負荷試験ってやらないもんね。インフラ以外は)
* C,C++ちょっと触ってみたくなると感じる印象(すんません。LL言語出身なんで精進しますと自戒)
* libeventで遊んでみたくなった
bakeで作成されたプラグインコード中の __(&#39;message&#39;)を__d(&#39;pluginname&#39;, &#39;message)に一括置換する方法


message中にプラグイン名や、プラグインのみに記述のあるモデル名があるときしかつかえないけど。

PhoStormの一括置換で

Text to find:を `__\('([^()]*PluginName[^()]*)'\)`
Replace with: を `__d('plugin_name', '$1')`

にしてRegular expression有効で置換。

メッセージ中にプラグイン名が出てれば置換対象となる。

個人的に、プラグイン内のモデル名はユニークになるようにプラグイン名をプレフィクスとしてつけてるので、これでOK。

##2014/04/21追記
この方法だとカラム名とかは__dに置換されないので、結局__(を全部__d(に置換するようになりました(^^;
Oracle 12cR1 RAC on Windows 

今の仕事で12c RAC に触れているので勉強としてまとめます。

この記事を書いている時点で、windows RAC を使った手順書サンプルは下記のページを参考にしました。

http://www.oracle-base.com/articles/12c/oracle-db-12cr1-rac-installation-on-windows-2012-using-virtualbox.php

上記では、RHELにVirtualBox をインストールし、その中でwindows 2012 を使用して12c RACを構築しています。中身は全部英語ですが難儀な文法は無いので、そこそこ分かると思います。

先週はVMware Player　を使用して上記構成を試してみましたが、Cluster Ready Services の立ち上げ時に内部エラーが発生。結局自力で復旧には至らず、残念ながら断念しました。

仕事でやってるんだから当然ベンダーサポートもありますが、どうやらwin2012 + 12c RAC の構成はサポートしていないとのことで、2008 R2 で作り直すことにしました。

また、vmware player は本来共有ディスクをサポートしていませんので、virtual box に変更して再度検証を実施します。

進展があり次第、また情報を共有します。
処理時間を測る


```ObjC
NSDate *start = [NSDate date];

//何かの処理

NSDate *end = [NSDate date];

float diffSeconds = [end timeIntervalSinceDate:start];
```

`NSDate`の`timeIntervalSinseDate`を使って差分の時間が取れます。
返却されるのはミリ秒ではなく秒なので注意です。
TestLinkにNOT検索を追加する

### はじめに
* TestLinkを使っている人ならテストケースにキーワードを付けて管理している人も少なくはないはず
* そこで作ったキーワードでNOT検索ができたらなと思う人もまた少なくないはず
* なので直接書き足してNOT検索を導入する方法を共有

### 環境
* OS : CentOS5.8
* TestLink : 1.9.7
* TestLinkの言語 : 日本語

### 修正箇所
* ビューの変更
 * OR検索/AND検索ボタンのすぐ後ろにラジオボタンを作成

```php
# locale/ja_JP/strings.txt
$TLS_logical_not = "NOT検索"; # ラジオボタンのテキスト

# lib/plan/planAddTC.php
$gui->keywordsFilterType->options = array('OR'  => 'Or',
                                          'AND' => 'And',
                                          'NOT' => 'Not'); # NOTを追加

# lib/functions/tlTestCaseFilterControl.class.php
$this->filters[$key][$type]['items'] = array('Or'  => lang_get('logical_or'),
                                             'And' => lang_get('logical_and'),
                                             'Not' => lang_get('logical_not')); # Notを追加
```

* SQLでNOT検索するクエリを追加

```php
# lib/functions/testproject.class.php
$keyword_filter_not = " keyword_id IN (SELECT id FROM keywords" .
                      " WHERE testproject_id = {$testproject_id})" .
                      " AND testcase_id NOT IN (SELECT testcase_id FROM testcase_keywords" .
                      " WHERE keyword_id IN (" . implode(',',(array)$keyword_id) . "))";

  if($keyword_filter_type == 'And') {
    $sql =  " /* Filter Type = AND */ " .
            " SELECT FOXDOG.testcase_id FROM " .
            " ( SELECT COUNT(testcase_id) AS HITS,testcase_id " .
            "   FROM {$this->tables['testcase_keywords']} " .
            "   WHERE {$keyword_filter} " .
            "   GROUP BY testcase_id ) AS FOXDOG " .
            " WHERE FOXDOG.HITS = " . count($keyword_id );
  } elseif($keyword_filter_type == 'Not') { /** この5行を追加 **/
    $sql =  " /* Filter Type = Not */ " .
            " SELECT DISTINCT testcase_id " .
            " FROM {$this->tables['testcase_keywords']} " .
            " WHERE {$keyword_filter_not} ";
  } else {
    $sql =  " /* Filter Type = OR */ " .
            " SELECT testcase_id " .
            " FROM {$this->tables['testcase_keywords']} " .
            " WHERE {$keyword_filter} ";
  }
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
iosに関して調べた事のリンク集（だんだん追記します）

とてもわかりやすいCollection Viewの使い方
http://www.ht.sfc.keio.ac.jp/~takuro/blog/files/82d0e4da1259d447d88c4041be09e6ca-13.html

XCodeがディスクを使い過ぎているな、と思ったら
http://blog.favo.org/post/31649090293/xcode-5-places-to-save-some-disk-space

~/Library/Developer/Xcode/Archives/*
~/Library/Developer/Xcode/iOS DeviceSupport/*
は消しても良い様子。

素晴らしい情報の提供に感謝します。
Rubyのチートシート / 式について

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2057">元の記事はコチラ</a>
- - - - - - - - - - - 
基本だけどRubyっぽいものをまとめてみた。好みもあるだろうけど、良い例、悪い例の比較。Code Schoolがとても分かりやすかったのでお勧め。

<!-- extract -->

[code school](https://www.codeschool.com/)

```ruby

# ---------------------------------------------- #
# Expressions
# ---------------------------------------------- #

# 評価に関しての注意 
# ---------------------------- #
post = "my post"

#**BAD**#
if post != nil 
	puts post
end

#**GOOD**# 省略できる
if post
	puts post
end

# 下記はTRUEなので注意
# "" -> TRUE
# 0  -> TRUE
# [] -> TRUE
post = ""
puts "#{post}(empty but true)" if post


# 例（これは意図した通りに動かない）
# name.length -> 0でも1でも100でもTRUE
name = ""
unless name.length
	puts "Hey! We got an error!"
end
puts "nameは#{name.length}文字だけど評価はTRUE"



# Short-circuit Assignment
# 最初の値がTRUEであればその値を代入する
# ---------------------------- #

result = nil || 1
puts result				#-> 1

result = 1 || nil
puts result				#-> 1

result = 1 || 2
puts result				#-> 1

# 例 （current_sessionがnilならsign_inメソッドを実行）
# def sign_in
	# current_session || sign_in
# end



# Conditional Assignment
# 変数が存在しないか、値が'nil/false'でなければセットする
# ---------------------------- #

user ||= 1
puts user #-> 1

user = nil
user ||= 1
puts user #-> 1

user = false
user ||= 1
puts user #-> 1

user = true
user ||= 1
puts user #-> true



# Conditional Return Values
# ifの前に変数を置く(if文はいつも値を返す)
# ---------------------------- #

#**BAD**#
if user
	message = "Welcome!"
else
	message = "Please sign in."
end

#**GOOD**#
message = if user
	"Welcome!"
else
	"Please sign in."
end

puts "#{message} (Conditional Return Values)"



# Conditional Return Values
# 代入しなくてもよい
# ---------------------------- #
#**BAD**#
def get_url(user_id)
	if user_id
		url = "http://myblog.com/posts/#{id}"
	else
		url = "http://myblog.com"
	end
	url
end

#**GOOD**#
def get_url(user_id)
	if user_id
		"http://myblog.com/posts/#{user_id}"
	else
		"http://myblog.com"
	end
end

puts "#{get_url(14)} (Conditional Return Values)"



# Conditional Return Values
# case文も値を返す
# ---------------------------- #
type = "facebook"

#**GOOD**#
base_url = case type
	when "twitter"
		"http://twitter.com"
	when "facebook"
		"http://facebook.com"
	else
		nil
end

#**BETTER**#
base_url = case type
	when "twitter" 	then "http://twitter.com"
	when "facebook" then "http://facebook.com"
	else nil
end

puts "#{base_url} (Conditional Return Values)"


```

　
上のコードを実行するとこうなるはず。

```

$ ruby expression.rb

my post
my post
(empty but true)
nameは0文字だけど評価はTRUE
1
1
1
1
1
1
true
Welcome! (Conditional Return Values)
http://myblog.com/posts/14 (Conditional Return Values)
http://facebook.com (Conditional Return Values)

```

 → <a href="http://workabroad.jp/posts/2057">http://workabroad.jp/posts/2057</a>
ForgeGradle＋IDEAでマルチプロジェクト

# マルチプロジェクトの設定
![multi.png](https://qiita-image-store.s3.amazonaws.com/0/36616/810af955-e83e-6946-4874-c708ef0c9d7a.png)

画像のような階層構造であることを前提とする.

# settings.gradleについて
settings.gradleにマルチプロジェクトとして扱うフォルダを書く. 今回はTutorial-Baseフォルダ以下を別プロジェクトとして扱うので, settings.gradleに以下のような記述を追加する.

>include 'Tutorial-Base'

複数の場合は以下のようにする.

>include 'Tutorial-Base', 'Other-Project'

このincludeはIDEAのproject rootの子フォルダを指定する. もしproject rootと同階層にある場合はincludeFlatにする.

# IDEAのプロジェクトのbuild.gradleについて
build.gradleの中ほどにある以下の記述をコメントアウトして,

```build.gradle
minecraft {
    version = "1.7.2-10.12.0.1024"
    assetDir = "eclipse/assets"
}
```

次のように書き替える.

```build.gradle
allprojects {
    apply plugin: 'forge'

    minecraft {
        version = "1.7.2-10.12.0.1024"
    }

    version = "1.0"

    archivesBaseName = project.projectDir.name
    assetDir = "eclipse/assets"
}
```

# Modごとの個別のbuild.gradle
どのModでも基本的に記述は同じ.

```build.gradle
tasks.withType(Compile) {
    options.encoding = 'UTF-8'
}

sourceSets.main {
    java.srcDirs project.projectDir.name
    resources.srcDirs project.projectDir.name
}

version = "0.0.0"
```

tasks.withType~をしないとコンパイル時にUTF-8にならないのでビルドエラーが出る.
sourceSets.main~はgradleのデフォルトの参照先root/src/main/java, root/src/main/resourcesのこと.
このスクリプトから生成されるjarファイルの名前はprojectDir-name-version.jar, この場合はTutorial-Base-0.0.0.jarになる.

# ビルド
コマンドプロンプトからIDEAのプロジェクトのルートフォルダで以下のコマンドを実行する.

>gradlew build

ビルドに成功したらTutorial-Base/build/libsにjarファイルが生成される.
UITableViewのハイライト解除


UIViewControllerの派生クラスを使うときなどは、自分でUITableViewのハイライトを解除する必要があるようです。
決まり文句ぽいのでメモしておきます。

```objectivec:
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [_tableView deselectRowAtIndexPath:[_tableView indexPathForSelectedRow] animated:YES];
}
```
RaspberryPiをArchLinuxで使う場合の初期設定



## パッケージ最新化
```
pacman -Syu
reboot
```

## ロケール設定
```
nano /etc/locale.gen
```

```txt:/etc/locale.gen

#ja_JP.UTF-8 UTF-8 コメントを外す
ja_JP.UTF-8 UTF-8

```
英語しか使わない場合

```
en_US.UTF-8 UTF-8
```



```
locale-gen
echo LANG=ja_JP.UTF-8 > /etc/locale.conf
export LANG=ja_JP.UTF-8
```


## ホスト名の設定
```
echo newhostname > /etc/hostname
```


## タイムゾーンの設定
```
rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```
以下でもOK.

```
ln -s /usr/share/zoneinfo/Japan /etc/localtime
```


## （ルートの）パスワード変更
```
passwd
```


## ユーザ追加
```
pacman -S adduser
adduser
```
IDEAでのgithub連携

# ローカルにあるソースをgithubに置きたい場合
githubでリポジトリを作成して, readmeなどを作成してからIDEAからcloneする.
もしくはgithubでリポジトリを作成して, ローカルの管理したいコードのルートフォルダで以下のようにしてremoteの設定を追加してpushしておく.

>git init
>git add .
>git commit -m "commit"
>git remote add origin git@github.com:github_id/repository_name.git
>git push -u origin master

既にローカルのgitで管理してる場合は以下のようにする
>git remote add origin git@github.com:github_id/repository_name.git
>git push -u origin master

# githubにあるリポジトリを利用する場合
IDEA上部タブのVCS→Checkout Version Control→Githubを選ぶとgithubの自分のアカウントが作成した, forkしたリポジトリが選択できるので, cloneしたいリポジトリを選んでcloneする.

# clone時の注意
cloneするときのフォルダの階層に注意. また新規プロジェクトとして扱うかどうか聞かれる. YESにすると新しいプロジェクトになるので注意. Forgeのプロジェクトの下に置きたいならNoを選ぶとフォルダだけおかれる.

# 階層とsource root, resources root
自分の場合階層はこのようにしている.
![git.png](https://qiita-image-store.s3.amazonaws.com/0/36616/c1840de8-692b-7d2d-724b-2c579132fecf.png)

(gradleのデフォルトだと)src/main/javaをsource rootに, src/main/resourcesをresources rootに設定する. この設定は対象のフォルダを右クリック→Mark Directory As...で行う.

# VCS root
clone後, VCS rootを設定する. Settings→Project Settings→Version Controlを選択するとVCS rootを追加していないフォルダがある場合警告が出るのでナビゲートに従いadd rootする.

# coding
VCS rootの追加を行っていれば, そのフォルダ以下で変更があった場合, commit時に検出される.

# commit and push
VCS→commit changesでコミット画面が出る. 複数のVCS rootがある場合, 個別にコミットすることも可能. commit and pushを選ぶとコミット後にpushできる.

# commit時にuser nameとuser emailが問い合わされる場合
環境変数homeを適切に設定して, 以下のように設定しておく.
>git config --global user.name "username"
>git config --global user.email "user@email"

# .gitignoreについて
.gitignoreに書かれた条件を満たすファイル/フォルダはgitの管理下に置かれない. gitで管理しないファイル, githubに置かないファイルはignoreしておくとよい.
IntelliJ IDEAでModding

# 前準備(githubでコード管理したい場合のみ)
 (Windows向け)msysGitなどのgitをインストールし, sshキーをgithubに登録しておく.

# IDEAの導入
 [IntelliJ IDEA公式サイト](http://www.jetbrains.com/idea/)からCommunityEditionの最新版(ver13.0.2)をDLしインストール.

## 設定関連
File→Settingsで設定画面が表示される. Project SettingsとIDE Settingsがあるので注意.

## UIのフォント設定
 IDE Settings→Appearanceで設定.
 Override default font by (not recommended)のチェックを入れると変更可能になる.

## エディタのフォント設定
 IDE Settings→Editor→Color&Fonts→Fontで設定.
Scheme(テーマ)を適当な名前で保存すると変更可能になる. 
Show only ~のチェックを外すと他のフォントを読み込むので設定可能.

## エディタの外観設定
 IDE Setting→Editor→Appearanceで設定.
 Show right marginが右側の縦線の表示.
 Show line numbersが行番号表示.
 Show whitespacesがタブ/スペースの表示.

## インデントの設定
 Project Settings [Project Name]→Code Style→Javaで設定.
 Use tab characterでタブ/インデントがタブ文字になる. デフォルトは半角スペース. 
 またその下の項目でタブサイズ, インデントサイズを設定可能.

## githubの設定
 Project Settings [Project Name]→Version Control→GitHubで設定.
 LoginとPasswordはgithubのアカウントのログインIDとパスワード.

## gitの設定
 Project Settings [Project Name]→Version Control→Gitで設定.
 Path to Git executable:にインストールしたgitのパスを入れる. TestでOKが出ればよい.
 SSH executableは通常Built inでよい.

# ForgeGradleによるModding環境構築
## ForgeGradle側の準備
+ [Minecraft Forge Downloads](http://files.minecraftforge.net/)から利用するビルド番号のsrcをDLする(現時点で1024以上推奨).

+ 適当なフォルダに解凍し, コマンドプロンプトを起動してforgeのフォルダ内で以下のコマンドを実行する.
>gradlew setupDecompWorkspace
>gradlew setupDevWorkspace ideaModule

setupDecompWorkspaceはデコンパイル環境の生成, setupDevWorkspace ideaModuleは開発環境とIDEAモジュールの生成である.

## IDEA側の準備
+ IDEAを起動し, Create Project→Empty Projectで空のプロジェクトを作成する.
+ 作成した空のプロジェクトのルートフォルダ(IdeaProject\project_name\に先ほどのforgeフォルダ以下のものを全てコピーする. 特別な事をしていなければ(forge1024なら)以下のファイルをコピーする.

>.gradle
>build
>eclipse
>gradle
>src
>build.gradle
>CREDITS-fml.txt
>forge-1.7.2-10.12.0.1024-changelog.txt
>forge-1.7.2-10.12.0.1024-src.iml
>gradlew
>gradlew.bat
>LICENSE-fml.txt
>MinecraftForge-Credits.txt
>MinecraftForge-License.txt
>README.txt

+ Project SettingsのProjectで利用するSDKと, Language Levelを指定する.
+ Project SettingsのModulesで緑の＋をクリックし, import moduleで先のforge-1.7.2-10.12.0.1024-src.imlを指定する.
+ ModuleのLanguage LevelをプロジェクトのLanguage Levelと同じものに設定する.
+ (エラーが出ていなければ)OKを押してプロジェクト設定を閉じる. 出てたらナビゲートに従って修正.

# 起動構成を生成
コマンドプロンプトで先のプロジェクトのルートフォルダに移動し, 以下のコマンドを実行.

>gradlew genIntellijRuns

実行後IDEAがプロジェクトの再読み込みを行う. このときbuild.gradleを読み込むかどうか聞かれるので必要なら読み込む.

## 実行フォルダの変更
起動構成はbuild.gradleにあるassetsDirを参照するようなので, assetsDirを変更していた場合は起動構成でエラーが出ます. デフォルトではassetDir=eclipse/assetsなので, これをrun/clinet/assetsなどにした場合は起動構成の実行フォルダをクライアントならrun/clinet, サーバーならrun/serverなどにして, run/clinet, run/serverフォルダを別途に作成する.

これでIDEAでのForgeGradleを使ったModding環境構築は完了です. src/main/javaにソースコードを, src/main/resourcesにリソースを設置してModdingを始めましょう.

なおgithubからのcloneやcommit, push, マルチプロジェクトなどは別記事にします.
C++でクラス作成〜継承〜関数の抽象化までを試してみる


##概要
最近C++を勉強中です。
C++でのクラス作成やら、ファイル分けたりやらのやり方を調べてみました。

##1.C++のクラスの作成
ヘッダファイルと、関数を実装するC++ファイルとを分けて作成する。
(ちなみに、この後継承とかもやってみたい、という思いからファイル名がParentになってます)

###ヘッダファイル

```Parent.h
class Parent
{
public:
    void showMessage(const char* message);
};
```

###C++ファイル
続いて、ヘッダファイルを読み込むC++ファイルを作成する

```Parent.cpp
#include <iostream>
#include "Parent.h"

/**
 * メッセージを出力する
 */
void Parent::showMessage(const char* message)
{
    std::cout << "[message]" << message << std::endl;
}
```
ここまででクラスの作成はOK

###実行ファイル

作成したC++のクラスを読み込み、showMessageメソッドを実行する、実行ファイルを用意する。

```run.cpp
#include "Parent.h"

int main()
{
    Parent pt;
    pt.showMessage("Hello!");

    return 0;
}
```
###コンパイル・実行

```bash
$ g++ -o run run.cpp Parent.cpp
$ ./run
[message]Hello!
```

無事、結果が出力されたようです。

##2.クラスの継承

次に、継承をやってみます。
1.で作成した親クラスを変更し、

親 -> メッセージの出力のみ
子 -> メッセージの設定のみ

といった感じにしてみます。

###親クラス

```Parent.h
/**
 *  親クラス
 */
class Parent
{
public:
    const char* message;
    void showMessage();
};
```

```Parent.cpp
#include <iostream>
#include "Parent.h"

/**
 * メッセージを出力する
 */
void Parent::showMessage()
{
    std::cout << "[message]" << this->message << std::endl;
}
```

###子クラス

子クラスはParentクラスを継承し、setMessageという関数を実装します。

```Child.h
#include "Parent.h"

/**
 * 子クラス
 */
class Child : public Parent
{
public:
    void setMessage(const char* message);
};
```

```Child.cpp
#include "Child.h"

/**
 * メッセージを設定する
 */
void Child::setMessage(const char* message)
{
    this->message = message;
}
```

###実行クラス

```run.cpp
#include "Child.h"

int main()
{
    Child ch;
    ch.setMessage("Hello!");
    ch.showMessage();

    return 0;
}
```
###実行

```bash
$ g++ -o run run.cpp Parent.cpp Child.cpp
$ ./run
[message]Hello!
```
実行できました！

##3.関数の抽象化

###仮想関数

さらに、子クラスで実装した「setMessage」関数を、親クラスで抽象化して宣言してみます。
「仮想関数」と呼ぶようです。
こんな感じ。

```Parent.h
/**
 *  親クラス
 */
class Parent
{
public:
    const char* message;

    void showMessage();

    // abstractのイメージ。「= 0」をつける(純粋仮想関数)
    virtual void setMessage(const char* message) = 0;
};
```

###実行

```bash
$ g++ -o run run.cpp Parent.cpp Child.cpp
$ ./run
[message]Hello!
```

正常にコンパイル・実行できました。

うーん、まだC++全然慣れないっすねw

Makefileの作り方とかも勉強しようと思います。
Gitコンフリクト解消ガイド（git mergetoolの使い方）


## ファイル編集がコンフリクトした場合

下記はよくある（忌々しい）コンフリクト画面ですね。

![コンフリクトしたときのgit status](https://qiita-image-store.s3.amazonaws.com/0/4153/166ea8ed-d1ff-7386-1a0c-84cc21def7df.png)

皆さんはコンフリクトのmergeはどんな方法でやっていますでしょうか？
vimやemacsで直接編集している方が多いイメージですが、実際開いてみると、下記のように差分が表示されていると思います。

![conflict-marker.png](https://qiita-image-store.s3.amazonaws.com/0/4153/3f0e3b7e-5396-5616-8ad7-bb6bf5d86a10.png "conflict-marker.png")

この画面を見ただけではどのようにmergeすればよいのかわかりません。（Objective-CのARC/MRC双方の開発経験がある人は目をつぶってください・・）

gitにはこのようなコンフリクトのmergeを支援する`git mergetool`コマンドが搭載されています。

![git mergetoolのプロンプト](https://qiita-image-store.s3.amazonaws.com/0/4153/66866f52-51b3-ff29-0130-452a506ad3e6.png)

このままEnterキーを押すと下記のような画面が立ち上がります。

![mergetool2.png](https://qiita-image-store.s3.amazonaws.com/0/4153/f9cd0887-d2c4-e7fd-7a4b-4f2090ddee8a.png "mergetool2.png")

画面幅の都合でフォントが小さいのですが、ここで「mergeしたい差分が作られる直前の状態」と「mergeしたい差分」に注目してみます。

![mergetool2-base-remote.png](https://qiita-image-store.s3.amazonaws.com/0/4153/bce2290e-40ed-a125-84e3-318cdb7d9e15.png "mergetool2-base-remote.png")


この2つを見比べると、@propertyの「*adapter」のところが「*webViewAdapter」に変更になっていることがわかります。
mergeしたい差分の内容は実際には上記の変数名の変更だったのです。

ですので、「merge結果として保存するファイル」の中でコンフリクトした箇所の上側（画面内だとHEAD側）で、adapterをwebViewAdapterに書きかえます。下側とコンフリクトマーカは忘れずに削除しましょう。

ちなみに、git mergeでコンフリクトした場合は、真ん中はbranchが枝分かれした時の状態で、左は現在のbranchに追加された差分、右はmergeしたいbranchに追加された差分ということになります（3-way merge）。
ですので、真ん中と左を比べると、現在のbranchがどのように進んだのかを確認することができます。
今回は、ARC対応でretainがstrongに、assignがweakになったことがわかります。

![merge後の状態](https://qiita-image-store.s3.amazonaws.com/0/4153/8ca88a3e-5844-4216-e958-6fde01b348c4.png)

mergeが完了したら、保存してエディタを終了します。merge前の状態は、該当のファイル.origとして保存されます。自動的にgit addされているので、コミットしましょう。

※なお、キャンセルする場合は1回も保存をせずにエディタを終了します。

※ちなみに現状ではvimのみの対応となります・・emacsでも設定方法があるようなので、うまく言った方はよければコメント等ください。

### （Xcode用の）GUIのdiffツールっぽいのが起動する場合

opendiffになっている人がちょくちょくいるみたいなので、下記のコマンドでvimdiffに切り替えてください。

```bash:
git config --global merge.tool vimdiff
```

## （番外編）mergetoolを使わず似た方法でmergeする

宗教上の都合でvimが使えない方や画面が狭い方に朗報です。

通常のコンフリクトマーカだとmergetoolの真ん中の画面（mergeしたい差分が作られる直前の状態、BASE）が欠落していましたが、コンフリクトマーカにそれを表示するオプションがありました。

```bash:
git config --global merge.conflictstyle diff3
```

コンフリクトマーカが下記のようになります。

```
<<<<<<< HEAD
merge前の状態
||||||| merged common ancestors
mergeしたい差分が作られる直前の状態
=======
mergeしたい差分
>>>>>>> branch
```

とりあえず設定しておいても損はしません。mergetool使うほどでかいconflictじゃないときにも重宝します。
※ただし、コンフリクトしていない場所に加えられた変更を把握できないので、大きい差分にはmergetoolを使うか、git diffを組み合わせて使うほうが良さそうです。

参照: http://qiita.com/hchbaw/items/1191c2627307a4673b1b

## ファイル削除がコンフリクトした場合（path conflict）

削除したファイルが編集されていた時に起きます。

- Deleted by them:
	- mergeする差分で削除されています
	- 現在のbranchで変更されています
- Deleted by us:
	- 現在のbranchで削除されています
	- mergeする差分で変更されています

多くの場合最終的に削除を採用することになると思いますが、mergeのためにファイルが残されているので、下記のようにします。

```bash:
git rm path/to/target/file
```

※unmergedっぽいメッセージが出ますが、きちんと削除が反映されます。

## 同じ差分を複数回mergeする場合

gitにはコンフリクトした差分のmerge結果を保存しておき再利用するrerere機能というものがあります。
メンテナとかリリース担当で、同じ差分で複数回mergeする場合に便利です。
下記のコマンドで有効にできます。

```bash:
git config --global rerere.enabled true
```

http://d.hatena.ne.jp/unpush/20091010/1255186302
msdnのチュートリアル作業メモ(プロパティ)

# プロパティ
## 例1
### setメソッド
プロパティの`set`メソッドでは、特殊な`value`変数を使用できる。
この変数には、ユーザーが指定した値が含まれまる。
たとえば、次のように指定します。

```csharp
myName = value; 
```

classないでは以下のように書いておけば自動的にセットされる。

```csharp
class Person
{
    private string myName ="N/A";
    public string Name{
        set {
           myName = value; 
        }
    }
}
```

### ToString()のオーバーライド

```csharp
public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}
```

classで上記のように記述しておけば呼び出し側で以下のように呼び出すことで、NameとAgeが出力される。

```csharp
Console.WriteLine("Person details - {0}", person);
```

プログラムでは `ToString` メソッドは明示的に使用されていないが、既定で`ToString` メソッドは WriteLine によって呼び出される仕様。

#まとめ
クラス名を`WriteLine`の引数に入れるだけでクラスの要素が出力されるのは便利。
overrideの利用の便利さが少しわかった気がする。
__block修飾子


ブロック構文を使う場合に、ブロック外で定義された変数に__block修飾子をつけておくことによって、ブロック内で変更が可能になるらしい。(参照は__block修飾子が付いてなくても可能です。)
Objective-Cはけっこう奥が深いかも。。
Genymotionが "Unable to load VirtualBox engine"。

Mac OSX Marvericks です。

VirtualBox自体は起動するのに…


結論これだ。


* http://stackoverflow.com/questions/19629013/genymotion-unable-to-load-virtualbox-engine-on-mavericks-vbox-is-setup-corr


ということで
`sudo /Library/StartupItems/VirtualBox/VirtualBox restart`


でなおりました。
jQuery.fn.onに名前空間をつけることができる

恥ずかしながら今日まで知らなかったのですが、jQueryはイベントハンドラを登録するときに名前空間をつけることができます。（名前空間というよりはクラスという言い方の方がしっくりくるのですが、jQueryのドキュメントがnamespaceと表現しているので名前空間と書くことにします）

例えば、あるボタンのクリックイベントにイベントハンドラをつける時にこういう風に書きますが

```js
$('.button').on('click', function (e) { /* イベントハンドラ */ });
```

こういう感じで . のあとに名前空間をつけても問題ありません。

```js
$('.button').on('click.n1.n2', function (e) { /* イベントハンドラ */ });
```

ボタンがクリックされたらいずれのイベントハンドラも正しく起動されます。

## 何が嬉しいのか

通常であれば特に嬉しいことはありません。嬉しいのは `jQuery.fn.off` するときです。

```js
$('.button').off('click');
```

イベントハンドラを解除するときはこのように書きますが、このボタンについているイベントハンドラが他にあったらそれらも全て消されてしまいます。`document` オブジェクトにイベントハンドラを登録している場合や、jQueryプラグインを作っていてどのような環境で使わるか作成者が分からないような場合は頭痛の種になりそうです。

### 名前空間を使うと綺麗に消すことができる

このような場合、イベントに名前空間をつけていると次のように指定することでその名前空間に属するものだけを消すことができます。

```js
$('.button').off('click.n1'); // n1に属するclickイベントを消す
$('.button').off('.n1');  // n1に属する全てのイベントを消す
```

## 注意

```js
$('.button').on('click.n1.n2', function () {});
```

は `n1` の中に `n2` がある、という **意味ではない** です。これは `n1` と `n2` がついているクリックイベント、なのです。ちょうどHTML要素のclass属性に複数の要素がついているのと同じです。

```html
<span class="n1 n2"></span>
```

このSPAN要素は `$('.n1')` でも `$('.n2')` でも `$('span.n1')` でも取り出せますよね？

それと同様にこちらも名前空間を指定することができる訳です。

```js
$('.button').off('.n1');  // dblclick.n1とかも消える
$('.button').off('.n2');
$('.button').off('click.n1'); // dblclick.n1は消えない
```
例外の書き方をまとめた

いつもモヤモヤしてたので、一度まとめてみました。


```MainActivity.java
HogeProfile profile = new HogeProfile();
try {
	service.postProfile(profile);
	Toast.makeText(this, "登録が完了しました", Toast.LENGTH_SHORT).show();
} catch (HogeNotFoundUserException e) {
	Toast.makeText(this, "ユーザーが見つかりません", Toast.LENGTH_LONG).show();
} catch (HogeInvalidParameterException e) {
	Toast.makeText(this, "入力に不備があります", Toast.LENGTH_LONG).show();
} catch (HogeServerMaintenance e) {
	Toast.makeText(this, "サーバーがメンテナンス中です", Toast.LENGTH_LONG).show();
}
```

```MainActivity2.java
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	HogeProfile profile = new HogeProfile();
	try {
		service.postProfile(profile);
		Toast.makeText(this, "登録が完了しました", Toast.LENGTH_SHORT).show();
	} catch (HogeException e) {
		handleException(e);
	}
}

private void handleException(HogeException e) {
	if (e instanceof HogeNotFoundUserException) {
		Toast.makeText(this, "ユーザーが見つかりません", Toast.LENGTH_LONG).show();
	} else if (e instanceof HogeInvalidParameterException) {
		Toast.makeText(this, "入力に不備があります", Toast.LENGTH_LONG).show();
	} else if (e instanceof HogeServerMaintenance) {
		Toast.makeText(this, "サーバーがメンテナンス中です", Toast.LENGTH_LONG).show();
	}
}
```

```MainActivity3.java
HogeProfile profile = new HogeProfile();
HogeServiceResult result = service.postProfile(profile);
if (result.hasError()) {
	HogeException e = result.getException();
	if (e instanceof HogeNotFoundUserException) {
		Toast.makeText(this, "ユーザーが見つかりません", Toast.LENGTH_LONG).show();
	} else if (e instanceof HogeInvalidParameterException) {
		Toast.makeText(this, "入力に不備があります", Toast.LENGTH_LONG).show();
	} else if (e instanceof HogeServerMaintenance) {
		Toast.makeText(this, "サーバーがメンテナンス中です", Toast.LENGTH_LONG).show();
	}
} else {
	Toast.makeText(this, "登録が完了しました", Toast.LENGTH_SHORT).show();
}
```

```MainActivity4.java
HogeProfile profile = new HogeProfile();
HogeServiceResult result = service.postProfile(profile);
HogeServiceResultResolver.resolver(result);
```
HerokuにデプロイしたHobotをIdlingさせない方法

HubotをHipchatやIdobataなどのチャットと連携して利用すると、GithubやTravis、New Relicなどのサービスからの通知をチャットで受け取れて便利です。

その際のデプロイ先としてHerokuが非常に便利なのですが、放置しているとアイドリングしてしまいます。

それでは困るので定期的にリクエストを飛ばすスクリプトを書いて対応していたのですが、もっと簡単な方法があったので紹介します。

Herokuの環境変数`HEROKU_URL`にHubotのデプロイ先のURLを設定するだけです。

```
heroku config:set HEROKU_URL=http://yourapp.herokuapp.com/
```

処理はHubotのrobot.coffeeに書いてあり、`HEROKU_URL`が設定してあれば20分に1回 `http://yourapp.herokuapp.com/hubot/ping`にPOSTするようになっています。

https://github.com/github/hubot/blob/master/src/robot.coffee
対象コミット: https://github.com/github/hubot/commit/5e738f634bf5c88b0520a97dd9566abedfaa7f3f

これでアイドリングすることが無くなるはずです。

ってよく読んだら https://github.com/github/hubot/blob/master/docs/deploying/heroku.md に書いてありますね…。

ググると全然違う情報が引っかかったりするので、備忘録ってことで残しておきます。

### 追記

最新のHubot(2.9.3で確認)では、[hubot-scripts/hubot-heroku-keepalive](https://github.com/hubot-scripts/hubot-heroku-keepalive)を使ってアイドリングさせないようにpingを送ります。

今まで通り`HEROKU_URL`を設定しても動くようですが、互換性維持のために残しているような感じなので、新しく作ったのであれば`HUBOT_HEROKU_KEEPALIVE_URL`を設定した方が良さそうです。

Herokuの環境変数の設定は以下の通り。
`heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=PASTE_WEB_URL_HERE`

ワンライナーでも設定できるみたいです。
`heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web_url | cut -d= -f2)`

hubot-heroku-keepaliveでは、デフォルトで5分間隔でpingする設定になっており、`HUBOT_HEROKU_KEEPALIVE_INTERVAL`に値を設定することで変更できるようです。

### おまけ

上記対応前はこんなコードで対応してました。

```coffeescript
cron = require('cron').CronJob
module.exports = (robot) ->
  url = process.env.HUBOT_URL
  robot.enter ->
  new cron
    cronTime: "*/10 * * * *"
    start: true
    onTick: ->
      robot.http(url + "/hubot/version")
        .get() (err, res, body) ->
          return
```
Monit5.6をCentOS5.xにインストールしてたらrpmbuildのところで怒られた



[Monit 5.6 for CentOS5.x - Qiita [キータ]](http://qiita.com/mykysyk@github/items/46f8f23250c8c8dead0f)
にならって作業をしてたところ、rpmbuildのところで怒られちゃいました

```bash
rpmbuild -bb --clean monit.spec
#=> （中略）
#=> configure: error: PAM enabled but headers or library not found, install the PAM development support or run configure --without-pam
```


# 解決策

yumでpam-develをinstallします

```bash
yum install pam-devel
```

そしたらうまくいきました


# 参考

- [make failure installing monit on linux ec2 - Stack Overflow](http://stackoverflow.com/questions/13175331/make-failure-installing-monit-on-linux-ec2)
enchant.jsでのイベントの追加・削除について


#サンプル
[enchant.jsでのイベントの追加・削除について - jsdo.it](http://jsdo.it/matsui_q/enchant04)


#独自イベントを作成、発行
Eventオブジェクトを作成してDispatchEventを実行

```js
//タッチイベントリスナを登録
sprite.ontouchstart = function(){
    //hitイベントを発行
    var e = new enchant.Event("hit");
    this.dispatchEvent(e);
};
  
//hitイベントリスナを登録
sprite.onhit = function(){
  alert("HIT"); 
};
```


# イベントの削除
一度しかイベントを実行したくない場合は　removeEventListener()でイベントの削除を使う。
引数にはイベント名と登録した関数を渡す。

```js
var touchFunc = function(){
  alert("タッチ");
  //イベントの削除
  this.removeEventListener("touchstart", touchFunc);
};

object.addEventListener("touchstart", touchFunc);
```

# 登録した全てのイベントの削除
addEventListenerで登録したイベントを削除したい場合はclearEventListener()を使う。

```js
sprite.addEventListener("enterframe", function(){
    this.moveBy(1, 1);
});
sprite.addEventListener("enterframe", function(){
    this.rotate(10);
});

//イベントをまとめて削除
sprite.ontouchstart = function(){
    this.clearEventListener("enterframe");
};
```

#イベントに登録した無名関数を削除
arguments.calleeで実行中の関数への参照を返す。
removeEventListenerにargument.calleeを渡すことで無名関数でもイベントを削除できる。

```js
sprite.addEventListener("touchstart", function(){
  alert("タッチ");
  //実行中の関数（無名関数）を削除
  this.removeEventListener("touchstart", arguments.callee);
});
```


#参考サイト
[enchant.js 開発のレシピ](http://phi-jp.github.io/enchant.js-recipe-book/index.html)
enchant.jsでの基礎いろいろ。

凍えながら、お勉強3日目。
こんだけわかれば、簡単なクソゲーであれば、なんとか作れそう。

#サンプル
*  [enchant.jsでの衝突判定とシーンの遷移 - jsdo.it](http://jsdo.it/matsui_q/enchant02)
*  [enchant.jsでクラス作成、量産、アニメーション処理 - jsdo.it](http://jsdo.it/matsui_q/enchant03)


#衝突判定
*  intersect()
矩形同士の判定

*  within()
円形同士の判定（中心からの距離を指定できる） 

#シーンの遷移
*  replaceScene  
シーンを取り換える
*  core.pushScene  
一番上にシーンを重ねる
*  popScene  
一番上のシーンを外す

#ゲーム終了
stop()

#クラスを作成
``Class.create`` 関数を使う。
initialize というキーで定義して初期化する。
 
#アニメーション
tlプロパティでアニメーションさせる

*  moveTo(目標のx座標,目標の座標,フレーム数,イージング関数) 
*  mobeBy(x座標の相対移動値,y座標の相対移動値,フレーム数,イージング関数) 
*  fadeIn(フレーム数,イージング関数)
*  fadeOut(フレーム数,イージング関数)


#参考サイト
*  [enchant.js入門 (全12回)](http://dotinstall.com/lessons/basic_enchant_js_v2)
*  [enchant.jsでHTML5＋JavaScriptゲーム開発入門（3）：enchant.jsで重要なスプライトとシーンを使うには](http://www.atmarkit.co.jp/ait/articles/1304/01/news034.html)

***
イージングについてはもう少しちゃんといじる予定。
どっとインストール終わったから、ぽちぽち本でも読んでいこ。
golangに(僕が)便利(だと思う様)なlogger作った

golangでアプリケーションログ取る時、一般的にはlogパッケージが用いられると思います。
が、あれイロイロ不便なので自分で作りました。

https://github.com/umisama/golog

# 既存の問題
標準のlogや、他の人が公開してくれているloggerにはこんな問題があると思います。

 * レベル別にできない。
 * 関数名やgoroutine番号が出せない
 * なんか作りが複雑(主に野良)

# 方向性
なのでこんな感じの方向性とか機能を盛り込みました。

 * logをレベル付できるようにした。
 * 関数名とかをログに含められるようにした。
 * timeやtext/packageなどgoの標準に沿った作りにした。

# サンプル

```go:sample1.go
package main

import (
    "github.com/umisama/golog"
    "os"
)

var logger log.Logger

func OtherFuncName() {
    logger.Info("here is OtherFuncName()")
}

func main() {
    logger, _ = log.NewLogger(os.Stdout,
                        log.TIME_FORMAT_SEC,        // Set time writting format.
                        log.LOG_FORMAT_POWERFUL,    // Set log writting format.
                        log.LogLevel_Debug)         // Set log level.

    logger.Debug("debug")
    logger.Info("Infomation")
    logger.Warn("Warning!")
    logger.Critical("Critical!")

    OtherFuncName()
}
```

```shell-session:output
2014/2/9 12:41:59 main.go:20(main) : "debug"
2014/2/9 12:41:59 main.go:21(main) : "Infomation"
2014/2/9 12:41:59 main.go:22(main) : "Warning!"
2014/2/9 12:41:59 main.go:23(main) : "Critical!"
2014/2/9 12:41:59 main.go:11(OtherFuncName) : "here is OtherFuncName()"
```
NewLogger()がロガーを作ってくれますが、この時time.Format()とtext/templateに指示する表示を渡します。適当にカスタマイズもできます。一応、

```go
LOG_FORMAT_SIMPLE   = "{{.Time}} : {{.Message}} \n"
LOG_FORMAT_STANDARD = "{{.Time}} {{.ShortFileName}}:({{.LineNumber}}) : {{.Message}}\n"
LOG_FORMAT_POWERFUL = "{{.Time}} {{.ShortFileName}}:{{.LineNumber}}({{.ShortFuncName}}) : {{.Message}}\n"
```

こんな感じのは用意してあります。
あと、当然ですがNewLogger()にあげるレベルを変えるとそれ以下のログは出力されなくなります。

```go
    logger, _ = log.NewLogger(os.Stdout,
                        log.TIME_FORMAT_SEC,        // Set time writting format.
                        log.LOG_FORMAT_POWERFUL,    // Set log writting format.
                        log.LogLevel_Critical)      // Set log level.
```

```shell-session:output
2014/2/9 12:41:59 main.go:23(main) : "Critical!"
```

レベルは一応 Debug < Info < Warn < Critical という感じになってます。

# 工夫点
NewLogger()で取得されるLoggerは、interfaceが帰ってきます。この時、指定されたレベルに対して必要な出力メソッドのみ中身のあるもの返し、その他は、

```go
func (x Logger) Hoge () { return }
```

の様に処理の無いメソッドを持つstructを返し分けています。
~~これでgcの最適化が効いてインライン関数になりますから、非表示で埋まっているデバッグログのパフォーマンス影響がほぼ0になります。（分岐すらできません）~~
上手く行ってないぽい･･･orz
デバッグコードがプロダクトに性能低下を与えることが、どうしても許せない人にオススメです。
＃ いや、まぁメッチャ微々たるものだけど

# 今後
 * プロダクトに入れて行って改良します。
Go言語: ワーキングディレクトリを変更する


# この記事のゴール

* Go言語でワーキングディレクトリを変更できるようになる

# 実装

単純に [os.Chdir](http://golang.org/pkg/os/#Chdir)を使うことで、ワーキングディレクトリを変更できる。

```go
package main

import (
	"os"
)

func failOnError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {
	// 現在のディレクトリを取得する
	cwd1, err := os.Getwd()
	
	failOnError(err)
	println(cwd1)
	
	// ディレクトリを移動する
	err = os.Chdir("/usr/local")
	
	failOnError(err)
	
	// 現在のディレクトリを取得する
	cwd2, err := os.Getwd()
	
	failOnError(err)
	println(cwd2)
}

```
NGUIのUILabelを一文字ずつ書き出す

初投稿。気が向いた時にネタあげていきます。
主にコピペ用の簡単ハックを書く予定です。

NGUIのUILabelを一文字ずつ出力するサンプル

```csharp:TextTest.cs
using UnityEngine;
using System;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;

public class TextTest : MonoBehaviour {

	void Start () {
		string text = "ほげ[FF0000]ほげ[-]ほげ";
		//string text = GetComponent<UILabel>().text;
		StartCoroutine(textWriter(text));
	}

	IEnumerator textWriter(string text){

		int len = 0;
		StringBuilder sb = new StringBuilder();
		UILabel label = GetComponent<UILabel>();
		label.text = sb.ToString();
		
		Regex r = new Regex(@"^\[[0-9A-F]{6}\]$");

		yield return null;

		while(len < text.Length){
			// Font Colorの評価
			string txt = text.Substring( len , 1 );
			if (txt == "["){
				if (len+3 < text.Length){
					txt = text.Substring( len , 3 );
					if (txt == "[-]"){
						sb.Append( txt );
						len += 3;
					} else if (len+8 < text.Length){
						txt = text.Substring( len , 8 );
						if (r.IsMatch(txt)){
							sb.Append( txt );
							len += 8;
						}	
					}
				}
				if (len >= text.Length) break;
			}
			sb.Append( text.Substring( len , 1 ) );
			label.text = sb.ToString();
			len++;
			//Debug.Log(len);
			yield return null;
		}
		yield return null;
	}
}
```
個人で作ったアプリ(Android)のDL数を伸ばすための方法

#個人Androidアプリの集客方法
個人でAndroidアプリを作っていて一番大変に思うのが、
アプリへの集客だと思います。

会社や事業として作成したアプリであれば、
プレスをバンバン打ったり、広告・営業に物を言わせて
ユーザーをつかみとってくる事は可能ですが、
「格」を持たないただの個人ディベロッパーだと
プレスを依頼することさえ困難です。

今回はそんな苦い思いをしている個人ディベロッパーを救うべく、
どうすればユーザーを個人ディベロッパーが集められるのかをまとめてみました。

…とは言うものの自分のアプリがそこまで人を集められている訳ではないので、
「劇的にユーザーが増える」といった方法論の紹介ではありません。あしからず。

# SEO(検索による流入最適化)
まず一番重要だと思うのがこのGooglePlay上でのSEOです。
自分がアプリを入れようとした時に何をするか考えてみてください。
名前の分かっているアプリはもちろん、「ランチ」「電卓」などといった
自分がやりたい目的を「検索」にかけてお目当てのアプリを見つける事が多いはずです。
なので検索からくる人を増やせれば、確実にかつ継続的にユーザーを増やすことが可能です。

ランキングや広告、サイト掲載といったものは大抵短期的なユーザー増加しか行えません。
しかし検索であれば競合アプリが次々と出てこない限りは安定してユーザーを獲得できます。
お金を掛けずに行えるので個人ディベロッパーとしては力を入れて対応すべき点です。

実際にどうすればよいのかというと、まずは説明文を増やしましょう。
5000字まで説明が入力できるので、この限界に近づくよう頑張って文章を書きます。
とは言うものの、タグの羅列やどっかから引っ張ってきた文章でいたずらに文量を増やすのでは良くないです。
最近の検索エンジンは賢いので、スパム的な行為は簡単に看破されてしまいます。
アプリの魅力を余すこと無く伝えられるよう説明しましょう。

それとアプリのタイトル、アイコンも重要です。
検索結果一覧画面は「タイトル」と「アイコン」しか表示されません。
この一覧に出た時いかにクリックしてもらえるかでユーザーの流入は大きく変わります。
一覧を見た人が思わず押したくなるよう魅力的なタイトル、アイコンで飾りましょう。
アプリ名より先に説明を持ってくるのもありです。

# 媒体掲載
法人格などがないとレビューの依頼などは出しづらいですが、
それでも個人作成のものでもアプリ紹介を行ってくれるサイトはあります。
掲載されると一時的ではありますが、相当数のユーザーを獲得することが出来ます。

## アンドロイダー
[みんなでつくるアプリ情報サイト アンドロイダー](https://androider.jp/)
登録制のAndroidアプリ情報サイト。
隊員登録をすることで、アンドロイダーサイト上にアプリを掲載できます。
セキュリティ上安全なアプリである事も証明してもらえるので、
登録するメリットは大きいです。
新規登録時や大幅アップデートの時などは都度Topに掲載
してもらえるので流入数をそこそこ稼げます。
あと人数限定でアプリ紹介動画を無料作成みたいなこともやってます。
ただ審査に若干時間がかかるのが難点…。

## AppC
[アプリ広告ネットワーク【appC cloud（アプシークラウド）】](https://app-c.net/)
アプリレビューサイトではなくて広告配信の会社なのですが、
AppCの広告をアプリに載せると無料でレビュー書いてもらえる特典があります。
Yahoo!マーケット、giveApp、エキサイトなどに掲載してもらえるのでお得です。
アプリに広告を導入する際は検討する価値有りです。

## 予約Top10
[予約トップ10 -新作のおすすめゲームやアプリの事前登録-](https://yoyaku-top10.jp/support)
リリース前のアプリを登録することで「予約」という形でユーザーを集めておくことが出来るサイトです。
ミニプランだと個人でも無料で予約登録が出来ます。
ゲーム系が多く予約として登録されてますが、ツール系アプリでも問題なく登録できます。
リリースのタイミングでユーザーに通知が行くので、リリース直後から多くのユーザーに使ってもらえます。
既にリリースしたアプリには利用できませんが、今後アプリを出す時には考えてみてください。

## アプリス
[アプリレビュー申請サービス【Applis（アプリス）】](http://applis.ne.jp/)
アプリのレビュー審査依頼を一括で請け負ってくれるサイト。
個人開発者でも申請可能な点はすごくいいのですが、いかんせん申請しても掲載してもらえる可能性は低いです。
一応紹介まで。


# ソーシャル(口コミ)活用
残る個人開発者が可能な施策としては、細々としたものになります。

一つはソーシャルメディアを活用するという方法です。
TwitterとかFacebookとかLineとかを活用してユーザーを広めます。
一番簡単なやり方としては｢このアプリを友達に紹介する｣ボタンをアプリ内においておくことです。
AndroidのShareインテントを飛ばして自分のアプリ名とDLリンクを拡散できるようにしましょう。
そうするとアプリを気に入ったユーザーが宣伝してくれたりしてくれなかったりします。

もうちょっと凝るのであれば、特定のアクションを達成する度にシェアできるようにしてみたりなんかもあります。
ゲームで言えばレベルアップやハイスコア更新などといったタイミングでシェア出来るようにします。
ツール系アプリでも組み込めるところがないか考えてみてください。

# セルフ相互集客
これも小手先のテクニックですが、自分のアプリ同士で相互に集客できるようリンクなどを設置します。  
お手軽に実装するなら
https://play.google.com/store/apps/developer?id=Pistatium&hl=ja
へのリンクをアプリにつけるだけです。(Pistatiumの部分は自分のディベロッパー名で置換)
こうすることでアプリに興味持ってくれたユーザーを別の自身のアプリに引き込めます。
あとで新規にアプリを作ってもこの実装ならメンテフリーです。

最近は広告SDKに自分のアプリを入れる機能がついているのも多いので、そちらを利用するのもよいでしょう。

# 宣伝
[放課後アプリ部 http://houkago-no.appspot.com/](http://houkago-no.appspot.com/)
個人ディベロッパーの宣伝するところがないなら作ってしまえ、
ということで個人アプリディベロッパー向けのサービスを作ってみました。
ディベロッパーが自身のアプリを登録する形式で集客することができます。
今後登録情報のAPI化なども考えています。
是非アプリ集客にご活用ください。
gcc4.8 インストール済み Ubuntu Docker イメージ


C++11 がすぐ使えるように gcc-4.8, g++4.8 インストール済み Ubuntu 12.04 Docker イメージ作りました. Enjoy!

https://index.docker.io/u/syoyo/ubuntu-gcc48/

## example

```
$ sudo docker pull syoyo/ubuntu-gcc48
$ sudo docker run -i -t syoyo/ubuntu-gcc48 /bin/bash
# g++ --version
# gcc --version
```
cheerioでスクレイピング

Nodejsでスクレイピングといえば、jsdomとかscrapperとか色々あると思うんですが、
今回はcheerioという早いとうわさのモジュールを使ってみます。

#必要なモジュールをインストール
```
npm install request cheerio
```

#プログラムを記述
```js
var request = require("request");
var cheerio = require("cheerio");

var requestUrl = "http://example.com";

request({url: requestUrl},function(error,response,body){
  // If request succeed
  if (!error && response.statusCode == 200) {
      $ = cheerio.load(body);      
      console.log($("title").text());
      
  }  // If error occured
  else {
      if (error) {
          console.log("Error:" + error );
      }
      
  }
});
```

#プログラムを実行
```
node app.js
```

該当ページのタイトルが取得できたはずです。