OmniAICreator/Qiita-1.07M huggingface dataset:
1つのformで複数のmodelにデータを登録する carrier waveを使って

1つのformで親と子の関係にあるmodelにそれぞれのdataを振り分け保存する方法。
別のmodelやdbにデータを同時保存する方法。

itemが親、imageが子の関係（1:多）

```ruby:item.rb
class Item < ApplicationRecord
	has_many :images
	accepts_nested_attributes_for :images
    #親の方にaccepts_nested_attributesの記述を追記
end
```

```ruby:image.rb
class Image < ApplicationRecord
	belongs_to :item
	mount_uploader :image, ImageUploader
end

```

```ruby:form.haml
 = form_for @item, url: items_path, mehod: :post do |f|
         ## @itemは:itemの形だとうまく行きません。@itemの形で渡してあげてね。
          .formSection
            = f.hidden_field :user_id, value: current_user.id
            .productForm__field.productForm__field--top
              = f.label :画像
              %span.formRequired 必ず入れてね
              %br/
              %p アップロードできます
              %ul.formUploader
                = f.fields_for :images do |i|
               ## formをformでネストさせる方法でimageをcontrollerに渡してあげる。
                  = i.label :image,"クリックしてアップロード"
                  = i.file_field :image

##この時のformのhtmlのinput nameはこんな形になってます。
<input type="file" name="item[images_attributes][0][image]" id="item_images_attributes_0_image">
```

```ruby:item_controller.rb
def new
  	@item = Item.new
  	@item.images.build
        ##ここでbuildすることにより、親と子が結びついて同時にレコードが作成される。
end

def create
     item = Item.new(item_params)
     item.save
end

private

def item_params
     params.require(:item).permit(:text,images_attributes: [:id,:image])
end
```

ここでのparamsはこのようになっています。

```ruby
params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"hogehoge=", "item"=>{"user_id"=>"2", "images_attributes"=>{"0"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x00007fdd59c18d40 @tempfile=#<Tempfile:/var/folders/fl/g00000000/T/RackMultipart20190718-40737-1kgrqpj.jpg>, @original_filename="hoge.jpg", 
@content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"item[images_attributes][0][image]\"; filename=\"hoge.jpg\"\r\nContent-Type: image/jpeg\r\n">}}, "price"=>"10000"}, "commit"=>"作成する", "controller"=>"items", "action"=>"create"} permitted: false>
```


以下は1:1の関係時の書き方。
itemとimageの関係（1:1）

```ruby:item.rb
class Item < ApplicationRecord
	has_one :image
	accepts_nested_attributes_for :image
end
```

```ruby:image.rb
class Image < ApplicationRecord
	belongs_to :item
	mount_uploader :image, ImageUploader
end

```
```ruby:item_controller.rb
def new
  	@item = Item.new
  	@item.build_image
        ##ここでbuildの記法を変えるだけ。
end
```

そんなに変えるところはないですね。


---------------------------

どうもうまく行かない時
まずは、carrier_wave単体で機能するのかどうかを確認してみてもいいかもしれませんね。

```
undefined method `resize_to_fit' for #<ImageUploader:0x00007fdd57509fb0>
```
carrier waveの設定が間違っている可能性があります。
Image.uploaderに`include CarrierWave::MiniMagick`の記述はありますか？？

htmlのnameのところが
` name="item[images_attributes][0][image]"`の形になってますか？

@itemになってますか?:itemの形になってないですか？？

ActiveRecord::AssociationTypeMismatch
これは忘れましたが、dbのカラムにitem_idのような外部キーは存在してますか？
nameの記述が(いわゆるformの送り方が)違ってないですか？
assosiationやimage_uploaderのmodelの記述は間違ってないですか？(sつけ忘れとか)
MySQLのおすすめ便利クライアントツール

データベースのGUIクライアントツールってたくさんありますよね。
「漢は黙ってコマンド！」って方もいるかとは思いますが、私は便利なツールは用途に合わせて使いたい派です。
（もちろんコマンドを知らなくてもいいという意味ではないです）

今回は**MySQL**の**おすすめクライアントツール**のご紹介です。

## Mac版

### Sequel Ace　★オススメ
https://apps.apple.com/us/app/sequel-ace/id1518036000

私個人的にはMacだとこれが一番使いやすいです。
軽くて大体の機能はついていますし、dumpなども取りやすいです。
https://sequel-ace.com

※以前は[Sequel Pro](https://www.sequelpro.com/)を利用していましたが、
2021/06/01現在で、開発が止まっているため乗り換えました。
現状は後継アプリの**Sequel Ace**の使用をおすすめします。

基本的にはSequel ProからフォークしたプロジェクトのようなのでUI/UXもほぼ同様に違和感なく使用できます。
Sequel Proで作成したコネクションのお気に入りもplistとしてExportすればSequel Aceの方でimportできましたので乗り換えも容易です。
またMac App Storeでも公式にコンスタントにアップデートがされているので安心面も高いです。

### MySQL Workbench
https://www.mysql.com/jp/products/workbench/

Windows版もあるので使っている方は多い印象です。

---

## Windows版

### HeidiSQL　★オススメ
https://www.heidisql.com/

軽く、クラッシュすることもほぼない、ショートカットの割り当て、csvのインポートなど
様々な高機能が多く個人的にはすごく重宝しています。

### Navicat
https://navicat.jp/introduce/navicat-for-mysql/

有償になる前はよかったんですけどねー。

### MySQL Workbench
https://www.mysql.com/jp/products/workbench/

WindowsとMac両方あるのは一つの魅力ですね。

### A5:SQL Mk-2
https://a5m2.mmatsubara.com/

ER図を作成できる描画機能があったり実テーブルからリバースER図生成ができたりと便利がな機能があり、windows派の人には根強い人気がある印象です。
個人的には、なんかUIとか使い心地があまり相性が良くなかったです…すみません

---

## ブラウザ版

### phpMyAdmin

あまり使うことはないかもしれませんが、プラットフォーム関係なくブラウザで使用できるので、使用環境によっては向いている時もあるかもしれません。

## ER図を書くツールは【番外編】

### wwwsqldesigner

A5:SQLはER図を書く機能があったりと上記で記載しましたが、私は最近は以下のツールをよく使います。
dockerもありますし、Webサーバ起動して実行することもできるので便利です。

https://github.com/ondras/wwwsqldesigner
Visual Studio Codeでsftpが動かなくなった

# TL;DR.
Versionを1.36から1.35にしたら治った

# 何が起こったか
MacでVSCodeの拡張機能であるsftpを使っていたら突然エラー `Handshake failed: signature verification failed` を吐き同期できなくなった

# 対処法
VSCodeのバージョンを1.36 → 1.35に下げたら戻った
https://code.visualstudio.com/updates/v1_35

# 原因
よくわかっていないので1.36での対処法などわかる方いれば教えてください
Rails6 のちょい足しな新機能を試す55（enum blank label編）

# はじめに

Rails 6 に追加されそうな新機能を試す第55段。 今回は、 `enum blank label` 編です。
Rails 6 では、 enum で キー(ラベル) に、空文字を指定すると`ArgumentError` が発生するようになりました。

Ruby 2.6.3, Rails 6.0.0.rc1, Rails 5.2.3 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# 準備

今回は、 [Rails6 のちょい足しな新機能を試す44（enum 編）](https://qiita.com/suketa/items/d007b5ebca5cf107ed87) を利用します。

# Child モデルを修正する

Child モデルを修正して、 `0` のキー(ラベル) に空文字 (`''`)を使うようにします。

```ruby:app/models/child.rb
class Child < ApplicationRecord
  enum generation: { '' => 0, toddler: 1, preschool: 2, gradeschool: 3, teen: 4, young_adult: 5 }
end
```

# マイグレーションの実行

マイグレーションを実行します。

```shell
$ bin/rails db:create db:migrate
```


# rails console で確認する

`rails console` で動作確認します。
`child = Child.new` を実行すると `ArgumentError` が発生します。


```irb
$ bin/rails c
bash-4.4# bin/rails c
Running via Spring preloader in process 102
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> child = Child.new
Traceback (most recent call last):
        3: from (irb):1
        2: from app/models/child.rb:1:in `<main>'
        1: from app/models/child.rb:2:in `<class:Child>'
