OmniAICreator/Qiita-1.07M huggingface dataset:
Entity Frameworkとトランザクション

## Entity Frameworkにトランザクション管理を任せる

SaveChanges()やExecuteSqlCommand()が呼ばれるたびにトランザクションが作成されます。

``` csharp
using (var context = new SampleContext())
{
    // トランザクション開始
    context.Database.ExecuteSqlCommand(
        "UPDATE Samples SET Name = 'Hoge' WHERE Id= 1"
    );

    context.Samples.Add(new Sample());
    context.SaveChanges(); // トランザクション開始

    context.Samples.Add(new Sample());
    context.SaveChanges(); // トランザクション開始
}
```

## 自分でトランザクションを開始する

BeginTransaction()で複数のSaveChanges()やExecuteSqlCommand()などをひとつのトランザクション内で実行できます。

``` csharp
using (var context = new SampleContext())
using (var tran = context.Database.BeginTransaction()) // トランザクション開始
{
    try {
        context.Database.ExecuteSqlCommand(
            "UPDATE Samples SET Name = 'Hoge' WHERE Id = 1"
        );
    
        context.Samples.Add(new Sample());
        context.SaveChanges();
    
        context.Samples.Add(new Sample());
        context.SaveChanges();
    
        tran.Commit();
    }
    catch (Exception)
    {
        tran.Rollback();
        throw;
    }
}
```

TransactionScopeを使っても同様のことができますが、
Azure SQL DBでサポートされていない分散トランザクションになってしまうことがあったり、
後述のUseTransactionと組み合わせられないため、
Entity Framework 6ではBeginTransaction()が推奨されています。

## 既存のトランザクションを使用する

UseTransaction()で既存のトランザクションを使用できます。

``` csharp
using (var conn = new SqlConnection("...")) 
{ 
    conn.Open(); 

    using (var tran = conn.BeginTransaction())  // トランザクション開始
    { 
        try {
            var command = new SqlCommand(sql, conn, tran);
            sqlCommand.ExecuteNonQuery();
    
            using (var context = new SampleContext(
                conn, contextOwnsConnection: false))
            {
                context.Database.UseTransaction(tran);
    
                context.Samples.Add(new Sample());
                context.SaveChanges();
            }

            tran.Commit();
        }
        catch (Exception)
        {
            tran.Rollback();
            throw;
        }
    }
}
```
postfixのメール送信状況を把握する (pflogsumm)

postfixのメール送信状況を把握するには、`pflogsumm`を使うと良い。

