OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10をクリーンインストールするときの(個人的)Tips


## 背景
去年の年末に大掃除の一環で自宅のデスクトップ(Windows10)を
クリーンインストールしたのだが、エラーでOSが起動しなくなるという手痛い失敗をしてしまい、
三が日の半分近くを消費してしまったので、その備忘録として。

## 前もって準備しておくこと

### Windowsnoのプロダクトキーの確認
一昔前は購入した際についてくるディスクに記載されていたが、最近は
ディスクが同梱されていないものもある？らしいので確認しておく。
Windowsからは簡単な方法では確認できない？ので詳しくはググってほしい。  
私は特に何も準備せずに今回の失敗をしてしまい、ライセンスキーを喪失して新しくライセンスを買い直した。
なお今回はオンラインで購入したのでメールにライセンスきーはちゃんと保存されている。

### リカバリディスクとクリーンインストール用のディスクorUSBの作成
クリーンインストールディスクは当然必要になるので作成。
リカバリディスクも後々必要になるかもしてないので作成しておく。
なお私のPCは7年以上前に購入したものなのでUSBブートに対応していなかった。
USBブートに対応しているか否かはBIOS画面で確認可能。

Windows10のインストール用ISOは以下のURLから入手できる。  
https://www.microsoft.com/ja-jp/software-download/windows10  
32bitと64bitの2種類あり、2種類とも含んだISOもダウンロードできるが、
2種類含んだISOの場合、容量が大きくDVDには焼けないので注意すること。  

リカバリディスクはWindowsの機能で作成できる。

#### 32bitか64bitか問題
今インストールするならまず間違いなく64bit。  
ただし、レガシーなアプリを使用していて且つそれが64bitに
対応していない場合は32bitにせざるを得ないかも知れない。
もっとも、そんなアプリはWindows10で動作しているかも怪しいが。

### クリーンインストールの種類
クリーンインストールには以下の2種類がある。

1. 個人ファイルは残したままWindows10を再インストールする方法
1. 個人ファイルも全て削除した上でWindows10を再インストールする方法

せっかくクリーンインストールするなら、と私は2.の方法で実施した。  
(まぁエラーでOSが起動しなくなったのでどちらを選んでも結果は変わらなかったのだが)  
これはどちらを選ぶかは個人の好みによるものだと思うのでどちらにするかはご自由に。

### バックアップ
言わずもがな重要なもの。Windows10に搭載されているバックアップでもいいが、  
私がよく使っている方法は、 **HDDのクローン** を作成する手法。
HDDのクローンは、簡単に言えばHDDをまるごとコピーするもの。
ただのコピーと違い、クローンしたHDDは、そのままboot可能なHDDとして使用できる。  
注意点として、クローンしたHDDを2つとも使用することは
Windowsのライセンス規約に引っかかると思うのでやっちゃダメです。  
特にIT関連のお仕事している人はITリテラシーに関わる問題なので絶対ダメです。
ライセンスについては [ここ](https://social.technet.microsoft.com/Forums/ja-JP/caec29e8-2afe-4bd9-9c03-477d60ed4768?forum=w7itprogeneralja) で色々議論されている。

#### HDDのクローン方法

HDDのクローンを作成する手段としては、ハードウェアとソフトウェアを使用すつ二種類の方法があるが、
私はハードウェアを使用した方法しか実践したことがないので、ハードウェアを使用した方法を以下に記載する。  
GoogleかAmazonnで「HDD クローン」で検索すると2箇所のHDDスロットの付いた機器がヒットする。
それを購入して説明書を読みながら実践する。
ハードウェアを使用したクローンでの注意点として、
基本的にクローン先のディスク容量はクローン元のディスク容量以上でなければならない。

#### クローンを作成しない場合にバックアップすべきもの

* Windows標準のバックアップの実施
* インストールしているアプリの一覧  
たしかインストールしているアプリ一覧をXMLで出力するコマンドがあったはず。
* C:\USers\以下のファイル(隠しフォルダ含む)全て  
いわゆるマイドキュメントに相当するものとアプリの設定なんかが入ってる。  
隠しフォルダのAPPDATAに各ユーザごとの設定ファイルがあるのでこれが割りと重要
* タスクスケジューラに自分で定義したスケジュール  
コアなWindowsユーザはタスクスケジューラにタスクを登録したりしているのでそれのバックアップも忘れずに

## デュアルブート環境だった場合は？
私のPCもデュアルブート(WindowsとUbuntu)だったが、古いバージョンのUbuntuだったことと、
LinuxMintを試したいなと考えていたので、HDDをフォーマットした上で１からインストールした。  
なので知見は無し。実践する人はググって頑張ってください。もしよければ教えて。  
たしかインストールする際にWindows以外のパーテーションはどうする？とか聞いてきた気がするので、
そこでWindowsだけを選択すればうまくいくのではなかろうか。

# クリーンインストールの実施

1. ディスクorUSBを用意します
1. ディスクorUSBをPCにセットします
1. PCの電源を入れます
1. F8を連打します(メーカーによっては違うかも)
1. Boot選択画面が出てきます
1. ディスクドライブorUSBを選択します
1. あとは出てくるウィザード画面に沿うだけ
1. クリーンインストールが正常終了するのを祈ります

# まとめ
バックアップは重要です。**バックアップは重要です。**

**以上！**
作業日の一時領域を作成


## 症状
ファイルが散らかってしまう人

## 効能
日付ディレクトリを自動生成して移動

## 準備
.bashrc に以下の１行を追記。`source ~/.bashrc` 反映します。

```
alias today='mkdir -p ~/wkdir/`date +"%Y%m%d"` ; cd ~/wkdir/`date +"%Y%m%d"`'
```

## 手順
`today` と入力すると、ホームディレクトリのwkdirというディレクトリの配下に作業日の日付のディレクトリを作成して移動します。
その日の作業ディレクトリが自動的に生成されて移動までしてくれて、便利！これでファイルも散らかりませんね！


※細かすぎる内容ですみません。(；・∀・)
asciidocでスライドを作成する

# asciidocでスライドを作成する

## 目的
* プレゼン資料にパワポを使いたくない（細部にこだわりたくなって時間が掛かる..!）
* 繰り返し修正して使用するプレゼン資料はバージョン管理したいのでテキスト形式にしたい

## 前置き
asciidoc形式で作成したテキストファイルを、自端末上のasciidoctorでスライド風HTMLに変換するまでを
簡単に記載します。

* Windows 10

## インストールするもの
* Ruby
* asciidoctor
* tilt
* haml
* deckjs

## 環境構築手順

### Rubyをインストール

* ダウンロード
[Downloads-RubyInstaller](https://rubyinstaller.org/downloads/)

* インストール確認
> ruby -v

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/1305ae53-cf22-31d1-6467-4ccd82f459bf.png)


### asciidoctor,tilt,hamlのインストール

* インストール

> gem install asciidoctor tilt haml

* インストール確認

> gem list --local

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/4fb2ca26-4893-b727-4298-77b772f19559.png)



**ご参考：以降の手順でダウンロードする資材を下記に揃えました。cloneすることで手順が省略できます。**
**https://github.com/Autumn-Eggplant/text-home/tree/master/asciidoc/asciidoc-slide**

### deck.jsのセットアップ

#### asciidoctor-deck.js

* ダウンロード

> git clone https://github.com/asciidoctor/asciidoctor-deck.js

or
https://github.com/asciidoctor/asciidoctor-deck.js からダウンロード

* 適当なフォルダを作成（画像では`D:\dev\work\adoc`）して解凍

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/35e9caa2-3fb3-fa07-aeff-3df8fe6a35da.png)

* 解凍したら`-master`いらないから消す

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/308528ad-cace-cd56-ecf3-53d21880e826.png)

#### deck.jsのダウンロード

* ダウンロード

[deck.js-latest](https://github.com/imakewebthings/deck.js/archive/latest.zip)

* 解凍してコピー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/ef513c63-58bd-59d3-e7f5-74d9397b477b.png)


* フォルダ名から`-latest`を消す

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/76209203-bfa3-4183-7b61-2b0b1aaefa53.png)

### もう少しつづきますが、現時点でスライド出力が可能です。
いずれ追記します。

## 実行

> asciidoctor -T asciidoctor-deck.js/templates/haml sample.adoc

```sample.adoc
= Title of Presentation 
Presenter Name
:backend: deckjs
:deckjs_transition: fade
:navigation:

== Title of Slide One 

This is the first slide after the title slide.

[canvas-image=images/example.jpg] 
== Slide Two's Title will not be displayed 

[.canvas-caption, position=center-up] 
This text is displayed on top of the example.jpg image.
```

* 実行結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/d6a868a6-8544-9038-205e-8f64fdf215ce.png)


## 参考
http://asciidoctor.org/docs/install-and-use-deckjs-backend/

https://qiita.com/shimoju/items/41035b213ad0ac3a979e
homebrew を利用し各種コマンド等をインストール