ArgumentError (Enum label name must not be blank.)
```

最初に、 `app/models/child.rb` が評価された時点で `ArgumentError` が発生するので、
`child = Child.new` の代わりに、 `require 'child'` としても `ArgumentError` が発生します。

# Rails 5 では

Rails 5.2.3 では、 `ArgumentError` にはなりません。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try055_enum_blank


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Guard Enums against definitions with blank label names](https://github.com/rails/rails/pull/34385)
Go初心者のためのメモ(メソッド編)

#はじめに
go言語初心者のための記事です。
公式チュートリアルの大事なところをまとめただけです。
https://go-tour-jp.appspot.com/list

##メソッド
go言語でクラスやメソッドを定義したい場合、少し他の言語とは方法が異なります。
まず構造体等を定義し、それにメソッドを追加していきます。

###定義の仕方

メソッド関数の定義方法は、メソッド関数の前に構造体を書くだけです。
`func (構造体) メソッド関数 戻り値の型 {}`
このメソッド関数前の`()`に記述されるものを「レシーバ」と呼びます。

```go:main.go
package main

import (
	"fmt"
)

type MyClass struct {
	X, Y float64
}

func (c MyClass) Plus() float64 {
	return c.X + c.Y
}

func (c MyClass) PlusArg(arg float64) float64 {
	return c.X + c.Y + arg
}

func main() {
	instance := MyClass{3, 4}
	fmt.Println(instance.Plus()) // 7を返す
	fmt.Println(instance.PlusArg(1)) // 8を返す
}
```

構造体だけにではなく、普通の変数にもメソッド関数を追加することができます。(!!!!!!!!)
変数にメソッドをつける場合は、変数を`type 変数名 型`という形で定義する必要があります。
メソッド関数の引数の型に注意しましょう。

```go:main.go
package main

import (
	"fmt"
	"reflect"
)

type MyFloat float64

func (f MyFloat) Double() float64 {
	fmt.Println(reflect.TypeOf(f)) // main.MyFloatを返す
	return float64(f) * 2.5
}

func main() {
	f := MyFloat(4)
	fmt.Println(f.Double()) // 10を返す
}
```

###ポインタ渡し
`return`を使わずに変数を返したいとき、以下の記述で値を関数外へ渡すことができます。

```go:main.go
package main

import (
	"fmt"
)

type MyClass struct {
	X, Y float64
}

// *をつけないと値が反映されない
func (c *MyClass) Scale(f float64) {
	c.X = c.X * f
	c.Y = c.Y * f
}

func main() {
	instance := MyClass{3, 4}
	instance.Scale(10)
	fmt.Println(instance)
}
```

##インターフェース型
正直よくわからないけど載せておきます。

###そもそも何か
チュートリアルの内容から、同じ名前のメソッドに複数の異なる機能を実装する仕組みであることはわかります。
例えば、`a_f`というfloat型の変数と`a_v`という構造体にそれぞれ`SameNameMethod()`という名前のメソッドを実装としたとします。
`SameNameMethod()`をインターフェース型として定義することによって、同じ名前だけどそれを使う構造体によって異なる処理を行うことができます。
簡単に書けば、

- `a_f.SameName()`→Aという処理
- `a_v.SameName()`→Bという処理

使い道は未知数です。

###定義の仕方
定義は以下を参考にしてください。

```go:main.go
package main

import (
	"fmt"
	"math"
)

type Interface interface {
	SameNameMethod() float64
}

func main() {
	var a_f Interface
	var a_v Interface
	f := MyFloat(-2)
	v := Vertex{3, 4}

	a_f = f
	a_v = &v

	fmt.Println(a_f.SameNameMethod())
	fmt.Println("===============")
	fmt.Println(a_v.SameNameMethod())
}

// 構造体MyFloatの定義と、そのメソッドSameNameMethod()の定義
type MyFloat float64
func (f MyFloat) SameNameMethod() float64 {
	fmt.Println("Aという処理をしました")
	if f < 0 {
		return float64(-f)
	}
	return float64(f)
}

