OmniAICreator/Qiita-1.07M huggingface dataset:
golangの時刻処理におけるint型の取り扱い方

## はじめに
golangで簡単なタイマーをつくろうとしたときに出会いました。
timeパッケージはint型を使用するのにひと工夫が必要です。

## time.Duration型
以下のようなソースを書いたところ

```go
package main

import (
	"flag"
	"fmt"
	"strconv"
	"time"
)

func main() {
	fmt.Printf("timer start %v\n", time.Now())
	// 第一引数の値をintegerに変換する
	flag.Parse()
	second, err := strconv.Atoi(flag.Arg(0))
	if err != nil {
		fmt.Println(err)
	}

	// データは読み捨てる
	<-time.After(second * time.Second)
	fmt.Printf("timer stop %v\n", time.Now())
}
```

こんなエラーが出ました。

```
invalid operation: second * time.Second (mismatched types int and time.Duration)
```

time.After()ではtime.Duration型を受け付けますが, int型*Duration型は使えないみたいです。
そのため, 時刻処理にint型を使用する際にはtime.Duration()でラップしてやる必要があります。

```
<-time.After(time.Duration(second) * time.Second)
```

エラーも出なくなりましたので動かしてみましょうか。

```
go run timer.go 5
```

```
timer start 2019-03-10 23:26:00.38674904 +0900 JST m=+0.000227757
timer stop 2019-03-10 23:26:05.386941458 +0900 JST m=+5.000420240
```
ばっちり動いてますね！

