OmniAICreator/Qiita-1.07M huggingface dataset:
高階関数を使ってパラメータ設定可能なエフェクタをつくる

以前書いた [サンプルに惑わされるな！KnockoutでUIエフェクトを使う際のベター・プラクティス](http://qiita.com/sukobuto/items/9fc4bdc3463f13bdc00c) という記事で、エフェクタを View 側のコードとして定義する方法をおすすめしました。

```js:たとえばこんなの
window.effects = (function($) {
    var root = {}
      , list = root.list = {}
      ;
    list.fadeIn = function(elm) {
        $(elm).hide().fadeIn();
    };
    list.fadeOut = function(elm) {
        $(elm).fadeOut(300, function() { $(elm).remove() });
    };
    return root;
})(jQuery);
```

今回はそのエフェクタの、もうすこし突き進めた作り方を書いてみます。

## 高階関数とは

いかにも難しそうな名前ですが、単なる「関数を返却する関数」のことです。

```js:高階関数
function example() {
    return function() {
        alert("example!");
    }
}

var e = example();
e(); // -> example!
```

## 高階関数でパラメータを扱う

内側の返却される関数で受け取る引数と、外側の高階関数で受け取る引数はそれぞれ使い道があります。

### 返却される関数の引数

つまり関数の実行時の引数です →`param`

```js:
function example() {
    return function(param) {
        alert(param);
    }
}

var e = example();
e("KnockoutJS"); // -> KnockoutJS
e("VueJS");      // -> VueJS
```

### 高階関数の引数

関数を生成するときに決定される引数です →`param1`

```js:
function example(param1) {
    return function(param2) {
        alert(param1 + param2);
    }
}

var e = example("hello "); // ここで決定
e("KnockoutJS"); // -> hello KnockoutJS
e("VueJS");      // -> hello VueJS
```

## エフェクタへ応用

高階関数を使って、以下のフェードエフェクトのスピードをバインド時に設定できるようにしてみましょう。

```js:Before
window.effects = (function($) {
    var root = {}
      , list = root.list = {}
      ;
    list.fadeIn = function(elm) {
        $(elm).hide().fadeIn();
    };
    list.fadeOut = function(elm) {
        $(elm).fadeOut(300, function() { $(elm).remove() });
    };
    return root;
})(jQuery);
```

↓↓↓

```js:After
window.effects = (function($) {
    var root = {}
      , list = root.list = {}
      ;
    list.fadeIn = function(duration) {
        return function(elm) {
            $(elm).hide().fadeIn(duration);
        };
    };
    list.fadeOut = function(duration) {
        return function(elm) {
            $(elm).fadeOut(duration, function() { $(elm).remove() });
        };
    };
    return root;
})(jQuery);
```

duration という引数を受け取る高階関数に変更しました。
これをバインドするとき、以下のように引数を指定します。

```html:View
<ul data-bind="foreach: {
                   data: items,
                   afterAdd: effects.list.fadeIn(200),
                   beforeRemove: effects.list.fadeOut(600) }">
    <li data-bind="text: $data"></li>
</ul>
```

上記の例では、リストにアイテムが追加されると200ミリ秒でフェードイン、
アイテムが削除されると600ミリ秒かけてフェードアウトします。

つまり、**「View でバインドするときに決定されるパラメータ」**を設けるために**高階関数**というものを使いました。`effects.list.fadeIn(200)` を実行すると、`duration` が `200` に決定されたエフェクタ関数が返却されます。その返却されたエフェクタ関数が `afterAdd` としてバインドされる、という寸法です。

フェード以外のエフェクタを実装する際にもいろいろと応用が利きますし、[コンバータを実装する](http://slide.sukobuto.com/article/ko-svg#/6) 際にも使えます。
hubot の github系のスクリプトをgithub enterprise で使う 

github系のスクリプトっていうのはhubot-scriptで出てくるこういう
github-issue-link.coffee, github-issues.coffee, github-commits.coffee, github-pulls, [など](https://github.com/github/hubot-scripts/search?l=coffeescript&q=%22github%22&type=Code)。
api のURLとかがgithub.comのと微妙に違ってはまった。

まずTOKENの作成はgithub enterpriseのドメインにapi/v3をつけたURLで行う（[参考](https://developer.github.com/v3/enterprise/) ）。

```bash
$ curl -i http://yourdomain/api/v3/authorizations -d '{"scopes":["repo"], "note":"説明を書いてね"}' -u "yourid"
{
  "id": 1005,
  "url": "http://yourdomain/api/v3/authorizations/1",
  "app": {
    "name": "test (API)",
    "url": "https://developer.github.com/enterprise/2.0/v3/oauth_authorizations/",
    "client_id": "00000000000000000000"
  },
  "token": "!!これがトークン!!",
  "note": "test",
  "note_url": null,
  "created_at": "2015-01-30T04:18:54Z",
  "updated_at": "2015-01-30T04:18:54Z",
  "scopes": [
    "repo"
  ]
}
```

返ってきたJSONのtokenをコピっとく。

HUBOTには以下の環境変数をセットする。

```bash
HUBOT_GITHUB_TOKEN="ここに返ってきたトークンを書いてね" 
HUBOT_GITHUB_API="http://yourdomain/api/v3"
```
MiddlemanでSlimを使う方法

========

Middlemanで[Slim](http://slim-lang.com/)をテンプレートとして使うときは、`Gemfile`で'slim'を指定すればいいようです。

```:Gemfile
gem 'slim'
```

```
$ bundle install
$ bundle exec middleman build
```

これで、

```
source/
  hogehoge.slim
```

から

```
build/
  hogehoge.html
```

が生成されます。

### バージョン

- middleman 3.3.3
- tilt 1.4.1
elastic4s を試す

Elasticsearch 用のscala バインディングを探していて、[elastic4s](https://github.com/sksamuel/elastic4s) 触った記録。

[他にもあるが](http://www.elasticsearch.org/guide/en/elasticsearch/client/community/current/clients.html#community-scala) このなかであげられてる中では一番☆が多かった。


試す
---

build.sbt にこれだけ書いてsbt console起動。

```scala
libraryDependencies ++= Seq(
  "com.sksamuel.elastic4s" %% "elastic4s" % "1.2.1.2"
)
```

まずパッケージをインポート

```scala
scala> import com.sksamuel.elastic4s.ElasticClient
import com.sksamuel.elastic4s.ElasticClient

scala> import com.sksamuel.elastic4s.ElasticDsl._
import com.sksamuel.elastic4s.ElasticDsl._
```

てか、そもそもElasticsearchが動いてないじゃんってことでdocker repoから適当なのを取ってくる、

```
$ docker pull dockerfile/elasticsearch
...
$ docker run -d -p 9200:9200 -p 9300:9300 dockerfile/elasticsearch
```
はい。

sbt consoleに戻ってESとつなげる。

```scala
scala > val cl = Elaticsearch.local
cl: com.sksamuel.elastic4s.ElasticClient = com.sksamuel.elastic4s.ElasticClient@619fc958
// val cl = Elaticsearch.remote("remote", 9300) // リモートの場合
```

インデックスの作成

```scala
scala> cl.execute{ create index "tweets" }
res0: scala.concurrent.Future[org.elasticsearch.action.admin.indices.create.CreateIndexResponse] = scala.concurrent.impl.Promise$DefaultPromise@16f91928
```

見て分かる通り全部Futureで返ってくる。

インデックス

```scala
scala> val f =cl.execute{ index into "tweets" fields ("text"->"helloworld","user"->"iwag")  }
f: scala.concurrent.Future[org.elasticsearch.action.index.IndexResponse] = scala.concurrent.impl.Promise$DefaultPromise@26ae2063
```

サーチ

```scala
scala> val f =cl.execute{ search in "tweets" }
f: scala.concurrent.Future[org.elasticsearch.action.search.SearchResponse] = scala.concurrent.impl.Promise$DefaultPromise@3ade8076
```

サーチ返ってくるのがESのJavaなSearchResponseでだるい。

```
scala> f.value.get.get
res1: org.elasticsearch.action.search.SearchResponse =
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 7,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "tweets",
      "_type" : "test",
      "_id" : "KGWbDEY7Q66PFDnDeFmdpA",
      "_score" : 1.0,
      "_source":{"text":"hello world","user":"iwag"}
    }
  }
}
```
[Objective-C] UITableViewCell内のUIWebViewの高さを動的に反映させる


色々と記事を探してみたものの、これだ！ という記事が見つかりませんでした。
とりあえず色々試行錯誤して実装してみたもののメモを残しておきます。

ちなみに今回作ったサンプルは[GitHubで公開](https://github.com/edom18/TableViewWebViewTest)しています。

## UITableViewCellへの参照をどうするか

一番最初に試したのは、`tableView:heightForRowAtIndexPath:`デリゲートメソッド内で、`tableView:cellForRowAtIndexPath:`を呼び出して`UITableViewCell`への参照を得、その後に内包している`UIWebView`の高さを取得する、というものです。
*（ちなみに高さ自体は、JavaScriptを実行して動的に取得するようにしました）*

**そのときのサンプルコード**

```objc
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
	WebViewCell *cell = (WebViewCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath];
}
```

しかしこうするとなぜか`UIWebView`で指定したURLのコンテンツが読み込まれず、デリゲートも呼ばれない状態になってしまいました。（textLabelなどは設定される）
おそらく、`dequeueReusableCellWithIdentifier:`メソッドを実行するタイミングでなにかしらおかしくなっていたんだと思います。（このあたりはまだ知識不足でなにか勘違いしている可能性大）


## UIWebViewの参照を別で管理

上記の理由から、セルを生成・再利用するタイミングで`UIWebView`がキャッシュにあるかを確認し、なければ生成するようにしました。
また、セル内に保持している`UIWebView`を`removeFromSuperview`してから再度`addSubview:`して設定しなおしました。

**上記を踏まえたコードが以下**

```objc
// セルの生成
- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.textLabel.text = self.data[indexPath.row][@"title"];
    }
    
    NSString *uniqueKey = [NSString stringWithFormat:@"cellId-%ld-%ld", indexPath.section, indexPath.row];
    UIWebView *webView  = self.cache[uniqueKey];
    if (!webView) {
        webView = [[UIWebView alloc] initWithFrame:cell.contentView.bounds];
        webView.tag      = 200;
        webView.delegate = self;
        webView.scrollView.scrollEnabled = NO;
        NSURL *url = [NSURL URLWithString:self.data[indexPath.row][@"url"]];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [webView loadRequest:request];
        self.cache[uniqueKey] = webView;
    }
    
    UIView *oldWebView = [cell.contentView viewWithTag:200];
    if (oldWebView) {
        [oldWebView removeFromSuperview];
    }
    [cell.contentView addSubview:webView];
    [self updateCell:cell];
    
    return cell;
}

// セルの高さ計算
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *uniqueKey = [NSString stringWithFormat:@"cellId-%ld-%ld", indexPath.section, indexPath.row];
    UIWebView *webView  = self.cache[uniqueKey];
    if (!webView) {
        return 44;
    }
    return [self cellHeightForWebView:webView];
}
```

ちなみに今回、`UIWebView`に表示するためのコンテンツは、[ランダムで高さを調整するだけのコンテンツ](http://bl.ocks.org/edom18/raw/c4922ac0e91516e67374/)を用意して読み込ませました。

とりあえず簡単なサンプルでは問題なく動いていますが、とりあえず動かす、というところまでやった状態なのでパフォーマンス的に問題があるかは分かりません・・。
Berkshelf3 | ~/.berkshelf と BERKSHELF_PATH

# Berkshelf3 | ~/.berkshelf と BERKSHELF_PATH
## 概要
~/.berkshelf と BERKSHELF_PATH について。

## Cookbookの保存場所
berks installの実行時、 Cookbook はデフォルトで *~/.berkshelf* に保存されます。
この保存場所は *BERKSHELF_PATH* を設定することで変更することが可能です。

各 Cookbook は *cookbook名-verion* の命名規則に基づいたディレクトリに保存されています。

## berks shelf コマンドとの関係
berks shelf コマンドで参照する Cookbook の `berks shelf list` や `berks shelf uninstall` の対象は
この *~/.berkshelf* 以下の内容になります。

## 参照
[berks shelf](http://qiita.com/tbpgr/items/6ed973da1a76286427e6)

## 公式リファレンス
http://berkshelf.com/

## Berkshelf まとめ記事URL
http://qiita.com/tbpgr/items/dc44e5ad0e01cc962a89
Berkshelf3 | berks help

# Berkshelf3 | berks help
## 概要
*berks help* で Berkshelf のヘルプを一覧表示します。
*berks help command* で、個別のコマンドのヘルプを表示します。

## ヘルプの一覧

~~~bash
$ berks help
Commands:
  berks apply ENVIRONMENT     # Apply version locks from Berksfile.lock to a Chef environment
  berks contingent COOKBOOK   # List all cookbooks that depend on the given cookbook in your Berksfile
  berks cookbook NAME [PATH]  # Create a skeleton for a new cookbook
  berks help [COMMAND]        # Describe available commands or one specific command
  berks info [COOKBOOK]       # Display name, author, copyright, and dependency information about a cookbook
  berks init [PATH]           # Initialize Berkshelf in the given directory
  berks install               # Install the cookbooks specified in the Berksfile
  berks list                  # List cookbooks and their dependencies specified by your Berksfile
  berks outdated [COOKBOOKS]  # List dependencies that have new versions available that satisfy their constraints
  berks package [PATH]        # Vendor and archive the dependencies of a Berksfile
  berks search NAME           # Search the remote source for cookbooks matching the partial name
  berks shelf SUBCOMMAND      # Interact with the cookbook store
  berks show [COOKBOOK]       # Display the path to a cookbook on disk
  berks update [COOKBOOKS]    # Update the cookbooks (and dependencies) specified in the Berksfile
  berks upload [COOKBOOKS]    # Upload the cookbook specified in the Berksfile to the Chef Server
  berks vendor [PATH]         # Vendor the cookbooks specified by the Berksfile into a directory
  berks version               # Display version
  berks viz                   # Visualize the dependency graph

Options:
  -c, [--config=PATH]    # Path to Berkshelf configuration to use.
  -F, [--format=FORMAT]  # Output format to use.
                         # Default: human
  -q, [--quiet]          # Silence all informational output.
  -d, [--debug]          # Output debug information
~~~

## 任意のコマンドのヘルプ

~~~bash
$ berks help vendor
Usage:
  berks vendor [PATH]

Options:
  -e, [--except=one two three]  # Exclude cookbooks that are in these groups.
  -o, [--only=one two three]    # Only cookbooks that are in these groups.
  -b, [--berksfile=PATH]        # Path to a Berksfile to operate off of.
  -c, [--config=PATH]           # Path to Berkshelf configuration to use.
  -F, [--format=FORMAT]         # Output format to use.
                                # Default: human
  -q, [--quiet]                 # Silence all informational output.
  -d, [--debug]                 # Output debug information

Vendor the cookbooks specified by the Berksfile into a directory
~~~

## 公式リファレンス
http://berkshelf.com/

## Berkshelf まとめ記事URL
http://qiita.com/tbpgr/items/dc44e5ad0e01cc962a89
RuboCop | Style/SpaceBeforeBlockBraces

# RuboCop | Style/SpaceBeforeBlockBraces

## 概要

RuboCopの「Style/SpaceBeforeBlockBraces」警告について。

ブロック呼び出しに利用するメソッド名とブレースの間に半角スペースを必要とするかどうかをチェックする。
デフォルトでは半角スペースが必要。

## SpaceBeforeBlockBraces

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|EnforcedStyle|space|半角スペースが必要|○|
|EnforcedStyle|no_space|半角スペースが不要|--|

### 検証プログラム

~~~ruby:space_before_block_braces.rb
print [*1..5].each { |e|puts e }
print [*1..5].each{ |e|puts e }
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
SpaceBeforeBlockBraces:
  EnforcedStyle: space
~~~

~~~bash
$ rubocop space_before_block_braces.rb
Inspecting 1 file
C

Offenses:

space_before_block_braces.rb:2:19: C: Space missing to the left of {.
print [*1..5].each{ |e|puts e }
                  ^

1 file inspected, 1 offense detected
~~~

### 実行結果 no_space に設定した場合

~~~yaml:.rubocop.yml
SpaceBeforeBlockBraces:
  EnforcedStyle: no_space
  SupportedStyles:
~~~

~~~bash
$ rubocop space_before_block_braces.rb
Inspecting 1 file
C

Offenses:

space_before_block_braces.rb:1:19: C: Space detected to the left of {.
print [*1..5].each { |e|puts e }
                  ^

1 file inspected, 1 offense detected
~~~

## 対象コード

https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/space_before_block_braces.rb
https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/space_before_block_braces_spec.rb

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
DateTime::getTimestamp()すると日付が変わる件

```php
<?php
	$date = new DateTime('2014/01/01 00:00:00', new DateTimeZone('Asia/Tokyo'));
	$date->modify('first day of -1 second');
	
	var_dump($date->format('Y-m-d H:i:s')); // 2013-12-31 23:59:59
	var_dump($date->getTimestamp()); // 1385909999 → 2013-12-01 23:59:59
	var_dump($date->format('Y-m-d H:i:s')); // 2013-12-01 23:59:59
```

何故か日付が変わっています。
なんだこれ。

更に深刻なことにはDateTimeImmutableでも発生します。

```php
<?php
	$date = new DateTimeImmutable('2014/01/01 00:00:00');
	$date2 = $date->modify('first day of -1 second');
	var_dump($date2->format('Y-m-d H:i:s')); // 2013-12-31 23:59:59
	var_dump($date2->getTimestamp()); // 1385909999 → 2013-12-01 23:59:59
	var_dump($date2->format('Y-m-d H:i:s')); // 2013-12-01 23:59:59
```

あかんこれ。

ポイントは`'first day of -1 second'`と複数の変更を一気に指定するところです。

```php
	$date->modify('first day of');
	$date->modify('-1 second');
```
と分けて記述すると何故か発生しません。

また`'-1 minute'`や`'-1 hour'`では発生しますが`'-1 day'`や`'+1 second'`は正常に計算されます。
`'first Saturday of next month -1 second'`や`'Monday next week -1 second'`などでも発生しません。
`'first day'`や`'last day'`と一日以下のマイナス計算が入っているとバグる模様。

[カレンダー](http://qiita.com/rana_kualu/items/4c7c883d01e9d5ca43d9)を作ったときに見つけたのですが、意味がわからなかったので放置していたところ、先日[バグレポート](https://bugs.php.net/bug.php?id=67634)が上がっていました。
せっかくだから報告でもしてみればよかったかな。

このバグは、PHP5.6RC2の時点ではまだ修正されていません。
[DateTime関連](https://bugs.php.net/search.php?cmd=display&order_by=id&direction=DESC&limit=30&package_name[]=Date%2Ftime+related)は何気にバグやバグだかなんだかわからない挙動があったりするので、使うときは気をつけないといけませんね。
nagiosのアラート通知をTwitterにしてみる

仕事で使うにはメールのほうが便利ですが、自分で使うとなるとメールよりTwitterに通知してくれたほうが便利です。 (わたしが張り付きすぎているだけ?)

幸いなことにnagiosではそこら辺も柔軟に変えられるのでPythonでスクリプトをつくってみました。

コードとしては以下です。コンシューマキーなどは適宜書き換えてください。
また、外部のライブラリとしてtweepyをつかっているのでそちらも各自導入してください。

```python
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import tweepy
from tweepy import Stream, TweepError
import logging
import urllib
import datetime
import locale

nowTime = datetime.datetime.today()

CONSUMER_KEY = '*************'
CONSUMER_SECRET = '*************'
ACCESS_TOKEN = '*************'
ACCESS_TOKEN_SECRET = '*************'


auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

 api = tweepy.API(auth_handler=auth, api_root='/1.1', secure=True)

api.pdate_status(sys.argv[1] + nowTime.strftime("%x %X"))
sys.exit(0)
```

なぜ時間を追加しているのかというと、
Twitterの仕様上同じツイートを短期間にツイートできないようなのでその対策です。
それ以外は基本的にふつーなTwitter投稿スクリプトですね。

さて次にこのスクリプトをサーバに配置します。
わたしは/usr/local/nagios/libexecに配置しました。
パーミションを755にするのを忘れずに。

つぎにnagiosのコマンドを定義しているファイルに通知コマンドを定義していきます。
適当にメール通知のを参考にして以下のような感じのを書きます。

    define command{
                command_name    host-notify-by-twitter
                command_line    /home/admin/tweet.py "$contactemail $host $hoststate$ alert for $hostname$!"
    }

    define command{
                command_name    notify-by-twitter
               command_line     $USER1$/tweet.py "@$CONTACTEMAIL$ ** $NOTIFICATIONTYPE$ alert - $HOSTALIAS$ / $SERVICEDESC$ is $SERVICESTATE$ **"
    }

あとはコンタクトの定義に以下を設定してあげればTwitterに通知が飛ぶようになります。
あとはemailのところを通知したいユーザIDにしてください

        service_notification_commands   notify-by-twitter
        host_notification_commands      host-notify-by-twitter

今回はTwitterでしたが設定を見てわかるように任意のプログラムを設定できるので、チャットに飛ばすとかそんなふうにしてみるのもありかもしれません。
directiveで$parse使うときのメモ

いつも忘れるので。

----

directive側から`$bar`に値を突っ込みたい。

```html
<foo on-click="aaaaa($bar)"></foo>
```

`$parse`を以下のように使う。

```js
angular.module('hoge', []).directive('foo', function($parse) {
  return {
    restrict: 'E',
    template: '<div ng-click="_onClick()">click me!</div>',
    scope: {onClick: '&'},
    link: function($scope, $element, $attrs) {
      if (!$attrs.onClick) return;
      // $parseして
      var getter = $parse($attrs.onClick);
      
      $scope._onClick = function() {
        // contextsに親スコープ入れてlocalsに$barを突っ込む
        getter($scope.$parent, {$bar: 'bar'});
      };
    }
  };
}):

```

## 参考

[AngularJS: API: $parse](https://docs.angularjs.org/api/ng/service/$parse)
Rubinius でのデバッグ

ただのメモ。rubinius では pry-nav や byebug は動かないが、専用のデバッガがあるのでをそれを利用できる。

Gemfile に rubinius-debugger を追加


```ruby
platforms :rbx do
  gem 'rubinius-debugger'
end
```

あとはブレークポイントを貼りたい箇所に

```rb
require 'rubinius/debugger'
Rubinius::Debugger.start
```

とか書けばそこで止まるので、n で次の行に進んだり p 変数 で変数の値を表示したり、list で周辺のコードを表示したりできる。help でコマンドを見れる。


```
debug> help
                help: Show information about debugger commands
       b, break, brk: Set a breakpoint at a point in a method
    tb, tbreak, tbrk: Set a temporary breakpoint
           d, delete: Delete a breakpoint
             n, next: Move to the next line or conditional branch
             s, step: Step into next method call or to next line
           ni, nexti: Move to the next bytecode instruction
            f, frame: Make a specific frame in the call stack the current frame
   c, cont, continue: Continue running the target thread
       bt, backtrace: Show the current call stack
             p, eval: Run code in the current context
    dis, disassemble: Show the bytecode for the current method
             i, info: Show information about things
                 set: Set a debugger config variable
                show: Display the value of a variable or variables
```
awscliのs3 syncコマンドを使ってAmazon S3にデータをバックアップ


AWSのサービスをコンソールから操作するための、awscliというツールがあります。
このツールのコマンドの一つ、`aws s3 sync`を使うと、rsyncのようにファイルをS3にバックアップできます。
バックアップしたファイルは`aws s3 sync`で復元することも可能です。
 
この記事はバックアップ先となるS3のBucketを作るところから、`aws s3 sync`を使ってバックアップするまでの手順を説明します。

## プライベートBucket作る

Amazon Management ConsoleのS3管理ページから、Create Bucketを選ぶ。


![S3 Management Console.png](https://qiita-image-store.s3.amazonaws.com/0/529/613d2459-f169-99c9-7225-0aa309e3759a.png "S3 Management Console.png")

好きな名前を入力してCreate
![S3 Management Console-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/529/9a6737a9-978a-2b79-010a-fc13ba8ebe8b.jpeg "S3 Management Console-2.jpg")

Bucketは、デフォルトでは非公開になってて、Bucketを作ったユーザのみがアクセスできるようになってる。

## IAMにバックアップ用ユーザ作る

Amazon Management ConsoleのIAM管理ページから、ユーザを追加する。
![IAM Management Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/529/09172224-0d1b-ebde-2683-d61610d7bc38.jpeg "IAM Management Console.jpg")


ユーザのアクセスキーは、アカウントを作った時しかダウンロード出来ない。情報を控えておくこと。
次に作成したユーザに、Bucketにアップロードする権限を付与する。バックアップに使うだけなので、指定したBucket以外にはアクセスできないように制限する。
ユーザの一覧画面で、作ったユーザを選択し、画面下のPermissionsタブを開いて、Attach User Policyボタンをクリック。
開いたダイアログのPolicy Generatorにチェックして、Selectボタンをクリックしてポリシー作成画面に進む。以下の権限を付与。
![IAM Management Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/529/9f1618a6-ea08-1a90-cc37-f2140f714233.jpeg "IAM Management Console.jpg")

* AWS ServiceからAmazon S3を選択
* ActionsからAll Actions(*) をクリックしてから、DeleteBucket, DeleteBucketPolicy, DeleteBucketWebsite を削除。
* Amazon Resource Nameに、arn:aws:s3:::[バケット名] , arn:aws:s3:::[バケット名]/* をセット。continueするとpolicyのxmlが見れるので、Resourceにこの2つがセットされてることを確認する。
* Add Statementを押して権限付与

## awscliをインストール
`pip install awscli` 実行すればインストールできる。pythonインストールされてればたぶんpipコマンドが使える。
その後、`aws configure` を実行して、access_keyを設定する。

ここまでできたら設定、権限が正しくセットされているか、`aws s3 ls` コマンドを使って検証してみる。

* `aws s3 ls s3://[Bucket名]/` を実行。エラーが起きないことを確認する。(バケットを操作できる権限の確認)
* `aws s3 ls` を実行。AccessDeniedになることを確認する。(他のバケットは見れないことの確認)

## aws s3 sync を使ってバックアップする

バックアップの実行は簡単で、
```aws s3 sync /path/to/backup/ s3://[Bucket名]/```
を実行すれば、/path/to/backup/ ディレクトリ以下のファイルをすべてバックアップしてくれる。

## S3にあるデータをローカルにダウンロードするとき

aws s3 sync の引数を逆にすれば、S3にバックアップしたデータをローカルにダウンロードできる。

```aws s3 sync s3://[Bucket名]/ /path/to/sync/```


以上です。
vagrantでCakePHPのプロジェクトいじろうとしたらハマった


synced_folder : /vagrant => ~/Documents/workspace/

で設定して、この下にcakeProjectフォルダー設置。

IP : 192.168.33.14で、/vagrantをDocumentRootに設定。

そして、mac側から192.168.33.14/cakeProjectへアクセス

「やったー！プロジェクト作成成功！」

の文字に浮かれたのも束の間。

某チュートリアルに従ってscaffoldを行うも...

404ErrorをApache側で吐かれる。

Apache「そんなファイルねーよ」とのこと。

どうやらRoutingが聞いておらず、そのままのディレクトリを見ているらしい。

※通常、/Proj/Tasks/とやれば、TaskModel,TasksControllerでScaffoldされて
TasksControllerのIndexが呼ばれるのだが、馬鹿なことにディレクトリをそのまま見ており、
/Proj/Tasksのフォルダを探していた


というわけでやったこと。

<font color="red">

httpd.conf内で、DocumentRootのディレクトリにたいして、AllowOverride Allを設定。
</br>
cakeProject/にある.htaccessに以下の項目を追加した。 RewriteBase /cakeProject/

</font>

これでいけるようになったとさ。ちゃんちゃん。
【C言語】フォルダの存在チェックして存在しない時作成する win7 32bit


```c:001.c
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>

int main ()
{

    struct stat buf;
    int ret;
    char dir[256];
    char mkdir[512];

    snprintf(dir,256,"sample");
    snprintf(mkdir,512,"mkdir %s",dir);

    ret=stat(dir, &buf);

    if(ret!=0){

        ret=system("dir");

        if(ret==0){

            ret=system(mkdir);

            if(ret==0){

                printf("\n\n");
                printf("%sフォルダ作成成功! \n ",dir);
                printf("\n\n ");

                ret=system("dir");

                if(ret!=0){
                    printf("dirコマンド失敗! \n ");
                }

            }else{
                printf("%sフォルダ作成失敗! \n ",dir);
            }

        }else{
            printf("dirコマンド失敗! \n ");
        }

    }else{
        printf("%sフォルダが存在します \n ",dir);
    }

    return 0;
}

```

##環境
OS:windows7 32bit (自作機)
コンパイラ:Borland C++ 5.5.1 for Win32

##解説
sampleフォルダが存在しないときにsampleフォルダを生成する。
statでフォルダの存在チェックして、system関数でmkdirコマンド実行してフォルダ作成を行った。

```c:
#include <dirent.h>
```
がないとき、system関数で警告が出る。

```
c:\2014\0726>bcc32 001.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
001.c:
警告 W8065 001.c 20: プロトタイプ宣言のない関数 'system' の呼び出し(関数 main )
警告 W8065 001.c 24: プロトタイプ宣言のない関数 'system' の呼び出し(関数 main )
警告 W8065 001.c 32: プロトタイプ宣言のない関数 'system' の呼び出し(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
```

##コンパイルと実行結果
上記ソースを
c:\2014\0726\001.c
としてコンパイルして実行する。

```
c:\2014\0726>bcc32 001.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
001.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

c:\2014\0726>001.exe
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は XXXXXXXXXX です

 c:\2014\0726 のディレクトリ

2014/07/28  18:58    <DIR>          .
2014/07/28  18:58    <DIR>          ..
2014/07/28  18:58               924 001.c
2014/07/28  18:58            60,928 001.exe
2014/07/28  18:58             4,380 001.obj
2014/07/28  18:58           393,216 001.tds
2014/07/27  05:50             2,523 002.c
               5 個のファイル             461,971 バイト
               2 個のディレクトリ  14,715,723,776 バイトの空き領域


sampleフォルダ作成成功!


  ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は XXXXXXXXXX です

 c:\2014\0726 のディレクトリ

2014/07/28  18:58    <DIR>          .
2014/07/28  18:58    <DIR>          ..
2014/07/28  18:58               924 001.c
2014/07/28  18:58            60,928 001.exe
2014/07/28  18:58             4,380 001.obj
2014/07/28  18:58           393,216 001.tds
2014/07/27  05:50             2,523 002.c
2014/07/28  18:58    <DIR>          sample
               5 個のファイル             461,971 バイト
               3 個のディレクトリ  14,715,723,776 バイトの空き領域

c:\2014\0726>

```

##関連
[【C言語】systemでdirコマンドを実行する win7 32bit ][1]
[1]:http://qiita.com/kyoshiro-obj/items/489be634d9654fc9082b
LaunchBar Search Templates (UTF-8)


# Custom Search Template for LaunchBar

A list of my custom search template for LaunchBar.

```launchar
Search GoThere.sg http://gothere.sg/maps#q:*
Search Qiita http://qiita.com/search?utf8=✓&sort=&q=*
```

![2014-07-28-search-qiita.png](https://qiita-image-store.s3.amazonaws.com/0/50077/c72b51e2-b1c3-8aed-7fc0-fe6c9cdcd180.png "2014-07-28-search-qiita.png")


I'll update the list when I add more.
不用意な#defineの使用は出来る限り避ける


##概要
[Effective C++](http://www.amazon.co.jp/Effective-%E7%AC%AC3%E7%89%88-ADDISON-WESLEY-PROFESSIONAL-COMPUTI/dp/4621066099)（2項）を読んだり、他の情報を調べたりして#defineについてまとめました。

##1. カプセル化に向いていない
\#defineにはprivateとかの概念が存在しない（と思っている）ので、クラス内だけである定数の値を扱いたい時などには向いていません。例えば、配列の要素数を定数を用いて宣言したい時は、

```cpp::GameManager.h
#define PLAYER_NUM 5

class GameManager {
public:
    int scores[PLAYER_NUM];
};
```

このようになりますが、ヘッダーファイルは様々な場所から呼ばれる可能性があり"PLAYER_NUM"はどこからでも見ることが出来ますし、滅多に無いことかもしれませんがこのファイルをインクルードしたファイルで"PLAYER_NUM"という名前のマクロは重複してしまうので危険ですので、そもそもヘッダーファイルでマクロを定義するのは良くないと考えられます。

このような事態にならないようにconstを利用して定数を定義しましょう。

```cpp:GameManager.h
class GameManager {
public:
    static const int PLAYER_NUM = 5;
    int scores[PLAYER_NUM];
};
```

静的なメンバ変数に対して宣言時に値を格納できるは**整数型の場合のみ**らしいので注意しましょう。

##2. 意図しない動作の可能性
マクロを利用した部分は定義に従ってそのまま置き換わるだけなので、使われ方によっては利用者の意図しない動作を招いてしまう場合があります。極端な例ですが、

```cpp:main
#define CALL_WITH_MAX(a, b) f( ((a) > (b) ? (a) : (b)) )

void f(const int &x) {
    std::cout << "f: value = " << x << std::endl;
}

int main(int argc, const char * argv[])
{
    int a = 20;
    int b = 10;
    CALL_WITH_MAX(++a, b); // ２回インクリメントしてしまう
    
    return 0;
}
```

```cpp:Result
f: value = 22
```

このような使われ方をした場合、利用者的には１回のインクリメントで良いはずですが、実際は２回インクリメントしてしまいます。このようなことにならないようにinlineを使って代わりのものを定義しましょう。

```cpp:main
void f(const int &x) {
    std::cout << "f: value = " << x << std::endl;
}

inline void callWithMax(const int &a, const int &b) {
    f(a > b ? a : b);
}

int main(int argc, const char * argv[])
{
    int a = 20;
    int b = 10;
    // CALL_WITH_MAX(++a, b);
    callWithMax(++a, b); // １回だけインクリメント
    
    return 0;
}
```

# 結論
\#defineは便利で使いやすいですが、起こる問題についてもしっかり把握した上で利用する必要があるということがわかりました。コンパイル時の制御には必須なので使わないということはこれから先なさそうですね。
要約統計量を可視化する

# データ全体を俯瞰する

大きなサイズのログデータなど、単純かつ大量のデータを前にしたとき、どのように全体の概観を俯瞰したら良いのでしょうか。

まず次のようなことを考えてみます。
1. 尺度変換 (無名数化、正規化を含む)
2. 要約統計量を求める
3. 分布を仮定し、検定する

## 尺度変換

尺度水準については[データの種類の理解と線形回帰ことはじめ](http://qiita.com/ynakayama/items/ba3b45b376397955c3da)で説明しました。

たとえば連続データの種類のひとつである時間を取ってみても、何分ごとあるいは何時間ごとなのか、間隔を設定して値を得ることで時刻による推移を可視化します。このときに尺度水準の変換が必要になります。また無名数化というのは単位を持たない数値 (無名数) に変換することで、割合・比率などで異なる基準の値の比較を容易にするためにおこないます。正規化というのはある一定のルールに沿ってデータを変形・加工することです。たとえば分散を 1 平均を 0 とした値に落とし込むことで、異なる基軸の数値を比較可能にします。

## 要約統計量

要約統計量については[統計と区間推定](http://qiita.com/ynakayama/items/5a955c7e29c295292502)で説明しました。平均や分散が代表的な統計量ですが、たとえばデータの真ん中はどういった値か、散らばり具合はどうか、などを数値化することにより、大量のデータを要約して概観を把握できるようにします。

たとえば[有価証券報告書を見ると IT 業界各社の平均年収](http://www.publickey1.jp/blog/14/it_2014_1.html)がわかります。しかし実際には平均年収だけでなく、分散や中央値といった要約統計量が無いと、ものすごく上下の差がある中での平均なのか、ある一部の人だけが高い年収なのか、みんな同じくらいの額なのかといったことがわかりません。このように要約統計量とは[全数走査する](http://qiita.com/ynakayama/items/1494cf4fdf988e1c7c7c)にしても、[母集団から標本を抽出して統計量を求める](http://qiita.com/ynakayama/items/4362c439d9ea814cbe60)場合も、対象のデータの[分布の適合度を調べる](http://qiita.com/ynakayama/items/5ab69d6d06d61148a689)上で欠かせない情報です。

[仮説検定と確率分布](http://qiita.com/ynakayama/items/e41f592ad7fe02f23c1c)において基本的な統計量の求め方について説明しました。しかし一般の方にはデータ分析において要約統計量を報告してもなかなかピンと来ないのが現状ではないかと思います。そこで役に立つ可視化方法が「[箱ひげ図](http://ja.wikipedia.org/wiki/%E7%AE%B1%E3%81%B2%E3%81%92%E5%9B%B3)」です。

## 箱ひげ図の生成

まずはポアソン分布にしたがう乱数を生成し、統計量を求めてみましょう。今まで説明してきた手順なので詳しい説明は省略します。

```py3
import numpy as np
import pandas as pd

s1 = pd.Series(np.random.poisson(5, 10000))
s1.describe()
#=>
# count    10000.000000
# mean         5.026600
# std          2.211421
# min          0.000000
# 25%          3.000000
# 50%          5.000000
# 75%          6.000000
# max         14.000000
#dtype: float64

s2 = pd.Series(np.random.poisson(5, 10000))
s3 = pd.Series(np.random.poisson(5, 10000))
```

箱ひげ図の「箱」では全データの半数 (25% から 75%) が含まれます。それらのデータは、集団において中間層を形成することから「集団を代表するデータの集まり」とみなせます。そして、箱の中で「最も一般的データを一つ挙げる」とすれば、それが全データを代表する「中央値」ということになります。

さて、いま平均が 5 、次元空間が 10000 のベクトルを 3 つ生成しました。これをプロッティングするのは boxplot 関数を使えばできます。

```py3
import matplotlib.pyplot as plt
ax.boxplot([s1, s2, s3])

xticks = ['A', 'B', 'C', ]
plt.xticks([1, 2, 3], xticks)
plt.grid()
plt.ylabel('Length')
plt.xlabel('type')
plt.show()
plt.savefig("image.png")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/4c68ed24-e1fa-5914-684e-83692b38e75f.png)

このように中央値がほぼ 5 の箱ひげ図ができました。

もう少しわかり易くするために、散布図をプロッティングしたものと重ねてみます。

```py3
# s1 と同じ長さの成分がすべて 0 である零行列を得る
s0 = pd.Series([0] * len(s1))
ax.plot([s0, s1, s2, s3], marker='.', linestyle='None', )
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/1d98be68-2fa6-8665-00ef-31fd16bd9346.png)

## まとめ

データの全体を俯瞰するには要約統計量が、そしてその可視化には箱ひげ図が使えることがわかりました。
xamppでinclude(SSI)を使う

# SSIとは
SSI : server side include

共通部分（例えばヘッダー・フッター・サイドナビ等）がある場合、全てのソースにコピペするのは面倒です。
更新があった場合全てのファイルのその部分を書き換えないといけません。
一つのhtmlファイルに更新をかけるだけで反映されるのが効率的です。
SSIを使うとそれが可能になります。

私includeと聞いて最初勘違いしておりましたが、
PHPのinclude文ではありません。SSIのincludeです。

#html上書き方

html上に

```
<!--#include virtual="resource/include/header.html" -->
```

と、書いてあったら、それです。
virtualのかわりに、fileと書くこともあって、
virtual　⇒　ドキュメントルートからのパス。別ディレクトリでもサーバの絶対パスでも指定が可能

```
EX)
○　⇒　virtual="resource/include/header.html"
○　⇒　virtual="include/header.html"　　
```

file　⇒　同ディレクトリやサブフォルダにある場合のみ。
上層のディレクトリにあるファイルは読み込めません。

```
EX)
×　⇒　file="resource/include/header.html"　　
○　⇒　file="include/header.html"　　　　　　　　
○　⇒　file="header.html"　　　　　　　　　　　   
```

#SSIを使ったファイルをローカルで確認するには

ローカルでSSIを利用するには、Apacheのhttpd.confファイルを編集する必要があります。
私がxamppを使用しているため、xamppで失礼いたします。

C:\xampp\apache\conf\httpd.conf

414行目あたりに

```
    # To parse .shtml files for server-side includes (SSI):
    # (You will also need to add "Includes" to the "Options" directive.)
```

と書いてあるところを見つけ、その下の

417行目あたりを

```
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
```

↓

```
AddType text/html .shtml .html
AddOutputFilter INCLUDES .shtml .html
```

に変更する

そしてapacheを再起動すると大丈夫です。


#.htaccessなら

```
#AddType text/html .html .htm .shtml
#AddOutputFilter INCLUDES .html .htm .shtml
```

同様、.htmlを足しとけばいいようです。
【iOS】Could not launch "アプリ名"というエラーについて

先日ハッカソン中に出た謎のエラーについて。

##エラーについて
Could not launch "アプリ名"
process launch failed: NotFound

![スクリーンショット 2014-07-28 18.50.31.png](https://qiita-image-store.s3.amazonaws.com/0/46597/2396f69d-d2fe-0d47-3124-58c55337aa58.png)

![スクリーンショット 2014-07-26 15.13.13.png](https://qiita-image-store.s3.amazonaws.com/0/46597/639ac001-8443-ed7f-464f-3af21d38fcf1.png)

こんなエラーです。
エラー文が簡潔過ぎてよくわからないです...orz

ビルドは通るのだけれど、実機にアプリを流して起動しようとするとこのエラーが出ました。

##解決方法
色々調べてみたところ、iOSのバージョンを最新にしたらうまくいきました。
今までiOS7.1.1でやってきていたのですが、7.1.2はうまくアップデート出来ないエラーがあるとのことでアップデートをしないで放置していました。

信仰心の薄れが今回の問題を引き起こしたという事ですかね...。
Unityデザインパターン記事「Journeyballs engine: Unity design patterns」のメモ 

Unityでどのようにコードを書いて、ゲームオブジェクトにアタッチしていいか迷う事が多々あったので、先人の記事を読んでメモを書きます。

# Journeyballs engine: Unity design patterns

Journeyballsの開発者が書いたUnityデザインパターンのチュートリアル記事。

* URL: http://www.holoville.com/blog/?p=166
* マネージャ
    * GameManager: 中心となるマネージャ。Unityエディターを通して、ゲーム設定を行ったり、SaveManagerを通して各ユーザのデータを取得する
    * AspectManager: スクリーンの解像度などに対応するためのもの。
    * Notificator: イベントの通知はすべてここに送るようにし、ここで処理をする。シングルトン。
    * LevelManager: 新しいレベルのシーンが読み込まれるたびに、このマネージャがレベルを検知し、設定する。
    * SaveManager: セーブとロードを担当する。
    * ScoreManager: スコアと、各レベルでのスターを保持する。
    * SoundManager: すべてのサウンドはここで扱われる。音を再生するときはSoundManager.Play(SoundEnumValue)のようにをよぶ。
    * MenuManager: メニューだったり、各アニメーションを制御する。
* ブレイン（頭脳）
    * 各シーンで空のゲームオブジェクトを持っており、そこでレベルデザインをしている。
一部の人しか使わないであろうGoogleアナリティクスのTips

Googleアナリティクスには行動フローやユーザフローといったユーザがセッション生成からどういったページ遷移をしているかを可視化してくれる機能があります。

ものすごーく便利な機能なんですが困ったことが１つあります。

それは**ページ遷移をURLパラメータで振り分けている場合などには、グループ化されてしまいフローが有効に働かないということ**です。

例えば、http://example.jp/ と、http://example.jp/?page=about と、http://example.jp/?page=search などがある場合、
/→/?page=about→/?page=searchと遷移してもフロー上では
/→/?page=aboutと２ページ目までの遷移しか表示してくれないといったことがあります。
（こちらあまり深く調査していないので間違っている場合にはコメ欄などでご指摘お願いします。）

で、これが開発初期なら「んじゃ作り直すか〜」ってなると思うのですが、
サービスとしてリリースしちゃってる場合には改修を入れるのも一苦労なので困ったことになります。


今回はそんな時に労力をかけずにどうやってフローを正しく表示させるかのTipsになります。（説明が長くなりました・・・:-/）

====

# 事前知識

ガリッとコードを書く前に事前知識を。
Googleアナリティクスには「ユーザの行動を追跡するためにこのコードを入れてちょ」と提示されるコードがあります。


    <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
    
    ga('create', 'UA-xxxxxxxx-x', 'auto');
    ga('send', 'pageview');
    
    </script>

こんな感じのコードですね。

で、今回肝心要なのは**ga('send', 'pageview');**の部分です。
これはGoogleへ対して「今表示しているページをユーザは閲覧してるぞー！」ってのを教えるコードになります。
ページの情報はタイトルとURLを送ってます。

もう一つ、Googleアナリティクスには**仮想ページビュー**という機能があります。
これを活用して、本来送るべきURLのパラメータ部分をスラッシュ区切りにしてGoogleへ送っちゃうのがやりたいことになります。

# やり方

やり方としては至って簡単で、/?page=aboutなどを一旦スラッシュ区切りにします。
で、スラッシュ区切りにしたURLを仮想ページビューとして送る感じです。

実際にやってみたコードは以下になります。

    <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
    
    ga('create', 'UA-xxxxxxxx-x', 'auto');
    
    url_param = window.location.search;
    url_param = url_param.replace('?page=','page/');
    url_param = url_param.replace(/&/g,'/');
    var virtualPage = window.location.pathname + url_param;
    ga('send', 'pageview', virtualPage);


詳細説明としては、
window.location.searchに対してreplaceをすることでURLパラメータで使っている?や&を/に変換します。
なので、/?page=aboutだったものが/page/aboutに変換されたり、/?page=search&cur=1などは/page/search/cur=1などに変換されます。

次に、そうやって変換したURLをga('send', 'pageview', virtualPage);でGoogleへ送信してます。
とりあえず第３引数に仮想URLを入れて送信するって感じですね。


これで行動フローやユーザフローが正しく表示されるでしょう！

他のGoogleアナリティクスの仕様的なところは以下から見れますのでご参考にしてみてください！

https://developers.google.com/analytics/?hl=ja
さくらVPS サーバー初期設定

##環境

```bash
# cat /etc/redhat-release
CentOS release 6.5 (Final)
# uname -a
Linux XXXXX 2.6.32-431.20.5.el6.x86_64 #1 SMP Fri Jul 25 08:34:44 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
```

##visudo

```bash
#visudo
```

```visudo
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL   #コメントアウト
```

##user作成

```bash
#useradd XXX
#passwd  XXX
#usermod -G wheel XXX
```

##ssh鍵

```bash
$cd
$mkdir .ssh
$chmod 700 .ssh
$cd .ssh
$ssh-keygen -t rsa -v
$mv id_rsa.pub authorized_keys
```
id_rsa を接続したいPCに保存

##sshの設定

```/etc/ssh/sshd_config
# diff sshd_config sshd_config.org
13c13
< Port XXXX
---
> #Port 22
42c42
< PermitRootLogin no
---
> #PermitRootLogin yes
66c66
< PasswordAuthentication no
---
> PasswordAuthentication yes

```

###再起動

```bash
# service sshd restart
```
##local

```.ssh/config
Host XXXX
    HostName XXXX
    User XXX
    Port XXXX
    IdentityFile ~/.ssh/id_rsa
```

###ログイン

```bash
$ssh XXXX
```

##httpd インストール

```bash
#yum -y install httpd
```

##logwatch インストール

```bash
#yum install logwatch
#logwatch --print
#logwatch --mailto foo@example.com
```

###設定

/etc/logwatch/conf/logwatch.conf

```vim
MailTo=foo@example.com
```

##DenyHostsのインストール

```bash
#yum install denyhosts
#service denyhosts start
#chkconfig denyhosts on
```
[Swift]文字列の置換

文字列の置換はString型の関数stringByReplacingOccurrencesOfString()を使います。

##コード

```
let str:String = "abcdefghi"
println(str.stringByReplacingOccurrencesOfString("b", withString: "B", options: nil, range: nil))
```

##出力結果
aBcdefghi
【VC++】デバッグログ出力時に呼び出し元関数名を出力する

ブログに書いたよ。
<a href="http://replication.hatenablog.com/entry/2014/07/28/180145">【VC++】デバッグログ出力時に呼び出し元関数名を出力する - 小さい頃はエラ呼吸</a> <a href="http://b.hatena.ne.jp/entry/replication.hatenablog.com/entry/2014/07/28/180145"><img src="http://b.hatena.ne.jp/entry/image/http://replication.hatenablog.com/entry/2014/07/28/180145" alt="はてなブックマーク - 【VC++】デバッグログ出力時に呼び出し元関数名を出力する - 小さい頃はエラ呼吸" border="0" /></a>
WindowsでvirtualenvにNumpyをインストールする

Pythonと言えば数値計算、それを代表するパッケージがNumpyであるが、こいつのインストールは一筋縄ではいかない。はまって地獄を見た人も少なくないだろう。特にWindowsでは。

最も簡単な方法はAnacondaなど既にNumpyが組み込まれたPythonディストリビューションを利用することだ([公式サイトにもそう書いてある](http://www.scipy.org/install.html))。しかし、通常のPythonアプリケーションは`virtualenv`で環境を構成して`pip`でインストールするのが一般的なので、その流れに乗せたいのが正直なところ。

そのため、`pip`でのインストールを行う方法を紹介する(厳密には`pip`でインストールしたかのようにする方法)。

1. Windowsインストーラーを公式サイトから[ダウンロード](http://sourceforge.net/projects/numpy/files/NumPy/)
2. 落としてきたexeファイルを、7zipなどで開く  
中にSSEなどCPUに応じたexeファイルが入っているので、それを引っこ抜く(Windowsの場合`numpy-1.x.x-sse3.exe`という感じ)。  
3. virtualenvを有効化し、`easy_install`でexeを実行する  
`easy_install c:\path\to\extracted\numpy-1.x.x-sse3.exe`

これでvirturlenv内にのみインストールされるはず。
この、「インストーラーを落としてきてeasy_installで対応」という方法は他でも使えると思うので、覚えておくと良い。

＜参考＞
[windows + virtualenv + pip + numpy (problems when installing numpy)](http://stackoverflow.com/questions/6114115/windows-virtualenv-pip-numpy-problems-when-installing-numpy)
[Swift]文字列検索で範囲と位置の取得

指定した文字列の検索は以下の通りです。

##コード

```
//文字列の範囲を取得
var str: NSString = "abcdefghi"
var range: NSRange = str.rangeOfString("cde")
println(range)

//文字列の位置を取得
var loc = str.rangeOfString("cde").location
println(loc)
```

##出力結果
(2,3)
2
[Swift]改行の仕方

Swiftでの改行の仕方を紹介します。

##コード
```
let str:String = "New\nLine"

println(str)
```

##出力結果
New
Line

##まとめ
Objective-Cの頃と変わらず、\nで改行できます。
ちなみに自分は最初、バックスラッシュの打ち方がわからなかったのですが、
option + ¥ で打てます。
[Swift]Logの出し方色々

Objective-Cでログを出すときはNSLogを使っていました。
Swiftでは色々と書き方があるようなので紹介します。

##コード

```
var i:Int = 1

//case1
NSLog("%d", i)

//case2
NSLog("\(i)")

//case3
println(i)
```

##出力結果
2014-07-28 17:42:33.823 Log[2537:61925] 1
2014-07-28 17:42:33.825 Log[2537:61925] 1
1

##まとめ
公式の文書を見るとNSLogは使用せず、println()を使う書き方をしているのでそれが推奨なのかもしれません。
[Swift]NSDateComponentで日付の各要素を取得

年、月、日等の日付に関する各要素を一つ一つで取り出したいときはNSDateComponentを使います。

##コード
```
let date = NSDate()
let calendar = NSCalendar(identifier: NSGregorianCalendar)
//和暦を使いたいときはidentifierにはNSJapaneseCalendarを指定
//let calendar = NSCalendar(identifier: NSJapaneseCalendar)

var comps:NSDateComponents = calendar.components(NSCalendarUnit.YearCalendarUnit|NSCalendarUnit.MonthCalendarUnit|NSCalendarUnit.DayCalendarUnit|NSCalendarUnit.HourCalendarUnit|NSCalendarUnit.MinuteCalendarUnit|NSCalendarUnit.SecondCalendarUnit,
    fromDate: date)

var year = comps.year
var month = comps.month
var day = comps.day
var hour = comps.hour
var minute = comps.minute
var second = comps.second

println("\(year)/\(month)/\(day)/\(hour)/\(minute)/\(second)")
println("\(year)")
println("\(month)")
println("\(day)")
println("\(hour)")
println("\(minute)")
println("\(second)")
```

##出力結果
2014/7/28/17/23/59
2014
7
28
17
23
59

##まとめ
Objective-Cの頃は
NSCalendarUnit.YearCalendarUnit
を
NSYearCalendarUnit
と書いていました。
この書き方の違いがあり、最初にcalendar.componentsを指定する時に少し詰まりました。

時間関係の他に、
・曜日
・一年の何週目か
・第何四半期か
・今月の何週目か
などの要素も取り出せます。
バーチャルホストで設定したローカル環境をスマホの実機から確認する方法

# 0. 想定している環境
* バーチャルホストを設定して、ローカルで開発している
* PCとスマホ、両方同じWi-Fiネットワークに接続している
* サイトがレスポンシブウェブデザインで実機でも確認が必要だよー



# 1. Charlesを起動する
HTTPデバッガのCharlesというアプリを使用します。
ダウンロードしてない方は、[こちら](http://www.charlesproxy.com/)から。

![charles](https://qiita-image-store.s3.amazonaws.com/0/1665/e9316274-f5d2-c926-7296-85b6c3060a35.gif)


# 2. スマホ側のネットワーク設定
※例としてiOSデバイスで説明します。

設定アプリから接続しているWi-Fiのネットワーク設定を開き、HTTPプロキシを手動に変更します。
手動の各項目は以下のとおりです。

* サーバ： PC側のローカルIP
* ポート： 8888

8888はCharlesのデフォルトポートです。

![ios_setting](https://qiita-image-store.s3.amazonaws.com/0/1665/565dd26d-dbdb-8617-882a-34544685f98d.png)



# 3. スマホから確認
スマホのブラウザからローカルサイトを開くと、Charlesから確認のアラートがでるので、Allowを選択します。
ブラウザを更新するとローカルサイトが表示されます。
[Swift]現在時刻の取得

SwiftでNSDateを使って現在時刻を取得してみました。

##コード

```
let now = NSDate()

let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"

let string = formatter.stringFromDate(now)

println(string)
```

##出力結果
2014/07/28 17:11:29

##まとめ
現在時刻を取得する、ここまではObjective-Cの時と特に変わりは無いようです。
jquery/js＜思い出し編＞


####練習場
ペペロンのことも思い出してあげて下さい。

#1.slideToggle()
ほぼjs書く機会のない人でも1度は使うことがあるんじゃないか系。

##toggle基本

```html:html
<p id="btn">昨日、jqueryの勉強しようと思ったんだけどね・・</p>
<p id="memo">頭が痛くて出来なかったポヨ・・</p>
```

```js:js
$(function(){
	$("#btn").click(function(){
		$("#memo").slideToggle("slow");
		$("#memo").toggleClass("show");
	});
});
```

```css:css
#btn {
    cursor: pointer;
}

#memo {
    display: none;
    background: #eee;
}
```

###結果を見る
http://jsfiddle.net/jackotonashi/89xyh/

#2.toggleClass()
ほぼjs書く機会のない人でも多用する方法。


```html:html
<p>下の変身ボタンでスーパーペペロンに変身しますが、
もう一度クリックすると元に戻ります。</p>
<div>q _ q</div>
<button>変身ボタン</button>
```

```js:js
$(function(){
    $("button").click(function(){
        $("div").toggleClass("henshin");
    });
});
```

```css:css
div {
    color: #666;
    padding: 10px;
    border-radius: 5px;
    border: 1px solid #666;
    width: 35px;
    height: 35px;
}

button {
    margin-top: 20px;
}

.henshin {
    color: #ff8400;
    background: #fffd56;
    border: 1px solid #ff8400; 
}

```

###結果を見る
http://jsfiddle.net/jackotonashi/kLPG8/

#3.CSS()

```html:html
<div>p _ p</div>
<button id="hoge">CSSで簡易変身</button>
```

```js:js
$(function(){
    $('#hoge').click(function(){
        $('div').css("color","#ff0000");
    });
});
```

###結果を見る
http://jsfiddle.net/jackotonashi/Mqt7x/

#4.if文を使おう

```html:html
<div id="mes">本物の宝箱を当ててね。</div>
<p class="hako1">box</p>
<p class="hako2">box</p>
<p class="hako3">box</p>
<p class="hako4">box</p>
<div id="result">結果</div>
```

```js:js
$(function(){
    $('p').click(function(){
    if($(this).hasClass('hako3')){
        $('#result').text('当たり');
    }else{
        $('#result').text('はずれ');
    }
    });
});
```

```css:css
p {
    width: 80px;
    height 80px;
    background: #eee;
    border: 1px solid #999;
    float: left;
    margin-left: 10px;
    padding: 2px 4px;
    cursor: pointer;
}

#result, #mes {
    clear: left;
}
```


###結果を見る
http://jsfiddle.net/jackotonashi/aJ26L/


#5.scrollTop()

###開発中1
http://jsfiddle.net/jackotonashi/UC224/

###開発中2
http://jsfiddle.net/jackotonashi/9t8mP/

参考：http://iwb.jp/jquery-scrolltop/

##次回にご期待ください。
リソースID(resource ID)からリソース名を取得する

例えば、string.xmlに以下のように設定していて、


```
    <string name="hoge">ほげもげ</string>
```

R.string.hogeとするとAndroid内で生成されたintが返ってくるわけですが、ここでリソース名"hoge"を取得したい場合。

```
String Name = getResources().getResource(R.string.hoge);  //Name = "ほげもげ"
String resourceName = getResources().getResourceEntryName(R.string.hoge);  //resourceName = hoge
```

で取得できる。
HTML基本アイテム

#アイテム一覧

##Sublime Text3

初級者から上級者まで。
http://www.sublimetext.com/3

2から3に乗り換えるときのファイルの関連付け注意。
関連付けができなくなったらレジストリからSublime Text2条法を削除すると直るとか。
[Swift]文字列結合

Objective-Cで文字列結合をしようとすると関数をはさんだりする必要があり結構面倒でした。
Objective-Cが変態とか言われる理由の一つだったんではないかと思います。
Swiftでは単純でわかりやすくなりました。
比較してみましょう。

##Objective-C

```
NSString *srt1 = @"A";
NSString *str2 = @"B";

NSString *str3 = [NSString stringWithFormat: @"%@%@", str1, str2];

```

または

```

NSString *srt1 = @"A";
NSString *str2 = @"B";

NSString *str3 = [str1 stringByAppendingString: str2];

```

##Swift

```
var str1:String = "A"
var str2:String = "B"
        
var str3:String = str1 + str2
```
すごく単純ですね。

##まとめ
Objective-Cでは単に文字列結合したいだけなのにふとどの関数を使えばいいかが思い出せず、いちいちググったりNSStringの元クラスをたどったりして面倒な思いをした方も多かったのではないでしょうか。
Swiftではそれもなくなっていきそうですね。
bashメモ

よく忘れるのでメモしておきます.

# デフォルト値の設定
```bash
var=${1:-foo}
```

# ファイル名等の取得
```bash
filepath=/path/to/file.txt

filename=${path##*/}
filebody=${filename%.*}
dirpath=${path%/*}
ext=${path##*.}
```

# 最大行長

    $ cat input.txt | ruby -e "p STDIN.map(&:size).max"

# JSON->CSV変換

    $ cat input.json | ruby -rjson -rcsv -e 'print ARGV.to_csv;STDIN.each{|l|print JSON.parse(l).values_at(*ARGV).map{|v|v.is_a?(Array)? v.join(" "):v}.to_csv}' name
HTMLでコーディングするときに面倒な設定なしに3秒でプレビュー環境を作る方法。

#これ便利。

基本的なことだけど、HTMLファイルをローカルでファイルプレビューしてもパスとかがうまくつながってなくてキレイにプレビュー出来ない。
非テッカーに教えたい「HTMLでコーディングするときに面倒な設定なしに3秒でプレビュー環境を作る方法。」

##rubyインストール（気をつけるのは1点だけ）

###windows版 Rubyはインストールはこのページから出来ます。

http://rubyinstaller.org/
ダウンロードページに行き、一番上のRuby 2.0.0-p481とか言うのをクリック。
ダウンロードしたらruby.exeをインストール

###「環境変数PATHを設定する」に忘れずにチェックを入れる。

インストールの途中で「Ruby の実行ファイルへ環境変数PATHを設定する」にチェックを入れる。

これが設定されていないと使えません。
あとでも設定出来ますが、面倒なのでインストール時にやっておいた方が楽。


##webrick.batをつくる

```lang:webrick.bat
ruby -run -e httpd -- --port=30000 .
```
適当な空のテキストファイルを作り上記をコピーして貼り付け。
webrick.batというファイル名で保存する。

##HTMLとかの作業しているフォルダにwebrick.batを入れてダブルクリック。
黒い画面が立ち上がります。
##ブラウザを立ち上げ
`http://localhost:30000/`
と入力。

webrick.batを閉じてしまうと、アクセスしても何も表示されなくなります。
なので作業中はwebrick.batは開きっぱなし。

##どこでもプレビュー環境を作れる。
webrick.batを他の場所にコピーすれば、その場所をブラウザでプレビューすることが出来ます。ただし2ついっぺんにwebrick.batファイルを開くことはできません。どちらかのwebrick.batファイルは閉じて下さい。


自分以外の作業者に、ちょっとしたHTMLの作業をさせたいときなどに便利。
[Swift]汎用型AnyObject

Objective-Cにはid型という汎用型が用意されていました。
これはSwiftだとAnyObject型に相当します。
英語の通り「なんでも型」。
AnyObject型の変数にはStringでも入るしintでも入るしArrayでも入ります。

##サンプル

今回は変数AnyObjectに本当になんでも入るのかということで、String型の値を入れた後にInt型を入れてみてログ出力してみました。

###コード

```
let str:String = "message"
let num:Int = 11
var anyObj:AnyObject
        
anyObj = str
println(anyObj)
        
anyObj = num
println(anyObj)


```

###出力結果
message
11

String型が入ってたところにInt型が入ったので本当になんでも入りました。
Rubinius のインストール

ただのメモ。真っ白な CentOS 6.2 環境に入れる。http://rubini.us/doc/ja/getting-started/building/

# ruby 2.0.0+ のインストール

rubinius のビルドに ruby 2.0.0 以上が必要なのでいつもの感じで ruby を入れる

```bash
sudo yum install git
git clone https://github.com/sstephenson/rbenv ~/.rbenv
git clone https://github.com/sstephenson/ruby-build ~/.rbenv/plugins/ruby-build
cat <<'EOF' | sudo tee /etc/profile.d/rbenv.sh
# /etc/profile.d/rbenv.sh
if [ -d "$HOME/.rbenv" ]; then
  export PATH="$HOME/.rbenv/bin:$PATH"
  eval "$(rbenv init --no-rehash -)"
fi
EOF
source /etc/profile.d/rbenv.sh
```

```bash
sudo yum groupinstall -y "Development tools"
sudo yum -y install openssl openssl-devel readline-devel readline compat-readline5 libxml2-devel libxslt-devel libyaml-devel
MAKE_OPTS="-j 4" rbenv install 2.1.2
```

ちなみに `MAKE_OPTS="-j 4"` は並列ビルドするオプションで、4並列に指定している。
bundler を入れておく。

```bash
rbenv local 2.1.2
gem install bundler
rbenv rehash
```

# Rubinius のビルド (ruby-build を使う場合)

あとは rbenv (ruby-build) で普通にビルドできるはず。

```
rbenv install -v rbx-2.2.9
```

並列ビルドオプションはなさそう？ => 自動で5並列にはなるようだ。

※ なお、rvm ならコンパイラに gcc ではなく clang を使用するオプションがあるようだが、rbenv (ruby-build) にはなさそうである。

# Rubinius のビルド (master ブランチのビルド)

git clone して master ブランチをビルドする場合は以下のようにする。

```bash
git clone https://github.com/rubinius/rubinius.git ~/rubinius
cd ~/rubinius
rbenv local 2.1.2
bundle install -j 4
./configure --prefix=~/.rbenv/versions/rbx-master
rake install
```

rake install は自動で5並列ビルドになるようだ。

# Rubinius を clang でビルド (master ブランチのビルド)

Rubinius 的には gcc よりも clang 押しらしく、gcc でコンパイルできない！という報告に対して clang 使って、と言っている Issue がチラホラあるようだ。clang を使ってビルドするには以下のようにする。

clang のインストール

```bash
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -ivh epel-release-6-8.noarch.rpm
sudo yum install clang
```

あとは --cc と --cxx オプションに clang を指定してビルド

```bash
git clone https://github.com/rubinius/rubinius.git ~/rubinius
cd ~/rubinius
rbenv local 2.1.2
bundle install -j 4
./configure --cc clang --cxx clang++ --prefix=~/.rbenv/versions/rbx-master
rake install
```
PHPの$_SERVERの値設定

#apache側で設定
`.htaccess`に`SetEnv KEY=value`で設定
$_SERVER['KEY']で取得




#apacheを経由せず、PHPから参照可能に設定
`/etc/profile`に`export KEY=value`で設定
$_SERVER['KEY']で取得
（fuel oilのように、PHPのコマンドを直接実行しても取得可能）
画像処理と値渡し,参照渡し

最近画像処理関係のプログラムを書くことがあるのですが、値渡しと参照渡しを間違えていたことによって実行時間に大きな差が出てしまうという失敗をしたので、私のブログにまとめてみました↓
http://infotech776.blog.fc2.com/blog-entry-59.html

すごく初心者っぽい間違いであれですが、自分的には値渡しと参照渡しの違いが身を持って体感できた出来事だったので、共有いたします。