OmniAICreator/Qiita-1.07M huggingface dataset:
Tcl/Tkアプリを1つの実行ファイルにまとめる方法

この手の話題は[Starpack](https://wiki.tcl-lang.org/3663)を前提にしているものが多いですが、ここでは[KitCreator](https://kitcreator.rkeene.org/fossil/index)＋MinGW-w64を使った方法を紹介します。

なお以下はWindows7 32bitおよびWindows10 64bitでWindowsの実行ファイルをビルドする方法を説明しています。

# MSYS2
## 1. KitCreatorのダウンロード
```bash
$ wget 'http://www.rkeene.org/devel/kitcreator-0.11.0.tar.gz'
$ tar xf kitcreator-0.11.0.tar.gz
```
## 2. KitCreatorの修正
詳しい理由はよく分からないのですが、112行目と114行目でエラーが発生することがあるので変更しておきます。

```common/common.sh
111:			if [ -d "${dir}" ]; then
112:				mv "${dir}"/* . || exit 1
113:
114:				rmdir "${dir}" || exit 1
115:			fi
```
　　↓↓↓

```common/common.sh
111:			if [ -d "${dir}" ]; then
112:				cp -a "${dir}"/* . || exit 1
113:
114:				rm -fr "${dir}" || exit 1
115:			fi
```
## 3. tclsh相当コマンドのビルド
ここでビルドした実行ファイルは、最後にTcl/Tkスクリプトの実行ファイルをビルドする時に使用します。

KITCREATOR_PKGSをスペースにしておくのがミソです。Tcl/Tkのバージョン(以下の例では8.6.8)はお好みで。

```bash
$ cd kitcreator-0.11.0
$ KITCREATOR_PKGS=' ' ./kitcreator 8.6.8
$ mv tclkit-8.6.8.exe tclkitsh-8.6.8.exe
```
## 4. Tcl/Tkスクリプトの準備
ビルド時には暗黙のパッケージとKITCREATOR_PKGSで指定したパッケージそれぞれをビルドするためにkitcreator-0.11.0ディレクトリ直下にあるパッケージと同じ名前のディレクトリ内のbuild.shが実行され、最後にkitshのビルド処理でkitcreator-0.11.0/*/outディレクトリの中身がそっくりそのままVFSに配置されます。

そして実行時にはVFSにmain.tclがあればそれが実行され、無ければwishと同じ挙動になります。

従ってbuild.shだけ用意し、build.shから外部のソースツリーをmakeしてoutディレクトリにmake installするという方法でもOKです。

アイコンを独自のものに変更したい場合は「kitcreator-0.11.0/kit.ico」という名前で配置します。

また実行ファイルのプロパティ(著作権情報など)を変更したい場合は「kitcreator-0.11.0/kit.rc」という名前でリソースファイルを配置します。オリジナルのリソースファイル「kitcreator-0.11.0/kitsh/build/kitsh-0.0/kit.rc」を流用すればいいでしょう。

```bash
$ cd kitcreator-0.11.0
$ mkdir -p app/buildsrc
$ cat <<EOF > app/build.sh
> #!/bin/sh
> rm -fr out
> cp -a buildsrc out
> EOF
$ cat <<EOF > app/buildsrc/main.tcl
> pack [label .w1 -text "Hello, world!"]
> pack [button .w2 -text "Quit" -command exit]
> EOF
```

## 5. Tcl/Tkスクリプトを実行ファイルとしてビルド
先程ビルドしたtclsh相当コマンドはここで使用します。Tcl/TkバージョンやVFS設定はお好みで。

```bash
$ cd kitcreator-0.11.0
$ TCLKIT=$(pwd)/tclkitsh-8.6.8.exe KITCREATOR_PKGS='tk app' ./kitcreator retry 8.6.8 --enable-kit-storage=cvfs --with-obsfucated-cvfs
$ mv tclkit-8.6.8.exe app.exe
```

# Bash on Ubuntu on Windows
app.exeビルド時に「--host=i686-w64-mingw32」というオプションを追加すると、Windows10で利用できるようになった~~変態~~Ubuntuでクロスコンパイルすることもできます。

# もやもやしたら・・・
上記の説明を不親切に感じた、あるいはもう少し詳しく知りたいといった場合は、

* kitcreator-0.11.0/kitcreator
* kitcreator-0.11.0/common.sh
* kitcreator-0.11.0/kitsh/build.sh

あたりを流し読みすれば大体の疑問は晴れると思います。
【雑ネタ】仕事で古いDebianを触らなきゃいけなくなった時(GNU Debian6 squeeze)

#apt-getの参照先レポジトリが古すぎて使えないので

まず、VMから起動した場合になんですが、コンソールからSSHに切り替えて使いたいと思います。
ところが、liveDVDからインストールするとSSHが入っていないわけなので、
/etc/apt/sources.listを編集するところからスタートです！

以下のようにリポジトリを追加してください。
それで使えなくなったapt-getが復活します。

```bash:ファイル名：/etc/apt/sources.list
deb http://archive.debian.org/debian/ squeeze main
deb-src http://archive.debian.org/debian/ squeeze main
```

参考になった先のURLもお伝えしておきます。

＜サポート終了したDebian Squeeze(6.0)でapt-getが動くようにする＞
https://qiita.com/ryo511/items/e6878293832d6d60fc4c
※筆者の方、ありがとうございます。これで検証を進めることができそうです。

上記の通り、レポジトリを更新した後にapt-getでSSHをインストールして、
SSHのサービスを起動すればOKです！

```bash:実行コマンド（SSHインストール&サービス起動）
apt-get install openssh-server
/etc/init.d/ssh start
```

ちなみに私のこの記事はどれだけの需要があるか分からないですが…
海外ドラマの感想を共有するSNS mitanoをリリースして1ヶ月が経ちました

![mitano.jpg](https://qiita-image-store.s3.amazonaws.com/0/216860/e271d914-3c8f-b817-0bae-5d59211b2765.jpeg)

こんにちは

今年の5月末あたりに
海外ドラマの感想を共有するSNS mitanoというWebサービスをリリースしました。
www.mitano.jp

1ヶ月と少し経過したのでブログに現在の状況をまとめてみようかと思います。

mitanoとはどんなサービスか
「エピソード単位で感想の投稿」
mitanoは海外ドラマの感想をエピソード単位で投稿できます。
https://www.mitano.jp/episodes/1099
また、感想に対してのいいねやコメントなどを通してユーザー同士で雑談が可能です。

「面白いドラマに出会える」
mitanoはドラマごとにみんなの感想がみられたり、同じドラマをみている人が他にどんなドラマをみているのか確認したり、
面白いドラマに出会うきっかけを提供しています。
「海外ドラマまとめ」などの情報も見ることが可能です。
https://www.mitano.jp/articles/4
https://www.mitano.jp/casts/1

「最新の海外ドラマニュースがドラマごと、キャストごとに見れる」
感想にフォーカスしたSNSサイトとしての側面だけでなく、好きなドラマのことをもっと好きになれる多くの最新のニュースを掲載しています。
最新の海外ドラマのニュースを複数の情報サイトから毎日フィードしているため、
わざわざ検索エンジンなどで多くのサイトを見る手間を削減できます。
https://www.mitano.jp/entries/index
![game-of-thrones.jpg](https://qiita-image-store.s3.amazonaws.com/0/216860/27753fa6-d37c-8fba-5dff-896b8a564aea.jpeg)


mitanoをリリースしようと思った経緯
 そもそも私自身海外ドラマが大好きで、高校時代からプリズンブレイクやゲームオブスローンズ 、２４、ゴシップガールなど多くの海外ドラマを観てきました。

ただ、海外ドラマの特徴として、シーズン数・エピソード数が多いため、なかなか自分と同じエピソードまで観ているという人が周囲におらず
感想を話し合いにくいと感じていました。
そもそも同じドラマを見てる人自体あまり周囲にいませんでした。

そのため、エピソード単位で感想を共有する機能を提供することで
まるで同じエピソードを隣で見ているかのように感想を話し合えるサービスを作ろう
と思い、このサービスを作りました。

mitanoは感想をシェア出来るSNSという点に主軸を置き、多くの機能とコンテンツを提供するように心がけましたが、具体的な機能と掲載コンテンツを羅列してみます。

機能リスト
![googlehome-app_00.png](https://qiita-image-store.s3.amazonaws.com/0/216860/4b50327e-6246-a77d-df68-d79bcc6b6224.png)

・facebookログイン・twitterログイン
・エピソード単位/シーズン単位/ドラマ単位の感想投稿機能
・感想へのコメント機能
・感想へのいいね機能
・ユーザーフォロー・アンフォロー機能
・海外ドラマまとめ機能

提供コンテンツ
![ダウンロード (3).jpeg](https://qiita-image-store.s3.amazonaws.com/0/216860/f449c704-6a07-d8dd-2ad1-7625e62b2952.jpeg)

当初はドラマの概要ぐらいしかコンテンツとして提供していませんでした。
（ユーザーが投稿する感想以外の部分）
しかし、感想が投稿されていなくても楽しめるサイトにしよう！
という思いから、以下の情報もコンテンツとして提供するようにしました。

・海外ドラマ概要
・出演キャスト
・シーズン情報
・エピソード情報
・海外ドラマニュース
・海外ドラマまとめ

サービスリリース後１ヶ月後の状況
登録ユーザー数
65ユーザー

月間PV
920

なかなか悲惨な数字ですが、知人以外のユーザーも割といたのが嬉しかったです。
ただ、感想投稿まではなかなか行ってないです。

現状を踏まえた今後の方向性
 「現状の課題」
![rapture_20171125215416.jpg](https://qiita-image-store.s3.amazonaws.com/0/216860/534096c0-6b4e-eaba-616f-cfc05316174e.jpeg)
ユーザー数と感想の投稿数がまだ圧倒的に少ないです。
SEO的にもまだ自然流入が低く、対策の余地が大いにあります。
ただ、現状のコンセプトでは、ユーザーとユーザーが相互にコメントしあうSNSというもの（ユーザー投稿型）なので、個人のサービスとして戦うには厳しさを感じます。
このタイプのSNSサービスはある程度の投稿数がないと、サイトが廃れて見えてしまい、せっかくユーザーが訪問しても何もせずに帰って行ってしまいます。

「今後の方向性」

「感想を共有しあう」というコンセプトから
「自分が観たドラマの視聴記録」
という方向に転換しようと考えています。

前者だと、mitanoを訪問した一人目のユーザーと100万人目のユーザーだと明らかに100万人目のユーザーの方が、たくさんの投稿を見れて初期のユーザーにはほぼメリットがないサービスとなってしまいます。
しかし、後者の視聴記録という立ち位置に転換すると、
あくまで自分のために今自分がどのドラマをどこまでみたか
という風に変わり、かつ感想の投稿がメモ的な気軽に投稿できるものに変わるので
サービスを利用する一人目のユーザーも100万人目のユーザーも、得られるメリットが変わりません。
という、想定の元7月に大幅アップデートをかけます！！

ただ、個人的に海外ドラマにフォーカスしたサービスの存在価値は大いに価値があると考えているので
引き続き前のめりでサービスを運営していきます！！
Fluentdのルーティングの設定例をイメージ図で紹介

Fluentdのドキュメント(https://docs.fluentd.org/v1.0/articles/routing-examples) に様々なルーティングの設定例があります。
それらを図で表現してみると下記のようになります。

# [Simple Input -> Filter -> Output](https://docs.fluentd.org/v1.0/articles/routing-examples#simple-input--%3E-filter--%3E-output)

Input、Filter、Outputのシンプルな組み合わせ

![Simple.png](https://qiita-image-store.s3.amazonaws.com/0/54161/1013db64-528f-2fe1-204f-55b5653adfeb.png)

# [Two input cases](https://docs.fluentd.org/v1.0/articles/routing-examples#two-input-cases)

Inputが2つある例

![TwoInput.png](https://qiita-image-store.s3.amazonaws.com/0/54161/529a7bde-492d-669f-543c-826db4a70c71.png)

# [Input -> Filter -> Output with Label](https://docs.fluentd.org/v1.0/articles/routing-examples#input--%3E-filter--%3E-output-with-label)

`@METRICS`ラベルで、InputとOutputをグループ化

![SimpleWithLabel.png](https://qiita-image-store.s3.amazonaws.com/0/54161/a9effbad-714e-70bb-10b9-66e9c61e46ea.png)

# [Re-route event by tag](https://docs.fluentd.org/v1.0/articles/routing-examples#re-route-event-by-tag)

[routeプラグイン](https://github.com/tagomoris/fluent-plugin-route)によるレコードの複製とタグの書き換え

![ReRouteByTag.png](https://qiita-image-store.s3.amazonaws.com/0/54161/718086f3-ebc2-b656-50ba-fafa2185c4ab.png)

# [Re-route event by record content](https://docs.fluentd.org/v1.0/articles/routing-examples#re-route-event-by-record-content)

[rewrite_tag_filterプラグイン](https://github.com/fluent/fluent-plugin-rewrite-tag-filter)でレコードの内容によってタグの書き換え

![ReRouteByRecordContent.png](https://qiita-image-store.s3.amazonaws.com/0/54161/6635f50c-cd55-77b6-4ddc-cbf7c186bd86.png)

# [Re-route event to other Label](https://docs.fluentd.org/v1.0/articles/routing-examples#re-route-event-to-other-label)

[copyプラグイン](https://docs.fluentd.org/v1.0/articles/out_copy)によるレコードの複製と、[relabelプラグイン](https://docs.fluentd.org/v1.0/articles/out_relabel)によるラベル付け

![ReRouteToOtherLabel.png](https://qiita-image-store.s3.amazonaws.com/0/54161/07c677f1-9009-e7dc-0218-6ea3ba2aab26.png)
ビッグ７


O(HW)でいいか…

(あと。入出力が面倒なのでRubyだけでいいや…)

```rb:tyama_henae25.rb
#!/usr/bin/env ruby
#https://mtsmfm.github.io/2018/07/07/doukaku-e25.html
#https://qiita.com/mtsmfm/items/9e06456b4330305d4ed0

def build(x,y,dx,dy)
	[[x,y],[x+dx,y+dy],[x+dx-dy,y+dy+dx],[x-dx-dy,y-dy+dx]]
end
def format(a)
	a[1..-1].map{|x,y|'(%d,%d)'%[x,y]}*','
end
def ok(h,w,x,y,dx,dy)
	build(x,y,dx,dy).all?{|nx,ny|
		0<=nx&&nx<w && 0<=ny&&ny<h
	}
end

STDOUT.sync=true
while gets
	qx=qy=0;c=Float::INFINITY
	w,h,x,y=$_.scan(/\d+/).map &:to_i
	(-x..w-x).each{|dx|(-y..h-y).each{|dy|
		next if dx==0&&dy==0
		if ok(h,w,x,y,dx,dy)
			if dx**2+dy**2>qx**2+qy**2
				c=0
				qx=dx;qy=dy
			end
			c+=1 if dx**2+dy**2==qx**2+qy**2
		end
	}}
	puts c>1 ? '-' : format(build(x,y,qx,qy))
end
```
railsをproductionモードで起動する[Rails 5.2]

rails5.1でproductionモード起動したんだけど、
すぐにrails5.2でやることになったので続編

＜Rails5.1の時の話＞
[railsをproductionモードで起動する[Rails 5.1]](https://qiita.com/hiroky_814/items/8dce4f0097c261037c8e)

# 内容
- rails5.2でproductionモード起動した時の手順
- rails5.1の時と同様、railsとmysqlのコンテナをdocker-composeで起動する

# 手順
## config/credentials.yml.encを生成する
Rails5.1では「**secrets.yml.enc**」を生成したが、
Rails5.2では「**credentials.yml.enc**」を使う

以下のコマンドで生成する
エディタにvimを指定しているが、他のエディタでも大丈夫

```bash:
EDITOR="vim" rails credentials:edit
```

dockerコンテナにvimがない場合、コンテナ内でインストールが必要
（コンテナdownすると消えてしまうけど、一時的なので問題なし）

```bash:
apt-get update
apt-get install vim
```

vimが起動されてsecret_key_baseを編集できるようになる
今回は編集を行わずに終了する（":q"でOK）

`config/credentials.yml.enc`に暗号化後の内容が保存される
暗号の複合キーである`config/master.key`が生成される
セキュリティの観点からこのファイルはバージョン管理システムに保存しないこと
（`.gitignore`に自動追加されるが変更しないこと）

## config/environments/production.rb を変更
productionモードに合わせて設定を変更する。

```ruby:sample.ruby
config.eager_load = false
config.assets.compile = true
config.require_master_key = true
config.serve_static_files = true
config.assets.js_compressor = Uglifier.new(harmony: true)
```

ハマったポイントは

```ruby:
config.eager_load = false
```

この部分。
railsでプロジェクトを作成した時に設定される標準は

```ruby:
config.eager_load = true
```

となっている。
このままだと、"link_to"などでルーティングのprefix（"rails routes"で表示される一番左の項目）を遷移先を指定した場合に、「そんなルーティングないんだよ！」って怒られる。
app配下をアプリケーション起動時に全部読み込んでクラスの存在確認をするみたい？
viewがroutes.rbより先に読み込まれてるんかな・・・。

## railsをproductionモードで起動させる
今回はdocker-composeでコンテナ起動させているので、
docker-compose.ymlで起動モードを指定する。
以下は対象の行だけ。

```yml:docker-compose.yml
command: bundle exec unicorn -c config/unicorn.rb -E production -l 3000
environment:
  RAILS_ENV: 'production'
  RACK_ENV: 'production'
```

# 最後に
`config.eager_load`がtrueの場合にエラー終了することにかなりハマった。
クラス検証の順番がイケてないのは、rails5.2だから？
うーん。深く追ったらいいのかなぁ。と思いつつ・・・おっけーかな。
そろそろ溜まってるネタを吐き出していかなければー
CakePHP3環境構築メモ（PHPとMySQLのインストールまで）

最近CakePHP3の勉強を始めたのですが、最初の環境構築の段階で躓いたのでメモしておきます。

# 環境
CentOS7 (Vagrant)

```
$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
```

# 導入するバージョン

- PHP 5.6.36
- MySQL 5.6.40

ドットインストールを用いて学習したため、その環境に合わせています。

# PHPのインストール

yumでそのまま入れるとPHP5.4が入ります。
CakePHP3のシステム要件は5.6以上なため、EPELとRemiリポジトリを追加しインストールします。

```shell-session
# yum install epel-release
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-mysqlnd
```

タイムゾーンの設定を行います。

```shell-session
# vi /etc/php.ini
...略...
[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
;date.timezone =
date.timezone = Asia/Tokyo # 追記
...略....
```

```shell-session
$ php -v
PHP 5.6.36 (cli) (built: Apr 25 2018 10:02:39)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```

続いてintl拡張をインストールします。

```shell-session
# yum install --enablerepo=remi --enablerepo=remi-php56 -y php-intl
```

init.iniファイルを作成し以下のように入力します。

```shell-session
# vi /etc/php.d/intl.ini
extension=/opt/remi/php56/root/usr/lib64/php/modules/intl.so
```

正常に導入された場合、以下のよう表示されます。

```shell-session
$ php -i | grep intl
/etc/php-5.6.d/20-intl.ini,
/etc/php-5.6.d/intl.ini,
intl
intl.default_locale => no value => no value
intl.error_level => 0 => 0
intl.use_exceptions => 0 => 0
```

# MySQLのインストール

CentOS7のデフォルトではMariaDBがインストールされます。

デフォルトのMariaDBを削除します。

```shell-session
# yum remove mariadb-libs
# rm -rf /var/lib/mysql/
```

MySQL公式のリポジトリを追加します。
公式サイトのLinux 7用のダウンロードURLをコピーします。
[MySQL :: Download MySQL Yum Repository](https://dev.mysql.com/downloads/repo/yum/)

```shell-session
# yum localinstall [コピーしたURL]
```

以下のコマンドで追加されたMySQLのリポジトリ一覧を表示します。

```shell-session
$ yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community      無効
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - So 無効
mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community      無効
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - So 無効
!mysql-connectors-community/x86_64 MySQL Connectors Community       有効:     51
...略..
```

私の場合デフォルトではmysql80が有効になっていたため、mysql80を無効にし、今回欲しいmysql56を有効にします。

```shell-session
# yum install yum-utils
$ yum-config-manager --disable mysql80-community
$ yum-config-manager --enable mysql56-community
```
この状態で下のコマンドを実行すればMySQL5.6がインストールされます。

```shell-session
# yum install mysql-community-server
```

```shell-session
$ mysqld --version
mysqld  Ver 5.6.40 for Linux on x86_64 (MySQL Community Server (GPL))
```

以上で、CakePHP3を始めるための環境が構築出来ました。

# 参考

- [CentOS6／CentOS7にPHP5.6／PHP7をyumでインストール - Qiita](https://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e)
- [MySQL - cakephp mysqlが使えないというエラー(86748)｜teratail](https://teratail.com/questions/86748)
- [MySQL 5.6 を CentOS 7 に yum インストールする手順 | WEB ARCH LABO](https://weblabo.oscasierra.net/installing-mysql56-centos7-yum/)
HTML&CSS 初級編(Progate)　備忘録

<h1>Progate初級編(~16/23)で学んだこと</h1>

<h2>HTTMLについて</h2>
始まり：< >　終わり：</ >
見出し要素：h
段落要素：p
コメント：<!-- --> ＊表示されない
リンク：a <!a herf=“URL”>リンクはこれ的な</a>
画像：img src  <!img src=“画像のURL”>  ＊テキストがないから終わりのタグ不要
リスト：li <!li>なんか項目になるもの<!/li>　
cf)<!ul>で囲むと黒点がつく　<!ol>で囲むと連番される　行の先端でインデントをする（tabキー）と親子関係がわかりやすい
<!head>:ページに関する情報　（設定に関する情報であり、表示されない）
<!body>:実際に表示したい内容
<!DOCTYPE html> :HTMLのバージョンを宣言する（必ず記述する）
<!meta charset=“utf-8”> :文字化けを防げる
<!title> :タイトル、ブラウザの上に表示される
<!link rel=“stylesheet” href=“stylesheet.css”>: CSSファイルを読み込む宣言＆読み込むファイルを指定
<!div>~~~<!/div>  :レイアウトを決める。要素をグループ化する

<h3>CSSについて（HTMLの要素に対して色、大きさ、配置を指定する言語）</h3>
!h1{                 ＊どの要素の
 Color:#red;    ＊何を/どうするか（色を赤色に）
}        ＊インデントと改行とコンロ・セミコロンは必須
コメント：/*なんとかかんとか*/

font-size: 10px;    →文字の大きさを10に（単位であるpxが必須）
font-family: serif;  →文字のフォントをserifに
font-family:”Avenir Next”;    ＊フォント名の中にスペースがあれば””で囲む
background-color:#ddd;  →背景の色を変える
width: 500px; →横幅を変える
height: 40px; →高さを変える

HTMLでは
<!li class=“selected”>HTML<!/li>       ＊””で名前を囲む
CSSでは
.selected{           ＊CSSでは名前の前に. をつける
 Color:red;
}
li{
 list-style:none;   ＊リストの黒点を無くせる
 float:left;            ＊要素を左に横並びにする
}

.logo1{
 padding:20px;     ＊上下左右に20pxの余白をつける
}                            ＊padding-top/left/right/bottom で特定方向にのみつける

Padding: 20px 10px 10px 20px   ＊上右下左　の順に指定（時計回り）
Padding: 20px 10px                     ＊上下　左右　の順に指定
電気系プログラミングガチ素人学生がC#のクラスを勉強する話　10日目~返り値の参照渡し~

# まえがき
このレポートは「独習C＃」で学んだ内容をSkype勉強会での活動日誌として、「書面としてアウトプットする」こと、「電気系の学生の成果物を作るための意識高い系(笑)のレポート」です。完全初心者なので、勉強会参加者の先輩たちから様々なツッコミを頂きながら書いております。それゆえに先輩たちの目から外れた誤字脱字等ございますが、ぜひともツッコミいただいて、私の勉強にさせていただければと思います。就活終わったので、そろそろ蛍の光でも流そうかと思います。

## スタートライン
https://qiita.com/sanbongazin/items/d87d1f99859e35710486

# 戻り値の参照渡し
C#の戻り値を呼び出し元に参照渡しすることも可能です。参照渡しされた配列要素を更新する例です。まずは、戻り値を参照渡しする流れを抑えてみましょう。

```C#
using System;

namespace returnref
{
    class Passreturn{
        public ref int Returnref(int [] data){
            return ref data[0];
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var data = new [] { 1, 2, 3};
            var p = new Passreturn();
            ref int num = ref p.Returnref(data);//refをポインタモードとしてみれば、答えの解釈としてわかりやすかった。
            // アドレスのコピーとして考えることができる。そしてそれを参照しているという解釈？

            num = 10;
            Console.WriteLine(num);//Main関数のnumを参照しているため
            Console.WriteLine(data[0]);//アドレスが更新されたため。

        }
    }
}
```

ref int num = ref p.Returnref(data);
が、
int num = p.Returnref(data);にしてもコンパイルエラーにならずに実行されます。
ただし、値として、予期しない動作をする可能性が高くなります。注意しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244181/c2c24a64-67e8-2e44-98f7-300a88f8421c.png)<br>
初期値は０

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244181/26cd68da-fb01-3cec-602f-4b76e9cbd792.png)<br>
data[0]のアドレスが渡され、値がコピーされる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244181/a99d8fe0-4e3e-36f5-961a-9bdcd023eddf.png)<br>
numの値が１０に更新
出力は以下のようになる。