## さいごに
そもそもなぜタイマーをつくっていたのかというと渋川よしきさん著の[「Goならわかるシステムプログラミング」](https://www.lambdanote.com/collections/frontpage/products/go)という本を読んでいたためでした。
こちらの本、とてもわくわくしながら読み進められています！
golangを身につけたい方、システムプログラミングを知りたい方、是非手にとってみてはどうでしょうか？とてもおすすめです！

さて、こちらの記事が私の初めて書いた記事となります。
これからは自分が学習中に気づいたこと、そしてみなさんを共有したいことを書いていこうと思います！
それではまた近いうちにお会いしましょう！

# 参考
[time-The Go Programming Language](https://golang.org/pkg/time/)
サッパリ系ビスケットプログラミング#4マリオ風ゲーム/コントローラーとステージの作成

SEの方の間でも評価が上昇傾向のビジュアルプログラミング言語、Viscuit（以下ビスケット）でマリオ風のゲームを作成していきます。今回は、簡単なステージを作ります。

※ビスケットのコーディングは全て描画で行います。こちらの記事はビスケットでのコーディングを簡潔に紹介するため、敢えてサッパリした描画のプログラムにしております。こちらをベースに、お好みの描画でオリジナリティーの高いプログラムに仕上げてくださいm(_ _)m


#ステージ作成
##【準備するパーツ】
マリオ、十字キー、Aボタン、ステージブロック、ハテナブロック、土管、コイン、フラッグ、ポール、重力センサー
![50CF3C1E-762F-4381-82C4-F02776468644.jpeg](https://qiita-image-store.s3.amazonaws.com/0/373284/215d53c9-ea47-2aed-2aa7-8cbe67372c45.jpeg)


##【プレイ画面】
マリオがジャンプ→キノコをゲットして巨大なマリオに→土管IN-OUT→地下でコインゲット→土管IN-OUT→フラッグ→クリア…という流れです。
![19D01CED-9D04-4046-8DD0-C8EC9E9380CF.png](https://qiita-image-store.s3.amazonaws.com/0/373284/b5769051-92f2-4c48-6f09-4e31f98ee65a.png)
今回は、ステージ作成とコントローラの配置だけですので、まだ何も動きません。
次回はこのステージ上でマリオを動かせるようにします。
サッパリ系ビスケットプログラミング#3シューティングゲーム/スコアの作り方

SEの方の間でも評価が上昇傾向のビジュアルプログラミング言語、Viscuit（以下ビスケット）でシューティングゲームを作りたいときの基本的なプログラムです。
今回はスコアの作り方です。また、割れたメガネを使用します。
自機については#1シューティングゲームレシピ/コントローラの作り方を、
敵キャラについては#2シューティングゲームレシピ/敵キャラの作り方を参照下さい。

※ビスケットのコーディングは全て描画で行います。こちらの記事はビスケットでのコーディングを簡潔に紹介するため、敢えてサッパリした描画のプログラムにしております。こちらをベースに、お好みの描画でオリジナリティーの高いプログラムに仕上げてくださいm(_ _)m


##【プレイ画面】右上に2ケタのスコアが表示されます。
![489E11DD-8A82-4B2E-9EFE-B3FFD858D067.jpeg](https://qiita-image-store.s3.amazonaws.com/0/373284/532cf4e4-1182-7a60-8bc5-7a9096f3abb8.jpeg)


##【準備するパーツ】
###0から9までの数字
<img width="590" alt="1B4A7EF5-AA87-4205-981B-D5ADD66070B5.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/373284/3710bfce-92c0-8180-1919-9205dfae3ddf.jpeg">
![B0FE13A8-5E78-489E-B702-8ADE3B28A1DF.jpeg](https://qiita-image-store.s3.amazonaws.com/0/373284/29258371-e4e3-226b-0b61-e84daa9d1161.jpeg)


###四角い枠と＋1（画像下）
![6A44BB36-67AE-4C79-8D5B-B2420B5B4B7D.jpeg](https://qiita-image-store.s3.amazonaws.com/0/373284/6c53ea75-ffdf-8242-8c8b-0dabe1efdaa0.jpeg)



##【プログラム解説】
###1ずつ加算するプログラム
![49704ADF-7AB6-4E48-9A28-092D248933D0.png](https://qiita-image-store.s3.amazonaws.com/0/373284/ac055baa-2eb7-2aba-a052-4aa2956cad44.png)
左のメガネに0を入れ、1マス右に＋1を入れます。右のメガネに1を入れます。
左のメガネに1を入れ、1マス右に＋1を入れます。右のメガネに2を入れます。
 一般的なプログラム風に訳すと
 0の右隣に＋1が表示されると、1に変わる。
 1の右隣に＋1が表示されると、2に変わる。
という意味になります。
…以下同様にしますが9までいくと繰り上がりさせなければいけません。


![0B1DAE38-BFCD-4186-9A30-EE240170099F.png](https://qiita-image-store.s3.amazonaws.com/0/373284/b05f9d57-9d8b-e232-19a6-14af49013649.png)


###繰り上げプログラム
![8501D59F-1BB7-4931-AC2C-60C72BD3EFF5.jpeg](https://qiita-image-store.s3.amazonaws.com/0/373284/c29a76ee-ec76-2eca-222d-0ab494b24ccd.jpeg)
左のメガネに9を入れ、1マス右に＋1を入れます。右のメガネに0を入れ、その上に＋1を重ねます。
＋1を0になぜ重ねるのかが、作ってみると分かります。（桁数さえ増やせば何兆〜何億以上もカウントできます。）
 一般的なプログラム風に訳すと
 9の右隣に＋1が表示されると、0に変わり、0の上に重ねて＋1が表示される。
 という意味です。



###炎をスコアに変換するプログラム（割れたメガネ2分割と割れたメガネ3分割）
<img width="425" alt="135DA8C8-39AF-4DA8-922E-CAABE1134EFC.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/373284/cfe6c774-376a-c9d2-2dcd-1acb7853fddd.jpeg">
まず、1つ目のメガネです。メガネの中央を約3秒間タッチし、割れたメガネにします。
左のメガネ上段に四角を入れ下段に炎を入れます。右のメガネ上段に四角と＋1、下段は何も入れません。
 一般的なプログラム風に訳すと
炎が生成したら、四角の枠に＋1が生成され、炎は消滅する
という意味です。
その下、2つ目のメガネです。こちらは3分割の割れたメガネです。
約3秒間触って2分割の割れたメガネを作ったのち、再びメガネの中央を約3秒間触ると下半分が2分割され、3分割の割れたメガネになります。
できたら、左のメガネ下段左右ともに炎を入れます。上段に四角い枠を入れます。右のメガネ上部にには四角い枠とその上に＋1を2つ重ねて置きます。
 一般的なプログラム風に訳すと
炎が2つ同時に生成したら、四角い枠に＋1がダブルで生成され、炎は消滅する
という意味です。
###なぜ炎が2つ発生した時の処理が必要なのか？
打つタイミングと自機の左右移動にり2台同時撃破によって、同時に炎が発生することがあります。そんな時、上のプログラムだけでは2つの炎をさばけず、1つ分の炎しかカウントされません。この3分割メガネによって、それに対応できます。


##【繰り上がりの瞬間】
よく考えるとこれまでのままでは最高スコアが7なので、敵を4機増やしてスコアが繰り上がるところを撮影しました。
![F03443BA-89F5-4D80-B78F-74DC03556220.png](https://qiita-image-store.s3.amazonaws.com/0/373284/a8d95a4d-bd38-8887-4108-1ed44e9bfc07.png)
![3CE1F22C-5DCC-4B4B-8A7D-8609F9DCA7B0.png](https://qiita-image-store.s3.amazonaws.com/0/373284/314639b7-3bb1-ca4d-f88e-f6e65ef60102.png)
![A407AE36-6CC2-4DE9-8571-EE5978A6AC67.png](https://qiita-image-store.s3.amazonaws.com/0/373284/cda897be-22f4-1727-3311-e0ffdb14757e.png)

これにて、サッパリ系ビスケットシューティングゲームレシピは終了です。あとはオリジナリティー溢れるプログラムにカスタムしてください♩
５分以内に開発環境でJavascriptのAjaxを動かしてみたい人へ

# 「細かいことはいいから、JSのAjaxってどうやって書いて、どんな挙動する??」っていうのを知りたい人向けです。


#### こんなのができます :point_down_tone3:
![js-ajax-sample.gif](https://qiita-image-store.s3.amazonaws.com/0/367758/9e55a831-6ed8-01d7-374a-c7c34e748af6.gif)


# やることはシンプルです。

1. 以下のソースコードを、任意のファイル名＋拡張子htmlで作成します。
2. 作成ファイルをブラウザで開いてください。
3. 以上で、JSのAjaxが使えるようになる、はずです。

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>CSS overflow</title>
  <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
  <script>

      $(function () {
          $('#ajax-button').click(
              function () {

                  $.ajax({
                      url: 'http://www.ekidata.jp/api/p/20.json',
                      type: 'GET',
                      dataType: 'script',
                      timeout: 1000,
                      success: function (data, dataType) {
                          for (var i = 0; i < 10; i++) {
                              var text = xml.data["line"][i]["line_name"];
                              document.write(i + 1, '番目の中身は、', text, 'でした</br>');
                          }
                      },
                      error: function (XMLHttpRequest, textStatus, errorThrown) {
                          alert("ng");
                          console.log("ng", XMLHttpRequest, textStatus, errorThrown);
                      }
                  });

              });
      });

  </script>
</head>
<body>
<input type="button" id="ajax-button" value="push button"/> <br/>
<div id="text"></div>
</body>
</html>
```

## 簡単に、ソースコードの説明
1. ボタンをトリガーにJavascriptの処理が開始されます。
    2. その中でajaxでの処理も開始されます。
    3. Ajaxでは外部APIからデータを取得します。
    4. 取得したレスポンスから１つずつ順に取り出してブラウザに表示する、を１０個繰り返します。
5. そして終わりです。

**今回使ったAPI**
[駅データ.jp](http://www.ekidata.jp/api/api_pref.php) が準備しているものを使わせていただきました。都道府県コードは固定値で20をセットしています。
*[余談] POSTの中身を変えたり、ループする回数を変えても良さそう。*

#### 助けてくれた資料達...thanks!!
- [はじめてのAjax(jQuery) 2018年版](https://qiita.com/zakiyamaaaaa/items/bdda422db2ccbaea60d9)... "Ajaxとは??" の説明がありがたかった。

> Ajaxとは「Asynchronous JavaScript + XML」の略です。簡単に言えばJavaScriptとXMLを使って非同期にサーバとの間の通信を行うことが出来ます。
　Ajaxを使用することで画面遷移をせずにHTMLを更新することが可能なので、ユーザビリティの向上やサーバ負荷の軽減に繋がります。AngularJSなどで作成したシングルページアプリケーションはこの技術を中心に構成されています。

- [JavascriptのAjaxについての基本まとめ](https://qiita.com/katsunory/items/9bf9ee49ee5c08bf2b3d)...実装するに当たっての一通りの流れがわかる
- 実装に当たっては以下の２つを参考にしました。
    - [Ajaxで外部APIに通信する方法がうまくいかない](https://teratail.com/questions/15630)
    - [はじめてAjaxを実装する人へ、効率的な学習方法について書きました](http://javatechnology.net/ajax/biginer-start-up/)

---
読んでいただいてありがとうございます。
ご不明点、または間違いあればコメントいただけると幸いです。
サッパリ系ビスケットプログラミング#2シューティングゲーム/敵キャラの動き

SEの方の間でも評価が上昇傾向のビジュアルプログラミング言語、Viscuit（以下ビスケット）でシューティングゲームを作る際の敵キャラの動きです。自機については#1シューティングゲームレシピ/コントローラの作り方を参照ください。

※ビスケットのコーディングは全て描画で行います。こちらの記事はビスケットでのコーディングを簡潔に紹介するため、敢えてサッパリした描画のプログラムにしております。こちらをベースに、お好みの描画でオリジナリティーの高いプログラムに仕上げてくださいm(_ _)m


##【プレイ画面:ザコ機6機、ボス機1機の例】
![C637463A-D844-4F8A-9FA1-7AF223E92147.jpeg](https://qiita-image-store.s3.amazonaws.com/0/373284/d15e528a-aab1-08d0-b09c-7474de42993e.jpeg)
サッパリ系と言ってもボリュームは確保したい、ということで、今回は7機の敵をセットしました。


##【準備するパーツ】
ザコ機、ボス機、炎の3つです。

###ザコ機
![B0DAB9A8-3926-4961-A78F-00BAF204F98E.png](https://qiita-image-store.s3.amazonaws.com/0/373284/ae75875a-6222-79b5-2752-a79e8dcdc30f.png)
###ボス機
![0590DF30-B66F-4655-935C-E5129D39FA50.png](https://qiita-image-store.s3.amazonaws.com/0/373284/65ee8ac1-8d4e-95e0-fdec-39182ac3b038.png)
###炎
![24335802-BD17-4C94-99FF-97EB7AC4AF07.png](https://qiita-image-store.s3.amazonaws.com/0/373284/ac70dbb0-64ee-8b39-68bb-154d56fe765c.png)


##【プログラム解説】
###①敵キャラの動き（メガネ2つ）
左のステージにザコ機6機とボス機1機を配備します。
一般的なプログラム風に訳すと
「ザコ機は1マスずつ左スクロールする」
「ボス機は1マスずつ右スクロールする」
という意味になります。
![22BB7970-512B-4B97-A6EA-D52FFF9D7924.png](https://qiita-image-store.s3.amazonaws.com/0/373284/55d0be32-4253-798f-cc6a-7dabd7deb6fa.png)


###②敵キャラの破壊（メガネ4つ）
![0051D230-BA53-4EF0-95E7-22AE8FB53E9B.png](https://qiita-image-store.s3.amazonaws.com/0/373284/6da00dbd-779e-ed05-b6e4-f1c2e5dc7235.png)
当たり判定は、一般的なプログラム風に訳すと
「もしザコ機の1マス直前にミサイルAまたはミサイルBが到達すると、ザコ機は炎に変わる」（メガネ上と中下）
「もしボス機の1マス直前にミサイルBが到達すると、ボス機は炎に変わる」（中下）
という意味になります。


###③炎の消滅
![25AC046C-8D38-4F95-9A2A-C020A9E1B559.png](https://qiita-image-store.s3.amazonaws.com/0/373284/7a2b833a-e228-a8ff-67d0-cb204697068a.png)
メガネ最下段は、一般的なプログラム風に訳すと
「炎は生成直後に消滅する」（スパイ大作戦の名ゼリフのような命令w）
という意味になります。
右のメガネに何もパーツを入れないと「パーツを消滅させる」命令になります。


##【プレイ画面】
![894E5A3C-F0D0-4401-93A4-B44D81A902E5.png](https://qiita-image-store.s3.amazonaws.com/0/373284/22cdab22-ea90-b101-61ca-c8782969332f.png)

連打であっという間に撃破しましょう。
以上、敵機の動きプログラムでした。#1から続けて作ると、サッパリ系ビスケットシューティングゲームの完成です。


こうなると、スコアも欲しくなりますね…スコアは次回(^^)／~~~
サッパリ系ビスケットプログラミング#1シューティングゲーム/コントローラーの作り方

SEの方の間でも評価が上昇傾向のビジュアルプログラミング言語、Viscuit（以下ビスケット）でシューティングゲームを作りたいときの基本的なプログラムです。
今回は自機のコントローラの作り方です。割れたメガネを使用します。

※ビスケットのコーディングは全て描画で行います。こちらの記事はビスケットでのコーディングを簡潔に紹介するため、敢えてサッパリした描画のプログラムにしております。こちらをベースに、お好みの描画でオリジナリティーの高いプログラムに仕上げてくださいm(_ _)m


##【プレイ画面】
![8B5BE5E4-8FCB-4BB5-8368-0586B2F758E0.png](https://qiita-image-store.s3.amazonaws.com/0/373284/d06982d4-2548-cfc9-4798-597f19ce0d2c.png)


##【準備するパーツ】
自機![8F0C6078-633F-441C-A44C-4048B5985A47.png](https://qiita-image-store.s3.amazonaws.com/0/373284/2730e20f-7614-3f6e-a4ed-460c8d7f482f.png)
###十字キー
![DA96FD0B-349E-4FD3-A316-66E9EE671BEC.png](https://qiita-image-store.s3.amazonaws.com/0/373284/bfd647f4-fd5b-d8db-59bf-dd76d343c9ce.png)
###Aボタン、Bボタン
![F8066413-DB2A-4373-920F-97949E87E801.png](https://qiita-image-store.s3.amazonaws.com/0/373284/9c232e40-b13b-9d83-2dbb-a06b2cb24374.png)
![CDBA6193-4DA8-4795-A334-345E933A6973.png](https://qiita-image-store.s3.amazonaws.com/0/373284/ab2f8631-9ab3-cb4b-9303-18d56a3c7fd8.png)
###ミサイルA、ミサイルB
![BB78DC25-CD79-499D-A98D-3B972878E48D.png](https://qiita-image-store.s3.amazonaws.com/0/373284/0c6d1710-16ae-49db-9d09-bf53a840eacd.png)
![3469B9BB-B191-459D-9D87-8220038E62BA.png](https://qiita-image-store.s3.amazonaws.com/0/373284/e87ae5cd-4bc7-e8d4-606f-323e05c5a1b4.png)


##【割れたメガネの作り方】
ビスケットはメガネでプログラミングしていきます。
「割れたメガネ」と呼ばれている機能を使うことで、画面上でキャラクターを自由自在にコントロールすることができるようになります。


①メガネを出し、メガネの中央にある→の辺りを約3秒押し続けます。（タブレットの場合）
![1FE8BFF2-F649-4009-A801-0BB520FCECCF.jpeg](https://qiita-image-store.s3.amazonaws.com/0/373284/140a0ab5-caa6-8eee-1ec6-9e04fae511e7.jpeg)
②メガネの上半分が白、下半分がグレーになったら完成です。
![089DEE4A-07A3-4B0F-9D95-329322BB4227.jpeg](https://qiita-image-store.s3.amazonaws.com/0/373284/cd580550-a276-535b-71f1-07928adf5249.jpeg)
機能の説明についてはプログラム解説の方で行います。


##【プログラム解説】
①十字キーをタップすると上下左右に自機が動く（割れたメガネ4）
![C07A45B5-8B4C-4C3B-9DEA-B8B649DB759E.png](https://qiita-image-store.s3.amazonaws.com/0/373284/bffec99d-3915-3382-f3fe-ef308440a22e.png)
割れたメガネの中に十字キーと自機を入れます。割れたメガネの分割線の上下に収まるよう、画像のようにポジション調整してください。
タッチマークは左側のメガネの十字キーに設置します。こちらのプログラムでは、上下左右の4方向に自機を動かすことができます。
一般的なプログラム風に訳すと
「もし十字キーの上（下、左、右）が押された時、自機は1マス上（下、左、右）に移動する」
という意味になります。


②Aボタンを押すとミサイルAを発射、Bボタンを押すとミサイルBを発射（割れたメガネ2 メガネ2）
![E43D8F49-C52B-4DAD-B608-59FE463AEB1C.png](https://qiita-image-store.s3.amazonaws.com/0/373284/ee78c0fb-d1a8-e150-0041-e0bbab9bc0d9.png)
十字キーの時と同様に、割れたメガネでミサイル発射命令を行います。
画像の割れたメガネの右側のメガネの説明をします。自機上部にミサイルパーツをそれぞれセットしています。
一般的なプログラム風に訳すと
「A（B）ボタンが押されると、ミサイルA（B）が生成される」
という意味になります。
画像のメガネの下2つは、一般的なプログラム風に訳すと
「生成された生成されたミサイルA（B）は、1マスずつ上に進み続ける」
という意味になります。


③最後にスクロール設定を忘れずに！歯車マークをタップして、上下の循環をしない設定にしたらできあがりです。
![6AD2C4B1-59BF-429F-AB55-369CB812BF37.png](https://qiita-image-store.s3.amazonaws.com/0/373284/cc34edcb-9f62-17b6-df69-d3ebca1a417b.png)

以上、サッパリ系ビスケットシューティングゲームでした。

あ、まだ敵機がいない…。敵機は次回にて♩
レンタルサーバー


## PWA用のサーバを探す

- サブドメインが20以上使える
- SSLが使える


## レンタルサーバー

- [XREA](https://www.xrea.com/)
無料：サブドメイン0個
380円：サブドメイン3個
ssh:OK


- さくらレンタルサーバー
スタンダード500円
ssh:OK
DB:20
ssh:OK
サブドメイン:2個



- さくらVPS
- AWS

- ロリポップ
500円
スタンダードプラン以上でSSH：OK
cron:OK
DB:30
WP:OK
サブドメイン：500
SSL:OK


- Netowl



- heteml
800円以上
rootなし
ssh:OK
DB:70
独自ドメインの場合のみサブドメイン：無制限


- xdomain


- XSERVER
1200円以上
SSH:OK



- firebase

- XFREE
WordPress OK
サブドメイン NG
SSL OK
無料。広告あり。
広告の表示について
エックスフリーの「PHP・MySQLサーバー機能」、「WordPress機能」、および3ヶ月以上ご利用の無い「HTMLサーバー機能」のアカウントにおいては、スマートフォンおよびタブレット端末からのアクセス時のみ、ご利用のサイトページ上に、所定の広告が自動挿入されます。ファイルマネージャーやFTPソフトから更新を行うことで表示されなくなります。

- starserver
126円：
サブドメイン：200個
SSL：OK
WP：NG
DB:NG
htaccess
cron:NG
ssh:NG

250円
サブドメイン：1000個
SSL：OK
WP：OK
nginx
MYSQL：1個
htaccess
ssh:NG

500円
サブドメイン：3000個
SSL：OK
WP：OK
nginx
MYSQL：20個
htaccess
ssh:NG
Mac環境のインストールメモ (2019年6月)

# はじめに

2019年3月10日に実施した MacBook Air の macOS Mojave に対するインストールメモです。

# 手順

## システム設定

### トラックパッド

* [タップでクリック] を有効

### キーボード

* [ショートカット] タブの [入力ソース] で以下のチェックを外す。後述する Alfred の起動ショートカットを Ctrl + Shift + Space にしたいため。
    * [前の入力ソース] を選択
    * [入力メニューの次のソースを選択]

## Terminal での各種インストール

ターミナルを起動

```bash
# xcode のインストール
$ sudo xcode-select --install

# HomeBrew のインストール

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install cask

# Hyper のインストール

$ brew cask install hyper
```

## Hyper での各種インストール

### alfred

```bash
$ brew cask install alfred
```

ランチャーのショートカットを Ctrl + Shift + Space に変更

### Google Chrome

```bash
$ brew cask install google-chrome
```

### Slack

```bash
$ brew cask install slack
```

### vscode

```bash
$ brew cask install visual-studio-code
```

### Emacs

```bash
$ brew cask install emacs
```

その後、各種秘伝の .emacs を適用する。

### Google 日本語入力

```bash
$ brew cask install google-japanese-ime
```

[システム設定] - [キーボード] - [入力ソース] で「ひらがな (Google)」を追加して、マシンを再起動する。

### Dropbox

```bash
$ brew cask install dropbox
```

### git の設定

```bash
$ git config --global user.name "ユーザ名"
$ git config --global user.mail "メールアドレス"
```

### ssh の設定

ファイルサーバーからGitHub の秘密鍵を ~/.ssh にコピーする

### Docker

```bash
$ brew cask install docker
$ docker --version
$ docker-machine version
$ docker-compose version
```

### nvm

```bash
$ touch ~/.bash_profile
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
$ source ~/.bash_profile
$ nvm ls-remote
$ nvm install v10.15.3
```

### yarn

```
$ brew install yarn
```

# 参考

* [5分でできるMacBook Proに最低限の開発環境構築](https://qiita.com/kai_kou/items/3107e0a056c7a1b569cd)
* [Mac に homebrew で docker 入れたい 2017年末版](https://qiita.com/5h_/items/d32ca49efc88d10f0305)
Coderでお試しNim開発環境を作る

#やりたいこと
Coderでお試しNim開発環境をつくってサンプルコードを動かしてみる。

##環境設定でやること
以下はすべてCoder上での操作です。
Coderの始め方は本筋から逸れるので、割愛します。

1. NimのExtensionをインストールします(要らなかったら飛ばしてもOKです）
    ![スクリーンショット 2019-03-10 22.12.59.png](https://qiita-image-store.s3.amazonaws.com/0/223008/81638f67-797b-63a1-3466-47253c04f2ae.png)

2. ターミナルを開きます(Ctrl+Shift+@)
3. gccとxz-utilsをインストールします
  (nim-0.19.4.tar.xz解凍時にxzの解凍が必要なのでxz-utilsをインストール)

    ```sh
    > sudo apt-get -y install gcc xz-utils
    ```

4. [Nim公式サイトのChoosenimを使った方法](https://nim-lang.org/install_unix.html)でNimをインストール

    ```sh
    curl https://nim-lang.org/choosenim/init.sh -sSf | sh
    ```

5. 問題なくインストールできたら、choosenimの言う通りに`.nimble/bin`へのパスを通す。

    ```sh
    echo 'export PATH=/root/.nimble/bin:$PATH' >> ~/.bashrc
    . ~/.bashrc
    ```

##サンプルコードを動かす
1. 以下の内容の`calc.nim`ファイルを作る。

    ```hello.nim
    # This is a comment
    echo "What's your name? "
    var name: string = readLine(stdin)
    echo "Hi, ", name, "!"
    ```

2. コンパイルする。

    ```
    nim c hello.nim
    ```

3. 生成された実行バイナリを動かしてみる。

    ```
    ./hello
    ```

    ![スクリーンショット 2019-03-10 22.56.11.png](https://qiita-image-store.s3.amazonaws.com/0/223008/77895b03-5869-fa63-37dc-604406d45fd7.png)

#余談
お試しとして手元の開発マシンの環境を汚したくない場合にはもってこいだなと思います。
特にXcode絡みでNimがインストールできないMacユーザとかにオススメです。
(Coderはコンテナイメージが配布されているので、手元のマシンでも導入できるみたいです)
Microsoftあたりがそのうち買収して、箔を付けてくれると業務でも導入しやすくなりそう。
sqlalchemyのテスト

# セットアップ（参考ほぼそのまま）
```python

from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine

Base = declarative_base()

class Restaurant(Base):
	__tablename__ = 'restaurant'

	id = Column(Integer, primary_key=True)
	name = Column(String(250), nullable=False)

	@property
	def serialize(self):
		"""Return object data in easily serializeable format"""
		return {
			'name': self.name,
			'id': self.id,
		}


class MenuItem(Base):
    __tablename__ = 'menu_item'

    name = Column(String(80), nullable=False)
    id = Column(Integer, primary_key=True)
    description = Column(String(250))
    price = Column(String(8))
    course = Column(String(250))
    restaurant_id = Column(Integer, ForeignKey('restaurant.id'))
    restaurant = relationship(Restaurant)

    @property
    def serialize(self):
        """Return object data in easily serializeable format"""
        return {
            'name': self.name,
            'description': self.description,
            'id': self.id,
            'price': self.price,
            'course': self.course,
        }


#engine = create_engine('sqlite:///restaurantmenu.db') #Menuは大文字
engine = create_engine('sqlite:///restaurantMenu.db')

Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)

```

# テスト
```python

from sqlalchemy import create_engine
from database_setup import Base, Restaurant, MenuItem
engine = create_engine('sqlite:///restaurantMenu.db')
Base.metadata.bind=engine


from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

#create(insert)
new_restaurant = Restaurant(name='Pizza Palace')
session.add(new_restaurant)
session.commit()

new_item = MenuItem(name='Burger',price ='$5.99')
session.add(new_item)
session.commit()

new_item = MenuItem(name='Ice Cream',price ='$1.99')
session.add(new_item)
session.commit()


#read
menuItems = session.query(MenuItem).all()

for menuItem in menuItems:
    print('***')
    print(menuItem.name)
    print(menuItem.price)

print('===')

#update
burger = session.query(MenuItem).filter_by(name = 'Burger').one()
burger.price = '$2.99'
session.add(burger)
session.commit()

#delete
ice_cream = session.query(MenuItem).filter_by(name = 'Ice Cream').one()
session.delete(ice_cream)
session.commit()

#read
menuItems = session.query(MenuItem).all()

for menuItem in menuItems:
    print('***')
    print(menuItem.name)
    print(menuItem.price)
```

# 参考
https://qiita.com/msrks/items/15144746ff4f7aced4b5
Raspberry Piにprivoxyで広告ブロックサーバをたててみたメモ

別にRaspberry Piじゃなくてもなんでも良いんだけど、ちょうどZero Wを余らせていたので。


Raspberry Pi Zero WにUSBネットワークアダプタを接続して有線LANに接続、ルータのDHCP設定で192.168.1.11の固定IPを振った。
※家の中に無線LANをやたらと増やしても仕方が無いため今回は本機（Zero W）の無線LANは一切使わないことにした

raspbian lite(2018-11-13-raspbian-stretch-lite)をインストールし、apt-getでprivoxyをインストール。
[サーバでAdblockのフィルタを使用する広告ブロックプロキシを動かす パソコン鳥のブログ/ウェブリブログ](https://vogel.at.webry.info/201805/article_4.html) を真似て、actionファイルとfilterファイルをダウンロードし、設定ファイル/etc/privoxy/configに対して対応するactionfileとfilterfile設定を追記。
さらに/etc/privoxy/configに対して

```
 listen-address  :8118
 accept-intercepted-requests 1
```
と設定をすればOK。iptablesの設定をしなくても広告ブロックサーバとして動いてくれるようだ。
使用時には、LAN内の別クライアントから、httpプロクシとして本機のIP:port（192.168.1.11:8118）を指定するだけで良い。
※LAN内なのでiptables設定そのものを一切していない
Rubyのアクセサメソッドを理解した

Rubyの初心者ですが、どーもアクセサメソッドに関して附に落ちなかったのですが、ようやく理解できたので噛み砕いてご紹介。
※表現の仕方に不備があれば教えて下さいm(_ _)m

まずアクセサメソッドには3つの種類があります。

```ruby
attr_reader #rede（読む）
attr_writer #write（書く）
attr_accessor #access(読むと書くの両方)
```

それでは一つづつ見ていきましょう。

#attr_reader

まずは読むためのアクセサメソッドです。

Productというclassを作って、商品名(name)を作成して、商品名を表示させます。

```ruby
class Product
  def initialize(name)
    @name = name
  end
end

product = Product.new('pen')
puts product.name

#=> ndefined method `name' for #<Product:0x007fa59b0dc620 @name="pen"> (NoMethodError)

```
これだけではエラーになります。
`Product`というclassを作って、`initialize`で@nameインスタンス変数に代入しています。

`product = Product.new('pen')`でインスタンスを作成し、`product`という変数にインスタンスを代入。
`puts product.name`でpenと表示させようとしましたがエラー。

rubyでは**そのままだとインスタンス変数にアクセスできない**のです。
では表示させるためのインスタンスメソッドを作成してみましょう。

```ruby
class Product
  def initialize(name)
    @name = name
  end

  def name
    @name
  end

end

product = Product.new('pen')
puts product.name

#=>pen

```

無事に表示させることができました。
しかし、表示させるためだけのメソッドを毎回作成するのは面倒ですよね。。。

そこで登場するのが`attr_reader`です。

```ruby
class Product
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

product = Product.new('pen')
puts product.name

#=>pen

```

これでわざわざ表示させるためのメソッドを作成する必要がなくなりました。
これで簡単にインスタンス変数をread、読む事ができました。

#attr_writer
attr_readerが理解できれば簡単です。
インスタンス変数を変更できるよう(write,書く)になります。
まずは`attr_writer`を使わない場合はわざわざそのためのメソッドを作らなければなりません。

```ruby
class Product
  attr_reader :name
  def initialize(name)
    @name = name
  end

  def name=(value)
    @name = value
  end

end

product = Product.new('pen')
product.name = 'note'

puts product.name

#=>none

```

これも面倒ですよね。
`attr_writer`で一発解決。

```ruby
class Product
  attr_reader :name
  attr_writer :name

  def initialize(name)
    @name = name
  end
end

product = Product.new('pen')
product.name = 'note'

puts product.name

#=>none

```

#attr_accessor
`attr_reader`と`attr_writer`の両方の役割を果たすのが`attr_accessor`。
`attr_reader`と`attr_writer`の意味がわかれば簡単ですね。

```ruby
class Product
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

product = Product.new('pen')
product.name = 'note'

puts product.name

#=>none

```

#引っかかってた点と、まとめ
```ruby
class User
 def initialize(name)
    @name = name
  end

  def hello
    "Heloo, I am #{@name}"
  end
end

user = User.new('atsushi')
p user.hello

#=> Heloo, I am atsushi
```

例えば上記の様なコードがあるときに、なんでこの場合はアクセサメソッドいらないの？
なんで？
`attr_reader`いるんじゃないの？
だってインスタンス変数を参照してるじゃん。
と思っていましたが、違います。
なぜならhelloメソッドで**直接インスタンス変数を参照**しているからです。
だからアクセサメソッドは必要ありません。

```ruby
class User
 attr_reader :name
 def initialize(name)
    @name = name
  end

end

user = User.new('atsushi')
p user.name
```
しかし上記のような場合は`attr_reader :name`が必要です。
なぜなら、`user = User.new('atsushi')`はuserにインスタンスを代入しています。
**userという変数からインスタンス変数を参照する必要があるため、アクセサメソッドが必要**なわけです。
**クラスの外部からインスタンス変数の参照するために必要なのです。**

**アクセサメソッドは、外部インスタンスのインスタンス変数を参照したり変更するために定義する。**
というところでしょうか。

さぁまだまだ初心者なのでがんばります。
やさしい DB Browser for SQLite の使い方 for MacOS

# はじめに

SQLiteをGUIベースで操作できるアプリ「DB Browser for SQLite」の導入から使い方までをやさしく解説していきます。
本記事ではMacOSを想定していますが、基本的なアプリの使い方は他OSでも同じだと思うので、適宜読み換えていただければと思います。

# 環境構築

公式サイトのダウンロードページから、各種OSに対応するものをダウンロードします。
（2019/3/7時点の最新バージョンは、「3.11.1」のようです）
https://sqlitebrowser.org/dl/

ダウンロード後、「DB.Browser.for.SQLite-3.11.1v2.dmg」を開き、そのまま「アプリケーション」にドラッグすればインストール完了です。

<img width="612" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/39aafb8f-2f32-613c-2de3-952c48986d57.png">

ちなみに、MacOSの場合、「Homebrew」でインストールすることもできるようです。

```
brew install --cask db-browser-for-sqlite
```

# 機能一覧

以下にアプリの機能を紹介していきます。
他にあれば随時更新していきます。

## データベースの新規作成

画面左上にある、「New Database」をクリックします。

<img width="1552" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/b195b462-512c-0c5d-a5c5-beb5284ffb53.png">

「Save As:」のところにファイル名（今回はtest.db）を入力し、「Save」をクリックします。

<img width="562" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/c06e285c-6d2e-ca8a-896d-71234c753b17.png">

「Edit table definition」という画面が出てきて、テーブルを作成するよう促してきますが、いったん「Cancel」をクリックします。
SQLの実行方法については次節で説明します。

<img width="762" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/6f2eb932-effa-ebf7-4bc3-840e0089f87c.png">

これでデータベースの新規作成は完了です。

## SQLの実行

SQLを実行するためには、「Execute SQL」タブに移動します。

<img width="1552" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/b7a8bee1-92bc-4e7d-90d4-990e99491ade.png">

ここでSQLを実行することで、各種操作を行うことができます。
例えば、以下のSQLを実行するとします。

```
CREATE TABLE adachi_menu(id INTEGER PRIMARY KEY AUTOINCREMENT, product_name TEXT NOT NULL, price INTEGER NOT NULL, calorie INTEGER NOT NULL);
```

実行したいSQL文を一番上のテキストエリアに入力し、その上にある再生ボタンをクリックします。

<img width="1552" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/8dd7ff7d-d1b8-e3f2-2f3d-f67f1f5f3064.png">

すると、SQL文が実行され、一番下のテキストエリアに実行結果が表示されます。
「Result: query executed successfully. ~」と表示されたら成功です。

<img width="1552" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/40bc25fc-b547-b499-5675-95f11aab8c08.png">

「Database Structure」タブに移動すると、テーブルが作成されていることが確認できます。

<img width="1552" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/d7a12a81-8f21-76c6-b7df-a1129fdc16fa.png">

このようにして、実行結果がすぐに可視化されるのが利点です。
また、実際にテーブル内に入っているデータを確認するには、「Browse Data」タブに移動します。

<img width="1552" alt="9.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/529eab48-39a5-a0d3-1bc2-51f798f03e89.png">
Gmail API 過去1ヶ月分のメールを全て取得する (Ruby)

[@koshi_life](https://twitter.com/koshi_life) です。

Gmail APIでメールを取得する機会があり、過去メールの取得の仕方調べたので備忘します。

流れは、
１．[messages:list](https://developers.google.com/gmail/api/v1/reference/users/messages/list) APIを使って、対象のメッセージIDを取得し、
２．[messages:get](https://developers.google.com/gmail/api/v1/reference/users/messages/get) API を使い、メッセージIDのメール内容を取得する
の２ステップです。

※ スレッドID事に取得したいシーンは [threads:list](https://developers.google.com/gmail/api/v1/reference/users/threads/list)、[Thread:get](https://developers.google.com/gmail/api/v1/reference/users/threads/get) で取得が良さげ。


## サンプルコード (Ruby)

```fetch_gmail.rb

# 指定のクエリでメッセージID一覧を返却します。
#
# client: Google::Apis::GmailV1::GmailService
# query: Gmail search operators refer to https://support.google.com/mail/answer/7190
def get_all_messages(client, query, max_results = 100)
  messages = []
  next_page_token = nil

  loop do
    if next_page_token.present?
      result = client.list_user_messages('me', q: query, max_results: max_results, page_token: next_page_token)
    else
      result = client.list_user_messages('me', q: query, max_results: max_results)
    end
    messages += result.messages if result.messages.present?
    # result.next_page_token が存在していたら次のデータ有り
    next_page_token = result.next_page_token
    break if next_page_token.blank?
  end
  messages
end

# 過去１ヶ月分の全メールを取得し、`do_something`をコールします。
#
# client: Google::Apis::GmailV1::GmailService
def main(client)
  query = 'newer_than:1m' # クエリ: 直近１ヶ月分
  messages = get_all_messages(client, query)
  messages.each do |msg|
    # メール取得
    gmail = client.get_user_message('me', msg.id)
    #
    # do_somthing(gmail)
    #    
  end
end
```

例外処理と `get_all_messages`内の`result.messages`が大量データを扱う時、メモリ占有率など気になりましたが、サンプルコードのため考慮していません。

コード内のポイントとしては、メッセージID一覧取得する
`get_all_messages`内で`result.next_page_token`の存在有無確認で
次のデータの存在有無を確認している点ですかね。


## 参考

- [Gmail API「Users.messages:list」と「Users.history:list」の違い](https://qiita.com/koshilife/items/3d5fc80a45cd9526b699)
セキュリティ対策のため、target="_blank"のa タグに "noopener noreferrer"のrel属性を自動で付与するjavascript文

![image.png](https://qiita-image-store.s3.amazonaws.com/0/110571/f7cd080d-91c7-db08-8b64-708a5abf516c.png)
([”寝る人”さんのブログ](https://yoru9zine.hatenablog.com/entry/2017/03/17/230729)より、とてもわかりやすい画像を引用させていただきました)

# 脆弱性
`target="_blank"`のaタグには<b>脆弱性</b>があります。

遷移先から遷移元のページを不正に操作したり、オブジェクトにアクセスしたりできてしまいます。
これによって、<b>フッシング詐欺攻撃</b>を行う余地を生んでしまいます。

[サイトで rel="noopener" を使用して外部アンカーを開く(Google Developers)](https://developers.google.com/web/tools/lighthouse/audits/noopener?hl=ja)
>監査が重要である理由
target="_blank" を使用して任意のページから別のページにリンクしている場合、リンク元のページとリンク先のページは同じプロセスで動作します。 そのため、リンク先のページで負荷の高い JavaScript が実行されていると、リンク元のページのパフォーマンスが低下するおそれがあります。
また、target="_blank" にはセキュリティ上の脆弱性もあります。リンク先のページでは window.opener を使用して親ウィンドウのオブジェクトにアクセスしたり、window.opener.location = newURL によって親ページの URL を変更したりできます。

# 対策
対策としては、`target="_blank"`を指定しいるaタグのrel属性に`"noopener noreferrer"`オプションを付与すれば良いです。

まず`noopener`ですが、このオプションを指定することで「<b>別タブの遷移先から、window.openerを参照できなくなる（≒不正操作ができなくなる）</b>」という効果があります。
そのため、基本的な対策は `noopener`だけで問題ありません。

しかし、Edgeなどの一部のブラウザでは`noopener`自体がサポートされていないこともあります。
その場合の対策として`norefferer`を指定することで、同じような挙動を実現することが可能です。

`norefferer`を指定することで、「<b>遷移先のリソースからリファラーを送らないようにブラウザに指示を出す</b>」ことが可能です。
そのため、`noopener noreferrer`の両方をしていすることが望ましいわけです。

ちなみに、rel属性をはじめ各ブラウザのオプション対応については以下のWebサービスで確認をすることができます。

[Can I use... Support tables for HTML5, CSS3, etc](https://caniuse.com/#home)

# 背景
既存のWebページ内で、`target="_blank"`オプションを指定したaタグが複数存在していました。

Reactであれば、eslintで危険な`target="_blank"`オプションが弾かれたり、wordpressであれば自動で上記のrel属性が付与されるようになっているので、あまり気にすることはありません。

- React：[yannickcr/eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md)
- Wordpress：[wordpress.org日本語　ワードプレス4.8と4.7.5](https://ja.wordpress.org/support/topic/%E3%82%A2%E3%83%95%E3%82%A3%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%88%E3%83%90%E3%83%8A%E3%83%BC%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%80%80%E3%83%AF%E3%83%BC/)

しかし、生のhtmlで記述されたLPでは上記のようにデフォルトで`target="_blank"`を警戒することはできません。
ひとつひとつのaタグにrel属性を付与したりチームの規約にするのも大変なので、javascriptで自動的に属性を付与してあげるのが一番良さそうです。

# スクリプト文

```javascript
// aタグの中身を分解
var aTags = [].slice.call(document.getElementsByTagName('a'));

// 未対応であるIEを除外するため、ブラウザの種別を洗う
var userAgent = window.navigator.userAgent.toLowerCase();
var isIE = (~userAgent.indexOf('msie') || ~userAgent.indexOf('trident'));

function addRels() {
  if (!isIE) { //IEは弾く
    aTags.forEach(function (el) {
      if (el.target === '_blank') {
        var rels = el.rel.split(' ');
        if (!~rels.indexOf('noopener')) {
          rels.push('noopener');
          el.setAttribute('rel', rels.join(' ').trim());
        }
        if (!~rels.indexOf('noreferrer')) {
          rels.push('noreferrer');
          el.setAttribute('rel', rels.join(' ').trim());
        }
      }
    });
  }
};
// 関数を実行
addRels();
```

# 少しだけ解説
`!~rels.indexOf(文字列)`では、いわゆる「<b>ビット反転演算子</b>」を利用しています。

`indexOf`は「文字列が見つかれば文字列が見つかった場所(0以上)」を、「文字列が見つからなければ-1」を返します。
この挙動を利用し、「<b>-1をビット反転演算子にかけ、0を返す」→「if文で0が真と判定される」という文字列マッチングの仕組み</b>を実現しています。
オブジェクト指向のリンク集

エラーハンドリング関連の設計をするにあたって個人的に参考になる記事。(随時更新)

* [オブジェクト指向の用語 - Qiita](https://qiita.com/suin/items/3657f0ebde7f63c632f3)
* [ドメイン駆動設計のエンティティとクリーンアーキテクチャのエンティティ │ nrslib](https://nrslib.com/clean-ddd-entity/)
* [Smalltalkの底を流れる設計思想 - (Design Principles Behind Smalltalk)](http://web.archive.org/web/20050305092826/http://marimpod.homeip.net:80/chomswiki/24)
Raspberry Pi3 wifiのAP/Clientを切り替え


本記事の内容は古くなっています。
以下を参照してください。
https://qiita.com/yamato225/items/24acb27403136732e01b


# 概要

Raspberry Pi3に搭載されたwifiモジュールは、クライアントとしてwifiに接続することも、アクセスポイント(AP)として他の機器からRaspberry piに接続することもできます。
アクセスポイントとして起動すれば、キーボードやモニタを用意せずにスマホからSSH接続して設定を行うことができます。

一方で、アクセスポイント化⇔クライアント化の切り替えがうまく行かず、
少し苦労したので、備忘を兼ねて投稿します。

# 構成

Raspberry Pi 3

OSバージョン　Raspbian stretch lite

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.8 (stretch)
Release:	9.8
Codename:	stretch
```

# インストール

hostapd, dnsmasqをインストール。

```bash
sudo apt -y install hostapd dnsmasq
```

`/etc/hostapd/hostapd.conf`にhostapdの設定を記述。



```
interface=wlan0
driver=nl80211
ssid=pipi        ##SSID名
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=raspberry     ##SSIDパスワード
rsn_pairwise=CCMP
```

`/etc/dhcpcd.conf`に以下の設定を追記。

```bash
## AP
# クライアント時は以下をコメントアウトする。
interface eth0
fallback static_eth0
denyinterface wlan0
interface wlan0
static ip_address=172.24.1.1/24
static routers=172.24.1.1
static domain_name_servers=172.24.1.1
static broadcast 172.24.1.255
```

いったん、ネットワーク系デーモンの自動起動を無効化。

```bash
sudo systemctl disable wpa_supplicant
sudo systemctl disable dhcpcd
```

# 切り替え手順

## APにする

1. `/etc/dhcpcd.conf`のAP設定を有効化
2. `sudo systemctl stop wpa_supplicant`
3. `sudo systemctl stop dhcpcd`
2. `sudo ifconfig wlan0 down && sudo ifconfig wlan0 up`
3. `sudo hostapd /etc/hostapd/hostapd.conf &`
4. `sudo systemctl start dhcpcd`
5. `sudo systemctl start dnsmasq`

## clientにする

1. `/etc/dhcpcd.conf`のAP設定を無効化
2. `sudo systemctl stop dnsmasq`
3. `sudo systemctl stop dhcpcd`
4. `sudo ifconfig wlan0 down && sudo ifconfig wlan0 up`
5. `sudo systemctl start wpa_supplicant`
6. `sudo systemctl start dhcpcd`

# 疑問点メモ

* 参考文献他の記事ではhostapdがサービスとして立ち上がるとのことでしたが、今回試した環境ではsystemdのスクリプトのパス(`/etc/systemd/system/hostapd.service`)に`/dev/null`へのシンボリックリンクが貼られており、少なくとも単純にaptでインストールしただけではサービス化できませんでした。
* Client→AP化する際にはwpa_supplicantがジャマをしているようで、停止してからdhcpcdを再起動しています。
* AP化の際、dhcpcdの起動よりもhostapdの起動を先にしないと、dhcpcdが設定すべきNICを見つけられずエラーになるようです。clientの場合はwpa_supplicantが、APの場合はhostapdがNICをdhcpcdが操作できる状態にする、ということなんでしょうか？
* 他記事では設定反映のためにOS再起動しているものがありますが、上記手順ではOSの再起動が不要であることを確認しました。


# 参考文献

1. http://nw-electric.way-nifty.com/blog/2018/05/pi-3wifi-access.html
旧DMM.R18で女優をフォローするChrome拡張をReact+Webpackで作った

## モチベーション

自分はジャンルやシチュエーションより出演者や監督でAVを選ぶことが多い。しかし、DMM.R18（元FANZA）では作品のお気に入りは出来るけど出演者をフォローする機能がない。「検索条件を保存」 という機能があるがこれは10件のキューで上限を超えて追加されると古いものから削除されるため使い勝手が悪かった。
そこで制限なく出演者をフォロー出来るアプリが欲しかった。

<img width="600" alt="スクリーンショット 2019-03-11 1.29.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/75770/3c9f8dd6-9d9b-f0f3-1360-112ea2fb7de5.png">

試しにTwitterで調べてみると同じこと考えてる人はそれなりにいるみたい。

## 作ったもの

og24715/DMM.pornstars https://github.com/og24715/DMM.pornstars

## 構成

```
DMM.pornstars
├── README.md
├── node_modules
├── chrome
│   ├── dist
│   └── src
│       ├── background.js
│       ├── detail.js
│       ├── favorites
│       │   ├── App.jsx
│       │   ├── component
│       │   │   ├── card
│       │   │   │   ├── index.js
│       │   │   └── navbar
│       │   │       └── index.jsx
│       │   ├── index.css
│       │   ├── index.html
│       │   └── index.js
│       └── manifest.json
├── package-lock.json
├── package.json
├── webpack.config.js
└── yarn.lock
```

|パス|説明|
|:--|:--|
|chrome/|実質 Chrome 拡張用のプロジェクトディレクトリ。|
|chrome/dist/|webpack によってバンドルされた諸々が吐かれるディレクトリ。Chromeにはここを読ませる。静的ファイルも `src/` に置いて `copy-webpack-plugin` を使って `dist/` 配置されるようにしたので当たり前だけどここは触らない。|
|chrome/src/background.js|アイコンがクリックされたら一覧を表示するだけ。|
|chrome/src/detail.js|DMM.R18 で作品の画面を表示しているときに、出演者の名前の横にフォローボタンを表示するだけ。|
|chrome/src/favorites/|一覧画面。React使ってる。|

## ハマりどころ

### CRA (create-react-app) を使いたい

やめたほうがよさそうです。
だいぶ前に試した記憶だと、CRAはSPAを作るときには非常に頼りになるスタートアップツールですが、`react-scripts eject`をしない限り webpack の entry を複数設定することが出来ません。画面ごとに `create-react-app {project_name}` しなくてはらず地獄です。

### `local.storage.get` の第一引数に文字列で与えたのに第２引数のコールバック関数への引数がキーバリューになる

これはドキュメントちゃんと読んでください。
`local.storage.get` は第一引数に与えられた文字列もしくは文字列配列のキーをもとにキーバリューのオブジェクトを第二引数に与えられたコールバック関数へ引数として与えます。
第一引数に文字列を与える意図としては、キーを決定したので対応するバリューを返して欲しいってことなんですが、第一引数が文字列だろうと配列だろうとキーバリューをオブジェクトを返します。

コードにすると

```js
// こうじゃなくて
chrome.storage.local.get('following', following = [] => { /* noop */ }));
// こう
chrome.storage.local.get('following', ({ following = [] }) => { /* noop */ }));
```

こんな感じ。
今の所 `following` ってキーでしか値を保存していないんですが、キー一つ与えたところでその値は返って返ってこないってことです。
ブラウザ実装の `Window.localStorage.getItem` と挙動が違うのでドキュメント見ないで実装するとハマります。

localStorage.getItem() - Web APIs | MDN https://developer.mozilla.org/en-US/docs/Web/API/Storage/getItem
chrome.storage - Google Chrome https://developer.chrome.com/apps/storage

### 静的ファイルを `src/` に置きたい

`dist/` は極力触りたくありませんでした。
今回のアプリで静的ファイルは拡張のマニフェストファイルである `manifest.json` と Reactのエントリーポイントとなる `index.html` があります。
これらは素の webapck を通しても `dist/` へ配置されないので `webpack-copy-plugin` を使うしかなさそうです。

```js
plugins: [
  new CopyWebpackPlugin([
    { from: './chrome/src/favorites/index.html', to: 'favorites.html' },
    { from: './chrome/src/manifest.json' },
  ]),
```

たかがコピーするだけなのにプラグインを追加し無くてはならない歯がゆさに gulp 時代の混沌をに似たものを感じます。
なにかいい方法があれば教えてください。

## 性欲駆動開発

https://twitter.com/search?q=%E6%80%A7%E6%AC%B2%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA
PHPでDATETIME型のBETWEEN

PHPでDATETIME型のBETWEEN用の範囲（境界値を含む）を作る例

```php
$start_range = '2019-02-01 00:00:00';
$datetime = new DateTimeImmutable($start_range);

// 月
// "2019-02-28 23:59:59"
$end_range = $datetime->add(new DateInterval('P1M'))->sub(new DateInterval('PT1S'))->format('Y-m-d H:i:s');
// 年
// "2020-01-31 23:59:59"
$end_range = $datetime->add(new DateInterval('P1Y'))->sub(new DateInterval('PT1S'))->format('Y-m-d H:i:s');
```
Python環境構築：Anaconda, Spyder, Visual Studio Code, OpenCV, ffmpeg, Cantera

#WindowsでPythonを使い始める

パソコンを新規購入してPythonの環境構築を一からやり直しました．

せっかくなので備忘録として行ったことをまとめておきます．

特にこだわりが無ければ，Anacondaを使いPythonの環境を管理することをお勧めします．

Anacondaをインストールすれば，基本的に環境構築は終了です．

あとはAnaconda promptを使って必要なライブラリを適宜ダウンロード or アップデートするだけです．

以下Anacondaダウンロード先のリンクです．(リンク：[Anaconda](https://www.anaconda.com/distribution/#download-section))

リンクに飛ぶと，上にOSの選択があるのでWindowsを選択してください．

次に2系か3系のPythonの選択がありますが，特にこだわりが無ければ3系を使うことをお勧めします．
（2系と3系ではいくつか書き方を変えないとエラーになるものがあります（e.g. print関数，input関数））

エディタとしてSpyderとJupyterがAnaconda navigatorと一緒にインストールされていると思います．

エディタの好みは人それぞれだと思いますが，私のお気に入りはSpyderです．

# OpenCVを使えるようにする

いろいろな方法が記事で取り上げられていますが，ここでは最も簡単な方法を記しておきます．

anaconda promptを開き，以下のコマンドを入力してやるだけです．

```
conda install -c conda-forge opencv
```

site-packageのフォルダを確認すればopencvがインストールされていることが確認できると思います．

# ffmpegを使えるようにする

動画処理を行う際にffmpegを使用することがあると思います．(リンク：[FFmpeg](https://www.ffmpeg.org/))

Pythonからffmpegを使用するには，環境変数のシステム環境変数のPathに

「ffmpeg.exe」が存在するパスを追記しなくてはなりません．

コントロールパネル　=>　システム　=>　システム詳細設定　で

環境変数を確認できますので，そこにPathを追加してあげましょう．

#Canteraを使えるようにする

燃焼を科学するにあたって，反応解析をすることがあると思います．

反応速度解析ツールとしてChemkinやCanteraがよく知られていますが，

CanteraはオープンソフトでPythonで実装することができます．(リンク：[Cantera python tutorial](https://cantera.org/tutorials/python-tutorial.html))

以下のコマンドをAnaconda promptで入力してCanteraライブラリをダウンロードしてみましょう．

```
conda install -c cantera cantera
```

ChemkinのようにGUI化されていないため，使いなれるまでに時間を要しますが無料です．

断熱火炎温度，層流燃焼速度などは簡単に求めることができます．
CSSの詳細度とコーディングについて

# 内容
CSSの詳細度と、コーディングで注意したい事をまとめてみました。

# 詳細度（specificity）とは
記述したCSSのプロパティが適用される際の優先度です。
詳細度が高いもののプロパティが適用されます。
詳細度が同じ場合は、後から記述されたものが適用されます。
この詳細度は、CSSのセレクターによって決定されます。

#詳細度の計算の仕方
詳細度は、セレクタの内容から算出します。
下記のように値が設定されており、これを並べた値が詳細度になります。

- セレクター内のID属性の数（a）
- セレクター内のCLASS属性/属性セレクタ/疑似クラスの数（b）
- セレクター内のタグ名/擬似要素の数（c）

```css

/* 例 */
*               /* a=0 b=0 c=0 -> specificity =   0 */
LI              /* a=0 b=0 c=1 -> specificity =   1 */
UL LI           /* a=0 b=0 c=2 -> specificity =   2 (要素セレクタが2つ) */
UL OL+LI        /* a=0 b=0 c=3 -> specificity =   3 (要素セレクタが3つ) */
H1 + *[REL=up]  /* a=0 b=1 c=1 -> specificity =  11 */
UL OL LI.red    /* a=0 b=1 c=3 -> specificity =  13  (要素セレクタが3つとclassセレクタ)*/
LI.red.level    /* a=0 b=2 c=1 -> specificity =  21 */
#x34y           /* a=1 b=0 c=0 -> specificity = 100 */
#s12:not(FOO)   /* a=1 b=0 c=1 -> specificity = 101 */
```
引用元：https://drafts.csswg.org/selectors-3/#specificity


# コーディングで注意したい事
複雑なセレクタにしてしまうと、意図しないプロパティが適用されたり、適用されなかったりする事が増えます。
詳細度を計算するにしても、計算が複雑です。
この為、セレクタを考えるときは下記を念頭に置きたいです。

##同じ形式のセレクタにする（可能な限り）
これは詳細度の統一が目的です。
詳細度を統一しておくと、詳細度を細かく考えなくて済むので簡単になります。
算出する場合も最小限で済みます。

```CSS
p{
  color: black;
}
p.red{
  color: red;
}
.info p.text{
  color: blue; 
}
div p span {
  color: green; 
} 

/* こっちのほうが、どのプロパティが適用されるか簡単に予想できる */
.text{
  color: black;
}
.red{
  color: red;
}
.info{
  color: blue; 
}
.green{
  color: green; 
} 
```

## セレクタは単純にする
これも詳細度の統一が目的です。また詳細度の算出を容易にする為の意味もあります。
（また、何の為のstyleであるのか解読に時間がかかります）

```CSS
/* 元コード */
div p span.note{
  color: red;
}

/* 
ABテストや、何かの理由で上書きしたい時は、同じように書かないと適応されない。
めんどい
 */
div p span.note{
  color: blue;
}
```

# まとめ
- 詳細度によってプロパティの適用が決定される
- 詳細度はセレクタの内容から算出される
- セレクタを単純にすると、詳細度の計算が少なくて済む。

さらに突き詰めると、BEMやsmacss、flocssのような設計手法/思想に行き着きます。
まずは詳細度でプロパティの適用が変わる事、詳細度を統一する事を意識する事で、だいぶCSSのコーディングと運用が楽になると思います。


# 参考

詳細度
https://developer.mozilla.org/ja/docs/Web/CSS/Specificity

Selectors Level 3
https://drafts.csswg.org/selectors-3/#specificity
http://localhost:3000/に特定のページを表示させたい（ルートへのルーティング設定）

専門的には、ルートへのルーティング設定をするというらしいです。
本当の初心者にとっては、そのワードすら知らないのでggrksと言われてもなかなか辛いところありますよね。。。

# ルートへのルーティング設定とは
Cloud9環境では、
`https://〜.amazonaws.com/`

Vagrant環境では、
`http://localhost:3000/`
にアクセスした時に、デフォルトで表示される「Welcome aboard」のページではなく、
自分で作ったページなり、アクションなりを表示させたい時にする設定のことです。

# ルートへのルーティング設定を行う
早速やっていきましょう！

### コントローラーとアクションを作る
ターミナルに下記のコードをうちます。
`$ rails g controller コントローラー名 アクション名`

### ルートファイルを編集する
「config/routes.rb」ファイルに下記のコードを書き込みます。
`root :to => 'コントローラ名#アクション名'`

例えば、`http://localhost:3000/`にアクセスした時に、
indexページを表示させたい場合は、
`root :to => 'コントローラ名#index'`
と書きます。

これだけです。
もう少し理解が進んだら、ルートとは、ルーティング設定とは、というところも細かく書きたいです。
RESTfulなルーティングを設定するというところも書きたい。。
でも今は、これが精一杯なのでご勘弁ください。
【Java】Java12特徴について

#概要
- [OpenJDKの公式サイト](http://openjdk.java.net/projects/jdk/12/)に有るように、「Release-Candidate Phase」のフェーズに達しました。
- 2019/03/19にはリリース予定
- 特徴についてまとめておきたいと思います。

#特徴

##189: GCの休止時間を短くするアルゴリズム「Shenandoah」を追加　※実験段階？
- GCアルゴリズムにShenandoahを新規に追加するそうです。実行中のスレッドと平行して実行することによりGCの休止時間を短縮するようです。
- アルゴリズムの詳細は[このページ](https://www.researchgate.net/publication/306112816_Shenandoah_An_open-source_concurrent_compacting_garbage_collector_for_OpenJDK)に記載されています。

##230:	JMHをバンドル
- JDKとは別に提供されていたJMH(Java Micro Benchmark Harness)をJDKに含めるようです。
- 既存のJMHが機能追加されたものがバンドルされるわけではないようです。

##325:	Switch文の機能を拡張
- switch文が拡張されました。
- 以下、公式サイトより引用

###従来のswitch文

```java
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
```

###拡張されたswitch文

```
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
```

- シンプルな記載が出来るようになり、読みやすくなりましたね。

##334:	JVM Constants API
- java.lang.invoke.constantパッケージが追加されたようです。

##340:	arm64のソースコードを削除
- ARM64bit用のPortのソースコードからarm64を削除したとの事です。
- aarch64のソースと重複していたので、開発者の負担を減らすのが目的のようです。

##341:	CDSアーカイブのデフォルト化
- 64ビット版のみの対応
- CDSアーカイブ生成作業の簡略化として、デフォルトのクラスリストを利用できるように変更したようです。
- これにより、起動時間の短縮化。「-Xshare:dump」をユーザに実行させる手間を省かせることが可能となります。

##344:	Mixed GCを停止可能とする
- G1のMixed GCを中止できるようにしたようです。

##346:	G1ガベージコレクタの強化
- アイドル状態時、自動的にヒープメモリをOSに返却するようにG1ガベージコレクタを強化したようです。

#追記
以下サイトの記事、よくまとまっています。
https://japan.techrepublic.com/article/35134682.htm
GitHub の awesome リポジトリに載っているリポジトリの品質を確認する chrome extension

GitHub の awesome のページって便利ですよね.

https://github.com/vsouza/awesome-ios

みたいなやつです.

ライブラリや技術の選定をするときにはよく参考にしています.

でも、一覧で紹介されているリポジトリの中には全然メンテナンスされていないものやスターが少ないものもあるので、品質を確認するために新しいタブで開いては確認して閉じてという作業をする必要があり結構面倒でした.

そこで [Awesome Health Checker](https://chrome.google.com/webstore/detail/awesome-health-checker/hdhmangoaejpllocjefapmilmejiledp) という Chrome Extension を作りました.

これを使うとこんな感じの awesome のページの github のリンクを自動で抽出してスター数と最終更新日が表示されるようになります. 一年以上更新されていないものは赤くなるようにしました. これを使えばとりあえず良さげなリポジトリだけ閲覧すれば良くなるので大幅に時間削減になると思います.

#### 適用前

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17704/ac490c80-0bca-1c76-401a-8bdff137015e.png)

#### 適用後

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17704/761c5e82-ca2d-3214-a033-0120abf5d4f8.png)


多分まだバグがあるのでおかしい動きをしたら報告していただけると嬉しいです.
PostgreSQL note

# with docker
## Connection via tcp

# create users
via `postgres` user. mydb's owner will be `postgres`.

```sql
sudo -u postgres psql
create database mydb;
create user myuser with encrypted password 'mypass';
grant all privileges on database mydb to myuser;
```

Create new db & new owner

`CREATE DATABASE dbname OWNER rolename;`

## db's timezone
```sql
ALTER DATABASE exsampledb SET timezone TO 'Asia/Tokyo';
```
Chainer+CuPyをインストールしてみる(Ubuntu 16.04)

# 目的
Chainerをpipでインストールする。
Cupyも入れてGPU込で学習ができるか確認する。

Installation guidelineを参考にする。
https://docs.chainer.org/en/stable/install.html#install-chainer


# 環境
Ubuntu 16.04.
GPUはRTX2080.

# インストール

Anacondaでchainer仮想環境を作っておく。
pythonは3.6を使用。

```
conda create -n chainer python=3.6
conda activate chainer
```


下準備でpipを最新にしておく。
```
pip install -U setuptools pip
```

そしてChainerをpipで入れる。
```
pip install chainer
```

そしてCupyをインストール。
事前にCUDA, CuDNNのインストールが必要なのは注意。

```
(For CUDA 8.0)
# pip install cupy-cuda80

(For CUDA 9.0)
# pip install cupy-cuda90

(For CUDA 9.1)
# pip install cupy-cuda91

(For CUDA 9.2)
# pip install cupy-cuda92

(For CUDA 10.0)
pip install cupy-cuda100
```

全て正常に入ったか確認する。
Chainerがインポートできるか、そしてCUDA使用フラグが出ているか確認する。

```
python
> import chainer as chainer
> chainer.backends.cuda.available
# True
> chainer.backends.cuda.cudnn_enabled
# True
```

上記のように返ってきていれば環境設定はオッケー。
なんて簡単なんだ！^o^

# CIFAR10で学習を試す。
TBD

# まとめ
pipで全てインストールできるのでCUDAが入っていれば簡単だった（5分位？）。
Chainerチームありがとうございます。。！
早速学習を試してみたい。
一瞬でローカルレポジトリを作る手順

# 目的
設定ファイルを触らずにローカルレポジトリーを作成したい！

今までISOファイルからローカルレポジトリーを作成するときに、
　① ISOファイルをマウント
　② /etc/yum.repos.d/配下にファイルを作成
　③ 作成したファイルを編集
ということをしていた。

これでもそこまで手間というわけではないが、yum.repos.d配下の設定ファイルの書式を毎回忘れて
いちいち調べるのがめんどくさかった。

なのでyum-utilsに含まれているyum-config-managerというyumのユーティリティーを使用して、設定ファイルを作成/編集することなしにローカルレポジトリーを作成する

# 手順

※yum-utilsがインストールされていない場合はインストールしてください。

### ISOをマウントする

```
mount /dev/cdrom /mnt/iso 
```

### レポジトリを定義する

```
yum-config-manager --add-repo file:///mnt/iso
```

たったこれだけ！！
これで/etc/yum.repos.d配下にレポジトリファイルが作成される。

```
[mnt_iso]
name=added from: file:///mnt/iso
baseurl=file:///mnt/iso
enabled=1
```


### おまけ：レポジトリの有効/無効を切り替える

#### 無効化

```
yum-config-manager --disable mnt_iso
```

#### 有効化

```
yum-config-manager --enable mnt_iso
```
Swift MediaPlayer ミュージックPlaylist一覧取得

#概要
ミュージックのPlaylist一覧取得。
#ソース
## example
```swift
import UIKit
import MediaPlayer

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let mPMediaQuery = MPMediaQuery.playlists()
        if let collections = mPMediaQuery.collections {
            print(MPMediaType.music)
            print(collections.count)
            for collection in collections {
                print("-/\\-")
                print("\(collection.mediaTypes)")
                collection.toString()
            }
        }
    }

}

extension MPMediaItemCollection {
    func toString() {
        print("MPMediaItemCollection")
        let keys = [MPMediaPlaylistPropertyName]
        for key in keys {
            if let value = self.value(forKey: key) {
                if let value = value as? Bool {
                    print("- Bool \(key):\(value)")
                }
                else if let value = value as? String {
                    print("- String \(key):\(value)")
                }
                else if let value = value as? Int {
                    print("- Int \(key):\(value)")
                }
            }
        }
    }
}
```

## プレイリスト名取得
MPMediaItemCollectionのMPMediaPlaylistPropertyName。

## memo
自分で作成したPlaylistはMPMediaType 1(MPMediaType.music)です。
MPMediaType 0は「トップレート」「最近再生した項目」「最近追加した項目」等です。
tfliteファイルの入力、出力フォーマット確認方法


tflite形式をMobileアプリ等に組み込む際にInput、Outputのフォーマットを確認する方法

```ruby:tfliteFormatCheck.py
import tensorflow as tf

interpreter = tf.lite.Interpreter(model_path="my_model.tflite")
interpreter.allocate_tensors()

# Print input shape and type
print(interpreter.get_input_details()[0]['shape'])
print(interpreter.get_input_details()[0]['dtype'])

# Print output shape and type
print(interpreter.get_output_details()[0]['shape'])
print(interpreter.get_output_details()[0]['dtype'])

```

**参考文献**
https://firebase.google.com/docs/ml-kit/ios/use-custom-models?hl=ja
php-master-changes 2019-03-09

今日は fileinfo で tm 構造体を取得する関数について *_r() 版を使うようにする修正があった！

# 2019-03-09
## weltling: Fixed bug [#77576](https://bugs.php.net/bug.php?id=77576) pull the libmagic implementation of gmtime_r
- https://github.com/php/php-src/commit/65ffdc2adff1751d085288ca5df14625a69bd7f2
- [7.3~]
- ext/fileinfo で、tm 構造体を取得する関数について *_r() 版を使うよう修正
- [PR:3749](https://github.com/php/php-src/pull/3749) の流れ
- *_r() 版は全環境で使えるものではないので敢えて上流に同期してない部分だったが、php-src で libmagic での代替実装を引っ張ってこれる仕組みがすでにあったので、そっちを使う形に調整して上流の実装に合わせた

## Fabien Villepinte: Fix typo in libmagic version
- https://github.com/php/php-src/commit/d9a3cb0b365cf460239ce3b3f9fc6e59c541a5b0
- [7.3~]
- ext/fileinfo で、コメント内の libmagic のバージョン表記間違いを修正

## weltling: Update libmagic.patch [skip ci]
- https://github.com/php/php-src/commit/3e92365fa2204ec73a24734b2e83153d9c04e919
- [7.3~]
- ext/fileinfo で、libmagic のパッチの更新