OmniAICreator/Qiita-1.07M huggingface dataset:
jQuery ドラッグアンドドロップで「並び替え」と「入れ子関係変更」の両方ができるメニュー画面を作りたい

#概要
ドラッグアンドドロップで「**並び替え**」と「**入れ子関係変更**」の両方ができるメニュー画面を作りたいと思い、jQuery UIのsortableとdroppableを組み合わせてみました。ところが、この2つの組み合わせではうまくいかなかったのでdroppableの部分だけ自前で作りこみました。完成イメージは以下のように動作するUIです。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/78230/445bad67-5cb1-427b-c25e-df80e6120443.gif)

#失敗したアプローチ
単純にjQuery UIのsortableとdroppableを組み合わせてうまくいくと思いましたが、sortableで要素が移動した後の位置にdropすると「**移動前にその位置にあった要素にdropされた**」と認識されてしまい、「**droppableが動作してしまう**」といった問題が発生しました。droppableの仕様をきちんと調べていませんが、drag開始前にdrop対象の座標を保持するのかもしれません。

#成功したアプローチ
droppableの使用を止めて、(1)drag対象、(2)drop対象、(3)マウスポインタの**3つが重なっている状態**でsortableの動作が終了(stop)した際に、dropされたと認識するようなロジックを作成しました。

##成功コード例

```html:example.html
<nav>
  <ul class="nav-sites sortable">
    <li class="nav-site" data-id="35" data-type="Sites">
      <a href="/items/35/index">folder 1</a>
    </li>
    <li class="nav-site" data-id="37" data-type="Sites">
      <a href="/items/37/index">folder 1-1</a>
    </li>
    <li class="nav-site" data-id="36" data-type="Sites">
      <a href="/items/36/index">folder 2</a>
    </li>
  </ul>
</nav>
```

```js:SiteMenu.js
$(function () {
    $('.nav-sites.sortable').sortable({

        // sortableの動作終了
        stop: function (event, ui) {

            // ドラッグ中の要素のデータを取得
            var siteId = ui.item.attr('data-id');

            // ドラッグ中の要素以外でマウスポインタと重なっている要素を取得
            var $element = getHoveredItem($('.nav-site:not([data-id="' + siteId + '"])'));

            // マウスポインタと重なっている要素があるか？
            if ($element) {

                // ドラッグ中の要素を非表示にする
                ui.item.hide();

                // 「入れ子関係変更」の処理を記述（サーバサイドにデータ送信）
                //
                //
            }
        },

        // sortableにより順番が入れ替わった
        update: function () {

            // 「並び替え」の処理を記述（サーバサイドにデータ送信）
            //
            //
        }
    });
});
```

```js:Position.js
var mouseX;
var mouseY;

// マウス移動時にマウスポインタのXY座標をメモリに保持
$(window).mousemove(function (e) {
    mouseX = e.pageX;
    mouseY = e.pageY;
});

// マウスポインタが重なっている要素を返却
function getHoveredItem($elements) {
    var $element;
    $elements.each(function () {
        if (isHover($(this))) {
            $element = $(this);
            return false;
        }
    });
    return $element;
}

// マウスポインタが重なっているか判定
function isHover($element) {
    var left = $element.offset().left;
    var top = $element.offset().top;
    var right = left + $element.outerWidth();
    var bottom = top + $element.outerHeight();
    if (mouseX >= left &&
        mouseX <= right &&
        mouseY >= top &&
        mouseY <= bottom) {
        return true;
    } else {
        return false
    }
}
```

##補足
マウスが重なっているdrop対象を :hover で取得しようとしましたが、こちらはdrag中の要素の下に隠れてしまうため :hover が反応しませんでした。そのため**マウスポインタの位置で判定するロジック**にしております。このあたり、もう一工夫すればシンプルな作りにできそうな気がしています。

#ご参考
下記プロジェクトで使用しています。ほかにも実装例などがありましたら情報交換お願いします。
https://github.com/Implem/Implem.CodeDefiner

コード例のJavaScriptファイルはこちら。
https://github.com/Implem/Implem.CodeDefiner/tree/master/Implem.Outputs/Scripts
インフラエンジニアがSaaSサービスを運営してて気づいたこと

