OmniAICreator/Qiita-1.07M huggingface dataset:
俺言語 その9

#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。
fizzbuzzやってみた。

#拡張
""の後、\r\nなので\tに変更。
数字が001なので1に変更。
剰余は、%

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/bfbf66a3-e4a0-078a-bd2b-95201da0de66.png)


#環境

avr studio 4
attiny85 1mhz
tera term
usb-serial

#サンプルコード

fizzbuzz

```
10 a=0
20 a=a+1
30 b=a/15
40 #=%=0*120
50 b=a/5
60 #=%=0*140
70 b=a/3
80 #=%=0*160
90 ?=a
100 #=a<100*20
110 #=200
120 ?="fizzbuzz "
130 #=100
140 ?="buzz "
150 #=100
160 ?="fizz "
170 #=100
```

以上。
Swift UserDefaultsについて

自分用メモ

UserDefaultsはデバイス上でplistにデータを保存できるSwiftの ~~built-in function.~~ Foundation(モジュールって呼んで良いのかな？）のfunction.

RailsのActiveRecordのようなものと解釈。(ActiveRecordはデータベースのクエリラッパーなのでちょっと違うけど）

使い方(Todo list)

UserDefaultsインスタンスを作ってあげる。

```swift
var itemArray = []

let defaults = UserDefaults.standard
```

Todoリストで追加されるイベントが発火

```swift
let action = UIAlertAction(title: "Add Item", style: .default) { (action) in
            //what will happen once the user clicks the Add Item button on our UIAlert
            self.itemArray.append(textField.text!)
            
            //ここでdefaultsインスタンスにぶち込む。
            self.defaults.set(self.itemArray, forKey: "TodoListArray")
            
            self.tableView.reloadData()
            
}
```

これでデバイス内のplistファイルにTodoリストが保存される。
SVNな現場に何も問題を感じていなかった俺が、自分だけGitを使ってみることにした理由

# はじめに
これは、SVNでソース管理をしている現場で、ローカル環境だけGitを導入した時の経緯を記したものです。
自ら現場に導入したSVNに、何の課題も感じていなかった私が、ある日突然Gitの良さに気づきました。
ここでは、その時の状況や、Gitに移行するきっかけなんかを書いています。
具体的な移行手順も書こうかと思いましたが、それは別記事にする事にします。

# 導入前夜
弊社は老舗の中小企業。何十年も前から使い続けているAS/400がメインの社内システムという状況です。
情報システム部にもベテランが多く、SVNどころかVCS自体使った事ない、というか存在すら知らないという感じ。
数年前、部分的にjavaで作ったシステムを導入し、同時にVCSでの管理を提案しましたが、VCSヴァージンにいきなりGitは理解が追い付かない。という事で、SVNを導入する事にしたのでした。
当時は私もGitについての知識が浅く、「Gitだと何かいい事あるの?」に対して「ブランチの運用がやりやすいらしいよ」くらいしか答えられず、SVN導入後も何も問題は感じていませんでした。
「そもそもブランチなんか滅多に作らないし」、「ローカルリポジトリって何がいいんだろう?もしハードディスクぶっ壊れたらソース消えちゃうし、リモートに直接コミットしたいよ」そんな感じでSVNでの運用に満足していました。
# 予兆
SVN自体には問題を感じていませんでしたが、ローカル環境には1つだけ課題がありました。
複数の案件を同時に対応している時の運用です。
例えば、大き目の改修案件をやっている途中で、急きょバグ修正の必要が出てきたりする。さらに緊急で軽い変更を依頼されたりする。複数の案件がワークスペースに入り乱れるというケースは、意外と多いものです。

コミット時に「あ、これは別の案件のやつだ」とコミット対象から外したりするのはまだいいとして、最悪なのは1つのソースに色んな案件の修正が入り乱れてた時。
一旦別案件の修正は消しておいてコミット、その後元に戻したり。あぁ面倒くさい。
この状況はしかし、SVNの運用としては当たり前だという思いから、普通に受け入れていたのでした。

このように、SVNの運用には課題を感じながらも、「そういうものだ」みたいな感じで運用を続けていました。
これと同時に、Gitの方も少しづつ勉強を続けていました。
「あぁ、トピックブランチなんての作るんだ。ふ～ん」とか思ったり、コミットとかプッシュとかを実際に試してみたり。
相変わらず、導入してみようという気にはなっていませんでしたけど。

# 神託の夜
ある夜、自宅で突然ひらめきます。
「複数の案件を同時に対応してるときって、Gitでトピックブランチ運用すれば楽なんじゃね?」
Gitの事を考えて、うずうずしながら眠りにつき、翌朝出社してすぐにGitを試してみます。
ブランチを作り、コミット。またコミット…、マージ…、スタッシュ…。
やっぱり!これなら、複数案件をブランチ切り替えながら対応できるぞ!
すぐに環境を整え、リモートはSVNのまま、ローカルはGitという開発環境を運用していく事になったのでした。
*※最初に宣言したように、ローカル環境のGitへの移行は、別記事で手順とかをまとめようと思います*

# まとめ
Gitの良さとは何か?
それは、「案件(トピック)ごとに独立したワークスペースで作業できること」だと思います。

このポイントは、わかりにくいというか、実感しにくいものみたいですね。
私のように、Gitについて学んでみて、一通り使ってみた経験があっても、すぐには気づけませんでした。

「Gitって何がそんなにいいの?」と思った人は、「ツールとしてGitは何ができるか」よりも、Gitの文化を重点的に学んだ方が良いと思います。
git-flowとかをじっくり見てみて、SVNを使ったフローとどこが違うのか、それぞれどこに良さがあるのか、考えてみるといいでしょう。
Gitを使うという事は、単なるツールの導入に留まらず、開発スタイルをアップデートする事であると考えるべきなんだと思います。
SublimeText3のタブを言語別に設定する

これについてはいろんな方々が投稿してるんですが、細かい所で詰まったのでメモ。

ユーザー設定でタブを4文字にしてるんですが、他の言語の時は2文字にしたい時が頻発したので、Pythonの時だけタブを4文字に設定していきます。

>①コマンドパレットから「Preferences: Browse Packages」と検索
>②Userフォルダー内に「言語名.sublime-settings」のような感じで設定ファイルを作る

```sublime:Python.sublime-settings
{
    "tab_size": 4,
}
```
注意点としてファイル名は最初の文字は大文字がマストっぽいんですが、それ以降は言語ごとに臨機応変な対応が求められるっぽいです。
（例）
正 Python、HTML
誤 PYTHON、Html
How to use Tornado as python web framework

# Overview

　以前はDjangoでWebApplicationを作っていたが、もっと軽量で非同期のWebApplicationが必要。
という事で、[tornado](http://www.tornadoweb.org/en/stable/index.html)を使ってみることにした。

　tornadoはdjangoに比べて圧倒的に簡素にできていてインストールもファイルの構造もとてもシンプル。
というか、ファイルの構造が自由すぎて、何をどう配置するのが美しいのかよくわからない。
そんな事もあって、備忘録がてら利用記録を書くことにする

# 実行環境

- CentOS7 (on VMware ESXi)
- Docker CE
- ansible

Docker は必須では無いのだが、他のアプリケーションやら何やらがDocker利用の為、
tornadoもDocker上で動作するように作成する。

# 環境作り

tornadoをDocker上で動かす、ということでまずはtornadoが入ったDockerコンテナを作らなくてはならない。
CentOS7上にDocker環境を作るに当たってはメインで扱う内容では無いので、それぞれインストールして頂くか
[拙速のansible playbook](https://github.com/ainamori/ansible-docker)を利用されたし。

## tornado DockerFile 作り

こんな風にpython3.6 ベースで作ってみた。

- DockerFile

```
FROM python:3.6

ENV PYTHONUNBUFFERED 1
ENV DOCKER true

RUN apt-get update && apt-get install -y vim python3-dev
RUN apt-get clean
RUN apt-get autoremove

ADD ./requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
RUN /sbin/init
```

但し、最後のRUNを見るとおり、tornado appは何も起動していない。
アプリケーションの追加は別の項で触れることにする。

ちなみに配置は以下の通り。
DockerFile内部でtornadoをインストールしても良いが
tornadoを本格的に利用するに辺り、Pypiモジュールが増えることも考えられるため
pip 関連は requirements.txt として外に出しておくことにする

```
$ ls
Dockerfile  __init__.py  requirements.txt
$ cat requirements.txt
tornado==4.5.3
```
## docker-compose.yml

DockerFile を作成したのでbuid すれば利用できるが
敢えてdocker-composeで扱えるようにする。
現時点では一つのImageしか扱わないので全くcomposeである必然性は無いが。

- docker-compose.yaml

```
version: "3"
services:
  app:
    restart: always
    build: ./
    ports:
      - 8888:8888
```

これでとりあえず docker-compose up -d とか docker-compose build で動く。
【Javascript】配列の要素がObjectのkey重複を削除

## 動機

Javascriptの勉強のため。
mapに入れたりfor文で回す手もあるだろうけど、
`Array.prototype.filter()`、`Array.prototype.findIndex()`が流行り（自分の中で）なのでやってみた。

## コード
```javascript
//キー重複のあるリスト
dupList =[
  { key: 'a', data: 'Alice'},
  { key: 'a', data: 'Antonio'},
  { key: 'a', data: 'Amanda'},
  { key: 'b', data: 'Bob'  },
  { key: 'c', data: 'Chris'},
  { key: 'c', data: 'Cindy'},
];

//重複削除
var cleanList = dupList.filter(function(v1,i1,a1){ 
  return (a1.findIndex(function(v2){ 
    return (v1.key===v2.key) 
  }) === i1);
});

//確認
console.log(cleanList);
// [ { key: 'a', data: 'Alice' },
//   { key: 'b', data: 'Bob' },
//   { key: 'c', data: 'Chris' } ]
```

findIndexで引き当てたキーのインデックスとフィルタ中のインデックスが一致すば残し、それ以外は除外する。

上記コードは前方が優先だけれども、後方を優先したい場合は`findIndex()`の代わりに`Array.prototype.lastIndexOf()`を使ってで書けば良さそう。

node.jsで動作確認しました。

ご参考までに。
ASCIIコードを調べるUNIXコマンドがあった気がしたんだけど思い出せないからもう作っちゃえばいいかと…

## 目的
ASCIIコードを突然調べたくなることって、ありますよね！
え、ない？
あーそうすか…。
いや、突然あるんですが、いちいちhexdumpやらhdするのも鬱陶しいし、そんなUNIX系のコマンドがあった気がするだけれど、このぐらいなら30分仕事かと思って昼休みに書いてみた感じです。

あと最近Qiitaにも何も書いてないので、keep alive的な投稿として。

[2018/03/11追記] ちょいちょいとオプション加えました。末尾に記載しています。

## ソース
[GitHub](https://github.com/zurazurataicho/asc/blob/master/asc.c)にあげてあります。このぐらいならGistでいい気はするけれど。

## コンパイル・使い方
[README.md](https://github.com/zurazurataicho/asc)に書いてあります。

### コンパイル
Cコンパイラ(cc)があればなんでも大丈夫です。ClangでもGCCでも、おそらくTCCでもLCCでも問題ないでしょう。printf()とputchar()が使えればとりあえず大丈夫のはず。

```shell
$ cc -o asc asc.c
```

実行ファイルascは、$HOME/binとか/usr/local/binとか、自由にコピーして使うでもよし、./ascでカレントディレクトリから使うもよし、自由。

### 使い方
#### 一覧表の出力
0x20(スペース)から0x7Fまでの範囲のASCIIコード表を表示する。

```shell
$ asc
   0 1 2 3 4 5 6 7 8 9 A B C D E F
2    ! " # $ % & ' ( ) * + , - . /
3  0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4  @ A B C D E F G H I J K L M N O
5  P Q R S T U V W X Y Z [ \ ] ^ _
6  ` a b c d e f g h i j k l m n o
7  p q r s t u v w x y z { | } ~
```

### 知りたい文字だけ表示する
「X」だけ知りたい場合は、以下の通り。

```shell
$ asc X
X: hex=0x58, dec=88
```

連続した文字を知るなら、以下の通り。

```shell
$ asc x Y z
x: hex=0x78, dec=120
Y: hex=0x59, dec=89
z: hex=0x7a, dec=122
```

## ソースコード
### 一覧表出力部分

一覧表出力は引数がない場合に1関数show_list()に抜き出して処理している。
32(0x20)から0x7F(127)までの範囲で16個1行(i += 16)で表示させている。

```c:一覧表出力関数
void show_list()
{
    int i, j;
    printf("   0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
    for (i = 32; i < 128; i += 16) {
        printf("%X  ", i / 16);
        for (j = i; j < i + 16; j++) {
            printf("%c ", j);
        }
        putchar('\n');
    }
}
```

引数がない場合、というのはmain()関数内の以下の部分。
表示したらexit(0)でプログラムを抜けている。

```c:引数がない場合
    if (argc < 2) {
        show_list();
        exit(0);
    }
```

### 指定文字のコード出力

コマンドライン引数の指定があった場合は、以下のように個別の文字を都度1行ずつ出力している。

```c:個別出力
    for (i = 1; i < argc; i++) {
        printf("%c: hex=0x%02x, dec=%d\n", *argv[i], *argv[i], *argv[i]);
    }
```

## [追記] オプション追加

2つほどオプションつけてみました。ソースコードは[GitHubにあります](https://github.com/zurazurataicho/asc)。

-lオプションは、出力を1行にするものです。
たとえばプログラム書いてて文字列が欲しい場合もあるので、そういうとき用のやつです。もう完全に俺用です。

```shell
$ asc -l
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
``` 

-xオプションも追加してみました。
これは @nakataSyunsuke さんの書かれた「[(メモ) シェル芸: 数字のASCIIコードを文字に変換する](https://qiita.com/nakataSyunsuke/items/c29fd12812a3ae6327b5#_reference-5c8c2fa8188f07c8057b)」の記事を拝見して、ASCIIコードから文字を表示も確かにあるといいねぇ〜、というノリで追加しました。
こんな感じで使えます。10進数と16進数は混在可能です。

```shell
$ asc -x 66 0x41 68 0x20 0x42 79 89
B: hex=0x42, dec=66
A: hex=0x41, dec=65
D: hex=0x44, dec=68
 : hex=0x20, dec=32
B: hex=0x42, dec=66
O: hex=0x4f, dec=79
Y: hex=0x59, dec=89

$ asc -lx 66 0x41 68 0x20 0x42 79 89
BAD BOY
```
GAE/Go (+dep) で gcloud app deploy する為の構成

Go1.11対応が入り go.mod が使えるようになりました!!🎉

参考情報
[Structuring Web Services in App Engine](https://cloud.google.com/appengine/docs/standard/go111/configuration-files)
[App Engine Standard Go 1.9 migration to Go 1.11](https://github.com/gcpug/nouhau/tree/master/app-engine/note/gaego19-migration-gaego111)

〜〜〜 以下、むかしむかし、辛かった時代のお話 〜〜〜

構成だけで解決するのは無理なので `make deploy` でシンボリックリンクを利用しデプロイ出来る `$GOPATH` を作った上で `gcloud app deploy` を叩く作戦

## 構成

```
./
├── Makefile
├── README.md
├── build
│   └── go ... デプロイ時の $GOPATH、make deploy 時にシンボリックリンクを貼る
│       └── src
│           ├── github.com -> ../../../go/src/lib/vendor/github.com
│           ├── golang.org -> ../../../go/src/lib/vendor/golang.org
│           └── lib
│               └── app -> ../../../../go/src/lib/app
├── devtools
├── gae ... GAE/Goのプロジェクトルート、デプロイ時の CWD
│   ├── admin
│   │   ├── admin.yaml
│   │   ├── init.go
│   │   ├── static
│   │   └── views
│   ├── app
│   │   ├── app.yaml
│   │   ├── cron.yaml
│   │   ├── init.go
│   │   ├── static
│   │   └── views
│   ├── dispatch.yaml
│   ├── var
│   └── worker
│       ├── init.go
│       └── worker.yaml
└── go ... IDE起動時やdev_appserver.py 時の $GOPATH
    └── src
        └── lib
            ├── Gopkg.lock
            ├── Gopkg.toml
            ├── app
            └── vendor
```

## Makefile

```makefile
PROJECT_NAME="gaego-template-sample"

create:
	gcloud app create --project $(PROJECT_NAME)

init:
	cd go/src/lib; GOPATH=$(abspath go) dep init -v

install:
	cd go/src/lib; GOPATH=$(abspath go) dep ensure -v

update:
	cd go/src/lib; GOPATH=$(abspath go) dep ensure -v -update

serve:
	cd gae; GOPATH=$(abspath go) dev_appserver.py \
		--datastore_path=var/.datastore \
		dispatch.yaml app/app.yaml admin/admin.yaml worker/worker.yaml

deploy:
	# 一旦クリーン
	find build/go/src -type l -delete
	# vendor配下になるディレクトリのシンボリックを作成
	ls -1 go/src/lib/vendor | xargs -n 1 -I {} ln -s ../../../go/src/lib/vendor/{} build/go/src/{}
	# ローカルパッケージのシンボリックを作成
	ln -s ../../../../go/src/lib/app build/go/src/lib/app
	cd gae; GOPATH=$(abspath build/go) gcloud app deploy --project $(PROJECT_NAME) --version 1 app/app.yaml

clean:
	find build/go/src -type l -delete
```

https://issuetracker.google.com/issues/38449183#comment19
早くgo1.10のサポートと共にベンダリングもサポートされて欲しい

## 参考
- https://qiita.com/castaneai/items/d8453d4297282f172e96#_reference-3e119740960b499c5cf0
- https://qiita.com/najeira/items/02eca8357c58d1460a51
CircleCI 2.0のタイムアウト設定を変更する

CircleCI 2.0でRspecを動かしていたところ、タイムアウトしました。

```shell:CircleCIのログ
$ bundle exec rspec spec/

# Too long with no output (exceeded 10m0s)
```

デフォルトのタイムアウト設定10分を変更するには、configの`run`に`no_output_timeout: 15m`のように設定すれば良いようです。（15分の場合）

```yml:config.yml
- run:
    name: Rspec
    command: bundle exec rspec spec/
    no_output_timeout: 15m
```

時間は `15m` 以外にも `10s`（10秒）、 `1.5h`（1時間半）のように設定できます。

そもそも10分かかるRspecをどうにかしろというのは今後の課題ということで :bow:

---
Ref.
Configuration Reference - https://circleci.com/docs/2.0/configuration-reference/#run
Slackの刺客？Google Hangouts Chat に備える!



WEB界隈の会社では、G Suite で GmailやGoogleカレンダーを使い、チャットは
SlackやChatworkを使っている会社が多いのではないでしょうか。 
弊社もSlackの有料プランを利用しています。

## そんな矢先！

Googleが、2月28日(現地時間) に Hangouts Chat をリリースしました。
 -  [Google、Hangouts Chat、G Suite向け正式版公開――Slackのライバルを狙う](http://jp.techcrunch.com/2018/03/01/2018-02-28-hangout-chat-googles-slack-competitor-comes-out-of-beta/)
 -  [Google、Slack競合の「Hangouts Chat」をG Suiteで提供開始](http://www.itmedia.co.jp/news/articles/1803/01/news076.html)

ニュースです！

## 利用できるのは、G Suite 利用している企業（人）

公開開始というニュースは飛び込んで来たものの、公開は1週間程度かけて順次行われる予定とありまして、 
弊社の G Suite の管理コンソールで確認してもまだ出てきませんでした。（泣）


いやいやエンジニアは、やっぱSlackだぜ！ 
ではありますが、めっちゃSlackをライバル視している様相ですので、大変興味深いです。

Slackの有料プランは￥850～とコストも馬鹿になりません。 
Hangouts Chat は、G Suiteを使っている会社でしたら、 
追加料金なしで利用できるので、SlackとG Suiteを併用している会社は、
経費削減にもつながる可能性があるので試してみるのが良いでしょう。
**腹の中は経費の問題じゃなく、早く触ってみたいです。(wktk**

## API はすでに公開されている！

Hangouts Chat がまだ使えなくても、既に[APIリファレンス](https://developers.google.com/hangouts/chat/)が公開されているので、
もう、botを作り始めることができます！！

githubには既に、[javaとPython のサンプルコード](https://github.com/googlesamples/hangouts-chat-samples)があります！

**さあ、Hangouts Chat に備えよう！＼(^o^)／**
Ruby デザインパターン Strategy

# 概要

* Strategy パターンとは
    * 処理をほかのオブジェクトに移譲する
    * 移譲されたオブジェクトを再利用できる
    * 移譲されたオブジェクトそれぞれに共通のインターフェースを持たせることで、オブジェクトを交換して挙動を変えられる

# 例

* 鴨
    * いろいろな種類の鴨がいる
    * どれも「鳴く」メソッドを持っているが、種類によって鳴き声が違う
    * そこで「鳴き方オブジェクト」を作って鴨に持たせる
        * 「ガアガア」オブジェクト
        * 「グエグエ」オブジェクト
        * など
    * 鴨の「鳴く」メソッドは実際には鳴き方オブジェクトの「鳴く」メソッドを呼び出すだけ
    * 鳴き方オブジェクトを再代入することで、実行中に動的に鳴き方を変えることもできる

# 実装

* やや乱暴だが大体こんな感じ
    * 鳴き方クラスの共通の親クラスを作り、親クラスの `quack()` は例外を返すようにすると実装漏れが防げる

```ruby
# 鳴き方クラス（抽象風）

class Quack
  def quack
    raise
  end
end

# 鳴き方クラス（具象風）

class Gaagaa < Quack
  def quack
    puts "gaagaa"
  end
end

class Guegue < Quack
  def quack 
    puts "guegue"
  end
end

# 鴨

class Duck
  attr_writer :voice
  def perform_quack
    @voice.quack 
  end
end

d = Duck.new

d.voice = Gaagaa.new
d.perform_quack # => gaagaa

d.voice = Guegue.new
d.perform_quack # => guegue
```

* 挙動を変えるという意味では、module を使ってもよいのでは？と思ったが、それだと挙動の動的変更ができない。

```ruby
# 鳴き方モジュール

module Gaagaa
  private
  def quack
    puts "gaagaa"
  end
end

module Guegue
  private
  def quack
    puts "guegue"
  end
end

# 鴨

class Duck
  include Guegue
  def perform_quack
    quack
  end
end

d = Duck.new
d.perform_quack # => guegue

# gaagaa 鳴くように変更できない！
```
unistore  ~650b 🌶 状態管理

## [unistore](https://github.com/developit/unistore) が気になる

[frontend handbook 2018](https://frontendmasters.gitbooks.io/front-end-developer-handbook-2018/) で発掘しました。tiny ~650b、軽量な状態管理ライブラリで Redux 風です。**ReduxDevtool がそのまま使えます**。イベント駆動さながら、ボイラープレートを上手く隠蔽しています。「Redux の良さは欲しいが、現場の学習・運用コストを加味すると悩ましい…だけどデコレーター利用する状態管理も遠慮したい…」みたいな悩みを抱えてる人には良い落とし所かもしれません。作者は preact の人です。

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/59071/1f8f410d-909f-57bd-23b1-b339161874da.gif)


actions を定義し、Provider/connect 経由でコンポーネントに注入し、発火させると状態が変化します。mapStateToProps/mapDispatchToProps に似た I/Fも明らかに Redux に寄せています。preact と React のバインダ入りです。

```usage.js
import createStore from 'unistore'
import { Provider, connect } from 'unistore/preact'

let store = createStore({ count: 0 })

// If actions is a function, it gets passed the store:
let actions = store => ({
  // Actions can just return a state update:
  increment(state) {
    return { count: state.count+1 }
  },

  // The above example as an Arrow Function:
  increment2: ({ count }) => ({ count: count+1 }),

  //Actions receive current state as first parameter and any other params next
  //check this function as <button onClick={incrementAndLog}>
  incrementAndLog: ({ count }, event) => {
    console.info(event)
    return { count: count+1 }
  },

  // Async actions can be pure async/promise functions:
  async getStuff(state) {
    let res = await fetch('/foo.json')
    return { stuff: await res.json() }
  },

  // ... or just actions that call store.setState() later:
  incrementAsync(state) {
    setTimeout( () => {
      store.setState({ count: state.count+1 })
    }, 100)
  }
})

const App = connect('count', actions)(
  ({ count, increment }) => (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  )
)

export default () => (
  <Provider store={store}>
    <App />
  </Provider>
)
```


## 所感

Redux 運用の辛さをチラホラ見かける昨今。それの利点を落とさずに、どう現場に落とし込むかという課題の表れが、こういったライブラリが生まれるルーツだと思います。

middleware 不要で非同期処理をサラッと書けるので、要件次第では良い選択肢かなと思います。サイズが小さいため、srcコードを眺めるのもまた楽しいです。actions の中の煩雑な処理は immer で書くと幸せになれそうです。
pytest-xdistの-nオプションについて


|pytest|URL|
|:--|:--|
|xdistの-nオプションについて|https://qiita.com/cielavenir/items/3f3319f3fa153c16c703|
|デコレータの作り方|https://qiita.com/cielavenir/items/542f7eaa612c6bb9ed90|
|デコレータに引数を渡す|https://qiita.com/cielavenir/items/2c971ca4bc138c375d17|
|部分テストパラメータの値を使ってテストパラメータを生成する|https://qiita.com/cielavenir/items/ce328313a9f0f498cbcb|
|pytestのfixtureを別の箇所でライブラリとして読み込みたい<br>(当該環境にはpytestが存在しない可能性がある)|https://qiita.com/cielavenir/items/8144774a6ac2eca2e2ce|

- https://pypi.python.org/pypi/pytest-xdist には、`-n`の説明とsubprocessの説明が別々に書かれているように見える。
- 実際には：
    - `-n NUM`は`--dist=load --tx=NUM*popen`の略である。
    - 上記ドキュメントに`py.test -d --tx 3*popen//python=python3.5`と書かれている`-d`は`--dist=load`の略である。
- つまり、実際には`-n`の説明はsubprocessの説明に包含されている。

## 終わりに

以上は`--help`の出力に書かれていることである。`--help`、大事ですね。
Viterbi アルゴリズム（最適経路解法、オフライン版）

こんにちは
隠れ[Markov連鎖](https://en.wikipedia.org/wiki/Markov_chain)モデル (HMM) の最小コスト系列解（最適経路）を求める [Viterbi アルゴリズム](https://en.wikipedia.org/wiki/Viterbi_algorithm)を Python で書きました（今回はオフライン版[^1]）。
状態数系列 `1 2 4 4 2 1` を与え、内部の transition, emission には乱数値を使っています。今回の解は `minimum_cost_path = [0, 1, 3, 3, 1, 0]` が得られました[^2]。[トレリス図](https://en.wikipedia.org/wiki/Trellis_(graph))で示すと下図となります。

[^1]: 今回のように解の一意化（枝刈り）を最後にまとめて（オフライン的に）行うのではなく、逐次的に枝刈りするとオンライン動作化できます（「[Viterbi アルゴリズム（オンライン版）](https://qiita.com/kkdd/items/b5b42ad38127e5d8d9fb#_reference-aa086e0db1c30dec6d1f)」）。

[^2]: 今回例と同じ状態数系列 ```[1,2,4,4,2,1]``` による図が、"[The Viterbi algorithm](http://ieeexplore.ieee.org/document/1450960/)", G. David Forney, Jr., Proc. of the IEEE Vol. 61, No. 3, pp. 268-278. March, 1973 の Fig. 8 、もしくは "[The Viterbi Algorithm](http://www.cim.mcgill.ca/~latorres/Viterbi/va_alg.htm)" という記事内の Fig. 4, 5 でも見られます。

![viterbi.jpg](https://qiita-image-store.s3.amazonaws.com/0/54617/e8e8e931-31a3-a550-4817-374800787987.jpeg)

### 補足
今回の最適経路例では最終状態が一つなので解は確定します。

しかし、もしも最終状態が2つ以上の場合には、確定しません[^3]。この場合は、さらに次のステップへ進んだ（次の観測値が入力された）際には、それまでの最適経路の末尾部は、この新たな観測値への依存性を持ちます。

[^3]: 参照：「[ビタビ・アルゴリズム](http://www.mnc.toho-u.ac.jp/v-lab/yobology/viterbi/viterbi.htm)（情報通信理論）」の中の後半の図例。

### 実行例・ソース

```console
$ ./viterbi.py 1 2 4 4 2 1
0. transition: [0]
1. transition: [0, 0]
2. transition: [1, 1, 1, 1]
3. transition: [3, 3, 2, 3]
4. transition: [1, 3]
5. transition: [1]
minimum_cost_path = [0, 1, 3, 3, 1, 0]
```

```viterbi.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import random

nstates = [int(n) for n in sys.argv[1::]]
COST, STATE = range(2)
INITIAL = (0, 0)  # (cost, state)

def transition(m, n):
    return [[random.random() for _ in range(m)] for _ in range(n)]

def emission(n):
    return [random.random() for _ in range(n)]

def update(cost, trans, emiss):
    costs = [c[COST]+t for c, t in zip(cost, trans)]
    min_cost = min(costs)
    return min_cost + emiss, costs.index(min_cost)

def decodePath(trellis, lastState):
    state = lastState
    path_reversed = [state]
    for rtr in reversed(trellis):
        state = rtr[state][STATE]
        path_reversed.append(state)
    return list(reversed(path_reversed))

### main ###
n_prev = 1
trellis = []
cost = [INITIAL]
for i, n in enumerate(nstates):
    e = emission(n)
    m = transition(n_prev, n)
    n_prev = n
    cost = [update(cost, t, f) for t, f in zip(m, e)]
    trellis.append(cost)
    print(f'{i}. transition:', [c[STATE] for c in cost])

if nstates[-1] == 1:
    state_last = 0
else:
    cost_last = [w[COST] for w in trellis[-1]]
    state_last = cost_last.index(min(cost_last))
    print("last costs =", [round(c,2) for c in cost_last])
path = decodePath(trellis, state_last)
print(f'minimum_cost_path = {path[1:]}')
exit(0)
```
【sh】for文を使って配列の中の変数を読む

番号順に並んだ変数を順番に読む方法を ["【シェルスクリプト】　for文を使って名前に数字が入っている変数を読み込む"](https://qiita.com/KantNak/items/259a8f6bd2da8f49d4f7) でまとめましたが、配列を使う方法を思いついたのでまとめます。

# やり方

次のように変数に値が入っています。

```sh
var1=1
var2=6
var3=13
var4=18
var5=24
var6=26
```

これを配列に代入します。

```sh
array=($var1 $var2 $var3 $var4 $var5 $var6)
```

`array`をfor文で順番に取り出します。

```sh
for var in ${array[@]}
do
    var=`printf %02d ${var}`
    echo $var
done
```

**結果**

```
01
08
13
18
24
26
```

　　
こちらのやり方のほうが変数を追加したときにも対応しやすいのでいいと思いました。
【Ruby on Rails】format: :csvのform遷移先でvalidationする

##やりたいこと
```form_tag hoge_path(format: :csv)```の遷移先でvalidationして、エラーの場合は他の画面にredirectする

##参考
Railsのcsv出力については以下のページをご覧ください。

- [Rails4になってcsvが出力しやすくなった](https://qiita.com/retosu/items/5bda7bd5a55c20fc89c0)
- [railsでcsv出力する時はviewで整形したほうがわかりやすくない？](https://qiita.com/ichi_s/items/eddf29d62ac09f6f9133)
- [RailsでMVCを意識してシンプルにCSV出力](https://qiita.com/necojackarc/items/39e0f0c438363f7084db)

##環境
※後ほど修正します
ruby TODO
Rails TODO
centos TODO

##前提
以下のテーブルHogesに対して、遷移元(foo)で指定したidの情報をcsv出力する遷移先(hoge)を作成します。
(テーブルの中身はテキトーです)

| id |   name   |    date    |
|:---|:--------:|:----------:|
| 3  | fizz     | 2000-01-01 |
| 5  | bazz     | 2010-01-01 |
| 15 | fizzbazz | 2020-01-01 |

application.html.erbは以下の通り。

```views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
</head>
<body>
  <div>
    <% if @form != nil && @form.errors.any? %>
      <ul>
      <% @form.errors.full_messages.each do |msg| %>
        <li><%=msg%></li>
      <% end %>
      </ul>
    <% end %>
  </div>
  <div class="container">
<%= yield %>
  </div>
</body>
</html>

```

##遷移元画面
```routs.rb
  get 'foo' => 'foo#index', as: :foo
```
```controllers/foo_controller.rb
class FooController < ApplicationController
  def index
  end
end
```
```views/foo/index.html.erb
<%= form_tag hoge_path(format: :csv), method: 'post', enforce_utf8: false do %>
  <%= hidden_field_tag :id, 3 %>
  <%= submit_tag 'ダウンロード' %>
<% end %>
```

##遷移先
```routs.rb
get 'hoge' => 'hoge#index', as: :foo
```
```models/hoge.rb
class Hoge < ActiveRecord::Base
end
```
```controllers/hoge_controller.rb
class HogeController < ApplicationController
  def index
    @hoge = Hoge.find(id: params[:id])
  end
end
```
```views/hoge/index.csv.ruby
require 'csv'
columns_header = ["id", "name"]
columns = [:id, :name]
CSV.generate do |csv|
  csv << columns_header
  @hoge.pluck(*columns).each do |row|
    csv << row
  end
end
```
##このままだと
idが指定されていれば問題なく動作しますが、遷移元が以下のように変更されると、「選択してください」のプルダウンが選択された状態で「ダウンロード」ボタンを押された場合にエラーが発生します。

```views/foo/index.html.erb
<%= form_tag hoge_path(format: :csv), method: 'post', enforce_utf8: false do %>
  <%= select_tag 'page[name]', options_from_collection_for_select(Hoge.all, :id, :name), :prompt => '選択してください' %>  
  <%= submit_tag 'ダウンロード' %>
<% end %>
```

##対処法
もちろん、javascriptでゴニョゴニョして制御することもできるのですが、選択されたidでDBからselectしてその値が...なんてことを考えると、controller側でvalidationをかけるのが良いでしょう。
例えば、選択されたidでselectしたレコードの「date」カラムの値が現在時刻より前の場合には、元の画面にredirectしてエラーメッセージを表示することを考えます。
~~@hogesをselectするときにwhereで条件指定しろよって意見は聞かない。いい例が出なかった~~

```controllers/hoge_controller.rb
class HogeController < ApplicationController
  def index
    @hoge = Hoge.find(id: params[:id])
    if @hoge.date < Time.current then
      respond_to do |format|
        format.any
        format.html
        redirect_to(foo_url, {notice: '現在時刻以降なので選択できません。'}) and return
      end
    end
  end
end
```
ポイントは```format.html```の部分。
これをやらないと、エラーメッセージが記述されたcsvがダウンロードされてしまいます。

##結論
Railsの基本知識が抜けているので、こんなことを調べるのに2時間ぐらいかかりました。
ドキュメント読みましょう。
[respond_to - リファレンス -  - Railsドキュメント](http://railsdoc.com/references/respond_to)
コミニティー活動 協力者募集＆ ちょっとメールマーケティング(下書き)


#経緯
コミュニティー活動をすこしお手伝いすることになり、まずは、イベントでのアンケートを書いていただいた方へのメール文面作成ということに。
せっかくなので、メールマーケティングについて少し学んでみるのと、せっかく送るならHTMLメールだよね。
ということにしました。
が、HTMLメールはまた次回。
#トレンド調査
- [メールは死んだ? 25歳以下はSNS](http://www.su-gomori.com/2010/12/%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AF%E6%AD%BB%E3%82%93%E3%81%A0%E3%80%8125%E6%AD%B3%E4%BB%A5%E4%B8%8B%E3%81%AFsns%E3%81%A7%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7.html)
- [メールはゴキブリ by Slack カルCTO](https://www.businessinsider.jp/post-107362)
    - Slack 
        - メールと同じことも得られるが、それ以上に透明性が確保されている。
        - 番最初に読むべきメッセージも抽出して読むことができる
        - 日本ではスタンプが非常に人気
- メールマーケティング
    - [メールマーケティングの基礎](https://www.benchmarkemail.com/jp/blogs/detail/standards-of-email-marketing-sme-should-know) 
        - 心理的距離が遠い→メール
        - 心理的距離近づいてきた→メッセンジャー／グループウェアへ誘導
- [メールの開封率を上げる3つのキーポイント]()



#今日はここまで
つづきはマップで。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">コミュニティー活動を少しお手伝いすることになってメールについて少し学びました。3/1にQiitaに上げる予定でしたが、間に合わず、<br>まだマインドマップのままですが上げまーす。<a href="https://t.co/uwi66KGoW7">https://t.co/uwi66KGoW7</a><a href="https://twitter.com/hashtag/%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AF%E6%AD%BB%E3%82%93%E3%81%A0?src=hash&amp;ref_src=twsrc%5Etfw">#メールは死んだ</a><a href="https://twitter.com/hashtag/%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AF%E3%82%B4%E3%82%AD%E3%83%96%E3%83%AA?src=hash&amp;ref_src=twsrc%5Etfw">#メールはゴキブリ</a><a href="https://twitter.com/hashtag/%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#メールマーケティング</a> <a href="https://t.co/tmIFEixhIW">pic.twitter.com/tmIFEixhIW</a></p>&mdash; SunFuji (@sunfuj) <a href="https://twitter.com/sunfuj/status/969229255669309440?ref_src=twsrc%5Etfw">2018年3月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
try! Swift Tokyo 2018 (Day 1) 参加メモ

try! Swift Tokyo 2018 (Day 1)の参加メモ。(Day 2は[こちら](https://qiita.com/fukazayo/items/c218cedcbb1ae21440a1))

# try! Swift Tokyo 2018
https://www.tryswift.co/events/2018/tokyo/jp/

# セッション
## 裏 Swift Tour
- Swiftのオペレーターやクロージャなどの挙動について深掘り
- didSet、willSet、deferが呼ばれるタイミングに注意する

## SIL入門
- SIL(Swift Intermediate Language)はSwiftコンパイラが生成する中間言語
- Swiftコンパイラによるコード最適化の挙動を紹介

## Clang モジュールの探検
- Module Mapを使うと、Cで書かれたStatic LibraryをObjective-C/Swiftプロジェクトに橋渡しできる
- Objective-Cで書かれたFrameworkをSwiftプロジェクトで利用する場合もModule Mapで橋渡しできる(逆も同様)
- Module Mapに対する不満いろいろ

## レスポンダチェーンを知ろう
- ユーザーのアクションがParent View、View Controller、App DelegateのResponderに伝わる仕組みの紹介

## 関心の分離と単純化のためのSwiftコードの最適化
- Swiftでコードを単純、簡潔、明確に書くためのテクニックを紹介
- extensionを活用し、何をしているのか他人が理解できるコードを書く
- Sub Classを使い、あちこちでやっている同じ処理を纏める

### 業務メモ
- Example 7の、iPhone Xに対応したSafe Area Guideのサンプルが分かりやすかった
- コード上でAuto Layoutの設定を行っていたため、Storyboardは使っていない？
- Example 10の、Stateの変化でChildren Viewを切り替えるサンプルが分かりやすかった

## コーダーがデザインすべきなのか
- デザインは見た目だけでなく機能も含まれる
- 広い視点で／近づいて問題を解決するための手段を考えてみる
- ユーザーに効果的に説明する手段を考えてみる
- テクノロジーについてはコーダーのほうが詳しいことが多いため、機能についてコーダーも一緒に考えてみるとより良いものができる

## Event driven networking for Swift
- SwiftNIO(Netty for Swift)を使うと、Swiftで低レイヤーのソケット通信処理を書くことができる

## 変性のダイヤモンド
- Swiftにおける変性、共変性、反変性の紹介

## SwiftyPi
- iOSアプリ、サーバー、RaspberryPiのLED制御をすべてSwiftで実装したシステムのデモを紹介
- Swift 4はLinuxではリソース不足で使えず、Swift 3.1で実装

### 業務メモ
- Swiftは組み込み用途ではExperimentalな印象で、まだ業務に使うには難しそう

## 我が家を支えるSwiftの技術
- 家庭内で使うツールをSwiftで作ってみた紹介
- 育児記録iOSアプリ、病院待ち人数通知Slack Bot、フリマ情報収集Slack Bot

## UI Test の楽しさとメリット
- TrelloでのUIテストの導入事例を紹介
- Xcodeが2015年にUITestをサポートしたが、実用に耐えられなかった
- TrelloではXCUITestを使っているが、いくつか制約がある
  - Siriにテキストを読ませることができるが、ボタンは押せない
  - Translationはサポートしていない、など
- 全く理由が無いのにUIテストが20%の確率で失敗する
  - CIに組み込むべきではない、レグレッションテストに組み込むに留めるべき
- Kickstarterが勧めるUIテストのアプローチがあるが、XcodeのPlaygroundがフリーズしやすく使いづらい

### 業務メモ
- UIテストの自動化は茨の道
- もし導入するのであれば、開発終盤以降(UI仕様が完全にFIXした以降)に検討すべきと感じた
- Appiumの話題が出なかったのが意外に感じた

## ブロックチェーンのクライアントをSwiftで実装する
- イーサリアムクライアントをSwiftで実装するための方法を紹介
- Swiftで書かれたイーサリアムクライアントはまだ存在しないらしい

## Protocol Oriented WebAPI Abstraction
- API通信のBaseURL、Path、Responseを抽象化するライブラリ(AbstructionKit)の紹介
- AbstructionKit+APIKit+RxSwiftでシンプルにAPI通信処理を書くことができる

## 👾
- Xcodeは実はゲーム開発ツールだった
- SpriteKitを使うと簡単にゲームが作れるデモの紹介
- SpriteKitが普及しないのはAppleデバイスでしか使えないため
- UnityはApple Watchでは使えないため、Apple Watch用のゲームを作るにはSpriteKitを使うしかない

## AST メタプログラミング
- AST(Aspect Syntax Tree)はプログラムの構造を表現する
- ASTはコードのリファクタリングやLint(静的解析)で利用されている
- SourceKitを使うとプログラムの構造をパースすることができる
- ASTを使うと、元のコードを汚さずにログ出力を割り込ませることができる
- ASTを使うと、ユニットテストのAssertが詳細に出力できる
- SwiftコードをHTMLに変換する、ログ出力を割り込ませる、ユニットテストのAssertを詳細に出力するデモの紹介

# おまけ
- お土産いろいろ
![IMG_0147.jpg](https://qiita-image-store.s3.amazonaws.com/0/102371/894174e6-8122-0348-4c1d-dab8919b370c.jpeg)
あなたの知らないサクラエディタの世界

サリュ！突然ですが皆さんはテキストエディタ何を使っていますか？
一太郎？Word？とっととフリーウェアのサクラエディタに乗り換えましょう。
え？Vim？Emacs？ここから先は読まなくていいよ・・・。

本日はサクラエディタで使える作業を3倍高速化するトランザムなテクニックを紹介しようと思う。

#コード補完
サクラエディタではデフォルトでコード補完が使える。
コード補完、というより単語補完だ。
![補完.png](https://qiita-image-store.s3.amazonaws.com/0/179356/6c3ec657-2063-2438-cefd-6ad350841ad8.png)

Ctrl + Spaceでこれまでに登場している単語の候補をサジェストしてくれる。
この例では"p"と打ってCtrl + Spaceを押せばpasswordとpassphraseどっちが良いか尋ねてくれるが"i"と打ってCtrl + Spaceを押せば何も言わずに"id"を入力してくれる。

#マクロ
サクラエディタにはマクロを登録することが出来る。使いマクロう。
詳しい使い方はきっと他サイトの兄貴たちが解説してくれているはずなのでググってほしい。
サクラマクロを使ったことがない人は[こちら](https://arigayas.exblog.jp/9419181/)の兄貴が書いているマクロだけでも入れてみてほしい。
GOMプレイヤーのアップデート時にスキあらば入れてこようとする天気予報アプリよりもこちらのマクロを入れてこようとしてほしいくらい便利だ。


#整形
![整形.png](https://qiita-image-store.s3.amazonaws.com/0/179356/79e8f32d-091b-b259-c4dd-2d011e727796.png)
もはやﾅﾆﾓｲｳｺﾄﾊﾅｲが整形機能が便利だ。
ソートからの連続した重複行の削除で空行は死に絶えユニークな行のみ生き残る。

#ショートカット
上記の整形を行う場合、書かれている通りにキーボードショートカットを使うと秒で整形が完了する。
Ctrl + A (全選択)
Alt + A (昇順ソート)
Alt + M (重複行の削除)
この3コンボで整形が完了する。最後にドヤ顔するのを忘れないようにしたい。

他にも有用なショートカットがたくさんあるので覚えてほしいが、Ctrl + Alt + X(折り返し方法:折り返さない)が非常に便利だ。
サクラエディタは既存のテキストを開く場合気を使って見やすいように折り返して表示してくれるが、一行が長い場合逆に見づらい。
そんなファイルを開くたびにマウスで折り返さない設定をするのは面倒なので是非このショートカットを使用しよう。
JupyterLabをcloud9で起動させる

[JupyterLabのβ版が公開された](https://blog.jupyter.org/jupyterlab-is-ready-for-users-5a6f039b8906)ので、早速お手軽開発環境のcloud9で動かしてみます。

# 今回やる事

- jupyterlabのインストール
- cloud9向けの起動方法
- 設定ファイルの生成

# 1.jupyterlabのインストール

minicondaを使うとか[インストール方法](http://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html)はそれぞれ用意されているけど、今回はpipでインストールします。

cloud9のpythonは2.7がdefaultなので事前にpython環境を整えてから`sudo pip install jupyterlab`を実行すればインストールOK.

一応、インストール後に`jupyter notebook --version`を実行して4.3以上が出ることがJupyerLab実行に当たっての要求です。ちなみに僕が試したcloud9環境では5.4.0が出ました。


# 2.cloud9向けの起動方法
JupyterLabではJupyterNotebook等と同様に、デフォルトのポートが8888なので、[8080,8081,8082ポートがアプリケーション向けに許可されている](https://docs.c9.io/docs/multiple-ports)cloud9では少し具合が悪いです。
そこで、cloud9でも問題なく起動できるよう下記のようにJupyterLab起動時にポートを指定するようにします。

```
jupyter lab --port $PORT --no-browser
```

`--no-browser`オプションをつけておくと起動時にブラウザの立ち上げ処理をスキップしてくれます。


# 3.設定ファイルの生成
実行時に毎回ポート番号やブラウザ表示の設定を指示するのは億劫なので、設定ファイルに書き込んでおくことにします。

JupyterLabインストール後に`jupyter lab --generate-config`を実行すると、`~/.jupyter/`フォルダ下に`jupyter_notebook_config.py`が生成されます。
このファイルを弄って先ほどの設定とパスワードの有無やホームディレクトリ等の設定を編集しておきましょう。


__ホームディレクトリ設定__

```py:jupyter_notebook_config.py(L214)
## The directory to use for notebooks and kernels.
#c.NotebookApp.notebook_dir = ''
```

__パスワード設定__

パスワード設定についてはtokenとpasswordの２種類の設定がありますが、passwordの方が平文をファイルに保存しないで済むので今回はpassword認証を設定します。

```py:jupyter_notebook_config.py(L229)
## Hashed password to use for web authentication.
#  
#  To generate, type in a python/IPython shell:
#  
#    from notebook.auth import passwd; passwd()
#  
#  The string should be of the form type:salt:hashed-password.
#c.NotebookApp.password = ''
```

上記のコメントにあるように`from notebook.auth import passwd; passwd()`を下記のように実行して結果をコピペすればOKです。

```sh:パスワード生成処理
$ python -c "from notebook.auth import passwd; print(passwd())"
Enter password: 
Verify password: 
sha1:c327ac671bae:83fea40ed53f05cec23d2d5b15976d22ac3646a9
#↑の一行を丸ごとコピペする
```

__ポート設定__

```py:jupyter_notebook_config.py(L240)
## The port the notebook server will listen on.
#c.NotebookApp.port = 8888
```

__ブラウザ表示設定__

```py:jupyter_notebook_config.py(L220)
## Whether to open in a browser after starting. The specific browser used is
#  platform dependent and determined by the python standard library `webbrowser`
#  module, unless it is overridden using the --browser (NotebookApp.browser)
#  configuration option.
#c.NotebookApp.open_browser = True
```

設定を終えたら`jupyter lab'で起動させ、_http://{workspace}-{username}.c9users.io:8080/lab_から下記のような画面に移動できたら、起動確認OKです。

![aass.jpg](https://qiita-image-store.s3.amazonaws.com/0/199752/9bcb99b7-69d0-2afb-f9c6-0f3150a2a76c.jpeg)
railsのDBをMySQLに変更する②～mysqlコマンドでCan't connect to local MySQL server through socketエラー～

##mysqlコマンドでエラー

myslコマンドをたたくと、次のようなエラーが発生した。

```
$mysql

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

これは、ソケットを使ってMysqlに繋がりません。
ソケットは'/var/run/mysqld/mysqld.sock'ですよー

という意味です。
（だと思います）


なので繋がるようにしてあげます。

###対応

実施した対応としては、/var/run/mysqldディレクトリに『mysqld.sock』にファイルを作ります。

これだけでエラーが解消されました。

```
$touch /var/run/mysqld/mysqld.sock
```

では、ディレクトリがありません。エラーが出たためたどっていくと、mysqldディレクトリがありませんでした。

そのため、ディレクトリを作成し、/var/run/mysqld内に『mysqld.sock』ファイルを作成しました。


###再度mysqlコマンドを実行


```
$mysql

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
```

末尾のNoが変わりました。

これは、Mysqlのサービスが動いていないためだと思われるため、サービスを起動してあげることで解決するはず。
前処理で精度は上がるのか？　~前半～

##前処理って何だろう？目的のひとつに精度向上があるらしいが・・・。

Pythonで始める機械学習　第3章P127～　

rawデータを使うより、データを前処理したほうが精度が上がらしい。まずは、掲載されている4つの前処理がどんなものかcacer_deatasetsを使って調べてみる。
あ、4つってこちらのことです。

<b>・MinMaxScaler：データが0~1に入るよう変換
・StandardSclare：平均0、分散1になるように変換
・RobustSclaer：中央値と四分位数で変換。外れ値を無視できる変換方法
・Normalize：特徴量ベクトルがのユークリッド長1になるように変換。う~ん、わかったようなわからんような。</b>

```ruby:qiita.rb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer=load_breast_cancer()
```
cacerのdatasetsの中って何だったかな？

```ruby:qiita.rb
dir(cancer)
```
['DESCR', 'data', 'feature_names', 'target', 'target_names']

ふむふむ、説明変数のdataと目的変数のtargetがあるのね。で、数を調べるのならこちら。

```ruby:qiita.rb
print(cancer.data.shape,cancer.target.shape)
(569, 30) (569,)
```


569個のサンプル、30の説明変数と目的変数があるのだね。よしよし。
じゃ、変数名と目的変数の中身も知っておこう。

```ruby:qiita.rb
print(cancer.DESCR)
```
（長いので大切な箇所だけ抜粋）
目的変数（class）：
  - WDBC-Malignant（悪性）　字面だけで怖いよ（ガクブル）
  - WDBC-Benign（良性）
       
説明変数：30種類
<img width="576" alt="cancer_expla_values.png" src="https://qiita-image-store.s3.amazonaws.com/0/241427/9bed1999-95bc-be40-71b8-248566e15966.png">

これでデータ構成がだいたい理解できた。では、いよいよ前処理を。
#MinMaxScaler
テキストではダイレクトにcancer.data,cancer.targetを使用しているが、わかりやすいようにX,yで指定した。（慣例でXは大文字らしい）

```ruby:qiita.rb
X=cancer.data
y=cancer.target
#train_test_splitで訓練データとテストデータに分割。
#test_size=0.3のように数値指定がなければdefoは75：25。

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)

print(X_train.shape)
print(X_test.shape)
(426, 30)
(143, 30)

#前処理としてMinMaxScalerを用いる。まずはMinMaxScalerのインスタンスを作る。
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()

#スケール変換機のfitメソッドにはデータ（X_train）のみを与え、y_trainは与えない。
scaler.fit(X_train)
#こんなアウトプット。特徴量のレンジが0~1になっている。
MinMaxScaler(copy=True, feature_range=(0, 1))

#データを変換
#重要！前処理ではscaler.fitメソッドとscaler.transformメソッドはセット！
X_train_scaled = scaler.transform(X_train)

#データの形式を調べよう。
print("transformed shape: {}".format(X_train_scaled.shape))
print("per-feature minimum before scaling:\n {}".format(X_train.min(axis=0)))
print("per-feature maximum before scaling:\n {}".format(X_train.max(axis=0)))
print("per-feature minimum after scaling:\n {}".format(
    X_train_scaled.min(axis=0)))
print("per-feature maximum after scaling:\n {}".format(
    X_train_scaled.max(axis=0)))
```
アウトプットは本当に長いので省略。

1点疑問点が・・。テストセットの場合、最小値と最大値が0-1の範囲を超える。
これは訓練データのレンジで割るから？rawデータの形状が変化するから？（P133）
う~ん、よくわからん。だれか教えてください。

他3つも同様に、MinMaxScalerの部分をStandardSclare、RobustSclaer、Normalizeに変えると挙動します。
但し、fitとtransoformメソッドの両立は忘れずに。

[後半へ](https://qiita.com/umesaku/items/da720c98a79ecd3574c9)
powershellでexcel図形描画

#はじめに
vbaの記事はあるんだが、powershellから扱うのがなかなかないのでアップします。

#サンプル
内容は、座標から任意点のshapeを作って色を設定して、そのあと、グループ化するということをやってます。

```e.ps1
$exc = new-object -Com Excel.Application
$exc.visible = $true
$bk = $exc.WorkBooks.Add()
$sh = $bk.ActiveSheet
$sh.Cells.Item(2,2)='jj'

$xx=@((10,10),(300,10),
(300,40),(20,50))

# 0 auto
$p=$sh.Shapes.BuildFreeform(0, $xx[0][0],$xx[0][1])
for($i=1;$i -lt $xx.Length;$i++){
	# segmentLine(0),editingTypeAuto(0)
	$b=$p.AddNodes(0,0,$xx[$i][0],$xx[$i][1])
}
$b=$p.AddNodes(0,0,$xx[0][0],$xx[0][1])
$b=$p.ConvertToShape()
$b.Line.ForeColor.RGB = 0x0000FF #このデータは0xBBGGRRの順ね
$b.Fill.Visible=$false
$b.select($true) #最初に選択するときはtrue

$yy=@((20,30),(320,20),
(320,70),(50,60))

# 0 auto
$p=$sh.Shapes.BuildFreeform(0, $yy[0][0],$yy[0][1])
for($i=1;$i -lt $xx.Length;$i++){
	# segmentLine(0),editingTypeAuto(0)
	$b=$p.AddNodes(0,0,$yy[$i][0],$yy[$i][1])
}
$b=$p.AddNodes(0,0,$yy[0][0],$yy[0][1])
$b=$p.ConvertToShape()
$b.Line.ForeColor.RGB = 0x00FF00
$b.Fill.Visible=$false
$b.name
$b.select($false) #追加で選択するときはfalse
$exc.selection.group() #selectionはアプリのプロパティでした
#$exc.Quit()
#$exc = $null
```

#わかったこと
まあ、だいたいは分かるんだが、vbaの場合withで書いてしまっているので、それをなんとかしないといけない。$p.ConvertToShape()での返り値がshapeなのでその色を設定すれば、そこは変えられる。

また、selectionというのがアプリケーションのプロパティというのもなかなかググってもなかったりする。

今、よくわからんのが、ShapeRengeやShapes(n)というようなアクセスをどんなふうにするべきなのか試行錯誤してたりする。
Azure Service Busでキューの中のメッセージを削除する方法

※下記はVisual Studio 2015では可能でしたが、2017では使えなくなっていました。
　何故なのか・・・。

意外とすぐにわからなかったのでメモ。

Visual Studioのサーバーエクスプローラーで、Service busのメッセージを削除したいキューを選択して右クリックし、「メッセージの受信」で1件ずつキューの中身を削除できます。

キューに後続処理でエラーになるデータが詰まっていて処理できない場合などに。

もっといいやり方がありそうな気もしますが(´・ω・｀)
Objective-cで意図的にクラッシュさせる

# 意図的にクラッシュさせる(Objective-c)

通常Xcodeで実行すれば、ブレイクポイントを作成すれば、必要ないのだけど、
アプリがバックグラウンドにない状態の時に、URL schema(ディープリンク)などでアプリを起動させた時の挙動を確認したい時がありました。
この場合、Xcodeでの実行はできません。

考えた末、**意図的にクラッシュするコードを埋め込み、そこまで到着しているか確認する**というとこにたどり着きました。
以下のコードでクラッシュさせます。

``assert( [@"a" isEqualToString:@"b"]);``

assertの引数がTrueでなければ、クラッシュするようになりました。
こんな使い方もできます。

```
# variable_objがnilの場合はクラッシュさせる
assert(variable_obj != nil);
```
もっとスマートなデバッグ方法があれば教えてください・・
さくらVPSにFreeBSD11をインストールした

インストールは[カスタムOSインストールから簡単にできる](https://help.sakura.ad.jp/hc/ja/articles/206207881-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0OS%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89-FreeBSD-10-3-RELEASE-FreeBSD-11)。
インストールしてからやったことのメモ

# sudoのインストールと設定

```shell-session
# pkg update
# pkg install sudo
# visudo           # 90行目あたりのwheelに関する設定の行をアンコメント
# vi /etc/group    # wheelグループにカンマ区切りでsudoを使いたいユーザ名を追加
```


# FreeBSD 11.0 → FreeBSD 11.1 にアップグレード

sudoを実行すると`undefined symbol: memset_s`というエラーが出てくる。
[フォーラムに回答があった](https://forums.freebsd.org/threads/sudo-says-undefined-symbol-memset_s.63561/)。`pkg install sudo`はFreeBSD 11.1用のバイナリをインストールするので動かないらしい。ナンテコッタイ

FreeBSD 11.0 は[そもそも既にサポートが終了している](https://www.freebsd.org/ja/security/unsupported.html)ようなので、11.1にアップグレードすることにした。


[FreeBSDアップグレードメモ（11.0-RELEASE → 11.1-RELEASE）](http://www.dab.hi-ho.ne.jp/sasa/biboroku/misc/freebsd-upgrade.html)を見ながらアップデートした。
アップデートしてから気づいたんだけど上記の記事に[一次情報はこっち](https://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/updating-upgrading-freebsdupdate.html)だと書いてあるので一次情報を見たほうがいいかも。


# sshで日本語が文字化けする

`~/.login_conf`を以下のように設定したら文字化けしなくなった

```login.conf:~/.login_conf
me:\
        :charset=UTF-8:\
        :lang=ja_JP.UTF-8:
```

https://server-setting.info/freebsd/freebsd_japanease.html

# バージョンの確認

```sh
uname -a
```

FreeBSDは`uname -a`で普通にバージョン確認できる素直で良い。

# メモ

- ユーザやグループの追加は`pw`コマンドを使う
- `/etc/passwd`の編集は`vipw`を使う
- ポートを開いているプロセスやプロセスオーナーを確認するには`sockstat`を使う
【Swift】Swiftって何？

# はじめに（自己紹介的な）
- 2018年はSwiftの勉強を中心にやっていくことに決めてみた
- Swiftに触るのは久しぶり（以前触ったのはたしかVer2になったばかりの頃だった）
- 正直久々すぎてSwiftの文法とか全然覚えてない
- Xcodeも触るのが久々すぎて全然覚えてない
- 自分が欲しいアプリをどんどん作って、自分のiPhoneにどんどん入れていくのが目標
- 備忘録としてQiitaを活用
- Qiitaに投稿するのは2年ぶり。Markdownの書き方すら忘れている

# Swiftとは
- Apple社が2014年に発表したiOSおよびmacOS､Linuxで利用できるプログラミング言語
- 2015年にOSS化
- 現時点での最新Versionは4（正式リリース：2017年09月19日）
- コンパイラ言語（静的型付き言語とも言う）
- フロントエンド、バックエンドともに利用できる
- 技術情報とコミュニケーションを目的としたカンファレンス「try! Swift」が毎年東京で開催されている

## 公式サイト
https://www.apple.com/jp/swift/

## 開発者向け公式サイト
https://developer.apple.com/

## 公式ドキュメント

### 英語版
https://developer.apple.com/documentation/

### 日本語版
https://developer.apple.com/jp/documentation/

# Swiftの特徴
Swiftの主な特徴として以下4つが挙げられている。
## モダン
プログラミング言語のモダンとは、コードが「読みやすくて書きやすい」ということ。
その実現のためにSwiftは、近年のプログラム言語を研究し、クロージャ、タプル、ジェネリクス、型推論といった機能を取り入れている。
## 安全
言語仕様レベルでバグが発生しにくい仕様となっている。

- 静的型チェック
- nil安全
- 暗黙的型変換なし
- ARCのよるメモリ自動管理
- 配列、数値型のオーバーフロー検査

## 高速
高速化を目的として開発された言語であり、Appleの発表では一般的な検索アルゴリズムにおいてObjective-Cの最大2.6倍、Pythonの最大8.4倍の速度となっている。

## インタラクティブ
コンパイラ言語でありながら、対話実行環境（REPL）も用意されており、XcodeのPlaygroundsやターミナルで簡単にデバッグする事ができる。

# Webフレームワーク
OSS化に伴い、多数のWeb開発用のフレームワークが誕生。
以下に主なWebフレームワークを挙げる。（随時追加予定）

|フレームワーク名|動作環境|特徴|
|---|---|---|
|Perfect|MacOS/Linux|このフレームワークのみで、フロントエンドとバックエンドの両方の開発が可能。また、自身で用意したサーバー環境で使用することができ、自由度が高い|
|Kitura|Bluemix|"キトゥーラ"と読む。IBM社が発表したフレームワークで、クラウド環境上で動作するWebアプリケーションやWebサーバーを開発することができる|
|Vapor|MacOS/Ubuntu|"ベイパー"と読む。PHPのフレームワーク「Laravel」に影響を受けたフレームワーク。WEBサイト、REST API、クラウドサービスを作るための便利な機能が提供されている|
|Express|MacOS/Linux|純粋なSwiftの速度処理の限界を追及した、軽量かつ最速のフレームワーク。MVCモデルを採用しており、拡張性が高い。|
|HTTPSwiftServer|MacOS|Cocoaフレームワークを拡張するためのフレームワーク。HTTPをiOSアプリと連携出来るように改良されている。シンプルな機能しか提供されてないが、元々Macに組み込まれているCocoaを拡張しているため統合性が高い|

# その他メモ
- Objective-Cとシームレスに連携可能
【R言語】複数の同形式CSVを読み込んで列毎に共通の解析をループで処理

とある複数枚の画像にフィルタをかけてその効果を比較しなければならなくなりました。
どういった傾向があるかも手さぐりなので全画素の計算結果を保持したところ、
Excelでは200MBを優に越えるファイルが出来上がり、ちょっと関数をいじるだけで数分応答なしな状態。
こんなのやってられん！と、言うことで解析に有効と噂のRに手を出しました。

環境はR+R Studio

まだ機能やらオブジェクトの名前が良く分からないのでその辺はご勘弁ください。

画像にフィルタをかけた演算結果をCSVに保存してありましたので、それをread.tableで読み込みました。
先ずはsummaryを全部にかけて様子を見たかったのですが、中々連続で処理するのに難儀しましたので記録。

対象のCSVはこんな感じ

| index | columnName1 | columnName2 |
|:-----:|:-----------:|:-----------:|
| 0 | 123 | 321 |
| 1 | 456 | 654 |
| 2 | 789 | 987 |

こんな形のCSVを40個くらい作って読み込ませました。

columnName1のデータに関してファイルまたぎでsummary演算させることができました。


```R

#最終的にsummary結果を突っ込むlist
D <- list()

#データ名用 行の名称に使用　今回は'newenv_変数名"にしました
DRowNames <- list()

#ls(environment())でenvironmentの変数名listが取れる
#文字列listですがそのままfor文動きます
for(i in ls(environment()))
{

　 #is.recursive(hoge)はhogeが再帰的か調べる。
   #csvの列ごとにアクセスするとき$でアクセスするがそういった変数か調べられる
   #(＄が再帰変数のアクセス？なんだそうだ)
   #get('hoge')でhogeと言う名前の変数を呼び出す。
   #再帰的であっても該当する列名がなければNULLが返ってくる
   #よってis.nullで調べれば求める列名を持たない変数は弾ける

   if(!is.recursive(get(i))
       || is.null(get(i)$columnName1 ))
      {next}

     #paste()で新たな変数名を定義
     #assign()でpaste()で作った名称の変数に演算結果を格納する 今回はsummaryの演算結果
     assign(paste("newenv_", i, sep="") , summary(get(i)$columnName1))

     #rbind()でDに計算結果を行方向に追加していく
     D <- rbind(D,get(paste("summary_", i, sep="")))

     #登録したデータの名称(変数名)を記録していく
     DRowNames <- c(DRowNames, i)
}

#行名称の追加
row.names(D) <- DRowNames

```

このやり方を応用すればファイル名のリストさえ作ればcsv読み込みも一気にいけますね。

Rって結構盛り上がってる印象でしたが、意外と日本語資料は少ないと感じました。
また考え方の問題でしょうが、こういったことをやる手法は入手しづらく感じました。

こんなことするならpythonやれよってことなのかもしれませんが。
※python未経験です。

CSVファイルをインスタンス、列をプロパティって感じで考えてやってましたが的外れだったのかな？
before_actionで複数メソッドの呼び出し& before_actionに引数を渡す

<h1>before_actionとは</h1>
アクション実行前に実行されるメソッド。
アクション実行後に実行されるメソッドは「after_action」
両方で実行する場合には「around_action」を利用する。
これらの処理を**フィルタ**という。

コントローラ(クラス)に記載すれば、各アクションの実行前/実行後に実行される。

例) 

```hoges_controller.rb
class HogesController < ApplicationController
  # 実行前メソッド
  # onlyオプションを指定すると、指定したアクションでのみ利用する。
  before_action :実行前メソッド, only: %i[index show]

  # 実行後メソッド
  # exceptオプションを指定すると、指定したアクションでは利用しない
  after_action :実行後メソッド, except: :new

  #その他諸々
end
```

<h1>実行前メソッドを複数指定したい場合の記述方法</h1>
**方法その1(複数回、before_actionを記述する)**

```hoges_controller.rb
class HogesController < ApplicationController
  before_action :実行前メソッド1
  before_action :実行前メソッド2
end
```

**方法その2(before_actionにブロックを渡す)**


```hoges_controller.rb
class HogesController < ApplicationController
  before_action ->{
    実行前メソッド1
    実行前メソッド2
  }
end
```

<h1>before_actionに引数を渡す方法</h1>
before_actionにブロックを渡せば、メソッドに引数を渡すことができる。

```hoges_controller.rb
class HogesController < ApplicationController
  before_action ->{
    引数付き実行前メソッド("pan")
  }
end
```

<h1>フィルタにredirect_toやrenderを含むメソッドを複数指定</h1>
例えば、ログインしていない場合にログイン画面に遷移させるメソッドと
何らかの条件で別ページに遷移させるメソッドを「before_action」に指定したとする。

```application_controller.rb
class ApplicationController < ActionController::Base
  def login_check
    # ログインしていない場合ログイン画面に遷移させtrueを返す、ログインしている場合falseを返す
    return redirect_to :ログイン画面  unless ログインしているか
  end

  def hoge
    # 条件式に一致しない場合、何らかの画面に遷移しtrueを返す、一致する場合falseを返す。
    return redirect_to :何らかの画面 unless 条件式
  end
end
```

```hoges_controller.rb
class HogesController < ApplicationController
  before_action ->{
    login_check
    hoge
  }
end
```


上記のように「before_action」を指定すると、
複数回redirect_toが実行されるパターンがあるため
そのような場合「AbstractController::DoubleRenderError」が発生する。

<h1>対処法</h1>
||を利用する

```hoges_controller.rb
class HogesController < ApplicationController
  # login_checkでfalseが返った場合のみhogeを実行する。
  before_action ->{
    login_check || hoge
  }
end
```
trapがどんどん上書きされてしまう

受け取ったシグナルに合わせて、指定した処理を実行してくれる`trap`、とても便利ですよね(´・ω・｀) 個人的には「作成した一時ファイルを終了後に必ず破棄する」という処理を実装する際によく利用しています。

```bash
path=$(mktemp)
trap "rm -f ${path}" EXIT
```

ひとつのシグナルに対する処理はそのスクリプト内において1回しか定義できない、つまりtrapを呼び出すたびにどんどん上書きされてしまうことに注意する必要があります。たとえば「複数の一時ファイルを作成し、処理終了後にそれらをすべて破棄する」とき、ついつい次のようなコードを書きがちです。

```bash:trap_test.sh
#!/bin/bash

set -x

path1=$(mktemp)
path2=$(mktemp)
path3=$(mktemp)

for path in ${path1} ${path2} ${path3}; do
  trap "rm -f ${path}" EXIT
done

# === do_something ===

exit 0
```

これを実行した結果が以下の通りになります。trapを3回呼び出して、作成した3つの一時ファイルを処理終了後に削除することを意図していますが、`rm`は一度しか呼ばれていません。また少しわかりづらいのですが、trapにより呼ばれた`rm`は`path3`を削除しています。つまり`trap`は呼び出すごとに指定した処理を上書きしているとわかります。

```
$ bash trap_test.sh
++ mktemp
+ path1=/tmp/tmp.0dzHkNQP8n
++ mktemp
+ path2=/tmp/tmp.CtuP5ZdxyW
++ mktemp
+ path3=/tmp/tmp.8TZD5DRKKI
+ for path in '${path1}' '${path2}' '${path3}'
+ trap 'rm -f /tmp/tmp.0dzHkNQP8n' EXIT
+ for path in '${path1}' '${path2}' '${path3}'
+ trap 'rm -f /tmp/tmp.CtuP5ZdxyW' EXIT
+ for path in '${path1}' '${path2}' '${path3}'
+ trap 'rm -f /tmp/tmp.8TZD5DRKKI' EXIT
+ exit 0
+ rm -f /tmp/tmp.8TZD5DRKKI
```

したがって意図通りにするためには、`trap_test.sh`を次のように修正する必要があります。

```bash:trap_test.sh
#!/bin/bash

set -x

path1=$(mktemp)
path2=$(mktemp)
path3=$(mktemp)
trap "rm -f ${path1} ${path2} ${path3}" EXIT

# === do_something ===

exit 0
```

この実行結果は以下の通りです。作成した3つの一時ファイルが`rm`の対象になっていることが確認できます(´・ω・｀)

```
$ bash trap_test.sh
++ mktemp
+ path1=/tmp/tmp.vrVWvDvk9P
++ mktemp
+ path2=/tmp/tmp.i2aLRF3WMr
++ mktemp
+ path3=/tmp/tmp.Y6LOH2QYnw
+ trap 'rm -f /tmp/tmp.vrVWvDvk9P /tmp/tmp.i2aLRF3WMr /tmp/tmp.Y6LOH2QYnw' EXIT
+ exit 0
+ rm -f /tmp/tmp.vrVWvDvk9P /tmp/tmp.i2aLRF3WMr /tmp/tmp.Y6LOH2QYnw
```
ノルム最小解の射影による導出

## ノルム最小解
[最小二乗解についての記事]
(https://qiita.com/takseki/items/8114eb537a7fe78ca8f8  "最小二乗解") に引き続き、$ x $ についての（連立）線形方程式
$$ Ax=b $$ が解けない場合について考えます[^1]。

[^1]: 今回も $A$ にランク落ちがないことを前提とします。つまり、$A$ が行フルランクか列フルランクのどちらかであるとします。

最小二乗解について復習します。
$m>n$（$A$ が縦長）のとき、条件の方が変数よりも多く、方程式としては不能（解なし）で、$ || Ax-b ||^2 $ が最小になるような $\hat{x}$ は
$$\hat{x}=(A^TA)^{-1}A^T b$$ と求められ、これを最小二乗解と呼ぶのでした。

$ Ax=b $ が一意に解けない場合として、もう1つあります。
それは、$m<n$（$A$ が横長）のときで、この場合、条件よりも変数が多く、方程式としては不定で、$ Ax=b $ を満たす解は無数に存在します。
このような場合、無数の解のうち、$ ||x||^2 $ が最小になるような $\hat{x}$ を求めることが多々あります。これは**ノルム最小解**と呼ばれ、
$$\hat{x}=A^T(AA^T)^{-1} b$$ と求められることが知られています。

最小二乗解のときと同様、この表式を射影の概念を利用して導出してみます。

## 射影による導出
$A$ が $2\times3$ 行列として、図を描いて考えてみます。

![projection2.png](https://qiita-image-store.s3.amazonaws.com/0/233564/1c3324cb-0d8b-0818-e26b-623f1e1ac8af.png)

$x$ は3次元空間上のベクトル、$b$は2次元空間上のベクトルです。
$x$ は3次元空間上のベクトルですが、$A$を作用させた$Ax$ は2次元に押しつぶされます。
3次元空間のうち、$A$ によって押しつぶされる空間は$A$の核と呼び、$\mathrm{Ker}(A)$ と書きます。
この例だと、$\mathrm{Ker}(A)$ は 1次元です。
$Ax=b$ を満たすような $x_0$ を1つ取ってくると、これに $\mathrm{Ker}(A)$ の任意の元を加えたものも $Ax=b$ を満たします。したがって、$Ax=b$ を満たすような $x$ の集合は図のような直線で表せます。
このうち、$||x||$ が最小になる場合を考えると、これは明らかに、$x$ が $\mathrm{Ker}(A)$ の成分を持っていない場合です。
したがって、ノルム最小解は、$x_0$ を $\mathrm{Ker}(A)$ と直交する空間に正射影すれば得られることが分かります。

実は、この「$\mathrm{Ker}(A)$ と直交する空間」は $A^T$ の像 $\mathrm{Im}(A^T)$ と一致します。
理由は後で説明するとして、とりあえずこれを受け入れて先に進みます。

ここまでで分かったことは、「ノルム最小解は、適当な解 $x_0$ を $\mathrm{Im}(A^T)$ に正射影すれば得られる」ということです。後は、[射影行列](https://qiita.com/takseki/items/e0de89ab82d4d287a0d7 "射影行列")の知識を使えば簡単です。

$x$ を $\mathrm{Im}(A^T)$ へ正射影したベクトルは射影行列 $P$ を使えば、
$$x_{\mathrm{Im}(A^T)} = Px = A^T (A A^T)^{-1} A x$$ と書けます。
すると、$Ax_0=b$ を満たす適当な $x_0$ に対して、正射影をとったものがノルム最小解 $\hat{x}$ であるということは、
$$ \hat{x} = Px_0 = A^T (AA^T)^{-1} Ax_0 = A^T (AA^T)^{-1} b $$ と書けます。したがって、$$\hat{x}=A^T(AA^T)^{-1} b$$であることが分かりました。

### 補足
途中で説明を飛ばした、「$\mathrm{Ker}(A)$ と直交する空間は $\mathrm{Im}(A^T)$ と一致する」理由は以下のように示せます。

$x \in \mathrm{Ker}(A)$ について、$x' \in \mathrm{Im}(A^T)$ と内積をとると、
$$ (x', x) = (A^Ty, x) = (y, Ax) = (y, 0) = 0 $$ となる。よって、$\mathrm{Im}(A^T)$ は $\mathrm{Ker}(A)$ と直交する。

## まとめ
最小二乗解とノルム最小解についてまとめると、$Ax=b$ について、

- $A$が縦長のとき、解は存在しないが、最小二乗解は $\hat{x}=(A^TA)^{-1}A^T b$
- $A$が横長のとき、解は無数に存在し、そのうちのノルム最小解は $\hat{x}=A^T(AA^T)^{-1} b$

なお、$b$ に掛かっている部分を1つの行列としてまとめたものは、**（ムーア・ペンローズ型）一般逆行列**とか、**疑似逆行列**、**擬逆行列**などと呼ばれるものに相当します。

機械学習の分野においては、最小二乗解は線形回帰問題で現れるのに対して、ノルム最小解は**カーネル回帰**で登場します。
これについてはまた別の記事で書けたらと思います。