OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveAdminでhas_oneのassociationに対するnestしたフォームを作る

has_oneのネストしたフォームをActiveAdminで書いたことがなく、ハマったのでメモ代わりに書きます。

Rails 4以降であれば、以下のように書けます。

親モデルParent、子モデルChildが以下のように定義されているときに、

```ruby
class Parent < ActiveRecord::Base
  has_one :child
end

class Child < ActiveRecord::Base
  belongs_to :parent
end
```

ActiveAdminのParentモデルのフォームでは、ヘルパーの:forを使って、以下のように駆ける。(permitなどの記載は省略)

```ruby:/admin/models/parent.rb
ActiveAdmin.register Parent do
  form do |f|
    f.inputs "子モデルの編集", :for => [:child, f.object.child || Child.new] do |child|
      child.input :hoge
    end
  end

end
```

:for のところでは、既存のオブジェクトで、すでにchildモデルが設定されていればそれを使い、なければ、Childモデルをnewする、というように書いておく。これで、新規作成時は新しいChildモデルが作られ、更新時は既存のものが使われる。
エクスプローラのコンテキストメニューにBash on Windowsで開くを追加する

ここにあった。
https://github.com/Microsoft/BashOnWindows/issues/603

メモ帳を開いて↓のコードをbash.regという名前で保存。
保存したファイルを右クリックメニューから結合を選択する。

```
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
  00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
  68,00,2e,00,69,00,63,00,6f,00,00,00

[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\BashConsoleHere\command]
@="cmd /c cd \"%V\" && bash.exe"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere]
@="Bash Console Here"
"Icon"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,00,41,\
  00,54,00,41,00,25,00,5c,00,6c,00,78,00,73,00,73,00,5c,00,62,00,61,00,73,00,\
  68,00,2e,00,69,00,63,00,6f,00,00,00

[HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\shell\BashConsoleHere\command]
@="cmd /c cd \"%1\" && bash.exe"
```
Dockerバイナリを最新にする

ここに書くメモは凄く雑なやり方です。本来は rpm パッケージが上がるのを待つか、自分で rpm パッケージを作っていれるべきと思われます。


# Docker 17.05 の新機能のマルチステージビルドをしたかった

マルチステージビルドってのは↓こういうDockerfileが書けるようにする機能ね（`FROM xx AS build` や `COPY --from=build` 辺り）

```Dockerfile
FROM golang:1.8.3 AS build
WORKDIR /go/src/github.com/kawaz/foo
COPY glide.yaml glide.lock .
RUN glide install
COPY . .
RUN CGO_ENABLE=0 GOOS=linux go build -a -tags netgo -installsuffix netgo --ldflags '-extldflags "-static"' && rm -rf vendor .glide

FROM alpine
RUN apk add --no-cache --update tzdata ca-certificates curl
WORKDIR /app
COPY --from=build /go/src/github.com/kawaz/foo/foo .
CMD [ "./foo" ]
```

# AmazonLinux の Docker は 17.03 だったのでバイナリ差し替えで上げた（エントリ投稿時点で 17.06.2-ce が入った）

```bash
sudo service docker stop
curl -sL \
  "https://download.docker.com/linux/static/stable/x86_64/$(curl -s https://download.docker.com/linux/static/stable/x86_64/|grep -oE 'docker-[0-9\.]+-ce.tgz' | sort -Vr | head -n1)" | \
  sudo tar xz -C /usr/bin --strip=1 'docker/docker*'
sudo service docker start
```
アーカイブの中身は以下のような感じにバイナリが8個入ってるだけなのでこれを /usr/bin に上書きで突っ込んでただけ。

- docker/docker
- docker/docker-containerd
- docker/docker-containerd-ctr
- docker/docker-containerd-shim
- docker/docker-init
- docker/docker-proxy
- docker/docker-runc
- docker/dockerd
異なるPC間でExcelファイルの改ページ・文字切れの挙動が異なる場合の対処法

# 概要

本記事は、Excel方眼紙で設計書を書いている人を対象としています。
複数人で同じファイルを編集していると、改ページが壊れたり、文字切れが起きたりします。
そういった問題をなるべく回避するためのノウハウです。

# デフォルトのプリンタを「Microsoft Print to PDF」に設定する

Excelは、デフォルトのプリンタに合わせて改ページの位置を決めているようです。
小さい余白を扱えるプリンタをデフォルトとしているマシンでファイルを編集した後、
そうでないプリンタをデフォルトとしているマシンでファイルを開くと、改ページが壊れることがあります。

対策として、メンバ全員に、デフォルトのプリンタを「Microsoft Print to PDF」に設定してもらうことが考えられます。
紙に印刷するときは、PDFファイルに出力してから、そのPDFファイルを印刷する運用にします。

# 「Windows で通常使うプリンターを管理する」を OFF にする

この設定が ON になっていると、最後に使用したプリンタが既定のプリンタとして勝手に上書きされてしまいます。この設定を OFF にし、既定のプリンタを「Microsoft Print to PDF」に固定します。

Bluetoothとデバイス > プリンターとスキャナー で以下の設定をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177927/8328b30c-9092-1cb2-c5fe-6879e0c671f9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177927/01020a8c-661d-12d9-0975-7de1e77320fa.png)


# DPIの設定を100%にそろえる

高解像度（概ねFullHD以上）のディスプレイでは、テキストサイズを大きめにする設定がデフォルトで入るようになったようです。この設定値が異なるマシンで Excel ファイルを開くと、改ページや文字切れの挙動が異なる場合があるようです。

システム > ディスプレイの設定で「拡大/縮小」の項目を 100% に設定します。
複数ディスプレイがある場合は、すべてのディスプレイにこの設定を適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177927/37764535-1e51-c335-bbd5-8d1fcf444ada.png)
Fillしただけなのにハマったお話(.NETのDateとPostgreSQLのDateの範囲の違い)

#発端
あるシステムリプレースであったお話。
コードは大体こんな感じで、いたって普通なのにFill実行時に「指定されたキャストは有効ではありません。」とか言われる。

```
Public Function Fill(ByVal _sql As String, ByRef _cn As NpgsqlConnection) As System.Data.DataSet
  Dim da As New NpgsqlDataAdapter
  dim cmd As NpgsqlCommand
  Dim ds As New System.Data.DataSet
  cmd = New NpgsqlCommand(_sql, _cn)

  da.SelectCommand = Me.m_cmd
  da.Fill(ds)
  da = Nothing

  Return ds
End Function
```

#解決
最初は「npgsqlのバグか？」とか思って最新版にしたりしたけど解決せず。
しかも検索結果を絞ると出たりでなかったり。
じゃやっぱりデータの方かと思ってよく見てみるとあるカラムに

10007-06-07

とかいう遠い未来がおった。
.NETのDate型はMAXで9999/12/31なのでこいつが原因でしたとさ。

経緯の方は

　・前のシステム(COBOL)で日付型を使わず(っていうかない)に8ケタの数字を使ってた
　・しかも未入力時に99999999を設定してた
　・そんなデータがあるとは知らず旧システムからぶっこ抜いたデータを半自動で整形してポスグレに入れてた結果10007-06-07が誕生。

という感じ。

やっぱシステム移行には罠が多いねぇ。

あとあんま関係ないけどPostgreSQLって

```
select ('9999/99/99'::date)
```

はエラーになるける

```
select to_date('99999999','YYYYMMDD')
```

はエラーにならないんだね。
SourceTreeにおける.gitignore設定方法と注意点

## ■ 概要
SourceTreeを使って「.gitignore」ファイルの作成＆設定をする方法と注意点をまとめました。
なるべくGit初心者でも分かりやすいように書いたつもりです。
少しでも誰かのお役に立てば幸いです。



## 【1】 作業環境
筆者はGitを勉強し始めてから4ヶ月程度の初心者です。
作業環境は以下の通り。

|  | 環境 |
|:--------|:---------:|
| OS     | Windows7 |
| ホスティングサービス | Bitbucket |
| Gitクライアント     | SourceTree |
| 開発環境           | VisualStudio2008 |



## 【2】 .gitignoreとは
ignoreとは「～を無視する」という意味の英単語です。
その名の通り.gitignoreに設定したものは、Gitでコミットの<b>対象外</b>とすることができます。
ビルドのたびに更新される大量のファイルは、バージョン管理をしなくても問題ないものがほとんどです。
それらをコミット対象外とすることで、容量の削減やバージョン管理の効率化を実現することができます。


## 【3】 .gitignoreの設定方法
.gitignoreファイルを直接作成しても良いのですが、SourceTreeには.gitignoreを作成・編集する機能が備わっています。

