OmniAICreator/Qiita-1.07M huggingface dataset:
npm自体のバージョンを上げる



##`npm install`を実行しようとしたら怒られました。
最近 `gulp-imagemin`を利用しようとして、`npm install`を実行しようとしたら怒られました。


```
npm i --save-dev gulp-imagemin                                                                                                                            
npm WARN engine imagemin@3.0.0: wanted: {"node":">=0.10.0","npm":">=2.1.5"} (current: {"node":"0.10.33","npm":"1.4.28"})
```

お前のnpmは古い!と言われている感じですね。

##npm自体のアップデートをする必要があるみたい

まずは確認しましょう。

```
$ npm --version                                                                                                                                             
1.4.28
```

あげてみます。 `npm install -g npm`って不思議な感じしますね。npmでnpm自身をアップデート出来るんですね笑

```
$ npm install -g npm                                                                                                                                             
```

再度確認しました。 2.1.8にあがってますね。

```
$ npm --version                                                                                                                                             
2.1.8
```

##ひとりごと
それにしても、npmのアップデートってググラビティが良く無いですね。
`npm update`の使い方とかが検索されてしまうので汗

npm自身、npm自体...みんな何て検索するんだろう。
Parse.com

# Parse.com

* Cloud for apps
* Several services: Data, Push, Analytics...
* **Push:** Transaction initiated by the server (≠ Pull)
* Push SDK for iOS, Android, Windows and Windows Phone
* Easy integration _e.g._ iOS (after having added the dependencies)

        [Parse setApplicationId:@"xxxxx"
                      clientKey:@"xxxxx"];

in `application:didFinishLaunchingWithOptions:`

    // Register for Push Notitications, if running iOS 8
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
      UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert |
                                                      UIUserNotificationTypeBadge |
                                                      UIUserNotificationTypeSound);
      UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes
                                                                               categories:nil];
      [application registerUserNotificationSettings:settings];
      [application registerForRemoteNotifications];
    } else {
      // Register for Push Notifications before iOS 8
      [application registerForRemoteNotificationTypes:    (UIRemoteNotificationTypeBadge |
                                                       UIRemoteNotificationTypeAlert |
                                                       UIRemoteNotificationTypeSound)];
    }

in the App main delegate:

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
      // Store the deviceToken in the current installation and save it to Parse.
      PFInstallation *currentInstallation = [PFInstallation currentInstallation];
      [currentInstallation setDeviceTokenFromData:deviceToken];
      [currentInstallation saveInBackground];
    }
 
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
      [PFPush handlePush:userInfo];
    }

* Subscribing to a channel
    
        PFInstallation *currentInstallation = [PFInstallation currentInstallation];
         [currentInstallation addUniqueObject:[NSString stringWithFormat:@"participant_uuid_%@", userUuid] forKey:@"channels"];
         [currentInstallation saveInBackground];

* Sending a push
Several API : JavaScript, PHP, .NET (including Unity SDK), REST API.
example:

        curl -X POST -H "X-Parse-Application-xxxxx" -H "X-Parse-REST-API-xxxxx" -H "Content-Type:application/json" -H "Cache-Control:no-cache" -H "Postman-Token:89afd163-f1e6-ac87-1399-0c14250b1989" -d '{"where": {"channels": {...}}' https://api.parse.com/1/push
PHPUnit

# PHPUnit

