OmniAICreator/Qiita-1.07M huggingface dataset:
組合せ最適化でカックロを解く

Advent Calendar 1日目の記事 [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)
Advent Calendar 3日目の記事 [組合せ最適化でボンバーパズルを解く](https://qiita.com/SaitoTsutomu/items/d1c9d34d17f8c7ec475e)

## これなに

**カックロ**[^1]を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

[^1]: カックロは[株式会社二コリ](http://nikoli.co.jp/)の[登録商標](http://www.nikoli.co.jp/ja/copyright/)です。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題

下図の白いマスに1~9の数字を入れて、縦または横の合計がヒントと同じになるようにします。
![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/kakkuro.png)

Pythonでは、`data`（`.`ならば数字のマス）、`hint_v`（縦の合計）、`hint_h`（横の合計）を使うことにします。

```py3:python
import re, pandas as pd
from pulp import LpProblem, lpDot, lpSum, value
from ortoolpy import addbinvars
data = """\
#..##
....#
..#..
#....
##..#""".splitlines()
hint_v = [ # 開始行、開始列、個数、合計
    (0,1,4,11),
    (0,2,2,4),
    (1,0,2,14),
    (1,3,4,10),
    (2,4,2,3),
    (3,2,2,3),
]
hint_h = [ # 開始行、開始列、個数、合計
    (0,1,2,5),
    (1,0,4,17),
    (2,0,2,6),
    (2,3,2,4),
    (3,1,4,10),
    (4,2,2,3),
]
```

## 変数表

下記のような変数表を作成します。各行の変数は0または1をとります。
変数の値が1ならば、該当行 該当列のマスが該当の数になります。

<table><tr><th></th><th>行</th><th>列</th><th>数</th><th>Var</th></tr>
<tr><th>0</th><td>0</td><td>1</td><td>1</td><td>v000001</td></tr>
<tr><th>1</th><td>0</td><td>1</td><td>2</td><td>v000002</td></tr>
<tr><th>...</th><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

```py3:python
ni,nj = len(data),len(data[0])
a = pd.DataFrame([(i,j,k) for i in range(ni) for j in range(nj)
    if data[i][j]=='.' for k in range(1,10)], columns=list('行列数'))
a['Var'] = addbinvars(len(a))
a[:2]
```


## 数理モデルを作り解く

変数表ができたので、カックロの解になるように、制約条件を追加し数理モデルを作成し、解きましょう。

- 各マスに数字を1つ入れる。 …(1)
    - `for _,v in a.groupby(('行','列'))`で1つのマスの変数がDataFrameの`v`に入るので、`m += lpSum(v.Var) == 1`とすれば、数字を1つ選ぶことになります。
- 一連の並びで、同じ数字は1つまで。 …(2)
    - 下記では、一連の並びをDataFrame(`b`)に入れています。一連の並びは、長方形なので、`DataFrame.query`で簡単に取り出せます。
- 一連の並びの合計をヒントと同じに。 …(3)
    - 2列のDataFrameの各列を、それぞれ第1引数、第2引数に渡したいとき、`*b.T.values`でできます。これは、転置（`T`）して`numpy.array`（`values`）にして展開（`*`）しています。

```py3:python
m = LpProblem()
for _,v in a.groupby(('行','列')):
    m += lpSum(v.Var) == 1 # (1)
for (di,dj),hint in zip([(1,0),(0,1)],[hint_v,hint_h]):
    for si,sj,nl,sm in hint:
        b = a.query(f'{si}<=行<={si+nl*di}&{sj}<=列<={sj+nl*dj}')[['数','Var']]
        for _,v in b.groupby('数'):
            m += lpSum(v.Var) <= 1 # (2)
        m += lpDot(*b.T.values) == sm # (3)
m.solve()
```

### 結果の表示

```py3:python
a['Val'] = a.Var.apply(value)
r = a[a.Val>0.5].数[::-1].tolist()
print(re.sub('\\.', lambda _: str(r.pop()), '\n'.join(data)))
>>>
#23##
9512#
51#31
#3142
##21#
```

解けていることが確認できます。

以上
GX Works2のインストール方法

三菱電機のシーケンサーをプログラムする際に使用するソフトウェア
GX Works2 の体験版インストール方法について解説します。


# 必要なPCスペック
* OS:Windows xp SP3以降
* USBポート・Ethernetポート

# 手順

1. [三菱電機のダウンロードサイト](http://www.mitsubishielectric.co.jp/fa/download/software/detailsearch.do?mode=software&kisyu=/plcq&shiryoid=0000000017&kisyuid=0&lang=0&select=0&softid=0&infostatus=0_0_0&viewradio=0&viewstatus=0&viewpos=0)からGX Worksをダウンロード(sw1dnc-gxw2-j_568s_try.zip)してくる

2. ![FireShot Capture 12 - MELSEC-Q シーケンサ MELSEC 制御機器 ダウンロード ｜三菱電_ - http___www.mitsubishielectric.co.j.png](https://qiita-image-store.s3.amazonaws.com/0/6898/9b15bfca-49d4-996c-979a-a0c262463464.png)
sw1dnc-gxw2-j_568s_try.zipをクリック

3. ダウンロードしたzipファイルを解凍
4. setup.exeを実行するとダイアログが立ち上がり「次へ」を押していくと、名前の入力を求められるダイアログが出てきます。
![インストール方法.PNG](https://qiita-image-store.s3.amazonaws.com/0/6898/9baeb22b-e7b1-0d89-a81d-d972d79f50ff.png)

5.名前と会社名を入力して、次へを押すとインストールが始まります。5分くらいでインストール完了します。

試用期間は20日間なので、20日経つと使用できなくなります。
Google認定プロフェッショナル クラウドアーキテクト試験

続編 : [Google認定プロフェッショナル データエンジニア試験](https://qiita.com/onooooo/items/103d82bda9eefaf8f137)

###クラウドアーキテクト試験に合格しました。
gcpはawsに比べて試験に関する情報量が（ネットにしろ書籍にしろ）圧倒的に少なく、「どこまでやれば受かるのか」の目算が非常に立てにくい試験でした。が、ひとまず受かって一安心。
結果は合否のみで点数や正解率が分からないので、どの程度できたのかも不明。。

##自分のスペック
- aws認定 アソシエイト３つ、プロフェッショナル２つ
- awsの経験 一年ちょっと。
- gcp 経験なし。試験勉強のため触る程度。

##試験概要
- 120分
- 50問
- 200ドル

##感じたこと
awsソリューションアーキテクト（アソシエイト）の勉強がベース。awsがクラウドのスタンダードと思い込んではいけないが、基本的な考えかたはここから学ぶのが手っ取り早い。
gcpの試験のページにある[ケーススタディ](https://cloud.google.com/certification/guides/cloud-architect/#sample-case-study)が大事。これを事前に一読すべし。ちなみに日本語ページのケーススタディは三件ですが、[英語ページ](https://cloud.google.com/certification/guides/cloud-architect/casestudy-terramearth)にはもう一件あります。
gcpの模擬試験、[日本語ページが先日公開](https://docs.google.com/forms/d/e/1FAIpQLScPUE0lwEdJdZNOzfNpt14Q135Qw_vG3FQeIHgKTLWOe7Zwnw/viewform)されてます。雰囲気を掴むためには是非やっておきましょう。
意外と細かいことを聞く設問もあったような。（細かいというか、まだ日本語化されてないドキュメントの範囲からの出題だったり。）
ストレージの種類と使い分け、データベースの種類と使い分け は重要テーマ。
billing、iam、組織とプロジェクトの構成…といった、権限周りや職掌分離のテーマも重要。

##勉強方法
[Cloud onBoard](https://cloudplatform-jp.googleblog.com/2017/08/Google-Cloud-OnBoard-2017-9-26.html)
不定期に開催されるイベントです。私は春頃のイベントに参加しました。当時まだほとんど理解していなかったGCPの概要を知ることができました。

[(書籍)プログラマのためのGoogleCloudPlatform入門](https://www.amazon.co.jp/プログラマのためのGoogle-Cloud-Platform入門-サービスの全体像からクラウドネイティブアプリケーション構築まで-阿佐/dp/4798137146)
概要を理解するのに便利ですが、これだけでは試験勉強としては不足。

[Codelabs](https://codelabs.developers.google.com/?cat=Cloud)
実物を触って理解するの、大事。

[(Coursera)Google Cloud Platform Fundamentals for AWS Professionals](https://www.coursera.org/learn/gcp-fundamentals-aws)
AWSとGCPの比較をしつつ手っ取り早くいろいろ理解できます。Googleが制作しただけあって、かなりGCP贔屓な比較をしているのがちょっと気になるけど・・・。ちなみに、英語です。。
簡単な説明でよければ[日本語の公式ページ](https://cloud.google.com/docs/compare/aws/)があります。

##参考文献
[GOOGLE 認定資格 Google 認定プロフェッショナル](https://cloud.google.com/certification/cloud-architect)

[アラフォーママのGoogleCloud技術者を目指した格闘記事](http://guugo.hatenablog.com/entry/2017/11/07/144324)
すごく参考になりました。

[Google公認プロフェッショナル - クラウドアーキテクトを受けてみた](https://qiita.com/sirotosiko/items/e363997d8166b9fb3476)

##（2018/01/05追記）
試験に合格するとロゴ入りパーカーがもらえます。
後日、「服のサイズと発送先を教えて」という案内がメールできます。
サイズは大きめという噂を事前に聞いてたのでワンサイズ小さいものをオーダーしましたが、ちょうど良かったかも。
【OpenCV】【Python】ルックアップテーブルでガンマ補正

超久々に自前でガンマ補正を使用する機会がありそうなので覚書。

動画は以下。
https://www.youtube.com/watch?v=YwOyfKBoX5I
[![【OpenCV】【Python】ルックアップテーブルでガンマ補正
](https://img.youtube.com/vi/YwOyfKBoX5I/0.jpg)](https://www.youtube.com/watch?v=YwOyfKBoX5I&feature=youtu.be)



ソースコードは以下。
OpenCVのトラックバーも超久々に使用した気がする。

```py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2
import numpy as np

def nothing(x):
    pass

def main():
    video_input = cv2.VideoCapture(0)
    
    # ガンマ値設定用のトラックバー用意(小数点を扱えないため、10倍の値で準備)
    cv2.namedWindow("gammma correction", cv2.WINDOW_NORMAL)
    cv2.createTrackbar("gamma(0.1)", "gammma correction", 1, 50, nothing)
    cv2.setTrackbarPos("gamma(0.1)", "gammma correction", 10)

    while(1):
        ret, frame = video_input.read()

        # ガンマ値取得（0は強制的に0.1相当に引き戻し）
        gamma = cv2.getTrackbarPos("gamma(0.1)", "gammma correction") * 0.1
        if gamma == 0:
            gamma = 0.1
            cv2.setTrackbarPos("gamma(0.1)", "gammma correction", 1)

        # ガンマ補正用ルックアップテーブル
        look_up_table = np.zeros((256, 1), dtype = 'uint8')
        for i in range(len(look_up_table)):
            look_up_table[i][0] = (len(look_up_table)-1) * pow(float(i) / (len(look_up_table)-1), 1.0 / gamma)

        # ルックアップテーブルによるガンマ補正
        gamma_correction_image = cv2.LUT(frame, look_up_table)

        # ウィンドウ表示
        cv2.putText(gamma_correction_image, "gamma:" + str(gamma), (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0,0,0),2)
        cv2.imshow("gammma correction", gamma_correction_image)

        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break

    video_input.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

```

以上。
Jupyter > importするpythonスクリプト更新時デバッグ > Restart & Run All > Meta-p | restart入力 | リスト選択

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

描画パッケージをimportしているJupyter Notebook(以下Jupyter)にて、描画パッケージを編集していた。
Jupyterで`Ctrl + Enter`にて描画を更新するが、import元の編集が有効でない。

Restart & Run Allをすればいいが、ショートカットがないようだ。

### ショートカット設定 > 失敗

https://stackoverflow.com/questions/32573958/how-to-bind-a-command-to-restart-and-run-all
においてcustom.jsを作成する方法があるが、試してもショートカットが有効にならなかった。

### Meta-p からの実行

下記手順を見つけた。

1. Meta-p
2. resと入力
3. restart kernel and run all cellsを選択
    - カーソル上一回で選択可能 (環境による)

### 実行例

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0c959d47-2c48-58bf-1add-e158e58d700f.png)
【ぶっちゃけiOSアプリ開発】手っ取り早くObjective-cを理解する | その3 変数とプロパティ


細かいことや例外的なことは後回しでいいので、手っ取り早くObjective-cを理解して使い始めたいという人向けです。他言語を経験していることが前提です。
その3は変数とプロパティ(@property)です。

#ローカル変数
メソッド内で使う変数。
メソッドの中で宣言して使う。
#インスタンス変数
インスタンス（クラス）内で使う変数。
@implementationの{}下で宣言する。

```objectivec:QiitaTest.m
#import "QiitaTest.h"

@implementation QiitaTest {
    NSInteger height; // インスタンス変数1
    NSInteger weight; // インスタンス変数2
}

- (void)testMethod {
         :
}

@end
```

#プロパティ
外部に公開するインスタンス変数はプロパティとして書く。
突き詰めると深みがあるのだが、以下のように宣言して使えばよい。

ヘッダファイルに宣言する。

```objectivec:QiitaTest.h
#import <Foundation/Foundation.h>

@interface QiitaTest : NSObject

@property NSInteger height; // プロパティ1を宣言
@property NSInteger weight; // プロパティ2を宣言

@end
```

ViewControllerから使う例。

```objectivec:ViewController.m
#import "ViewController.h"
#import "QiitaTest.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    QiitaTest *test = [[QiitaTest alloc] init];
    
    test.height = 174; // heightプロパティにセット
    test.weight = 65; // weightプロパティにセット
    
    NSLog(@"HEIGHT=%ld WEIGHT=%ld", test.height, test.weight); // プロパティをゲット
}

@end
```

実行結果。

```
2017-12-02 08:18:48.467 QiitaTest[923:25872] HEIGHT=174 WEIGHT=65
```

#プロパティをクラス内から使う
クラス内でインスタンス変数として使うときは、プロパティにアンダースコアをつける。

```objectivec:QiitaTest.h
#import <Foundation/Foundation.h>

@interface QiitaTest : NSObject

@property NSInteger height;
@property NSInteger weight;

- (void)consoleWright;

@end
```

アンダースコア付きインスタンス変数として、クラス内のメソッドから使う。

```objectivec:QiitaTest.m
#import "QiitaTest.h"

@implementation QiitaTest

- (void)consoleWright {
    NSLog(@"HEIGHT=%ld WEIGHT=%ld", _height, _weight); // インスタンス変数として使う
}

@end
```


ViewControllerからプロパティとメソッドを使う例。

```objectivec:ViewController.m
#import "ViewController.h"
#import "QiitaTest.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    QiitaTest *test = [[QiitaTest alloc] init];
    
    test.height = 174;
    test.weight = 65;
    
    [test consoleWright];
}

@end
```

#プロパティについてもっと知りたい人
* Objecitive-c V1までは@propertyは無かった。よってインスタンス変数にアクセスするためには、セッターとゲッターというメソッドをいちいち実装する必要があった。
* @propertyを使うと、セッター&ゲッターメソッドが省略できて（コンパイラが作ってくれる）、外部から使う時にドット演算子を使って「インスタンス.プロパティ」の形でアクセスすることができる。実は有難い。
* .hヘッダファイルでpropertyで宣言すると、.m実装ファイル側でインスタンス変数が勝手に実装される（コンパイラが作ってくれる）。その際の名前が「_プロパティ」となる。
* _付きのインスタンス変数名を使いたくない場合は、@synthesizeを使って別の名前や、プロパティと同じ名前に変更することができる。

###参考URL
- [インスタンス変数と@propertyと@synthesizeを理解する](https://qiita.com/a_ishidaaa/items/6461f62a1a12208b0c50)
- [Cocoaの素、Objective-Cを知ろう（3）：
Objective-Cのクラス定義を理解しよう](http://www.atmarkit.co.jp/ait/articles/0811/10/news108.html)

---
ぶっちゃけiOSアプリ開発は、アプリ開発にあたってとりあえず知っておくべきことをズバリ書きます。例外はありますのでご了承ください。
独自クラスにCollectionの振る舞いを持たせる

独自に作成したクラスをCollectionとして扱いたいことって多いですよね。
そんなときはCollectionプロトコルを継承することで実現が可能です。

・Collection
https://developer.apple.com/documentation/swift/collection

以下実装手順になります。

## associatedtypeに型を指定

独自クラスをCollectionとして扱うには、associatedtypeとして宣言されている 
Element および Index に実際の型を指定する必要があります。

```
typealias Element = Book
typealias Index = Int
````
こんな感じですね。

## startIndex 及び endIndex を指定

Collectionの開始位置、終了位置を指定する必要があります。

```
var startIndex: Int { return list.startIndex }
var endIndex: Int { return list.endIndex }
```

## サブスクリプトを定義

array[0]みたいにアクセスするために必要です。

```
subscript (position: Index) -> Element {
    return list[position]
}
```

## index(after:)を定義

```
func index(after index: Int) -> Index {
    return list.index(after: index)
}
```


## サンプルコード

全体でみるとこんな感じになります

```
import UIKit

class Book {
    var title: String?
}

class BookCollection: Collection {
    
    typealias Element = Book
    typealias Index = Int
    
    private var list: [Book] = []
    
    var startIndex: Int { return list.startIndex }
    var endIndex: Int { return list.endIndex }
    
    subscript (position: Index) -> Element {
        return list[position]
    }
    
    func index(after index: Int) -> Index {
        return list.index(after: index)
    }
    
    func append(newElement: Element) {
        list.append(newElement)
    }
}

var collection = BookCollection()
print(collection.isEmpty ? "empty" : "not empty") // => empty
for i in 0..<10 {
    let b = Book()
    b.title = "title\(i)"
    collection.append(newElement: b)
}

print(collection.count) // => 10
print(collection.isEmpty ? "empty" : "not empty") // => not empty
print(collection.first!.title!) // => title0
collection.forEach { (b) in
    // do something
}

```
git diff関連のヘルプを表示する > man git diff または git diff --help

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

git diffで変更のあったファイル名を表示しようとした。
gitのヘルプ表示は以下の方法があるようだ。

```bash
$ git diff --help
```

以下でも同じ内容が表示されるようだ。

```bash
$ man git diff
```

man表示してから「OPTIONS」というキーワードでジャンプすれば、オプションの項目を見ることができそう。
webpackでnode_modulesをbabel-loaderの対象から除外すると、ES2015+で書かれたnpmパッケージのモジュールがBabelで変換されない問題

webpackでbabel-loaderを使うとき、普通は次のようにnode_modulesを除外すると思う。

```js
rules: [
  {
    test: /\.js$/,
    exclude: /node_modules/,
    use: 'babel-loader',
  },
],
```

しかしそうすると、npmでインストールしたパケージにES2015+で書かれたモジュールがあって、それをインポートしている場合、それがBabelで変換されずにバンドルされてしまう。

一般的に、npmパッケージのモジュールはES5で書かれている。（ソースがES2015+であってもES5にコンパイルされている）。だが稀にES2015+で書かれたモジュールもある。

ES2015+で書かれたモジュールを変換せずにバンドルしてしまうと、バンドル後のjsファイルはES2015+をサポートしていないプラグイン（例えばwebpack v3系に含まれているUglifyjsWebpackPlugin v0.4系）で処理できなくなる。また、それを公開すると、IE11のような古いブラウザではエラーが出るだろう。

## 回避策

次のように、ES2015+で書かれたモジュールをbabel-loaderの**除外対象から除外する**ことで、この問題を回避できる。（webpack v3.9.1で問題なく動作することを確認。）

```js
rules: [
  {
    test: /\.js$/,
    exclude: {
      include: /node_modules/,
      // node_modulesの中のモジュールを除外対象とする。

      exclude: /node_modules\/foo\//,
      // fooパッケージのモジュールを除外対象から除外する。
      // パターンの末尾に"\/"がないと、名前がfooで始まるすべてのパッケージのモジュールが
      // 除外対象から除外されてしまうので注意。
    },
    use: 'babel-loader',
  },
],
```
[メモ] らずぱいで、apt-cacher-ngのサーバをDockerにて



# 概要
- やってみたけど、遅かった... (microSD, 100Mbps有線LAN..)
- 元: https://github.com/sameersbn/docker-apt-cacher-ng
- ↑に、ラズパイの変更を加えただけ。

# 環境
- Raspberry Pi 3 model B
- Docker

	```shell-session
	pi@rpi-07e7aa:~/apt-cacher-ng $ docker --version
	Docker version 17.10.0-ce, build f4ffd25
	```

# 手順
1. Dockerを入れる
2. Docker 関連..

	```txt:Dockerfile
	FROM resin/rpi-raspbian:stretch

	ENV APT_CACHER_NG_CACHE_DIR=/var/cache/apt-cacher-ng \
		APT_CACHER_NG_LOG_DIR=/var/log/apt-cacher-ng \
		APT_CACHER_NG_USER=apt-cacher-ng
		
	RUN apt-get update && \
		DEBIAN_FRONTEND=noninteractive apt-get install -y apt-cacher-ng \
	 && sed 's/# ForeGround: 0/ForeGround: 1/' -i /etc/apt-cacher-ng/acng.conf \
	 && sed 's/# PassThroughPattern:.*this would allow.*/PassThroughPattern: .* #/' -i /etc/apt-cacher-ng/acng.conf \
	 && rm -rf /var/lib/apt/lists/*
	 
	COPY entrypoint.sh /sbin/entrypoint.sh
	RUN chmod 755 /sbin/entrypoint.sh

	EXPOSE 3142/tcp
	ENTRYPOINT ["/sbin/entrypoint.sh"]
	CMD ["/usr/sbin/apt-cacher-ng"]
	```


	```bash:ビルド
	wget https://raw.githubusercontent.com/sameersbn/docker-apt-cacher-ng/master/entrypoint.sh
	sudo docker build -t mt08/docker-apt-cache-ng .
	```

	```bash:実行
	cd ~
	sudo docker run -d -p 3142:3142 -v `pwd`/apt-cacher-ng:/var/cache/apt-cacher-ng mt08/docker-apt-cache-ng

	#
	echo 'Acquire::http::Proxy "http://localhost:3142";' | sudo tee /etc/apt/apt.conf.d/02proxy
	sudo apt update
	```

	```bash:クライアント側設定(ホスト名は、各自変更)
	echo 'Acquire::http::Proxy "http://raspberrypi.local:3142";' | sudo tee /etc/apt/apt.conf.d/02proxy
	```


- http://raspberrypi.local:3142/acng-report.html へアクセスすると統計がみれる
VS CodeでROSの開発をしよう！

ROS Advent calender 2017の記事です。

ROS Userのみなさんエディタは何を使っていますか？
私は１５年くらいemacsを使ってきています。
ROSには昔は[rosemacs](http://wiki.ros.org/rosemacs)という変態的パッケージがあって、emacsとの親和性も高かったです。jadeまではリリースされていたようですが、現在はメンテされてなさそうですね。

私はいい加減emacsから卒業したいとず～～～っと思っていて、それでもemacsの便利さ、というよりキーバインドから逃れられずにいました。

学生の頃は設定に時間かけられて、充実した設定が出来ていましたが、社会人になってからは設定も満足に出来ていない中途半端なemacsユーザでした。

しかし最近このままではまずいと思って、エディタを乗り換えてみました。
それがMicrosoftのVS Codeです。
（最初のモチベーションはRustの開発環境を整えたかったことでした。）

私は長年Windowsは使っておらず、Microsoftというとダサい会社のイメージがありましたが、最近はHoloLensやWSLなどかなりクールになってきていると思いかえしてきました。

AtomとVSCodeを比較したのですが、全体的にVSCodeのほうが動作が軽快で使いやすい気がしました。（まあ、最も重要なのはEmacs Keybindプラグインが使いやすいかどうかなのですが・・・）

で、VSCodeでのプログラミングを快適にするために、まず、Rustで書いているロボットモジュールでURDFを使っているので、URDFを快適に書けるようなVSCodeの拡張機能を書くことにしました。

で、書いてしまったのですが、その後URDFを含めたROS用の拡張機能を見つけましたので、そちらを紹介します。

そもそも、ROSのIDE環境は以下のリンクが参考になります。

http://wiki.ros.org/IDEs

そこの一番下にVSCodeがありました。

https://marketplace.visualstudio.com/items?itemName=ajshort.ros

結構できがよくて、.urdf, .msgのシンタックスハイライトや.cppコードのフォーマットなどはもちろん, ROS Coreの制御がVSCodeから出来たりします。


<img width="1090" alt="スクリーンショット 2017-12-02 午前7.39.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/58926/9089b279-f641-aba8-57b4-4a7cb40c9e17.png">

私が作ったのは以下です。スニペットが使えます。

https://marketplace.visualstudio.com/items?itemName=smilerobotics.urdf

![snippets.gif](https://qiita-image-store.s3.amazonaws.com/0/58926/6a6e7c08-3433-ce9c-1c86-1d4ac735e218.gif)


この機会に新しいエディタに乗り換えて新年を迎えてはいかがでしょうか。
nginxをHTTP/2対応にする方法(ソースビルド不要)

半年前くらいまで
[nginxをHTTP/2対応にする方法(Chrome 51以降でも有効にする)](https://qiita.com/bj1024/items/3a4029f7ca2383d7a641)

で、ソースから最新版をビルドしないといけなかったんだけど、最近のディストリビューションならもう新しいバージョンが入っているので、**http2**と一言かけば有効になってしまう。

# バージョンの確認

```
$ nginx -V
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
```

という具合に、nginx/1.12.2 & OpenSSL 1.0.2になっていればOK。
あと、HTTP/2はSSLが前提なので、すでにHTTPSで通信できる設定になっていることが前提です。

# 対応させる

　nginxの設定ファイルの

```
  listen 443 ssl;
```

これを

```
  listen 443 ssl http2;
```

こうするだけ。

```
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl restart nginx.service
```

テストして問題なければ再起動。

# ブラウザで確認

　ChromeでDeveloperTool - Networkを見る

ヘッダのところを右クリックして"protocol"にチェックを入れる

![品川駅付近の電源マップ_-_モバイラーズオアシス.png](https://qiita-image-store.s3.amazonaws.com/0/30743/dafbffc3-e87d-280b-cb08-b2045eb488a1.png)

リロードして、protocolのところがh2になっていることを確認。

<img width="856" alt="Screen Shot 2018-01-29 at 21.10.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/30743/297fde89-096c-e3d7-2300-9944bdb7e589.png">

HTTP/2の能力を活かすためには、webpackで固めていたJSをバラバラにするとかこまかい改善が必要なんだけど、とりあえずnginxサーバとしてはこれだけでOK。
メソッドの引数をアスタリスク1文字にするイディオム


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの2日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回はメソッドの引数をアスタリスク1文字にするイディオムを紹介します。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第７章まで読み終わっていること。

## メソッドの引数をアスタリスク1文字にするイディオム

4.4.7項でも説明したとおり、メソッド定義で引数の前に`*`を使うとその引数が可変長引数になります。

```ruby
def greeting(*names)
  "#{names.join('と')}、こんにちは！"
end
greeting('田中さん')                       #=> "田中さん、こんにちは！"
greeting('田中さん', '鈴木さん')            #=> "田中さんと鈴木さん、こんにちは！"
greeting('田中さん', '鈴木さん', '佐藤さん') #=> "田中さんと鈴木さんと佐藤さん、こんにちは！"
```

可変長引数は次のように引数名を省略することもできます。

```ruby
def greeting(*)
  # 中身はいったん空にする
end
greeting('田中さん')                       #=> nil
greeting('田中さん', '鈴木さん')            #=> nil
greeting('田中さん', '鈴木さん', '佐藤さん') #=> nil
```

さて、このままだと何もメリットがないように見えますが、以下のような条件が揃った場合にアスタリスク1文字だけの可変長引数が利用されることがあります。

- サブクラスが`super`を使ってスーパークラスの同名メソッドを呼び出す
- 渡された引数は全部そのままスーパークラスに渡す
- サブクラスのメソッド内では引数を利用しない

たとえば次のようなコードです。

```ruby
class Product
  attr_reader :name, :price

  def initialize(name, price)
    @name = name
    @price = price
  end
end

class DVD < Product
  # 明示的にname, priceという引数を書く代わりに、*だけで済ませる
  def initialize(*)
    # 渡された引数を全部そのままスーパークラスに渡す
    super
    
    # サブクラスで必要な初期化処理を書く
  end
end

dvd = DVD.new('A great movie', 1000)
dvd.name  #=> "A great movie"
dvd.price #=> 1000
```

サブクラス側の実装は可変長引数なのでいくつでも引数を渡せますが、スーパークラス側はそうではないため、結果的に引数の数は2個に制限されます。

```ruby
DVD.new('A great movie', 1000, 'foo')
#=> ArgumentError: wrong number of arguments (given 3, expected 2)
```

`super`の使い方については「7.6.5 superでスーパークラスのメソッドを呼び出す」の項で説明したので、忘れた方はもう一度読み直してください。

少しトリッキーなので、初心者のうちはわざわざこのような書き方を真似する必要はありません。
ですが、gemのコードを読んでいると、ときどきアスタリスク1文字の引数が登場することがあるので、知っておくとコードリーディングの際に役立つ場合があります。

## 次回予告

次回はローカル変数の宣言と代入の関係について説明します。
（エターナル化してきた）OpenHSPの書写他

こんばんわ　旧y.tackことY_repeatです
y.tack時代に登録してるとこも多々あり
ややこしくてすいません

## はじめに
自分アレなんですよね
ソースコード読むのめっちゃ苦手なんですよ
そんなこともあってたぶん16年くらいに
写経（プログラムをPCに打ち込む）とかやるようになりました
その後、人間は昔からPCなんかなくて
文字は手書きだよ。との　よくわからない直感から
書写をするようになりました
（プログラムを印刷して　ルーズリーフに書き写す）

## やってみた　大きめの写経とか書写

### crowbar vol.1（書写）（C言語）（終了）
前橋 和弥氏著「プログラミング言語を作る」
著書籍の参考プログラムです
一番目だけ　それでも割と大きくて大変でした

### OpenHSP（書写）（C++言語）（まだ続いてますｗ）
コアなHSPユーザーなら大体一回は
目を通してるよってことで始めました
大きすげて終わらないので　途中で他のを始めちゃいます

### steem201506（書写）（C言語）（大体終了）
まつもとゆきひろ氏著
「まつもとゆきひろ 言語のしくみ」
書籍の参考プログラムです
結構楽しかったんですけど
あんまり理解出来なかったような
C言語も奥が深いっすｗ
書写したのは途中の参考プログラムなんですけど
それでも割と大きくて大変でした

### stone（写経）（JAVA言語）（終了）
千葉滋氏著「２週間でできる！スクリプト言語の作り方」
書籍掲載プログラムです
なんか楽しかったので優先的にやっちゃいました

## 履歴
昔やったのとか　フォルダに入れてたのを引っ張り出したり
（一年以上前からやってるので　よくわからなくなってます）
途中からメモにしてるので　それを参考にしたり
openHSPも参考に

- hsp3cl.cpp 2016/09/01終了
- hsp3cl.h 2016/09/01終了
- hsp3gr_win.cpp 2016/09/07終了
- hsp3gr_win.h 2016/09/08終了
- main.cpp 2016/09/08終了

- ahtmodel.cpp ???終了
- ahtmodel.h ???終了
- ahtobj.cpp ???終了
- ahtobj.h ???終了
- codegen.h 2016/11/05～2017/04/06終了
- comutil.cpp 2017/04/26終了
- comutil.h 2017/04/26終了
- errormsg.cpp 2017/04/26終了
- errormsg.h 2017/05/05終了
- hsc3.cpp 2017/06/02終了
- hsc3.h 2017/07/08終了
- hspcmd.cpp 2017/07/10終了
- hspdll.h 2017/07/14終了

- label.cpp 2017/08/16終了
- label.h 2017/08/25終了
- localinfo.cpp 2017/08/26終了
- localinfo.h 2017/08/26終了
- main.cpp 2017/08/26終了
- makefile 2017/09/02終了
- makefile.emscripten 2017/09/03終了
- makefile.linux 2017/09/03終了
- membuf.cpp 途中

## 雑談
自分は最初白いコピー用紙に印刷して白いルーズリーフに印刷してましたが
amazonで検索かけたら青とか緑とかのコピー用紙ひっかかったんで
そういうのに印刷して
seriaに色つき　ルーズリーフがあったんで　そういうのに書写してます

写経は元プログラムをLeAntillaで開いて
ってかスペースとタブを表示してくれるので絶対コレがいいっすｗ
スペースとタブは　表記の揺れがあっていらつくんですよね

写経先はTeraPadか秀丸です
色つきエディタがいいです
最近TeraPadも色変えれると知りましたｗ（マジでおそｗ）

## 書写してみて
結構いっぱい写経と書写に励みましたが
結果、昔より　プログラムを読む能力が上がった気がします
自分、プログラムの適正もないっぽいですがｗ

自分の場合ＨＳＰのスクリプトはなんか写経とか書写とかするの辛くて
プリントアウトして音読した方がいいですね

## HSPコンテスト
僕も今回、無事に応募出来ました
のんびり書写とか写経とかのしすぎで　気づいたら１０月ｗ
ゲームの案もないので　TOOL集の作成に着手しました
wikiとかに投稿してたスクリプトを採用したり
過去のTOOL集のTOOLも採用ｗ
ちょこちょこ書いて
timmer関連のTOOLsを作成
これは結構こだわって作成しましたｗ
そして描画関連のTOOLsを作成して投稿
時間がギリギリでドキュメントを全然書けなかったのが心残りですね
そして今年もプロコン一次選考止まりですよ
初投稿が２００８で、その後毎回投稿してて
１０年くらい投稿してますが、一回も入選したことない（泣

## 来年の抱負
今年の抱負はドラゴンブックを読破する！でした
８ヶ月くらいかけて前半を読破しました
後半は最適化が主なテーマなのでこれでいいでしょうｗ
そして来年のテーマは某C言語の簡単言語をHSPに移植する！ですｗ
mallocが何をしてるかなんとなくわかったので
いけそうな気がします
それが早々に完了したら
移植だけじゃなく　改造に着手したいっすね
えたーなってる中間言語作成も頑張りたいです

この投稿は [Hot Soup Processor Advent Calendar 2017](https://qiita.com/advent-calendar/2017/hsp "Hot Soup Processor Advent Calendar 2017")の 2日目の記事です。

1日目の記事: [Google Poly で公開されている素材を HSP 3 で利用してみよう](http://www.sharkpp.net/blog/2017/12/01/hsp-advent-calendar-2017-1st-day.html "Google Poly で公開されている素材を HSP 3 で利用してみよう") by sharkppさん
3日目の記事: [newlabの使い道を頑張って考えてみる](https://qiita.com/mjhd-devlion/items/44d1a919b5485629e7e8 "newlabの使い道を頑張って考えてみる") by mjhd-devlionさん
HoudiniをOSCタイムラインとして使う

この記事は、[Houdiniアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/houdini) 2日目の記事です。

Houdiniのカーブエディタの操作感が好きなので、これでリアルタイム系のもののタイムラインがいじれるといいんだけどな～… と、常々思っていたのですが、ついに一念発起してHDAとして整備しました。

どういう感じなのかは、使い方動画を見てもらったほうが早いと思うのでこちらをどうぞ

[![How to use Houdini OSC Exporter](http://img.youtube.com/vi/PGfTkelZRAQ/0.jpg)](http://www.youtube.com/watch?v=PGfTkelZRAQ)

HDAをObjレベルに作り、OSCで送信したいCHOPのパスと、IP、ポートを設定して `Init` ボタンを押すと動作します。

[![Houdini OSC Exporter test](http://img.youtube.com/vi/36RK5mTNv7U/0.jpg)](http://www.youtube.com/watch?v=36RK5mTNv7U)

もうちょっといい感じの例を… と思いましたがそこまでいい感じのサンプルができませんでした。。。

この動画では [TouchDesigner](https://www.derivative.ca/) にOSCメッセージを送ってHoudiniのタイムラインと同じ動きをさせています

## インストール

こちらからzipをダウンロードしてきて、
https://github.com/satoruhiga/HoudiniOSCExport/releases/

`otls/oscexport.hda` を `$HOME/houdini**/otls/` に、
`scripts/python/OSC.py` を `$HOME/houdini**/scripts/python/` にそれぞれコピーしてください。

フォルダがない場合は新規に作ってそこに入れればOKです

## ところでOSCとは？

と、当たり前のように進めてしまいましたが、何だそれは、、という感想の人が圧倒的に多いと思いますので、ここで簡単にOSCの説明をしたいと思います。

WikipediaによるとOSCとは、

> OpenSound Control（OSC）とは、電子楽器（特にシンセサイザー）やコンピュータなどの機器において音楽演奏データをネットワーク経由でリアルタイムに共有するための通信プロトコルである。カリフォルニア大学バークレー校にある CNMAT（The Center for New Music and Audio Technologies）が開発した。

https://ja.wikipedia.org/wiki/OpenSound_Control

というようなことらしいのですが簡単に言うと、

- UDPの通信プロトコル
- 主にLAN内で、リアルタイム性の高い短いメッセージをやりとりする
- 音楽、インタラクティブアート系のソフトウェアの通信によく使われる

という風なものです。

## タイムラインのコールバックを登録する

最初は安易にPython SOP上に実装していたのですが、そうしてしまうとビューポートを隠してアニメーションエディタのみを全画面に表示した場合にSOPのCookが走らず、メッセージが送信されない、、といった問題が起ったため、代替案を探していました。

マニュアルを読んでいると、`hou.playbar.addEventCallback(callback)` を使うとHoudiniの画面下部のプレイバーの状態が変化した時に呼ばれるコールバックにユーザー定義の関数を登録できそうだったので、そちらを試してみた所上手くいきました！

https://www.sidefx.com/docs/houdini/hom/hou/playbar.html#addEventCallback

## OSCタイムラインとしてHoudiniを使うメリット

OSCを送出できるタイムラインというと [VEZÉR](https://imimot.com/vezer/) などがありますが、OSXでしか動かず、かつ1ライセンス一万円程度と割とお高いのですが、このHDAだとHoudini Apprenticeでも動きますので実質無料です！

また、最初にも書きましたが、Houdiniはカーブエディタの使い勝手が非常にいいので普通にタイムラインとして使うだけでも有用なのではと思いますが、[この動画](https://vimeo.com/117402380) でやっているように、CHOPにサウンドファイルを読み込んでプロシージャルにアニメーションロジックを組んでいく、というような高度なアプローチにも応用できます。

HoudiniのCHOPの値は色々な形式でファイルに書き出せるので、アイデア次第でリアルタイムとノンリアルタイムの中間のようなワークフローが作れるのではないかな～ とぼんやり考えています

## おわりに

現状の問題として、`hou.playbar` のコールバックがメッセージ送信のトリガーになっているため再生が停止した状態で値を変更してもOSCが飛ばないというものがあります…

CHOPのCook終わりのコールバックなどがあれば解決なのですが、ちょっと探した所見当たらず。うーむ

まだまだできたてなので不具合などあると思いますが、ちょくちょくアップデートしていこうと思っています。。

これはおかしいのでは？という点ありましたらこちらのコメントか、GithubのIssueで報告していただけると対応します！

(2日目からあまりHoudiniっぽくない内容ですみませんでした！)
systemd-nspawnでいろんなディストリビューションを動かしてみる

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 1日目の記事です。

今回はsystemd-nspawnでいろんなディストリビューションを動かしてみます。

# 準備

ホストはDebian9.2を使います
Debian系以外はDockerhubからイメージを持ってきます

```bash
# systemd-nspawnインストール
apt install systemd-container
# ファイル準備用パッケージ
apt install debootstrap
# イメージダウンロード用にDocker入れる
wget https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_17.09.0~ce-0~debian_amd64.deb
dpkg -i docker-ce_17.09.0~ce-0~debian_amd64.deb
docker export $(docker create centos:7) > /tmp/centos7.tar
docker export $(docker create fedora:27 echo ok) > /tmp/fedora27.tar
```

# debian 9

debootstrapで一発

```bash
cd /var/lib/machines
debootstrap --components=main --variant=minbase stretch debian9 http://ftp.jp.debian.org/debian/
systemd-nspawn -D ./debian9/ # コンテナ内へ
passwd # パスワード設定
apt update
apt install systemd # systemd入れる
exit # コンテナ内から脱出
systemd-nspawn -b -D ./debian9/ # boot
# rootで入れる（パスワードはさっき設定したやつ）
systemctl poweroff # 気が済んだら終わり
```

# Ubuntu 16.04

ubuntuも同じ感じ

```bash
cd /var/lib/machines
debootstrap --arch amd64 xenial ./ubuntu1604 http://archive.ubuntu.com/ubuntu
vim ubuntu1604/etc/systemd/resolved.conf # DNS=のところを自分のDNSサーバのアドレスへ 例) DNS=8.8.8.8
systemd-nspawn -D ./ubuntu1604/ # コンテナ内へ
passwd # パスワード設定
systemctl enable systemd-resolved.service # DNS設定
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
exit # コンテナ内から脱出
systemd-nspawn -b -D ./ubuntu1604 # boot
# rootで入れる（パスワードはさっき設定したやつ）
systemctl poweroff # 気が済んだら終わり
```

# CentOS 7

systemd標準搭載なので楽

```bash
cd /var/lib/machines/
machinectl import-tar /tmp/centos7.tar # インポート
systemd-nspawn -D ./centos7 # コンテナ内へ
passwd # パスワード設定
exit # コンテナ内から脱出
systemd-nspawn -b -D ./centos7 # boot
# rootで入れる（パスワードはさっき設定したやつ）
systemctl poweroff # 気が済んだら終わり
```

# Fedora 27

```bash
cd /var/lib/machines/
machinectl import-tar /tmp/fedora27.tar # インポート
systemd-nspawn -D ./fedora27 # コンテナ内へ
dnf install passwd
passwd # パスワード設定
systemctl unmask console-getty.service getty.target
systemctl enable console-getty.service getty.target
exit # コンテナ内から脱出
systemd-nspawn -b -D ./fedora27 # boot
# rootで入れる（パスワードはさっき設定したやつ）
systemctl poweroff # 気が済んだら終わり
```

# まとめ

大体動く
共通のSQL文でPostgreSQL、SQLiteにboolean値を挿入する

PostgreSQL, SQLiteで共通のSQLを用いてboolean型カラムに値を投入したい時の方法。
例えば、テキストファイルにSQLを直接記述して、両方で実行できるようにしたい、という際に使える。

## 検証環境

* Windows 10
* PostgreSQL 9.3.2
* sqlite 3.8.11.1



## PostgreSQL、SQLiteでのboolean型の扱い

PostgreSQLにはboolean型が明示的に存在する。
これには
`true`, `'true'`, `'1'` のようなリテラルを投入すると 真値が入る。

一方、SQLiteにはboolean型は無い。
booleanは整数値のように扱われ、整数値の0が偽値, 1が真値として扱われる。
数値型カラム（INTERGER affinity、またはNUMERIC affinityカラム）に文字列 '1' を渡すと整数値 1 が入る。


よって、以下のように `'1'`をインサートすると、全く同じSQL文でどちらにも真値が投入できる。

```SQL
INSERT INTO boolean_table (boolean_column) VALUES ('1');
```

## 実行結果

PostgreSQL 9.3.2：

```SQL
test_db=# CREATE TABLE boolean_table (boolean_column boolean);
CREATE TABLE
test_db=# INSERT INTO boolean_table (boolean_column) VALUES ('0');
INSERT 0 1
test_db=# INSERT INTO boolean_table (boolean_column) VALUES ('1');
INSERT 0 1
test_db=#
test_db=# SELECT * FROM boolean_table;
boolean_column
----------------
f
t
(2 行)
```

SQLite (spatialite 4.3.0a / sqlite 3.8.11.1)：

```SQL
spatialite> CREATE TABLE boolean_table (boolean_column boolean);		-- カラム名の後ろにbooleanと書くとNUMERIC affinityのカラムになる
spatialite> INSERT INTO boolean_table (boolean_column) VALUES ('0');
spatialite> INSERT INTO boolean_table (boolean_column) VALUES ('1');
spatialite> SELECT * FROM boolean_table;
boolean_column
0
1
spatialite>
```
vi操作入門

#はじめに
実際に現場で使っているコマンドの備忘録。
これぐらい知っていれば、あまり困らないと思う。

#使い方
####モードの切り替え
- Esc　コマンドモード移行
- i　インサートモード移行

####カーソル移動関連
- H L J K (左　右　上　下に移動）
- 任意の文字数分左右に移動
　例）5l,5H →５文字右（左）に移動
- w １単語右へ移動
- Ctrl+f 　　　1ページ分、下にスクロールする
- Ctrl+b　　　1ページ分、上にスクロールする
- Shift+G　　最終行に移動
- :数字 指定した数行に移動
 
####exコマンド
- :q　保存せずに終了
- :w!　強制保存のみ
- :wq　保存して終了
- :ZZ　保存して終了
- /xxx　検索
- :sh　シェル呼び出し

####インサートモードの操作
・dd　一行削除
・HJKL　カーソル移動
・x　一字削除
・yy　一行コピー
・p　ペースト
・r[任意の文字] 一文字置換
・d$ 右側を全て削除
・:1,$s/abc/def/g 　　置換（１行目から、全行の"abc"を"def"に置換する）

#その他小技
#### viで改行コード変換
　:%s/^M//g
　^Mは、[Ctrl] ＋ [V] キーを押してから、[Ctrl] ＋ [M] キーを押せば入力出来る。
 
####set binary noeol
　viは保存時に末尾に改行コードを自動的に付与する。
　これを回避したい場合は、あらかじめ:set binary noeolを実行後に編集する。

####set number
　行番号を表示
 
#参考
viエディタの使い方
http://www.net-newbie.com/linux/commands/vi.html
vi操作手引書
http://www.tokaido.co.jp/syoko/viman/frame.html
vi入門
http://atlas.kek.jp/physics/nyumon/vi-commands.html
インターネットが無い環境でmicro:bitのJavaScriptブロックエディタを使う


※2017/02/03追記：Windows10の環境の方は[MakeCode for micro:bit](https://www.microsoft.com/ja-jp/store/p/makecode-for-micro-bit/9pjc7sv48lcx?rtc=1) がリリースされました。こちらの方が簡単です。

#背景

子供達とmicro:bit（マイクロビット）で遊ぶ際、学校のパソコンルーム的なところであれば全く困らないと思うのですが、イベントや展示会・山奥（？）で行う場合は十分なネットワークが確保出来るとは限りません。

Scratchの場合はそういう環境のためにオフライン版が用意されているので、USBで持ち歩いておけばなんとかなるのですが、micro:bitはそうはいきません。

随分前に「だれか作っていないかなー」とdocker hubを検索したところ見つからず、ならばと作りかけたのですが途中で頓挫していました。

先程、ふと思い出して検索したところあるではないですか！

https://hub.docker.com/r/kadok0520/pxt-microbit/

#セットアップ

という事で早速セットアップしてみました

> docker pull kadok0520/pxt-microbit
> docker run -d -p 80:80 --name pxt-microbit01 kadok0520/pxt-microbit

http://localhost/ でアクセスしてみましたが全く問題ありませんでした。

![pxt.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/873d3662-abfe-b939-a34e-65d41e974d40.jpeg)


ちなみに、2017-12-02現在、オフィシャルサイトに比べて、ちょっと古いバージョンでした。

makecode.microbit.orgのバージョン： 0.13.34
Microsoft MakeCodeのバージョン： 0.14.12
C++ runtimeのバージョン： v2.0.0-rc11

あとは、セットアップしたPCの80番ポートを開放してあげて、有線LANもしくは無線のデザリングを介してアクセスしてもらえればどこでもレッスンが出来るようになるんじゃないかと。

#大勢で共有する場合

スマホ・家庭用アクセスポイント・ポケットwifi・他は大抵は10台程度が最大接続数になっています。10人以上で共有する場合は、業務用のアクセスポイントという事になると思うのですが数万円の出費になります。そんな時のおすすめですが、あまり知られていないようなのですが、AirMac Expressは50台まで接続が出来ます。オークションで数千円で出回っている旧世代のものでもOKです。大きさもコンパクトで、持ち歩きに適しています。行ったことが無いところでmicro:bitの講習会を行う場合は、保険としてあると安心かもしれません。

記事を書いておきながら、実際にはまだ試していません。docker側にはたいした負荷はかからないと思っていますが、問題があれば教えてください。
Windows版MySQLをとりあえずインストールしてみる

##はじめに
Windows版MySQLをとりあえずインストールしてみたい場合の手順。
バージョンの情報がちょっと古いのでご注意

##ダウンロード
以下にアクセス。
　[MySQL :: Download MySQL Installer](http://www-jp.mysql.com/downloads/installer)
Windows (x86, 32-bit), MSI Installer(mysql-installer-community-5.6.14.0.msi)を選択する（少し前のバージョン情報なので悪しからず）。
*※事前にOracleアカウント登録が必要。*

##インストール
1. インストーラ起動
　mysql-installer-community-5.6.14.0.msiファイルをクリック

2. インストール
・Install MySQL Products
・I accept the license terms
・Skip the check for update　にチェック
・Developer Default⇒Server Onlyに変更
　（MSの変なVC++とか開発関連ファイルをダウンロードされるため）
・Installation画面
　⇒インストール実行

3. 各種設定
MySQL Server Configuration画面で以下例のように設定する。
　　　Server Configuration Type :Development Machine
　　　Enable TCP/IP Networking : 3306
　　　Root Account Password : root
　　　User Account : user1 / passwword
　　⇒以降はそのまま次へ次へ…で完了。

##動作確認
以下が確認できればOK。
- WindowsのサービスにMySql～が登録され、サービス開始していること。
- SQLクライアントツールで接続できること。
jenv環境でneo4jを使ってみたらつまずいたのでメモ

brewで[neo4j](https://neo4j.com/)を入れて使おうとしたらつまずいたのでメモ
jenvとJavaのバージョンが原因だった

# 結論

- Java8を使う
- jenvを使っていても$JAVA_HOMEは設定する

# 環境
- MacOS 10.13.1
- Homebrew 1.3.8
- neo4j 3.3.0
- jenv 0.4.4

# 症状

[http://localhost:7474](http://localhost:7474)から
username: neo4j
password: neo4j
でアクセスしても繋がらない
エラーメッセージはこんな感じ
`ServiceUnavailable: WebSocket connection failure even on localhost`

どうやらWebSocketがうまく言っていないみたい

# 対策

```bash
# まずJava8をインストールしてくる
# インストールが終わったらjenvにaddしてglobalに設定
$ jenv add /path/to/jdk1.8/Contents/Home/
$ jenv global 1.8
# $JAVA_HOMEの自動設定
$ jenv enable-plugin export
# ターミナルを再起動して1.8になっているか確認
$ echo $JAVA_HOME
# neo4j再起動
$ neo4j restart
$ open http://localhost:7474
```
MWS APIをnodejsで利用するときに、npmなに探して結局どう実装したかの話


## 背景
- 今までGUIでポチポチやっていた在庫情報取得の定型作業をMWS APIを通して自動化したくなった。
- 他のシステムとの絡みでNodejsから呼び出したい。
- API仕様眺めてたら、署名生成とか自分で実装すると面倒そう。あと専門用語がよくわからない（スロットルとか）

## 調べたこと
- MWS nodejsとかで検索（https://www.npmjs.com/browse/keyword/mws）
- それなりに出てくるけど、どれも★少なかったり、バージョン0.1だったりでよくわからない
- ひとまず、何個か使ってみることにした

## どうしたか
- 結局、自分で使いたい機能を追加実装した（https://github.com/TheLordBaski/Amazon-mws-nodejs-sdk/pull/18）

## その後
- 他のAPIも使う必要がでてきたが、個々のAPIをラッパするのが面倒になり、結局署名回りだけやってくれるシンプルなNodeModuleを使うことにした（https://www.npmjs.com/package/amazon-mws-node）

## 所感
実際使ってみて、GUIからのデータと時間とかずれてるんだけど（数分～数時間）、よくわからない。
並行運用しなければ問題ないのでとりあえずほっとくことにした。
Scratch 3.0 をビルドしてみよう

Scratchというゲームを作成したり、作ったゲームを共有したりするCoderのコミュニティがあります
https://scratch.mit.edu/

そのコミュニティで利用されている、プログラム言語(開発環境でもある)である、Scratch2.0の次世代バージョンが開発中です。

次世代バージョンであるScratch 3.0をビルドしてみましょう。


# Scratch とは何か?

https://scratch.mit.edu/about

Scratchはプログラム言語です。そして、作成した作品を公開する場所でもあります。
Scratchは8-16才向けにデザインされた言語です。


![スクリーンショット 2017-12-02 2.43.41.png](https://qiita-image-store.s3.amazonaws.com/0/54192/f14cf0b6-140c-0ae9-7a7f-c3ec4d5f5429.png)


こういった Blockを操作して組み合わせてプログラムを書いていきます。

Scratchについて、以前のまとめたものがあるのですが、こちらも、参照してみてください
https://www.gitbook.com/book/kyorohiro/firestyle/details



# なぜBuild?

すでに現在のコードをビルドしたものが公開されています。
http://llk.github.io/scratch-vm/
が、今回は、自分のPCにビルドしてみましょう。

しかし、なぜBuildする必要があるのでしょうか?
それは、Scratch3.0 をより身近に感じてもらえればと、kyorohiroは考えました。

自分でScratch3.0をビルドできるようになると、なんと!!

### Scratchを自分好みに改造する事ができます

- GUIを改造して、自分用にデコレーションしたり
- レイアウトを変えて、スマフォで動作するようにしたり
- 利用可能なSpriteを好みに変えたり

もう、なんでもできます。

### Scrachをもっと好きになります

Scrach自由自在に改造できつようになります。Scratchはどんな仕組みで動作するのだろう?と疑問に感じたら、すぐにその疑問を解決できるようになります。

Scratchについて、もっと深く知る事ができるようになります。



# Buildしてみよう!!

https://github.com/LLK/scratch-vm

まずは https://nodejs.org/ で、nodejsをインストールします。
1. https://nodejs.org/  にいってあれこれする

次は、gitをインストールしましょう
2. https://www.backlog.jp/git-guide/intro/intro2_1.html とか解りやすいです

そして、Scratchのコードをダウンロードしましょう
3 以下の通り
コマンドラインで動作させてね!!

```
git clone https://github.com/LLK/scratch-vm.git
cd scratch-vm
npm install
```

4. 実行してみましょう

```
npm start
```

すると、以下のように表示されます。

> scratch-vm@0.1.0 start /Users/kyorohiro/devDojo/w/scratch-vm
> webpack-dev-server
Project is running at http://0.0.0.0:8073/
webpack output is served from /

はい!! できました!!

http://0.0.0.0:8073/playground/ にアクセスしてみてください

![スクリーンショット 2017-12-02 3.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/54192/75545e72-ce95-49b7-682d-a29844a99062.png)


はい、Scratch3.0が、あなたのPCで動作しています!!


# PS
以下の場所でも、アレコレ書いていきます。
https://firefirestyle.blogspot.com/

[Scratch3.0 自分専用機 を作ろう!! (0)](http://blogger.firefirestyle.net/2017/09/scratch30-0.html)
[Scratch3.0 自分専用機 を作ろう!! (1) Scratch3.0をビルドしてみよう](
http://blogger.firefirestyle.net/2017/12/scratch30-1-scratch30.html)
[Scratch3.0 自分専用機 を作ろう!! (2) Scratch3.0 を Androidアプリとして動作させてみよう (1)](http://blogger.firefirestyle.net/2017/12/scratch30-2-scratch30-android-1.html)

[火の型 With Scratch 2.0 (プログラム入門) 　第00巻](https://www.gitbook.com/book/kyorohiro/firestyle/details)
[炎の型 With Scratch 2.0 (ゲームプログラム入門)](https://www.gitbook.com/book/kyorohiro/doc_scratch/details)
Homebrew must be run under Ruby 2.3! のエラー

久しぶりにbrewでパッケージをインストールしようとしたら...

```
/usr/local/Homebrew/Library/Homebrew/brew.rb:12:in `<main>': Homebrew must be run under Ruby 2.3! You're running 2.0.0. (RuntimeError)
```

Homebrew内のrubyのversionが古いって怒られてますね。

homebrewはinstallやtapコマンドの際に自動的にupdateされるようになっているのにどうしてこんなエラーが出るんでしょうか...?
よくわかりませんでした。
誰か教えてください。。。


とりあえず
brewをupdateしてあげましょう。

```
brew update
```

これで解決しました！！！
これだけでも覚えたら便利な正規表現

# 触り始めたきっかけ
新卒の時の先輩に

「正規表現って知ってる？」

と聞かれ

私「知りません・・・・」

ちょうど使っていた秀丸の検索Boxで使えたので勉強し始めたのですが

今、意外とあまり周りで使わない（使う必要がない）エンジニアも多かったので

知ってた方が検索や置換に私が便利だと思う正規表現を紹介！


# 正規表現
### a+ 
> aが１文字以上続く

```php:マッチする例
aaaaaa
```
### ab+
> aの後にbが１文字以上続く

```php:マッチする例
abbbbb
```
### ab*
> aの後にbが０文字以上続く（aだけでも引っかかる）

```php:マッチする例
a
ab
abbb
```

### [0-9] もしくは[\d]
> 0から9までの数字１文字

```php:マッチする例
0
3
9
```

### [a-z] か [A-Z] 
> aからz か AからZまでのアルファベット１文字

```php:マッチする例（小文字の場合）
a
b
z
```

### [179]
> []の中にある１文字

```php:マッチする例
1
7
```

### [^a]+
> ~~a以外のアルファベット１文字以上~~
> a以外の文字が１文字以上

```php:マッチする例
bbbbb
eeeee
```

### [0-9,]+
> 0123456789,で構成された１文字以上

```php:マッチする例
1,000
1,234,567
```

# 試してみたい
http://okumocchi.jp/php/re.php
で //で挟んでチェックしてみてはどうでしょう。
実際にプログラムに実装する前にここでテストすることもよくあります。
> /a+/
aaaabbb
だと先頭から4文字のaaaaが引っかかる

# 気をつける事
正規表現を使えるようになってもあまり複雑すぎる
正規表現を書かない事。　複雑になり可読性も落ちる。
メールアドレスも全てのパターンを１つの正規表現でやろうとするととても複雑になるしメンテナンスやチェックが厳しくなる。

# 最後に知っておくこと
同じ「正規表現」と言えど環境により使える記述と使えない記述があります。
使いたい環境によって使える表現方法を知っておかないと特定の環境で動かなくてハマりますw

# 実際に仕事でこんな風に使いました。
- csvデータの変換をしないといけない時に秀丸のマクロで正規表現の置換でデータ変換を行う
- 置換を使ってログで必要な情報だけを出力する

# 実践
エディタで正規表現検索するかgrepで使うのが一番簡単なのでぜひやってみてください。
お遊び会のすゝめ

はじめまして、インフラストラクチャグループに所属している今年4月に入社したuchi_rhymeです。
~~好きな開発手法は札束駆動開発です~~

LivenseAdventCalendar 学の2日目として、私が学びの場を作った話をしたいと思います。

投稿される記事のレベルが高くて震えています。
そんな中、中身が無い投稿をしていくことをお許し下さい。

# TL;DR
勉強会よりもゆるい制約を設けたお遊び会、いかがでしょうか。


# はじめに
エンジニア力、アゲてますか？

私は、転職後悩みました。
どうやってエンジニア力をアゲればいいんだろう？と。
もちろん業務を繰り返していけば、`業務に必要な知識`は身につきます。
ですが、エンジニアとしてはそれだけは足りないですし、日々アップデートされる情報量は膨大です。

これら、エンジニアとして必要とされる知識を身につけるため日々研鑽されている方がたくさんいらっしゃることでしょう。
現代のエンジニアに必要な能力を挙げていくためには以下の方法が挙げられるのではないでしょうか。

- 外部の勉強会に参加する
- 本を読む
- 資格を取る
- 実際に触る
- はてブを読む
- etc...

しかし私には、エンジニア力をアゲるためのモチベーションが続かない時がありました・・・
転職してしばらく経ち気力が切れたのでしょうか、切れたモチベーションが回復しませんでした。
そういう時に無理に本を読んでも、目が文字を追うだけで知識として身につく感じはありません。
そんな中、今後エンジニアとして生きていくにはどうすれば良いのか、この時私は悩んでいました。

最後は、「エンジニア力をアゲるためのモチベーションを回復させるには`何かを作ること`」という学びを得たのですが
どうすればいいかわからない、一人だとよくわからない、とそんな方に向けてこの記事を書いています。

## お遊び会を始めたきっかけ
今回、この記事で紹介するお遊び会を発足したのは、社内でのある飲み会で「もっとインフラ側の知識を身に着けていきたいんですよね」と相談を受けた時でした。
この時、勉強のモチベーションが沸かなかった私はある言葉を思い出しました。

>元来僕という人間は、人から火を移してもらわなければ情熱を抱けない人間だった。誰か情熱をもった人がいないと、自分では燃えられない人間だったのだ。
[東大卒プロゲーマー](http://www.amazon.co.jp/%E6%9D%B1%E5%A4%A7%E5%8D%92%E3%83%97%E3%83%AD%E3%82%B2%E3%83%BC%E3%83%9E%E3%83%BC-PHP%E6%96%B0%E6%9B%B8-%E3%81%A8%E3%81%8D%E3%81%A9/dp/4569819621 )

そうだ、私も同じで自分一人では情熱が燃えないタイプの人間だったのだ、と。
だから、この相談を持ちかけた人を巻き込んで何かやったら盛り上がるんじゃないか？という発想に至りました。

最初は、自分の理解を深めるために、その方と一緒にインフラに関する勉強会を開こう！と意気込んだのですが
勉強会の形だと、肩肘を張って疲れてしまう、時間や労力の割に得られるものが実はそこまで大きくないのでは？と思いとどまり、この形式での開催をしようとは思いませんでした。
この時に思ったのは、「強制的にやる・やらせるだけではモチベーションはついてこない」ということです。
そこで自問自答した結果、「エンジニアは、楽しめる事が無いとやりたがらないものだ」と思いつきました。

せっかく時間を使って何かやろうとするのであれば、自分も含め参加したメンバが
「エンジニアとして楽しめる・気分が盛り上がること」を行えばモチベーションを維持しながら
エンジニア力が向上するのでは？と思いつきました。

エンジニアは、なんだかんだ`何か`を作ろること自体が好きな背景から
テーマやルールをゆるく決めて、技術を使って何かを作るという遊ぶ会を設立しよう！と思い立ちました。（総員2名)

# お遊び会で決めた事
## 最初に決める事

お遊び会なので、普段やれないことをやったほうが良いと考えつつも
決め事が何も無いと、業務で使っているアーキテクチャやプラットフォームを使って楽をしてしまいます。

そのため、ルールと取り組むテーマを以下のように決定しました。

### ルール

- 業務で触っている物は(なるべく)使わない
 - 例：普段AWSを触っているのであれば、AzureやGCPを使う
- 自分の不得意な部分・もしくは新しい技術にチャレンジする
 - 例：私はあまりコード書かないので、必ずコードを書くようにする
- 任意のタイミングで良いが必ずアウトプットする

### 取り組むテーマとアーキテクチャ
取り組むテーマは初回に決定しました。

- 例えばこんなテーマ
 - LINEBotに話しかけた内容を覚えてくれる。聞くと教えてくれる
 - LINEBotに聞くと天気を教えてくれる。位置情報も使って今いる場所の天気情報が来る

2名が得た学びをシェアできるよう、アーキテクチャはある程度共通化しました。

- クラウドプラットフォームとしてGCP
- 使用する言語としてgolang
- 登場する役割のサーバは全てコンテナ化
 - 全てをコンテナ化する必要はどこにも無いんですがムキになりました。

## 運営方法 / 進め方
基本的には、お昼ごはん食べながら週1で会話するようにしています。

- 取り組んでいるテーマの進捗とか
- 取り組んでいるテーマで困った内容とか
- 業務のこととか

こういう会話の副次的な効果として、もう1人が属しているチームでどういう事が行われているのか、など
社内ではチャットツール上でしか得ることができない情報を生で得るのはまた違った角度から物事を見ることが出来ます。
また、取り組むテーマ「外」で起きた困った事でも、話を聞いてみて、一緒に解決に立ち向かったりすることでさらなる知見を得る事ができました。

そのうち、業務後にシフトして、お酒飲みながらやったほうがゆるっとした拘束力も働くので良いかな？なんてことも考えています。
~~ぶっちゃけ話とか出そう~~

# おわりに

お遊び会で最初に決めたテーマを作りきれていないのですが、個人的な感想としては以下です。

良かったこと

- やっぱコード書くの楽しい、自分で考えた物が（動かないことのほうが多いけど）動くの楽しい、という事を改めて実感できたのが良かった
- 普段使わないクラウドプラットフォームの良さを知れる  
 - 触ったことがあるか、ないか、の違いは大きい
- 普段業務で関わりの無い人と一緒にやっていく一体感

反省すること

- ゆるっとしすぎて開発時間を確保できない事が多かった 
 - プライベート側で色々あったりするとキツい・・・
 - 次のルールで、一日5分で良いから触る、を追加予定 


最近、何かをやるにしてもモチベーションが沸かないな、なんてお考えの方いましたら
社内で同じようにエンジニアとしての悩みを抱えている人を探して一緒にやってみると良いかもしれませんね。
node.js express でWebサーバーを作り、ファイル/ディレクトリ一覧表示する

# はじめに

JavaScript開発をしていくときに、ファイルを書いてサーバーに転送して動作確認をしている方もいるかもしれませんが、高速に開発するためにはすぐに動作確認をしたいので、ローカルWebサーバーが必要になってくるでしょう。

私はJavaScriptのフロントサイドのみの開発をしているので、あまり知らないのですが、PHPやRubyやPythonではローカルのWebサーバーを作成するのは非常に簡単なようですし、

Windows版ですが「簡単WEBサーバー」や「04WebServer」といったフリーソフトもあるようなので、それらを利用している方もいるとは思うのですが、

せっかく様々な分野に食い込んできているJavaScriptなので、WebサーバーもJavaScriptで作ってしまいましょう。

node.js と express を使えば、かなり楽にWebサーバーを立てることができます。

一応、全体を通して Window 環境で構築していきますが、おそらくMacやLinuxでもほとんど同じで環境構築できます。JavaScriptやnode.jsはマルチプラットホームなのでありがたいことです。


# 環境準備、express のインストール

node.js はインストールしておいてください。
node.jsの本家のページでインストーラがあるので、それで簡単にインストールできます。

インストールできたら、ファルダを作成してそこでコマンドプロンプトからコマンドを入力します。

```
> mkdir webserver website
> cd webserver
> npm init -y
> npm install --save express
```
これで、webserverフォルダ内にexpressがインストールされて準備が整いました。

webserverフォルダに、node_modulesフォルダや、package-lock.jsonファイル、package.jsonファイルができると思いますが、説明は省きます。

# 簡単なwebサーバー

次のファイルを webserver フォルダに配置してください。
UTF-8で保存です。

```js:server01.js
'use strict';
const express = require('express');
const app = express();
app.use(express.static('../website'));
app.listen(8001, ()=> {
  console.log('Express Server 01');
});
```

これを、node.js で実行します。

```
> node server01.js
Express Server 01
```
表示がでて待機状態になります。
停止はCtrl+Cで行えます。

これで、websiteフォルダの内容をWebサーバーで見ることができるようになります。

websiteフォルダに次のindex.htmlファイルを配置して動作を確認してください。

```index.html
<!DOCTYPE html>
<html lang="ja"><head>
<meta charset="utf-8">
<title>Hello world !</title>
</head><body>
Hello world !
</body></html>
```

http://localhost:8001/

あるいは

http://localhost:8001/index.html

でアクセスすると Hello world ! が表示されます。

# ファイル一覧を表示できるWebサーバー

さて、上記のものではWebページとしてファイル一覧やフォルダ一覧がリストされないので、そういうWebサーバーを作ります。

webserverフォルダ内に、新しいモジュールをインストールします。

```
> npm install --save serve-index
```

次のファイルを、webserverフォルダに配置してください。

```js:server02.js
'use strict';
const express = require('express');
const app = express();
const rootPath = '../website';
app.use(express.static(rootPath, { index: false }));
//index.htmlを勝手に見に行かない指定

const serveIndex = require('serve-index');
app.use(serveIndex(rootPath, {
  icons: true,
  view: 'details'
}));

app.listen(8002, ()=> {
  console.log('Express Server 02');
});
```

node.jsで実行します。

```
> node server02.js
Express Server 02
```

http://localhost:8002/

でアクセスすると index.html がリストアップされます。他のファイルやフォルダを配置すると一覧でみることもできます。

とりあえずこんな感じで、手軽にWebサーバーをローカルで作ることができます。
ご活用ください。

# アンインストール方法

念のためにアンインストール方法も書いておきます。

webserverフォルダをカレントディレクトリにしたコマンドプロンプト上で次のコマンドを入力するとアンインストールされます。

```
> npm uninstall serve-index
> npm uninstall express
```
Python 自然言語処理の前処理


## 概要
自然言語処理の前処理を行う例。形態素解析と簡単なデータのクレンジングを行うもの。新聞記事の文章を前提とし、処理後のデータはWord2Vecに投入することを想定しています。

前段のデータ収集はこちらの記事参照。
[Python Webスクレイピング実装例](https://qiita.com/tibaraki/items/12a03b688254cce89ca8)

## 環境
* Python3
* MeCab
* NEologd

## 実装
```py:1
import sqlite3
import MeCab
import unicodedata

tagger = MeCab.Tagger(' -d /usr/lib/mecab/dic/mecab-ipadic-neologd/')
tagger.parse("")#バグ回避
```
MeCabを準備します。neologdのパスは環境に合わせてください。
最初に空文字をパースするのはおまじないです。

```py:2
dbtext = sqlite3.connect("file:text.db", uri=True)
dbtext.row_factory = sqlite3.Row
dbword = sqlite3.connect("file:words.db", uri=True)
dbword.row_factory = sqlite3.Row
```
dbtextには元文章が入っている状態とします。dbwordには形態素解析後のデータを書き込むためのテーブルを事前に定義しておきます。
row_factoryを記載のように設定しておくと、select結果をdictのように参照できて便利です。

```py:3
lasttime = ""
row = dbword.execute("select time from wordstbl order by time desc limit 1").fetchone()
if row is not None:
	lasttime = row["time"]
```
バッチ処理としてcronでまわすことを想定しているので、処理済レコードを峻別するためのタイムスタンプを取得しておきます。

```py:4
for row in dbtext.execute("select * from rawtext where time > ? order by time", (lasttime,)):
	node = tagger.parseToNode(unicodedata.normalize("NFKC", row["rawtext"]))
	separated_text = ""
	while node:
		features = node.feature.split(",")
		if features[0] in ["名詞"] and features[1] not in ["接尾", "数", "接続詞的", "非自立", "代名詞"]:
			separated_text = separated_text + " " + node.surface
		node = node.next
	
	insert = "INSERT INTO wordstbl(id, source, time, words) VALUES(?, ?, ?, ?)"
	args = (row["id"], row["source"], row["time"], separated_text)

	try:
		dbword.execute(insert, args)
	except sqlite3.Error as e:
		print ('sqlite3:', e.args[0])

dbword.commit()
dbword.close()
dbtext.close()
```
生文章を取り出し、まずnormalizeで表記揺れを取り除きます。
形態素解析後、品詞でフィルタします。今回は名詞以外は除外し、かつ名詞の中でも接尾や非自立といった意味の薄いものは除外します。

### SQLiteの全文検索

```sql:sql1
CREATE VIRTUAL TABLE wordstbl USING fts3(
  id VARCHAR(36) NOT NULL PRIMARY KEY,
  source VARCHAR(20),
  time VARCHAR(20),
  words VARCHAR(1024));
```
参考に書き込み先のテーブル定義です。
fts3により分かち書きされたテキストに対して効率的な全文検索が可能になります。
なお、ftsを使用する場合、全ての列が文字列型扱いになります。

```sql:sql2
SELECT * FROM wordstbl WHERE words MATCH 'hoge'
```

## 所見
生文章・分かち書き文章・単語ベクトルそれぞれ使いどころがあるので、中間データも利用しやすい形で保管しておくと後で後悔しません。再度集めるのも大変です。
Connected Standby でスリープを検出する方法

※Win32の超絶原始的方法です。

WM_POWERBROADCASTをご存知ですか？

# WM_POWERBROADCASTはConnected Standbyでは使えない

スリープとかサスペンドのことを調べてみると、いろんな方法が見つかります。[System Power Management Events](https://msdn.microsoft.com/en-us/library/windows/desktop/aa373223.aspx)とか、[SystemEvents.PowerModeChanged Event](https://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.powermodechanged.aspx)とか。


[WM_POWERBROADCAST](https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa373247.aspx)は、電源まわりの何かが起きたときに発行されるウィンドウメッセージなので、例えば、ノートPCでAC電源を繋いだり外したりとかで受け取ることができます。
wParamに渡されるイベントの詳細を見ると、PBT_APMSUSPENDとあるので、スリープ検出できるような気がしてきますが、Connected StandbyとかInstant GoとかModern Standbyとか呼ばれているモードのWindowsで検出できません。

ちなみに、Win8以降でConnected Standby / Instant Go、Win10以降でModern Standbyと呼ばれているみたいです。だいたい同じものです。

# PowerRegisterSuspendResumeNotification を使う

ひとつの解として、[PowerRegisterSuspendResumeNotification](https://msdn.microsoft.com/en-us/library/windows/desktop/hh769080.aspx)という関数があります。
スリープ・サスペンド・それらからの復帰のときに実行したい関数を、コールバック関数として登録することができます。

```cpp
#include <Powerbase.h>
#pragma comment(lib, Powrprof.lib)

// コールバック関数を用意する
ULONG CALLBACK DeviceNotifyCallbackRoutine(
   _In_opt_ PVOID Context,
   ULONG          Type,
   PVOID          Setting
) {
  // ここにサスペンド・復帰したときの処理を書く
  if(Type == PBT_APMRESUMEAUTOMATIC) {
    // 例えばここはスリープやサスペンドから戻ってきたときに実行される
  }
}

int main() {

 // コールバック関数と、関数に渡すもの
  DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS parameters = { DeviceNotifyCallbackRoutine, &context };

  // コールバック関数を登録する. ユーザーモードでよいならRegisterSuspendResumeNotificationでもよい.
  HPOWERNOTIFY notify;
  PowerRegisterSuspendResumeNotification(DEVICE_NOTIFY_CALLBACK, &parameters, &notify);
  
  // ...

  // 最後に登録を解除する.ユーザーモードの関数を使ったときはUnregisterSuspendResumeNotificationを使う.
 PowerUnregisterSuspendResumeNotification(notify);

}
```


個人的にstd::unique_ptrを使いたい衝動があるので、

```cpp
// ポインタを解放するときの処理
struct SuspendResumeNotificationDeleter {
  using pointer = HPOWERNOTIFY;
  void operator ()(HPOWERNOTIFY notify) {
    PowerUnregisterSuspendResumeNotification(notify);
  }
};

// 使う時はこんな感じでいいのかなぁ
HPOWERNOTIFY notify;
DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS parameters = { DeviceNotifyCallbackRoutine, &context };
PowerRegisterSuspendResumeNotification(DEVICE_NOTIFY_CALLBACK, &parameters, &notify);
std::unique_ptr<HPOWERNOTIFY, SuspendResumeNotificationDeleter> ptr(notify);
// 必要なくなったらptr.reset();
```

# 最後に

PowerModeChangedのほうが使いやすそう... Win32は苦行だし...