①メニューバーの中から「リポジトリ」＞「リポジトリの設定」を選択
![01.png](https://qiita-image-store.s3.amazonaws.com/0/201882/84d3612e-4980-8c65-3cc5-605d253e71bc.png)


②「詳細」タブを選択
③「リポジトリ固有の無視リスト」の右側にある「編集」ボタンを押下
![02.png](https://qiita-image-store.s3.amazonaws.com/0/201882/bf55b622-de36-f674-47f0-006c59642fae.png)

上記を実行すると、テキストエディタ等で.gitignoreが開かれるはずです。
この中に、除外するファイルやフォルダを指定していきます。

ちなみに、下記は私が実際に.gitignoreに記述した内容の一部です。

```
*.exe
*.cache
*.dll
*.log
*.pdb
```

たとえば `*.exe` というのは、
「拡張子がexeであるファイルは、全てのフォルダにおいてコミット対象外とする」
という意味になります。

以下に.gitignoreで除外データを設定する方法を5つ紹介します。
<br>

(1)全てのフォルダにある、特定のファイルを除外
　例) txtファイルを除外したい場合　（*.拡張子）

```
*.txt
```

(2)特定のフォルダの中身を丸ごと除外
　例) binフォルダの中身をすべて除外したい場合　（フォルダ名/）

```
bin/
```

(3)特定のフォルダの、特定のファイルのみを除外
　例) binフォルダ内のtxtファイルをすべて除外したい場合　（フォルダ名/**/*.拡張子）

```
bin/**/*.txt
```

(4)特定のフォルダを丸ごと除外するが、その中の特定のファイルは除外しない
　例) binフォルダを丸ごと除外したいが、その中のxmlファイルだけは無視したくない
　　（フォルダ名/*.*）、（!.拡張子）

```
bin/*.*
!.xml　
```

(5)コメントを記述する
　例) 「これはコメントです」というコメントを書く場合（行の先頭に"#"を付ける）

```
 #これはコメントです　
```

他にもいろいろな書き方があるようなので、気になる方はこのページの下に書かれている参考サイトをご覧ください。



## 【4】 .gitignoreの注意点

これは実際に私がやってしまったことです。
私は**「プッシュ済みのファイルは除外できない」**ということを知らないまま作業していました。

すでにインデックスに登録されてしまったフォルダやファイルは、いくら.gitignoreに登録しても毎回コミット対象として出てきてしまいます。
.gitignoreを作り直しても変化が無く、やらかしたときはバグかと思い非常に焦りました。

ようやく真実に気づいた私は、仕方がないのでリポジトリの中身を全削除。
.gitignoreを設定してから再度コミット＆プッシュし直すというとても面倒なことをする羽目になりました。

**リポジトリを作ったら、プッシュする前に.gitignoreを設定してください。**


2020/9/2追記：Gitのキャッシュを削除する方法をオススメします。
参考：[.gitignoreに記載したのに反映されない件](https://qiita.com/fuwamaki/items/3ed021163e50beab7154)


## 【5】 参考
 [.gitignoreでインデックスに登録したくないファイルを指定する](http://rfs.jp/server/git/gite-lab/gitignore.html)
[.gitignoreを使ってGitで無視するファイルを指定する](http://cly7796.net/wp/other/to-specify-the-file-to-be-ignored-by-git-using-the-gitignore/)
<br>
***
以上です。
長々とお付き合いいただき、ありがとうございました。
この記事が皆さまの開発ライフで、少しでもお役に立てば幸いです。
<br>
SublimeText3のBuild 3143へのアップデートでSource Han Codeのフォントが無視される場合の対処法

# 症状
SublimeTextを起動するとアップデートの知らせがありましたのでBuild 3143へアップデートしました。アップデート後、"font_face"をSource Han Codeに設定しているにもかかわらず勝手にConsolasになってしまいました。このような場合への対処法です。Source Han Codeのフォント以外にも同様の症状があるかもしれません。

"font_face"で指定したフォントが無い場合は、コンソールを見ると下記のようなエラーが発生します。

~~~
font face "###" could not be found, defaulting to "Consolas"
~~~

今の症状ではこのようなエラーは発生しないままConsolasになってします。

# 環境
OS Windows10 Home x64
Sublime Text3 build 3143 x64

# 対処法
これまで``Preferences.sublime-settings``の"font_face"で下記の設定で問題なく動作していましたが、

~~~
"font_face": "SourceHanCodeJP-Normal",
~~~

このValueの部分に問題がありました。これを次のように変更すると無事フォントが変更されました。

~~~
"font_face": "Source Han Code JP N",
~~~

これに気付くために時間を要してしまいましたので、もしも同様の問題で困っている方がおられるのならこの内容がお役に立てばと投稿しました。

# ダウンロード先
- Sublime Text 3 [https://www.sublimetext.com/3](https://www.sublimetext.com/3)
- Source Han Code JP [https://github.com/adobe-fonts/source-han-code-jp](https://github.com/adobe-fonts/source-han-code-jp)
EMRでのSparkアプリのトラブルシュート


## 概要

EMR（≒YARN）上で動かすSparkアプリケーションを運用していて、エラーが起きた時にどのようにログを追っていくかを記します。

## 環境

- Hadoop: 2.7
- Spark: 1.6
- EMR: 4.6


## エラーの検知

リトライも成功しなかった場合、EMRのコンソールで失敗が表示されると思います。

![Screenshot 2017-09-14 00:32:00.png](https://qiita-image-store.s3.amazonaws.com/0/7185/342716dd-8a9e-e205-03c7-51a4071e7765.png)


（ちなみに経験上、実行時間が30s以内でエラーになったらだいたいstepの記載ミス、60s程度で終わってたらアプリのパラメータミスなどによる初期化の失敗などではと思います。）

Sparkアプリの実行においては、いくつかエラーとなりうるところがあるので、順番に確認していきます。
なお、全体像はこのようになっています。（clusterモードでの実行の場合）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7185/d2ee847f-d59a-0668-e0f1-0009aa197350.png)

> from: https://aws.amazon.com/blogs/big-data/submitting-user-applications-with-spark-submit/

## YARN Client

まず、上記EMRコンソールのcontrollerというところで、EMRのStepの実行をリクエストしているログは確認できます。ただ、ここのログはSparkの場合はほとんどstepの内容と同じなため、ほとんど参考になりません

次に、上記EMRコンソールのstdout, stderrでは、YARN Clientのログが確認できます。ここもほとんど情報はないのですが、YARNへのリクエストが通っている場合、ApplicationのID（ `application_1497410000000_0001` など）が出ていると思います。この後、YARNやSpark Historyを見に行く時にこのIDで識別するため、覚えておいてください。

## YARN

YARNのWeb UIを表示するとこのようになっていると思います。

![Screenshot 2017-09-14 01:05:12.png](https://qiita-image-store.s3.amazonaws.com/0/7185/e92c0946-a9e3-575c-1b84-da1fb8cfc1f0.png)

まず、先ほど取得したApplicationIDでアプリケーションを特定します。
ApplicationIDをクリックすると、YARN上でのアプリの状態やログが追えます。

![Screenshot 2017-09-14 01:20:14.png](https://qiita-image-store.s3.amazonaws.com/0/7185/0a379e4b-92aa-98a5-cccc-076cb667d66c.png)

どのくらいリソース（メモリ、CPU）を割り当てられていたのか、最終的に成功したのか失敗したのか、どのノード上で実行されたのか、その時のログは何か、などが確認できるのが分かるかと思います。
（ちなみに、YARNのWeb UIでLogを見るとき、量が多すぎることを懸念してデフォルトではサマリだけ出しています。フルで見たい場合は、データ量を確認してから「click here」みたいなやつを押しましょう。）

用途としては、後述するSpark HistoryにApplicationが上がってこない（≒Sparkが立ち上がる前に落ちている）場合の原因究明に使います。
アプリケーションコードの中で、Sparkのcontextが生成されるまえにエラーが出ているのがよくあるパターンです。

## Spark History UI

Sparkジョブの過去の結果についてはHistory Serverというところから確認できます。

![Screenshot 2017-09-14 01:25:04.png](https://qiita-image-store.s3.amazonaws.com/0/7185/694fad80-33ce-fa4f-b761-1226267c38f5.png)

ここに並んでいるのは完了したものだけで、未完了のApplicationの一覧表示はリンクから飛べます。
さて、ここでもApplicationIDで識別できるようになっているので、該当のアプリケーションをクリックして詳細を見ましょう。

![Screenshot 2017-09-14 01:30:41.png](https://qiita-image-store.s3.amazonaws.com/0/7185/57a5edd1-7b93-3829-2823-ac09558c34c0.png)

SparkのWeb UIの説明は省きますが、ここでログを確認したり、どのstage/jobで落ちているのかを確認していきましょう。ログとしては大きくExecutor/Driverは見ておくと良いでしょう。

## Spark UI

実行中のSparkアプリのログを見るときは、DriverNode（ApplicationMaster）を見る必要があります。
起動直後や終了済みでなければ、YARN WebUIの「History」のリンクを押すと飛べます。

## 数分以内のログ

EMRにおいては、Web UIで確認できるログはS3にアップされます。が、デフォルトで5分毎に送られるため、直近のものを見たければ実際にマシンにSSHなどでログインしてログを漁ることになります。

詳しくは過去の記事をご参照ください。[EMRのログをS3/Localから追う](http://qiita.com/uryyyyyyy/items/8bf386da45bcd8fde387)
npm prepublishOnlyでビルドを呼んではいけない

## 2018/02/06 追記

以下の記事にpublish時の挙動について詳しくまとまっています。適宜参照するとよいです。

[npm prepublish の現状と今後どう変わっていくかを、表にしてまとめた - Qiita](https://qiita.com/ndxbn/items/f0cd2b13a3268254f2aa)

---

install時にprepublishに書いたbuildが走るのが嫌で、publishのみ実行されるprepublishOnlyを使っていました。
しかし、これは大きな間違いです。

npmの開発者の一人であるiarnaのコメントを抜粋します。

> "I want to do build steps that are neccessary to use my module." — use prepare
"I want to do validation steps that stop me from publishing bad code." — use prepublishOnly

https://github.com/npm/npm/issues/15454#issuecomment-288606051


prepublishOnlyはアップデートのためのtarbal生成後に実行されるので、意味がありません。


`prepare`を使うようにしましょう。
また、npm5からは、prepublishの挙動は、prepublishOnlyと同じになるので注意が必要です。
IPO



実装で困った時に人に聞く時は、以下のRoleを意識すると良い。

I：Input（入力）
P：Process（処理）
O：Output（出力）


#参考
http://www.seojapan.co.jp/itpedia/system_development/ipo/
http://szk-takanori.hatenablog.com/entry/20090119/p1
PR,MRレビュー依頼作業のフロー

# 概要

GitLab等で、他ベンダーを含む開発のソース管理をしている状況において、リリース前のレビュー依頼をかける際のマージリクエストのフロー。

自社Aは、developにマージする権限はなく、MR依頼をかける。

## 想定しているシチュエーション

* 他社Bの開発分のマージ状況は不定期に発生し、
* developブランチはいつ更新されるのか連絡は特にない
* 自社の開発ソースはチームブランチに一括でまとめて申請する

■MRフロー

![MR依頼作業2.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/420d1136-aef8-d77a-84fd-43e10babfe47.jpeg)
VirtualBox にインストールした Ubuntu の画面サイズ（解像度）を変更する方法


VirtualBoxにインストールしたUbuntuの画面サイズは640×480しか選択できません。
さすがに使い勝手が悪いので、調べてみたら、「Guest Additionsのインストール」を
行うことで、解像度の変更が出来ました。以下はその手順となります。

「デバイス → Guest Additions のCDイメージを挿入」
![ubuntu設定1.jpg](https://qiita-image-store.s3.amazonaws.com/0/132118/d2cdec6e-84d7-59ef-b5e8-09e83e70c9b0.jpeg)

「実行する」を選択
![ubuntu設定2.jpg](https://qiita-image-store.s3.amazonaws.com/0/132118/f13a2c8c-e15f-4467-3033-785766033024.jpeg)

管理者パスワードを入力し、「認証する」を選択
![ubuntu設定3.jpg](https://qiita-image-store.s3.amazonaws.com/0/132118/ce561d1b-d1fc-0517-8b40-3debee5b6a7d.jpeg)

「Press Return to close this window…」と表示されたら作業は終了。
![ubuntu設定4.jpg](https://qiita-image-store.s3.amazonaws.com/0/132118/33d7a3c0-4225-60d0-aa80-9e8abca2faf3.jpeg)

ゲストOSを再起動後、右上の歯車アイコン → システム設定 → ディスプレイ から解像度を変更することができます
Go でパスワードが設定された zip ファイルを作成する

Go には標準zipファイルを扱うパッケージ [archive/zip](https://golang.org/pkg/archive/zip/) がありますが、パスワード付きzipファイルを作成する機能はありません[^1]。

そこで、パスワード付きの zip を作成する機能が追加されたフォークパッケージ [yeka/zip](https://github.com/yeka/zip) を使います。

## パスワード付き zip ファイルの作成
テキストファイル `sample.txt` をパスワード `long-long-password` を設定した zip ファイルを作成するサンプルコード。

```go
package main

import (
	"bytes"
	"os"

	"github.com/yeka/zip"
)

func createZipBuffer() (*bytes.Buffer, error) {
	filename := "sample.txt"
	content := "ファイル内容"
	password := "long-long-password"

	buf := new(bytes.Buffer)
	w := zip.NewWriter(buf)

	// Create の代わりに Encrypt を使う
	f, err := w.Encrypt(filename, password, zip.AES256Encryption)
	if err != nil {
		return nil, err
	}

	_, err = f.Write([]byte(content))
	if err != nil {
		return nil, err
	}

	err = w.Close()
	if err != nil {
		return nil, err
	}

	return buf, nil
}

func main() {
	filename := "password.zip"
	f, err := os.Create(filename)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	buf, err := createZipBuffer()
	if err != nil {
		panic(err)
	}

	if _, err := f.Write(buf.Bytes()); err != nil {
		panic(err)
	}
}
```

## パスワード付き zip ファイルの読み込み
上記サンプルで作成したパスワード付き zip ファイルを読み込むサンプルコード。

```go
package main

import (
	"bytes"
	"io"
	"io/ioutil"
	"os"

	"github.com/yeka/zip"
)

func readZipBuffer(buf *bytes.Reader) error {
	password := "long-long-password"

	zipr, err := zip.NewReader(buf, int64(buf.Len()))
	if err != nil {
		return err
	}

	for _, z := range zipr.File {
		z.SetPassword(password) // 解凍するためのパスワードを設定する
		rc, err := z.Open()
		if err != nil {
			return err
		}
		if _, err := io.Copy(os.Stdout, rc); err != nil {
			return err
		}
		rc.Close()
	}

	return nil
}

func main() {
	filename := "password.zip"
	f, err := os.Open(filename)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	b, err := ioutil.ReadAll(f)
	if err != nil {
		panic(err)
	}

	if err := readZipBuffer(bytes.NewReader(b)); err != nil {
		panic(err)
	}
}
```


[^1]: github には対応要望の [issue](https://github.com/golang/go/issues/12081) があるようです。
prettier でコードフォーマットしてみた

## インストール

https://github.com/prettier/prettier

`npm install prettier --save-dev`

## .prettierrc

`package.json` と同階層に `.prettierrc` を置きます。
JSON または YAML で書けます。

```yaml:.prettierrc
printWidth: 120 # 1行の文字数制限
tabWidth: 2
singleQuote: true
trailingComma: none
semi: false
parser: typescript # flow もあります。
```

その他のオプションは下記を参照ください。
https://github.com/prettier/prettier#options

## npm scripts を追加する

例では format の略字で fmt としてますが、なんでも構いません。
`--write` をつけるとファイルを上書きしてくれます。

```json:package.json
"scripts": {
  "fmt": "prettier --write 'src/**/*.js'"
}
```

## 実行

`npm run fmt`

## 感想

eslint と競合しました。
各種リンターを使用する場合、ルールを考慮する必要があります。
ActiveAdmin側のページにヘルパーメソッドを仕込む場合

ActiveAdminでヘルパーメソッドを利用する場合、残念ながら通常の方法で利用することはできない。
もしActiveAdminで自分が定義したヘルパーメソッドを利用したい場合は手順を踏む必要がある。この手順は一度行ってしまえば以降は自由に利用ができるはず...（未検証)

## 手順
この手順はすべてこの方の記事を参照した
[Active Admin で Helper モジュールを生やす](http://qiita.com/hachiya/items/97f3a917f88ec5773e3d)

### 雑に内容を書く

```config/initializers/active_admin.rb
# endのあとに追記する
....
end

