OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoの管理画面でデータを一つだけしか登録できなくする方法


## 目的

全体で1つだけでいいデータ（例えば設定など）を保存したい

## 方法

### Model

```py:models.py
from django.db import models

class Setting(models.Model):
	pass
```

### Admin

```py:admin.py
from django.contrib import admin
from .models import Setting

class SettingAdmin(admin.ModelAdmin):
	def has_add_permission(self, request):
        # 設定を1つだけしか登録できないようにする
        count = Setting.objects.all().count()
        if count == 0:
            return True
        return False

    def has_delete_permission(self, request, obj=None):
        # 設定を削除できないようにする
        return False
        
admin.site.register(Setting,SettingAdmin)
```

has_add_permissionをoverrideすることで特定の数だけの登録やrequest.userからユーザーごとに追加できるできないを制御できると思います。
同様にhas_delete_permissionをoverrideして削除の制御が可能です。
sedの区切り文字

※こちらの記事は[個人ブログ](https://tech.tsukapah.com/sed-delimiter/)に移行しました

sedコマンドでファイルパスを置換したい時とか、
たいてい以下みたいな感じに書くと思う。

```bash
$ echo /path/to/file | sed -e 's/path\/to/path2/g'
/path2/file
```

`/`をエスケープしなければいけないのでそのままコピペできなかったり見づらかったりいろいろ面倒。

#実は...
sedの区切り文字は`/`じゃなくても動く。
例えば`#`で区切ってみる。

```bash
$ echo /path/to/file | sed -e 's#path/to#path2#g'
/path2/file
```
エスケープしなくていいので見やすい。

#ちなみに...
`s`の次の文字を区切り文字として使うのでこんな感じでも動く。

```bash
$ echo /path/to/file | sed -e 'sxpath/toxpath2xg'
/path2/file
```
`x`で区切ってみたけど、これはこれで見にくい。
メモ：HTML5でたった1個のボタンだけ、単なる画面遷移したい

すごい単純に下みたいなコード書いちゃった。
buttonタグのonclickイベントでlocation.href

```html
<form action="pageA.html">
<button 
    onclick="javascript:location.href = 'pageB.html';">
    ページBへ　
</button>
</form>
```

結果、pageBに遷移させたいのに、pageA.htmlに遷移。

このボタンだけちょっとpageBに遷移させたいだけなのに……。

……ということで、HTML5で、inputやbuttonなどにform属性で、特定FormのIDを指定できるやつをを利用。
本来はForm属性にFormクラスのIdを指定するが、それを何も指定しない。

```html
<form action="pageA.html" >
<button 
    form=""
    onclick="javascript:location.href = 'pageB.html';">
    ページBへ　
</button>
</form>
```

これでpageBへ遷移しました。
自分でもこれどうかなと思うので、異論は認めるます。（だからメモ）
【Rで大規模データを扱う】freadを使えば26倍早くcsvファイルを読み込める

#【方法】data.table パッケージの fread() を使う

Rの弱み：大規模データの処理

→　data.tableパッケージを活用することで大規模データも高速に処理可能

```code
> library(data.table)
> 
> #Rで大規模csvファイルを読み込む
> 
> #read.csvで読み込む場合
> system.time(df.read.csv <- read.csv(file("C:/R_test/data/test.csv")))
   ユーザ   システム       経過  
     50.34       0.18      50.56 
> 
> #data.tableパッケージのfreadで読み込む場合
> system.time(df.fread <- fread("C:/R_test/data/test.csv"))
   ユーザ   システム       経過  
      1.92       0.02       1.94 
```
##経過時間
| 1 | 2 |
|:-:|:-:|
| read.csv  | 50.56  |
| fread  | 1.94  |

**freadの方が26倍以上早い！**

↓参考サイト
http://mototeds.blogspot.jp/2016/03/rcsv.html
Vagrantでのインストールで上手くいかない時

スポット的なメモですが、何かお困りの際にお役に立てれば。

### 症状

- vagrant destroy して、VMのイメージ本体も消したのに、再インストール (vagrant init) に失敗してしまう
- "The box you're attempting to add doesn't support the provider
you requested. Please find an alternate box or use an alternate
provider. Double-check your requested provider to verify you didn't
simply misspell it." といったメッセージが出て、なぜか上手くいかない

### 確認すべき所

まっさらな状態で作り直したい場合は、以下を確認します。

- .vagrant/ と言うディレクトリが無いかどうか。あれば削除する。
- Vagrantfile が残っていないか、もしくは想定しているvagrantfileを配置しているのだけれど、上手くインストールまでたどり着かないかどうか。
 - Vagrantfileがあれば、削除もしくはリネームしておく。
- 対応するProviderが存在しているかどうか。
 - 引数を指定していない場合は、デフォルトでVirtualbox, もしくは環境変数 VAGRANT_DEFAULT_PROVIDER で指定したものが利用されるので、実際に存在するか確認。

上記を確認した上で、再度 vagrant init を実行してみてください。
Source Tree 2.3.1でGit Flowボタン


Source Tree最新版でツールバーにGit Flowボタンがなくなって不便だと思ってましたが、ツールバーのデフォルトが非表示になってただけだったんですね・・・

![スクリーンショット 2016-08-26 15.08.07.png](https://qiita-image-store.s3.amazonaws.com/0/36968/052615b4-2ee1-aafa-c3e9-b25fec27b740.png "スクリーンショット 2016-08-26 15.08.07.png")
ツールバー部を右クリックで「ツールバーをカスタマイズ」を選択

![スクリーンショット 2016-08-26 15.08.30.png](https://qiita-image-store.s3.amazonaws.com/0/36968/3c76d5c1-6dac-9497-ed00-99f038a1ccf1.png "スクリーンショット 2016-08-26 15.08.30.png")
D&Dで配置できました・・・^^;

元からこのカスタマイズあったみたいなんですが不便もなかったから全然気づかなかった。
PostgreSQLのTIMESTAMP WITH TIME ZONE型のデータをサーバーのtimezoneを変更して確認

# 確認したいこと
PostgreSQLのTIMESTAMP WITH TIME ZONE型の列に日付データを入れるとき、クライアントとサーバーのタイムゾーンが異なる(サーバーが外国にあるなど)ときの動作を確認する。

## 確認のためのテーブルを生成

``` create_table.sql
CREATE TABLE table1
(
    id          INTEGER
  , date_tz     TIMESTAMP WITH TIME ZONE
  , description TEXT
);
```
## クライアントのタイムゾーンがAsia/Tokyoで、サーバーのタイムゾーンもAsia/Tokyo
次のSQLでテーブルにデータを入れる。

``` insert_data1.sql
INSERT INTO table1 (id, date_tz, description) VALUES (
  1
, TO_DATE('2016-01-01','YYYY-MM-DD')
, 'timezone=Asia/Tokyo, 2016-01-01'
);
```

データを確認する。

```
SELECT id, date_tz, description FROM table1 ORDER BY id;
 id |        date_tz         |           description
----+------------------------+---------------------------------
  1 | 2016-01-01 00:00:00+09 | timezone=Asia/Tokyo, 2016-01-01
(1 行)
```

## クライアントのタイムゾーンがAsia/Tokyoで、サーバーのタイムゾーンがAsia/Taipei
postgresql.confのtimezoneをAsia/Taipeiに変更して、再起動する。

今入っているデータを確認する。

```
 id |        date_tz         |           description
----+------------------------+---------------------------------
  1 | 2015-12-31 23:00:00+08 | timezone=Asia/Tokyo, 2016-01-01
(1 行)
```

日本時間の2016年1月1日0時は、台北では2015年12月31日23時なので、これであっている。
クライアントが日本にあっても、SQLの結果はサーバーのタイムゾーンで返ってくるようだ。

次のSQLでテーブルにデータを入れる。

``` insert_data2.sql
INSERT INTO table1 (id, date_tz, description) VALUES (
  2
, TO_DATE('2016-01-01','YYYY-MM-DD')
, 'timezone=Asia/Taipei, 2016-01-01'
);
```

データを確認する。

```
SELECT id, date_tz, description FROM table1 ORDER BY id;
 id |        date_tz         |           description
----+------------------------+---------------------------------
  1 | 2015-12-31 23:00:00+08 | timezone=Asia/Tokyo, 2016-01-01
  2 | 2016-01-01 00:00:00+08 | timezone=Asia/Taipei, 2016-01-01
(2 行)
```

id=2のdate_tzは、2016-01-01 00:00:00+08となり、台北時間の2016年1月1日0時となる。
INSERT文を実行したクライアントが日本にあっても、SQLの結果はサーバーのタイムゾーンに従うようだ。

そもそも、TO_DATE関数の戻り値はDATE型で、これをTIMESTAMP WITH TIME ZONE型の列に入れようとしているのだから、DATE型からTIMESTAMP WITH TIME ZONE型にCASTされるということなので

```
SELECT TO_DATE('2016-01-01','YYYY-MM-DD')::TIMESTAMP WITH TIME ZONE;
        to_date
------------------------
 2016-01-01 00:00:00+08
(1 行)
```

この結果が書き込まれるということかな。

## クライアントのタイムゾーンがAsia/Tokyoで、サーバーのタイムゾーンもAsia/Tokyo
postgresql.confのtimezoneをAsia/Tokyoに戻して、再起動する。

今入っているデータを確認する。

```
SELECT id, date_tz, description FROM table1 ORDER BY id;
 id |        date_tz         |           description
----+------------------------+---------------------------------
  1 | 2016-01-01 00:00:00+09 | timezone=Asia/Tokyo, 2016-01-01
  2 | 2016-01-01 01:00:00+09 | timezone=Asia/Taipei, 2016-01-01
(2 行)
```

id=2のdate_tzは、台北時間の2016年1月1日0時だったので、日本時間では2016年1月1日時1時となる。

# 結論
TIMESTAMP WITH TIME ZONE型のデータは、クライアントがどこの国であろうが、サーバーのタイムゾーンに従う。
Cloudera Managerのログディレクトリ

Cloudera Manager (以下CM)はサーバ・エージェント型のシステムである。1つのCMサーバに対し、多数のCMエージェントが存在する。
これらのログは以下の場所に設置されている。

CMサーバ: /var/log/cloudera-scm-server/
CMエージェント: /var/log/cloudera-scm-agent/

もしCMがうまく動かない場合はこれらのログディレクトリの中を参照するといい。

CM の Web UI にログインできるなら、ブラウザ上からこれらのログを参照することができる。

# CMサーバのログ

**診断** → **サーバログ** をクリックすると、ログを閲覧することができる。

![CM58 CMサーバログ.png](https://qiita-image-store.s3.amazonaws.com/0/17749/857cf945-0e93-986c-dc90-7c339c68f411.png)


# CMエージェントのログ

**ホスト** → **すべてのホスト** を選択し、調査したいホストのホスト名をクリックする。

![CM58 ホスト画面.png](https://qiita-image-store.s3.amazonaws.com/0/17749/826bf747-95ba-2ae9-c470-f784a61424f0.png)

該当ホストのページを開いたら、 **クイックリンク** → **ホストエージェント** を選択することで、ホストエージェントのログ等を含む管理画面を表示することができる。

![CM58 CMエージェントログ.png](https://qiita-image-store.s3.amazonaws.com/0/17749/f458295a-8b83-c3dd-faa5-7eed870ebc68.png)
ゲーム開発 with Unity, Spine, ZBrush, Maya, Realm

#個人ゲーム開発の軌跡。
経験言語: Java, C#, C++, Objective-C, Javascript, Swift
経験エンジン: Cocos2D-X, AndEngine, Unity

- Unity, Spine, Realmの組み合わせで素敵なサムシングを作る。
- Maya & ZBrushでモデリングしたりアニメーションさせたりもするよ。
- 2D絵を自分で描いてSpineでアニメートさせてUnityに取り込むよ。
- RealmでiOS & Android用のDBを実装してAWSでバックエンド部分を実装するよ。
 - UnityをまだサポートしていないのでDB周りは保留。

今まで作ったのはこんな感じ。
![anim1.gif](https://qiita-image-store.s3.amazonaws.com/0/115418/eb110746-50a3-92a7-7f52-7b409a285f62.gif)
unity scene 1

![particleTest1.gif](https://qiita-image-store.s3.amazonaws.com/0/115418/b2604be1-2472-f5da-bd19-45374b521562.gif)
unity scene 2

![anim3.gif](https://qiita-image-store.s3.amazonaws.com/0/115418/af4d9fde-7bdc-4866-23f0-6bdf6a09e4bc.gif)
unity scene 3

![eye1.gif](https://qiita-image-store.s3.amazonaws.com/0/115418/cba489bd-7382-4b67-8740-0cd4ca9f8ca7.gif)
Maya animation 1

![goon8.gif](https://qiita-image-store.s3.amazonaws.com/0/115418/9ae8e5a7-a0e8-8ea4-1951-5dfdb28b74d8.gif)
Maya animation 2

![gob1.png](https://qiita-image-store.s3.amazonaws.com/0/115418/805147ea-13e1-7a01-0405-f46ef110cfff.png)
ZBrush model 1

![imp2.png](https://qiita-image-store.s3.amazonaws.com/0/115418/78ad38b5-2f53-8222-1756-d7e06a381a84.png)
ZBrush model 2

![three3.png](https://qiita-image-store.s3.amazonaws.com/0/115418/c74f6ec4-67ed-6cb9-5550-6df891de750a.png)
ZBrush model 3

3年前にAndEngineで作ったRPGはこれです。
https://www.youtube.com/watch?v=p2nsyBsDYzI&list=PLEyi4okYsEr1m2Nv176pI6FlCNN7tAwY3
言語: java
エンジン: AndEngine
ツール: Gimp, TiledTMXEditor, PhysicsBox2D extension

この3年間、日本の色々なスマホゲーム会社の案件に携わって何とか生きてきたよ。
そろそろ自社製品を作って生計を立てたいんだ。

とりあえずモンスターをもっと描いて、Spineで生き生きと動かしたい。
![mons1.png](https://qiita-image-store.s3.amazonaws.com/0/115418/902c3465-c83b-666f-00c0-2461d2a4a304.png)![mons3.png](https://qiita-image-store.s3.amazonaws.com/0/115418/f9c7463a-7dda-52ba-b0e6-eb145fd8d20d.png)![m1.png](https://qiita-image-store.s3.amazonaws.com/0/115418/3f85a18f-e14a-ec13-370b-8c06d1da8ca0.png)![m2.png](https://qiita-image-store.s3.amazonaws.com/0/115418/0583cab8-1ba1-027a-1b94-a178a1fcdf05.png)
![mons4.png](https://qiita-image-store.s3.amazonaws.com/0/115418/cbb3ca3b-8191-886b-32ba-ec86da7cf423.png)![mons2.png](https://qiita-image-store.s3.amazonaws.com/0/115418/832b5bd5-2e82-b7e7-3da6-57044c48fb6b.png)
![m37.png](https://qiita-image-store.s3.amazonaws.com/0/115418/cf8d00aa-eb87-4fbc-7737-43540f576e5a.png)![m95.png](https://qiita-image-store.s3.amazonaws.com/0/115418/908b62d9-9770-66c4-c9bd-a332d2be7041.png)![m6.png](https://qiita-image-store.s3.amazonaws.com/0/115418/a22ac7ca-369e-1d13-4338-c0ef5308c1c2.png)

アクションよりRPGかなあ。
でもただのターン制RPGだとつまらないなあ。

今作ってるのはこんな感じです。
Unity, Spine, photoshop, gitを使っています。
![scene_test20.gif](https://qiita-image-store.s3.amazonaws.com/0/115418/fdf44889-8ac6-113a-a755-0340e556a9dd.gif)

![scene_test21.gif](https://qiita-image-store.s3.amazonaws.com/0/115418/015388fe-ff4d-3c2f-799f-be5212590b9f.gif)
画面左をタッチするとコントローラーが表示され、右側をタップやスワイプするとアクションする仕組みです。

![scene_test23.gif](https://qiita-image-store.s3.amazonaws.com/0/115418/1433c5ee-7fc6-a671-c7c6-8f7d4f205947.gif)
作りたい物がまとまらず少し時間を食ってしまいましたが、Don't starveにリンダキューブの動物収集要素を持たしたアクションRPGにしようと思います。
クラフト系にポケモンの収集の面白さを入れる感じになるかな。
Coursera 機械学習 week 6-7

社内有志で
https://www.coursera.org/learn/machine-learning/home/welcome
を履修しながら毎週、進捗や疑問報告をし合う勉強会をやっているのですが、今週は参加者の予定が合わず開催できなかったので、Qiitaにてまとめ。

はじめにひとこと。
**Courseraのこのコースまじでオススメ**

#Coursera 進捗
Week6終えました。
そして、Week7もプログラミング課題以外は終えました。

##Week6
Bias vs. Varianceが主なテーマで、実装したアルゴリズムのラーニングカーブを描いて、次にどう改良するか考える方法の伝授。
Trainingセットと、Cross Validationセットのそれぞれからどのくらいの精度が出てるかをプロットして、OverfittingしてるのかUnderfittingしてるのかを判断 -> 場合に合わせた対処をしようというもの。

![cai111.PNG](https://es-project.qiita.com/files/0582f9db-ed22-daed-6d5c-2262d9c6725c.png)

![cai112.PNG](https://es-project.qiita.com/files/2e202724-ee77-fb00-3d26-1e1b6991cfde.png)

あと、Skew dataの扱いってのがタイトル的になんのことかわからなかったけど、これはtrue/false positive/negativeのケースが極端な分布をしてる時にどう評価するのって話だった。
単純な話だけど、こういうケースの認識と、具体的な対処法を予め知っとかないと不毛に何時間も費やすことになるので地味に重要。

![cai144.PNG](https://es-project.qiita.com/files/3c98acc9-5fc5-bd08-6b27-afe7bd6766ce.png)

##Week7
かの有名なSVMとKernelについて。
SVMってよく聞くけど何なのか、というのがわかった。
logistic regressionの変形がベースなのね。

実際、week3くらいでlogistic regressionの話を聞いた時に、なんでsigmoid関数を使うの？もっと線形な関数でもよくない？ってのは疑問に感じていたのですっきりした。
![cai150.PNG](https://es-project.qiita.com/files/21f2ead0-cc6e-7ef6-c440-ddfec6c319c7.png)

この関数とコスト関数から、Marginを取るように分類されるっていう説明は非常にわかりやすかった。
![cai152.PNG](https://es-project.qiita.com/files/638cda0f-edcf-4372-7a27-d0a7b238fbe9.png)
Ng先生、恐ろしく説明がうまい。

後半はやや天下り的に終わったWeek7でした。

(K-meansは教師なし学習なのでさらに翌週(Week8)でした。 -> 来週やる)

##ここまで受けてきて(~Week7まとめ)
現時点で、実装できるし試せるよというアルゴリズムは

- Linear Regression
- Logistic Regression (classification)
- Neural Network
- SVM

ということに。
そして、実際にうまい結果が出なかった時にどうすればいいかもそれなりにわかる状態になってきたはず。
早く何かに応用したい気持ちでいっぱいですが、さらに深く学びたいという気持ちもいっぱい。
あと、Coursera分量が結構多いので消化するだけで1週間が過ぎてしまうということもあり、応用は履修後になろうかという気がします。
(現在業務で直接機械学習を使うことはほぼないので)

同じデータセットをもとに、社内解析コンペとかやってみたい。

#翌週に向けて
- Week7のプログラミング課題やります
- Week8もほぼほぼ終える
    - K-means、クラスタリング
    - Dimensionality Reduction -> 主成分分析のこと？

#雑感
ちゃんと理解しない処理方法を使っちゃいけないと思うし、ちゃんと理解していない処理で示唆されたデータを判断に用いてはいけないと思う。
activesupportがconflictしないでよ

何気なくbundle installしてみたら何か更新入ったなーくらいの感覚でした
まさかこんなにハマるとは・・・

さっきまで実行していたことができなくなっている
ものすごく底の浅いプログラムでrspecを実行するだけなのに

```
.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/specification.rb:2284:in `raise_if_conflicts': Unable to activate railties-5.0.0, because activesupport-5.0.0.1 conflicts with activesupport (= 5.0.0) (Gem::ConflictError)
```

内容を見ればconflictしていることはすぐにわかる
でもなんでconflictしたのかわからないし、何がどうなっているのかさっぱり

全然理解できてなかったけど最終的にやったことは

```
gem uninstall activesupport -v "5.0.0.1"
```

とりあえずアンインストールして解決したけど、、、
なんでminorより下のものが入ってきてしまったんだろ
まぁ入るのはいいとしてもconflictすんなよ

```
spec.add_dependency 'activesupport', '>= 3.0.0'
```

この書き方がよくなかったのかなぁ
wgetの終了ステータス(Exit Status)一覧

なぜかちょっと見つけるのに時間かかったため自分用メモ。。。

```
2.13 Exit Status

Wget may return one of several error codes if it encounters problems.

0    No problems occurred.
1    Generic error code.
2    Parse error—for instance, when parsing command-line options, the ‘.wgetrc’ or ‘.netrc’...
3    File I/O error.
4    Network failure.
5    SSL verification failure.
6    Username/password authentication failure.
7    Protocol errors.
8    Server issued an error response. 

```

* [GNU Wget 1.18 Manual: Exit Status](https://www.gnu.org/software/wget/manual/html_node/Exit-Status.html)
Bash on Ubuntu on Windows + オールインワンmintty

# はじめに

先日、mattnさんが[Bash on Ubuntu on Windows の最高の端末環境を教えてやるからちょっと来い。](http://mattn.kaoriya.net/software/bow/20160824234928.htm)と素晴しい記事を書かれていたのですが、[cbwin](https://github.com/xilun/cbwin)も一緒に使えないかと思っていたら既に統合されたものがありました！！！

* [wsl-terminal](https://github.com/goreliu/wsl-terminal)

# インストール

[wsl-terminal/release](https://github.com/goreliu/wsl-terminal/releases)から最新の7zもしくはzipをダウンロードして任意のフォルダーに展開するだけです。

# 使い方

* `open-wsl.exe`をWindowsから実行するとminttyが起動します。
* `tools/add-open-wsl-here-menu.js`を実行するとエクスプローラのコンテキストメニューからminttyを実行できます。
* `run-wsl-file.exe`をWindowsから実行すると`.sh`などのスクリプトを実行できます。

## ログインシェルとして実行したい！

デフォルトのままではログインシェルではないので実行パスが起動時のカレントディレクトリになっていますが、minttyから使うときはログインシェルにしたいものです。
その場合は以下の設定でログインシェルとしてbashを実行してホームディレクトリから起動できます。

### v0.5.1より後のバージョン

2016/9/9現在、まだリリースされていませんが、以下のコミットでopen-wsl.exeに`-l`オプションが追加されたので、これを利用します。
https://github.com/goreliu/wsl-terminal/commit/1b1b74b85f54dafb57c999e4c46bf0e756a96a96
https://github.com/goreliu/wsl-terminal/commit/7d0a8832acf00f0678063c4fddd83ecd35102e5e

### v0.5.1以前のバージョン

wsl-terminal.confの`shell`を上記のコミットと同じようなコマンドに変更します。

```ini:etc/wsl-terminal.conf
[config]
title="        "
shell=bash -c "cd; bash -l"
use_cbwin=0
use_tmux=0
```

## cbwin

wsl-terminalの`bin`フォルダーに[cbwin](https://github.com/xilun/cbwin)が同梱されています。
Bash on Ubuntu on Windows側からインストーラを実行して`etc/wsl-terminal.conf`の`use_cbwin`を`1`に設定すればwcmd(Windowsのcmd)とwstart(Windowsのstart)を使うことができます。

```shell-session:インストール
cd bin && sudo ./install_cbwin.sh
```

```ini:etc/wsl-terminal.conf
[config]
title="        "
shell=bash
use_cbwin=1
use_tmux=0
```

以上でminttyを使いつつWindowsのコマンドを実行することもできる環境の完成です。
Unity Shader適用バグ(?)

Unityでシェーダを書くときにバグって混乱したのでメモ

#状況
Shaderコードを作成．
Materialを作成．
作成したShaderコードをMaterialに適用．
MaterialをGameObject(MeshRenderer.material)に適用．
Shaderコードを変更．
ここで，Shaderコードの変更をしたのにもかかわらず，SceneViewへ反映されないというバグ．なぜかGameViewには反映されているという謎．

#解決法
再インストールまで試したが，結局，「ShaderコードをMaterialに適用しなおす」ことで解決した．

#コメント
これは人を惑わすバグです，早く治してほしいと思った（小並感）
DataGridTemplateColumn内のコントロールにコードビハインドからアクセスする-其の2-

##前回
[DataGridTemplateColumn内のコントロールにコードビハインドからアクセスする-其の1-](http://qiita.com/skuromaku/items/84f31443b6ab02978287)の続き。

##やりたいこと
コードビハインドからDataGridTemplateColumn内のコントロールにアクセスする。
UserControl内のDataGridにバインドする。各項目にバインドするPathは外部から設定したい。

##駄目だった
CellTemplate.LoadContent()を利用してDataTemplate内のコントロールにアクセスするところまではできた。
けど、どうもLoadContent()の戻り値は新しくインスタンス化されたものらしく、プロパティを変更しても
元オブジェクトの値に反映されない。

```csharp:C#
var templateColumn = ZeroDataGrid.Columns[0] as DataGridTemplateColumn;
var checkBox = templateColumn.CellTemplate.LoadContent() as CheckBox;
checkBox.FontSiZe = 50; // これが反映されない
```

##じゃどうしようか
外部からバインドするプロパティ名を設定する方法を諦め、
UserControl内のDataGridにバインドするデータクラスを固定にする。
いや、これなんで思いつかなかったんやろうorz

```csharp:C#
// ***データクラス***
public class ListData
{
  public string Name {get; set;}
}
```

```csharp:C#
// ***UserControl内XAML***
<DataGrid Name="MainDataGrid">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Name}"/>
  </DataGrid.Columns>
</DataGrid>
```
```csharp:C#
// ***UserControl内コードビハインド***
// 外部からDataGridにバインドするデータを受け取る用
public static readonly DependencyProperty ListDataProperty = DependencyProperty.Register(
    "ListData",
    typeof(ObservableCollection<ListData>),
    typeof(HogeUserControl ),
    new FrameworkPropertyMetadata(null)
);
public ObservableCollection<ZeroCheckListBoxViewData.ListData> ListData
{
    get { return (ObservableCollection<ListData>)base.GetValue(ListDataProperty); }
    set { base.SetValue(ListDataProperty, value); }
}

// ロードイベントなりなんなり好きなところで
mainDataGrid.ItemsSource = this.ListData;
```

あとは、UserControl貼ってるXAMLで

```csharp:C#
<c:HogeUserControl ListData="{Binding Path=DataList}"/>
// DataListは「ObservableCollection<ListData> DataList」こんな感じで宣言
```

とりあえず、これでやりたいことはできたよorz
運用設計

## 運用設計とは？

システムを導入する各現場に応じた、システム運用の枠組みを作りこむこと

---

## 運用設計はなぜ必要か？

- システム運用が高負荷にならないようにする
	- トラブルが少ない
	- 日々行なうことが少ない

- 運用が属人的にならないようにする
	- 効果を測定できるようにする
	- 誰が何をやったかを分かるようにする

- 費用対効果を高める
	- 少ないコストで効果的に運用する

---

## 運用設計を行うタイミング

- フェーズのはじめ
	- 基本設計と同じくらい

運用に必要な機能があれば予め設計に組み込める

---

# 具体的な設計項目

- 業務内容
- 管理項目
- 運用体制
- 運用スケジュール
- 監視設計
- データ管理
- バックアップ設計
- 障害対応

---

## 業務内容

どういう業務を行なうのかを定義する
定義を行なうことで、作業の見える化
それぞれの業務における運用を考えることができる

---

## 管理項目（何を管理対象とするか）

業務とは、システムを使用して、データを扱うこと

システムとデータのうち、どれについて運用の対象とするかを決定する

- システム本体
- インフラ（サーバ、DBなど）
- ファイルサーバ
- バックアップデータ
- ログファイル


---

## 運用体制

- 統括責任者
- 運用責任者
	- システム監視者
	- ユーザーサポート責任者
- 開発責任者
	- 開発担当
	- 保守担当

---

## 運用スケジュール

運用項目とスケジュールを定義

- システムログ確認 （日次）
- サーバログ確認
- バッチ処理確認 （日次、月次）
- データ改廃
- システム稼働状況確認
- システムアップデート
- ミドルウェアアップデート

- マスタ更新
- その他業務で必要なこと


---

## データ管理

- システムで扱うデータを列挙
	- DB
	- ファイル

- データの生存期間
	- トランザクションデータをどれだけ保持するか？
	- 改廃はどのタイミングで行なうか？

---

## バックアップ設計

- データのバックアップ
- システムのバックアップ

方法とスケジュールを定義

---

## 監視設計

- 何を監視するか
	- ログ
	- システムリソース

- どうなったら通知するか
	- ログに含まれる文言（ERROR, Exceptionなど）
	- リソースのしきい値

- 誰に通知するか
	- 監視担当者

---

## 障害対応

- フロー
	- システムからの報告（管理担当）
	- ユーザーからの報告（ユーザーサポート担当）
- エスカレーションルール

---

# 最後に

開発会社にとってはシステム完成＝ゴールだが、顧客にとってはシステム完成がスタートである。
顧客の目的を果たすためのシステムをどのように運用し、安定して継続的に問題を最小限にして価値を生み出すかは、納品直前などではなく開発初期段階から考慮する必要がある。

また開発における設計とは違い、業務や組織の特性を考慮する必要があるという点で、組織運営やマネジメントの知識、ノウハウも必要である。
Xcode6からXcode8へ移行する際に行ったこと-Unity編

# 「libiconv.2.dylib」の参照が見つからない
* libiconv.2.tbdに変更する

```csharp:BuildPostProcessor.cs
	[PostProcessBuild]
	public static void OnPostProcessBuild(BuildTarget target, string xcodeProjectPath) {
		ForXcode8 (xcodeProjectPath);
	}

	private static void ForXcode8(string xcodeProjectPath) {
		string projPath = PBXProject.GetPBXProjectPath (xcodeProjectPath);
		PBXProject pbxProject = new PBXProject ();
		pbxProject.ReadFromFile (projPath);
		string target = pbxProject.TargetGuidByName ("Unity-iPhone");

		// For Xcode8
		pbxProject.AddFileToBuild (target, pbxProject.AddFile ("usr/lib/libiconv.2.tbd", "libiconv.2.tbd", PBXSourceTree.Sdk));
		pbxProject.RemoveFileFromBuild (target, pbxProject.FindFileGuidByProjectPath ("libiconv.2.dylib"));
		pbxProject.RemoveFile (pbxProject.FindFileGuidByProjectPath ("libiconv.2.dylib"));
		pbxProject.WriteToFile (projPath);
	}
```
Qiitaで、記事ソース(Markdown)を抽出するブックマークレットを作成しました

# 概要
　タイトルの通りです。**確認するためだけにわざわざ編集ボタンを押すなんてバカバカしい**ので……。

# 作成したブツはこちら
```qiita_mark.js
javascript : (function ()
{
	var str = document.getElementById('raw_body').value;
	var obj = window.open();
	obj.document.open();
	obj.document.write(str);
	obj.document.close();
})();
```

# 修正案
　ただ、上記のコードでは、Markdown部分の改行がHTML側で認識されず、横にベタッとなったページになってしまいます。
　その辺りを改善した[tadsan](http://qiita.com/tadsan)さん版を貼っておきます。

```qiita_mark2.js
javascript:(function ()
{
    var str = document.getElementById('raw_body').value;
    var obj = window.open();
    obj.document.open();
    obj.document.write("<pre><code>");
    obj.document.write(str);
    obj.document.close();
})();
```
プログラマになら理解しやすいであろうgitの基本概念解説

今どきこんな記事の需要があるのかわからないけど、まだ「プログラマだけどsvn以前の版管理しか使ったことがない、gitに興味ある」という人もきっと残っているので、プログラマ視点で理解しやすいgitの考え方の紹介を。

svnの履歴は配列、gitはリスト
----------------------
データを並べた構造の表現の仕方として配列とリストってのまず習いますよね。
連続したメモリ空間にただ並べるのが配列、各エントリごとにメモリを確保して「隣のノード」へのポインタを各ノードが持つようにするのがリスト。
svnとgitの最大の違いはこれです。svnは履歴を配列として持つから、履歴にリビジョン番号が付きます。gitは各リビジョンが「前のリビジョン」へのポインタを持ったノードなので、番号が付きません。代わりにリビジョンの内容のハッシュ値をIDとして持ちます。

svnの（仮想的な）ブランチは配列、gitのブランチはポインタ
--------------------------------------------
ブランチのことは、svn,gitそれぞれで理解しにくさがあります。
svnには仕組みとしてブランチという概念が存在せず、運用で仮想的にブランチが作れたかのように扱うのが一般的。
で、その仮想的なブランチというのはどういうものを想定しているかというと、分岐したところから新しい配列が生えてきたというもの。配列の途中から新しい配列が生えてくる、まさにブランチ（枝）です。運用解決ではなく仕組みとしてそうなっていればもっと良かった。
gitのブランチは、枝を意味しません。むしろ葉を意味します。前項の通りgitの履歴構造はリスト構造（ただし線形ではありません、分岐、合流があります。正確な情報科学用語としては、「DAG」。合流があるから「ツリー」ではない）なのですが、そのノードのどれかを指すポインタのことをブランチまたはタグと呼んでいます。動かないポインタがタグ。動くポインタがブランチ。
ブランチが動くポインタだ、というのは、そのブランチ名義で新しいリビジョンをコミットすることでその新しいリビジョンを指してくれるということ。

過去の履歴を改変できるできないとは
----------------------------------
svnが過去のリビジョンの内容を書き換えたり最新のリビジョンを取り消したりできないのは、リビジョン番号の意味するリビジョン内容が変わってしまうと多分クライアント動作に不整合を起こしてしまうから。リビジョン番号を振った上にハッシュ値をプロパティとして持つなどすれば不整合は回避しえたんだろうけど、そこまでするかって話。よってsvnでは過去の履歴は修正できません。
gitの場合も、内容が違えばハッシュ値も変わるのでそういう意味での書き換え（リビジョンIDを保ったままの書き換え）は無理です。
が、なにしろ配列でなく分岐・合流ありのリストなので、新しい履歴を生やしてからブランチというポインタをそっちに貼り替えてしまえば履歴の見た目はすぐに書き換えられます。ブランチまたはタグからたどれないノードは「ないもの」と扱われるので、元の履歴は消えます（一定期間後にGCされるまではポインタを貼り直すことでサルベージ可能）。

分散型であるとは
----------------
gitが複数マシンにリポジトリを分散すると言っても、基本的にそれぞれのリポジトリは同じ履歴構造を保持しているのが前提となる。
ただし複数人いる開発者がそれぞれ自分のマシンでの改変内容を自分のマシンのリポジトリにコミットするので、そこだけ違いが生じる。違いというのは、自分のところにだけあるリビジョンノードがあると言うこと。ノードを他のマシンに渡す操作が「プッシュ」、他のマシンから引き出す操作が「フェッチ」。
履歴構造はリスト、ブランチ・タグはポインタ、というgitの履歴構造はノード単位で受け渡しすることを可能にして分散化を実現している。ただしこのままでは開発者の数だけどんどん履歴が分流していくばかりでどれが本流だって話になってしまう。そこで、合流させる「マージ」がある。
ただ、また用語的にややこしいことに、マージはマージでも合流させないマージ操作がある。合流するまでもなく「何歩か進めば追いつく」ことができる場合、合流ノードを作るのでなく単にブランチというポインタを進めるだけで済んでしまうわけだけど、そういう操作も「マージ」の一種だということになっている。本来の合流操作と区別したいときは「fast-forward（早送り）マージ」と呼ぶ。
普通はmasterという名前のブランチを本流扱いし、チーム内の責任者が各ブランチを内容確認してmasterにマージしていく。でもこういうチーム内ワークフローの話をし出すと本が一冊書けるのでそれ以上は触れない。

でもワークフロー上これだけは基本ルール
--------------------------------
書かないと言ったけどこれだけはというルール。
分散型だから各人のマシン上で同じ名前のブランチが別のノードを指している場合が当然ありえるんだけど、 **「同名のブランチが分岐している状態にすべからず」** 、これはまず普遍的なルール。
同名のブランチがマシンによって別のノードを指しているとしても、単に遅れているか進んでいるかだけの違い、前項で説明した「fast-forward」で追いつけるだけの違いに留めないといけないというもの。ブランチが「枝」であることを保証する最低限の取り決めです。
必然的に、「masterにコミットするな」となります。各人がローカルでmasterにコミットするとその時点で分岐が生じますから。

コマンドラインは難しい
----------------------
gitの難しさは、概念を理解するときの壁と、コマンドラインオプションが複雑だというのの2段階があります。
概念の理解はこの記事の内容で十分。十分ですとも。
コマンドラインオプションはねえ⋯　あれはgitコマンドの仕様が悪い。GUI環境で開発してるなら無理してコマンドライン覚えずにGUIツールでいいんじゃないですかね。
SourceTreeが人気だけど、私としておすすめするのはそれよりも[SmartGitHg](http://www.syntevo.com/smartgit/)。上記のgitの概念をより自然にGUI化していて、より脳になじみます。ドイツ製で、日本語化（というか英語以外の他言語対応）をする予定がまったくないという硬派ですけど。

まとめ
------
- DAGだ
- 「ブランチ」は、名前に反して生えている枝のことではなく葉を指すポインタである
- 「マージ」は、名前に反して何もマージすることなく単に前へ進むだけの操作も含んでいる
- masterにコミットするな
- [SmartGitHg](http://www.syntevo.com/smartgit/)はいいぞ
- 逆に言うと、非プログラマにはgitの概念を理解するところの壁が厚いんだよな
Xcode初期プロジェクトファイル Page-Based Application

UIPageViewControllerを実装しなければいけなくなったので、参考になりそうと思って見てみました。

## RootViewController

`pageViewController`を宣言、自身のSubViewとして追加

* `pageViewController`を宣言
* 最初のViewController `startingViewController` を宣言
* `setViewControllers`する
    * セットするのは配列なので**一見するとスワイプで見せる予定のViewControllerを全て突っ込みたくなる**が、最初のViewControllerしか入れないようにする。
* `pageViewController`を`addChildViewController`する
* `pageViewController.view`を`view`に`addSubview`する

## DataViewController

実際に表示されるビューとなる

* dataLabel
* dataObject

## ModelController

`UIPageViewControllerDataSource`の実装
(UIPageViewControllerDataSourceについては[こちら](http://qiita.com/keisei_1092/items/9ac4fc6cedae00267304))

33行目の`viewControllerAtIndex`は下から呼ばれてるだけ

* `viewControllerBeforeViewController`
* `viewControllerAfterViewController`

## Storyboard

DataViewControllerにセグエは何も生やさない
実務でも（おそらく）PageViewControllerが表示する予定のViewController（今回の場合はRootViewController）までつながってれば:ok:


PageViewControllerには何のセグエも生えないので若干腑に落ちない感じがあった。
toto868回の予想

##確率計算
```
> Result
                 ホーム           アウェー      W      D      L
1          ドルトムント           マインツ 0.6172 0.2013 0.1815
2                ケルン   ダルムシュタット 0.3536 0.2784 0.3680
3          ハンブルガー インゴルシュタット 0.4327 0.2806 0.2867
4        アウグスブルク   ヴォルフスブルク 0.4262 0.2565 0.3172
5        フランクフルト           シャルケ 0.3722 0.2555 0.3722
6  メンヘングラードバッ   レヴァークーゼン 0.5261 0.2234 0.2505
7              トテナム       リヴァプール 0.4882 0.2465 0.2653
8            チェルシー         バーンリー 0.4206 0.2544 0.3250
9              レスター       スウォンジー 0.5229 0.2470 0.2301
10       サウザンプトン     サンダーランド 0.5720 0.2120 0.2159
11         ワトフォード         アーセナル 0.3116 0.2710 0.4175
12         エヴァートン   ストーク・シティ 0.4714 0.2426 0.2860
13         ハル・シティ    マンチェスターU 0.4533 0.2746 0.2720
```

##予想
|ホーム|アウェー|予想1|予想2|結果|
|:-:|:-:|:-:|:-:|:-:|:-:|
|ドルトムント|マインツ|D|W,D|W|
|ケルン|ダルムシュタット|D|W,D|W|
|ハンブルガー|インゴルシュタット|W|W,D|D|
|アウグスブルク|ヴォルフスブルク|W|W,L|L|
|フランクフルト|シャルケ|W|W,L|W|
|メンヘングラードバッ|レヴァークーゼン|W|W|W|
|トテナム|リヴァプール|L|W,L|D|
|チェルシー|バーンリー|W|W|W|
|レスター|スウォンジー|W|W|W|
|サウザンプトン|サンダーランド|W|W,D|D|
|ワトフォード|アーセナル|L|D,L|L|
|エヴァートン|ストーク・シティ|W|W|W|
|ハル・シティ|マンチェスターU|D|D,L|L|

##結果発表
予想1（本命)：6/13
予想2（本命・滑り止め）:12/13、2等的中
UIPageViewControllerDataSource

## UIPageViewControllerDataSource

UIPageViewControllerDataSource Protocol Reference
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPageViewControllerDataSourceProtocolRef/

> The UIPageViewControllerDataSource protocol is adopted by an object that provides view controllers to the page view controller on an as-needed basis, in response to navigation gestures.

`UIPageViewControllerDataSource`プロトコルはナビゲーションジェスチャーに応答してPageViewControllerにViewControllerを供給するオブジェクトに必要に応じて採用される。

> The data source implementation is free to handle this responsibility in any way that is appropriate for your application. In many cases, it should look at the view controller passed to it, determine what content to display, and create the view controllers as they are needed. You may find it helpful to include information such as the page number in the view controller, to simplify the task of determining what content to display.

DataSourceの実装はアプリケーションによって任意に行うことができる
ViewControllerを受け取って表示するコンテンツを決定し、必要に合わせてViewControllerを作成する。
表示するコンテンツを決定する作業を簡素化するため、このようなViewControllerにページ番号のような情報を含めることができる

> If both of the methods in Supporting a Page Indicator are implemented and the page view controller’s transition style is UIPageViewControllerTransitionStyleScroll, a page indicator is visible. Both of these methods are called after the setViewControllers:direction:animated:completion: method is called. After gesture-driven navigation, these methods are not called. The index is updated automatically and the number of view controllers is expected to remain constant.

### Providing View Controllers

* `pageViewController(_:viewControllerBefore:)` *Required*
* `pageViewController(_:viewControllerAfter:)` *Required*

### Supporting a Page Indicator

* `presentationCount(for:)`
* `presentationIndex(for:)`

### example (Xcode>New>Project>Page-Based Application)

*ModelController.swift*

https://gist.github.com/keisei1092/0ae349b2ff3f1995b27c9fedf55d6d3b
normalize.css、sanitize.cssユーザーに朗報。display: none; 用のクラスを作る必要は無し

何気なくソースコードを読んでいて発覚。
```normalize.css```も```sanitize.css```も同じ作者が作っているのですが、こんな記述を発見しました。

```css
[hidden] {
  display: none;
}
```

[]は属性セレクタですね。つまり、hiddenという属性を持ったHTMLタグは表示されなくなるようです。

hidden属性の仕様については、[hidden- HTML5リファレンス](http://www.tagindex.com/html5/attribute/hidden.html)、または w3cの [7.1 The hidden attribute](https://www.w3.org/TR/html5/editing.html#the-hidden-attribute)　をご参照ください。

わりと今まで、display: none;のためだけに、こんな処理を書くことがあったのですが、

```button.php
<button class="<?php (hoge) ? 'is-hidden' : '' ?>" />
```


```button.css
.is-hidden {
  display: none;
}
```


normalize.cssかsanitize.cssを採用している場合、不要だったんですね…笑


```button.php
<button "<?php (hoge) ? 'hidden' : '' ?>" />
```

##### スクショ

これは↓
![Screen Shot 2016-08-26 at 11.31.36.png](https://qiita-image-store.s3.amazonaws.com/0/77614/cce57c31-2118-5963-7ca9-2d95b3674ce2.png)

こうなる↓
![Screen Shot 2016-08-26 at 11.31.24.png](https://qiita-image-store.s3.amazonaws.com/0/77614/ec3f7e37-88c4-b6cc-d286-bf8b8959d0d1.png)


##### 追記

hidden属性の仕様としては、以下のとおり。

- 今は関連性がないが、これから関連するかもしれない要素。
- 以前は関連性があったが、今はもう関連していない要素。

とのこと。

参照：

- [hidden - MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/hidden)
- [hidden- HTML5リファレンス](http://www.tagindex.com/html5/attribute/hidden.html)

ブラウザの対応状況としては[IEは11のみ対応しているようです](http://beta.caniuse.com/#search=hidden)。(2016/08/26現在)
わりかしモダンな属性なんですね。

参照：[HTML hidden Attribute - w3schools](http://www.w3schools.com/tags/att_global_hidden.asp)
画像サイズを取得するコマンド

retina対応でspriteの画像サイズが奇数になっていると、潰れちゃったりするので、
画像サイズを取得する方法を考えてみました。
「画像サイズを取得 コマンド」をググるidentifyを使っている記事が多くみられたのですが、
file コマンドでも代用できますね、必要に応じてawkコマンド必要な列だけ取得するのにも使えると思います。

```
$  identify -format '%wx%h\n' *
36x36
50x22
46x46
68x36
68x36
10x9
10x10
26x70
26x70

$ file *                           
sprite_arrowleft.png:  PNG image data, 36 x 36, 8-bit/color RGBA, non-interlaced
sprite_bottom.png:     PNG image data, 50 x 22, 8-bit/color RGBA, non-interlaced
sprite_close.png:      PNG image data, 46 x 46, 8-bit/color RGBA, non-interlaced
sprite_exp.png:        PNG image data, 68 x 36, 8-bit/color RGB, non-interlaced
sprite_new.png:        PNG image data, 68 x 36, 8-bit/color RGB, non-interlaced
sprite_slickball0.png: PNG image data, 10 x 9, 8-bit grayscale, non-interlaced
sprite_slickball1.png: PNG image data, 10 x 10, 8-bit grayscale, non-interlaced
sprite_slickleft.png:  PNG image data, 26 x 70, 8-bit gray+alpha, non-interlaced
sprite_slickright.png: PNG image data, 26 x 70, 8-bit gray+alpha, non-interlaced
```

画像のリサイズにはmogrifyコマンドを使いました

```
(縦横比保持)
$ mogrify -geometry 10x10 sprite_slickball0.png

(縦横比保持しない)
$ mogrify -geometry 10x10! sprite_slickball0.png 
```
hyper-Vに登録した仮想環境を起動してリモートデスクトップ接続するバッチ


```cmd:仮想マシン起動リモート接続.bat
@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" %*&goto:eof

#Hyper-v 仮想マシン起動
$VMname = "XP"
Start-VM -NAME $VMname

#起動した仮想マシンにリモートデスクトップで接続
$server = "XXX.XXX.XXX.XXX"
$RDPPort = 3389
Invoke-Expression "mstsc /v:$server"
```
bash 起動時の環境ファイルについて調べてみた

$PATH に値を追加するのにどのファイルを触ればいいかちょっと迷ったので、ざっくり調べてみました。シェルの開始時に呼ばれるファイルを評価順に書いています。細かいファイルについては CentOS 7.2 の実装です。

# 会話型ログインシェルとして呼ばれた場合（コンソールとか）

（非会話型だけど --login オプションが指定された場合も同様）

- /etc/profile - \$PATH 設定開始
  - (/etc/profile.d/*.sh)
     - /etc/profile.d/256term.sh -- 端末の256色対応
     - /etc/profile.d/colorls.sh -- ls に色を付ける alias 設定
     - /etc/profile.d/less.sh -- LESSOPEN 環境変数設定
     - /etc/profile.d/which2.sh -- which コマンドカスタマイズ用 alias 設定
     - /etc/profile.d/colorgrep.sh -- grep に色を付ける alias 設定
     - /etc/profile.d/lang.sh -- ロケール関連設定
     - /etc/profile.d/modules.sh -- bash モジュール設定（奥が深そう、、、）
     - /etc/profile.d/vim.sh -- vim 用の alias 設定
- ~/.bash_profile （CentOS7 ではこれを採用。次項の２つはない）
  - ~/.bashrc -- \$PATH に \$HOME/bin を追加（一般ユーザーは \$HOME/.local/binも）
     - /etc/bashrc -- プロンプト設定や会話型端末用の微調整
- ~/.bash_login（~/.bash_profile がない場合のみ）
- ~/.profile （~/.bash_profile も ~/.bash_login もない場合のみ）

# 会話型だけどログインシェルではない場合（sshとか）

- ~/.bashrc -- \$PATH に \$HOME/bin を追加（一般ユーザーは $HOME/.local/binも）
  - /etc/bashrc -- プロンプト設定や会話型端末用の微調整、PATH の初期設定
     - /etc/profile.d/*.sh -- （前述の通り）

# 会話型シェルではない場合（バッチ起動時）

- BASH_ENV 環境変数の値をファイル名とみなして読み込む

本当はもっといろんな呼ばれ方のパターンがあるようですが、今回はこのへんで。

# 結論

$PATH に値を追加する場合、システムグローバルに適用する場合は /etc/profile.d/ 配下にファイルを追加、個人毎の適用の場合は ~/.bashrc に追記するのがよさそうな感じでした。
[Git] `Auto packing the repository in background for optimum performance` `failed to run repack`

# Git Error
開発中にローカルでgit pull origin branch名を実行すると突然以下のエラーが。(Github使ってます。)

```
Auto packing the repository in background for optimum performance
fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack
```

調べてみると、[git fetch する度に"Auto packing the repository in background for optimum performance." が出る](http://qiita.com/laiso/items/e00195e7365fe8cdb8ab)が出てきましたので、参考にさせていただきました。

具体的には、

```
git fsck
```
で、ポイントされていない全てのオブジェクトを表示できるそうです。
大量にありました笑
その無駄なオブジェクトを消せば、メモリ効率よくなるよね。という話です。
その後、合わせワザで

```
git gc --prune=now
```

で手動GCを行います。(Gitは`auto gc`というコマンドを定期的に実行)

## それでもbad object refs/remotes/origin/HEAD
こういうバグが出たときって大体、ググるベースで適当に解決しようとしても直らないですよね。
純粋にバグに向き合ってみました。
普通に bad objectって書いてるので、refs/remotes/origin/HEAD
見てみました。

<font color='red'>普通に指定されてるブランチ違うがな！！<b></b></font>

なんで勝手に変わったんや。
と思いつつ、それを正しい数値に直して、問題は収束しました。

## 参考
[git fetch する度に"Auto packing the repository in background for optimum performance." が出る](http://qiita.com/laiso/items/e00195e7365fe8cdb8ab)
[9.7 Gitの内側 - メインテナンスとデータリカバリ](https://git-scm.com/book/ja/v1/Git%E3%81%AE%E5%86%85%E5%81%B4-%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA)
Zapierを使ってメールをSlackに流す（Gmailじゃないよ）

###やりたいこと
特定のメール（Gmailではない）をslackのチームに通知したい

###使用ツール
Slack
Zapier
普通のメールアカウント（クライアントはthinderbird使用）

###こんな感じ
EXPLOREで、Email by Zapierを選択

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/138413/edeeb6da-b5a4-b60d-1f2b-8b59f8d33bf4.png)

Popular Zaps For Email by Zapierから、Send Emails into Slackを探して、Use this zap

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/138413/6bafa107-f403-7be7-f7c4-0d2b227c1235.png)

Make this Zap!

Email by Zapier: New Inbound Email……と出てくるので、トリガーとなるメールアドレスを取得。
※このメールアドレスに送られたメールが、キャッチされてslackに流れます

Slackとの連携画面になるので、連携させたいチームとチャンネルを選択

これでOK

###メール側での設定
各メールクライアントに従って。

Thinderbirdの場合は、メッセージフィルタでルールを作成して、実行させたい動作にメッセージの転送を設定しました。たとえば特定のアドレスから届いたメールという条件に対して、先ほどのEmail宛に転送する動作を設定すれば、何分かおきにメールの着信がslackに流れます。



###結論
メール転送の必要があるっていうのは、業務で使うのはなんとなくもにょる。
結局thinderbird上げてないと転送できないので、私が社外にいるときにはメンバーに通知できない。もっと他にいい方法がありそうだけど……。
（サーバでメール転送設定してしまうと全メール送られてくるので意味ないし）
wordpressのユーザー検索でsearchとmetaを同時に使いたい

## 問題点
wordpressで公開側でユーザー検索とその一覧を出すときに、WP_User_Queryを使って出力をするのですが、
この際、  

``` php
// The search term
$search_term = 'Ross';

// WP_User_Query arguments
$args = array (
    'role' => 'reporter',
    'order' => 'ASC',
    'orderby' => 'display_name',
    'search' => '*'.esc_attr( $search_term ).'*',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'first_name',
            'value'   => $search_term,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name',
            'value'   => $search_term,
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'description',
            'value' => $search_term ,
            'compare' => 'LIKE'
        )
    )
);

// Create the WP_User_Query object
$wp_user_query = new WP_User_Query($args);

// Get the results
$authors = $wp_user_query->get_results();

// Check for results
if (!empty($authors)) {
    echo '<ul>';
    // loop trough each author
    foreach ($authors as $author)
    {
        // get all the user's data
        $author_info = get_userdata($author->ID);
        echo '<li>'.$author_info->first_name.' '.$author_info->last_name.'</li>';
    }
    echo '</ul>';
} else {
    echo 'No authors found';
}
```
([https://wpdocs.osdn.jp/%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_User_Query](https://wpdocs.osdn.jp/%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_User_Query)より引用)  
をつかうと、
メールアドレスなどから表示する`search`と、
`first_name`などから表示する`meta_query`とで
ガッチャンコしてうまく出力されないようです。
（例：sample@example.comのユーザーを検索しても表示されない）


## 解決策
**`search`の検索と`meta_query`の検索を分けて、マージをして出力する。**

``` php
$q1 = get_posts(array(
        'post_type' => 'post',
        's' => $query
));

$q2 = get_posts(array(
        'post_type' => 'post',
        'meta_query' => array(
            array(
               'key' => 'speel',
               'value' => $query,
               'compare' => 'LIKE'
            )
         )
));

$merged = array_merge( $q1, $q2 );

$post_ids = array();
foreach( $merged as $item ) {
    $post_ids[] = $item->ID;
}

$unique = array_unique($post_ids);

$posts = get_posts(array(
    'post_type' => 'posts',
    'post__in' => $unique,
    'post_status' => 'publish',
    'posts_per_page' => -1
));

if( $posts ) : foreach( $posts as $post ) :
     setup_postdata($post);

     // now use standard loop functions like the_title() etc.     

enforeach; endif;
```

([http://wordpress.stackexchange.com/questions/78649/using-meta-query-meta-query-with-a-search-query-s](http://wordpress.stackexchange.com/questions/78649/using-meta-query-meta-query-with-a-search-query-s)より引用)

ポイントは`$q1`と`$q2`とでそれぞれ出力して、`array_marge`で１つにまとめてしまうこと。

おそらくここらへんは不具合な気もするのでのちのち治るかと思うのですが、
治ったあとでも、この方法なら不具合も出ないと思うのでしばらくはこれで対応してみてはいかがでしょうか。
rails７つのアクションの表

##resoueces :reviewsの各アクションの役割について

|アクション名|役割|viewの有無|CURD|主な遷移先|
|:-:|:-:|:-:|:-:|:-:|
|index|reviewの一覧表示|有|R|show,new,destroy|
|create|reviewを新規作成|無|C|show|
|new|reviewの新規作成する画面|有|R(C)|create|
|edit|reviewを更新する画面|有|R(C)|update|
|show|reviewの詳細画面を表示する|有|R|edit|
|update|reviewを更新する|無|U|show|
|destroy|reviewを削除する|無|D|index|
Access2010の起動時にVBAを実行させる方法

# 手順
1. `メニュー`→`作成`→`マクロ`で**マクロを作成**する
2. **AutoExec**で保存する
3. `アクションの追加`で**プロシージャの実行**[^1]を選択する
4. **aaa()***みたいに関数名を設定する 
5. おわり

# 参考
http://qiita.com/nkmrtkhd/items/a51b3786d97bbb640691

# あとがき
マクロの追加した後、新しいアクションの追加に関数名を入れたり、緑のプラスを押したり使い方がさっぱりわかりませんでした。ボタンが多すぎます…。


# 補足
[^1]: アクションカタログでは、`マクロコマンド`→`プロシージャの実行`にあります。
Outlookの検索フォルダ条件で『過去○○日以内』

## はじめに
業務上メーラーを使用する際、受信トレイのフォルダ振り分け機能を使用して、
用件ごとにメールを分けることはよくやるTipsだと思います。
一方で、振り分けたものの全フォルダを通してみたい場面もあります。
Outlookでは、検索結果をアイテムとして保存し、それをお気に入りに入れておけば、欲しい条件で閲覧することが可能です。
## ハマりどころ
問題は、デフォルトに用意されている条件が『過去7日以内』。
これを『過去30日以内』にしたい場合、なかなかうまくいかない。
高度な検索条件で、「送信日時」「受信日時」に「以前」＆「30」「30day」でも検索できず。
## 解決方法
高度な検索条件で、「送信日時」「受信日時」に「以前」＆**「30 days ago」**と条件を入れる。

## 参照元
Outlookの検索フォルダ条件について - マイクロソフト コミュニティ
http://answers.microsoft.com/ja-jp/office/forum/office_2003-outlook/outlook%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%83%95/adc16e7b-df7a-4ca2-a1be-08889d00033e?auth=1

検索フォルダを作成する
http://office.microsoft.com/ja-jp/outlook-help/HA010038911.aspx

> 1. [カスタム検索フォルダ] を作成し、[条件] をクリックするところまで進みます。
> 2. [高度な検索] タブをクリックします。
> 3. [フィールド] → [すべてのメール フィールド] → [受信日時] と進みます。
> 4. [条件] → [以降] を選択します。
> 5. [値 (U)] に [30 days ago] と入力して、[OK] をクリックします。
[C#]クラス名の文字列からインスタンス作ったり、メソッド呼んだり

# クラス名の文字列からインスタンス作ったり、メソッド呼んだり

リフレクションを利用します。

```csharp
public class Character
{
    private Vector3 position;

    public Character()
    {
        this.position = Vector3.zero;
    }

    public virtual void Move()
    {
        this.position += Vector3.right * right * Time.deltaTime;
    }
}

public class Player : Character
{
}

public class Enemy : Character
{
}

void Main()
{
    string className = "Player";
    Type type = Type.GetType(className);

    // インスタンス作ったり
    Character character = (Character)Activator.CreateInstance(type);

    // メソッド呼んだり
    MethodInfo method = type.GetMethod("Move");
    method.Invoke(character);

    // 引数渡したい場合
    // Object[] args = { "A", "B", "C" };
    // method.Invoke("Hoge", args);
}
```
マークダウンのテーブル作成テスト

#テーブル１

|    No.    |    key1    |    key2    |
|:---------:|:----------:|:----------:|
|     1     |    FFFF    |    5     |
|     2     |    DDDD    |    1     |
|     3     |    EEEE    |    2     |
|     4     |    AAAA    |    100     |
|     5     |    BBBB    |    20     |
|     6     |    CCCC    |    7     |


#テーブル2
|    No.    |    key1    |    key2    |
|:---------:|:----------:|:----------:|
|     1     |    FFFF    |    1.2     |
|     2     |    DDDD    |    10     |
|     3     |    EEEE    |    0.4     |
|     4     |    AAAA    |    0     |
|     5     |    BBBB    |    200     |
|     6     |    CCCC    |    10     |
Sphinx + PlantUML、Windowsでの conf.py

導入に当たってさまざまのサイトを調べて以下のような記述を conf.py にしました。

```py:conf.py(before)
extensions += ['sphinxcontrib.plantuml']
plantuml = ['java', '-jar', 'C:\Program Files (x86)\PlantUML\plantuml.jar']
```

これで動いていたのですが、PC を変えてから以下のようにしないと動作しませんでした。

```py:conf.py(after)
extensions += ['sphinxcontrib.plantuml']
plantuml = '"C:\Program Files (x86)\Java\jre6\bin\java.exe" -jar "C:\Program Files\PlantUML\plantuml.jar" '
```

まず、配列ではなく文字列を渡すようにとのエラーが出ました。またこの環境には JRE の 6 と 8 が同居しているので、それもフルパスで指定しました。

このような設定例を書いてあるサイトは見かけなかったので、ここに記しておきます。

## 追記

もう面倒なので、コマンド（バッチ）を作って以下のようにしました。

```py:conf.py(recent)
plantuml = '"C:\Program Files\PlantUML\plantuml.bat" '
```

```bat:plantuml.bat
@ECHO off

::
:: PlantUML Execute
::

SET GRAPHVIZ_DOT="C:\Program Files (x86)\Graphviz2.38\bin\dot.exe"

SET CONFIG_FILE="C:\Program Files\PlantUML\config.txt"
SET PLANTUML_JAR="C:\Program Files\PlantUML\plantuml1.2017.15.jar"

java -jar %PLANTUML_JAR% -config %CONFIG_FILE% -charset UTF-8 %*
```
VALU-DOMAIN.COM のDNS設定でCNAMEを使う

# VALU-DOMAIN.COM のDNS設定（別ドメインのサブドメイン付き指定）
お名前.comと違って、VALU-DOMAIN.COM は、素のDNS設定なのでかなり面倒というかよく分からない場合も多いと負います。
単に別ドメインをCNAMEが設定したいだけなのに四苦八苦・・・。

で、じゃあどうすればいいかというと、
>　http://setup.value-domain.com/index.php?p=websrv

端的にはココにかいてあります。
　→　最後の「.」ピリオド重要です

```
CNAME www2 www.hoge.exp.co.jp.
```
これで、VALU-DOMAIN.COM に預けてあるドメインの、wwwが別名定義されます。
　→　繰り返しますが「`.`」ピリオド重要
「`.`」付けないと、待てど暮らせど別ドメインで名前解決してくれません。

あとは、手持ちのWinマシンからでもNSLOOKUPして設定が反映されるのを待ちましょう。

という感じです。
PHP ソース改善Tips

日々の中でシンプルに出来たコードをメモ的に貼っておこうと思います
パフォーマンス的な話もあるので採用するかはバランス次第

## 連想配列のKeyの有無でマージor追加

ある配列の内部に要素をマージしたいのですが、そのkeyがない場合があるのでその時には追加にしたい。

### 元のソース

keyが存在しないためarray_mergeの第一引数に記述するとエラーになるのでifで分岐していました

```php

// $origin には $origin1 or $origin2 の２つのパターンが入ることがある(ユーザー入力など）
$origin1 = array(
  'key1' => array(
    'originHoge' => 'originFuga',
  )
);
$origin2 = array(
  'key2' => array(
    'foo' => 'bar',
  ),
);

// key1には追加で情報を付与したい
$additional = array(
  'hoge1' => 'fuga1',
  'hoge2' => 'fuga2',
);

if (isset($origin['key1'])) {
  $origin['key1'] = array_merge($origin['key1'], $additional);
} else {
  $origin['key1'] = $additional;
}
```

### 改善したソース

追加用配列にもkeyを記述しておき `array_merge_recursive` を用いると`if...else句`を記述する必要がなくなりました。同様のことを2回以上やってたりした場合は見通しが断然良くなりました。

```php
// originは同じものを想定
$additional = array(
  'key1' => array(
    'hoge1' => 'fuga1',
    'hoge2' => 'fuga2',
  ),
);

$origin = array_merge_recursive($origin, $additional);

```
htmlファイルを編集してもブラウザ上で反映されないときの対処メモ (vagrant)

####環境
vagrant上のCentOS7
Server version: Apache/2.4.6 (CentOS)
####問題
- htmlファイルを編集してもブラウザ上で反映されない
- ブラウザキャッシュを消しても同様
- 対象のファイル名を変更すると反映される

よって、ブラウザ上のキャッシュではなくサーバ側のキャッシュが更新されていない

####対処
以下のファイルに設定追加
/etc/httpd/conf/httpd.conf


```
<Directory 対象のディレクトリパス>
EnableMMAP Off
EnableSendfile Off
</Directory>
```

確認してapache再起動

```shell-session
$ sudo apachectl configtest
$ sudo systemctl restart httpd
```

####原因
DocumentRootをvagrantの共有ディレクトリにしていたために起きた事故らしい.

なのでネットワークマウントしていると正常に動かないEnableMMAP, EnableSendfileをオフに.
####参考
http://qiita.com/sugiii8/items/233e88aa26f00b290f38
https://www.neko6.info/archives/203
http://tipshare.info/view/4f3481ee4b21227814000001
Javaの問題をTypeScriptにしてみる4-1

4-1.次のプログラムを実行した際の結果を選びなさい

```java:java4-1.java
public class Main{
  public static void Main(String[] args){
    int[] array = new int[0];
    System.out.println(array);
  }
}

```


```ts:ts4-1.ts
    var array:number[] = [];
    console.log(array);
```

A.0が表示されている
B.nullが表示されている
C.何も表示されない
D.{}が表示される
E.ハッシュコードが表示される
F.コンパイルエラーが表示される
G.実行時に例外がスローされる


java側の答えは：E
tsではこの場合「array[0]」と表示されます。
tsでハッシュコードを見るのはおそらく無理ですね。
cinder::CameraUiでマウスぐりぐりカメラ操作

oFでいうところの[ofEasyCam](http://openframeworks.cc/documentation/3d/ofEasyCam/)．

![cameraui.gif](https://qiita-image-store.s3.amazonaws.com/0/14845/e8c67947-6e03-2026-1c65-999e5fe2025c.gif)

（gifアニメは[CameraPerspサンプル](https://github.com/cinder/Cinder/tree/v0.9.0/samples/CameraPersp)を動かしたやつ）


## かんたん3ステップ
### `CameraPersp`と`CameraUi`を用意します

```cpp
#include "cinder/CameraUi.h"

class AwesomeApp : public App {
public:
  // snip.

  CameraPersp camera_;
  CameraUi camera_ui_;
}
```

### `CameraPersp`のインスタンスを`CameraUi`に喰わせます

```cpp
void AwesomeApp::setup() {
  // snip.

  camera_ui_ = CameraUi(&camera_);
}
```

コンストラクタでやってもいい．

```cpp
AwesomeApp::AwesomeApp()
  : // snip.
  , camera_ui_(camera_)
{}
```

どこでやってもいい．

### `mouseDown`と`mouseDrag`のイベントを`CameraUi`に喰わせます

```cpp
void AwesomeApp::mouseMove(MouseEvent event) {
  camera_ui_.mouseDown(event);
}

void AwesomeApp::mouseDrag(MouseEvent event) {
  camera_ui_.mouseDrag(event);
}
```

`mouseWheel`もある．カメラの距離をぐりぐり変えることができるよ．

```cpp
void AwesomeApp::mouseWheel(MouseEvent event) {
  camera_ui_.mouseWheel(event);
}
```

[APIドキュメント][cameraui]によるともうちょいいろいろ喰わせることができるらしい．

### `CameraPersp`のインスタンスを`setMatrices()`します

```cpp
void AwesomeApp::draw() {
  gl::setMatrices(camera_);
}
```

## `CameraUi`はなにやってんの
`CameraPersp`をラップして，`MouseEvent`見ていい感じに`CameraPersp`のパラメータをいじれるようなメソッド持たせただけ．
https://github.com/cinder/Cinder/blob/v0.9.0/src/cinder/CameraUi.cpp

## References
- [CameraUi][cameraui]

[cameraui]: https://libcinder.org/docs/classcinder_1_1_camera_ui.html
シェルスクリプトの冒頭でbashを明示する（提案）

実行可能なシェルスクリプトの冒頭には、「シバン」というインタプリタの指定行がありますが、ここで`#!/bin/bash`のように明示するのも1つの方法じゃないか、と思いました。

# 対象読者

シェルスクリプト冒頭の`#!/bin/sh`について、

* 単なるコメントだと思っている人
* 「おまじない」として書いている人
* `/bin/sh`がどんなシェルなのか知らない人

# シバン行とは

スクリプトファイルの冒頭を`#!`にして、その後にファイル名を書いておくと、実行属性を付けてファイルを実行できるようになります。この冒頭行を「シバン」といいます。

もちろん、`#!/bin/sh`のようなシェルスクリプトに限られるものではなく、Perl、Python、Rubyなどテキストで書くスクリプトでも同様に実行可能となります。

# `/bin/sh`って？

一般には、シェルスクリプトのシバン行は`#!/bin/sh`と書きます。POSIXでもこの位置においてあるというように、Unix系の多くの環境で実行しようと思えば、最大公約数的に`sh`を使う必要があります。

シェルスクリプトが主体的に仕事をする場合、POSIX shとPOSIXの範囲内のコマンドを使って書けば、どんな環境に持っていっても通用するツールを作ることができます。

とはいえ、シェルスクリプトを使う例としては、「シェルスクリプト自体で1つの機能を実現する」というより、「既存のプログラムをつないで自動実行させるために、シェルスクリプトとしてコマンドを並べる」というような例も多いかと思います。入っているコマンドどころか、下手をすればファイルやディレクトリの位置にすら依存する、そのようなシェルスクリプトに、「`#!/bin/sh`の範囲内で書け」と言ったところで、縛りプレイになる以上の実用的な意味は見込めません。

# bash明記のメリット

`#!/bin/bash`のようにしてbashを使うことを明示することで、Bash固有の機能を**堂々と**使えるようになります。

* `(())`による式展開
* `[[]]`による高度な比較機能
* `配列変数`
* `<(コマンド)`のようにして、コマンドの結果をリダイレクト

シェルスクリプトの実行制御は多くが記号によることもあって、眺めても「これはbash特有だ」と気づきにくいものです。Ubuntuでも、`/bin/sh`をbashからdash（拡張機能は少ない）に変更したところ、`#!/bin/sh`なのにbash固有の記法で書いていてうまく動かなくなるシェルスクリプトが多発して問題となったことがあります。

上のようにうっかり書いてしまうこともありますし、独自拡張は「便利だから」入れているものですので、どうせ移植性、永続性の期待できないようなスクリプトであれば、限定するのも合理的かなと思います。
WKWebView で http://~~ サイトが表示されない


## 原因: ATSにより https のサイトしか表示できない

iOS9.0 よりATS(App Transport Security) と呼ばれるセキュリティのポリシーが理由でHTTPSしかデフォルトで表示出来ない。


## 解決策: NSAppTransportSecurity に NSAllowsArbitraryLoads を true で追加する


```info.plist
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
```


GUIで設定する場合

![kobito.1472166477.869057.png](https://qiita-image-store.s3.amazonaws.com/0/10012/a7befe45-9ad8-a1f2-f382-4d4e26d7308c.png "kobito.1472166477.869057.png")


他に個別のサイトを指定する方法も有るらしい
addObserver:forKeyPath:options:context: リファレンスを調べた


特定のプロパティの値の変更を監視できる。

## ```addObserver:forKeyPath:options:context:```

Registers anObserver to receive KVO notifications for the specified key-path relative to the receiver.

```
func addObserver(_ observer: NSObject,
      forKeyPath keyPath: String,
         options options: NSKeyValueObservingOptions,
         context context: UnsafeMutablePointer<Void>)
```

## Parameters

### anObserver	
>The object to register for KVO notifications. The observer must implement the key-value observing method ```observeValueForKeyPath:ofObject:change:context:```.

KVO通知にオブザーザとして登録されるオブジェクト。このオブジェクトはKVOメソッドの ```observeValueForKeyPath:ofObject:change:context:``` を実装してなければならない。

### keyPath	
> The key path, relative to the receiver, of the property to observe. This value must not be nil.

監視するプロパティの key path です。必須です。
(key path はプロパティ名を文字列で指定する)

### options	
> A combination of the NSKeyValueObservingOptions values that specifies what is included in observation notifications. For possible values, see NSKeyValueObservingOptions.

監視したい通知を含んだ ```NSKeyValueObservingOptions``` の組合せです。 ```NSKeyValueObservingOptions``` を指定します。


### context	
> Arbitrary data that is passed to anObserver in observeValueForKeyPath:ofObject:change:context:.

```observeValueForKeyPath:ofObject:change:context:``` に送られる仲裁データです。


### Discussion
> Neither the receiver, nor anObserver, are retained. An object that calls this method must also call either the removeObserver:forKeyPath: or removeObserver:forKeyPath:context: method when participating in KVO.


レシーバもオブザーバも保持(retain)されません。KVOを利用してこのメソッドを呼び出すオブジェクトは ```removeObserver:forKeyPath:``` または ```removeObserver:forKeyPath:context:``` も呼び出す必要が有ります。