```
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
10
1
```




## 次に本来の動きがどういう意図で動いているのか確認してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244181/e8b7f2fe-d345-0446-45f7-992f42b77e2a.png)<br>
初期値が違う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244181/46c20e7a-6533-6d69-57e0-31936a139556.png)<br>
最初は、data[0]のアドレスがコピーされ、値がコピーされる。しかし、ここでの違いは、そのアドレスがひも付けとしてそのまま保持されている。ポインタモードと考えが同じ考えで考えると、numにdata[0]のアドレスと値が連携していると考えると、わかりやすい。
（shiracamusさん！ご指摘ありがとうございました！変更させていただきました 2018.07.09,09:13）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244181/25deef58-13f8-3d75-74d5-23ffe69d73d9.png)
そのため、出力は以下のようになる。

```
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
10
10
```

といった風に戻り値も参照渡しで値を取り出すことが可能です。これを応用するには、また時間がかかりそうですね・・・！

# あとがき
ということで、最近Javaも書き始めて、C#の理解がより深まったようなそんな感じです。
C#は「人を育てる言語なんだなぁ」と改めて感じてしまう、そんな会でした。
C言語のポインタの解釈が間違っているかもしれません・・・

個人的な解釈だけでは、おそらくよろしくないと思うので、ご指摘あればまたよろしくお願いします・・・！
Salesforce 子リレーション名の命名について