こんにちは。
各種コマンド等を[homebrew](https://brew.sh/) を利用しインストールして使っておりますが、方針を整理してみました。

```console
$ brew tap caskroom/cask brewsci/science brewsci/bio
```

__1.__ ```brew install``` を用いてインストールしたコマンド等
 - gcc
 - ghostscript
 - opencv3
 - python3
 - numpy
 - scipy
 - pybind11
 - ipython
 - percol
 - meson
 - gdal
 - postgis
 - fonttools
 - tensorflow[^1]
 - protobuf
 - spatialindex

__2.__ ```brew cask install``` を用いてインストールしたモジュール
 - xquartz
 - java
 - cuda
 - docker

__3.__ ```brew cask fetch``` を用いて取ってきたモジュール
 - mactex  (手動でインストールし[^2]、その際にghostscriptは不要なので除く[^3][^4]）

__4.__ ```pip3 install``` を用いてインストールしたモジュール（package）
 - pillow
 - matplotlib
 - pandas
 - seaborn

[^1]: Intel Mac の場合
[^2]: 削除したい場合は、```rm -rf /usr/local/texlive /Library/TeX /Applications/TeX```
[^3]: ghostscriptは、既に```brew install```を用いてインストール済みであり、mactex由来のものは不要。)
[^4]: 参照：「[MacTeX がインストールする ghostscript 関係ファイル一覧を確認](https://qiita.com/kkdd/items/57129aabe05aa03b697a)」

#### python package の確認
なお上記の 1 （```brew install``` を用いてインストール）を行うと、必ずしも最新ではない python モジュールがインストールされます。試しに確認すると下記のようになりました。

```console
$ pip3 list --outdated
Package Version Latest Type 
------- ------- ------ -----
GDAL    2.4.2   3.0.2  sdist
numpy   1.17.4  1.18.1 wheel
scipy   1.3.3   1.4.1  wheel
```

#### モジュールの依存関係確認

なお、homebrew モジュールの相互依存関係は下記のようにすれば確認できます。

```console
$ brew uses ghostscript --installed
djvu2pdf
$ brew uses numpy --installed
osgeo/osgeo4mac/gdal2-python
```

オプションで付けたモジュールを確認するには、

```console
$ ffmpeg --with-tools --with-x265
$ brew uses x265 --installed --include-optional
ffmpeg
$ brew uses x265 --installed
$
```
Rspecでモデルのvalidateをテストするときの注意


#valid?を忘れずに

newでvalidateに引っかかるインスタンスを作成しても、valid?を行わなければerrors.messagesは格納されていない。
なので必ずnewでインスタンスを作った後expectの前にvalid?を行うこと。

```ruby:Hoge.rb

#モデル

class Patient < ApplicationRecord

    #validate
    validates :name, presence: true #名前を必須

end
```

```ruby:hoge_spec.rb

require 'rails_helper'


# 下はho.errors.messages[:name]の値が空でテストが失敗する。
RSpec.describe Patient, type: :model do
    it 'is invalid without a name' do
        ho = Hoge.new()
        expect(ho.errors.messages[:name]).to include('Can not be blank')
    end
end


# valid?を事前に行うと、errors.messagesにエラーの値が格納される。(テスト成功）
RSpec.describe Patient, type: :model do
    it 'is invalid without a name' do
        ho = Hoge.new()
        ho.valid?
        expect(ho.errors.messages[:name]).to include('Can not be blank')
    end
end
```
FreeCADのexamplesをみてみた

https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AEFreeCAD-%E4%B8%89%E8%A8%82%E7%89%88-I-BOOKS-%E5%9D%AA%E7%94%B0/dp/4777521583/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2IABRFW19H2EU&keywords=%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AEFreeCAD+%28I%E3%83%BBO+BOOKS%29&qid=1664949096&qu=eyJxc2MiOiIxLjQ3IiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&s=books&sprefix=%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AEfreecad+i+o+books+%2Cstripbooks%2C195&sr=1-3


~~(参考) 2016/1 ver0.15~~
~~https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AEFreeCAD-I%E3%83%BB-BOOKS-%E5%9D%AA%E7%94%B0-%E9%81%BC/dp/4777519317/ref=sr_1_1?s=books&ie=UTF8&qid=1507637743&sr=1-1&keywords=freecad~~

~~(参考)~~
~~FreeCAD version 0.16 user manual(23.34MB)~~
~~http://kent.dl.sourceforge.net/project/free-cad/FreeCAD%20Documentation/FreeCAD.Manual.0.16.pdf~~

(参考)FREECAD A MAUAL 0.16 (14.9MB)

https://www.freecadweb.org/manual/a-freecad-manual.pdf

Windows7
①FreeCADをインストール
②exampleをみてみた。
C:\Program Files\FreeCAD 0.16\data\examples

－－－－－－－－－－－－－－
【補足】(2018/01/21)
Main Page

https://www.freecadweb.org/wiki/Main_Page

Category:Tutorials

https://www.freecadweb.org/wiki/Category:Tutorials

－－－－－－－－－－－－－－
~~【補足】(2018/01/27)~~

~~https://www.freecadweb.org/wiki/Category:Command_Reference/jp~~

~~https://www.freecadweb.org/wiki/FreeCAD_API/jp~~

~~【補足】(2018/02/24)ダウンロードします~~

~~http://opensourceecology.org/w/images/0/00/FreeCAD-3.pdf~~


~~https://doc.lagout.org/programmation/python/FreeCAD%20%28How-to%29_%20Solid%20Modeling%20with%20the%20Power%20of%20Python%20%5BCollette%20%26%20Falck%202012-09-18%5D.pdf~~
さくらのVPSでCentOS7にSSHの設定

新規の契約ではなく、以前から使っていた環境を一度潰して、再度セットアップした際の手順。なんどかやった作業なのに、今回も少々はまった。

#環境
- サーバは、さくらVPS 1Gプラン
- クライアントOSは、Windows10
- クライアントソフトはTera Term Version4.83

#CentOS7のインストール
1.さくらのVPSにログイン
<https://secure.sakura.ad.jp/vps/#/login?method=ip>
2.OSインストール

- サーバのモニタ画面の右上の「各種設定」から「OSインストール」を選択する。
- 「OSインストール」ポップアップから「標準OSインストール」を選択する。
- 「標準OSインストール」ポップアップから「インストールOS」で「CentOS7 x86_64」を選択する。
- 「OSインストール設定」で新しい管理ユーザのパスワードを設定する。
- 「インストールを実行」ボタンを押下する。

#一般ユーザの作成
1.Tera Termを使用してrootでログインする。
2.一般ユーザの作成

```shell-session:
#useradd workh
#passwd workh
New password:xxxxxxxx
Retype new password:xxxxxxxx
```

3.Tera Termからログアウト

#SSH鍵作成
1.Tera Termを起動、ログインでキャンセルする。
2.Tera Termのメニューバーで、「設定」->「SSH鍵作成」
3.「鍵生成ダイアログ」で鍵の種類:RSAを選択し、生成ボタン押下する。
4.「パスフレーズ」を入力する。
5.公開鍵の保存ボタンを押下して、公開鍵ファイルを保存する。
6.秘密鍵の保存ボタンを押下して、秘密鍵ファイルを保存する。

#公開鍵ファイルの設置
1.Tera Termにworkhでログインする。
2.Tera Termで公開鍵をアップロードする。（Tera Termのウィンドウ上に公開鍵ファイルをドラックする。）
3.公開鍵ファイルを設置する。

```shell-session:
$mkdir .ssh
$chmod 700 .ssh
$cat id_rsa.pub > .ssh/authorized_keys
$chmod 600 .ssh/authorized_keys
$rm -f id_rsa.pub
```

#ファイアウォールの設定
SSHの使用ポートを22番から他の番号へ変更する。
1.rootユーザに変わる。

```shell-session:
$su
```

2.SSHで使用するポートを開ける。

```shell-session:
#vim /etc/firewalld/services/ssh.xml
```

```xml:
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="nnnn"/> 
</service>
```

3.ファイアウォールを再起動する。(エラー発生!!)

```shell-session:
#systemctl restart firewalld
```

- 結果がよくわならないので、以下のコマンドで確認する。

```shell-session:
#systemctl status firewalld -l
ERROR: Failed to load service file '/etc/firewalld/services/ssh.xml':
```

エラーとなっている。原因不明。。。

#他の方法でファイアウォールの設定
SSHの使用ポートを22番から他の番号へ変更する。（nnnnは任意のポート番号）

```shell-session:
#firewall-cmd --add-port=nnnn/tcp --zone=public --permanent
success
```

成功したように見えるが、以下のコマンドで確認すると反映されていない。

```shell-session:
#firewall-cmd --list-all --zone=public
```

反映されていない原因、忘れてました。。。

```shell-session:
#firewall-cmd --reload
```

#SSHの設定を変更
SSHの設定を変更して、ルートのログイン、パスワード認証を禁止し、接続ポートを変更する。

```shell-session:
#vim /etc/ssh/sshd_config
```

- 元のsshd_config

```bash:
#Port 22
#PermitRootLogin yes
#PasswordAuthentication yes
```

- 設定変更後のsshd_config（nnnnは任意のポート番号）

```bash:
Port nnnn
PermitRootLogin no
PasswordAuthentication no
```

#設定内容の確認
1.Tera Termからポート番号22番で接続できないことを確認する。
2.Tera Termからポート番号nnnn番で接続できることを確認する。
3.rootユーザーでパスワードでログインできないことを確認する。
4.workh（追加した一般ユーザ）でパスワードでログインできないことを確認する。
5.workh（追加した一般ユーザ）でパスフレーズ、秘密鍵ファイルを使用して、ログインできることを確認する。

#忘れてた
システムのアップデートを忘れてました。

```shell-session:
#yum update
```

#参考にしたサイト
<https://eng-entrance.com/linux-centos-port>
<https://help.sakura.ad.jp/hc/ja/articles/206208161>
<https://qiita.com/KisaragiZin/items/970c386848bfc9f17afd>

#よくわかっていない
- ファイアウォールの設定
- マークダウンの書き方
Flow の autocomplete で import type した型が not enough type information to autocomplete となってしまうときの対処法

# 状況

Flowtype の autocomplete 機能で、外部ファイルで `export type` した型を `import type` しても型の情報が取得できず、`Error: not enough type information to autocomplete` となってしまう。

## 最小構成

```
.
├── .flowconfig
├── package.json
└── src
    ├── lib
    │   └── index.js
    └── types
        └── index.js
```

```:.flowconfig
[ignore]

[include]

[libs]

[lints]

[options]
```

```package.json
{
  "devDependencies": {
    "flow-bin": "^0.56.0"
  }
}
```

```src/lib/index.js
// @flow

import type { T } from '../types'

const t: T = {
  num: 1,
}

t.
```

```src/types/index.js
// @flow

export type T = {
  num: number,
}
```

## 再現手順

```shell-session
$ node_modules/.bin/flow autocomplete 9 3 < src/lib/index.js
Error: not enough type information to autocomplete
```

# 対処法

型を export しているファイルが import しているファイルと同階層にない場合、`flow autocomplete` の引数に、標準入力に加えてファイルパスを渡す必要があった。

```shell-session
$ node_modules/.bin/flow autocomplete src/lib/index.js 9 3 < src/lib/index.js
hasOwnProperty (prop: any) => boolean
isPrototypeOf (o: any) => boolean
num number
propertyIsEnumerable (prop: any) => boolean
toLocaleString () => string
toString () => string
valueOf () => Object
```

# 余談: なぜハマったのか

Vim の補完補助プラグインの 1 つである deoplete から flow を使おうとしていて、これを実現するプラグインがあった。

- [wokalski/autocomplete-flow](https://github.com/wokalski/autocomplete-flow)
- [steelsojka/deoplete-flow](https://github.com/steelsojka/deoplete-flow)

この 2 つのプラグインを試していたが、これらは `flow autocomplete` の引数にファイルパスを渡しておらず、上記の挙動により `import type` した型の補完が効かなくなっていた。
deoplete-flow は既にこの問題を修正する Pull Request が投げられている ([steelsojka/deoplete-flow#9](https://github.com/steelsojka/deoplete-flow/pull/9)) ので、この Pull Request が merge されるまでは Fork 先のブランチを利用すると良いだろう。
【勉強メモ】scaffoldを使う【挫折しない！】

##１．scaffoldは何をしてくれるのか？
###CRUDのページを自動生成してくれる。
・Create：新規作成
・Read：表示
・Update：更新
・Delete：削除

…これをいちいち手打ちにすることなく、自動的に作ってくれるらしい。

もしこれができたら、かなり便利。

##２．scaffoldのモデルをつくるためのコマンドを打つ

```
$ rails generate scaffold モデル名 カラム名1:データ型1 カラム名2:データ型 2 …
```

今回はuserモデルで、名前と年齢のカラムをつくってみた。

```
$ rails g scaffold user name:string age:integer
```

フォルダ内を確認するとこんな感じ

<img width="1280" alt="スクリーンショット 2017-10-10 22.23.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/205578/f5b4ec16-9ce6-af9e-2190-213642f89627.png">

すごいすごい、CRUDのviewやcontrollerやmodelまで生成されている。

これはすごい、scaffold最強！！

##３．マイグレーションファイルの反映（テーブルの作成？）
```
$ rails db:migrate
```

いつものやつね。

##４．サーバーを起動させてユーザーページの確認
```
$ rails s
```
以下のページにアクセスする。
http://localhost:3000/users

<img width="1280" alt="スクリーンショット 2017-10-10 22.29.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/205578/33d92bb5-a7aa-9ef4-e514-41061338e313.png">

うわ、できている。なにこれ、簡単www

###＜新規登録＞

<img width="325" alt="スクリーンショット 2017-10-10 22.30.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/205578/1f80061a-abd3-3128-a84c-b7e0e95a0e0e.png">

###＜表示＞
<img width="304" alt="スクリーンショット 2017-10-10 22.31.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/205578/2ad7f0c6-9a73-0014-e384-f9bc66230eaa.png">

###＜編集＞
<img width="351" alt="スクリーンショット 2017-10-10 22.42.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/205578/6c245d1f-6a69-b600-ad0e-9457fffdff3b.png">

###＜削除＞
<img width="894" alt="スクリーンショット 2017-10-10 22.32.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/205578/b70c14f3-1f9f-52d6-f58b-6f4887f12202.png">


削除にいたってはちゃんと「削除しますか？」の確認画面が出てくる！！！！

scaffold、凄い。

凄いけど、これを使ったら自分の手でCRUDを組み立てられなくなりそう。

#参考
最初に覚えておきたい！Ruby on RailsのCRUDの使い方
https://techacademy.jp/magazine/7735

超便利！Ruby on Railsのscaffoldの使い方
https://techacademy.jp/magazine/7204
CUDAによる素数リスト生成プログラム

#環境
CUDA　9.0
NVIDIA GeForce GTX960
core i7 5820K
DDR4 32Gbyte

#総当り計算法
##CUDAで総当り計算法を実装
まずは1から引数指定の数まで、順に除算して素数判定する方法で実装する。
https://github.com/jun6231jp/math/blob/master/prime_cuda.cu

```text:ビルド
nvcc -m64 prime_cuda.cu -o prime_cuda.exe -O3
```

###説明
一度の計算で、unsigned long long int型で1024x1024x16x8個分の領域をグラフィックボード側のメモリ空間に用意。
スレッドごとに自スレッドの番号が素数かどうかを判定する。
1サイクルで各スレッドは1つの数の素数判定をすることになる。
引数で指定した数に達するまで1サイクル1024x1024x16x8個の計算を繰り返す。

###実行例
500000000までの範囲で素数判定を行う。
1024x1024x16x8の倍数で500000000を超える最小数まで計算される。
この場合は0から536870911までとなる。
素数リストはprime_num.txtに書き込まれる。

```text
./prime_cuda.exe 500000000

Range : 0 - 134217727
Processing time: 21444.285156 (msec)
Memory copy time: 175.316101 (msec)
Now Writing...
Range : 134217728 - 268435455
Processing time: 38330.570312 (msec)
Memory copy time: 174.686310 (msec)
Now Writing...
Range : 268435456 - 402653183
Processing time: 48694.289062 (msec)
Memory copy time: 174.285660 (msec)
Now Writing...
Range : 402653184 - 536870911
Processing time: 58622.562500 (msec)
Memory copy time: 174.144485 (msec)
Now Writing...
```

```text:素数リスト
2
3
5
7
...
(略)
...
536870849
536870869
536870879
536870909
```

###実行時間

下図のように4200000000を超えたあたりで計算時間が増加している。
これはint(32bit)とlong long int(64bit)の境界と考えられる。
64bitでビルドしているが、アーキテクチャは32bitであることがわかる。

![prime.png](https://qiita-image-store.s3.amazonaws.com/0/152991/5a4049c5-d5fd-b279-47e8-a3c230082588.png)

##Cで総当り計算法を実装
prime_cuda.cuと同じ方法で素数リストを作成する。
openMPを用いて、マルチスレッド処理を行う。
https://github.com/jun6231jp/math/blob/master/prime_openmp.c

```text:ビルド
gcc -fopenmp prime_openmp.c -o prime_openmp.out -std=c99 -O3 -lm
```

##CUDAとCの実行時間を比較
1から134217728(CUDAでの計算の1サイクル)までの範囲の計算時間を比較する。
CUDA(GPU)：21秒
C(CPU)：10分程度

CUDAでの演算の方が速い。
openMPとCUDAとの並列度の差が表れている。

#エラトステネスの篩
##CUDAでエラトステネスの篩を実装
https://github.com/jun6231jp/math/blob/master/prime_cuda_eratosthenes.cu

```text:実行結果
Range : 0 - 134217728
Processing time: 2741.332764 (msec)
Memory copy time: 41.863617 (msec)
```
計算時間は2.7秒程度。

##Cでエラトステネスの篩を実装
Cでエラトステネスの篩を実装する。
ここでもopenMPを使う。
https://github.com/jun6231jp/math/blob/master/prime_eratosthenes.c

同じく134217728までの範囲で実行時間は1秒程度。

##CUDAとCの実行時間を比較
1から134217728までの範囲での計算時間を比較する。
CUDA(GPU)：2.7秒
C(CPU)：1秒

Cでの演算の方が速い。
エラトステネスの篩は並列度の効果が薄くなる。
そのためコア単体の性能が大きく影響していると考えられる。
気を付けろ！Build Phasesで迂闊に検索したら落ちるぞ！


#1.ターゲットの設定でBuild Phasesを開きます。
![スクリーンショット 2017-10-10 22.34.42.png](https://qiita-image-store.s3.amazonaws.com/0/152335/09c1e0ba-3d8c-8508-a61b-7027c8361f18.png "スクリーンショット 2017-10-10 22.34.42.png")

#2.Filterの入力欄にスペース入りの文字列を入れます
ここは何でも良い(「a a」とか)

#3.Xcodeが落ちます。
Xcode9だけかと思いきや、Xcode8系でも落ちます。
ちなみにコピペで貼り付けても落ちます。

#結論
Build Phasesで検索をかける時は気をつけよう。
go build のコンパイル対象

## コンパイル対象
- 使われる(importされる)子だけコンパイルされる

## ディレクトリ構成確認
```
$ tree
sample.com
├── config
│   └── config.yaml #外部ファイル
├── imports
│   └── import.go   #main.goでimportされる子
├── main.go
├── foo
│   └── foo.go      #使われない子
└── hoge.go         #使われない子
```

```go:main.go
package main

import (
	"fmt"

	"sample.com/imports"
)

func main() {
	fmt.Print("main::main()\n")
	imports.Import()
}
```

## バイナリファイルの中身を確認
```shell
# hoge.go/foo.goがいない
$ docker-compose exec golang strings compiled | grep "sample.com"
sample.com/imports.Import
sample.com/imports.init
/go/src/sample.com/main.go
/go/src/sample.com/imports/import.go
/go/src/sample.com/imports/import.go
/go/src/sample.com/main.go
sample.com/imports.statictmp_0
sample.com/imports.initdone
/go/src/sample.com
sample.com/imports.Import
sample.com/imports.init
sample.com/imports.statictmp_0
sample.com/imports.initdone
sample.com/imports.statictmp_0
sample.com/imports.initdone.
sample.com/imports.Import
sample.com/imports.init
```
SRE本まとめ（17章 信頼性のためのテスト）

自分の理解を深めるためにまとめてみました。[16章](https://qiita.com/bassbone/items/2293952d1ec384c4df38)の続きです。

## 17章 信頼性のためのテスト

### テストの種類

- ユニットテスト
    - 最も小規模なテスト。
- 結合テスト
    - 組み上げられたコンポーネントのテスト。依存性注入が使われる。
- システムテスト
    - リリース前の最大規模のテスト。内訳として、スモークテスト、パフォーマンステスト、回帰テストがある。
- 設定テスト
- ストレステスト
    - 目一杯負荷をかけて挙動を確認する。
- カナリアテスト
    - 複数あるサーバのうち一部だけ新バージョンに切り替えて、動作確認を行う。

### テストの作成と環境の構築
もし途中からプロジェクトに参画した場合は、最大のインパクトで最小の労力で生み出せるようなテストからはじめる。明らかに壊れているソフトウェアをリリースすることは開発者にとって最も重大な罪である。

テストの文化を確立する方法

- 発生したバグに対してテストケースを作っていく。
- テスト用のインフラを構築する。
    - ソースコード管理システム
    - 継続的ビルドの仕組み

### 大規模なテスト
#### スケーラブルなツールのテスト

#### ディザスタのテスト

（[18章](https://qiita.com/bassbone/items/d59cc01c8ddf2743e599)に続く）
mysqlで文字列を数値に変換して比較する

wordpressなどで金額をvarcharのカラムに`20,000円`という形で入れていた。
普通にmin()やmax()を使っていたら全く比較できていなかったのでまとめました。


##データ

| id | fee |
| --- | --- |
| 1 | 10,000円 |
| 2 | 20,000円 |
| 3 | 30,000円 |
| 4 | 5,000円 |

##ダメな例

```.sql:sql
SELECT
	min(fee),  // => 10,000円 
	max(fee)   // => 5,000円
  FROM posts
```

単純に文字列として比較されている為、 正常に集計できていなかった。

##良い例

```.sql:sql
SELECT
	min(abs(REPLACE(fee, ",", ""))) AS min_fee,  // => 5000 
	max(abs(REPLACE(fee, ",", ""))) AS max_fee   // => 30000
  FROM posts
```

置換でカンマを消してから abs()で絶対値を取得して、 min() max()をかけたらうまくいきました。
※カンマを消さないでabs()をかけるとカンマの前までしか絶対値を取得できないです。

また、データをもとの形(10,000円)で取り出したい時はこんな感じで書きました。

```sql:sql
SELECT
	concat(format(min(abs(REPLACE(fee, ",", ""))), 0), "円") AS min_fee,  // => 5,000円
	concat(format(max(abs(REPLACE(fee, ",", ""))), 0), "円") AS max_fee   // => 30,000円
  FROM posts
```

format()で3桁ごとに小数点を加えて、 concat()で`円`を結合させて表示しました。


##まとめ

基本的には数値は数値型のカラムに入れるべき。
文字列型に入れてしまった時は、数値に直して比較する。
ViewModelがModelを生成するのは良くないと思う件

# ModelをViewModelが作成するべきか?
時々見かけるMVVMコードのサンプルで, ↓のようなものがあります.

```csharp:MyViewModel.cs

public MyViewModel
{

    MyModel _Model;
    
    public MyViewModel()
    {
       // モデルのインスタンスを生成
       _Model = new MyModel();
    }
}

```
ただ, 自分的には違和感ありあり...

## 何が(自分的に)おかしいと感じるか
**「ViewModelってModelの影な筈なのに, なんでModelがViewに依存しとんねん...」**

## どのような場合に問題か
異なるModel同士でやりとりしたい場合, Modelを参照するためにViewModelを作ることになります

![MVVM.png](https://qiita-image-store.s3.amazonaws.com/0/139940/d79e6d22-fd6c-64c3-2f20-76a59a9eade0.png)


**→なんでModelがViewModelに依存してるねーん**



また, 例えば, バックグラウンド(=Viewが無いときに)実行するためにはWindow(=View)を作らなければなくなります.


![MVVM2.png](https://qiita-image-store.s3.amazonaws.com/0/139940/57fdd2e9-8986-59b5-a695-bdcf39296c5f.png)


**→なんでModelが(ry**

## どうするか
自分が良くやるのがSingletonクラスにModelをもたせる方法

```csharp:Workspace.cs(Model層)

public Workspace : Singleton
{
    public static Workspace Instance
    {
         ....
    }
    public Model MyModel {get; private set;} = new MyModel();
}

```

```csharp:MyViewModel.cs

public class MyViewModel
{

     MyModel _Model;

     public MyViewModel()
     {
          _Model = Workspace.Instance.Model;
     }
}

```

もちろんVisualStudioなどのIDE上では, プロジェクトファイル(ソリューションンファイル)ごとに関心のあるWorkspaceを作るなど, Modelを正しく分割する工夫は必要です.

## ViewがModelを作っても問題ない場合
シリアライズする気も他Modelとの連携もなく, Windowが出ている時だけ編集したいデータ(Viewの寿命とほぼ同じ寿命のModel)ならあまり問題ない気がします.
反論・反例あればご意見頂ければ幸いです.
onsen ui + angular2 pushPage is already runningの解決

# 問題
 - 初期表示のタイミングで、 `ngOnInit` に更に次のページへ遷移させる( `resetToPage` )記述をした。
 - `Uncaught (in promise) pushPage is already running` が発生した

# 問題コード
```ts
@Component({
  selector: "ons-page",
  template: require("./main.html"),
  styles: [require("./main.css")],
})

export class Main {

  constructor(private _navigator: OnsNavigator) {
  }

  ngOnInit() {
    if (isLogin()) {
      this._navigator.element.resetToPage(nextPage);
      return;
    }
  }
}
```

# 調査
 - 色々調べたけど、なんか良い解決方法がない。

# 解決
```ts
@Component({
  selector: "ons-page",
  template: require("./main.html"),
  styles: [require("./main.css")],
})

export class Main {

  constructor(private _navigator: OnsNavigator) {
  }

  ngOnInit() {
    if (isLogin()) {
      this.throughPage();
      return;
    }
  }

  private throughPage() {
    if(ons.isReady()) {
      this.goToNextPage();
      return;
    }

    ons.ready(() => this.goToNextPage());
  };

  private goToNextPage() {
    this._navigator.element.resetToPage(nextPage)
      .catch((reason) => {
        // pushPage is already running. の状態の時にリトライさせる
        this.goToNextPage();
      });
  }
}
```

# 参考
 - https://ja.onsen.io/v1/reference/ons.html
 - https://ja.onsen.io/v2/guide/faq.html <- ここに解決が書いてあったんだけど、見つけるのにものすごく時間かかった

# 感想
　- `Promise` すげえええ。
　- リファレンスわかりづらいというか、onsen ui 辛い
かんたんなpeco

今までpeco を使う時は、ネットに落ちてる設定をてきとーに使っていた。
「pecoで色々やりたいけど、どうせ難しいんだろうなあ」と思っていた。

だけど本当に簡単だった。

---

# pecoとは

標準入力を受け取って、選んで、標準出力を返すもの。ただそれだけ。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/752aa055-ecd6-e865-1ef0-1f8cd489f5db.png)

---

## 選ぶところだけがpeco。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/376cb86f-36ce-e7db-03b8-b9f3e00a4184.png)

---


# つまり

あとの受け渡しは自由にすればいい。
標準入力と標準出力を工夫するだけで、色々なことが出来る。


---

# 一番簡単な例

---

## 改行で区切ったテキストを

```echo
$ echo -e "a\nb\nc"
a
b
c
```

---

## pecoに与えてみると

```echo
$ echo -e "a\nb\nc" | peco
```

---

選べる！


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cf3f7d03-3c6e-8c50-0b0e-0f6c39ccd813.png)

---

## 選んだテキストが標準出力される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0f04c72e-f3ac-8989-3199-d90d8da2a3ff.png)

---

## これだけ！

---

# あとは好きなことをすれば良い

---

## sed で置換してみる例 (特に意味はない)

```
echo -e "a\nb\nc" | peco | sed 's/b/Baked Cheese/g'
```

---

## クリップボードにコピーする例 (Macの場合)

```
echo -e "a\nb\nc" | peco | pbcopy
```

---

# 自由だ！

---


# 問題

だけど、標準入力をパイプで受け取ってくれないコマンドの場合、
どうやってpecoで選んだ結果を渡せば良いんだろう。

---

シェルがよく分かっていないが、何らかの変数で渡せるんだろうか。

(イメージ)

```
echo -e "a\nb\nc" | peco | echo $SELECTED
```

---

# 解答

---

逆にする。

pecoの結果をパイプで他のコマンドに渡すのではなく、
他のコマンドに渡す中身として、サブコマンド内でpecoを使ってやる。


---

## echo に渡す例 (特に意味はない)

pecoのデフォルトの挙動と変わらないが、自分でechoするならこんな感じ。

```
echo $(echo -e "a\n\b\c" | peco)
```

---

最初は不思議に思ったが、シェルの仕様としてサブコマンドの方を先に実行するので、pecoでいったん実行が「止まって」、選べるモードに入るっぽい。(よく出来てる)

---

## ls に渡す例

好きなディレクトリを選ぶ。

```
ls $(echo -e "./\n../\n/" | peco)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8551fd0e-383f-a921-5ff5-57ee451e79cd.png)

---

## ls に渡す例

(シェルの仕様なのでpecoとは直接関係ないが)

`ls` / `ls -la`  とか、オプションの部分を切り替えて与えられたりもする。

```
ls $(echo "-la\n" | peco)
```

---

# 使いやすくする

シェルのエイリアス登録したり、ショートカットキーに登録したりすれば良い。

---

# 自分で作ってみた

(どこかに同じようなものが落ちてるだろうけど)

- [Mac | peco でシェルのコマンド履歴からクリップボードにコピーする - Qiita](https://qiita.com/YumaInaura/items/ecf865fc2a303ba68967)
- [Git | peco で最近使ったローカルブランチにチェックアウトする - Qiita](https://qiita.com/YumaInaura/items/fc3afdb6ad4c78d5bcc5)

---

# 問題

pecoを何度も連続的に実行するには？
( pecoで選ぶ => 実行結果 => 別のものをpecoで選ぶ => 実行結果、みたいな)

---

## 解答

シェルスクリプトの中でpecoを回せば良い。

### 例

```bash:some.sh
while true; do
  echo -e "a\nb\nc" | peco
  read Wait
done
```


---

## 作ってみたやつ

業務的にニッチなやつ。

[Bigquery | peco で連続してジョブ詳細を見るシェルスクリプト - Qiita](https://qiita.com/YumaInaura/items/09a2c7d1494b0dd51212)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Cocos2d-xでSQLite3を使うための準備

MacOS:10.13

#手順 

1. 以下のサイトからダウンロード（画像は2017.10.10)
https://www.sqlite.org

![スクリーンショット 2017-10-10 21.20.54.png](https://qiita-image-store.s3.amazonaws.com/0/206539/c17bf648-6cdf-bc7f-8576-8feb24962e9c.png)

2.以下のファイルをClassesフォルダ配下におく
　- sqlite3.c
　- sqlite3.h
　- sqlite3ext.h

![スクリーンショット 2017-10-10 21.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/206539/905e4e85-aac7-7c99-c8f8-a0e4cc8d85ee.png)
Processingで顔認識openCVを使う。

#processingでopenCVを使う。

processingで顔認識を行うにはopenCVのライブラリを使うのが簡単でした。openframeWorksで顔認識を行う場合はxml形式の学習データが必要だったのですが、Processingでは必要ないのかな？

openCVをProcessingで利用するためには、こちらのページを参考にさせてもらいました。
[リンク]http://r-dimension.xsrv.jp/classes_j/opencv-for-processing/


```java
import gab.opencv.*;
import java.awt.Rectangle;
import processing.video.*;

Capture video;
OpenCV opencv;
Rectangle[] faces;

void setup() {
  size(1280, 680);
  background(0);
  video =new Capture(this, width/2, height/2);
  opencv=new OpenCV(this, width/2, height/2);
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
  video.start();
}

void draw() {
  scale(2);
  opencv.loadImage(video);
  pushMatrix();
  scale(-1, 1);
  image(video, -width/2, 0);
  popMatrix();

  Rectangle[] faces =opencv.detect();
  opencv.loadImage(video);
  strokeWeight(3);
  stroke(255, 255);
  fill(255,0,0, 127);
  strokeWeight(3);

  for ( int i = 0; i <faces.length; i ++) {
    pushMatrix();
    scale(-1, 1);
    translate(-width/2, 0);
    noFill();
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
    popMatrix();
  }
}



void captureEvent(Capture c) {
  c.read();
}
````
今まで作ってきたFlashAir向け開発支援ツールの紹介

#今まで作ってきたFlashAir向け開発・検証ツールの紹介
Qiitaにいる電子工作ユーザー向けの宣伝を兼ねた何か

#Q. FlashAirってSDカードですよね？
A. 確かに

+ 汎用IOポート付きマイコンとして使え
+ 大容量ストレージ搭載のマイコンとして使え
+ 無線LAN機能を搭載し
+ そこそこ高速なWebサーバー、WebDAVサーバーを内蔵し
+ Webサーバーに搭載された機能から、SDカード領域やIOポートにアクセスし
+ Luaで作成したスクリプトが動作し
+ LuaスクリプトはスタンドアロンでもCGIとしても動作し、
+ SDカードの書き込みに連動した動作もし、
+ ビルトイン関数でFTPアップロードやHTTPSリクエスト、メール送信などの機能を揃え
+ I2CやSPIやUARTの通信機能も内蔵した

**SDカードです**

#FlashTools Lua Editor
FlashAirは、Luaスクリプトをテキストファイルとして、ポンと置くだけで動作します。

**が**、
Q. エラーメッセージはどこに出るん？
A.**でません**

Q. 文法エラーのときは？
A. **黙って落ちます**

というのが流石につらすぎるので、文法エラーや実行時エラーを確認でき、
またそのまま編集&修正&再実行までできるエディタを作りました。

FlashAirのWebサーバー機能を利用し、ブラウザ完結で動作するので、
FlashAir上に書き込んだあとはWi-Fi接続してブラウザを開くだけでOKです。
FlashAirの色々面倒な設定も自動セットアップする機能がついてます。
無限ループのスクリプトも途中で止めたりできるようになっています。(条件がありますが)
スマホ対応なので、スマホでも動きます。

導入マニュアルはこちら
http://seesaawiki.jp/flashair-dev/d/Lua%3a%b3%ab%c8%af%a4%ce%c1%b0%a4%cb...

<img src="http://image02.seesaawiki.jp/f/v/flashair-dev/deb18d1585500b62.gif" width=100%>

最近ファイラーも搭載しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/191114/52174f09-0c67-f6e7-5977-0cb44d145c4e.png">

#FlashTools GPIO Tester & Checker
FlashAirのIOポートに繋いだ機器の動作確認とかしたいとき、プログラム組んで云々は面倒くさい。
ので、スマホでポチポチHigh出したりLow出したり、入力チェックしたりできるツール作りました。

こちらもブラウザ完結です。
https://sites.google.com/site/gpsnmeajp/tools/flashair-io-tester

<img src="https://qiita-image-store.s3.amazonaws.com/0/191114/26916eb9-89a9-6ccd-e135-9a7bf045cc93.png" width=50%>

#FlashAir Unofficial Configurator
FlashAirの設定ファイルって、公式設定ツール以外にもいろいろな設定があります。
が、それを書くのが面倒なので、全部一気にできるツールを作りました。

が、ちょっと古いツールなので、最近追加された項目には対応していません。ご了承ください。
https://sites.google.com/site/gpsnmeajp/tools/flashair-unofficial-configurator

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191114/fe35d737-70a7-ec82-2d69-5a6c5f9461b1.png)

#FIH_Setup
[FlashAir IoT Hub](https://flashair-developers.com/ja/)という、IoT機器開発用のサービスが有るのですが、そのためには
ちょっと設定ファイルを書き換える必要があり、面倒そうだったのでそれ用の設定ツールを作成しました。

他にも、IoT Hub用のArduino向けサンプルなどがあります。
http://seesaawiki.jp/flashair-dev/d/IoTHub%b4%d8%cf%a2%a5%c4%a1%bc%a5%eb

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191114/de542728-b094-3452-af16-28264da86966.png)

#FlashTools Minimal Shell v0.01 beta
FlashAiw W-04のアップデートにより、シリアル通信機能が追加されました。
ので、シェルっぽいものを作ってみよう、と思い立って作ったのがこれです。

FlashAirをスタンドアロンで使うときや、自動アップロードスクリプトの開発中などは、
Wi-Fiが切断されたり使えなかったりするため、ブラウザ上からのデバッグは困難になります。

シリアルポートが使えるようになったのでそこからの通信ができるようになりましたが、
そこを開発するのも面倒かと思います。ので実装しました。

本ツールは、基本的な機能のみの実装になっていますが、Luaスクリプトで簡単に拡張できるのが売りです。
既存のスクリプトの実行もサポートしています。

http://gpsnmeajp.sblo.jp/article/181220245.html
<img src="http://sabowl.sakura.ne.jp/sblo_files/gpsnmeajp/image/FTMS.gif">

#FlashTools Serial Terminal v0.01
ブラウザからシリアルポート叩いてみようぜ！ということで。
一種のデモです。ブラウザからWi-Fiを経由してFlashAirのシリアルポートに繋がった機器と通信ができます。
無駄にArduino IDEのシリアルモニタ風です。
例によって、スマホからでも動きます。

仕様上、高速な通信をさせようとすると取りこぼしたりしますが、こういうこともできますよということで。
実はCGI機能を使用しておらず、起動時実行のLuaスクリプトとは共有メモリ機能を使って通信しています。

http://gpsnmeajp.sblo.jp/article/181245639.html
<img src="http://sabowl.sakura.ne.jp/sblo_files/gpsnmeajp/image/FTST.gif">

#他にも色々あります
スクリプトのサンプルや、開発時のハマりポイントなど

[FlashAir開発者向け非公式wiki](http://seesaawiki.jp/flashair-dev/)
http://seesaawiki.jp/flashair-dev/

をご参照ください。
超速で非同期処理のキャンセルを組み込む with Rx

[ng-japan meetup 2017 Autumn](https://ngjapan.connpass.com/event/65841/) (2017年10月10日)

LT発表資料

---

名前: ちきさん
所属: オプト
GitHub/Twitter/Qiita: @ovrmrw

We are hiring! :two_men_holding_hands::two_women_holding_hands:

---

JSBin

https://jsbin.com/vevukev/3/edit?js,console

StackBlitz

https://stackblitz.com/edit/angular-wjrath

---

### よくありそうなユーザーストーリー

---

引数valueを受けて、非同期処理をした後に処理結果をObservable型で返す関数があったとして、

```js
function httpRequest$(value) {
  const promise = new Promise(resolve => {
    setTimeout(() => {
      resolve(value + '!') // valueに "!" を付けて返す
    }, Math.random() * 200) // timeoutはランダムで変わる
  })
  return Observable.from(promise)
}
```

---

subscribeしてその処理結果を使って何かしたいとする。

```js
function log(result) {
  console.log(result) // ここではコンソールに出力しているだけ
}
```

---

例えばキーワードが入力される度にHTTPリクエストが走る入力フォームがあったとして、

```js
httpRequest$('a').subscribe(log)
httpRequest$('ab').subscribe(log)
httpRequest$('abc').subscribe(log)
```

---

レスポンスは毎回同じ順番で来るとは限らないので、

```js
"ab!"
"a!"
"abc!"
```

こうなったり

```js
"abc!"
"ab!"
"a!"
```

こうなったりする。

---

でもこのときに欲しい結果は `"abc!"` だけだったりします。

今回はそういうケースでどうすればさくっと解決できるのか、というお話。

---

### Subject と switchMap

---

前述のユーザーストーリーでは、要するに最後のリクエストより前のリクエスト(非同期処理)はキャンセルしてしまえば良いので、

---

まずSubjectを用意する。

```js
const dispatcher$ = new Subject()
const provider$ = new Subject()
```

それぞれの役目

- `dispatcher` ... ストリームに引数valueを流す
- `provider` ... 別のストリームに処理後の値を流す

---

`dispatcher`から始まるストリームでは`switchMap`で後続の非同期処理をキャンセルしつつ、処理結果を`provider`のストリームに流す。

```js
// Serviceのconstructorとかで
Observable
  .from(dispatcher$)
  .switchMap(value => {
    return httpRequest$(value) // 非同期処理をswitchMapの中に持ってくる
  })
  .subscribe(result => {
    provider$.next(result)
  })
```

そして`provider`を`subscribe`して何らかの処理をする。

```js
// Serviceのどこかで
provider$
  .subscribe(log)
```

---

先ほどは↓こうだったリクエストの発行が、

```js
httpRequest$('a').subscribe(log)
httpRequest$('ab').subscribe(log)
httpRequest$('abc').subscribe(log)
```

↓このように変わるだけ。

```js
dispatcher$.next('A')
dispatcher$.next('AB')
dispatcher$.next('ABC')
```

---

先ほどは↓こうだったレスポンスが、

```js
"abc!"
"a!"
"ab!"
```

↓このように変わる。

```js
"ABC!"
```

(`"A!"`と`"AB!"`は非同期処理がキャンセルされたので出力もされない)

---

そんなに手間をかけずに非同期処理キャンセルの仕組みが作れました。

カ:tada:ン:tada:タ:tada:ン:tada:だ

JSBinで実際の動きを確認できます。 https://jsbin.com/vevukev/3/edit?js,console

StackBlitzで実際に組み込んだAngularアプリを編集できます。 https://stackblitz.com/edit/angular-wjrath

---

#### Thanks :raised_hands_tone2:
navigationbar にボタンを置く方法と、独自画像で置く方法


#経緯
navigationbar　に独自画像で作ったボタンを置きたかったのですが、
やり方を見つけるのに時間がかかったのでメモしておきます。

#サンプルコード
```
// 標準のrefreshボタンを設定する方法
let refleshButtonItem = UIBarButtonItem(
    barButtonSystemItem: UIBarButtonSystemItem.refresh,
    target: self,
    action: "onClickNavBarRefleshButton"
)

//独自画像でボタンを設定する方法
let imageButtonItem = UIBarButtonItem(
    image: UIImage(named: "image.png")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal),
    style: UIBarButtonItemStyle.plain,
    target:self,
    action: "onClickNavBarImageButton"
)

self.navigationItem.rightBarButtonItems = [refleshButtonItem,imageButtonItem]
```
ファイル wp-config.php に書き込めませんでした。

# エラー内容
ファイル wp-config.php に書き込めませんでした。 手動で wp-config.php を作成し、中に次のテキストを貼り付けることができます。

## 環境
NginxとPHP5を組み合わせて使っています。
AmazonLinux


## 原因
公開しているフォルダに実行しているユーザの権限がなかった。

## 対処
私の公開しているフォルダの権限を以下に設定する。
nginxユーザに権限をつける

`chown -R nginx:nginx /var/www/html`

PHPの実行ユーザを変更する。

```php:/etc/php-fpm.d/www.conf
user = nginx
group = nginx
```

PHPとNginxのリスタート

```
sudo service nginx restart
sudo service php-fpm restart
```

再度実行する
sakura editorのgrepでコメント行を除外する【vb限定】


編集前をコメントアウトで残すルールがある現場では
grepにコメントアウトされた古いコードが大量に引っかかって邪魔。

# 対策
sakura editor のgrepで
検索語句の前に`^(?!.*?').*?`を付ける

例:new York()を含むファイルを検索

```
^(?!.*?').*?new York¥(¥)
```

※正規表現を有効にしてください

コメント行は検索結果に出ていない筈。
Rails Tutorial 第一章　簡易まとめ 

Rails Tutorial 第一章
https://railstutorial.jp/chapters/beginning?version=5.1#fig-share_workspace

１.Rails をワークスペースにインストール
```$ gem install rails -v 5.1.2
```
2.Rails newコマンドでアプリケーションの作成
```$ rails _5.1.2_ new hello_app
```
3.デフォルトGemを書き換え、その後bundle install

```

source 'https://rubygems.org'

gem 'rails',        '5.1.2'
gem 'sqlite3',      '1.3.13'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.6.4'

group :development, :test do
  gem 'byebug', '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.0.8'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

# Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

```

cdコマンドでルートディレクタに移動し
```
$ bundle update  → $ bundle install
```
4.サーバーを立ち上げる
別のターミナルを用意しルートディレクタ移動
```
$ rails server -b $IP -p $PORT
```

5.git に追加コミット

ルートディレクタに移動し
```
$ git init```
```$ git add -a #ステージングエリアに追加```
```$ git status  #確認する事```
```$ git commit -m"ここにやった内容のコメント"```

6.Bitbucketのレポジトリと連携させる
Bitbucketに新しいレポジトリ作成名前を付ける。
それを選択、既存のアイテム??(忘れた)をクリック、出される指示に従う。

7.Branch機能

ブランチとは・・・リポジトリのコピー。元のファイルを触らずにコードの書き換えや試作ができる

```
$ git checkout -b modify-README
Switched to a new branch 'modify-README'
$ git branch
  master
* modify-README
 ```



maseter=親ブランチ
modify-README= checkoutコマンドと-bフラグによって作られた子ブランチ
* = 現在扱っているブランチを表す

一つ目のコードで子ブランチ生成、切り替えを同時に行っている
二つ目のコードでローカルブランチを一覧表示

・子ブランチを編集してみる
折角なのでREADME.mdファイルを書き換え、Gitでコミット

```
$ git status
On branch modify-README
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

$ git commit -a -m "Improve the README file"
[modify-README 9dc4f64] Improve the README file
 1 file changed, 5 insertions(+), 22 deletions(-)
```

・Merge(合体する)
ファイルの変更が終わったので、masterブランチにこの変更をマージ (merge) します。

```
$ git checkout master
Switched to branch 'master'
$ git merge modify-README
Updating af72946..9dc4f64
Fast-forward
 README.md | 27 +++++----------------------
 1 file changed, 5 insertions(+), 22 deletions(-)
```

変更をマージした後は、git branch -dを実行してトピックブランチを削除すれば終わりです。

```
$ git branch -d modify-README
Deleted branch modify-README (was 9dc4f64).
```

・Push 

READMEファイルの更新が終わったので、Bitbucketに変更をプッシュして結果を見てみましょう。既に1.4.3で一度プッシュを行ったので、大抵のシステムではgit pushを実行するときにorigin masterを省略できます。

```
$ git push
```
デリゲートを自作する

最近まで、自作デリゲートの使い方がいまいちイメージできていませんでしたが、少しずつ理解できてきましたので、デリゲートについて備忘録を残します。
###デリゲートを自作で用意
MVCモデルでのクラス分けを勉強するうちに、「他のクラスへの完了通知」みたいなものが必要な場面が出てきたので、その際にデリゲートを使ってみました。

結論から言うと、
**「特定のタイミングで、あるクラスのメソッドから別のクラスのメソッドを呼びたいとき」**
に使うと便利でした。
任意のタイミングで必要メソッドを呼ぶことができるため、便利だと素直に思いました。

###知らなくて困ったこと
具体的に、以下の場面で困りました。

**Modelクラスで、データを保存した後などにControllerクラスのテーブルビューのreloadメソッドを呼べなかった。**

そこで、デリゲートを作り、任意のタイミングで他クラス（Controllerクラス）のreloadメソッドを呼んでみた。

####実際の使用例

```
/// デリゲートオブジェクト、メソッドの作成
/// DataModel.h
@protocol DataModelDelegate <NSObject>
- (void)loadData;
@end
```


```
/// 他クラスから呼び出したい処理内容を用意
/// ViewController.h
- (void)loadData {
   [self.tableView reloadData];
}
```
####その他必要な用意
処理内容を記載するクラスに

```
<DataModelDelegate>
```
を準拠し、

```
DataModel *dataModel = [[DataModel alloc] init];
dataModel.delegate = self;
```

としておく。

###まとめ
自作デリゲートの使用に関する知識はまだまだ少ないので、また別の機会に記事にしようと思います。
MariaDBからSQL Serverを直接参照するテーブルを作成

## 概要
Windows上のMariaDBからSQL Serverを直接参照するテーブルを作成します。Accessのリンクテーブル。
Connect Storageという機能を利用します。

## 経緯
社内データの保管に、以下の理由でSQL Serverを利用していました。

* ODBCを設定せずにExcelから参照できる。
* Windows認証を利用できるので、アプリで認証を考慮する必要がない。

後者に関しては、エラー時の対応等、逆にややこしくなりそうでメリットにならないと判断。ただ、前者を利用した、簡易BIとしてのExcelピボットテーブルファイルが利用されているため、うまく対応する必要がありました。

将来性を考えると、10GBに制限されるSQL Server Express Editionは避けたいところ。そこで、まずMariaDBサーバを立ててSQL Serverのデータを参照する形で運用を開始することにしました。

MariaDBには、異種データベースを参照するConnect Storage Engineという機能があることが分かり、これを利用して実装しました。

## 前提
* OS: Windows Server 2008 R2
* Maria DB: 10.2.9
* SQL Server: SQL Server 2008 R2　Express Edition
  - データベース名: DBTEST
  - DBユーザー名: USERTEST, パスワード: PASSTEST
  - テーブル名: TABLETEST

## 手順
1. 管理ツールの「データソース(ODBC)」にて、SQL ServerへのDSNを登録(DSN名を「SQLSVR」とする)
1. MariaDBにmysqlクライアントで接続し、以下のコマンドでConnect Storage Engineを有効化する。  

    ```sql
    INSTALL SONAME 'ha_connect'
    ```

1. 以下のコマンドでConnect Storage Engine経由での参照を利用したテーブルエントリを作成する。  

    ```sql
    CREATE TABLE TABLETEST ENGINE=CONNECT DEFAULT CHARSET=cp932 TABLE_TYPE=ODBC CONNECTION='DSN=SQLSVR;UID=USERTEST;PWD=PASSTEST';
    ```

## 問題点
上記手順だと、該当のデータベースの一覧(show tables)まではできるが、内容を取得(select * from ...)できない。
SELECTしか必要ない場合においても、全データベースに対する全操作の権限(grant all on *.*)を与えないと値を取得できない。
MariaDBをHubとして各テーブルを見に行くような運用も考えたが、本格的な運用に採用するのは厳しいかもしれない。
Vagrant+AnsibleでWindows8.1上にCentOS7.3をサクッと建てる



## 前提環境
・Windows8.1 64bit
・Vagrant 最新版
・Virtualbox 最新版
・GitHub Desktop for Windows(64bit) 最新版
（Teraterm 最新版はインストール推奨）


## 環境構築手順

1. Vagrantをインストールする
	https://www.vagrantup.com/downloads.html

2. Virtualboxをインストールする
	https://www.virtualbox.org/

3. CentOSをVirtualboxにインストールする ※やや時間がかかる場合があるので、手順4,5を並行して実施することをおすすめします
	- Powershellを管理者権限で起動
	- コマンドを実行

	```bat:Powrtshell(管理者)
> vagrant box add CentOS73 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.3/vagrant-centos-7.3.box
	```

4. GitHubアカウントを作成する
	- アカウント作成方法は以下を参考
		- https://git-scm.com/book/ja/v2/GitHub-アカウントの準備と設定

5. GitHub Desktopをインストールする
	- https://desktop.github.com/

6. 「centos73_vagrant」リポジトリをローカルにcloneする
	- GitHub Desktopメニューより、[Clone Repogitory...]を選択
	- リポジトリのURLを指定してcloneする
		- https://github.com/mahbou3/centos73_vagrant.git
	- 表示された「Local Path」は後で使用するのでメモしておく
	![スクリーンショット 2017-10-10 17.04.39.png](https://qiita-image-store.s3.amazonaws.com/0/61033/90d18e4f-218f-bd2e-11ee-97f1a51f4884.png "スクリーンショット 2017-10-10 17.04.39.png")


7. vagrant upを実行

	```bat:Powershell(管理者)
> cd [手順6.で表示されたLocal Path]
> vagrant up
	```
	- 仮想マシンの作成後、ansible_localプロビジョナが実行され、CentOS上に環境が構築される。
	![スクリーンショット 2017-10-10 14.06.40.png](https://qiita-image-store.s3.amazonaws.com/0/61033/f4019b4b-b6e9-dca4-5509-3ac7655e30b7.png "スクリーンショット 2017-10-10 14.06.40.png")


8. 仮想マシンにログインする
	- ２つの方法があります。
		1. 【おすすめ】Teratermでログイン
			- Teraterm最新版をフルインストール
				- 「インストール種別の選択」画面で「フルインストール」を選択
				- 「追加タスクの選択」画面で「.ttlをttpmacro.exeに関連付ける」にチェックを入れる
			- centos73_S-login.ttl をダブルクリック
		2. vagrant sshコマンドでログイン

		```bat:Powershell(管理者)
> cd [手順6.で表示されたLocal Path]
> vagrant ssh
		```

## Thanks to: 参考文献

- Vagrant + Ansible で開発環境を作るなら ansible_local プロビジョナがいい！ - Shin x Blog ←一番参考になった！
	- http://blog.shin1x1.com/entry/ansible_local-provisioner-in-vagrant
- GitHub-アカウントの準備と設定
	- https://git-scm.com/book/ja/v2/GitHub-アカウントの準備と設定
- 複数VMにhostnameを設定 | technote
	- http://tech.withsin.net/2015/08/10/vagrant-multiple-hostname/

ー以上ー
macOSにbrewで入れたPHP5.3でSSH2拡張を使えるようにする

```
brew install php53-ssh2
```

をすると、

```
php -i | grep ssh
Additional .ini files parsed => /usr/local/etc/php/5.3/conf.d/ext-ssh2.ini
Registered PHP Streams => https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp
ssh2
libssh2 version => 1.8.0
banner => SSH-2.0-libssh2_1.8.0
```

という様にssh2ストリームや、`ssh2_connect`の様な関数が使えるようになる。

[php.net ssh2](http://php.net/manual/en/ref.ssh2.php)

たぶん5.3じゃなくても同じ方法で入る。
node_modulesエラーの原因特定

npmをアップデートした結果エラーが出たので、事象をまとめる。

###エラー発生###

<img width="936" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/352b6309-1ffb-2cb7-2f32-de09b1c81d2d.png">

node.modulesをアップデートして、`ng serve`したしたところ発生。 @angular/materialの中がおかしくなっている様子。

###app.module.tsのコードと@angular/materialが不一致している###

<img width="810" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/026fda0d-3a80-a78f-1491-550887aa8515.png">

app.module.tsを開くと赤線が出ている。

<img width="948" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/f9b663de-23e1-a5ea-b428-2e025b3a16b6.png">

試しに@angular/material内のMdButtonModule格納ファイルを除くと、MdButtonModuleではなくMatButtonModuleになっている、、、、

###原因を調べる###

https://stackoverflow.com/questions/46633867/error-angular-material-material-has-no-exported-member-mdbuttonmodule

@angular/material 2.0.0-beta.11 と 2.0.0-beta.12　で仕様が変わり、`MdButtonModule`は`MatButtonModule`に、他も`Md～`から`Mat～`に変わった様子。

###コード書き換えが大変なので、いったんダウングレードで逃げる###

<img width="670" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/9dc0bc5f-0e7a-7d78-c669-ff7e1cfc21d9.png">

`npm install @angular/material@2.0.0-beta.10`
`npm install @angular/cdk@2.0.0-beta.10`

で10をインストールした結果、エラー解消。
ポイントはダウングレードを11ではなく10にすることらしい、、、、
GoogleスプレッドシートをDB代わりに全部無料のシステムを作るまで(Part1-概要・利点&欠点編)

# はじめに
非営利&個人使用のシステムを一から作ってみようとしたのがきっかけで、GoogleスプレッドシートやらGithubやら既存のAPIを用いてシステムを作ってみました。
この記事はその導入方法ややり方をまとめたものです。
もし同じような事を考えた際に困った方がいましたら、この記事を参考にすると助けになるかもです。

# 目次
この記事は続き物になってます。
(1記事にまとめるととんでもなく長い&見にくくなりそうだと予感したため)
大体以下のような構成で投稿しようと思ってます。

- Part1～概要編～：使用したAPIについて、その利点や欠点 ←ｲﾏｺｺ
- Part2～導入編～：うp主の環境下での導入方法(ぶっちゃけブラウザ操作がほとんどなのでOSには依存しないかと)
- Part3～データの受信方法～：(予定) 
- Part4～データの送信方法～：(予定)

# 使用したAPIについて
今回使用したAPIは以下の通りです。

- Googleスプレッドシート


Googleスプレッドシートのセル内に書いてあるデータを全て、JSON形式で受け渡しが出来ます。
HTMLでフォームを作って、JSで情報を送信したり受信したりすれば、簡易的なフォームになりますし、これそのものをDB代わりに簡易的なシステムを用いたりも出来ます。
その他、様々なことに応用が利くと思います。可能性はきっと無限大でしょう。

## 利点
- データの可視化に優れる  
使ってみた方はわかると思いますが、GoogleスプレッドシートはExcelっぽい見た目をしてます。
MySQLとかと違いDBの中がすっごく見やすいです。
受信したデータを他の人と共有する際も見やすく作ることが出来ます。
- サーバーを立てなくてもDBが使える  
サーバー知識のない自分にとっては、これだけで利用価値がありました。

## 欠点
- データ送信が遅い  
処理の中で「シート(MySQLのテーブルに該当するようなもの)の該当列の情報を1行1行変更する」という物がありましたが、45行の処理に対して10秒以上はかかりました。  
速さを求めるのでしたら、Googleスプレッドシートは非常に向いてないかと…。
- Googleスプレッドシート自体に制限がある ※(12/13追記、コメントで情報頂きました)  
Googleスプレッドシートには、「1スプレッドシートにつき扱えるセル数は200万個」という制限があります。  
別のシートに情報を分割すれば希望は見えますが、処理や管理のコストを考えると辛いかもです。  
※『[Google Cloud SQL(有料)](https://cloud.google.com/sql/docs/?hl=ja)』という手段もありますが、これを扱うには『[Google Cloud Platform](https://cloud.google.com/sql/docs/?hl=ja)』に触れる事になります

# 終わりに
記事の中で、間違っていることや気になる事等がありましたら、バシバシコメントして下さい。
「SCRY無域」は100兆円の日本ブロックチェーンデータ市場を開くため戦略的提携

2017年10月7日、「SCRY.INFO無域」の日本コミュニティが正式に発足しました。今回のコミュニティの発足は、日本のブロックチェーン専門家や技術者などから注目を集めています。

今回のイベントはブロックチェーン関連産学研団体から大きな関心が寄せられています。世界最大の格付け会社S＆P Global、日本BPO最大手InfoDelivery社、ワイヤレス業界にサービスやソリューションを提供するグローバルリーディングサプライヤーのBrightstar社、アメリカ最大の金融機関の一つであるプルデンシャル・ファイナンシャル社、世界クラスの統合ICTサービス・プロバイダー富士通、国際金融IT業界で最も知られる企業FITECHLABS、世界有数の国際輸送・物流会社日新社、日本CCB信用情報機関、亜州理工学院、東京大学などがイベントにも参加しました。イベントの中では、ブロックチェーン技術に熱心の日本の方々が、SCRY.INFO無域の技術やコミュニティの運営方式などに大きな関心を示し、 現場ではSCRY無域チームと深く議論をしました。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/205530/81c59e62-b53b-75e6-db5b-8b208c1143da.jpeg)
SCRY.INFO無域は、世界初のブロックチェーン技術をベースに開発したデータ取引プラットフォームであり、スマートコントラクトを活かして現実のデータの保存、検証、共有、分析及び取引を実現しています。単にブロックチェーン技術を利用するためではなく、このシンボリックな情報化時代において、ビジネスパートナーにより多くの価値を創造し競争優位性を獲得するためSCRY.INFO無域はビックデータとブロックチェーン技術を組み合わせしました。

イベントのディスカッションでは、SCRY.INFO無域の共同創業者Rayとコミュニティの開発者Kurihara Chieが、SCRYプロジェクトの開発進捗およびスマートコントラクトを活かしたアプリケーションのビジネス活用ケースを共有し、SCRYのブロックチェーンプロトコールとAIロボットの連携について議論しました。SCRY.INFO無域が12月に人工知能とブロックチェーン技術を結合した商用システムをリリースする予定です。東京大学の元特任助教、機械学習の専門家-王志鵬博士、Sujiteckの創設者、新世代のエンジニア-Sujiもご来場頂き、技術などを共有して頂きました。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/205530/30086da8-f65e-d914-fd3e-baad71e36796.jpeg)
イベントの現場では、SCRY.INFO無域日本コミュニティの発足と共に、SCRY.INFO無域の共同創業者RayとTLZS株式会社社長芦建軍（以下、芦社長）が戦略的提携の調印式も行いました。

芦社長は、 「ブロックチェーンは情報時代の最先端の技術であり、特にデータ活用に基づく取引アプリケーションインフラとして、ビジネスプロセスのコストダウンやインテリジェンス社会基盤の構築においては必要不可欠な技術である」と語りました。

現在、日本はブロックチェーン技術やブロックチェーン技術を活かした金融サービスなどすでに世界の最前線に立っています。これは日本政府や機関の大きいなサポートを得られていたおかげです。日本において、ブロックチェーン技術はこれからも大きな発展の見通しです。今後、より多くの日本企業や期間がブロックチェーンの実応用に参入すると見込まれます。日本ブロックチェーンの実応用の発展に、これからSCRY.INFO無域もより多くの力を日本コミュニティに注入する予定です。

Rayは、「日本の各分野からの有識者、ブロックチェーン技術に関心を持つ企業、機関、開発者、個人を問わず、SCRY.INFO無域コミュニティに積極的に参加いただき、SCRY.INFO無域のエコシステムを構築し、ビジネスコラボレーションをより一層深め、実用に向けてブロックチェーン技術市場のより良い発展に大きく期待している」と語りました。
[Survey] Kaggle - Outbrain 15位解法まとめ

Kaggle - Outbrain Click Prediction[^1]の15位解法[^2]の調査記事です．

Name: Frederik
Kaggle Discussion: https://www.kaggle.com/c/outbrain-click-prediction/discussion/27897

## モデル

- 3つのXGBoostモデルでの平均で構築．
- 下記項目から40〜60の特徴量を構築し，90%と訓練データ，10%を検証データとして学習
- カテゴリ特徴に対するクリック率
- display_idごとの広告回数
- ad-relatedカテゴリに対するページビュー数
- 数値的特徴量
- XGBoostでPublic LeaderBoard: 0.68461

### モデルのパラメータ

- Metric: logloss
- Colsample: 0.30
- Subsample: 0.85
- Depth: 7
- ETA: 0.1 (or less, can't remember)
- Child weight: 5
- Gamma: 0
- Rounds: ~5.000

## References

[^1]: Kaggle, [Outbrain Click Prediction](https://www.kaggle.com/c/outbrain-click-prediction), 2017.
[^2]: Frederik, [Congrats and Solution Sharing](https://www.kaggle.com/c/outbrain-click-prediction/discussion/27897)