## PHPUnitって何？
[PHPUnit](http://phpunit.de)はオープンソースのPHP用のユニットテストフレームワークです。
PHPでtest suiteを書いて、早く計画の自動的なテストを作ることが出来ます。

## テストの書き方
### テストのクラス
基本的なオブジェクトは`PHPUnit_Framework_TestCase`というクラス。テストをする時に、そのクラスの中にある名前が「test」で始まる関数（かんすう）は実行されられます。自分が使った基本的なクラスはこれです。

    class BaseTest extends PHPUnit_Framework_TestCase {
        //...
    }

### テストの関数
`PHPUnit_Framework_TestCase`は色んなテスト用関数（例えば`assertCount()`、`assertInstanceOf()`、`assertSame()`）がありますが、先の`BaseTest`クラスにある私はよく使った
`assertCorrectStates`という関数はこの二つを使用します。

    assertArrayHasKey(mixed $key, array $array[, string $message = ''])
この関数は`array`の配列（はいれつ）が`key`のキーを持てないと、`message`のエラーを表示します。

    assertEquals(mixed $expected, mixed $actual[, string $message = ''])
`expected`と`actual`は同じの確認します。
以下はその関数、全部で。

    protected function assertCorrectStates($correctStates) {
        $states = $this->game->getStatesLight($this->consumer_id);
        $diff = array_diff_assoc($states, $this->lastStates);
        $this->lastStates = $states;
        foreach($correctStates as $stateKey => $stateValue) {
            $this->assertArrayHasKey($stateKey, $diff);
            $this->assertEquals($diff[$stateKey]["count"], $stateValue);
        }
    }
そして、この関数はテスト毎で使います。例えば、`ExplorerTest`でそのテストがあります

    public function testOpenSchedule() {
        $this->game->sendStimulus($this->consumer_id, "access_schedule");
        usleep(STATUS_UPDATE_TIME);
        $this->assertCorrectStates(array(
            "rewards.open_schedule_lv1" => 1
        ));

        $this->game->sendStimulus($this->consumer_id, "access_schedule", 4);
        usleep(STATUS_UPDATE_TIME);
        $this->assertCorrectStates(array(
            "rewards.open_schedule_lv2" => 1,
            "missions.open_schedule" => 1
        ));
    }

### コマンドライン
コマンドはとても簡単です。パラメータはテストファイルのフォルダーが十分、例えば

    phpunit tests/
一つファイルだけでも出来ます

    phpunit tests/ExplorerTest.php
もちろん、色んなオプションがありますし、コンフィグファイルも使うことが出来ます

    phpunit -c phpunit.config tests/

### コンフィグファイル
    <phpunit
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        bootstrap="tests/init_tests.php">
    </phpunit>
このコンフィグファイルはすごく簡単です。`bootstrap`attributeはテストの前に実行されるファイルです。そのファイルでtest suiteの設定も出来ます。

## 出力（しゅつりょく）
    PHPUnit 4.3.0 by Sebastian Bergmann.

    ....................

    Time: 121 ms, Memory: 4.50Mb

    OK (20 tests, 39 assertions)
テストが20ですから点も20です。`.`は成功、`F`は「Failure」で`S`は「Skipped」です。
失敗の場合は、詳しくエラーメッセージが出ます。
fluentdのexec_filter Output PluginでPythonプログラムを使う


[exec_filter Output Plugin](http://docs.fluentd.org/ja/articles/out_exec_filter) (out_ecec_filter)は要するにフィルタ処理を任意のプログラムを使ってかませられる。例えば次の処理に不要なレコードを落したり、エラーとしてどこかに保存したり。ここでPythonプログラムを使ってみる。

## 設定

次の通りにしてみた。

```
<match hoge>
  type       exec_filter
  command    /path/to/python -m myapp.fluent_stream_filter

  time_key   time
  in_format  json
  out_format msgpack

  buffer_type file
  buffer_path /path/to/buffer
  buffer_chunk_limit 8m
  buffer_queue_limit 64
  flush_interval 10s

  tag        fuga
</match>
```

`command`でモジュールとして実行しているのは、importが上手く動作するようにするため。これならPYTHONPATH指定は不要。

ファイルバッファを使っているのは、コードを修正した時にfluendの再起動が必要なため。exec_filter Outputプラグインはexec Outputプラグインと違い、指定したスクリプトは起動後に標準入力の入力待ちとなる。

## スクリプト

exec_filter Output Pluginの要求として、スクリプトは標準入力を受けとり、標準出力に結果を吐かなければいけない。

```python:fluent_stream_filter.py
# coding=utf-8
"""
fluentdのout_exec_filterで呼ばれるコード

標準入力から1行ずつ処理を行ない、結果を標準出力に吐く
"""
import json
import logging
import logging.config
import sys
import traceback

import msgpack

logging.config.fileConfig('/path/to/logging.conf')
logger = logging.getLogger('fluent-exec')
logger.propagate = False

def main():
    stdin = sys.stdin
    output(convert(validate(parse(readline(stdin)))))

def readline(stdin):
    for line in stdin:
        yield line

def parse(lines):
    for line in lines:
        yield json.loads(line)

def validate(rows):
    """ エラーデータの除去 """
    for row in rows:
        try:
		     # なんらかの検査
        except Exception, e:
            logger.warn(e)
            logger.warn(row)
            continue
        yield row

def convert(rows):
    """ なんらかの変換処理 """
    for row in rows:
        # do something
        yield row

def output(rows):
	""" 標準出力に吐き出す """
    for row in rows:
        sys.stdout.write(msgpack.packb(row))

if __name__ == '__main__':
    logger.info('Start main')
    try:
        main()
    except Exception, e:
        logger.error(traceback.format_exc())
        raise e
    logger.info('End main')
```

logging.getLoggerには`__name__`を渡すのが常套だが、ここではスクリプト起動されるため内容は `'__main__'` である、なので文字列でロガーの名前を指定している。

## テストコード

標準入力を扱うメソッドはパラメータでstdioを受けとるようにすると良いかも。テストで標準入力をそのまま使う方法が見つからなかったのでStringIOのインスタンスを渡して、テストデータが読めるようにした。

```
# coding=utf-8
import types
from StringIO import StringIO

from nose.tools import ok_, eq_

from myapp import fluent_stream_filter


class TestAll(object):
    def test_readline(self):
        """ readlineのテスト、sys.stdinの代りにStringIOを渡す """
        stdin = StringIO()
        stdin.write(open('/path/to/test_data.log').read())
        stdin.seek(0)

        stream = fluent_stream_filter.readline(stdin)
        ok_(isinstance(stream, types.GeneratorType))
        eq_(stream.next(), u'{1行目の内容}')

    def test_parse(self):
        """ parse のテスト """
        stream = fluent_stream_filter.parse(iter(['{...}', '{...}']))
        ok_(isinstance(stream, types.GeneratorType))
        eq_(stream.next(), {...})
        eq_(stream.next(), {...})

    # (略)
```

## ログ出力での注意

標準出力に処理結果以外の、例えばログを吐き出してしまうと、当然MessagePackやJSONとしてパースできないのでfluentd側でエラーになる。rootロガーにConsoleHandlerがセットされていたりして意図せず標準出力にログを吐いてしまう事故を防ぐために

```
logger.propagate = False
```

しておくと安全
Rubyのソースコードに絵文字を16進数で書く方法

Rubyのソースコード中に絵文字を埋め込む時はどのようにすればよいでしょうか？
Ruby2.0以降であれば、デフォルトでutf-8になっていますので、そのまま埋め込む
こともできますが、エディタやツールが対応していない、規約上できない、などの
場合もあります。

このような場合、``\uXXXX``としてUnicodeコードポイントを指定します。
ただし、16bit以上のUnicodeの場合、``\u{XXXXX...}``として指定します。

また、一部のカラー絵文字は、白黒と同じUnicodeコードポイントですが、
"Variation Selector(U+FE0x)"を文字の後につけることで
カラーと白黒を切り替えることができます。
この場合、"\uFE0F"がカラー、"\uFE0F"が白黒です。

実際に試してみると、以下のようになります。(paiza.IOを使っているので、コードを変えて実行できます。)
https://paiza.io/projects/XdHPu2c7ii2rbp_7pJrPHQ

[![スクリーンショット 2014-11-21 午後6.12.12.png](https://qiita-image-store.s3.amazonaws.com/0/9152/32fbb9e9-6ea3-a681-bd4e-716f14194433.png)](https://paiza.io/projects/XdHPu2c7ii2rbp_7pJrPHQ)
IORefとState

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

IORefからStateに話を繋げられないかと考えています。

IORefとStateで変数を書き換える動作を模倣してみました。

```hs
import Data.IORef
import Control.Monad.State

test1 n = do
    a <- newIORef n
    if n == 1
        then writeIORef a $ n + 10
        else writeIORef a $ n + 1
    modifyIORef a (+ 5)
    readIORef a

test2 = execState $ do
    n <- get
    if n == 1
        then put $ n + 10
        else put $ n + 1
    modify (+ 5)

main = do
    print =<< test1 1
    print  $  test2 1
```
```text:実行結果
16
16
```

Stateは処理後に外せるのが便利だと思いました。

※ `unsafePerformIO`はナシです。
オススメのatomパッケージ７選

## [atom-runner](https://github.com/lsegal/atom-runner)
編集中のコードをショートカット一発で実行します。
saveさえ必要ありません。

例えば以下の様なpythonのコードを書き、
[test.py]というファイル名で保存したとします。

```test.py
str1 = "hello python"
print str1

```

通常はターミナルでこのファイルが置かれたディレクトリに移動して

```
python test.py
```

と入力することで実行します。つまり以下の工程が必要になります。

1. 編集中のコードをsaveする
1. アプリケーションをターミナルに切り替える
1. 上記のコマンドを入力する
1. 再編集するためにアプリケーションをエディタに切り替える


しかしatom runnnerを使えば**Ctrl+R**(または**Alt+R**)を押すだけで実行できます。

### キーバインド

- 実行: Ctrl+R (Alt+R on Win/Linux)
- 停止: Ctrl+Shift+C
- 実行ウインドウを閉じる: Esc

### 対応言語
デフォルトで対応している言語は以下の通りですが、'scopes'の中に[拡張子:コマンド]と設定を加えればなんでも動くと思います(未検証)

```coffeescript
'runner':
  'scopes':
    'coffee': 'coffee'
    'js': 'node'
    'ruby': 'ruby'
    'python': 'python'
    'go': 'go run'
    'shell': 'bash'
  'extensions':
    'spec.coffee': 'mocha'
```
![スクリーンショット 2014-11-21 16.01.22.png](https://qiita-image-store.s3.amazonaws.com/0/4784/ac01118d-0fe7-f186-5159-bdf6b7cb46b7.png)


※ スクリプト実行パッケージは他に[atom-script](https://github.com/rgbkrk/atom-script)という物がありますが、nodebrew経由でcoffee scriptを入れている私の環境では実行できませんでした。  


---

## [autocomplete-plus](https://github.com/saschagehlich/autocomplete-plus)
デフォルトで入っている[autocomplete]は[ctrl+space]で補完候補を表示できますが、これを入れたら自動で表示するようになります。

さらに[autocomplete-snippets](https://github.com/saschagehlich/autocomplete-snippets)を入れることでスニペットも補完候補に表示できるようになります。

---

## [open-recent](https://atom.io/packages/open-recent)

開いたことのあるプロジェクトを開くことができます。
同様のパッケージに[recent-files](https://atom.io/packages/recent-files)という物がありますが開発が止まっていて、それを引き継いだ形になっています。  
recent-filesは誤作動が多いのですがopen-recentはきちんと動きます。  
そして、プロジェクトごとではなくファイル単位で開くこともできます。
![](https://i.github-camo.com/9d1f9ea5daf862fd0797b23d9b2df4bc1116f03f/687474703a2f2f692e696d6775722e636f6d2f643979346941692e706e67)
## [japanese-wrap](https://github.com/raccy/japanese-wrap)
atomで自動折り返しを有効にするには[settings]-[Soft Wrap]にチェックを入れます。  
しかし日本語のような2バイト文字をatomで表示させようと思っても上手くいきません。
これは1バイト文字でも2バイト文字でも文字数で幅を決めてしまっている為です。  
このパッケージで解決できます。

画面を分割してmarkdownで日本語テキストを作成する時などは必須です。

---

## [line-jumper](https://github.com/benogle/line-jumper)

- alt(macではoption)キーと上下を押すと10行単位でカーソル移動できます。
- alt+Shift+上下を押すと10行単位で選択範囲を移動できます。  
- [setting]-[Number Of Lines]で移動する行数を変更できます。

![](https://camo.githubusercontent.com/84af716d9da695bd2cf499b5b4cb77a37b984006/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f36393136392f323237343535312f64623565613764362d396631642d313165332d393065372d6136366430653039613032632e676966)
---

## [file-icons](https://github.com/DanBrooker/file-icons)
ファイルのアイコンを変更できます。  
かわいい。
![](https://raw.githubusercontent.com/DanBrooker/file-icons/master/preview.png)

## [minimap](https://atom.io/packages/minimap)
sublimeTextでおなじみのアレです。  
単純に大きなスクロールバーとしても機能します。  
![](https://i.github-camo.com/bb671dcf7706c32eb432472c2cd69d354f824661/68747470733a2f2f6769746875622e636f6d2f61746f6d2d6d696e696d61702f6d696e696d61702f626c6f622f6d61737465722f7265736f75726365732f73637265656e73686f742e706e673f7261773d74727565)
Amazon EC2 の t2.medium についてのメモ

t2 は昼間や深夜などアクセスが少ない時間帯にCPUクレジットがたまり、夕方などのアクセスが多い時間帯にCPUクレジットを消費してCPUを使うことができるので、Web/Appサーバとして良さそうだということで、テスト運用してみました。

ところが、CPUのベースラインについて勘違いしていたため混乱したので、ここに記録として残しておきます。

## T2

Amazon EC2 には T2 タイプのインスタンスというものがあります。

> T2 インスタンスはベースラインレベルの CPU パフォーマンスを提供しながら、そのベースラインレベルを超えてバーストする機能を備えています。

## CPUクレジット

|タイプ|1 時間あたりに受け取る CPU クレジット|ベースラインパフォーマンス（CPU 使用率）|
|:--|:--|:--|
|t2.micro|6|10%
|t2.small|12|20%
|t2.medium|24|40%

ベースラインのCPUを使っていない場合、クレジットが溜まっていきます。CPUの使用量がベースラインを超えた場合は、クレジットを消費しますが、クレジットがある限りはCPUを使い続けることができます。

## t2.medium

t2.micro、t2.small は分かりやすいのですが、t2.medium はコアが2つなので、注意が必要です。

Linuxの CPU Usage だと、1コア100% で、2コアだと 200% が上限になっています。この換算でいうところの 40% がベースラインです。

ところが CloudWatch ではCPUコアの合計を 100% として表示されます。

Linux: 40% / 200%
CloudWatch: 20% / 100%

というようになります。

なので、CloudWatch で数値を見ていて 20% になると、ベースラインの 40% に達している状態となっています。

まだ 20% だから余裕がある……と思っていると、CPUクレジットを消費していってしまう状態となりました。

## 感想

Web/Appは波があるとはいえ、そこそこのアクセスは継続してあるので、うちの場合では t2 よりは c3 のほうがコストパフォーマンスは良いということで、いまは c3 を使っています。

定期的な重いバッチ処理を動かすサーバなど、短時間だけCPUを必要とするようなサーバでは t2 がよさそうだと思いました。

## 参照

- http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/t2-instances.html
- http://aws.amazon.com/jp/ec2/instance-types/
[Rails 4.x] assets:precompile すると active_admin のあたりでコケる際の対応

備忘録です。

```zsh
$ rake assets:precompile
```

すると下のようなエラーがでた。

```rb
rake aborted!
Sass::SyntaxError: Undefined mixin 'global-reset'.
  (in /app/vendor/bundle/ruby/2.1.0/bundler/gems/active_admin-8299dee5bd08/app/assets/stylesheets/active_admin/_base.css.scss:3)
```

いろいろやり方がありそうですが、とりあえずまず最初に思いつきそうな configをいじる をしてみます。

```rb
config.assets.precompile += [/^[a-z0-9]\w+.(css|js|woff|eot|svg|ttf)$/]
```

こんな感じにしたみたら、一旦コケることがなくなりました。
Ubuntu14.04にRubyの環境構築とか


#Rubyのインストール

こちらと内容はほぼ同じ
[CentOSにRuby on Railsの環境構築](http://qiita.com/ayihis@github/items/4e809244a4f666ac45bb)

とりあえず，gitとopensslのパッケージをインストール

```zsh
$ sudo apt-get install git libssl-dev
```
rbenvをダウンロード
rbenvはRubyのバージョンを管理してくれるやつです

```zsh
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

rbenvを使えるようにzshの設定ファイルを編集します
以下の内容を追記

```:.zshrc
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init - zsh)"
```
.zshrcを再読み込み

```zsh
$ source .zshrc
```

入ったかどうかバージョン確認

```zsh
$ rbenv -v
rbenv 0.4.0-129-g7e0e85b
```

Rubyをインストールしましょう．
とりあえず，どのバージョンをインストール可能なのかを確認してみます．

```zsh
$ rbenv install --list
```
この時の安定版が2.1.5だったのでそれをインストール
デフォルトで使用するバージョンもそれに設定

```zsh
$ rbenv install 2.1.5
$ rbenv rehash
$ rbenv global 2.1.5
```
確認

```zsh
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
```

#rbenvで2.2.0の入れようとするとビルドで失敗する？
<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/ayihis">@ayihis</a> <a href="http://t.co/EQ1F8L7l9a">http://t.co/EQ1F8L7l9a</a> このページにあるとおりにlibffi-dev入れたら入る説</p>&mdash; MOT (@programmerMOT) <a href="https://twitter.com/programmerMOT/status/560031329048199168">2015, 1月 27</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


MOTさんありがとうございます．これで入りました


#pryのインストール
標準でirbというREPLがついていますが，このpryというやつの方が便利らしいです．あっきーさんに教えてもらった．ありがとうございます．

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/ayihis">@ayihis</a> pryとbyebug使おう</p>&mdash; ATM (@aki017f) <a href="https://twitter.com/aki017f/status/536293656383066113">2014, 11月 22</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

##適応させたいRubyのバージョンを一旦削除する必要あり

```zsh
$ rbenv uninstall 2.1.5
rbenv: remove /home/ayihis/.rbenv/versions/2.1.5? y
$ sudo apt-get install libreadline-dev
$ rbenv install 2.1.5
Downloading ruby-2.1.5.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/4305cc6ceb094df55210d83548dcbeb5117d74eea25196a9b14fa268d354b100
Installing ruby-2.1.5...
Installed ruby-2.1.5 to /home/ayihis/.rbenv/versions/2.1.5
$ gem install pry pry-doc
$ rbenv rehash
```
これでおｋ

```zsh
$ pry
[1] pry(main)>
```
こんな感じで起動できるようになる．

参考
[Ubuntu14.04のrbenv環境でpryが実行できなかったので対処した](http://hatekun33.hatenablog.com/entry/2014/07/06/231002)
[Lua] CCPointで四則演算子を使う


Cocos2d-x Luaバインディングで、

```
local p = ccp(10, 20) + ccp(100, 200)
print(p.x, p.y)  -- 110  220
```

のようなことをする方法.


```
local ccpmt = getmetatable(ccp(0,0))
function ccpmt.__add(a, b)
  return ccp(a.x+b.x, a.y+b.y)
end
```

同じように、`__sub, __mul, __div, __len`あたりを定義すれば`-, *, /, #`を
CCPointに対して使えるようになる.

Cocos2d-x3の場合はccpをcc.pに.
Catalystでstashに値が格納されたときにログを出力する

大規模なCatalystアプリケーションでstashが入り乱れていたので作ってみた。
もしかしたらデバッグの役に立つかもしれない・・・

---

アプリケーションクラス(`${アプリケーションルート}/lib/{アプリケーション名}.pm`，`$c`)はCatalystクラスを継承しているので、
Catalystクラスのインスタンス変数stashのアクセッサaroundを加工することでstash書き込み時にログを出力したりできそう。

```pl:Catalyst.pm
around stash => sub {
    my $orig = shift;
    my $c = shift;
    my $stash = $orig->($c);
    if (@_) {
        my $new_stash = @_ > 1 ? {@_} : $_[0];
        croak('stash takes a hash or hashref') unless ref $new_stash;
        foreach my $key ( keys %$new_stash ) {
            $stash->{$key} = $new_stash->{$key};
        }
    }

    return $stash;
};
```

ゲッターもセッターも同じメソッドを使っているのな。てかこれ本体呼ばれてないよね！？( ﾟДﾟ )
引数の処理の仕方はなるほどだと思った。
うむ、やっぱりソースコードを読むと勉強になりますな。

そしてちょっと改造したのがこれ、

```pl:Catalyst.pm
use Data::Dumper;

around stash => sub {
    my $orig = shift;
    my $c = shift;
    my $stash = $orig->($c);
    if (@_) {
        my $new_stash = @_ > 1 ? {@_} : $_[0];
        croak('stash takes a hash or hashref') unless ref $new_stash;
        foreach my $key ( keys %$new_stash ) {
            $stash->{$key} = $new_stash->{$key};
            $c->log->debug( sprintf( "Stored \"%s\" to  \"%s\" in stash.", $new_stash->{ $key }, $key ) );
        }
    }

    return $stash;
};
```

でもこれだと`$c->stash( 'hogehoge', 'hugahuga' )`や`$c->stash( { hogehoge => 'hugahuga' } )`には対応できるけど、
`$c->stash->{ hogehoge } = 'hugahuga'`には対応できない。

caller関数を使えば何とかなると対応できると思うけどめんどいからやめた。
どうしてもログを出力したい人はハッシュに直書きしないでください。
include_contextしたときのlet, let!, beforeの評価とタイミング

```rb:test_spec.rb
shared_context 'shared_context_1' do
  let(:let_1_a) { puts "1 let a" }
  let!(:let_1_bb) { puts "1 let! bb" }
  before { puts "1 shared_context_1 before let_1_a: #{let_1_a}, let_x: #{let_x}, let_yy: #{let_yy}" }
  let!(:let_1_cc) { puts "1 let! cc" }
  let(:let_x) { "shared_context_1 x" }
  let!(:let_yy) { "shared_context_1 yy" }
end

shared_context 'shared_context_2' do
  include_context 'shared_context_1'
  let(:let_2_a) { puts "2 let a" }
  let!(:let_2_bb) { puts "2 let! bb" }
  before { puts "2 shared_context_2 before let_2_a: #{let_2_a}, let_x: #{let_x}, let_yy: #{let_yy}" }
  let!(:let_2_cc) { puts "2 let! cc" }
  let(:let_x) { "shared_context_2 x" }
  let!(:let_yy) { "shared_context_2 yy" }
end

shared_context 'shared_context_3' do
  include_context 'shared_context_2'
  let(:let_3_a) { puts "3 let a" }
  let!(:let_3_bb) { puts "3 let! bb" }
  before { puts "3 shared_context_3 before let_3_a: #{let_3_a}, let_x: #{let_x}, let_yy: #{let_yy}" }
  let!(:let_3_cc) { puts "3 let! cc" }
  let(:let_x) { "shared_context_3 x" }
  let!(:let_yy) { "shared_context_3 yy" }
end

describe '順序' do
  include_context 'shared_context_2'
  include_context 'shared_context_3'
  it do
    puts "let_x: #{let_x}"
  end
end
```

```:結果
1 let! bb
1 let a
1 shared_context_1 before let_1_a: , let_x: shared_context_3 x, let_yy: shared_context_3 yy
1 let! cc
2 let! bb
2 let a
2 shared_context_2 before let_2_a: , let_x: shared_context_3 x, let_yy: shared_context_3 yy
2 let! cc
1 shared_context_1 before let_1_a: , let_x: shared_context_3 x, let_yy: shared_context_3 yy
2 shared_context_2 before let_2_a: , let_x: shared_context_3 x, let_yy: shared_context_3 yy
3 let! bb
3 let a
3 shared_context_3 before let_3_a: , let_x: shared_context_3 x, let_yy: shared_context_3 yy
3 let! cc
let_x: shared_context_3 x
```
とりあえずのGitメモ

作業用にメモ。

#Gitコマンド#

##git pushしたモノを取り消したい時##

| Terminalコマンド                                 ||
|:---------------------------------|:--|
| cd / .....              |で対象のディレクトリまで入る|
| git status                        |でまず状況確認 |
| git log  |ログが確認できる。ここで確認できるlog番号を色々使う|
| git revert コミット番号                 |revertする|
| git commit -m'コメント'         |revertをcommitする|
| git push                           |(必要あれば ) |
| git pull                                       ||
| git log              |きちんと取り消されたか確認|
| git commit —amend        |直前のcommitメモを修正|






`git revert commit番号`でcommit番号のgit commitを取り消します。
あとは`git add --all` して `git pull` + `git push`でrevertをpushして完了。


`git checkout commit番号 ファイル名`　でファイルを復元。コミット番号を入れない場合は自分が作業する前の最新の状態で復元。

commit の コメントから出るときは`Ctrl + C`

http://feb19.jp/blog/archives/000226.php

esc + :wqでvimから出る

何はなくとも`git pull`から

`git pull` -> `git add --all` -> `git commit -m'コメント'` -> `git push`

-----
###差分チェック###

```
git diff コミット番号A コミット番号B
```

terminalには赤がA 緑がBで表示される

変更箇所が確認できる

-----
###コンフリクトした時###

git pullしたらコンフリクトしたからマージしてと言われた

```
error: Your local changes to the following files would be overwritten by merge:
	ディレクトリ名/ファイル名
Please, commit your changes or stash them before you can merge.
```

git pushしたい内容を一時的に作業場所から退避場所に退避
※git stashは一時退避エリアのこと

```
git stash save -u
```

git statusでちゃんと退避したかチェック

下記で退避場所に一時保存したファイルのリストが確認できる

```
git stash list
```

問題なければgit pull


pullした後に、一時退避させておいた中で、最新のモノを作業場所に戻す

```
git stash pop
```

これを行うとオートマージしてくれるかコンフリクトするか。
ここでコンフリクトしたらあとはhead>>>の目検確認。

今回はオートマージしたよと出たのでOK

```
Auto-merging ディレクトリ名/ファイル名
```

「Dropped refs~」が出たら、一時的によかしといたやつが無事に
マージできたので、一時退避のやつ消したよーとの意味
= 無事にマージ完了

```
Dropped refs/stash@{0} (.......)
```

※参考URL
transitive.info
http://transitive.info/article/git/command/stash/


無地にマージ完了したら、git statusで確認
問題なければadd → commit → push


git drop
stashを消したい時


####Terminalでのdiffの見方####
git diff --cached -w
「-」が更新前、「+」が更新後






------
###git addを取り消したい時###

git reset head
 indexをheadに合わせる

参考にしたURL
http://d.hatena.ne.jp/murank/20110327/1301224770
http://labs.timedia.co.jp/2011/02/git-various-undo.html

------
###git ignoreしたい時###

■ git 管理していないファイルを無視したい
.gitignore ファイルに追加
■既に git 管理しているファイルをあえて無視したい
無視する・・・
git update-index --assume-unchanged [ファイル名]
git update-index --skip-worktree [ファイル名]
もとに戻す・・・
git update-index --no-assume-u!nchanged [ファイル名]
git update-index --no-skip-worktree [ファイル名]
確認・・・
git ls-files -v

使用するのは--skip~のもの。対象のファイルをスキップしますよ、の意味。
元に戻したい時は--no-skipを使用する。

------


[Git]
場所のことをリポジトリ

大元をforkしていく

testサーバ上にあるローカルリポジトリ

自分のPCをローカルマシン
ローカルリポジトリ
リモートリポジトリを管理できるwebサービスがgit hub



gitで特定のファイルだけ前の状態に戻したいときのコマンド 
http://konbu13.hatenablog.com/entry/2014/12/01/070255

```
git l    gitをツリー構造で確認できる
```

※git log はpushしなくても、git commitしたら表示される。
git logにのってるけど反映されていない時はまずgit pushしてみる


#Git Hub#

###クローンの方法###
参考URL
http://qiita.com/masamitsu-konya/items/abb572337156e4d003cf

##2018年11月追記##

###Git:ファイルの差分抽出&zipで圧縮###
差分を正確にとってくれる+不要ファイル除外+ハッシュで好きな箇所からとれる。
SourceTree用ではなく、node.jsのmodle。
bashから実行コマンド、差分+除外ファイルリスト一覧がtable表示で確認できる。
今のところ、これが唯一正確。ありがたいです。
https://blog.wadackel.me/2016/git-diff-archive/
Rails consoleでActionMailerを使ってメールを送信テストする方法

Rails consoleをbin/rails cとかで起動して1行で決める


```ruby
ActionMailer::Base.mail(to: "to@example.com", from: "from@example.jp", subject: "題名", body: "本文").deliver_now
```

------

余談

メール送信周りのバグの発生原因の切り分けなんかで使えるはず。とりあえずメールが送信できたよねとか
letter_opener_web( https://github.com/fgrehm/letter_opener_web )を利用してみたら、うまくうごかなかったために調べてる。Ruby2.1.4に上げたらうまく動いてない気がする
fluentdを使ったオブジェクトストレージへのログ転送


[こちら](http://www.idcf.jp/blog/storage/log_fluentd/)を参考にさせていただきました。
ありがとうございました。

## fluent-dのインストール
インストールスクリプト1発です。

`curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh`

この段階で、fluent-plugin-s3もインストールされてることが確認できます。

```
# /usr/lib64/fluent/ruby/bin/fluent-gem list | grep s3
fluent-plugin-s3 (0.4.1)
```

2014/11/21現在ではバージョン0.4.1がインストールされていますが、
このバージョンだとオブジェクトストレージ側のRiakが対応していない(とサポートの方に伺いました）らしいです。
※ 今後は対応されるのかもしれません。

そのため、プラグインをアンインストールし、動作確認がとれているバージョンをインストールし直します。

## fluent-plugin-s3の再インストール

バージョン0.4.1をアンインストールします。

`/usr/lib64/fluent/ruby/bin/fluent-gem uninstall fluent-plugin-s3`

そして、バージョン0.3.4をインストールします。

`# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-s3 --version "= 0.3.4" --no-rdoc --no-ri`

## その他設定
td-agent.confは参考ページのまま使用させていただきました。
ディレクトリ権限設定も同じにしています。

```
# mkdir /var/log/fluent
# chown td-agent:td-agent /var/log/fluent
# mkdir /tmp/td-agent
# chown td-agent:td-agent /tmp/td-agent/
# chown root:td-agent /var/log/httpd
# chmod 750 /var/log/httpd/
```

`service td-agent start`でtd-agentのプロセスが上がる事を確認したら、もうaccess_logの転送が可能になっています。
簡単ですね。
AngularJS BootstrapUIを利用したFilterSelect

[AngularJS Advent Calendar 2014](http://www.adventar.org/calendars/350) の2日目の記事です。

*この記事はAngularJS初心者が、AngularJSへの理解を深めるために書いた記事です。*

## 概要
ある案件で、入力したデータからマスタデータを検索し入力補完するような、テキストボックスとセレクトボックスが一体となったDirectiveを作成する機会があったのでここにサンプルとして紹介します。

※vtFilterSelectイメージ
![スクリーンショット 2014-11-19 18.39.12.png](https://qiita-image-store.s3.amazonaws.com/0/59710/5b0e6245-114e-d92b-e4ec-25362bc5235c.png)

## 必要なライブラリ（推奨バージョン）
AngularJS：1.2.6
JQuery：1.11.1
JQuery UI：1.11.0
Bootstrap：3.1.1
AngularJS Bootstrap UI：0.11.0

`※ 前後のバージョンでも動作するかもしれませんがテストしていないので保証致しません。`

## プロジェクトとデモ
[Github](https://github.com/reflexworks/vtFilterSelect)
[Demo](http://jsfiddle.net/takeyama/an70xd6d/10/)

## 使い方
以下のオプションを用意しています。

````lang:view.html
  <vt-filter-select ng-model="inputData" ng-selected-items="inputList" ng-selected-callback="selectedEvent()" ng-is-error="inputError"></vt-filter-select>
```

* ng-model: 入力参照オブジェクト
* ng-selected-items: 一覧オブジェクト
* ng-is-error: エラーフラグ
* ng-selected-callback: 一覧選択後のイベントのコールバック

セレクトボックスと同じように一覧データを用意します。それを`ng-selected-items`にセットします。


````lang:controller.js
  $scope.inputList = [
    {name: 'hoge'},
    {name: 'foo'},
    {name: 'bar'}
  ];
```
　

テキストボックスに文字を入力すると`ng-selected-items`のデータから部分一致でフィルタリングします。
![スクリーンショット 2014-11-21 14.22.24.png](https://qiita-image-store.s3.amazonaws.com/0/59710/447110f3-e789-500e-b702-6fda24a415d0.png)
　

フィルタリングしたデータをクリックすることでテキストボックスに補完します。
テキストボックスに入力したデータを取得する場合は`ng-model`を参照します。
![スクリーンショット 2014-11-21 14.23.10.png](https://qiita-image-store.s3.amazonaws.com/0/59710/1221bc4b-8408-6755-dd84-89e212235b36.png)



補完後に何かイベントを起こしたい場合は、`ng-selected-callback`にfunction関数を設定します。

```lang:controller.js
  $scope.selectedEvent = function(){
      // 選択後のイベント処理
      alert('選択完了');
  }
```

　

エラーフラグはformで使用する場合に役立ちます。
バリデーションエラーの場合、間違っているvtFilterSelectのエラーフラグを`true`にすることで赤く表示できます。

```lang:controller.js
  $scope.inputError = true;
```

![スクリーンショット 2014-11-21 14.32.34.png](https://qiita-image-store.s3.amazonaws.com/0/59710/69005d70-3c6b-1b23-e557-bcfb501b4e1f.png)


## お知らせ
12月10日（水）19:30からセミナーを開催します。
[AngularJSとReflexWorksで始めるSPA開発 ～もうサーバー側で悩まなくて大丈夫～](http://acrovision.connpass.com/event/9957/)
AngularJSを利用したサーバー通信の方法等、興味持たれた方は是非気軽にご参加ください。
【Android】EclipseでAPKファイルエクスポート時に「The zipalign tool was not found in the SDK.」と表示されたときの対応

####現象
以前リリースしたAndroidアプリをアップデートするため、久しぶりにEclipseで署名付きアプリケーション・パッケージのエクスポートを実行したとき、Export Wizard が以下の警告メッセージを表示される

>The zipalign tool was not found in the SDK.

>Please update to the latest SDK and re-export your application or run zipalign manually.

>Aligning applications allows Android to use application resources more efficiently.


一応APKファイルは生成されていたが、気になったのでこの対応について記載



####対処方法
Android SDKマネージャーから、Android SDK build-tools の最新版 (Rev 21.1.1)をダウンロードしたら、警告メッセージが表示されなくなりました。

 - 「latest SDK」と書かれていたので、てっきりAndroid SDK Toolsのことだと思ってました…


####参考
zipalignについて
http://developer.android.com/tools/help/zipalign.html
【Android】Android SDK バージョン23にアップデート後、Eclipse起動時に"This Android SDK requires ADT version 23.0.0 or above."と表示される件の対応


####現象
ひさしぶりにAndroidアプリをアップデートする機会があって、Android SDK をバージョン23にアップデートしたところ、Eclipse起動時に、下記メッセージが表示される
> This Android SDK requires ADT version 23.0.0 or above.
> Current version is 22.2.1.v201309180102-833290.
> Please update ADT to the latest version.


####対処方法
1. Eclipseの[ヘルプ] - [新規ソフトウェアのインストール...]メニューを選択
2. インストール画面の「すでにインストールされている」リンクをクリックし、インストール済みのソフトウェア一覧を表示
3. インストール済みのソフトウェア一覧から、下記ソフトウェア（Android開発ツール バージョン22）をアンインストール後、一覧画面を閉じる
 - Android DDMS
 - Android 開発ツール
 - Android 階層ビューアー
 - Android ネイティブ開発ツール
 - Android トレースビュー
 - OpenGL ES 用トレーサー
4. インストール画面の「追加」ボタンをクリックし、下記URLを追加
 - 名前：Android Plugin
 - ロケーション：https://dl-ssl.google.com/android/eclipse/
5. 表示される開発ツール（バージョン23）以下をすべて選択後、「次へ」ボタンをクリックし、ウィザードに従ってインストールを実行
6. インストール完了後Eclipseを再起動する

ポイントは、インストール済みの開発ツール（バージョン22）一旦アンインストールする必要があること
【Flow】グローバル変数エラー（Unknown global name）を黙らせる

# はじめに

参考：[Checking third-party code](http://flowtype.org/docs/third-party.html#_)

* 勉強がてら書いていたら、いつの間にか７割ネタになっていた。
* [Underscore.js](http://underscorejs.org/)などサードパーティライブラリに立ちはだかるグローバルの壁
* 諸々の問題に対してFlowでは `Interface Files` という機能をサポートしている。

# Unknown global name

```js:logic.js
/* @flow */

_.findWhere([{ title: 'A', text: 'B' }, { title: 'C', text: 'D' }], { title: 'C' });


_.each([1, 2, 3], function(v){
  console.log('test:', v);
});
```

例えば上のようなコードをチェックさせると引っかかる。

```shell-session:error
logic.js: identifier _ Unknown global name
```

# 公式の見解

これに対して公式は
> **fortunately** we **only** need to tell Flow about the parts of the library we're using.

（実際に使う部分だけ `interfaces/` とか適当なディレクトリを掘って自分で書いてね）

などと宣っている。（要は以下のように書けと）

```js:interfaces/underscore.js
declare class UnderscoreStatic {
  findWhere<T>(list: Array<T>, properties: {}): T;
  each(list: Array, iteratee: Function): void;
}

declare var _: UnderscoreStatic;
```

# 支配欲求の強い貴方へ

* 手で１行ずつ書いていくのは骨がバキボキに折れる。（何か方法があるのかも？）
* 「既存コードをとにかく手っ取り早く `flow check` したい」という ~~愚かな~~ 願望があるなら `any` を使う手があるかもしれない。

```js:interfaces/underscore.js
// 「何でもいいからとにかく黙らせる。」
declare var _: any;
```

ちなみに `any` 型については

> 己のコードが絶対にtype correctであるという自信をお持ちならば、anyによってエラーを黙らせることが出来ます。

というような説明が[公式](http://flowtype.org/docs/base-types.html#any)にあります。

# おわりに
#### 型定義ファイルっぽい奴はいつ来るんですか。
Memcachedで特定キーのキャッシュ有効期限を取得する


kobitoのテストも兼ねて自分用にメモ。
かなり泥臭いけど。telnetでやるよりまし。

1. slabidの一覧を取得


	```
$ echo 'stats slabs' | nc {host} 11211
```
・・・
STAT 16:free_chunks 20
STAT 16:free_chunks_end 0
**STAT 17:chunk_size 4224**
STAT 17:chunks_per_page 248
STAT 17:total_pages 413
STAT 17:total_chunks 102424
STAT 17:used_chunks 93741
STAT 17:free_chunks 8683
STAT 17:free_chunks_end 0
STAT 18:chunk_size 5280
STAT 18:chunks_per_page 198
・・・

2. chunk_sizeを目安にslabidを決定し、item数を取得


	```
$ echo 'stats items' | nc {host} 11211 | grep "17:"
```
**STAT items:17:number 93798**
STAT items:17:age 614253
STAT items:17:evicted 75076
STAT items:17:outofmemory 0


3. slab内のキー一覧からキーをgrep

	```
$ echo 'stats cachedump 17 93798' | nc {host} 11211 | grep "{key_name}"
```
ITEM {key_name} [キャッシュサイズ b; キャッシュ有効期限 s]
\# 見つからなかった場合キャッシュキーが見つかるまでslabidを変えて2〜3を繰り返す

4. キャッシュ有効期限は unix timestamp 形式なので

	```
$ date -d @unix_timestamp
```
これで人間にもわかる表示になる

**注意）consistent hashingで複数サーバにキャッシュしてる場合、一台ずつしらみつぶしにやらないといけないのでかなりしんどい**
JavaScript ハッシュを取得する

以下の様なURLに付与されたハッシュ(#hoge)を取得する

http://example.com/#hoge

```js
location.hash
```

```js
if(location.hash=="#hoge"){

  // #hogeの場合
  alert(true)

} else {

  // #hoge以外の場合
  alert(false)

}
```
Ionic Frameworkを試す


# インストール

```npm install -g generator-ionic```

# 雛形生成

サンプルを試すためのフォルダ(ionic-test)を作って移動し、yeomanで雛形のアプリケーションを作成する

```yo ionic test```

今回はCordovaプラグインは全て外し、Tabsのサンプルアプリを選択。

# 動作確認
```grunt serve```すればブラウザが起動してサンプルアプリの動作を確認できる

# タブ追加
SampleFormというタブを追加するために./ionic-test/www/scripts内のapp.jsに以下を追加

```javascript:www/scripts/app.js
.state('tab.sampleform', {
  url: '/sampleform',
  views: {
    'tab-sampleform': {
      templateUrl: 'templates/sampleform.html',
      controller: 'SampleformCtrl'
    }
  }
})
```

次に./ionic-test/www/scripts/controllers.jsに書きを追加

```javascript:www/scripts/controllers.js
.controller('SampleformCtrl', function($scope){
})
```

次にテンプレートファイルを作る。入力フォームのサンプルを作りたいけど、今回はまずタブだけを追加するのでpタグだけを表示させる。

```html:www/templates/tab-sampleform.html
<ion-view title="Sampleform">
  <ion-content class="has-header padding">
    <p>Sampleform test</p>
  </ion-content>
</ion-view> 
```


最後に./ionic-test/www/templates/tabs.htmlに書きを追加

```html:www/templates/tab.html
  <!-- About Tab -->
  <ion-tab title="Sampleform" icon="icon ion-edit" href="#/tab/sampleform">
    <ion-nav-view name="tab-sampleform"></ion-nav-view>
  </ion-tab>
```

これで新しいタブが表示される。これから入力フォームを作る予定。


# 疑問
一旦 ```grunt serve``` をとめてもう一度 ```grunt serve``` をはしらせると何故かアプリケーションが初期化されて作ったファイルが消えてしまうので調査中。

自己解決
Gruntfile.jsの128行目をコメントアウトすることで解決した。

```javascript:Gruntfile.js
// Empties folders to start fresh
clean: {
  dist: {
    files: [{
      dot: true,
      src: [
        '.tmp',
        // 'www/*',  ←ここをコメントアウト
        '!www/.git*'
      ]
    }]
  },
  server: '.tmp'
},
```
QWebViewの通信を覗き見る


プロキシを使用せずQWebViewの通信を覗き見る方法を記載。
PyQt5を使っているがC++等でも大きくは違わないはず。

試行錯誤の結果なので改善点あれば指摘ください。

## `QNetworkAccessManager`を継承する

```py3
# コード例
class MyNetworkAccessManager(QNetworkAccessManager):
    def __init__(self, parent):
        super(NetworkAccessManager, self).__init__(parent)
        self.reply_content = {}
# 以下後述
```

`self.reply_content`は受信内容の保持に使用

`QWebPage.setNetworkAccessManager()`で上記クラスを`QWebPage`に設定する

```py3
# コード例
nm = MyNetworkAccessManager()

web_view = QWebView()
web_view.page().setNetworkAccessManager(nm)
```

これで`web_view`の通信は`MyNetworkAccessManager`経由で行われることになる。

## 送信を覗き見る

`QNetworkAccessManager.createRequest()`をオーバーライドして送信を覗き見る。

```py3
# コード例
class MyNetworkAccessManager(QNetworkAccessManager):
    # __init__は省略

    def createRequest(self, op, req, outgoing_data = None):
        if outgoing_data is not None:
            content = str(outgoing_data.peek(1024*1024), encoding='utf-8'))

        reply = super(MyNetworkAccessManager, self).createRequest(op, req, outgoing_data)
        reply.readyRead.connect(self.on_ready_read)
        reply.finished.connect(self.on_finished)
        self.reply_content[reply] = ''
        return reply
```

`content`に送信内容が入る。ただしGETやHEADの場合は空。

`outgoing_data`は`QIODevice`だが、`bytesAvailable()`等のメソッドが軒並み0を返してくるので固定値で`peek()`を呼んでいる。
`peek()`はバイト列を返す。ここではエンコーディングをutf-8固定で文字列にしているが、状況に合わせて適当に。

あと受信内容取得のために`readyRead`,`finished`シグナルを`connect`している。

## 受信を覗き見る

```py3
# コード例
class MyNetworkAccessManager(QNetworkAccessManager):
    # __init__, createRequest 省略

    def _get_content(self, reply):
        content = str(reply.peek(reply.bytesAvailable()), encoding='utf-8')
        self.reply_content[reply] += content

    @pyqtSlot()
    def on_ready_read(self):
        reply = self.sender()
        self._get_content(reply)

    @pyqtSlot()
    def on_finished(self):
        reply = self.sender()
        self._get_content(reply)

        content = self.reply_content[reply]

        del self.reply_content[reply]

```

`readyRead`シグナルの度`peek()`でデータを取り出し辞書に保持。`finished`シグナルで辞書からデータ全体を取得している。

`_get_content()`もutf-8決め打ちしてあるが、状況に合わせて適当に。
MySQL: Index作成によるパフォーマンス比較

MySQL等のデータベースではIndexを作成するとパフォーマンスが改善されますが、実際にどの程度改善されるか確認してみました。

結果はこちらです。 (paiza.IOなので、値を変えながら実行できます。)
https://paiza.io/projects/ePtur9puw0er0O53bvts4g
[![スクリーンショット 2014-11-21 午後0.17.44.png](https://qiita-image-store.s3.amazonaws.com/0/9152/54487d18-3b52-c91c-ab7d-f8f540bcf6e2.png)](https://paiza.io/projects/ePtur9puw0er0O53bvts4g)


4097件しか作成していないのに、6.1msから0.3msに20倍の改善です！
この程度の件数でも結構改善されますね。
ただ、index作成に16msかかっているので、この場合、16ms/(6.1-0.3)msで3件以上
検索すると元が取れるとわかります。
KAGOYAのVPSにOpenPNEでSNSを設置する

今更感はありますが、KAGOYAのVSPにOpenPNEを設置してみました。
CentOS系の解説は沢山出てくるのですが、ubuntuだとapacheの仕様が少し違ったりして意外に大変でした。
なんかマズいところなんかがありましたらご指摘頂けると嬉しいです。

#１，インスタンスを作成し立ち上げる

KAGOYA　VPSコントロールパネルからインスタンスを作成し立ち上げる。
この時に、作った秘密鍵を指定する必要があり、ログイン時にその秘密鍵を使ってログインすることになる。
また、今回はUbuntuのLAMPセットを使用する。（phpとかmysqlとかプリインストールでとても便利）
 
#２，ユーザを登録し、Rootをdisableする

    0.adduserでユーザを作成(仮にsns_exとする)(usraddはホームディレクトリが作成されないため使ってはならぬ)
    1.パスワードを設定
    2.apt-get update
    3.apt-get install apt-utils　(apt-get 系のユーティリティをインストール)
    4.apt-get update　（接続先等をアップデート）
    5.apt-get install sudo　（sudo　をインストール（入ってない））
    6.apt-get install nano　（テキストエディタnanoをインストール、vim派の方やemacs派の方はそちらをご利用ください）
    7.sudo gpasswd -a ユーザー名 sudo　でユーザをsudoグループに追加する
    8.apt-get install ufw (iptablesを変更するフロントエンドソフト)　（ここまでやってスナップショット拾得しておくと良い）
    9.sudo nano /etc/ssh/sshd_config port を22から変更
    10.sudo nano /etc/ssh/sshd_config で、PermitRootLogin noに設定
    11.sudo nano /etc/ssh/sshd_config　で、PasswordAuthentication を有効に（もしくは、秘密鍵と公開鍵を作成するなどする）
    12.sudo /etc/init.d/ssh restart　でリスタート
    13.sudo ufw enable　（有効化）
    14.sudo ufw default DENY　（一旦全部のポートを閉じる）
    15.sudo ufw allow 変更したポート番号　（sshのポートをallowする）
    16.sudo apt-get install unzip

#3，OpenPNEをインストールし、pacheの設定をする

    1.http://www.omnioo.com/record/sns/open-pne_cms/ こちらを大変参考にさせて頂きました！
    2.さっき作ったユーザでログインする。
    3.wget https://codeload.github.com/openpne/OpenPNE3/legacy.zip/OpenPNE-3.8.13　で、ファイルを取得
    4.apt-get install unzip で、unzipをインストール
    5. mkdir /var/sns　でvarにsnsというフォルダを作成
    6.mv openPne~~~~ sns　でフォルダ名を変更
    7.mv sns /var/www/　でフォルダをwww以下に設置
    8.cd /etc/apache2/sites-available　に移動して、sudo cp 000-default.conf sns.conf　で設定ファイルをコピー
    9.sudo nano sns.conf　でDocumentRootを /var/www/sns/web　に変更、さらに 
    <Directory /var/www/sns/web>
    AllowOverride All
    </Directory>
    を挿入。(これをしないとリライトが有効にならない！)
    10.sudo a2dissite 000-default.conf　でapacheのディフォルトページを無効にした後、sudo a2ensite.conf　でさっきの設定を有効にする。

    11.  $ cd OpenPNE3
    12.  $ cp config/ProjectConfiguration.class.php.sample config/ProjectConfiguration.class.php
    13.  $ cp config/OpenPNE.yml.sample config/OpenPNE.yml
    ↑設定ファイルをコピー
    14.sudo nano OpenPNE.yml で OpenPNE.ymlを編集（ドメインやメールアドレスを入力）
    15.mysql -u root -p で mysqlにログインし、権限を持ったユーザを作成する。
    16.CREATE DATABASE `sns` DEFAULT CHARACTER SET utf8; でsnsという名前のデータベースを作成
    17.cd /var/www/sns　で作業フォルダに戻り、　php symfony openpne:install --internet　でインストール開始。
    18.途中色々聞かれるので、データベースの管理者や、その他諸々を設定。
    19./var/www/sns/web/.htaccess　の、リライトベースのコメントアウトを外す。
    20.sudo /etc/init.d/apache2 restartでapacheをリスタート
    ip/pc_backend.php　にアクセスすると、とりあえず管理画面に入れる。
    ipにアクセスすると、普通のログイン画面。
    　sns@example.com
    　password
で、（プラグインがまだ入っていないのでプロフィールくらいしか公開出来ないけど）、とりあえずログイン可能。
Laravel 4 で、MySQL への接続セッションでタイムゾーンを設定する


`Carbon` インスタンスから offset を取得して、それを PDO オプションで渡す。

* app/config/database.php

```php
<?php
use Carbon\Carbon;

$timezoneOffset = sprintf('+%02d:00', Carbon::now()->getOffset() / 3600);

return [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => 'localhost',
            'database' => 'database',
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'options'   => [
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET SESSION time_zone = \'' . $timezoneOffset . '\''
            ],
        ],
    ],
];

```
SublimeLinter-contrib-clangが上手くいかなくなった。


#概要
今まで使えていたSublimeLinter-clangが使えなくなった。おそらく原因はyosemiteにアップデートしたからだと思う。根本的な解決はできてないが応急処置は出来たからメモしておく。詳しい人おしえてください。

#症状
今まで使えていたのに、久しぶりに開くとヘッダーファイルが見つからないと言われる。
![スクリーンショット 2014-11-21 11.35.18.png](https://qiita-image-store.s3.amazonaws.com/0/34727/ce2a2ec7-1253-258d-31a4-ea95d590b1a2.png "スクリーンショット 2014-11-21 11.35.18.png")
![スクリーンショット 2014-11-21 11.35.35.png](https://qiita-image-store.s3.amazonaws.com/0/34727/b6a2b490-f6dd-b30b-b83e-c40150a128af.png "スクリーンショット 2014-11-21 11.35.35.png")

terminalからgccやclangでコンパイルは出来る。
さらに、友人に聞いてみると自分のmacだとyosemiteでも問題なく動くらしい。
**なぜ！！**

#原因模索
とりあえず、sublimelinterをデバッグモードにしてみる。
(コマンドパレットからSublimelinter:Enable Debug Modeから出来る)
コンソールで以下のオプションでlinterが実行していることが分かる。

![スクリーンショット 2014-11-21 11.44.45.png](https://qiita-image-store.s3.amazonaws.com/0/34727/9d4db1b3-c92f-870e-965d-f9ac0383ad8d.png "スクリーンショット 2014-11-21 11.44.45.png")
(c++になっているのは気にしないでください。)

terminalから同じオプションで実行してみると同じエラーが出た。
オプションを削ってやってみると、

```terminal
# % clang -cc1 test.c
test.c:1:10: fatal error: 'stdio.h' file not found
#include "stdio.h"
         ^
1 error generated.
```
なので```-cc1```オプションが問題なのでは無いかと思う。

#解決策模索

まず```-cc1```オプションに関する資料を探してみたが見つからなかった。(探し方が悪いのか...)

次にpackage>SublimeLinter-contrib-clang>linter.pyに書いてある実行ファイルを変更してみる。

```linter.py
base_cmd = (
        'clang -cc1 -fsyntax-only '
        '-fno-caret-diagnostics -fcxx-exceptions -Wall '
    )
```
となっているところを

```linter.py
base_cmd = (
        'clang -fsyntax-only '
        '-fno-caret-diagnostics -fcxx-exceptions -Wall '
    )
```
としてみる。
そうするとsublimeLinter自体動いかなくなったorz

#応急処置
結局includeディレクトリの場所が上手くいってないってことなんでしょ(キレ気味)
てことでSublimeLinterのinclude_dirsに明示してみるとうまくいった。

SublimeLinter.sublime-settings-Usersで

```
"linters": {
	"clang": {
		"@disable": false,
		"args": [],
		"excludes": [],
		"extra_flags": "",
		"include_dirs": [
		"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include",
		"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
		"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include",
		"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks"
		]
	}
}
```

include_dirsは以下の方法で確かめられる。

```
clang -v test.c &> ./test.log
```

これで見てみると確かに```-cc1```をつけるとincludeパスが違うんだよな。なんでなんだろう。

ああ、それにしてもなんか嫌だな。この解決方法...
【はじめに】ボタンを3等分で並べるぞ


iPhone6/iPhone6Plusが出てきて、iOSにも解像度の違いを吸収してアプリを作る必要が出てきました。

もちろん、iPhone3GSからiPhone4になるときに今までもありましたが、基本的には縦に長くなる程度だったので、さほど難しくはありませんでした。Androidみたいに多くの機種があるわけでもありませんでしたし。。

iPhone6が発売され、いざ触ってみると、、対応してないアプリは拡大してしまうではありませんか。。気にならない人もいるようですが、僕は非常に気になってました。情報量が圧倒的に違いますし、ぼやっとした表示が嫌いというのもあります。

さて、ここで弱りました。

やりたいのは、これ。
左からiPhone5、iPhone6、iPhone6Plusのstoryboardの大きさです。

![3buttons.png](https://qiita-image-store.s3.amazonaws.com/0/4664/ca769022-ad89-657e-a40b-9c8d891e9af2.png "3buttons.png")

Appleのドキュメントを読むと、autolayoutでの制約設定を使えとあるので、とりあえず読みながらいじってみるのだが、

https://developer.apple.com/jp/devcenter/ios/library/documentation/AutolayoutPG.pdf

思ったようにならずで、ひとまず、ここまで。
Yahoo!ローカルサーチAPIのgid指定について

Yahoo!ローカルサーチAPIで想定している施設名が１番目に出ないため
Yhaooロコの結果から直接gidを探してパラメーターに入れることで
１件だけ表示させようと思っています。

そこで以下の例の様にやってみたのですが、上記でコールしても、ロコにはあるのですが
該当する結果が返ってきません。どうしてでしょうか？

例）築地場外市場
http://loco.yahoo.co.jp/place/g-5zQIsRlrTYk/

◆APIコール
http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/localSearch?appid=＜APIのID＞&query=%E7%AF%89%E5%9C%B0%E5%A0%B4%E5%A4%96%E5%B8%82%E5%A0%B4&sort=hybrid&gid=5zQIsRlrTYk

または、「築地場外市場」の情報をピンポイントで１カ所得るためにはgidを指定する以外に
方法がありますでしょうか？
CentOS7のAMIから起動したインスタンスのホスト名を固定にする


自分用のメモです。
個人の開発環境にAWS Marketplaceで配布されている[CentOS7（x86_64）のAMI](https://aws.amazon.com/marketplace/pp/B00O7WM7QW/ref=sp_mpg_product_title?ie=UTF8&sr=0-10)を使っているのだけど、このAMIから起動したEC2インスタンスは初回起動時やその後の再起動時にホスト名が自動セットされようになっている。
セットされるホスト名はEC2によくある感じのものです。

```bash
$ hostname
ip-10-0-0-4.ap-northeast-1.compute.internal
```

/etc/hostnameや/etc/sysconfig/networkを手動で書き換えても、再起動したら自動セットされるホスト名に戻ってしまいます。
hostnameの自動セットはcloud-initでやってるようなので、以下のように/etc/cloud/cloud.cfgにあるupdate_hostnameをコメント化しつつ、/etc/hostnameにホスト名を入力してあげれば良いです。
そうすると再起動した後もホスト名が固定化されます。


```bash
$ sudo vim /etc/cloud/cloud.cfg
 14 cloud_init_modules:
 15  - migrator
 16  - bootcmd
 17  - write-files
 18  - growpart
 19  - resizefs
 20  - set_hostname
 21  # - update_hostname
 22  - update_etc_hosts
 23  - rsyslog
 24  - users-groups
 25  - ssh

$ sudo /etc/hostname
$ sudo reboot
````

今日も1日お仕事頑張って下さい。
[CentOS 6.6] インストール覚書

注意）諸事情により32bit環境です。64bitの場合は、i386 → x86_64 と読み替えてください


## ISOのダウンロード

* 好きなミラーサイトをご利用ください
ftp://ftp.iij.ad.jp/pub/linux/centos/6.6/isos/i386/CentOS-6.6-i386-netinstall.iso


## ネットインストール

http://ftp.iij.ad.jp/pub/linux/centos/6.6/os/i386

を指定。
images/install.imgを探しに行きます。

## インストール後

ランレベル3でインストールしたので、デスクトップ環境をインストール。

デスクトップ環境を整えるには

```
# yum groupinstall "X Window System"
# yum groupinstall "Desktop"
# yum groupinstall "General Purpose Desktop"

# startx

# vi /etc/inittab
- id:3:initdefault:
+ id:5:initdefault:

# shutdown -r now
```


## パーティションサイズの変更

[CentOS 6 インストール後の LVM サイズ変更方法](http://blog.fenrir-inc.com/jp/2013/04/centos-6-lvm.html)


## デスクトップの日本語入力切替

```shell-session
# yum install ibus anthy
```

## DHCP - static の切り替え

[CentOSにてDHCPを固定IP(v4)に、またその逆にしたい場合の設定ファイルと設定項目](http://etcsysconfig.hatenadiary.jp/entry/2013/03/16/182529)

## IPv6 無効化
[IPv6を無効化 〜 CentOS6](http://easyramble.com/disable-ipv6.html)


## yum epel

http://ftp-srv2.kddilabs.jp/Linux/packages/fedora/epel/6/i386/repoview/epel-release.html


## yum remi

http://rpms.famillecollet.com/enterprise/6/
http://remi.kazukioishi.net/enterprise/remi-release-6.rpm


## yum MySQL

http://dev.mysql.com/downloads/repo/yum/

mysqld 起動前に mysql_install_db を行うと
mysqld が起動できなくなる

そういうときは、/var/lib/mysql をいったん削除し

```
# service mysqld start
# mysql_secure_installation
```
ゴルーチン(1)

goroutine に手を出してみる。


```go
func main() {
  go func() {
    println("hogehoge")
  }
}
```
これはシンタックスエラーになる。
javascript等のように無名関数を実行せずに渡す書き方ではない。deferと同じ。
なので、

```go
func main() {
  go func() {
     println("hogehoge")
  }()
}
```
としないといけない。無名関数の最後に **()** が必要。
シンタックスエラーはなくなるが、このままでは標準出力への出力がされずにプロセスが終了してしまう。

channelを使って待たせてみればOK

```go
fumc main() {
  ch := make(chan string)
  defer close(ch)
  go func() {
    ch <- "hogehoge"
  }()
  println(<-ch)
}

```

あれ、これでいいのか?
そもそもgoroutine で標準出力に出したかったのに、処理自体の意味合いが変わってしまっている感じがする。

sync.WaitGroup を使ってみよう。

```go
import "sync"

func main() {
  wg := &sync.WaitGroup{}
  wg.Add(1)
  go func() {
    println("hogehoge")
    wg.Done()
  }()
  wg.Wait()
}

```
goroutine 側で標準出力に出したかった目的を達成できた。
保持したい側で wg.Addして、処理する側で wg.Doneする。
sync.WaitGroup 以外と簡単かも。