## はじめに
Salesforceでリレーション項目を作成するときに、子リレーション名を設定する必要があります。
「子オブジェクトの複数形」で命名することが一般的です。
標準項目でも「子オブジェクトの複数形」で命名されています。
(```Contacts```、```Assets```、```Cases```など)

しかし、親のオブジェクト名がつけられていたり、項目名と同じ命名がされていたり、
めちゃくちゃな命名がされていることもよく見かけます。

## 項目名と同じだと何がだめなのか
Apexでクエリを書いたときに問題があります。

### 子リレーション名を項目名と一緒にしてしまった例
親オブジェクト: 拠点 ```Office__c```
子オブジェクト: 従業員   ```Employee__c```

従業員の項目: 勤務先拠点 ```Office__c```
勤務先拠点の子リレーション名: ```Office__r``` (悪例)

```java
List<Office__c> offices = [ SELECT Id, (SELECT Id, Name FROM Office__r) FROM Office__c ];

List<Employee__c> employees = offices.get(0).Office__r;
```

項目名または親オブジェクト名で子リレーション名を設定すると、上の例のようになり、
子オブジェクト(```Employee__c```)にもかかわらず、親オブジェクトのように(```Office__r```)見えてしまい、可読性が落ちてしまいます。
また、複数形にしないことで、Listであることがわかりにくくなってしまいます。


