OmniAICreator/Qiita-1.07M huggingface dataset:
[ メモ ]  laravel5.6 マイグレーション データベース（テーブル）のカラムの変更・追加・カラム名変更

#テーブルのカラムの型を変更

今回、文字型から整数型(INT)に変更した時に、上手くいかなかったのでメモ

- 変更用のマイグレーションファイルを作成

```
$ php artisan make:migration add_users_table --table=users
```

:exclamation:　add_(マイグレーションファイル名)_table
:exclamation:　--table=(テーブル名)

```2018_06_01_11111_add_users_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

        });
    }
}

```

このようなマイグレーションファイルができたら

- upメソッドの中にカラム属性の変更をかく
 - changeメソッドは、存在するカラムを新しいタイプへ変更するか、カラムの属性を変更


```2018_06_01_11111_add_users_table.php
   /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->integer('status')->change();
        });
    }
```

- downメソッドに削除したいカラムをかく

```2018_06_01_11111_add_users_table.php
   /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('status');
        });
    }
```

- マイグレーションを実行して、カラムを変更する

```
$ php artisan migrate
```

#テーブルにカラムを追加

- マイグレーションファイルを作成

- upメソッドの中に追加するカラムをかく
 - after( ) 追加するカラムを入れたい場所を指定
 - nullable( ) NULL対応したい場合に使用


```2018_06_01_11111_add_users_table.php
   /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('email')->after('name')->nullable();
        });
    }
```

```2018_06_01_11111_add_users_table.php
   /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('email');
        });
    }
```

- マイグレーションを実行して、カラムを追加する

```
$ php artisan migrate
```

#テーブルのカラム名を変更

- マイグレーションファイルを作成
- laravelのデフォルトでは、カラム名の変更はできない
- doctrine/dbalをインストールしないといけない

```
$ composer require doctrine/dbal
```

- renameColumn( ) を使用する
 - upメソッド内には、'現在のカラム名', '変更後のカラム名'の順番

```2018_06_01_11111_add_users_table.php
   /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->renameColumn('email','tel');
        });
    }
```

- downメソッド内には、'変更後のカラム名', '現在のカラム名'の順番

```2018_06_01_11111_add_users_table.php
   /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->renameColumn('tel','email');
        });
    }
```

- マイグレーションを実行して、カラム名を変更する

```
$ php artisan migrate
```
文系大学生がIT企業で長期インターンしてみた(現在進行形)

#経歴
地方の公立大学に在学中のゴリゴリ文系。
「あの学部の奴らって何勉強してんの？」
って言われるような学部で、単位を取得するだけの学校生活を送る。
アルバイトはアミューズメントバーでしていて、なかなか面白い経験をしたり、
趣味も大学からスキューバダイビングを始めたりして、まぁそれなりに楽しい生活を送っていた。

一応国際系の学部だったので、１年休学して前半に金貯めて、後半に海外でも行こうかなと考え休学。お金を貯める手段としてアルバイトだけでなく、iphoneアプリ作ろうと考え、ちょっと勉強してランサーズとかで仕事をもらった事もあった。その時にプログラミングに初めて触れて、楽しいと思うと共にビジネスに興味を持つようになり、ちょうどこの時、所謂意識高い系になり始めた。そして後半に予定していた海外留学をやめ、東京でインターンをする事にした。

#インターンでやってきた事
基本的に２日〜４日/週、６〜７時間/日で稼働

###１２月
PCのセットアップやインターンの仕事内容についての研修(主に品質管理)、ドットインストールでプログラミングの基礎の勉強(HTML,CSS,Javascript,PHP,MySQL,ローカル開発環境構築)

###１月
主な仕事として品質管理を行い、テストが無い時は課題としてPaizaの練習問題のSランク取得が課されたのでPHPでそれに取り組む。さらに中旬あたりに新たな課題として、会社が自社開発しているクラウドサービスの利用状況分析アプリケーションの改善を課される。

###２月
Paizaの課題が完了したので、品質管理の仕事がない時は、分析情報アプリの改善課題を進める。社長の意向として「上流もきちんとできるエンジニア」になって欲しいとのことだったので、上流工程から下流工程まで通しでやってみる事に。
２月は要件定義と画面イメージ設計あたりを行なった。要件定義の時が一番手間取った。そもそも上流工程の存在すら知らなかったし、業務フローの把握やフローチャートの作成とかasis tobeとかもなんのこっちゃって感じだったから、理解して物を仕上げるまでめっちゃ時間かかった。

###３月
外部設計が始まった。ここもかなり時間かかった。
業務フローやロジックツリーからあるべき像を導き出し、必要な機能を考え社長と打ち合わせ。修正。打ち合わせ。修正。って感じだった。基本的に、作ったものは週１くらいで社長に見てもらってた。いつも「初めてにしてはよく出来てる」とは言ってくれてたけど、まぁ全然ダメだったと思う。

###４月
４月は学校や就活が始まったりしてなかなかインターンが出来なかった。軽く炎上しかけた事案があったらしく、品質管理のテストが結構入っていた。だから改善課題はあまり進まず、外部設計の完成に留まった。

###５月
内部設計が始まり、テーブル定義書やシーケンス図を書き始めた。まぁやっぱりこれも結構時間がかかった。テーブル定義書に関しては、まず今あるテーブルを知らないといけないから、エクセルで管理してある既存の定義書を読み、どこにどんなデータが保存されているか調べた。テーブル名とかカラム名の意味がわからない物があったので、社員さんに聞きながら、新たに必要になるであろうテーブルを考えた。
シーケンス図に関しては、
１ MVCについて学ぶ
２ 使用しているフレームワークについて学ぶ
３ それぞれの画面とControllerの関係、ControllerとServiceとDAOの関係などをコードを掘りつつ理解する
４ 自分が追加したい機能を実装するのに使えそうな既存のメソッドを把握し、足りないものは新たにファイルを作る構想を立てる
以上の４段階が必要だった。フレームワークやGitもここで初めて触ったし、現場のソースコードを見たのもこれが初めてだったのでテンション上がってワクワクしてた。その反面コードを掘ってく内に迷子になったり、調べてもよくわからないものが結構あったりしたので、社員さんにかなり助けてもらった。２日〜３日くらいずっとソースコードとにらめっこして大体の動きは把握できたので、それからシーケンス図を書き起こし始めた。

###６月
１４日現在：シーケンス図が完成し、今後の予定のWBSを作成。正直ここまでの作業は工数とか全く予想できなかったのでWBSを作成していなかった。これは本当に反省。予想でもいいから予定立てとくべきだった。締め切りが無いと目的意識が低くなる。今日WBSを作成した結果、全工程が終了するのが１０月の頭だという計算になった。作成したい画面が８画面くらいあって、難易度別に分割して、「設計→開発→単体テスト」のサイクルを回す予定。

#プライベートでやっている事
インターンが無い日も自宅でプログラムを作ったりフレームワーク使ってみたりしてます。
今までやってきたことは
・VirtualBoxを使ってLAMP環境の構築
・Vagrantのプロビジョニング
・3minutes networkingでネットワークについて勉強
・CakePHP、Boopstrap、js関連のライブラリを使ってアプリケーションの開発

現在とりあえず就活がひと段落して時間が確保できるようになったので、あるお方のサイトを丸々パクってみようと考えています。以下、これから学習する予定の技術です。
・Rails
・GraphQL
・React
・Redux
・Google Cloud Platform
・Heroku
・CloudFlare

プライベートで勉強してることは別の記事に書いていく予定です。

全くの未熟者ですので、「これは勉強しとけ」「これは読んどけ」ってことは教えてくださると嬉しいです。
また、拙い文章で申し訳ありませんが、記事内に間違いや読みにくいところがあればどんどんツッコンでください。よろしくお願いします。
GUI付きLXDコンテナの作り方

# GUI付きのLXDコンテナ
　GUI全盛の時代に生きている身としてはなんだかんだ行ってもGUIが欲しい。というか、GUIないとどうしようもない作業も多い。LXDを開発環境にしている身としてはGUI付きの環境構築技術は必須である。ので、ここにメモを残しておく。前はxrdpを使っていたがFireFox上で右クリックをするとフリーズするというバグに悩まされたので環境を作り直した。
6月27日追記:
 X2Goもフリーズするので結局vnc4serverで頑張っている。よく考えたらローカルでつながっているからそんなに無駄をそぐ必要はなかった。
7月29日追記:
 1周回ってX2Goに戻ってきた。FirefoxのタブやサイズがおかしいのはLXDEでは比較的問題ない。ちょっとおかしい気もするが。
2021/02/25追記: Ubuntu 20.10上で20.04を動かすのにも使えた。X2GOくんなんかフルスクリーンでやるのは簡単だけどwindowでやるにはどうしたらいいんだこれ。
# 実施内容
　コンテナの名前をmelodicにしているがこれはROS melodicの開発環境を構築し直したときの手順を書き直しているためである。
`lxc launch ubuntu:18.04 melodic`
　ubunutuの公式リモートサーバーから18.04のイメージをダウンロードしてコンテナを作成するコマンド
`lxc exec melodic -- /bin/bash`
　作ったコンテナのbashにrootでログインするコマンド。
`vi /etc/apt/sources.list`
　jaistにレポジトリを書き換えるためにviで開く
`:%s/archive.ubuntu.com/ftp.jaist.ac.jp\/pub\/Linux/`
`:wq`
 書き換えて抜ける
