OmniAICreator/Qiita-1.07M huggingface dataset:
新しいmacを買った時にすること

iOS開発のためのp12証明書を初代マックからもらう
***
[キーボード入力の速さを最速にする]
(http://ushigyu.net/2012/06/27/accelerate_consecutive_input_and_moving_cursor/)
***
```lang:~/.bash_profileの作成+色々設定
export PATH=$PATH:/Users/User名/Documents/Android/sdk/platform-tools
export PATH=$PATH:/Users/User名/Documents/Android/sdk/tools/
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```
***
```lang:~/.bashrcの作成＋色々設定
alias ll='ls -la'
alias p='pwd'
function mkcd() {
        mkdir $1;
        cd $1;
}
source ~/git-completion.bash 
```
***
[Gitを使いやすくする](http://qiita.com/ShirakawaYoshimaru/items/345bc5943d9c77a1c8b5)

***
隠れたフォームのバリデーションに失敗

とある入力フォームを作った時の話ですが、送信ボタンを押しても一向に送信されず、原因をあれこれ探っていくと、Chromeのエラーコンソールに何やら出力されていました。

> An invalid form control with name='foobar' is not focusable.

そして、この問題になったフォームオブジェクトは`<div style='display:none'>`の中、つまり**ユーザーからは知覚も操作も不能な**場所に置かれていて、そしてHTML5のバリデーション属性がかかっていました。

# 対策法
もちろん最初からこんなフォームを作ることはないとは思いますが、JavaScriptで制御しているとこのように「見えないコントロールが`invalid`となる」ということは発生してしまいます。対策法を検討してみる過程で、いろいろなものがありました。

## novalidate、formnovalidate
まず、`novalidate`という属性があるのですが、これは`<form>`全体にしかかけることができません。そして、`formnovalidate`というのもありましたが、これは**送信ボタン**にかけて、formのバリデーション制御を上書きするためのものでした。

## disabled
フォームを`disabled`としてしまえば、バリデーションを行うこともなくなります。状況によってはそれもありですが、外部システムとの整合性もあるので、簡単には採用できるものではないかもしれません。

## バリデーション属性を削除する
ちょうど今回の事例では、一度非表示とした入力フォームを再利用することがなかったので、バリデーション系の属性を引きぬいて対応することにしました。jQueryを使えば比較的簡単にできます。

```js
$('form').find('input textarea select').removeAttr('required max min maxlength pattern');
```
なお、jQueryの`removeAttr()`では、スペース区切りで属性を与えると、一気に削除できます。
EC-CUBE3プラグイン機構

# プラグイン機構

## プラグインの種類
* ミドルウェア
    * before()
    * after()
* FormEvent
    * PRE_SET_DATA
    * POST_SET_DATA
    * PRE_SUBMIT
    * SUBMIT
    * POST_SUBMIT
* EccubeEvent
    * OrderService::commit()
* ExtRouting
* ExtController
* ExtView


## 設定ファイル

### 利用方法

利用するプラグイン機構を必要に応じて記載する。
複数組み合わせることも可能

```yaml
# /app/plugin/{plugin_name}/config.yml
name: SampleEvent
enable: false
service: 
    - SamplePluginServiceProvider
orm.path:
    - /Resource/doctrine
form:
    onPreSetData:
        SampleForm
```

* name
    * 必須
    * プラグイン名(たしか、現状ではディレクトリ名と合わせる必要がある)
* enable
    * 必須
    * 有効化フラグ(true: 有効 / false: 無効)
* service
    * 複数指定可能
    * SilexのServiceとして登録したいものをまとめたファイルを指定。( `.php` は不要)
    * `Silex\ServiceProviderInterface` を継承している必要がある
    * 新規ページ追加や、既存URL誘導の変更を想定
* orm.path
    * 複数指定可能
    * プラグインとして追加したいテーブルの定義(metadata)ファイルの配置場所を指定
    * プラグインインストール時に読み込まれ、作成されることを想定
* form
    * FormEvent利用の記載がされているファイルを指定( `.php` は不要)
    * 各methodは `Symfony\Component\Form\FormEvent` 型の引数をとる
    * 現状では、実装上の問題があり、複数のファイルから呼ばれる別methodも同一のファイルに記載する必要がある

```yaml
# /app/Plugin/{plugin_name}/event.yml
eccube.event.render.admin_product_category_edit.before:
    - [onRenderAdminProductCategoryEditBefore, NORMAL]
eccube.event.controller.admin_product_category_edit.after:
    - [onAdminProductCategoryEditAfter, NORMAL]
eccube.event.render.product_list.before:
    - [onRenderProductListBefore, NORMAL]

```

* 2.13系のHookPointの役割を想定

## インストール
2015/05/25現在では、インストールの仕組みがなく、  
`vendor/bin/doctrine orm:schema-tool:update` にてプラグイン用のテーブルを作成することを想定している。  
`initialize.php` などを規定し、インストールさせるのが妥当？


## ミドルウェア

各ルーティングに処理が渡る前後と、全ルーティングに処理が渡る前後で利用できるフックポイントを用意。
全体、もしくは各ルーティングの前後処理を入れる際に利用する。
想定処理が共通化されないため、引数をとっていない。

発火順は以下のとおり。
* `eccube.app.before`
* `eccube.event.{_route}.before`
* `eccube.event.{_route}.after`
* `eccube.app.after`

###### 利用方法
```php
public static function getSubscribedEvents()
{
    // イベントを登録
    return array(
        'eccube.event.controller.cart.before' => array(
            // メソッド名, 優先順位
            array('onCartIndexBefore', 10),
        ),
);

public function onCartIndexBefore()
{
    // 処理
}
```

## FormEvent

Formに対する動作を監視し、発火するEventを定義することができる。

###### 利用方法

`ミドルウェア` とかぶるため割愛


## EccubeEvent

EC-CUBEとして独自においた、処理の中間でも発火するイベント。
現状、決済プラグインからの利用を想定し、 `OrderService::commit()` のみ置いている。

###### 利用方法
`ミドルウェア` とかぶるため割愛


## ExtRouting

ルーティングの拡張を行う。
プラグイン同時のServiceProviderを定義し、ルーティングに割り込ませる。
EC-CUBE本体のルーティングより優先して読み込まれる。
ルーティングの仕組み自体が、マッチング時点で他を読み込まなくなる仕様のため、
同一のルーティングを拡張しようとした場合は、先に読み込まれたものが優先されてしまう。

###### 利用方法

```php
class SampleServiceProvider implements ServiceProviderInterface
{
    public function register(BaseApplication $app)
    {
        $app->match('/payment/install', '\\Plugin\\Sample\\Controller\\SampleController::index')->bind('sample_index');

```


## ExtController
同上

## ExtView
レンダ前ミドルウェア `eccube.{_route}.render.before` を利用する、実際にレスポンスに乗る直前のソースを加工することができる。
Bash+tmux+Peco : 異なるウィンドウで履歴を共有する方法

~/.bashrc に以下の記述を追加

```bash:.bashrc
function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend

```

再ログインまたは、 `source ./bashrc` で読み込み直す

これだけでPecoを共有して使える(ヽ´ω`)ゎ-ぃ


（参考） [bashにて複数端末間でコマンド履歴(history)を共有する方法](http://iandeth.dyndns.org/mt/ian/archives/000651.html)
CakePHP Fabricate で define を使う


| version | 
|:---|:---:|
| CakePHP 2.6.2   |
| Fabricate 1.2.1 |

Fabricate の define をどこで定義するのが良いんだろう？

define は共通で定義したいので、TestCase ごとに書きたくない。

Factory クラスを作るのも良いかもしれないけど、できるだけ CakePHP のそのままのディレクトリ構成で動かしたい。

で、、、

Fixture に定義してみました。

```php:app/Test/Fixture/PostFixture.php
<?php
App::uses('Fabricate', 'Fabricate.Lib');

class PostFixture extends CakeTestFixture {

	public $import = ['model' => 'Post'];

	public function init() {
		parent::init();

		Fabricate::define('Post', ['title' => 'test']);
	}
}
```

```php:app/Test/Case/Model/PostTest.php
<?php
App::uses('Post', 'Model');
App::uses('Fabricate', 'Fabricate.Lib');

/**
 * Post Test Case
 *
 */
class PostTest extends CakeTestCase {

	public $fixtures = [
		'app.post'
	];

	public function testFabricateDefine() {
		$data = Fabricate::attributes_for('Post');

		$this->assertEquals('test', $data[0]['title']);
	}
}
```

これで、Fixture 単位で define を定義できる。

Association を使った場合に問題が起きそうな気がするけど、、、それはその問題が発生した時に解決する！！
レスポンシブのviewportの設定

`<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">`

width=device-widthはウィンドウ幅で可変。
initial-scale=1.0は初期表示は1倍で。スマホを横にしたときに拡大されるのを防ぐ。
user-scalable=yesはズームOKにする。
capistrano3でのリモートコマンドの実行の仕方


Capistrano2では、以下のような感じでベタ書きで書いていたりした。

~~~ruby
namespace :deploy do
  task :link_html do
    run <<-CMD
      cd #{release_path}/public &&
      ln -nfs /opt/htdocs/hoge &&
      ln -nfs /opt/htdocs/foo &&
      ln -nfs /opt/htdocs/bar
    CMD
  end
end
~~~

Capistrano3ではSSHKitというライブラリを使って書けるようだ。
この辺りを参考に書いてみる。
- [capistrano/sshkit](https://github.com/capistrano/sshkit "capistrano/sshkit")
- [sshkit/EXAMPLES.md at master · capistrano/sshkit](https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md "sshkit/EXAMPLES.md at master · capistrano/sshkit")

例をみると`within`で対象ディレクトリに`cd`して`execute`を実行してくれるようだ。
こんな感じで行けるだろうと思って書いてみる。

~~~ruby
namespace :deploy do
  task :link_html => [:set_rails_env] do
    on roles(:web) do |host|
      within "#{release_path}/public" do
        execute "ln -nfs /opt/htdocs/hoge"
        execute "ln -nfs /opt/htdocs/foo"
        execute "ln -nfs /opt/htdocs/bar"
      end
    end
  end
end
~~~

リモートに入って確認するとホームディレクトリにhoge,foo,barが出来ており、`cd`が実行されていない。

調べてみると、以下のような話。

[Issue executing a command within a directory · Issue #719 · capistrano/capistrano](https://github.com/capistrano/capistrano/issues/719 "Issue executing a command within a directory · Issue #719 · capistrano/capistrano")

よく見ると[ドキュメント](http://capistranorb.com/documentation/getting-started/tasks/
)にも書いてあった。
というわけで、以下のように書きなおしてみた。

~~~ruby
namespace :deploy do
  task :link_html => [:set_rails_env] do
    on roles(:web) do |host|
      within "#{release_path}/public" do
        execute :ln, '-nfs', '/opt/htdocs/hoge'
        execute :ln, '-nfs', '/opt/htdocs/foo'
        execute :ln, '-nfs', '/opt/htdocs/bar'
      end
    end
  end
end
~~~

問題なく実行された。
よかったよかった。
iOSはrakeでセットアップしたい

# 前置き

iOSのプロジェクトのセットアップ手順が長くなりがちでつらい。
Rakefileにセットアップスクリプトかいたのでメモ。

# プロジェクトの構成

どのプロジェクトでも大体必要な物は決まっている。

```
.
|- Rakefile
|- Gemfile
|- Podfile
|- .ruby-version
...
```

以下の構成が一般的だと思う。

- rakeでタスク管理
- rbenvでrubyのバージョン管理
- gem/bundlerでrubyのモジュール管理(cocoapodsとかdeploygateとか)
- cocoapodsでiosのモジュール管理

rakeでsetupタスクを書いてココらへんのinstallステップを自動化したい

# Rakefile

```ruby:Rakefile
desc "Setup project"
task :setup do
  unless system('which rbenv')
    STDERR.puts "please install rbenv"
    exit 1
  end

  sh 'rbenv', 'install' unless system('rbenv version')
  sh 'gem', 'install', 'bundler' unless system('which bundle')
  sh 'bundle', 'install', '--binstubs'
  sh 'bundle', 'exec', 'pod', 'install'
end
```

systemでshellの結果の返り値がboolで取れるのは便利だなーと思いました。
あとは、READMEとかに `rake setup` してねとか書いとけばらくできる。
ターミナルでGitを使いやすくするよ!

こういうのを入れておくと使いやすくなる!
というのを紹介するよ

##git-flow の導入
```lang:git-flowをインストールしよう
//install
$ brew install git-flow
//動作確認
$ git flow 
```


##コマンドを省略する

```lang:コマンドを省略
$ git config --global alias.co checkout
$ git config --global alias.com "checkout master"
$ git config --global alias.cob "checkout -b"
$ git config --global alias.br branch
$ git config --global alias.cm commit
$ git config --global alias.cmm "commit -m"
$ git config --global alias.st status
```

##git logを見やすくする

```lang:logを見やすく
$ git config --global alias.tree 'log --graph --all --format="%x09%C(cyan bold)%an%Creset%x09%C(yellow)%h%Creset %C(magenta reverse)%d%Creset %s"'
```
＊参照
http://qiita.com/takasianpride/items/842a785af610025a2030


##git でコード補完をできるようにする
[githubのここ](https://github.com/git/git/blob/master/contrib/completion/git-completion.bash)からgit-completion.bashのソースコードをコピー

```lang:git-completion.bashのソースコードをコピーした後にやること
$ cd
$ touch git-completion.bash
git-completion.bashファイルを開き、さっきコピーしたソースコードをペーストする

$ source ~/git-completion.bash
```
これだけ！
git + tab +tab とかやると、コード補完やコード候補を出してくれる！
Drupal7でmachine_nameからtaxonomyを取得する



taxonomy_node_get_terms_by_vocabulary関数はdrupal7では用意されていないので、明示的に定義する必要があります。

##関数
```.module
function taxonomy_node_get_terms_by_vocabulary($node, $vid) {
    $terms = &drupal_static(__FUNCTION__, array());

    if (!isset($terms[$vid])) {
      $terms[$vid] = array();
    }

    if (!isset($terms[$vid][$nid])) {
      $query = db_select('taxonomy_term_data', 'td')
        ->fields('td', array('tid'))
        ->condition('td.vid', $vid)
        ->condition('i.nid', $node->nid)
        ->orderBy('td.weight');

      $query->join('taxonomy_index', 'i', 'i.tid = td.tid');

      $terms[$vid][$nid] = taxonomy_term_load_multiple($query->execute()->fetchCol());
    }

    return $terms[$vid][$nid];
  }
```

あとはこいつを呼んでやってください

##参考サイト
[IS there a replacement for 'taxonomy_node_get_terms_by_vocabulary' in Drupal 7?](http://drupal.stackexchange.com/questions/15755/is-there-a-replacement-for-taxonomy-node-get-terms-by-vocabulary-in-drupal-7)
Unity uGUI スクロールビューをスナップさせる

Unity - uGUI スクロールビューを分割毎にスナップする - Qiita - http://qiita.com/imatomi/items/61db31536a9f08a67440

の改良版。

元ページにあるコードの位置取得のための計算式の意味はパッと見よくわからないし、forループを使っているのも意図がわからないし、最終的に必要であろうデータのインデックスも取れないので改良した。

外側からインデックスを変更してforcePositionUpdateフラグを用いればこのコードの外側から位置を変更可能である。

また、元ページにあるように、Editorスクリプトを追加する必要がある。それに関しては元ページを参照して各自実装してほしい。


    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    
    public class ScrollSnapSelector : ScrollRect
    {
        public int hIndex;
        public int vIndex;
    
        public int horizontalPages = 3;
        public int verticalPages = 3;
        public float smooth = 10f;
    
        Vector2 targetPosition;
        float hPerPage;
        float vPerPage;
        bool dragging;
    
        public bool forcePositionUpdate = false;
    
        void Awake()
        {
            hPerPage = 1.0f / (float)(horizontalPages - 1);
            vPerPage = 1.0f / (float)(verticalPages - 1);
        }
    
        void Start()
        {
            targetPosition = GetSnapPosition();
        }
    
        void Update()
        {
            if (!dragging && normalizedPosition != targetPosition)
            {
                normalizedPosition = Vector2.Lerp(normalizedPosition, targetPosition, smooth * Time.deltaTime);
                if (Vector2.Distance(normalizedPosition, targetPosition) < 0.009f)
                {
                    normalizedPosition = targetPosition;
                }
            }
            if (forcePositionUpdate)
            {
                forcePositionUpdate = false;
                targetPosition = GetSnapPosition();
            }
        }
    
        public override void OnBeginDrag(PointerEventData eventData)
        {
            base.OnBeginDrag(eventData);
            dragging = true;
        }
    
        public override void OnEndDrag(PointerEventData eventData)
        {
            base.OnEndDrag(eventData);
            UpdateIndex();
            targetPosition = GetSnapPosition();
            dragging = false;
        }
    
        void UpdateIndex()
        {
            int xPage = -1;
            int yPage = -1;
            if (horizontal && horizontalPages > 0)
            {
                xPage = Mathf.RoundToInt(normalizedPosition.x / hPerPage);
                xPage = Mathf.Clamp(xPage, 0, horizontalPages - 1);
                hIndex = xPage;
            }
    
            if (vertical && verticalPages > 0)
            {
                yPage = Mathf.RoundToInt(normalizedPosition.y / vPerPage);
                yPage = Mathf.Clamp(yPage, 0, verticalPages - 1);
                vIndex = yPage;
            }
        }
    
        Vector2 GetSnapPosition()
        {
            return new Vector2(horizontal && horizontalPages > 0 ? hIndex * hPerPage : normalizedPosition.x, vertical && verticalPages > 0 ? vIndex * vPerPage : normalizedPosition.y);
        }
    }
smallbasicでgoogle

自前のエクステンション使用。
#サンプル
```
GraphicsWindow.BackgroundColor = "skyblue"
button = Controls.AddButton("run", 200, 100)
Controls.ButtonClicked = onclick
Sub onclick
  C = Text.GetCharacter(34)
  R = Text.GetCharacter(13) + Text.GetCharacter(10)
  code = ""
  code = code + "Function setup(a)" + R 
  code = code + "url = " + C + "http://google.com" + C + R
  code = code + "Set obj = CreateObject(" + C + "WScript.Shell" + C + ")" + R
  code = code + "obj.Run url, 0, false" + R
  code = code + "setup = url" + R
  code = code + "End Function" + R
  a = Class1.VBSrun(code)
EndSub
```
Drupal7でjquery.cookieを利用する


Drupal7ではデフォルトでjquery.cookieが入っているのですが、なぜか匿名ユーザーの場合に読み込まれていない。。。


	drupal_add_library('system', 'jquery.cookie');
	
moduleなりtplなりで明示的に読み込む必要があるので注意しよう。


##参考サイト
[jquery.cookie.js mysteriously not loaded for anonymous users](https://www.drupal.org/node/1352854)
ES7.decorator で契約プログラミング(design by contract)

D言語の契約プログラミングサポートに触発された。

- http://www.kmonos.net/alang/d/dbc.html
- http://www.kmonos.net/alang/d/class.html#invariants

Dで実際どこまでできるかはあまりわかってないが、現実的にはこんな感じだろうか。

```js
// $ babel-node --optional es7.decorators index.js
class Counter {
  constructor(initial = 0) {
    this.current = initial;
  }

  @contract
  up(i) {
    this.current += i;
    return this.current;
  }
}

function contract(tar, name, desc) {

  // 事前条件
  function before(i) {
    console.assert(i > 0, `arg for ${name} should be positive value`);
  }

  // 事後条件
  function after(result) {
    console.assert(result > 0, `result of ${name} should be positive value`);
  }

  // 不変条件
  function invariant(_this) {
    console.assert(_this.current > 0, 'current should be positive value');
  }

  let val = desc.value;
  desc.value = function(i) {

    before(i);
    invariant(this);

    let result = val.apply(this, arguments);

    invariant(this);
    after(result);

    return result;
  }
}

function main() {
  let counter = new Counter(10);
  console.log(counter.up(1));
}
main();
```

汎用化すると

```js
function contract(rule) {
  return function(target, name, descriptor) {
    let rule = new Rule(target, name, descriptor);
    let original = descriptor.value;
    descriptor.value = function() {

      if (rule.before) rule.before.apply(rule, arguments);

      if (rule.invaliant) rule.invaliant(this);

      let result = original.apply(this, arguments);

      if (rule.invaliant) rule.invaliant(this);

      if (rule.after) rule.after(result);

      return result;
    }
  }
}

class Rule {
  constructor(target, name, descriptor) {
    this.target = target;
    this.name = name;
    this.descriptor = descriptor;
  }

  before(i) {
    console.log('before', i);
    console.assert(i > 0, `arg for ${this.name} should be positive value`);
  }

  after(result) {
    console.log('after', result);
    console.assert(result > 0, `result of ${this.name} should be positive value`);
  }

  invaliant(_this) {
    console.log('invaliant', _this);
    console.assert(_this.current > 0, '`current` should be positive value');
  }
}

function main() {

  class Counter {
    constructor(initial = 0) {
      this.current = initial;
    }

    @contract(Rule)
    up(i) {
      this.current += i;
      return this.current;
    }
  }

  let counter = new Counter(10);
  console.log(counter.up(2));
}

main();
```

D ではコンパイル時にこの辺は消す。Java も --ea を付けないと消える。
それをしたければ babel 時に @contract のデコレータを消して、
closure compiler みたいな「不使用コード削除」な minify とかをかませば消せる。

(しかし、動的で緩い型付けの JS みたいな言語では、実行時 assertion こそ残ってるベキなんじゃないかと思わなくも無い。)
APIアップグレード対応

（まだ対応していないページもちゃんと動作しているので、時間がある時に読み直して簡単にまとめる。）

###●Facebookプラットフォームアップグレードガイド
https://developers.facebook.com/docs/apps/upgrading?locale=ja_JP#v1tov2
 
* **2014年4月30日より前に作成されたアプリの場合**
バージョン番号を指定しないでAPIを呼び出すと、
v1.0 のAPIを呼び出していることになる。
 
* **2014年4月30日以降に作成されたアプリの場合**
バージョン番号を指定しないでAPIを呼び出すと、
v2.0 のAPIを呼び出していることになる。
（v1.0のAPIを呼び出すことはできない。）
 
* **APIのバージョンの有効期限が切れた場合**
期限切れのバージョンを使い続けているアプリは、
サポートされている最も古いバージョンのAPIを自動的に使用。
（2015年5月1日に v1.0 の呼び出しを使用すると、
v2.0のAPIから動作が返されます。
さらに新しいバージョンのAPIがリリースされた場合も同様。）

↓↓↓

**Q.「自動的にAPIのバージョン変えてくれる」ってことは、
何も対応しなくてもよくね？**
 
**A. アップグレードには、以下の対応が必須です。**
- SDKへのパスを更新
- 使用するバージョンのAPIを明記
###＼HTML の修正が必要！！！／
1. 「all.js」→「sdk.js」
2. 「FB.init()」にバージョンを追加。※Facebookページのみ。
3. 「いいね！」などのソーシャルプラグインのコードが変更されているので、コードを取得しなおす。
URLEnCodeはUri.EscapeDataStringでエンコードする

URLエンコードは、C#の、HttpUtility.UrlEncodeメソッドを使って、本来スペースは「%20」に変換されて欲しいところが、「+」に変換されていました。

で、Uri.EscapeDataStringメソッドを使えばいいことが分かりました。
Vagrant: synced_folderのrsyncで特定のファイルを除外したい

Vagrantには[ホストマシンのファイルをゲストマシンに同期する]機能があります。これを使って、ホストのソースコードをゲストに同期しつつも、ゲスト側にいらないファイルは同期しないということをやってみます。


まず、[ドキュメント]に出てくる1つ目の例ですが、これはVagrantfileがあるディレクトリと同じディレクトリにある`.git`を同期しないという指定になります。

```rb
Vagrant.configure("2") do |config|
  config.vm.synced_folder ".", "/vagrant", type: "rsync",
    rsync__exclude: ".git/"
end
```

もし、`subproject/.git`を同期したくないときは、こうします。

```rb
Vagrant.configure("2") do |config|
  config.vm.synced_folder "subproject", "/subproject", type: "rsync",
    rsync__exclude: ".git/"
end
```

そして、複数のファイルを同期したくないときは配列にするとできます。

```rb
  config.vm.synced_folder "scala-project", "/scala-project", type: "rsync",
    rsync__exclude: [
      ".idea/",
      ".idea_modules/",
      "project/project/",
      "project/target/",
      "target/",
    ]
```

なお、Vagrantでは除外パスの先頭にスラッシュをつけると完全一致に、つけないと後方一致になるようです。

たとえば、下の例では、`scala-project/*target/`が除外されるようです。

```rb
  config.vm.synced_folder "scala-project", "/scala-project", type: "rsync",
    rsync__exclude: [
      "target/",
    ]
```

一方、下の例では完全一致になり、`scala-project/target/`が除外されます。

```rb
  config.vm.synced_folder "scala-project", "/scala-project", type: "rsync",
    rsync__exclude: [
      "/target/",
    ]
```

このへんの実装は[vagrant/helper.rb at 808a86a918b73cf07bcc2823d09580840bf5b4cc · mitchellh/vagrant](https://github.com/mitchellh/vagrant/blob/808a86a918b73cf07bcc2823d09580840bf5b4cc/plugins/synced_folders/rsync/helper.rb#L14)にあります。

[ホストマシンのファイルをゲストマシンに同期する]: http://docs.vagrantup.com/v2/synced-folders/rsync.html
[ドキュメント]: http://docs.vagrantup.com/v2/synced-folders/rsync.html
jQueryとAjaxの使い方

#jQueryとAjaxを使ってwebページにテキストを挿入する。
Ajaxの使用により更新処理を行わず別のファイルからデータを取得し表示させることが可能
ただし、Ajaxではセキュリティー上の理由から、HTMLと同一ドメイン上にあるファイルしか取得できません。

#使用するファイル
##Sample.html
下記のテキストファイルからデータを取得し一部テキストを書き換えます。

##Sample.txt
Sample.txtの内容を読み込み、p要素の「変更前」というテキストを「変更後」に置き換えます。


#Sample.htmlコード
```lang:Sample.html
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        <meta http-equiv="Content-Script-Type" content="text/javascript" />
        <title>sample1</title>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript">
$(function(){
    $("button").click(function(){
        $("p").load("./Sample.txt");
    })
})
        </script>
    </head>
    <body>
        <button>変更</button>
        <p>変更前</p>
    </body>
</html>
```


```Sample.txt
変更後
```


#コード解説
functionの「$(セレクター).load(ファイル名);」でSample.txtを読み込み、クリックされることで更新処理を行わずHTMLの＜p＞の中身をSample.txtの中身に変更する。


#コード実行結果
ボタンを押す
![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/59356/d6e3d228-bfcb-b740-a96a-6de6cb0f94bc.png)→　　　　　　　![sample1 (1).png](https://qiita-image-store.s3.amazonaws.com/0/59356/57a3edd0-d25f-bfa8-54b3-6f306dd68e38.png)


参考にしたページ
http://ascii.jp/elem/000/000/458/458236/
シェルでパイプ元のプロセスを殺したい

# 問題

結果から言えばバカバカしいけどシェル関係初心者の自分はかなりハマったのでメモ。

```bash
(tcpdump | awk '{print $1}') &
curl -s http://example.com > /dev/null
kill $!
```

cURLリクエストが終わった時に `tcpdump` を殺したい！`$!`で殺せるのは`()`を司るサブシェルだけだし…さてどうする？

# 解決策

## プロセス単位ではなくジョブ単位で殺す

***俺、なんでサブシェル上で動かしてるんだ！？*** ってことで原点回帰します。

- `%%`は同一シェルプロセス内で最後に実行したバックグラウンドジョブを意味する

```bash
tcpdump | awk '{print $1}' &
curl -s http://example.com > /dev/null
kill %%
```

ジョブとプロセスは1対1にしかならないと勝手に思い込んでいたけど、このようにサブシェルに載せる必要もなく2プロセスを1ジョブにまとめることが出来る。また、ジョブに対しての`kill`は、ジョブに含まれるプロセス全てに対する`kill`として実行されるようだ。

…ただ、先頭プロセス以外の死に方が若干変わってしまう点にだけ注意。役目を終えて自然死するのではなく、強制的に殺されてしまっている。

## 先頭プロセス以外をファイルディスクリプタ化したサブシェルで走らせる

あとから気づいたのでこの方法も追記。ただし**shの標準機能ではない**。bashとzshでは動作確認。

- `$!`は同一シェルプロセス内で最後に実行したバックグラウンドプロセスを意味する
- `>( )`にてサブシェルを**ファイルディスクリプタ化**することが出来る

```bash
tcpdump > >(awk '{print $1}') &
curl -s http://example.com > /dev/null
kill $!
```

この方法であれば、`$!`は先頭のプロセスIDのまま保持される。先頭プロセス以外を自然死させることが出来るのも特徴。

### 備考

逆方向バージョン`<( )`もある模様。

```bash
cat < <(echo ヌッ！)
```

```bash
while read i; do
    printf "野獣「%s！」\n" $i
done < <(
    for i in ヌッ オオン アオン; do
        echo $i
    done
)
```
GitHub製のエディタ「ATOM」を１年間使い続けて便利だと感じたパッケージまとめ

こんにちは、さいそん([@tak723sio](https://twitter.com/tak723sio))です。
普段僕は開発時にはGitHub製のエディタ、「ATOM」を使っています。
クローズドβ(?)の時からなので、かれこれ１年以上使っているのですが、
使ってて「こいつ便利！」と思ったパッケージをまとめてみました。

## ATOMって？
公式サイト
https://atom.io/
上にも書いてある通りのGitHub製のエディタになります。
Windows、Mac、Linuxと、多くのOSに対応しています。

## ATOMパッケージ
(MacOS)ならATOMを立ち上げて```Cmd + ,```で設定が開けます。
そこから「Install」のタブをクリックして検索バーで検索するとパッケージが探せます。
というわけで、便利だと思ったパッケージを紹介していきましょう！
### Color Picker
https://atom.io/packages/color-picker
主にCSS上で使いますが、```Cmd + shift + c```で起動することが出来、Photoshopなどのグラフィックツールさながらのカラーピッカーが表示されます。

### file-icons
https://atom.io/packages/file-icons
便利というよりかは「見た目がカッコいい」っていう感じですね。
左側に表示される各ファイルのアイコンをそのロゴに置き換えてくれるパッケージ。
これがあるのと無いのとでは見やすさが非常に変わります。

### autocomplete-plus
https://atom.io/packages/autocomplete
いわゆる予測変換を出してくれる奴。
コレがもとで、拡張のものとして

- autocomplete-html
- autocomplete-css
- autocomplete-snippets 

等便利なパッケージがある。

### emmet
https://atom.io/packages/emmet
今の時代、使ってない人はいないんじゃないかって思うぐらいに便利なEmmetのATOM用パッケージ

### git-plus
https://atom.io/packages/git-plus
いちいちターミナルやGUIを立ちあげなくても大体のGitコマンドを、
このパッケージを入れることで、使うことが出来ます。

### language-xxx
デフォルトでサポートしていない言語をATOMでも使えるようにしてくれるパッケージ
「language-xxx」や「xxx-language」などの名前が多い。

### term2
https://atom.io/packages/term2
Gruntやgulpなどのタスクランナーなどを動かすのはターミナルからですが、
ならATOMにターミナルを入れてしまえば、ATOM１つで済んでしまいます。

### Atom Color Highlight
https://atom.io/packages/atom-color-highlight
例えば```#123456```って何色かわかりますか？
まぁ普通カラーコードを見ても色はわかりません。
ですが、このパッケージを入れておくと、このカラーコードのところだけ
背景をその色にしてくれるのです。
また、SassやLessなどを使っていると「この変数に入れた色って何色だっけ？」って言うことがありますが、このパッケージは「その変数も格納されているカラーコードを表示してくれる」ので、
変数を書くと色がわかってしまうスグレモノなのです。

### Minimap
https://atom.io/packages/minimap
サブライムテキストだとデフォルトで右上に出てくるアレです。
サブライムで右上のアレを使ってた人は入れておくといいかも。

## カラースキームは？
パッケージを検索する所で右側のタブを「Theme」に切り替えて、お好きなカラースキームを入れてみてください。

## まとめ
とりあえず、ここらへん入れておくと使いやすくなるかと。
ATOM便利なのでぜひ使ってみてください。
ファイル名の日付を読み取り、特定の日付以降のファイルを削除するbashシェル(AIX用)


## 0.あらすじ

AIX用のシステム構築で、タイトルのようなバッチを作成することに。
処理自体はよくあるロジックなのでそんなに苦労しないかと思いきや
初めてのbashだった上に、
AIXのdateコマンドがアレなせいで非常に苦労した。
次にAIXで同じような事にならないよう、備忘としてアップロード。

## 1.コード本編

ポイントは前述の通り日付関連。
AIXなのでTZを使ってゴニョゴニョしてます。
その他のロジックはbashなら他の*nixでも
同じような感じになると思われるけど、
当時bash初心者だったので色々汚い可能性大。
ちょくちょく出てくるファイル内で宣言していない変数は
全て共通環境変数から引っ張ってます。

```bash

#!/bin/bash
# 機能名：ログファイル削除
# 引数(1):日数
# 引数(2):種類(1:ログ 2:BAD 3:取込データ 4:連携データ)

#ファイル削除メソッド(引数1:取得日付フラグ 引数2:対象フォルダ 引数3:対象拡張子 引数4:日数)
delFile(){
		declare -i FLG
		declare -i FILE_DATE
		declare -i EXPIRE_DATE
        #引数でもらった日数までの時間を出しておく
		PLUS_DATE=`expr 24 \* $4 - 9`
		
		#削除対象日付取得
		if [ $1 -eq 0 ]
		then
        　 #引数でもらった日数までの時間をJSTに足して強引に日付計算
           #こちらは年月日まで
			NOW_DATE=`TZ=JST+${PLUS_DATE} date +%Y%m%d`
			EXPIRE_DATE=${NOW_DATE}
		elif [ $1 -eq 1 ]
		then
            #上と同じく日付計算
            #こちらは秒まで取得
			NOW_DATE=`TZ=JST+${PLUS_DATE} date +%Y%m%d%H%M%S`
			EXPIRE_DATE=${NOW_DATE}
		fi

        #findで対象フォルダの対象拡張子ファイルを拾ってループ
		find $2 -name "$3"|while read LINE
		do
		#ファイル名日付取得
		TEMP_DATE=`basename ${LINE}`
		
		#日付切り出し
        #日付の形式が日までと秒までの二形式あったので分岐
		if [ $1 -eq 0 ]
		then
			TEMP_DATE=${TEMP_DATE:6:14}
		elif [ $1 -eq 1 ]
		then
			TEMP_DATE=${TEMP_DATE:0:4}${TEMP_DATE:5:2}${TEMP_DATE:8:2}${TEMP_DATE:11:2}${TEMP_DATE:14:2}
		fi
			
		FILE_DATE=${TEMP_DATE%.*}
		
        #数値チェック
		num=`expr ${FILE_DATE} : [0-9]`
		if [[ ! $num -eq 1 ]]
		then
			FLG=1
		else
			FLG=0
		fi
		
        #削除判定
		if [[ "$FLG" -eq 0 && "$FILE_DATE" -ne 0 && "$FILE_DATE" -lt "$EXPIRE_DATE" ]] 
		then
        　      #削除実行　
			rm -f "${LINE}"
		fi
		done
}

#共通環境変数読み込み
. COMMON.sh

SCRPT_NAME="DEL_FILE.sh"

#ログ出力
${SCRPT_SHLOG} ${SCRPT_NAME} "I" "ファイル削除開始 $1"

#削除対象判断
if [ $2 -eq 1 ]
then
	#ログ削除
	delFile 0 ${SCRPT_LOG} *.log $1
elif [ $2 -eq 2 ]
then
	#BAD削除
	delFile 1 ${SCRPT_LDR}/BAD *.bad $1
elif [ $2 -eq 3 ]
then
	#取込データ削除
	#OKフォルダ(DAT)
	delFile 1 ${SCRPT_LDR}/OK *.DAT $1
	#OKフォルダ(rxd)
	delFile 1 ${SCRPT_LDR}/OK *.rxd $1
	#OKフォルダ(txd)
	delFile 1 ${SCRPT_LDR}/OK *.txd $1
	#NGフォルダ(DAT)
	delFile 1 ${SCRPT_LDR}/NG *.DAT $1
	#NGフォルダ(rxd)
	delFile 1 ${SCRPT_LDR}/NG *.rxd $1
	#NGフォルダ(txd)
	delFile 1 ${SCRPT_LDR}/NG *.txd $1
elif [ $2 -eq 4 ]
then
	#連携データ削除
	#OKフォルダ
	delFile 1 ${SCRPT_BKUP}/RENKEI/OK *.zip $1
	#NGフォルダ
	delFile 1 ${SCRPT_BKUP}/RENKEI/NG *.zip $1
else 
	${SCRPT_SHLOG} ${SCRPT_NAME} "E" "引数2が不正です"
	${SCRPT_SHLOG} ${SCRPT_NAME} "E" "異常終了"
	exit 9
fi

exit 0

```
PerlでCSVを処理しようとしてカラム中にカンマがあって困った件

Perlでsplitを使ってCSVのデータをばらしていろいろやってたらどうもうまくいかないので
おかしいなと思ったら"foo,bar"みたいなカラムがあってほげらってしまっていた。

そこで `Text::ParseWords` を使うと若干幸せになれるとのこと。

こういうCSVファイルがあったとする(hoge.csv)

```
aaa,bbb,"ccc,ddd",eee
aaa,bbb,"111,222",eee
```

こういう感じで処理してみると

```
#!/usr/bin/perl

use Text::ParseWords;

$file = "hoge.csv";
open (IN, $file) or die "$!";
while (<IN>) {
        chomp ($_);
                @data = &parse_line(',',1, $_);
                print "$data[2]\n";
}
```

こうなる

```
"ccc,ddd"
"111,222"
```

"" がいらないなーという場合は `parse_line` の2番めのパラメータを `undef` する

```
@data = &parse_line(',',undef, $_);
```

そうするとこうなる

```
ccc,ddd
111,222
```
Cocos2dx 2.2.6のコードを3.6に移行（経過２）

今回は結論から言うと、Windowsでのcocos2dx v3.6におけるAndroid版ビルド環境が出来上がりました。

詰まったのは、ビルドの途中で

* アクセスが拒否されました

というメッセージが出て、ビルドがうまくできない状態があったところです。
これに４時間くらハマりました。

そのときにしたツイートです。

>cocos2dxのv3.6で、REsourceフォルダに、ある程度以上のファイル容量を入れておくとassetsにコピーしきれない、もしくはassetsを削除するときに削除できない現象があるようで困ってる。どーするか…

具体的には、
ecclipseでのbuild_native.py 実行時に「アクセスが拒否されました」と出て、
どうやらResourceからassetsへのコピーがうまく動かない様子。

で、ビルド時にResourceからassetsへコピーしているようだが、コピー時にタイムアウトして、
コピーしきれてないのではないか、と勝手に思い込んでpythonのコードを見ていたのですが…。

Resourceフォルダの中身をいろいろ入れ替えたり、ファイル数を確かめたり、容量を確認したり
していましたが、うまく動く環境があり、これとうまく動かない状況の違いを確かめていたところ…。

どうやら、プロジェクトを作成したての環境は動きます。
デフォルトのHello Worldを表示するコードです。

しかし、自分のプロジェクトを突っ込むと動かない。
コードは合っている。

そこでデータの違いか、pythonの動作の不具合に絞り込んで、
両方を確かめていたところ、わかりました。

（そのときのツイート）
>わかった。Resourceフォルダに入ってるデータの中に読み取り専用があると、assetsフォルダにコピーするのはいいが、assetsのほうに入った時に削除ができないのだ。ということで、Resourceフォルダのファイルから全部読み取り専用属性はずしたらうまく動いた。

という結論でした。

これで無事、これまで通りのビルド環境として使えるようになりました。
やっとゲームが作れます（笑）。

参考まで。
Good luck!
smallbasicでcsc

smallbasicから、C#をコンパイルします。
自前のエクステンション使います。
#サンプル
```
GraphicsWindow.BackgroundColor = "skyblue"
button = Controls.AddButton("run", 200, 100)
Controls.ButtonClicked = onclick
Sub onclick
  C = Text.GetCharacter(34)
  R = Text.GetCharacter(13) + Text.GetCharacter(10)
  code = ""
  code = code + "Function setup(a)" + R 
  code = code + "csc = " + C + "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe" + C + R
  code = code + "src = " + C + "D:\hello.cs" + C + R
  code = code + "Set obj = CreateObject(" + C + "WScript.Shell" + C + ")" + R
  code = code + "Set ex = obj.Exec(csc & " + C + " " + C + " & src)" + R
  code = code + "str = " + C + C + R
  code = code + "Do" + R
  code = code + "str = str & ex.StdOut.ReadAll" + R
  code = code + "Loop While ex.Status = 0" + R
  code = code + "msgbox str" + R
  code = code + "setup = str" + R
  code = code + "End Function" + R
  a = Class1.VBSrun(code)
EndSub
```
ProGuard tips: -keepnames class * extends java.lang.Throwable

カスタム例外クラスをminifyしないようにしておかないと、クラッシュログを検索しにくいということに気づきました。

以下の設定で、すべてのThrowableのサブクラスでminifyを防止できるようです。

```
-keepnames class * extends java.lang.Throwable
```
Struts2.3.24へバージョンアップするときの注意点

# struts-default.xmlの内容からインターセプタの内容変更をした場合

もしstruts.xmlで設定した内容で、インターセプタの設定を変更していない、ないしはdefaultStackの内容を改めて定義していないなら本対応は不要です。

独自でインターセプタ定義を上書きないしは新たに定義している場合は、  **ParameteresInterceptorの定義を指定しないよう** 修正します。

```xml:struts.xml
<struts>
	<package name="sample-default" abstract="true" extends="struts-default">
		<interceptors>
			<interceptor-stack name="sampleStack">
				<interceptor-ref name="exception" />
				....(略)....
				<interceptor-ref name="actionMappingParams" />
				<!-- ↓2.3.24修正点 ↓-->
				<interceptor-ref name="params" />
				<!-- ↑2.3.24修正点 ↑-->
				<interceptor-ref name="conversionError" />
				....(略)....
				<interceptor-ref name="workflow" />
			</interceptor-stack>
		</interceptors>
	</package>
</struts>
```

ParameterInterceptors(エイリアス：paramsの部分)から、要素値は空に指定します。従来のバージョンでは excludeParamsを指定していましたが、 **除外してください**

## 参考記事

[S2-024|Apache Struts 2 Documentation](http://struts.apache.org/docs/s2-024.html)
ショッピング、商品画像の登録までの流れ

yahooショッピングに商品画像の登録をしようと思い、
商品画像アップロードAPIを使ってPOSTしたところ
OKの回答が来ました。
ただしこの画像はダミーデータです。

ここから、この商品画像のみ反映、または削除
したいのですが何か方法はありますか

http://i.yimg.jp/images/biz_ec/promo/shp_api/item/img/item_edit_Single.pngを参照すると
これ以降、全件予約反映予約APIを実行　とありますが
これでは、それまでにたまっている全データが
反映されてしまいますよね。

データチェック履歴APIを利用したところ
画像データはチェックされてないようです。

基本的なフローとして
商品画像アップロードAPI=>OK
データチェック履歴API
何らかの削除,または全件反映APIと考えていますが
ちがっていますか
AsyncTaskLoaderのあるActivityに戻ってきたときに再度loadInBackgroundが呼ばれる問題

# 概要
AsyncTaskLoaderの実行後に実行したアクティビティのonStartがコールされると実行したAsyncTaskLoaderのonStartLoaderがコールされてloadInBackgroundが実行されてしまう。
# 解決法
## onStartLoaderでloadInBackgroundが意図しないタイミング実行されないようにフラグで制御する
```lang:サンプルコード
public class SampleAsyncTaskLoader extends AsyncTaskLoader<Boolean>
{
	/**
	 * タスク開始フラグ
	 */
	private boolean 				mIsStarted;
	
	/**
	 * コンストラクタ
	 */
	public SampleAsyncTaskLoader(Context context)
	{
		super(context);
		// タスク開始フラグを立てる
		this.mIsStarted = true;
	}

	@Override
	public Boolean loadInBackground()
	{
		〜バックグラウンド処理〜
		// タスク開始フラグを下ろす
		this.mIsStarted = false;
		return true;
	}

	@Override
	protected void onStartLoading()
	{
		// タスク開始フラグが立っていれば、バックグラウンド処理を実行する
		if(mIsStarted == false)
		{
			return;
		}
		forceLoad();
	}
}
```
## onLoadFinishedでgetLoaderManager().destroyLoaderを呼び出す。
```lang:サンプルコード
@Override
public Loader<Boolean> onCreateLoader(int id, Bundle args)
{
	return new SampleAsyncTaskLoader(this);
}
@Override
public void onLoadFinished(Loader<Boolean> loader, Boolean data)
{
	〜処理〜
	getLoaderManager().destroyLoader(loader.getId());
	// または
	// getSupportLoaderManager().destroyLoader(loader.getId());
}
@Override
public void onLoaderReset(Loader<Boolean> loader){}
```
# 参照
## initLoader()とrestartLoader()のどちらを使うか
http://d.hatena.ne.jp/Kyakujin/20130528/1369729549
## AsyncTaskLoaderのあるActivityに戻ってきたときに再度loadInBackgroundが呼ばれる問題
http://blog.loadlimits.info/2012/09/asynctaskloader%E3%81%AE%E3%81%82%E3%82%8Bactivity%E3%81%AB%E6%88%BB%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%86%8D%E5%BA%A6loadinbackground%E3%81%8C%E5%91%BC%E3%81%B0/
## AsyncTaskLoaderを４ヶ月常用してみて
http://blog.nkzn.info/entry/20120514/1336979844
Vagrant 1.7.2のchef-zeroプロビジョナでCookbooksの同期バグを一時的に回避する


EC2などをプロバイダにした時、2回目以降の同期対象がおかしいアレ。

[Problem reloading Chef shared folders · Issue #5199 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/issues/5199)


で、とりあえずの回避策。
`.vagrant/machines/default/aws/synced_folders`ファイルがなければ毎回rsyncに行くので、Vagrantfileで消す。

```Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

if Vagrant::VERSION == "1.7.2"
  synced_folder_files = Dir.glob(File.expand_path("../.vagrant/machines/**/synced_folders", __FILE__))
  synced_folder_files.map do |synced_folder_file|
    File.unlink(synced_folder_file) if File.exists?(synced_folder_file)
  end
end

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

## -- ship --
```

vagrantコマンドを何かしら実行するたびに`synced_folders`ファイルが消えちゃうけど、実害はないのでいいっしょ。
CoffeeScriptで無名関数の再帰

#当たり前っちゃあ当たり前なのだが
なのだが！　とりあえず、Javascriptについて書かれていて、CoffeeScriptだと探すのにちょっと苦労するTIPSは、遠慮なくポストします。

とりあえず、無名関数の再帰呼び出しに関してのよくある悩み事はこんな感じかな。
* arguments.calleeだったっけ？　存在がちょっとヤバゲだし、なくなるんじゃなかったっけ？
* Yコンビネータとかなにそれおいしーの？　なんか怖いんだけど。
* 1引数関数の例があちこちにあるけど、2引数渡したいんだけど駄目？
まあ、3番目のは、「引数をオブジェクトに纏めてどれもこれも同じYコンビネータ使うのも良いかもね」とゆー考えもなくもないのですが、関数を引数に取る関数に関数を引数に取る関数自身を渡す関数を使う、っていうコンセプトなんだから、複数の引数だってできるに決まってんじゃん、とか、やっている人は思うんだけど、多分怖い人は怖い。それにね、1変数関数を再帰にする例って、Yコンビネータの原理が分かりにくいと思うんだよね。Yコンビネータの仕組みをカラダで感じないというか。でもな、おじさんにぜんぶまかせてごらん、きもちーよ？

でもって、augumentsという変な変数とapplyという変な関数呼び出しの仕方をすれば、いくつでも変数が渡せます。それは、きもいと感じる人にはきもいので、また別項改めて。

#では、サンプルです
折角、CoffeeScriptを使うと、Yコンビネータの見た目もちょっと優しく愛らしい感じになるので、サンプル行っときましょう。題材は、身近な再帰ということで、しかも、引数が色々増えそうな感じなのはディレクトリ走査ですかね。

```coffeescript:ycombi.coffee
fs = require('fs')

scandir_inside = (func) ->
  return (srcpath, param) ->
    if not fs.existsSync srcpath
      return -1
    filearray = fs.readdirSync srcpath
    for fileordir in filearray
      statresult = fs.statSync srcpath+'/'+fileordir
      if statresult.isFile()
        console.log 'scanfiles '+fileordir
      else if statresult.isDirectory()
        console.log 'scandirs '+fileordir
        func srcpath+'/'+fileordir,param


#所謂Yコンビネータ
y_with_2_args = (func) ->
  return ((p) ->
    return (q,r) ->
      return func(p(p))(q,r)
  )((p) ->
    return (q,r) ->
      return func(p(p))(q,r)
  )

#Yコンビネータを噛ます
scandir = y_with_2_args(scandir_inside)

#ためしてみようほととぎす
scandir '/path/to/start/directory',{project: 'testtest', test:12}
```

scandir_insideの最後の行で、funcを呼んでいますね。これは、1行目の引数のfuncです。つまり、渡される関数を呼び出すクロージャになっているだけで、これだけでは必ずしも再帰とは限らない書き方なわけですが、まあ、再帰しようと思って書いてますよね。どうみても。

で、Yコンビネータが、「引数（である関数）を、引数（である関数）を引数として呼び出す」ことによって、再帰を実現します。入口と出口があるパイプ（scandir_inside）に入口と出口を繋げる装置（y_with_2_args）を嵌めこんだら、循環する機械ができました（scandir）って感じ。

ここでのYコンビネータ（別名不動点コンビネータ）は、2引数用。3引数にしたければ、4箇所全部q,r,sにして下さい。「引数（である関数）を、引数（である関数）を引数として呼び出す」ので、その「引数（である関数）」の呼び出しの形は合わせないと使えない、ってことです。

さて、追記しておきましょう。さっきのは原理を理解しやすくするためにscandir_insideなんて変数に入れたけど、もう分かりますよね。直接Yコンビネータの引数の中に無名関数を入れちゃえば、そんなの要らなくなると言うことを！

なので、実践的にはこんな風に書くとカコイイ！です。

```CoffeeScript:ycombi.coffee
fs = require('fs')

#所謂Yコンビネータ
y_with_2_args = (func) ->
  return ((p) ->
    return (q,r) ->
      return func(p(p))(q,r)
  )((p) ->
    return (q,r) ->
      return func(p(p))(q,r)
  )

#Yコンビネータを噛ましつつ無名関数を書いちゃう
scandir = y_with_2_args (func) ->
  return (srcpath, param) ->
    if not fs.existsSync srcpath
      return -1
    filearray = fs.readdirSync srcpath
    for fileordir in filearray
      statresult = fs.statSync srcpath+'/'+fileordir
      if statresult.isFile()
        console.log 'scanfiles '+fileordir
      else if statresult.isDirectory()
        console.log 'scandirs '+fileordir
        func srcpath+'/'+fileordir,param

#ためしてみようほととぎす
scandir '/path/to/start/directory',{project: 'testtest', test:12}
```

使えばだんだん気持ちよくなるけど、別に奥は深くないTIPSです。ご参考まで。
[クイズ] WindowsでのSubversion設定ディレクトリはどこでしょう？

正解：
クライアントによりどちらを使うかが違います。

* C:\\Users\\You\\.subvesion
* C:\\Users\\You\\AppData\\Roaming\\Subversion

面倒な目に遭わないためには、二つのディレクトリを同一視できるようにしておきましょう。
後者だけを作成した状態であるとして、管理者権限で起動したコマンドプロンプトで

```
mklink /D %HOME%\.subversion %APPDATA%\Subversion
```

これでシンボリックリンクが作成され、両方のディレクトリパスが同じディレクトリを意味するようになりました。
スマホサイト用　ドロワーメニュー

横からヒョコッと出てくるメニュー（よくあるやつ）の導入。

slidebarsというjqueryを使う。
PageSlideという有名なやつもあるけど、公式は配布していないっぽい？

1.  http://plugins.adchsm.me/slidebars/ からダウンロード。  
    slidebars.min.cssとslidebars.min.jsをアップロード。  
    slidebars.min.cssはデフォではbackground-colorが指定されているが、場合によっては削除しても良い。
2.  `<header>`内に以下を記述。

    ```html
    <link rel="stylesheet" href="/css/slidebars.min.css" media="all">
    ```

    `<body>`直前に以下を記述。

    ```html
    <script src="/js/slidebars.min.js"></script>
    <script>
        (function($) {
            $(document).ready(function() {
                $.slidebars();
            });
        }) (jQuery);
    </script>
    ```

3.  htmlには以下のように
    元々のコンテンツ部分

    ```html
    <div id="sb-site">

    </div>
    ```

    メニュー部分

    ```html
    <div class="sb-slidebar sb-left sb-style-overlay">

    </div>
    ```

    sb-style-overlayは元々のコンテンツ部分の上に重ねて表示した場合。
    左右に寄せたい場合sb-style-push

    メニューボタン

    ```html
    <a href="" class="sb-toggle-right">

    </a>
    ```

    メニューボタンを固定させる場合、以下のCSSを設定。`z-index:1030`は公式サイトのページを参照した。
    .sb-slidebarのpaddingは上部固定だとpadding-top、下部固定だとpadding-bottomで設定。

    ```css
    .menuHeader{position:fixed; z-index:1030;}
    .sb-slidebar{padding-bottom:40px}
    ```

    で、できるはず。

    あと場合によっては#sb-siteの下余白が妙に空いてしまうときがあるので、
    その場合、min-height:100vhを上書きする。以下のようにやれば良さげ。

    ```css
    #sb-site{min-height:auto; min-height:initial;}
    ```

http://paivittain-kukka.com/slidebars/
http://coliss.com/articles/build-websites/operation/javascript/jquery-plugin-slidebars.html
http://wryoku.com/howto-slidebars_header_fixed/


※追記
Androidの一部の端末（私の場合だとGalaxyだった）だと、ドロワーメニュー出した時にドロワーの下の層のリンクが選択されたり、
ドロワーのリンクを選択しても下の層のリンクが選ばれる場合がある。
このときはz-indexがうまく働いていないので、

```css
-webkit-transform: translate3d(0, 0, 2px);transform: translate3d(0, 0, 2px);
```

をz-indexの代わりに用いるとうまくいった。

http://liginc.co.jp/web/html-css/130658
http://webamb.com/smartphone/1205.html
http://loosely.net/archives/82
http://qiita.com/fnobi/items/ce67c0eeaa2d58733aca

※追記２

iPhone5S でsafari閲覧時にサブメニューを出力したときに、サブメニューをタップしてスクロールすると、
サブメニューが真っ白になってしまったことがあった。
そのときは、以下のようにコメントアウトすれば良い

 ```slidebars.css
.sb-slidebar,.sb-slidebar *{/*-webkit-transform:translateZ(0px)*/}
```

http://2eb.jp/ios8-overflow-scrolling/
TabHostでタブに9patchを適用した画像を使用すると画像が崩れる

#概要
TabHostを使ってタブを実装し、そのタブに対して9patchを適用した画像を使用した場合に画像が崩れる現象が発生した。
#詳細
タブに対する画像設定は以下の通り。

```lang:タブ設定処理
TabHost tabHost = (TabHost)parentView.findViewById(android.R.id.tabhost);
tabHost.setup();
TabSpec tabSpec = tabHost.newTabSpec(TAB_ID);
TabView tabView = new TabView(context, tab_layout);
tsMyPlan.setIndicator(tabView);
tsMyPlan.setContent(R.id.tab);
tabHost.addTab(tabSpec);
```

```lang:tab_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="30dp"
    android:orientation="vertical" 
    android:background="@drawable/tab">
</LinearLayout>
```

```lang:drawable/tab
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:state_selected="true"
        android:drawable="@drawable/tab_active"/>
    <item 
        android:state_selected="false"
        android:drawable="@drawable/tab_deactive"></item>
</selector>
```
以下の端末で現象を確認
Galaxy NEXUS　OS4.2.2
#解決法
**すべてのタブに設定する画像の9patch設定を同じにする。**

いろいろ、試行錯誤しましたが結論はこれでした。
しかし、Draw9Patchは使いづらいので書き直すのが大変でした。
pycscopeを使う

cscopeでPythonを読む方法。

```bash
find . -name "*.py" > cscope.files
pycscope -i cscope.files
```

これだけで`cscope.out`が生成された。`pycscope`自体はリポジトリにあったりなかったりするかもしれない。
`cscope.files`さえできれば、`cscope`を使ってもいい。

```bash
cscope -b
```

でも精度は`pycscope`の方が良い気がする。

Ref: http://d.hatena.ne.jp/goinger/20100424/1272134240
[Swift 1.2] UIViewの自作subclassの初期化

以前に投稿した
[[Swift] UIViewの自作subclassの初期化](http://qiita.com/tkuma/items/7e63c7fc9daf2a43c6cd)
が Swift 1.2 の変更でエラーになってしまうので、1.2の記述方法で初期化してみます。
(結論コードは一番下にあります。)

まずは、新規ファイルから「Cocoa Touch Class」を選択し、以下のように設定しましょう。

* Class: CustomClass
* Subclass of: UIView
* Language: Swift

(クラス名はなんでも良いです。以下の文章で出てくるので、違う名前を付けたときは置き換えてください。)
すると、こういうクラスが作られます。普通ですね。

```:CustomView.swift
class CustomView: UIView {

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
    }
    */

}
```

ViewControllerで作ったクラスを生成してみます。

```:ViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        // さっき作ったやつ
        var myView = CustomView()
    }
```

普通に生成できました。

じゃあ次にオリジナルのinitを作っていきます、コンストラクターです。

```:CustomView.swift
    init() {
        super.init()
    }
```

(コメントアウトの部分は消しました。)
エラーが出てしまいます、2箇所も。

原因は２つあります。

* UIViewのinit()は子クラスから呼ぶことは出来ない。
* 必須の初期化メソッドが呼ばれていない。

一つ目のエラーは、UIViewのinit()は子クラスから呼ぶことは出来ない、というエラーです。
もちろんこんな風に生成することは出来ます。
`var myUIView = UIView()`

これはUIViewのinit()が、convenience initializerなので子クラスからは呼ぶことが出来ないんです(たぶん)。
(convenience initializerについては別途調べて見てください。)

そして二つ目のエラーは、必須の初期化メソッド(required init)が記述されていない、というエラーです。
なにかしらのinitを記述した際には、もし親クラスに required init があった場合は、
それを必ずオーバーライドしなくてはいけません。
(requiredそれがしについては別途調べて見てください。)

それではエラーが出ないように修正していきます。
まず2つ目のエラーから修正していきます。
2つ目のエラーの対処は簡単です。

行番号の横に出るエラーのアイコンをクリックして、エンターを押せば自動で必須メソッドをオーバーライドしてくれます。

```:CustomView.swift
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
```

このメソッドが呼ばれるのは、コードによる生成ではなく、StoryBoardやXibでCustomViewを使うと呼ばれるようになります。
fatalErrorは単純にアプリがエラーで止まります。
コードでしか生成しない場合は、そのままにしておきます。
クラスを作っていく工程で、コードでの生成しか想定しておらず、万一StoryBoardでCustomViewを使ってしまってもエラーで止まってくれるので、想定していないバグを未然に防ぐことができますね。

では、次にinit()を使えるようにしましょう。
まず結論(のコード)から先に書いてしまうと以下のようになります。

```:CustomView.swift
class CustomView: UIView {
    
    init() {
        super.init(frame: CGRectZero)
    }
    
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
```

init()の中では、super.init(frame: CGRect)を呼ぶようにしました。
(CGRectZeroはCGRectMake(0, 0, 0, 0)と同じです。)

super.init(frame: CGRect)は子クラスからも呼べるイニシャライザです。
(convenienceかdesignatedそれがしの違いです。)

これでUIViewの自作subclassの初期化が出来ました。
わかりやすさを優先に結構省略して書いたので、足りない説明もあるかと思いますが、
詳しい説明は色々な方がQiitaに投稿されているのでそちらをご覧ください。
BEMを使ったサイトを取集してみる


[BEMを参考にしたCSS設計](http://qiita.com/mrd-takahashi/items/07dc3b4bad027daa2884)を更新したいけど、その前に情報収集。

BEMの手法を使ったサイトはどのくらいあるのだろう？
というわけで収集してみる。

## BEMでコーディングされたサイト
###[Wii U｜Nintendo](http://www.nintendo.co.jp/wiiu/index.html)
よく見ると部分的にBEMが採用されている感じ。コンテンツを入れ替えた時にコーディングポリシーを変更したのかも。
[トップページ](http://www.nintendo.co.jp/index.html)はBEMではなくOOCSSっぽい。

BEMで書かれている部分は、BEMのお作法に従い（-）ハイフンつなぎ。
フッターとjsを無効にした時の画面用のコーディングはOOCSSらしく、単語は（\_）アンスコつなぎ。
SVGのclassは（\_）アンスコ、idは（\-）ハイフンつなぎのようだ。
BEMはidは使わないのだが、このページにはidが多数使われている。
idはローワーキャメルケースか（\_）アンスコで単語をつなげている感じ。
コードの書き方がいくつか混在しているようで、じっくり確認した方がよさそうなものの、ひとまずBEM系のコーディングと言うことでメモ。

### [SONY](http://www.sony.jp/)
一瞬違うかな？と思いきや、BEMを使ったコーディングであることは間違いなさそう。
**s5-**はプレフィックスらしく、よーく見るとBEMの形式で書かれている。
「BlockやElementを2つ以上の単語で表すときは（-）でつなぐ」というBEMの基本的なお作法は使用されておらず、単語のつなぎはローワーキャメルケースを使用しているようです。

ちょっと驚いたのが

```html:html
 <meta charset="shift_jis">
```
の一行でしょうか。
また、インデントがないコーディングなので、コードを見る側としては、ちょっと見づらかったりしますw


以下、確認しながら記事を書いてるので、ちょちょろ追記していく予定ですw
postgresqlのrefcursorの扱い方

spockでPostgreSQLのストアドのテストをしようとして最初ハマッたのでメモ

```sample.groovy
def sql = Sql.newInstance(省略)
// 引数１、２が文字列、引数３がOUTでInteger、引数４がOUTでrefcursorのケース
def s = "{call ストアド名(?, ?, ?, ?)}"
def paras = ["引数１", "引数２", Sql.out(Sql.INTEGER.getType()), Sql.out(Sql.OTHER.getType())]
sql.call(strSql, params) {errorCd, rows->
	rows.eachRow {rs->
		// 取得結果（hogeカラム）へのアクセス例
		def hoge = rs.hoge
	}
}
```

refcursorはSQLタイプとしてOTHERを指定する。
（outがtext[]の場合はARRAYを指定する）
それとrefcursorにアクセスするにはeachRowの中でアクセスしないと
ResultSetは閉じられているという実行時エラーとなる。

pgAdminでこのストアドを使おうとした場合
begin;
ストアド名('引数１', '引数２');
と書いて実行すると\<unnamed portal 数値\>というのが取ってこれて
fetch all "\<unnamed portal 数値\>";
とやらないとrefcursorにアクセスできないのと同じ原理だと思う。

ちなみにこのrsをコピーしてeachRowの外で使おうとしても
やっぱりResultSetは閉じられているっていう実行時エラーとなる。
whenで実行してデータを保持しといてthenでassertしたいのだけど
やり方がわからない(´；ω；｀)
filter-branchで指定した範囲のコミットログを修正する

ブランチの作業の途中でBacklogからRedmineに移行して、コミットコメントの記述方法に関する運用ルールが変わった。
featureをrefに直せば良さそうだったので、作業中のブランチに適用することに。
`git rebase -i` でひとつずつ修正するのでも良いですが、一括で修正する方法を試してみたかった。

結果的には、修正したい開始点と終点にテンポラリでブランチを作って、範囲にブランチ名を指定する形で成功した。
HEAD~8..HEAD~32という参照がうまく効かなくてハマった。

### 結論

```bash
git filter-branch --msg-filter '
  sed -e "s/^feature.*$/ref\ #146/"
'  tmp2..tmp
```

tmp2の方が過去。
```feature```で始まる行を```ref 146``` に書き換えている。
# PostgreSQLについて

##　インストールするOS
- Win8
- Vagrant環境でCentOS6.6

## インストール
インストールされているPostgreSQLが古いので9.3をインストールする。
-  レポジトリの追加
-  PostgreSQLのインストール
-  確認

### レポジトリの追加
` yum -y install http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm`

### PostgreSQLのインストール
`yum -y install postgresql93 postgresql93-server postgresql93-libs`

## 初期設定
- DBの初期化
- サービスの起動
- 自動起動ON

### DBの初期化
`service postgresql-9.3 initdb`

### サービスの起動
`service postgresql-9.3 start`

### 自動起動ON
`chkconfig postgresql-9.3 on`

### ユーザーの登録
```bash
su - postgres
createuser --superuser vagrant
```

### postgresql.confの編集
`cd /var/lib/pgsql/9.3/data/`

```ini
 (-) listen_addresses = 'localhost'
 (+) listen_addresses = '*'
```

### pg_hba.confの編集
`cd /var/lib/pgsql/9.3/data/`

```ini
(+) host    all             all            127.0.0.1/32                 trust
(+) host    all             all            [ホストのIPアドレス]            trust
```

### confファイル反映
`service postgresql-9.3 restart`
004 - Blocklyを使ったオリジナルVisual Programming Editorを作ってみる


## いよいよコードの生成
今回はカスタムブロックのコードジェネレーターを作成します。ひとまずJavaScriptを出力するようにしてみます。コードジェネレーターについての公式ドキュメントは[こちら](https://developers.google.com/blockly/custom-blocks/generating-code)。

### color_block の Generator を実装
さて、Block Factory で作成された Generator のスタブコードを拡張します。/blockly/generators/javascript/color_block.js として保存したコードを以下のようにします。

```js
Blockly.JavaScript['color'] = function(block) {
  var colour_color = block.getFieldValue('color');
  // TODO: Assemble JavaScript into code variable.
  var code = '' + colour_color;
  // TODO: Change ORDER_NONE to the correct strength.
  return [code, Blockly.JavaScript.ORDER_ATOMIC];
};
```

getFieldValueは設定されたRGB値をテキストとして取得して返します。この関数は必ずリストを返す必要があるようです。最初のcodeは自身で生成したJavaScriptのコード（文字列）です。２つ目の要素は式の評価の優先度を指定するようです。具体的には[こちら](https://developers.google.com/blockly/custom-blocks/operator-precedence)に記載されています。そのページの最後のパラグラフに「わからなかったらとりあえずvalueToCodeではATOMICをつかえばいいよ。最後のreturnするときだけNONEを指定してカッコでくくるようにすればいい。」的な事が書いてあります。なので今回はORDER_ATOMICを指定します

## setting_block の Generator を実装
このブロックのコードでページ内のフォントカラーを変更するようにします。

```js
Blockly.JavaScript['foreground_setting'] = function(block) {
  var value_foreground = Blockly.JavaScript.valueToCode(block, 'foreground', Blockly.JavaScript.ORDER_ATOMIC);
  // TODO: Assemble JavaScript into code variable.
  var code = 'document.getElementById("header").style.color =  "' + value_foreground + '"\n';
  //console.log(code);
  return code;
};
```

idがheaderの要素のカラーを変更するコードとしてみました。HTML上にheaderというidを持つ要素を追加します。

```html
<h1 id="header">色が変わる！</h1>
```

出来上がったJavaScriptを実行するため、ボタンを配置します。

```html
<button onclick="ExecCode()">実行</button>
<script>
  function ExecCode()
  {
    var code = Blockly.JavaScript.workspaceToCode(workspace);
    eval(code);
  }
</script>
```

ここまで来たらビルドします。

```bash
python build.py
```

エラーなく完了したらindex.htmlを開いてブロックを並べてボタンを押すと、テキストの色が変わるようになります。

## まとめ
ここまででブロックの作り方、ジェネレータの作り方を試せた事になります。次はJavaScriptではなく、Cなどの他言語用のコードを出力する方法を試していきたいと思います。