OmniAICreator/Qiita-1.07M huggingface dataset:
RTL8366の使い方

FreeBSDのEthernet Switchのフレームワークのetherswitchはいくつかのチップをサポートしていますが、その中のRealtekのRTL8366の使い方を簡単に説明します。

RTL8366はtag vlanが使えSRというモデルが最初に出てその後継でRBが出たようです。これらは微妙に仕様が違っていますが、etherswitch上では同じように使えます。

RTL8316という製品もRTL8366の前にあったようです。またRTL8325という製品もあるようです。

最近RT3052に接続されたRTL8366RBも使えるようにして[レビュー](https://reviews.freebsd.org/D16757)出したので、これをターゲットにしてみます。

このモジュールでは内蔵スイッチと外付けのRTL8366RBがあるのでデバイス名を指定してetherswitchcfgを実行する必要があります。

![RT3052_Ether.png](https://qiita-image-store.s3.amazonaws.com/0/104066/de835351-0714-95e7-4c67-8a657a54fe4a.png)

まずドライバーのデフォルトの状態を示します。

```
# etherswitchcfg -f /dev/etherswitch1 -v
etherswitch1: Realtek RTL8366RB with 6 ports and 16 VLAN groups
etherswitch1: VLAN capabilities=4<DOT1Q>
etherswitch1: VLAN mode: DOT1Q
port0:
	pvid: 2
	flags=0<>
	media: Ethernet autoselect (none)
	status: no carrier
port1:
	pvid: 1
	flags=0<>
	media: Ethernet autoselect (none)
	status: no carrier
port2:
	pvid: 1
	flags=0<>
	media: Ethernet autoselect (100baseTX <full-duplex>)
	status: active
port3:
	pvid: 1
	flags=0<>
	media: Ethernet autoselect (none)
	status: no carrier
port4:
	pvid: 1
	flags=0<>
	media: Ethernet autoselect (none)
	status: no carrier
port5:
	pvid: 1
	flags=1<CPUPORT>
	media: Ethernet 1000baseT <full-duplex,rxpause,txpause>
	status: active
vlangroup0:
	vlan: 1
	members 1,2,3,4,5
vlangroup1:
	vlan: 2
	members 0,5t
```

etherswitchcfgコマンドの-vオプションでRBかSRかが確認できます。

この状態だとport0はvlan2になっていて、そのままでは使えません。それ以外のポートはCPUと通信ができます。

port0から入ってきたパケットはタグの2が入ってCPUポートに上がってきます。このため通常のifでは受け取れないパケットになっています。

製品のポート番号とRTL8366のボート番号が違う場合もあり注意が必要です。また一部のポートが出ていないケースもあります。

port0を使えるようにするにはvlanを設定します。

```
# ifconfig vlan2 create vlan 2 vlandev rt0
# ifconfig vlan2 inet 10.10.10.1 netmask 255.255.255.0
```

vlan2はもともとrt0に設定されていたIPアドレスとは別のネットワークになります。

port1をvlan2側に移してみます。

```
# etherswitchcfg -f /dev/etherswitch1 vlangroup0 members 2,3,4,5
vlangroup0:
	vlan: 1
	members 2,3,4,5
# etherswitchcfg -f /dev/etherswitch1 vlangroup1 members 0,1,5t
vlangroup1:
	vlan: 2
	members 0,1,5t
# etherswitchcfg -f /dev/etherswitch1 port1 pvid 2             
port1:
	pvid: 2
	flags=0<>
	media: Ethernet autoselect (1000baseT <full-duplex>)
	status: active
```

やっていることはvlangroup0からport1を抜いてvlangroup1に追加して、port1のpvidを2にしてます。

これでport0,1とport2,3,4が別のネットワークになりました。

全てのポートでvlanを使わない場合は以下の設定をします。

```
etherswitchcfg -f /dev/etherswitch1 vlangroup1 members none
etherswitchcfg -f /dev/etherswitch1 port0 pvid 1
etherswitchcfg -f /dev/etherswitch1 vlangroup0 members 0,1,2,3,4,5
```

確認はpingとtcpdumpで行っています。

vlanの操作は自分がアクセスしているポートを間違えて別のネットワークに入れてしまったりするとアクセス不能になるので、注意が必要です。

vlanとは関係ありませんが、ケーブルが古くて長い場合など、ネゴシエーションがうまくいかない場合、以下のコマンドでポートを10に設定できます。

```
# etherswitchcfg port2 media 10baseT
port2:
	pvid: 1
	flags=0<>
	media: Ethernet 10baseT/UTP
	status: no carrier
```

ところでetherswitchcfgってコマンド名ちょっと長いですよね。。。あとデフォルトでport0使えないのは忘れてて結構ハマるときあるので、デフォルトは全てのポートでvlan無しが良い気がします。
coq(2)ideを使おう・初めてのcop ide  mac編 

# 背景(back ground)
coqって、四色問題も解けちゃうって聞いて俄然やる気になった。

四色問題って、自分が十代の時に、計算機を使って解けたと話題になった課題。

飛び地のない国の地図を四色で塗りつぶせるかという。

かっこよく言えば、自分の人生がここで変わった。

こんなことやってる場合じゃない。計算機をつかわなきゃ。

でも当時は高価で、最初に買った計算機はプログラミング電卓。

# 導入(install)
Home-brew(brew)が入っていれば、一発。

```
$ brew cask install coqide
```

brew が入っていなかったら、qiitaの記事を見ていれてください。

# 例題(sample)
今、名古屋のProof Cafeでは、"The Software Foundations"を輪講中。
https://softwarefoundations.cis.upenn.edu/plf-current/index.html

ダウンロードするとplf-tarというファイルがあるのでダブルクリックで解凍する。

# 起動(start up)
アプリケーションフォルダにcoqideのアイコンが現れている。

<img width="110" alt="coqide.png" src="https://qiita-image-store.s3.amazonaws.com/0/51423/bafb9ebc-1f2b-e440-5270-f5760ab381bf.png">

これをダブルクリックすると起動する。

# ファイルの読み込み

```
Lemma step_example1a :
  (tapp idBB idB) ==> idB.
Proof.
    apply ST_AppAbs.
    apply v_abs. 
    Qed.
```

## 自己参照
「Coqで証明書いてみた」の１行づつの実行を記録してみた。
https://qiita.com/kaizen_nagoya/items/6b8398bf6980315945c6

coq(ide)を使おう　または　初めてのcop(ide) mac編
https://qiita.com/kaizen_nagoya/items/a236dfbfaa4f946b4f8d

Godel’s Incompleteness Theorem in coq 壁いくつ、今壁4つ
https://qiita.com/kaizen_nagoya/items/181cb3dae504f64d0619

「Coqの余帰納法でハマってしまった」を記録
https://qiita.com/kaizen_nagoya/items/7c9e32a024aeaf7b5658

MacintoshでCoqide
https://qiita.com/kaizen_nagoya/items/0314ca15130bdfa9dce2

物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

数学関連記事１００
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
# 文書履歴
ver. 0.10 初校 20180317
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
[Android] LiveData でイベントバス的なものを実装する

## 動機

Android Architecture Components ベースの Android アプリ開発においては　ViewModel 経由でデータをやりとりするのが正しいのですが、Activity ⇔ Activity 間や ViewModel の取り回しが複雑になってしまう場合は、多用は禁物と思いつつもイベントバスのような仕組みが欲しくなります。

[greenrobot/EventBus](https://github.com/greenrobot/EventBus) や [otto](https://github.com/square/otto) のような既存のライブラリを使ったり、[RxJava で代用](https://www.slideshare.net/hiroyukikusu/potatotips-26replace-eventbus-with-rxjavarxandroid) したりしてもいいのですが、せっかく Android Architecture Components ベースでの開発をしているなら LiveData で実現したいなと思ったのでした。

## 実装してみる

試行錯誤の結果、次のようになりました。

```kotlin:EventBus.kt
@Singleton
class EventBus @Inject constructor() {

    val eventLiveData = MutableLiveData<Event>()

    @MainThread
    inline fun <reified T : Event> on(
            owner: LifecycleOwner,
            crossinline observer: (T) -> Unit
    ) {
        val obs = Observer<Event> {
            if (it != null && it is T) {
                observer.invoke(it)
            }
        }
        eventLiveData.observeForever(obs)
        owner.lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onDestroy(owner: LifecycleOwner) {
                eventLiveData.removeObserver(obs)
            }
        })
    }

    @MainThread
    fun post(event: Event) {
        eventLiveData.value = event
        eventLiveData.value = null
    }

    interface Event
}
```

シングルトンなインスタンスを Dagger 等で配信することを想定していますが、Dagger 等を利用しないのであれば object クラスにしても良いかもしれません（テストがやりにくくなるかも？ですが）。

イベントの受け取り側(`on` メソッド)では、内部的に `LiveDeta#observeForever()` を利用しています。`LiveDeta#observe()` だと Activity が裏側にあるなど `onStop()` 時にイベントを受け取れないからです。`LiveDeta#observeForever()` を利用しているので、購読を自前で解除しないといけないのですが、LifeCycle を利用して自動で解除するようにしています。

このように購読の解除の関係でイベントの受け取り側では `LifecycleOwner` を必要とする仕様にしています。そうしないと自前で別途、購読を解除する必要があり煩雑になるというのもありますが、どこでも自由にイベントを送受信できてしまうとアプリケーションが複雑化してしまうし、LiveData の仕組みに乗っている以上この仕様は自然だろうと考えています。

インベントの送信側(`post` メソッド)では、イベントを送信した後、即座に null で更新しています。LiveData は購読を開始した際に、過去最新の値（1件のみ）が流れてきてしまうので、「イベントを送信したその時点」で購読していない場合はイベントを伝えたくないからです。

## 使い方

### イベントを送る

`EventBus.Event` インタフェースを継承した任意のクラスのインスタンスを `post()` メソッドに渡すだけですが、単純なイベントだけ（渡すデータが無い）を送りたい場合は、object クラスを利用します。

```kotlin
object HogeEvent: EventBus.Event

// ...

eventBus.post(HogeEvent)
```

イベントと同時にデータも渡したい場合は、data クラスを利用すればよいでしょう。

```kotlin
data class HogeEvent(val name: String): EventBus.Event

// ...

eventBus.post(HogeEvent("山田"))
```

### イベントを受け取る

受け取りたいイベントの型を指定して `on()` でイベントを購読します。

```kotlin
eventBus.on<HogeEvent>(this) { // this は LifecycleOwner
    // do something..
}
```

`this` は LifeCycleOwner なので Activity や Fragment などです。

## おわりに

まだ実案件等で活用しているわけではなく知見も乏しいので、改善点やもしここはおかしいぞ等あればコメントでお知らせ頂けると嬉しいです。
Firebase Analytics BigQuery 直近90日のデータをFrom句に指定する

# 動作環境

FirebaseとBigQueryを統合し、FirebaseAnalyticsのデータをBigQueryにインポートしている環境です。

# クエリ

```sql
SELECT
  event_date
FROM
  TABLE_DATE_RANGE(
    testapp:analytics_0123456789.events_,
    DATE_ADD(CURRENT_TIMESTAMP(), -90, "DAY"),
    CURRENT_TIMESTAMP()
  )
```

# 説明

- `testapp` と `0123456789` の部分はアプリごとに適当な値を設定してください
- `events_intraday_` テーブルは当日（直近）のデータしか存在しないため `intraday` が付いていない方のテーブルを対象にします
- テーブルが日付ごとに別れているため、複数の日付を対象にするために `TABLE_DATE_RANGE` を使います
- `CURRENT_TIMESTAMP` で現在日時を得ています
- `DATE_ADD` を用いて現在日時の90日前を得ています

# 参考にしたページ
- [Google Cloud: Firebase 向け Google アナリティクスのデータを BigQuery にインポート](https://cloud.google.com/solutions/mobile/mobile-firebase-analytics-bigquery)
- [Qiita: Bigquery | 日付・時間系のクエリまとめ ( query reference 日本語訳 )](https://qiita.com/Yinaura/items/303d6a563e1625d9f87d)
- [Qiita: FirebaseのBigQueryを使ってみた](https://qiita.com/_natsu_no_yuki_/items/729ce9bec67ced8d1cb3)
Ubuntuをベースに、NginxをインストールするDockerfileを書いてみる

## 概要
Dockerfileを使って環境構築の自動化を目指します。

## 動作環境
Mac OS High Sierra 10.13.6
Docker version 18.03.1-ce, build 9ee9f40

## Dockerfileの中身

```dockerfile
# Getting Base Image
FROM ubuntu:16.04

# Author Info
MAINTAINER ____easy

RUN apt-get update
RUN apt-get install -y curl

# install nginx
RUN touch /etc/apt/sources.list.d/nginx.list
RUN echo "deb http://nginx.org/packages/ubuntu/ precise nginx" >> /etc/apt/sources.list.d/nginx.list
RUN echo "deb-src http://nginx.org/packages/ubuntu/ precise nginx" >> /etc/apt/sources.list.d/nginx.list
RUN curl http://nginx.org/keys/nginx_signing.key | apt-key add -
RUN apt-get update
RUN apt-get install -y nginx

# set working directory
WORKDIR /root

# Port
EXPOSE 22 80 

# change default html file of nginx
COPY ./html /usr/share/nginx/html
```

## htmlフォルダの生成
カレントディレクトリ内に、htmlというフォルダを作成して、その中に適当なhtmlファイルをおいておきます。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
```


## Docker iamgeの生成
Dockerfileが存在するディレクトリ内で、以下のコマンドを実行します。

```shell-session:
$ docker build -t nginx-test .

・・・省略・・・

Successfully built 3ed11c8e6381
```

以下のコマンドで生成されたイメージを確認することができます。

```shell-session
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx-test          latest              d7be6f50f040        8 seconds ago       176MB
```

## Docker run 
```shell-session 
$ docker run -it -p 8080:80 --name nginx-container nginx-test:latest /bin/bash
root@bbc8a788cfe1:~# 　←コンテナの中に入れる
```

-dオプションをつけなければ、フォアグラウンドでの実行となり、コンテナを抜けると、
　　コンテナは停止します。
　　コンテナを停止させずにコンテナから抜けたい時は、Ctrl + P + Q　を入力するとOK。

次に、コンテナ内でnginxを起動させます。

```shell-session
root@bbc8a788cfe1:~#/etc/init.d/nginx start
```

## webサーバーにアクセス
ブラウザで、http://localhost:8080 にアクセスすると、差し替えておいたhtmlが無事に起動していることがわかります。
React Native で iOS,Androidでアプリが起動するまで

# 前提
環境:"使い古した"Mac
いろいろ過去インストールしたものがあったりなどして一筋縄でいかなかった。
という人間のメモになります。

iOSはエミュレーター
Androidはエミュレーター+実機

# quick startを始める
https://facebook.github.io/react-native/docs/getting-started.html

## install
```
npm install -g create-react-native-app
```

## プロジェクト作成からの早速エラー
```
create-react-native-app AwesomeProject
/opt/local/lib/node_modules/create-react-native-app/node_modules/fs-extra/lib/index.js:3
const assign = require('./util/assign')
^^^^^
SyntaxError: Use of const in strict mode.
    at exports.runInThisContext (vm.js:69:16)
    at Module._compile (module.js:432:25)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:349:32)
    at Function.Module._load (module.js:305:12)
    at Module.require (module.js:357:17)
    at require (module.js:373:17)
    at Object.<anonymous> (/opt/local/lib/node_modules/create-react-native-app/build/index.js:233:16)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
```

理由はnodeが古かった。  
https://ja.stackoverflow.com/questions/29839/node-js%E3%81%A7const%E3%81%8C%E9%80%9A%E3%82%89%E3%81%AA%E3%81%84

# nodeを更新する!

## の前にnodebrewを入れる。
```
curl -L git.io/nodebrew | perl - setup
```

```
export PATH=$HOME/.nodebrew/current/bin:$PATH 
```

## nodeを更新
```
nodebrew install-binary
```

## 改めて、プロジェクト作成からの成功
```
npm install -g create-react-native-app
create-react-native-app AwesomeProject

Success! Created AwesomeProject
```

# じゃあ始めようか
```
npm start
```

からのエラー。

## quick startが使えないだと(Building Projects with Native Codeをなぞろう)…。
https://qiita.com/sugasaki/items/4bea3408941ce7df2a74

watchmanが入ってない様子。

```
brew install watchman
```

## 改めて、始めようか
```
npm start
```
できた。

# iOSを始める
xcode いれて(更新して) cli tool入れて

```
run-ios
```
起動しました。

# Androidを始める

## エミュレーターの準備
cliでパスが通っていなかった?ので諸々パス追加

```
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
export ANDROID_SDK_ROOT=$ANDROID_HOME
```

```
avdmanager
```
エミュレーター起動せず。

# Java周りを整理
IDEを使っていた為か、CLI周りの環境が整理されていなかった様子。

https://qiita.com/ringo/items/db58b34dc02a941b297f
apple側で入れていたjavaは使わなくなったようだ。
oracle側の
/Library/Java/JavaVirtualMachines/
こちらにインストールされるようになったしこちら側が使う方がよいようだ。

https://javaworld.helpfulness.jp/post-50/
ここの様子に似ている。

## Javaのバージョン指定
JAVA_HOMEを設定することでそれが優先されるようになる。

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```
java_homeコマンドを実行してバージョン指定できる
今回は1.8を使います。

## emulatorにパスを通す
```
ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ../emulator/lib64/qt/lib
https://stackoverflow.com/questions/42554337/cannot-launch-avd-in-emulatorqt-library-not-found
```

bash_profileに以下(強制的に、ですね?)

```
function emulator { cd "$(dirname "$(which emulator)")" && ./emulator "$@"; }
```

## おもむろにexpoをinstall
expoはlocalnetwork内の端末にアプリを反映するツール

```
npm install -g exp
npm install -g react-devtools
```

## 今度こそ run-android
エミュレーターは先に起動をしておかなければいけないみたい。
@以降はエミュレーターで登録した環境?名

```
emulator @Pixel_XL_API_26
react-native run-android
```

emulatorで起動できた!

## Android実機で起動
実機とmacをUSBでつないで

```
run-android
```

表示されました!!
RSpecのController spec, Request specで使うget, postあたりの定義場所

気になったときに、いっつも忘れてしまうのでメモ。

## Controller specで使うget, post, などなど

https://github.com/rails/rails/blob/2247077b0bed3423c8b1a9529d2cb89482f0019c/actionpack/lib/action_controller/test_case.rb#L460

## Request specで使うget, post, などなど

https://github.com/rails/rails/blob/2247077b0bed3423c8b1a9529d2cb89482f0019c/actionpack/lib/action_dispatch/testing/integration.rb#L211
Linux(今回はCentOS)でjavaの実体がどこにあるか調べる

#結論
whichとlsを使い、リンクを追跡する。

```
# java -version
java version "1.8.0_72"
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
# which java
/usr/bin/java
# ls -al /usr/bin/java
lrwxrwxrwx 1 root root 22  1月 24 13:51 2016 /usr/bin/java -> /etc/alternatives/java
# ls -al /etc/alternatives/java
lrwxrwxrwx 1 root root 34  1月 24 13:51 2016 /etc/alternatives/java -> /usr/java/jdk1.8.0_72/jre/bin/java
```

#背景
引き継いだサーバーのjavaが古いのではと疑われる事案があり、javaのある場所を確認したら、以下のようになっていた。

```
# ls -al /usr/java/
合計 20
drwxr-xr-x.  4 root root 4096  8月 20 09:43 2018 .
drwxr-xr-x. 14 root root 4096 12月 23 15:15 2015 ..
drwxr-xr-x   9 root root 4096  1月 24 14:00 2016 apache-tomcat-8.0.30
lrwxrwxrwx   1 root root   16  1月 24 13:51 2016 default -> /usr/java/latest
drwxr-xr-x   9 root root 4096  1月 24 13:51 2016 jdk1.8.0_72
lrwxrwxrwx   1 root root   21  1月 24 13:51 2016 latest -> /usr/java/jdk1.8.0_72
-rw-r--r--   1 root root 3405  1月 24 14:27 2016 velocity.log
```

tarを解凍したかったが、jdk1.8.0_72を直接参照しているのか、latestやdefaultを利用しているのかわからなくなり、確認した。

#余談
結局rpmをインストールした。

```
# ls -al /usr/java/
合計 24
drwxr-xr-x.  5 root root 4096  8月 20 09:56 2018 .
drwxr-xr-x. 14 root root 4096  7月  7 17:12 2018 ..
drwxr-xr-x   9 root root 4096  1月 24 14:00 2016 apache-tomcat-8.0.30
lrwxrwxrwx   1 root root   16  1月 24 13:51 2016 default -> /usr/java/latest
drwxr-xr-x   8 root root 4096  8月 20 09:55 2018 jdk1.8.0_181-amd64
drwxr-xr-x   9 root root 4096  1月 24 13:51 2016 jdk1.8.0_72
lrwxrwxrwx   1 root root   28  8月 20 09:56 2018 latest -> /usr/java/jdk1.8.0_181-amd64
-rw-r--r--   1 root root 3405  1月 24 14:27 2016 velocity.log
# which java
/usr/bin/java
# ls -al /usr/bin/java
lrwxrwxrwx 1 root root 22  8月 20 09:56 2018 /usr/bin/java -> /etc/alternatives/java
# ls -al /etc/alternatives/java
lrwxrwxrwx 1 root root 41  8月 20 09:56 2018 /etc/alternatives/java -> /usr/java/jdk1.8.0_181-amd64/jre/bin/java
```
UNIX系計算言語”bc”をちゃんと調べてみる

## bcとは
UNIX系で計算を行うときに使う計算言語です。  

     NAME
           bc - An arbitrary precision calculator language

"An arbitrary precision calculator language"を和訳すると「任意精度計算言語」です。

<br/>
Macのターミナルで`bc`と打ってEnterを押すと、ターミナル上でbcを使うことができます。

```shell
$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
```

bcは特に指定がなければ対話型モードで実行されます。  
例えば、

```shell
1+2
```

と入力してEnterを押すと

```shell
3
```

と結果が返ってきます。  
↓↓実際の使用例↓↓
![スクリーンショット 2018-08-17 20.53.01.png](https://qiita-image-store.s3.amazonaws.com/0/159675/82470872-2d45-36ae-d010-69877a5ea710.png)

※`scale=5`とすることで小数を5桁まで表示するように設定しています。（デフォルトでは`scale=0`）
## オプション
`bc`は起動時にオプションを付けることができます。以下は`man bc`でオプションを確認した結果です。

```shell
OPTIONS
       -h, --help
              Print the usage and exit.

       -i, --interactive
              Force interactive mode.

       -l, --mathlib
              Define the standard math library.

       -w, --warn
              Give warnings for extensions to POSIX bc.

       -s, --standard
              Process exactly the POSIX bc language.

       -q, --quiet
              Do not print the normal GNU bc welcome.

       -v, --version
              Print the version number and copyright and quit.
```

英語を全部訳すのは面倒なのでよく使うやつだけ見てみましょう。
#### -q, --quiet
実行時に最初に出てくるバージョン情報やcopyrightを非表示にしてくれます。`bc="bc -q"`みたいなエイリアスを登録してもいいぐらいマストなオプションだと思います。
#### -l, --mathlib
`bc -l`で実行すると、三角関数（sin,cos,arctan）、自然対数（log）、指数関数（exp()）が使えるようになります。  
`-l`をつけた場合、`scale`が自動で20に設定されます。（＝小数を20桁表示する）

```shell
c(0)+1   #c(0) = cos(0)
2.00000000000000000000
s(0)  #sin(0)
0
l(1)   #log(1)
0
l(2.71828182845904523536) #log(e)
.99999999999999999999
```

## 基数計算
ibase, obaseというパラメータをいじると任意の基数での入力・出力が可能になります。  
例えば、`ibase=10, obase=16`とすると、10進数で入力した計算式を16進数で結果出力します。  （デフォルトではどちらも10なので10進数で表示される）

```bash
ibase=10
obase=16
10+5
F
```
## 応用：非対話モードで実行
以下のようにリダイレクション`<<`を使って非対話モードでbcを実行することができます。

```shell
$ bc <<EOF
> scale=3
> 4/3
> EOF
1.333
```

上記では、`EOF`が入力されるまで式の入力を受け付けます。
<br/>
あるいは、パイプ記号`|`を使って以下のように書き換えることもできます。

```bash
$ echo "scale=3; 4/3;" | bc
1.333
```

## 円周率を任意の桁まで求める

```bash
$ bc -lq
scale = 10;
(12*a(1/49)+32*a(1/57)-5*a(1/239)+12*a(1/110443))*4
3.1415926420
```

`a()`はtanの逆関数arctanのことです。  
`scale`で指定した桁数分の円周率を表示します。


## 参考

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html

https://ja.wikipedia.org/wiki/Bc_(UNIX)

https://tech.nikkeibp.co.jp/it/article/COLUMN/20060228/231172/
【罠】Appleのサブスクリプションの無料期間終了日が、課金開始日だったという【罠】

表題の通りなのですが、Appleのサブスクリプションの無料期間終了日が、課金開始日だったという罠について解説します。

## とあるアプリにて

1. 自動更新のサブスクリプションを作成
2. 最初の１ヶ月のみ無料期間として、お試し価格を設定しました(8月に購入すると１ヶ月無料にしたい)

<img width="500" alt="スクリーンショット 2018-08-17 14.35.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/b6e77ef2-c916-a694-9b5b-049414c03e00.png">

**8月にサブスクリプションを購入すると１ヶ月無料** にしたく
この設定項目に開始日と、終了日があるのですが、感覚的には

- 開始日: 8/1
- 終了日: 8/31
  
と設定したいですが、どちらもその日の0時となっている為

8月いっぱいにサブスクリプションを購入すると１ヶ月無料にするには

- **開始日: 8/1**
- **終了日: 9/1**

にしないと、いけませんでした。
終了日を8/31にしてしまうと、8/31にサブスクリプションを購入しても無料になりません。

記事にしてみると普通っぽく見えてしまいましたが、意外と気をつけないといけないかもしれませんので、みなさまもご注意くださいませ！！
方言女子と戯れたい：既存の方言変換プログラムの問題点と、そこから見えてくる開発方針

本記事では、標準語のテキストを博多弁に変換する簡単な自然言語処理ツールを作ってみた過程を公開します。コンセプトは「方言女子と戯れたい」。敢えて機械学習は使用せず、規則ベースにて実装。シンプルですが変換結果を制御できる利点もあります。対象は特に人気の高い「博多弁をしゃべる女子」とし、今回は既存のサービスを調べ、その問題点を探るとともに、今後の開発方針を検討しました。

最終的にはこのツールを利用して本プロジェクト（東北大）のアンドロイドエージェント「青葉山子」や「川内萌」が博多弁をしゃべったり、博多弁の新しいエージェント（九州大？）が登場、なんてこともあり得るかもしれません^^;
 
#1. JavaScriptでWebページのテキストを方言などに変換するためのテキスト置換ライブラリ
https://qiita.com/setouchi/items/5ebeae7426bf72da7e56

##このサイトのアルゴリズム
「私」という文字列を見つけて、「わたし」に置換するなどの、単純な置き換えである。
よって文脈や文字の繋がりは考慮されず、「私立高校」などの「私」も変換されてしまう。
 ↓
文脈や単語のつながりを考慮した変換が必要

#2 既存の方言翻訳サイト比較
一番かわいいと言われている博多弁[1]で検証
[1]CanCan調べhttps://cancam.jp/archives/270892
 
実験
いろいろな変換サイトを試してみて、問題点を探していく。

##変換する文章
もしかして君が新しい学生さん？
初めまして。私の名前は川内萌です。
こう見えても、ここ伊藤・伊勢研究室の一員なんですよ。
よろしくお願いします。
 
##No.1 恋する方言変換
http://www.8toch.net/translate/
 
もしかして君が新しか学生しゃん？
初めまして。うちん名前は川内萌ばい。
こう見えてん、ここ伊藤・伊勢研究室ん一員たい。
よろしゅうお願いする。
 
##No.２ もんじろう
http://monjiro.net/
 
ひょっとして君の新しい学生しゃん？
初めまして。うちん名前は川内萌たい。
こう見えても、ここ伊藤・伊勢研究室ん一員なしけんしゅちゃ。
よろしゅうお願いするけんね。
 
##No.３博多弁sweet文章変換
http://sweetdrop.net/sweetword/swhen_h.html
 
もしかして君が新しい学生さん？
初めまして。私の名前は川内萌ばい。
こう見えても、ここ伊藤・伊勢研究室の一員なんか～ばい。
よろしくお願いするばい。
 
 
##No.４ 博多弁に変えるとよ（単語数713）
http://nakasu.fc2web.com/mise/hakataben/hakataben.html
 
 
ひょっとして君が新しか学生しゃん？
初めまして。うちの名前は川内萌ばい。
こう見えても、ここ伊藤・伊勢研究室の一員なんばいよ。
よろしゅうお願いするとよ。
 
##No.５ 安川タクシー(単語数324)
http://www.yasukawa-group.com/yasukawa/hakataben.html
 
もばってんて君が新しい学生しゃん？
初めまして。うちの名前は川内萌ばい。
こう見えても、ここ伊藤・伊勢研究室の一員なんとよ。
よろしゅうお願いするとよ。
 
#一文ごとに比較
##一文目
元　もしかして君が新しい学生さん？
恋　もしかして君が新しか学生しゃん？
も　ひょっとして君の新しい学生しゃん？
S   もしかして君が新しい学生さん？
変　ひょっとして君が新しか学生しゃん？
安　もばってんて君が新しい学生しゃん？
 
###もしかして
“恋”と“変”では、「ひょっとして」と変換した。地域によるのかもしれないが、「もしかして」というフレーズは使わないのかもしれない。“安”では逆説の「しかし」の意の「ばってん」と置き換えている。
 
###君が
“も”では、「の」に変換している。誤変換だと思われる。
 
###新しい
“恋”と“変”が「新しか」に変換している。しかし、文の途中であるここで「新しか」を使うのは、正しいとは言えない。
(引用　wikipedia　博多弁https://ja.wikipedia.org/wiki/%E5%8D%9A%E5%A4%9A%E5%BC%81)
カ語尾
共通語の終止形、連体形の活用語尾「い」を「か」ということがある。しかし、福岡でカ語尾は「よか」を除くとあまり聞かれず、「よか」以外の形容詞にカ語尾を付ける時は詠嘆を表すことが多い。

###学生さん？
”S”以外が「学生しゃん？」に変換してた。


##二文目
元　初めまして。私の名前は川内萌です。
恋　初めまして。うちん名前は川内萌ばい。
も　初めまして。うちん名前は川内萌たい。
S   初めまして。私の名前は川内萌ばい。
変　初めまして。うちの名前は川内萌ばい。
安　初めまして。うちの名前は川内萌ばい。


###私の
「うちん」と「うちの」の二種類があった。「うちの」は正しいようだが、「うちん」は不明

###萌です
「萌ばい。」「萌たい。」の二種類があった。言い切りの形ではどちらも使われている。「〇〇です。」の自己紹介では、「〇〇ったいね。」「〇〇っていうっちゃん。」などが存在するらしい。


##三文目
元　こう見えても、ここ伊藤・伊勢研究室の一員なんですよ。
恋　こう見えてん、ここ伊藤・伊勢研究室ん一員たい。
も　こう見えても、ここ伊藤・伊勢研究室ん一員なしけんしゅちゃ。
S   こう見えても、ここ伊藤・伊勢研究室の一員なんか～ばい。
変　こう見えても、ここ伊藤・伊勢研究室の一員なんばいよ。
安　こう見えても、ここ伊藤・伊勢研究室の一員なんとよ。

###見えても
”恋”の「見えてん」の「ん」は、正しいのか判別不能。一部地域では話されているのかも？

###なんですよ
”恋”が一番普通。おそらく、「なんですよ」というフレーズを想定していた。ほかのサイトは不自然な表現になっている。


##四文目
元　よろしくお願いします。
恋　よろしゅうお願いする。
も　よろしゅうお願いするけんね。
S   よろしくお願いするばい。
変　よろしゅうお願いするとよ。
安　よろしゅうお願いするとよ。

###よろしく
「よろしゅう」にほとんど変換された。

###お願いします
”恋”は「します」を「する」に変換したが、不自然。”も”は、いけなくもなさそう。”S”の「ばい」はなんか違う気がする。「するとよ」の二つは、正解か不正解なのかよくわからない。


#まとめ
今後、萌ちゃんに方言をしゃべってもらう上で一番大切なのは、いかに適切な語尾を使えるかだと感じた。

いろんな翻訳サイトで試してみた結果、完成度がもっとも高いと感じたのは、”恋する方言翻訳”だった。そう感じた理由は、語尾のまとまりの良さである。「なんですよ」を「たい」と訳すなど、カバー範囲は広く、かつよく使われる語尾にもしっかり対応していた。ただし、カバー範囲にも限界があるようで、「お願いします」までは訳せなかった。

これからの方針として、この”恋する方言翻訳”以上にきれいな語尾を作れるようにしていく。そのためには、いかに多く種類の共通語の語尾を方言に落とし込めるかが重要になるだろう。
また、語尾以外では基本的なポイント（例「〇〇さん」→「〇〇しゃん」）を外さなければ、なんとかなる。と感じた。
【Python】matplotlibを日本語化する

matplotlibで日本語を使おうとすると、デフォルトのままでは文字化けしてしまいます。
そこで文字化けしないようにするための設定を紹介します。

# お困りごと
Jupyter Notebook上で以下のような処理を実行したときに
グラフのラベルが上手く表示されない。

```python
from numpy.random import *
from matplotlib import pyplot as plt
%matplotlib inline

# 乱数生成
rand_nums = randn(100)

# ヒストグラム表示
plt.hist(rand_nums)
plt.xlabel("X軸と表示したい")
plt.ylabel("Y軸と表示したい")
```
**実行結果**
![hist_miss.png](https://qiita-image-store.s3.amazonaws.com/0/239351/0a60385a-008a-89cd-8bb1-5eecd0dff24a.png)


# 環境
MacOS、Python 3.6(Anaconda)、Jupyter Notebookがインストールされている環境。

# 準備
~~以下のサイトからIPAexGothicフォントをダウンロードし、matplotlibで使えるようにします。
https://ipafont.ipa.go.jp/node17~~
※ 2022/06/14追記 リンクが切れていました。以下からダウンロードできそうです。
  https://moji.or.jp/ipafont/ipafontdownload/


※以下参考までにコマンドを書いてますが、Finder等使ってもらっても可です。
※また、フォントはこの記事の執筆時の最新であるipaexg00301で動かしていますが、ipaexg00401など、他のバージョンでも大差ないと思います。

1. ipaexg00301.zipをダウンロードする。

2. ダウンロードしたzipファイルを展開し、中にあるipaexg.ttfを
~/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf
へ配置する。

```shell
unzip ~/Downloads/ipaexg00301.zip
mv ~/Downloads/ipaexg00301/ipaexg.ttf ~/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf
```

3. ~/.matplotlib内のfontList.py3k.cacheを削除する。
 （また、ここでJupyterを起動している場合は再起動する。）

```shell
rm -f ~/.matplotlib/fontList.py3k.cache 
```

# 方法① 実行時に設定する
先程の処理に一行追加する。

```py
from numpy.random import *
from matplotlib import pyplot as plt
%matplotlib inline

# 乱数生成
rand_nums = randn(100)

# 追加部分 フォントを指定する。
plt.rcParams["font.family"] = "IPAexGothic"

# ヒストグラム表示
plt.hist(rand_nums)
plt.xlabel("X軸と表示したい")
plt.ylabel("Y軸と表示したい")
```

**実行結果**
![hist_miss.png](https://qiita-image-store.s3.amazonaws.com/0/239351/ef56255b-52aa-92d1-d529-9447d8fc5bb5.png)

ただ、こちらの場合はファイルを作成する度に記述する必要があるので、
次に紹介する方法の方が汎用的だと思います。


# 方法② 設定ファイルを修正する
~/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrcの記述を修正します。

```shell
vi ~/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc
```

196行目辺りにfont.familyの記述があるので
以下のようにsans-serifの行をコメントアウトし、IPAexGothicの行を追加する。

```
#font.family         : sans-serif
font.family         : IPAexGothic
```

Jupyterを再起動し、冒頭の処理を実行する。

**実行結果**
![hist_miss.png](https://qiita-image-store.s3.amazonaws.com/0/239351/d79ba397-96d6-c469-07ba-97f883759452.png)

# まとめ
日本語を使う可能性があるのであれば、とりあえず②の方法で日本語化しておくと良いのではないでしょうか。
ASP.NET MVC Razor メモ スクリプト読み込み

Razorの各ページでスクリプトを読み込む方法が良く分かっていなくて調べた時のメモ。

##共通レイアウト_Layout.cshtmlを読み込んでいる場合

```html:_Layout.cshtml
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
```

各ビューのページで以下のように`@section scripts`で記載する。

```html:Addpage.cshtml
@section scripts {
    <script type="text/javascript">
        $(document).ready(function () {
            alert("hello world");
        });
    </script>
}
````
App_Startフォルダ内のBundleConfig.csに以下のように定義されている。

```c#:BundleConfig.cs

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                        "~/Scripts/jquery.validate*"));
````
※`@section scripts`ではなく以下のように定義すると呼び出されない。

```html:Addpage.cshtml
<script type="text/javascript">
        $(document).ready(function () {
            alert("hello world");
        });
</script>
````

##共通レイアウト_Layout.cshtmlを読み込んでいない場合

```html:Addpage.cshtml

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/bootstrap")

<script type="text/javascript">
        $(document).ready(function () {
            alert("hello world");
        });
</script>
````
##参考にしたサイト
https://qiita.com/longk/items/180bb672d33d71be6f60
http://09.hatenadiary.jp/entry/2013/11/19/103525
ASP.NET MVC Razor メモ レイアウト

ASP.NET MVCを勉強中のメモです。
共通レイアウトとレイアウトの参照に関して。
ASP.NET MVC テンプレートでプロジェクトを作成すると共通レイアウトのファイルなどが作成される。
構成としては以下。Views配下だけを切り取ってます。
（Visual Studio 2017 ）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/232585/7469f80b-9411-8d71-0265-0c9ca9c7f754.png)

 - _Layout.cshtml:ASP.NET アプリの既定のレイアウト
 - _ViewStart.cshtml:各ビューの前に実行する処理を記載する。
 
既定では_ViewStart.cshtmlに以下のように_Layout.cshtmlを参照するように記載されている。

```html:_ViewStart.cshtml

@{
     Layout = "~/Views/Shared/_Layout.cshtml";
}
```
各ビューで上記のレイアウトを無視したい場合は、各ページで以下のようにLayoutにnullを指定する。

```html:AddPage.cshtml
@{
     Layout = null;
}
```

##参考にしたサイト

- [ASP.NET MVCの個人的なメモ。テンプレートとか、共通的に使うViewとか](https://blog.okazuki.jp/entry/2013/08/27/082042)

- [ASP.NET Core でのレイアウト](https://docs.microsoft.com/ja-jp/aspnet/core/mvc/views/layout?view=aspnetcore-2.1)
「Vector Tiles on osm.org」を読んで

Vector Tiles on osm.org ( https://github.com/openstreetmap/operations/issues/214 ) が私の経験上、けっこう興味深かったので、メモを残します。あまり正確ではないメモだと思いますので、詳しくは原典に当たってください。

# 経緯など
- OSM の場合、多言語化や POI のクリッカブル化のシナリオ検討をきっかけにベクトルタイルの検討があるように書かれていました。

# esri 実装に関する情報
- [slibby のコメント](https://github.com/openstreetmap/operations/issues/214#issuecomment-408683834) によれば、esri の OSM ベクトルタイル実装は、OSM の minutely changes を PostGIS データベースに同期していくという、「非常に一般的なアプローチ」を用いた後、後段に ArcGIS Pro を配置し、「nearly-mapbox-spec」なベクトルタイルをパブシッリュしているとのことです。
- 同コメントによれば、PostGIS の同期の時間粒度が分であるのに対し、ベクトルタイルの同期の時間粒度は低いのが現状で、時間粒度を高めていくことを目標としているとのことです。

# SotM での BoF の結果
1. osm.org に早期にベクトルタイルを配備することについて合意しました。
2. 画像タイルである osm-carto を置き換えません。
3. ベクトルタイルから画像タイルを作ることは、後ほど古い環境の救済手段として考えることはあり得るとしても、少なくとも当初は考えません。ベクトルタイルをクライアントに送信するシナリオを扱います。
4. ベクトルタイルのサイズには留意しつつ、できるだけ多くの OSM ジオメトリやタグを提供することを目指します。
5. おそらく開発の後期になると思うが、狭帯域シナリオ向けに「軽い」スキーマを提供することも検討します。
6. 経験者の中には、サーバとして Tegola を勧める者もいました。
7. レンダラについては、強い意見はありませんでした。
8. OSM のタイル利用アプローチ（重い利用を禁止し、無保証である）を執行するために、ベクトルタイルスタックが有効かもしれません。
9. osm.org で簡単なスタイルエディタを提供したいという話も。
10. ハードウェアは問題ありません。osm-carto 用のサーバの一台を振り向けるでしょう。

## BoF 結果への感想
- 1., 2., 3. は基礎的かつ重要な合意で、ここに合意を得られらのはよかったですね。
- 4., 5. に関して、性能の観点から、サイズコントロールはとても重要です。国連ベクトルタイルツールキットでは、[mbq](https://github.com/hfu/mbq) でサイズコントロールの指標を持っています。4. と 5. のどちらを優先するかは、戦術ですが、私だったら軽い方を先に作って重い方を増槽版として出すことを考えると思います。
- 6. は参考になりました。Tegola、覚えときましょう。
- 7. はこれから建設的に揉めることになると思いますね。良い議論がされることを願っています。私は今のところ、tippecanoe に自分の駒を置いています。
- 8. は、やや、欲張りかもしれませんね。
- 9. と 10. は正しいセンスだと感じます。 

# 全体についての感想
- BoF の結果は順当で、安心できるものです。この GitHub のスレッドを読んでいると、話が脱線してしまうのではないかとハラハラしましたが。
- ベクトルタイルからの画像レンダリングの話に流れないようにしたのは良い捌きだと思いました。
- クライアントサイドライブラリについて、Leaflet にこだわるのはやめたほうがよいと思います。Mapbox GL JS を用いるか、自己規制を破って自ら実装するしか技術的な答えはないはず。後者については、政策・能力の両面で無理であろうから、前者をとるしかないでしょう。
- サーバ側の議論については、参考になりました。Tegola、覚えときましょう。
- osm.org がベクトルタイルを提供する目的については、合意された整理があるという情報は得られませんでした。目的を整理することは大事だと思います。引き続き、ウォッチしたいです。
2018 年 8 月以降の Android アプリの申請について

2018 年 8 月以降、Google Play へアプリを新規に申請する場合は、対象アプリの `ターゲット API レベル` を `26（Android 8.0）` 以上に設定する必要があります。

また、2018 年 11 月以降は、既存のアプリのアップデートを申請する場合も、対象アプリの `ターゲット API レベル` を `26（Android 8.0）` 以上に設定する必要があります。

詳しくは、[今後の Google Play でのアプリのセキュリティおよびパフォーマンスの改善について](https://developers-jp.googleblog.com/2017/12/improving-app-security-and-performance.html) を参照してください。


# Monaca で ターゲット API レベル 26 に対応する - その1

Monaca で開発するアプリに対して、ターゲット API レベル を 26 にする場合は、`Cordova 7.1` 用プロジェクトを使用する必要があります。

対象プロジェクトの Cordova のバージョンが、Cordova 7.1 より低い場合は、対象プロジェクトの

`設定` -> `Cordovaプラグインの管理` -> `CLIバージョン`

にある「 Cordova アップグレード 」用リンクから Cordova のバージョンをアップグレードすることができます。


# Monaca で ターゲット API レベル 26 に対応する - その2

対象プロジェクトで使用している サードパーティー製 Cordova プラグイン等により、プロジェクトの Cordova バージョンをアップグレードすることが難しいケースもあります。

その場合は、対象プロジェクトの `config.xml` に `android-targetSdkVersion` 設定を行うことでも対応することができます。

```xml:config.xmlの設定例
<platform name="android">
  <preference name="android-targetSdkVersion" value="26" />
</platform>
```


注意点として、`android-targetSdkVersion` でターゲット API レベルを変更した場合は、ネイティブ部分の表示がこれまでと変わる可能性があります。


# おわりに

今後、Google Play へアプリを申請する際に必要になるターゲット API レベルは、毎年更新されていきます。

アプリ申請に必要なターゲット API レベルが更新される前に、事前にプロジェクトで利用しているサードパーティー製 Cordova プラグイン等が対応しているかご確認ください。
create-react-appで環境変数を.envで設定する

create-react-appで`dotenv`的に環境変数を使いたいとき
設定方法が特殊だったのでメモしておく

### 環境

node: 8.11.2
create-react-app: 1.1.4

### 使い方

環境変数は`.env`に書いておくと特に設定しなくても読み込んでくれる
ただし、変数名の前に`REACT_APP_`をつけておく必要がある

#### 設定ファイル

```:.env
REACT_APP_APP_ID="xxxxx"
```

#### 読み込む

```js:api.js
let appId = process.env.REACT_APP_APP_ID
```

### 参考

- https://medium.com/@mohandere/create-react-app-managing-different-environments-easily-3538ee3ef1d6

- https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-custom-environment-variables
pythonを使ってオーロラ全天画像を収集する

##はじめに
研究室の後輩がCNNを使った画像分類の練習をするらしく、それに利用するオーロラ全天画像の収集を命じられた。
##オーロラ全天画像
全天画像とは上空180度、周囲360度を撮影した画像。これにオーロラを写した以下のような画像がオーロラ全天画像。![20180317222126.jpg](https://qiita-image-store.s3.amazonaws.com/0/267043/9da16dbe-b05a-0b0c-b67f-e7c42d206062.jpeg "20180317222126.jpg")
http://nordlys.nipr.ac.jp/acaurora/Syowa より引用
オーロラ全天画像を公開しているサイトは幾つかありますが、今回は国立極地研究所が公開する南極昭和基地で撮影された画像を収集します。
##実装概要
画像は指定した日付の物をすべて収集するように実装します。
言語はpythonです、以下の機能を実装します。
・指定した日付の日別アーカイブページサイトにアクセス
・サイトのHTMLを簡易解析しaタグに含まれるhref属性内の画像URLを取り出す
・画像URLにアクセスし、画像をPCの指定ディレクトリに保存する

##プログラム
解説は後々頑張ります...。とりあえず公開

```python
import requests, os, bs4, urllib.request

#南極昭和基地が画像を公開するサイトのトップページURL
URL = "http://nordlys.nipr.ac.jp/acaurora/Syowa"

#画像を収集したい日付を指定
#2018年3月17日について収集したければ以下のようにする
Date = str(20180317)

#画像を保存するディレクトリパスの指定
#~の部分は任意で構いません、~以降の部分は以下のようにしてください
Dir_path = "C:/~/acaurora/Syowa/photo/"

#指定した日付に対し24時間分の画像を得るためのループ
for i in range(24):
    for j in range(6):
        #時間を4桁で指定、4桁に満たない場合は左端を0で埋める
        #例）11時:1100 -> 1100, 3時:300 -> 0300
        time = str(i*100 + j*10).zfill(4)
        #画像をダウンロードするディレクトリのパスの指定
        DL_dir_path = Dir_path + Date + "/" + Date + time
        #ディレクトリがなければ作成
        if(os.path.exists(DL_dir_path)==False):
            os.mkdir(DL_dir_path)
        #ダウンロードしたい画像がアーカイブされたページのURLを指定
        ArchiveURL = URL + "/photo/" + Date + "/" + Date + time + "/"
        #アーカイブページを取得
        res = requests.get(ArchiveURL)
        #beautifulsoupを使って取得したページの解析準備
        soup = bs4.BeautifulSoup(res.text, "html.parser")
        Prefix = "http://nordlys.nipr.ac.jp"
        Suffix = []
        for a in soup.find_all('a'):
            Suffix.append(a.get('href'))
        # Download Images from link URL
        for j in range(len(Suffix) - 1):
            DLink = Prefix + Suffix[j]
            title = DLink[69:87]
            print(title)
            title = DIR + "/" + title
            print(title)

            urllib.request.urlretrieve(DLink, "{0}".format(title))
```
Alpine から Laravel 用コンテナの作成

CircleCI 2.0 に移行するために自作したコンテナの定義をメモ。

```dockerfile
FROM alpine:3.7

RUN apk update && apk upgrade

RUN apk add \
    php7-curl \
    php7-dom \
    php7-fileinfo \
    php7-gd \
    php7-iconv \
    php7-json \
    php7-mbstring \
    php7-pcntl \
    php7-pdo_mysql \
    php7-phar \
    php7-posix \
    php7-session \
    php7-simplexml \
    php7-tokenizer \
    php7-xml \
    php7-xmlwriter \
    php7-zip \
    php7-zlib

RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && mv composer.phar /usr/local/bin/composer
```
【Markdown】Sublime3でMarkdown式文章を書こう

#### テスト環境
* macOS Version 10.13.5
* Sublime Version: 3.1.1, Build 3176  


インストール
---
Sublime3にて、下記の手順でMarkdownに関するPackagesをインストールします。

- Markdown Extended
- MarkdownPreview

**手順**
1. Sublime メニューバーから [Tools] > [Command Palette...] の順に進む
2. [Package Control: Install Package] を選択 > [Markdown Extended] をインストール
3. [Package Control: Install Package] を選択 > [MarkdownPreview] をインストール

使用方法
---
上記のPackagesをインストールした上で、Sublime３でMarkdown式の文章を作成、プレビューすることができます。

1. Sublime メニューバーから [View] > Syntex > [Markdown Extended] を選択
2. Markdown 式で文章を入力
3. Sublime メニューバーから [Tools] > [Command Palette...] の順に進む
4. Markdown Preview: Preview in Browser > [Markdown] を選択 > デフォルトブラウザにてプレビュー
5. Markdown Preview: Save to HTML > [Markdown] を選択 > 今のファイル名で拡張子はHTMLとして保存


Markdown式の文法
---
下記のページにて詳細な文法の紹介がありますので、ご参照することができます。

**[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#2-9)**


参考
---
[Markdown Preview](https://facelessuser.github.io/MarkdownPreview/)
DynamoDB TIPS

AWSのDynamoDBについて学んだ事を勉強用に記述していきます。

# 1 結果整合性
DynamoDBなどのNoSQLDBは可用性を上げるために複数のサーバで重複してデータを管理する。
3台に分散して管理しているとすると3つ全てのサーバに書き込みが完了するまでにはタイムラグが生じる。
そのため、書き込みが終了した直後に読み込みを行った際にまだ書き込みが終了していないサーバに読みに行ってしまうと書き込んだ内容が取得できない可能性がある。
少し時間を置いて再度読み込みを行うと解消される。
これを結果参照性という。

# 2 強い整合性
上記の結果整合性による現象を防ぐために強い整合性を設定することができる。
強い整合性とは書き込みを行う対象の3台のサーバのうち2台からデータを取得し、一致すればそれを返す。一致しなければもう一台からも取得して多数決を行う。というもの。
DynamoDBが書き込み完了とするのは2台のサーバに書き込みが完了した時点なのでこれによって結果整合性によるデータが取得できない現象を解決できる。
デメリットとして強い整合性を設定しない場合と比べるとスループットが低下する。

# 3 スループットの調整
テーブルの作成時にスループットを設定できる。

- 読み込みキャパシティーユニット(RCU)
- 書き込みキャパシティユニット(WCU)

これらを個別に設定することができ、読み込み頻度が高いデータが保存されるテーブルならRCUを大きめに設定することが可能。
スループットに対して閾値を設定し、その閾値を超えた際にCloudWatchから
アラートを出すことも可能。
(スループットの監視機能)
###RCU
RCUの1つ当たりのスループットは4kB/秒。
ただし、DBに強い整合性を持たせてる場合は1つ当たり2kBになる。
また、データサイズは4kBの倍数に切り上げて計算される。
例えば、

* 1kBのデータを読み込むためには1RCUが必要
* 5kBのデータを読み込むためには2RCUが必要

###WCU
WCUは1つ当たりのスループットは1kB/秒。
データサイズは4kBの倍数に切り上げて計算される。
例えば、

* 300Bのデータを読み込むためには1RCUが必要
* 1.2kBのデータを読み込むためには2RCUが必要

#4 ローカル・セカンダリ・インデックスとグローバル・セカンダリ・インデックス

#### ローカル・セカンダリ・インデックス(LSI)
- テーブルの作成時に設定可能。
- DynamoDBのテーブルには主キーがパーティションキーのみのものとパーティションキーとソートキーを組み合わせるものがあるが、パーティションキーとソートキーを組み合わせるタイプのテーブルでのみ設定可能。
- 通常の検索ではプライマリキーとソートキーを条件にして検索条件を設定するが、プライマリキー+任意の属性で検索条件を作成できるようにするもの。
- 結果整合性と強い整合性の両方をサポート。
- 指定した属性のみを射影する
- テーブルに入っているデータとは別にLSIで取得する属性分のデータを新しいテーブルとして保持するようなイメージ。合計容量が10GBを超えないようにする必要があるのであまり不要な属性を射影しないようにする。

#### グローバル・セカンダリ・インデックス

- 作成はテーブル作成時でも作成後でも任意のタイミングで可能。
- テーブルの主キーもパーティションキーのみでもパーティションキー+ソートキーでもよい。
- 任意のキーを使用して検索条件を作成できるようになる。
- 結果整合性のみをサポートする。
- 容量の制限はLSIと同じ。

#5 読み込み-変更-書き込み設計パターン(オプティミスティック同時実行制御)
いわゆる楽観排他制御を実装可能。
バージョン番号等を用いて自分の読み込み⇒書き込みまでの間に誰かが書き込みを行っていないか検出する。

#6 ホットパーティションの回避
DynamoDBではパーティションキーの値によってデータが保存されるパーティションが決定される。
毎回同じパーティションになるようなパーティションキーを設定してしまうと特定のパーティションに読み書きが集中するのでパーティションが分散されるようにパーティションキーの末尾に乱数を設定するなどするのがベストプラクティス。

#7 ホットデータとコールドデータの分離
トランザクションデータだと

* 作成日時が新しいものほどアクセス頻度が高い。(ホットデータ)
* 作成日時が古いものほどアクセス頻度は低い。(コールドデータ)

これらを期間ごとにテーブルを切り替えるなどして別テーブルになるように保存し、ホットデータが入れられるテーブルのスループットを高くしてコールドデータのテーブルのスループットを低くするのがベストプラクティス。

#8 DynamoDB Accelerator(DAX)
- DynamoDB用のキャッシュサービス。
- 通常DynamoDBのレイテンシは1ミリ秒単位だが、1マイクロ秒単位に縮小可能。
- DAXを使用することでRCUやWCUを必要以上に大きく設定することなくスループットを確保できるのでコスト削減になる。
オリジナルイラストをアイコンとして扱う【Flutter】

# はじめに
Flutterにおいて画像やイラストを用いたbuttonなどを作るにはいくつか方法があるかと思いますが、アイコンのようなテイストなら***アイコンフォント***としてまとめてしまうのが何かと使い勝手が良いと思いました。

# 用意するもの
- アイコンにしたいSVG形式の画像

:thinking: 
![アートボード 1.png](https://qiita-image-store.s3.amazonaws.com/0/71342/072b31cd-7be2-c6d1-d5cb-82e8f5ae5308.png)


# フォントアイコンへの変換
こちらのサイトを使わせて頂きます。
[FlutterIcon - Flutter icon font generator](http://fluttericon.com/)
### 1. 変換したいイラストをアップロード
<img width="740" alt="スクリーンショット 2018-08-20 0.24.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/71342/76482189-651a-fc69-e7b0-706788464734.png">


### 2. フォントに名前を付けてダウンロード
<img width="349" alt="スクリーンショット 2018-08-20 0.34.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/71342/8bdc2eeb-ce09-3051-f4d3-fdb4e9d7e891.png">

### 3. Flutterのプロジェクトに組み込む
ダウンロードしたフォルダの中身↓
<img width="613" alt="スクリーンショット 2018-08-20 0.45.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/71342/16f363b3-23d4-7200-f085-610dac7217aa.png">
ttfファイルをFlutterプロジェクトファイルの適当な場所に配置。
> (project_name)/fonts/Sample.ttf

pubspec.yamlファイルを編集。

```pubspec.yaml
flutter:
  fonts:
  - family:  Sample
    fonts:
     - asset: fonts/Sample.ttf
```

ダウンロードしたフォルダ内にあるdartファイルからIconDataオブジェクトを生成するコードを確認することが出来ます。

```sample.dart
IconButton(
    icon: new Icon(IconData(0xe800, fontFamily: 'Sample'))
)
```
fluentdでイベントを複製するプラグインの作り方



fluentdを利用していると、1つのイベントを複製して別々に処理したいという場面は多いと思います。
例えば、1つのイベントを複数のデータストアに保存したいというようなケースです。

単純に複数のデータストアに保存したいだけなら、[copy Output Plugin](https://docs.fluentd.org/v1.0/articles/out_copy)等を利用すれば実現できます。
しかし、データストアごとに別々の前処理を行った上で保存したいというような要件には対応できません。

今回は、Pluginを自作する事で柔軟なイベント複製を行う方法を紹介します。

## 実装方針

基本的には、[Filter Plugin](https://docs.fluentd.org/v0.12/articles/plugin-development#filter-plugins)の中で `emit_stream` というメソッドを呼び出す事でイベントの複製を行います。

## 例1: 単純に複製するPlugin

まずはミニマムなサンプルとして、単にイベントを複製して任意のタグに流すPluginを作成してみます。

fluent.confの記述は以下のようなイメージです。
この例では、一つのsourceから`file Output`でのファイル出力と、`Elasticsearch Output Plugin`でのElasticsearchへの書き込みを行っています。
`file`というtagでイベントが流れてくるので、これを`elastic`というtagに向けて複製する、という流れです。

```fluent.conf
<source>
  @type forward
  port 24224
</source>

# このプラグインを作る
<filter file>
  @type copy_event
  target_tag elastic
</filter>

<match file>
  @type file
  ～～～
  略
</match>

<match elastic>
  @type elasticsearch
  ～～～
  略
</match>
```

プラグインの実装は以下のような感じです。

```ruby:plugins/filter_copy_event.rb
module Fluent
  class CopyEventFilter < Filter

    Fluent::Plugin.register_filter('copy_event', self)

    config_param :target_tag, :string, default: nil

    def filter_stream(tag, es)
      new_es = MultiEventStream.new
      es.each do |time, record|
        begin
          new_es.add(time, record)
        rescue => e
          router.emit_error_event(tag, time, record, e)
        end
      end
      # send_tagに向けてイベントを複製する
      router.emit_stream(send_tag, new_es)
      # イベントをそのまま返す
      es
    end
  end
end
```

ポイントは`router.emit_stream`です。`fluent.conf`の`target_tag`で指定したタグに向けて、流れてきたイベントを複製しています。

念のために自作のpluginを指定した起動方法を載せておきます。

```bash
# 先ほどのプラグインをplugins/filter_copy_event.rb で保存
fluentd -c fluent.conf -p plugins
```

## 例2: Elasticsearchにはstatusが200のものだけ流す

先ほどの例は単純にイベントを複製しただけだったので、もう少し実用的な例を示してみます。

一つのsourceからファイル出力とElasticsearchへの書き込みを行うという部分は先ほどと同じですが、Elasticsearchへは`status`というrecordが`200`のものだけ書き込むという処理を行うケースを考えます。
`fluent.conf`は例1のものと同じで、プラグインを作って条件に合うものだけ複製します。

プラグインの実装は以下のような感じです。

```ruby:plugins/filter_copy_event.rb
module Fluent
  class CopyEventFilter < Filter

    Fluent::Plugin.register_filter('copy_event', self)

    config_param :target_tag, :string, default: nil

    def filter_stream(tag, es)
      new_es = MultiEventStream.new
      es.each do |time, record|
        begin
          status = record['status'].to_i
          if status == 200
            new_es.add(time, record)
          end
        rescue => e
          router.emit_error_event(tag, time, record, e)
        end
      end
      router.emit_stream(send_tag, new_es) unless new_es.empty?
      es
    end
  end
end
```

これで、`file`タグには全てのイベントが流れ、`elastic`タグには`status`のrecordが`200`のものだけが流れます。

## 終わりに

fluentdを使っていてイベントを複製しようと思ったら、日本語情報が全然なかったのでこの記事を書いてみました。が、イベントを複製する場合にこの方法がベターなのかは、正直分かりません・・・
ただ、今自分が扱っているシステムでは、この方法でDaily約5億件のログを問題なく捌けているので、大きな問題はないのかと思われます。
firebase init 時に聞かれる「Configure as a single-page app (rewrite all urls to /index.html)?」は選択によって何がどう変わるのか

# 概要

`firebase init` を実行して Hosting サービスの利用を始めようとすると、途中で

> ? Configure as a single-page app (rewrite all urls to /index.html)? y/N

と聞かれる。
そんな難しいこと聞かれてもわからないよ！ということで、この選択で具体的に何が変わるのか調べました。

# 結論

違いは下記の2点のみでした。

* YES を選ぶと、firebase.json にリライト設定が追記される
* NO を選ぶと、404.html が作成される

```
$ diff -r not_spa/ spa/
diff -r not_spa/firebase.json spa/firebase.json
7a8,13
>     ],
>     "rewrites": [
>       {
>         "source": "**",
>         "destination": "/index.html"
>       }
Only in not_spa/public: 404.html
```
PDO の bindParam() で1時間悩まされた話

`PDO` の `bindParam()` でつまずいたのでメモがてら記事おこします。

## bindParam() は参照渡し

PDO プリペアドステートメントで `bindParam()` と `bindValue()` という2つのメソッドがあります。

`bindParam()` の場合、引数で渡している変数が参照渡しでバインドされるそうです。

[PHP: PDOStatement::bindParam \- Manual](http://php.net/manual/ja/pdostatement.bindparam.php)

> 準備された SQL ステートメント中で、 対応する名前もしくは疑問符プレースホルダにパラメータをバインドします。 PDOStatement::bindValue() と異なり、 変数は参照としてバインドされ、PDOStatement::execute() がコールされたときのみ評価されます。

参照渡しの為、↓みたいな感じで `bindParam()` を実行した後に引数で渡してる変数を変更すると、最後の変更結果が DB に保存されます。

```php
<?php

...

$sth = $dbh->prepare('INSERT INTO users SET firstName = :firstName, lastName = :lastName');

$firstName = 'firstName';
$lastName = 'lastName';

$sth->bindParam(':firstName', $firstName, PDO::PARAM_STR);
$sth->bindParam(':lastName', $lastName, PDO::PARAM_STR);

$firstName = 'ruka';
$lastName = 'pachory';

$sth->execute();
```

## 実行結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/55481/e0a2b3e4-456a-9a54-3eee-b43919de9e46.png)

`bindParam()` 実行直後に変更した変数の内容が insert されてますね。

知らなかった。

そもそも `bindValue()` でいいやんって思いますが、どのタイミングで `bindParam()` 使うんでしょうかね。。

誰か優しい人教えてください。
php-master-changes 2018-08-19

# 2018-08-19
## weltling: Use stable deps on AppVeyor for now
- https://github.com/php/php-src/commit/b0da1745be1370ff046da407cb3ec925aed645f5
- AppVeyor の [Windows ビルド系](https://github.com/Microsoft/php-sdk-binary-tools/blob/e81199f9af5335e88d6cdbdc02ab7f3ed1f4188f/lib/php/libsdk/SDK/Config.php#L105)で、依存ツールについて [staging でなく stable](https://windows.php.net//downloads/php-sdk/deps/series/) の方を使う指定に一旦修正
- latest images が vc++15.8と同期してない？というのはなんの話かよく分かってない

## cmb69: Map ERROR_PRIVILEGE_NOT_HELD to EACCES
- https://github.com/php/php-src/commit/ef1b26f080913652e78eaa037899409030feb645
- Windows 環境で [ERROR_PRIVILEGE_NOT_HELD](https://docs.microsoft.com/en-us/windows/desktop/Debug/system-error-codes--1300-1699-#ERROR_PRIVILEGE_NOT_HELD) を EACCES に割当
- Windows の CLI で管理者権限なしで symlink を作ろうとすると起きる奴
- Windows 環境で OS から来るエラーコードは PHP コード内で POSIX の errno っぽいのになんとなくマップされる
- 現状コードではマップにないエラーの際は [assert() に入る](https://github.com/php/php-src/blob/ef1b26f080913652e78eaa037899409030feb645/win32/winutil.c#L394)ので、デバッグモードで落ちてしまう
Python 競技プログラミング　チートシート自分用

# はじめに
主にググりながら色々なサイトの演習問題解いて勉強してます。
調べたことをまとめて随時更新したい。

#標準入出力
##標準入力
###1行シリーズ

```python:
#1要素を文字列で受け取る
x = input()

#数値にしておく
x = int(input())

#複数要素を分割してそれぞれ文字列として受け取る
#入力例:1 2 3
x,y,z = input().split()

#数値にしておく(map関数)
x,y,z = map(int, input().split())

#分割してリストに入れておく
lis = input().split()

#数値にしてリストに入れておく
lis = list(map(int, input().split()))

```
map関数の戻り値はmapオブジェクトなのでlist関数が必要な点に注意。
ただし代入式の左辺に適切な数の変数があればそのまま代入できる。
mapオブジェクトに限らず、リストやタプルの要素を展開して
複数の変数に代入することをアンパック代入という。

###1+N行シリーズ
1行目に整数Nが与えられて、その後N行の標準入力が続くやつ。
_(アンダースコア)はこの変数使ってないですよ、を表すらしい。

```python:
#普通にfor文で回す
num = int(input())
for _ in range(num):
    print(input())

#当然こうも書ける
for _ in range(int(input())):
    print(input())

#N行をリストに入れておきたい場合
lis = []
for _ in range(int(input())):
    lis.append(input())

#内包表記を使ってこう書ける
lis = [input() for _ in range(int(input()))]

#例えば標準入力が以下の場合、
3
2 4
3 9
5 25
#組み合わせてこう書ける
lis = [list(map(int, input().split())) for _ in range(int(input()))]
print(lis)
[[2, 4], [3, 9], [5, 25]]
```

##標準出力
###print()関数
基本中の基本。

```python:
x,y = 3, 5
#普通に出力
print(x)
3

#','(コロン)区切りで' '(半角スペース)区切りになる
print(x, y)
3 5

#デフォルトで半角スペースになっているsepキーワード引数を変えるとこうなる
print(x, y, sep=',')
3,5

#デフォルトで'\n'(改行コード)になっているendキーワード引数を変えるとこうなる
print(x, end='')
print(y)
35
```
キーワード引数の指定は'='の両側にスペースを空けないのがお作法です。

###str.format()メソッド
文字列に変数を埋め込めるすごいやつ。
組み込み関数のformat()とは違うので注意。

```python:
y,m,d = 2018, 8, 20
#基本の使い方
print('Today is {}/{}/{}.'.format(y,m,d))
Today is 2018/8/20.

#埋め込む場所を引数のインデックスで指定も出来る
print('Today is {1}/{2}/{0}.'.format(y,m,d))
Today is 8/20/2018.

#同じ引数のインデックスを何回使ってもいいし使わなくてもいい
print('{1}/{2} {2}:{2}'.format(y,m,d))
8/20 20:20

#ゼロ埋めも出来る
print('Today is {1:0>2}/{2:>2}/{0:0>2}.'.format(y,m,d))
Today is 08/20/2018.

#引数はシーケンス型(リストやタプル)でもいいけどあまりカッコよくはない
print('Today is {0[1]:0>2}/{0[2]:>2}/{0[0]:0>2}.'.format([2018, 8, 20]))
Today is 08/20/2018.
```
{}内の記法は{"引数の番号[index]":"埋める文字"+"< or = or >"+"桁数"}になる。
※[index]は引数がシーケンス型の場合
'<'が右寄せ '='が中央寄せ '>'が右寄せ。
他にキーワード引数にしたり、n進数にしたりも出来るけど競プロでは余り使わないかも。

###str.join()メソッド
指定した区切り文字で要素を連結するのに使う。
大抵は空文字列か半角スペース。
引数はシーケンス型です。

```python:
#基本の使い方
print(' '.join(['Hello', 'world', '!']))
Hello world !

#数値は文字列に変換しておく必要がある
print('/'.join(map(str, [2018, 8, 21])))
2018/8/21

#例えばこんな2次元配列を
bingo = [[1, 18, 4, 19, 14], [17, 3, 25, 11, 6], [23, 12, 16, 2, 21], [10, 24, 22, 8, 9], [5, 20, 7, 13, 15]]

#こう書ける
for i in range(len(bingo)):
    print(' '.join(map(str, bingo[i])))
1 18 4 19 14
17 3 25 11 6
23 12 16 2 21
10 24 22 8 9
5 20 7 13 15

#一行にするとこうなる
print('\n'.join([' '.join(map(str, i)) for i in bingo]))
1 18 4 19 14
17 3 25 11 6
23 12 16 2 21
10 24 22 8 9
5 20 7 13 15
```
Hyper-VでCentOS6をインストールするための前準備

### 1.Hyper-vのマネージャー画面を開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/2866afcb-f7cb-7b2d-4d2b-f7e5aaf8ab7b.png)

## 2.右カラムの「新規」→「仮想マシン」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/dd1bcfeb-931f-0093-cc44-33501d0412bc.png)

## 3.「開始する前に」は何も考えず「次へ」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/9344a9a3-0e70-c6a9-afc7-6aa0faef7ff0.png)

## 4.名前と場所の指定
* 名前を入力する。また、格納場所を選択する。完了したら「次へ」をクリック
* この名前はHyper-Vマネージャーで表示されるための名前なので、わかりやすい名前にした方が後々管理しやすいです。
* 格納場所はどこでも大丈夫です。デフォルトでCドライブに設定されますが、容量に不安があれば別の場所を選択した方が良いです。
* チェックポイントってバックアップ的なものも保存される場所となるので容量に余裕がある場所を選択したほうがよいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/8f998ae7-6533-4633-92a4-a19c961d72c6.png)


## 5. 世代の指定
* 「第2世代」を選択し「次へ」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/2b5bd253-6e1c-40d6-ac72-7871b4169485.png)

## 6.メモリの割り当て
* パソコンの性能次第ですが2048以上が良いかも。入力したら「次へ」をクリック
* あとで調整可能なので、インストールして起動後に動作が重かったら設定変更しても良いかも
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/1a1fbc3d-ab7b-0239-2c42-ef70b9f0444d.png)

## 7.ネットワークの構成
* 「規定のスイッチ」を選択し「次へ」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/e515b1bb-4ef1-ecb5-07a1-b906b80bdaa3.png)

## 8.仮想ハードディスクの接続
* 仮想HDD（これからインストールするCentOSのHDD）の場所を選択します。
* デフォルトで項番4の場所となりますが、容量に不安があれば場所を移動した方が良いです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/0f7fd2fd-3a91-f003-ddb1-9b61f3d08bad.png)

## 9.インストールオプション
* 「ブートイメージファイルからオペレーティングシステムをインストールする」を選択し、ISOを選択し「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/8f27ff1f-7db4-3643-06f9-5ebeb5a9e04f.png)

## 10.仮想マシンの新規作成ウィザードの完了
* 今までの設定内容が表示されます。問題なければ「完了」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/4abd3dcd-ae6b-9635-e7c9-5fe5c4b82ed2.png)

## 11.作成された仮想マシンを右クリックし「設定」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/146de385-d421-0350-cccb-1aa88027c751.png)


## 12. 設定画面が表示されたら「セキュリティ」を選択し、セキュアブートを無効にします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113572/606a296b-cd1a-d5a4-48b3-05f388bcbecd.png)


これでインストールの前準備が整いました。
いくつか詰まった箇所があったので書いてみました。
インストール編はいずれ。。。