module ActiveAdmin::ViewHelpers
  include ApplicationHelper
end
```

これでOK!
これは自分はパーシャル使ってhamlに組み込みましたがarbでもいけるっぽいです
Network in Network（NIN）を理解してみる

ここ数ヶ月いろいろ資料を読んでいるのだが、どうにも腑に落ちない、というか、しっくりこないのが「Network in Network（NIN）」。

正直、何をしているのかよくわからない。
説明が分かりづらい。

ということで、理解できたところまでもまとめてみました。
勘違いしているところがあれば、指摘していただけるとありがたいです。

# 良くわからないこと
まず見かけるのが、この図。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/2e24fd96-591e-f3dd-8892-ad398192059c.png)

その内、この部分がNIN（の一要素と思われる）。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/130771/1eda344e-3f49-39dc-cde0-a02cd49c68b3.png)
ここでの処理（畳み込み）が「Multilayer Perceptron Convolution（Mlpconv）」と呼ばれるらしい。

ちなみに最後の方は「Global Average Pooling（GAP）」で、[こちら](http://qiita.com/mine820/items/1e49bca6d215ce88594a)にまとめを書いてみたので、興味があれば参照してみてください。

で、このMlpconvで何をしているのかが分からない。
これは何なのか？→①
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/130771/a5a3d385-d624-70d2-12b8-330b06316e91.png)

これは何なのか？→②
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/130771/e171657c-e272-5d39-7fac-da5f036c0c25.png)

これは全結合？→③
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/130771/6c88dc82-5948-67be-1133-8fe62712837f.png)

どうするとこれになるの？→④
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/130771/df2d8f97-65aa-be38-0312-004d42a27344.png)

この辺りを解決していきたいと思います。

# ヒントとなる資料
解決のヒントとなる図がこちら。
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/130771/4abbd462-48fc-50ae-8301-2cdf10bbe69e.png)
1x1の畳み込みフィルター「Cascaded Cross Channel Parametric Pooling（CCCP）」がポイントになりそうです。

そしてもう一つ。
![image8.png](https://qiita-image-store.s3.amazonaws.com/0/130771/8a037c35-ded3-2ba8-aa75-decffe5e4054.png)
この細かく書かれた情報が役立ちそうです。

# 解決編
では疑問点を解決していきましょう。

## ①最初の畳み込みフィルター
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/130771/d8ac8f74-90c0-9343-f6a7-842db2d335d4.png)
これは何なのかということですが、左側の入力データから一部を抜き出したわけではなく、どうやら畳み込みフィルターを表しているようです。
サイズも11x11だったり7x7だったり、ストライドも2だったり1だったり、パディングもしたりしなかったりと様々のようです。


## ②実は厚みのある面
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/130771/a64e18a2-8c87-0a00-5603-489333d6c682.png)
で、通常は畳み込みを行った出力結果を厚みのある面で表現するのですが、なぜかNINの図では1次元の配列で表すようです。（このせいで分かりづらくなっている）

ストライドや出力チャンネル数の指定によって異なりますが、NINではだいたい、サイズが小さくなり厚み（チャンネル数）も増えているようです。

## ③1x1の畳み込み
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/130771/0eaf5cbe-37a9-f1fc-4a99-81922d51c077.png)
この全結合に見えるものは、実は1x1の畳み込みを行っているようです。
1x1ですのでサイズは変わらないのですが、出力チャンネル数は減らすこともあるようです。
（この「チャンネル数が減った」ということが表せていないのは問題）

この処理がCCCPなのですが、ようはチャンネル間の同じ位置の画素をPoolingしているということのようです。

## ④厚みのある面
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/130771/f0782328-4867-d7b7-f49e-ca5ebb30995d.png)
実はここで何か処理をしているわけではなく、1次元配列のように表現していたものを、ちゃんと厚みのある面に表現しなおしただけ（！）でした。

よ～く見ると、微妙にサイズが小さくなっています。（気づかないって ^^;）
![image9.png](https://qiita-image-store.s3.amazonaws.com/0/130771/ebca6d1e-9cb4-c18d-57ba-48a4a779008f.png)
でも厚みは変わっていないという．．．

# 結論
NINは、普通の1回の畳み込みの代わりに以下の処理を行い、それを繰り返すということのようです。
1)通常の畳み込み（サイズ小、チャンネル増）
2)1x1の畳み込み　※複数回実施する場合もあり

これにより、たとえばVGGnetのような、
1)畳み込み
2)畳み込み
3)Max Pooling
の繰り返しと比べると、レイヤー数が減ることにより、処理が速くなりそうです。
（重みパラメータ数も少し減りますね）

[論文（pdf）](https://arxiv.org/pdf/1312.4400.pdf)を見ると精度も悪くなさそうです。
![image10.png](https://qiita-image-store.s3.amazonaws.com/0/130771/3efd2d10-1c31-b3d3-9dd2-3ea5d1767867.png)
真・Flow & Redux で Reducer の実装パターンを考える

4ヶ月ほど前、 [Flow & Redux で Reducer の実装パターンを考える](http://qiita.com/mizchi/items/5b431a95d61a52543df0) という記事を書いたが、 reducer を型付けするという目的は達しているものの、明らかに記述量が増えて冗長だという問題があった。

ところでこういう記事を見つけた。

https://medium.com/@martin_hotell/redux-typescript-typed-actions-with-less-keystrokes-d984063901d

これを flow 向けに書き直した、というかセマンティクスが一緒だったので、そのまま動いたのだが、これを自分向けに書き直したらとてもいい感じになった.

flow は v0.54.1

## コード

```js

