OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL CLIクライアントをカラー表示



MacのMySQLが寂しいので[colour-mysql-console](https://github.com/nitso/colour-mysql-console)で色を付けてみた.

## インストール手順

以下を実行するだけで、あとはいつも通り`mysql`コマンドでクライアントを起動するだけ！

```bash
brew install grc
curl -o ~/.grcat https://raw.github.com/nitso/colour-mysql-console/master/.grcat
curl -o ~/.my.cnf https://raw.githubusercontent.com/nitso/colour-mysql-console/master/.my.cnf
mysql
```

以下のファイルがうまく書き込まれてるか確認してください.

- `~/.grcat`
- `~/.my.cnf`

![colour-mysql-console.png](https://qiita-image-store.s3.amazonaws.com/0/21086/efc34bb1-dd2e-db3c-2dc9-1b0c6a1099d5.png "colour-mysql-console.png")


色が変わるだけですが目視しやすくなった.
MacOSXで非表示になっている「ライブラリ」フォルダを表示させる方法


Lion（10.7）以降のMacOSXでは、ユーザのホームフォルダ下にある「ライブラリ」フォルダはデフォルトで非表示となっている。
フォルダの表示・非表示を変更したい場合、ターミナルから下記のコマンドを実行すれば良い。

### 1. 「ライブラリ」フォルダを表示したい場合

` chflags nohidden ~/Library` 


### 2. 「ライブラリ」フォルダを非表示にしたい場合
` chflags hidden ~/Library`
CreateJSのEventクラスをCoffeeScriptでextendsする




1. 先にinitializeを呼んでから、
2. super()する


```ExEvent.coffee
class ExEvent extends createjs.Event
  constructor: (type, @data = null, bubbles = true, cancelable = true) ->
    @initialize()
    super(type, bubbles, cancelable)

  clone: ->
    new ExEvent(@type, @data, @bubbles, @cancelable)

```
zaw(zsh anything.el-like widget)による圧倒的な操作性の向上

# zaw - zsh anything.el-like widget

![zaw.gif](https://qiita-image-store.s3.amazonaws.com/0/30426/897c3c75-be87-2414-7c13-adb37c497312.gif)

[zaw](https://github.com/zsh-users/zaw)はEmacsにおける[anything.el](http://www.emacswiki.org/emacs/anything.el), [helm.el](https://github.com/emacs-helm/helm),
あるいはvimにおける[unite.vim](https://github.com/Shougo/unite.vim)に対応するpluginです。

- 履歴の検索
- ディレクトリの移動
- gitの操作 (branchの切替, fileのステージ等)
- processの管理 (PIDの取得, kill)
- tmux (attach)

といったシェルでするべき事の大半がこのプラグインで非常に直感的に操作できます。
残念ながら、私には言葉でこのプラグインの素晴しさが伝えられないので
上のgifアニメをご覧ください。

anything.elやunite.vim等を使用した事のある方なら馴染みのある考え方だと思いますが、
zawでは *source* に *action* を結び付けます。
ディレクトリの移動においては *source* は最近訪れたディレクトリの一覧であり、
*action* はそのディレクトリに移動(cd)したり、パスを現在のコマンドラインに挿入する操作に相当します。
*source* に *action* をマッピングし、それらの選択をインクリメンタル検索する機能をzawが提供します。


## install
導入は簡単です。zawをcloneして.zshrcからsourceするだけです。

```shell
git clone git://github.com/zsh-users/zaw.git
echo "source ${PWD}/zaw/zaw.zsh" >> ~/.zshrc
```

これでzshを再起動すれば使用できます。

1. Ctrl-x; (^x;)でzawを起動する
2. sourceの一覧がでるので^p, ^nで移動してEnterで決定

あとは表示されるactionを選んでEnterです。
^p, ^nで移動する際に文字を入力すると、インクリメンタル検索されます。

## 設定

よく使用するcdrやhistoryにはさらにショートカットが欲しい所。
私は以下のように設定しています：

```zsh
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
add-zsh-hook chpwd chpwd_recent_dirs
zstyle ':chpwd:*' recent-dirs-max 500 # cdrの履歴を保存する個数
zstyle ':chpwd:*' recent-dirs-default yes
zstyle ':completion:*' recent-dirs-insert both

source $ZDOTDIR/zaw/zaw.zsh
zstyle ':filter-select:highlight' selected fg=black,bg=white,standout
zstyle ':filter-select' case-insensitive yes

bindkey '^@' zaw-cdr
bindkey '^R' zaw-history
bindkey '^X^F' zaw-git-files
bindkey '^X^B' zaw-git-branches
bindkey '^X^P' zaw-process
bindkey '^A' zaw-tmux
```

`zaw-${source}`のようなのが zle (zsh line editor) コマンドです。
これは`bindkey`で特定のキーマッピングを指定できます。
Java8 ラムダ式用のクラス

## 背景

Java 8 が公開され、Javaでもラムダ式が使えるようになった。
言語的制約により、Javaはプリミティブ型を含むものは別のインタフェースを用意せざるを得なかった。

その結果、必要なクラス名が簡単にはわからなくなってしまったので、とりあえず列挙してみた。
規則性はあるようだが、命名規則の優先度がいまいちよく分からない

## 対象

対象は `Runnable`クラス, `java.util.function`名前空間のものである。

## 一覧表

| ラムダ式の型 | Javaのクラス + メソッド名 |
|---|---|
| () -> void | java.lang.Runnable.run |
| (T, U) -> void | java.util.function.BiConsumer.accept |
| (T, U) -> R | java.util.function.BiFunction.apply |
| (T, U) -> boolean | java.util.function.BiPredicate.test |
| () -> boolean | java.util.function.BooleanSupplier.getAsBoolean |
| T -> void | java.util.function.Consumer.accept |
| (double, double) -> double | java.util.function.DoubleBinaryOperator.applyAsDouble |
| double -> void | java.util.function.DoubleConsumer.accept |
| double -> R | java.util.function.DoubleFunction.apply |
| double -> boolean | java.util.function.DoublePredicate.test |
| () -> double | java.util.function.DoubleSupplier.getAsDouble |
| double -> int | java.util.function.DoubleToIntFunction.applyAsInt |
| double -> long | java.util.function.DoubleToLongFunction.applyAsLong |
| double -> double | java.util.function.DoubleUnaryOperator.applyAsDouble |
| T -> R | java.util.function.Function.apply |
| (int, int) -> int | java.util.function.IntBinaryOperator.applyAsInt |
| int -> void | java.util.function.IntConsumer.accept |
| int -> R | java.util.function.IntFunction.apply |
| int -> boolean | java.util.function.IntPredicate.test |
| () -> int | java.util.function.IntSupplier.getAsInt |
| int -> double | java.util.function.IntToDoubleFunction.applyAsDouble |
| int -> long | java.util.function.IntToLongFunction.applyAsLong |
| int -> int | java.util.function.IntUnaryOperator.applyAsInt |
| (long, long) -> long | java.util.function.LongBinaryOperator.applyAsLong |
| long -> void | java.util.function.LongConsumer.accept |
| long -> R | java.util.function.LongFunction.apply |
| long -> boolean | java.util.function.LongPredicate.test |
| () -> long | java.util.function.LongSupplier.getAsLong |
| long -> double | java.util.function.LongToDoubleFunction.applyAsDouble |
| long -> int | java.util.function.LongToIntFunction.applyAsInt |
| long -> long | java.util.function.LongUnaryOperator.applyAsLong |
| (T, double) -> void | java.util.function.ObjDoubleConsumer.accept |
| (T, int) -> void | java.util.function.ObjIntConsumer.accept |
| (T, long) -> void | java.util.function.ObjLongConsumer.accept |
| T -> boolean | java.util.function.Predicate.test |
| () -> T | java.util.function.Supplier.get |
| (T, U) -> double | java.util.function.ToDoubleBiFunction.applyAsDouble |
| T -> double | java.util.function.ToDoubleFunction.applyAsDouble |
| (T, U) -> int | java.util.function.ToIntBiFunction.applyAsInt |
| T -> int | java.util.function.ToIntFunction.applyAsInt |
| (T, U) -> long | java.util.function.ToLongBiFunction.applyAsLong |
| T -> long | java.util.function.ToLongFunction.applyAsLong |
| T -> R | java.util.function.Function.apply |
Rails で検索ボックスに入れるLIKE検索のScope


### 筆者環境

-

| 環境 　　　　|バージョン  |備考 |
|:-----------|:------------|:------------|
| MacOSX     | 10.9.2     |MacBookProRatina|
| Homebrew   | 0.9.5      ||
| Ruby       | 2.1.0      |最新バージョン|
| Rails      |3.1.0,4.0.3 |3系,4系ともに高負荷(月間100万PV)にて実績|

-


普段、solorの全文検索を使っていますが、スコープを書いてみたので、活用してみてください。

## 検索条件

１．前後トリムしたい。
　　例：「　テスト　」 => 「テスト」
２．スペースで値をor検索したい。
　　例：「鈴木　イチロー」 => 「鈴木とイチローを検索条件にしたい。」


```Terminal
  scope :searchstring, ->(search_string){
    tokens = search_string.split(' ').map { |c| "%#{c.downcase}%" }
    if tokens.present?
      users = users.where((['( name like ? )']*tokens.size).join(' AND '),
                          *tokens.map { |token| [token] * 1 }.flatten)
    end
    users
  }
```


```Terminal
User.searchstring("鈴木 イチロー").to_sql
=> 
SELECT `users`.* FROM `users ` WHERE `users `.`deleted_at` IS NULL AND (( name like '%鈴木%' ) AND ( name like '%イチロー%' ))
User. searchstring("鈴 イチロー 木").to_sql
=>
SELECT `users`.* FROM `users ` WHERE `users `.`deleted_at` IS NULL AND (( name like '%鈴%' ) AND ( name like '%イチロー%' ) AND ( name like '%木%' ))
```

のように半角スペースで繋げた分だけLIKE検索が出来るscopeの完成！

全角スペースで繋げた場合の対策はしていないので、詳しい解説とか希望あれば書きます。
【入門】Vimで高速で移動~プラグインなしでの移動まとめ~


最近聞かれたので、
自分がよく使う`Vim`の移動コマンドをまとめてみました。

プラグインいらずの素の`Vim`ですが、
プラグインなしで十分高速に移動できます。

特に一行一文字検索の`f`コマンドとか、
変更してきた箇所をもどれる`g;`コマンドとかが使えてくると本当に便利です。
あっ、この記事は主にファイル内の移動に限っています。

##基本移動

初心者はまず、矢印キーを脱却して、`h, j, k, l`へ。
`10j`のように数字を先に打つと、一気に数字分移動できる

| コマンド | 移動内容 |
|:----:|:----:|
| h | 左へひとつ |
| j | 下へひとつ |
| k | 上へひとつ |
| l | 右へひとつ |


#####ステップアップ

表示上の行移動

| コマンド | 移動内容 |
|:----:|:----:|
| gj | 下へひとつ |
| gk | 上へひとつ | 

```
115 abcdefg
    hijklmn
116 abcd
```

115行目のbにカーソルがある場合、

通常の`j`移動だと、`b➡b`
表示行の`gj`移動だと、`b➡i`

##行移動

| コマンド | 移動内容 |
|:----:|:----:|
| 0 | 行の先頭へ(インデント無視して先頭へ) |
| ^ | 行の先頭へ |
| $ | 行の末尾へ |
| + | 下の行の先頭へ |
| - | 上の行の先頭へ |

#####ステップアップ

前述同様`g`をつけると表示上の移動へ（直感的）


##ページ移動

ガッと移動したい場合

| コマンド | 移動内容 |
|:----:|:----:|
| ctrl + u | 半画面分 上へ |
| ctrl + d | 半画面分 下へ |
| ctrl + b | 一画面分 上へ |
| ctrl + f | 一画面分 下へ |
| { | 段落毎に上へ |
| } | 段落毎に下へ |
| gg | そのファイルの先頭へ |
| G | そのファイルの末尾へ |

他には`:100`で行指定で移動できる。
この場合だと、100行目に移動。

##単語移動

| コマンド | 移動内容 |
|:----:|:----:|
| w | 単語の先頭に進む |
| b | 単語の先頭に戻る |
| e | 単語の末尾に進む |
| ge | 単語の末尾に戻る  |

単語分を進むか戻るか、さらに大文字もある。

#####ステップアップ

| コマンド | 移動内容 |
|:----:|:----:|
| W | 単語の先頭に進む |
| B | 単語の先頭に戻る |
| E | 単語の末尾に進む |
| gE | 単語の末尾に戻る  |

違いは次のような単語を一語とみるかどうか

`abc.def.ghi`

小文字なら5単語 `abc . def . ghi`
大文字なら1単語 `abc.def.ghi`

`a➡i`に行きたい場合、
`e`移動なら5回 `a➡c➡.➡f➡.➡i`
`E`移動なら1回 `a➡i`


##一行一文字検索

これホント便利。多用してます。

| コマンド | 移動内容 |
|:----:|:----:|
| f | その行の順方向に一文字検索 |
| F | その行の逆方向に一文字検索 | 
| t | その行の順方向に一文字検索(カーソルは文字の手前) |
| T | その行の逆方向に一文字検索(カーソルは文字の手前) | 

`abcdefg hijklmn`

`a`にカーソルがある場合、
`fi`で一気に`i`に移動。

#####ステップアップ

これとfキーの組み合わせが、本当に便利。

| コマンド | 移動内容 |
|:----:|:----:|
| ; | 順方向に繰り返し検索 |
| , | 逆方向に繰り返し検索 |

`abcdefg abcdefg abcdefg`

`a`から三つ目の`e`に行く場合、
`fe` `;` `;`
そこから二つ目の`e`に戻る場合
`,`


##検索移動

一般的なページ内文字列検索

| コマンド | 移動内容 |
|:----:|:----:|
| / | 順方向に文字列検索 |
| ? | 逆方向に文字列検索 |
| n | 順方向に繰り返し検索 |
| N | 逆方向に繰り返し検索 |

`abcde abced abcedf`

この場合、`/edf`で末尾の`edf`に移動。
複数行にわたって検索可能。


##括弧移動

これは`d`の削除とか`y`のコピーと合わせて使うと便利。

| コマンド | 移動内容 |
|:----:|:----:|
| % | 対となる括弧へ移動 |

`(abc)`

カーソルが`(`から`%`コマンドで`)`へ移動

##TIPS

####ジャンプリストを辿る

ファイル内も移動できるけど、ファイル間の移動に便利。
直前に編集していたファイルに戻りたいとか。
今回の記事にはそぐわないかな。。

| コマンド | 移動内容 |
|:----:|:----:|
| ctrl + o | ジャンプしてきた箇所に戻る |
| ctrl + i | ジャンプしてきた箇所に進む |

####変更リストを辿る

自分がしたファイルの変更履歴をたどれる。便利。

| コマンド | 移動内容 |
|:----:|:----:|
| g; | 変更してきた箇所に戻る |
| g, | 変更してきた箇所に進む |

####マーク移動
あんまり使っていないから、要望があるまでカット。

##最後に
この移動と組み合わせて削除とかコピーとかいろいろできることが、
vimの移動の便利なところですね。

# 外部アカウント

技術情報のみつぶやくアカウント作成しました。VimやNeoVimの最新情報も発信していきます。
[Twitterはこちら]
(https://twitter.com/takeharumikami)
[Feedlyのフォローはこちら]
(http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Fqiita.com%2Ftakeharu%2Ffeed)
クラスを継承してオーバーライドするぞ



基本だけど継承したときのオーバライドの確認

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


class Parent(object):
    def show(self):
        self.stdout()

    def stdout(self):
        print "poko"


class Child(Parent):
    def stdout(self):
        """
        オーバーライド
        """
        print "child poko"


if __name__ == "__main__":
    parent = Parent()
    parent.show()
    child = Child()
    child.show()
```

```
$ python parent_child.py
poko
child poko
```
gnsync@geeknoteで日本語表示できなくなっちゃった


strip unprintable charactersをコメントアウト
日本語はprintableじゃないのか。。

```
    def _get_file_content(self, path):
        """
        Get file content.
        """
        content = open(path, "r").read()
        
        # strip unprintable characters
        # content = ''.join(s for s in content if s in string.printable)
        
        content = editor.textToENML(content=content, raise_ex=True, format=self.format)
        
        if content is None:
            logger.warning("File {0}. Content must be " \
                           "an UTF-8 encode.".format(path))
            return None

        return content
Twitter Bootstrap Examples の Sticky-Footer と WP Lightbox 2 を組み合わせて使うときの注意

下記の `#outerImageContainer` がポジション調整用。

```css
/* sticky footer styles
-------------------------------------------------- */
html {
  position: relative;
  min-height: 100%;
}
body {
  /* margin bottom by footer height */
  margin-bottom: 215px;
  padding-bottom: 20px;
}

footer {
  position: absolute;
  bottom: 0;
  /* set the fixed height of the footer here */
  height: 215px;
}
/* for lightbox position */
#outerImageContainer {
    margin-top: -60px;
}
```
UIDeviceOrientationを基準にしたUIImageOrientationとAVCaptureVideoOrientationの向き対応


AvFoundationなんかで遊んでいる時にデバイスの向きとカメラの向きで頭がこんがらがります。
背面カメラはそのまま、前面カメラはミラー前提です。

##UIImageOrientation

```objectve-c

- (UIImageOrientation)currentImageOrientation {
	UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];

    // 背面カメラチェック
    BOOL IsBack = [[_activeVideoInput device] position] ==AVCaptureDevicePositionBack;

    switch (deviceOrientation) {
        case UIDeviceOrientationLandscapeLeft:
            return IsBack ?  UIImageOrientationUp:UIImageOrientationDownMirrored;
            break;
        case UIDeviceOrientationLandscapeRight:
            return IsBack? UIImageOrientationDown :UIImageOrientationUpMirrored;
            break;
        case UIDeviceOrientationPortrait:
            return IsBack ?  UIImageOrientationRight:UIImageOrientationLeftMirrored;
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            return IsBack ? UIImageOrientationLeft : UIImageOrientationRightMirrored;
            break;
        default:
            return UIImageOrientationRight;
            break;
    }
}
```

##AVCaptureVideoOrientation
```objectve-c
- (AVCaptureVideoOrientation)currentVideoOrientation {
	UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    
    switch (deviceOrientation) {
        case UIDeviceOrientationLandscapeLeft:
            return AVCaptureVideoOrientationLandscapeRight;
            break;
        case UIDeviceOrientationLandscapeRight:
            return AVCaptureVideoOrientationLandscapeLeft;
            break;
        case UIDeviceOrientationPortrait:
            return AVCaptureVideoOrientationPortrait;
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            return AVCaptureVideoOrientationPortraitUpsideDown;
            break;
        default:
            return AVCaptureVideoOrientationLandscapeRight;
            break;
    }
}

```
シェルで比叡と対話する (hieisay)

注: 積極的に喋りません。対話できません。比叡というよりﾋｪｰです。

以下の記事で`cowsay`というコマンドを知り、作ってみたくなった

- [sachikosayをつくった](http://qiita.com/844196/items/dc24037f121f4606778b)

`cowsay`は自作AAも表示できるけど、全角が文字化けするのでRubyで適当に書いた

# ソース
- [hieisay.rb (Gist)](https://gist.github.com/manuluu/9637890)

AAを等幅にする作業で力尽きた感ある
(フォントによって印象は変わります。Ubuntu(Ubuntu Mono 12pt)に合わせて作りました)

# 使い方
上のソースを保存し、Rubyで実行するだけ
いちいち`ruby ほにゃらら/hieisay.rb`と打ち込みたくない場合はaliasする

## say
`cowsay`が元ネタの為、デフォルトでは引数の文字列をそのままオウム返しする

![Screenshot_from_2014-03-19 18:36:00.png](https://qiita-image-store.s3.amazonaws.com/0/18902/1069744f-f482-21fd-109b-04de71f31256.png)

## react
`-r`オプションをつけると、ﾋｪｰに話しかけることが出来る

![Screenshot_from_2014-03-19 18:38:03.png](https://qiita-image-store.s3.amazonaws.com/0/18902/f455faae-d01f-382e-ae12-0c5d249db6f4.png)

## help
めちゃくちゃショボいくせに無駄にヘルプ搭載してるのでそちらもどうぞ

```shell-session
$ ruby hieisay.rb -h
Usage: hieisay [options]
    -l, --list                       表示可能なﾋｪｰとタイプを全表示
    -s, --speak [TYPE]               ﾋｪｰに喋ってもらう (デフォルト)
                                     TYPE: default, ase, tere, f_ck, cry
    -r, --react                      ﾋｪｰに話しかける
    -i, --interactive                対話モード (空白 or Control+dで終了)
```

# あとがき

→ [[○](https://www.google.co.jp/search?q=%E3%81%AA%E3%81%9C%E3%82%AA%E3%83%AC%E3%81%AF%E3%81%82%E3%82%93%E3%81%AA%E7%84%A1%E9%A7%84%E3%81%AA%E6%99%82%E9%96%93%E3%82%92&tbm=isch)]

# 参考

- [比叡 - 艦隊これくしょん -艦これ- AAまとめ Wiki*](http://wikiwiki.jp/kancolleaa/?%C8%E6%B1%C3)
- Ruby 2.1.0 リファレンスマニュアル - [library optparse](http://docs.ruby-lang.org/ja/2.1.0/library/optparse.html)
- [Ruby実行時のオプションをよろしく解析してくれるoptparseを使ってみる](http://d.hatena.ne.jp/kk_Ataka/20111221/1324477125)
- [Rubyでシェルもどきを作る](http://tmtms.hatenablog.com/entry/2013/10/09/sheru)
RubyでTwitterのOAuth認証用Tokenを取得する(gem使用)

便利なgemがあって便利。

https://github.com/jugyo/get-twitter-oauth-token

```

% gem install get-twitter-oauth-token
% get-twitter-oauth-token

```
Consumer KeyとConsumer Secretを聞かれるので入力。
作成されたauthrizeのURLにアクセスし、Twitterアカウントを認証。
その後表示されるPINコードを入力すると、TokenとSecretが得られる。
Vim で tags ファイル関係の覚書

[Vim で tags ファイル生成を補助するプラグインを作ってみた - Qiita](http://qiita.com/hokorobi/items/71b930abdeb6edb342c7) の前に調べたことや調べていないことを列挙

## 生成コマンド
- [ctags日本語対応版](http://hp.vector.co.jp/authors/VA025040/ctags/) これを使っている。
- cscope
- google tags http://mattn.kaoriya.net/software/vim/20070903122835.htm
- gnu global

## 生成系プラグイン
- [szw/vim-tags](https://github.com/szw/vim-tags) Vim プラグインのルートディレクトリで :TagsGenerate すると .gittags というファイルが作成されていた。Windows に対応していないからみたいで、.git/tags にファイルを保存しようとして、こんなことになっている様子。
- [alpaca-tc/alpaca_tags](https://github.com/alpaca-tc/alpaca_tags) シェルスクリプトを使っているので Windows だと動かなそう。
- [hokorobi/vim-tagsgen](https://github.com/hokorobi/vim-tagsgen) カレントディレクトリの移動が面倒だったので作ってみた。

## 参照系プラグイン
- [tsukkee/unite-tag](https://github.com/tsukkee/unite-tag)
- neocomplete どうやって使うのかわかってない
- [vim-scripts/taglist.vim](https://github.com/vim-scripts/taglist.vim) github は最新になっていない。バッファごとに ctags を実行してタグのリストを表示。ctags 以外も使えるのかな？　あまり調べていない。
- [majutsushi/tagbar](https://github.com/majutsushi/tagbar) taglist と似たようなもの？　ctags 以外も使える。[jstemmer/gotags](https://github.com/jstemmer/gotags) には tagbar での使い方も載っている。tagbar から gotag を使う場合、日本語が混じっていると動かないことがあるみたい。ひとまず、これも使っている。
- [wesleyche/SrcExpl](https://github.com/wesleyche/SrcExpl)

## 疑問
- 逆引きできないのかな？
【PHP(smarty)】.tplを修正したのに、反映されないときの対処法

こんにちは。
他の言語だとどうかわかりませんが  
かなり手間取ったので、メモです。  
  
smartyはファイルを読みにいった際  
templates_cというフォルダに同名に近いファイル(キャッシュ)
を自動生成し、格納する仕組みらしい。
  
実際の作業
１、既存の.tplファイル(templates配下)を修正し、gitで更新  
しかし修正が入ったため、ファイルを戻した。  
  
２、ソースコードをもともとあげておき、なんらかの形でtemplates_cのファイルのほうが更新時間が最近
  
このような修正が入ったために以下のような自体が発生。  
更新日時が
templates配下の~.tplファイル　<　templates_c配下の~.tpl.phpファイル
ex)  
test.tpl                        test.tpl.php
  
こうなるとどうやらtemplates_cを書き込まないため、  
過去のがずっと表示されてしまう。  
  
対応方法は同名のtemplates_c配下のファイルを削除し、  
リロードすることで無事に完了する。  
  
一安心。  
それではこれからも宜しくお願いいたします。
SDカードのパスを(強引に)取得する方法

#はじめに
 Androidで外部ストレージ(SDカード)のパスを取得する場合、昔であれば`Environment.getExternalStorageDirectory()`が使えました。
しかし、最近ではこのメソッドはほとんどの場合内部ストレージのパスを返すようになってしまい、しかもSDカードのパスは機種によってバラバラという混沌とした状況になっています。

調べてみると[vold.fstabをなめ回す](http://nobuo-create.net/sdcard-2/)などの裏技的手法があることがわかりますが、一部の機種では使用できないという情報もあるので、ここでは別の方法を紹介します。

#リムーバブルストレージのパスを取得する
肝となるのは`StorageManager`が隠し持っている`getVolumeList()`というメソッドです。
このメソッドは`StorageVolume`オブジェクトの一覧を返し、`StorageVolume`はファイルパスや取り外し可否などの情報を持っています。
非公開のメソッド・クラスにアクセスするので、リフレクションを使用します。
このメソッドはマウントされていないストレージのパスも取得します。

```java:リムーバブルストレージのパス一覧を取得する
public static String[] getRemovableStoragePaths(Context context) {
    List<String> paths = new ArrayList<String>();
    try {
        StorageManager sm = (StorageManager)context.getSystemService(Context.STORAGE_SERVICE);
        Method getVolumeList = sm.getClass().getDeclaredMethod("getVolumeList");
        Object[] volumeList = (Object[])getVolumeList.invoke(sm);
        for (Object volume : volumeList) {
            Method getPath = volume.getClass().getDeclaredMethod("getPath");
            Method isRemovable = volume.getClass().getDeclaredMethod("isRemovable");
            String path = (String)getPath.invoke(volume);
            boolean removable = (Boolean)isRemovable.invoke(volume);
            if (removable) {
                paths.add(path);
            }
        }
    } catch (ClassCastException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return paths.toArray(new String[paths.size()]);
}
```

##メリット
* ICS以降で(たぶん)動く(Honeycombはソースも実機もないので知らん)
* 機種への依存度が低い気がする(未確認のため情報求む)
* リムーバブルかどうかの判断ができるので、誤って内部ストレージを検出する心配がない
* USB機器など複数の外部ストレージがある場合にも対応できる

##デメリット
* Gingerbread以前では使えない(`getVolumeList()`が無いと言われる)
* 非公開APIなので、将来使えなくなる可能性がある

#ちなみにKitKatでは
`Context#getExternalFilesDirs(String)`というAPIが追加され、複数の外部ストレージ上のアプリ固有パスを取得できるようになったようです。
KitKat以降ではSDカードへの書き込みが制限されたので、書き込みが目的であればこちらを使ったほうが良さそうです。
MySQL: ネタ Aホストのテーブルを Bホストにコピーする

## ネタ Aホストのテーブルを Bホストにコピーする

ホスト 192.168.0.199のachemaのテーブル、TABLE1を、192.168.0.100のbschemaにコピーする

### mysqldumpをしつつ、出力結果をパイプで、コピー先のテーブルに適用していく

```
mysqldump -h 192.168.0.199 -umyaschema-pmypass aschema TABLE1  | mysql -h 192.168.0.100 -umyaschema -pmypass bschema
```

ちなみにもーれつに遅かった。。
nginxで　/welcomeとかを静的ファイルにマッピングする

/welcomeをwelcome.htmlにマッピング  
/をindex.htmlにマッピング  
css js 画像も配信できるように  
location ~ ^/(index) {}がみそ。
/は/index.htmlに変換されてもう一度評価されるため、
上を書かないと、index.html.htmlなるファイルにアクセスしようとする。


    listen 80;
    server_name stg.mono-street.at;
    access_log  /var/log/nginx/stg.access.log;
    root /home/conoha/stg/htdocs;

    location = / {
       add_header Content-type text/html;
       default_type text/html;
       index index.html;
       root /home/conoha/stg/htdocs;
    }

    location ~ ^/(index) {}

    location ~ ^/([^/]+)$ {
      add_header Content-type text/html;
      default_type text/html;
      alias /home/conoha/stg/htdocs/$1.html;
    }

    location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
         root    /home/conoha/stg/htdocs/;
    }
major-mode 見て code beautify する elisp

emacs の major-mode みて、perltify つかったり js-beautify つかったりを自動で分ける。


```el
(defun my-tidy-region (begin end)
  (interactive "r")
  (save-match-data
    (save-restriction
      (my-tidy begin end)
      )))

(defun my-tidy-buffer ()
  (interactive)
  (let (cpoint)
    (setq cpoint (point))
    (save-excursion
      (save-match-data
        (save-restriction
          (mark-whole-buffer)
          (my-tidy (point-min) (point-max)))))
    (goto-char cpoint)
    ))

(defun my-tidy (begin end)
  (let ((current-major-mode major-mode) cmd)
    (setenv "LC_ALL" "C")
    (setenv "LANG" "C")
    (message (format "%s" current-major-mode))
    (cond
     ((string= "cperl-mode" current-major-mode) (setq cmd "perltidy -q"))
     ((string= "js3-mode" current-major-mode) (setq cmd "js-beautify.js -f - --good-stuff"))
     )
    (if (not (null cmd))
        (shell-command-on-region begin end cmd nil t)
      (progn (indent-region begin end)
             (delete-trailing-whitespace)
             (delete-blank-lines)
             (untabify (point-min) (point-max))
             )
      )))

```
FLOWer入門


紹介サイト http://flower-lang.github.io/
デモサイト http://flower-lang.github.io/demo.html

## メニューバー
上部にあるのがメニューバーで、左から順番に、実行、ジョブ追加、ダウンロード、アップロードとなっています。

### ジョブ追加
FLOWerではすべての処理が箱の形になっており、この箱を追加することができます。

### ダウンロード
アップロードに使うjsonと、ジョブの状態を示すsvg画像をzipに固めたものがダウンロードされます。

### アップロード
jsonをアップロードすると、ダウンロードした時点での状態を復元することができます。

## 編集
- outputをクリックしてからinputをクリックすることで、ポートを結ぶことができます。
- outputを選択せずにinputをクリックすることで、ポートに直接値を入れることができます。
- **ポート同士を結んだ線を一度クリックしてから×を押すことで、その線を削除することができます。**
- ジョブ自体を削除するには、右上のゴミ箱にドラッグアンドドロップします。
- *Entryはゴミ箱に入れないようにしましょう。*

## 基本
実行すると、Entryジョブのoutputから0が送信され、プログラム上を流れていきます。
例えばこの状態だと1が出力されます。
![0.png](https://qiita-image-store.s3.amazonaws.com/0/29692/02604b2c-d02e-779d-63b3-68534604a980.png "0.png")

プログラミング自体の入門は他所に譲ります。

## 重要なこと
- はじめにの動画でも触れられていますが、各ジョブは、全てのinputがそろうまで処理を開始しません。最初の例だと、core.Addはinput1に0が入るまで待機しているということになります。
  - なお、inputに直接値を入れる場合、ジョブ実行後もinputから値は消えないようです。

- ブログ記事の図で分かる通り、1つのoutputから複数のinputに値を送信することが可能です。例えばこの状態だと0,0が出力されます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/29692/55e1a4da-5c55-915b-baa1-5ecc2e5ad3e4.png "1.png")

## 最後に
- これらを組み合わせると、片方のポートだけに値を入れて待機させることで変数に相当する処理が可能となります。
- 詳細は書きませんが、この処理を記述できればCodeIQの問題は解答できるはずです。頑張ってください。

## [140417追記]
CodeIQの問題を解く中で気づいたのですが、実はフィボナッチ数列を出力するだけなら変数に相当する処理は不要です。
そのためには、「重要なこと」に書いてある2点を使う必要があります。

1. Entryからcore.Addのinput1に **2回** およびnumber.C1に結線する。
2. number.C1からcore.Addのinput2に結線する。
3. core.Addからsystem.Printに結線する。
4. system.Printからcore.Addのinput1とinput2に結線する。

以上により、core.Addのinput1は **1つ古い値** が使われることになり、題意を満たすことができます。

以下、私の解答です(Web版および拙作Ruby版 http://qiita.com/cielavenir/items/3fb388042b9a4fd1a47b で動作確認済み)。

```js
{"diagram":{"jobs":[{"id":"undefined1395185589743","meta":"retro.model.EntryJob","pos":{"x":42,"y":310},"inputports":[],"outputports":[{"name":"output","connections":["undefined1395706835477.trigger","undefined1395185808886.input1","undefined1395185808886.input1"]}]},{"id":"undefined1395185808886","ref":"core.Add","meta":"retro.model.SymbolicLink","pos":{"x":1038,"y":144},"inputports":[{"name":"input1"},{"name":"input2"}],"outputports":[{"name":"output","connections":["undefined1395185956103.input"]}]},{"id":"undefined1395185956103","ref":"system.Print","meta":"retro.model.SymbolicLink","pos":{"x":597,"y":561},"inputports":[{"name":"input"}],"outputports":[{"name":"output","connections":["undefined1395185808886.input2","undefined1395185808886.input1"]}]},{"id":"undefined1395706835477","ref":"number.C1","meta":"retro.model.SymbolicLink","pos":{"x":45,"y":416},"inputports":[{"name":"trigger"}],"outputports":[{"name":"1","connections":["undefined1395185808886.input2"]}]}]}}
```
Makeの暗黙の変数定義や暗黙のルール一覧を表示する


```sh
$ make -p -f /dev/null
```

makeコマンドが定義するものも，自分の環境の環境変数によって定義されるものも表示される．


- [Options Summary - GNU `make'](https://www.gnu.org/software/make/manual/html_node/Options-Summary.html#index-g_t_0040code_007b_002dp_007d-779 "Options Summary - GNU `make'")
ハッシュリテラルの中でヒアドキュメントを使う (Ruby)

## 超絶注意
基本的な構文を誤解していた為、誤った記述を大幅に削除しました。
(記事削除、絶賛検討中)

# ハッシュリテラル中のヒアドキュメント

ヒアドキュメントはハッシュリテラルの中でも普通に使える。
ちなみに英語では"here document"らしい。

```rb:rice_to_meat_you.rb
hash = {cow:<<'EOS'}
 ______________
< I love beaf. >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
EOS

puts hash[:cow]
```

# 複数のヒアドキュメントを使う

下のように書くと、ハッシュリテラルは1行で済む。
シンタックスハイライトと頭はぐちゃぐちゃになるかも。
(Qiitaのシンタックスハイライトは大丈夫。すごい)

```rb:パターン1/一括
hash = {one:<<HERE, two:<<HERE, three:<<HERE}
1
HERE
2
HERE
3
HERE

p hash
# => {:one=>"1\n", :two=>"2\n", :three=>"3\n"}
```

下のように分割すると分かりやすい。

```rb:パターン2/分割
hash = {

one:<<HERE,
1
HERE

two:<<HERE,
2
HERE

three:<<HERE,
3
HERE

}

p hash
# => {:one=>"1\n", :two=>"2\n", :three=>"3\n"}
```
ハッシュリテラルの最後のコンマは無視される。
付けるようにしたほうが何かと楽。

コンマは他の場所に打つと駄目。

# ヒアドキュメントの基本

## インデント

```rb
hash = {
  one:<<-HERE, 
  1
  HERE

  two:<<-HERE
2
  HERE
}

p hash
#{:one=>"  1\n", :two=>"2\n"}
```
ヒアドキュメントの開始の識別子の前に「-」を置くと、終端行をインデント可能。
「-」がない状態で終端行をインデントすると終端として認識されない。
本来、識別子以外の文字列が1文字でもあると終端にならないので。

もちろん、ヒアドキュメント中のインデントのスペースはそのまま。

## 末尾の改行を削除

```rb
hash = {one:<<HERE.chomp, two:<<HERE.rstrip}
1
HERE
2
HERE

p hash
# => {:one=>"1", :two=>"2"}
```
ただの文字列なので、そのままメソッド呼べる。

## 識別子を囲む点の違い
囲んだ点の文字列リテラルと同じ動作になる。

### ダブルクォート (")

```rb
p <<"EOS"
#{1 + 1}
EOS

# => "2\n"
```
"#{1 + 1}"と同じ。普通の文字列。
点で囲まない場合もこれ。

### シングルクォート (')
```rb
p <<'EOS'
#{1 + 1}
EOS

# => "\#{1 + 1}\n"
```
'#{1 + 1}'と同じ。(式展開とかエスケープ文字とかそのまま)

### バッククォート (`)
```rb
p <<`EOS`
echo "hello world"
EOS

# => "hello world\n"

# `echo "hello world"`と同じ。(コマンド実行)
# (Markdownで「`」のエスケープの仕方が分からないのでコメントとして書いてます)
```

# 参考

- Ruby 2.1.0 リファレンスマニュアル - [リテラル](http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fliteral.html#here)
grunt-contrib-connectでSSIに対応する


個人的には久々に耳にしたSSI。
`#include ...`等の記法でHTML内に別のコンテンツを埋め込んだりするものですが、grunt-contrib-connect標準ではSSIに対応しておらず、ローカルで確認しようにもすぐには見ることができません。
このためにローカルにapache立てるのも面倒なので、connectのmiddlewareで対応することに。

node.jsのssi関連は、

* [node-ssi](https://github.com/67726e/node-ssi)
* [simple-ssi](https://github.com/academo/simple-ssi)
* [connect-include](https://github.com/zeevl/connect-include)

等がありますが、`#include virtual=...`に対応しているのはnode-ssiだけのようですので、それを採用しました。

## node-ssiのインストール

まずは、npmでssiパッケージをインストールします。

```bash
npm install ssi --save-dev
```

## Gruntfileの修正

Gruntfileの上部で`fs`、`util`、`ssi`を定義。

```Gruntfile.coffee
module.exports = (grunt) ->
  require('load-grunt-tasks') grunt

  fs = require 'fs'
  url = require 'url'
  ssi = require 'ssi'

... snipped ...

```

その後、connectの設定で以下のように`middleware`を定義します。

* req(リクエストオブジェクト)からリクエストURLを取得
* 「/」で終わっていたら、「index.html」を足す
* ファイルが存在し、且つファイル名が「.html」「.shtml」で終わっていれば、SSIパース処理をして返す
* そうでなければ、標準のstaticに処理を渡す

```Gruntfile.coffee
... snipped ...

    connect:
      server:
        options:
          port: 8000
          base: '.'
          middleware: (conn, opt) ->
            opt.base = [opt.base] unless Array.isArray opt.base

            middlewares = []
            middlewares.push (req, res, next) ->
              urlobj = url.parse req.originalUrl
              filename = __dirname + urlobj.pathname + if urlobj.pathname.substr(-1) is '/' then 'index.html' else ''

              if fs.existsSync(filename) and filename.match(/\.s?html$/)
                parser = new ssi(__dirname, '', '')
                content = parser.parse(filename, fs.readFileSync(filename, {encoding: 'utf8'})).contents

                res.writeHead 200,
                  'Content-Type': 'text/html'
                  'Content-Length': Buffer.byteLength content, 'utf8'
                res.end content
              else
                next()

            for base in opt.base
              middlewares.push conn.static(base)

            middlewares

... snipped ...
```

これで、SSIを使ったコンテンツが来てもとりあえずはローカルでしのげます。
需要があるかは謎。

* 2014/04/21
QueryString対応のため、`urlobj.path` -> `urlobj.pathname` に修正
Gruntで簡易Webサーバを立てる


html/css/jsの制作をしていると、js周りの挙動で file scheme (file://...) では都合が悪い時があります。

わざわざローカルにapache等のwebサーバを立てるのはしんどい。
いちいちサーバにuploadするのも面倒。

[grunt-contrib-connect](https://github.com/gruntjs/grunt-contrib-connect)なら、必要なときだけさくっとローカルで簡易webサーバが立てられます。

> gruntで自動テストを行う際はこのプラグインがほぼ必須です。

grunt、grunt-cli、Gruntfile.coffee等が既にある前提で。

# grunt-contrib-connect のインストール

package.jsonがあるフォルダで以下を実行

```bash
npm install grunt-contrib-connect --save-dev
```

# Gruntfile.coffee に設定追加

以下の項目をGruntfile.coffeeに追加。

「server」の部分は、自由に設定できます。

* `port`: 適当なポート番号
* `base`: WebサーバのDocumentRootのパス

```Gruntfile.coffee
... snipped ...

    connect:
      server:
        options:
          port: 8000
          base: '.'

... snipped ...

```

> 詳細なoptionは [grunt-contrib-connect](https://github.com/gruntjs/grunt-contrib-connect) を見ましょう

# webサーバの起動

`grunt connect:server:keepalive` するだけ。

あとは、http://localhost:8000/... でプロジェクト内のファイルが参照できます。

connect-livereload を使うと、より幸せになれるかも。
Amazon S3のWebsite Hostingでリージョン設定を間違えてはならない


##ありがちなミス

Amazon S3でバケットを作成する際にリージョンを正しく選択し忘れるというのが初心者にありがちなミスなようです。[参考記事](http://itpro.nikkeibp.co.jp/article/COLUMN/20131107/516551/)
選択肢の既定値が「Oregon」であるため、油断していると「Tokyo」を選択し忘れます。

##間違えるとどうなるか

日本国内から北米のリージョンに通信するなら時間がかかるでしょう。
また、一旦バケットを削除して同名のバケットを作成し直そうとしても

>A conflicting conditional operation is currently in progress against this resource. Please try again

というメッセージが表示されてしまいます。何度やっても同じメッセージが表示されます。
間違えて設定してしまった元のリージョンのままでなら作成し直すことができます。

##解決方法

ではどうすればいいのか。
前出の参考記事では
>バケットは作成後にリージョンを変更することができない。対策としては、バケットの作成時にリージョン選択を忘れないようにするしかない

と書かれており、対処法は事前に注意を払っておくしか無いように思えます。
しかし、一旦削除して1時間ほど経てば別のリージョンで作成しなおすことができます。

##リージョン設定を間違えた状態でサイトを公開して困った事例

ネイキッドドメインで静的サイトホスティングをする場合、S3では以下の様に2つのバケットを作成し、Route 53でDNS設定をします。

- example.com
- www.example.com

その際にバケットのリージョン設定を共通にしなければなりません。
リージョンが別の状態でサイトを公開してしまうとサイトにアクセスした時に高頻度で「400 Bad Request」が返ってきます。
この問題は正しいリージョン設定のバケットを作成し直すことで解決します。

ネイキッドドメインでない場合はバケットを2つ用意する必要はないようなので「400 Bad Request」が返ってきたりはしないでしょうが、日本国内から北米のリージョンに通信するならやはり時間がかかるでしょう。

##まとめ

- バケット作成時のリージョン選択に注意。
- 間違えて設定しても変更できないわけではないので焦る必要はない。

##参考記事一覧

- [はじめてのAWS、“つまずきポイント”はココだ！ - ［3］S3のつまずきポイント、命名ルール知らないとエラーに：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20131107/516551/) 
- [amazon s3 リージョン(Region)変更 : あれこれのメモ](http://dailysummary.blog.jp/archives/1102430.html) 
- [take some notes 【システム開発メモ Flex AWS DB WEB Android etc】 AWS S3リージョン変更](http://norinoritakanori.blog90.fc2.com/blog-entry-29.html)
Pythonのパッケージ開発メモ


## ディレクトリツリー

```Bash:
bash-3.2$ tree
.
├── hoge
│   ├── Hoge.py
│   └── __init__.py
├── setup.py
└── test
    ├── TestHoge.py
    └── __init__.py

```

- ./hogeにパッケージのソースを入れる
- ./testに単体テストコードを入れる
- それぞれに__init__.pyを用意(中身は空で良い)
	- Pythonは、sys.pathの各ディレクトリに置かれた「ファイルそれ自体」か、「サブディレクトリで__init__.pyファイルを含む」をimport対象のパッケージと認識する

## setup.py

おまじない…。

```python:setup.py
from setuptools import setup, find_packages



setup(
    name = "hoge",
    version = "0.1",
    packages = find_packages(),
    test_suite = 'test'
)
```

## 単体テストコード

unittestを使う。

```python:TestHoge.py
import unittest
from hoge import Hoge


class TestPiyo(unittest.TestCase):
    def setUp(self):
        self.obj = Hoge.Piyo()

    def test_one(self):
        self.assertEqual(1, self.obj.one())

    def test_two(self):
        self.assertEqual("two", self.obj.two())

```

## 単体テストの実行
Hoge.pyを適当に開発して、

```Bash:
python setup.py test
```

で、単体テストが実行される。
GruntでCompassの自動ビルドを行う


[Grunt](http://gruntjs.com/)はJSのタスク実行ツールです。

CoffeeScriptのコンパイル、{Cofffee,Java}Scriptの文法チェック、JS/CSSのminify、テスト実行等、様々なタスクを走らせることができます。

GruntでCompassの自動ビルド設定を行うことで、scssファイルの変更を検知して自動的にcssを出力させることができます。

> compass自体にもこの機能はありますが、gruntで設定しておくことで他のタスクも実行できるので、後々効いてきます。

# Grunt-cliのインストール

Gruntは、[Node.js](http://nodejs.org/)で動作しますので、まずはNode.jsをインストールしてください。

Macであれば、`brew install node`でおしまい。

gruntコマンドはnpmパッケージでインストールします。頻繁に使うコマンドですので、グローバルにインストールしておきましょう。

```bash
npm install -g grunt-cli
```

# package.jsonの準備

gruntには便利なプラグインがたくさんありますが、プロジェクト毎に使うものが異なりますので、プロジェクトフォルダにpackage.jsonを作成し、このファイルに必要なnpmパッケージを登録します。

以下のコマンドを実行し、対話的に情報を入力していくことで、package.jsonが生成されます。

> 入力は基本的にEnterのみでOK。

```bash
npm init
```

# 必要なnpmパッケージの追加

gruntで自動実行させるために必要なnpmパッケージをインストールします。
`--save-dev`オプションを付けることで、自動的にpackage.jsonにも記述されます。

```bash
npm install grunt grunt-contrib-compass grunt-contrib-watch load-grunt-tasks --save-dev
```
* grunt: grunt本体
* grunt-contrib-compass: compassタスク
* grunt-contrib-watch: フォルダ自動監視タスク
* load-grunt-tasks: npmで入れたgruntタスクの自動ロード用

# Gruntfileの作成

Gruntfileは基本はJSですが、CoffeeScriptでも記述できます。（その場合は Gruntfile.coffee）

* compassのconfig.rbのパス: src/config.rb
* sass/scssのパス: src/sass/*

だとすると、

```Gruntfile.coffee
module.exports = (grunt) ->
  require('load-grunt-tasks') grunt

  grunt.initConfig
    compass:
      devel:
        options:
          config: 'src/config.rb'
          environment: 'development'
          bundleExec: true
      prod:
        options:
          config: 'src/config.rb'
          environment: 'production'
          bundleExec: true

    watch:
      compass:
        files: 'src/sass/*'
        tasks: 'compass:devel'
```

# Gruntタスクの実行

`grunt watch`でwatchタスクを実行しておくことで、ファイルの修正を検知して自動的にcompass:develタスクを実行します。

* compass:devel - development環境でビルドします。scssの行番号等のコメントを入れたcssが生成されます。開発時に便利。
* compass:prod - production環境でビルドします。未圧縮で公開したい場合に便利。

ソースファイルが全く変更されていない場合はcompassのビルドが省略されます。
devel/prodの切り替えの際は生成済みのcssを一旦削除する等の作業が必要な場合がありますのでご注意を。

> このあたりもgruntタスクで上手く処理する方法があります。
Compass環境の構築


[Compass](http://compass-style.org/)は[Sass](http://sass-lang.com/)がベースのフレームワークです。
利用するにはRubyが必要ですが、涙が出るほど便利過ぎるなので、CSSを扱うプロジェクト積極的に活用していきましょう。

# Rubyのインストール

Compassを使うには、Rubyが必要ですのでインストールします。
rbenv + ruby-buildを使ってインストールすることをオススメします。

Macであれば、Rubyは標準でインストールされています。
このまま標準のRubyを用いてもいいですし、rbenvを使って最新のパッチレベルのものをインストールしてもいいでしょう。

# bundlerのインストール

そのまま `gem install compass`してしまうと、globalな環境にgemがインストールされてしまいます。
プロジェクトで使うgemはプロジェクト環境で閉じているのが望ましいので、パッケージ管理ツールであるbundlerをインストールし、個別のgemはbundlerで管理するようにします。

```bash
gem install bundler
```

> rbenv環境ではなくsystem環境のRubyの場合は、sudo が必要かもしれません。

# Gemfileの生成とCompassの追加

bundlerで管理するgemファイルは、Gemfileに記述します。
Gemfileは1から記述してもいいのですが、以下のコマンドでも雛形が生成できます。

```bash
cd PROJECT_DIR
bundle init
```

GemfileにCompassを追加します。

```bash
echo 'gem "compass", "~> 0.12.2"' >> Gemfile
```

出来上がったGemfileはこんな感じ。

```Gemfile
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem "compass", "~> 0.12.2"
```

# Compassのインストール

`bundle install`でGemfileに記述したパッケージをインストールします。
`--path`を指定することで、vendor/bundle 以下にgemがインストールされます。

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

# Compassの利用

後は、bundle execでcompassを実行するだけです。
実際の細かい使い方は本家を参照しましょう。

使い方を見るには、シンプルに。

```bash
bundle exec compass
```

いちいち`bundle exec`を付けたくない場合は、インストール時に`--binstubs`を付けます。

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

そうすることでカレントフォルダに`bin/compass`が生成されますので、PATHを通すなりなんなりで直接compassコマンドを叩けるようになります。
OSXで画面にドットを打つには?


これまでずっと Windowsを使用してアマグラム(アマチュアの書くプログラム)を勉強してきました
C++の勉強のために、MFCを用いて医療用動画のformatである DICOM-XAの viewerをそれこそ [10年がかりで作成しました](http://www.kamakuraheart.org/DICOM-XA/DICOM-XA00.html)

以前から MacBook Proを用いて Parallels Desktop上で Windows7を走らせ、その上で VisualStudioを使いプログラムを使い組んでいたのですが、最近 OSX上の Xcode5.1を使い始めました

そこで、まずは画面にドットを打つことから始めようと思ったのですが、何処から始めれば良いか皆目見当つきません　何処から始めれば良いか　できれば簡単なプログラムで提示して頂ければ助かります　宜しくお願いします。ちなみに、僕はもう還暦も過ぎたアマチュアで、高度な知識にはとてもついていけません・・・・　もともと無理な話でしょうか?
分散トランザクションの実装方法

#1.プロジェクトに参照設定の追加

Visual Studio のソリューションエクスプローラー上で、右クリックで参照の追加を選択。


![addref.png](https://qiita-image-store.s3.amazonaws.com/0/29125/a3d45999-821d-ee4a-6a80-a78d31103c26.png)

タブ .NET より System.Transactions を選択する。

#2.使用するクラスで Using を追加

```c#:smaple.cs

using System.Transactions;

```

#3 分散トランザクションのコード追加

分散トランザクションは、TramsactoionScope 範囲内がトランザクションとなり、Complete() メソッド呼出し後に、スコープを抜けた時に確定する。途中で、例外などで Complete() が呼出しされなかった場合は、ロールバックとなる。

```c#:sample.cs

public void transFunction() 
{

  using (TransactionScope ts = new TransactionScope())
  {
     /**
      * ここで複数のデータベースに対する処理を行う。
      */



     // トランザクション確定
     ts.Complete();
  }


}
```
分散トランザクションの設定


マイクロソフト分散トランザクションの設定及び確認方法を下記に示す。

分散トランザクションとは、複数のMicrosoft SQL サーバー間でトランザクションを行う機能。(※.net framework 2.0 より利用可能な機能)

#設定・確認手順
1.分散トランザクションの設定
2.名前解決の確認
3.ファイヤーウォールの確認
4.レジストリの確認
5.テストツール DTCTester の実行

##1.分散トランザクションの設定
管理者モードでコマンドラインを起動する。

`
dcomcnfg
`

コンポーネントサービスが起動するので、左側のツリーより
[コンソールルート]
[コンポーネントサービス]
[コンピューター]
[マイコンピューター]
[Distributed Tansaction Coordinator]
[ローカルDTC] を選択、
右クリック　[プロパティ] タブ [セキュリティ] を選択する。

下記、項目をチェックする。
*ネットワークDTCアクセス
*受信を許可する
*送信を許可する
*認証を必要としない

![temp.png](https://qiita-image-store.s3.amazonaws.com/0/29125/a47a0d5c-1f55-4008-3af2-60a0e02e0e20.png)

##2.名前解決の確認

分散トランザクションを起動するホスト間で名前解決が出来るか確認する。
名前解決が出来ない場合は、WINSサーバーに登録、又は lmhosts を設定する。

コマンドラインを起動する。

名前で確認する場合

`
nbtstat -a [コンピューター名]
`

IPで確認する場合

`
nbtstat -A [IPアドレス]
`

##3.ファイヤーウォールの確認

分散トランザクションで利用する TCP ポート 135 を許可する。

分散トランザクションで利用する一時ポート用のファイヤーウォール設定が一覧にあるので有効にする。


##4.レジストリの確認

仮想環境で、OSのイメージをコピーした場合　分散トランザクションで利用する一意のID が重複していないか確認する。

レジストリエディタを起動


レジストリパス HKEY_CLASSES_ROOT\CID 配下のキーが PC間で重複していないか確認する。

もし、重複していた場合、アンインストール、インストールを行う。

コマンドラインより

アンインストール

`
msdtc -uninstall
`

インストール

`
msdtc -install
`

再度、レジストリを確認し重複していない事を確認する。


##5.テストツール DTCTester での確認


マイクロソフトより提供されている、分散トランザクションテストサールをダウンロードする。

記載内容に従ってテストを行う。

[http://support.microsoft.com/kb/293799/ja](http://support.microsoft.com/kb/293799/ja)

Commit [Enter] で、Successfully が表示されれば、分散トランザクションの設定は完了です。
 


※参照

http://msdn.microsoft.com/ja-jp/library/aa561924.aspx
GAE/PythonでBottleフレームワークを使った時のエラーログ出力方法


超ド基礎な部分ですが、ローカルでサンプルを起動した時に、ブラウザで「Error: 500 Internal Server Error、以上！」となりコンソールにもエラーログが表示されず困った君になってしまったのでメモを残しておきます。

```python:main.py

# -*- coding: utf-8 -*-
import logging

# ↓debugをインポート
from bottle import Bottle, debug

bottle = Bottle()

# ↓デバッグモードON！
debug(True)

@bottle.route('/')
def home():
  return 'はろー'

@bottle.error(404)
def error_404(error):
  return 'Sorry, Nothing at this URL.'

```

とりあえずdebug(True)を打っておけばServerError時に詳細なエラーログが表示されます。たったこれだけのことなのですが、python初心者にはわかんなかったんですよ、はい・・・。
LinuxでAlt+Tabとサヨナラできる！Quickey.pyを作りました。

#タスク切り替えの煩わしさは結構馬鹿にならない。

DesktopなLinuxを利用している方は、WindowsよろしくAlt+Tabなんかを使ってタスク切り替えをするんじゃないかと思います。使ってますよね？Alt+Tab。

しかしこれがまた結構めんどくさくて、最後に使った順番で切り替え候補が出てくるため、場合によっては何度もAlt+Tabしたり、あのウィンドウとあのウィンドウを並べたいときに間違って余計な最大化ウィンドウをアクティブにしてげんなりしたり、よくあるじゃないですか、いやあるんですよ。

多分Webアプリケーションとか作ってる人なら身に染みてると思います。この時間無駄だと思いませんか？

#そこでQuickey.py！

っていうのを作ってみました。例によって自分用に作ったものですが、正直もうコレ無しでは生きられない体に…。

https://github.com/m-yamashita/quickey.py

インストール方法や使い方はREADMEに詳しく書いているので、おそらく誰でも簡単に導入出来るかと思います。ちなみに日本語です。英語は僕には無理でした…誰か親切な方がいらっしゃいましたらお願いしますorz

#なにができるの？

これを使うと、例えば任意のショートカットキーを利用して、指定したウィンドウを一発でアクティブ化（最前面にフォーカスを移す）することができます。もし指定したウィンドウが見つからなかった場合は、そのアプリケーションを起動したりも出来ますので、簡易ランチャーとしての使い方もできます。

例えば僕の場合…

* shift+ctrl+c で GoogleChrome をアクティブ化、無ければ起動。
* shift+ctrl+g で gvim をアクティブ化、無ければ起動。
* shift+ctrl+e で Eclipse をアクティブ化、無ければ起動。

とかやってます、これだけでも個人的には世界が変わるレベルの効率化が望めました。常駐ソフトの多い人ほど恩恵が高くなると思います。

また、オプションがいくつか用意されているので、ある程度の様々なシチュエーションにも対応できるかと思います。

ショートカットキーやウィンドウの指定には、Autokeyという素晴らしいツールを利用させて頂いています。

autokey - Desktop automation utility for Linux and X11 - Google Project Hosting

https://code.google.com/p/autokey/

が、実は特にAutokeyに依存しているというわけでもないので、コマンドラインでも動きます。詳しくはREADMEをご覧ください。

#最後に

良いDesktopライフを！

ライセンスMITです、よろしくお願いしまーす。
Backbone.jsでタグ・エディターを作ってみた

# はじめに

正確には[jQuery - タグ・エディターを作ってみた - Qiita](http://qiita.com/hnakamur/items/ac5f04930d0c08f141e5)で作ったjQueryプラグインをBackbone.jsに移植してみました。

* デモ: https://hnakamur.github.io/backbone.tag-editor/
* ソース: [hnakamur/backbone.tag-editor](https://github.com/hnakamur/backbone.tag-editor)

# ビューの分割方法

ビューの分割方法に悩みましたが、なるべく単純にしようと思い、タグ1つを表示するTagItemViewとタグ・エディターのTagEditorViewの2つだけとしました。

タグを複数表示するTagCollectionViewを作って、タグエディターはそれを含むcompositeなビューにするのかとか、テキストの幅を測るために画面外においているinput要素とか、タグ入力に使うinput要素もビューにするのか、などと検討しましたが、複雑になる割にメリットが無いので止めました。

# モデル
タグ1つを表すTagと複数のタグを表すTagsというコレクションの2つとしました。単に文字列の配列とかでもいいのではと思ったりもしたのですが、下記のモデルの変更イベントを取るためにはBackbone.jsのModelやCollectionであるほうがいいので、そうしました。

# モデル変更のイベントでビュー更新
MVCということで、ビューでタグを追加・削除したときのイベント処理はTagsのコレクションにタグを追加・削除するだけとし、Tagsのコレクションの追加・削除イベントでビューの描画を更新するようにしました。

Tagsのコレクションの追加・削除イベントをリッスンするのは以下のコードで、

```js:https://github.com/hnakamur/backbone.tag-editor/blob/6d1efa969aa71b7ef62492686970ad064684b01c/js/backbone.tag-editor.js#L40-L41
    this.listenTo(this.collection, 'add', this.onAddModel);
    this.listenTo(this.collection, 'remove', this.onRemoveModel);
```

それらのイベントハンドラは以下のコードで実装しています。

```js:https://github.com/hnakamur/backbone.tag-editor/blob/6d1efa969aa71b7ef62492686970ad064684b01c/js/backbone.tag-editor.js#L54-L60
  onAddModel: function(model, collection, options) {
    this.$el.children('div:nth-child(' + (options.at + 1) + ')').after(
        new TagItemView({model: model}).render().el);
  },
  onRemoveModel: function(model, collection, options) {
    this.itemViews.splice(options.index, 1);
  },
```

addイベントではoptions.atに何番目に追加されたかが入っていて（[Collection#addメソッドのマニュアル](http://backbonejs.org/#Collection-add)参照）、removeイベントではoptions.indexに何番目から削除されたかが入っている（[Collection#removeメソッドのマニュアル](http://backbonejs.org/#Collection-remove)参照）ので、上記のような実装になっています。

また、タグ1つの内容が変更された場合にTagItemViewを更新するようにもしてあります。

```js:https://github.com/hnakamur/backbone.tag-editor/blob/6d1efa969aa71b7ef62492686970ad064684b01c/js/backbone.tag-editor.js#L11
    this.listenTo(this.model, 'change', this.render);
```

タグ・エディターの操作ではこのイベントは起きないのですが、モデルを直接変更した場合に対応するため実装してあります。具体的にはタグのコレクションの変数tagsを以下のように操作すればこのイベントが発生します。

```js
tags.get(1).set('name', 'baz')
```
Project SienaでCollectionを扱う

さて、引き続きProject Sienaをいじってみている高見知英です。
今回はCollectionというものを使ってみました。Project Sienaのコレクションはアプリケーション内で自由にレコードの追加・削除が可能なリストのこと。これを使うことで、任意のデータを追加・削除することが出来るカタログアプリが作成出来ます。

とりあえずサクッと作成方法。自分もあちこち迷いながら作ったので余計なアクションがあるかもしれない。

#元ネタ
* [Project Siena Tutorial | Customer Book App](http://www.youtube.com/watch?v=lJg0C_DnjWk)

#以下、実装方法
##コレクションの元になるExcelファイルを用意する
まずは、作成したいコレクションの列名と同じ列を定義したExcelファイルを用意します。このExcelファイルをデータソースとして読み込ませ、それを元にコレクションテーブルを作る といった感じのようです。

たとえば、名前・ジャンル・詳細 という三つの列を持ったコレクションを作成させたい場合、下のような形のExcelファイルを作る必要がある
![Excelファイルのイメージ](https://qiita-image-store.s3.amazonaws.com/0/14499/ca65d418-b178-cd2d-84ec-8df7af20e8e9.png)
Excelファイル自体はコレクションの定義に用いるだけなので、データは空っぽで問題なし。
なお、表自体はProject Sienaで扱うため、「テーブル」として定義しておきます。

##データソースとしてExcelファイルを読み込む
データソースとしてExcelファイルを読み込みます。ここでは特に何の工夫も必要ありません。
![データソースとしてExcelファイルを読み込む](https://qiita-image-store.s3.amazonaws.com/0/14499/8f6f7e74-b7d1-a297-3320-d34ce4c43b93.png)

##データソースに値を入力する画面を作る
データソースに値を入力するためのエディタ画面を作ります。
ここで、データソースを保存するボタンなどのイベントハンドラに、Collect()メソッドを挿入します。
![Collectメソッドを追加](https://qiita-image-store.s3.amazonaws.com/0/14499/6abaf39f-d2fe-d15a-f448-08bbb0751305.png)
次に出る画面で、Collection1の元データとして、テーブル1（Excelファイルのデータ）を指定します
![Excelファイルを元に、コレクションを作る](https://qiita-image-store.s3.amazonaws.com/0/14499/54ba6333-5cf4-a989-3ab9-67c57f94c962.png)
すると、コレクションができあがります。Collect()メソッドを`Collect(Collection1, {名前:書き込みたい文字列,ジャンル:書き込みたい文字列,詳細,書き込みたい文字列})`と言う風に書き換えて、画面に書いた文字列がコレクション内に書き込まれるようにします。
![Collectメソッドの書き換え](https://qiita-image-store.s3.amazonaws.com/0/14499/a730e3a9-119d-99f6-ac1a-66b719351798.png)
これでコレクションに値が保存されます。

##コレクションの表示
試しにギャラリーを一つおいた画面を配置し、そこにCollection1を表示させてみましょう。
![Collection1を表示するギャラリーを作る](https://qiita-image-store.s3.amazonaws.com/0/14499/1e3bcbe9-da74-e17a-b063-5892edf0242c.png)
するとコレクションの中身が正常に表示されるのが確認できます。

##コレクションの値の削除
コレクションの値を削除するには、削除したいレコードを指定してRemove()メソッドを呼び出します。ギャラリーでコレクションを表示している場合、`Remove(Collection1, ThisItem)`と書けます。
![Remove()メソッドを呼び出す](https://qiita-image-store.s3.amazonaws.com/0/14499/24749d84-4175-5306-e672-c4409a0a45f2.png)

##コレクションの保存と読み出し
コレクションの中身は、セッション限りのデータです。そのため、アプリケーションを終了させるとデータが消滅してしまいます。それが嫌な場合、SaveData()およびLoadData()メソッドを使ってデータを読み書きします。

保存は、`SaveData(Collection1, "lockseeds")`のような感じで、読み込みは`Collect(Collection1, LoadData("lockseeds"))`のような感じでいけます。

###保存の場合
こちらは普通に、メソッドを呼び出すだけ。
![SaveData()](https://qiita-image-store.s3.amazonaws.com/0/14499/bcb8f147-004d-e515-a800-e5c22b8a11a9.png)

保存されたデータは、「C:\Users\(ユーザー名)\AppData\Local\Packages\(アプリケーション名)\LocalState」
に保存されます。Project Sienaで作成したアプリケーションのアプリケーション名は、「Publishしたときの名称_ランダムな文字列」になるようです(Project Siena上から実行した場合は、「C:\Users\(ユーザー名)\AppData\Local\Packages\Microsoft.MicrosoftProjectSiena_(ランダムな文字列)\LocalState」)
###読み込みの場合
次に読み込み。こちらはLoadData()ではコレクションのデータを取り出すだけなので、それをCollect()メソッドでコレクションに書き込んであげます。
また、読み込み時には読み込み直前のデータも残っていますので、いったんClear()メソッドでコレクションを空にしておくと良いでしょう。
![LoadData()](https://qiita-image-store.s3.amazonaws.com/0/14499/8f817872-f0db-5390-dc2f-def2a6ed77f8.png)
とりあえずこんな感じのようです。

ひとまず、これを実際に実装してみた例が以下の通りです。興味がある方はご覧ください。
* [Collect.siena](https://onedrive.live.com/redir?resid=23BBC6BE60062F4F!76561&authkey=!ALZ9l0w0dtjv9Fw&ithint=file%2c.siena)
Vimを体系的に学ぶつもりのない人のためのVim講座

よろしい、あなたはたまにVimを使う必要があるんだけど、いつもわけがわからず、なんとかしてインサートモードに入るので精一杯。で、Vimを終了させられず、やり方をググっている、と…そんなあなたのためにこの記事を差し上げましょう。

## 最低限覚えてほしい3つのコマンド

- `i` => インサートモードに移行
- `esc` => インサートモードから脱出
- `:wq` => 保存して終了

そう、たったこれだけ。
**…なわけないでしょ！**
確かに、上の3つのコマンドは必ず使うものです。しかし、`i`と`esc`を往復している限り、あなたは永久に進歩しません。

## インサートモードは最悪

大事なことなので2回言います、 **インサートモードは最悪**です。インサートモードではVimは単なるメモ帳になってしまいます。どうせVimを使うなら、Vimらしく使ったほうが精神衛生上よろしいはずです。

## ノーマルモード

名前の通り、普通、Vimはノーマルモードになっています。初級者以上は、できるだけこのモードから離れません。文字を入力するときでさえノーマルモードから行おうとするようになれば、中級者といえると思います（筆者はこの段階です）。
Vimの敷居を上げているのがこのモードなのですが、このモードで最低限カーソル移動ぐらいは行う必要があります。

## 最低限覚えてほしい *カーソル移動のための*コマンド

【追記】s/3つの//g

バッファ（Vim用語では「ファイル」の意）を動き回る上で、以下のコマンドはとても便利なのでぜひ覚えましょう。

- `gg` => 最初の行に移動
- `G` => 最後の行に移動
- `w` => 次の単語に移動
- `b` => 前の単語に移動
- `W` => *空白を挟んで*次の単語に移動
- `B` => *空白を挟んで*前の単語に移動
- `f[char]` => 次の[char]に移動

## 最低限覚えてほしい *インサートモードに入るための*3つのコマンド

`i`だけでインサートモードに入ろうとするのが入門者です。初級者以上は、以下の3つのコマンドを使いこなします。

- `A` => 行末に移動してインサートモード
- `S` => カーソルがある行を削除してインサートモード
- `o` => 1行下に移動してインサートモード

書くべきことを書き終えたら、さっさと`esc`しましょう。

## 最低限覚えてほしい *効率的な編集のための*3つのコマンド

以上の知識があれば、バッファ内を移動してテキストを挿入することはかなり効率的に行えます。が、それだけではよくあるケースに対応できません。例えば、文字列のリテラルを編集する場合、シングルクォートの中にあるテキストを削除し、別のテキストに置換しなくてはなりません。普通はちょっと面倒なこんな仕事も、Vimならあっという間です。

- `ciw` => カーソル上の単語を削除してインサートモード
- `ci'` => シングルクォート内のテキストを削除してインサートモード
- `C` => カーソルより右にあるテキストを削除してインサートモード

## 次回予告

実はまだ一回もEXコマンド（`:`を入力するとカーソルがウィンドウ下に吹っ飛ぶあれ）を使っていないので、それの紹介をできたらします。あとサーチした上で`n`でジャンプとか、ヤンクとか、ビジュアルモードで一括変換とか、まだまだネタはたくさんあるよ！