OmniAICreator/Qiita-1.07M huggingface dataset:
自作 CakePHP Plugin 生存報告 2014

あ、CakePHP Advent Calendar3回目です。

とりあえず [1日目](http://qiita.com/k1LoW/items/dc144d961489664646a8) に言っていたように `modified` を更新すべく自作プラグインの生存報告をしようと思います。

## ControllerPrefix

https://github.com/k1LoW/controller_prefix

http://k1low.hatenablog.com/entry/20111206/1323163450

`AdminUsersController.php` の `index()` が `/admin/users/` にルーティングされるというアレですね。

生きてます。

## Exception

https://github.com/k1LoW/Exception

エラーが発生したらメールを飛ばしてくれたりするアレですね。

生きてます。

## Filebinder

https://github.com/fusic/filebinder

http://kamakurasoft.net/blog/?p=1624

簡単にファイルアップロード機能を追加してくれるアレですね。

生きてます。

## Fuzzy

https://github.com/k1LoW/Fuzzy

http://k1low.hatenablog.com/entry/20120604/1338802029

フォーム入力からの $data を良きに計らって変換してくれる機能を追加してくれるアレですね。

あまり生きていません。一部最新状態にする必要があります。

## Yasd

https://github.com/k1LoW/Yasd

http://qiita.com/k1LoW/items/3b0a34353961e5040fbd

論理削除機能を追加してくれるアレですね。

生きてます。

## Yav

https://github.com/k1LoW/Yav

http://fusic.doorkeeper.jp/events/7414

Cakeplusにさらにバリデーションやバリデーションパターンを追加してくれるアレですね。

生きてます。

## HasNo

https://github.com/k1LoW/has_no

勝手に連結してしまってfind()が重くなるのを防ぐために、明示的に繋げないかぎりリレーションを問答無用で切ってくれるアレですね。

生きてます。

## Enumm

https://github.com/k1LoW/Enumm

http://k1low.hatenablog.com/entry/2014/10/27/185844

RailsでいうActiveRecord::Enum的なアレですね。

生きてます。

## Yacsv

https://github.com/k1LoW/Yacsv

http://k1low.hatenablog.com/entry/2013/07/18/225019

CSVをインポートしたりエクスポートしたりするアレですね。

生きてます。

## Po

https://github.com/k1LoW/po

poファイルをマージしたりするアレですね。

生きてます。

## Yalog

https://github.com/k1LoW/yalog

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2580&forum=3

ログローテートしたりS3にアップロードしたりその他色々ログ操作できるアレですね。

生きていますが、ログローテートならCakePHP2.4からはデフォルトで実装可能です。

## Yamd

https://github.com/k1LoW/Yamd

http://k1low.hatenablog.com/entry/2013/03/08/212329

Markdownをいろいろいじれるアレですね。

生きています。

## Setting

https://github.com/k1LoW/Setting

http://k1low.hatenablog.com/entry/2012/12/13/190449

設定値の管理をいい感じに拡張できるアレですね。

生きています。

## Escape

https://github.com/k1LoW/escape

Viewにセットする値を全てh()してやろうというアレですね。

生きています。

## LazyMan

https://github.com/k1LoW/LazyMan

http://k1low.hatenablog.com/entry/2013/06/18/222635

Webシステムへのアクセスによって擬似cronを回してやろうというアレですね。

生きてます。

---

全部の報告はできませんでしたが、以上が、2014年 自作プラグインの生存報告でした。

役に立てそうなプラグインがありましたら是非使ってみてください。

PullRequestをお待ちしております！
カスタムUIGestureRecognizer with Swift


SwiftでカスタムUIGestureRecognizerをつくろうとした際にハマったのでメモ

# ポイント
- Bridging-Header.h に以下を追加する

```
#import <UIKit/UIGestureRecognizerSubclass.h>
```

これ追加しないとself.state変数にアクセスしようとした際に以下のコンパイルエラーが発生する。

```
cannot assign to 'state' in 'self'
```

# サンプルソース

```
//
//  UICustomGestureRecognizer.swift
//
//  Created by Takatomo Okitsu on 2014/12/25.
//  Copyright (c) 2014年 Takatomo Okitsu. All rights reserved.
//

import UIKit

class UICustomGestureRecognizer :UIGestureRecognizer {
    
    var _timeOutTimer:NSTimer?
    
    override func reset() {
    }
    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    }

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    }

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    }

    override func touchesCancelled(touches: NSSet, withEvent event: UIEvent) {
    }
    
    func invalidateTimer() {
        if _timeOutTimer != nil {
            _timeOutTimer?.invalidate()
            _timeOutTimer = nil;
        }
    }
    
    func handleTimeOut() {
        self.invalidateTimer()
        self.state = UIGestureRecognizerState.Failed
    }
}

```
java.net.URLのgetメソッドの戻り値をオプション型にするScala用ラッパー


[java.net.URLのgetメソッドで取得できるURLの部分]でお気づきのとおり、getメソッドの中には存在しない場合の戻り値がnullだったり-1だったりするものがある。Scalaで使うなら「存在しない場合」は`None`で受け取りたい。そこで、`java.net.URL`用のラッパーを作った。


```scala
implicit class ScalaURL(url: java.net.URL) {
  def query: Option[String] = url.getQuery match {
    case null      => None
    case q: String => Some(q)
  }

  def path: Option[String] = url.getPath match {
    case ""        => None
    case p: String => Some(p)
  }

  def userInfo: Option[String] = url.getUserInfo match {
    case null      => None
    case u: String => Some(u)
  }

  def authority: String = url.getAuthority

  def port: Option[Int] = url.getPort match {
    case -1     => None
    case p: Int => Some(p)
  }

  def defaultPort: Option[Int] = url.getDefaultPort match {
    case -1     => None
    case p: Int => Some(p)
  }

  def protocol: String = url.getProtocol

  def host: String = url.getHost

  def file: Option[String] = url.getFile match {
    case ""        => None
    case f: String => Some(f)
  }

  def ref: Option[String] = url.getRef match {
    case null      => None
    case r: String => Some(r)
  }
}
```

[java.net.URLのgetメソッドで取得できるURLの部分]: http://qiita.com/suin/items/bef9ee08a15476f21b60
CentOS7のsamba4はsmbpasswdの代わりにpdbeditになった

## 参考

* [Samba4でファイル共有 | Netsphere Laboratories](http://www.nslabs.jp/samba.rhtml)

## sambaアクセス用アカウント設定

* CentOS7側に存在するアカウントであること
* `smbpasswd`コマンドはなくなり、`pdbedit`コマンドになった。

```bash:ユーザ一覧表示
# pdbedit --list
```

```bash:アカウント追加
# pdbedit -a nobody
new password:
retype new password:
Unix username:        nobody
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-397977794-1468165086-1115858330-501
Primary Group SID:    S-1-5-21-397977794-1468165086-1115858330-513
Full Name:            Nobody
Home Directory:       \\smbserver\nobody
HomeDir Drive:
Logon Script:
Profile Path:         \\smbserver\nobody\profile
Domain:               SMBSERVER
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          木, 07  2月 2036 00:06:39 JST
Kickoff time:         木, 07  2月 2036 00:06:39 JST
Password last set:    木, 25 12月 2014 08:42:08 JST
Password can change:  木, 25 12月 2014 08:42:08 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
```

```bash:ユーザ一覧表示
# pdbedit --list
nobody:99:Nobody
```
java.net.URLのgetメソッドで取得できるURLの部分




メソッド	|	説明	|	戻り値	|	存在しない場合の戻り値	|	例
---|---|---|---|---
getQuery	|	URL のクエリー部分	|	`String`	|	`null`	|	`query=a&b=c`
getPath	|	URL のパス部分	|	`String`	|	空の`String`	|	`/path/to/page`
getUserInfo	|	URL のユーザー情報部分	|	`String`	|	`null`	|	`user:password`
getAuthority	|	URL の機関部分	|	`String`	|		|	`user:password@host:80`
getPort	|	URL のポート番号	|	`Int`	|	`-1`	|	`80`
getDefaultPort	|	URL に関連するプロトコルのデフォルトのポート番号	|	`Int`	|	`-1`	|	`443`
getProtocol	|	URL のプロトコル名	|	`String`	|		|	`https`
getHost	|	URL のホスト名	|	`String`	|		|	`host`
getFile	|	URL のファイル名	|	`String`	|	空の`String`	|	`/path/to/page?query=a&b=c`
getRef	|	URL のアンカー	|	`String`	|	`null`	|	`hash`

* 例は`new java.net.URL("https://user:password@host:80/path/to/page?query=a&b=c#hash")`で生成したインスタンスに対してメソッドを実行した場合。
* Scalaから使うと、存在しない場合の戻り値が`null`だったり`-1`だったりして辛いので、[ラッパーを作る](http://qiita.com/suin/items/df998db14bdf270ece33)といいかもしれない…。
has_manyなオブジェクトの上限数を設定＆テストする

この記事では`Blog::Post#tags`の数を5つまでに制限する場合のサンプルコードを紹介します。

元記事は「[Rails4でhas_manyな関連オブジェクトの上限数を設定＆テストする](http://blog.enogineer.com/2014/12/25/validate-has-many-length/)」です。

まずモデル側で`post_tags`に`LengthValidation`を設定します。

```rb:app/models/blog/post.rb
class Blog::Post < ActiveRecord::Base
  MAX_POST_TAGS_LENGTH = 5

  has_many :post_tags
  has_many :tags, through: :post_tags

  validates :post_tags, length: {maximum: MAX_POST_TAGS_LENGTH}
end
```

続いてロケール設定を追加します。

```yaml:config/locale/models/blog/post/ja.yml
ja:
  activerecord:
    errors:
      models:
        blog/post:
          attributes:
            post_tags:
              too_long: 'は%{count}個までしか登録できません'
    models:
      blog/post: ブログ記事
    attributes:
      blog/post:
        id: 管理ID
        post_tags: タグ
```

次はテストを追加します。

```rb:spec/models/blog/post_spec.rb
describe Blog::Post, type: :model do
  context 'with validations' do
    it do
      should validate_objects_length_of(:post_tags).
               is_at_most(Blog::Post::MAX_POST_TAGS_LENGTH).
               with_message("タグは#{Blog::Post::MAX_POST_TAGS_LENGTH}個までしか登録できません")
    end
  end
end
```

さらっと`validate_objects_length_of`マッチャを使っていますが、こちらはカスタムマッチャなので元記事の[validate_objects_length_ofのコード](http://blog.enogineer.com/2014/12/25/validate-has-many-length/#validateobjectslengthof)をご覧ください。
formタグのaction,method属性の使い方と特性〜html,slimでの記述方法〜


![](https://qiita-image-store.s3.amazonaws.com/0/63640/3c15bea4-7567-553d-6fc9-ba1a34e02810.png "logofix.png")

なんと、お問い合わせフォームやメール送信フォームはパパッと簡単に作れてしまいます。難しいのは、サーバー側での処理ですが、今回はいくつかの記事に分けて細かく詳しく説明していきます(>ω<)
この記事では、htmlでメールフォームを作る時に使われるformタグ、inputタグ、selectタグ、textareaタグについて説明します。

実は、facebookのログイン画面やTwitterのアカウント登録画面、アンケートなどで入力するフォームもhtmlのformを使って記述されています。一度覚えてしまえば何かと使えそうですね！

## 基本要素「formタグ」と「action属性」「method属性」
htmlでメールフォームを作るには、formタグを使います。
formタグにはaction属性とmethod属性を指定してあげることが必要です。

## formタグ
- 入力フォームや送信フォームを表示させたい時に使う
- formタグの間に他のタグを入れることによって様々な部品を配置することができる
- 表示されたフォームに入力されたデータは、送信ボタンを押すとCGIプログラムなどに送信されて処理される
- 処理の仕方を属性で指定する

```html
<form>
...
</form>
```

```RubySlim
form
	...
```

## action属性
- formタグに指定する属性で、必ず指定しなければならない
- フォームの送信ボタンを押して送信されるデータの送信先を指定する
- データの送信先のことをURIという
- 指定するのはデータを受け渡す処理をしてくれるサーバーのCGIプログラムのURI

```html
<form action="CGIプログラムのURI">
...
</form>
```

```RubySlim
form action="CGIプログラムのURI"
```

## CGIプログラム
- Common Gateway Interface(コモンゲートウェイインターフェイス)の略
- CGIとはWebサーバーかプログラムを実行するときのルールのこと
- CGIの仕組みによって起動されるプログラムのことを主にCGIプログラムという
- メールフォームの場合は、メールフォームに入力されて送信されたデータを受け取ってあとの応答をCGIプログラムで処理される
- CGIプログラムはRubyやJava、C言語など様々なものを使用して記述できる


## method属性
- formタグに指定する属性で、必須ではない
- 送信するときの転送方法を指定する
- postとgetがある

## method属性-get
- formタグのmethodをgetに指定すると、入力したフォーム内容のデータがURIにくっついて送信される
- 例　http://www.hogehoge.com/cgi.php?name=pippi&old=21&address=tokyo
- 例2 Googleで検索してURLが表示されるエリアを見ると、似たような文字列があるはず。これはあなたが検索したキーワードをURIの一番最後にくっつけて送信している

*※その際、日本語で入力すると特殊なコードに変換されて文字化けするので、英語(アルファベット)で検索した方がわかりやすい。*


```html
<form action="CGIプログラムのURI" method="get">
...
</form>
```

```RubySlim
form action="CGIプログラムのURI" method="get"
```


## method属性-post
- formタグのmethodをgetに指定すると、入力したフォーム内容はURIとは別の場所に保管されてデータが送信される
- 入力したフォーム内容のデータは外側からの表示では見ることができないので安全性が高い

```html
<form action="CGIプログラムのURI" method="post">
...
</form>
```

```RubySlim
form action="CGIプログラムのURI" method="post"
```

## getとpostの違い
- getには送信するデータ量の制限がある
- getは送信したデータ内容が送信先のサーバーにログとして残ってしまうことがある
- postには送信するデータ量の制限がない
- 一概には言えないがgetはサーバー側にあるデータの取得に適している
- 一概には言えないがpostはユーザー側が情報を送信するのに適している
TravisCIのDocker対応を試してみました

Travis CIがDockerの対応が発表されたので、試してみました。

[The Travis CI Blog: Faster Builds with Container-Based Infrastructure and Docker](http://blog.travis-ci.com/2014-12-17-faster-builds-with-container-based-infrastructure/)

## 設定方法
上記リンク先通りに、`.travis.yml`に`sudo: false`の一行を追加するだけでも良いですが、せっかくオープンソースプロジェクトに対しても`cache`を開放してくれたので、合わせて追加しました。

```
...
sudo: false
cache: bundler
...
```

## 効果

|セクション時間|変更前|変更後|補足|
|-------------|-----|-----|----|
|bundle install|104|6|get cacheの時間を含む|
|rspec         |15|8||
|other         |8|11|save cacheの時間を含む|

## 結論
- `git push`してから`travis ci`の最初のログが表示されるまでの時間は、体感的に速くなった（気がします）
- `cache: bundler`の効果が大きい
- VMのスペックもあがったので、`rspec`の実行も速くなりました
- 総合的には、`sudo`を使ってないプロジェクトであれば、今すぐ`sudo: false`と`cache: bundler`を追加しましょう！

## 注意点
- `cache: bundler`だけ追加して試してみたんですが、効きませんでした
sysprepでマスタディスクを作成

* [Download Windows 2000 Service Pack 4 導入ツール from Official Microsoft Download Center](http://www.microsoft.com/downloads/details.aspx?familyid=E5A33392-77A2-4D9C-A70E-8EB1369C85ED&displaylang=ja)

`sp4DeployTools.exe`をダウンロードし実行すると
`deploy.cab`がある。

`deploy.cab`を展開すると以下ファイルがある。

![sysprep1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1c49a104-72cb-f447-80fe-afde30081cb4.png)

* `setupmgr.exe`で自動応答用の設定。(必須ではない)
* `sysprep.exe`を実行すると、ディスクからライセンス情報などを削除し、次回起動時入力を求めるようになる。

![sysprep2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6d59fcc6-0e25-df7c-5bd9-4e53acc04ccf.png)
baserJSで装飾可能にするフォーム要素に付加されるクラス名を変更する


Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## フォーム要素に付加されるクラス名の一部や形式を変更する

`bcRadio` `bcCheckbox` `bcSelect` メソッドを使用すると、装飾用の要素が挿入されますが、それらの要素のクラス名は何も指定しなければ自動的に付加されます。

## APIの変数を上書きする

特に変更するメソッドや、`bcRadio` `bcCheckbox` `bcSelect` のオプション引数などで指定するわけではなく、baser内のオブジェクトのプロパティを上書きすることで、クラス名の一部や形式を変更することができます。

```js
// プレフィックスの変更
baser.ui.element.Element.classNameDefaultPrefix = 'original-prefix';

// クラス名の形式を変更
baser.ui.element.Element.classNameDefaultCase = baser.ui.element.ElementClassNameCase.SNAKE_CASE; // スネークケース
baser.ui.element.Element.classNameDefaultCase = baser.ui.element.ElementClassNameCase.CAMEL_CASE; // キャメルケース
baser.ui.element.Element.classNameDefaultCase = baser.ui.element.ElementClassNameCase.HYPHEN_DELIMITED; // ハイフン区切り

// BEM形式のエレメントのクラス名の繋ぎ文字
baser.ui.element.Element.classNameDefaultSeparatorForElement = baser.ui.element.Element.ClassNameSeparatorForBEM.DOUBLE_UNDERSCORE;

// BEM形式のモディファイアのクラス名の繋ぎ文字
baser.ui.element.Element.classNameDefaultSeparatorForModifier = baser.ui.element.Element.ClassNameSeparatorForBEM.DOUBLE_HYPHEN;

/*
baser.ui.element.Element.classNameDefaultSeparatorForElement と
baser.ui.element.Element.classNameDefaultSeparatorForModifier は
baser.ui.element.Element.ClassNameSeparatorForBEM オブジェクトの以下のプロパティを使用することができます。
	HYPHEN => '-'
	DOUBLE_HYPHEN => '--'
	UNDERSCORE => '_'
	DOUBLE_UNDERSCORE => '__'
	CAMEL_CASE => キャメルケース
*/
```

いずれも `bcRadio` `bcCheckbox` `bcSelect` メソッドを実行する前に上書きしておく必要があることは注意が必要です。
baserJSで装飾可能にしたセレクトボックスをiOSとAndroidに対応させる


Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## 通常の実装

[サンプル](http://codepen.io/YusukeHirao/pen/pvgYGK)

### フォーカス状態によってオプション要素を表示する

CSSのコーディングのポイントは以下です。

```css
.-bc-pseudo-select__option-list {
	display: none;
}
.-bc-pseudo-select--focus .-bc-pseudo-select__option-list {
  display: block;
}

```

フォーカスが当たると クラス`-bc-pseudo-select--focus`が付加されるのでそれを利用します。

## スマートフォンの場合

iOS SafariやAndoroidブラウザの場合、セレクト要素を選択すると、ブラウザ独自の選択インターフェイスが表示させるので、こちらを出すようにします。

JSのイベントから呼び出すことは不可能なので、直接 `select` 要素をタップしてもらうようにしなければなりません。

なので実際の `select` 要素をボタンの大きさに広げ、絶対値と`z-index`で手前に重ねて、透明化してしまうことで ボタンにタップするたびに 透明な `select` 要素をタップしている状態になります。

```css
.-bc-form-select {
  /* 実際のselect要素 */
  position: absolute;
  top: 0;
  left: 0;
  z-index: 10; /* 手前にもってくる */
  -webkit-appearance: none;
  width: 100%;
  height: 100%;
  opacity: 0; /* 透明にする */
}

/* 擬似的に生成された要素は表示しない */
.-bc-pseudo-select--focus .-bc-pseudo-select__option-list {
  /* display: block; */
}
```
baserJSで埋め込んだGoogleMapsのピンにインフォウィンドウを表示させる


Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## GoogleMapsを埋め込む

基本的な埋め込む方法はこちら [baserJSでGoogleMapsを埋め込む](http://qiita.com/YusukeHirao/items/09428bef47c0e4305a06)

## インフォウィンドウを表示させる

### HTML

```html
<div class="maps" data-lat="33.606785" data-lng="130.418314">
	<div  data-lat="33.606785" data-lng="130.418314">
		<h1>座標1</h1>
		<p>テキストテキスト</p>
	</div>
	<div data-lat="33.606515" data-lng="130.417414">
		<h1>座標2</h1>
		<p>テキストテキスト</p>
	</div>
</div>
```

### JavaScript

```js
$('.maps').bcMaps();
```

## 子にdiv要素をつくるだけ

`bcMaps`メソッドを実行する要素を基準に、直後のdiv要素がピンを表し、その内容がインフォウィンドウの内容になります。
baserJSでリスト要素を分割する


Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## リストをカラム分けしたりしたいとき

```html
<div class="multi-column">
	<ul>
		<li>1</li>
		<li>2</li>
		<li>3</li>
		<li>4</li>
		<li>5</li>
		<li>6</li>
		<li>7</li>
		<li>8</li>
		<li>9</li>
		<li>10</li>
		<li>11</li>
		<li>12</li>
		<li>13</li>
		<li>14</li>
		<li>15</li>
		<li>16</li>
		<li>17</li>
		<li>18</li>
		<li>19</li>
		<li>20</li>
	</ul>
</div>
```

```js
$('multi-column').bcSplitList(6);
```

### 結果

```html
<div class="multi-column">
	<ul class="-bc-splited-list -bc-splited-list--nth6">
		<li class="-bc-splited-list__item -bc-splited-list__item--nth0">1</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth0">2</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth0">3</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth0">4</li>
	</ul>
		<ul class="-bc-splited-list -bc-splited-list--nth6">
		<li class="-bc-splited-list__item -bc-splited-list__item--nth1">5</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth1">6</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth1">7</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth1">8</li>
	</ul>
		<ul class="-bc-splited-list -bc-splited-list--nth6">
		<li class="-bc-splited-list__item -bc-splited-list__item--nth2">9</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth2">10</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth2">11</li>
	</ul>
		<ul class="-bc-splited-list -bc-splited-list--nth6">
		<li class="-bc-splited-list__item -bc-splited-list__item--nth3">12</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth3">13</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth3">14</li>
	</ul>
		<ul class="-bc-splited-list -bc-splited-list--nth6">
		<li class="-bc-splited-list__item -bc-splited-list__item--nth4">15</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth4">16</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth4">17</li>
	</ul>
		<ul class="-bc-splited-list -bc-splited-list--nth6">
		<li class="-bc-splited-list__item -bc-splited-list__item--nth5">18</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth5">19</li>
		<li class="-bc-splited-list__item -bc-splited-list__item--nth5">20</li>
	</ul>
</div>
```

## 分割方法

余りを内包して均等に分割します。

`20` を `6` で分割した時は `[3, 3, 3, 3, 3, 3, 2]` (`3` 余り `2`) ではなく `[4, 4, 3, 3, 3, 3]` と分割されます。

*v0.2.0* では `baser.utility.Mathematics.split` 関数に計算処理をわける予定です。
baserJSでリンク先のファイルによってアイコンを出し分ける


Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## 0.2.0 で実装予定

方針だけ決めて実装間に合いませんでした。

拡張子からファイルを判定してクラスを付加したり、画像を挿入するメソッドです。CSS2.1の属性セレクタを使って可能な実装ですが、より細かく正規表現でファイル名を判定したり擬似要素ではない実際の要素を挿入したりできます。

あくまで最終手段的なものです。

以下のような仕様にする予定。

### JavaScript

```js
$('a').bcExtendLink([
	{
		rule: /\.pdf$/i,
		addClass: 'file-pdf',
		addImage: '/img/icon/pdf.png',
		target: '_blank'
	},
	{
		rule: /\.xlsx?$/i,
		addClass: 'file-excel',
		addImage: '/img/icon/xls.png',
		target: '_top'
	}
]);
```
baserJSで要素内の画像の読み込みを待つ


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## window.onload でなく、一部の要素内の読み込みを待機

要素内に限定した画像の読み込みが完了してから発火するコールバックを登録できます。

### HTML

```html
<div class="image-container">
	<img src="a.png">
	<img src="b.png">
	<img src="c.png">
</div>

<img src="d.png">
<img src="e.png">
<img src="f.png">
```

### JavaScript

```js
$('.image-container').bcImageLoaded(function () {
	
	// a.png, b.png, c.png の読み込みが完了してから実行されます
	// d.png, e.png, f.png はなにも干渉しません
	
	this; // => .image-container の HTMLオブジェクト
		
});
```
baserJSで揃えた高さを解除する


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## 0.2.0 で実装予定

方針だけ決めて実装間に合いませんでした。

レスポンシブなどのブレークポイントでレイアウトが変わる場合などに必要な仕様なので、なるべく早く実装したいです。

以下のような仕様にする予定。

### JavaScript

```js
$('.box').bcBoxAlignHeight('destroy');
```

## 1.0.0 ではすべてのメソッドに実装したい

あくまで希望！
baserJSで要素の高さを揃える


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## floatさせたブロックなどの高さを揃える

### サンプル

http://codepen.io/YusukeHirao/pen/yyOJXP

## JavaScript

```js
// 全ての対象のボックスの高さを揃える
$('.box').bcBoxAlignHeight();

// 対象のボックスを3個ずつ高さを揃える
// ※3カラムのときなど
$('.box').bcBoxAlignHeight(3);

// 複数のグループをまたがるとき
$('.group').bcBoxAlignHeight(3, '.box');

// 各要素の高さを揃える直前で呼び出すコールバック
$('.group').bcBoxAlignHeight(3, null, function (maxHeight, currentHeight, $targets) {
	// falsyな値を返すと高さの調整をキャンセルできる
	retrun false;
});
```
【FileMaker】痒い所に手が届くプラグイン - monkeybreadsoftware

これですよ。
[monkeybreadsoftware](http://www.monkeybreadsoftware.de/filemaker/)という会社のFileMaker用プラグインを今年使う機会があって使ったのですが、まー、なんてステキなプラグイン。

一言で言うと、
**痒い所に手が届くプラグイン**
というところでしょうか。

とにかく「こういうことをいちいちスクリプトに起こすのめんどいんだけど」というのがプラグインとして提供されていて、とても気に入りました。

よく使っていたのは[Hash関連](http://www.mbsplugins.eu/component_Hash.shtml)だったのですが、それ以外にも[ファイル操作関連](http://www.mbsplugins.eu/component_Files.shtml)も便利です。

Hash関連は、Amazonのデータ送受信のやり方を調べているときにAmazonで推奨しているHashとFileMakerが提供しているHashの方法が違ったので探していた時でした。
![1225_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/168780f0-b01c-62cf-3b5b-924cee04dea9.png)

phpで書けばそれで終わりなんですけど、なんとかFileMaker内で終結できないものかと。

あ、あとは、スクリプトの条件文なんかが色分けされるのが便利です。
こんな感じで。
![1225_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/c5c6991e-9670-f313-dea2-c4fa64c7f463.png)

プラグイン開発にはCかC++の知識が必要ですが、CやC++での開発はやっていたのでそんなに違和感なく開発できそうですね。
ただ、これだけ便利なプラグインがあると、新たに作るのって今更感があって否めないのですが、「あぁ、これがほしい」というのをちょこちょこ作っていければと思っています。
（あぁ、でもなんでFileMakerのプラグインや関連ソフトウェアってバカ高いんでしょうかね〜。phpやJava界隈のライセンスフリーの環境に慣れていたから、ものすごく製造間接費がかかるような気がします）

Merry Christmas 2014!
金融機関のCOBOLに対抗して、産業（工業系）の制御を書いてみるｗ

金融系メインフレームはなぜCOBOLをつかうのか
http://togetter.com/li/761401

これに感化されましたｗ 金融系ではCOBOLを使うことが不思議がられています。どーしてそんな古い言語を使うのか？ 今どきの言語を使わないのか？ 使う理由は？
同じ事が、産業系でもあります。レイヤー分けて書いてみますｗ

#１）末端ローカル機器
   制御系の末端です。センサーを電送したり制御をそこで完結したりする機器。タイマーとかリレーとか末端機器といってもいいです。それ以外には、温度調節器（TIC:Temperature Indicate Controller)とか圧力調節器(PIC:Pressure Indicate Controller)とか、液面制御器(LIC:level Indicate Controller)とかですね。

#２）中間にある制御機器
   盤内に入ってる機器です。タイマーとかリレーとかPLC(Programmable Logic Controller)とか、いろいろ

#３）中央監視機器
   中間の制御機器や物によっては末端ローカル機器からの情報をここに纏めて表示します。たまに、制御機器に司令を出してるものもあり。

##開発言語

［末端ローカル機器の開発言語］
   ほとんど、コイツらは組み込み開発をされているのでCで書かれている事が多いです。あまり考える必要はないかも。物によっては中身がFPGAとかもあるので、其の場合はVHDLとかImpulseCとか。（それ以外にもあると思いますが私が見たものや書いたものだけを紹介しています。HDLですね）

［中間にある制御機器］
リレーとかタイマーは電気的な物なので言語無いですｗ そして中核に位置するのがPLCとなります。これらは、[ラダー言語](http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%80%E3%83%BC%E3%83%BB%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF)で書かれている事がほとんどです。実際には、PLC自体は[IEC61131-3](http://ja.wikipedia.org/wiki/IEC_61131-3)の言語があり其の種類だけ使えるのですが、理由がありほとんどがLDで書かれています。これが本題ですね。中には専用のHDLで書くものもありました。かなり特殊な部類です。LDは割と一般的な言語です。

［中央監視機器］
中央監視機器はディスプレイに表示させるためのI/Fでありディスプレイからタッチパネルやキーボードで運転停止司令や、各種制御機器へパラメータを出力したり読みだしたりします。ネットワークを昔は[ARCNET](http://ja.wikipedia.org/w/index.php?title=%E3%82%A2%E3%83%BC%E3%82%AF%E3%83%8D%E3%83%83%E3%83%88&redirect=no)や[HP-IB](http://ja.wikipedia.org/wiki/IEEE_488)で実装するか、メーカ独自のプロトコルで実装するものが多かったですが、いまは、Etherを使ったTCP-IPで接続し、喋ってるプロトコルも[BACnet](http://ja.wikipedia.org/wiki/BACnet)等や普通のシリアルに変わってきました。ハードもWindows機や専用に開発されたOSだったりしましたが、いまはLinuxやUNIXが使われることも多いです。ソフトウェアも昔はVisualBasic,HP-UX-Basic,等が多かったですが、いまは普通にCやC++で書かれているソフトウェアが沢山あります。

##本題
どーして古いまま新しくしないのか？

実は、出来ないんですｗ この中にあるLD言語ですが記述はラダーという手法で梯子のように書いていきます。アナログを扱う場合は、実はアセンブリ記述に近く、例えばアナログを入力するときには、`MOV k4X0 D00`
とか書いてると、K4X0から読みだしたデータをD00に格納しなさい。という事になります。これを実はCで書いたりする事や、もっと簡単なファンクションブロックというもので記述する事は可能なのですが、工業系に限って言えば「納入した客先が万が一の時にプログラムを読める」という事が必要になります。

すると、客先はプログラムのプロではないので読める言語で記述する必要が出てきます。また、１年中稼働し定期検査でプラント全体を停止するのは年に１度、全種類の機器を点検するのに約１ヶ月とかいうレベルでしか時間を取れないので、新しいものを納入して動作確認を実機で総合的にやるには時間が足りない。
シミュレータを作成して実機の前にもっと先進的な機器と言語を使ってやるには、コストが掛かり過ぎ、現状のものと利益が変わるか？となると変わらない。
そーなると更新されないっていう結論に導かれます。

最初から機器の更新を見据えた設計構成ですと可能なんですが、その更新を見据えた設計はとてもお金と設計時間がかかる。きっと銀行も同じでシステムを更新して新しい風をいれて設計し直しても、それは銀行の利益に直結することが出来ない・・・

きっと同じような事が起こっているんだと思います。COBOLから今どきの言語仕様に変える。変えた所で利益に差が出るのか？ってなると、その計算は可能ではあると思いますが、利益が変わるほどのパフォーマンスの差が出ない事には設備投資は無理です。

もちろん、其の内にメンテナンス出来る技術者の枯渇などで安定運用が難しくなりだすと少しづつ更新されそうではありますが、何時の時代も枯渇しそうになっても枯れた技術を会得していく技術者がいる。その技術者が居る限り、古い技術が死ぬことはなさそうです。

昔の技術を使い続ける理由は、とても無駄で進歩が無い様に思いますが会社が営利企業であり続ける限り、昔の技術を捨て新しい技術を導入するには導入した際に、昔の技術と今の技術で置き換えるコストが新しい技術で回収出来るか？がとても重要になる事が大きな理由だと思っています。

今、COBOLの資産を使いやすくするためにメインフレームの置き換え時にインタープリターのように使えるサーバやVMのような構成があると聞きますが、その時代を経てから最終的には置き換わるでしょう。ただ、だいぶ先まで掛かりそうな気がします。

とても、良く似ているお話だなーって思い書いてみました。
XcodeでBoost C++ Libraries #include <boost/asio.hpp> のコンパイルを通したい！

#Homebrewを使ったboostのインストール

```terminal
brew install boost
```

#XCODE 設定

##PROJECT

###Header Search Paths
```
/usr/local/Cellar/boost/1.56.0/include
```

###Library Search Paths
```
/usr/local/Cellar/boost/1.56.0/lib
```

※バージョンによって1.56.0の部分は変わります。

##TARGETS
###Other Linker Flags:
```
-lboost_system
```

##C++ サンプル
```C++:main.cpp
#include <iostream>
#include <boost/asio.hpp>

namespace asio = boost::asio;
using asio::ip::tcp;

int main(int argc, const char * argv[]) {
    
    asio::io_service io_service;
    tcp::socket socket(io_service);
    
    // 接続
    socket.connect(tcp::endpoint(asio::ip::address::from_string("127.0.0.1"), 54321));
    
    // メッセージ送信
    const std::string msg = "ping";
    boost::system::error_code error;
    asio::write(socket, asio::buffer(msg), error);
    
    if (error) {
        std::cout << "send failed: " << error.message() << std::endl;
    }
    else {
        std::cout << "send correct!" << std::endl;
    }
    
    return 0;
}
```

>[boostjp - ネットワーク - TCP メッセージ送信](https://sites.google.com/site/boostjp/tips/network/tcp#TOC--2)
WindowsのRubyからjava（コマンド）を呼ぶ場合

環境依存かもしれませんが、Windows 上の Ruby から java コマンドを直接呼ぼうとしても見えないようなので、cmd 経由で呼びます。

```rb
irb(main):001:0> `java`
Errno::ENOENT: No such file or directory - java
        from (irb):1:in ``'
        from (irb):1

irb(main):003:0> `cmd /c java -version`
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
=> ""
```

ただしこの方法では java がインストールされていなくても例外が発生しないため、$? で exit コードが 0 かどうかを確認する必要があります。

```rb
$?.success?   #=> true or false
```
to_key と to_param で URL や HTML 中のリソースの id を別の文字列にしてしまう


ActiveModel のメソッドを使って、

- URL に含まれるモデルの id を別の文字列にしたい
- 作成済みのリソースの数がばれないように、HTML 中に生の id を表示したくない

みたいなときに何とかする方法の紹介。

今回は id の代わりに、id を Base64 エンコードしたものを URL や HTML 中に含めるようにしてみます。

# 準備

まずは適当なリソースを scaffold で作成。

```
bin/rails g scaffold posts title:string body:text
```

リソースを create した後で /posts/1/edit に移動し、HTML のソースを見るとこんな感じ。

![](http://i.gyazo.com/844ca8b0430177abe4c9b238f6be94cc.png)


# to_key

ここで Post の `to_key` を上書きする。

`to_key` はリソースを一意に特定するキーを含んだ Array を返す。そいつが `dom_id` によって利用される。dom_id ってのによって、fomr_for などで埋め込まれる id が変えられている、らしい。。。

今回は `to_key` で Base64 エンコードした id を含む配列を返す。ちなみに ActiveRecord のデフォルトでは、`to_key` はリソースの id を含む Array を返す。

```app/models/post.rb
class Post < ActiveRecord::Base
  def to_key
    [Base64.encode64(id.to_s)]
  end
end
```

こうすると to_key の返り値が以下のように変わる。

```ruby
# これが
Post.first.to_key
=> [1]

# こうなる
Post.first.to_key
=> ["MQ==\n"]
```

form の id に埋め込まれる Post の id も変わった！

![](http://i.gyazo.com/91ad3cc2875c49326f9cfe81451f34f5.png)

# to_param

しかしパスに含まれる id はまだ生の id のまま。こちらは `to_param` で変更することが可能。

`to_param` はリソースのユニークな URL を発行するために使われる。`post_path(@post)` とやると `@post` に対して `to_param` が呼び出されて、その結果が URL に含まれる。ちなみに ActiveRecord の場合、デフォルトでは id が返ってくる。

ということで以下のように変更。

```ruby
class Post < ActiveRecord::Base
  def to_key
    [Base64.encode64(id.to_s)]
  end
  
  def to_param
    Base64.encode64(id.to_s)
  end
end
```

するとこんな感じになる。

```ruby
# これが
app.edit_post_path(Post.first)
=> "/posts/1/edit"

# こうなる
app.edit_post_path(Post.first)
=> "/posts/MQ==%0A/edit"
```

URL と HTML のソースに含まれるパスに含まれる id もエンコードされた！

![](http://i.gyazo.com/f9b9392f31c60261aff5458fdefc44b0.png)


# controller の更新

ただ、このままだと `Update Post` ボタンをおした時にうまく動かない。

![](http://i.gyazo.com/610200da152756a24a6a2f4d8e2630ba.png)

エラー画面を見れば分かる通り、`Post.find(params[:id]) ` しても `params[:id]` が 1 でなく `MQ==` なので当たり前。

find に渡す id を先に decode してやるとうまく動く。

```app/controllers/posts_controller.rb
def set_post
  @post = Post.find(Base64.decode64(params[:id]))
end
```

`Post.find(params[:id]) ` を `Post.find(Base64.decode64(params[:id])) ` としてやることで動くようになる。

# params[:id] の :id も変える

ただ、`params[:id]` に入ってくるのが id をエンコードしたもの、というのが気持ち悪い。`params[:encoded_id]` のように params のキーを変えたい。そのため、`config/routes.rb` で resources の params オプションを使う。


```config/routes.rb
Rails.application.routes.draw do
  resources :posts, param :encoded_id
end
```

controller 側も忘れずに書き換え。

```app/controllers/posts_controller.rb
def set_post
  @post = Post.find(Base64.decode64(params[:encoded_id]))
end
```

はい、`params[:encoded_id]` に値が入るようになりました。（ちなみに初めての web console）

![](http://i.gyazo.com/785f345f84d3608a337d9dbafddc0dd4.png)


# 補足

実際には Base64 エンコードしただけだとあんまり意味ないかもしれませんが、暗号化するなり、ユーザやタグなどの id の代わりに名前を使って見るなりやると良いんじゃないでしょうか。

なお、to_key も to_param も ActiveModel のメソッドなので、ActiveRecord でなくても使えます。

dom_id なんかは、自分でリソースの id を HTML に埋め込むときにも使えそうですね。
Unity2Dのスプライトの描画順をLINQで正規化する

#必要性

今カードゲームっぽいものを作っているのですが、Unity2DのSpriteは描画順をレイヤー(Sorting Layer)で管理しつつ、同じレイヤー内では**Order in Layer**の小さい順に描画するのは御存知の通り。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37184/d1853b57-5f22-2080-b448-85fa7f9a86e8.png)

で、カードゲームや、Windowsのウインドウのように、**選択したものを一番上**に持ってくる操作（レイズ操作）をするにはどうするか。

それは簡単で、**Order in Layer**の値に１万とか２万とか足しちゃえばとりあえず、一番上に来るはず（よっぽど多かったり、変な数値入れてない限り）

ちなみにInspectorだとOrder in Layerですが、スクリプト上ではRendererのメンバの**sortingOrder**です。

コードにするとこんな感じ（もちろん、SpriteRendererは最初に取っておいた方がいいけれど）


```csharp
	public void Raise(int num) {
		var spr = GetComponent<SpriteRenderer>();
		spr.sortingOrder += num;
	}
```

#これでいいのか
でもこの方法にはもちろん問題があって、元もとsortingOrderが10のオブジェクトをRaise(1000); で1010にしたらとりあえず一番上に来たとして、別のsortingOrderが5とかのオブジェクトを同じくRaise(1000);しても、1005なので一番上には来ない！**どうしよう！**

#やっと本題
というわけで、**sortingOrderの正規化**が必要なのです。
と、正規化などと難しく言いましたが、順番はそのままに数字を振り直すだけです。
**BASICでいうとRENUM命令**って事です（どれくらいの人がピンとくるのか）

#LINQを無理に使うよ！
1. 指定したsortingLayerIDを持つSpriteRendererを
2. sortingOrderの値でソートしてから
3. 番号を振り直す

は普通に書くとそこそこ長いです！
それがLINQなら

1. 指定したsortingLayerIDを持つSpriteRendererを → **Where**
2. sortingOrderの値でソートしてから → **OrderBy**
3. 番号を振り直す 

となるので、

```csharp
	public void SortOrderNomalize(int targetLayer)
	{
		int cnt = 0;
		foreach (var card in FindObjectsOfType<SpriteRenderer>().Where(sr => sr.sortingLayerID == targetLayer).OrderBy(c => c.sortingOrder))
		{
			card.sortingOrder = cnt++;
		}
	}
```

で！　短い！すごいね！

一応コレだけで指定したレイヤーのsortingOrderを0から振り直してくれます。

ちなみに、ただ行数を減らすという方針ならforeachをArray.ForEach使うって手もありますが、Array.ForEachは配列限定なのでToArray()を走らせる必要があるのでメモリ的に不利っぽい気がします。

一応書くと

```csharp
	public void SortOrderNomalize2(int targetLayer)
	{
		int cnt = 0;
		Array.ForEach(FindObjectsOfType<SpriteRenderer>().Where(sr => sr.sortingLayerID == targetLayer).OrderBy(c => c.sortingOrder).ToArray(),spr=>spr.sortingOrder = cnt++);
	}
```

です。　まぁ、短ければ良いってもんじゃないよね。

#閑話休題

これを、先ほどのRaiseメソッドと併せて

```csharp
	public void Raise(int num) {
		var spr = GetComponent<SpriteRenderer>();
		spr.sortingOrder += num;
		SortOrderNormalize(spr.sortingLayerID);//sortingOrder振り直し
	}
```

とやってあげればいいんではないでしょうかー。

#もちろん
FindObjectsOfTypeとか決して軽い処理では無いので途中で増減しない限りはStartとかで確保しておくことをおすすめします。

#これだけやっておいて
実はsortingOrderの振り直しがすでにUnityによって用意されてたりします？　さらっと探した感じは無かったんですが。

もしあるなら教えてください。　恥ずかしいので記事消しますから。
Transcend JetDrive Liteでメモリ増設！

こんばんは。

クリスマスイブは普通に仕事でさっき帰ってきたところです、がーでんです。（泣）


今日はガジェット系の話題です。というのも、

**最近、仕事で使ってるmacの容量が無くなり過ぎて以下の支障が出てきました。**
##macの容量が足りな過ぎてパンパン問題
こんな事態が発生してきました。。。
>PowerPointの画像が**「×」マークが出てきて使えなくなる**

>ネットが**よく落ちる**（メールしてる時に落ちるともう最悪）

>本当に手元に置いておきたいデータが**DL出来なくなって「あああああああ」**ってなる

動作も遅くなるわで、全くいいこと無いですよね。
##良いものを見つけました

そこで、ネットで見かけたのでこれを導入してみました。
**Transcend JetDrive Liteシリーズ**
http://jp.transcend-info.com/apple/jetdrivelite/
![61k75ZBvxdL._SL1500_.jpg](https://qiita-image-store.s3.amazonaws.com/0/58851/f443d92f-d268-37da-9e2a-43a66578deb5.jpeg)


こいつはSSDの内蔵ではなくLite版なのですが、*外付けHDDよりもお手軽にmacの容量をアップグレード出来る優れものです！*


ほぼ衝動買いに近かったのですが、

**■SDスロットからはみ出ずに収まるので持ち運びがラク**
※逆に一度差してしまうと抜くのはすごく苦労します…。
**■起動時間のロスがほとんどなく立ち上げてすぐ使える**
**■「最大読込速度：95MB/秒、最大書込速度：60MB/秒の転送速度」なので結構データのやり取りも早い**

という点でメリットを感じているので買って良かったと思います！


クリスマスにジャ○ネットみたいなテンションでお送りしてしまいました。


macの容量ってすぐパンパンになっちゃうのでお困りの方はぜひ試してみてはどうでしょうか？


それでは皆さん、メリークリスマス！
Objective-CからSwiftへのなだらかな移行

Objective-CからSwiftへ移行することのメリットは他の記事等に譲るとして、
ここではObjective-Cで書かれた既存アプリをどうSwiftに移行するのが良いのか、ということを書く。
（別にそんなに大げさな内容ではないけど）

## 経緯
新しいクラスを実装するときは普通にSwiftなクラスを作って書けば良いし、Objective-Cで書かれた既存クラスへの機能追加をする際もSwiftでサブクラス化、またはextensionに機能を実装すればいいけど、そんなこんなでSwiftで書いていると、既存コードもすべてSwiftにしたい衝動に駆られる。  
リファクタリング対象が活発に機能追加や変更されるものであれば尚の事。
冗長な型宣言をしなくて良くなるし、大抵Swiftのほうがコードが見やすくなる等、明確なメリットがある。

小さなクラスであればリファクタリングは楽だが、クラスが巨大な場合

- エンバグのリスク
- 大きな工数がかかる
- 心理的なハードルの高さ

等の要因から手がつけづらい。

## それでもSwiftにリファクタリングしたい
張り切って一気にリファクタリングしようとすると

- エンバグしたとき該当箇所の特定が難しい
- ディレクター的なポジションの人への工数かける交渉が難易度上がる
- 心理的なハードルがすごい高い

ので、機能追加や修正するときに調整する箇所の周辺から徐々にSwift化していく、というが現実的。
で、そのためにどうするかというと
 
- まず対象のObjective-Cクラスを置き換えるSwiftクラスを作り、必要に応じて利用している箇所の対象クラス名を変更（大抵接頭辞を除去するだけ）
- プロパティや移植しやすいメソッドをSwiftの方に移植
- （複雑だったりコードが多かったりして）移植作業を次以降のバージョンに回したいものは、Swiftクラスに対してObjective-Cのカテゴリで既存の実装を付け足す
- 次に作業するときにそのカテゴリからSwiftクラスに移植していく

という方法で、なだらかな移行ができる。

> Remember that you cannot subclass a Swift class in Objective-C. Therefore, the class you migrate cannot have any Objective-C subclasses in your app.
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/Migration.html

の通り、Objective-CでSwiftで実装されたクラスのサブクラスを作ることはできないためカテゴリで実装を付け足している。

## おわりに
対象の実装に今後修正が入らない場合、Swift化するメリットはないのでそっとしておくのが良いと思っている。
その場合のリファクタリングは自己満足の世界なので、個人開発者でないと厳しそう。
英字新聞の見出しの規則にならった簡単なgitコミットログやプレゼン用スライドの見出しの書き方

## 追記
gitのコミットログにはガイドラインがあるというご指摘をいただきましたので、基本的にはそちらに従った方が良いと思われます。
http://minus9d.hatenablog.com/entry/2014/02/11/125222

# 本文ここから
あんまり業務では使えないかもしれないけど、めっちゃ簡単な変更したときとかのgitコミットログのメッセージに使ったりしている。
あと、海外でのプレゼン資料を作っているときにも各スライドの見出しはこの規則をできるだけ使った。
筆者は英語苦手なのであくまで参考程度に。

# 冠詞は使わず、名詞は単数形で複数扱い
この規則はインターネットで調べても出てこないので、間違いかも。
でもどこかで読んだ気がする。
ここで言いたいのは、名詞が複数扱いなのでいちいち動詞に3人称単数のsを付けないということ。

# 動詞の現在形は過去を表す
上2つのルールを使うと

- An error appeared.

が

- Error appear.

になるのかなあと思う。

# 受動態や進行系はbe動詞を使わない
- A view is added.

が

- View added.

になる。

# 未来はto+動詞で表す
- A bug will be fixed.

が

- Bug to be fixed.

になるのか？

これくらい使えたら十分か。
あとは思いついたら追加する。
RICOH THETAへの接続とインターネット接続を両立する


Macで[RICOH THETAに接続するプログラム](https://github.com/shrhdk/theta)を開発しています。

MacをTHETAに接続すると、内蔵のWi-FiがTHETAへの接続に専有されてしまい、
インターネットに接続できなくなるので非常に不便です。

THETAへの接続とインターネット接続の両立を試みたのでメモを残します。

## NICを追加する

単純に無線LAN子機を追加して対応します。

OS X製品は標準でWi-Fiを内蔵しているので、対応子機が少ないのですが、
PLANEX製品は何故かOS X対応です。

[GW-USNANO02A](http://www.planex.co.jp/products/gw-usnano2a/)が安くて小さいので最適です。

似たような製品としてGW-450Sがありますが、
これはIEEE802.11b/gに対応していないので使えません。

## LANの設定を確認する

THETAのIPアドレスは`192.168.1.1`ですが、
自宅のLANのデフォルトゲートウェイもまた`192.168.1.1`だったので、
自宅のLANのネットワーク設定を変更しました。

`192.168.1.1`はありがちな設定だと思うので、
重複していないか確認してみましょう。

## THETAに接続する

GW-USNANO02Aを手順に従ってセットアップすると、
Wireless Network Utilityというアプリが起動するので、
これを使ってTHETAに接続します。次の設定で接続できました。

ネットワーク認証: WPA2_PSK
データ暗号: AES
ネットワークキー: 設定したもの

## NICの優先順位を設定する

私の環境ではデフォルトでGW-USNANO02Aが内蔵Wi-Fiよりも優先されていたので、
相変わらずTHETAへの接続とインターネット接続が両立できない状況でした。

[OSXでWi-FiをEthernetよりも優先させる - ほねにくのうわずみ](http://uwazumi.honeniq.net/entry/2014/02/11/233550)を参考に、
`Wi-Fi`の優先順位を`GW-USNANO02A`より高くしたところ、
THETAへの接続とインターネット接続を両立出来ました。
PythonでさくっとWebスクレイピングする (JavaScript読み込みにも対応しつつ)

## はじめに
Webページから特定の要素を抽出してごにょごにょしたいときってよくありますよね。
（あるECサイトのある商品の在庫や価格を5分毎にウォッチしていたいとか、文書分類のために本文を正確に抽出したいだとか、などなど...）
そういう要素抽出をWebスクレイピングと呼んだりしますが、そんなときにもPythonは便利です。

ところでそういう目的ぴったりの、[クローラー／スクレイピング Advent Calendar 2014](http://qiita.com/advent-calendar/2014/crawler)というのがあって、以下の記事がよくまとまっています。（ちょっと前にその存在に気づいた）
http://orangain.hatenablog.com/entry/scraping-in-python

## まずはやってみよう
前述の記事の最後にある通りPythonでスクレイピングするときには```requests```と```lxml```でだいたい事足ります。

```py
pip install requests
pip install lxml
```
ではさっそくテレ朝ニュースの以下のページから本文部分を抽出してみます。
http://news.tv-asahi.co.jp/news_politics/articles/000041338.html

まずページの構成がどのようになっているかを確かめます。Chromeだと下のように標準でDeveloper Toolsというのがあって（FirefoxだとFirebugとか）、それを起動したら虫眼鏡アイコンをクリックして抽出したい部分にマウスカーソルを持って行くと簡単に目的要素あたりがどのようなページ構造になっているかわかります。

![Screen Shot 2014-12-24 at 23.00.00.png](https://qiita-image-store.s3.amazonaws.com/0/1540/aa7c50a1-324d-b630-1125-910bd5c87edb.png)

```<div class="maintext" id="news_body">```タグの下の```<p>```タグのさらにその下に目的の文章があることがわかります。
この場所はCSSセレクタを用いて```#news_body > p```と表現することができるので、最終的にこの部分のテキストを抽出するスクレイピングコードは次のように書けます。

> cf. CSSセレクタのまとめ
> http://weboook.blog22.fc2.com/blog-entry-268.html


```py
import lxml.html
import requests

target_url = 'http://news.tv-asahi.co.jp/news_politics/articles/000041338.html'
target_html = requests.get(target_url).text
root = lxml.html.fromstring(target_html)
#text_content()メソッドはそのタグ以下にあるすべてのテキストを取得する
root.cssselect('#news_body > p').text_content()
```

もし```ImportError: cssselect seems not to be installed.```
とか怒られたら```pip install cssselect```でおうけいです。
この通りすごく簡単なことがわかると思います。

## JavaScriptを読み込む
次にちょっとやっかいなのがJavaScriptでレンダリングされている部分です。
先ほどのようにDeveloper Toolsで見てみると、同じようにとれるんじゃないかと思いますが実はこれJavaScriptを読み込んでレンダリングされた結果なんですね。

![Screen Shot 2014-12-25 at 0.10.25.png](https://qiita-image-store.s3.amazonaws.com/0/1540/07826bfa-a431-ff3f-d8dd-32fe325321bc.png)


JavaScriptを読み込む以前のhtmlは単純にこうなっています。

```html
<!-- 関連ニュース -->
<div id="relatedNews"></div>
```

なのでrequestsで取得したhtmlをそのまま解析しようとしてもうまくいきません。
そこでseleniumとPhantomJSの出番です。

```pip install selenium```してPhantomJSを[このあたり](http://tips.hecomi.com/entry/20121229/1356785834)を参考にインストールしておきます。
そうしたらJavaScriptを読み込むバージョンはこんな感じです。
selenium&PhantomJSを通してhtmlを取得したら後の流れは同じです。

```py
import lxml.html
from selenium import webdriver

target_url = 'http://news.tv-asahi.co.jp/news_politics/articles/000041338.html'
driver = webdriver.PhantomJS()
driver.get(target_url)
root = lxml.html.fromstring(driver.page_source)
links = root.cssselect('#relatedNews a')
for link in links:
    print link.text
```


実行結果

```tex
第3次安倍内閣まもなく発足　防衛大臣のみ交代
安倍晋三氏を第97代総理大臣に指名　衆議院本会議
きょう特別国会召集　夜には第3次安倍内閣が発足
第3次安倍内閣発足へ　江渡防衛大臣が再任を辞退
「実り多き1年」安倍総理、今年を振り返りひと言
```

## まとめ
以上のように通常のhtmlページだけでなく、JavaScriptによるレンダリングが入っているページでもさくっと簡単にスクレイピングすることができました。
実際にいろんなサイトをスクレイピングしてみると文字コードの問題で頭を悩ませたりすることもよくありますが、Webスクレイピングができるといろんな作業を自動化したりすることができたりするので、さまざまな場面で個人的には役立っています。
それではみなさまも良いクリマスとWebスクレイピングライフを。
Qiita要望 | 記事の Markdown を読み取り専用で表示する raw ボタン の追加 #qiita

# Qiita要望 | 記事の Markdown を読み取り専用で表示する raw ボタン の追加 #qiita
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
記事の Markdown を読み取り専用で表示する raw ボタン の追加を希望します
GitHub のアレです。

![raw_button.png](https://qiita-image-store.s3.amazonaws.com/0/43480/216255f5-6975-a35e-adc3-eedcb20088d1.png)

## <i class="fa fa-exclamation-triangle" style="font-size:1em;"></i> 本文の前に
### <i class="fa fa-question-circle" style="font-size:1em;"></i> なぜ要望を記事化するか？
* 前提
    * 記事化した要望はお問い合わせ欄にリンク情報を記述して運営担当者に連絡します
* 要望をより伝わりやすくするため
    * お問い合わせ欄にプレーンテキストを送るだけよりも伝わりやすいはず
    * 運営担当者の時間の節約
    * 内容が伝わらなかったため却下、という事態を防ぐ
* 重複要望対策
    * 要望投稿者の時間を節約
    * 要望の確認をする運営担当者の時間を節約
* 優先付
    * ストック数で賛同者を知らせることができる
        * 運営担当者が優先付する際の参考になる
* 欲を言うなら
    * Markdown で登録可能な要望投稿フォーマット（投稿後は誰でも閲覧可能）があれば、
      今回の方法で作成する必要はないですね。

## <i class="fa fa-flag-checkered" style="font-size:1em;"></i> 目的
* 他人の書いた Markdown の内容を参考にしたい
* URL の末尾に `.md` をつけることで raw データを表示できるが、ユーザーフレンドリーな操作ではない

## <i class="fa fa-image" style="font-size:1em;"></i> 追加後のイメージ
「編集履歴・編集リクエストを作成する」のリンクの隣に raw 機能に当たるボタンを追加。
※文言が日本語ベースなので、既存の文言にあわせるなら raw ではなく、Markdown の表示 などでしょうか？

![raw_button_place.png](https://qiita-image-store.s3.amazonaws.com/0/43480/1cd452a6-bf20-103e-fa03-2bb9a0321604.png)
Qiita要望 | Qiita 内部リンク with ストック数 #qiita

# Qiita要望 | Qiita 内部リンク with ストック数 #qiita
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Qiita の内部リンクに ストック数 を併記したい

## <i class="fa fa-exclamation-triangle" style="font-size:1em;"></i> 本文の前に
### <i class="fa fa-question-circle" style="font-size:1em;"></i> なぜ要望を記事化するか？
* 前提
    * 記事化した要望はお問い合わせ欄にリンク情報を記述して運営担当者に連絡します
* 要望をより伝わりやすくするため
    * お問い合わせ欄にプレーンテキストを送るだけよりも伝わりやすいはず
    * 運営担当者の時間の節約
    * 内容が伝わらなかったため却下、という事態を防ぐ
* 重複要望対策
    * 要望投稿者の時間を節約
    * 要望の確認をする運営担当者の時間を節約
* 優先付
    * ストック数で賛同者を知らせることができる
        * 運営担当者が優先付する際の参考になる
* 欲を言うなら
    * Markdown で登録可能な要望投稿フォーマット（投稿後は誰でも閲覧可能）があれば、
      今回の方法で作成する必要はないですね。

## <i class="fa fa-flag-checkered" style="font-size:1em;"></i> 目的
* はてなのブクマユーザー数付のリンクのようなものが欲しくなった
    * 閲覧者が内部リンク先を確認するかどうかの判断材料になる

## <i class="fa fa-image" style="font-size:1em;"></i> 記法イメージ( stocks 版 )
あくまでイメージ。もし実装していただけるのなら記法は問いません

~~~mark
[%stocks%GitHub Flow 図解](http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314)
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> 表示案( stocks 版 )
[GitHub Flow 図解 | tbpgr](http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314) 88 stocks

## <i class="fa fa-image" style="font-size:1em;"></i> 記法イメージ( views 版 )
あくまでイメージ。もし実装していただけるのなら記法は問いません

~~~mark
[%views%GitHub Flow 図解](http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314)
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> 表示案2( views 版 )
[GitHub Flow 図解 | tbpgr](http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314)  4343 views
Android studio 1.0.1をinstallしようとしたらLicense agreement画面でfinish押せない


#症状
macでのandroid studioのインストール後のセットアップGUIでガイドに沿っていくと、license agreementの画面でnextもfinishも押せなくなる。

brewfileとか使ったり、infoファイルをjava1.8に書き換えたせいかとも思って、アンインストールとかもやってみたけど、どうやら、バグらしい。
https://code.google.com/p/android/issues/detail?id=82282

#解決法

どうやら、いくつかのライセンス形態が違うことによるバグらしく、それぞれでacceptするといけるらしい。今はセットアップができてしまったので、うろ覚えになるけど、

1. intel haxmを単体でacceptする
2. 上のandroid sdkを適当に一つ選んで単体でacceptする

みたいな感じで、適当にacceptしたりdeclineしたりしていったら、どっかのタイミングでfinishボタンが現れたのですかさずクリックした。

結構クリティカルな割に情報なくてハマったので、あやふやなままでも残しておく。
vpscatterdd

scatter も実装されました。

レジスタに入っている16個のインデクスと、配列先頭アドレスを加算して、出てきた16個のアドレスに、入力値をストアします。

```c
#include <immintrin.h>
#include <stdio.h>

#define N 4096

unsigned int out[N];
unsigned int index0[16];
int in0[16] = {100,101,102,103,
               104,105,106,107,
               108,109,110,111,
               112,113,114,115};

int
main(void)
{
    for (int i=0; i<16; i++) {
        index0[i] = rand()%N;
    }

    __m512i in = _mm512_loadu_si512(in0);
    __m512i index = _mm512_loadu_si512(index0);

    _mm512_i32scatter_epi32(out, index, in, 4);

    for (int i=0; i<16; i++) {
        printf("index[%2d] = %4d, val[%2d] = %4d\n", i, index0[i], i, in0[i]);
    }

    for (int i=0; i<N; i++) {
        if (out[i] != 0) {
            printf("out[%d] = %d\n", i, out[i]);
        }
    }
}

```

```
index[ 0] = 1383, val[ 0] =  100
index[ 1] =  966, val[ 1] =  101
index[ 2] = 2153, val[ 2] =  102
index[ 3] = 2163, val[ 3] =  103
index[ 4] = 3153, val[ 4] =  104
index[ 5] = 3327, val[ 5] =  105
index[ 6] = 1098, val[ 6] =  106
index[ 7] = 2284, val[ 7] =  107
index[ 8] = 3881, val[ 8] =  108
index[ 9] = 3277, val[ 9] =  109
index[10] = 2234, val[10] =  110
index[11] = 1963, val[11] =  111
index[12] =  498, val[12] =  112
index[13] = 3835, val[13] =  113
index[14] = 2531, val[14] =  114
index[15] =  326, val[15] =  115
out[326] = 115
out[498] = 112
out[966] = 101
out[1098] = 106
out[1383] = 100
out[1963] = 111
out[2153] = 102
out[2163] = 103
out[2234] = 110
out[2284] = 107
out[2531] = 114
out[3153] = 104
out[3277] = 109
out[3327] = 105
out[3835] = 113
out[3881] = 108
```

以上です。
fishの配列と環境変数PATH


[fish](http://fishshell.com/)のおもしろいなと思ったところのひとつは環境変数PATHが配列になっているところです

今は関係はないけどzshも$pathでアクセスする配列である。

環境変数PATHの中身は以下のものとします。

```fish
$ printenv PATH
PATH=/usr/local/bin:/usr/bin/:/bin
```

$PATHをechoしてみよう。

```fish
$ echo $PATH
/usr/local/bin /usr/bin/ /bin
```

コロンがなくなっていますね。
配列になっているので添字でアクセスできます。
番号は1からです。

```fish
$ echo $PATH[1]
/usr/local/bin
$ echo $PATH[2]
/usr/bin
$ echo $PATH[3]
/bin
$ echo $PATH[-1]
/bin
```

負の数も使えます。
ところでぱPATH以外の配列を環境変数にすると、どうなるのでしょうか。
環境変数にするにはsetの`-x `オプションを使うみたいです。`--export`でも可能です。

```fish
$ set -x hoge aaa bbb ccc
$ echo $hoge
aaa bbb ccc
$ printenv hoge
aaa:bbb:ccc
```

コロン区切りになることがわかりました。

折角配列なのでループを回しておきましょう。

```fish
$ for i in $hoge
    echo $i
  end
aaa
bbb
ccc
```

# まとめ

fishでは環境変数PATHは配列になっています。
配列を環境変数にするとプロセスからはコロン区切りで結合されている状態になるようです。

# 参考文献

* http://fishshell.com/docs/current/index.html#variables
Scala導入方法とHelloWorld


# 導入手順
- 環境：macOSX
- 前提：Java環境導入済み

## Scalaインストール
### ダウンロード
- まず、下記公式HPからアーカイブ版を取得し、展開。
- http://www.scala-lang.org/download/

### パス通す
上でダウンロードしたものを展開し、管理しやすくするためフォルダを移動。

```
$ mv ~/Downloads/scala-2.11.4 /usr/local/share/
```

`~/.bash_profile`にパス記述。

```
$ vim ~/.bash_profile

export SCALA_HOME=/usr/local/share/scala-2.11.4
export PATH=$PATH:$SCALA_HOME/bin
```

`source ~/.bash_profile`をたたいて変更を反映。
`scala -version`をたたいてバージョン情報が出てきたらOK！

# HelloWorld
HelloWorld.scalaという名のファイルを作成し、下記5行を記述。

```
object HelloWorld {
  def main(args: Array[String]) {
    println("Hello Scala World!")
  }
}
```


HelloWorld.scalaのコンパイルコマンドは、

```
scalac HelloWorld.scala
```

実行コマンドは、

```
scala -cp . HelloWorld
```
appディレクトリのデフォルト構成を考える

## はじめに―デフォルトの怖さについて

Railsは文字通り「レールに乗る」ときに最大の効率を発揮するフレームワークです。CoC(Convention over Configuration)は今やRailsのみならず各所で用いられる概念となっています。これはもちろん圧倒的な量のxml設定ファイルに比べれば進歩ですが、一方で気になることもあります。それは**デフォルト設定**の重みがさらに増しているということです。

多くの人はソフトウェアをあまりカスタマイズせずに使います。ほとんどのソフトウェアは設定項目を最低数個、多いものでは数百個持っていますが、デフォルトでも「ある程度」動くものがほとんどなため、カスタマイズの必要を感じない人が多いのかもしれません（個人的にはgitやtmuxなどは設定を工夫するとかなり便利になるのにやっていない人が多い印象）。

さて、RailsはそのCoCを強調する姿勢ゆえになおさらカスタマイズをする人が少ない、デフォルトの設定をそのまま使う人が多いフレームワークである、ということはできないでしょうか。そしてデフォルトの設定に不都合な点がある場合に、それが見過ごされる・軽視される可能性が高くなってしまうということもまた言えるのかもしれません。

今回はそんなRailsのデフォルト設定のうち、文字通りアプリケーションの中心となる`app`ディレクトリに焦点を当てたいと思います。

## 不満点

まず、特に何もせずに`rails new`したときの`app`ディレクトリの構成は以下のようになっています。

- assets
- controllers
- helpers
- mailers
- models
- views

あえてそれぞれ説明はしませんが、個人的にはmailerがデフォルトで作られるのがやや印象的です。

この構成で最も不満だと（個人的に）思われるのが、**オブジェクト指向的なデザインパターンで用いられるクラスの適切な置き場所がない**ことです。これは結果的に、`models`ディレクトリ内に置かれたクラス＝`ActiveRecord::Base`を継承したクラスにすべてが置かれるという状況を引き起こしやすくなるでしょう。例えば、[ここ](http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/)でも言及されているサービスクラスですが、本来はここに書くべき内容を「`services`ディレクトリがないがゆえに」モデルに書いてしまうということは、将来的にメンテナンス性の低下をもたらすでしょう。

また、**ビュー絡みの命名がやや不正確である**というのも問題です。上記のリンク先には「Railsの`views`ディレクトリ内にあるファイルは実際は`templates`である」というようなことが書かれています。確かに、`views`ディレクトリ内にあるのはすべてerbのファイルばかりでRubyのファイルはひとつもない場合がほとんどです。さらにそして、本当に`views`であるようなクラスを置きたい場合、どこに置けばいいのでしょうか？フォームオブジェクトは？

言うまでもないことですがこれらの不満は自分でディレクトリを作ってしまえば解消されます。しかし、それらのディレクトリがデフォルトで存在しないという事実が人々を適切なディレクトリ構成から遠ざけてしまいます。では、存在したほうが多くの人にとって救いとなるようなディレクトリは一体何でしょうか。

## デフォルトでほしいディレクトリその１―`services`

個人的にサービスクラスはお気に入りです。いくつか解釈はあると思いますが、自分の場合は**複数モデルにまたがるロジックや外部サービスと関連するようなロジックはサービスクラスに置く**というルールで実装しています。複数モデルにまたがるロジックをコールバックで実装しようとすると、テストが難しくなったり変更に弱くなったりしてろくなことがない、というのが私の感想です。

サービスクラスはたいていのアプリケーションで必要になる類のものである、ゆえにデフォルトのディレクトリとすべきである、と私は思っているのですが、普通に`models`ディレクトリに置けばいいと思っている人もいるでしょう。これは「モデル」という単語にどこまでロジックを含めるか、という問題に対する感覚の差の表れです。モデルをDBへの薄いラッパーであると考える人はサービスクラスを多用するでしょうし、データとロジックが一体となったものであると考える人は使わないか、使ってもモデルの一部として考えるでしょう。

## デフォルトでほしいディレクトリその２―`forms`

Railsの`accepts_nested_attributes_for`はとんでもない代物です。あれを使うとほぼ間違いなく頭痛のたねになります。しかし、あれをいやいや使っている人は多いでしょう。それというのも、Railsはフォームをオブジェクトではなく単なるパーシャルとして扱ってしまうからです。

しかし、複数モデルを同時に利用するようなフォームの場合は明らかにパーシャルでは力不足です。このような場合にフォームオブジェクトが使われます（gemも[reform](https://github.com/apotonick/reform)などがあります）。これは単純に説明すると、`form_for`の引数にモデルを直接与えるのではなくそれをラップしたフォームオブジェクトを与え、そこでバリデーションその他を行うことによりモデルから複雑性を取り除こうとするパターンです。これらを置くのに`forms`ディレクトリが必要となります。

## デフォルトでほしいディレクトリその３―`decorators`

Railsのヘルパーは扱いづらいです。ネームスペースがないので命名に気を遣ったり、再利用性が低かったり…

そこで、Rails界隈ではヘルパーの代替としてデコレーターパターンが用いられることがあります（そのためのgemでは[Draper](https://github.com/drapergem/draper)なんかが有名です）。これはモデルとビューコンテクストをどちらも参照することで、モデルのロジックをモデルから切り離しつつビューに適用しようとするパターンです（正確な説明かどうか自信ないです…）。これもディレクトリがないので（自製する場合は）作る、ということになりますね。

## 余談―橋渡しをすること

気がついた方も多いでしょうが、上に挙げられたものはどれも「複数の異なるもの同士を関連付ける」ために必要となるものです。オブジェクト指向は（もちろん）オブジェクトとメッセージ送信が中心なのですが、オブジェクトを点メッセージを線としたとき、線の引き方をオブジェクトで管理する必要があるのではないか、そうなるとそのオブジェクトが送信するメッセージの管理は…うわー、みたいなことを最近考えています。

## まとめ

デフォルトがより良くなればみんなハッピー。でもデフォルトが変わらないなら、気にせず正しいプログラミングをしよう！