// @flow

type __ReturnType<B, F: (...any) => B> = B
type $ReturnType<F> = __ReturnType<*, F>

// Actions
const INCREMENT = 'counter/increment'
const ADD = 'counter/add'

export function increment() {
  return { type: INCREMENT }
}

export function add(n: number) {
  return { type: ADD, payload: n }
}

export type Action =
  | $ReturnType<typeof increment>
  | $ReturnType<typeof add>


// Reducer
export type State = {
  value: number
}

const initialState = {
  value: 0
}

export default (state: State = initialState, action: Action) => {
  switch (action.type) {
    case INCREMENT: {
      action.payload // ここがエラーになる！！！
      return { value: state.value + 1 }
    }
    case ADD: {
      return { value: state.value + action.payload }
    }
    default: {
      return state
    }
  }
}
```

INCREMENT のときは action.payload が type refinement によって正しくアクセスエラーになり、 冒頭の Hackey なおまじないと Action 列挙以外はほとんど冗長な部分が消えた。以下解説。

## 関数の型の返り値の型を返す型

最初は何を言ってるかわからないだろうが、関数の型を与えるとその返り値を取り出す型を定義する。

```
type __ReturnType<B, F: (...any) => B> = B
type $ReturnType<F> = __ReturnType<*, F>
```

これを使って ActionCreator から Actionを取り出して その Union Type とする。

```
export type Action =
  | $ReturnType<typeof increment>
  | $ReturnType<typeof add>
```

これだけ。冗長な型定義はもういらない。
実際はどこかの util にこの型を書いておけば良さそう。

## 改良案1: 定数を Symbol にする

同名の定数を定義してreducerが誤爆してデバッグに苦しんだことがあるのは僕だけじゃないと思う。

ES2015のSymbolを使う。関数を呼ぶ度にユニークな参照を生成する。uuid みたいに使える。

```
// Actions
const INCREMENT = Symbol()
const ADD = Symbol()
```

冗長な記述が減り、ちゃんとflowの推論機は追ってくれる。偉い。

問題は、 redux-logger とか仕込んでもtype名が判明せずログが読みにくかったり、 SymbolはJSONシリアライズできないので、なんらかの都合で log をサーバーに送ろうとしても type 属性が消滅することだろうか。 reducer 内部で完結するなら問題ない。

## 改良案2: redux-promise 対応

自分は複雑なmiddlewareが嫌いでredux-promiseを使うことが多いのだが、そうなると ActionCreator の 返り値が `Action | Promise<Action>` になるので、そこからも $ReturnType で推論できるようにする。

```
type __ReturnType<B, F: (...any) => B | Promise<B>> = B
type $ReturnType<F> = __ReturnType<*, F>
```

他の middleware もこうやって対応できる

## ゴール

```js
// @flow
import type { $ReturnType } form '../types' 

// Actions
const INCREMENT = Symbol()
const ADD = Symbol()

export const increment = () => ({ type: INCREMENT })
export const add = (n: number) => ({ type: ADD, payload: n })

export type Action =
  | $ReturnType<typeof increment>
  | $ReturnType<typeof add>

// Reducer
export type State = {
  value: number
}

const initialState = {
  value: 0
}

export default (state: State = initialState, action: Action) => {
  switch (action.type) {
    case INCREMENT: {
      return { value: state.value + 1 }
    }
    case ADD: {
      return { value: state.value + action.payload }
    }
    default: {
      return state
    }
  }
}
```

## 展望

Stage:0 Patter Matching が来たら reducer もっとよく書けそう

https://github.com/babel/proposals/issues/6
ReactNativeで簡単なfetchからFlatList→onPressまでのサンプルプログラム（CRNA）

# 振り返り

このド素人記事から１週間・・・
[【Windows版】本当に0からのReact Native環境構築](http://qiita.com/courage-liberty/items/2e1b72b0acb15ad78e1e)

基本的なところは分かって来た気がします。

そこでベースとなるコードを書きましたので
少しでも参考になる方がいたら幸いです。

---

# CRNAでfetchからFlatList→onPressまで

ネットだと部品ばかりの情報でかなり苦労したので
僕は全文載せる派でいきます (^^♪

基本的なものは書けているはずです。
タイトルに書いたfetch・FlatList以外でも
stateやライフサイクル・アローfunction・onPressなどなど
良く使いそうなものは使っています。

まだまだ素人コードだとは思うので
その点はご了承ください。

```jsx

