OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft の量子コンピューティング向けプログラミング言語 Q# のサンプルを動かしてみる



## 環境構築

### 前提条件

- AVX 対応のCPU

Microsoft の量子シミュレータは Advance Vector Extensions（AVX）を利用しているため、 AVX 対応の CPU が必要です。
現在では Sandy Bridge 以降の intel CPU でサポートが確認できているようです。

- 64 bit Windows

- Visual Studio 2017

インストール済みの前提で進めます。
未インストールの方は [Visual Studio のダウンロードページ](https://www.visualstudio.com/ja/downloads/)よりダウンロードしてインストールしてください。
その際、最低でも**[ユニバーサル 
Windows プラットフォーム開発]と[.NET デスクトップ開発]にチェック**を入れましょう。
インストール済みの方もそれらがインストール済みかは確認しておくと良いでしょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/876b9893-5cd6-4875-4d08-5f4df81f2563.png)

### Microsoft Quantum Depelopment Kit をインストール

[Microsoft Quantum Depelopment Kit](https://www.microsoft.com/en-us/quantum/development-kit)のページから[Download now]をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/14ee8616-e7f9-41cb-130d-452bca2827a6.png)
いくつかの個人情報を入力してダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/096634e3-9a4a-baa5-68d2-3803934b962a.png)
vsix ファイルがダウンロードされますので、これをダブルクリックしてインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/bb5b4160-586d-a9ca-e456-330bd511b443.png)
![2017-12-14.png](https://qiita-image-store.s3.amazonaws.com/0/100313/efac9e78-b20f-7893-c01f-10ecbf333967.png)

## 環境の検証

サンプルをダウンロードして動かします。
Visual Studio を開いて、チームエクスプローラーを使って[公式の GitHub](https://github.com/microsoft/quantum)リポジトリを複製します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/e1d860ea-3c6f-55fc-4587-716c51fe1448.png)

`QsharpLibraries.sln` ソリューションをダブルクリックして開きます。
`TeleportationSample` プロジェクトを右クリックし、[スタートアッププロジェクトとして設定]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/4d291d73-3025-43c5-c92c-9fcf3828efcd.png)
[F5]キーを押して実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/c62cf737-7118-b6b2-6f33-501229548e33.png)
このように8回テレポーテーションが成功した場合、Q# 開発をサポートしています。

## コメント

最後の実行直前、エディターウィンドウには何も表示されていなくても、F5 を押せば実行されます。
コードは `TeleportationSample` プロジェクト内にある `Program.cs` で、ここで呼び出している `TeleportClassicalMessage` は同ディレクトリにある `TeleportationSample.qs` で定義されているようです。
Q# のソースコードは C# の経験がある私からしてかなり読みやすい印象を受けました。
たぶん、F# の経験があるかたも同様の印象を受けるのでしょう。
.NET 上でシミュレーションできるので、量子コンピューティングがかなり身近になった気がしますね！
今回はGitHub上のコードを実行しただけなので、ソースコードを見たい方はそちらを見てください。
今回実行した `TeleportationSample` 以外にもサンプルがいくつか用意されており、

0. Introductory Samples
1. Algorithm Samples
2. Characterization and Testing Samples
3. Hamiltonian Simulation Samples

と順番にサンプルが用意されている（それぞれのテーマ毎にいくつかのサンプルが用意されている）ので、Q# をもっと読み解いていきたいですね。

## 参考