`apt update;apt upgrade -y`
 言うに及ばず
`systemctl disable bluetooth`
どうやらBluetoothが有効だとx2goの環境だとエラーを吐かれるらしい。xrdpのときもBluetoothにはちょっと悩まされたのでリモートデスクトップと相性が悪いのだろうか。16.04だとこれを下のコマンドする前にしないとBluetooth周りでエラー吐かれる。
今回はx2goというソフトでGUIを飛ばすのでその関係のソフトとデスクトップ環境を入れる。
MATEを入れるなら以下のコマンド。2021年9月現在だととりあえずMATEを入れておくのが安定な感じがある。
`apt install -y x2goserver x2goserver-xsession ubuntu-mate-core`
LXDEを入れるなら以下のコマンド。背景が設定されていないので発狂したくなければここらへん(https://www.gnome-look.org/browse/cat/400/ord/latest/ )のを落とせばいいんじゃないだろうか。
`apt install -y x2goserver x2goserver-xsession lubuntu-desktop`
※2019/05/21追記　LXDEはUbuntu19.04だとQt使ってるのでX2Goでは使えない。Mateはいけるっぽい。
※2020/3/12追記　いつの間にかX2GOにLXQt対応が入っていたので試してみたが、なんか左上にウィンドウが張り付いてしまって閉じれなかったりウィンドウを開いてもタスクバーに表示されなかったりで不具合があったので推奨しない。
`passwd ubuntu`
　デフォルトで作成されているubuntuというアカウントにパスワードを設定する。
`exit`
コンテナから抜ける。
`ssh-keygen -t id_25519`
ssh鍵を生成していない人はこのコマンドで生成すればよい。同じ手順でもう一度作る場合はやる必要はない。デフォルトの場所に保存しない場合は次のコマンドの場所を適宜読み替えること。自分はパスフレーズを設定しなかった。ローカル用だし。
2021/02/25追記:　暗号の人間がデフォルトのrsa推すのもあれだったのでid_25519に変えた
`lxc file push ~/.ssh/id_25519.pub melodic/home/ubuntu/.ssh/authorized_keys`
sshの鍵をコンテナにコピーしている。これでSSHで入れるようになる。x2goはsshを通じて通信をするらしい。
`apt install -y x2goclient`
ホストにx2goのクライアントソフトを入れる。
`lxc list`
x2goで入るためにIPアドレスを確認する。
あとは適当にクライアントを設定すればx2goで入れる。
文字サイズがおかしいときは外観の設定(Appearance)をいじること(MATEの場合)
~~firefoxのタブのサイズや文字サイズがおかしいのは治っていないが倍率を調整して使っている。chromiumは多少マシ。~~LXDEにしたら我慢できる程度に解決した。
フルスクリーンのショートカットはCtrl+Alt+F。
日本語IMEはibus-mozcを使っている。
#参考文献
https://blog.simos.info/how-to-use-the-x2go-remote-desktop-with-lxd-containers/
http://futurismo.biz/archives/6880/
https://wiki.x2go.org/doku.php/doc:usage:x2goclient#keyboard_shortcuts
Javaのラッパークラスとプリミティブ型の同値比較

とあるプロジェクトでラッパークラスとプリミティブ型の同値比較が誤っていたので、新人さんに向けに記事にしました。

```java:DemoApp.java
public class DemoApp {
    
    public static void main(String[] args) {
        Integer x = 999999;
        Integer y = 999999;
        int z = 999999;

        // ラッパークラスの == 比較
        if (x == y) {
            System.out.println("same");
        } else {
            System.out.println("other");
        }

        // ラッパークラスの equals メソッドによる比較
        if (x.equals(y)) {
            System.out.println("same");
        } else {
            System.out.println("other");
        }

        // ラッパークラスとプリミティブ型の == 比較
        if (x == z) {
            System.out.println("same");
        } else {
            System.out.println("other");
        }
        
        // ラッパークラスとプリミティブ型の equals メソッドによる比較
        if (x.equals(z)) {
            System.out.println("same");
        } else {
            System.out.println("other");
        }
    }
}
```

```console:実行結果
other
same
same
same
```

同じ数値のラッパークラスとプリミティブ型の変数を定義して同値比較した結果です。

| 項番 | 条件 | 結果 |
|:----:|------|------|
| 1 | ラッパークラスとラッパークラスを`==`で同値比較 | **異なる** |
| 2 | ラッパークラスとラッパークラスを`equals`メソッドで同値比較 | 同じ |
| 3 | ラッパークラスとプリミティブ型を`==`で同値比較 | 同じ |
| 4 | ラッパークラスとプリミティブ型を`equals`メソッドで同値比較 | 同じ |

`==`は同じインスタンス（オブジェクト）を指し示すかどうかを判断するものですが、ラッパークラスとプリミティブ型でも**同じ**と判断されるのは面白いですね。
もっとSwiftのリテラルを活用しよう!!

皆さんこんにちは、最近Swiftでのリテラルの扱いが面白いな〜
と思って使っていたので、周知できればと思い記事にしてみました。

#そもそもリテラルとは

リテラルとは英語で"文字どうり"という意味の言葉です。
ソースコード内に値を直接表記したものを言います。

例えばこんな


```swift
let str = "hoge_hoge" // これはStringを生成するリテラル

let int = 1000 // これはIntを生成するリテラル

let double = 3.141 // これはDoubleを生成するリテラル

let array = [1, 23, 67] // これはArray<Int>を生成するリテラル
```

こんな感じで高級言語と言われるものには大概リテラルが存在します。
Swiftだと`Image`リテラルや`Color`リテラルなんてのもありますね。

<img width="284" alt="スクリーンショット 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/117659/0e71e82d-9d69-68e5-c155-78296776e36c.png">

便利なリテラルですが、コンパイラとの繋がりが強いので多くの言語では
プログラマがどうこうできるものではないことが多いです。

#Swiftのリテラル !

Swiftは便利なことにリテラルによるイニシャライザを提供しています !
例えば標準ライブラリの`IndexPath`は実は配列リテラルから生成するとこが可能です。

```swift
tableView.scrollToRow(at: [0, 0], at: .top, animated: true)
//↕︎ 同値
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
```

こんな感じにリテラルを使うことによって、簡潔に表記することができます。

#もっと便利に !

当然リテラルからのイニシャライズは自分で実装することも可能です。
試しに`CGPoint`を配列からイニシャライズできるようにしてみましょう。

```swift

extension CGPoint: ExpressibleByArrayLiteral{
    public typealias ArrayLiteralElement = CGFloat
    
    public init(arrayLiteral elements: CGPoint.ArrayLiteralElement...) {
        self.init(x: elements[0], y: elements[1])
    }
}
```
これだけです。
ねっ？、簡単でしょう？

これでCGPointをリテラルから生成できるようになりました。

```swift
someView.frame.origin = [100, 100]
//↕︎ 同値
someView.frame.origin = CGPoint(x: 100, y: 100)
```
型予測が効くので`[100, 100]`を`CGPoint`だと認識してくれます。

#最後に
いかがでしたでしょうか？
Swiftの素晴らしさが少しでも伝わってくれればと思います。

デワデワ...

###おまけ

(私はCSSとかの色表現に慣れているのでこんなこともやってます。)

```swift
someView.backgroundColor = 0xff0000
//↕︎ 同値
someView.backgroundColor = .red
```
本当にデワデワ
ローレンツ曲線を描いて変化をみてみる

格差を可視化する手法であるローレンツ曲線。その特性をグラフを描いて理解してみる。

特にまとめはない。

# 2種類の格差
格差は2種類ある。人数と、なんらかの保有量の2変数を考えると、それぞれの偏りが格差になる。

* 人数がほぼ均等だが、保有量に格差がある
* 保有量がほぼ均等だが、人数に格差がある

# コード
https://gist.github.com/tamanobi/d80306f2fd8b3239dc81ba3a4f34415f

# Reference
https://en.wikipedia.org/wiki/Lorenz_curve
https://www.slideshare.net/itoyan110/r2-50914245
https://cran.r-project.org/web/packages/ineq/ineq.pdf
Javascriptの便利なライブラリ（メモ）

Javascript勉強中に出逢ったライブラリたち
ただいま中身確認中（ーー；
１：Jquery
https://jquery.com/

2:Tooltipster
http://iamceege.github.io/tooltipster/

３：Magnific Popup
http://dimsemenov.com/plugins/magnific-popup/

なかみ確認したら更新しまする。。。
Nuxt.js on Google App Engine（GAE)