import React from 'react';
import {FlatList, StyleSheet, Text, View} from 'react-native';

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {data: null};
  }

  componentWillMount() {
    this._fetch();
  }

  _keyExtractor = (item) => item.releaseYear;

  _fetch = () => {
    fetch('https://facebook.github.io/react-native/movies.json')
      .then((response) => response.json())
      .then((responseJson) => {
        this.setState( {data: responseJson['movies']} );
      })
      .catch((error) => {
        console.error(error);
      });
  }

  render() {
    return (
      <View style={styles.container}>
        <View style={styles.header}>
          <Text style={styles.title}>一覧</Text>
        </View>
        <View style={styles.body}>
          <FlatList
            data={this.state.data}
            extraData={this.state.data}
            keyExtractor={this._keyExtractor}
            renderItem={({item}) =>
              <View style={styles.movieView}>
                <Text
                  style={styles.movieText}
                  onPress={() => Alert.alert(item.title)}
                >
                  {item.releaseYear}{'\n\t'}{item.title}
                </Text>
              </View>
            }
          />
        </View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
  },
  header: {
    marginTop: 30,
    padding: 10,
    borderStyle: 'solid',
    borderWidth: 1,
    alignItems: 'center',
    backgroundColor: '#c6e6fa',
  },
  body: {
    flex: 1,
  },
  footer: {
    padding: 10,
    borderStyle: 'solid',
    borderTopWidth: 1,
    alignItems: 'center',
    backgroundColor: '#c6e6fa',
  },
  title: {
    fontSize: 20,
    fontWeight: 'bold',
  },
  movieView: {
    padding: 10,
    borderStyle: 'solid',
    borderBottomWidth: 1,
  },
  movieText: {
    fontSize: 16,
    lineHeight: 25,
  },
});
```

---

# キャプチャ

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/163142/f0c1ba76-9f0c-cc53-ea14-88f09a1d85d1.png)

---

# どうでしょう？

何とかではありますが書けるようになって来たのかな？
と思えるぐらいにはなりました。
（正解が分からないので探り探りではありますが・・・）

これからはNavigationやWebViewなどもやっていきたいと思っていますので
参考になりそうだなと思ったら是非フォローお願いします (^^)✨
MS-WORD2010: "プログラムにコマンドを送信しているときに、エラーが発生しました"問題

# やはりWORDはWORDなのか！？
そのような印象を抱いてしまうのは、仕方のないことです。
症状は、Wordを開くとこの警告メッセージが表示されるだけのようにみえますが、気持ちのいいものではなく、OfficeやOSが不安になってしまいます。

# 結論 - 今回の解決例
* Word Viewer、Excel Viewer、Power Point Viewerのアンインストール
* 上記を実行後、docxファイルを開く。
* Office Essentials 2010が動作し、何らかの設定・初期化が行われる。
* 問題なくWordが起動。

## 背景
* ネットにある「管理者として実行」を切り替えて対処する方法が効かなかった。
* ネットやMSが薦めるレジストリをいじる対処法は嫌だった。
* 何故か少し前に、存在を忘れていたWordViewerの何らかの確認ダイアログが表示されたのを思い出した。
* WORDは好きですよ。

## その他
* Word Viewerはとっくにサポートが終了していて、Excel Viewerも2017/11に提供が終わるのですね。Word Mobileを代わりに使えとのこと。
https://blogs.technet.microsoft.com/officesupportjp/2017/09/04/support-for-office-viewer/
WordPress予約投稿のプレビュー時、wp_link_pagesで出力されるURLにページ番号が含まれない不具合の応急処置

2017/9/14現在最新のWordPress v4.8.1までの複数バージョンで症状が発生します。

## 症状

症状については以下フォーラムの投稿と同じものです。
https://ja.wordpress.org/support/topic/%E4%B8%8B%E6%9B%B8%E3%81%8D%E3%81%A7%E3%81%AE%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC/

<!-- nextpage -->を含めた本文を**予約投稿でプレビュー**した際に、
ページ送りリンクのURLは、本来
`http://example.com/?p=1334&page=2&preview=true`
のようになるべきところ、
`http://example.com/?p=1334%2F2%2F&preview=true`
と出力される **場合が** あります。
これにより、投稿の2ページ目以降をプレビューすることができません。

※場合があるというのは、予約投稿を設定して編集を開始した直後は正しく&page=2が出力されていても、
一度保存状態となるなど、何らかの条件によって%2F2%2Fが出力されます。
また、非公開＋予約投稿の場合も正しく出力されるため、運用で回避することもできます。

## 応急処置
URLの形状を強引に変更します。

```php:functions.php
/**
 * @param type $preview_link
 * @return type
 */
function custom_preview_post_link($preview_link){
	return preg_replace('/([0-9]+)%2F([0-9]+)%2F&/', '$1&page=$2&', $preview_link);
}
add_filter('preview_post_link', 'custom_preview_post_link');
```
Xcodeでビルドするソースファイル順を変更する方法

#はじめに
ファイルが数百あるプロジェクトでは、ビルドに時間がかかります。
ビルドエラーのデバッグをしているときに、いくつかのファイルをコンパイルしたいのに、他のコンパイルに時間を取られ、作業時間が無駄にかかることがよくあると思います。
**あるファイルがビルドエラーを含むか確認したいだけなら、それを最初にコンパイルすればすぐ結果がわかります** が、その順番を開発者が指定することはできるのでしょうか。
**コンパイルされるファイルの順番を変更する方法がある** ので、以下に手順を共有したいと思います。
(.pbxprojファイルに直接に手を入れるので、動作に関しては自己責任でお願いします。)

#手順
1. Finderから、順番を変えたいプロジェクトの.xcodeprojファイルの右クリックメニュー「パッケージ内容を見る」を選びます。
2. project.pbxprojファイルを開きます。
3. PBXSourcesBuildPhaseセクションを検索して、飛びます。
4. そこに登載されている「最初にビルドさせたいソースファイル」を見つけて、リストの先頭に移動させます。

以上です。あとはいつもどおりにビルドするだけです。

#感想
・この方法の危険さを評価できていないので、詳しい方がいらしたらコメントいただきたいです。
・GUI的に変更できるやり方や、もっとシンプルな方法があるのでしょうか?
・仮に、1回の完全なビルドに10分かかるとします。あるソースファイルのビルド順がランダムに決まるとしたら、ビルドエラーの確認まで平均5分ほどかかります。解決までに10回かかってしまうとしたら、ビルド時間だけで50分かかる計算に。一方、最初にビルドできる場合、12秒で結果がわかると仮定すれば、10回やっても2分です。ビルド中はソースコードを変更できないので、48分間コードをいじれる時間が増えることになる、、、はず!?
Jupyter > link > magic commands > %cpaste > コードの貼り付け

@ Scipy Lecture notes, Edition 2015.2
p14
@ Scipy Lecture notes, Edition 2017.1
p11

`%cpaste`というコマンドがあるようだ。

使い方は以下で見つけた。
https://stackoverflow.com/questions/10886946/how-does-ipythons-magic-paste-work

> answered Aug 5 '14 at 1:06
Yuly

> A clarification on the steps:
>
- First, copy target lines into your clipboard.
- Type into the iPython prompt:
    - If on Tkinter: enter `%paste`
    - Otherwise: enter `%cpaste`
- Paste (Ctrl-V) and hit enter.
- Then type `--` and hit enter.


http://ipython.readthedocs.io/en/stable/interactive/magics.html
カスタムサーチコマンドの作り方（Splunk）

#１．カスタムサーチコマンドについて
　Splunkではあらかじめ用意されているサーチコマンド以外に、自分で作成したサーチコマンド(カスタムサーチコマンド)を実行することも可能です。これはPythonを使って記述しますから、Splunkのサーチコマンドだけでは難しい処理も比較的簡単に行えたりします。

#２．作成方法
　Splunk上で”Hello World"と表示させるサーチコマンドを作成してみます。

###①Appの作成
　Splunkにログインし、Appの作成画面で名前を"Hello World"、フォルダ名を"hello_world"として新規作成します。

###②実行ファイルの作成
　/Applications/Splunk/etc/apps/hello_world/bin/配下に以下のファイルを配置します。

```python:hello_world.py
print 'title'
print 'Hello World'
```

###③設定ファイルの作成
 　/Applications/Splunk/etc/apps/hello_world/local/配下に以下の2ファイル配置します。

```text:commands.conf
[HelloWorld]
filename = hello_world.py
```

```text:authorize.conf
[capability::run_script_HelloWorld]

[role_admin]
run_script_HelloWorld= enabled
```
###③カスタムサーチコマンドの実行
　Splunkで作成した"Hello World"のAppを開き、以下のサーチコマンドを実行します。

```shell-session:
|run HelloWorld
```