* [pflogsummのsystemctl対応 - Qiita](http://qiita.com/tukiyo3/items/dfa94c1c39868abd3410)

インストール
=========

```bash:pflogsummのインストール(rpm)
$ sudo yum install -y postfix-pflogsumm
```

動作確認
=========

```bash:/home/user/bin/batch_pflogsumm.sh
/usr/sbin/pflogsumm -d today \
  --problems_first \
  --verbose_msg_detail \
  -h 15 \
  -u 15 \
  --mailq \
  /var/log/maillog
```

```bash:
$ chmod +x /home/user/bin/batch_pflogsumm.sh
```

cronに追加
=========

```bash:crontabに登録
59 23 * * * /home/user/bin/batch_pflogsumm.sh
```

出力例
=========

[こんなかんじで表示される](http://centossrv.com/postfix-pflogsumm.shtml)

```bash:例(一部)
Per-Hour Traffic Summary
    time          received  delivered   deferred    bounced     rejected
    --------------------------------------------------------------------
    0000-0100           0          0          0          0          0
    0100-0200           0          0          0          0          0
    0200-0300           0          0          0          0          0
    0300-0400           0          0          0          0          0
    0400-0500           2          2          0          0          0
    0500-0600           0          0          0          0          0
    0600-0700           0          0          0          0          0
    0700-0800           0          0          0          0          1
    0800-0900           0          0          0          0          0
    0900-1000           0          0          0          0          1
    1000-1100           0          0          0          0          0
    1100-1200           0          0          0          0          0
    1200-1300           0          0          0          0          0
    1300-1400           0          0          0          0          1
    1400-1500           0          0          0          0          0
    1500-1600           0          0          0          0          0
    1600-1700           2          2          0          0          0
    1700-1800           0          0          0          0          0
    1800-1900           0          0          0          0          0
    1900-2000           0          0          0          0          0
    2000-2100           0          0          0          0          0
    2100-2200           0          0          0          0          1
    2200-2300           0          0          0          0          0
    2300-2400           0          0          0          0          0
```
Entity Frameworkの関連のロード

以下のEntityでFoo.Barsのロードの説明。

```csharp
public class SampleContext: DbContext
{
    public DbSet<Foo> Foos { get; set; }
    public DbSet<Bar> Bars { get; set; }
}

public class Foo
{
    public long Id { get; set; }
    public virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
    public long Id { get; set; }
    public long FooId { get; set; }
    [ForeignKey("FooId")]
    public virtual Foo Foo { get; set; }
}
```

## LazyLoading

### LazyLoadingEnabledがtrue

はじめてのfoo.Barsアクセス時にLazyロードが走ります。
LazyLoadingEnabledはtrueがデフォルト。

```csharp
var foo = default(Foo);
using (var context = new SampleContext())
{
    foo = context.Foos.Where(f => f.Id == 1).Single();
    var bars1 = foo.Bars; // ここでLazyロード
}
var bar2 = foo.Bars; // いったんロードされているのでちゃんと取れる
```

```csharp
var foo = default(Foo);
using (var context = new SampleContext())
{
    foo = context.Foos.Where(f => f.Id == 1).Single();
}
// contextは破棄されているのにここでLazyロードしようとしてObjectDisposedException
var bars = foo.Bars;
```

### LazyLoadingEnabledがfalse

```csharp
var foo = default(Foo);
using (var context = new SampleContext())
{
    context.Configuration.LazyLoadingEnabled = fales;
    foo = context.Foos.Where(f => f.Id == 1).Single();
    var bars = foo.Bars; // Lazyロードされずにbarsはnull
}
```

```csharp
var foo = default(Foo);
using (var context = new SampleContext())
{
    context.Configuration.LazyLoadingEnabled = fales;
    foo = context.Foos.Where(f => f.Id == 1).Single();
}
var bars = foo.Bars; // Lazyロードされずにbarsはnull
```

## 明示的にロード

明示的にロードしておけば`context.Configuration.LazyLoadingEnabled`にかかわらずcontext内外でBarsを読めます。

### Include()

Include()を使うとFooとBarをまとめてロードできます。
基本的には処理に必要な関連はInclude()で一気にロードしておくべきです。
Include()は`context.Foos.Include(f => f.Bars).Include(f => f.AnotherAssoc)`のようにつなげて書けます。

```csharp
var foo = default(Foo);
using (var context = new SampleContext())
{
    // ここでロード
    foo = context.Foos.Include(f => f.Bars).Where(f => f.Id == 1).Single();

    var bars1 = foo.Bars; // 普通に取れる
}
var bars2 = foo.Bars; // 普通に取れる
```

### Load()

Load()を使うとBarを個別にロードできます。
Fooのロード量が多く、かつ、Barsをロードする必要があるFooは少量なときは、
Include()よりLoad()またはLazyロードに任せるのがいいです。

```csharp
var foo = default(Foo);
using (var context = new SampleContext())
{
    foo = context.Foos.Where(f => f.Id == 1).Single();

    context.Entry(foo).Collection(f => f.Bars).Load(); // ここでロード

    var bars1 = foo.Bars; // 普通に取れる
}
var bars2 = foo.Bars; // 普通に取れる
```
MySQLからPostgresqlに移行するためのPHPコード

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2056">元の記事はコチラ</a>
- - - - - - - - - - - 
herokuはMySQLをサポートしてないので、MySQLを使っている既存アプリをPostgresqlに移行してみた。
まぁheroku使いたいがためにデータベースを変更するってのもどうかと思いますが、実験がてら。Wordpressとかをherokuで無料で動かしたいって人にはちょっとは役に立つかも。

<!-- extract -->

ここに可能性のある方法がならんでいます。
[Converting from other Databases to PostgreSQL](http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL)

いろんな方法がありますが、誰にでも取っつきやすい(？)、PHPでコードを書いてる人がいたので、使わせてもらいました。
バグレポート送ったんだけど、速攻で修正してくれた上に、律儀に名前まで載っけてくれてる…。なんか嬉しい。

[PHP_my2pg](http://www.gab.lc/scripts/php_my2pg.php)


###PHP_my2pg

![Screen Shot 2014-02-07 at 3.22.45 PM](http://image.workabroad.jp/upload/2014/100/workabroad.jpg)

PHP_my2pgのページにSource codeがあるので、それをコピペ保存して、その中に自分のMySQLとPostgresqlの接続情報を埋めて実行。オプションに自分のデータベースの名前を忘れずに。
　
```
$ php my2pg.php your_database
```

これでMySQLからデータを取り出して、Postgresqlにテーブルつくって、データ挿入までぐわーっとやってくれる。

my.cnfに以下を追加しないと、データを抽出する段階で日本語が化けるかも。

```
[mysqld]
skip-character-set-client-handshake
```

テーブル構成とかを抜き出してCreate文とかをPostgreql用に書き換えてくれてるのが、実行結果から分かります。ご利用は自己責任で。実行前にバックアップを取りましょう。
　
無事に移行できた後にアプリをテストすると「Primary Keyが重複してレコードが作れません」みたいなエラーが出るかもしれません。そんな時はSequenceを疑ってみて、値がおかしければ```SELECT setval('users_id_seq', 100);```とかで設定し直してあげればいいかと思います。
　　

###PaaSのメリット

サーバーのセッティングに時間をかけずにアプリが作れるのが個人的には一番大きい。
さくらのVPSを契約してたけど、そろそろやめようかなと思ってる。あんまり使ってないのにお金だけ払っててね…。

PaaSというかherokuのメリットは、

- サーバーのセッティングに時間がかからない
- 小さいアプリなら無料で運営できる
- スケールできる
- Addonで機能拡張もお気楽

とにかくアプリのコードを書きたくてサーバーのことは忘れたい！
という人にはおススメです。

 → <a href="http://workabroad.jp/posts/2056">http://workabroad.jp/posts/2056</a>
Dart で書かれた API のドキュメントを自動生成する

## ソースコードにドキュメント用コメントを付ける

次のような感じでコメントを付ける.

```dart
// lib/hello_dartdoc.dart

/**
 * A sample library to show how to use `dartdoc`.
 */
library hello_dartdoc;

/**
 * A sample class.
 */
class HelloDartdoc {

  /**
   * A constructor of `HelloDartdoc` class.
   */
  HelloDartdoc(this.variable);

  /**
   * A member variable of `HelloDartdoc` class.
   */
  String variable;

  /**
   * Returns a message with a received parameter.
   *
   * ## マークアップの仕方
   *
   * #1 リンクの記述方法
   * * [HelloDartdoc] または [これ](../hello_dartdoc/HelloDartdoc.html) は `HelloDartdoc` クラスへのリンク.
   *
   * #2 コードブロックの記述方法
   * 4 つの空白から始まる行はコードブロックとして扱われる.
   *     HelloDartdoc helloDartdoc = new HelloDartdoc('X', 'Y');
   *     String result = helloDartdoc.method('Z');
   *
   * #3 文字の装飾の仕方
   * * バッククオートで囲まれた文字列は `code font` で装飾される.
   * * アンダースコアまたはアスタリスクで囲まれた文字列は _italic_ で装飾される.
   * * 二つのアスタリスクまたはアンダースコアで囲まれた文字列は **boldface** で装飾される.
   */
  String method(String parameter) {
    return 'You called this method with $parameter';
  }
}
```

## ドキュメントを生成する

`dartdoc` コマンドで上記のファイル (`lib/hello_dartdoc`) を処理する.

```bash
$ dartdoc lib/hello_dartdoc.dart 
Using snapshot /Users/kkohtaka/dart-sdk/bin/snapshots/utils_wrapper.dart.snapshot
Analyzing libraries...
Generating documentation...
Compiling client JavaScript...
Copying static files...
Documentation complete -- documented 1 libraries, 1 types, and 3 members.
```

デフォルトでは `docs/` 以下にドキュメントが生成されるのでブラウザで開く.

```bash
$ ls -R docs/
0                       client-live-nav.js      external-link.png       hello_dartdoc.html      nav.json
apidoc.json             content-bg.png          favicon.ico             index.html              styles.css
body-bg.png             dart-logo-small.png     header-bg.png           interface.png
class.png               exception.png           hello_dartdoc           library.png

docs//0:
apidoc.json             hello_dartdoc.json

docs//hello_dartdoc:
HelloDartdoc.html
$ open docs/hello_dartdoc/HelloDartdoc.html
```

下のような HTML のドキュメントが確認できる.

![hello_dartdoc.png](https://qiita-image-store.s3.amazonaws.com/0/18658/7730b1e9-83e3-e95a-ef59-ba016956cde2.png)

Refs: https://www.dartlang.org/docs/dart-up-and-running/contents/ch04-tools-dartdoc.html

## コメントの書き方

大きく, 初めのパラグラフとそれ以降のパラグラフに分けられる.

### 初めのパラグラフ

初めのパラグラフは一文で記述しピリオドで終わるようにする.

* 関数, メソッドのコメントの場合

三人称単数現在系の動詞で始める.

```dart:例
/**
 * Returns a message with a received parameter.
 * ...
 */
String method(String parameter) {
  return 'You called this method with $parameter';  
}
```

* 変数, ゲッタ, セッタの場合

名詞にする. ゲッタとセッタがある場合にはゲッタのみにコメントを書く.

```dart:例
/**
 * A member variable of `HelloDartdoc` class.
 */
String variable;
```

* ライブラリ, クラスの場合

名詞にする.

```dart:例
/**
 * A sample library to show how to use `dartdoc`.
 */
library hello_dartdoc;

/**
 * A sample class.
 */
class HelloDartdoc {
  ...
}
```

### それ以降のパラグラフ

それ以降のパラグラフは自由に記述できる. ただし, 関数, メソッドの場合は用例を書くことが推奨される.
その他, 引数の説明, 副作用, 投げる可能性のある例外や外部ドキュメントへのリンクを記述すると良い.

Refs: https://www.dartlang.org/articles/doc-comment-guidelines/
foursquareアプリケーションの登録


foursquare APIにアクセスするため、アプリケーション登録をおこないます。ここで発行される<span class="deco" style="font-weight:bold;">consumer key</span>がないとデータを取得できません。

https://ja.foursquare.com/oauth/

にアクセスし、ページ右上の「REGISTER A NEW CONSUMER」ボタンをクリックします。

![20111119015555.png](https://qiita-image-store.s3.amazonaws.com/0/8292/c5843dc3-482c-c1ba-df30-b794f55b5626.png "20111119015555.png")

<span class="deco" style="font-weight:bold;">「APPLICATION NAME」</span>には文字通りアプリケーション名を入力します。<span class="deco" style="font-weight:bold;">「APPLICATION WEB SITE」「CALLBACK URL」</span>にはアプリの紹介サイトなどを入力しますが、今回はWebアプリではないため、仮に<span class="deco" style="font-weight:bold;">「http://www.example.com/」</span>を入力しておきました。

<span class="deco" style="font-weight:bold;">「ENTER TEXT BELOW」</span>に画像の文字を入力し、<span class="deco" style="font-weight:bold;">「REGISTER APPLICATION」</span>ボタンを押すと<span class="deco" style="font-weight:bold;">「CLIENT ID」「CLIENT SECRET」</span>が発行されます。
MacでXCode依存な+LuaのVimを入れてみる．


Macで+LuaなVimを使うために，仕方なくApp StoreでXCodeをインストールしたのだけど，
以下のコマンドを叩いても，cscopeで`configure error c compiler cannot create executables`というエラーを吐いてしまって困ってしまった．

> brew install macvim --with-cscope --with-lua --HEAD

で結局この原因は,「XCodeを1度起動してライセンスに同意しないとダメ」ということだった．
まぁライセンスに同意するっていうのはわかるけど，VimがXCodeに依存しているのめんどいね...

Finder「このアプリケーションで開く」の一覧にこのMacVimを追加するには以下のコマンドを実行すればよい。

> brew linkapps
コメント行、空行を除いてdiff

設定ファイルって、設定を追加したり使わない行をコメントアウトしてるうちにカオスな感じになりがちなので。

```shell-session
$ diff <(grep -v -e "^#" -e "^$" conf.old ) <(grep -v -e "^#" -e "^$" conf.new)
```
Symfony2 環境の切り替え

# Symfony2 環境の切り替え
- 環境毎に参照するパラメータだったりDBを変更したい
- Staging環境を追加したい

## 方法
### 環境毎に参照するparameters.ymlを変更
- config_{env}.yml の要にファイルが配置されている
- config_test.ymlからconfig_dev.ymlを読み込んでいる
- config_dev.ymlからconfig_prod.ymlを読み込んでいる
- config_prod.ymlからconfig.ymlを読み込んでいる
- config.ymlからparameters.ymlを読み込んでいる
- なので、それぞれのconfig_{env}.ymlから、parameters_{env}.ymlを呼び出すよう修正
- config_stg.ymlはconfig_prod.ymlをコピって作る
- AppKernel.phpもちょっと修正
- app.php,app_dev.phpを見習ってapp_stg.phpを作る（割愛）

```yaml:config.yml
imports:
    # コメントアウト
    # config_%kernel.environment%.yml を参照させるため
    # - { resource: parameters.yml }
    - { resource: security.yml }
```

```yaml:config_prod.yml,config_dev.yml,config_test.yml,config_stg.yml
imports:
    #- { resource: parameters_%kernel.environment%.yml } # 追加：これだと%kernel.environment%を見てくれないケースがあったので以下の通り再定義
    - { resource: parameters_dev.yml } # 環境により dev,prodなど変える
    - { resource: config.yml }
```

```php:AppKernel
// stg を追加
        if (in_array($this->getEnvironment(), array('dev', 'test', 'stg'))) {
```
Xcode5.0.2のDebugとReleaseモードの切替

１、左上に表示されているスキームを選択します。
２、ドロップダウンでEdit Scheme, New Scheme, Manage Schemeが出ます。
３、Edit Schemeを選択します。
４、上から二つ目のRun ○○○.appを選択します。
５、Build ConfigurationがDebugになっているので、クリックしてダロップダウンメニューを
表示させ、Releaseにします。

以下のサイトでマクロを設定した後に、実際にログの値を出してみる時に、
設定方法が分からなかったので、調べてみました。

iOS開発でのNSLogはDEBUGマクロで使おう
http://d.hatena.ne.jp/k2_k_hei/20120511/1336750473

以上、間違い等あれば、指摘お願い致します。
リモート環境(LinuxへSSHしてNoGUIモード)でVeeweeを使ってのVirtualBox + Vagrant用のBoxの作成方法


## 環境：

ホストOS : Debian wheezy
ゲストOS : FreeBSD 9.1

## 手順

1) Ruby 1.9.3p484 (rvmよりインストール)

2) Veewee (gem install veeweeよりインストール)

3) FreeBSD9.1をVirtualBOXへインストール

3-1) freebsd-9.1のveeweeテンプレートファイル初期化

```
veewee vbox define freebsd91 'freebsd-9.1-RELEASE-amd64'
```

3-2) definition.rb にてHDD, Memory, CPU等の設定を行う

3-3) veeweeのfreebsd-9.1のtemplate設定を変更しないとエラーになるので、以下をコメントアウト