// 構造体Vertexの定義と、そのメソッドSameNameMethod()の定義
type Vertex struct {
	X, Y float64
}
func (v *Vertex) SameNameMethod() float64 {
	fmt.Println("Bという処理をしました")
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
```

実行結果が以下です。
同じ名前のメソッド`SameNameMethod`であるのに異なる処理を行なっていることがわかります。

```:実行結果
Aという処理をしました
2
===============
Bという処理をしました
5
```

また、インターフェースは以下の様に省略して定義できるそうです。

```go
// 型の省略
type I interface {
	SameNameMethod()
}

// 型も中身も省略
var i interface{}
```
[Vue]便利なプラグイン「vue-qriously」で変数を動的にQRコード化するには、v-bindが必須な件

# はじめに
## 今回したいこと
今回は、描画しているURLの絶対パスをQRコード化したいと考えていました。
## お急ぎの方へ　成功したコード

```vuejs:成功例
<qriously :value="$route.path" :size="100" />
```
## vue-qriouslyプラグイン
非常に簡易的にQRコードを生成できます。

```vuejs:基本的な例
<qriously value="hoge" :size="100" />
```
上のように書くと、「hoge」という文字列の入ったQRコードが生成されます。これは簡単。
詳しい説明は、[公式サイト](https://www.npmjs.com/package/vue-qriously)または、[参考サイト](https://helloworld-blog.tech/javascript/vue-js%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を見て頂ければサクッと分かるかと思います。
ここでは割愛します。
# 本題
## 変数のQRコード化
まずは、普通に`value=""`に`$route.path`を入れると詰まりました。

```vuejs:失敗例
<qriously value="{{ $route.path }}" :size="100" />
```
このようにした場合、

```text:エラー文
Errors compiling template:
value="{{ $route.path }}": Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div id="{{ val }}">, use <div :id="val">.
```
このようなエラーがでます。v-bindでやって下さいとのこと。エラー文が親切すぎて助かります。

```vuejs:成功例
<qriously :value="$route.path" :size="100" />
```
一番初めにも書いた、成功例です。
こうすると、無事に絶対パスがQRコード化されました。
# さいごに
基本的なことでしたが、valueなどに変数を入れたい場合、value自体を動的な形にする必要があるので、`v-bind:value="変数"`または`:value="変数"`とする必要がありました。
最後までありがとうございました。

[公式サイト](https://www.npmjs.com/package/vue-qriously)
[参考サイト](https://helloworld-blog.tech/javascript/vue-js%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
Pythonでファイル名をランダムな文字列に変更する

ファイル名をランダムな文字列に変更するスクリプトを書きました。
ランダム文字列を正規表現で指定できるrstrというライブラリを使いました。

# 環境
Python 3.7.3
rstr 2.2.6


# 背景
テストデータでAWS S3上に縦横サイズがさまざな画像を1000〜5000枚を用意する必要がありました。
テスト対象のスクリプトではS3.listObjectsメソッドを使っています。
S3.listObjectsメソッドではリストのソート順がファイル名文字列ソートです。
ローカルでコピーを繰り返して画像ファイルを複製してS3にアップロードすると、ファイル名文字列ソートではサイズが異なる画像がばらつかないので、ランダムな文字列でリネームするスクリプトを用意しました。
諸事情あって、先頭2桁を数字としました。

# ディレクトリ構成

構成は以下です。

```
├── script.py
└── tmp
    ├── test_1.jpg
    ├── test_2.jpg
    └── test_3.jpg
```


# script

```script.py
import glob
import rstr
import os
import os.path


def main():
    files = glob.glob("./tmp/*")
    for file in files:
        dir, ext = os.path.splitext(file)
        dir_path = os.path.dirname(file)

        rename_str = dir_path + '/' + rstr.xeger(r'^[0-9]{2}[0-9a-zA-Z0-9]{10}') + ext

        os.rename(file, rename_str) 

if __name__ == "__main__":
    main()
```

# 実行結果
```

├── script.py
└── tmp
    ├── 04C523E7j5l1.jpg
    ├── 91G0nUvJEzEv.jpg
    └── 93PVR3tNKzJc.jpg
```


# 参考サイト
https://pypi.org/project/rstr/
遅いReact Nativeアプリのパフォーマンスを向上する対策

昔書いたものなので情報が古いかも

# 対策
Try to use React Native's FlatList/SectionList/VirtualizedList where you can and not array.map() as it allows for asynchronous rendering of components in your viewport which is important for mobile devices.

1. FlatList/SectionList/VirtualizedListを使う
2. shouldComponentUpdateかPureComponentを使用する
3. React Navigation使わない
4. initialNumToRenderを設定する
5. renderItemにはステートレスコンポーネントを指定する
6. 1つのコンポーネントに複数のFlatList/SectionList/VirtualizedListを使わない
7. ScrollView内でFlatListをラップしない
8. 先にAndroidを開発する
9. リリースビルドで確認する
10. console.xxxを削除する（babel-plugin-transform-remove-console）
11. JavaScriptコードを減らす（ネイティブコードを増やす）


## 1. FlatList/SectionList/VirtualizedListを使う

リストなどでは、データをArray.map()して描画するのではなく、FlatList/SectionList/VirtualizedListを使う。


## 2. shouldComponentUpdateかPureComponentを使用する

Reactの性質上、あるコンポーネントが子コンポーネントが更新されると、子コンポーネントも更新されます。shouldComponentUpdateを定義することで、コンポーネントの更新を制御できます。また、そもそも厳密な更新が必要ない場合はPureComponentを使うと、変化がないと判定されたComponentはUpdateされにくいため、パフォーマンスが向上します。



# 情報元
・https://github.com/facebook/react-native/issues/17033
バッチでコピペ

# 毎回コピペするのが面倒になってきたのでバッチを検討

ここ数日テストをしているせいで、
PuTTYで鯖にアクセスして毎回何種類かの同じコマンドを打つ必要性があった。
いい加減面倒になってきたのでローカルのバッチファイルを
ダブルクリックするだけでコピーできるものを欲しいと考えた。
打ちたいコマンドがテストによって順番とか
微妙に変わってくるから直接シェルで作るのはやめた。

そのコマンドの1つにこんなのがあった

```
/var/www/html/hogehoge/hogehoge.py '{"url":"http:\/\/hogehoge\/login.php","id":"12345","pass":"6789"}'
```

clipコマンドで実験

```BAT:test1.bat
"/var/www/html/hogehoge/hogehoge.py '{"url":"http:\/\/hogehoge\/login.php","id":"12345","pass":"6789"}'"|clip
```

\/\/のところで良く分からない判定が出てしまうらしく、
うまく機能してくれなかった
teratailできいて以下のコマンドに変更

```BAT:test1.bat
SET /P<NUL="/var/www/html/hogehoge/hogehoge.py '{"url":"http:\/\/hogehoge\/login.php","id":"12345","pass":"6789"}'"|clip
```
'clip' は内部コマンドまたは外部コマンド～　のエラーが出た
環境変数PATHを見てみるとC:\Windows\System32が入っていない！！！WTF！

といいつつ会社のPCだからadminのpwも分からない・・・。
しょうがないからディレクトリ移動して解決。

```BAT:test1.bat
cd C:\Windows\System32
SET /P<NUL="/var/www/html/hogehoge/hogehoge.py '{"url":"http:\/\/hogehoge\/login.php","id":"12345","pass":"6789"}'"|clip
```
win8.1からwin10 1903へのアップグレードでハマった

最近、win8.1のタブレットを格安で購入した。

win8.1は嫌いなのでアップグレードしたかったのだが、何度やっても更新プログラムチェックで46パーセントのまま停止。

更新プログラムチェックが終えてインストールを開始したかと思えばエラーが発生して停止。

そういえば、win10の更新アシスタントをダウンロードする際に何故かDefenderがブロックしてたなと思い出して、なんとなくDefenderを無効化した。
するとあっさりアップグレードに成功。

アップグレード後に各デバイスドライバーを更新して、今はバリバリ使えてます。

多分、Defenderのウィルス定義が古いから内戦でも起きてたのかな。
並列化に伴うキーワード

重要だと思ったキーワードや記事を自分用に纏めました。

# 変数をスレッドセーフにするためのキーワード
アトミック変数
[メモリバリア](https://qiita.com/tetsu0121/items/cd28780bc30f3a1d3353)
[volatile](http://kannokanno.hatenablog.com/entry/20120528/1338229536)
[thread_local](https://cpprefjp.github.io/lang/cpp11/thread_local_storage.html)




# 並列スレッドをデバッグする方法
[ウォッチの設定](https://docs.microsoft.com/ja-jp/visualstudio/debugger/how-to-use-the-parallel-watch-window?view=vs-2019)

# MFCを用いた並列化
[MFCでThreadを使ってみる](https://jprogramer.com/mfc/3762)
[スレッドの同期(セマフォの使い方)](https://jprogramer.com/mfc/3764)

# stdを用いた並列化
[C/C++によるマルチスレッドプログラミング入門](https://qiita.com/nsnonsugar/items/be8a066c6627ab5b052a)
[C/C++によるマルチスレッドプログラミング入門 その２](https://qiita.com/nsnonsugar/items/501fb9e5195a6a04f98b)

# DLLについて
[ダイナミックリンクライブラリ(DLL)と、DLLの使用時に発生するさまざまな問題について](https://support.microsoft.com/ja-jp/help/815065/what-is-a-dll)


# 排他的な処理の為に
[マルチスレッドの同期方法(知恵袋)](https://oshiete.goo.ne.jp/qa/3557988.html)
[CreateEvent イベントオブジェクトの作成](http://nienie.com/~masapico/api_CreateEvent.html)
[PulseEvent イベントオブジェクトに対する待機スレッドの解放](http://nienie.com/~masapico/api_PulseEvent.html)
[SetEvent イベントオブジェクトをシグナル状態にする](http://nienie.com/~masapico/api_SetEvent.html)
[C++11のThreadを使ってRead-Write Lockパターン](https://qiita.com/hiro4669/items/bffbfa93312f2b7f6870)
[SemaphoreSlim を使って並列実行を制御する](https://qiita.com/TsuyoshiUshio@github/items/79ad787899cddaa3ac1c)
[セマフォとミューテックスの違い](http://bkmts.xsrv.jp/mutex-semaphore/)
[セマフォの実装方法](http://www.ne.jp/asahi/hishidama/home/tech/vcpp/lock.html)
[わかりやすい同期の説明サイト](http://dodonpa.la.coocan.jp/ipc_vc1.htm)
[クラスのメンバ関数をテーブルにする方法](http://www.emit.jp/prog/prog_cpp0.html)

[子クラス親クラスのメンバ参照](https://dixq.net/forum/viewtopic.php?t=14881)

[静的メンバについて](http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02030.html)
[staticなメンバ変数のせいでリンクエラーになった話](https://gab-km.bitbucket.io/blog/html/2013/11/28/link_error_due_to_static_member_variable.html)
AmaxonLinuxで、ApacheをLet's EncryptでHTTPS化する。サブドメインもセキュアにしてみた

Let's Encrypt
AWS

## 前提条件
ドメイン名をsite.workとしています

## コマンド取得
```
wget https://dl.eff.org/certbot-auto
chmod 700 certbot-auto
sudo chown ec2-user:ec2-user certbot-auto
```

## コマンド書き換える
```
elif [ -f /etc/issue ] && grep -iq "Amazon Linux" /etc/issue ; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
```

以下に書き換える

```
 elif grep -i "Amazon Linux" /etc/issue > /dev/null 2>&1 || \
   grep 'cpe:.*:amazon_linux:2' /etc/os-release > /dev/null 2>&1; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
```

## コマンド配置
```
sudo mv ./certbot-auto /usr/local/bin
```

## 証明書の場所
```
sudo ls /etc/letsencrypt/live/site.work
```

## 証明書の発行
```
certbot-auto certonly --webroot -w /var/www/html -d site.work --email site@gmail.com -n --agree-tos --debug --no-self-upgrade
```

## Apacheに設定
```
sudo vi /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/letsencrypt/live/site.work/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/site.work/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/site.work/chain.pem
```

## Apache再起動
```
sudo systemctl restart httpd.service
```

## サブドメインもやってみる
```
certbot-auto certonly --webroot -w /var/www/html -d site.work -w /var/www/html/sub1 -d sub1.site.work --email site@gmail.com -n --agree-tos --debug --no-self-upgrade
```

## Apacheに追加で設定
```
sudo vi /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/letsencrypt/live/site.work/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/site.work/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/site.work/chain.pem
```

## Apache再起動
```
sudo systemctl restart httpd.service
```

参考
ありがとうございました

```
https://qiita.com/MysteriousMonky/items/f26316447c1ff390ce21
```
SynchRoidのDAでのCalculated Keyの使い方について

#WindowsキーをDAで押したいけど、どうしたらいいかわからない！



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/0c2e40b1-6958-849d-6652-1b3974eaf452.png)

Standard Keysの中にはWindowsキーは存在しない。

今回は何もアプリケーションが立ち上がっていない状態での、Windowsキーの押し方をご紹介。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/a213d43e-b196-321e-5541-b4a20113c13e.png)

Base Finder を　Rause Device　に

Device　を　今自分がDAで使っているものに

Application　は　explorer.exe[title="Program Manager"]　に設定



DAでは　windowsキーなどを押す際は、

Press Keyステップを選択し、

Keyモードを　Calculated Key　に変更　→　Key Code　を「仮想キーコード」を使用。

http://kts.sakaiweb.com/virtualkeycodes.html

(数字ではなく、定数を使用)

Windows キーの場合、VK_LWIN 　を使用。

このPress Keyアクションを行うとどうなるかというと、Windowsキーを押したときと同じ挙動になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/62e6bca8-c3e3-bb35-41eb-5f5639930c26.png)

※イメージ図でいうとこんな感じ　(念のためぼかしを入れてます笑)

この作業が出来たからどうだ、というわけではないが、
Calculated Keyを使うことで、Windowsキーも押せてしまう！　ということをお知らせしたかったのである。


また、Calculated Keyには　上記のVK_LWINのような書き方以外にも
v0x5B
のような書き方ができる。

コードの参考はこちら。 (http://kts.sakaiweb.com/virtualkeycodes.html)
※コード参考記事は、0x5BとなっているがSynchRoidで動かす際には文頭に必ずvをつけるのを忘れずに！

つまり、

VK_LWIN  =  v0x5B  ということである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/34288915-5ec8-7e57-71bc-bd6e4d78e3e4.png)

(こちらの書き方のほうがおそらく主流である気がする)

では、次はこれを応用して「ファイル名を指定して実行」を立ち上げてみよう。


#ファイル名を指定して実行の立ち上げ方

「ファイル名を指定して実行」の立ち上げ方といえば、

「WIndows　＋　R」だ。

これをロボットで実行するにはどうすればよいか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/c6cab5cc-42ce-cbd0-b310-97ff44728dc4.png)


KeyCodeの欄に、「v0x5B,fe v0x52,fe v0x52,feu v0x5B,feu」を記入。

v0x5BがWindowsキー
v0x52がRキー
また、feでキーをクリックし、feuで離す。

つまり、
Windowsキーをクリック
Rキーをクリック
Rキーを離す
Windowsキーを離す　　という順番である。

では実際にこの指示を実行すると。。。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/aaa11d4f-59d3-cf66-58b7-ee946b61f928.png)

無事起動できた。

起動できたらあとは任意のコマンドを入力するだけだ。

コマンドについての参考はこちら (https://qiita.com/sta/items/4b70e6b130a1033dc2c5)


これでWindowsキーを使うことが出来た。
Railsのlink_toでparamsを飛ばす方法

#やりたいこと
リンクのリクエスト先は同じだが、
リンクの押されたページごとに違う処理を行いたい。

そのために、リンクが押された時に、ページ判別用のフラッグをたてたい。

#実装方法
```.rb
= link_to hoge_path(:key => "value")

= link_to hoge_path(key: "value")
```
上記の通り、リンク先のpathの後に、送りたいparamsのキーとバリューを記載することで、
飛び先のアクション内で値を取得できる

```.rb
params[:key]
-> "value"
```
Laravel Tinker Serverを使ったお手軽デバッグ



Laravelでアプリケーション開発をしているとある処理時点での変数がどうなっているのか確認したい時があると思います。

[Laravel Tinker Server](https://github.com/beyondcode/laravel-tinker-server) は確認したい処理部分のコードに `tinker(確認したい変数)` メソッドを挟むだけで、Tinker Serverがキャッチしてターミナル上で変数を確認できたり、いじったりすることができとても便利です。


![Laravel Tinker Server](https://camo.githubusercontent.com/614beed80cd7579b2137907f2fd93af8b4eda15b/68747470733a2f2f6265796f6e64636f2e64652f6769746875622f74696e6b65722d7365727665722f74696e6b65722d7365727665722d64656d6f2e676966 "Laravel Tinker Server")

from: https://github.com/beyondcode/laravel-tinker-server


## インストール



```bash
$ composer require --dev beyondcode/laravel-tinker-server
```



オプションで設定ファイルが欲しい場合は

```bash
$ php artisan vendor:publish --provider=BeyondCode\\LaravelTinkerServer\\LaravelTinkerServerServiceProvider
```





## 使い方



使い方は簡単でTinker Serverを起動して、確認したい処理部分に `tinker(確認したい変数)` メソッドを挟むだけです。



Tinker Serverを起動。

```bash
$ php artisan tinker-server
```



確認したい処理で、`tinker()` を呼ぶ。

```php
$user = App\User::find(1);

tinker($user);
```



複数の変数を渡すこともできます。



```php
$user = App\User::find(1);
$posts = App\Post::all();

tinker($user, posts);
```



その後、アプリケーションでその処理に到達するとREPLシェルが呼ばれ、渡した変数が確認できゴニョゴニョいじることができます。



```shell
$ >> $posts->find(1);
=> App\Models\Post {#1234
  id: 1
  title: XXXX
  body: XXXXX
  created_at: XXXXX
  updated_at: XXXXX
}
```



さらに、`td()` というメソッドも提供されていて、これは `dd()`  と似ていてインタラクティブにならずTinker Serverに変数を出力するのみの機能となっています。

変数の内容だけ確認したい場合はこちらでいいかと思います。(debugbar使っていればいらないかもしれないですが...)





## まとめ



私はもともとRailsでの開発をしていて、デバッグにはRuby gemの `pry` を使って処理を止めてインタラクティブに変数の確認やいじることができました。

Laravelの開発でも同じことしようとすると XdebugとPHPStormまたはVSCodeなどを組み合わせたらできますが、Xdebug環境やエディタの設定が面倒な方はLaravel Tinker Serverなら簡単に使い始めることができると思います。

ただTinker Serverでは"処理を止めて" デバッグはできないですし、毎回確認したい変数を `tinker()` に渡さないといけないのでそこまでスマートではないので、高機能なものが欲しい方はXdebugでの開発をオススメします。
【Rails】CSVファイルをテーブルにインポートする方法

###CSVファイルを用意する
先頭行にテーブルに対応する項目名をセットする
※csvを自作する場合は、Excelの[CSV UTF-8(コンマ区切り)(.csv)]を選択してファイルを作ればうまくいった。

###インポート用ファイルを作成する

保存場所：[appルート]-[lib]-[tasks]-[import.rake]

```import.rake
require 'csv'

# rake import:users
namespace :import do
  desc "Import lists from csv"

  task lists: :environment do
    path = File.join Rails.root, "xxxx/xxx.csv"
    puts "path: #{path}"
    list = []
    CSV.foreach(path, headers: true) do |row|
      list << {
          name: row["name"],
          yubin: row["yubin"],
          address: row["address"],
          tel: row["tel"],
          fax: row["fax"]
      }
    end
    puts "start to create prefectures data"
    begin
      List.create!(list)
      puts "completed!!"
    rescue ActiveModel::UnknownAttributeError => invalid
      puts "raised error : unKnown attribute "
    end
  end
end
```


参考：https://qiita.com/yoshito410kam/items/40b675760bd8a1f8e728


###ターミナルで呪文を唱える
rake [namespace] [taskname]

```
rake import:lists
```
なんでkubernatesがk8sと略されるのか気になったので調べた

#結論
結論から書くと「ヌメロニム」という、長い英単語を数字で省略して表現を使ってるからだそうです。
https://ja.wikipedia.org/wiki/%E3%83%8C%E3%83%A1%E3%83%AD%E3%83%8B%E3%83%A0

kとsの間に8文字入っているから、k8s。。。
変数で付けられたら発狂しそうですね。

#代表的なヌメロニム
a11y - Accessibility（利用しやすさ）
d11n - Documentation（文書化）
G11n - Globalisation / Globalization（世界化）
i18n - Internationalisation / Internationalization（国際化）
i14y - Interoperability（相互運用性）
L10n - Localisation / Localization（地域化）
m17n - Multilingualisation / Multilingualization（多言語化）
n11n - Normalisation / Normalization（正規化）
P13n - Personalisation / Personalization
P45 - Pneumonoultramicroscopicsilicovolcanoconiosis（珪性肺塵症）
tr8n - Translation（翻訳）
v12n - Virtualisation / Virtualization（仮想化）

確かに長い単語もありますが、略しすぎて分からなくなっちゃいませんかね。
8文字以上が基準なんですかね。
tr8nって、t9nになんでならなかったんだろう。
【Rails】newとcreateの違い

#newとcreateの違いについて
ActiveRecordの復習をしていて…
newとcreateってどっちもレコードを作るんだよな
どう違うんだろ？と疑問に思ったので調べてみたら単純でした

- newはオブジュエクトを作成するだけなので、saveもしてあげなくちゃいけない
- createはnew + save

```
テーブル名.new
テーブル名.save
```
```
テーブル名.create
```

---
じゃあcreate使えばいいじゃんと思うのですが、
newでオブジェクトを作った後に条件次第でsaveするか分けたい時に使うのでしょうか？
Postgres初期設定　メモ＊完全なる私用＊

###Oracleの初期設定がうまくいかず、Postgresに変更
Oracleの初期設定時：
TNS-12560:プロトコル・アダプタエラー
TNS-00530:プロトコル・アダプタエラー

的なものになる（うろ覚え）

###Postgresに変更
GCP アップデート (7/12-7/18 2019)


### AI Platform: [July 11, 2019](https://cloud.google.com/ml-engine/docs/release-notes#july_11_2019)
- 定期的にモデルの品質確認するContinuous evaluationがベータになったよ。
  - AI Platformで作ったモデルのアウトプットと、データラベリングサービス(これもベータ)か自分が提供する正解を定期的に比較して評価してくれる。

### stackdriver: [July 11, 2019](https://cloud.google.com/stackdriver/docs/release-notes#july_11_2019)
- uptime checkに2つ追加されたよ(feedあるけどrelease noteなしなのであってるか不明。。)
  - SSL証明書の確認
  - コンテンツに対するregexとnegationマッチング

### Compute: [July 17, 2019](https://cloud.google.com/compute/docs/release-notes#july_17_2019)
- メモリ最適化インスタンスでCommited Use discountsがベータになったよ。
  - 最大70%

### ML Engine: [July 17, 2019](https://cloud.google.com/ml-engine/docs/release-notes#july_17_2019)
- Linear learnerとWide and deep learnerのインプット形式が変わったよ。
  - stringじゃなくてJSONで"csv_row"と"key"が必要になった。


### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Swiftでdelegateの実装を禁止したい

# TL;DR
- 基本的に禁止はできない
- delegateのwillSetを拾って実行エラーを出せば開発者に伝えることができるかも

# 自身のDelegateの実装を守りたい
例えば特定のUIViewを継承し、オリジナルのUIViewを作ります。
UIViewの中にはdelegateを持つものがあります。今回はUITextViewを継承し、入力が終わった時に独自の処理を加えるViewを作りたいとします。そのView自身が自身のdelegateを実装する処理を加えてみます。

```swift
class ExtendedTextView: UITextView, UITextViewDelegate {
    override func layoutSubviews() {
        super.layoutSubviews()
        // もっといい場所があるかもしれない
        delegate = self
    }

    func textViewDidEndEditing(_ textView: UITextView) {
        print("オリジナル処理")
    }
}
```

これでExtendedTextViewの中でテキストの変更イベントに対して処理ができるようになります。
しかしこのExtendedTextViewに対して呼び出し側がdelegateを実装してしまった場合はどうなるのでしょうか？

```swift
@IBOutlet weak var textView: ExtendedTextView!

override func viewDidLoad() {
    super.viewDidLoad()
    textView.delegate = self
}

func textViewDidEndEditing(_ textView: UITextView) {
    print("いたって普通の処理")
}
```

この場合せっかくExtendedTextViewの中で実装したdelegateは呼ばれず、代わりに「いたって普通の処理」が出力されるようになってしまいます。
これを防ぎたい時はどうすれば良いでしょうか。

**delegateの実装そのものを禁止することはできません。**
スーパークラスでできることはサブクラスでもできるから継承なのです。
完全に防ぐにはUITextViewを継承せずに自力でUITextViewのようなものを作る必要があります。

それはかなりつらぽよなので、
今回はdelegateの実装をしようとした時にクラッシュを起こすことによって開発中に間違った使い方を示すというアプローチにしました。

```swift
class ExtendedUITextView : UITextView , UITextViewDelegate {
    override func layoutSubviews() {
        super.layoutSubviews()
        delegate = self
    }

    override var delegate: UITextViewDelegate? {
        willSet {
            try! check(willSetDelegate: newValue)
        }
    }

    private func check(willSetDelegate: UITextViewDelegate?) throws {
        if willSetDelegate != nil && !(willSetDelegate is ExtendedUITextView) {
            throw NSError(domain: "てきとーな委譲してんじゃねー！", code: 0, userInfo: nil)
        }
    }
    
    func textViewDidEndEditing(_ textView: UITextView) {
        print("大事な処理")
    }
}
```

ポイントはdelegateのwillSetでcheck関数を実行していることです。check関数の中では渡されたdelegateが自身のクラスかどうかを見ています。ExtendedUITextView以外の実装の場合はNSErrorをthrowすることによって実行時にアプリがクラッシュする仕組みになっています。


こうすることで他のクラスがdelegate実装するのを防ぐことができます。
ExtendedUITextViewで前処理した後に別のクラスで委譲したい場合は自前の拡張Delegateを新しく作ればOKです。

```swift
protocol ExtendedUITextViewDelegate: class {
    func textViewDidEndEditing(_ textView: ExtendedUITextView)
}

class ExtendedUITextView: UITextView, UITextViewDelegate {
    weak var extendedDelegate: ExtendedUITextViewDelegate?

    func textViewDidEndEditing(_ textView: UITextView) {
        print("前処理かーらーのー？")
        extendedDelegate?.textViewDidEndEditing(self)
    }
}
```
RSpecで一度だけエラーを発生させる

# 背景

RSpecで一度だけエラーを発生させ、
二度目にはオリジナルの処理を実行させたい時のテストの書き方を考えた。
そして一応思いついたのでメモ。

# 環境
ruby 2.5.1
Rails 5.2.2.1
rspec 3.8.0

# 結論から言うと

定義の中で再定義

```ruby
# user.save!を失敗させる
allow(user).to receive(:save!) do
  allow(user).to receive(:save!).and_call_original
  raise.new(ActiveRecord::RecordNotSaved, "保存失敗")
end
```

# 補足

よくあるテスト内で特定のインスタンスの特定の関数でエラー投げたい、
と言うのはこんな感じでスタブ化できます。

```ruby
# user.save!を失敗させる
allow(user).to receive(:save!).and_raise(ActiveRecord::RecordNotSaved, "error")
```


この手の、同一テスト中に、ある関数を最初の一回だけ失敗にして、
後は成功させたいなあ、って思うことがありました。
（多分こんなパターンは稀ですが）

[こちらの記事](https://qiita.com/ryosuke_sato/items/bc45c33274e10ae4bc52
)のやつでいけるやん、って思ったのですが、
これだと二回目以降にstubがnilを返すので、保存がうまくいかなかったです。

```ruby
count = 0
allow(user).to(receive(:save!)) do
  count += 1
  raise.new(ActiveRecord::RecordNotSaved, "保存失敗") if count == 1
end
```

これを発展させ、

- `once`にチェーンさせる
- `return self`とか`self.save!`とかで二回目以降に何かしらオブジェクトを返す

とか試行錯誤してもうまくいきません。（原理的にも無理そう）

調べていくうちに、スタブは「後定義勝ち」と言うことを知ったので、
最終的に中で再定義すると言う荒技(?)

```ruby
# user.save!を失敗させる
allow(user).to receive(:save!) do
  allow(user).to receive(:save!).and_call_original
  raise.new(ActiveRecord::RecordNotSaved, "保存失敗")
end
```

こうすると二回目以降にはブロック内で定義された`and_call_original`が実行されると言う・・・


# 後書

期待通り動く！
けど可読性悪い・・・
コードが重複しているので全然スマートでないような

Rails初心者なんで、他にスマートなやり方あれば教えてください！

（そもそもこんなテスト必要な設計が悪い、とか言うそもそも論もある）


以下、参考にさせていただきました。ありがとうございます。
[rspec で「一回だけ」例外発生させたい](https://qiita.com/ryosuke_sato/items/bc45c33274e10ae4bc52)
【SpringBoot】Webアプリケーション作成

# はじめに
SpringBootでWebアプリ作成するときに大体やることのまとめ。

# 前提条件
開発ツール：Pleiades All in One

# 準備

## プロジェクト作成
新規プロジェクト→Spring スターター・プロジェクトを選ぶ。
依存関係の選択では、最低限以下があれば良さそう。

|名前|説明|
|---|---|
|Spring Boot DevTools|開発中にテストするときに、ホットデプロイができたりするツール|
|Thymeleaf|HTMLのテンプレートエンジン|
|Spring Web Starter|Webアプリケーションを作成する場合に必要なもの|
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/5917d728-2de0-dd1e-3551-2afec491d0c4.png)

## Thymeleaf Layout Dialectを依存関係に追加
レイアウトの共通化が出来るようになる。
バージョンはそのときの最新で。

```gradle:build.gradle
dependencies {
	compile group: 'nz.net.ultraq.thymeleaf', name: 'thymeleaf-layout-dialect', version: '2.4.1'
}
```

# 初めの画面作成

## レイアウト用HTML作成
`html`タグに、Thymeleaf用スキーマ定義を追加する。

```html:layout01.html
<!DOCTYPE html>
<html
	xmlns:th="http://www.thymeleaf.org"
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
	<meta charset="UTF-8">
	<link rel="stylesheet" href="css/uikit.min.css" th:href="@{css/uikit.min.css}" />
	<script src="js/uikit.min.js" th:src="@{js/uikit.min.js}"></script>
	<script src="js/uikit-icons.min.js" th:src="@{js/uikit-icons.min.js}"></script>
	<title>システム名</title>
</head>
<body>

<!-- メニュー -->
<nav class="uk-navbar-container" uk-navbar>
    <div class="uk-navbar-left">
        <ul class="uk-navbar-nav">
            <li class="uk-active"><a href="">トップ</a></li>
            <li><a href=""></a></li>
        </ul>
    </div>
</nav>

<!-- 内容 -->
<div class="uk-section" layout:fragment="content">
</div>

</body>
</html>
```

## 個別HTML作成
・`html`タグに、Thymeleaf用スキーマ定義を追加する。
・どのレイアウトファイルを使用するか指定する。
・cssの読込など、レイアウトファイルでやっていることについては、`th:remove`タグを追加しておく。

```html:index.html
<!DOCTYPE html>
<html
	xmlns:th="http://www.thymeleaf.org"
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
	layout:decorate="~{layouts/layout01}">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="css/uikit.min.css" th:remove="all" />
<script src="js/uikit.min.js" th:remove="all"></script>
<script src="js/uikit-icons.min.js" th:remove="all"></script>
<title>トップページ</title>
</head>
<body>

<!-- 内容 -->
<div class="uk-section" layout:fragment="content">
<p>トップページです</p>
</div>

</body>
</html>
```

## Controller作成

```java:Controllerクラス
@Controller
public class IndexController {

	@RequestMapping("/")
	public String get() {
		return "index.html";
	}

}
```

# アプリケーション起動
プロジェクト名で右クリック→「実行」→「Spring Boot アプリケーション」を選択。
起動確認後、`http://localhost:8080/`でアクセスできる。

# ソース管理
## binフォルダを無視する
作成したプロジェクトをGitで管理しようとすると、なぜかbinフォルダとその中のclassファイル等が無視されない。ので、無視する設定を追加する。

# プロパティファイルの値の利用
DI管理されたオブジェクトの場合、`@Value`が使える。`defaultValue`はキーが無かった時の既定値。省略可能。

```java
@Value("${key:defaultValue}")
private String value = null; 
```

# faviconを無効にする
デフォルトでは緑の葉っぱがアイコンになっているので、無効にしておくと良い。

```properties:application.properties
spring.mvc.favicon.enabled=false
```
通常攻撃が全体攻撃で二回攻撃のお母さんを、Pythonにやらせよう

## はじめに

『[通常攻撃が全体攻撃で二回攻撃のお母さんは好きですか？](https://okaasan-online.com/)』の1話を見て「これ、Pythonで再現できるな」と思ったシーンがあるので、やってみました。
勢いで書き上げており、既出ネタであった場合は失礼しました。

## 動作環境

- macOS 10.14.4
- Python 3.7.3

インタラクティブシェルを使っています。

## 再現するシーン

ゲームにおける「アカウント」がわからず質問したお母さん。
「自身の解釈ではアカウントは何か」とたずねられ、「あ、あ、あ、あ」と**「あ」を**指折り**カウント**するシーン[^1]です。

[^1]: 天然設定なんですかね？かわいかったです

## Pythonでやってみた

お母さんの「あ」の指折りカウントを再現してみます。

```python
>>> ironna_a = ['あ', 'あ！', 'ア', 'ア！']
>>> for a in ironna_a:
...     print(a)
... 
あ
あ！
ア
ア！
```

繰り返しとprintで、「あ」の連呼（指折りカウントの様子）が再現できました！

### 関数にしてみた

```python
>>> def account_ga_wakaranai_okaasan():
...     ironna_a = ['あ', 'あ！', 'ア', 'ア！']
...     for a in ironna_a:
...         print(a)
... 
>>> account_ga_wakaranai_okaasan()
あ
あ！
ア
ア！
```

これでいろんなところで、お母さんを呼び出せますね！

以上がお母さんの再現ですが、Pythonでは「あ」のカウントも再現できることに気づきました。

## Pythonで「あ」をカウントしてみた

```python
>>> ironna_a = ['あ', 'あ！', 'ア', 'ア！']
>>> ironna_a.count('あ')
1
```

Pythonのリスト[^2]にはcountメソッドがあります

>list.count(x)
>    リストでの x の出現回数を返します。

https://docs.python.org/ja/3/tutorial/datastructures.html#more-on-lists

リストに含まれる「あ」（の数）をカウントしました。

[^2]: 他の言語の「配列」に当たるかと思います。ドキュメントに即すと、リストは複数の値をまとめるのに使うデータ型の1つで、カンマで区切った値の並びを[]で囲って表します ref:https://docs.python.org/ja/3/tutorial/introduction.html#lists

## Pythonで「あ」をカウントしてみた その2

リストについてカウントできるとわかったので、リストの変数名を工夫してみます。

```python
>>> あ = ['あ', 'あ！', 'ア', 'ア！']
>>> あ.count('')
0
```

Python3系では日本語のようなマルチバイト文字も変数に使えます。
変数「あ」にリストを代入しました。

ドキュメント
https://docs.python.org/ja/3/reference/lexical_analysis.html#identifiers

解説記事
https://note.nkmk.me/python-identifier-naming-rule/

これがホントの**あcount**。
おあとがよろしいようで。
【PowerShell】ミリ秒単位でログを日付名のファイルに出力する

# ログ出力処理

###### LogUtility.ps1

```powershell
<#
.SYNOPSIS
 メッセージをログファイルに出力します。
.DESCRIPTION
 文字列の配列を指定して、ログファイルに時刻とメッセージを出力します。
.EXAMPLE
 Write-Log "ログ出力!!" "test.log"
 [test.log]
 2019/07/18 09:03:22.6429 ログ出力!!
.EXAMPLE
 "ログ出力!!!" | log -Keep 7
.INPUTS
 1. 出力するメッセージ (必須)
 2. ファイル情報 (任意)
 3. 保持日数 (任意)
.OUTPUTS
 ログファイル(yyyyMMdd.log)
.NOTES
 - ログに出力されるメッセージは、コンソールにも表示されます。
 - 配列を指定した場合、同時刻で出力されます。
 - ファイルを指定しない場合は、日付名のログファイルに出力されます。
 - KeepDays に値を設定すると期間が過ぎたログファイルを削除します。
#>
function Write-Log {
    [Alias("log")]
    param (
        # 出力するメッセージ
        [Parameter(ValueFromPipeline, Mandatory, Position=0)]
        [String[]] $Messages,
        # ファイル情報
        [Parameter(Position=1)]
        [Alias("File")]
        [IO.FileInfo] $LogFile,
        # 保持日数
        [Parameter(Position=2)]
        [Alias("Keep")]
        [int] $KeepDays = -1
    )
    Begin {
        $now = Get-Date
        $fileName = if ($LogFile -eq $null) { "{0:yyyyMMdd}.log" -f $now } else { $LogFile.FullName }
    }
    Process {
        $Messages | % {
            $line = ("{0:yyyy/MM/dd HH:mm:ss.ffff} {1}" -f $now, $_)
            try {
                echo $line >> $fileName
            }
            catch {
                Write-Host ("ERROR: {0}" -f $_.Exception)
            }
            finally {
                Write-Host $line
            }
        }
    }
    End {
        if ($KeepDays -ge 0) {
            $ago = $now.Date.AddDays(-$KeepDays)
            dir -File -Recurse -Include *.log | ? LastWriteTime -lt $ago | del
        }
    }
}
```

---
# 使用方法

###### Main.ps1
```powershell
cd $PSScriptRoot
. .\LogUtility.ps1

Write-Log "ログ出力"

$val = 255
log ("val={0}" -f $val)

log (dir .\) -Keep 30
```

---
# 出力結果

###### yyyyMMdd.log

```text
2019/07/18 09:03:22.6429 ログ出力
2019/07/18 09:03:22.6479 val=255
2019/07/18 09:03:22.6569 .gitignore
2019/07/18 09:03:22.6569 FileUtility.ps1
2019/07/18 09:03:22.6569 LogUtility.ps1
2019/07/18 09:03:22.6569 readme.md
```
正規表現のデリミタは"/"じゃなくても良い

## 正規表現のデリミタについて
[公式のマニュアル](https://www.php.net/manual/ja/function.preg-match.php)なんかを見ると、デリミタは毎回`/`なので、`/`を使うものだと思っていた。

```php
preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
```

ただ、これは`/hoge/`でも`{hoge}`でもok

マニュアルをよく見ると,`@`を使っている例も載っていた

```php
preg_match('@^(?:http://)?([^/]+)@i',
    "http://www.php.net/index.html", $matches);
$host = $matches[1];
```

## どんな時にデリミタを変えるのか？
URLに対して正規表現で処理をする機会があり、/を使っていたところ想定外の挙動になってしまったのがきっかけで、今回のことを調べた。
公式のマニュアルのように、urlに対して正規表現によるマッチングを行う場合は、urlに`/`が入っているため、デリミタを`/`以外のものを使用した方が良い。個人的には`@`よりも `{}`の方が好きですね。

先ほどのurlの例をデリミタ`/`を使用して見ます。
バージョンは7.2です。

```zsh
$ php -v
PHP 7.2.14 (cli) (built: Jan 12 2019 05:21:04) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.14, Copyright (c) 1999-2018, by Zend Technologies
```

動いたけどwarningが出てました。

```php
$ php -a
Interactive shell

php > preg_match('@^(?:http://)?([^/]+)@i',
php (     "http://www.php.net/index.html", $matches);
php > var_dump($matches[1]);
string(11) "www.php.net"
php > preg_match('/^(?:http://)?([^/]+)/i',
php (     "http://www.php.net/index.html", $matches);
PHP Warning:  preg_match(): Unknown modifier '/' in php shell code on line 2

Warning: preg_match(): Unknown modifier '/' in php shell code on line 2
php > var_dump($matches[1]);
string(11) "www.php.net"
```
国連ベクトルタイル Docker イメージ rasv リリース

![](https://un-vector-tile-toolkit.github.io/signature/logo.png) 

国連ベクトルタイルツールキットを Docker のコンテナイメージに詰め込んで、デモやハンズオンをぐっと簡単にしていこう、という狙いで [rasv](https://github.com/un-vector-tile-toolkit) というプロジェクトを進めてきたところ、 PC (amd64) と Raspberry Pi (armhf) のマルチアーキテクチャイメージとして準備ができました。

```console
docker run -ti --rm unvt/rasv:latest
```
でお試しください。次のスクリーンキャストみたいな感じで動くと思います。

[![asciicast](https://asciinema.org/a/xm9XKMRGv1OTlopq9oH2KgOzv.svg)](https://asciinema.org/a/xm9XKMRGv1OTlopq9oH2KgOzv)

中には、Tippecanoe とか ogr2ogr とか osmium、それから maputnik が入っています。

なお、 rasv は [新ハンズオン資料 ango](https://github.com/un-vector-tile-toolkit/ango) に向けて今後も調整していくことになると思います。
log4j2のJSONLayoutで人間向けのタイムスタンプを出力する

log4j2のJSONLayoutを使うと出力日時をエポック秒で出力してくれる。

```log.json
{
	"instant": {
		"epochSecond": 1563403242,
		"nanoOfSecond": 895000000
	}
}
```

人間ごときにエポック秒を直接読むことは難しいので普通に年月日が出力したい。

のでこうする。


```log4j2.xml
<JsonLayout>
	<!-- 略 -->
	<KeyValuePair key="timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss,SSSXXX}"/>
</JsonLayout>
```

結果

```log.json
{
	"timestamp": "2019-07-18T07:40:42,895+09:00"
}
```
Emacs org-mode をシナリオ作りに使う

Emacs org-mode は非常に多くの機能をもつアウトライナーツールです
僕は普段、漫画のシナリオ作成に使用しているのですが、その中で特に気に入っている機能について紹介します

### outliner
章立てしてツリー構造を作ることができます
タイトルに相当する文の冒頭に"* "と打つことで作成されます
"** "、"*** " とするとさらにネストされます
シーンごとに執筆していきます
<img width="669" alt="outliner.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/c1e8d2a4-b180-8120-d2e0-341ca198b9f9.png">

### drawer
直訳すると引き出し機能です
Tab キーで、閉じたり開けたりできます
他のアウトライナーエディタではあまり見ない機能かもしれませんが地味に強力な機能です
プロットやシーンの情報、書く予定のアイデアメモなどを残す際に使用しています
<img width="327" alt="drawer.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/067b610d-60dc-7f7d-3c77-ad266c247e60.png">
ドロワーを閉じた状態
<img width="516" alt="drawer_open.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/d8ffee76-83b2-a171-b4db-3166ab2de45a.png">
ドロワーを開けた状態

### list drawer
正式な名前がわからないのでこう呼んでいます
多分、ドロワーの機能というよりリストの機能だと思うのですが
"+ " や"- "を文頭に置くとリストになり、これに続く行の冒頭を2スペースでインデントするとネストされたリストになるのですが、このサブツリーもTabで閉じることができるのです
上記ドロワーよりとっさに書けるため、簡単なメモを残したい場合に使用しています
<img width="404" alt="list_drawer.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/ce864241-8b82-e5bb-7627-a2872b581fe0.png">
リストを閉じた状態
<img width="445" alt="list_drawer_open.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/0c3e52a3-4a45-1c48-e8ab-8db6122c546f.png">
開けた状態


### agenda
アジェンダ機能です
指定してある各ファイルからTODOのついている記事を集めてきて表示しています
<img width="503" alt="agenda.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/a0306567-15a3-2e0f-0572-92142d4b4e89.png">


### inline image
ワードなどのように画像を入れられます
特に説明も要いりませんよね:hugging:
<img width="370" alt="inline.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/e60d5b49-0930-7806-9af6-5f32b8dfe700.png">

### table
テーブルを組む機能もあります
ちょっとした表計算も可能です（Excelほど便利ではありませんが）
ページのコマ数をカウントしたいときに使っています
<img width="207" alt="excel.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/3d753f6d-7b71-6641-f52a-b9f1f17a37d8.png">

### emacs lisp
コードを書いてエディタ機能を拡張できます
下記のコードでは、行の冒頭と行末にセリフを示す記号を書き足す関数の定義と、それにショートカットを割り振っています
emacs lisp という言語を使うのですが、これを学んでまで機能追加したいって人はどれだけいることやら…

<img width="372" alt="code.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/e5f240ba-76ce-7692-6645-aada9f147301.png">
<img width="408" alt="shortcut.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74331/665afe3a-dad7-656a-889c-bfb2f73a03cf.png">
CSSでも変数定義できるんだよっ！

実は結構前からあったみたいですが、最近知りました。

その名は **カスタムプロパティ**。

　**カスタムプロパティ**
　https://developer.mozilla.org/ja/docs/Web/CSS/Using_CSS_custom_properties
　＃IEは例によってサポート外です・・・

Qiitaにも過去に紹介あったようです。

　**CSS Variables(カスタムプロパティ)でCSSがより便利に！**
　https://qiita.com/kyota/items/bd5d291809415cc2d7b1


# 何が嬉しいのか

Sass/LESSで出来てた変数定義がCSS単体でもできます。

・・・だけだと、Sass/LESSの方がもっと機能がたくさんあるから良いじゃんという結論になりますが、個人的には**動的に変更可能なところ**が嬉しいと思ってます。

# 具体例

よく、WEBサイトで文字サイズの大中小が切り替えれたり、テーマが切り替えれたりできますよね。
あれがカスタムプロパティでも実現できそうです。

zoomという機能もありますが、Firefoxでは動かないようだし、標準的な機能でもありません。

　**zoom**
　https://developer.mozilla.org/ja/docs/Web/CSS/zoom


ということで実際に作ってみたデモはこちらです。

![mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/36c92ac4-bfd0-08fb-2212-1caea0cff73d.gif)


　**デモサイト**
　http://megyo.jp/software/samples/css-var-sample/index.html

　**デモサイトのソース(GitHub)**
　https://github.com/uemegu/Sampes/tree/master/css-var-sample


デモの中では２パターンのやり方で変数を書き換えてます。

````javascript
// 変数だけを定義したCSSを読み込み直す
document.getElementById("button").onclick = () => {
    const link = document.querySelector('link[rel="stylesheet"]');
    link.href = link.href.includes('variables1.css') ? 'variables2.css' : 'variables1.css';
};

// JavaScriptでカスタムプロパティを書き換える
document.getElementById('button2').onclick = () => {
    const color = document.documentElement.style.getPropertyValue('--background');
    document.documentElement.style.setProperty('--background', color === 'black' ? 'white' : 'black');
};
````


また、試したみたらSassと組み合わせて利用することもできました（LESSは確認してません）。

````sass
:root {
  --font-size: 18px
}
$font_size_normal: var(--font-size);
````


# まとめ

実際の業務ではまだ使ったことはないのですが、IEを考えなくて良い場合は使えるシーンが多いのではないでしょうか。

IEがこの世からなくなることが働き方改革じゃないかと、今日思いました。
plunkerでbabylon

#概要

plunkerでbabylonやってみた。

#成果物

https://embed.plnkr.co/zJF6fOBZmxPmzPWIxIAa/

https://embed.plnkr.co/tAAwgHiGXtHdxsuz1o85/

https://embed.plnkr.co/d8CCYHobWsova8acZt1u/

https://embed.plnkr.co/PoLeAJQIbrnstefCi1sJ/

https://embed.plnkr.co/ESyWmoXYvpIfQ9t84njy/

以上。
leafletを鍛える。その19

#概要

leafletを鍛えてみた。
SmoothWheelZoom、使ってみた。

#参考にしたページ

https://qiita.com/mutsuyuki/items/18750a8a73675604c4d8

成果物

https://embed.plnkr.co/rabojXNMJFOsdtQYvv9O/

以上。
canvas ドットインストール

```index01.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
body{
    background:#222;
}

canvas{
    background:#fff;
}
    </style> 
</head>
<body>
     <canvas width="600" height="240">
         canvas not supported
     </canvas> <!--width:300px height:100px -->
    <script src="main01.js"></script>
</body>
</html>
```

```main01.js

'use strict';
{
    function draw(){
   const canvas=document.querySelector('canvas');
   if(typeof canvas.getContext==='undefined'){
       return;
   }
   const ctx= canvas.getContext('2d');
   
   //ctx.fillRect(x,y,width,height);
   ctx.fillStyle = 'pink'; //cssのcolorプロパティ
   ctx.fillRect(50,50,50,50);　
   ctx.strokeStyle = '#f00'; //cssのborder
   ctx.lineWidth = 8; //border太さ
   //ctx.lineJoin = 'round';
   ctx.lineJoin = 'bevel';

   ctx.strokeRect(50,50,50,50);
  
    }
    draw();
}   

```
Edge Dev Channelをインストール、起動、IE Mode

## ダウンロード

* [ダウンロード](https://www.microsoftedgeinsider.com/ja-jp/enterprise?form=MO12FX&OCID=MO12FX)

![スクリーンショット_2019-07-18_07-02-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/4c1059fe-1603-eaff-95ce-9cd2533bb167.png)

![32bit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/35ffc491-3ff4-a09a-75d3-30bd919e29b3.png)

## インストール

* 32bit版と64bit版が選べる。
    * 今回は64bitのwindows10 に 32bit版のインストールを行った。

![32-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/ca6a649f-901b-561a-5f47-3d6ce4f6b80b.png)


## 起動

![スクリーンショット_2019-07-18_07-05-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/896489e3-df68-5efc-3be2-c5a41c6d0562.png)

![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/ee124c8c-f82d-e094-fcca-33b60bc0155d.png)

## UserAgent

> Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3837.0 Safari/537.36 Edg/77.0.211.3

## http:// はセキュリティで保護されていない と表示される

![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/2c07ee9c-c148-e27e-9cf5-e7e976d26804.png)

## IE Modeを有効にする

* [次期「Microsoft Edge」の“IE モード”を試してみた - やじうまの杜 - 窓の杜](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1195904.html)
* `edge://flags/`
    * `Enable IE Integration` を `IE Mode`に設定

![aab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/ab93fdb5-eb92-9d54-1d97-c4f4b7f27cd4.png)

* その他ツール -> このページを Internet Explorer で表示する

![スクリーンショット_2019-07-18_07-27-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/974fe680-1baa-a245-7d55-44d36a8dde08.png)

* すると、IEが起動してきた・・・。あれ？
    * "Can't open this page in Internet Explorer mode. Try reinstall Microsoft Edge with administrator privileges"
    * とあるので、再インストールが必要。

![zz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/6f7353a7-482d-2d22-bdb4-31f64bc0544a.png)

## アンインストール

![スクリーンショット_2019-07-18_07-49-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/709d065c-47c6-2f1a-5e29-6c8648c53bc2.png)


## 再チャレンジ

64bitのwindows10 に 64bit版のインストールを行ったが、
「その他ツール -> このページを Internet Explorer で表示する」
を行うと32bit版同様、IEが新たに起動してきた。
JFreeChart-バーチャートに値を表示する


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

/**
■ JFreeChart-バーチャートに値を表示する

 */
public class Chart07_10 {
  // 目次-バーチャート(BarChart)
  A_Chart07 a_Chart07;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  static final String ITEM_0 = "商品0";
  static final String ITEM_1 = "商品1";
  static final String DOMAIN_0 = "地域0";
  static final String DOMAIN_1 = "地域1";
  static final String DOMAIN_2 = "地域2";

  public static void main(String[] args) {
    // 表示データを生成する
    DefaultCategoryDataset dataset = createDataset();
    // X軸
    CategoryAxis domainAxis = new CategoryAxis();
    // Y軸
    ValueAxis rangeAxis = new NumberAxis();
    // 値を表示するためにY軸を少し広げる ⇒ このくらいは自動的にやってほしい....
    rangeAxis.setUpperMargin(0.1D);

    // レンダラ
    BarRenderer renderer = new BarRenderer();
    // 以下の設定で値が表示される
    renderer.setBaseItemLabelsVisible(true);
    renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    // PlotはCategoryPlot
    CategoryPlot plot = new CategoryPlot(dataset,domainAxis,rangeAxis,(CategoryItemRenderer)renderer);
    JFreeChart jfreeChart = new JFreeChart("バーチャート",(Plot)plot);
    //
    ChartFrame cFrame = new ChartFrame("バーチャート",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }

  private static DefaultCategoryDataset createDataset() {
    DefaultCategoryDataset localDefaultCategoryDataset = new DefaultCategoryDataset();
    localDefaultCategoryDataset.addValue(100.0D,ITEM_0,DOMAIN_0);
    localDefaultCategoryDataset.addValue(44.0D,ITEM_0,DOMAIN_1);
    localDefaultCategoryDataset.addValue(93.0D,ITEM_0,DOMAIN_2);
    localDefaultCategoryDataset.addValue(80.0D,ITEM_1,DOMAIN_0);
    localDefaultCategoryDataset.addValue(75.0D,ITEM_1,DOMAIN_1);
    localDefaultCategoryDataset.addValue(15.0D,ITEM_1,DOMAIN_2);
    return localDefaultCategoryDataset;
  }
}

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/66b8a746-3231-8c56-7924-fe37fef5ba76.png)