# Nuxt.js on GAE
Nuxt.jsは、Vue.js向けのSSR用フレームワークで日本語ドキュメントも充実しており、SSRしないページでも開発するのには十分な機能をもっているといえる便利なものです。
[Nuxt.js - 日本語公式ドキュメント](https://ja.nuxtjs.org/)

また、GAEとはGoogle App Engineの略で、**一言で言うならば PaaS**です。スタンダード環境、フレキシブル環境と呼ばれる2種類の環境があり、スタンダード環境は無料枠で利用ができます。

## Node.js がスタンダード環境で利用可能に
スタンダード環境では、Java,Python, PHP, Go のみ利用が可能でしたが2018年6月12日にNode.jsがサポートされました。
[Google App Engineがスタンダード環境でNode.jsをサポート。パッチ適用は自動、カスタムドメインでのHTTPSも利用可能](https://www.publickey1.jp/blog/18/google_app_enginenodejshttps.html)

つまり、今までは `nuxt generate` などで静的サイトを生成しNetlifyなどで配信していましたがGAEを使用してサーバサイドレンダリングでコンテンツを提供することが可能になったということになります。

# クラウドシェル

Google Cloudで作業するには、 Google Cloud Shellというものを使用すると大変便利なので、この記事ではCloudShellを使用していることを前提に説明を進めていきます。
CloudShellの説明は割愛させていただきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62429/23b2904a-6d33-65fd-fdee-e7db882fec33.png)


# 初期設定

まずは、 Nuxt.ｊｓ のチュートリアルに沿ってプロジェクを作成します。

```bash
$ vue init nuxt-community/starter-template nuxt-gae
$ cd nuxt-gae
$ yarn
```

# ビルド

デプロイをする前に、ファイルをビルドしておく必要があります。

```bash
$ yarn run build
```

# HOST/PORTを設定
`package.json` を開き、PORT番号に `8080` を、HOSTには`0.0.0.0` を設定するようにします。

```json
"start": "HOST=0.0.0.0 PORT=8080 nuxt start",
```
# app.yamlの設置

GAEに関する設定を記入したりするファイル `app.yaml` を用意します。
内容は下記のようにします。

```app.yaml
runtime: nodejs8
env: standard
```

# デプロイ

もし、ローカルや選択しているプロジェクトが違う場合は `--project <プロジェクト名>` でプロジェクトを選択します。

```bash
$ gcloud app deploy

descriptor:      [/home/****/src/****/nuxt-gae/app.yaml]
source:          [/home/****/src/****/nuxt-gae]
target project:  [*****]
target service:  [default]
target version:  [20180614****]
target url:      [https://*****.appspot.com]


Do you want to continue (Y/n)? y [ENTER]

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 0 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...|

Deployed service [default] to [https://****.appspot.com]
You can stream logs from the command line by running:
  $ gcloud app logs tail -s default
To view your application in the web browser run:
  $ gcloud app browse
```

リリースされると、 `target url` で表示されたURLにアクセスができるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62429/7f119247-1c14-fc42-9fd1-9ca4e35f55e3.png)

# まとめ
* ポイントは、 `package.json` にHOST/PORTをちゃんと設定すること
* app.yamlもちゃんと用意して、環境はstandardを選ぶ
* 静的ファイルの設置ではなく、SSRをすることができる。
iframeやvideo要素を縦横比を保ったまま縦にも横にもcssのみでレスポンシヴ

横幅に合わせて縦横比を保ってレスポンシヴはよく見かけるのですが、縦幅に対してもレスポンシヴ(vhを使いたい時など)を見つけられなかったので備忘。

#サンプルの仕様
* iframeの縦横比は[16:9]にて
* 幅はWindow幅に対して[100%]
* 高さはWindow高さに対して[80vh]

※[ ] … 必要な値に適宜置き換えて使えると思います。

#html

```
<div class="responsive-vertical">
  <div class="responsive-horizontal">
    <iframe width="560" height="315" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
  </div>
</div>
```

#css

```
.responsive-vertical{
  max-width: 100%;
  width: calc(80vh * 16 / 9);
  max-height: 80vh;
  margin: 0 auto;
}
.responsive-horizontal{
  position: relative;
  padding-top: calc(9 / 16 * 100%); /*56.25%でもOK。わかりやすいように式で出してます。*/
}
.responsive-horizontal iframe{
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
```

#CodePen
https://codepen.io/tkshrs/pen/NzvaxK

もっと簡単な方法ご存知の方いらっしゃいましたら教えてくださいませ〜
ABC085 D - Katana Thrower 精進と振り返り