下図のように"Hello World"が表示されました。
![スクリーンショット 2017-09-14 7.22.42.png](https://qiita-image-store.s3.amazonaws.com/0/201618/c6991e20-987a-333c-a8f8-9f5af9af01d2.png)


　なお、Appの権限を変更すればどのサーチ画面でも実行可能なコマンドになります。
Gitでソースを消す方法

# 目的

* Gitの履歴の保持方法を知る
* ソース（の差分）を消失する方法を知る
* 意図せず消さないための注意点を考える

---
# Git

* 分散型のバージョン管理システム
* 作者: [Linus Torvalds](https://jp.linux.com/news/linuxcom-exclusive/428524-lco2015041401)
* メンテナ: [濱野純](http://gihyo.jp/dev/serial/01/alpha-geek/0040)
* 元々 Linux kernel のソース管理の為に作られた

---
# 履歴

ImmutableなコミットのDAG(Directed ascyclic graph, 有向非巡回グラフ) で履歴を管理

![dag.png](https://qiita-image-store.s3.amazonaws.com/0/64323/0a087a20-40a8-3036-9a8e-646d8e3597bf.png)

---
# コミット

各々のコミットは、ソースツリーを参照している(ImmutableなTree, Blobで構成される)

![commit.png](https://qiita-image-store.s3.amazonaws.com/0/64323/342f9839-d281-a6a6-e304-f205794e32f9.png)

---
# リポジトリの構造

* Immutableなオブジェクトが格納されてる
  * 操作によりオブジェクトが追加される
  * 記録した情報は基本消えない
* オブジェクト間の参照
  * コミットは親コミットを参照
  * コミットはルートツリーを参照
  * Treeは子のTree,Blobたちを参照
* ブランチ、タグはコミットへのポインタ

---
# 基本的な操作

`git add ${FILES} && git commit`

* Tree, Blob たちを記録
* ルートツリーと親コミットを参照する Commit を記録

過去に記録したものには手を加えない

---
# いろいろな操作

* 過去のある時点のソースコードを取得する
  * `git checkout ${COMMIT_SHA1}`
* ファイルを消してコミット
  * `git rm ${FILE} && git commit`
* 過去の変更を打ち消すコミットを生成する
  * `git revert ${COMMIT_SHA1}`

これらも安全な操作（リポジトリから何も消さない）

---
# 安全側に倒した設計

ソース（の差分）が消える操作を（オプションもしくは事前条件で）抑止

例: 変更を加えているファイルが checkout で更新されそう

```
$ git checkout work
error: Your local changes to the following files would be overwritten by checkout:
	readme.txt
Please commit your changes or stash them before you switch branches.
Aborting
```

---
# 何も消えないの？

* .git/ (リポジトリ)を壊さない範囲で
* ミスで消えないよう配慮はされている
* これから消し方を説明します！
  * そもそも記録してない情報は消える
  * 記録したものも消そうと思えば消せる

---
# 記録してない情報

* git add してないファイル
* git add してない差分

これらはリポジトリに入っていないので消せる

---
# 管理してないファイルを消す

```
$ git clean
fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
```

デフォルト(clean.requireForce=true)では引数なしは弾かれる

* `-n` で何が消えるか確認
* `-f` で実際に消す
* `-d` とか `-x` もよく使う
* ビルドで生成されたファイルを消すときなど

---
# ファイルの変更を消す

```
$ git checkout ${PATH}
```

* 指定したファイルは index と同じ内容になる
* HEAD にするなら `git checkout HEAD ${PATH}`
* 変更しかけた1ファイルを元に戻す

---
# ファイルたちの変更を消す

```
$ git reset --hard
```

* HEAD と同じ内容になる
* 変更しかけたファイルたち(と index)を元に戻す

---
# ブランチの削除

```
$ git branch -d work
error: The branch 'work' is not fully merged.
If you are sure you want to delete it, run 'git branch -D work'.
```

* upstream もしくは HEAD にマージされてなければ一旦弾いてくれる
* どうすれば迂回できるかはメッセージに出てる

それでも先に進む？

---
# ブランチの削除

`-D` または `-d -f` でブランチを削除

* 消えるのはブランチだけ
* コミットはその時点では消えない
* `git gc` (GC = garbage collection)
* どこからも参照されていないコミットは gc で消える
  * 参照されていれば消えない

---
# 参照されていれば消えない

* いろいろやり直せることも思い出す
* ローカルブランチ気軽に使おう
* 例えば以下の手順でバックアップ作れる

```
$ git add ${FILES}
$ git commit
$ git branch backup
$ git reset HEAD~1
```

---
# リモートの話

```
$ git push ${REMOTE} ${BRANCH}
```

* リモートに履歴をバックアップできる
* ローカルで消えても戻せる可能性
* 手元の .git/ が壊れた場合にも助かるかも

---
# まとめ

* git を使ったソースの消し方を見た
* 基本的には履歴を安全に保持してくれる
* 消える可能性があるのは
  * コミットしてないもの
  * タグやブランチから参照されてないもの
* 知った上で使えば大丈夫
  * 必要に応じてバックアップするとよいかも
TensorFlowでkeras その6

#概要
TensorFlowでkerasやってみた。
load_weights して、evaluate_generator で評価してみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#評価
学習時


```
loss = 0.6069 acc = 0.6784
```

読み込んで

```
[0.60562552452087404, 0.68125000000000002]

```

#サンプルコード

```
import os
from tensorflow.contrib.keras.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.contrib.keras.python.keras.models import Sequential, Model
from tensorflow.contrib.keras.python.keras.layers.convolutional import Convolution2D
from tensorflow.contrib.keras.python.keras.layers import Dense, Dropout, Activation, MaxPooling2D, Flatten, Conv2D
from tensorflow.contrib.keras.python.keras.optimizers import Adam

pwd = os.getcwd()
img_width, img_height = 128, 128
train_data_dir = pwd + '/train'
validation_data_dir = pwd + '/validation'
nb_train_samples = 2000
nb_validation_samples = 800
nb_epoch = 10
batch_size = 64
result_dir = pwd

if __name__ == '__main__':
	train_datagen = ImageDataGenerator(rescale = 1.0 / 255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
	test_datagen = ImageDataGenerator(rescale = 1.0 / 255)
	train_generator = train_datagen.flow_from_directory(train_data_dir, target_size = (img_height, img_width), batch_size = batch_size, class_mode = 'categorical')
	validation_generator = test_datagen.flow_from_directory(validation_data_dir, target_size = (img_height, img_width), batch_size = batch_size, class_mode = 'categorical')
	model = Sequential()
	model.add(Convolution2D(32, 3, 3, input_shape = (img_width, img_height, 3)))
	model.add(Activation('relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Convolution2D(64, 3, 3))
	model.add(Activation('relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Flatten())
	model.add(Dense(64))
	model.add(Activation('relu'))
	model.add(Dropout(0.5))
	model.add(Dense(2))
	model.add(Activation('softmax'))
	model.load_weights(os.path.join(result_dir, 'cnn4.h5'))
	model.summary()
	model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
	print (model.evaluate_generator(validation_generator, nb_validation_samples / batch_size))


```
備忘録　Unity2017とGoogleVR1.70の組み合わせでセットアップしてみる x iOSビルドで地雷を踏んだ話

※しっかり確認していないので、余分な手順が含まれている可能性があります。

意地でも新しいVerのUnityでやってみたかったのであとで・・・。やっとできたので見返すようにメモ書き。

環境&用意するもの
・Unity2017
・[Unity用のGoogleVRSDK1.70.0](https://github.com/googlevr/gvr-unity-sdk/releases/tag/1.70.0 "Unity用のGoogleVRSDK1.70.0")（直リンク注意GitHubへ飛びます）
・XCodeとiOS端末（僕の環境はiPhone7iOS10.3.1とXCode8.3.3みたいな感じです）

キューブを眺めるだけのスマホVRを作る手順

1.UnityとSDKを用意します。SDKはunitypackageのものだとラクラクです。
2.新規のプロジェクトをつくり、適当な場所にキューブを配置。そのキューブが中央くらいにはいるように調整。
3.さきほどのunitypackageをインポート、Unity上のプロジェクトタブの検索窓に「GvrEditorEmulator」と打ち込んで出てきたprefabをヒエラルキーに出す。（※これは旧Verの「GvrViewerMain」らしいです。）

※ここからはiOS用のプロジェクトの作成やらビルドやらですがiosの詳しいビルドの仕方に関しては長いので省きます。

4.上部メニュー[File->Buid Setting]から[Platform]をiosへ変える。
5.次に[Player Settings]を開き[Other Settings -> Virtual Reality Supported]にチェック,有効化
6.特に何もしていない状態だと「List is Empty」と表示されますので[CardBoard]を追加。
7.おもむろにBuildを押してiosのプロジェクトを作る8.完成するとフォルダが勝手に開くと思うので<font color="Red">「Unity-iPhone.xcworkspace」</font>を開きます。ここでいつも通りの~.xcodeprojを開いてビルドするとLinkerうんちゃらエラーが出てすごくイライラします。
ちなみにエラーはこんなの→
error: linker command failed with exit code 1 (use -v to see invocation)
9.[xcworkspace]を選んだら、あとはいつも通りiOSのビルドを設定する。あとは実機で実際にみてみる。

僕は詳しくないですが、xcworkspaceがあるということは正しくSDKやUnityの機能でプロジェクトを吐き出すと「CocoaPods」を使った機能をゴニョゴニョ自動で行ってくれるということなのでしょーか。
Atom-IDEについて

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Introducing IDE-like functionality for your <a href="https://twitter.com/AtomEditor">@AtomEditor</a> 🚀 <a href="https://t.co/V9oqF8hHfm">https://t.co/V9oqF8hHfm</a></p>&mdash; GitHub (@github) <a href="https://twitter.com/github/status/907674160809291777">2017年9月12日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

[Introducing Atom-IDE | blog.atom.io](http://blog.atom.io/2017/09/12/announcing-atom-ide.html)
[Introducing Atom IDE UI | Nuclide](https://nuclide.io/blog/2017/09/12/Introducing-Atom-IDE-UI/)

使ってみると明白ですがIDEというのは政治的なネーミングでそうしたというのが、適切だと思います。
さて、もともとFacebookはNuclideと呼ばれるオールインワンパッケージを公開しています。
今回は、`Atom IDE is extracted from Nuclide`の通り、Nuclideから一部機能を機能を抽出したものであります。

![](https://user-images.githubusercontent.com/378023/29859731-741403be-8d9e-11e7-99c5-6b914e3fff9c.png)

Atom-IDEが提供する機能は、以下の通りです。

- Diagnostics
- Definitions
- Find References
- Outline View
- Datatips
- Code Formatting
- Code Actions
- Code Highlight
- Busy Signal

さて、Nuclideはてんこ盛りパッケージとして悪名高いです。
上記だけでなく、複数言語のサポートも盛り込まれており重くなりがちです。
しかしながら、flowtypeユーザにとっては、誤解を恐れずに言えば、コレ以外まともな補完やエラー通知等があるパッケージがありませんでした。
そこに、今回のAtom-IDEにより、軽量Nuclide環境が実現しました。
これを踏まえると逆に機能が分離され、必要な機能はインストールする必要がなくなり、よりエディタらしくなったとも言えるでしょう。

## インストール
クリーンな環境にインストールしました。

```
$ apm install atom-ide-ui
$ apm install ide-flowtype
```

触った感触としては、普通に軽量Nuclideですね。
しかし、Nuclideより劇的に軽いです。

## Nuclideを比較して
軽量で高速であり、flowtypeのためだけにNuclideを入れざる得ない人にとっては福音でありましょう。
しかし、flowtypeの型のカバレッジ等、Nuclideにあって、Atom-IDEにない機能もあります。
issueを確認してところ、すでに上がっていたので実装される気配はあります。

## VSCodeと比較して
Atom1.21 beta時点では、Atomの方が高速でしょう。
しかし、標準の機能、特に補完に関して言えばVSCodeが圧勝しており、Atom環境でこれを再現するのは現状難しいと思われます。
また、標準で提供しているGit連携もVSCodeの方が些か使いやすいと感じます。
VSCodeから移行すべかと聞かれれば全くないと答えます。

## 結論
Atom-IDEはNuclideより圧倒的に高速であり、既存のNuclideユーザは一考の余地があります。

※ この記事はvimを使って書かれました
Atom IDE を試してみた

今日発表されたやつ。ide-flowtype を動かしたかった

- https://atom.io/beta から Atom の beta 版を落とす。
- 起動する
- なんか知らんが色々と権限不足で失敗する。Betaっぽい。


最初、今ある環境にそのまま突っ込もうとしたけど、なんかごちゃごちゃしてたんで、一旦全部無効化した。

```
mv ~/.atom ~/.atom-old
```

この状態で初期化するためにAtom Betaを再起動する。

- Menu から Preferences -> Install 
- atom-ide-ui と ide-flowtype を Install
- 再起動
- meta+O でアウトライナーが起動

動いた。

![](https://i.gyazo.com/249483c0603aa17a6855cf4096ae70e5.gif)


## 発生した問題

メニューの Install shell command が権限不足で失敗する。apm-beta コマンドを入れようとしているように見えるが… まあ beta だからいいか

一番困ったのが、Diagnostics が、めっちゃ使われてるパッケージ、 `linter` と共存できない！！！
linter-eslint が死ぬので困った。そのうち解決するだろうが…


## おまけ: 自分の環境

昔の反省で、エディタ凝るのに懲りてて、最小限でも生きていけるように体を慣らした。
今いれてるのはこれだけ。

- atom-ide-ui
- ide-flowtype
- vim-mode
- atom-prettier

設定ファイルもほぼ書かずに、ほぼプレーンな状態です。vim-modeは癖が強いかもしれない…
LSTMでカフカの「変身」を元に文章生成してみたら、何者にもなれなかった話。

# 概要

文章生成はどれぐらいのデータセットだと、どれほどの精度が出るものなのか、
一度も試したこともなかったので挑戦してみました。

## 手法

Tensorflowで書きました。Kerasのほうが単純に書けると思います。。。
2層のLSTMを設置し、１文字後のchar/wordを教師データとして学習。
文章生成時は、予測確度1位のchar/wordを選択しています。
ゆらぎを出す場合は、予測上位からランダム選択で良いと思います。

datasetは、以下のURLからカフカの「変身」を選びました。意味は特にありません。
http://www.gutenberg.org/ebooks/5200

前処理は、本文箇所だけを抽出し、chapter表記を削除しただけです。
記号の置換とかもすれば、もっと綺麗になると思います。

コードはこちら、
https://github.com/pigooosuke/lstm_text_generator

## 結果

"The"から始まる文章を生成してます。

### Charレベル

ボキャブラリー数: 60
char総数: 116622

```
The same times that I've open upingoull, and his fordit the sigh of the reases,
and no tho gontoused and he pusied hers so that he was to became use to be ard
forgove and he would save with a cramous snignto and if he wolld with hiseof ball
paysfrom a lots of his beadionabthraif asting wouldnewpatreary himself asliad for
hil", and pust ho ewairsutention with anverask so stant that spert flack as home
and he would know all the bost of what had been sudfert horrikeltsubpessitratthr ,
was a giran in mupid.- Gregor had never could be seen fuc  award efuss to bong
severy decisavely atthis way warall.
```

空白スペースもきちんと学習できているみたいです。
正直、意味がよくわからない。

### Wordレベル
ボキャブラリー数: 4997
単語総数: 20252
↑ ボキャブラリーに対して、単語総数のバランスが悪いかも。。。

```
The room for her hand and she had her her came hands often her selfcontrolled, It
was very sign and the father would have to him but she had been more for her and
she had not very indifferent to him more tried to get and difficult that she would
used to get himself than he had been before. for bed Gregor had him for him to it;
he had back and it was thought that he would have to him for the time that she had
already again in this mother and could not time about this I not me to ask I
parents to the hall, that father only to the door as his mother would always put on
the key on the door with the gold slightly in the notes and day,
```

charレベルに比べるとまともに見えるけど、意味が読み取れない・・・
ちなみに上記をgoogle翻訳に通すと、

```
彼女の手のための部屋と彼女は彼女を持っていた彼女は頻繁に彼女は自制して手を来た、
それは非常に印象的であったと父は彼に持っていたが、
彼女は彼女のためだったと彼女は、以前よりも自分自身を得るために使用されていました。
ベッドのためにグレゴールは彼のために彼にそれを持っていた。
彼は戻ってきて、彼はこの母親にもう一度やっていた時間のために彼に彼がいなければならないと考えられました。
私は私が私の両親に会うように私はしませんでした。
常にメモと日に金を少し入れてドアの鍵をかける。
```

うーん。
カフカマニアなら、「カフカっぽい言い回しじゃん！」ってなるのでしょうか？

ごく短い単語長なら理解できますが、、、
・the father would have to
・it was thought that he would have to
・his mother would always put on the key on the door

### 改善事項

アイディアレベルですが、
・予測単語は特に絞っていないので、決められたボキャブラリーの中から予測する。
・予測文をランダム長より固定長にしてパディングする。
・複数候補の文を生成し、前後の文章のコサイン類似度が高いものを採用。
などでちょっとまともになるかもしれませんが、劇的な改善があるかは疑問です。
あとclassificationだと2gram-charと3gram-charとかで精度向上するケースもあるので、それをトライするのも面白いかも知れません。上記のやつは1gram-charです。


対話形式の文章生成は、よく取り上げられますけど、
単純に文章を生成するのは、大変ですね。
[備忘]MongoDBの導入から簡単な使い方

#はじめに
MongoDBの導入から簡単な使い方をメモっておきます。

| ソフトウェア | バージョン |
| --- | --- |
| CentOS7 | 7.3.1611 |
| Node.js | v6.11.1 |
| Node-RED | v0.17.5 |
| MongoDB | 3.4 Community Edition |

#MongoDBのインストール
[公式サイト](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/)に従ってインストールします。

##yumリポジトリの登録
MongoDBのyumリポジトリを設定します。

```
# vi /etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
```
##インストール
yumでインストールします。

```
# yum install -y mongodb-org
```

##外部からの接続を許可する
デフォルトでは外部からの接続が禁止されているため、これを許可する設定に変更します。
/etc/mongod.confのbindIp: 127.0.0.1の記述をコメントアウトします。

```
vi /etc/mongod.conf
#  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
```
 
##実行してみる
serviceとして実行してみます。SELINUXの設定は適切に。

```
# systemctl start mongod.service
```
##使ってみる
最低限の使い方です。

- MongoDBへの接続

```
> mongo
```

- データベースへの接続
 - 既存のデータベースの場合は接続します。
 - 新規のデータベースの場合はuseで接続した後に、コレクションを作らなければなりません。

```
> use [データベース名]
```

- コレクションの作成

```
> db.createCollection('コレクション名')
```

- データベースの一覧表示

```
> show dbs
```

- データベース内のコレクション一覧表示

```
> use [データベース名]
> show collections
```

- ドキュメントの登録

```
> use [データベース名]
> db.[コレクション名].insert(JSONデータ)
```

- ドキュメントの参照（全件）

```
> use [データベース名]
> db.[コレクション名].find()
```

- ドキュメントの参照（検索）

```
> use [データベース名]

# AND検索
> db.[コレクション名].find({"フィールド名":"検索値"}, {"フィールド名":"検索値"},・・・)

# OR検索
> db.[コレクション名].find({$or:[{"フィールド名":"検索値1"}, {"フィールド名":"検索値2"}]})

# 範囲検索（検索値1より大きく検索値2未満）
> db.[コレクション名].find({"フィールド名":{&gt:"検索値1", &lt:"検索値2"}})

# 取得する項目の指定方法
# 任意の数値が0の場合は非表示となる。_idを表示したくない場合は"_id":0とする。
> db.[コレクション名].find({検索条件},{"取得項目":[任意の数値], "取得項目":[任意の数値]・・・})

# 特定の項目を持つ/持たないドキュメントの検索
> db.[コレクション名].find({"フィールド名":{$exists:[true|false]}})
```

- ドキュメントの更新

```
> use [データベース名]

# ドキュメントを洗い替える場合
> db.[コレクション名].update({検索条件}, {更新後のJSONドキュメント})

# 特定の項目を更新する場合、または、新たに項目を追加する場合
> db.[コレクション名].update({検索条件}, {$set:{"フィールド名":更新内容, "フィールド名",更新内容,・・・}})

# インクリメンタル（指定したフィールドの値を増分プラスする）
> db.[コレクション名].update({検索条件}, {$inc:{"フィールド名":増分}})

# あれば更新、無ければ登録
# 第3引数にtrueを指定する。
> db.[コレクション名].udpate({検索条件}, {更新内容}, true)
```

- ドキュメントの削除

```
> use [データベース名]
> db.[コレクション名].remove({検索条件})
```

# 比較演算子
| 演算子 | 記述方法 |
| --- | --- |
| > | $gt |
| >= | $gte |
| < | $lt |
| <= | $lte |
| != | $ne |
| or | $or |
CentOSでIPv6を無効にするとPostfixが動作しない

#概要

CentOS7でIPv6を無効化すると、メール送信がエラーとなる。

```error
send-mail: fatal: parameter inet_interfaces: no local interface found for ::1
```

#対処法

`::1`はIPv6のlocalhostのため、IPv6絡み。

`hosts`の該当行をコメントアウトすれば解決する

```hosts
vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

サービス再起動も忘れずに

```
systemctl restart postfix.service
```
参考：[CentOSでIPv6 を無効にするとメールが送れなくなった - Qiita]()
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第三章 モデルと実装を結びつける2

# モデル駆動設計
> モデル駆動設計は、分析モデルと設計という二分法を捨て去り、両方の目的に使える単一のモデルを探し出す(第一部 第三章より)

[前回](http://qiita.com/YasuhiroKimesawa/items/e7a3fb6f78aa8d9d2a97)のように、分析モデルだけではなく、分析と設計両方で適用できる１つのモデルを探すこと。実装に結びつかない場合、ドメインの主要な概念を表現していない場合も新たに探す。

> ドメインを抽象化する方法は常に数多く存在し、アプリケーションの問題を解決できる設計も常に数多くある。だからモデルと設計を結びつけることは現実的に可能なのだ。(第一部 第三章より)

選択肢は多くある。より自然に実装できるよう、修正、検討を繰り返す。

> モデリングと設計のプロセスは、反復されるただ１つのループになるのだ(第一部 第三章より)
> これは、ドメインに対する深い洞察を反映させようとする時にも言える。(第一部 第三章より)

反復が必要ということは当然アジャイルが合うということに繋がりますよね。

ウォーターフォールでは、作りっぱなしになるから、深い洞察には結びつかないです。
設計・実装当初は議論もするし、その場ではある程度よいモデルになっていたかもしれない。
ただ、リリース後はもうそのモデルは見ない。バグの修正や、機能追加があって、モデルを修正する場合でも修正箇所以外は見ないのでモデルを見直すとはならない。。。というのを実際、経験しています。


分析モデル、設計、実装を通して単一のモデルを探し出す**反復**はいずれ、深い洞察につながる。
もちろん、アジャイルで。
xlink:href属性を使用したSVGのDataURI変換


- HTML5内でSVGを使う場合は名前空間宣言(xmlns属性)を省略できる
- DataURIでSVGを生成する場合は名前空間宣言が必要となる

```xml
<svg xmlns="http://www.w3.org/2000/svg">

</svg>
```

- svgの中でxlink:href属性を使用していた場合、xlinkの名前空間宣言も必要

```xml
<svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink">

  <textPath xlink:href="#MyPath">

</svg>
``` 
- xmlns:xlink属性を忘れた場合、Chrome/Edgeは自動で補完したDataURI形式のSVGを作成してくれる
- Firefoxは補完しないので、不正なSVGとなり表示されない


# 参考
- [https://developer.mozilla.org/ja/docs/Web/SVG/Namespaces_Crash_Course](https://developer.mozilla.org/ja/docs/Web/SVG/Namespaces_Crash_Course)
- [https://developer.mozilla.org/ja/docs/Web/SVG/Element/textPath](https://developer.mozilla.org/ja/docs/Web/SVG/Element/textPath)
【rails】kaminariを使ってページネーションを作る


この記事は下記に移行しました。
下記メディアで開発に関する記事やスタートアップについて発信していきます。

またエンジニアの方は月一時間から技術顧問もできます。
興味のある方はご応募ください。

https://www.airteams.net/media/articles/1985
文字コードの変換処理

初投稿なので簡素な記事を書きます。

ファイルの文字コードをnkfコマンドで変換し、
Linux上で正常にファイル閲覧できるようにします。

#実施環境
・OSはLinux Mint15を利用して実施しています。
・以下の国土交通省サイトからダウンロードできるCSVファイルを使用します。

　　[歩行空間ネットワークデータ等(渋谷地区)](https://www.hokoukukan.go.jp/metadata/detail/65)

#手順

##1.CSVファイルをLinuxサーバ上にダウンロード
上記サイトからfacility.csvをダウンロードします。
歩行空間ネットワークデータ(csv形式)という欄です。

##2.該当ファイルの中身をheadコマンド等で確認
以下のコマンドをCUI画面上で実行します。
実行する際は相対パスもしくは絶対パスでの指定をします。

$ head facility.csv

すると以下のような文字化けしたデータが表示されます。

user@servername ~/ダウンロード/65/177 $ head facility.csv
facil_id,facil_type,evacuation,temporary,name_ja,name_en,address,tel,lat,lon,floors,toilet,elevator,escalator,parking,barrier,nursing,brail_tile,info,info_board
00001B000000000309CB7D265EB2FFC1,1,0,0,�a�J�_���X�֋�,99,�����s�a�J���_��1-21-1,03-3461-9919,35.662071,139.700606,1,0,0,0,0,0,0,0,1,0

##3.文字コード設定の確認
続けて以下のコマンドを実行してLinuxでの文字コード設定を確認します。
現在の設定はUTF-8と表示されます。

$ env | grep LANG
LANG=ja_JP.UTF-8

##4.nkfコマンドでCSVファイルの文字コード確認
nkfコマンドのgオプションを使用してCSVファイルの文字コードを確認します。
Shift_JISと表示され、Linux上の設定と異なっているために文字化けしていることがわかります。

$ nkf -g facility.csv
Shift_JIS

###補足：Homebrewを利用する
nkfが使用できなかった場合は以下のコマンドでHomebrewでnkfコマンドをインストールします。

$ brew install nkf

インストール後に再度gオプションで文字コード確認をします。

##5.文字コードの変換
nkfコマンドのwオプションでCSVファイルの文字コードをUTF-8に変換します。
その後再度gオプションで文字コード設定が変換できているか確認します。

$ nkf -w facility.csv > facility_Utf8.csv
$ nkf -g facility_Utf8.csv
UTF-8

以上の手順後、変換したfacility_Utf8.csvをhead等で閲覧すると文字化けが直っています。

user@servername ~/ダウンロード/65/177 $ head facility_Utf8.csv
facil_id,facil_type,evacuation,temporary,name_ja,name_en,address,tel,lat,lon,floors,toilet,elevator,escalator,parking,barrier,nursing,brail_tile,info,info_board
00001B000000000309CB7D265EB2FFC1,1,0,0,渋谷神南郵便局,99,東京都渋谷区神南1-21-1,03-3461-9919,35.662071,139.700606,1,0,0,0,0,0,0,0,1,0
00001B000000000309CBAC265E6E7FC1,1,0,0,放送センター内郵便局,99,東京都渋谷区神南2-2-1,03-3467-0475,35.664682,139.696801,1,0,0,0,0,1,0,0,1,0
00001B000000000309CBE9A65DFB7FC1,1,0,0,渋谷富ケ谷一郵便局,99,東京都渋谷区富ヶ谷1-9-17,03-3467

##まとめ
文字化けのトラブルはWindowsやLinuxなどの複合環境や
外国語対応したアプリケーションのCSVデータを取り扱う際に
よく出会ってしまいますので、知っておくと便利です。