[Quantum Development Kit | Microsoft](https://www.microsoft.com/en-us/quantum/development-kit)
[Setting up the Q# development environment | Microsoft Docs](https://docs.microsoft.com/ja-jp/quantum/quantum-installconfig?view=qsharp-preview)
nginxを用いてgzip爆弾による不正アクセスへの攻性防壁

## はじめに

Wordpressの脆弱性狙いの不正アクセスに対して、展開後にとても大きくなるgzipファイルをレスポンスすることで攻性防壁を構築するブログを参考に、nginxを用いてMacのローカルPCに検証構築した記録です。
参考： [How to defend your website with ZIP bombs](https://blog.haschek.at/2017/how-to-defend-your-website-with-zip-bombs.html)

### ソフトウェアバージョン
MacOSX Sierra
nginx : 1.12.2

## 手順
Homebrewにてnginxをインストールして検証しました。
nginxの設定ファイルなどのパスについては、自分の環境に適宜置き換えてください。

### 1. gzip爆弾ファイルの作成
展開後に10GBになるgzファイルをwww配下に作成します。
圧縮状態だと10MB程です。

```shell-session
$ dd if=/dev/zero bs=1m count=10240 | gzip > /PATH/TO/WWW_ROOT/10G.gz
```

### 2. 不正アクセスパス(/php)のレスポンスに作成したgzipファイルを返すようにセット
レスポンスを差し替えるため location 設定に追加します。

```nginx
# /php 以下にgzip爆弾を仕掛ける
location ^~ /php {
    default_type  text/html;             # 展開後の形式
    add_header  Content-Encoding  gzip;  # gzip圧縮済をヘッダに付与
    gzip off;                            # nginxによる自動圧縮をOFF
    alias /PATH/TO/WWW_ROOT/10G.gz;      # レスポンスは必ずBombファイル 
}
```

設定後、変更を反映させるためnginxを再起動します。



## アクセス結果
ブラウザ：AndroidのChromeや、PCのChrome、Edgeなどでアクセスすると、メモリが上昇してしばらくした後にエラー表示になります。
コマンドラインツール：curlやwgetでは圧縮後のファイルをダウンロードするだけで自動展開はされないためあまり爆弾になりませんでした。

## おわりに
今回はnginx上で不正アクセス者へ展開後に大きくなるファイルによる攻性防壁を構築しました。
実際の運用に適用するにはいろいろ問題があるかとは思いますが、実験としては面白いものでした。
攻性防壁の実験の一つとして触ってみてはいかがでしょうか？
Excel VBA Qiitaの表のマークダウンをExcelで作るマクロ


ファイル名は Const SaveFileName = "C:\hoge\sheetttxt.txt" 
で決めています。上書きするので、必要なものは別名で保存してください。
タイトルは1行目のみに入れます。
またセル内の途中改行（ALT+Enter)は反映されない可能性があります。
あくまでも簡易なものです。

```vb:MakeSheetText
Sub MakeSheetText()
'Dim sr As ADODB.Stream: Set sr = New ADODB.Stream
Dim sr As Object: Set sr = CreateObject("ADODB.Stream")
Dim r As Range, URng As Range
Dim i As Long, i1 As Long, irow As Long, icol As Long, lastrow As Long, lastcol As Long
Dim ws As Worksheet: Set ws = ActiveSheet
Dim buf As String
Dim MaxWidth()
Const adCRLF = -1
Const adTypeText = 2
Const adWriteLine = 1
Const adModeReadWrite = 3
Const adSaveCreateOverWrite = 2
Const SaveFileName = "C:\hoge\sheetttxt.txt" 
sr.Type = adTypeText
sr.LineSeparator = adCRLF
sr.Charset = "SJis"
'sr.Charset = "UTF-8"
sr.Mode = adModeReadWrite
sr.Open
Set URng = ws.UsedRange
lastrow = URng.Rows.Count
lastcol = URng.Columns.Count
For icol = 1 To lastcol
i1 = 0
'最大値採寸
For irow = 1 To lastrow
If i1 < Len(CStr(ws.Cells(irow, icol).Value)) Then i1 = Len(CStr(ws.Cells(irow, icol).Value))

Next
ReDim Preserve MaxWidth(1 To icol)

MaxWidth(icol) = i1
Next
buf = ""
For irow = 1 To 1
For icol = 1 To lastcol
If Len(CStr(ws.Cells(irow, icol).Value)) < 5 Then
buf = buf & "|" & CStr(ws.Cells(irow, icol).Value) & String(5 - Len(CStr(ws.Cells(irow, icol).Value)), " ")
Else
buf = buf & "|" & CStr(ws.Cells(irow, icol).Value)
End If
Next icol
Next irow
sr.WriteText buf & "|", adWriteLine

buf = ""
'書式決定行
For icol = 1 To lastcol
If MaxWidth(icol) < 5 Then
buf = buf & "|:----:" 'Center
'buf = buf & "|:-----" 'Left
'buf = buf & "|-----:" 'Right
Else
buf = buf & "|:" & String(MaxWidth(icol) - 5, "-") & ":"

End If

Next icol
sr.WriteText buf & "|", adWriteLine
'2行目以降
For irow = 2 To lastrow
buf = ""
For icol = 1 To lastcol
If buf <> "" Then
buf = buf & "|" & CStr(ws.Cells(irow, icol).Value)
Else
buf = buf & "| " & CStr(ws.Cells(irow, icol).Value)
End If
Next icol
sr.WriteText buf & "|", adWriteLine
Next irow

sr.SaveToFile SaveFileName, adSaveCreateOverWrite

End Sub
```
OUTLOOK Word VBA URL,現在編集中のウィンド(Inspector)にファイル、フォルダのリンクを文末に挿入するマクロ

OUTLOOKでメールを編集する画面をインスペクターと言います。
インスペクターにはURLを入れる機能はありますが、使い勝手がよくありません。
そこで文末に入れる機能を作りました。

#注意点
##署名の前を判定させる
文末とはここでは署名の前のことをいいます。
署名の前をどうやって判定させるか。
これは個人の署名の仕様次第ですが、たとえばこんな感じの署名だったとします。

-From---
Mail:Qitta@doress
Name:

--

といった署名だとします。そうすると文末とは\-from---のまえだとわかります。
これを検索して判定します。なのでリプライが重なり、署名がなんども出てくるとうまくいかないです。なお、インスペクターを立ち上げた後、署名を挿入するには三流君の方法しかないようです。

## Wordが必要
このVBAはWordの機能を使っています。（参照設定もしますが）

## 改行が入る
成功するとなぜか改行が入りますが、削ってください。



```vbnet:InsertURLAndFileLinkToActiveMailInspector
Sub InsertURLAndFileLinkToActiveMailInspector()
'For OUTLOOK VBA
'You must add a reference to the Microsoft Word and FSO and regExp Object Library
'before this sample will compile
'WordとFilesystemObject、VbScript Regular Expression 5.5を参照設定してください
Dim MyItem As Outlook.MailItem
Dim AIN As Outlook.Inspector
Dim wdDoc As Word.Document
Dim wdRange As Word.Range, wdRng2 As Word.Range
Dim objItem
Dim str As String
Dim buf As String, bu1 As String, bu2 As String, bu3 As String
Dim obj As Object
Dim iPosition As Long
Dim NS As NameSpace: Set NS = Outlook.Session
Dim ss: Set ss = Outlook.Session
Dim fs As FileSystemObject: Set fs = New Scripting.FileSystemObject
Dim REX As RegExp: Set REX = New RegExp
Dim isURL As Boolean: isURL = False
Dim wdFound As Word.Find
buf = InputBox("Input File or Folder Name", "Input")
On Error Resume Next
If fs.FileExists(buf) Then
Set obj = fs.GetFile(buf)
ElseIf fs.FolderExists(buf) Then
Set obj = fs.GetFolder(buf)
Err.Clear
End If
With REX
.Global = True
.MultiLine = False
.IgnoreCase = False
.Pattern = "^(http*|ftp|www)" '文字列の先頭がhttp(s),ftp,wwwのときURLと判定する
If .test(buf) = False Then
If obj Is Nothing Then Exit Sub
Else
isURL = True
End If
End With
'ActiveInspectorからCurrentItem
Set AIN = ActiveInspector
Set objItem = AIN.CurrentItem
Set MyItem = objItem
If Err.Number <> 0 Then Exit Sub
str = objItem.Body
iPosition = InStrRev(str, "-From---", -1, vbTextCompare)
bu1 = Mid(str, 1, iPosition - 1)
bu2 = Mid(str, iPosition, Len(str) - iPosition)
str = ""
If isURL = False Then
str = Replace(bu1, " ", "", 1, -1, vbTextCompare) & " <File:///" & Replace(obj.Path, "\", "/", 1, -1) & "> " & vbCrLf & bu2
bu3 = "<File:///" & Replace(obj.Path, "\", "/", 1, -1) & ">" & vbCrLf
Else
str = Replace(bu1, " ", "", 1, -1, vbTextCompare) & " <" & buf & "> " & vbCrLf & bu2
bu3 = " <" & buf & "> "
End If
' objItem.Body = ""
' objItem.Body = str
'-----
'Find And Insert
Set wdDoc = AIN.WordEditor
If Not (wdDoc Is Nothing) Then
wdDoc.Activate
Set wdRange = wdDoc.Range(Start:=wdDoc.Characters(1).Start, End:=wdDoc.Characters(wdDoc.Characters.Count).End)
With wdRange.Find
.ClearFormatting
.Execute findText:="-from---", MatchCase:=True, MatchWholeWord:=True, MatchWildcards:=False, Forward:=False, Format:=False
If .Found Then Set wdFound = wdRange.Find: Set wdRng2 = wdRange: wdRng2.Move , -1
wdRng2.InsertBefore bu3 & vbCrLf
End With
End If
End Sub
pythonのmatplotlibでグラフを作成してみた

ちょいちょい見かけるmatplot。便利そうなのでいつか使ってみたいなと思いためしてみました。

# 実行環境

* macOS High Sierra Version 10.13.1
* Python 3.6.3
* matplotlib 2.1.1

# サンプルデータ

[この表](https://qiita.com/robitan/items/2cc1c4ab51e843c0c7e4#検証結果)を、グラフに起こしてみる

# コード

```python3
import math
from matplotlib import pyplot

# 元データの表をコピペしてlist形式に格納
datas = [
    [1,1.000649,1.000649,1.000649],
    [10,1.000648,1.001081,1.000648],
    [100,1.005793,1.008796,0.997640],
    [1000,1.005395,1.128072,0.961838],
    [10000,1.003097,1.763680,0.706436],
    [100000,1.000356,1.986330,0.364987],
    [1000000,1.000036,2.793968,0.356083],
    [10000000,1.000003,1.874999,0.375001],
]

# xyデータに再マッピング
x = []
y1 = []
y2 = []
y3 = []
for data in datas:
    x.append( math.log(data[0], 10) )
    y1.append(data[1])
    y2.append(data[2])
    y3.append(data[3])


# グラフ内容設定
pyplot.xlim([ x[0], x[len(x)-1] ])
pyplot.xlabel("data cnt(10**n)")
pyplot.ylabel("used memory rate")

pyplot.title('redis decrease used memory test')
pyplot.plot(x, y1, label = "hset")
pyplot.plot(x, y2, label = "json")
pyplot.plot(x, y3, label = "compressed json")
pyplot.legend()

# 表示
pyplot.show()
```

# 結果
![result.png](https://qiita-image-store.s3.amazonaws.com/0/210824/dd0cd934-372e-a967-40c1-3849cd931641.png)

# 感想

* 思っていた以上に簡単にできてものすごく嬉しい。
* x軸の値にもとは元データそのまま入れていたけど、X軸のラベルの表示の限界値を超えてしまったようなので、対数（log）に変換して表示した。
* なお対数値を出す方法を調べるにあたり「対数」という用語が思い出せずそれを調べるのに一番時間をとられた。（最終的に「10を底として」ってgoogleに入力したら出てきた）

# 参考情報

以下参考にさせていただきました。ありがとうございました。

[Qiita - 【Python入門】ライブラリmatplotlibの基本的な使い方](https://qiita.com/Morio/items/d75159bac916174e7654)
[ねこゆきのメモ - <Python, matplotlib, pyplot> 横軸、縦軸を調整する。](http://nekoyukimmm.hatenablog.com/entry/2015/10/09/094134)
[matplotlib入門 - グラフの体裁を整える](http://yubais.net/doc/matplotlib/modify.html)
BitVisor上でマイクロコードアップデート

BitVisor上でマイクロコードアップデートがどのように行われるかについて紹介します。

# AMDプロセッサの場合

AMDプロセッサではPATCH_LOADER MSR(0xC0010020)への書き込みでマイクロコードアップデートが行われます。このMSRに書き込まれる値は仮想アドレスなので、単純にVMMで同じ値を書き込んでも正しく適用されません。

BitVisorではこの書き込みをパススルーに設定しているので、マイクロコードアップデートは仮想マシン上から直接適用されます。

# Intelプロセッサの場合

IntelプロセッサではIA32_BIOS_UPDT_TRIG MSR(0x79)への書き込みでマイクロコードアップデートが行われます。このMSRに書き込まれる値は仮想アドレスなので、単純にVMMで同じ値を書き込んでも正しく適用されません。

Intelプロセッサの制約により、このMSRへの書き込みをパススルーにしても、マイクロコードアップデートは適用されず、スキップされます。そのため、以前のバージョンのBitVisorでは、パススルーにせず、代わりに以下のようなメッセージを出して、マイクロコードアップデートをスキップしていました:

```
msr_pass: microcode updates cannot be loaded.
```

しかし、最近のLinuxは、マイクロコードアップデートが適用されないと永遠に再試行するようになってしまったので、このような実装では起動しなくなりました。本当は、マイクロコードアップデートなど必要ないと、ゲストオペレーティングシステム(OS)に伝えることができれば良いのですが、CPUIDなどもほぼパススルーとしているBitVisorではそれもなかなか難しいようですので、現在は、ゲストOSが行うマイクロコードアップデートを、VMMが代わりに実行する処理が実装されています。

代わりに実行するというのは、つまり、ゲストOSの仮想アドレス空間をVMM側にマップして、そのVMM側の仮想アドレスをIA32_BIOS_UPDT_TRIG MSRに書き込んでやるということです。ここで問題なのは、マイクロコードアップデートのデータサイズがわからないことです。マニュアルを見ると、マイクロコードアップデートのヘッダーなどの説明があり、一見するとデータサイズもわかりそうに見えます。ところが、これはIntelから配布されるアップデートファイルに含まれるヘッダーの話で、OSがこのヘッダーを見て、アップデートデータのアドレスをMSRに書き込むということになっています。アップデートデータの構造はマニュアルに載っていませんので、サイズがわかりません。

そこで、どうやるかというと、ページフォールトを使います。マニュアルを見ても特に書かれていませんが、どうも試したところでは、このMSRに書き込んだ仮想アドレスがマップされていないなどの場合は、普通にWRMSR命令でページフォールトが発生するようです。よって、不在ページのアドレスをMSRに書き込み、ページフォールトが発生するたびに、そのページをマップしてやり直していけば、プロセッサが本当に必要としているページだけをマップして、マイクロコードアップデートを実行できます。

ソースコードはこのあたりにあります:
https://bitbucket.org/bitvisor/bitvisor/src/34fa14de2421cd3564323eec998f8e0c465e99a0/core/msr_pass.c?at=default&fileviewer=file-view-default#msr_pass.c-126

mm_process_alloc()関数とmm_process_switch()関数を使って、プロセス機能が用いる仮想アドレス0-0x3FFFFFFFをあけます。その上で、アドレス0を使うのはさすがにまずいかなということで、アドレス0x1000に、ゲストOSが指定するアドレスの下位12ビットを加えた値をMSRに書き込みます。この時、callfunc_and_getint()関数を用いて書き込みを行うことで、その際に例外が発生してもクラッシュせず、例外の割り込み番号を取得することができます。

例外が発生しなければ成功ですが、最初は例外が発生するはずです。一般保護例外に関してはそのままゲストOSに対して同じ例外を生成します。ページフォールトの場合はそのアドレスをCR2から取り出し、そこからゲストOS側の仮想アドレスguest_addrを計算して、cpu_mmu_get_pte()関数でゲストOSのページテーブルを読み出します。この関数は、large page/huge pageであっても、ページテーブルエントリーがあるならこうなっているだろう、という値を生成するので、特に気にせずページテーブルエントリーを読み出したものとして扱うことができます。もしページがなければゲストOSに対してページフォールトを生成します。そうして得られた物理アドレスを、念の為MMIOフックがないかチェックしたうえで、mm_process_map_shared_physpage()関数を用いてマップします。うまくいったら、MSRの書き込みをやり直します。

今のところ、ページテーブルエントリーにアクセスビットをセットする処理や、ページテーブルエントリー内のキャッシュに関わるビットの処理が欠けていますが💧、実用上は問題ないでしょう。
DynamoDBのデータからcsvを作ってS3に上げるLambda関数

#経緯
仕事でDynamoDBを使うことになり、その中で「日次でDynamoDBのデータをtxtファイルにエクスポートして所定のS3バケットに置く(日ごとにファイルを分ける)」という要件があり、やり方を調べて実装してみた。

#全体設計
CloudWatchEventを使ったよくある日次処理の構成。
Dynamoの項目が日付をもっているためその日付を条件にその日エクスポートするデータをQueryしてくる。
![構成.jpg](https://qiita-image-store.s3.amazonaws.com/0/91899/440e5133-8c1a-1e46-2b58-bab7c191b996.jpeg)

調べたところ他に[DynamoDB Stream](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.html)をトリガにする方法があるっぽいが、テーブルが更新されるたびにデータを取ってきてファイルにアペンドするより1日の終わりにバッチ一発でやったほうがコスト的にもよくね？と思ったので今回の方法をとった。
このあたり実際のところはどうなのかは分からないので、詳しい方は是非おしえてください( ^)o(^ )

#テーブル
こんな感じ。
DynamoではQueryの条件にできるのはkey項目のみらしい。
ところが条件に指定したかったdateがkey項目ではなかったためdateをキーにしたインデックス([GSI](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GSI.html))を作成した。

| id(Hash key)     | count(Range Key)  |  date              |
|:-----------------|------------------:|:------------------:|
| a1               |                 1 |        20170101    |
| a1               |                 2 |       20170101     |
| a1               |                 3 |        20170101    |
| b1               |                 1 |         20170102   |
| b1               |                 2 |       20170102     |
| c1               |                 1 |      20170102      |


#Lambda関数
こんな感じ。
IAMロールの設定とかは割愛。いい感じにやりました。

```javascript:index.js
'use strict'
const AWS = require('aws-sdk');
const moment = require('moment');
const fs = require('fs');

AWS.config.update({ region: 'ap-northeast-1' });

const docClient = new AWS.DynamoDB.DocumentClient();
const s3 = new AWS.S3();

exports.handler = function (event, context, callback) {

    let params = {
        TableName: "dynamo_toS3",
        IndexName: "date-count-index",
        KeyConditionExpression: "#date = :date",
        ExpressionAttributeNames: {
            "#date": "date"
        },
        ExpressionAttributeValues: {
            ":date": moment().format('YYYYMMDD')　//バッチ実行日に作成されたレコードのみ取得
        }
    };

    docClient.query(params).promise().then(data => {

        let logArray =[];

        data.Items.forEach(element => {

            logArray.push(JSON.stringify(element));

        });

        return new Promise(function(resolve, reject) {
　　　　　　
　　　　　　　//Lambdaでは一時的なファイルの出力先に/tmpが使える
            fs.writeFile('/tmp/tmp.txt', logArray.join('\n'), function(err) {　
                if (err) reject(err);
                else resolve(data);
            });
        });

    }).then(() => {

        let s3Params = {
            Bucket: "my-bucket",
            Key: `log_${moment().format('YYYYMMDD')}.txt`,
            Body: fs.readFileSync('/tmp/tmp.txt')
        }

        return s3.putObject(s3Params).promise();

    }).then(data => {

        console.log(data);

    })
    .catch(err => {

        console.log(err);
    })

};

```
#まとめというか所感
普段RDBに慣れ親しんでいる身からすると、Dynamoはやや癖があるように感じる。
[こちら](https://qiita.com/Yuki_BB3/items/83198b4d9daca7ccd746)の記事にもある通りSDKを使う場合はAWS.DynamoDBよりも**AWS.DynamoDB.DocumentClient**を使った方が良い。
次はDynamoDB Streamをトリガにしたものも試してみたい。
NEMLand

# NEMのアドレスから仮想空間を作る(NEMLand)

NEMLand (ネムランド)
[NEMLand](http://ec2-54-250-153-190.ap-northeast-1.compute.amazonaws.com/nem-land/)

NEMのアドレスに仮想空間の情報を記録しておき、アプリケーションから読み込むことで仮想空間を描画できるようにしました。

これを利用して作ったサービスがNEMLandです。まだ開発中です。

## NEMLandとは
NEMLandはNEMアドレスを持っていれば、誰でも簡単に仮想空間を作って遊ぶことが出来るサービスです。

アドレス内のトランザクションデータの中で、前もって決めておいたルールに則ったデータを利用することで仮想空間内にオブジェクトを作成することができます。

## 使用時の注意
  * ネムランドは開発段階で、誤作動を起こす可能性があります
  * 投稿の削除はできません
  * 暗号化メッセージには対応してません

## 主な開発ツール
  * nem-sdk
  * three.js


## 開発の流れ
  * 仮想空間を描画するためのルールを作る
  * nem-sdkのwebsocketでトランザクションデータを取得
  * three.jsで取得したデータを元に仮想空間を描画

## 仮想空間を描画するためのルールを作る（コマンド）
```ルール
nem-land:box(x,y,z)
```

上述したテキストがルールの一例です。部分ごとに説明していきます。

**nem-land:**
このトランザクションデータがNEMLandの利用を考慮していることを示す。

**box(x,y,z)**
仮想空間上に箱オブジェクトを作成させるコマンド。（x,y,z）は座標を表します。指定できる座標の値は0~9のみにしています。（それ以外の値はうけつけないはず）

このコマンドをメッセージとして送信すると、その内容が正しければ仮想空間に反映ます。

その他にもモザイクに反応するtreeコマンドがあります。

**tree(x,y,z)**
仮想空間上に木オブジェクトを作成させるコマンド。座標についてはboxと同様。また、treeコマンドに関しては、モザイクを必要とするようにしました。

どのモザイク(XEMを除く)でも適用されます。モザイクの量に応じて木のサイズを変えるようにしました。（あまり多すぎるとやばいことになりますので注意...）


本当はもっといろんなコマンドを作りたかったのですが間に合いませんでした。機会があれば増やしたいと思ってます。

## nem-sdkのwebsocketでトランザクションデータを取得
NEMLandではwebsocketを使っているので、仮想空間の描画はリアルタイムで変化します。（音出るので注意）

nem-sdkのwebsocketを使うときに参考にしたリンクをシェアします。

  * [nem-sdk example(github)](https://github.com/QuantumMechanics/NEM-sdk/tree/master/examples/browser/websockets) このソースコードをひな型として開発していきました。
  * [nemアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/nem) 日に日に新しい有益な情報が出るのでとても参考にしました。皆さんありがとうございます。

NEMLandにはバグがあり、承認済みトランザクションの同じデータを2つ受信してしまうバグがあります。なぜだかはよくわかりません。

追記)このバグは同一のアドレスから送られてきたトランザクションの場合に起こることを教えていだぎました。異なるアドレスからの場合は起こらないそうです。

## three.jsで取得したデータを元に仮想空間を描画

仮想空間を作るためにweb上で3D処理ができるjavascriptライブラリのthree.jsを使いました。

  * [Three.js入門サイト](https://ics.media/tutorial-three/index.html)



ざっくりですが、これらの記事を参考にしながら、利用できるソースコードをがちゃがちゃに組み合わせて、動けばいいや精神で作っていきました。


## 今後の課題
今回は0から学び始めることが多かったため（npmってなんやねん！ってところから始まりました）、バグもあったり、やりたいこともあまりできませんでした。NEMLandを今後改善していくときにやっていきたいことをリスト化してまとめておきます。

  * 動けばいいや精神で作ったので、ロジックを設計からちゃんと見直す。
  * コマンドを増す。（モザイク毎にオブジェクトを変更したり、アニメーションもできるようにしたり）
  * コマンドのミスを防ぐための対策を考える。
  * 複数の仮想空間を連結、共有できるようする。
  * VR、AR、MRへの対応をする。（現実の地理情報と連動できれば面白そう）
  * アドレスのQRコードをARマーカーとして利用できるようにする（やろうと思ったが方法がみつからず諦めた）
  * ハーベスト、PoI、マルチシグ等使っていないNEMツールを活用する。
  * TipNEMなど他のNEMアプリケーションと連動できるようにする
  * 仮想空間内でキャラクター操作とかできるようする（デジモン、ロックマンエクゼ的な）
 

## やってみた感想
tiwitterで「NEMapi使ってなにかしら作りたい」と軽い気持ちでつぶやいたら、思わぬ反響があり、引くに引けない状況になってしまってから2か月くらいがたち、なんとかひとつ開発できたのかなと思います。0からということもあり正直大変でしたが、やはりNEMapiの使いやすさを改めて実感しました。（データベース周りとか学ぶ必要が無かった。これもやってたらもう数か月かかるところだった）本当にjavascriptを学ぶくらいでできてしまうので、プログラミングをこれから学ぼうとしている人たちにとってもNEMをつかったサービス開発は良いのではないでしょうか。

明日は待ちに待ったnemketですね！皆さん行きましょー！！
mapshaperでトポロジーエラー検出

[Maplat](https://github.com/code4nara/Maplat/wiki)のkochizufanです。
去年まではその２もあったのに今年はその１もなかなか埋まらない感じなので、空気読まず２トピックめ書いてみます。
もし「俺が書くつもりだったのに！」な人がいたらごめんなさい。

内容的に[前回](https://qiita.com/kochizufan/items/16b0eb2f12a8cd3b49d9)の続きです。
前回の[turf.js](http://turfjs.org/)同様、Maplatで小便利に使ってるけど多分あまり知られていないプロダクトを紹介します。

turf.jsのおかげで古地図/正確地図対応点群の三角形分割が実現でき、古地図/正確地図間の座標変換ができるようになったMaplatですが、もし三角形分割のポリゴンにトポロジーエラーが存在すると、せっかくの売りである座標系全体の１対１変換が実現できません。
トポロジーエラーというとわからない人もいるかもしれませんが、こういう感じのものです。
![トポロジーエラー](https://qiita-image-store.s3.amazonaws.com/0/10108/ac43bc32-3848-6563-0b95-f409c332be19.png)
本来三角網は重なりなく隙間なく領域を満たさないといけないのですが、上の画像だと三角形の辺が重なってしまっているのが見て取れます。
こういうエラーがあるとうまく座標変換できないので、検知して修正を促してやらないといけないのですが、これがturf.jsだけだとうまくできない。

turf.jsにも重なりを検知する[turf.kinks](http://turfjs.org/Docs#kinks)という関数はあるのですが、残念ながらこいつは単独のポリゴンの中での捻れしか検知できません。
マルチポリゴンの中で複数ポリゴン間の辺の重なり合いを検知することはしてくれないのです。

で、それをやってくれるライブラリを探していて見つけたのが、[mapshaper](http://mapshaper.org/)というライブラリでした。
このライブラリ、メインの機能はShapefile、GeoJson、TopoJson等のGISデータフォーマットを相互変換してくれるライブラリです。
が、なんでかよくわかりませんが、その変換ライブラリにおまけ？としてジオメトリ内の辺の交わりを検出してくれるサブ機能がついてくるのです。
![mapshaper Web GUI](https://qiita-image-store.s3.amazonaws.com/0/10108/387e67f8-5155-7dfa-d726-0aefe12ab6cc.png)
上の画像はmapshaperのWeb GUIでのデータ読み込みダイアログですが、オプションに「detect line intersections」というのが見えます。
これをオンにしてデータを読み込ませると、辺の交わりを検出して画面上にエラーとして出力してくれます。

が、おまけ機能だけあって？なかなか十分な情報がない。
Web GUIに機能があるということは、ライブラリにも機能が実装されているはずですが、どう関数を呼べばいいのかよくわからない。
Web GUIのソースコードとにらめっこしたり、どうしてもわからなくて作者にGithubのissueで質問したりしてようやく、ライブラリからの呼び出し方がわかりました。

```js:トポロジーエラー検出手順
// 辺の交わり検出関数はmapshaper.internalという属性の下にあります
var internal = mapshaper.internal; 
// 点群から三角網マルチポリゴンのGeoJsonを生成したとします。
var tins = turf.tin(points); 

// mapshaperは直接GeoJsonを扱えないので、マルチポリゴンの頂点だけを配列にします。
var coords = tins.features.map(function(poly) { return poly.geometry.coordinates[0]; });

// 全然意味はわからないんですが、下記の順番で呼ぶと交点の配列が生成されます。
// ただし、個々の辺からみた交点の一覧なので、同じ点が重複して何度か含まれます。
var arcs = new internal.ArcCollection(coords);
var xy = internal.findSegmentIntersections(arcs);
var retXy = internal.dedupIntersections(xy);

// 重複の解消と、ついでにマルチポイントのGeoJsonに変換して結果を得ます。
var retGeoJson = retXy.reduce(function(prev, point, index, array) {
    if (!prev) prev = {};
    prev[point.x + ':' + point.y] = point;
    if (index != array.length - 1) return prev;
    return Object.keys(prev).map(function(key) {
        return turf.point([prev[key].x, prev[key].y]);
    });
}, []);
```

この手順で呼び出すと、mapshaperを使ってトポロジーエラーの検出と、存在する場合その辺の交点座標を得ることができます。
トポロジーエラーを検出しないといけないユースケースをお持ちの方がどれほどおられるかわかりませんが、もし機会があれば使ってみてください。

あと最後のおまけとして...
mapshaperはメイン機能がGISデータ形式変換なので、それなりにライブラリサイズが大きくトポロジーエラー検出のためだけに使うにはちょっとライブラリサイズがヘビーなのですが、私の方でライブラリサイズを削減するために、[トポロジーエラー検出に必要なコードだけをピックアップした縮小版](https://github.com/code4nara/Maplat/blob/master/js/mapshaper_maplat.js)を作っています。
あらゆる例外を網羅できてるかはなはだ怪しいところがある代物ですが、自己責任で使いたい人がおられたら使ってみてください。
バーチャルでもクラッピー

この記事は[#クラッピーチャレンジ Advent Calendar 2017](https://adventar.org/calendars/2073) 15日目の記事です。

![clappygif_s.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/bda18e9c-1316-4e1b-1cfb-f8dfa1f1a964.gif)![clappygif_s.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/bda18e9c-1316-4e1b-1cfb-f8dfa1f1a964.gif)![clappygif_s.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/bda18e9c-1316-4e1b-1cfb-f8dfa1f1a964.gif)![clappygif_s.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/bda18e9c-1316-4e1b-1cfb-f8dfa1f1a964.gif)![clappygif_s.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/bda18e9c-1316-4e1b-1cfb-f8dfa1f1a964.gif)![clappygif_s.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/bda18e9c-1316-4e1b-1cfb-f8dfa1f1a964.gif)

[クラッピーチャレンジ](https://www.facebook.com/clappychal/)にはロマンがあります。
クラッピーチャレンジの元となった[パチパチクラッピー](http://www.byebyeworld.co.jp/clappy/)の存在、
それがパチパチトール君として100円でダイソーで販売されることになった[経緯](http://blog.byebyeworld.co.jp/?p=138)、
安価でハックしがいのある筐体から生まれた[クラッピーチャレンジ](https://www.facebook.com/clappychal/)という潮流。
[中の人も一緒になって盛り上がる](http://vol4.tsukuruto.net/session/archives/6)という懐の深さ。

クラッピーチャレンジの素晴らしさはその懐の深さにあります。
ガチハックはもちろん、オシャレにデコったり、手だけで遊んだり、コスプレしたり。

もちろんバーチャルでもOKです。
[ARで巨大クラッピー](https://www.youtube.com/watch?v=8kxc0c89emo)
![17629664_10155107970536585_6926299925576432801_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/88f44b8e-7cd4-c6a6-0e41-ab6531febd9b.jpeg)

[プラネタリウムに進出！](https://www.youtube.com/watch?v=Zp9LrXh9SjU)
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/5e669559-8889-a8ce-fa2e-f4307373abe1.jpeg)


都内では品薄で手に入りにくい！
今日はうっかりクラッピー持ってくるの忘れたけどパチパチしたい！
という人のために、スマホブラウザでも動く[クラッピーエミュレータ](http://elix.jp/app/clappy/)
![クラッピーエミュレータ](https://qiita-image-store.s3.amazonaws.com/0/59911/341772f6-c3e8-93ca-f58c-a91b81824098.png)

ただ眺めていたい！
[WEB VRクラッピー](http://elix.jp/test/clappyvr/sample/)
![スクリーンショット 2017-12-15 0.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/59911/82191274-57ff-5a3e-aaea-3469be5fa251.png)


[音に反応するクラッピー](https://youtu.be/s5zI-5qW8pM)
![スクリーンショット 2017-12-11 23.23.41.png](https://qiita-image-store.s3.amazonaws.com/0/59911/cd6db866-bec3-2504-2bda-df9141f19d5d.png)

[人文字](http://elix.jp/app/hitomoji/?nQuery=%E3%82%AF%E3%83%A9%E3%83%83%E3%83%94%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%EF%BC%81)でもクラッピーチャレンジ！
![スクリーンショット 2017-12-11 23.24.40.png](https://qiita-image-store.s3.amazonaws.com/0/59911/23d79755-0a59-a4ac-0283-a60dc71ffbc9.png)

本家バイバイワールドさんからも公式アプリ[ブンブンクラッピー](https://itunes.apple.com/jp/app/bunbunkurappi/id801333884?mt=8)が出ています。
ダイソーのパチパチトール君にも対応！
![ブンブンクラッピー](https://s.eximg.jp/exnews/feed/Yoshimoto/Yoshimoto_201403_post-fc19_1.png)

どうです？
[クラッピーチャレンジ](https://www.facebook.com/clappychal/)、気になってきましたか？

![clappygif.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/ba40de23-aac5-cd08-2c8d-2837bc20d82f.gif)![clappygif.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/ba40de23-aac5-cd08-2c8d-2837bc20d82f.gif)![clappygif.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/ba40de23-aac5-cd08-2c8d-2837bc20d82f.gif)
正規表現が苦手な人に送る自作ツール「JPNStoRegex」

# はじめに
　このページをご覧の皆様は普段正規表現は書きますでしょうか？私は最近、文字列で構成された、構造化されていない大量のデータを扱いやすいように加工する際にその威力を痛感し、学んでてよかったなぁと感じました。しかし、実際のところ、きちんとスムーズに正規表現が扱えたとはいい難く、あんな機能があったはずだけど演算子はなんだっけ…とググりながらの作業となってしまいました。そのような経験から、もっと素早く正規表現を使いこなしたいと願い、また、きっと同じように正規表現の凄さはわかってるけども、うまく使えなくて苦手だと、もどかしい思いをしている人が居るに違いないと考えこのツールを作りました。
# 「JPNStoRegex」とは
ソース等はこちら
https://github.com/5hyn3/JPNStoRegex
名前の通り、日本語を正規表現に変換するツールです。変換と言っても、高度な自然言語処理などをして意味を汲み取って正規表現を自動生成するような高尚なものではなく、予め決められたルールに従って、半角スペースでわかち書きされた日本語をそのまま正規表現に置換するという単純なものとなっています。単純ですが、正規表現でどんなことが出来るかわかっている人や、正規表現のあまりの抽象さで大変な思いをしている人には業務効率改善の助けになるとともに、正規表現に対する理解を深めることが出来るのではないかと思います。

# 使い方
 詳細はgithubを御覧ください。ここでは軽く説明します。ここで扱う日本語は、半角スペースで区切られた日本語で、プログラム上ではこの一区切りを一つの単位として扱い以下のルールに従って単純な置換処理を行っています。

|日本語|正規表現|
|------|-------|
|タブ|\t|
|任意の文字|.|
|英数字|\w|
|英数字以外|\W|
|空白文字|\s|
|空白文字以外|\S|
|半角数字|\d|
|半角数字以外|\D|
|単語境界|\b|
|か|&#124;|
|全角数字|[０-９]|
|ひらがな|[ぁ - ん]|
|カタカナ|[ァ - ヴ]|
|半角カタカナ|[ｦ - ﾟ]|
|(|(|
|)|)|
|が0回以上|*|
|が1回以上|+|
|が0回または1回|?|
|行頭|^|
|行末|$|
|がn回|{n}|
|がn回以上|{n,}|
|がn回以上m回以下|{n,m}|

また、以上のルールに無いもの、文頭に$が存在するものは通常の文字列として特に置換などはされずにそのまま出力されます。

- 入出力の例

|入力|出力|
|------|-------|
|( a か b か c ) が3回以上|(a&#124;b&#124;c){3,}|
|行頭 任意の文字 が1回以上 空白文字|^.+/s|
|class 任意の文字 が1回以上 行末|class.+$|

JPNStoRegexに同梱されているconverter.pyは以下のようにターミナルからコマンドライン引数を与えて出力を得ることが出来ます。

```
python converter.py <入力文字列>
```
レスポンシブ対応サクッとまとめ

<br>
最近フロント寄りのプロジェクトを行うことが多くなり画面サイズ最適化、
いわゆるレスポンジブデザインについて調べることが多くなり、どんな方法があってどう使えば良いのか整理したくなったので、まとめたいと思います。


レスポンシブデザインに対応するには主に
**・HTMLのviewport**
**・CSSのmedia query**
**・Bootstrap**
**・JavaScript ほぼjQuery**

その他にも色んな方法があるかと思うのですが、代表的なものはこんな感じだと思います。
上から簡単な例とともに見ていきたいと思います。


###・HTMLのviewport
viewportというhtmlの機能を使ってスマホに対応させる方法。

```html:hoge.css
<html>
<head>
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
</head>
<body>
  <div>
    コンテンツ
  </div>
</body>
</html>
```
こんな感じでmetaタグに記述させるだけで、簡単に導入することができます。
`width=device-width`この記述でスクリーンサイズに合わせてねってことになり、
例えば、`width=width=500`とすると画面幅500px用の表示になります。

`initial-scale=1.0`は初期表示する際の拡大率。

他にもオプションがあり、
`user-scalable=no`　でピンチ操作を不可能にするオプションがあります。

<br>
###・CSSのmedia query
cssで対応する方法。お手軽に使えて結構使う機会が多い。

```html:hoge.html
  <link rel="stylesheet" href="sp.css" media="screen and (max-width: 500px)">
  <link rel="stylesheet" href="pc.css" media="screen and (min-width: 1000px)">
```
少し紛らわしいところですが、
max-width 画面幅が500px以下はsp.cssを読み込み、
min-width 画面幅が1000px以上はpc.cssが読み込まれるという感じ。
これは余り使ったことがなくて、よく使うのは下記ような方法


```css:hoge.css
  @media screen and (max-width: 499px) { 
    /*　画面サイズ 499pxまで適用　*/
    .content {color: #red;}
  }
  @media screen and (min-width: 500px) and (max-width: 999px) {
    /*　画面サイズ 500pxから999pxまで適用　*/
    .content {color: #green;}
  }
  @media screen and (min-width:1000px) {
    /*　画面サイズ 1000px以上から適用　*/
    .content {color: #blue;}
  }
```
こんな感じで切り替えたい画面幅で、好きなようにスタイルを適応させれるのが便利ですね。

<br>
###・Bootstrap
おなじみの便利フレームワーク。twitter社が生みの親のフレームワークでHTMLのclassに指定の記述をするだけで、レスポンシブ出来てしまう優れもの。

できることが結構あるのですが、代表的な機能はグリッドシステムで、

|        指定方法    |    適用画面サイズ    |
|:------------------:|:------------------:|
|          col-lg-num |        1024以上        |
|          col-md-num |       992px以上、1200px未満      |
|          col-sm-num |        768px以上、992px未満        |
|          col-xs-num |         768px以下        |

表のサイズ定義で横幅を12分割し、コンテンツ幅をコントロールできる。

```html:hoge.html
  <div class="container">
    <div class="row">
      <div class="col-xs-4 col-md-5"></div>
      <div class="col-xs-8 col-md-5"></div>
      <div class="hidden-xs col-md-2"></div>
    </div>
  </div>
```

分割のみならず、`class='hidden-xs'`でスマホサイズで非表示に、
逆に`class='visible-xs'`で隠していたのを表示することができる。

これがなかなか便利でpcだと長い文言を表示できるけど、スマホだと見づらいなんてときに切り替えができる。
<br>

```html
<div id="tabbody">
   <div id="tab1"><span class='hidden-xs'>お客様の</span>基本情報</div>
   <div id="tab2">観覧履歴</div>
</div>
```
例えば、タブのテキストが長くスマホだと２行になって見栄えが悪くなるときも、
そこを`hidden-xs`で消してしまえる。

<br>
### まとめ
上記以外の方法では、jsで動的にサイズを変更するなどですかね。
モーダルの表示位置を中央にしたいときとかに使えますね。

あとは、そもそもそのデバイス専用サイト作って振り分けるなどの方法があるのですが、
あまり今後も使う機会がなさそうなので、省きます。

<br>
またフレッシュな方法があれば、追記していきたいと思いまっす！
<br>
<br>
Unityでレンダリングテクスチャを作る

開発でカメラから写している光景をテクスチャにしたいと思うことがあったのでレンダリングテクスチャを作ってみました。その備忘録です（カレンダーのネタ切れ感）

まずCreate=>RenderTextureからレンダーテクスチャを作成。
<img width="191" alt="スクリーンショット 2017-12-15 0.15.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/159111/6228b376-bb52-702e-1c9e-e3194c15697b.png">
inspectorから画像サイズなど設定できます。

<img width="195" alt="スクリーンショット 2017-12-15 0.17.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/159111/e1129f98-7b8d-3614-a5f6-aa46e7ccdf35.png">

続いてどこか適当にカメラを作成します。このカメラはテクスチャに流し込む光景を写すカメラです。

<img width="578" alt="スクリーンショット 2017-12-15 0.17.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/159111/fd06e22c-ca2e-4c4e-eb64-5b97afd95523.png">

カメラのinspectorの中になるTarget Textureに先ほど作ったRenderTextureを突っ込みます。
そうすることでカメラの映像がテクスチャに書き込まれるようになるみたいです。
<img width="192" alt="スクリーンショット 2017-12-15 0.18.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/159111/8fcf0120-6f91-4d93-8def-7f0b441401a9.png">

テクスチャを確認するとカメラの光景が映ってるはずです。
<img width="353" alt="スクリーンショット 2017-12-15 0.20.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/159111/455ab6b5-5853-aa3a-7c46-a63e33651408.png">


あとはこれを必要なものに貼ったりすればゲームのいろんな表現に使えます。
反射の表現とか空中に浮いてるモニタみたいな表現もできますね。


<img width="528" alt="スクリーンショット 2017-12-15 0.24.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/159111/5f297b2a-9e64-6973-15da-ee9e1c836602.png">
マテリアルに入れてしまえばキューブなどにも当然貼れちゃいます。便利。



たまに使うことがあるので備忘録的に書きましたが結構簡単に作れるのはやっぱUnityすげーって思いますね。
VSCodeで、表示ソースを切り替える度に、左エクスプローラーが移動してしまうのを止めたい

この記事は [BRIGHT VIE Advent Calendar 2017](https://qiita.com/advent-calendar/2017/brightvie) 14日目の記事になります。

タイトルで全部言い切ってしまってるパターンです！

#VSCodeでのエクスプローラとエディタの同期的選択の解除

```
"explorer.autoReveal": false
```
（デフォルト：true）

の設定をいれることで、エディター切り替えと、エクスプローラのファイル選択が同期されなくなります。

ソースを切り替える度に、左のエクスプローラーがかちゃかちゃ動くのは結構ストレス！
エクスプローラでファイル名を見ながらコード打ちたい時もありますよね！

#余談：Sublime Textではプラグインで対応

Sublime Textではプラグインで対応可能です。

[Sublime Text Synced​Side​Bar](https://sublime.wbond.net/packages/SyncedSideBar)
Advent of Code day7をPerl 6で

こんにちは、12日目は投稿がなかったので
私の[Advent of Code day7](https://adventofcode.com/2017/day/7)の回答を貼っておきます。

```
use v6;                                                                       
                                                                              
grammar Grammar {                                                             
    token TOP {                                                               
        [                                                                     
            <name> <.ws> '('<weight>')' [ <.ws> '->' <.ws> <namelist> ]?      
        ]                                                                     
    }                                                                         
    token namelist {                                                          
        <name>+ % ', '                                                        
    }                                                                         
    token name {                                                              
        \w+                                                                   
    }                                                                         
    token weight {                                                            
        \d+                                                                   
    }                                                                         
}                                                                             
                                                                              
                                                                              
my %is-root;                                                                  
for $*IN.lines -> $line {                                                     
    my $m = Grammar.parse($line);                                             
    %is-root{~$m<name>} = True unless %is-root{~$m<name>}:exists;             
                                                                              
    if $m<namelist>:exists {                                                  
        for $m<namelist><name> {                                              
            %is-root{~$_} = False;                                            
        }                                                                     
    }                                                                         
}                                                                             
                                                                              
do for %is-root -> (:key($name), :value($)) {                                 
    $name if %is-root{$name};                                                 
}.head.say;                                                                   
  
``` 

+ ポイント
  + Grammar使うときれいにかけます。
  + .oO( weightとは何だったんでしょうか？？？ )

以上12日目の投稿でした。
PostgreSQL ＋ Hololens

[PostgreSQL Advent Calendar 2017](https://qiita.com/advent-calendar/2017/postgresql)の15日目の記事です。
今年のはじめに購入したHololens(ホロレンズ)からPostgreSQLを操作した話をまとめます。

# 背景
ちょうど一年前に酔っ払った勢いでHololensを購入しました。$3,000(約33万円)しましたが、なんか未来感がハンパナイのでお気に入りです！！
家で焚火も楽しめます。
![図1](http://www8.plala.or.jp/kingtomo/qiitaimg/20171215/fire.png)

## Hololens
マイクロソフトのMRデバイス。
https://www.microsoft.com/ja-jp/hololens

以下の流れでHologramを利用した開発ができます。
Unity(C# script)⇒Visual Studio(C# source)⇒Hololens

さっそく[チュートリアル](https://developer.microsoft.com/en-us/windows/mixed-reality/holograms_101)をやったりしてました。
チュートリアルを実装するだけでも、ジェスチャーによる操作や、音声による操作ができます。

![図2](http://www8.plala.or.jp/kingtomo/qiitaimg/20171215/tutorial101_01.png)


チュートリアルを実装すると「Drop sphere」と発音することで球体を落下させ、「Reset world」と発音することで初期状態に戻すことができます。

![図3](http://www8.plala.or.jp/kingtomo/qiitaimg/20171215/tutorial101_02.png)
しかし、ひとつ問題が。。。音声認識が英語オンリーだYO！orz

---
わたし「ドロップ　スフィア！」
HOLOLENS(球体落下)
わたし「リセット　ワールド！」
HOLOLENS(......)反応なし
わたし「リセット　ワーウドゥ！」
HOLOLENS(......)反応なし
わたし「リィセトゥ　ワァウド！」
HOLOLENS(......)反応なし
わたし「ムキーーーーーーーーー！！！」
よめ「うるさい！」

---

と、このようにかなりネイティブな発音をしないと認識してくれない問題がわたしを苦しめました。
リセットだけとか、ワールドだけとか単語のみにすると認識するので、フレーズの発音がダメなんだと思う。が、単語で登録するのは負けた気がするのでちょっと悪あがきを試みました。

【悪あがき】
「ヘルプ！」って発音すると、PostgreSQLに接続してテーブルの情報(TEXT列に"Drop sphere"もしくは"Reset world"をあらかじめ登録しておく)を引っ張ってくる。その内容に応じて、上記「Drop sphere」or「Reset world」と同じ挙動を取らせよう、と。

C#なんだし、Npgsql使えば楽勝だろ。かつる！！と。

## Npgsql
ということで、久しぶりに[Npgsql](http://www.npgsql.org/)を使ってみることに。

昔はdll持ってきて使うってイメージだったけど、最近はNuGetで管理されてるんですね。より楽勝じゃねーか！かつる！！と。

想定した構成は「Hololens⇒Npgsql⇒PostgreSQL」。

# 挫折
## 挫折１
さっそくNuGetでNpgsqlをインストール！

```
> Install-Package Npgsql -Version 3.2.6
```

おや？エラーが。。。
![図3（エラー）](http://www8.plala.or.jp/kingtomo/qiitaimg/20171215/error.PNG)

どうやら、VisualStudioとNpgsqlで利用しているRunTimeライブラリ(?)が異なるためインストールできないみたい。オワタ（；＿；）

と泣いてたら、[こんな情報](https://github.com/npgsql/npgsql/issues/820)が。VisualStudio2017にしてnetstandard20使えば動くらしい！かつる！！

## 挫折2
ということで、もろもろ最新化（VisualStudioも2015から2017に)して、リトライ！
無事にNpgsqlはインストールされました！！が、今度はHololensへのデプロイで似たようなエラーが。。。今度はHololensのOSバージョンが古いって(16299 vs 14393)。
やっぱりオワタ（；＿；）

ここで心は折れたYO！orz

# 結局
「Hololensから直接クエリ投げなくてよくね？」って考えて、いったんHTTPリクエストをnode.jsで受けてPostgreSQLに問合せする形に変更しました。。。

結局の構成は、「Hololens⇒HTTP⇒node.js⇒PostgreSQL」に。

こうすることで無事に「ヘルプ！」ということで初期状態に戻すことができるようになったとさ。めでたし、めでたし。

# まとめ
いまだに結局、直クエリでの実行はできませんでした。
まぁ、そのうちHololensのほうもバージョンアップしていってなんとかなるのかな。

ということで15日目でした。明日16日目は[fujii_masao](https://qiita.com/fujii_masao)さんの登場です！
行クリックでチェックボックスをON/OFFしたい

表の中にあるチェックボックスの場合、行クリックでチェックON/OFFさせたいなんてことあると思います。

```html:HTML
<table>
    <tr>
        <td><input type="checkbox" name="hoge" value="1"></td>
        <td>1行目</td>
    </tr>
    <tr>
        <td><input type="checkbox" name="hoge" value="2"></td>
        <td>2行目</td>
    </tr>
    <tr>
        <td><input type="checkbox" name="hoge" value="3"></td>
        <td>3行目</td>
    </tr>
</table>
```

行クリックでチェックボックスをトグルさせたいのでこんな処理を書いたところ、チェックボックス自体のクリックが効かなくなりました。両方のイベントでON/OFFしているので結局元に戻っているかんじ。

```javascript:JavaScript
$('[name=hoge]').parents('tr').click(function(){
    $(this).find('[name=hoge]').prop('checked', !$(this).find('[name=hoge]').prop('checked'));
});
```

以下のように`stopPropagation()`でバブリングを止めてあげたらうまくいきました。

```javascript:JavaScript
$('[name=hoge]').click(function(e){
    e.stopPropagation();
}).parents('tr').click(function(){
    $(this).find('[name=hoge]').prop('checked', !$(this).find('[name=hoge]').prop('checked'));
});
```
dockerの利点

dockerの機能、利点についてまとめます。

# __dockerが使用している技術__
dockerはコンテナによる仮想化方式を提供しているが、それらはdockerがフルスクラッチで作ったものではない。（つまり、Linuxの機能をdockerが使っている。)

## __代表的な機能__
- LXC (Linux Container)
- namespaces (プロセスの分離)
- cgroups (コンテナのリソース制御)
- AUFS (コンテナイメージの差分管理)

__これらの機能はLinuxで提供されるものを使用するため、それを提供するKernelのバージョンに依存する。__

# __dockerのメリット__
- ゲストOSはホストのKernelを直接使用するためオーバヘッドが小さく高速
- ゲストOSがそれぞれにKernelを持たないため、メモリやディスクの消費量を節約できる。
- 必要とするリソースが少ないため、多くのゲストOSを起動できる。
- Kernelを新たに起動する必要がないため、ゲストOSの起動が早い。

また、dockerはコンテナを起動する際に、各コンテナごとのディスク上にデータを持つのではなく、*__「１つのイメージから複数のコンテナを作る」__*という方式でゲストを起動する。
これはイメージから起動するコンテナはいつも同じことが保証されている。
そのため、以下の利点もある。

- コンテナのイメージ（雛形）からコンテナ（実態）を作るため、同一構成のOSを簡単に複数作成できる。
- テストをパスしたイメージは本番環境でもすぐに使用できる。（開発とデプロイのサイクルが早い）

## ここまでのまとめ
- 基本的な機能はLinuxにもともと搭載されているものを使うから早い
- 環境そのものを簡単に複製、配布できるので環境構築の手間が省ける（たくさんの人たちが環境構築に苦しめられているはずです。）
- イメージとしてたくさんのOS（Linuxディストリビューション）が簡単に使えるので、色々試せる

[__次回は実際にdockerをインストールして動かしてみます。__](https://qiita.com/kkkkkkkkkk1005/items/7a85c1a054f02c5c949d)
VS2017 で .editorconfig が標準対応に

[いつの間にか Visual Studio で editorconfig が対応になっていました。](https://www.infoq.com/jp/news/2017/02/editorconfig-visualstudio)

VS2017にして、プラグイン入れてないのに勝手に文字コードが変わるから変だと思った……
これまでは普段の環境以外でコードを書く場合は手作業で改行コードの変換を行っていましたが、VS2017では手作業での文字コードの変更が[ちょっと面倒になったので](http://nekko1119.hatenablog.com/entry/2017/03/28/003348)、どうしたものかと思っていました。しかし editorconfig に対応してくれたのであれば、何も気にすることはありません。うれしい限りです。

せっかくなので設定できる項目についておさらいします。

**indent_style**
tab / space
**indent_size**
インデントを半角スペース何個分にするか。
**tab_width**
tab の幅。default は indent_size で、通常は指定不要。
**end_of_line**
lf / cr / lfcr
**charset**
latin1, utf-8, utf-8-bom, utf-16be or utf-16le
utf-8-bom は非推奨らしいが、VSでは今のところ問題なさそうな感じ。
**trim_trailing_whitespace**
文末の空白を削除するか否か。true / false
**insert_final_newline**
ファイルを改行で終わるかどうか。true / false
**root**
true にしておけば問題ないやつ。

### 注意
.gitconfig で `autocrlf = true` とかになっていると、checkout 時に強制的に改行コードがCRLFになるため、end_of_lineをLFにしてたりすると改行コードがひっちゃかめっちゃかになります。
autocrlf は input か false にしておきましょう。
というか .gitattributes で `* text=auto`をしっかり設定しておきましょう。
定期経路文字列を使用して経路探索結果の運賃から定期券区間分を控除してみる

[ヴァル研究所 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/val) 14日目の記事です。

今日は[駅すぱあとWebサービス](http://docs.ekispert.com/v1/)の定期控除機能について紹介しようと思います。
[WebサービスDocuments](http://docs.ekispert.com/v1/)のTipsにある、[定期券利用時の運賃計算](http://docs.ekispert.com/v1/tips/fare-calculate-at-using-teiki/)の例を踏まえつつ、定期券控除した状態での運賃取得方法を解説します。

### 定期券を利用した運賃計算の準備

まずは運賃計算を行う際に、定期券を利用するための準備を行います。[駅すぱあとWebサービス](http://docs.ekispert.com/v1/)では、予め定期券の区間を「定期経路文字列」という形で用意しておことで、[経路探索]([駅すぱあとWebサービス](http://docs.ekispert.com/v1/))時に該当区間の運賃を控除した状態で運賃を取得できます。

実際の例を見てもらうとイメージがつきやすいかと思います。以下の例は、「高円寺駅-東京駅」を定期券の利用区間とした状態で「高円寺駅-舞浜駅」の経路探索を行なった場合の結果です。

![img001.png](https://qiita-image-store.s3.amazonaws.com/0/152217/d154cd4c-f342-a739-3135-0aac144ed5d9.png)

定期控除なしの場合は 470円 なのに対し、定期控除ありの場合は高円寺駅-東京駅間の金額が差し引かれた運賃になっていることが分かります。

#### 定期経路文字列の作成

定期経路文字列は、[経路探索]([駅すぱあとWebサービス](http://docs.ekispert.com/v1/))APIのリクエストに含まれている、 `駅の名称` `平均路線名` `平均路線の方向` を組み合わせた文字列になります。

具体的には以下のような文字列になります。

```
高円寺:JR中央線快速:Up:東京
```

### 定期経路文字列を指定した経路探索

定期経路を指定した経路探索は以下のように行います。

```
http://api.ekispert.jp/v1/json/search/course/extreme?key=アクセスキーを指定してください&searchType=plain&viaList=東京:舞浜&assignDetailRoute=高円寺:ＪＲ中央線快速:Up:東京&bringAssignmentError=true
```

定期経路文字列を使用して経路探索結果の運賃から定期券の区間分の運賃を控除する方法を紹介しました。指定できる定期券は鉄道のみに限定されますが、運賃計算の例としてAPIを触ってみてはいかがでしょうか。
Changelogの更新で消耗しないための自動化

この記事は [SmartDrive Advent Calendar 2017](https://qiita.com/advent-calendar/2017/smartdrive)の14日目の記事です。
こんにちは、SmartDriveでフロントエンドエンジニアをしている@kefi3104です。

Changelogの更新、めんどくさいですよね？
今日はGitHub Changelog Generatorを使ったChangelogの自動化をやってみたので、その簡単な手順をご紹介します。

# GitHub Changelog Generatorとは
GitHub上のタグやマージ済みのプルリク、Issue、ラベルを利用してChangelogを自動で生成してくれるgemです。
つまり、GitHubにコミットしている内容からChangelogを勝手に作ってくれるので、Changelogの更新で消耗しなくて済むというわけです！

# 準備
**[GitHub Changelog Generator](https://github.com/skywinder/github-changelog-generator)**をgemでインストールします。

```
$ sudo gem install github-changelog-generator
```

**[GitHub token](https://github.com/settings/tokens/new?description=GitHub%20Changelog%20Generator%20token)**を取得します。
scopeはrepoのみ選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/14415/efe3603c-1043-d9d2-d7d0-c05f4c613583.png)

取得したtokenを環境変数に設定します。

```bash:~/.bash_profile
export CHANGELOG_GITHUB_TOKEN="取得したGitHub token"
```

作業ディレクトリでのsourceも忘れずに

```
$ source ~/.bash_profile
```

ここまでで準備完了です。


# Changelog更新
準備ができたら、以下のコマンドで生成開始です！

```
github_changelog_generator -u <ユーザー名> -p <プロジェクト名>
```

以上で、しばらく待てばChangelogが自動で生成されます！すごく簡単ですね！


# 出力内容のカスタマイズ
デフォルトでは**[サンプル](https://github.com/skywinder/github-changelog-generator#output-example)**のようなChangelogが吐き出されます。
変更内容がいくつかの区分に分けられていますが、これらはプルリクに設定したラベルに基づいています。

デフォルトでは、

- **Implemented enhancements:**は「enhancements」ラベル
- **Fixed bugs:**は「bug」ラベル
- **Merged pull requests:**は上記ラベル以外(除外設定されているものを除く)

が割り当てられています。

これらは、`.github_changelog_generator`をプロジェクトのルートディレクトリに作成し、オプションを記述することで変更が可能です。

例えば、私は以下のようなオプション設定を行っています。

```　.github_changelog_generator
pr-label=### Added
enhancement-label=### Changed
bugs-label=### Fixed
enhancement-labels=enhancement,change
bug_labels=bug,hotfix
exclude-labels=release
unreleased-label=Unreleased
```

　オプション設定によって以下のように変更しました、

- ```pr-label```によって**Merged pull requests:**を**Added**に
- ```enhancement-label```によって**Implemented enhancements:**を**Changed**に
- ```bugs-label```によって**Fixed bugs:**を**Fixed**に

他にも、```enhancement-labels```や```bug_labels```で該当するラベルを設定することで、変更内容を好きな区分に振り分けることができます。
また、私は```master```へのプルリクを***Added***に入れたくなかったので、リリース系のプルリクには「release」ラベルを割り振って```exclude-labels=release```としました。

# GitHub Changelog Generatorを導入してみて
今日のリリースで早速使用してみました！すごく便利！
が、ラベルを設定していなかったプルリクが多かったので、改めてラベルを振る作業が必要に :innocent: 
とはいえ、リリース内容の管理の一環として、プルリクにきちんとラベル振るようになったのは良かったと思っています。

これでChangelogの生成が自動化されたので、今度は**[gh-release](https://github.com/hypermodules/gh-release)**辺りとうまく組み合わせて、リリース作業を自動化してみたいと思います。
Vue.js いろいろまとめ

# はじめに
Vue.jsも流行ってきて色々ライブラリなども充実してきたと思うので色々まとめようと思います（適当）

# UI Framework

| 名称 | 解説 |
|:--:|:--|
|[element-ui](https://github.com/ElemeFE/element)|かなり有名。日本語化もされてる。レスポンシブではない|
|[vuetify](https://github.com/vuetifyjs/vuetify)|　ElementUIと並んで結構有名,マテリアルデザイン|
|[iView](https://www.iviewui.com/)|管理画面のサンプルとかあって使い勝手は良さそう|
|[Bootstrap Vue](https://bootstrap-vue.js.org/)|BootstrapをVueで使いやすくしてくれたやつ。|
|[Muse UI](https://github.com/museui/muse-ui)|マテリアルデザインのやつ|
|[AT UI](https://at-ui.github.io/at-ui/#/en)|最近風の色使いをしていて、かっこいい感じのやつ。最近出てきた気がする|

# コンポーネント

| 名称 | 解説 |
|:--:|:--|
|[vue-cookie-law](https://github.com/apertureless/vue-cookie-law)|たまによくみる画面下部にでるCookieの同意が出せます。|
|[vue-timeago](https://github.com/egoist/vue-timeago)|○秒前みたいなテキストが出せます|
|[vue-event-calendar](https://github.com/GeoffZhu/vue-event-calendar)|カレンダーにイベントを設定して表示できます。|
|[vue-datepicker](https://github.com/hilongjw/vue-datepicker)|日付選択です|
|[vue-google-maps](https://github.com/xkjyeah/vue-google-maps)|GoogleMapの機能を結構使えるみたいです！|
|[vue-baidu-map ](https://github.com/Dafrok/vue-baidu-map)|BaiduMapです
|[vue-markdown](https://github.com/miaolz123/vue-markdown)|markdown-itやhilight.jsをいい感じにラップしたコンポーネントです|
|[mavonEditor](https://github.com/hinesboy/mavonEditor/blob/master/README-EN.md)|Markdownエディタです。UIイケてると思う。|
|[vue-social-sharing](https://github.com/nicolasbeauvais/vue-social-sharing)|ソーシャルボタンを簡単に設置できます。|
|[vue-qriously](https://github.com/theomessin/vue-qriously)|QRコードを生成できます|
|[vue-qart](https://github.com/superman66/vue-qart)|画像とあわせたQRコード生成できます|
|[vue-typer](https://github.com/cngu/vue-typer)|よくあるタイピングっぽいアニメーションを作れます|
|[vue-sticker](https://github.com/KamilOcean/vue-sticker)|ステッカーみたいにペロンとはがせます。|


# ライブラリ

| 名称 | 解説 |
|:--:|:--|
|[vue-router](https://github.com/vuejs/vue-router)|定番中の定番。ルーティングです|
|[vue-lazyload](https://github.com/hilongjw/vue-lazyload)|画像の遅延読み込みです|
|[vee-validate](https://github.com/baianat/vee-validate)|バリデーションです。|
|[vue-chartjs](https://github.com/apertureless/vue-chartjs)|グラフが簡単に出せます。chatjsのラッパー|
|[vue-meta](https://github.com/declandewet/vue-meta)|メタ情報を入れられます|
|[vue-i18n](https://github.com/kazupon/vue-i18n)|多言語対応できます。|
|[vuex](https://github.com/vuejs/vuex)|状態管理のオフィシャルライブラリです|

# テンプレート
| 名称 | 解説 |
|:--:|:--|
|[TypeScript-Vue-Starter](https://github.com/Microsoft/TypeScript-Vue-Starter)|Microsoft公式のTypescriptのスタータです。|
|[vuejs-templates/webpack](https://github.com/vuejs-templates/webpack)|`vue init webpack` とかで使われるやつです|
|[vuejs-templates/pwa](https://github.com/vuejs-templates/pwa)|今流行のPWAテンプレートです。|

# ツール
後から書く
【VBS】PowerShellを使用した日時書式変換

# はじめに
これは、[Visual Basic Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vb)の12/14日の記事となります。

VBScriptは日時の書式が、FormatDateTime 関数くらいしかありません。
[FormatDateTime 関数 - MSDN](https://msdn.microsoft.com/ja-jp/library/cc410230.aspx?f=255&MSPPError=-2147217396)

```vb
Dim strDate
'strDateに本日日付が yyyy/mm/dd 形式でセットされます。
strDate = FormatDateTime(Now, 1)
'strDateに現在の時刻が hh:mm 形式でセットされます。
strDate = FormatDateTime(Now, 4)
```

# PowerShellを使う
.NET系なら日時書式指定文字列を使用してDataTimeオブジェクトを文字列に変換できます。
[書式を指定して日時を文字列に変換する - dobon](https://dobon.net/vb/dotnet/string/datetimeformat.html)

.NET系なら、PowerShellが使えるかなと試したのがこちらです。

```vb
'出力結果 20171214
MsgBox Format("2017/12/14","yyyyMMdd") 

Function Format(DateTime, Pattern)
    Dim command, wshShell, objExec, wshShellStatus, Stream
    
    command = "PowerShell -Command Get-Date """ & DateTime & """ -Format """ & Pattern & """"

    Set wshShell = CreateObject("WScript.Shell")
    Set objExec = wshShell.Exec(command)
    objExec.StdIn.Close
    Format = objExec.StdOut.ReadAll

    Set objExec = Nothing
    Set wshShell = Nothing
End Function
```

PowerShellの画面が表示されるわー、遅いわーで使えるものでは無いです。

PowerShellは標準のカスタム書式では和暦に対応できていないようです。
[PowerShell　日付のカスタム書式設定（和暦・西暦）](http://marazul2015.blog.fc2.com/blog-entry-46.html)

# 最後に
素直にFormat書式用の関数を作成するのがいいですね。
[【VBS】Format関数の@書式を作ってみた](https://qiita.com/yaju/items/8e07c8c6d9eeda316cd6)
「クラスを抽出」というリファクタリングがあるとしたらどういうものだろうか

あるとしたらというか、実際あるのですが(レガシーコード改善ガイドでは"Sprout Class"と呼ばれる)自動化されたものをまだ見たことがないので、ときどき手動でする作業を文章にしてみます。

# 使いどころ

## 例A

* Hというクラスが巨大でテストしづらい。
* Hの主機能とはいえないMというメソッドがある。(Mは複数でもよい)
* Mは切り取り＆貼り付けで他に切り出せない程度にはHに根を張っている。
* さしあたりH全体のテストは諦めて、Mだけテスト可能にしたい。

## 例B

* Hというクラスが便利だが巨大で触りたくない。
* HにMというメソッドがある。(Mは複数でもよい)
* 基本的にはHの役割だが、Mだけちょっと違う処理をしたい状況にある。
* 安直にやるとフラグを足すなりHをコピーして書き換えて多態性にするなりというところだが、それを繰り返した結果今のHがあり、限界が近い。

# 概要

## 方法

* 新たにクラスSを作り、メソッドMをそちらに引っ越す。(Mは複数でもよい)
* HのMはSへの移譲にして残すことで機能を保つ。
* Mが依存するメソッドがあれば、できるだけそれもSに引っ越す。
* 引っ越しきれないメソッドはSからHを呼び出すことで既存の動作を保つ。
* (optional)相互依存をごまかすため、SからHを呼ぶとき、Sが呼び出すMのメソッドをまとめたインターフェイスIを用意し、それを通して呼び出す。

## 操作による効果

* リファクタリングの前提として、Hの外部から見た振る舞いは変化しない。
* Sはほぼテストできる状態になる。
* Mと一緒に引っ越すメソッドの量に応じて、Hがダイエットされる。(逆に、この効果の大きさがMを選ぶ基準になる)

# 作業

# 下準備

まず、クラス内のメソッドと変数の依存関係を調べて、以下をリストアップする。

* D = {Mが直接的・間接的に呼び出すH中のメソッド}
* D1 = {Dのうち、M以外のメソッドから参照されるもの}
* D2 = {Dのうち、M以外のメソッドから参照されないもの}

* V = {Mが利用するインスタンス変数} ∪ {D2が利用するインスタンス変数}
* V1 = {Vのうち、MかD2以外のメソッドから参照されるもの}
* V2 = {Vのうち、MやD2からしか参照されないもの}

# 実装

5. コードベースに新たなインターフェイスRを加える。
 
```
   interface R {
      $(D1)
      $(V1)
    }
```

6. コードベースに新たなクラスSを加える。

```
    class S {
      private R r;
      
      $(V2)
      
      public S(R r) {
         this.r = r;
      }
      
      $(rへの移譲でD1を実装)
      $(rへの移譲でV1を実装)
      $(M)
      $(D2)
    }
```

9. Hを変更する。

* 宣言に `implements R` を加える。
* 変数 `private S s = new S(this);` を加える。
* HにあるもとのMを、`return s.M();`のように移譲の1行で置き換える。

## 後片付け

* HにあるD2を削除する。
* Sが整理できたら、HのコンストラクタでSを外から受け取るようにする。

以上、どのステップでもコンパイルは通るはず。

できあがるSはたいていよくわからない物体だが、機嫌を伺う対象がRだけなので分割はやりやすくなる。