OmniAICreator/Qiita-1.07M huggingface dataset:
Ansibleでusacloudを楽々インストール

さくらのクラウドCLI [Usacloud](https://github.com/sacloud/usacloud)をAnsibleで一発インストールできるようになりました！！！
[Ansible Galaxy](https://galaxy.ansible.com)にロールが公開されていますので非常に楽にインストールできるようになりました。

## 使い方

### ansibleのインストール

まずはansibleをインストールしておきます。
各OSのパッケージマネージャなどを利用してインストールするのが楽でしょう。
(今回は作業端末はCentOSです)

この辺りはansible入門などのドキュメントが豊富にありますので必要に応じて参照してください。

```bash
$ yum install -y ansible
```

### ansible galaxyからUsacloud用のロールをインストール

パッケージマネージャでansibleをインストールすると`ansible-galaxy`コマンドを利用できるようになっているはずです。
このコマンドはAnsibleのロールの共有サービスであるAnsible galaxyからのロールのインストールなどが行えます。

Usacloud用のロールは`ansible-galaxy install sacloud.usacloud`を実行することでインストールできます。

```console
$ ansible-galaxy install sacloud.usacloud

- downloading role 'usacloud', owned by sacloud
- downloading role from https://github.com/sacloud/ansible-role-usacloud/archive/master.tar.gz
- extracting sacloud.usacloud to /etc/ansible/roles/sacloud.usacloud
- sacloud.usacloud (master) was installed successfully
```

### Usacloud用のロールを用いてインストール

今回は作業端末自体にUsacloudをインストールしてみます。
必要に応じて`hosts`部分などを書き換えたりインベントリーファイルを用意してください。

まずは以下のyamlファイルを作成します。

```yaml:install-usacloud.yml
- hosts: localhost
  roles:
     - { role: sacloud.usacloud }
```

続いて`ansible-playbook`を実行します。

```console
$ ansible-playbook install-usacloud.yml
```

これでUsacloudのインストール完了です！！
いやー、Ansible galaxyでロールが配布されていると非常に楽ですね！！

作成者の@wateさんに感謝です！！！

## 参考リンク

- [Ansible Galaxy - sacloud.usacloud](https://galaxy.ansible.com/sacloud/usacloud/)
- [GitHub(ansible-role-usacloud)](https://github.com/sacloud/ansible-role-usacloud)
MATLAB > IDE > エディタ > 変更を元に戻す > 元に戻す (Ctrl + Shift + マイナス) | ファイルを閉じる | UIが分かりにくい

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

エディター内の変更を元に戻す方法が分かりにくかった。

### 元に戻すボタン ( Ctrl + Shift + マイナス )

https://jp.mathworks.com/help/simulink/ug/back-out-changes.html
> 1. [元に戻す] ボタンまたは [やり直し] ボタンの隣の矢印をクリックします。

元に戻すボタンはどこにあるかというと、右上のあるアイコンのことのようだ。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b452ba91-405f-0d6a-238e-506ff98b0d1d.png)
の青色の矢印のことのようだ。

ショートカットはCtrl + Shift + マイナス

### ファイルを閉じる

エディタ内のタブ表示で「ｘ」を押すことで、「"xxx"に変更を保存しますか？」という確認ダイアログが表示される。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c1dc8b63-7754-45b7-bdc3-2f23181d4ee6.png)

ここで「いいえ」を選択することで、不意の編集を取り消すことができる。

### UI

エディター上で右クリックにおいて表示されるメニューがあり、そこに「元に戻る」があれば分かりやすいと思う。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0cb0ecae-7818-5455-e687-d661750f6792.png)

ユーザーは、上部の「ツールストリップ」、右上のアイコン表示、右クリックのメニュー、と３つの中から希望する動作のメニューを探さないといけない。

右上のアイコンは中途半端な役割になっているように感じる。


### Git

MATLABにはGit機能があるようなので、それを使うという方法もある。
動作については未確認。
継ぎ足し方式で線を描く

[Subjoined Line (1) | CreateJS](http://labo.project-nya.jp/createjs/subjoined_line/0.8.1/ver1/)
太さを 3 に設定しているのに、太さ 1 になってしまう。

CreateJS 1.0.0 にしたら、直った！
[Subjoined Line (1) | CreateJS](http://labo.project-nya.jp/createjs/subjoined_line/ver1/)

```js
var graph = new createjs.Shape();
stage.addChild(graph);
var count;
$("#button-play").on("click", playLine);
function playLine(event) {
	graph.graphics.clear();
	graph.graphics.setStrokeStyle(3, "round", "round");
	graph.graphics.beginStroke("#FF3366");
	graph.graphics.moveTo(-320, -120*Math.sin(-320*RADIAN));

	count = -320;
	createjs.Ticker.addEventListener("tick", updateLine);
}
function updateLine(event) {
	count += 4;

	var px = count;
	var py = 120*Math.sin(px*RADIAN);
	graph.graphics.lineTo(px, -py);

	if (count == 320) {
		graph.graphics.endStroke();
		createjs.Ticker.removeEventListener("tick", updateLine);
	}
}
```

[Subjoined Line (2) | CreateJS](http://labo.project-nya.jp/createjs/subjoined_line/ver2/)
太さを 3 に再設定して、さらに moveTo() しないと、太さ 3 にならない。

```js
var graph = new createjs.Shape();
stage.addChild(graph);
var count;
$("#button-play").on("click", playLine);
function playLine(event) {
	graph.graphics.clear();
	graph.graphics.setStrokeStyle(3, "round", "round");
	graph.graphics.beginStroke("#FF3366");
	graph.graphics.moveTo(-320, -120*Math.sin(-320*RADIAN));

	count = -320;
	createjs.Ticker.addEventListener("tick", updateLine);
}
function updateLine(event) {
	count += 4;

	var px = count;
	var py = 120*Math.sin(px*RADIAN);
	graph.graphics.lineTo(px, -py);
	//太さを再設定
	graph.graphics.setStrokeStyle(3, "round", "round");
	graph.graphics.moveTo(px, -py);

	if (count == 320) {
		graph.graphics.endStroke();
		createjs.Ticker.removeEventListener("tick", updateLine);
	}
}
```
Pythonオブジェクトを圧縮して保存したい


Pythonオブジェクトをファイルに書き込む際には，pickleによる直列化（シリアライズ）を使うのが効率的です．

しかし，pickleシリアライズは，単にオブジェクトを文字列に変換するだけであるため，メモリ・ディスク効率は必ずしも良くありません．

そこで，bz2による圧縮をこれに組み合わせます．以下が，ソースになります．

```py:compressed_pickle.py
import cPickle as pickle
import bz2

def loads(comp):
    return pickle.loads(bz2.decompress(comp))

def dumps(obj):
    return bz2.decompress(pickle.dumps(obj))

def load(fname):
    fin = bz2.BZ2File(fname, 'rb')
    try:
        pkl = fin.read()
    finally:
        fin.close()
    return pickle.loads(pkl)

def dump(obj, fname, level=9):
    pkl = pickle.dump(obj)
    fout = bz2.BZ2File(fname, 'wb', compresslevel=level)
    try:
        fout.write(pkl)
    finally:
        fout.close()
```

利用するときには，こんな感じになります．

```py:test.py
import compressed_pickle as pickle

# object
text = 'This implementation is written by @_akisato.'

# write to a file
outname = 'simple_text.pkl.bz2'
pickle.dump(text, outname)

# read from a file
inname = 'simple_text.pkl.bz2'
text2 = pickle.load(inname)

# dump to a memory
comp = pickle.dumps(text)

# load from a memory
text3 = pickle.loads(comp)
```
WordPressテーマユニットテストデータで確認してまた戻す

WordFesNagoyaに参加して「プログラミング初心者こそ取り組もう！テストファーストで作るこれからのテーマ・プラグイン開発」でテストを簡単に回せるようにしたいなーと思って、テーマユニットテストデータのインポートを楽にできるようにしてみました。（やっていた内容は違うけど・・・）
サイト用のすべてのデータを作ってbehatで表示確認・・・って回せたらサイトの確認とか楽ちんになりそうですね。

投稿の表示を確認するためにテーマユニットテストデータをインポートして確認してそのままだと納品できないのでデータを元のデータに戻します。
gistに登録してエイリアスから実行します。

# dbをexportしてからテストデータのインポート

[テーマユニットテスト](https://wpdocs.osdn.jp/%E3%83%86%E3%83%BC%E3%83%9E%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88)

```
vagrant ssh -c "mkdir /vagrant/tmp && wp db export /vagrant/tmp/local-`date +%Y%m%d%H%M`.sql || wp db export /vagrant/tmp/local-`date +%Y%m%d%H%M`.sql ; wget https://raw.githubusercontent.com/jawordpressorg/theme-test-data-ja/master/wordpress-theme-test-date-ja.xml --no-check-certificate  && wp plugin install wordpress-importer --activate && wp import wordpress-theme-test-date-ja.xml --authors=create && rm wordpress-theme-test-date-ja.xml"
```
```
vagrant ssh -c "mkdir /vagrant/tmp && wp db export /vagrant/tmp/unittest.sql || wp db export /vagrant/tmp/unittest.sql ; wget https://raw.githubusercontent.com/jawordpressorg/theme-test-data-ja/master/wordpress-theme-test-date-ja.xml --no-check-certificate  && wp plugin install wordpress-importer --activate && wp import wordpress-theme-test-date-ja.xml --authors=create && rm wordpress-theme-test-date-ja.xml"
```
※reset時のgawkがうまくいってなかったので固定のファイル名に変更

shellscriptの書き方がいまいちわかってないので指摘まってます。
テーマユニットテストデータをimportする前にsqlをexport してます。
※/vagrant/tmpが存在しているときはもう一回 wp db export してます。ワンライナーでの条件分岐の書き方がよくわからなかったので・・・

.bash_profileに登録してtestdataと実行するだけでインポートされるようにします。

```
alias testdata='curl -L https://gist.githubusercontent.com/GotoKazu/d8adf93c293bdd348baeaa91d1259c39/raw/9b43afd07d39eb5cfe70897561df1b469ab52f9e/theme_test_data_unittest_sql.sh | bash'
```

```
source ~/.bash_profile
```
vccwのVagrantfileのディレクトリで実行するとインポートされます。

[[WordPress] WP-CLIでテストデータをインポートする方法](https://b.0218.jp/20170904235255.html)

# テストデータを元に戻す

テストデータをインポートしたままではまずいのでテストデータをimportした際のデータ（tmpディレクトリ内の一番新しいsｑｌファイル）に戻したいです。


~~vagrant ssh -c "wp db reset --yes | wp db import - | ls -lt /vagrant/tmp/*.sql | head -n 1 | gawk '{print $9}'"~~

```
vagrant ssh -c "wp db reset --yes ; wp db import /vagrant/tmp/unittest.sql"
```


sqlをexportした時にlocal-[日時].sqlとしてますがtestdata.sqlなどにすれば読み込むときもそのまま指定できると思います。

こっちもaliasに追加してそのまま実行できるようにします。

```
alias testreset='curl -L https://gist.githubusercontent.com/GotoKazu/d8adf93c293bdd348baeaa91d1259c39/raw/9b43afd07d39eb5cfe70897561df1b469ab52f9e/theme_test_data_unittest_sql.sh | bash'
```
※gawkのところがうまくいってなかったのでファイル名を固定に変更。そのうちなおす。
```
source ~/.bash_profile
```

[シェルスクリプトで最新のファイル名を取得する](https://blog.cles.jp/item/2889)

## vccwを構築する際にそのまま設定することも・・・
vccw/site.yml

```
#
# Theme unit testing
#
theme_unit_test: true
# theme_unit_test_uri: https://wpcom-themes.svn.automattic.com/demo/theme-unit-test-data.xml
theme_unit_test_uri: https://raw.githubusercontent.com/jawordpressorg/theme-test-data-ja/master/wordpress-theme-test-date-ja.xml
```
[Ruby]ActiveRecordで動的にテーブルを作成する（Rails風味）。

##はじめに
Railsアプリを作成するまでもないけど、RailsのようにActiveRecordを快適に使いたいと思った時の一案。

##全体

```ruby:model_controller.rb
require "sqlite3"
require "active_record"

Dir[__dir__ + '/model/*.rb'].each(&method(:require))

ActiveRecord::Base.establish_connection(
  :adapter => 'sqlite3',
  :database => __dir__ + '/db/sample.sqlite3'
)

def create_test_table(code)
  table_name = "sample" + code.to_s + "s"
  table_sym = table_name.to_sym

  unless  ActiveRecord::Base.connection.table_exists? table_sym
    ActiveRecord::Base.connection.create_table table_sym do |t|
      t.string :name
      t.float :score
    end
    orm(table_name)
  end
end

private

# tableとmodelを関連付ける
def orm(table_name)
  model_name = table_name.singularize.camelcase
  file = __dir__ + '/model/' + model_name  + ".rb"
  create_class = "class #{model_name} < ActiveRecord::Base; end"
  IO.write(file, create_class)
  model_path = __dir__ + "/model/" + model_name
  require_relative model_path
end
```

[GIST](https://gist.github.com/chamao/21dc3bc75d6152170625cd05108b6c76)

##1:テーブルを作成する。
同じ構造のテーブルを何個も作りたいということを想定しています。
idカラムは自動的に作成されます。
[Ruby ハッシュのキーを変数で使いたい](https://teratail.com/questions/87303)

```ruby
def create_test_table(code)
  table_name = "sample" + code.to_s + "s"
  table_sym = table_name.to_sym

  unless  ActiveRecord::Base.connection.table_exists? table_sym
    ActiveRecord::Base.connection.create_table table_sym do |t|
      t.string :name
      t.float :score
    end
    orm(table_name)
  end
end
```

##2:テーブルとモデルを関連付ける。

先頭でmodelディレクトリ下のファイルを全て読み込むように設定します。
[Rubyでディレクトリ内のすべてのファイルをrequireする方法](https://www.xmisao.com/2014/03/29/best-way-to-require-all-files-from-a-directory-in-ruby.html)
[&演算子と、procと、Object#method について理解しなおす](https://qiita.com/kasei-san/items/0392097791d3a5998216)

```ruby
#Dir[File.dirname(__FILE__) + '/model/*.rb'].each {|file| require file }
Dir[__dir__ + '/model/*.rb'].each(&method(:require))
```

モデルディレクトリ下にActiveRecord::Baseを継承したモデルclass作成します。
[テーブル情報からModelを動的生成する方法 (ActiveRecordの単体利用時)](https://qiita.com/shindo-r@github/items/36676d0344d98082e891)


```ruby
def orm(table_name)
  model_name = table_name.singularize.camelcase
  file = __dir__ + '/model/' + model_name  + ".rb"
  create_class = "class #{model_name} < ActiveRecord::Base; end"
  IO.write(file, create_class)
  model_path = __dir__ + "/model/" + model_name
  require_relative model_path
end
```

```ruby
  model_path = __dir__ + "/model/" + model_name
  require_relative model_path
```
の部分で、modelディレクトリに新しく追加されたモデルクラスを読み込みます。


##使う

###基本
```ruby:main.rb
require_relative 'model_controller.rb'

create_test_table(7500)
puts Sample7500.count  #=> 0
Sample7500.create(name:"qiita",score:56.3)
puts Sample7500.count  #=> 1
```

###モデルの中でメソッド定義したい。
Railsと同じように作成されたモデルファイルの中にメソッドを書き込むだけでOK。

```ruby:model/Sample7500.rb
class Sample7500 < ActiveRecord::Base
 def self.hello
    puts "Hello from Model!"
 end
end
```

普通に使える。

```ruby
Sample7500.hello #=> "Hello from Model!"
```
WSL上のvimでcolorschemeの背景色を正しく表示する方法

# WSL上のvimだとctermbgやguibgが正常に設定されない
WSLのvimだと、Linuxと同じ設定のままではhilightにおけるctermbgやguibgが行頭から行末までしか設定されないことがあります。
ということで、その解決方法をメモっておきます。

# 解決方法
- `set t_ut=`を追記する

**これだけです！**
Macとsystemd-nspawnで普通の開発環境を作るまで(4)～実践編～

前回: [Macとsystemd-nspawnで普通の開発環境を作るまで(3)～ファイル共有設定～](https://qiita.com/yaasita/items/5c8894af70b1fba9c0b8#_reference-a0607a239890dcff64c5)

今回は実践編として、Railsの開発環境を作ってみます

# 概要

以下のようにDBコンテナを作って連携させてみます
Webコンテナについては[前回]((https://qiita.com/yaasita/items/5c8894af70b1fba9c0b8#_reference-a0607a239890dcff64c5))まで使っていたコンテナを流用します

![dbn.png](https://qiita-image-store.s3.amazonaws.com/0/106549/72795477-34af-c6ba-7243-20208edfeb4c.png)

# DBコンテナの作成


今回は気分を変えて、[Docker Hub](https://hub.docker.com/)から取得したDebianをDBコンテナとして立ててみます

ホストUbuntuサーバにログイン後rootになって以下のコマンドを実行します

```bash
# 必要パッケージインストール
apt update
apt install docker.io
# DockerからDebianのイメージを持ってくる
docker export $(docker create debian) > /tmp/debian.tar
machinectl import-tar /tmp/debian.tar
cd /var/lib/machines/
systemd-nspawn -D debian/
# ↓ここからコンテナ内
apt update
apt install -y systemd dbus postgresql
systemctl enable postgresql systemd-networkd
exit
# ↑ここまでコンテナ内
# ネットワーク設定
echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" > debian/etc/resolv.conf
curl -L https://goo.gl/2SDUwi > debian/etc/systemd/network/80-container-host0.network
machinectl enable debian
```

# Rails環境の準備

これでコンテナができたので後はpostgresqlの設定をするだけです

## debianコンテナ側

DBサーバ側は外部接続の許可を行います
ubuntu-hostにrootで入ってから以下のコマンドで準備します

```bash
# DBコンテナに入る
machinectl start debian
machinectl shell debian /bin/bash
# ↓ここからコンテナ
# 外部接続の許可設定
perl -i -ple 's#^host.*127.0.0.1/32.*#host all all 0.0.0.0/0 md5#' /etc/postgresql/9.6/main/pg_hba.conf
perl -i -ple "s/^#listen_address.*/listen_addresses = '\*'/" /etc/postgresql/9.6/main/postgresql.conf
systemctl restart postgresql
# DBとユーザを作成
echo "create user nspawnapp password 'nspawnapp'" | su -c psql - postgres
su -c 'createdb nspawnapp -O nspawnapp' - postgres
# コンテナから抜ける
exit
```

## ubuntuコンテナ側

こちらにはRailsをインストールします
（今回はあくまで動作確認なのでdebパッケージでRailsをインストールしてしまいます）

```bash
# ubuntuコンテナに入る
machinectl shell ubuntu /bin/bash
# ↓ここからコンテナ
# 必要パッケージインストール
apt update
apt install -y ruby-pg ruby-rails curl
# appユーザでrails new
su - app
cd /mnt
rails new nspawnapp --database=postgresql
cd nspawnapp
# DB設定とテーブル作成
curl -L https://goo.gl/yXWcRd > config/database.yml
rails generate scaffold Comment name:string message:string
./bin/rake db:migrate
# railsサーバ起動
rails s -b 0.0.0.0
```

# 確認

これでMacから http://192.168.56.3:3000/comments を開けば先ほど作ったHTMLが見れると思います
DBもつながっているので登録もできますし、Mac側(/Users/yamasita/mnt)から編集もできるはずです

表示されるRails画面

![rails.png](https://qiita-image-store.s3.amazonaws.com/0/106549/fd410c91-460b-4a71-2d1c-bcc93acd2c40.png)


今回はほとんどsystemd-nspawn関係ない話でしたが、要するにDocker等のコンテナイメージを`machinectl import-tar`コマンドで取り込んであとは普通のサーバのように設定すればそのまま動きますよーという事です
便利ですね

# まとめ

というわけで、Rails環境が作れました。
systemd-nspawnはまるで通常サーバのように（コンテナ内であることを意識しないで）使えるのがメリットなんじゃないかなと思いました。

個人的には、

* Docker→オーケストレーション等の多くのコンテナを使った管理
* systemd-nspawn→もともと普通のサーバとして動いているものの動作確認、開発環境を作りたい

こんな感じにDockerは一個一個が単一のプロセスで動くコンテナを管理したいときに、systemd-nspawnはサーバと同じように複数のプロセスが動くコンテナを作るときに使用するのが便利なんじゃないかなと思いました。
簡単に試せるので是非使ってみて欲しいです
UITableViewCellに画像を表示する際にKingfisherを使って出来るだけ最適化する

円形に画像を表示したい場合、UIImageViewのcornerRadiusをつけるとCoreGraphicsにメインスレッドで触れてセルの生成が遅くなる可能性があるので画像をそれっぽい感じに先に加工しておくとスクロールのスムーズさに貢献出来る（と思う）

KingfisherにはImageProcessorという機能があり、非同期に取得した画像を加工して表示することが出来る。
例えば円形に表示したい時はこんな感じ

```swift

extension Kingfisher where Base: ImageView {
  @discardableResult
  public func setCircleMaskedImage(with resource: Resource?,
                                   placeholder: Placeholder? = nil,
                                   options: KingfisherOptionsInfo? = nil,
                       progressBlock: DownloadProgressBlock? = nil,
                       completionHandler: CompletionHandler? = nil) -> RetrieveImageTask {
    let scale = UIScreen.main.scale
    let size = base.bounds.size.applying(CGAffineTransform(scaleX: scale, y: scale))
    let resizing = ResizingImageProcessor(referenceSize: size, mode: .aspectFill)
    let roundCorner = RoundCornerImageProcessor(cornerRadius: size.width / 2.0,
                                                targetSize: size,
                                                roundingCorners: .all,
                                                backgroundColor: base.backgroundColor)
    let imageProcess = DefaultImageProcessor().append(another: resizing).append(another: roundCorner)
    let items: KingfisherOptionsInfo = [.processor(imageProcess)]
    return setImage(with: resource,
                    placeholder: placeholder,
                    options: items + (options ?? []),
                    progressBlock: progressBlock,
                    completionHandler: completionHandler)
  }
}
```

のextensionを書いて
`imageView.setCircleMaskedImage(with: url)`と呼べばOK
UIScreen.main.scaleに関してはメインスレッドで呼ぶ必要があるので必要に応じてキャッシュしておくと良さそう。
交通機関の実例から学ぶUX/UI (1) 「不必要な情報を削る」

不特定多数が操作する業務システム的なものを構築することになったので、自分へのルールとして UX/UI について色々再整理しているところです。

不特定多数が利用するものの最たる例といえば公共交通機関。
良い UI も悪い UI も沢山存在していますし、画面"外"で起きる UX についても想起しやすく、UI/UX について考える題材として適切だと思います。

## 東急 大井町線から学ぶ失敗例

東急電鉄に田園都市線と大井町線という路線があります。大井町線の一部の列車は田園都市線に乗り入れています。
以下の路線図において <font color="#20A288">緑色■</font> で示されている路線が田園都市線、<font color="#f18c43">オレンジ色■</font> で示されている路線が大井町線です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/afefa47c-010b-eb48-1952-b0ed70a02e60.png)
[画像の出典：東急電鉄公式サイト](http://www.tokyu.co.jp/sp/map/expansion.html)

### 現状の説明
問題点を示す前に、この路線特有の状況を説明します。

#### 2種類ある「各駅停車」
この大井町線には「各駅停車」が2種類あります。<font color="green">緑</font> と <font color="blue">青</font> で色分けされています。
<font color="green">緑の各駅停車は高津駅・二子新地駅を通過し</font>、<font color="blue">青の各駅停車は全駅に停車する</font>、という風にアナウンスされています。

#### やや複雑な運行形態
大井町線の列車が田園都市線に一部乗り入れる形を取っているために少しややこしい事態が起きています。
溝の口～二子玉川駅の路線図だけに注目してもらえば大丈夫です。拡大してみました。大井町線には高津・二子新地の駅が描かれていませんね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/ebad2ef6-1a11-f557-3c13-cdafa7212046.png)


具体的に線路の様子を見てみるともう少し分かりやすくなります。
大井町線の線路も高津・二子新地を通っていることには通っているのですが、そもそもホームがないわけです。
つまり、「<font color="green">高津・二子新地に停車**しない**列車は大井町線の線路を走る</font>」「<font color="blue">高津・二子新地に停車**する**列車は、田園都市線の線路を走る</font>」ということになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/19ba5e9f-b0d7-9446-3eec-4c07f56a5671.png)

### 問題点：不必要な詳細情報というノイズ
やっと本題ですが、2種類の普通列車が存在することは利用者にとって重要です。
そのため、行先表示や発車案内表示、時刻表では色分けが行われています。
（下の写真は大井町線・自由が丘駅（**溝の口方面**）での表示）
![DSC_1170.JPG](https://qiita-image-store.s3.amazonaws.com/0/185296/4f9f7bf5-8417-028f-5087-596831bbe91e.jpeg)


しかし、この区別は全区間で必要なのでしょうか？
もしあなたが溝の口駅**以外**から大井町方面の列車に乗るとすれば、その列車はすでに高津・二子新地を通過しています。それらの駅に停車したかどうかはさほど重要な情報ではありません。

実際、案内表示でも全く同じ解説が書いてあります。
（下の写真は大井町線・自由が丘駅（**大井町方面**）での表示）
むしろ、初見であれば「なんか区別されているけれどどう違うか分からない」というノイズになるでしょう。
![DSC_1168.JPG](https://qiita-image-store.s3.amazonaws.com/0/185296/b9a7b980-0830-31b8-29e7-06fe77e9638b.jpeg)


## りんかい線から学ぶ成功事例
東京の臨海部にある、コミケの時に話題になるあの路線です。
以下の路線図において「りんかい線」と示されている部分です。JRの埼京線・川越線と相互乗り入れしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/aff301e3-ff3d-87e2-48b8-b632f1df09c3.png)
[画像の出典：東京臨海高速鉄道りんかい線公式サイト](http://www.twr.co.jp/route/tabid/105/Default.aspx)

直通先の埼京線内では快速・通勤快速となる列車もりんかい線内では全駅に停車します。

### 不必要な情報を削った表示
りんかい線内にある国際展示場駅における表示です。
黄色の四角で囲った部分をご覧ください。埼京線に直通する大崎方面には種別が表示され、どの列車に乗ろうとも各駅に停まる新木場方面では種別が省かれているのがわかると思います。
![RinkaiLine-trimmed-with-line.jpg](https://qiita-image-store.s3.amazonaws.com/0/185296/f5c9fdb2-9d52-d316-bde3-6c3b050a242f.jpeg)


## アプリケーション開発において学ぶべき点

### どの情報をユーザに見せるか取捨選択する

情報が多く表示されている方が開発者としては安心しますし、安心するしない以前の問題として開発中はなるべく多くの情報を確認すべきものでしょう。
しかし、その情報はユーザにとっても必要なのでしょうか？「ユーザが知っていても問題ないから」という理由でとりあえず見せておく、というのは逆効果になりそうです。

今回の例から学べることは

- 内部処理的には別モノであっても、ユーザから見て同じなら同一のものとして扱う。
- そもそもユーザが知らなくていい情報もある。公開できる（機密ではない）からといって見せる必要はない。
  + Webサービスなら、詳細な情報はAPIのみで提供すればよさそう。
- 過度な情報提供は混乱を招く。何事もシンプルに。
  + とはいえシンプルすぎると情報不足になる。バランスが難しいところなので、初見の人やそのアプリケーションに詳しくない人にレビューしてもらうなどして、最適解を見つけていくべき。
python setup.py install後のconsole_scriptでpkg_resources.DistributionNotFound: The '{package_name}=={version}' distribution was not found and is required by the application

- pyenvを使用している時にこのエラーに遭遇することがある。
    - その場合は、以下の対応で対処することができる。  
`/usr/local/bin/{console_script_name}`のシェバンを
`#!/usr/bin/python`から`#!/home/{user_name}/.pyenv/shims/python`に変更
   - もしくは、次のコマンドを実行することでも解決する。   
`mv /usr/bin/python /usr/bin/python.bak`  
`ln -s /home/miyagaw61/.pyenv/shims/python /usr/bin/python`
apt update で 404  Not Found もしくは Updating from such a repository can't be done securely, and is therefore disabled by default. もしくは W: Failed to fetch hogehoge Could not resolve host: hogehoge

- add-apt-repositoryで変なものを入れてしまった可能性がある。
その場合は、次のコマンドで治る。

```
cd /etc/apt/sources.list.d
sudo rm -rf ${失敗してるrepository}
sudo apt -y update
```
CloudantのQueryをケチる

#経緯
~~ケチる~~　無駄な処理をなくす、ですね。

Node-redでBotを書いていて、CloudantのLite枠内に収まるように動かすことを少し真面目に考えた時に、結構Queryがネックになってることに気がついた。
Documentを呼び出す時に最初何も考えていなかったのでQueryを使ってたわけですが、できるだけ使わない様にしたい。きっと早いはずだし。

#やること
至極当たり前だけど、各Documentの`_id`をシステムが入れてくれる値を使わず、アプリ側で入れる。
具体的には、BotでSession管理する時にSessionデータを入れるDocumentの`_id`はユーザー情報に紐づいたデータ（例えばユーザーのUUIDとか）などを使う方が良いと思われる。
その方が、QueryじゃなくてLookup（つまり`_id`でGetしに行く）で済む。Indexもいらなくなるし。Liteで20Lookup/sec vs 5Query/secだからえらく違ってくる。

ただ、UUID等をまんま使うのは何となくよろしくない気がするので、不可逆に加工したものを使う方がより良いんではないかと思う。

#その他
そもそもBotのSession管理で都度Writeするってのも如何なものかと思えてきたが、かといってどこに情報持たせるかってのもメンドイので後で考えることにする。

上限に引っかかるとCloudantでエラーになるってことは、アプリ側で待たされるんじゃなくて処理が止まると言う事を意味するとなると、スループットを調整して上限超えない様にするって事も考えないといけない。。
WSL上のvimでクリップボードを共有する方法

WSLでは既存の方法ではクリップボードをvimとシステムの間で共有させることができません。
どうやらWSLにはXserverが無くて、xselが使えないせいらしいです。
確かにターミナル上でもxselは使えませんでした。

# 解決方法
1. [ここ](https://github.com/equalsraf/win32yank/releases)からwin32yank.exeを落とす
2. win32yank.exeのPATHを通す
3. 以下をvimrcに追記

```:vimrc
nnoremap <silent>yy :.w !win32yank.exe -i<CR><CR>
vnoremap <silent>y :w !win32yank.exe -i<CR><CR>
nnoremap <silent>dd :.w !win32yank.exe -i<CR>dd
vnoremap <silent>d x:let pos = getpos(".")<CR>GpVG:w !win32yank.exe -i<CR>VGx:call setpos(".", pos)<CR>
nnoremap <silent>p :r !win32yank.exe -o<CR>
vnoremap <silent>p :r !win32yank.exe -o<CR>
```

vnoremap <silent>dの無理矢理感が凄いですけどね...（これより良い方法を知ってる方いらっしゃいましたら教えて頂けると有難いです）

# 追記

WindowsにXserverを導入してvimで使用する方法を教えて頂きました！(@EqualL2さんありがとうございます！)
成功したので、共有したいと思います！

1. [ここ](https://sourceforge.net/projects/vcxsrv/)からVcXsrvをインストールする
2. インストールが終わったらスタートメニューから「XLaunch」を実行(全てデフォルト値。クリップボードオプションにチェックが入っていることを確認してください)
3. bashrcに`export DISPLAY=localhost:0.0`を追記

# 追記

SSH時はここを参考にするとよさそう
https://qiita.com/miyagaw61/private/cb883d3d8bde7f104c97
プログラム超初心者メモ　if文

if(条件A){処理A;}
else if(条件B){処理B;}
else if(条件C){処理C;}
else (条件D){処理D;}
条件Aに当てはまってしまうと、１行目にしか処理されない。
条件Bに当てはまる場合は、２行目しか処理されない。

if(条件A){処理A;}
if(条件B){処理B;}
if(条件C){処理C;}
if(条件D){処理D;}
条件Aに当てはまっても、下の条件に当てはまれば下の行も処理される。

当然
else if(条件A){処理A;}
や
else (条件A){処理A;}
と書き始めることはできないので考える必要はない。

以下テストコード

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class _Switch : MonoBehaviour {

void Start(){
 int a =1;
 if(a==1){a++;}      //この処理しか入らない。
 else if(a==2){a++;} //もしかしらた処理されると勘違いしてしまいそうだがされない。
 else{a++;}          //elseまでが一括りで、この例では処理されない。
 print(a);           //これは結局、a=1がa++で　2がプリントされる

 int b =1;
 if(b==1){b++;}  //ここを処理し
 if(b==2){b++;}  //この条件にあうように変わったのでここも処理される
 else{b++;}      //それ以外の場合にしか処理しないので、この例では処理されない。
 print(b);       //これは結局、b=1がb++2回処理されるので　３がプリントされる
 }
}
```
将棋のAPIがあったら対戦つくれそうかな(2)・。・大変更・。・の予定が引き出しから。

🐮の仕様を読んでいないけれど。

フォーマットを、さらっと眺めて。
駒と空いているマスの数が並んでいると。

と・。・局面を送って、次のベストを送り返してもらえばいいのかな。

なんとなく。

考える時間設定ぐらいは必要で。

駒を動かして、駒をとったり、駒台から駒をうったり・。・動かせる位置はノーチェックでもいいけど。

と・。・そんなの、、、作ったような？？？。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/215245/92c6988d-d6cb-3d67-bfdc-c4ca57f2de11.png)

途中まで作った対戦版がありました。

どこまで作りこんでいるんだろう？。

切り口はTx,Rxになっているけど・・・そのまま使えそうだな。

ということで・。・半分完成５分。
PowerShellでWindowsの初期設定をする

windows server 2012 r2 用のメモ。
増量予定。

```ps1
$winTemp = "C:\Windows\Temp"
$lpurl = "http://fg.v4.download.windowsupdate.com/d/msdownload/update/software/updt/2013/09"
$lpfile = "lp_3d6c75e45f3247f9f94721ea8fa1283392d36ea2.cab"
$languagePackURI = "$lpurl/$lpfile"
Start-BitsTransfer -Source $languagePackURI -Destination $winTemp
Add-WindowsPackage -Online -PackagePath (Join-Path $wintemp $lpfile -Resolve)
Set-ItemProperty 'registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters' -Name 'LayerDriver JPN' -Value 'kbd106.dll'
Restart-Computer

Set-WinUILanguageOverride ja-JP
Set-WinHomeLocation 122
Set-WinSystemLocale ja-JP
tzutil /s "Tokyo Standard Time"
Restart-Computer
```

# 参考

AWS や Azure の英語UI をPowerShellで日本語UIにする - tech.guitarrapc.cóm - http://tech.guitarrapc.com/entry/2014/01/15/073820
Windows の TimeZone 設定をコマンドラインから行う - tech.guitarrapc.cóm - http://tech.guitarrapc.com/entry/2017/06/20/033946
ドラッグ&ドロップされたファイルのパスを（複数）取得する

#概要
ファイルをドラッグ&ドロップされた時、そのファイルパスを取得する。ファイルが複数であればそれら全てのファイルパスを取得する。

ネット上にはいくつか情報があるが、最新のSwiftでは動かないものも多いので、ここにメモとしてまとめておく。

#環境
Swift 4.0
macOS 10.13.1
Xcode 9.0.1

#コード
ドロップ先にしたいViewを継承し、以下のようなコードを実装する。

ちなみに、NSPasteboard.PasteboardType.fileURLが
macOS 10.13以上でないと使えないというエラーが出てしまう。
何か情報をお持ちの方は教えていただけるとありがたいです。

``` Swift:FileDropView.swift
import Cocoa

class FileDropView: NSView {
    
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        commonInit()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    
    func commonInit() {
        self.registerForDraggedTypes([.fileURL])
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
    }
    
    func shouldAllowDrag(_ draggingInfo: NSDraggingInfo) -> Bool {
        let pboard = draggingInfo.draggingPasteboard()
        
        if pboard.canReadObject(forClasses: [NSURL.self], options: nil) {
            return true
        }
        return false
    }
    
    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        return shouldAllowDrag(sender) ? [.copy] : []
    }
    
    override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
        return shouldAllowDrag(sender)
    }
    
    override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
        let pboard = sender.draggingPasteboard()
        
        if let urls = pboard.readObjects(forClasses: [NSURL.self], options: nil) as? [URL] {
            for url in urls {
                print(url)
                // 何らかの処理
            }
        }
        return true
    }
}

```


#更新履歴
2017.11.21 投稿
ボタンを押して画面を遷移する説明は多くあったが、一定時間後に自動で画面遷移があまりなかった。

http://tech.pjin.jp/blog/2016/01/06/「5秒後に画面遷移する」という仕組みをswiftで実装/


↑
2017/11/21に使ってみたら
'performSegueWithIdentifier(_:sender:)' has been renamed to 'performSegue(withIdentifier:sender:)'
と警告あり



と

http://swift.tecc0.com/?p=669

を組み合わせればできそう
ContainerViewで設定したChildViewControllerを参照する方法

Storyboardで、以下のようになっている時

- 親ViewControllerはA
- 子ViewControllerはB
- A.containerView -(embedSegue<id: "AembedB">)-> B

どうやってAからBを参照するのか。

```
class A: UIViewController {
  var b: B!

  override func prepare(for segue: UIStoryboardSegue) {
    if segue.identifier == "AembedB" {
      b = segue.destination as! B
    }
  }
}
```

## ちなみに
- A#childViewControllersからfilterしても取得はできるが筋が悪い
- BからAを参照したいと思ったならそれは設計が悪い

## Version
- TargetIOSVersion: 10.0(latestは11)
- XCodeVersion: 9.1
【Git メモ】fast-forwardとnon-fast-forwardの違いと、それらを親ブランチにmergeした時のコミットログの違い。

fast-forwardでない関係でmergeした時のコミットログがどうなるか気になったので確認してみた。[githubリポジトリ](https://github.com/residenti/check-fast-forward-commit-log)。

## fast-forwardな関係
親ブランチ：master
コミットログ：A

子ブランチ：check-fast-forward
コミットログ：A => B

## fast-forwardな関係でmergeした場合のコミットログはどうなるか？
A. コミットログ：A => B  

## fast-forwardでない関係
親ブランチ：master
コミットログ：A => B => C

子ブランチ：non-fast-forward  
コミットログ：A => B => D


## fast-forwardでない関係で、mergeした場合のコミットログはどうなるか？  
A. コミットログ：A => B => C => D => **E**
2つのブランチがfast-forwardでない関係でmergeをすると、マージ後にコミット(E)が作成される。(コンフリクトがある場合は、修正してadd,commit）。
ChainerでLSTM + Attentionを計算する

ChainerでLSTMを使いたい方向けに簡単に使い方を書きます。

# 前準備
## 入力形式
```
import numpy as np
from chainer import Variable
import chainer.functions as F
import chainer.links as L

## 入力データの準備
x_list = [[0, 1, 2, 3], [4, 5, 6], [7, 8]] # 可変長データ (4, 3, 2)の長さのデータとする
x_list = [np.array(x, dtype=np.int32) for x in x_list] # numpyに変換する
batchsize = len(x_list) # 3
```
上記のデータはバッチサイズ3, 長さがそれぞれ4,3,2のデータです。

## Word Embeddings
```
n_vocab = 500
emb_dim = 100
word_embed=L.EmbedID(n_vocab, emb_dim, ignore_label=-1)
```


## NStepLSTM, NStepBiLSTM
```
use_dropout = 0.25
in_size = 100
hidden_size = 200
n_layers = 1

bi_lstm=L.NStepBiLSTM(n_layers=n_layers, in_size=in_size,
                      out_size=hidden_size, dropout=use_dropout)
```

## LSTMに入力データを渡す
```
# Noneを渡すとゼロベクトルを用意してくれます. Encoder-DecoderのDecoderの時は初期ベクトルhxを渡すことが多いです.
hx = None 
cx = None 

xs_f = []
for i, x in enumerate(x_list):
    x = word_embed(Variable(x)) # Word IndexからWord Embeddingに変換
    x = F.dropout(x, ratio=use_dropout) 
    xs_f.append(x)

# xs_fのサイズは
# [(4, 100), (3, 100), (2, 100)]というVariableのリストになっている

hy, cy, ys = bi_lstm(hx=hx, cx=cx, xs=xs_f)
```
`ys`がNStepBiLSTMの最終層のベクトルの各ステップのベクトルが返ってきます。


# Attentionを計算する
```
concat_ys = F.concat(ys, axis=0) # (9, 400)
linear = L.Linear(400, 1)  # Attention用に 400 -> 1 のLink (モデルによってはDecoderのhidden vector (400次元))
attn = linear(concat_ys) # (9, 1)
split_attention = F.split_axis(attn, np.cumsum([len(x) for x in x_list])[:-1], axis=0) # [_.shape for _ in split_attention]は [(4, 1), (3, 1), (2, 1)]
split_attention_pad = F.pad_sequence(split_attention, padding=-1024.0) # -1024でパディングする
# ここでpadding=-1024.0でパディングすることで, softmaxで計算した時のexp(-1024.0) => 0.0となる
attn_softmax = F.softmax(split_attention_pad, axis=1) # Softmaxを計算する

### パディングした部分が0.0になってくれる
print(attn_softmax)
# variable([[[ 0.26594046],
#           [ 0.2388579 ],
#           [ 0.2923921 ],
#           [ 0.20280953]],
#
#          [[ 0.30548543],
#           [ 0.39249265],
#           [ 0.30202195],
#           [ 0.        ]],
#
#          [[ 0.46441966],
#           [ 0.53558034],
#           [ 0.        ],
#           [ 0.        ]]])

ys_pad = F.pad_sequence(ys, length=None, padding=0.0) # hidden vectorの部分を0.0でpaddingする 
# ys_pad.shape => (3, 4, 400)
ys_pad_reshape = F.reshape(ys_pad, (-1, ys_pad.shape[-1]))
# ys_pad_reshape.shape => (12, 400)

attn_softmax_reshape = F.broadcast_to(F.reshape(attn_softmax, (-1, attn_softmax.shape[-1])), ys_pad_reshape.shape)
# attn_softmax_reshape.shape => (12, 400)

attention_hidden = ys_pad_reshape * attn_softmax_reshape 
# attention_hidden.shape => (12, 400)

## F.sum
attention_hidden_reshape = F.reshape(attention_hidden, (batchsize, -1, attention_hidden.shape[-1])) # (3, 4, 400)
result = F.sum(attention_hidden_reshape, axis=1) # (3, 400)

```
pythonでStackとQueueを実装してみた

こんにちはsoheiです:grin:
今回は次回学習しようと思っている幅優先探索と深さ優先探索で使うStackとQueueを実装してみたいと思います。

#実装
・Stack

```python:sohei.py
class Stack:
	def __init__(self,data = []):
		self.data = data
	def push(self,x):
		self.data.append(x)
		return self.data
	def pop(self):
		if len(self.data) == 0:
			return "Stack is Empty!"
		else:
			cell = self.data.pop()
			return self.data
```
・Queue

```python:sohei.py
class Queue:
	def __init__(self,data = []):
		self.data = data
	def enqueue(self,x):
		self.data.append(x)
		return self.data
	def dequeue(self):
		if len(self.data) == 0:
			return "Queue is Empty!"
		else:
			cell = self.data[0]
			del self.data[0]
			return self.data
```
では実際にタスクを実行してもらいたいと思います。

```python:sohei.py
#Stack
Test_S = Stack()
print Test_S.push("task1")
print Test_S.push("task2")
print Test_S.push("task3")
print Test_S.pop()
print Test_S.pop()
#Queue
Test_Q = Queue()
print Test_Q.enqueue("task1")
print Test_Q.enqueue("task2")
print Test_Q.enqueue("task3")
print Test_Q.dequeue()
print Test_Q.dequeue()
```

```
#実行結果
['task1']
['task1', 'task2']
['task1', 'task2', 'task3']
['task1', 'task2']
['task1']
['task1']
['task1', 'task2']
['task1', 'task2', 'task3']
['task2', 'task3']
['task3']
```
ちゃんと作動してくれました:laughing:

#学んだ知識
・Stack,Queueという概念について
・幅優先、深さ優先について
・Classについて

#考察
今回の学習で気づいたことがあります。
それは、**StackやQueueの考え方は日常でよく使われている**ということです。
例えば、文房具屋のノートの陳列です。ノートがなくなったら店員さんは奥の方からノートを置いていきお客さんは手前からノートをとりますよね。あれはStackが使われていると思います。
また、美味しいラーメン屋の行列は、先に並んだ人からラーメンを食べられますよね。
あれはQueueが使われていると思います。
また、幅優先探索や深さ優先探索に使われたりと、奥が深くいろいろなものに応用できるということも感じました。

今回はここら辺で失礼します。
次回は幅優先と深さ優先を学びたいと思います。
テストのためのクラス名をプロダクションビルドで除去する [react,jsx]

## テストのためのクラス名をプロダクションビルドで除去する [react,jsx]

[**idやclassを使ってテストを書くのは、もはやアンチパターンである**](https://qiita.com/akameco/items/519f7e4d5442b2a9d2da)

上記の記事を書いたところ、様々な反応があり非常に勉強になりました。

中でも気になったのが、class名に規約を設け、`test-`というプレフィックスを付けるものです。
個人的には、カスタムデータ属性の方が分離する際の見通しが良く、またCSSinJSにも適用できるのでこちらを推しますが、チーム内で共通の理解がある場合は、クラス名で制約を付けるのは良い解決作だと思います😆
さらに言えば、この問題の本質は、いかにチーム内で同意が得られるかに尽きます(data-testを書いたところで共通認識がなければ意味がないですから)

さて、class名のよる`test-`プレフィックスについて、ちょっと見たところプロダクション時に取り除くプラグインはないようでした。

なのでちょっと作ってみました。

[akameco/babel-plugin-react-remove-classname](https://github.com/akameco/babel-plugin-react-remove-classname)

### インストール

```
$ yarn add --dev babel-plugin-react-remove-classname
```

以下にように`test-`と付いたクラスを削除します。

```js
const hello = () => (
	<div className="test-a hello test-b"></div>
)

      ↓ ↓ ↓ ↓ ↓ ↓

const hello = () => (
	<div className="hello"></div>;
)
```



data-testのプラグイン同様にプロダクション時に有効にするといいと思います。

```json
{
  "env": {
    "production": {
      "plugins": ["react-remove-classname"]
    }
  }
}
```

## まとめ
日々よりよい手法について考えを深めていきたいものです。
何か議論があれば、コメント欄またはツイッターで議論しましょう。(ブコメでもいいですが、反応しずらいので、同時に呟いてくれると助かります🙆‍♂️)

なお、基本的にツイートには全て反応し、随時記事を更新したいと考えいますので、ご協力よろしくお願いします🙇また、前回の記事についてツイッターで議論して下さった方どうもありがとうございました。


## おまけ
上記のプラグインはAtomのteletypeを使ってライブコーディングで作りました。
見てくださった方ありがとうございました🙇
楽しかったです😆

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">今から30分ぐらいバベルプラグインを書こうと思うんですが、Atomのshare貼っておくので暇な人は入ってどうぞ。適当に書くので進捗なくてもご容赦を c7640696-4ec3-4d64-abe2-c23304d10e0f</p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/932545915516108800?ref_src=twsrc%5Etfw">November 20, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
[Cinema 4D] Pythonを使ったインターフェイス構築

Cinema 4Dのプラグインを作成するうえで欠かせないのがパラメータ設定を行うインターフェイスの設定です．

ここでは.str, .h, .resファイルを用いた方法でインターフェイスを作成するための初歩的な備忘録として記しておきます．

sample.h

```
#ifndef _SAMPLE_H_
#define _SAMPLE_H_

enum
{
    SAMPLE_1 = 1,
    SAMPLE_2,
    ...
}

#endif
```

sample.str

```
STRINGTABLE SampleStringTable
{
    Tsample    "SampleStringTable";
    SAMPLE_1   "Sample_1";
    SAMPLE_2   "Sample_2";
    ID         "Name";
    ...
}
```



.resではパラメータの型やスライダなのか，プルダウンメニューなのかなどを設定する．ヘッダーファイルとストリングを定義しているので，後はCinema 4D SDKにならい必要なパラメータとして設定します．
パラメータはBUTTONやLONG,MATRIXなどの型を記述し，続いてIDを記述します．この時点でパラメータの初期値および最大値などを設定することもできます．

[GROUP](https://developers.maxon.net/docs/Cinema4DCPPSDK/html/page_dialog_resource__g_r_o_u_p.html)ではCOLUMNを設定することで，複数列のコラムを作成できます．

[CYCLE](https://developers.maxon.net/docs/Cinema4DCPPSDK/html/page_descriptionresource__l_o_n_g.html#section_descriptionresource_LONG_cycle)を使ってドロップダウンメニューを作成できる．複数のIDを階層内に記述します．

sample.res

```
CONTAINER Tsample
{
    NAME Tsample;
    INCLUDE Tbase; #タグベース Obase，Mbaseなどプラグインタイプにより変更可
    
    GROUP ID_TAGPROPERTIES
	{
		BUTTON SAMPLE_1 { }
		MATRIX SAMPLE_2 { }

		SEPARATOR { SCALE_H; LINE; }

		LONG ID
		{
			CYCLE 
			{
				ID;
				ID;
			}
		}
		MATRIX ID { }

		SEPARATOR { SCALE_H; LINE; }

		BUTTON ID { }
		LONG ID   { MIN 1; MAX 1000; }

		GROUP ID 
		{
			COLUMNS 2;
			ID  { }
			ID  { }
		}
	}
}
```

上記のサンプルとパラメータは異なるが，BUTTON，MATRIX，GROUP，CYCLEなどを使うと次のようなGUIができる．パラメータは当然ながらほかにも沢山あります．タグプラグインとして作成したタグにパラメータを設定しました．

![20171120.jpg](https://qiita-image-store.s3.amazonaws.com/0/195698/ddbf60a3-5c17-bef9-4d21-e8c7944777b7.jpeg)
【私的メモ用】VirtualBoxでCentOS6.9の仮想マシンを作成

大したことは書けないですけど、自分用にメモ。

タイトルの通り、仮想マシンを作成してみた。
具体的にはQiitaでも記事が上がっているので、それを見ながら作成した。
関連キーワードで検索したら、大抵のことは出てくるので、Qiitaは便利だなあと思った。

Windows10にVirtualBox 5.1をインストールする
https://qiita.com/ringo0321/items/afa176192d9b5edf923d

VirtualBox (Windows) 上に CentOS 7 をインストールする
https://qiita.com/100/items/80a899fbaeb1e82b3f67

【Virtual Box】Virtual BoxでCentOS6.6-32bitの仮想マシンを入れた
https://qiita.com/sksmnagisa/items/0c46b10e9048ee92e513
　
　
　
以下に、Qiita以外に参照した記事を載せておく。

VMDK形式のままになっているVirtualBoxの仮想マシンイメージをVDI形式に変換したら速くなるのか
http://www.lanches.co.jp/blog/2218
仮想マシンイメージをVDI（VirtualBoxでの仮想マシンイメージ）にすべきかほかにすべきか調べるときに参照。
基本的には他の仮想ソフトで使うかどうかで決めればいいらしい。

パッケージグループの選択のポイント
http://www.obenri.com/_install_cent6/package1_cent6.html
インストール中に一緒にいれるソフトを選択するときに参照。
centOSインストール全般についての説明も詳しく掲載されている。

CentOS6 インストール
http://www.yocchi01.mydns.jp/webnote/archives/1009
同じくインストール中に一緒にいれるソフトを選択するときに参照。
結局これを見て一緒にいれるソフトを決めた。

あと、以下に捕捉のスクリーンショットを掲載しておく。
パーティションを設定する画面での設定内容。
今回はとりあえずインストールをするといったところだったので、デフォルト選択の「既存のLinuxシステムを入れ替える」を選択。
![ディスクパーティション１.png](https://qiita-image-store.s3.amazonaws.com/0/190040/67bb9591-3e9b-a242-444f-7810643ff719.png)

選択すると、以下のように仮装ディスク容量に応じて自動でパーティションを区切ってくれる。
実際にサーバを作成する場合でも、まず規定設定を選んでそのあとに調整するのがよいか。
![ディスクパーティション２.png](https://qiita-image-store.s3.amazonaws.com/0/190040/3ba3de86-0ea6-8c3b-c0a0-6217a2e3a3d6.png)

後は、フォーマット警告と、構成を反映させて良いかの確認メッセージなので、実行する。
![ディスクパーティション３.png](https://qiita-image-store.s3.amazonaws.com/0/190040/5416f708-5215-6503-a590-69b815a6997b.png)
![ディスクパーティション４.png](https://qiita-image-store.s3.amazonaws.com/0/190040/046c0e3e-555b-628c-473c-50244b3e62aa.png)
　
　

それにしても、CentOSのisoを探すのに一番時間がかかったのは情けない。。
必死に32bit環境に64bit版を入れようとしていたなんて。。（爆
【MySQL】timestamp型・datetime型のデータを使って、日付ごとにgroup byする【substring_index】

:small_blue_diamond:2018/02/02 追記：substring_indexの内部の動きがものすごく間違っていたので修正

先日、「2017-11-19 21:18:52」というようなtimestamp型のデータを使って、日付ごとにカウントを取ってほしいと言われ、思わず「そんな無茶な:exclamation:」と言った私を救ってくれた関数「substring_index」の使い方についてです。

# やりたいこと
以下のようなテーブルがあったとします。

| ID | createDate |
|:-:|:-:|
|1|2017-11-19 21:18:52|
|2|2017-11-17 01:24:31|
|3|2017-11-17 02:18:37|
|4|2017-11-19 05:10:04|
|5|2017-11-16 16:28:39|
|6|2017-11-19 02:18:12|
|7|2017-11-16 12:40:35|

日付ごとのレコード数のカウントを取りたいので、以下のような結果を出したい:arrow_down:

| createDate | count(createDate) |
|:-:|:-:|
|2017-11-16|2|
|2017-11-17|2|
|2017-11-19|3|

# とにかくやってみる
「2017-11-19」に作成されたデータは、IDが１・４・６の３つです。
日付ごとにカウントしたいので、こんな:arrow_down:select文を書いてみました

```SQL
select createDate, count(*) from テーブル名 group by createDate;
```

このselect文で、createDateごとにカウントが取れるはず:exclamation:
しかし、createDateはtimestamp型なので、このような結果になってしまいます:arrow_down:
これでは、やりたいことと違いますね:disappointed_relieved: 

| createDate | count(createDate) |
|:-:|:-:|
|2017-11-16 12:40:35|1|
|2017-11-16 16:28:39|1|
|2017-11-17 01:24:31|1|
|2017-11-17 02:18:37|1|
|2017-11-19 02:18:12|1|
|2017-11-19 05:10:04|1|
|2017-11-19 21:18:52|1|

# substring_indexを使ってみる

## substring_indexとは
内部の動きはこんな感じ:arrow_down: 
1. 第２引数で指定された文字を使って、 ~~第１引数で指定した文字列全体を区切る。~~ 第１引数の中で、１個目の第２引数が出てくるところまで、２個目の第２引数が出てくるところまで・・・と少しずつ長い文字列を取得していく。
2. ~~先頭から~~ 最初に取得した順にindexを振る（先頭は:one:ですよー）。
3. 第３引数で指定したindexの文字を取得する。

なので、substring_index('2017-11-19 05:10:04', ' ', 1)ってやると、
1. 「2017-11-19 05:10:04」を「2017-11-19」と「~~05:10:04~~ 2017-11-19 05:10:04」に分ける。
2. 「2017-11-19」にindex=1を、「~~05:10:04~~ 2017-11-19 05:10:04」にindex=2を振る。
3. index=1である「2017-11-19」を返す。

# substring_indexをつかって
再度SQLを書いてみる（｀・ω・´）b

```SQL
select substring_index(createDate, ' ', 1), count(*)
from テーブル名
group by substring_index(createDate, ' ', 1);
```
無事、想定通りの結果が返ってきました:arrow_down: 

| createDate | count(createDate) |
|:-:|:-:|
|2017-11-16|2|
|2017-11-17|2|
|2017-11-19|3|

めでたし、めでたし:star:
レガシーコード改善ガイド用語集

# はじめに

[レガシーコード改善ガイド](https://www.amazon.co.jp/dp/B01AN97W08)はレガシーコードを扱う上で良い本だが、用語集を含めいかんせん読みづらい。そこで用語集を作ってみた。

# 用語集

- 編集して祈る：とりあえず実装してから天に品質を任せる。
- 保護して変更する:変更対象のソースコードのテストコードを描いてからテストする。
- テストハーネス:自律したテスト用コード
- 擬装オブジェクト：協調クラスを擬装したもの。モックオブジェクトを大まかに捉えらたもの（要クラス図)
- 接合部:ソースコードを直接編集できなくても振る舞いを帰れる場所。プリプロセッサ接合部、リンク接合部、オブジェクト接合の三つがある。
- 許容点：上記の具体的な場所。
- モックオブジェクト：それっぽく動くように作りこうた擬装オブジェクト
- 単体テストハーネス:単体テストを行うためのソフトウェア。xUNITとか
- スプラウトメソッド:既存のメソッド内に追加する新しいロジックをメソッドにする。
- スプラウトクラス：既存のクラスに追加する新しい制御をクラスにする。
- ラップメソッド：既存のメソッドを同じメソッド名でラップして修正コードを付け加える。
- ラップクラス：既存のクラスを同じクラス名でラップして修正クラスを付け加える。
- 影響スケッチ(171)：
- 割り込み点：他の部分と切り離してテストがかける場所。
- 絞り込み点：影響スケッチの矢印が集まる場所。
- 仕様化テスト：現状の動作を仕様として表現した単体テスト
- 検出用変数：デグレを検知するために埋め込んだ（グローバル）変数
- 機能スケッチ(268)：
- 試行リファクタリング：ソースコード理解するに、ローカルリポジトリで行うリファクタリング。リモートにコミットはしない。

# 図

## 改善後のクラス図
![レガシーコード.png](https://qiita-image-store.s3.amazonaws.com/0/39706/233afbfc-bf30-e1f6-dcce-fcbb710db3b2.png "クラス図")

## スプラウトメソッド/クラスを追加した時のシーケンス図
![スプラウトメソッド_クラス.png](https://qiita-image-store.s3.amazonaws.com/0/39706/51aa13d0-2292-61b8-3489-95be0619d2ff.png "スプラウトメソッド/クラスを追加した時のシーケンス図")

## ラップメソッド/クラスを追加した時のシーケンス図
![ラップメソッド_クラス.png](https://qiita-image-store.s3.amazonaws.com/0/39706/e31e00c6-6271-bce0-5ee2-966ed7399b39.png "ラップメソッド/クラスを追加した時のシーケンス図")
デリミタを指定しつつ、複数の要素を結合したい。


多くの現代的なプログラミング言語ではリストや配列の要素をデリミタを指定しつつ結合するメソッド・関数が用意されています。このような機能のメソッドや関数には多くの場合`join`という名前がつけられており、コレクション操作を多用する実務的なプログラミングでは大変重宝します(以下の例はRuby)。

```rb
p %w(1 2 3 4 5).join("+")
# => 1+2+3+4+5
```

同様の機能をbashにおいて実現したいという場合、とりわけ「標準入力から与えられた複数の行をデリミタを指定して1行に結合したい」場合は`paste`コマンドを利用します。なおこのとき縦方向の連結を意味する`-s`オプション、デリミタを指定する`-d`オプションをそれぞれ使っています。

```sh
$ seq 1 5 | paste -sd+
1+2+3+4+5
```

なお複数要素の結合する機能は`join`という名称であることが多いと書きましたが、ややこしいことに`join`というコマンドは存在し「複数要素の結合を提供する機能」とはまったく別の機能を提供します。ここでは詳細に書きませんが`join`というコマンドそれ自体は大変有用なので、覚えておくと便利です(SQLの結合、Excelのvlookupのような使い方ができるコマンドです!!!)
sfパッケージを用いてRでshapefileを読み込む時につまづいたところ

##はじめに
Rで空間解析に挑戦中の羊です。
shapefileの読み込みという初歩の初歩でつまづいたので忘備録も兼ねて回避方法に関する考察をば。

##ソフトとか
- R (ver.  3.3.3)
 - sfパッケージ   
- QGIS (ver. 2.18.9) 
 - OpenLayersPlugin

##サンプルの準備【QGIS】
大阪駅（135.495951E, 34.70249N）にしました。このポイントを"samplePoint.shp"として保存しておきます。
なお背景地図はOpenStreetMapです。
![スクリーンショット 2017-11-20 22.57.26.png](https://qiita-image-store.s3.amazonaws.com/0/193657/62647aa2-b637-4b26-1726-e9cda6c05657.png)



##前準備【R】
今回shapefileの読み込みに用いるパッケージはsfパッケージです。これまで使ってきたのはspパッケージなのですが、今後は[「RでGISをやるときにはsfパッケージ、という世の中になるらしい。」](http://notchained.hatenablog.com/entry/2017/01/06/213333)です。
他に参考にしたのは以下の公式ドキュメント及び記事です。
> [sf.pdf](https://cran.r-project.org/web/packages/sf/sf.pdf)
[Rでシェープファイルを読み込む](https://qiita.com/nozma/items/bf8936df6b3a3882285a)

##shapefileの読み込みからプロットまで【R】
sfパッケージを読み込み、サンプルデータの存在するフォルダを指定してshapefileを読み込みます。

```R:sample.R
library(sf)
samplePoint = sf::st_read(dsn = "input/data/")
```

ここまではうまくいきました、そう__ここまでは__
次にサンプルポイントをプロットします。sfパッケージでは特別な指定なしにプロットできて便利らしいです。

```
> plot(samplePoint)
 if (xsize * ysize * n > prod(total_size)) { でエラー: 
   TRUE/FALSE が必要なところが欠損値です 
```


はい、エラーですね。
（何でや… plot()で簡単にプロットできるんじゃなかったんですか…！）

##エラーの原因を考察する
はじめは妖怪全角の仕業かと思いデータを洗い直しましたが、見つからず。
うまくプロットすることを優先して簡単なポイントを生成してプロットを試してみるテスト

```R:checkTest.R
x <- c(135.495951, 34.702485)
testPoint <- st_point(x)
plot(testPoint)
```
![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/193657/490794b0-fa60-176b-2f0a-782a11afca37.png)

あれ？できますやん（色気のないプロット結果で申し訳ないです）
ここでようやくデータのクラスに注目する発想にいたりclass関数によるチェック

```
> class(testPoint)
[1] "XY"    "POINT" "sfg"  

> class(samplePoint)
[1] "sf"         "data.frame"

```

両者を比較するにどちらもうまくプロットしそうな印象。
しかし"samplePoint"がプロットできない。"sf"は明らかにsfパッケージに関するものなので"data.frame"の部分がエラーの原因かと考えられます。
"samplePoint"のデータの構造をのぞいてみると

|id |X |Y |geometry| 
|---|---|---|---|
|1 |135.495951 |34.702485 |c(135.495951, 34.702485) |

"id"及び"X","Y"は'samplePoint.shp'の属性テーブルに記載されていたもので、"geometry"に関しては新たに追加されたものでした。
つまりこのgeometryをプロットすれば…！

```
> plot(samplePoint$geometry)
```
![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/193657/490794b0-fa60-176b-2f0a-782a11afca37.png)
できました！

```R:checkTest.R
> class(samplePoint)
[1] "sf"         "data.frame"
> class(samplePoint$id)
[1] "numeric"
> class(samplePoint$X)
[1] "numeric"
> class(samplePoint$Y)
[1] "numeric"
> class(samplePoint$geometry)
[1] "sfc_POINT" "sfc"      
```

やはり"samplePoint$geometry"がsfパッケージに関するもののようです。

##終わりに
今後属性テーブルに値が入ったshapefileを用いて空間解析やってみたいと思ってるので今回のエラーはいつかぶつかりそうなので今でよかったです（前向き）
これからは脱ArcGISを目標に色々とRで分析してみたいと思います。
rubyからPDFフォームを使うpdf-forms(pdftk)の紹介

さあ、良い子のみんなが大好きな帳票ソリューション系のお話だよ！

え？そんなの聞き飽きたって？いつものExcel + Word + VB Script + Windows の話と勘違いしているようだね。

今回はちょっとだけ違うよ、Linux + rubyでPDFを扱う話だから楽しめると思うよ。

## 事前準備

という事で、rubyでPDFフォーム（形が作られている穴あき形式）を出力するプログラムの紹介をします。

この記事はUbuntu16.04を利用して動作確認をしています。

まずは[pdftk](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)をインストールします。

```
$ sudo apt install pdftk
```

次にrubyもインストールします。

```
$ sudo apt-add-repository ppa:brightbox/ruby-ng
$ sudo apt update
$ sudo apt install ruby2.4 ruby2.4-dev
```

rubyからpdftkを扱うためのライブラリである[pdf-forms](https://github.com/jkraemer/pdf-forms)をインストールします。

```
$ sudo gem install pdf-forms
```

PDFフォームは検索したら出てきたサンプルをお借りしました。

```
$ wget http://foersom.com/net/HowTo/data/OoPdfFormExample.pdf
```

ちなみにPDFフォームは有料になりますが[Adobe Acrobat](https://acrobat.adobe.com/jp/ja/acrobat.html)で作成すると楽ですよ。

## PDFフォームに値を入れて出力する

rubyのプログラムに移りましょう。PdfFormsのインスタンスを作ります。

```rb
require 'pdf_forms'
pdftk = PdfForms.new(`which pdftk`.chomp, utf8_fields: true)
```

値が入れられるフィールドを取得するには`get_field_names`を利用します。

```rb
pdftk.get_field_names 'OoPdfFormExample.pdf'
```

上記をコマンドから実行するには以下のようになります。

```
$ pdftk OoPdfFormExample.pdf dump_data_fields_utf8
```

出力先のpdfを開いておきます。Ubuntuなので[evince](https://wiki.gnome.org/Apps/Evince)が便利です。

```
$ evince OoPdfFormExample-filled.pdf
```

`fill_form`にパラメーターを指定すると値を埋め込む事ができます。

```ruby
pdftk.fill_form 'OoPdfFormExample.pdf',
  'OoPdfFormExample-filled.pdf',
  {"Given Name Text Box" => "tkosuga"}
```

`evince`で開いているファイルが自動更新されてPDFフォームに値が入ったと思います。

このライブラリはutf8も対応しているのでドイツ語を入れて見ましょう。※PDFの方でフォントが入っている必要があります。

```ruby
pdftk.fill_form 'OoPdfFormExample.pdf',
  'OoPdfFormExample-filled.pdf',
  {"Given Name Text Box" => "Grußkarten"}
```

大丈夫ですね。

## まとめ

PDFを生成するライブラリはたくさんありますが、PDFのテンプレートをプログラムで作ったりHTMLから変換するのが面倒だったりします。

それであれば最初からPDFフォームに値を入れ込む形にする方が多くの場合で奇麗に出力できるし楽だと思います。

JavaのiTextぐらいプログラムから色々できれば便利ですが、`pdftk`をコマンドから操作するのでも多くの事が出来ます。

どうしてもrubyでiText相当の事を行いたい場合はjrubyを使いましょう。
【便利機能】x-codeでStoryboardでのアウトラインの表示

## Illustratorの場合
AdobeのIllustratorなどでは、中心を合わせたりズレがないか確認するために、「Ctrl + Y（アウトライン・プレビュー表示切り替え）」というのもがあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62822/940c731a-819c-f98f-6d6a-eae8e558de6e.png)


## XCodeでもそれしたい
xcodeでもそれしたいと思っていましたが、それっぽいものがありました。
viewが重なっているのか、ずれているのかがわかりそうです。

![Pasted image at 2017_11_20 10_08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/62822/a45a5a39-28b5-0cb3-d71e-82e9ef72e6e7.png)

## 設定方法
- EditorのCanvasの「Show Layout Rectangles」にチェックを入れると表示されるようになります。


![Pasted image at 2017_11_20 10_04 PM.png](https://qiita-image-store.s3.amazonaws.com/0/62822/a3c929b5-eee1-e27b-1a50-5104eba98fa9.png)

## 最後に
- View多いとごちゃごちゃしそうですね！！！＼(^o^)／
ImageViewを丸くする

最近のアプリって、プロフィール画像が丸く表示されてることが多いですよね。
Googleの[Material Design GuideLine](https://material.io/guidelines/)でも丸くなってるので、標準ライブラリとかコンポーネントが用意されているかと思いきや！無いんです。
◯くするのって需要あると思うんだけど。

ということで、色んな方法はあるけれど、ここでは２つ紹介します。

* CircleImageViewライブラリを使う
* Picassoのtransformで丸くする

# CircleImageViewライブラリを使う
DataBindingを使いたいときは、レイアウトXMLで丸くなってくれてたらなーって思うこともあるでしょう。

[このライブラリ](https://github.com/hdodenhof/CircleImageView)を使います。

1. build.gradleに定義する

```java:build.gradle
dependencies {
    ...
    compile 'de.hdodenhof:circleimageview:2.1.0'
}
```

２. レイアウトXMLに定義する

```XML:layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="180dp"
        android:layout_height="180dp"
        android:src="@drawable/hoge" />

</RelativeLayout>

```

終わりです。
ImageViewを継承しているようですので、もし何かJavaで制御したい場合はImageViewと同じように扱えば大丈夫です。


# Picassoのtransformで丸くする
[これ](https://gist.github.com/julianshen/5829333)を持ってきたら利用可能です。

レイアウトXMLでは普通にImageViewを設置しましょう。

```XML:layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>
```

あとはPicassoのtransformで指定したら丸くなります。

```java:MainActivity.java
Picasso.with(context).load(url)
                .transform(new CircleTransform()).into(imageView);
```

以上