### 子リレーション名に「子オブジェクト名の複数形」を使用した例
勤務先拠点の子リレーション名: ```Employees__r```
にすることでわかりやすくなります。

```java
List<Office__c> offices = [ SELECT Id, (SELECT Id, Name FROM Employees__r) FROM Office__c ];

List<Employee__c> employees = offices.get(0).Employees__r;
```

## 子リレーション名の命名
子リレーション名はあくまでも「親からみた子の関係」に名前をつけたものなので、そのことを意識した命名をする必要があります。

一般的には、子オブジェクトの複数形で命名しますが、同じオブジェクトにリレーション項目が複数ある場合は注意する必要があります。


### 例
親オブジェクト: ```User```
子オブジェクト: ```Employee```

項目ラベル名: 考課者
API参照名: ```Appraiser__c```
子リレーション名: ```Appraisees__r```

項目ラベル名: 研修担当者
API参照名: ```Traininer__c```
子リレーション名: ```Trainees__r```
CuPyの行列演算が驚異的に早かった

# この記事の内容

* Numpy-LikeなAPIを持ち、CUDAによってGPUを計算リソースとして使えるCuPyというライブラリがあります。
    * https://github.com/cupy/cupy
    * https://cupy.chainer.org
* このライブラリをちょっと試してみたら非常に高速だったので、どのくらい早かったかちょっとまとめてみました。

# 環境

* Hardware
    * CPU Intel Core i7-8700
    * GPU Nvidia GeForce GTX 1080
* Software
    * Ubuntu 16.04
    * CUDA 9.0
    * Python 3.6
    * numpy 1.14.5
    * cupy 4.2.0


# お題

速度比較のために簡単な問題を設定してみます。

ある100次元のベクトル`a`と、同じく100次元のベクトル`b`とのユークリッド距離を求めるとします。

Numpyで書くとこうなります。

```python
import numpy

a = numpy.random.rand(100)
b = numpy.random.rand(100)

numpy.linalg.norm(a - b)
```

次に、100次元のベクトルが1000000含まれる集合`B`があるとします。

先ほどの`a`と`B`に含まれる各ベクトルとの距離をすべて計算してみましょう。

```python
a = numpy.random.rand(100)
B = numpy.random.rand(1000000, 100)

[numpy.linalg.norm(a - b) for b in B]
```

`IPython`に含まれる`%%timeit`で測定してみると`3.48 s ± 10.1 ms`程度の時間が掛かっていました。

今回は、この処理をNumpyのブロードキャストとCuPyに置き換えることでそれぞれどの程度高速化するか調べてみます。

## Numpyのブロードキャスト

先ほどのコードと同じ処理をNumpyのブロードキャストを使って書き直します。

```
numpy.linalg.norm(a - B, axis=1)
```

掛かった時間は`505 ms ± 2.35 ms`でした。
この時点でリスト内包表記を使った場合より6〜7倍程度早くなっています。

## CuPy

さらに上記の処理をCuPyで行ってみましょう。

ここからの演算は`numpy.ndarray`ではなく`cupy.core.core.ndarray`で行うので変数も作り直します。

```python
import cupy

a = cupy.random.rand(100)
B = cupy.random.rand(1000000, 100)
```

以下のコードで速度を測定してみましょう。

```
cupy.linalg.norm(a - B, axis=1)
```

なんと、`133 µs ± 0 ns`でした。

* リスト内包表記を使った場合と比べて,約20000倍
* Numpy ブロードキャストを使った場合と比べても, 約3800倍

という驚異的な速さでした。

行列演算として書ける処理は色々あるので、GPUが使える環境ならかなり役立ちそうです。
Node.jsで特定の電車遅延情報をLINEに送信する

# 環境

* Node.js（v8.10.0）

# 必要なパッケージのインストール

下記のパッケージをインストールします。

* axios（v0.16.2）
* querystring（v0.2.0）

```DOS:DOS
npm install axios
npm install querystring
```

# 遅延情報をJSONで取得するモジュール

遅延情報はこちらのAPIを使用させて頂きました。
[鉄道遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/delay.json)

```javascript:deley.js
let https = require('https');
const URL = 'https://rti-giken.jp/fhc/api/train_tetsudo/delay.json';

const Deley = function () {};

Deley.prototype.getDeleyData = function () {
    return new Promise(function (resolve) {
        https.get(URL, (res) => {
            let body = '';
            res.setEncoding('utf8');

            res.on('data', (chunk) => {
                body += chunk;
            });

            res.on('end', (res) => {
                res = JSON.parse(body);
                resolve(res);
            });
        }).on('error', (e) => {
            console.log(e.message);
        });
    });
};

module.exports = Deley;
```

httpモジュールもhttpsモジュールもgetメソッドが非同期なので、単純に呼び出しても大変扱いにくいという･･･
そんな時にPromiseが役に立つということで、こんな感じにしてみました。
下のLINEモジュールはaxiosを使用していますが、こっちはaxiosを使わずに生Promiseで書いています。

# LINEに投稿するモジュール