障害対応管理ール「[Reactio](https://reactio.jp/)」というSaaSサービスを起案からローンチし運営していて気づいたことを、ランキング形式でお伝えしていきます。（そのランキングの統計的数字ってどうなのよ？って疑問を抱くかと思いますがローンチしてまだ7ヶ月くらいのツールで、まだまだ胸を張れるような母数ではないのでナイショですw）



簡単に自己紹介（ここは気兼ねなく読み飛ばしてOK）
Gaiaxには2007年に入社して、7年半に渡って社内インフラと自社サービス向けインフラと、受託開発系インフラ、要はインフラっぽいところすべて担当してました。今は、その7年半ずっと障害対応をしてきてその課題を解決するために開発したツールを、社内スタートアップとしてSaaSサービスの運営に取り組んでいます。
趣味は、ゲームとバイクと写真（カメラ）と、障害対応です。

## 「Reactio」を導入した理由TOP3

スタートアップの初動は、本当にイノベーター理論における「イノベーター」と「アーリーアダプタ」からしか反応がない。さらに課題や価値に共感してもらえると人（組織）にしか利用してもらえないんですよね。
その限られた母数の中で、共感して頂いて導入した理由のTOP3です。

1. まさにこれが欲しかったですね
	- 最初は自社の課題を解決するために特化して開発したのをサービス化する上で最低限必要な箇所を改修して提供していただけあって、同じ課題をお持ちの企業は、「こういうの作ろうと思ってましたよ〜」と言っていただくことが多いです。
2. 電話で通知くれるのいいですね
	- 障害対応で監視ツールの通知に気づかない（気づけない）問題は多くて、「たまに気づけないですね！ハハハ！」でなんとかなるところと、「確実に検知と対応するために24時間/365日体制の部門あります！」の大企業の中間の組織がご利用頂いてます。
	- PagerDutyとかを利用しているところも多いようですが、日本語で利用できないのとコストがそれなりに高いので導入しないところが、「Reactio」をご選択してるように見受けられます。
3. 障害対応の蓄積を最適化したいですね
	- RedmineなどのBTSのチケットや、各種情報管理ツールのWikiとかに蓄積してたけど、もっとちゃんと蓄積していかないと意味ないなぁと感じているところが、導入して頂いています。

スタートアップ初期で「アーリーマジョリティ」にいくら営業をかけても、箸にも棒にもかからないんです。なので、そのアーリーアダプタ層のチャネルを見つけるためのマーケティングが重要だし、それがまた難しいところでもあります。

## SaaSサービスだからNGな理由TOP3

WEB系の企業にいると、「[Qiita](http://qiita.com/)」や「[Github](https://github.com/)」とか「[Backlog](http://www.backlog.jp/)」とか「[Mackerel](https://mackerel.io/ja/)」など価値が高くコストが低いSaaSサービスを使うのが当たり前感覚になってしまっていました。
でもそれは全然マジョリティじゃないんですよね。むしろ社会全体でいえばマイノリティなのかもしれません。なので、SaaSサービスだからって断れれるケースもあり、その理由をご紹介。

1. 情報管理の問題
	- 組織内のインフラかプライベートクラウドにしか、情報を記録してはいけないっていうルールがある場合には絶対に無理です。妥協点を探すと必ずインストール型のツールならとお声かけ頂きますが、メンテが行き届かずにご迷惑おかけするので丁重にお断りさせて頂いております。
2. 知名度の問題
	- 「[SalesForce](http://www.salesforce.com/jp/)」とか、大企業の◯◯さんも使ってるとか実績がないと、到底無理っとバッサリ切り捨てられることもしばしばあります。それこそ「レイトマジョリティ」なので、スタートアップの初期段階では無理な話ですね。
3. Microsoftの問題
	- Microsoft（以下、MSと省略）のActiveDirectory（以下、ADと省略）環境を活用したソリューションをどっぷり導入されている企業は、まずMSで似たようなツールがあればそれを使う。なければAD連携していないとアカウント管理できないので無理ですと言われてしまいます。
	- そういう組織は大抵大きめの企業がほとんどなので、契約してもらえると数千人規模の導入だし「じゃあ、AD連携しちゃえばいいかも！」と、ついつい思ってしまいがちです。しかしAD連携しても導入する確証もなければ、そもそも導入検討自体に非常に時間がかかるので、気軽に判断できないと考えています。

ついつい組織の知名度や数に囚われてしまいサービスやプロダクトの本質から外れてしまうことがあります。大抵そういう時は、チームメンバーからの疑問や指摘で気づかされることが多いですね。感謝です。

## 「Reactio」が共感されないときTOP3

偉人たちや先輩には気にするなと言われるが、スタートアップの時ほど課題や価値に共感されないと辛いし不安になってしまうことが多々あります。共感されない事実を受け止めなくても良いケースの見極めてから、私は平気になりました。その受け止めなくても良いケースのTOP3です。

1. そもそもシステム運用保守担当者じゃないとき
	- 提案したい企業がいて同僚や知り合いから紹介してもらうケースだとたまにあるのですが、仮説を立てたペルソナと離れていると「面白いですね！」とは言われても紹介しておきますね！で、終わってしまいます。
	- 本当にただお付き合いでお話しを聞いていただくだけになってしまうので、最近は「◯◯社の人と会えるぞ！」と浮かれてしまわないように気をつけてます。（各方面でご迷惑おかけしました！）
2. メインのサービスやプロジェクトがひとつのとき
	- 単一サービスで大成功している組織の場合には、環境をそのサービスに最適化しやすいのがとても特徴的です。
	- 「Reactio」のようなスタートアップとして取組んでいる課題や提供している価値は、サービスに合わせて組織や環境で最適化されてしまっているケースが多いです。逆に詳しくヒアリングさせてもらえた時の学びは大きいです。
3. スタートアップな組織のとき
	- まだ組織の人数が少ない場合には、小回りが利くのでシステム運用開発もダイナミックなケースが多く、事業のコア以外は本当に必要最低限にしておくことが多いのが特徴です。
	- 意思の疎通も図りやすく連絡体制や情報の蓄積が散漫にならないので、「いずれ必要になりそうですね。」で言われますが、スタートアップこそSaaSサービスを利用して楽することが必要だと感じるので、感慨深いです。

簡単ではありますが、スタートアップとして取組んでる中での気づきをご紹介させて頂きました。もちろんサービスやプロダクトによって、ケースは様々なので参考になるもかわからないですが、すこしでも読み物として興味を持って頂けていたら幸いです！
Office UI Fabricのテーブル表示

13日目(もう昨日だけど……)はOffce UI Fabric(以下"OfficeUI")のテーブル表示について解説します。

HTMLにもTABLEタグがありますが、OfficeUIにもテーブル表示を行うCSSクラスが用意されている、という位置付けです。簡単なサンプルとして、九九の表をOfficeUIのテーブルを使用して表示してみました。以下のような表示になります。

![img700.png](https://qiita-image-store.s3.amazonaws.com/0/61137/f4f0be11-8a03-9bd9-70da-c61182e2d9a5.png)

サンプルソースコードは以下になります。

```html
<!DOCTYPE html>
<html ng-app="App">
  <head>
    <meta charset="utf-8" />
    <title>Table Sample</title>
    <link rel="stylesheet" href="//appsforoffice.microsoft.com/fabric/1.0/fabric.min.css">
    <link rel="stylesheet" href="//appsforoffice.microsoft.com/fabric/1.0/fabric.components.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
  </head>
  <body ng-controller="AppController">
    <div class="ms-Grid">
      <div class="ms-Grid-row">
        <div class="ms-Grid-col ms-u-sm6 ms-u-md8 ms-u-lg12">
          <div class="ms-Table">
            <div class="ms-Table-row" ng-repeat="xdata in data">
              <span class="ms-Table-cell" ng-repeat="ydata in xdata">{{ydata}}</span>
            </div>
          </div>
        </div>
      </div>
    </div>
    <script>
      var app = angular.module('App', []);
      app.controller('AppController', ['$scope',
        function($scope) {
          $scope.data = [];
          for (var x = 1; x <= 9; x++) {
            $scope.data.push([]);
            for (var y = 1; y <= 9; y++) {
              $scope.data[x-1].push(x * y);
            }
          }
        }
      ]);
    </script>
  </body>
</html>
```

使用方法は以下のように、「ms-Table」がテーブル全体、「ms-Table-row」が行、「ms-Table-cell」が列になります。HTMLのTABLE,TR,TDタグ
で良いのでは……
と同じような感じで使用します。

```html
<div class="ms-Table">
  <div class="ms-Table-row">
    <span class="ms-Table-cell">aaa</span>
  </div>
</div>
```

## おまけ

ちなみに、これまでの[Office UI Advent Calednar](http://qiita.com/advent-calendar/2015/officeui)で使用したサンプルプログラムをBitbacketで公開しました。以下のURLからサンプルプログラムを動かしてみることができます。

 * Office UI Advent Calendar 2015サンプルプログラム
   * [http://furandon_pig.bitbucket.org/sample/officeui/advcal2015/](http://furandon_pig.bitbucket.org/sample/officeui/advcal2015/) 

## まとめ

OfficeUIのテーブルについて解説しました。正直Bootstrapのテーブルと比べると指定可能なクラスが少ない感じがします。Bootstrap的なtablle-condensed的な表示が必要な場合は、自分でCSSを定義することになりそうです。

## 参考URL

 * [Table](http://dev.office.com/fabric/components/table)
Golangで画像をglitchできるライブラリの紹介

# この記事は
Go Advent Calendar 11日目の記事です。
大遅刻でした。すみません。

# 目次
- 経緯
- glitchとは
- 良いライブラリがあったので紹介

# 経緯
goってbyteの制御とかも結構簡単だし、imageライブラリ周りの処理とかあんまり書いたこと無いし、glitchやってみたら楽しいかなと思って実装していたところ、
参考になるサンプル探してたら使えるライブラリ見つけちゃって、もうこれで良いんじゃないかと思った話です。

# glitchとは
端的に言うと、画像を意図的に壊して面白い効果を狙うものです。

http://www.osadagenki.com/gvgas/ja/about-glitch-art/
http://makimoto.hatenablog.com/entry/rubykaigi2013
この辺が文献としては詳しく、

https://speakerdeck.com/makimoto/the-pragmatic-glitch-number-rubykaigi-2013-lt
このスライドが知らない方にはめっちゃわかりやすい。

# Goでglitchできるライブラリの紹介
## github.com/makimoto/glitch/
https://github.com/makimoto/glitch/

上記で紹介したスライドの、makimotoさんが作られたglitchライブラリ。
imageライブラリ使わずにbyte型で読みだして、ヘッダとフッタの指定分だけ取り除いて、処理した後またヘッダとフッタを戻すような処理をやってます。
データベンディング的なグリッチで、コントロールできないですが、とってもいい感じに壊れます。

## github.com/darkliquid/glitch
https://github.com/darkliquid/glitch

http://www.airtightinteractive.com/demos/js/imageglitcher/
このJSで書かれたglitchアルゴリズムのgolangによる再実装。
データベンディングというよりは画像処理ベースで実現していて、ループして色変えて貼り付け、みたいなことを繰り返してます。

# 学び
- 探せばやりたいことできるライブラリがあるので、探して中身見てみると楽しい
- golangはgithub上でエコシステムができているので、github上で検索するだけでもサンプルコード見つけられるし学びがある
- 時間があるときに、image型でインポートした後、中身をbyteで処理して、image型として戻す、上記のライブラリの中間くらいの処理を作りたい
gitでコミットログをブランチ分岐点だけ表示するコマンドを作った（分岐元ブランチを調べるために）

この記事は[ACCESS Advent Calendar 2015](http://qiita.com/advent-calendar/2015/access) 14日目の記事です。

gitを使っていて、レビューなどで他の人が作ったブランチを見るときに、「このブランチはどのブランチから分岐したものなのだろう？」と思うことが時々あります。
こう思うとき、知りたいのは分岐元ブランチ名であって、ブランチを切った後のコミットの内容などはこの時点においてはむしろ邪魔に思ってたりしました。
この欲求に対し、これまで満足のいく方法が見つかっていませんでした。
「方法が無いならコマンドを作ろう」ということで、コマンドを作りました。

https://github.com/aiaeio/git-show-branching-commits

上記githubリポジトリから git-show-branching-commits ファイルをダウンロードして、PATHが通ったところに置いてください。
それにより、gitで `show-branching-commits` コマンドが使えるようになります。
試しに `git show-branching-commits -h` でこのコマンドのhelpを表示させてみてください。

例として、 http://cgit.freedesktop.org/cairo/ のリポジトリで origin/master とリモートブランチに対して実行した結果は以下の通りです。
origin/master に至るまでの途中から分岐している各リモートブランチに対し、それらの分岐点となるコミットを示しています。
<pre>
$ git show-branching-commits -r origin/master
showing logs to origin/master
db8a7f1 1.15.2 release
  -> origin/HEAD
     origin/master
e7acf4b pattern: allow for a floating one pixel rounded difference.
  -> origin/color-emoji
f6fd372 pattern: Restore dropped inclusion of cairoint.h
  -> origin/1.14
59e2a93 Post-release version bump
  -> origin/1.12
c84730d version: Post release version bump
  -> origin/1.10
de7270c [cairo] Describe the restrictions upon cairo_set_tolerance()
  -> origin/1.8
44e6cdd Increment version to 1.6.5 after the 1.6.4 release
  -> origin/1.6
107a748 Increment cairo version to 1.4.10 (and libtool versioning to 13:5:11)
  -> origin/1.4
a5f068e [test] Add 128 to any diff component such that differences are visible
  -> origin/1.2
568ce86 Increment CAIRO_VERSION to 1.1.1 after making branch tag BRANCH_1_0.
  -> origin/1.0
</pre>

もっと直感的に分かりやすい表示にできればと思うのですが（汗

第2引数以降にブランチ名やタグ名などを列挙することにより、第1引数と比較するコミットを指定できるので、grepやpecoなどとxargsとを組み合わせて使いやすいようにしています。
また `--table` オプションを付けることにより、スクリプト処理しやすい形式で出力します。
例えば `1.1` にマッチするリモートブランチに限定して実行すると、
<pre>
$ git branch -r | grep -F '1.1' | xargs git show-branching-commits --table origin/master
158 origin/1.14 f6fd372a8b31a0bebbdfe36090d6ffc7bab9a2f8
389 origin/1.12 59e2a93b3c8a7b83d537bb2a4bbdd5f0f36a0cbc
2438 origin/1.10 c84730d88983623dddd6b9980d82648b7297444d
</pre>
出力の1列目は origin/master との間のコミット数、2列目はブランチ名、3列目は分岐点であるコミットのハッシュです。

以上、自作のgitコマンドの紹介でした。
RaspberryPi2にAnsibleでfluentdをインストールしてServerspecでテストする

この記事は[Ansible Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ansible)の14日目の記事です。

![20151112090540.jpg](https://qiita-image-store.s3.amazonaws.com/0/59581/fcb31647-7ce2-61dd-f6f2-7aed60c2681e.jpeg)

新しく買ったRaspberryPi2に[fluentd](http://www.fluentd.org/)をインストールしました。

その際にインストールなどの作業をAnsibleで自動化したので公開します。

- Github
  - [リリースタグ(v1.0.0)](https://github.com/mia-0032/raspberrypi-fluentd-ansible/releases/tag/v1.0.0)
  - [ファイル一覧](https://github.com/mia-0032/raspberrypi-fluentd-ansible/tree/4ab1ebe8fe9957e3c56e34252553b715b81df26d)

### 使ったもの

- [Ansible](http://www.ansible.com/)
  - 構成管理ツール
    - YAMLファイルにサーバーの構成情報(必要なソフトウェアなど)を記載しておくと、その通りにサーバーを設定してくれるツールです。
- [Serverspec](http://serverspec.org/)
  - サーバー自動テストツール
    - サーバーのあるべき状態(どのプロセスが動いている、など)をRubyのコード(といってもほとんどDSL)として書くことで、サーバーの状態があるべき状態になっているかチェックしてくれるツールです。
- [Ansible-spec](https://github.com/volanja/ansible_spec)
  - Serverspecのテスト実行先の指定として、Ansibleのinventoryファイルに書かれているホストを利用できるようにするパッケージです。

### 設定内容 

スクリプトを流すことで、以下の設定を自動で行い、さらに正しく設定されているかテストしてくれます。

- roles/common
  - aptパッケージのアップデート
  - Raspberry Piのファームウェアのアップデート
  - Linuxの基本的な設定
    - 時刻・言語を日本語へ
    - ファイルディスクリプタの最大値を上げる
    - ntpd, iptableの起動・設定
    - sshdのセキュリティ設定
- roles/rbenv
  - rbenv / rubyのインストール
- roles/supervisord
  - supervisordのインストールと起動
- roles/fluentd
  - fluentdのインストール
  - 基本的なプラグインのインストール
  - supervisordによるデーモン化

冪等性があるので、何回流しても問題ありません。
ただしパッケージ・ファームウェアなどは最新版へアップデートされます。

### 使い方

#### 準備

1. Raspberry PiへRasbian OS(WHEEZY)をインストール
1. 公開鍵認証でアクセスできるように設定
1. `git clone git@github.com:mia-0032/raspberrypi-fluentd-ansible.git`
1. `raspberry_pi.sample`ファイルを`raspberry_pi`へリネームし、RaspberryPiのホスト、SSHポート、SSHユーザーを変更する。
1. もしPC側にAnsibleやServerspecが入ってない場合はインストールする。

```shell
$ pip install -r requirements.txt
$ bundle install
```

#### 実行

PCで以下のコマンドを実行します。

```shell
$ ansible-playbook -i raspberry_pi site.yml
$ bundle exec rake serverspec:fluentd
```

全部OKかChangedであれば成功です。

初回実行時はRubyのビルドに非常に時間がかかる(1時間くらい?)ので注意してください。

### まとめ

- 自動化しておくと、OSを再インストールする時に非常に便利です。
- コードに落とし込んでおくことで、しばらく経ったあとに、どんな設定したのか忘れてしまう恐れもなくなるので良いですね。
Tweet数表示をMilkcocoaで再現する

急きょ1枠前が空いてしまったようなので詰めます。なので荒い感じの記事です。

# 概要
TweetボタンのTweet数が2015年11月20日に廃止されました。それを表示させようというものです。

# きっかけ
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">最近廃止された「Webサイトのtweet数をカウントするもの」をmilkcocoaを使って作ろうかと思ったけど、条件にあったデータを取得するのには向いてなさそうかも。でも、データベース用意するの面倒だからmilkcocoaで作ってみよ。</p>&mdash; あんどう (@t_andou) <a href="https://twitter.com/t_andou/status/675567420870803456">2015, 12月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

このアイデアをまるまるいただいちゃいました。ホントすいません。問題あったら削除します。

# 参考
https://dev.twitter.com/web/tweet-button
http://dev.classmethod.jp/ria/html5/customization-tweet-button/

# 作ったもの
デモ
https://hyakuson.github.io/TweetCountByMilkcocoa/

コード
https://github.com/hyakuson/TweetCountByMilkcocoa/tree/gh-pages

もろもろ後回しにしてるんで今はクリックした回数が表示されるだけです。誰かCSS助けて！あとクリック数じゃなくてツイートされたらカウントしたほうがいいのかもね！

# 使い方とか
ライセンスとか確認してないし、まだコード1か所にまとめられてないですが…。
`index.html`の`<a>`タグとjs、`index.js`のjsを適当な場所に配置すればいいと思います(雑)。
`<a>`タグの属性をちょろっといじればハッシュタグとかも変えられるはずです。
あとMilkcocoaのDataStoreを自前で用意したほうがいいかもしれないです。デモで使ってるやつはそのうち使えなくするかもしれないです。
Arch Linuxにxmonadを導入する

[xmonad](http://xmonad.org/)はX Window System上で起動するタイル型ウインドウマネージャーです。
GUIではあるものの、多くの操作をキーボードからの入力で実現することができます。
Haskellで書かれており、設定もHaskellで行います。

xmonadの公式ページの画像
![xmonadの公式ページの画像](https://wiki.haskell.org/wikiupload/a/aa/Screen-triplehead-galois.jpg)


今回はインストール直後のArch Linuxにxmonadを導入します。
ディスプレイマネージャーを入れずに最小限の構成にしようと思います。

## 手順
1. Xをインストールする
2. xmonadをインストールする
3. Xの設定をする
4. ログイン後にXが自動的に起動するように設定する
5. xmonadを起動させてみる

## Xをインストールする
基本的にはwikiの通りにインストールすればよいです。
https://wiki.archlinux.org/index.php/Xorg

Xについては、こちらの記事でざっくりと説明しています。
[Arch LinuxにGNOMEでデスクトップ環境を構築する](http://qiita.com/siwamoto/items/c27ef41ed3390d886d0d)

今回は、Xに関する説明はなしでインストール手順だけ書いていきます。

#### パッケージをインストールする
pacmanでインストールします。

```
$ sudo pacman -S xorg-server xorg-server-utils xorg-xinit
```

#### ビデオドライバをインストールする
ビデオドライバをインストールします。
搭載されているビデオカードの種類を確認。

```
$ lspci | grep -e VGA -e 3D
```

intelのビデオカードだったので、それに対応するビデオドライバ(対応表は上述のwikiにあります)をインストールします。

```
$ sudo pacman -Ss xf86-video-intel
```

#### タッチパッドのドライバをインストールする
使っているPCのタッチパッドがSynaptics Touchpadなので、このドライバをインストールします。
参考: https://wiki.archlinux.org/index.php/Touchpad_Synaptics

```
$ sudo pacman -S xf86-input-synaptics
```

Xがインストールしたドライバを使ってくれるように```/etc/X11/xorg.conf.d/50-synaptics.conf```を追加します。
下記は最小限の構成です。

```/etc/X11/xorg.conf.d/50-synaptics.conf
Section "InputClass"
    Identifier "touchpad"
    Driver "synaptics"
    MatchIsTouchpad "on"
EndSection
```

## xmonadをインストールする
これもwikiの通りにインストールすればよいです。
https://wiki.archlinux.org/index.php/Xmonad

```
$ sudo pacman -S xmonad xmonad-contrib
```

## Xの設定をする
``startx``でXを起動したときにxmonadが自動的に起動するように、```~/.xinitrc```を編集します。
参考: https://wiki.archlinux.org/index.php/Xinitrc

まずは```/etc/X11/xinit/xinitrc```を```~/.xinitrc```にコピーします。
これにより、Xのデフォルトの設定を崩さずに済みます。

```
$ cp /etc/X11/xinit/xinitrc ~/.xinitrc
```

そして、xmonadを起動させるように書き換えます。
デフォルトでは```twm```とか```xterm```が起動するようになっていますが、これらはコメントアウトしておきます。

```~/.xinitrc
...

# twm &
# xclock -geometry 50x50-1+1 &
# xterm -geometry 80x50+494+51 &
# xterm -geometry 80x20+494-0 &
# exec xterm -geometry 80x66+0+0 -name login
exec xmonad
```

これでXが起動するときにxmonadも起動させてくれます。

## ログイン後にXが自動的に起動するように設定する
最後に、```~/.bash_profile```の最下行に以下のように追記します。

```~/.bash_profile
[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx
```

これで、ログイン後に自動的にXが起動します。

## xmonadを起動させてみる
ここまででxmonadのインストールは完了したので起動させてみましょう。
再起動してログインします。

```
$ sudo reboot
```

真っ黒な画面になったところで、右Alt + Shift + Enterを入力すれば、terminalが起動します。

お疲れさまでした。
Pythonでランダムな値を返すメソッドのテスト

この記事は[Python Advent Calendar 2015](http://qiita.com/advent-calendar/2015/python)の14日目の記事です。

ランダムな値を返すメソッドは、結果が想定する結果よりも一定値離れていたらテスト失敗にするといった具合にして、テストすることもできますが、
統計的にテストできないかと思ってプログラムを書いてみました。

ランダムな値を返すメソッドをカイ二乗検定を用いてユニットテストします。

## 実装

例えばサイコロを振ってランダムに1〜6の目を返すプログラムを書くと以下のようになります。

```python:dice.py
# -*- coding: utf-8 -*-

import random

class Dice(object):
    def throw(self):
        return random.randint(1, 6)
```

これをテストするコードは以下のようになります。

```python:test_dice.py
# -*- coding: utf-8 -*-

import collections
import unittest

import dice

from scipy import stats


class TestDice(unittest.TestCase):

    def setUp(self):
        self.__target = dice.Dice()

    def test_throw(self):
        # 6000回実行する
        result = [self.__target.throw() for n in range(0, 6000)]
        # 実行結果の集計
        counted = collections.Counter(result)
        # イレギュラーな目が出ていないか確認
        self.assertItemsEqual([1, 2, 3, 4, 5, 6], counted.keys())
        # カイ二乗検定を行い、有意水準1%で偏りがないという帰無仮説を棄却できた場合にテスト失敗とする
        # だいたいどの目も1000回ほど出現するはずで、そこから著しくズレていれば失敗になる
        chi_square_value, p_value = stats.chisquare(
            [counted[1], counted[2], counted[3], counted[4], counted[5], counted[6]],
            f_exp=[1000, 1000, 1000, 1000, 1000, 1000]
        )
        self.assertLess(0.01, p_value)
```

`scipy`の`stats`モジュールが必要なのでインストールされていなければ、`pip`でインストールします。

```shell
$ pip install numpy
$ pip install scipy
```

## 解説

特定の回数(今回は6000回)実行して、その実行結果を集計します。
例えば1の目が1007回、2の目が1050回・・・といったようにです。

その集計した回数とその理論値、今回であれば各目が1000回ずつ出ることとのズレを検定し、「サイコロの目の出る回数はどれも同じである」という帰無仮説が棄却できるかを調べます。

帰無仮説が棄却できる場合は、想定した結果になっていないということなので、テストが失敗します。
反対に棄却できない場合はテスト通過です。

## 注意点

統計的なテストにしても運が悪いと失敗してしまうのは変わらないため、実際に運用するとなると難しい面があるかもしれません。

有意水準を下げると、実際には正しいのにテストが失敗するパターンは減りますが、反対にほんの小さなズレではテストが失敗しないため、実は1の目が出る数が他より微妙に多かったというのは検出できない可能性があります。

反対に、有意水準を上げると、実際は正しいのにテストが失敗するパターンが増えます。ただ、小さなズレであっても検出することができるようにはなります。

失敗が多すぎるテストは、いつものこととして見向きもされなくなるので、実際に運用するときは有意水準は低めでやったほうがいいかなと思います。

### 参考にしたページ
- https://speakerdeck.com/komiya_atsushi/randamunizhen-ruwu-uji-neng-wo-junit-suru-number-shibui-gu-java-di-3hui
Rでクロス集計して属性ごとの割合グラフを描く

アンケート集計などを行うときに、ある質問への回答の結果で、他の質問の回答の結果の割合が変わるかをみたいときがあります。

例えば、年齢層ごとに満足率が異なるかをみたい、といった場合です。

それをグラフできるコードを書いてみました。

TEST_Aがaの群とbの群で分けたときに、TEST_Bの結果(x, y, z, w)の割合をグラフ化するコードです。

```r
# サンプルデータ生成
sample_data <- data.frame(
  TEST_A=c("a", "a", "b", "b", "a"),
  TEST_B=c("x", "y", "z", "w", "w")
)

summary(sample_data)

# クロス集計して割合グラフを描く関数
draw_percent_bar <- function(d, x, y){
  par(mar=c(4, 4, 2, 7))
  tmp_table <- table(d[[y]],d[[x]])
  barplot(prop.table(tmp_table,2)*100,
          legend=rownames(tmp_table),
          col=topo.colors(nrow(tmp_table)),
          ylim=c(0,100),
          ylab="percentage(%)",
          args.legend=list(x="topright", ncol=1, bty="n", inset=c(-0.3,0.1)))
}

# TEST_Aの結果で分けた時のTEST_Bの割合をグラフにする
draw_percent_bar(
  sample_data,
  "TEST_A",
  "TEST_B"
);
```

実行すると以下のグラフが出力されます。

![20150724132454.png](https://qiita-image-store.s3.amazonaws.com/0/59581/1f382774-95d3-c1a0-c298-b594770ee3cc.png)

これでTEST_Aがaの群とbの群で分けたときに、TEST_Bの結果の割合が異なるかをグラフで確認できました。

次は、TEST_Aがaの群とbの群で分けたときに、TEST_B, TEST_C, TEST_Dで1と答えた割合をグラフ化するコードです。

```r
# サンプルデータ生成
sample_data <- data.frame(
  TEST_A=c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b"),
  TEST_B=c(1, 0, 0, 0, 0, 0, 0, 1, 1, 1),
  TEST_C=c(0, 0, 1, 1, 1, 1, 0, 0, 0, 1),
  TEST_D=c(1, 0, 0, 0, 1, 1, 0, 0, 0, 1)
)

summary(sample_data)

# クロス集計して割合グラフを描く関数
draw_bar_cross_ratio <- function(data, cross_row, cross_cols){
  vals <- sort(unique(data[[cross_row]]))
  tmp <- t(sapply(vals, function(x){
    colSums(data[data[[cross_row]]==x,][,cross_cols])/nrow(data[data[[cross_row]]==x,]) * 100
  }))
  rownames(tmp) <- vals
  colnames(tmp) <- cross_cols
  par(ps=9, mgp=c(2.0,0.8,0), mar=c(14, 4, 2, 2))
  barplot(tmp,
          las=2,
          beside=T,
          ylim=c(0,100),
          ylab="percentage(%)",
          col=rainbow(length(vals)))
  legend(8, 120, vals, col=rainbow(length(vals)), pch=15, ncol=5, bty="n")
}

# TEST_Aの結果で分けた時のTEST_B, TEST_C, TEST_Dの割合をグラフにする
draw_bar_cross_ratio(
  sample_data,
  "TEST_A",
  c("TEST_B", "TEST_C", "TEST_D")
);
```

表示されるグラフはこのようになります。

![20150724140522.png](https://qiita-image-store.s3.amazonaws.com/0/59581/3cd36196-1f9f-bf55-9207-9e49eea23b28.png)

TEST_Aがaの群とbの群で分けたときに各テストで1と0のどちらが多いか視覚化することができました。
「FMC2Goスケジューラーにおけるレスポンシブ・デザイン」の続き


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の14日目

# 「FMC2Goスケジューラーにおけるレスポンシブ・デザイン」の続き
前回の[FMC2Goスケジューラーにおけるレスポンシブ・デザイン](http://qiita.com/or2/items/bf7dbf81716cfebc4560)の続きです

引き続き「OnFirstWindowOpen」イベントに設定されている「OnOpen」スクリプトを見ていく

## 「OnOpen」というスクリプトは、なにをしている？

### グローバル変数「$$device」を設定する
![151213-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/2008a8bf-7201-8d2c-e87a-b8fcd13be963.png)

グローバル変数「$$device」に
Desktop
という値を設定している

```
Let ( [

	//	set $$debug to "iPhone" or "iPad" to spoof the device type on a desktop machine; set to 1 to help troubleshoot on-device; set to empty to disable debug mode.
	$$debug = ""

] ; 

	Case 	(

		PatternCount ( Get ( アプリケーションバージョン ) ; "Go_iPad" ) or $$debug = "iPad" ; 
			"iPad" ; 

		PatternCount ( Get ( アプリケーションバージョン ) ; "Go" ) or $$debug = "iPhone" ; 
			"iPhone or iPod Touch" ; 

		"Desktop"

	)
)
```

まずLet関数でグローバル変数「$$debug」を設定しているようだ
> グローバル変数はファイル内にある計算式またはスクリプト、たとえば他のスクリプトやファイルパスなどで使用できます。グローバル変数の値はファイルが閉じられるときに消去されます。

このグローバル変数「$$debug」に値を設定することでPC環境でも

- 「iPad」を設定するとiPad
- 「iPhone」を設定するとiPhone、 iPod Touch

を使った時の動作を確認(デバッグ)できるようだ

FileMakerPro Advanced版では「データビューア」を使って変数の値を書き換えることができるので、その機能のないFileMakerProでも確認できるように実装されているのでしょう

ここではPatternCount関数を使って判定を行っているようだ
Get ( アプリケーションバージョン )関数で取得したものに

- 「Go」が含まれていたらiPhoneかiPod Touchで動作している
- 「Go_iPad」が含まれていたらiPadで動作している
-  いずれにも当てはまらなければPCで動作している

としているようだ

PatternCount関数
> 目的 
テキストに、検索テキストで指定された文字列がいくつ含まれているのかを返します。
構文 
PatternCount ( テキスト ; 検索テキスト )

同じスクリプトの中で、値に「Go」なり「Go_iPad」なりが含まれているかの判定に

- Left関数+Position関数を使ったアプローチ
- PatternCount関数を使ったアプローチ

の両方を使って実装されているのは、このソリューションの作成者がスクリプト実装のお手本としても使わせようとしている意図でしょうか
もしかして各地で読書会ならぬスクリプト分析会が行われているのでしょうか？

まだまだ「OnOpen」スクリプトは続くが、レスポンシブ・デザインに絡みそうな部分はここまでのようなので、ここまでにしておく

## 「OnOpen」スクリプトで定義したグローバル変数はどう使われているか
ソリューションには各機能について

- iPhone用のレイアウト  
![151213-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/60a16242-b062-16c5-a11f-59a813e9550b.png)

と

- iPadのレイアウト  
![151213-06.png](https://qiita-image-store.s3.amazonaws.com/0/89027/c8d822bd-5dd0-6b30-9ad8-d9ea501973bb.png)

のレイアウトが定義されている
※このソリューションではPCはiPad用のレイアウトを使用している

レイアウト名の末尾がiPhoneとiPadになっている同じ機能のレイアウトが用意されているのがミソ

ソリューションが開かれた時に「OnOpen」スクリプトを実行することで、いくつかのグローバル変数を定義し値を保存している
そのグローバル変数の値を基にレイアウトの切り替えを行うことで適切なレイアウトへのナビゲートを実現している

### あるスクリプトの例
グローバル変数「$$device」を基にレイアウトを特定するためのローカル変数「$suffix」を設定
![151213-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/5e1a08bc-c26e-6f39-843f-b410b1785c41.png)

遷移先として指定されたレイアウトにローカル変数「$suffix」を結合して存在するレイアウト名に読み替えをする
![151213-08.png](https://qiita-image-store.s3.amazonaws.com/0/89027/560eca17-adf9-dff3-5c4d-29266eb1cafb.png)

グローバル変数「$$device」から直接切り替えるレイアウトを決める
![151213-09.png](https://qiita-image-store.s3.amazonaws.com/0/89027/aa90d3d2-3c8f-10a3-ee96-c376898ebf7d.png)

いままで書いてきたような方法で各デバイスに最適なレイアウトの選択(＝レスポンシブ・デザイン)を実現している
Rでカテゴリ変数の度数100%積み上げ棒グラフを描く

0, 1の2値データの割合を100%積み上げ棒グラフとして出力する。

## コード
```r
sample_data <- data.frame(
  TEST_A=c(1, 1, 0, 1, 1),
  TEST_B=c(1, 0, 0, 0, 0),
  TEST_C=c(0, 0, 1, 1, 1),
  TEST_D=c(1, 0, 0, 0, 1)
)

#カテゴリ変数へ
sample_data$TEST_A <- as.factor(sample_data$TEST_A)
sample_data$TEST_B <- as.factor(sample_data$TEST_B)
sample_data$TEST_C <- as.factor(sample_data$TEST_C)
sample_data$TEST_D <- as.factor(sample_data$TEST_D)

summary(sample_data)

#棒グラフ描画
barplot(
  sapply(c(
    "TEST_A",
    "TEST_B",
    "TEST_C",
    "TEST_D"
  ),
  function(s){
    (table(sample_data[s])/sum(table(sample_data[s]))) * 100
  }),
  horiz=T,
  las=2,
  col=gray(c(0.2, 0.8)),
  xlim=c(0,100),
  xlab="Ratio(%)"
)
legend(3, 1.1, c("0", "1"), pch=15, col=gray(c(0.2, 0.8)))
```

## 出力

### コンソール

```r
> summary(sample_data)
 TEST_A TEST_B TEST_C TEST_D
 0:1    0:4    0:2    0:3   
 1:4    1:1    1:3    1:2   
```

### グラフ

![2013_12_29_Rplot.jpeg](https://qiita-image-store.s3.amazonaws.com/0/59581/8654cf4c-698a-2080-959d-5738d69ef0ea.jpeg)
Go言語でRICOH THETA API v2を叩いてみた

![gopher](https://qiita-image-store.s3.amazonaws.com/0/21027/2c5b1457-161e-62cc-eeb1-37ee0b990c6e.png)
出典 [golang.org](https://golang.org/)

![RICOH THETA](https://qiita-image-store.s3.amazonaws.com/0/21027/51fb61e1-1f49-2683-a1c3-034d395b7786.png)
出典 [developers.theta360.com](https://developers.theta360.com/)

## RICOH THETA API v2 をGo言語で叩いてみる

Go言語にちょっと興味が湧いてきたので理解するために何か実装して見ようと思って、ちょうどタイミング的にRICOH THETA API v2の公開が重なったのでではGo言語のAPIクライアントを作ろうということにしました。

## 作ったもの

* https://github.com/toshi3221/theta_v2
    * Go言語のRICOH THETA API v2クライアント
* https://github.com/toshi3221/pazu
    * RICOH THETA API v2 WebUI
    * クライアントだけだと全く動かした感じにならないのでちょっとだけ。。
    * 2015/12/15現在撮影・サムネイル付きファイル一覧(最新10個)のみ

## THETAを開発するとき無線LAN USBアダプターは必需アイテム

THETAを使ったアプリの開発すると地味に面倒なことに気づきます。それはTHETAに接続しながらネットに繋げられないので調べ物が出来ないのです。その問題を解消するために無線LAN USBアダプターを挿すことでネットを見ながら接続もキープできるのでオススメです。

私は主にMBPで開発してますが、Macに対応する無線アダプタはちょっと少ないですが、PLANEXのものであればMacも対応してることも多いようです。PLANEXの刀を愛用してます。かっ飛びです。

![katana.jpg](https://qiita-image-store.s3.amazonaws.com/0/21027/d8998872-1463-ccfd-2684-49b7c7ef9a88.jpeg)

## APIv2クライアントを試してみる

Go言語自体は既にインストールしていることを前提とします。まずAPIv2クライアントを取り込みます。

```bash
go get github.com/toshi3221/theta_v2
```

クライアントライブラリ内にTHETA Sを操作可能な各種サンプルを用意しているのでここでは撮影を行うサンプル([take_picture.go](https://github.com/toshi3221/theta_v2/blob/master/examples/take_picture.go))を実行してみます。THETA SをWi-Fi接続後、以下コマンドを実行します:

```bash
cd $GOPATH/src/github.com/toshi3221/theta_v2/examples
go run take_picture.go
```

サンプルではセッションを開始し、撮影を行ってファイルが保存されるまで待つようにしています。

## APIv2 WebUIを試してみる

Go言語のWebフレームワークである[Revel](https://revel.github.io/)を使ってみました。高速で動作してAPIサーバー等に相性が良さそうです。Revelをインストールします:

```bash
go get github.com/revel/revel
go get github.com/revel/cmd/revel
```

revelコマンドは$GOPATH/binフォルダにインストールされるのでPATHを通しておいて下さい。Revelのインストールが終了したら、APIv2 WebUIをインストールしてビルドしてサーバーを起動します:

```bash
go get github.com/toshi3221/pazu
revel build github.com/toshi3221/pazu pazu
cd pazu
./run.sh
```

あとはTHETA Sを接続しておいて http://localhost:9000/ にアクセスすると、撮影・一覧表示ができました。

![file_list.jpg](https://qiita-image-store.s3.amazonaws.com/0/21027/2088c80e-1ffd-ddd2-7903-022272eba854.jpeg)

## THETA API v2は複数同時HTTP接続が可能だが3つまで

API v1はコマンドを複数同時に受け付けることは出来ませんでしたが、API v2からは複数同時に受け付けが可能となりました。これにより、[CheckForUpdates](https://developers.theta360.com/ja/docs/v2/api_reference/protocols/check_for_updates.html) / [State](https://developers.theta360.com/ja/docs/v2/api_reference/protocols/state.html)をコマンド等とは非同期にリクエストを行って監視する等応用が可能となります。

しかしながら、無制限に複数同時接続が出来るというわけでは無く、同時3接続を超えるとリクエストを受け付けずエラーで弾かれるようです。

Go言語にはチャネルという並列処理時に同期する仕組みがあり、バッファリングを行ったチャネルを利用することでセマフォのように使うことが出来ます。この仕組みを利用して[theta_v2](https://github.com/toshi3221/theta_v2)ではClientメソッドを同時に3つまで処理可能とし、それを超えるとチャネルによってブロックすることで制御しています：

```go
var clientSemaphore = make(chan int, 3) // バッファサイズ3のint型チャネル。値は使わないので型や格納する値は何でも良い

func (client *Client) Info() (info Info, error error) {
	clientSemaphore <- 1  // チャネルに格納。同時格納が3を超えるとブロックする
	defer func() { <-clientSemaphore }() // メソッドを抜けるときにチャネルから値を取り出す
	...
}
```

## 今後の展望

APIv2 WebUIが今のところ動いたーってことしか本当に出来てないので、ファイルの取り込み、ファイル各種操作程度出来るようになれば普通にノートPCで使えるようになるかなと思ってます。それくらいまではやろうかなと。RICOH THETAは普通のユーザーも開発者も楽しいので是非みんなで盛り上げていきましょう！
HTML、CSSは、将来を見越して書こう！


開発環境でHTML、CSSなどでページ作成している時は公開が目標になってしまいがちです。あのブラウザだけレイアウト崩れが…その端末だとうまく表示できない…突然の仕様変更！など、いろんな理由で「もうこれでいいや！えいやー！」とその場凌ぎな書き方になってしまうことがあります。
公開後に直そうと思っても影響範囲が広すぎて、なかなか難しいといったことはないでしょうか？
困ったことになりにくいようにポイントを紹介していきます。

■!importantは最後の切り札
困ったときに!importantで指定してしまえば、自分の書いたstyleが優先されるので便利です。
でも、その後その近くに新しく要素を追加することになった時どうなりますか？
うまく配置できなかったらどうなるでしょうか？
・!importantを外してまた作り直す
・さらに!importantを使って優先順位をあげる

こんなことをやり続けていたら、いつまでも手を入れ続けなくてはならず、運用が楽になりません。
!important以外にも優先順位を上げる方法はありますし、上書きしてしまうという手段もあります。
他にどうしても手段が見つからない場合だけにしましょう。


■styleで直接書かずにCSSでなんとかする
<div class="testClass" style="margin-bottom=10px">
	<p>お知らせです</p>
</div>

このような書き方をすると、testClassを修正してもmargin-bottomが10pxのままになってしまいます。
また、あとでstyleの部分を削除する手間も発生してしまいます。
こういった修正をしたことを覚えていたら大丈夫ですが、もし新しいメンバーが加入した時、
その人はそのことを知らずに困ることになるかもしれません。


■再利用しやすい作りにする
このページでは使えるのに、他のページでは使えない。
同じデザインなのに！

リンクやリストのような他のページでも使うものは、他のページでも使えるように再利用できることを意識する。
また仕様変更にも対応できるように。リストの項目が一つ増えてもすぐに修正できるように作ると運用がぐっと楽になります。


■コーディング規約を作成し閲覧できる場所においておく
・なんで〇〇さんは、なんでもtableで作るの！(怒）
・!importantでなんでも書きすぎ！！（怒）
こういった不満や不機嫌になりがちなプロジェクトには、
・コーディング規約がない（自由でいいよ！ってケースも…）
・wikiの更新が１年以上とまっている
・古参メンバーの暗黙の了解になっている

なので、質問したり、HTMLやCSSを読んで研究して合わせようとしたり、
コミュニケーションコストがかかったり、書き方を自力でつかみにいかなくてはならず大変です。

また、HTML、CSSはフロントエンド担当者のレベルで書き方が違っていたり、
バックエンドに強いプログラマがフロントエンドに強いとは限らなかったり、
いろんな人が編集します。
なので、これは守って欲しい！といったことはドキュメント化しましょう。


いかがでしたでしょうか？
一度作ってしまうと影響範囲が広くてなかなか直せないといったケースにあたったり、
簡単に書けてしまう分、いろんな人が編集することもあり、運用がなかなかうまくいかないことがあります。
少しでも参考になれば幸いです。
こんなことをやるとうまくいくよ！といったコメントも歓迎です。
UICollectionViewCellの編集メニューを表示する

# やりたいこと
任意の**UICollectionViewCell**がロングタップされた際に任意の編集メニューを表示する。

こんな感じ↓
![EditMenuSample](https://qiita-image-store.s3.amazonaws.com/0/35230/a0536a7d-347c-063c-3329-cb5ff4715827.png)

# 環境
* Xcode 7.1
* iOS 9.1

上記環境以外では試していませんが、おそらくiOS6.0以降なら動作すると思います

# 方法
UICollectionViewCellの編集メニューを表示するには、まず次の3つのデリゲートメソッドを実装する必要があります。

1. **collectionView:shouldShowMenuForItemAtIndexPath:**
2. **collectionView:canPerformAction:forItemAtIndexPath:withSender:**
3. **collectionView:performAction:forItemAtIndexPath:withSender:**

さらに、各々のメソッド内で編集メニュー表示に関する細かい指定を行う処理を記述する必要があります。

順に説明していきます。

## 1. collectionView:shouldShowMenuForItemAtIndexPath:
編集メニューを表示するセルをBOOL値を返すことにより指定します。このメソッドでNOが返された**IndexPath**のセルについては編集メニューは表示されません。

```objc
- (BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if ( indexPath.row < 3 ) {
        return YES;
    }

    return NO;
}
```
この場合は最初の3つのセル(0〜2)のみ編集メニューが表示されます。


## 2. collectionView:canPerformAction:forItemAtIndexPath:withSender:
どの編集メニューを表示するかをBOOL値を返すことにより指定します。編集メニューの種類とセレクタとして渡されるアクションメソッドは次の通りです。

| メニュー | アクションメソッド |
| :-----: | :-------------: |
|  カット  |       cut:      |
|  コピー  |      copy:      |
| ペースト |      paste:     |

```objc
- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(nonnull SEL)action forItemAtIndexPath:(nonnull NSIndexPath *)indexPath withSender:(nullable id)sender
{
    if ( [NSStringFromSelector(action) isEqualToString:@"copy:"]
        || [NSStringFromSelector(action) isEqualToString:@"paste:"] ) {
        return YES;
    }
    
    return NO;
}
```
この場合は**コピー**と**ペースト**のみ編集メニューとして表示されます。

## 3. collectionView:performAction:forItemAtIndexPath:withSender:
最後に、編集メニューがタップされたときの動作を記述します。

```objc
- (void)collectionView:(UICollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
    if ( [NSStringFromSelector(action) isEqualToString:@"copy:"] ) {
        // なんかする
    } else if ( [NSStringFromSelector(action) isEqualToString:@"paste:"] ) {
        // なんかする
    }
}
```
上記のコードではしていませんが、引数として(当たり前ですが)セルの**indexPath**が渡されるので、それをもとに何か処理を記述することになると思います。

# まとめ
1. **collectionView:shouldShowMenuForItemAtIndexPath:** メソッドを実装し、編集メニューを表示するセルを指定
2. **collectionView:canPerformAction:forItemAtIndexPath:withSender:** メソッドで表示する編集メニューを内容(カット/コピー/ペーストのいずれか)を指定
3. **collectionView:performAction:forItemAtIndexPath:withSender:** メソッドで編集メニュータップ時の処理を記述

今回はデフォルトの**UICollectionViewCell**をそのまま使用していますが、自作Cellクラスを使用しても同様にして編集メニュー表示を実現できます。

# 参考文献
今回の記事を執筆するにあたり、Appleの公式ドキュメンドである『[Collection View Programming Guide for iOS](https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CreatingCellsandViews/CreatingCellsandViews.html#//apple_ref/doc/uid/TP40012334-CH7-SW8)』の「**Showing the Edit Menu for a Cell**」の項目を参照しました。
IOTにIoTで対抗してみた

皆さんは、突然家に同居人**（居候）**がやってきた経験はありませんか？
僕は2ヶ月位前から同居人ができました。
そこで今回は、同居人の困った行動（ポルターガイスト現象）に対して、
どう**対応**したのかを書きたいと思います。

# 同居人の良いところ

いきなり、同居人の悪いところだけ列挙して記事にしたら悪いと思うので、
まずは同居人のいい所を紹介します。

1. 自分が居候だという事をわきまえており、必ず僕の後にシャワーを浴びる。
2. 僕が帰るタイミングに合わせ、洗濯機を回しておいてくれる。
3. お風呂場がカビないように換気扇を回してくれる。
4. 僕の生活空間を侵害して来ない。

# 同居人**（居候）**の困った行動  

**1. 連絡なしに、いきなり家に転がり込んできた。**
→ 突然やってきて帰らないため戸惑いました。
**2. 人がシャワーを浴びていたら、いきなり換気扇をつける。**
→ びっくりするのでやめて欲しいです。
**3. シャワーを浴びたら、浴び終わってもシャワーを止めてくれない。**
→ 水道代が上がるのでやめて欲しいです。
**4. 空っぽの洗濯機を乾燥機能だけで回す。**
→ 無駄に電気代が上がるからやめて欲しいです。

しかし、上の４つが及ばない位に一番困っていることがあります。
#### ***2ヶ月も経つのに挨拶もせず、姿を見せてくれないことです***

恐怖を感じた僕は、家に幽霊が待機していることから、
これをIOT(Ie ni Obake ga Taiki shiteiru)と名付け、
**Raspberry Pi**を使用してIoTでこれらに対抗しようと考えました。

# 対応
姿の見えない何かに対応するには、テレビ番組や漫画でもあるように、
お経を上げ続けて去ってもらおうと考えました。

## 方法
1. Raspberry Piをルータ化してスマートフォンを接続。
2. Wi-Fi接続が切れることにより、僕の不在を確認。
3. 不在の間中、お経を流す。
4. スマートフォンがネットワークに接続されたら、お経をストップする。

## 準備物
- Raspberry Pi
- スピーカー
- お経の音源（今回は阿弥陀経を使用しました。）
- 無線LANアダプタ

## 開発
### 1. Raspberry Piのルータ化
この方法に関しては、何番煎じかわからないほど記事が書かれていたので、
以下のサイトを参考にして作成しただけなので割愛します。
http://akkagi.info/20150717_web/

### 2. スマートフォンの状態を確認
最初は、スマートフォンのMACアドレスが接続されているかを基に、
接続状態を確認しようとしていました。
しかし、僕の頭では方法が思いつかなかったため、方法を変更しました。
以下の記事を参考に、スマートフォンにはstatic IPを振り、
そのIPに対しping監視を行って、接続状態を確認しました。

- static IPの設定方法  
http://herb.h.kobe-u.ac.jp/raspiinfo/raspiAP.html
- ping監視方法  
http://wiki.inamuu.com/index.php?シェルスクリプト：特定のIPアドレス範囲に対してpingで疎通確認

```lang:ping_monitoring.sh
#!/bin/bash

IP="192.168.24.33" 

RES=`ping ${IP} -c 1 -w 1 | tail -n2 | head -n1 | cut -d" " -f6 | sed "s/\%//g"`

if [ ${RES} = "0" ];
    then
    echo "1" >> /var/log/ping/res_list.txt
else
    echo "0" >> /var/log/ping/res_list.txt
fi
```

### 3. お経を再生

ここは、2番で出力した* /var/log/ping/res_list.txt*をcronにより監視して、
もしpingが切れていたら音楽を流すように設定しています。
これも方法は、既存の記事があったので参考にさせて頂きました。
- 連続再生スクリプト
http://cobo4u.blog87.fc2.com/blog-entry-229.html

```lang:music_trigger.sh
#!/bin/bash

res_list="/var/log/ping/res_list.txt"
music="/var/tmp/okyo.wav"

reses=(`tail -n 50 ${res_list} | grep 0 | wc -l`)

if [ ${reses} -ne 5];
    aplay $music
fi
```

#### 4. お経をストップする。

再生時と同じように、2番で出力した* /var/log/ping/res_list.txt*をcronにより
監視してping が正常に戻ったら、aplayのプロセスをkillして停止します。

```lang:music_stop.sh
#!/bin/bash

ps=(`ps -aux | grep aplay | awk '{print $1}'`)
reses=(`tail -n 50 ${res_list} | grep 1 | wc -l`)

if [-n ${ps} && ${reses} -ne 3];
  kill -9 ${ps}
fi
```

# テスト
動画をアップしたのでそちらを確認してください。
1m36s　辺りからお経が流れます。  
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ptRIkubANkE/0.jpg)](http://www.youtube.com/watch?v=ptRIkubANkE)

# 効果
結局、おばけは出て行ってくれませんでした。
また最近は、アパート全体に迷惑をかけているらしく、以下のようなアンケートが管理会社から届きました。


**最近、複数の入居者の方からお経のようなものが鳴り続けていると報告がありました。**
**在宅中に聞いたことはございますか。**

僕はおばけにこそ迷惑をかけられていますが、そんなものは聞こえた事がありません。
そのため、今回のアンケートには***NO***で提出しました。

# まとめ
おばけには、現代科学では対抗できないことがわかったので、僕は引っ越します！！
引っ越し先が決まりましたら、欲しいものリストを追加するので引っ越し祝いを下さい。
よろしくお願い致します。

# 後日談
無事、1月9日に引越すことになりました！！！！
引越し祝いをお待ちしております。
https://www.amazon.co.jp/gp/registry/wishlist/ref=nav__gno_listpop_wi?sort=priority&view=null
膨大なテストデータを簡単につくる


##参考記事
・https://www.softel.co.jp/blogs/tech/archives/4730
・http://qiita.com/tayasu/items/c5ddfc481d6b7cd8866d


##SQL

はじめに、空データを作成します。
(倍々に増えていきます。)

```sql
INSERT INTO item () VALUES (); --1行目作成
INSERT INTO item (id) SELECT 0 FROM item; --2行になる
INSERT INTO item (id) SELECT 0 FROM item; --4行になる
INSERT INTO item (id) SELECT 0 FROM item; --8行になる
INSERT INTO item (id) SELECT 0 FROM item; --16行になる
```

データをランダムにUPDATEします。

```sql
UPDATE item SET 
item_id = CEIL(RAND() * 10000),  -- ①
item_name = CONCAT(SUBSTRING(MD5(RAND()), 1, 5),'商品'),  -- ②
t_stamp = ((RAND()*(0.1464706800 - 0.1433084400)+0.1433084400)*10000000000), -- ③
next_m_timestamp = t_stamp + 2592000,  -- ④
del_flg = ROUND(RAND());  -- ⑤
```
##解説

###①小数点切り上げ, ランダムな数字


```sql
item_id = CEIL(RAND() * 10000),  -- ①
```
CEIL - 小数点切り上げ
RAND - 0～1の間の浮動小数点乱数を計算

###②文字の連結, ランダムな文字
```sql
item_name = CONCAT(SUBSTRING(MD5(RAND()), 1, 5),'商品'),  -- ②
```
CONCAT - 文字の連結を行う
SUBSTRING(MD5(RAND()), 1, 5) 
- MD5(RAND() => ランダムな文字列, 
- 第2引数 => ランダムな文字列のstart位置
- 第3引数 => ランダムな文字列のend位置

###③RANDの範囲指定
```sql
t_stamp = ((RAND()*(0.1464706800 - 0.1433084400)+0.1433084400)*10000000000), -- ③
```

(RAND()*(① - ②)+②)*10000000000  -- ① ~ ②　の間でランダム値が出力される。

###④計算値の使用
```sql
next_m_timestamp = t_stamp + 2592000,  -- ④
```

###⑤四捨五入

```sql 
del_flg = ROUND(RAND()),  -- ⑤
```
ROUND - 四捨五入
sshでパスワード入力を回避する方法メモ

# centosでssh接続する方法
自分用メモ
パスワードsshの確認をなしにする方法

## DSAkeyの作成
接続元で行う

```
ssh-keygen -t dsa
```

## publicKeyの登録
接続先で行う

```
cat id_dsa.pub >> authorized_keys
chmod 600 authorized_keys
```

## sshの再起動
接続先で行う

```
sudo vi /etc/ssh/sshd_config
```

sshd_config内の

```
 # PubkeyAuthentication yes
```

の↑のコメントアウトを解除

```
sudo /etc/init.d/sshd restart
```
RailsでリロードしないとJavaScriptが起動しない時

　Rails4.2でJavaScriptを書いている時、最初のページ遷移ではJSが上手く起動せず、リロードすると起動することがあります。Rails4からデフォルトで使用できる`turbolinks`というgemが、問題を起こしているらしいです。Getでページ遷移する時、jQueryのreadyイベントが起きないため、例えば`$(function(){})`に入ってる処理が実行されなくなってしまいます。

　この時に役に立つのが`jquery-turbolinks`というgemです。[こちら](https://github.com/rails/turbolinks/#jqueryturbolinks)を参考にしてみてください。

# `Gemfile`に以下を追加する
```lang:Gemfile
gem 'jquery-turbolinks'
```

# Bundle installする
```lang:ターミナル
$ bundle install
// bundleだけでも可
```
サーバーを再起動することを忘れずに。

# `app/assets/javascripts/application.js`に以下の行を加える
```lang:app/assets/javascripts/application.js
//= require jquery.turbolinks
```
この時、付け足す場所が重要らしく、`//= require jquery`より後で、`//= require turbolinks`より前に記述する。例えばこのような感じ。

```lang:app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require bootstrap
//= require_tree .
```


あとは、様々なイベントによって、readyの代わりに以下を使い分ける：
`page:fetch`
`page:load`
`page:restore`
`page:change`
イベントは他にもあるので、[こちら](https://github.com/rails/turbolinks/#jqueryturbolinks)を参考にしてください。
ロケール（locale）まとめ

## 情報源

[Archのwiki](https://wiki.archlinux.jp/index.php/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB)がとてもよくまとまっている。
`man 5 locale`や`man 7 locale`にも情報がある。
基本的にロケールはlibcの機能だと知っていると理解が進むと思う。


## 現在のロケール設定を確認するにはlocaleコマンド

```
# locale                        
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

## システムにインストールされているロケールの一覧を確認するにはlocale -a

```
# locale -a
C
POSIX
ja_JP.utf8
```

または`localedef --list-archive -v`。

## システムに使いたいロケールがインストールされていない場合

自分でロケールのソースからコンパイルすればよい。やり方はディストリビューションによって異なるが、`locale-gen`コマンドがある場合はそれを使う。
`locale-gen`はシェルスクリプトになっていて、内部で

```
localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
```

に相当することをやっている。

## 環境変数の意味と優先順位

|環境変数|意味|
|----|----|
|LC_CTYPE|文字の分類および大文字/小文字の変換。|
|LC_NUMERIC|小数区切り文字 (または基数文字)、千の区切り文字、およびグループ化を指定します。|
|LC_TIME|月の名前、曜日、一般的な完全表示や短縮表示など、日付や時刻の書式を指定します。|
|LC_MONETARY|ロケールの通貨記号、千の区切り文字、符号の位置、小数点以下の桁数など、通貨の書式を指定します。|
|LC_COLLATE|ロケールの照合順序および正規表現の定義を指定します。|
|LC_MESSAGES|ロケールのローカライズメッセージの記述言語、および肯定と否定の応答 (yes と no の文字列と表現) を指定します。|

以上の6個はPOSIXで定義されているもの。それ以外のLC_PAPERなどはGNU C libraryの独自拡張、と`man 5 locale`に書いてあった。


```
LANG < LC_CTYPE, LC_MESSAGE等 < LC_ALL
```

右に行くほど優先される。
`~/.bash_profile`では`LANG`だけ設定しておけば十分。もし必要なら`LC_CTYPE`などを個別に設定、さらにそれらを全て（一時的に）上書きしたい場合に`LC_ALL`を使う。
シェルスクリプト内で必ずCロケールにしてsortコマンドなどを使いたい場合は`LC_ALL=C`を使うと良い。


# ファイルとディレクトリの配置（Arch Linuxの場合）

|ファイル|説明|
|---|---|
|/etc/locale.gen|生成すべきロケールの一覧。これは手で編集する|
|/usr/bin/localedef|ロケールをコンパイルするプログラム。glibcの一部なので、CentOS等にも入っている|
|/usr/bin/locale-gen|/etc/locale.genで定義された各ロケールに対して`localedef`を呼び出すシェルスクリプト|
|/usr/share/i18n/locales/|`localedef`でコンパイルする入力ファイルが置かれる|
|/usr/lib/locale/locale-archive|`localedef`でコンパイルされたロケールの実体|
|/usr/share/locale/|gettextで使用する翻訳ファイル（*.mo）が置かれる|
東芝のノートPCにxubuntuを入れたらタッチパッドが反応しなくなったのを解決

東芝のdynabook MX/36MBL をもらい受けて、OSをxubuntuに入れ替えたところ、タッチパッドが全く効かなくなりました。

ここが全く無反応です。![touch.png](https://qiita-image-store.s3.amazonaws.com/0/80588/2b17ff49-c5e2-28f8-4c3c-f4311576f3e8.png)


いろいろ探した結果、[こちらの指示](http://forums.toshiba.com/t5/Keyboards-Touchpads/Solved-Synaptic-Touchpad-not-working/m-p/272949#M10565)に従ったところ、解決しました。

引用
Turn computer off.  Remove all attachments and the battery. Press power button for 15 seconds.  Replace power connection and battery.  Start Computer and press F2 at the Toshiba splash screen to get into Setup.  Press F9 to reset defaults. Press F10 to save changes and exit and answer yes to complete.  Computer will restart.

+ 起動時にF2キーで割り込み、BIOS設定ページを出して、
+ F9でデフォルトに再設定、
+ F10で保存して再起動。


今ではきびきび動いています。大切に使いたいと思います。
BluemixでDrupalを作成するときに注意すること(MySQLの容量を増やす）

　SoftLayer, Bluemix サミットでお話をさせていただいたDrupal on Bluemixですが、
<iframe src="//www.slideshare.net/slideshow/embed_code/key/EF15cXBoXO2gVM" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/osonoi1/drupal-on-bluemix20150902" title="Drupal on bluemix20150902" target="_blank">Drupal on bluemix20150902</a> </strong> from <strong><a href="//www.slideshare.net/osonoi1" target="_blank">Yasushi Osonoi</a></strong> </div>
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/3a7000b3-274b-da5e-2bb6-c8c31d5fe894.jpeg)

実はコンテンツを増やしていくとエラーが発生、よくよく見てみるとデータベースのリソース不足だったようでした。最初に作成したDrupalは米国南部のＤＣを使っていたのですがここで使えるＤＢは下記のようにVM 1MB memory, 10MB storage, 10 connectionsのようでした。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/638ce54a-088d-7f65-7f93-35948f1bf74b.jpeg)

さて容量は増やせないかなといろいろと聞いてみるとデータセンターを下記のように英国にすると
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/712d9414-38b1-2f63-de92-04e76185c680.jpeg)

下記のようにVM, 1MB memory, 500MB storage, 10 connectionsになり問題なくデータを増やせました。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/6202b011-5a6a-a092-6cd0-96a1df3fd5ec.jpeg)
データセンターによって容量が違うなんて驚きましたが、今後のために頭の片隅にでも入れていただければと思います。
DockerでNginxからrailsの静的コンテンツを配信する


DockerでNginx+Unicornのアプリケーションサーバ構成で動作させる際に、静的コンテンツはNginxで返したい時がある。

そういう場合、Unicornコンテナでは共有ボリューム指定、NginxコンテナではそのボリュームをマウントしNginxの設定ファイルでrootに指定するのが便利。

# 手順

まず、docker runコマンドの-vオプションでディレクトリを指定。`/home/rails/Stargazer`以下をrailsのworkディレクトリとし、コンテナは`stargazer-unicorn`とする。

```
$ docker run -v /home/rails/Stargazer --name container-unicorn image-unicorn
```

次にNginxコンテナで`--volumes-from`オプションを使いマウントするコンテナ名を指定する。

```
$ docker run --name container-nginx --link container-unicorn:unicorn -p 443:443 -p 80:80 --volumes-from container-unicorn image-nginx
```

最後に、Nginxの設定ファイルでrootを指定

```
http {
  server {
    root /home/rails/Stargazer;
    # 色々省略
  }
}
```

# 補足

-vでオプション指定する他に、Dockerfileでvolume指定してもいい

```
VOLUME /home/rails/Stargazer
```

どちらに記述しても良いと判断できるとき、自分はDockerファイルで出来ることはDockerファイルでやるようにしてる。
WordPress 4.4 で追加された REST API の停止やエンドポイントの変更など


WordPress 4.4 で新しく追加された REST API の停止やエンドポイントの変更方法などを纏めてみた。注意点として、REST API を停止させた場合、他の WordPress サイトに、あなたの記事の URL が掲載された時、あなたの記事が他の WordPress サイトに埋め込まれなくなります（oEmbed）。

## REST API のエンドポイントを変更する

デフォルトのエンドポイント wp-json を my-json に変更する例です。

```
add_filter( 'rest_url_prefix', function () {
	return 'my-json';
} );
```

要パーマリンクの更新。

## REST API の Root index データを変更する

ttp://example.com/wp-json/ にアクセスした際に表示されるデータを変更する。以下に、URL 情報を書き換える例を示します。

```
add_filter( 'rest_index', function ( $response ) {
	$response->data['url'] = get_option( 'home' );

	return $response;
} );
```

`$response->data['url']` のデフォルト値は、`get_option( 'siteurl' )` になっている。

## HTML の Head 内に oEmbed スクリプト (JS) を出力させない

```
remove_action( 'wp_head', 'wp_oembed_add_host_js' );
```

## Really Simple Discovery (RSD) に REST API のエンドポイントを出力させない

```
remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
```

## HTML の Head 内に REST API のエンドポイントを出力させない

```
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
```

## リクエストヘッダーに REST API のエンドポイントを出力させない

```
remove_action( 'template_redirect', 'rest_output_link_header', 11 );
```

## REST API のリクエストを停止させる
リスエストがあった場合 404 が返るようになる。JSONP の出力も停止します。

```
add_filter( 'rest_enabled', '__return_false' );
```

## JSONP の出力を停止させる

```
add_filter( 'rest_jsonp_enabled', '__return_false' );
```

## REST API を停止して 404 ページを表示させる
使わないのであれば、404 にしてしまおうというパターンです。


```
/**
 * Disable rest api.
 */
remove_action( 'wp_head', 'wp_oembed_add_host_js' );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'rest_output_link_wp_head' );
remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
remove_action( 'template_redirect', 'rest_output_link_header', 11 );
add_filter( 'rest_enabled', '__return_false' );
add_action( 'rest_api_init', function () {
	global $wp_query;

	$template = ! empty( get_404_template() ) ? get_404_template() : get_index_template();

	$wp_query->set_404();
	status_header( 404 );
	nocache_headers();

	require_once( $template );

	exit;
}, - 1 );
}
```

## こちらも合わせてどうぞ !
* [WordPress 4.4 の新機能や変更点簡易まとめ](http://qiita.com/kuck1u/items/f622cbdaf1f3c5a47483)
* [WordPress でビジネスサイトを作る時にオススメなテーマ 2015 冬](http://qiita.com/kuck1u/items/3364853cc55b2faf2b3e)
オブジェクト指向があんまり良くわかっていない人向けのチェックリスト

#はじめに
オブジェクト指向プログラミングとはどういうことか、自分の言葉でイマイチ説明できないという方は、セルフチェックとしてこちらの記事の内容をチェックしてみるといいかも。
ここでいうレガシプログラマに該当するかもしれない。
#チェックリスト
[レガシープログラマかどうかを判断する10項目 - give IT a try](http://blog.jnito.com/entry/20110218/1297983647)

>レガシープログラマ = モダンな言語のおいしい機能をうまく使いこなせていないプログラマ

自分はもろに当てはまっており、以下の5項目がヒット。
色々勉強が必要です。

該当したのはこのあたり。
>.1 使われるローカル変数をすべてメソッドの最初に宣言する。

VBAのコードサンプルでよくこうなってたから真似していたかも。

>.2 ローカル変数の宣言時に空文字(“”)や新しいオブジェクト(new Xxx())で初期化する。その後にすぐ別の値をセットする。

今の仕事でも指摘されました。メモリの無駄だからやめなさいと。

>.5 基本データ型(stringやint)と配列だけでデータ構造を表現しようとする。

これもDTOを作れ！とよく指摘をもらうもの。

>.7 クラスのフィールド変数をグローバル変数のように利用する。

これについてはロジックの組み方がイケてないから変数を置かざるを得なくなってる側面も否めませんが、どちらにせよするべきではないこと。

>.9 クラスやクラスメンバの可視性を意識していない(privateメソッドがpublicになっている等)。

既存コード編集が多くて、ゼロからコードを書いたことがあんまりないからっていう理由もある。

全10項目のうち、半分が該当。
つまり、モダンなプログラミングからはかけ離れているという状態。
とりあえずこの全項目について非該当と胸を張って言えるようになりたい。