```
vi definitions/freebsd91/definition.rb
#  :sudo_cmd => "cat '%f' | su -",
  :shutdown_cmd => "shutdown -p now",
#  :postinstall_files => [ "postinstall.csh"], :postinstall_timeout => "10000"
```

3-4) -n(noguiモード)でVirtualBoxへfreebsd-9.1をインストール

```
veewee vbox build -n freebsd91 
```

注意：veewee インストール失敗した場合

```
設定を変えて試みる場合
veewee vbox build -n -f freebsd91 

一旦消して試みる場合
veewee vbox destroy freebsd91 
```

3-5) インストールの確認

GuestOSへログインする

```
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 7222 -l vagrant 127.0.0.1
```

3-6) suモード移行時にパスワードなしを設定

```
pw usermod vagrant -G wheel

cat /etc/pam.d/su | sed "s/requisite/sufficient/" > tmp

mv tmp /etc/pam.d/su

```

注意：

* VeeweeからGUIなしのGuestOSの起動は -n オプションを付けること

```
veewee vbox up -n freebsd91
```

* GuesOS終了はsuモード移行時にパスワードなし設定しておくこと、設定後以下を実行

```
veewee vbox halt freebsd91
```


4) Boxファイルをexportする

```
veewee vbox export freebsd91
```

5) VirtualBoxへログインしてテンプレートのpostinstall.cshをインストール(オプション)

5-1)
ホストOSからpostinstall.cshをGuestOS FreeBSD9.1へcopyする

```
veewee vbox copy freebsd91 postinstall.csh .  
```

5-2) postinstallを実行する

```
su -

sh postinstall.csh

```

注意：

* そのままインストールするとログインできなくなるので、sshの設定を確認すること



6) Vagrantに移行

6-1) vagrant typeのboxに移行

exportされたboxを登録

```
vagrant box add 'freebsd91' '/home/xxx/veewee/freebsd91.box'
```

6-2) vagrant初期化、VM起動、VMへ接続
 
```
vagrant init 'freebsd91'
vagrant up
vagrant ssh
```


## 設定しておくと便利なこと

* vagrant sshパスワードなしでログインする

鍵生成 

```
ssh-keygen -t rsa 
```

公開鍵をGuestOSに転送し、ファイル名をauthorized_keysにして, 600に設定

```
chmod 600 ~/.ssh/authorized_keys 
```


~/.vagrant.d/boxes/freebsd91/Vagrantfile に秘密鍵のpathを登録

```
Vagrant::Config.run do |config|
  # This Vagrantfile is auto-generated by `vagrant package` to contain
  # the MAC address of the box. Custom configuration should be placed in
  # the actual `Vagrantfile` in this box.
  config.vm.base_mac = "XXXXXXXXXXXX"
  config.ssh.private_key_path = "~/.ssh/id_rsa" 
end
```

## その他 

* エラーがおきた場合にlog出力しておくと原因がわかるかも

```
VAGRANT_LOG=DEBUG vagrant up
```
Vimで最強の文法チェックを実現するための簡単な方法


syntastic.vim はvimで文法をチェックしてくれる最高のプラグインの一つです。
しかし保存したときにしかチェックをしてくれないので、
保存するときはvimを抜けるとき！な自分にとっては微妙に使いにくい仕様になってます。
なので編集しながら文法チェックしてくれる用に設定しましょう！