```javascript:line.js
const axios = require('axios');
const querystring = require('querystring');

const Line = function () {};

Line.prototype.setToken = function (token) {
    this.token = token;
};

Line.prototype.notify = function (text) {
    // トークンチェック
    if (this.token == undefined || this.token == null) {
        return;
    }
    // 投稿
    axios({
            method: 'post',
            url: 'https://notify-api.line.me/api/notify',
            headers: {
                Authorization: `Bearer ${this.token}`,
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            // リクエストデータの生成にquerystringを使用
            data: querystring.stringify({
                message: text,
            }),
        })
        .then(function (res) {
            console.log(res.data);
        })
        .catch(function (error) {
            console.error(error);
        });
};

module.exports = Line;
```

# 投稿してみる

実際に投稿するには[【公式】LINE Notify](https://notify-bot.line.me/ja/)でトークンを発行する必要があります。
発行したトークンは`setToken()`の引数に渡してください。

```javascript:index.js
const Line = require('./line');
const Deley = require('./deley');

const myLine = new Line();
const myDeley = new Deley();

// LINE Notify トークンセット
myLine.setToken("トークン文字列");

// 遅延情報を取得
myDeley.getDeleyData().then(function(res){
    res.forEach(function(data){
       // LINE Notify 実行
       if(data.name == "東海道線" || data.name == "上野東京ライン"){
           myLine.notify("現在、" + data.name + "が遅延しています。");
       }
    });
});
```

今回は僕がよく使う東海道線と上野東京ラインの遅延情報だけを通知しています。
（コーディングした日はどちらの線も実際に15分程度遅延が起きていました。）


![linenotify.png](https://qiita-image-store.s3.amazonaws.com/0/147118/6bc7422a-2150-29d4-f3ed-c3d4fac02fb8.png)

HerokuにデプロイしてIFTTTとかで朝7:00、夕方18:00とかにAPI叩けば急な電車遅延にも対応できる！？

# 参考
* [LINE Notifyをnode.jsで利用する](https://dev.classmethod.jp/node-js/line-notify/)
* [Promiseと仲良くなって気持ち良く非同期処理を書こう](https://qiita.com/progre/items/03626b7f4655007d8cb2)
* [JavaScriptのPromise](https://qiita.com/ysk_1031/items/888a84cb259cec4e0625)
【勉強ノート】ウェブサイトからデータ収集のための Scrapy Shell

前回は[Scrapy基礎](https://qiita.com/suckgeun/items/887be8b9e2f32b95fc52)を勉強しました。
今回はScrapy Shellについて勉強します。

# 注意事項
この投稿は単純な勉強の記録です。私はWeb Scrapingに経験がないですから、間違ったことをやる可能性も高いと思います。その時はコメントで教えていただけると幸いです。そして、この投稿の内容はScrapyの[公式ホームページ](https://doc.scrapy.org/en/latest/intro/tutorial.html)を参考にしています。

# 今回の流れ
1. Scrapy Shellとは
2. Scrapy Shellを利用しデータ抽出

## 1. Scrapy Shell とは
Scrapy Shellは単純にScrapyの便利ツールとobjectが提供できているpython shellです。本当にそれだけですね。ipythonがインストールされている場合はデフォルトのpython shellの代わりにipython shellが利用されます。ipythonの方が便利なので私はipythonを利用します。

Scrapy Shellが便利なところは、spiderを実際に起動しなくてものウェブページscrapyingのテストが出来るところです。実際に使ってみましょう

## 2. Scrapy Shellを利用しデータ抽出

Scrapy Shellを起動するには下記のようにターミナルに入力します。

```terminal
$ scrapy shell <url>
```

今回はQuatesサイトを対象にしますので、下記のようになります。

```terminal
$ scrapy shell 'http://quotes.toscrape.com/page/1/'
```

成功すると、下記のような結果になるになります。

```
[ ... Scrapy log here ... ]
2018-07-07 11:41:54 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x7f94eb735630>
[s]   item       {}
[s]   request    <GET http://quotes.toscrape.com/page/1/>
[s]   response   <200 http://quotes.toscrape.com/page/1/>
[s]   settings   <scrapy.settings.Settings object at 0x7f94ea4bd748>
[s]   spider     <QuotesSpider 'quotes' at 0x7f94ea04c780>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects 
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
In [1]: 
```

ご覧の通り、Scrapyの便利なobjectとshortcutsが使えることが明記されています。
このobjectとshortcutsを使ってtitleのデータを抽出してみます。

```python
In [1]: response.xpath('//title')
Out[1]: [<Selector xpath='//title' data='<title>Quotes to Scrape</title>'>]
```

簡単にタイトルのデータを抽出出来ることが分かります。私はxpathを利用し抽出しますが、cssの方が楽な方はcssでも良いと思います。

Scrapy Shellの[公式ホームページ](https://doc.scrapy.org/en/latest/topics/shell.html#topics-shell)にもっと詳しい説明が書いてますので参考にしてください。
GitHub Desktop(version:1.2.6)でunable to accessエラーが出たときの対処法

# GitHub Desktopでpushができなくなった

GitHub Desktop（version:1.2.6）でpushをしようとすると以下のエラーが出るようになってしまいました。

>fatal: unable to access '(github repo url)': schannel: failed to open CA file '(AppData path to) 1.2.6/resources/app/git/mingw64/bin/curl-ca-bundle.crt': No such file or directory

## 対処法

C:\Programdata\Git\configの[http]の部分を修正します。

- powershellを管理者権限で起動し、configを編集します。

```
PS C:\> ISE \Programdata\Git\config
```

```:config
[core]
        symlinks = false
        autocrlf = true
        fscache = true
[color]
        diff = auto
        status = auto
        branch = auto
        interactive = true
[pack]
[help]
        format = html
[http]
        sslCAinfo = /bin/curl-ca-bundle.crt
[sendemail]
        smtpserver = /bin/msmtp.exe

[diff "astextplain"]
        textconv = astextplain
[rebase]
        autosquash = true
```
- [http]の部分

```
[http]
        sslCAinfo = /bin/curl-ca-bundle.crt
```

- ここを以下のように修正します。

```
[http]
        sslCAInfo = C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
```
これでpushが可能になります。

## 参考にしたissue

- https://github.com/desktop/desktop/issues/4817
- https://github.com/desktop/desktop/issues/4836
Ubuntuサーバーにtorインストール

　サーバーにtorをインストールする際に、参考にした記事です。


torをUbuntuにインストールする際に、参考になります。
https://orebibou.com/2017/07/ubuntu-server-16-04-ltscentos-7にtorをインストールしてtor経由でcurlやwgetを使用/

安全にtorをインストールするために、参考になります。
https://qiita.com/keiya/items/811dea56bf79c721364f

記事を書いてくださった方に、感謝しています。
ESXiでゲストOSが起動しないときの対処方法

#前置き
Arch Linux導入中にゲストOSが起動しなくなった時に実施した対処方法を記載しています。

実施した際の環境は以下の通りです。
VMware Workstation 14 Player上にESXi6.5をネステッド環境として構築しています。
ゲストOSとしてArch Linuxをインストール。
Arch Linuxは2018.07.01版を使用しました。

#現象
ゲストOS起動時に以下のような画面が表示される。
ブートローダーが認識されていない為、ESXiのブートメニューが出ている状態。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/feb26baf-317a-5371-3dd2-40d41a75129e.png)

#原因
EFIシステムパーティションで/bootを作成しているにもかかわらず、起動設定をBIOSブートにしていたことが原因でした。


#対応
ゲストOSの設定を編集する。

設定の編集－仮想マシンオプション－起動オプション－ファームウェアの「仮想マシンの起動に使用するファームウェアを選択」で「EFI」に変更する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/652b4b78-a6ce-864c-31c1-77541d5f2feb.png)

設定を保存後、ゲストOSを起動する。
無事、ブートローダーが認識できるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/c4224321-3940-d294-d66f-ddefd498758f.png)

普段、CentOSなどのウィザードでOSを構築していると考慮から漏れやすい観点ですので、参考にして頂ければ幸いです。

以上
Jupyter notebookで最強のAnsibleモジュール開発者向け教育ドキュメントを作る

Ansibleのモジュール開発用に教育ドキュメントをどうしようか悩んでいたのですが [Jupyter notebook](http://jupyter.org/) と [Jupyter Ansible Kernel](https://github.com/ansible/ansible-jupyter-kernel) を使えばJupyterで動かしてイメージができるものができるのではないか？と思い試しにやったら(自分の中で)最強の環境になったので書いておきます。

# 1. 目的

Ansibleのモジュール開発用に `module_utils` にあるメソッドの説明及び動作確認、実装方法を学んでもらえるようなドキュメントを作る。

# 2. 教材イメージ

以下はAnsibleのmodule_utilsにあるVMwareの `find_obj` メソッドについて書いたドキュメントです。
「百聞は一見に如かず」と言う事で以下はイメージ動画です。

![](https://sky-joker.tech/wp-content/uploads/2018/07/Ansible_module_development_teaching_material.gif)

上のイメージが表示されない場合は、以下の画像（リンク）をクリックしてください。

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/180118/a685144b-4dea-78db-52e7-6136022fc1c4.png)](https://sky-joker.tech/wp-content/uploads/2018/07/Ansible_module_development_teaching_material.gif)

以下は試しに作ったJupyter notebookのファイルです。

[https://github.com/sky-joker/ore-ore-ansible/blob/master/doc/ansible/module_utils/vmware/find_obj.ipynb](https://github.com/sky-joker/ore-ore-ansible/blob/master/doc/ansible/module_utils/vmware/find_obj.ipynb)

# 3. 説明

ドキュメントには `find_obj` の説明を書いて `引数` と `戻り値` のイメージを持ってもらいます。
次に `find_obj` の動作を確認するためのpythonスクリプトを作って実際に動かします。
`find_obj` の動作イメージが付いたら `find_obj` を使ったAnsibleモジュール例のファイルを作成します。
ここではソースが書いてあるので実際にどうコーディングしているか分かります。
Ansibleモジュールの作成ができたら実際に動かせるよう `Ansible Kernel` に変更します。
Ansible用の設定を環境に合わせてしてもらった後に実行すれば、作成したモジュールの動作確認ができます。

# 4. 触って動かす

静的なドキュメント(WordとかWikiとか)だとなかなかイメージしづらいですが、Jupyterを使うことで実際に触って動かしながら学んでもらえそうです :)
Jupyterであれば、動画ファイルを埋め込んだりもできるしGitで管理することもできて夢が広がりそうです :)

# 5. 参考

Jupyter Ansible Kernelのvenv環境への導入方法は以下にまとめてみました。

[venv環境にAnsible Jupyter Kernelの導入でハマったため備忘録としてメモを残しておく](https://qiita.com/sky_jokerxx/items/f0e8c1b7359c843ca6e2)
pdbを使うなら

pdbベースでネットで利用できる、パイソンのデバッガーの紹介です。

pdbのコマンド（機能をオーバーラップする）デバッガーです。

ブレークコマンドは、行番号をクリックして設定上部アイコンで継続
処理してください。


リンク先
http://simple-and-useful.net/netpdb/npdb.html


npdbとは,
ネット上で、誰でもフリーで使用できるパイソンのデバッガーです。

![Net Pdb - Chromium_002.png](https://qiita-image-store.s3.amazonaws.com/0/239261/4a344fe3-0b90-c520-8574-9abefc103bf8.png)

・下位部分の右が標準出力、その下が標準入力
・下位部分の左がpdb出力、その下がpdbのコマンド入力
（ここで、ｐｄｂのコマンドが入力できます）

・ブレークポイントは、行番号をクリック

上部アイコンは、
ファイル関係と、デバッガー関係です。


シンプルで便利なをモットーに開発改善していきたいです、
あなたのパイソンデバッグを応援しています。
VS Code1.25の新機能 - グリッドエディタレイアウト

# Visual Studio Code 1.25の新機能・グリッドエディタレイアウト
https://code.visualstudio.com/updates/v1_25#_grid-editor-layout

従来のバージョンではエディタを並べて表示したい場合、並べられる最大数は３つまでで、また並べる方向は１方向（横方向か縦方向、切り替えは可能）という仕様だった。

今回、グリッドエディタレイアウトが採用され、最大数の制限が無くなり、また同時に横方向にも縦方向にも並べられるようになり、より自由度の高い並べ方が可能になった。

## エディタの配置
エクスプローラからエディタを選んで表示する際、既に表示されているエディタの端にドロップすることによってその隣にエディタを配置することができる。

![arrange.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/49d35a1e-deed-9fed-6b2d-93058353fc89.gif)

## レイアウトの保持
エディタを閉じる際、それがエディタグループの最後のエディタの場合、デフォルトの動作ではエディタグループが閉じられるが、エディタを閉じてもレイアウトはキープしておきたい場合のために設定が追加された。
設定`workbench.editor.closeEmptyGroups`を`false`に変更するとエディタを閉じてもレイアウトはキープされるようになる。

![keep_split.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/9093b630-5064-e01e-9da3-35862a67c1e5.gif)

## エディタの分割
エディタ右上にある分割ボタンを押すと分割される。デフォルトは右分割されるが`Alt`キーを押しながらだと下分割になる。この動作を逆にしたい場合は設定`workbench.editor.openSideBySideDirection`によって変えることができる。

![split.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/1a415014-c379-a792-cdc6-7a76ee9455b8.gif)

分割のプリセットパターンがいくつか用意されており、それらを呼び出すことによって分割することもできる。

![preset.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/266cd38b-4145-e8e0-ec1d-a3c0bf8483ec.gif)

これらのプリセットパターン分割はコマンドにショートカットキーを割り当てればワンキーで呼び出すことができる。

さらに、自分でカスタムのレイアウトを定義して、それをショートカットキーで呼び出すこともできる。
`Ctrl`+`K` `Ctrl`+`S`(or `⌘K` `⌘S`)でキーボードショートカット画面を出し、さらに`keybindings.json`のリンクをクリックし、例えば以下のような感じで設定する。

```json:設定例
[
    {
        "key": "alt+numpad0",
        "command": "layoutEditorGroups",
        "args": {
            "orientation": 1,
            "groups": [
                {"groups": [{"size": 0.4},{"size": 0.4},{"size": 0.2}]},
                {"groups": [{"size": 0.2},{"size": 0.4},{"size": 0.4}]},
                {"groups": [{"size": 0.4},{"size": 0.4},{"size": 0.2}]},
                {"groups": [{"size": 0.2},{"size": 0.4},{"size": 0.4}]}
            ]
        }
    }
]
```
`orientation`は方向を表し、`0`は水平方向、`1`は垂直方向の設定を表す。
`groups`にレイアウトの定義を記述する。１つのエディタグループを`{}`で表記し、`[{},{},{}]`のように配置したい数だけ並べる。`{}`の中に`size`を指定すると幅比率を指定でき、1つのgroupsの中の合計値が1になるように指定する。`size`を省略した場合は均等に配置される。
タテヨコに配置したい場合はgroupsをネストして表記する。なのでその場合は`orientation`に`1`を指定したほうが上記の例のように定義とレイアウトの並び方向が一致するので直感的にわかりやすくなる。
上記設定を行った場合、`Alt`+`numpad0`を押すと以下のようなレイアウトになる。

![custom_layout.PNG](https://qiita-image-store.s3.amazonaws.com/0/181011/777f5ff8-6e88-7fa9-7170-ee7e4d526527.png)

## ショートカットキー
今回の機能によって追加されたショートカットキー
`Ctrl`+`K` `Ctrl`+`\`：エディタの分割。分割される方向は設定`openSideBySideDirection`とは逆の方向。なお、設定されている方向への分割は`Ctrl`+`\`。
`Shift`+`Alt`+`9`：エディタを最後のグループに移動
`Ctrl`+`K` `↑`/`↓`：エディタグループを上/下に移動
`Ctrl`+`F4`：アクティブなエディタグループを閉じる
`Ctrl`+`4`～`8`：4～8個目のグループにフォーカスを移動する。グループが無ければ追加する(ただし追加は１つ前のグループがすでに存在する場合のみ)。
`Ctrl`+`K` `Ctrl`+`↑`/`↓`/`←`/`→`：フォーカスを上/下/左/右のグループに移動する
Swiftで正規表現チェックツール作ってみた


正規表現の勉強を始めてみよう！となっていくつか記事を見てみたのですが、実際に手を動かしてみないとあってるかどうか自信がなかったので、とりあえず手を動かすために手を動かしてみました。

---

![RegularExpression.gif](https://qiita-image-store.s3.amazonaws.com/0/105182/75a86b0c-a1c7-7ac8-7221-b061c8777a69.gif)

上の欄の正規表現に対して、下の欄のTextのマッチする箇所が赤文字になる仕組み。
正規表現自体が間違っている場合は、上の欄の文字が赤くなります。

コアとなる正規表現チェックのコードはこのような感じ。

```Swift
extension String {
    func matches(pattern: String) throws -> [NSRange] {
        let re = try NSRegularExpression(pattern: pattern)
        let matches = re.matches(in: self, range: NSMakeRange(0, count))
        return matches.map { $0.range }
    }
}
```

- エラーがthrowされた場合、正規表現が間違えている
- 一致する箇所がある場合は戻り値の配列の中にそのRangeが入っている

詳細はこちらのリポジトリにて確認出来ます。
https://github.com/akasaaa/RegularExpression


以下の記事を参考にしました。
[Swift 3.0での基本的な正規表現を行うextension](https://qiita.com/KikurageChan/items/807e84e3fa68bb9c4de6)

---
以下宣伝

iTunesの曲にふりがなを振るMacアプリを作ってみました。
現状自動で振られるだけのミニマム機能でのリリースですが、今後はアプリ内での編集などの機能を追加していく予定です。
https://itunes.apple.com/jp/app/furikake/id1360607055
Golangで遊ぶ_100DaysOfCodeチャレンジ19日目(Day_19:#100DaysOfCode)

# はじめに

この記事はTwitterで人気のハッシュタグ`#100DaysOfCode`をつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した19日目の記録です。

## 動作環境

* go 1.10 darwin/amd64

## 現在学習している内容のリポジトリ

https://github.com/yuta-ushijima/golang-mysql-tutorial

## 本日学んだこと

* ProgateでGolangのレッスン後にMysqlに繋いでみる

## ProgateでGolangのレッスン後にMysqlに繋いでみる

progateにGolangのレッスンが公開されていたので、頭の体操がてら挑戦。

内容としてはプログラミングの初歩の初歩だったので、30分くらいで終了。

アウトプットしたくなったので、ググっていたところ以下のYoutubeを発見しました。

[![Go MySQL Beginners Tutorial](https://img.youtube.com/vi/DWNozbk_fuk/0.jpg)](https://www.youtube.com/watch?v=DWNozbk_fuk)

おもしろそうだったので、動画で解説されていた通りにやってみることに。

流れとしては以下の通り。

1. SequelProで新規にデータベースを作る
1. Golangのスクリプトでusersというテーブルを新規に作成
1. Golangのスクリプトでusersテーブルにid/name/twitter_idというカラムを作成
1. Golangのスクリプトでusersテーブルから値を表示させる

Progateで学んだif文や`Println`が出てきたのと、パッケージの書き方とか、外部モジュールのimport方法とかがサクっと学べたのでいい復習になったかな。

動画は英語ですが、8分ほどですし、話している内容がわからなくてもコードを追っていけば、初学者でも問題なく進められると思いますよ。

## 参考リンク

[GoのORマッパーを使ってみよう！](http://tech.innovation.co.jp/2017/12/08/Go-O-R.html)

[MYSQL int型なのに1をinsert intoするとUnknown column '　1' in 'field list'になる](https://teratail.com/questions/61228)

[MySQLでテーブルを作成する方法【CREATE TABLE文】](https://techacademy.jp/magazine/5113)

[GoでMySQLに接続する](https://qiita.com/taizo/items/54f5f49c6102f86194b8)

[go-sql-driver/mysql](https://github.com/go-sql-driver/mysql#examples)

[YouTubeのサムネイルを
Markdownで埋め込むための文字列変換というページ](https://www.tecking.org/youtube-markdown/#)

[golang.jp](http://golang.jp/go_tutorial)
Python + Djangoでメールを送信する

###Python + Djangoでメールを送信してみます

####1.環境

```
windows10 home 64bit
Python 3.6.5
Django 2.0.4
```

####2.アプリケーション作成

```cmd.prompt
(venv) C:\data\python\myproject>python manage.py startapp sendmail
```

作成後の構成

```
myproject\sendmail
│  admin.py
│  apps.py
│  models.py
│  tests.py
│  urls.py      ・・・・・・(1)
│  views.py     ・・・・・・(2)
│  __init__.py
```
※migrations、\_\_pycache\_\_は省略


####3.アプリケーションの編集

(1)sendmail\urls.pyの作成

```sendmail\urls.py
from django.urls import path
from . import views

app_name = 'sendmail'
urlpatterns = [
    path('', views.index, name='index'),
]
```
※startappでは、urls.pyは作成されないので、作成してください

(2)sendmail\views.pyの編集

```sendmail\views.py
from django.shortcuts import render
from django.core.mail import BadHeaderError, send_mail
from django.http import HttpResponse, HttpResponseRedirect

def index(request):
    """題名"""
    subject = "題名"
    """本文"""
    message = "本文です\nこんにちは。メールを送信しました"
    """送信元メールアドレス"""
    from_email = "information@myproject"
    """宛先メールアドレス"""
    recipient_list = [
        "apptest@apptest.com"
    ]

    send_mail(subject, message, from_email, recipient_list)
    return HttpResponse('<h1>email send complete.</h1>')
```

※ポイントは、「send_mail」の箇所だけです。

####4.プロジェクトの設定

(1)myproject\settings.py

emailを送信するために、settings.pyを以下のように編集します。
EMAIL_BACKENDは、settings.pyの最後に追記しました。

```myproject\settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sendmail', #追加
]

・・・・

# mail
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'apptest'
EMAIL_HOST_PASSWORD = 'xxxxxxxx'
EMAIL_USE_TLS = False
```

開発環境で、smtpサーバに送信しない場合は、以下のようにすればconsoleに出力できるようです。

```myproject\settings.py
# for email debug settings
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
```

(2)myproject\urls.py
以下の通りです。

```
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('sendmail/', include('sendmail.urls')), #"追加"
    path('admin/', admin.site.urls),
]
```

####5.動作確認

(1)サーバを起動します

```cmd.prompt
(venv) C:\data\python\myproject>managed.py runserver
```

(2)http://localhost:8000/sendmail/にアクセスします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/1d2fa982-7793-8c3a-ecd4-6fc7977ddba1.png)

メールも届きました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/21f661ec-ae79-b7b0-db4d-dd16228c981e.png)
MongoDBのインストール

#はじめに
データの保管先に MongoDB を使用します。

#環境
使用した環境です。

```console:environment
# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
# rpm -qa | grep mongo
mongodb-org-server-4.0.0-1.el7.x86_64
mongodb-org-shell-4.0.0-1.el7.x86_64
mongodb-org-4.0.0-1.el7.x86_64
mongodb-org-mongos-4.0.0-1.el7.x86_64
mongodb-org-tools-4.0.0-1.el7.x86_64
```

#yumでインストール

* yumのrepositoryファイルを作成
* yumでインストール
* SELINUXの設定確認
* SELINUXを Permissiveに変更

```console:yum
cat << EOF > /etc/yum.repos.d/mongodb-org-4.0.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF

yum install -y mongodb-org

getenforce
sestatus

sed s/SELINUX=enforcing/SEINUX=permissive/g /etc/selinux/config > /etc/selinux/config.permissive
mv /etc/selinux/config /etc/selinux/config.permissive
mv /etc/selinux/config.permissive /etc/selinux/config 


```


#mongodの起動

* mongod のサービス起動 : default port = 27017
* 設定の確認 /etc/mongod.conf
* ログの確認 /var/log/mongodb/mongod.log

```console:monogod
service mongod start
grep 27017 /etc/mongod.conf
less +F /var/log/mongodb/mongod.log

```

LISTEN IPアドレスの変更

PortのLISTEN状況を確認したら、IPが127.0.0.1 だけだったので 0.0.0.0 に変更しました。

```
# netstat -an | grep 27017
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN     
unix  2      [ ACC ]     STREAM     LISTENING     25493    /tmp/mongodb-27017.sock
# sed "s/bindIp: 127\.0\.0\.1/bindIp: 0\.0\.0\.0/g" /etc/mongod.conf > /etc/mongod.conf.new
# mv /etc/mongod.conf /etc/mongod.conf.org
# mv /etc/mongod.conf.new /etc/mongod.conf
```

#mongodの自動起動、手動停止、再起動

CentOSだとsystemctl, serviceコマンドで管理できます。

```
# systemctl enable mongod.service
# systemctl is-enabled mongod.service
enabled
# service mongod stop
# service mongod restart
# systemctl status mongod
```

#mongodのシェル

DBに接続してDBの操作ができます。

```console:mongo
mongo --host 127.0.0.1:27017
> help
> db.help()
DB methods:
	db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [just calls db.runCommand(...)]
> db.version()
4.0.0
```

#参考
[Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux — MongoDB Manual](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/)
Vue.js で Twemoji を楽チンに使う方法

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13842/f4f9dacd-68f8-a42a-36d5-a0b0271cd24b.png)

# どんな感じ？

Codepen でサンプルを作ってみました （Qiita に埋め込むと表示されるのに数秒かかる）
<p data-height="265" data-theme-id="0" data-slug-hash="yEmazB" data-default-tab="js,result" data-user="tdkn" data-embed-version="2" data-pen-title="Vue.js + Twemoji" class="codepen">See the Pen <a href="https://codepen.io/tdkn/pen/yEmazB/">Vue.js + Twemoji</a> by tdkn (<a href="https://codepen.io/tdkn">@tdkn</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

- Twemoji とは
    - Twitter がオープンソースで公開している絵文字のセットです
    - Qiita でも使われています → :smile:
    - https://twemoji.twitter.com/

# Custom Directive

通常、Vue においてコードの再利用と抽象化における基本の形はコンポーネントですが、Custom Directive を使うと低レベルDOMにアクセスすることができるため、これを利用して Twemoji のパース処理を差し込みます。

Vue には Custom Directive を**グローバル**あるいはコンポーネント単位で**ローカル**に登録することができます。
ディレクティブというのは `v-on` や `v-if` など HTML の attribute によく似たものです。

```javascript:global
import Vue from 'vue'
import twemoji from 'twemoji'

// アプリケーションにグローバル登録
Vue.directive('twemoji', {
  inserted(el) {
    el.innerHTML = twemoji.parse(el.innerHTML)
  }
})
```

```javascript:local
// Component単位で登録
directives: {
  twemoji: {
    inserted(el) {
      el.innerHTML = twemoji.parse(el.innerHTML)
    }
  }
}
```

# 使い方

ディレクティブを登録したので `v-twemoji` が使えるようになっています。
お好みで `v-emoji` など、ディレクティブの名前は適宜変えても良いでしょうね。

```vue:app.vue
<template>
  <div v-twemoji>{{message}}</div>
</template>

<script>
export default {
  data: () => ({
    message: "Hello Twemoji ✨🍣😋"
  })
}
</script>
```

# 絵文字の大きさの調整

そのままだと、`36px` ほどあるので、css で適宜調整しましょう。 
親要素を基準に計算する `em` が良いかも。

```css
img.emoji {
   height: 1em;
   width: 1em;
   margin: 0 .05em 0 .1em;
   vertical-align: -0.1em;
}
```
ThingSpeakでMATLAB Visualization使ってグラフをカスタマイズ

# はじめに
Nature Remoで測定した温度とOpenWeatherMapで取得した気温をThingSpeakで重ねて表示したい。
ThingSpeakのデフォルトのグラフ表示は自由度低くてかゆいところに手が届かない。
MATLAB Visualizationって機能を使ってブラウザ上でプログラミングしてグラフ表示した。

# 前提
すでにThingSpeakのChannelにデータをアップロードしてる。

[Nature Remoで測定した室温をThingSpeakに渡して表示。 - Qiita](https://qiita.com/iton/items/e88121525ddb6ad6e13a)
[pythonを使ってOpenWeatherMapから天気情報を取得 - Qiita](https://qiita.com/iton/items/87d4846de15736b599e4)


# 設定とコーディング
チュートリアルみながら、MATLAB Visualizationってところを押して、ぽちぽちやってたらできた。

温度と湿度でグラフを書いた。
湿度のグラフ表示のコードはこんな感じ。
xxx, yyyは自分のChannelの情報を書く。
humisは配列でNature Remoからとってきた湿度(field2)と、
OpenWeatherMapからとってきた湿度(field5)が入ってる。
ポイント数とか表示範囲を自由に決められる。
y軸の表示範囲をylim()で指定。
thingSpeakPlot()使ってみたところはコメントアウトしている。

```matlab
readChId = xxx;
readKey = 'yyy';

[humis,time] = thingSpeakRead(readChId,'fields',[2,5],'NumPoints',1000,'ReadKey',readKey);

plot(time, humis);
title('Humidity Measurement');
xlabel('TimeStamps');
ylabel('Measured Values');
legend({'Nature Remo','OpenWeatherMap'});
legend('Location','southwest')

grid on;
ylim([0,100]);

% thingSpeakPlot(time(1:10:end),temps(1:10:end,:),'xlabel','TimeStamps',...
%    'ylabel','Measured Values','title','Temperature Measurement',...
%    'Legend',{'Nature Remo','OpenWeatherMap'},'grid','on');
```

thingSpeakPlot()を使わないといけないのかと思ったけど、そういうわけではないみたい。
ためしにplot()使ってみたら表示できた。
plot()を使ったほうが自由度高い。

# 結果
こんな感じ。
![NatureRemo   OpenWeather   ThingSpeak IoT.png](https://qiita-image-store.s3.amazonaws.com/0/184221/302a41f8-48e0-05c2-cad1-8ad4c78879b7.png)


# おわりに
いい感じ。
Nature Remoの値が信用ならんけども。
発熱してるやろし、筐体で空気がこもるやろから、変化しないんかなぁ。

# 参考
MathWorksはドキュメントがむちゃくちゃ親切。
公式のサイトだけでなんとかなった。
[データの解析 - MATLAB & Simulink - MathWorks 日本](https://jp.mathworks.com/help/thingspeak/analyze-your-data.html#visualize_dew_point_measurement)
FuelPHP で API を作成

FuelPHP1.8.1 で MariaDB の API を作成する方法です。
次のページを参考にしました。
>[#FuelPHP 5 分で API を実装するチュートリアル（スクリーンキャストあり）](http://blog.omoon.org/20131219/925)

>[FuelPHP 1.8.1 の使い方](https://qiita.com/ekzemplaro/items/0f76602ed0bebe9ea687)

1) MariaDB の用意
>User: scott
Password: tiger123
データベース: fuel_dev
とします。

データベースを作成するには、root で接続して、

>```text
mysql -uroot
>create database fuel_dev;
>grant all on fuel_dev.* to scott@localhost;
```

2) プロジェクトの作成

```bash
oil create proj01
```

3) サーバーの起動

```bash
cd proj01
oil server
```

4) クライアントから、

http://localhost:8000
にアクセスして、サーバーが動いていることを確認

5) MariaDB への接続の設定

```php:fuel/app/config/development/db.php
<?php
/**
 * The development database settings. These get merged with the global settings.
 */

return array(
        'default' => array(
                'connection'  => array(
                        'dsn'        => 'mysql:host=localhost;dbname=fuel_dev',
                        'username'   => 'scott',
                        'password'   => 'tiger123',
                ),
        ),
);
```

6) Model の作成

```bash
oil generate model memo memo:varchar created_at:timestamp updated_at:timestamp --mysql-timestamp --crud --created-at --updated-at
```

7) MariaDB にテーブルを作成する

```bash
oil r migrate
```

8) route.php の編集

```php:fuel/app/config/routes.php
<?php
return array(
        '_root_'  => 'welcome/index',  // The default route
        '_404_'   => 'welcome/404',    // The main 404 route

        'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'),


        'memo/read' => 'memo/read',
    'memo/write' => 'memo/write',
);
```

9) コントローラーの作成

```bash
oil generate controller memo write read --extends=Controller_Rest
```

10) コントローラーの修正

```php:fuel/app/classes/controller/memo.php
<?php

class Controller_Memo extends Controller_Rest
{
        protected $format = 'json';

        public function get_read()
        {
        $memos = Model_Memo::find_all();
        $this->response($memos);
        }

        public function post_write()
        {
        $memo = Input::post('memo');
        Model_Memo::forge(['memo' => $memo])->save();
        }


}
```

11) サーバーの起動

```bash
oil server
```

12) データの書き込み

```bash
curl http://localhost:8000/memo/write -d "memo=test1"
curl http://localhost:8000/memo/write -d "memo=test2"
curl http://localhost:8000/memo/write -d "memo=test3"
curl http://localhost:8000/memo/write -d "memo=test4"
curl http://localhost:8000/memo/write -d "memo=test5"
```

13) データの読み込み

```bash
curl http://localhost:8000/memo/read | jq .
```