#問題
- [ABC085 D - Katana Thrower](https://beta.atcoder.jp/contests/abc085/tasks/abc085_d)
- [Editorial](https://img.atcoder.jp/abc085/editorial.pdf)

##自分のたどり着いたアイディア
- i番目の刀を使うと決めたならば、最終的にはその刀は投げるべき
- $a_i$の最大値$\max(a)$よりも$b$が小さい刀は使う価値がない
- 投げるだけ投げてから、$\max(a)$の刀を先に何回振るかと考えればよい

##Editorialの解説における表現
- すでに投げてしまった刀も振ることができるというルールに変更しても問題の答えは変わりません。
- However, the answer does not change if we change the rule to allow wielding a katana that you have already thrown.

##解法を忘れたつもりで、もう一度思いつくためにどうするかを考える

### Hを出すための最小回数と言われた

- 攻撃回数を決めて最大ダメージを出すには？ => Hを出すための最小回数xから、xで出せる最大値Hとの間の相互変換が可能？
- ある攻撃回数でHを出せるかを判定するには？→あまり実りはなかった。疑問: 最小最大問題を判定問題に置き換えることで実りがあるのはどのような場合だろうか？
- 判定できればバイナリサーチが可能

### 一度投げた刀はもう使えないという条件

- 一見ややこしい
- 本当にややこしいのか？単純な条件に同値変形できるのではないか？
- この**ややこしい条件を無視したらどうなるのか？**→やってみる→答えは変わらない、条件を無視したときに振る回数が決まれば先に振っておくことにすればいいだけだから。

### 実験
- N=1で実験→「i番目の刀を使うと決めたならば、最終的にはその刀は投げるべき」に気づく
- N=2,3で実験→これをしていたときはあまり気付きがなかった

###教訓？
- 手を動かそう
- ルールを破ってみよう

##書いたコード
```python
N,H = map(int,input().split())
a=[]
b=[]
for i in range(N):
    x,y=map(int,input().split())
    a.append(x)
    b.append(y)

maxA = max(a)
b.sort()
b.reverse()

ans=0
index=0
for throwedKatana in b:
    if throwedKatana < maxA:
        break
    H -= throwedKatana
    ans += 1
    if H <= 0:
        break
if H > 0:
    ans += H//maxA
    if H%maxA != 0:
        ans += 1
print(ans)
```
ラズパイにmonoをインストールしてVisual Studio 2017からC#アプリをリモートデバッグする

Raspberry Pi 3にmonoをインストールするとC#アプリケーションを実行できますが、開発中には実機で起動しているC#アプリをリモートデバッグしたいのが人情だと思います。実は、monoにはリモートデバッグのツールがあって簡単にリモートデバッグを実現することができます。

#Monoのインストール#
Monoは、apt-getで最新モジュールを取得できるようになりましたが、そのためにはapt-getのリポジトリにMonoのプロジェクトを登録しておく必要があります。なお、--recv-keysにセットするキーは[こちらのサイト](http://www.mono-project.com/download/stable/#download-lin-raspbian)を参照して下さい。

```shell
#以下の依存関係をインストールする
sudo -E apt-get install dirmngr

#以下のコマンドでキーを更新します（プロキシ経由でなければhttp-proxyパラメータは不要です）
sudo -E apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-option http-proxy=YOUR_PROXY_SERVER:PORT --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF

#以下のコマンドで、apt-getリポジトリにMonoのリポジトリを追加します
echo "deb http://download.mono-project.com/repo/debian raspbianstretch main" | sudo tee /etc/apt/sources.list.d/mono-official.list

#リポジトリのリストを更新します
sudo -E apt-get update

#以下のコマンドでMonoをインストールします
sudo -E apt-get install mono-complete
sudo -E apt-get install mono-dbg
```

#Monoリモートデバッガのインストール#
リモートのVisual Studioから、デバッグを実行するためにラズパイ上にMonoのリモートデバッガをインストールします。

```shell
#https://github.com/techl/MonoRemoteDebugger から最新版をダウンロード
#ダウンロードファイルをscpで/home/YOUR_USER_NAMEにアップロード
#sshでunzip –d debug MonoRemoteDebugger.Server.zipを実行
#mono MonoRemoteDebugger.Server.exeを実行 → リモートデバッガがLinuxマシン上で起動する。
```

リモートデバッグを実行すると、/home/YOUR_USER_NAME/debug配下にGUIDをもつディレクトリが作成されます。Visual Studioのbin/Debugに配置されていた実行モジュールがこちらにコピーされ、そこをカレントディレクトリとしてデバッグが実行されます。このGUIDはデバッグ起動のたびに変わるため、適当なタイミングでdebugディレクトリ配下のファイルを削除してください。

少し挙動不審なところもありますが、まぁ普通にデバッグできます。ただし、マルチスレッド部分おデバッグは期待しないで下さい。途中でブレイクしてステップ実行などは期待通りに動きません。
CSSアンチパターン集

主に自分がやらかしたのを書いています。
こういうのもあるよ！などがあれば、編集リクエストください。

# 設計のアンチパターン

## そもそもCSS設計がされていない
**何が起こるか**

- 少し変更するためだけに大量のHTML/CSSを読まないといけなくなる
- 変更の影響箇所が把握できず、1ヶ月前の変更で崩れた箇所が発見されたりする
- クラス名が重複する（もちろん重複していることには気づかない、stylelint?何それ状態）
- 新しいCSSをどこに書けば良いのかわからない

**どうやって回避するか**

- １文字目を書き始める前にCSS設計をする
- 事前にディレクトリ構成を決める

## stylelintが導入されていない
**何が起こるか**

- 詳細度がバラバラになり、`!import`が大量に書かれる
- タグにスタイルが定義されている箇所が多くなり、HTMLを修正するとデザインが崩れる

**どうやって回避するか**

- stylelintを導入し、エディタで使えるように設定する
- Sider(旧SideCI）を使う

## 命名規則がない
**何が起こるか**

- クラス名が属人化する（ハイフンの個数やアンダーバーの個数が書く人によって違う）
- 新しいクラス名を作るときに緊張する（重複しているかどうか確認しないといけなくなる）

**どうやって回避するか**

- BEMを使う（stylelintでBEMを強制することもできます）

## 対象ブラウザが決まっていない
**何が起こるか**

- リリースした後に「動かないんですけど」が発生する（※業務系アプリの場合は要注意）
- 使って良いCSS/JSが分からない
- 最終確認をする人のパソコンでだけ動かない（ブラウザが違う、パソコンが古い...etc.）

**どうやって回避するか**

- 対象ブラウザをGitHubリポジトリのWikiなどに書いておく

## モバイルファースト、デスクトップファーストが決まっていない
**何が起こるか**

- メディアクエリのパターンが多くなる
- 特定の範囲でデザインが崩れる

**どうやって回避するか**

- 使用するメディアクエリをGitHubリポジトリのWikiなどに書いておく

## 1ファイルに全てのCSSが書かれている
**何が起こるか**

- エディタが重くなる
- ほとんど全ての変更がコンフリクトする

**どうやって回避するか**

- Sass(SCSS), PostCSSなどを使ってファイルを分割する

# コーディングのアンチパターン

## normalize.cssなどが導入されていない
**何が起こるか**

- ブラウザごとに対応しないといけない箇所が大量に発生する

**どうやって回避するか**

- normalize.cssを使う
- CSSフレームワークを使う

## box-sizingが全称セレクタで書かれていない（賛否あると思います）
**何が起こるか**

- paddingを使うとデザインが崩れる
- box-sizing: border-box;が大量に現れる

**どうやって回避するか**

- `* { box-sizing: border-box; }`を書く

## LVHAが守られていない（:link,:visited,:hover,:active）
**何が起こるか**

- なぜか`:active`のスタイルがきかない

**どうやって回避するか**

- LOVE and HATEで覚える

## プロパティの継承が使われていない
**何が起こるか**

- font-size, colorが大量発生する

**どうやって回避するか**

```html
<div class="article__meta">
  <span class="article__published">2018-06-14</span>
  <span class="article__author">投稿者</span>
</div>
```

```css
.article__meta {
  font-size: 12px;
}
```

## 色が変数で管理されていない
**何が起こるか**

- 使われている色が把握しにくい
- 何色にすれば良いのか分からなくなる
- 色が増えすぎる

**どうやって回避するか**

```colors.scss
$color-gray-3: #333;
$color-gray-6: #666;
$color-gray-9: #999;
$color-gray-c: #ccc;
```
Gitリポジトリから一部のテキストを抜き出して翻訳を始めるまでにかかった3日

# はじめに
これは私があるリポジトリの翻訳をするために試行錯誤したもののなれの果てです。どうかみんなはこれを見て屍を越えてくれ……。

# Gitでごちゃごちゃやった内容
## やりたかったこと
[CommonMark](https://github.com/commonmark/CommonMark)には、README.mdの他にspec.txtというCommonMarkの仕様書が入っている。翻訳をしようとするが、ここにはほかのファイルもあって全部Cloneするのは面倒そうだった。そこで、README.mdとspec.txtのみをリポジトリから引っ張ってきて、翻訳対象のみをgithubで管理。あわよくばその後の更新も追随できるようにしたかった。したかった……。

ちなみに環境は

```
Windows 10
git version 2.13.1.windows.2
```

## Take away
sparse-checkoutはこの用途には向かない。filter-branchで頑張るしかない。

## やったこと
### sparse-checkout
[Gitで他のリポジトリから一部のファイルのみをcloneする方法](http://dxd8.com/archives/223/)というのを見つけた。ふむ、sparse-checkoutなるものがあるのか。

とりあえずやってみた。調べると多くはcloneするものが多かったが、[こちらのサイト](https://mseeeen.msen.jp/git-sparse-checkout/)では最初から一部を抜き出す方法でやっていたのでこれに従う。

```shell
git init
git config.sparsecheckout true
git remote commonmark https://github.com/commonmark/CommonMark.git
echo "README.md" > .\.git\info\sparse-checkout
echo "spec.txt" >> .\.git\info\sparse-checkout
git pull commonmark master
```

おお、できてるできてる。確かに2つしか入ってないぞ。

<img width="162" alt="commonmark1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/144329/c0185ba2-0701-d126-567e-dc91bf57db58.png">

これをpushしてgithubで管理で切れば完璧だ。しかし……

<img width="770" alt="commonmark2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/144329/9646464f-b473-8e72-5b09-be3dcb3456c0.png">

現実は甘くなかった。sparse-checkoutはあくまで一部をcheckoutして作業ディレクトリに出す機能なので、ブランチには全部のファイルが残っているのである。巨大なリポジトリの一部のみ編集したいというときのための機能だろう。しかし、これでは今回は意味がない。一部を残してきれいさっぱり消滅させたいのだ。

###filter-branch
どうもfilter-branchでそういうことができるらしい。巷では[最強のオプション](https://qiita.com/Spring_MT/items/f60c391b5dbf569a1d12)と呼ばれているとか。強い。しかし調べてみても「特定のファイルのみ除外する」のは簡単でも、「特定のファイルのみ残す」というのはあまり想定されていないようだった。サブディレクトリはできるんだけど……。地道にrmで消していくしかない。

```
git filter-branch --tree-filter 'rm -f 消したいファイルとか' -f HEAD
```

<img width="616" alt="commonmark3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/144329/b152c00f-1d6d-8ba9-fa20-b8a59601fb9f.png">

重要文書焼却ってこんな気持ちなのかな……。
CommonMarkの歴史は重く、風呂に入って洗濯物をたたんでもまだ終わっていなかった。そしてrmの使いかたが間違っており2度fatal errorで停止した。

<img width="752" alt="commonmark4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/144329/f70bd438-9eb2-9dca-8ff3-643667dc088e.png">

今度はうまくpushできた。コミットツリーもそのまま残っている。

#結論
2，3ファイルだけだし手動で引っ張ってきた方が早い。
ゼブラフィッシュの模様形成をシミュレーションしてみる

# はじめに

## 目的

- 反応拡散系を理解する
- [前回](https://qiita.com/Lirimy/items/3ecb550af79cc674e480) 確立した GPU の計算手法をさっそく適用してみる

この論文の再現を試みる。
特記なければ、引用はすべてこの論文から。

[Pattern regulation in the stripe of zebrafish suggests an underlying dynamic and autonomous mechanism.](http://www.fbs.osaka-u.ac.jp/labs/skondo/paper/yamaguchi2007.pdf)
Yamaguchi M, Yoshimoto E, Kondo S.
Proc Natl Acad Sci U S A. 2007 Mar 20;104(12):4790-3. Epub 2007 Mar 12.​

## 参考サイト

反応拡散系について
[Mechanism of pigment pattern formation](https://www.fbs-osaka-kondolabo.net/pigment-pattern)
[反応拡散波とは](http://www.fbs.osaka-u.ac.jp/labs/skondo/ozaki/what%20is%20RD%201%20by%20ozaki.htm)

反応拡散系の実装例
[チューリング波（反応拡散波）を理解したい](https://qiita.com/kanaya-tamihiro/items/a735c6f4ee8e914c5fc1)
[2次元Turingパターンの生成](https://qiita.com/SouTakenaka/items/b9d844c98e63dfe72adc)

反応系の代表例、反応拡散系の導入として
[FitzHugh-南雲モデルで遊んでみる](https://qiita.com/Lirimy/items/7bbac6ba07de8190920b)

# 論文の説明・補足

![zb.png](https://qiita-image-store.s3.amazonaws.com/0/202534/57176286-0dd7-2d71-9797-53d624d40a1d.png)

上の図は、ゼブラフィッシュにレーザーを当てて色素を消失させた部分に、注入した色素をもとに模様が再生する様子（上段）とそのコンピュータシミュレーション（下段）である。

![eq.png](https://qiita-image-store.s3.amazonaws.com/0/202534/406d9c42-6198-781d-f8fb-a65156621705.png)

シミュレーションは上の式に従ってやる。
ちなみに $\Delta u, \Delta v$ はラプラシアンで、時間の増分 $\Delta t$ と混同しないように。

論文中にセルサイズ $h$ が書かれていなくて引っかかったが、 $h = 0.05$ でうまくいった。 $h$ がこれより大きいと、縞が２つに分裂してしまう。
$h$ は拡散に関わっており、 $D_u / h^2 = 4, D_v / h^2 = 80$ の値が重要である。
$1/h^2$ はラプラシアン（＝２階微分）の操作で出てくる。

時間差分は $\Delta t = 0.001$ とした。
$4 \Delta t \, D_v / h^2 = 0.32 < 0.5$ で拡散の差分法の安定条件はぎりぎり満たしている。
一方、 $\Delta t \, D_u / h^2 = 0.004$ で、１０進法７桁精度の `Float32` でも桁落ちまでは心配しなくてよさそうである。$u \sim 1,\, h^2\Delta u \sim 0.1$ のとき $u+ \Delta t \, D_u \Delta u$ の精度が２から３桁になってしまうが仕方がないだろう。


# 結果

Julia Notebook
https://gist.github.com/Lirimy/4d39643abccc519e21c77d261c0b6079

初期状態
![zebra-ini.png](https://qiita-image-store.s3.amazonaws.com/0/202534/2cee2b55-b18a-13e8-144d-0db8acc67384.png)

経過（GIF アニメ）
![zebra5-10fps.gif](https://qiita-image-store.s3.amazonaws.com/0/202534/85530142-7aca-d907-24f3-0991ab524853.gif)

さらに２倍ぐらい時間が経った状態
![zebra6.png](https://qiita-image-store.s3.amazonaws.com/0/202534/a17aaa0f-f92a-b6ef-f8be-9fdc42475a6a.png)

論文 (256x128) より大きな領域 (256x256) でシミュレーションしたのだが、たぶんうまくいっていると思う。

GIF アニメの計算と画像出力 85 秒
GPU 使用率 30% ぐらい

それでも CPU （実装としては結構遅いと思うが）と比べると 50 倍以上速い。
ありがたいのは、CPU の（ベクトル的な）実装からほとんど変更なしに GPU で動かせること。
CPU でパフォーマンスを気にするよりも、何も考えずに GPU に載せたほうが良い。

と思っていたが、実は精度の検討は結果をまとめたあと、記事を書きながら行っていて、意外とシビアなバランスの上で成り立っていたということに気づいて震撼している。
androidでkotlinの入門　リバーシー２

前回はリバーシー(≒オセロ）のゲーム盤の表示
要はグラフィックの表示の仕方

今回は、画面へのタッチを検出して座標からどこが押されたかを判断

ゲームの処理は reversiGame で行うようにして、
ゲーム盤クラス(BOARD_DISP)を使って表示していました

```reversiGame.kt
class reversiGame : AppCompatActivity() {
    internal lateinit var boardBan :BOARD_DISP // ゲーム盤

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_reversi_game)

        // ボードを追加（表示）
        boardBan = BOARD_DISP(this, gameStaus, boardSelect)
        ban.addView(boardBan)
```




タッチは onTouchEvent() で検出できるので、reversiGame  で検出しようとしたのですが
意図したように、ボード上のマス座標が取れませんでいた


そこで、最初 BOARD_DISPでonTouchEvent()を使い、マス座標を求め

```BOARD_DISD.kt
    // ボード上でのタッチ検出
    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.getAction()) {
            MotionEvent.ACTION_DOWN -> {
                // タッチされた、マスの座標を求め
                val x = ((event.getX() - boardLeft) / masuSize).toInt()
                masuSelect.x = if (x < 9) {
                    val xmin = boardLeft + (masuSize * x) + fukantai
                    val xmax = boardLeft + (masuSize * (x + 1)) - fukantai
                    if (event.getX() > xmin && event.getX() < xmax) { x  } else { -1 }
                } else { -1 }
                val y = (event.getY() / masuSize).toInt()
                masuSelect.y = if (y < 9) {
                    val ymin = boardTop + (masuSize * y) + fukantai
                    val ymax = boardTop + (masuSize * (y + 1)) - fukantai
                    if (event.getY() > ymin && event.getY() < ymax) { y } else { -1 }
                } else { -1 }

                // 盤上をタッチされたかを判定
                masuSelect.InSw = if (masuSelect.x != -1 && masuSelect.y != -1) {
                    // 有効な座標
                    SELECT_MASU.IN_STATUS.MASU_SELECT
                } else {
                    SELECT_MASU.IN_STATUS.NON
                }
                // 上位(reversiGame)でタッチを検出してもらうため
                // 有効時 false で返している
                if (SELECT_MASU.IN_STATUS.MASU_SELECT == masuSelect.InSw) return false
            }
        }
        return true
    }
```

その後、reversiGame の onTouchEvent()で押された時の処理を行うという
面倒なことしてます

```reversiGame.kt
    // タッチされた時
    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.getAction()) {
            MotionEvent.ACTION_DOWN -> {
                if (boardSelect.InSw == SELECT_MASU.IN_STATUS.MASU_SELECT) {
                    // BOARD_DISDで盤上かの判断はしている
                    gameActionCheck(boardSelect)
                    return true
                }
            }
        }
        return false
    }
```

他にやり方があるとは思いますが、一応動いてはいます。

コードは[ここ](https://github.com/bokufolivora/Reversi)に置いてあります
Ruby on rails、5分でPV計測を導入する【impressionist】

もともとあるrailsアプリにお手軽にPV計測を導入する方法を書きます。
gemであるimpressionistを使い導入するので５分ほどで済むと思います。

※1PV毎に1レコード作成します


##インストール

```ruby:gemfile
gem 'impressionist'
```

```terminal
bundle install
```

##Impressionistテーブルを作成

```terminal
rails g impressionist
```

```terminal
rails db:migrate
```

##計測したいアクションに記述

Topicの詳細画面への遷移（Topic#show）を計測することとします。

```ruby:topic_controller.rb
  def show
    @topic = Topic.where(:id => params[:id]).first
    # ↓↓↓これを追加します。
    impressionist(@topic, nil, unique: [:session_hash])
    # ↑↑↑
  end
```

これでPV計測の仕組みは完成です。

## 計測したPVを表示する
適当に以下を追加してください。（hamlじゃない場合はいい感じにお願いします）

```haml:show.html.haml
【#{@topic.impressionist_count} PV】
-# 【55 PV】のように表示される
```

##サーバーを起動し直して確認

サーバーを起動し直して、
先ほどのPV計測が動いているのかを確認してください。

また、リロードして数字が増えなければ成功です。
はじめての要件定義で読むべきIPAドキュメント

<p>ソフトウェア開発の要件定義をやるにあたって、読んでおいた方が良いIPAのドキュメントを紹介します。</p>
<p>IPAとは、Wikipedia 先生によるとこんな団体です。</p>
<blockquote>
<p>独立行政法人情報処理推進機構（じょうほうしょりすいしんきこう、英: Information-technology Promotion Agency, Japan、略称：IPA）は、日本におけるIT国家戦略を技術面、人材面から支えるために設立された、経済産業省所管の中期目標管理法人たる独立行政法人である。</p>
</blockquote>
<p>※<a href="https://ja.wikipedia.org/wiki/IPA">「Wikipedia」先生引用</a></p>
<p>情報処理試験をやってる団体というと一番ピンと来るかもしれません。</p>
<p>ソフトウェア開発の標準化とかをやっているため「IPAのドキュメントにこう書いてあります！」って言うと根拠としては割と強めになります。</p>
<p>そのため、良いドキュメントが多いんですが、公式サイトでは新着順に分類されているため検索がしづらいんです。。（<a href="https://www.ipa.go.jp/sec/reports/index.html">こんな感じ</a>）</p>
<p>なので、おすすめをピックアップしてみました。</p>
<h3>おすすめドキュメント4選</h3>
<h4>① 家づくりで理解する要求明確化の勘どころ</h4>
<p><strong><a href="https://www.ipa.go.jp/sec/reports/20180327.html">家づくりで理解する要求明確化の勘どころ ～システム構築を成功させる要件定義のポイント～</a></strong></p>
<p>マイホーム購入を例に要件定義のポイントをわかりやすく解説しています。</p>
<p>ソフトウェア開発初心者でもとっつきやすい内容になっています。</p>
<p>概要はこちら（引用）。</p>
<ul>
<li>初期要求（ニーズ）を明確にする</li>
<li>どのようなシステムを作るかの前にどのような業務にするかを検討する</li>
<li>現行業務やシステムを把握し、To-Be の変化を明確にする</li>
</ul>
<ul>
<li>ステークホルダを洗い出す</li>
<li>ステークホルダ要求を明確にする</li>
<li>非機能要求など、その他の要求を明確にする</li>
</ul>
<ul>
<li>要求を目的展開する ～要求の妥当性を検証～</li>
<li>目的から手段を検討する ～要求の充分性を検証～</li>
<li>要求の価値／効果を判断し、要求を絞り込む</li>
</ul>
<ul>
<li>制約・前提条件を明確にする</li>
<li>制約条件や前提条件を考慮した現実案を検討する</li>
<li>要求の優先順位付けを行う</li>
</ul>
<ul>
<li>To-Be 業務での変化と価値をまとめる</li>
<li>ステークホルダと合意形成する</li>
<li>要件（仕様）として定義する</li>
</ul>
<h4>② デジタル変革に向けたITモダナイゼーション企画のポイント集 </h4>
<p><strong><a href="https://www.ipa.go.jp/sec/reports/20180214.html">デジタル変革に向けたITモダナイゼーション企画のポイント集～注意すべき7つの落とし穴とその対策～</a></strong></p>
<p>まずモダナイゼーションとは、、</p>
<blockquote>
<p>企業の情報システムで稼働しているソフトウェアやハードウェアなどを、稼働中の資産を活かしながら最新の製品や設計で置き換えること。特に、稼働後数十年経っていることも珍しくないメインフレームを中心とする基幹システムを刷新することを意味する場合が多い。</p>
</blockquote>
<p>※<a href="http://e-words.jp/w/%E3%83%A2%E3%83%80%E3%83%8A%E3%82%A4%E3%82%BC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html">「IT用語辞典」先生引用</a></p>
<p>既存システムを置き換えるような開発の要件定義で陥りやすいポイントをわかりやすく説明しています。</p>
<p>7つの落とし穴はこちら（引用）。</p>
<ol>
<li>「再構築だから」と企画・要件定義フェーズを軽視していませんか？</li>
<li>「今と同じ」という要件定義になっていませんか？</li>
<li>現行システムの調査が「表面的」になっていませんか？</li>
<li>業務部門はメンバの一員として上流工程から参加していますか？</li>
<li>現行システムが動いているから、品質保証を簡単に考えていませんか？　　</li>
<li>担保すべき「業務継続性」は明確になっていますか？</li>
<li>モダナイゼーションのリスクを甘く見ていませんか？</li>
</ol>
<h4>③ 非機能要求グレード</h4>
<p><strong><a href="https://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html">非機能要求グレード</a></strong></p>
<p>非機能要件に記載すべき内容がまとまっています。</p>
<p>非機能要件は、</p>
<ul>
<li>「可用性」</li>
<li>「性能・拡張性」</li>
<li>「運用・保守性」</li>
<li>「移行性」</li>
<li>「セキュリティ」</li>
<li>「システム環境・エコロジー」</li>
</ul>
<p>の6つの大項目に分類されますが、「06_活用シート.xls」で詳細な項目が一覧化されているため、チェックリストとして使用するのがおすすめ。</p>
<h4>④ 超上流から攻めるIT化の事例集</h4>
<p><strong><a href="https://www.ipa.go.jp/sec/softwareengineering/tool/ep/ep2.html">超上流から攻めるIT化の事例集：要件定義</a></strong></p>
<p>作成すべきドキュメントのサンプル集になります。</p>
<p>実際にどのようなドキュメントを作成すればよいのかはここを参照すればOK！</p>
<p>もちろん全て作成するのではなく、開発によって作成すべきドキュメントの精査は必要です。</p>
<p>（全部作ったらめっちゃ多くなる。。）</p>
<h3>さいごに</h3>
<p>もともとある観点やフレームワークを使うことで作業効率や精度が上がるので、こういったものはどんどん取り入れていくべきです。</p>
<p>但し、実際のプロジェクトでは思った通りに行かないことも多いので、そこはエンジニアの腕の見せどころ！笑</p>
<p>ではでは。</p>
Ruby | クラスをメソッドにする方法 (メタプログラミングRuby)

# 例

大文字をメソッドとして定義する。

```rb
def A(arg)
  p arg
end
```

普通にクラスを呼ぶと、クラスとして解釈される。

```rb
A # NameError: uninitialized constant A
```

引数を渡すとメソッドと解釈される。

```rb
A 'mimic!' # "mimic!"
```


# 環境

- ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
railsコマンド入力時に"Ignoring xxx because its extensions are not built.  Try: gem pristine xxx --version xxx"と表示される問題

## 解決方法

```console
$ gem prestine --all 
```

これでたいてい解決する。

## 解決しなかった場合

vender/bundle以下を削除して、再度bundle installし直します。

```console
$ rm -rf path/to/vender/bundle
```

```console
$ bundle install
```

```console
$ bundle exec rails xxx
```

これで表示が消えているはず。

また、nokogiriに関して、`WARNING: Nokogiri was built against LibXML version 2.9.0, but has dynamically loaded 2.9.4`
という警告文が表示されていたのですが、同時に消えてくれました。
Javascript製スライダー「Siema」を使った時のメモ

##これは飽くまで私個人が特定の環境下で使った場合のメモです
なので「自分でやったときはこれこれこうで違ってたんだけど。」てのは必ずあるはず。
その時は「こういう状況下でこれやったらこうなった」てのをコメントとして投げてもらえると情報が増えるので助かります。

##どんな環境で使ったの？
Railsで開発されたLP。
既に土台となる仕組みはできていたのと、そこに私は関わっておらず、既にViewやasset周りを自由にいじれる状況だったので実際にはJSファイルとHamlファイルしか触っていない。

##「Siema」ってなんぞ
公式ページ
[https://pawelgrzybek.github.io/siema/]
Git hub
[https://github.com/pawelgrzybek/siema]

とにかくめっちゃ軽いスライダー。
使い方も簡単な上、いろいろ設定もできる。そして無償で商用利用可能。

##使用時の注意点
ここからが私にとっての本題だったりする。
（なんでもそうだけど）サンプル見るとほんと簡単なんだが実際に何かに組み込もうとすると結構引っかかる。というか引っかかった。
「サービスの土台から全部自分で作りました！」って場合なら話は変わるかもしれないが。

###**HTML（今回はHaml）に埋め込まないと動かなかった**
パーシャルファイルに記述すると
```Something wrong with your selector 😭```
（絵文字含めて原文ママ）
がコンソールに表示されて一切動かなくなってしまった。
こちらの環境が問題なのかそういう仕様なのかは不明。

###**divタグで使わないと動かない？**
今回のスライドはフォーム形式だったので最初はこのようにやってみた。

```html
<form class="siema">
　<div class="inner01"></div>
　<div class="inner02"></div>
　<div class="inner03"></div>
</form>
```
まぁそもそもサンプルでdiv使ってるんだからそっちに合わせろよ、てのはごもっとも。

結局こんな感じで。

```html
<form class="form">
　<div class="siema">
　　<div class="inner01"></div>
　　<div class="inner02"></div>
　　<div class="inner03"></div>
　</div>
</form>
```

試してないけど恐らく同じブロック要素同士で中と外を組めば反応するのだろうか？

###**オプションの「onChange」に引数付関数は使えない**
Siemaには現在地を拾ってこれるパラメータ「currentSlide」がある。これは```this.currentSlide```と記述することで呼び出して使うことが可能。

それを引数とした関数をonChange = スライド切替時に発生する処理に記述したら
```uncaught typeerror cannot read property 'call' of undefined```
と出て処理ができなかった。

実際には、引数の有無に関わらず
```onChange:hoge()```
といった記述をすると発生する模様。

因みにイニシャライズ後の処理を入れられる「onInit」は括弧付の記述をしても引数を付けても特にエラーは出なかった。

なので、onChangeで関数処理を使いたい場合は、短いものならサンプル通り直接記述するか、長いものは引数無し・括弧記述無しにするとよさげ。

###**Siemaのオプションで使う関数にはjQueryは使えない**
例えheadで最新のjQueryを呼び出してページ内に埋め込んでSiemaを使っていてもSiemaのオプション（onInitやonChange）で使う場合は素のJavascriptで記述しないと処理してくれない。

今回、スライド本体と連動して動かす必要のあった別パーツもあったのでひたすら「document.querySelector」を使った。

とはいえ最近はjQueryから離れる流れも強めになってきてるし、フレームワーク無しでも動かせるのが利点なのでそこは割り切りで。

###**スライドの開始位置はオプションで変えられるけど素直にそのまま使ったほうがいいかもしれない**
前述の「スライド本体と連動して動かすパーツ」はスライド位置に応じてクラスを切り替える必要があった。

（あまりいいことではないのかもしれないが命名方法の云々については一旦置いておく）
クラス名にはスライドの位置に合わせて番号が振ってあったんだが最初1始まりで付けてたらややこしいことに……。
処理の中で「+1」などと調整するのもありだったかもしれないが結局クラス名をゼロに合わせる方を選んだ…。
もっとスマートな方法があるであろうことは重々承知してる。

###**スライドの前後移動だけでなくピンポイント移動もSiemaの関数でできる**
```goto()``` を使うことで、任意のスライドに直接移動させることができる。

公式によるサンプル
[https://codepen.io/pawelgrzybek/pen/gWYLXP]

##最後に
私が使ったのは本当にごく一部の機能だけだが、公式を見るとわかるように結構いろんな機能がある。
今回は使わなかったけどループ制御もこういったスライダー系UIにはよくありそう。
また使った時にはメモ増やすかも。

##追記
*2018-06-15：*
・シンタックスハイライトのご指摘ありがとうございます。反映致しました。

###**スマホでも動くものの、Android（最新版で確認）上ではテキストボックスに入力できない現象が発生。**
キーボードは立ち上がるが入力しようとすると弾かれてしまう。原因は不明だがコードを見るとタッチ関係のイベントを制御していると見られる箇所があるのでその辺のせいかもしれない。
iPhone（Chrome／Safari）は特に問題なく動く。

###**minではなく通常の「siema.js」を使う場合はES6に対応必須**
大抵は高速化のためなどでminの方を使うと思うのだが、もし何かの理由で圧縮前のコードを使いたい場合はES6に対応した環境が必要。
【備忘録】PyCharmセットアップ(windows版PyCharmをアンインストール、インストールを繰り返した)


(元ﾈﾀ)【備忘録】PyCharmセットアップ
https://qiita.com/manamiTakada/items/22dea1a87da2b0c94cce
#OS
windows7(64bit)
#アンインストール、インストールを繰り返した
いっぱいエラーがでました。まとめてありません。
Failed to install Python packaging tools
C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\packaging_tool.py untar C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\setuptools-39.1.0.tar.gz
ModuleNotFoundError: No module named 'contextlib'

Invalid Python SDK
Cannot set up a python SDK 
at Python 3.6 (untitled3) (C:\Users\xxx\PycharmProjects\untitled3\venv\Scripts\python.exe).
The SDK seems invalid.

Failed to Create Interpreter
Cannot retrieve the version of the detected SDK: C:\Users\xxx\AppData\Local\Programs\Python\Python36-32\python.exe

Environment location directory is not empty

Settings Import Failed
Unable to import settings. 'C:\Program Files\JetBrains\PyCharm Community Edition 2017.3.2' doesn't appear to be a valid PyCharm installation home.

Edit configuration
Error: Please select a valid Python interpreter

Invalid Python SDK
Cannot set up a python SDK 
at Python 3.6 (untitled3) (C:\Users\xxx\PycharmProjects\untitled3\venv\Scripts\python.exe).
The SDK seems invalid.

ModuleNotFoundError: No module named 'contextlib'

Windows セキュリティの重要な警告
このプログラムの機能のいくつかが Windows ファイアウォールでブロックされています
名前(N):PyCharm
発行元(P):JetBrains s.r.o.
パス(H):C:\program files\jetbrains\pycharm community edition 2018.1.4\bin\pycharm64.exe

2018/06/13
20:05	Install packages failed: Installing packages: error occurred. Details...
20:07	Install packages failed: Installing packages: error occurred. Details...

sympyもインストールしてみた。
Default Settings...
Package 'sympy' installed successfully
Event Log
2018/06/14
8:46	Packages installed successfully: Installed packages: 'sympy'
#現在
どれが何かわからない状態。python.exeがいくつあるかわからない状態です。
C:\Users\xxx\
.jupyter
.PyCharmCE2017.3
.PyCharmCE2018.1
FreeCAD 0.16
Python 3.6 (64-bit)
JetBrains PyCharm Community Edition 2018.1.4
#教えて下さい
「Python 仮想環境管理」おすすめのページを教えて下さい。よろしくお願いします。
Xcode file templateを管理するためのCLIツールを作ってみた

# Xcode file templateを管理するためのCLIツールを作ってみた

みなさん、Xcode file template使ってますか？
Xcodeから新規ファイルを作るときに出てくるアレです。
<img width="733" alt="スクリーンショット 2018-06-14 19.59.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/84888/7d34f59f-b634-97b0-624b-280fd46868e5.png">

実はこのファイルテンプレート、自作することができます。
<img width="734" alt="スクリーンショット 2018-06-14 20.01.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/84888/0b0fe424-6621-e36e-3189-66d9a6f5b8c8.png">

自作の方法について、詳しくは[Xcodeのファイルテンプレートを自作する](https://qiita.com/shu223/items/5d8a245e5743f77df9eb) を見ていただければわかるのですが、
`.xctemplate` というフォルダに、
- `TemplateInfo.plist`
- `TemplateIcon.png`
- `___FILEBASENAME___.swift`
などの必要なファイルを配置して、
`~/Library/Developer/Xcode/Templates/File Templates/` ディレクトリ以下に`.xctemplate` を配置することで、自作テンプレートを使うことができるようになります。

今回、この`.xctemplate`をGitHubなどのGitホスティングサービスからダウンロードして利用できるような[Donut](https://github.com/natmark/Donut) というCLIツールを作成しました。

# tl;dr
作ったもの
Donut (https://github.com/natmark/Donut)

## Donutのインストールについて

[Mint](https://github.com/yonaskolb/Mint)というSwift command line tool用のpackage manager経由でインストールすることができます。

```zsh
$ mint install natmark/Donut
```

## Donutの使い方
- `.xctemplate` が含まれていて、Tagがつけられているリポジトリに対して、Donut経由でインストールすることが可能です。

<img width="880" alt="スクリーンショット 2018-06-14 20.23.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/84888/bcd10967-e23e-0ce5-f64a-d8716b1b662f.png">

![Demo](https://github.com/natmark/Donut/raw/master/Resources/Demo.gif?raw=true)

### `donut list`
ローカルにインストールされているテンプレートの一覧が取得できます。

```zsh
$ donut list
🍩 3 templates are installed
* Donut.xctemplate (0.1.0)
* ProcessingKit.xctemplate (undefined)
* Realm Model Object.xctemplate (undefined)
```

### `donut install`
リモートリポジトリから、`.xctemplate` をインストールできます。

```zsh
$ donut install https://github.com/natmark/Donut
🍩 Found https://github.com/natmark/Donut (latest)
🍩 Searching .xctemplate from remote repository
🍩 Found Donut.xctemplate
🍩 Checkout from https://github.com/natmark/Donut
🍩 Successfully installed https://github.com/natmark/Donut (latest)
```

### `donut remove`
ローカルにインストールされている`.xctemplate` を削除できます。

```zsh
$ donut remove Donut
🍩  Found templates:
* github.com/natmark/Donut/Donut.xctemplate (0.1.0)

Continue with Uninstall? [yN]y
🍩  Successfully uninstalled github.com/natmark/Donut/Donut.xctemplate (0.1.0)
```

## まとめ
`Donut` を使うことで、簡単に`.xctemplate` を管理することができます！
自作ライブラリ用のファイルテンプレートを`Donut`で共有する文化ができればいいなと思います！
Galaxy Training "From peaks to genes" を補足してみる

NGSデータ解析プラットフォーム 「Galaxy」 のチュートリアル 「From peaks to genes」 の[日本語版](https://github.com/A-Asai/training-material/blob/master/topics/introduction/tutorials/galaxy-intro-peaks2genes/tutorial_ja_notag.md)を作成したときに、
「ここ分からないよ！」「チュートリアル通りにならない！」
となる部分がある気がしたので、追加で説明します。
（上記の日本語版記事とともにご覧ください）
# **Galaxyの登録について**
まずは Galaxy の登録について記事ではほとんど触れていないので、ここから説明します。

> 1. Galaxy のトップにある **ユーザー（または User ）**（下図の赤枠部分）をクリックし、続いて登録を選択する。<br><br><img width="1366" alt="IMG_0166.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/222524/c6bbfb1d-4c84-8f80-0dd4-805e51cac10c.jpeg"><br><br>
2. 次の画面が出てくるので必要事項を記入して Submit をクリック。<br><br><img width="979" alt="ファイル 2018-06-14 15 53 54.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/222524/eb749830-e10c-c3e2-cd08-7fef28442e83.jpeg"><br><br>
3. 入力したメールアドレスに登録確認のメールが来るので、そのメール内にあるURLをクリックする。<br><br>
4. 登録完了！！

# **ツールの再実行について**
ツール `Replace Text on data ...` を再実行する際に「もう一度このジョブを実行する」ボタンがどこにあるかわからない人向けです。

> 1. History パネル（右側のパネル）内にある `Replace Text on data ...` をクリックして、対象のヒストリーを展開する。<br><br>
2. フォーマットやデータベースについて書かれている欄の下に5つのアイコンが表示されているはずです。そこにある **ループ矢印** のアイコン（真ん中にあるアイコン）が再実行のボタンです。<br><br>
3. クリックすると中央のパネルにツールの設定画面が現れるので、チュートリアル従って各種設定を行い、再実行してください。

# **可視化について**
（2018.06.14 時点での内容です）
Galaxy のアップデートによって、チュートリアルの記事のようにハンズオンできない状態になっています（可視化自体はできます）。
可視化に関しては、

> **可視化する（chart）** のアイコンをクリック → 中央のパネルにて良さそうなグラフを選択 → 設定を色々いじってみる

といった手順で操作して、染色体ごとの遺伝子数が分かるような棒グラフを作成してみてください。

# **ワークフローの抽出について**
いくつか分かりにくい点があると思うので下に箇条書きしておきます（ほかにも分かりにくい点がありましたら随時コメントください）。

* インプットしたデータセットを改名する部分。<br>GEO からアップロードしたピークファイルの名前を `Peak regions` にして、UCSC からアップロードしたマウスの遺伝子リストを `Reference regions` にする。<br><br>
* Auto Re-layout 後のワークフローのレイアウト<br>下の図のようになっていれば（恐らく）正しく作成されています。<br><br>![ワークフロー.png](https://qiita-image-store.s3.amazonaws.com/0/222524/1fdd8441-d521-32e3-a834-f5bfb787a036.png)
<br><br>チュートリアルでは（インプットしたデータセットの名前を変えさせているくせに）、2つとも「Input dataset」のまま接続している図を載せているため、非常に分かりにくくなっています。<br>そのくせインプットデータの接続先を逆にすると、この後のハンズオン（ワークフローを設定を変えて実行する）あたりでエラーが発生して頭を悩ませる事態に陥るので気を付けてください。

# **遺伝子名を取得する 部分について**
（2018.06.14 時点での内容です）
[Galaxy](https://usegalaxy.org/) ではデータライブラリからデータをインポートする方法を行おうとすると、データライブラリに "Training data" が見つからずインポートができないので、リンクからデータをインポートするか、ファイルをローカルに落としてからインポートしてください。

*****
以上で From peaks to genes の補足説明を終わりにします。
ほかに分からないことがあればコメントか、[Galaxy のセミナー](https://pitagora.connpass.com/)に参加して私にお尋ねください。

### リンクなど
* From peaks to genes の原文<br>（http://galaxyproject.github.io/training-material/topics/introduction/tutorials/galaxy-intro-peaks2genes/tutorial.html ）
* From peaks to genes 日本語版<br>（https://github.com/A-Asai/training-material/blob/master/topics/introduction/tutorials/galaxy-intro-peaks2genes/tutorial_ja_notag.md ）
* Galaxy<br>（https://usegalaxy.org/ ）
* Galaxy Seminar<br>（https://pitagora.connpass.com/ ）
Rails 4系 の ActiveRecord でnilもしくは以上以下の条件検索

# 始めに
私はRailsアプリのコード内にSQLベタ書きが嫌いです、Arelも嫌いです。
なぜならデータベース構造に依存したり、可読性が低下したりするからです。
（私のArel力が低いせいでもある）

# やりたいこと
```
create_table "users" do |t|
  t.string   "name",                        limit: 255
  t.date     "birthday"
end
```
上記のテーブルでbirthdayがX日以降、もしくはNULLで絞り込みたい

SQLで書くなら

```
SELECT
  *
FROM
  users
WHERE
  users.date > X
  OR users.date IS NULL
```

これをActiveRecordでArelなどを使用せずに実現したい

※Rails4系で　or は使用できません

# 答え
```
User.where(date: [nil, X..Float::INFINITY])
```
nilと区間を配列で渡してあげることで、or条件のような絞り込みができます。
配列は知ってましたが、nilや区間のように型が違ってても可能なんですね、まじ便利。

## 補足
Float::INFINITYは以下の記事で知りました。
参考: https://qiita.com/takuya0301/items/c80b8067109c0e884ea8
この記事がほぼ答えだったのですが、nilと配列にすることになかなか気付けず、ハマりました。

INFINITYは便利ですが、dateの区間にできるようには見えず、知らないとわかりにくいので、

```
UPPER_LIMIT_DATE = Float::INFINITY
```
のように説明変数ならぬ、説明定数にしたり、コメントを書いた方がいいかもしれません。
※実際にはDate型ではないので注意

```irb
Float::INFINITY
=> Infinity
```

## 蛇足
railsには、 Date::Infinity というクラスも存在していて、こちらはインスタンス化して使用するようです

他にもInfinity周りで初見殺しな挙動があったので、別の記事を書く予定です。
忘れた時の pythonでシェルスクリプト実行

#忘れた時のpythonでシェルスクリプトを実行
よく自分が忘れるので、自分が使うようのメモとして書いてます。
環境:python2.7 or python3.x

##python2.7によるシェルスクリプト実行
####1,「os」ライブラリ(非推奨の手法)

```python
> import os
> os.system('シェルコマンド')
*********　結果の出力　*********
0
→標準出力にコマンドの結果が表示され、返り値として成功した場合は0,失敗した場合は0以外の数字が返される

```

####2,「commands」ライブラリ(非推奨の手法)

```python
> import commands
> result = commands.getoutput('シェルコマンド')
> print result
*********　結果の出力　*********
→結果が返り値として出力される。そのため、結果を変数に代入、加工して使用することができる。
```

####3,「subprocess」ライブラリ(推奨の手法)

```python
> import subprocess
> subprocess.call( ["ls", "-l"] )
*********　結果の出力　*********
0
→標準出力にコマンドの結果が表示され、返り値として成功した場合は0,失敗した場合は1が返される



> subprocess.check_call( ["ls", "-l"] )
*********　結果の出力　*********
0
→標準出力にコマンドの結果が表示され、返り値として成功した場合は0,失敗した場合は異常時には例外値を送出する



> result = subprocess.check_output(["ls", "-l"])
> print(result)
*********　結果の出力　*********
→結果が返り値として出力される。そのため、結果を変数に代入、加工して使用することができ、失敗した場合は異常時には例外値を送出する
```



##python3によるシェルスクリプト実行
上記のうち、osライブラリとsubprocessライブラリを使用することができる。
CakePHP2.x フォームのPOSTでCSRF判定されハマったときに確認すること

# はじめに

普通のフォームの場合は殆どおこらないが、選択肢によりフォームの表示切り替えをしたり、AjaxでPOSTさせたりした場合に、POSTしたのに、リダイレクトされてしまい、うまく動かない！なんでだ！とハマってしまったときに確認する事項を紹介します。

# ハマる原因はなにか？

## SecurityComponent と CSRF

POSTしたのにリダイレクトされるのは、`SecurityComponent`の仕業です。なぜそうなるかというと、SecurityComponentが「このPOSTリクエストはCSRFなので、不正だ！」と判定しているのです。

CSRFについては、詳しい人がいると思うのでその人に任せますが、簡単に言うと、HTMLやリクエストの改ざんにより、サイト運営者が意図しないデータをPOSTすることで、意図しないデータの保存や不具合を発生させる攻撃です。

一見やなSecurityComponentですが、実はとてもいいやつなのです。誤解しないでください。

## SecurityComponentはどういうチェックをしているか？

POSTされた データの中に、`_Token` という配列データが含まれるのはご存知でしょうか？
これが重要なのですが、SecurityComponentはこの `_Token` 内の `fields` と `key` をチェックしています。

POSTされたデータのフィールドと値を元に、ハッシュ値などを生成し、POSTされた`fields`値と`key`値の値が一致しているかチェックしています。

該当箇所は以下

```php
// lib/Cake/Controller/Component/SecurityComponent.php
	protected function _validatePost(Controller $controller) {
		$token = $this->_validToken($controller);
		$hashParts = $this->_hashParts($controller);
		$check = Security::hash(implode('', $hashParts), 'sha1');
		if ($token === $check) {
			return true;
		}
		$msg = self::DEFAULT_EXCEPTION_MESSAGE;
		if (Configure::read('debug')) {
			$msg = $this->_debugPostTokenNotMatching($controller, $hashParts);
		}
		throw new AuthSecurityException($msg);
	}
```
[実際のソースはこれ](https://github.com/cakephp/cakephp/blob/2.x/lib/Cake/Controller/Component/SecurityComponent.php#L489)

で、POSTされたデータに`_Token`を入れてるのは、 FormHelper がやっております。
という前提の元、ハマっている場合、以下を確認すると解決できる（はずです）。

# チェックリスト

## POSTのフィールドと初回表示のフォームのフィールドが同じか？

選択肢により、フォームが変わったりすることがある場合は CSRF 判定されてしまうので、入るかわからないフィールドはコントローラの `beforeFilter()` などで、`SecurityComponent` の `disabledFields` プロパティに設定する必要があります。

```php
function beforeFilter()
{
    parent::beforeFilter();
    $this->Security->disabledFields = array('ModelName.fieldName1', 'ModelName.fieldName2');
}
```

`disabledFields` プロパティに設定すれば、SecurityComponentのチェックの際に該当フィールドを無視してチェックしてくれるので、CSRF判定されません。

※ 注意 ※
ただし、該当フィールドは悪意の第三者に任意の値をPOSTされるリスクを許容するという設定になるので、POSTの値を信じず、必ずバリデーション等値のチェックを行ってください。

## _Token をPOST値に含めてるか？

AjaxなどでPOSTする値を明示的に指定し直している場合、`_Token` の値を指定し忘れると CSRF 判定されてしまうので、明示的に指定してください。

```js
$.ajax({
    type: 'post',
    url: 'URL',
    dataType: 'json',
    data: {
        ModelName: {
            fieldName1: $('#ModelNameFieldName1').val(),
            fieldName2: $('#ModelNameFieldName2').val(),
        },
        // ※ これを指定する必要ありますよ
        _Token: {
            // もっと素敵なやり方ある気がするので詳しい方教えてください。
            fields: $('input[name="data[_Token][fields]"]').val(),
            key: $('input[name="data[_Token][key]"]').val(),
            unlocked: $('input[name="data[_Token][unlocked]"]').val(),
        }
    },
// 以下省略
```

## Formヘルパーを使ってるか？

HTMLで直接記載している場合、Formヘルパーが `fields`値と`key`値を作る場合に計算されないので、SecurityComponentがチェックするのと差異が出るためCSRF判定されてしまうので、必ずFormヘルパーを利用して下さい。

# 最後に

僕自身このケースでハマること合計数十時間。コアライブラリのコードを読んでスッキリ理解してハマることがなくなりました。参考になれば嬉しいです。