# 前提条件
Vimのバージョンが7.4以上
[Syntastic](https://github.com/scrooloose/syntastic)がインストールされている

# 設定

```sh:vimrc
let g:syntastic_enable_signs=1
let g:syntastic_auto_loc_list=2
let g:syntastic_mode_map = {'mode': 'passive'} 
augroup AutoSyntastic
    autocmd!
    autocmd InsertLeave,TextChanged * call s:syntastic() 
augroup END
function! s:syntastic()
    w
    SyntasticCheck
endfunction
```

これだけ！
これだけでバッファを編集したら即座に文法チェックできるし、作業内容も保存できます。

## 解説 
最初の2行はお決まりの設定
3行目で明示的に文法チェックを走らせるように設定します。
augroupでinsertモード抜けたとき、ノーマルモードでバッファが変更されたとき、保存→SyntasticCheckを走らせる！

* vimのバージョンを7.4に指定したのはそれ以下だとTextChangedがなぜか効かないからです。原因不明なのでどなたか知ってる方がいたら教えてください
supervisorでulimitを設定する

[Supervisor-users] Clarification on ulimit and minfds https://lists.supervisord.org/pipermail/supervisor-users/2011-December/001004.html

を参考にしたが、うまく動かず、試行錯誤した結果、以下のように、supervisorの機能でuser指定せず、command中でulimit呼び出しとユーザ変更を行うと良い事がわかった。
supervisorの設定でuser指定するとuserデフォルトに戻ってしまうらしい。

```ini
[program:program_name]
command=bash -c "ulimit -n 65536;exec setuidgid hoge /path/to/script.sh" 
#user=hoge # ulimitが変わるため使えない
```

### python実行時に/root/.python-eggへのアクセスエラーが出る
環境によって発生したりしなかったりして条件不明ですが以下設定で解決。

```ini
environment=PYTHON_EGG_CACHE="/home/hoge/.python-eggs"
```
railsでerbからslimに乗り換える＋vim設定

## はじめに

erbはタグのとじが面倒くさいのと視認性を上げるために、indentを使ってタグの閉じを表現出来るテンプレートを使いたいと思います。

その際にhamlを使ってみましたが、何となく視認性が悪いような気がしました。ここで http://slim-lang.com を検討し、比較的、視認性が高いように感じたのでslimを使うことにしました。

視認性の違いは、具体的な理由があるかもしれませんが、ここでは感覚的にそう思っただけなので、人によって感じ方は変わってくると思います。

## railsへの導入

http://rubygems.org/gems/slim-rails を参考にGamefileにgemを追加します。

## viewファイルの命名規則

`index.html.erb` ⇒ `index.html.slim`

## vimプラグインの導入

```~/.vimrc
NeoBundle 'slim-template/vim-slim'
```

おそらく、カラーのハイライトをしてくれます。
指定したopacityに徐々に変化させる


## この記事はまったく使えません！ごめんなさい

**なぜなら、CCFadeToってのがちゃんとあるから**

こっ恥ずかしすぎて消えたい気分です。。。
`CCFadeInTo`とか`CCFadeOutTo`とかって考えてたけど
そりゃ考えると名前的には`FadeTo`ですね…

自分への戒めとして、記事自体は残しておきます。。

----

**cocos2d-x ハージョンは2.2.1の話**

## 問題背景
nodeを徐々に表示させる手法のひとつに`CCFadeIn`がありますよね
毎度結構使う機能なんですが…
常日頃思うことがありました
これつかうとゼロかイチかっていうね
opacityが0から255っていう変化しかできないんですよね

いやいや0から150ぐらいにしたいですよっていう変化をしたい時には使えない
いままではそういうことを実現しようとおもったら、最初っから透過処理を加えた画像を用意して、`CCFadeIn`を使っていました。
が、今回、それのパターンが多いかつある程度ランダムで決めたいっていうのがあって、
予め画像を用意するのが困難  
という問題が発生しました

## 対応方法

`CCFadeIn`を継承して`CCFadeInTo`なるものを作って解消することに  
以下はそのコード

```cpp:CCFadeInTo.h

#include "cocos2d.h"

class CCFadeInTo : public cocos2d::CCFadeIn
{
    
public:
    CCFadeInTo();
    virtual ~CCFadeInTo();
    
    virtual void update(float time);
    virtual bool initWithDuration(float d, int toOpacity);
    static CCFadeInTo* create(float duration, int opacity);
    
protected:
    
private:
    
    int m_toOpacity;

};

```

```cpp:CCFadeInTo.m

#include "CCFadeInTo.h"

USING_NS_CC;
using namespace std;

CCFadeInTo::CCFadeInTo()
{
    
}

CCFadeInTo::~CCFadeInTo()
{
    
}


CCFadeInTo* CCFadeInTo::create(float duration, int opacity)
{
    CCFadeInTo* pAction = new CCFadeInTo();
    
    pAction->initWithDuration(duration, opacity);
    pAction->autorelease();
    
    return pAction;
}


bool CCFadeInTo::initWithDuration(float d, int toOpacity)
{
    if (! CCActionInterval::initWithDuration(d)) {
        return false;
    }
    
    m_toOpacity = toOpacity;
    
    return true;
}

void CCFadeInTo::update(float time)
{
    CCRGBAProtocol *pRGBAProtocol = dynamic_cast<CCRGBAProtocol*>(m_pTarget);
    if (pRGBAProtocol)
    {
        pRGBAProtocol->setOpacity((GLubyte)(m_toOpacity * time));
    }
}


```

## 使い方

特段難しいことはなく、いつもの感じです(笑)

```cpp:使ってみるよ!

CCSprite* hoge = CCSprite::create("hoge.png");
hoge->setVisible(false);
hoge->setOpacity(0);
this->addChild(hoge);

// 1秒かけてopacityを150まで変化させる
CCFadeInTo* fadeInTo = CCFadeInTo::create(1.f, 150);

hoge->runAction(CCSequence::create(CCShow::create(), fadeInto, NULL));

```

これで今のところ期待している挙動になってます
どうぞ参考にしてみてください〜

なにかあればコメント頂けると幸いですm(_ _)m
連続した数列を範囲形式にまとめたい をPHPで

[Rubyでどう書く？：連続した数列を範囲形式にまとめたい](http://builder.japan.zdnet.com/script/sp_ruby-doukaku-panel/20369264/)
をPHPで

簡略化のため入力は最初から配列としています。

```php
<?php

$data = [1, 2, 3, 5, 6, 10, 15, 16, 20];

$ranges = array_reduce($data, function ($current, $element) {
    if (count($current) == 0) {
        $current[] = [$element];
        
        return $current;
    }

    $currentLastRange = end($current);
    $currentLastNumber = end($currentLastRange);
    if (($currentLastNumber + 1) == $element) {
        if (count($currentLastRange) > 1) {
            array_pop($currentLastRange);
        }
        $currentLastRange[] = $element;
        array_pop($current);
        $current[] = $currentLastRange;
    } else {
        $current[] = [$element];
    }
    
    return $current;
}, []);

$result = array_reduce($ranges, function ($current, $range) {
    if ($current != '') {
        $current .= ',';
    }
    $current .= implode($range, '-');

    return $current;
}, '');

echo $result;
```

Rubyの[Enumerable#inject](http://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-inject)というのは[Enumerable#reduce](http://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-reduce)のエイリアスなんですね(recudeの方がエイリアス？)。勉強になりました。

[その2](http://qiita.com/hidenorigoto/items/be0689419037c4785d62)
jsdomを使ってhtmlをdomに落としこむ


まずはjsdomをインストール。
2014/2/7現在、0.9.0が入りました。

```Bash
$ npm install jsdom
```

あとは使うだけ。

```js
var jsdom = require('jsdom');
var doc = jsdom.jsdom(htmlStr);
```

docはDOMオブジェクトなのでここから先はご自由に。
チラシの裏: HDDフルスキャンの性能

むしろ詳しい人のコメントを求めたい話。説明が正しくなくても知らないよ

 * 4TBのHDD (HGST製でメモリ32MBのもの)
 * Wesern Digital Data LifeGuard DiagnosticsのExtended Test (Full Media Scan、まぁシーケンシャルにリードだろう)
 * USB 2.0接続 (裸族の頭経由) と SATAで直結
 * 前者で32時間超、後者で8時間半
 
さてこの速度差を計算でだせるか、という点で頭が傾いた。
直観的にUSB 2.0経由の変換ツールでやるなよう、というのはもちろん分かるし、
4倍遅くても文句もないのだけど、じゃぁ「具体的に何でこれだけ遅くなるかを予測できるか」が良く分からなかった。

単純な実効的な転送速度を見ると10倍の開きがあるくさい。一度「まさかSATA 1.0？」 (150MB/sなので5倍となり、一応辻褄が合う)と思ったのだが、適当なツールで見るとSATA300であった。300MB/s対30MB/sで10倍、という速度差とはなっていない。ちなみにあたりまえだがHDD側はSATA600には対応していて、マザボが古いせいかそっちでSATA300に落ちてる臭い。
自分だと、変な外側のツールを追加で使ってる分、10倍より開きそう、とすら予想しかねない。

というわけで本記事に落ちはないのだけど、似たようなことをやるときはUSB経由でフォーマットなんて試す前に考えることだ、ということで一つ。

追記:

……USB2.0って480Mb/s = 60MB/s か。辻褄があったようだ (SATA 300MB/s  に対して USB2.0 60MB/s なので5倍程度の開きが出るという見積り、現実にはもう少し開きは小さいのだが)

追記2:

SATAは8/10エンコーディングしてるので実効240MB/sか。するとがっつり4倍。

* 4000000MB / 240MB/s ~= 16666 s => 4.6時間
* 4000000MB / 60MB/s ~= 18.5時間

想定よりそれぞれ2倍近く遅いのだが、この違いを知るのはさすがに範囲外かなぁ……

ヘネパタとかならやってるかもしれない。7200rpm、キャッシュとして32MBを持つHDDで転送速度は240MB/sと60MB/s。シーケンシャルに読み込んだ時のパフォーマンスを求めるわけで。

ただ、このディスクの部分は今回一定なので、速度差が純粋に接続方法の帯域幅で決まるのは予想通り、ということで。
Pythonメモ：オブジェクトの持つ属性を知りたいとき

基本的にオブジェクトの属性は

```py
John.age
```

みたいに'.'つなぎで取得できるが、これが外部からimportしたものだったりすると、 **「多分こういう属性があると思うんだけどその名前が分からない（いや、ひょっとしたら無いかも）」** という微妙な感じの状況に陥ることがある。

そういう場合ググるのが一番確実なのだが、ちょっと見てみたいという程度なら以下のようにすれば覗き見できるので覚えておいて損はないと思う。

###### 例

```py
import sys

print(sys)
# <module 'sys' (built-in)>
# これでは意味が分からないが・・・・

print( dir(sys) )
# ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', '_mercurial', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'exitfunc', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'last_traceback', 'last_type', 'last_value', 'long_info', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'real_prefix', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
# こうなっていればそれらしい属性名を発掘できるかも？
```
Chromeでfont-sizeを相対指定したとき、フォントサイズが大きく表示されることがある

フォントサイズを下記のように相対指定で書いた場合、稀にChromeでフォントが異常な大きさになることがある。
（62.5%が無視され、100%に対して1.6remされるように見える）

```css
html {
  font-size: 62.5%;
}
body {
  font-size: 1.6rem;
}
```

このようなときは、

```css
* {
  font-size: 1.6rem;
}
```

または、

```html
<script>
  document.body.style.webkitTransform = "scale(1)";
</script>
```

で回避できる。

>[Chrome not respecting rem font size on body tag?](http://stackoverflow.com/questions/20099844/chrome-not-respecting-rem-font-size-on-body-tag)
>[Force-redraw DOM technique for WebKit-based browsers](http://mir.aculo.us/2009/09/25/force-redraw-dom-technique-for-webkit-based-browsers/)

--
追記

コメント頂きました。指摘の書き方が良さそうですし、スマートですね。有難うございます。

```css
body {
  font-size: 1.6em;
}
```
NSIndexPathのTips

たまに忘れるのでメモ、あんまり増えないかも

## NSIndexPathの作成
・indexPathのsectionとrowを割り当てて作成

```objectivec
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1
                                            inSection:0];
NSInteger section = indexPath.section;
// section = 0
NSInteger row = indexPath.row;
// row = 1
```
sinon.jsでオブジェクトの中のDBのconnection.queryをstubする

オブジェクトの中でdbのconnectionを利用していて、そのオブジェクトのテストをするときにstubしようと思ってもtestコードからオブジェクトの中のconnectionには触れません。
具体的にはこんな感じ

```coffeescript
mysql = require 'mysql'
config =
  host:     "localhost"
  database: "sample"
  user:     "user"
  password: "pass"

class DataTouchModel
  constructor: (@config)->
  con: ->
    @_con ||= mysql.createConnection(@config)
  getSomeData: (id)->
    @con().query "SELECT * FROM bandits WHERE id = ?", [id], @processSomeData
  processSomeData: (err, rows)->
    console.log err, rows
model = new DataTouchModel(config)
```

で、この`getSomeData`のテストをしたいんだけど、dbにそれようのサンプルを入れるのは面倒です。
こういった場合には次のようにするとなんとかstubすることができます。

```coffeescript
sinon = require 'sinon'
stub = sinon.stub(
  # [2014/10/28修正] require('./node_modules/mysql/lib/Connection').prototype,　'query')
  require('mysql/lib/Connection').prototype, 'query')

stub.withArgs(
  "SELECT * FROM sample WHERE id = ?",
  [0],
  DataTouchModel.prototype.processRows).returns(null, ["myvalue"])
model = new DataTouchModel(config)
model.getSomeData(0)

# => null, ["myvalue"]
```

ポイントは、`query`に渡す引数を必ず名前付きのメソッドにすることです。`[demoId]`のArrayは同じものとして扱ってくれますが、`function`は違うものになるためです。

それか、`.withArgs`を除外して、直前で回数を指定して`.retunrs`を明記するかになるかと思います。

## まとめ

中に入り込んでても、node_modulesまでほっくりかえせばなんとかなるよ！

* これがいいのかどうかさっぱりわからないので、 @kyo_ago さんあたりに伺いたいと思っております。
@dataProviderを使ったテストをちょっと見やすくする

たまたまHttpFoundationのテストコードをみていたらこんなのを見つけました。

https://github.com/symfony/HttpFoundation/blob/master/Tests/AcceptHeaderTest.php

```php
    /**
     * @dataProvider provideSortingData
     */
    public function testSorting($string, array $values)
    {
        $header = AcceptHeader::fromString($string);
        $this->assertEquals($values, array_keys($header->all()));
    }

    public function provideSortingData()
    {
        return array(
            'quality has priority' => array('*;q=0.3,ISO-8859-1,utf-8;q=0.7',  array('ISO-8859-1', 'utf-8', '*')),
            'order matters when q is equal' => array('*;q=0.3,ISO-8859-1;q=0.7,utf-8;q=0.7',  array('ISO-8859-1', 'utf-8', '*')),
            'order matters when q is equal2' => array('*;q=0.3,utf-8;q=0.7,ISO-8859-1;q=0.7',  array('utf-8', 'ISO-8859-1', '*')),
        );
    }
```

なにこれ。普通はこう書くわけです。

```php
    public function provideSortingData()
    {
        return array(
            array('*;q=0.3,ISO-8859-1,utf-8;q=0.7',  array('ISO-8859-1', 'utf-8', '*')),
            array('*;q=0.3,ISO-8859-1;q=0.7,utf-8;q=0.7',  array('ISO-8859-1', 'utf-8', '*')),
            array('*;q=0.3,utf-8;q=0.7,ISO-8859-1;q=0.7',  array('utf-8', 'ISO-8859-1', '*')),
        );
    }
```

これを実行すると失敗した場合、

```
1) ProviderTest::test1 with data set #0 ('*;q=0.3,ISO-8859-1,utf-8;q=0.7', array('ISO-8859-1', 'utf-8', '*'))
```

と出力されますが、上の書き方だと、

```
1) ProviderTest::test1 with data set "quality has priority" ('*;q=0.3,ISO-8859-1,utf-8;q=0.7', array('ISO-8859-1', 'utf-8', '*'))
```

と微妙に見やすくなっています。
SMACSSによるCSS設計

前案件でBEMチックな書き方をして、あまりのクラス名の長さに
キィェエエエ！！ってなった後で、
CodeGridさんでSMACSSについてのステキ記事を見つけたのでメモ。

　　
※以下、CodeGridさんの記事に書いてることを、自分が後で見るようにプチ要約したものです。
本記事をまだ読んだことが無い人はここよりも、本記事の方をじっくり読むのをお勧めします。

[SMACSSによるCSSの設計 - ベースとレイアウト | CodeGrid](https://app.codegrid.net/entry/smacss-1)


# CSSカテゴライズ

5つにカテゴライズして、それに準じた名前を付ける

1.ベース
2.レイアウト
3.モジュール
4.状態（ステート）
5.テーマ


#1.ベースルール
サイト全体で要素そのもののデフォルトスタイル

```
body
a:link
table ...
```
1パターンしかないからといって、ここでデザインを指定しない。
CSSのリセットは使用を避けて、なるべくNormalize.css を使う。


#2.レイアウトルール
ページのエリア分け

```
.l-main
.l-sub
```

プレフィックスで`l-`をつけて一目でわかるように。

IDが絶対だめってわけじゃないけど、
ID要素は重複利用できなかったり、スタイルの上書きがむずかしくなるから、なるべくクラスを使う

CSSでは位置や配置の指定をする。
（フォントや色はモジュールや状態の方で指定する）


##子孫セレクタを使って分岐

```css
.l-main {
  width: 70%;
}
.l-fixed .l-main {
  width: 600px;
}
```

`.l-fixed`のついてるのはpx指定、そうでなければ％指定


#3.モジュールルール

再利用可能なパーツ

```
・ ロゴ
・ナビゲーション
・タブ

などページを構成するパーツすべて
```

レイアウトパーツの中に入れて、
どこに置いても再利用できるように独立させておく。


##レイアウトとモジュールの合わせ技

```html
<div class="l-container-12">
  <div class="l-grid-06">
    <div class="box">box1</div>
  </div>
  <div class="l-grid-06">
    <div class="box">box2</div>
  </div>
</div>
```

* レイアウト
.l-grid-01~nという風に幅が違うクラスを量産する
これで、レイアウトの調整が無限大！

* モジュール
.boxは汎用的なの

##モジュールの命名規則
親モジュールの名前をプレフィックスでつける

```html
<div class="item">
  <p class="item-text"></p>
</div>
```

##クラス名をつけるタイミング
モジュール全部にクラス付ける必要はない。

* li、a ...クラス名をつけなくてもいいよ
* div、span ...クラス名つける

liは階層が深くなる場合>を使う。
見出しはあとでh2→h3に変わったり、
階層が変わる場合もあるから、クラス名付いたdivで囲む方がいいっぽい。

##親要素での使い分けはしない
同じ要素だけど置く場所が違うものは、
親要素によっての指定はしない。

```html
<div class="l-main">
  <div class="search">~</div>
</div>
 
<div class="l-sub">
  <div class="search">~</div>
</div>
```

こうじゃなくて

```html
<div class="l-main">
  <div class="search">~</div>
</div>
 
<div class="l-sub">
  <div class="search search-vertical">~</div>
</div>
```

こう。
`.search-vertical`に指定することで、どこに移動してもスタイルを維持できる。


#4.状態ルール　
特定の状態によってスタイルを上書きする
状態の切りかえはJavascript

* 結果がtrueの場合のとき
　プレフィックス is-

* 表示/非表示
  .is-hidden {}
  .is-error {}
  .is-active {}

例
.is-dialog-hidden
.is-tab-active

!importantはなるべく避ける。
状態ルールはモジュール名を付けてあげた方が競合しなくてよさそう。


#5.テーマルール

##テーマ管理用のCSS

```css:main.css
.box {
  border: 1px solid;
}
```

```css:theme.css
.box {
  background-color: #eee;
  border-color: #ccc;
}
```

色に関わる部分をテーマで管理する

##プレフィックス　theme-

```css:theme.css
.theme-border {
  border-color: #ccc;
}
.theme-background {
  background-color: #eee;
}
```

# SMACSS のゴール

* HTMLとコンテントのセマンティックな価値を向上すること
* 特定の HTML 構造への依存を低減すること

# 参考サイト
* [SMACSSによるCSSの設計 - ベースとレイアウト | CodeGrid](https://app.codegrid.net/entry/smacss-1)
* [SMACSS 読んだ - CHROMA](http://chroma.hatenablog.com/entry/2013/07/22/120818)
  
   
***  
「自分以外の誰が見てもわかる」＋「CSSを編集することがあまりない」
そんな更新しやすい組み方ができたらいーなーと思う今日この頃。
外部から自宅のGlassFishサーバにアクセスする方法

# GlassFishのポート番号とリバースプロキシ

GlassFishのポート番号はデフォルトで8080番ですが、Softbankの携帯やスマホは8080番が使えません。

Apache使いなら、mod_proxy_ajpかmod_jkなどを使ってGlassFishと連携できますが、私はnginx使いです。
対処策として、次のように外部から80番でアクセスしてきたら、nginxで80番を8080番に転送するようにします。

> 外部 -80-> 自宅Webサーバ -8080-> 自宅GlassFish

このような方法を「リバースプロキシ」と言います。

# nginxの設定

たとえば、「http ://xxx.yyy.zzz/jsfDemo/」のURIをGlassFishに転送する場合は、次のように設定を入れます。設定後は、nginxを再起動/再ロードします。

```:nginx.conf
    server {
        listen       80;
        server_name  localhost;
        :
        location /jsfDemo/ {
            proxy_pass   http://127.0.0.1:8080/jsfDemo/;
        }
        :
    }
```
今さら始めるJava（1）


## [いまから始めるJava（1）](http://www.atmarkit.co.jp/ait/articles/0210/29/news002.html)

その昔発見して、おお、と思ったページ。
まとめてみる事にしました。

## Java概要

+ OSやアーキテクチャの違いを乗り越えるアプリケーションの実行環境として誕生したJava

 + ソースファイルをコンパイラで中間コード(バイトコード)に変換する
 + インタプリタ(JavaVM)が中間コードを解釈してCPUに実行させる
 + CPUやOSごとにJavaVMを用意すれば同一の中間コードで処理を実行できる

+ Java X SDK
	+ SDK
		+ Software Development Kit
			+ Java コンパイラ
			+ Java VM(Virtual Machine)

## Hello World

これが基本の `HelloWorld` プログラム。

```java:HelloWorld.java
public class HelloWorld {
  public static void main( String args[] ) {
    System.out.println("Hello World!");
  }
}
```

コンパイラで中間コード生成。

```Bash
$ javac HelloWorld.java
```

中間コードの拡張子は `.class` 。

```Bash
$ ls -l

HelloWorld.java         HelloWorld.class
```

JavaVMに解釈させるにはこのように。

```Bash
$ java HelloWorld

Hello World!
```

## パッケージとは？

+ アプリケーション構築に必要なプログラムの部品を再利用するための仕組み
+ src.zipに格納されている.javaファイルで定義されている機能を再利用
+ 他のソースファイルから利用して使うプログラムの部品の集まり
+ 基本的なパッケージ(コアパッケージ)は、
	+ SDKに用意されたもの
	+ ユーザーが変更してはいけない
	+ あらかじめ中間コードになっている(rt.jar)
		+ 実際にはzipファイル
		+ jar = Java ARchive

## 第一回の感想

今ひとつインタプリタで解釈しながら実行、っていうのがよく分からない。
VMのバイトコードが読める様になるとまた違うのかもしれない。
コマンド3つでテスト用の画像を99枚保存する


要 TextExpander curl rename

![スクリーンショット 2014-02-07 19.26.02.png](https://qiita-image-store.s3.amazonaws.com/0/5472/1eb88f2a-5365-9284-5ffb-58217211afae.png "スクリーンショット 2014-02-07 19.26.02.png")

ファイルが沢山できるので現在時刻のフォルダを作っておく

現在時刻のフォルダの作成 → 中に入る

``` bash
# ;cmmakenow
mkdir NOW%Y%H%d%I%M%S

cd NOW%Y%H%d%I%M%S

```

画像のダウンロード （デフォだと.gif）

``` bash
# ;placeimg

curl -O "http://placehold.it/%filltext:name=幅:width=4%x%filltext:name=高さ:width=4%&text=[01-%filltext:name=作成枚数%]"

```

このままだと拡張子もついていないファイル名なので、
ファイル名を一括リネーム

``` bash
# ;rename

rename -x -e '$_ = "%filltext:name=名前%$N\.gif"' *text*

```

できたファイルはこんな感じ。

![スクリーンショット 2014-02-09 1.07.00.png](https://qiita-image-store.s3.amazonaws.com/0/5472/3e9f5731-dcc9-8fd5-7ff6-fe443cd12cae.png "スクリーンショット 2014-02-09 1.07.00.png")



![スクリーンショット 2014-02-09 1.08.09.png](https://qiita-image-store.s3.amazonaws.com/0/5472/17a6a0d5-566e-b285-e246-e73d9957a696.png "スクリーンショット 2014-02-09 1.08.09.png")




renameコマンドのインストール、解説は下記にまとめました。
http://qiita.com/GENYA/items/c3bdd6b187c2a9e40be1
【iOS7】UIWebViewの新機能：UIWebPagination

UIWebViewにもいろいろと見慣れないメソッドがiOS7で追加されていたので、使ってみました。

````
@property (nonatomic) UIWebPaginationMode paginationMode;
@property (nonatomic) UIWebPaginationBreakingMode paginationBreakingMode;
@property (nonatomic) CGFloat pageLength;
@property (nonatomic) CGFloat gapBetweenPages;
@property (nonatomic, readonly) NSUInteger pageCount;
````

名前から察するに、全体的に **Webのページネーション** に関する機能追加のようです。


UIWebPaginationMode には次のような値が定義されています。

````
typedef NS_ENUM(NSInteger, UIWebPaginationMode) {
    UIWebPaginationModeUnpaginated,
    UIWebPaginationModeLeftToRight,
    UIWebPaginationModeTopToBottom,
    UIWebPaginationModeBottomToTop,
    UIWebPaginationModeRightToLeft
};
````

ドキュメントによると UIWebView のプロパティ `paginationMode` にはデフォルトで `UIWebPaginationModeUnpaginate` が入っているとのこと。


`paginationMode` を変えると何が起きるのか、次のように簡単なアプリをつくって試してみました。

![pagination1.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/ce85f5d2-dc27-bb5d-4b77-a83d673162dd.jpeg)

画面下部の UISegmentedControl で `paginationMode` を切り替えられます。


これで試してみて、「なるほど」と思った部分だけ紹介します。


##UIWebPaginationModeLeftToRight


`paginationMode` に `UIWebPaginationModeLeftToRight` を指定すると、

![pagination2.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/34c78ba4-a19d-9369-9f0f-1e074aa20fe5.jpeg)


一見普通だったのが、水平方向にスクロールさせてみると、

![pagination3.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/4f1cd53d-8f81-4cec-0133-452316dff511.jpeg)

なるほど、確かに Left to Right にページネーションされています。


ちなみに、 **ロード完了したあとでも `paginationMode` を変えると表示が更新されます** （コンテンツ自体は変わりないので、当たり前ですが）。


##pageCount

`paginationMode` を指定して描画すると `pageCount` が取れるようになりました。UIPageControl の `numberOfPages` に渡したりするとよさそうです。


ちなみに上記サンプルで表示しているのは自分のブログですが、26ページでした。


##ページングを有効にする

ページネーションしてくれるならページングを有効にしない手はない、ということで

````
self.webView.scrollView.pagingEnabled = YES;
````

するといい感じです。


##サンプル

『[iOS7 Sampler](http://d.hatena.ne.jp/shu223/20130924/1379990718)』にサンプルコードを追加してあります。

![](http://f.cl.ly/items/2q2F0L2o2G3H2F0k0l1E/IMG_9221_r1_c1.jpg)


##所感

Web漫画とかみるアプリにはいいかもしれません。
MATLABによる動画の作り方 VideoWriter


```
vidObj = VideoWriter('Hoge.avi');
open(vidObj)
for frame = 1:1000
   currFrame = fugafuga( frame );
   writeVideo( vidObj, currFrame );
end
close( vidObj );
```

- 上記で fugafuga( ) は C( 1:Nx, 1:Ny, 1:3 ) のR,G,B三次元配列を出力する。値はそれぞれ 0以上1未満のdouble実数。
- ここで C が2次元配列ならば、グレースケールの動画ができる。値が 0以上255未満の整数でもよい（たぶん自動判別）。
- 動画作成の方法は他にもいろいろあるが、matlab最新の推奨方法は VideoWriter
- currFrame を得るために、current figure (gcf) や current axis (gca) を与える方法もある。(たしか getframe 関数を使う)
OracleConnection インスタンスから URL、接続ユーザーなどを取得する方法

Javaで接続中の oracle.jdbc.OracleConnection インスタンスから URL、接続ユーザーなどを取得するには
コネクションのインスタンスからgetMetaDataメソッドでメタデータ DatabaseMetaData を取得することで実現できます。

```sample.java
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDatabaseMetaData;


//URL取得
String getURLFromOracleConnection(OracleConnection con) {
	DatabaseMetaData metadata = con.getMetaData();
	String url = metadata.getURL();
	return url;
}

//ユーザー名取得
String getUserNameFromOracleConnection(OracleConnection con) {
	DatabaseMetaData metadata = con.getMetaData();
	String username = metadata.getUserName();
	return username;
}
```

[DatabaseMetaDataの詳細]
(http://docs.oracle.com/javase/jp/6/api/java/sql/DatabaseMetaData.html)

確認JDBC：Oracle JDBC driver バージョン：11.2.0.1.0

※ MySQLでは試してませんが、MySQLでも出来るかもしれません。
読書リスト

# 優先度：S
* <del>[リファクタリング](e631f2a3d35782457cfa)</del>
* レガシーコード改善ガイド
* リーダブルコード
* テスト駆動開発入門
* オンラインゲームを支える技術

# 優先度：A
* PRO Git
* Unix パワーツール
* ピープルウェア
* <del>[アプレンティスシップ・パターン](1f09faf1fed9880e21bd)</del>

# 優先度：B

# 優先度：C
NSStringのTips

たまに忘れるのでメモ、どんどん増やすかも

## 区切り文字で配列に変換する &その逆
・配列から文字列へセパレータで区切りつつ連結させる

```objectivec
NSArray *arr = @[@"Hello", @"World", @"!"];
NSString *str = [arr componentsJoinedByString:@","];
// Hello,World,!
```
・配列から文字列へセパレータで区切りつつ連結させる

```objectivec
NSString *str = @"Hello,World,!";
NSArray *arr = [str componentsSeparatedByString:@","];
// @{@"Hello", @"World", @"!"}
```

## 文字列検索
・文字列の中に、対象の文字列が存在するか確認

```objectivec
NSString *str = @"Hello World!";
NSRange searchResult = [str rangeOfString:@"World"];
// location=6, length=5

if(searchResult.location == NSNotFound) {
  // みつからない場合の処理
}else{
  // みつかった場合の処理
}
```
【CakePHP】updateAll

## 基本形

```php:基本
$this->テーブル名->updateAll(
  ['更新するカラム' => 変更の値 ],
  ['条件のカラム'   => 条件の値 ]
)
```

```php:例
$this->foo->updateAll(
  [ 'status' => "'OK'"],
  [ 'age' => 20 ]
);
//=>update foo set status='ok' where age = 20
```

##注意点

###更新する値が文字列ならクォートして渡す
更新する値はそのままsqlに渡されるので、更新する値が文字列ならクォートして渡す。
クォートするのは更新する値だけ！条件は文字列でもクォートしなくても良い！！！

ちなみに、空文字で更新したい場合は以下の通り。

```php:空文字で更新
$this->foo->updateAll(
  [ 'status' => "''"],
  [ 'age' => 20 ]
);
//=>update foo set status='' where age = 20
```

### modifiedは自動更新されない
modifiedは自動更新されないので、自分でやらなければいけない。

```php
$this->foo->updateAll( 
  [
    'status' => "'OK'",
    'modified' => "'" . date('Y-m-d H:i:s') . "'"
  ], 
  [ 'age' => 20 ]
);
```

###サニタイズを自分でやる

sqlをそのまま渡すのでサニタイズはやってくれない。
cookbookにはサニタイズにSanitize::escape()を使うと書いているけど、Cake2.4からSanitize::escape()はdeprecatedになっている模様。

一旦、Sanitize::escape()の使い方。

```php
App::uses('Sanitize', 'Utility');
$sanitized_str = Sanitize::escape('サニタイズする文字'); 
```

外から入ったデータで更新するなら、SQLインジェクションを狙われるので、サニタイズは必須。

###注意点をふまえての実行例
サニタイズして、クォートをつけて、modifiedを自前で更新する。

```php
$status = "'" . Sanitize::escape($input_data) . "'";

$this->foo->updateAll(
  array(
    'status' => $status,
    'modified' => "'" . date('Y-m-d H:i:s') . "'"
  ),
  array( 'age' => 20 )
);
```
JSONRPC - Batch／Notificationについて

# JSONRPCとは

JSONを用いてRPCを実現するプロトコルです。詳しくは以下のWebサイトにまとまっています。
http://www.jsonrpc.org/

# この記事の概要

この記事ではJSONRPCのSpecにまとまっているBatchとNotificationという特徴的なリクエスト方法をまとめます。間違っている箇所などあれば指摘してください。

# Batch

JSONRPCにはBatchというリクエスト仕様が定義されています。
http://www.jsonrpc.org/specification#batch

簡単に言うとJSONを配列で複数つなげてリクエストすると、レスポンスもそれにあわせてそれぞれ配列で返ってくる、という仕様です。一度の通信で複数回メソッド実行を行うことで通信コストを下げることなどが可能です。

## Batchサンプル

### Request

リクエストのJSONを配列でつなげて一度に投げてみます。

```json
[{
    "id"      : 0, //結果を判別するID
    "jsonrpc" : "2.0",
    "method"  : "batchRequest",
    "params"  : {
        ....
    }
},
{
    "id"      : 1, //結果を判別するID
    "jsonrpc" : "2.0",
    "method"  : "batchRequest",
    "params"  : {
        ....
    }
}]
```

### Response

すると、以下のようにレスポンスも指定したIDごとに配列で返ってきます。

```jsonrpc
[
    {
        "jsonrpc":"2.0",
        "id":"0", //リクエストで指定したIDと紐づいている
        "result":{"status":"OK"}
    },
    {
        "jsonrpc":"2.0",
        "id":"1", //リクエストで指定したIDと紐づいている
        "result":{"status":"OK"}
    },
]
```

# Notification

こちらも同様ですが、Notificationというリクエスト仕様が定義されています。
http://www.jsonrpc.org/specification#notification

クライアントからサーバー側に情報を通知するだけ、みたいな用途のときに用います。情報送るだけですので、レスポンスを受けてクライアントで処理を行わないでよいような場合に効率的かもしれません。

## Notificationサンプル

### Request

以下のように「id : 」の要素を省略すると自動的にNotificationリクエスト形式となります。
また、NotificationかつBatchリクエストということも可能です。

```jsonrpc
[{
    "jsonrpc" : "2.0",
    "method"  : "batchAndNotification",
    "params"  : {
        ....
    }
},
{
    "jsonrpc" : "2.0",
    "method"  : "batchAndNotification",
    "params"  : {
        ....
    }
}]
```

### Response

パラメータに問題が無く、正常にリモートのメソッドを実行できた場合はすぐにHTTPレスポンスが204 Statusで返却されます。この際、Bodyには何も入ってこないのでサーバー側でのエラーなどをキャッチすることは出来ません。この辺りが、Notificationの特徴です。

# 詳細

その他エラーの捕まえ方など、詳細に理解する為にjsonrpcの仕様書をきちんと読むことをお勧めします。

http://www.jsonrpc.org/specification
iOSにプロビジョニングプロファイルが転送できない場合の対処法

・XCode の Organizer の Provisioning Profiles の一覧画面から「Add」でFinderを開いても
  拡張子「mobileprovision」のファイルがグレーアウトされてしまう
  
・XCode の Organizer の端末情報を表示する画面にある「Add to Member Center」を押下して
  インストールするプロビジョニングプロファイルを選んでもエラーとなる

上記のような現象が発生した場合、以下の手順で解消しました。

1. iOS端末（iOS7の場合）の「設定」を開く
2. 「一般」-> 「リセット」-> 「すべての設定をリセット」から設定リセットを実行し、リセット完了まで待つ
3. リセット完了後、プロビジョニングプロファイルがインストール可能になります
読書ノート:リファクタリング

# きっかけ
ITエンジニア必修書籍らしいんで

# 書籍情報
題名：リファクタリング:Rubyエディション
著訳：Jay Fields/Shane Harvie/Martin Fowler with Kent Beck
長尾高弘 訳
発行：2010年3月 発行

# 超訳
* リファクタリングとは何か知りたいとき
* なぜリファクタリングすべきか知りたいとき
* どこをリファクタリングすべきか知りたいとき
* 実際にリファクタリングを行おうとする場合

そんな時に読むと良いらしい

# 感想
## 心に残った箇所
* 「壊れていないなら直すな」対「リファクタリング」
* テストファーストリファクタリング
* コードの臭い
 * 技術的負債のかほり
* リファクタリング手法大全
 * カタログ的な
* 大規模リファクタリングへの取り組み方

## 私見
* テストが全くない状態でテストを書くこととテストがたくさんある状態でテストを書くことの違い
* テストのかきすぎによる実装の硬直化について
* 内部実装よりも外部(I/F)設計
* Stateパターンよりもデータ設計では？
* ドメインとプレゼンテーションの分離っていつまでも至上命題だよね  

　あんま関係ない話ですが、友人と話してた時に「技術的負債」って「負債」=「借金」なわけで。じゃあその借金で何を買ってるのか。なんやかや話しながら、「時間」というか「手間」なんだろうという話に落ち着きました。
　実際の経営でもエンジニアリングでも一番むずかしいのは無借金運用なんだなと思った次第。
　でも実際の借金は数値で明確に見える化されるけど、技術的負債は目に見えにくいから難しいですよね。
　個人的に、出来うる限り借金の少なくて済むプログラミングをしようと改めて思いました。

# 読書期間
開始：2014/2/7
読了：2014/2/27
2/7日のJavaScript学習内容

本日の学習内容は2章P49~の演算子について例文のプログラムの数値を変えたり少しいじりながら学習致しました。
基本的な算術演算子などについては特に問題ないのですが、
インクリメント演算子(x++,++x)の使い所が難しく感じました。
二つの違いは計算を行って値を返すか、値を返してから足すかという事で理解できました。

比較演算子や論理演算子については特に問題ございません。

ビット論理演算子についても今基本情報処理試験の基数変換で勉強していますので、理解できました。

その他の演算子についても意味や使い所については理解できましたが、それらを使って一人でプログラムを作成することは未だ困難ですので、今後はプログラムを書きつつ少しでも自分ひとりで書けるように努力したいと思っております。

本日はP49~P67の2章の終わりまでいけたので、次回は3章の制御文から行っていきたいと思っております。
jQuery②


## セレクタ ---- jQueryを使った要素の取得
記述の仕方は以下になります。

```js
$(セレクタ);
```

使い方としては↓

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test02</title>
</head>
<body>

<div id="div1">
    <span id="span1"></span>
    <span id="span2"></span>
</div>
<div id="div2">
    <span id="span3"></span>
    <span id="span4"></span>
</div>

<script type="text/javascript">

$(function(){
    // すべてのdiv要素を取得
    var $div = $('div');
    console.log($div);
        //=> <div id="div1">...</div>, <div id="div2">...</div>

    // id名がdiv1の要素を取得
    var $div1 = $('#div1');
    console.log($div1);
        //=> <div id="div1">...</div>

    // id名がdiv1の子要素のspan要素を取得
    var $span = $('#div1 span');
    console.log($span);
        //=> <span id="span1"></span>, <span id="span2"></span>
});
</script>

</html>

```

![jqセレクター.png](https://qiita-image-store.s3.amazonaws.com/0/35975/b0aee15b-41e8-7120-e2e1-d7e4a685ac2f.png "jqセレクター.png")

上記の様に基本的には「CSSのセレクタ」がすべてそのまま使えます。

## jQueryの独自のセレクタ

次の様なjQuery独自のセレクタも存在します。

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test02</title>
</head>
<body>

<div id="div1">
    <span id="span1"></span>
    <span id="span2"></span>
</div>
<div id="div2">
    <span id="span3"></span>
    <span id="span4"></span>
</div>

<script type="text/javascript">

$(function(){
    // すべてのdiv要素のうち、2番目の要素(指定する数字は0からスタート)を取得
    var $div2 = $('div:eq(1)');
    console.log($div2); //=> <div id="div2">...</div>
});

</script>

</html>

```

![jqセレクタ02.png](https://qiita-image-store.s3.amazonaws.com/0/35975/2d3c1edd-0488-61fb-ed4c-31ff73f32143.png "jqセレクタ02.png")

コメントにも書いてある様に`eq(1)`は`div`要素の２番目を指定するjQuery独自のセレクタです。
読書ノート:アプレンティスシップ・パターン

# きっかけ
某先輩へ人生相談をしていた時に、紹介されて読みました。

# 書籍情報
題名：アプレンティスシップ・パターン――徒弟制度に学ぶ熟練技術者の技と心得
著訳：Dave H. Hoover, Adewale Oshineye　著、柴田 芳樹　訳
発行：2010年07月 発行

# 超訳
熟練技術者になるための様々な方法(ただし全部を実践したとしても熟練技術者になれるとは限らない)

# 感想
あたりまえだと思ってたこと、学生時代に教えられたこと、社会に出てから自分で考えたこと感じたこと、意識していなかったけどそのとおりだと思わされることなど様々なパターンが提案されていた。
紹介してくれた人は「新入社員向け」って言ってたけど入社後半年〜二年目くらいの人が読むのが適正な気がする。
「アプレンティス-ジャーニーマン-熟練職人」という区分けで話が組み立てられてるけれども、最終的にはどれも区分けがないようにも感じた。

あと「無能レベルへの到達」ってフレーズが個人的には一番印象に残った。

# 読書期間
開始：2014/1/14
読了：2014/2/7

# 参考リンク
http://www.oreilly.co.jp/books/9784873114606/
chefspecでlibraries内のメソッドをテストする

例えば、"recipename"というレシピのlibrariesにある"TestHelper"をテストしたいとき。
以下の通りに書くと、テストできます。

```ruby:spec/recipes/default_spec.rb
describe 'recipename::default' do
  let( :chef_run ) { ChefSpec::Runner.new.converge( described_recipe ) }

  it 'libraries test' do
    helper = Object.new.extend( TestHelper )
    result = helper.getHoge( "Hoge" )
    result.should == "Hoge"
  end
end
```

```ruby:libraries/test_helper.rb
module TestHelper
  def getHoge( msg )
    return msg
  end
end
```

あっ、ちなみに、librariesの中でnodeを参照している場合は、テスト時に変数が参照できないエラーが出ますので、ご注意ください。
segueのきほん


## 基本
1. ボタンから矢印を伸ばして対象のViewControllerへsegueを繋げる

![001-01.png](https://qiita-image-store.s3.amazonaws.com/0/37103/f8088cf3-9168-9749-5272-32ab951aee43.png)

## 任意で遷移先を切り替える
### segueの設定
1. ボタンとかではなく「ViewController」から矢印を伸ばして対象のViewControllerへsegueを繋げる
1. segueのidentifierに名前をつける
2. コードの実行

```objc
[self performSegueWithIdentifier:@"identifier名" sender:self]; 
```

## 1つ前にもどる
### pushの場合

```objc
[self.navigationController popViewControllerAnimated:YES];
```

### modalの場合

```objc
[self dismissModalViewControllerAnimated:YES];
```

## 特定のところにもどる
[参考](http://dev.classmethod.jp/smartphone/iphone/ios_unwind-segue/)
### Unwindをつかう準備
戻り先に

```objc
- (IBAction)xxxx:(UIStoryboardSegue *)segue{
}
```

### segueのひもづけ
* ExitのPresenting Seguesに「xxxx」が現れるので戻り元のボタンから矢印でひもづける

![002.png](https://qiita-image-store.s3.amazonaws.com/0/37103/b947724a-6936-7a69-564e-844ea45545fe.png)

* 戻り元のViewControllerから繋げるとManual Segueで設定できる
   * 戻り元のExitの下にUnwind segue from Item to Exitが現れるのでidentifierに名前をつける
   * performSegueWithIdentifierで遷移させる
   
```objc
[self performSegueWithIdentifier:@"identifier名" sender:self]; 
```

## イベント

### 遷移元＠遷移直前：prepareForSegue

```objc
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
   if([[segue identifier] isEqualToString:@"identifier名"]) {
      //遷移先のViewController
      NextViewController *nextViewController = [segue destinationViewController];
   }
}
```

### Unwind遷移直前：canPerformUnwindSegueAction
```objc
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender{
   //遷移させない
   //return NO;
   return YES;
}
```