OmniAICreator/Qiita-1.07M huggingface dataset:
Ecto の virtual field で struct を参照する

Ecto.Schema のフィールドを定義するときに、struct を参照する `virtual` なフィールドを定義したい。

```elixir
field :my_struct, MyStruct, virtual: true
```

しかし、こうするとコンパイルエラーになってしまう。

```
== Compilation error in file ... ==
** (ArgumentError) schema MyStruct is not a valid type for field :my_struct. Did you mean to use belongs_to, has_one, has_many, embeds_one, or embeds_many instead?
```

かといって、`has_one/3` などの[リファレンス](https://hexdocs.pm/ecto/3.2.2/Ecto.Schema.html#has_one/3)を読んでも `virtual` オプションはない。結局、タイプを `:any` とすることで切り抜けたが、型を明示するためにもできれば struct を指定したいところ。

```elixir
field :my_struct, :any, virtual: true
```
【Python】WebページやHTMLをPDF出力する

大量のPDFをプログラムでバッチ出力したい。
けど、帳票ツールを買うお金はない…。

そうだ、HTMLをPythonスクリプトで組んでPDF変換しよう！
ということでやり方を調べたメモ。

# wkhtmltopdfのインストール

まずは、[wkhtmltopdf](https://wkhtmltopdf.org/)というツールをインストールします。

[ダウンロードページ](https://wkhtmltopdf.org/downloads.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/36e103cf-4e38-44ce-64f1-e7089f10fa3f.png)

インストールしたら `インストールフォルダ\wkhtmltopdf\bin` にパスを通すと、コマンドラインでWebページをPDF化することができます。

```
>wkhtmltopdf https://www.google.com/ google.pdf
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done
```

# pdfkitを使ってPythonで出力する

[pdfkit](https://pypi.org/project/pdfkit/)というPythonライブラリを使います。
これは内部でwkhtmltopdfを使用しています。

```
pip install pdfkit
```

```python
import pdfkit

# 指定できる出力オプション https://wkhtmltopdf.org/usage/wkhtmltopdf.txt
options = {
    'page-size': 'A4',
    'margin-top': '0.1in',
    'margin-right': '0.1in',
    'margin-bottom': '0.1in',
    'margin-left': '0.1in',
    'encoding': "UTF-8",
    'no-outline': None,
    'disable-smart-shrinking': '',
}

# WebページをPDF出力
pdfkit.from_url('https://google.com', 'google.pdf', options=options)

"""
パスを通さなかった場合はプログラム内でパスを設定する必要がある。
config_path = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf=config_path)
pdfkit.from_url('https://google.com', 'google.pdf', options=options, configuration=config)
"""

# HTML/CSSファイルをPDF出力
pdfkit.from_file('index.html', 'index.pdf', css='style.css', options=options)

# テキストをPDF出力
pdfkit.from_string('<html><body><h1>It works!</h1></body></html>', 'apache.pdf', options=options)
```
Gitの完全に独立した履歴に関する操作

複数のリポジトリを統合する際に、独立した履歴を扱う操作をいくつかしたので、ここにまとめておく。

使用したGitのバージョンは `2.17.1` 。

## 操作
### 全く新しい履歴を開始する
また新しく 'Initial commit' したいときに使う。**ひとつのリポジトリで仮想的に複数のリポジトリを管理できる**ことになる。例えば、

* GitHubにある捨てる予定のリポジトリをそのまま再利用できる
* 検証用の単純なアプリを作る際も同じリポジトリで管理できる
	* 構築済みのCI/CDを使うこともできる
	* 新しいリポジトリで管理することになったときに切り出しやすい

```bash
git checkout --orphan ${NEW_BRANCH_NAME}
git rm -r --cached . # 全ファイルをunstageする
```

※ orphan: 「孤児」「親のない」

#### （補足）空のコミットを作る
'Initial commit' をrebaseできないと嫌なときに、最初に作ることがある。（実際は次節の方法で可能なので、rebase目的では不要）

```bash
git commit --allow-empty -m 'Empty commit'
```

### 履歴を根元からrebaseする
'Initial commit' さえもrebaseしたいときに。rebase先のブランチ等を指定する代わりに `--root` オプションを指定すればいい。

```bash
git rebase -i --root # 念のためinteractive
```

### 独立した履歴をマージする
独立した履歴を複数持てるなら、逆にそれらをマージしたくなることもある。オプションを追加すれば可能になる。

```bash
git merge --allow-unrelated-histories ${ANOTHER_BRANCH}
```

#### （補足）複数のリポジトリを読み込む
普通にリモートリポジトリを追加すればいい。

```bash
git remote add origin-repo1 https://github.com/org1/repo1.git
git fetch origin-repo1

git remote add origin-repo2 https://github.com/org2/repo2.git
git fetch origin-repo2
```

#### （補足）複数の履歴を同時にマージする
Gitは複数の履歴を同時にマージできる。しかし、履歴が独立している場合はうまく動いてくれなくて、コマンドを追加して修正する必要がある。

```bash
git merge --allow-unrelated-histories ${OTHER_BRANCHES}
git read-tree HEAD ${OTHER_BRANCHES}
git commit -m 'Merge histories'
git reset --hard
```

`git read-tree` は8つまでしか対応していないが、参考元のコメントにはその制限を超えられた方法が書かれていた（私は試していない）。また、 HEAD を含めておかないと本線のファイルが消えてしまったので、上記コマンドには含めている（なので OTHER_BRANCHES は7つまで）。

## 参考

* [First commit が git rebase -i できない問題 → git rebase -i --root でできる - 納豆には卵を入れる派です。](https://ken-c-lo.hatenadiary.org/entry/20130421/1366558065)
	* https://twitter.com/gnue/status/325971414110851073
	* https://twitter.com/ganta0087/status/325974574518902785
* [Git octopus merge with unrelated repositoies - Stack Overflow](https://stackoverflow.com/a/31186732/9140111)
[ Android Studio ] 画像のサイズ調整と回転

今回は画像の扱い方について記載していく。

##画像サイズ調整
　サイズ調整には以下のようなプログラムを用いる。

~~~
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
~~~

　FIT_XYとは画像の大きさをレイアウトのImageViewサイズに合わせる定数である。
　引数には様々な定数が存在する。
　以下のサイトがとても参考になるので、見て頂きたい。
https://akira-watson.com/android/imageview_scaletype.html



##画像回転
　まずいつも通り回転用ボタンを実装。
　(ボタンのID:rotate)
　(ImageViewのID:imageBluePaint)

　そして以下のようなクリックイベントを実装。
  iは回転の度合いを表している。

~~~
    int i = 0;
    rotateButton.setOnClickListener((View v) -> {
        i += 5;
        ((ImageView)findViewById(imageBluePaint)).setRotation(i);
    })
~~~

##まとめ
　以下がサンプルプログラムである。

~~~
public class MainActivity extends Activity {

    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageDisplayInitialize();
    }

    /*
    表示非表示ボタンの実装
    */
    public void imageDisplayInitialize() {
        //クリックイベントを取得するボタン
        Button rotateButton = (Button) findViewById(R.id.rotate);

        //画像表示
        ImageView imageView = findViewById(R.id.imageBluePaint);
        imageView.setImageResource(R.drawable.bluepaint);

        //画像サイズ変更用プログラム
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);

        //ボタンにOnClickListenerインターフェースを実装
        //回転用ボタンの機能実装
        rotateButton.setOnClickListener((View v5) -> {
            i+=50;
            ((ImageView)findViewById(R.id.imageBluePaint)).setRotation(i);
        });
    }
}

~~~

　以上。
macOS CatalinaにするとVSCodeでファイルをincludeできなくなった話

先日 macOS Catalinaがリリースされ、早速アップデートしました。

当日は特に何も問題はなかったのですが今日になってvscodeを開いたところ、

```cpp
#include<bits/stdc++.h>
```
に赤波線が出て、コンパイルできなくなっていました。

最初はstdc++.hが認識されていないのかと考え、パスを確認しても直らず。
そこで

```cpp
#include<iostream>
```
に変えてみても赤波線が出るのでstdc++.hが問題ではなかったということですね。

そこでまずgccをアップグレードするため(こちらは先に行ったので必要かわかりません)に

```
$ brew upgrade gcc
```
をターミナルで実行しました。
でも

```
Install the Command Line Tools:
  xcode-select --install
```
と出るので言われた通りに

```
$ xcode-select --install
```
を実行、インストールが終わって再度

```
$ brew upgrade gcc
```
を実行すると無事 gcc 9.2.0 -> 9.2.0_1 となりました。

次にVSCodeをCatalinaに対応させるために下のリンクからCatalinaをインストールすると無事includeできるようになりました。
https://marketplace.visualstudio.com/items?itemName=vincentriemer-vsc.vscode-theme-catalina&ssr=false#overview

同じように困った方の手助けになれば幸いです。
macOSのバンドルフォント一覧（macOS10.15~10.5）

# 概要
- macOSで元から入っているバンドルフォントの情報をまとめました。
    - もしくは`標準フォント`or`プリインストールフォント`と呼ばれてますね。

# macOS別のバンドルフォント情報

- Appleが毎年ページを公開しています。
    - `Fonts included with macOS XXXXX`
- （`10.10`に関しては情報が見つかりませんでした。）

| バージョン | リンク |
| :---: | --- |
| 10.15 | [Fonts included with macOS Catalina](https://support.apple.com/ja-jp/HT210192)<br><br>[Apple、macOS 10\.15 Catalinaの組み込みフォントリストを公開。](https://applech2.com/archives/201910-fonts-included-with-macos-catalina.html) |
| 10.14 | [macOS Mojave に組み込まれているフォント](https://support.apple.com/ja-jp/HT208968) |
| 10.13 | [macOS High Sierra に組み込まれているフォント](https://support.apple.com/ja-jp/HT207962) | 
| 10.12 | [macOS Sierra に組み込まれているフォントの例](https://support.apple.com/ja-jp/HT206872) <br><br>[個人作成の詳細リスト：Yusuke Terada @doraTeX](https://twitter.com/doratex/status/782645546225774592)|
| 10.11 | [El Capitan(10.11) フォントリスト](https://www.muskmelon.jp/?p=1169)<br><br>[個人作成の詳細リスト：Yusuke Terada @doraTeX](https://twitter.com/doraTeX/status/782645982634717184) |
| 10.9 | [OS X：Mavericks(10.9) に組み込まれているフォント](https://support.apple.com/ja-jp/HT201375) |
| 10.8 | [OS X：Mountain Lion(10.8) に組み込まれているフォント](https://support.apple.com/ja-jp/HT201344) |
|10.12-10.0|[macOS プリインストール日本語フォント追加の歴史 \- Qiita](https://qiita.com/guai3/items/2b8ddb26a784be55b526#macos-v1012)|
| 10.8-10.5 | [Mac OS X 10.5、10.6、10.7、10.8に標準でインストールされているフォント一覧](https://oxynotes.com/?p=4839) |

# その他バンドルフォントの情報
- [macOS \(OS X, Mac OS X\) にバンドルされているヒラギノフォント †](https://texwiki.texjp.org/?%E3%83%92%E3%83%A9%E3%82%AE%E3%83%8E%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88)

# フォントフォルダ一覧

|用途|パス|
|---|---|
|共通フォントフォルダ|/System/Library/Fonts/|
|ユーザ別フォントフォルダ|/Users/<ユーザ名>/Library/Fonts/|
|システムフォルダ|/Library/Fonts/|
|システムフォルダ（削除・利用停止が可能）|/System/Library/Assets/com_apple_MobileAsset_Font4/<文字列>.asset/AssetData/|
|ローカルネットワーク共有フォントフォルダ|/Network/Library/Fonts|

# 参考

- [システムフォントの格納場所について](https://discussionsjapan.apple.com/thread/110200367 )
- [Macのフォントのファイルが存在するフォルダの場所 / Inforati](http://inforati.jp/apple/mac-tips-techniques/system-hints/where-is-the-folder-of-macos-font-file.html)
- [Mac OS X：フォントの保存場所とその目的](https://support.apple.com/ja-jp/HT201722)
jitsi-meetとjitsi-videobridgeを別のサーバーで動かす

# はじめに
オープンソースな音声、ビデオ通話システムのJitsiを利用したアプリを構成する際に、
ネットワーク上の制約でjitsi-meetとjitsi-videobridgeを別のサーバーで動作させる必要があり、
えっさほいさすることになったので忘備録的にきろくさせてください。

# 構成
こんな感じです。便宜上WebサーバーとVideoサーバーと呼んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279581/c1c1f396-329d-9f63-1496-260739c20d0c.png)

# Webサーバー側の設定
## nginx
nginxは環境に合わせよしなに設定します。
## jitsi-meet
jitsi-meetのconfig.jsに取得済みのドメイン(仮に**dontaku-hakata.co.jp**)を記載します。

```config.js

var config = {
    hosts: {
        domain: dontaku-hakata.co.jp,
// その他の設定...

```



# Videoサーバー側の設定
## /etc/hosts
名前解決に制約があったので、/etc/hostsに取得済みのドメイン(仮に**dontaku-hakata.co.jp**)と対応させてWebサーバーのIPアドレスを記載します。

```/etc/hosts.
127.0.0.1         localhost
WebサーバーのIP     dontaku-hakata.co.jp
```

## jitsi-videobridge
videobridgeを起動する際にホスト、取得済みのドメイン(仮に**dontaku-hakata.co.jp**)、サブドメイン、Webサーバーと通信するポート、videobridgeのシークレットをオプションとして指定して起動します。
シェルスクリプトにしました。

```start_videobridge.sh
#!/bin/bash
mkdir -p /var/log/videobridge

bash videobridgeのパス/jvb.sh --host=dontaku-hakata.co.jp --domain=dontaku-hakata.co.jp --subdomain=videobridge --port=任意のポート --secret=videobridge_secret >> /var/log/videobridge/videobridge.log 2>&1
```

## jicofo
jicofoを起動する際にvideobridgeと同様のオプションに加え、
auth用にドメインを指定して起動します。
こちらもシェルにしました。

```start_jicofo.sh
#!/bin/bash
mkdir -p /var/log/jicofo

bash jicofoのパス/jicofo.sh --host=dontaku-hakata.co.jp --domain=dontaku-hakata.co.jp --secret=jicofo_secret --user_domain=auth.dontaku-hakata.co.jp >> /var/log/jicofo/jicofo.log 2>&1
```

## /root/.sip-communicator/sip-communicator.properties
/root/.sip-communicator/sip-communicator.propertiesに取得済みのドメイン(仮に**dontaku-hakata.co.jp**)を指定します。STUNサーバーは
以下のように指定します。

```sip-communicator.properties
org.jitsi.videobridge.STATISTICS_TRANSPORT=pubsub
org.jitsi.videobridge.PUBSUB_SERVICE=dontaku-hakata.co.jp
org.jitsi.videobridge.PUBSUB_NODE=sharedStatsNode

org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=STUNサーバーの設定
```


## prosody
prosody起動時に読み込まれる設定ファイルでホストを指定し、videobridgeとjicofoをマウントします。

```dontaku-hakata.co.jp.cfg.lua
VirtualHost "dontaku-hakata.co.jp"
    authentication = "anonymous"
    ssl = {
        SSLの設定
    }
    modules_enabled = {
        "bosh";
        "pubsub";
    }

VirtualHost "auth.dontaku-hakata.co.jp"
    ssl = {
        SSLの設定
    }
    authentication = "internal_plain"

// jicofoとvideobridgeをマウントする
Component "conference.dontaku-hakata.co.jp" "muc"
Component "videobridge.dontaku-hakata.co.jp"
    component_secret = "videobridge_secret"
Component "focus.dontaku-hakata.co.jp"
    component_secret = "jicofo_secret"

```


# 動作確認して完了です。
Webサーバー側にブラウザから接続(仮に**dontaku-hakata.co.jp**)し、音声/ビデオが疎通していれば完了です。
ソートってなんだよ(哲学)

[スターリンソート](https://qiita.com/Sirloin/items/c9e5c74be3366df65bce)や[アベソート](https://qiita.com/scivola/items/942a36ddb6aeda172a54)や[コミューンソート](https://qiita.com/fugahogeds/items/b16680e60b2ece206c3a)で腹を抱えて笑ったわけだが、**ソートという概念**に**要素数や要素そのものに頓着しない**というフウチョウを持ち込むなら、以下のアルゴリズム(実際の処理は知らん)が最速になるはずだ。

## 実装

```py:sort.py
from typing import List, Any


def sort(data):
    # type: (List[Any]) -> None
    data.clear()


def main():
    # type: () -> None
    data = [1, 2, 1, 1, 4, 3, 9,]
    print(F'Before Data: {data}')
    
    sort(data)
    print(F' After Data: {data}')


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

```
λ python sort.py
Before Data: [1, 2, 1, 1, 4, 3, 9]
 After Data: []
```

見ての通り、**昇順**に並べ替えられて**いる**。 **左様でございますな?**

計算量は理論[^theory]上 $O(1)$ だと思うけどどうでもいいですね。

[^theory]: Python 内部での実際の処理がどうなっているかは知らないけど、理屈の上では、の意味。 なんなら空リストと取り替えればいい。

## 命名

スターリンソートのようなセンスのいい名前が思いつかない。

とりあえず**ドゥームズデイソート**とでも名付けておこう。

## ぶっちゃけ

~~多分既出だと思うけどこんなもん既出かどうか調べている暇があったら寝なさい。~~

~~睡眠不足はいい仕事の大敵です。~~

あっ、[普通にいるわ](https://qiita.com/Tatsuki-I/items/380d6bd06515b872b2b2)。

## 追記

ネタかぶりをして悔しかったので、[続きました](https://qiita.com/BlueRayi/items/4d6b36bf5bd3d11d0322)。
Git／Git bashとは？


#Gitインストール
##Gitって何？

>
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
>
Git is easy to learn and has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.

引用：https://git-scm.com/

バージョン管理システムで、後からファイルを過去のバージョンに差し替え（ロールバック）たりできるようです。

今まであまり使ったことはありませんが、新しいPCが届いたので、gitをインストールしてみました。

https://proengineer.internous.co.jp/content/columnfeature/6893
（このサイトの通りに進めました。自分はWindows環境設定のところだけ[Use Git Bash only]に設定）

##Git CMD / Git bash / Git GUIの違いは？

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355640/3d00d819-7fce-9ba5-e37f-33e2dbae7a70.png" width="320px">
この3つが使えるようになりましたが、違いは？と思い調べてみると、
https://codeday.me/jp/qa/20190301/343556.html
に記載がありました。

・Git CMD：gitコマンドを使用した通常のWindowsコマンドプロンプト
・Git Bash：Windows上でbash環境をエミュレート(**Unixコマンド使える！**)
・Git GUIはコマンドラインに触れることなくGitを使用可能

みたいですね。

######※bashとは：
命令を画面に打ち込みコンピュータが命令に従いファイルの操作やファイルの編集、削除といった操作ができるソフトウェア。UnixやLinuxでよく使われています。
git bashは、Gitの機能が搭載されたbashというもの…といったところでしょうか。

Unixコマンドでいろいろ動かしたかったので、Git Bashを使っていこうと思います。

##どんなコマンドが使えるのか？
git bashで使えるコマンド一覧を以下で調べられます。


```
$ ls /usr/bin
```
すると、以下のようにファイル一覧が見れます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355640/d6c99ef1-1d8d-89c2-8be8-81ebb1c50680.png" width="500px">

●●●.exeは、●●●をコマンドラインに打つと実行されます。

あれ。。。よく使うコマンドの一つ、"cd"がないのはなぜだろう。。。
この疑問と、/usr/bin・/bin・~/binの違いについては、また次回。
開発者向けオプションを使いこなせ

開発者向けオプションでデバッグ時に使うと便利?なものを紹介します。  


## スリープモードにしない  

充電中にスリープモードにしないようにできます。
デバッグ中にスリープモードにしたくないときは有効にしておきましょう。  

## 実行中のサービス  

サービスの一覧を確認、プロセスの停止ができます。

  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/f4c0248c-cac4-f520-5376-48f7f2863ba5.png" width="40%">



Android 4.x までは普通に設定の項目にありましたね。  

## システム UI デモモード  

ステータスバーの時刻やバッテリー情報を固定することができます。
ストアのスクショを撮る際にこれを使うとステータスバーの情報を揃えることができます。  


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/243070a9-2318-12dc-acfa-aac2a7d4d667.png" width="40%">



## クイック設定開発者用タイル  

クイック設定タイルにデバッグでよく使われるであろう項目を表示することができます。 
例えば、"レイアウトの境界を表示" というのを置いておけば、設定アプリを開かずともレイアウトの境界の表示の切り替えができます。  

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/d5b331d9-987d-34e3-fcc4-34af9e14f315.png" width="40%">


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/1b73cd34-5112-71f7-6d11-2a59230427b4.png" width="40%">


## タップを表示  

タップしたところに白丸が表示されるようになります。 
デバッグ時には使われないかもしれませんが、画面録画の時にタップされてる箇所が表示されるのでわかりやすくなります。  


## レイアウトの境界を表示  

margin や padding を確認することができます。
最近は [Hyperion](https://github.com/willowtreeapps/Hyperion-Android)  があるのでこちらを使うことが少し減ってきてる?  

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/0e3b5407-02c6-763c-e3be-0eab05ee1776.png" width="40%">




## 最小幅  

端末の横幅の dp を変更することができます。
最小は 320 dp にまでできるので、画面サイズが小さい端末でもレイアウト崩れがないかの確認をすることができます。  

## ディスプレイ カットアウト  

Android 9.0 からの項目で、擬似的なノッチを表示することができます。
下ノッチの項目ももちろんあります。  

## GPUオーバードローをデバッグ  

View の描画がネストされている箇所を確認することができます。
不要な background の塗りつぶしはパフォーマンス低下になるのでこれで確認しましょう。  

[参考](https://developer.android.com/studio/profile/inspect-gpu-rendering#debug_overdraw) 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/346fe840-9815-0046-66c7-4de03571e42e.png" width="40%">

## フォースダークのオーバーライド  

Android 10 で追加されました。
アプリの実装に関係なく、ダークテーマが設定されている時に強制的にアプリをダークテーマを適用させます。
`forceDarkAllowed`を適用するか実装するか決めるときの参考や、眩しいときに使えます。
 

## 色空間シミュレート  

色弱者の色の感じ方を再現することができます。
これを有効にしてボタンの境界やテキストがわかりにくければ色を変えましょう。  

(色空間シミュレート てスクショには反映されない…)


## アクティビティを保持しない  

アプリがバックグラウンドに遷移するとメモリが解放(プロセスは残る)されます。
きちんと Activity が破棄され、復帰した時にクラッシュしないように実装しましょう。
2019-10-10 WRF > GFS v15.1 > num_metgrid_levelsが32層から34層に変更 > 2019年6月12日以降のデータ

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
```

WRF (Weather Research and Forecasting Model)関連。

### WRF > ./read.exeにてエラー

WPSで処理したデータを使ってWRFを実行しようとしたところ、`./real.exe`においてエラーが出た。

下記はrsl.out.0000の後ろの部分。

```
d01 2019-06-14_00:00:00  input_wrf.F: SIZE MISMATCH:  namelist num_metgrid_levels           =           32
d01 2019-06-14_00:00:00  input_wrf.F: SIZE MISMATCH:  input file BOTTOM-TOP_GRID_DIMENSION  =           34
d01 2019-06-14_00:00:00 ---- ERROR: Mismatch between namelist and input file dimensions
NOTE:       1 namelist vs input data inconsistencies found.
-------------- FATAL CALLED ---------------
FATAL CALLED FROM FILE:  <stdin>  LINE:    1284
NOTE:  Please check and reset these options
-------------------------------------------
```

`num_metgrid_levels`の定義が変わっている。

### 前回の変更

- [2016-11-09 WRF > GFS next major version > num_metgrid_levelsが27層から32層に変更 > 2016年5月17日以降のデータ](https://qiita.com/7of9/items/4cd19f98ab126e748dd7)


### 今回の変更

- https://www.wrfems.info/viewtopic.php?t=1308

>  If you do not use the supplementary pressure level data, num_metgrid_levels will change (from 32) to 34 with the new data. 

### まとめ

2019年6月12日以降のデータ(GFS v15.1)においては、num_metgrid_levelsが32層から34層に変更されている。
WRFのnamelist.inputについても34にする必要がある。
Udemy 「Unityゲーム開発入門」講座受講ノート　4 - 20 関数（メソッド）の作成と応用

#20. 関数（メソッド）の作成と応用

プログラム：関数（メソッド）の集まり
関数：処理をまとめた便利道具
必要に応じて呼び出して使う




###関数の作成


**void 関数名()
{
　　関数の処理;
}**

```csharp

    void SampleNameFunction()     //戻り値なし　引数なし
    {
        Debug.Log("フクちゃん");
    }
```

###関数を呼び出す

**関数名();**

```csharp

    void Start()
    {
        SampleNameFunction();
        SampleNameFunction();   //何回でも呼び出せる
        SampleNameFunction();
    }
```
フクちゃん
フクちゃん
フクちゃん

###関数の特徴

(input)
データを受けとる：引数
↓
処理する
↓
(output)
return：戻り値


###引数のある関数

**void 関数名(引数の型 引数の変数名)
{
　　関数の処理;
}**


```csharp
    void SampleNameFunction(string SampleName)    //引数　SampleName
    {
        Debug.Log(SampleName);
    }
```
###引数のある関数の呼び出し
関数名(引数a);
関数名(引数b);
　　.
　　.

```csharp
    void Start()
    {
        SampleNameFunction("フクちゃん");
        SampleNameFunction("ルルちゃん");  
    }
```
フクちゃん
ルルちゃん

:interrobang:
作成したときに指定した数の引数を入力できる

```csharp
    void Start()
    {
        SampleNameFunction("フクちゃん","ルルちゃん");
    }

   void SampleNameFunction(string Name1,string Name2) 
    {
       Debug.Log(Name1 + "と" + Name2);
    }
```
フクちゃんとルルちゃん

###戻り値のある関数

**戻り値の型 関数名(引数の型 引数の変数名)
{
　　関数の処理;
　　return 戻り値;
}**

関数に戻り値がある場合、void型ではなく、戻り値の型にする
**return ～**で戻り値を返す


```csharp
    string SampleNameFunction(string SampleName)    //引数　SampleName
    {
        Debug.Log(SampleName);                      //処理のログ
        return SampleName + "ちゃん";               //戻り値
    }
```
###戻り値のある関数の呼び出し
型 戻り値を入れる変数 = 関数名(引数a);
型 戻り値を入れる変数 = 関数名(引数a);


```csharp
    void Start()
    {
        string name1 = SampleNameFunction("フク");   //戻り値を変数に入れる
        string name2 = SampleNameFunction("ルル");  
        Debug.Log(name1);                           //戻り値を表示
        Debug.Log(name2);
    }
```
フク
ルル
フクちゃん
ルルちゃん


四則演算

```csharp
    int SampleAddFunction(int a, int b)
    {
        return a+b;
    }
```
呼び出し


```csharp
    void Start()
    {
        Debug.Log(SampleAddFunction(10, 2));
    }
```
12

:interrobang:
※上の例はDebug.Log()の中で、SampleAddFunction()を使っているということ？
※書き換え

```csharp
    void Start()
    {
        int result = SampleAddFunction(10,2);
        Debug.Log(result);  
    }
```
12


※この場合は、出力される順番が違う

```csharp
    void Start()
    {
        Debug.Log(SampleNameFunction("フク"));
        Debug.Log(SampleNameFunction("ルル"));
    }
```
フク
フクちゃん
ルル
ルルちゃん


-------------------------------------------------------------------------
##教材
**Udemy Unity ゲーム開発入門：インディーゲームクリエイターが教えるマリオのようなゲームを作成する方法**
https://www.udemy.com/course/studio_shimazu_sideview_action/
VirtualBoxにおけるネットワークアダプタの接続タイプと接続先の組み合わせ

VMware で作られた VMDK を VirtualBox で流用する際、ネットワークの設定でちょっとまごついたので、以下にまとめておきます。

# 環境・条件

- 母艦 OS : Windows 10 Home （ESXi 等はなし）
- VMware Workstation Player 15 for Windows
- VirtualBox 6.0.12 for Windows（通常は vagrant 経由で操作）
  - VMware と VirtualBox は、マネージャー自体は同時起動可能。
  - 仮想マシンについては、先に動かしたほうがリソース(VT-x / AMD-V)を専有するため同時使用は不可の模様。
- ネットワーク環境：無線ルータ配下に複数ノードがある、典型的な一般家庭
- 仮想マシン(CentOS7) は IP 自動取得の設定になっている

# 実験結果


| 仮想化ソフト | 接続タイプ | 接続先（名前）                      | CentOS7<br>接続名   | CentOS7<br>デバイス名 | IP取得<br>(DHCP) |
|:-----------|:-----------|:------------------------------------|:--------------------|:----------------------|:-----------------|
| VMware     | ブリッジ   | 自動（全選択）                      | ens33               | ens33                 | 可能(*1)         |
| VirtualBox | NAT        | （指定不可）                        | 有線接続 1<br>ens33 | enp0s3<br>--          | 可能(*2)         |
| VirtualBox | Hostonly   | Hostonly  (*3)                      | 有線接続 1<br>ens33 | enp0s8<br>--          | 可能(*1)         |
| VirtualBox | ブリッジ   | Hostonly  (*4)                      |                     |                       | 起動不可         |
| VirtualBox | ブリッジ   | Intel(R) Dual Band<br>Wireless-AC 3168 | 有線接続 1<br>ens33 | enp0s3<br>--          | 可能(*5)         |



- (*1)‥VirtualBox の Host-Only Ethernet Adapter を司る DHCP サーバ（下記画面参照）が、192.168.56.101 から順に割り当てる。アドレス範囲は [ツール]＞（設定したい）VirtualBox Host-Only Ethernet Adapter の [プロパティ]で設定可能。
- (*2)‥母艦や他ホストから仮想マシンへはアクセス不可。
- (*3)‥Host-Only Ethernet Adapter が複数ある場合は “#” が付いてないもの（最初に生成した仮想デバイス）
- (*4)‥「アダプタのタイプがブリッジではない」という意味のエラーが出て、仮想マシンが起動できない（VirtualBox がガードしている）。
- (*5)‥（自宅の環境ではこの先にある）無線ルータがIPを割り当てている。

### VirtualBox Host-Only Ethernet Adapter の DHCP サーバ設定

![VirtualBox-Manager.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47305/811d1a42-0584-544e-2e8d-80952df8b666.png)

### 備考

VMware で定義されていた ens33 は単なる接続名の残骸として残り、新たに「有線接続 1」という接続が作られている。それに関連づくデバイス名は接続タイプによって変わる模様。

VMware/VirtualBox のコンソールから接続する場合、nmcli 等で現れる接続名が日本語だと文字化けして地味にツライです。
#Mac の #iterm で三本指ドラッグができなくなった件

# こいつ

![image](https://user-images.githubusercontent.com/13635059/66538833-033a0580-eb61-11e9-973b-2319efca93b4.png)

- 他のアプリケーションでは引き続き三本指ドラッグが有効。
- 原因不明

# 対策

なぜかトラックパッド押し込みでのドラッグは可能なので iTerm2の時だけ、そちらを使う。



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2573








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Gitコマンドメモ

### ファイルをキャンセルする場合

```bash

git rm --cached ファイル名
```

### ディレクトリをキャンセルする場合

```bash

git rm -r --cached ディレクトリ名
```

### 日本語ファイル名を表示できるようにする

```bash

git config --local core.quotepath false
git config --global core.quotepath false
```

### なんかミスった時
```bash

# コンフリクトを編集する前にマージを取り消し
git merge --abort
# コンフリクトを編集した後のマージを取り消し
git reset --hard HEAD
# コンフリクトを解消してマージ完了後に取り消し
git reset --hard ORIG_HEAD
```

### 直前のreset --hardを取り消したい
```bash

git reflog -n 5
git reset --hard "HEAD@{1}"
```

### 特定のファイルを元に戻したい
```bash

git checkout コミットID ファイルパス
```

### 別のブランチの特定のファイルを取り込みたい
```bash

git checkout ブランチ名 ファイルパス
```

## サーバーにGitデプロイ環境を設定（例としてエックスサーバー）

```bash

$ cd ~/hogehoge.com/public_html
$ git init
$ git add .
$ git commit -m "first commit"
```

```bash

$ cd ~/hogehoge.com/
$ git clone --bare --shared ~/hogehoge.com/public_html hogehoge.com.git
Cloning into bare repository 'hogehoge.com.git'...
done.
```

```bash

$ cd hogehoge.com.git/hooks
$ vi post-receive
```

```bash

#!/bin/bash

cd ~/hogehoge.com/public_html
git --git-dir=.git pull ~/hogehoge.com/hogehoge.com.git master
```

```bash

$ chmod +x post-receive
```

```bash

$ git clone xsrv:~/hogehoge.com/hogehoge.com.git
```
public_html  以下を chown -r したら、シンボリックリンク先が 403 Forbidden になった

たとえば、ファイルサーバとかを

/mnt/file_server_a
/mnt/file_server_b
...

とnfsでマウントして、さらに

ln -s /mnt /var/www/public_html/mnt

みたいにしてモリモリ使ったりする

その後
「あっなんかファイルユーザと実行ユーザちゃんと合わせよー」
とかいって

chown -r hoge:fuga ./public_html/*

とかしちゃうと、/mnt 以下が forbidden になっちゃう

chown -r だと、リンク先の所有者はそのままだけど、シンボリックリンクの所有者が変わる

シンボリックリンクに対して chown すると、リンク先が変更される
シンボリックリンクの所有者を変更したいときは chown -h とする

シンボリックリンクの所有者が一般ユーザで、/mnt が root:root とかだとみれなくなっちゃう
GKE(ingress)配下のNginxでClinet IPアドレスを取得する方法

# 概要
GKE上にNginxのpodを起動し、起動したNginxでIPアドレスによるアクセス制御するという要件があり、
その時にいろいろハマったのでご紹介。

# 何にハマったのか？
構成は、

```
Client -> Ingress -> (NodePort) -> Nginx(pod) -> GAE（アプケーション)
```

という構成です。

Nginxのログはデフォルトだと`remote_addr`を使ってクライアントIPを出力するようなのですが、
アクセスログを見ると、`remote_addr`がClientのIPアドレスではなく、何やらPrivateなIPアドレスが表示されています。
この時点では、なんとなく`X-Forwarded-For`の設定を入れればいいかなー？と思っていたのですが、
それだけではなかったというお話です。

# 調査結果
調査を進めると、LoadBalancer配下のNginxがClientIPアドレスを取得する方法が出てきました。
[GCP HTTP(S) load balancing 配下のnginxでクライアントIPを取得する方法](https://kazeburo.hatenablog.com/entry/2017/02/21/094740)

`remote_addr`や`x-forwarded-for`については、以下のブログが分かりやすかったです。
[remote_addrとかx-forwarded-forとかx-real-ipとか](https://christina04.hatenablog.com/entry/2016/10/25/190000)

上記を参考にNginxを設定しても、NginxがクライアントIPアドレスを取得できません。
ずっとNginxの設定ばかりみていたのですが、実はIngressとNginxに間にある`NodePort`の設定が原因でした。

## NodePortのexternalTrafficPolicyについて
NodePortはWokerノードに到達したパケットをロードバランスする機能があるようです。
その設定は、`externalTrafficPolicy` で設定可能で、

* cluster(デフォルト)
* local

が設定できます。


## externalTrafficPolicy Clusterモード
デフォルトの設定です。
[こちら](https://thinkit.co.jp/article/13738?page=0%2C1)の文献によると、

> NodePortではノード上のNodePortに到達したパケットは、さらにノードをまたいだPodへもロードバランシングされる形となっています。

とあります。
このパケット転送を行う際、各Wokerノードで起動している`kube-proxy`がSNATで`Srouce IP Address`と`Destination IP Address`が書き換えられ、ロードバラシングしてるようです。

**今回、 この`Srouce IP Address`の書き換えによって、ClientIPアドレスの取得できませんでした。**

以下、参考文献をご紹介。

[Source IP for Services with Type=NodePort](https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-type-nodeport)


# externalTrafficPolicy localモード
一方、`local`モードでは、パケットはバラシングされません。
`Clusterモード`の場合、パケットを転送する分ホップ数が増えるため、結果レイテンシーが増えます。
しかし`localモード`は、当該ノード到達後にノードをまたいだロードバランシングを行わず、当該ノードのPodにパケットを転送しようとするため、`Clusterモード`と比較して早いようです。
よって、当該ノードに該当するラベルのPodが存在しない場合は、レスポンスを返すことができなくなりエラーが返ります。
**`localモード`を使用する際は、全ノードへPodがデプロイされる`DaemonSet`が必須** ということになります。

# まとめ
externalTrafficPolicyが`Cluster`モードで動いている場合、
`Client -> Ingress`とリクエストが流れきて、ingressが各Wokerノードにリクエストをロードバランスする。
さらにロードバランスした先のWokerノードで起動している`kube-proxy`によって、各Pod間でロードバランスされる。
この際、負荷分散対象となるPodは、NodePortでラベル指定しているPodが対象となり、そのIPアドレスは、NodePortの`Endpoints`に登録してある。
と理解しました。（間違ってたら指摘してください）

NodePortと一言で言っても裏ではいろんな仕組みが動いているし、そもそもその概念を理解するのが難しい。
なんとなく動いちゃってるから普段は意識しないが、こうやっていろいろ調べてみると勉強になる。

## 参考文献
この記事は以下の情報を参考にして執筆しました。
[KubernetesのDiscovery＆LBリソース（その1）](https://thinkit.co.jp/article/13738?page=0%2C1)
[GKE/Kubernetes でなぜ Pod と通信できるのか](https://qiita.com/apstndb/items/9d13230c666db80e74d0#clusterip-service)
[ネットワークの概要](https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview)
[Source IP for Services with Type=NodePort](https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-type-nodeport)
【備忘】vagrant上のLinuxにDockerのインストール

# Dockerのインストール
[Install Docker on CentOS 7](https://qiita.com/ymasaoka/items/b6c3ffea060bcd237478)

## 公式リポジトリのインストール
```
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

## DOCKER CE のインストール
```
yum install -y docker-ce docker-ce-cli containerd.io
```

## Dockerの起動と自動起動設定
```
systemctl start docker
systemctl enable docker
```

## Hello World
```
docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```
別アセンブリのパブリックではない抽象クラスのパブリックではないオーバーロードしているメソッドを呼ぶ

# 別アセンブリのパブリックではない抽象クラスのパブリックではないオーバーロードしているメソッドを呼ぶ

なんでこんなにややこしいものを、ややこしいまま呼ばないといけないかって、手を入れずに単体テストを追加したいからですが……. 書いたやつ出てこい! (時間が無い中、新人が書いたスパゲティコードを最低限だけ直した8年前の私なんですが)

リフレクションするコードをググると `Assembly.GetExecutingAssembly` を使う例が多いですが、当然別アセンブリなので使えません. とりあえず `Assembly.LoadFrom` で動いたのでよしにしましたが、なんかダサいですね、ファイル名を渡してるし.

抽象クラスはインスタンス化できないので、派生クラスを `new` するわけですが、派生クラスにはメソッドが生えていないので、結果として抽象・派生両方の型情報を引っ張る必要があります.

`Type.GetMethod` するとき、対象が `static` メソッドでなかったり、`public` メソッドでなかったりするときは `BindingFlags` の指定が必要なようです. また、オーバーロードしている場合は、一意になるように引数の型情報を指定する必要があります. また、当然ですが、生えている抽象型の方で `GetMethod` します.

`MethodInfo.Invoke` するときは、派生型のインスタンスを渡します.

以上をまとめると以下のようなコードになります.

```Class1.cs
namespace ClassLibrary1
{
    abstract class Class1
    {
        protected string Method1(string s1)
        {
            if (s1.StartsWith("A") || s1.StartsWith("B"))
            {
                return "ABC";
            }
            return null;
        }

        protected string Method1(string s1, string s2)
        {
            if (!string.IsNullOrEmpty(s2) && s2.Length == 3)
            {
                return s2;
            }
            return Method1(s1);
        }
    }

    class Class2: Class1
    {
    }
}
```

```Program.cs
using System;
using System.Reflection;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = Assembly.LoadFrom("ClassLibrary1.dll");
            var t0 = a.GetType("ClassLibrary1.Class2");
            var o = Activator.CreateInstance(t0);
            var t1 = a.GetType("ClassLibrary1.Class1");
            var mi = t1.GetMethod("Method1", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, null);
            Console.WriteLine(mi.Invoke(o, new object[] { "A" }));
            Console.Read();
        }
    }
}
```
【備忘】Linux(CentOS7) 最初にやること

# vagrant上のcentOS7の初期設定

## Locale設定
```
localedef -f UTF-8 -i ja_JP ja_JP //UTF-8 jpの追加
localectl list-locales | grep -i ja　//追加の確認
localectl set-locale LANG=ja_JP.utf8 //Localeの設定
localectl set-keymap jp106 //キーマップ設定
localectl set-keymap jp-OADG109A //キーマップ設定
source /etc/locale.conf //再読み込み

localectl status //確認
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp-OADG109A
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

[VirtualBox上のvimから抜けられなくなった話](https://qiita.com/sota/items/e1c63e42425212264ecd)

## Vim
```
yum -y install vim-enhanced //インストール
vim /etc/profile //最終行に以下赤字部分を追加
alias vi='vim'
```

## digのインストール
```
yum -y install bind-utils←bind-utilsのインストール
```

## SELinuxの無効化
```
vim /etc/selinux/config //下記をdiasbledにする
SELINUX=disabled
```
[CentOS 7のインストール後におこなうLinuxの基本設定 13ポイント](https://www.rem-system.com/linux-first-setting/)
Python3の勉強まとめ Part.2

# print関数その2
## インデックスでの出力文字の指定方法
例えばtest = "python"と入力してtestという変数に"pythonを代入する。
<pre>例.print(test)　→ python</pre>
と表示される。
pythonという文字列の中の特定の文字だけを出力させるには、
<pre>print(test[数値])</pre>と入力する。
文字は先頭に0の数値が割り振られており、右に向かって1ずつ増える。

pythonのうちpだけを表示させたい場合は
<pre>print(test[0])</pre>
と入力する。

複数の文字をまとめて出力させるには
<pre>print(test[(数値):(数値)])</pre>と入力する。
pythとだけ出力させたい場合は
<pre>print(test[0:4])もしくはprint(test[:4])</pre>と入力する。(0は省略可能)

なお、数値にはマイナスの値も入力することができ、例えばoだけを出力させたい場合は
<pre>print(test[-2])</pre>と入力する。マイナスの値を入れる場合は、プラスの場合とは異なり右端の数値が-1からカウントされる。

####インデックスで文字を代入させることはできない
pythonの文字列のうち、例えばthonをcharmに変更させたいという場合。
<pre>test[2:] = "charm"
print(test)     → error!</pre>
となる。
どうしても変えたい！という場合は
<pre>test = test[:2] + "charm"</pre>
というふうに、上書きさせる形になる。
####インデックスの補足
例えば
<pre>//test = pythonのとき
n = len(test)
print(len)     → 6</pre>という風に、lenを使うとインデックスの大きさを知ることができる。

##文字のメソッド
####startswith
例えば<pre>s = "My name is Yoshi.Hi,Yoshi."</pre>という変数を作成する。
このとき、<pre>start = s.startswith("My")</pre>と、新たに変数を1つ追加する。
このstartをprintで出力させると
<pre>print(start) = True.</pre>
と出力される。
つまり、sという変数が"My"という文字列で始まっているかを確認し、正しければTrue,誤っていればFalseを返す。
####find
さきほど作成した変数sの中で、Yoshiという文字列がどこにあるかを調べることができる。
例えば
<pre>print(s.find("Yoshi"))     → 11</pre>
と返される。
このとき、先頭から数えて(空白も含めて)"Yoshi"という文字列は先頭から11番目にあるということを示唆する。
####rfind
sという変数には"Yoshi"という文字列が2個含まれているため、2個目の"Yoshi"が先頭から何番目に含まれているかを確認したい場合に使用する。
<pre>print(s.rfind("Yoshi"))     → 20</pre>となる。
####count
特定の文字列が変数の中にいくつ含まれているかを確認することができる。
<pre>例.print(s.count("Yoshi")     → 2</pre>
####capitalize
先頭の文字だけ大文字にし、残りはすべて小文字で出力する。
<pre>例.print(s.capitalize()) → "My name is yoshi.hi,yoshi."</pre>
####title
すべての文節の頭文字を大文字にする
<pre>print(s.title()) → "My Name Is Yoshi.Hi,Yoshi."</pre>
####upper
すべての文字を大文字にする
<pre>print(s.upper()) → "MY NAME IS YOSHI.HI,YOSHI."</pre>
####lower
upperの小文字版。正直使うのか怪しい気がする....？笑
<pre>print(s.lower()) → "my name is yoshi.hi,yoshi."</pre>
####replace
文字を別の文字に置き換える。
<pre>print(s.replace("Yoshi","John")) → "My name is John.Hi,John."</pre>
先ほど確認したインデックス指定での文字列代入と同じようなことができるが、
replaceだと特定の箇所だけでなくすべての文字が一斉に変わってしまうため注意が必要。

今回はいったんここまで！
DockerとphpenvでEC-CUBEをローカルで起動する

## 前提

- [phpenvで5.6と7.2の開発環境を準備する](https://qiita.com/kazumiiiiiiiiiii/items/acc57a71783f39cc853c)

## 結果

問題なし！

## 参照にした記事

- [EC-CUBE 4.0 開発ドキュメント
](http://doc4.ec-cube.net/quickstart_install)

## 環境情報

### 開発環境

- Homebrew 2.1.12
- Docker 2.0.1.3
- PHP 7.2.20
- Postgres 9.3
- schickling/mailcatcher latest
- composer 1.8.4

### ポート構成

|サーバー|ポート|
|---|---|
|PHP Builtin Server|8000|
|Postgres|5432|
|schickling/mailcatcher|1025,1080|

## 手順

### Dockerで必要なサーバーを立てておく

##### 1. mailcatcher

```shell
docker run -d -p 1080:1080 -p 1025:1025 --name mailcatcher schickling/mailcatcher
```

##### 2. PostgreSQL

```shell
docker run --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres:9.3
```

### EC-CUBEをインストールする

##### 1. GithubのEC-CUBEをクローン

```shell
git clone https://github.com/EC-CUBE/ec-cube.git
```

##### 2. 以下、記事をコピペで進めたい場合は、以下の手順を参考にインストール先をexport

```shell
export ECCUBE_PATH=$(pwd)/ec-cube
```

##### 3. PostgreSQLのバージョンを確認しておく

`docker ps` コマンドで、稼働中のPostgresSQLのCONTAINER IDを確認。

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
bc3b4e463249        postgres:9.3        "docker-entrypoint.s…"   10 days ago         Up 22 hours         0.0.0.0:5432->5432/tcp              postgres
```

CONTAINER IDを確認したら、以下のコマンドでバージョンを確認。

```
docker exec -it bc3b4e463249 psql --version
```

##### 4. `.env` を作成し、設定する

```
cd $ECCUBE_PATH
cp .env.dist .env
vi .env
```

以下の３箇所を設定。

```
# DBをPostgreSQLに指定
#DATABASE_URL=sqlite:///var/eccube.db
DATABASE_URL=postgres://postgres:password@127.0.0.1/eccube_db

# DBのバージョンを設定
#DATABASE_SERVER_VERSION=8.0.16
DATABASE_SERVER_VERSION=9.3.25

# MAILERをmailcatcherに指定
#MAILER_URL=null://localhost
MAILER_URL=smtp://127.0.0.1:1025
```

##### 5. EC-CUBEをインストールする

```
cd $ECCUBE_PATH
composer install
bin/console eccube:install 
```
*※ Composerをインストールしていない場合は、 `brew install composer` でインストールしておく*
*※ `.env` で指定した値で進んでいくので、Enterで答えていく*
<img width="852" alt="スクリーンショット 2019-10-10 14.56.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463117/4e327840-00a3-59f1-2173-eeb77cb4ced2.png">

##### 6. ビルトインサーバーを立ち上げてみる

```
php -S 127.0.0.1:8000 -t $ECCUBE_PATH
```
<img width="1192" alt="スクリーンショット 2019-10-10 15.02.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463117/f46b4263-0b89-9210-c136-0404a1117557.png">
Docker仕組みを大雑把に説明する

Linuxﾁｮｯﾄﾜｶﾙ人向けのDocker入門です。
Dockerの基盤部分には大きく分けて次の3つの機能があります：

- コンテナの起動
- コンテナの構築
- コンテナの配布

-----

コンテナの起動（リソースの管理）
--------------
- `chroot`とよく似ている
  - ルートが変更されるのでそれより外のファイルシステムにはアクセスできない
  - OSの管理している他のリソース（CPU、メモリ、ブロックI/O、ネットワークなど）の制御はできない
- これらを管理する機構を提供してくれるLinuxカーネルの機能がcgroup
    - dockerはこれらLinuxの仮想化機能を簡単に使えるようにするためのラッパー
- ルートを変更するディレクトリはdockerがファイルシステムをまとめてダウンロードする
    -  `/var/lib/docker` 以下のどこかに用意してくれる
    - aufs/overlayfs/btrfsでそれぞれ微妙に異なる

-----

コンテナの起動（起動オプション）
--------------

```
docker run --interactive --tty ubuntu /bin/bash
```

として起動すると

- `ubuntu`イメージを取得し（どうやって取得するかは次の節で説明します）
- TTYを割り付け
- 対話的にイメージ内の`/bin/bash`を起動します。

----------

コンテナの起動（権限）
--------------

- コンテナプロセスはコンテナデーモンの権限（通常Root）で実行される
    - ファイルシステムに書き込むと当然Rootとして書き込む
    - セキュリティ的に危険が危ない
- 起動時にプロセスのUID/GIDが指定できる

```
docker run -it --user $(id -u):$(id -g) ubuntu /bin/bash
```

- UID=1000とかでコンテナ内で`/usr/bin`にインストールしようとして権限が無くて死ぬ
- ホスト側の`UID=1000`とコンテナ内の`UID=0`を対応させたい = subuid/subgid

----

コンテナの配布（レジストリ）
-------------

- Dockerにはコンテナのファイルシステムをまとめて配布する機能がある
- コンテナを配布するサーバーの事をコンテナレジストリと呼ぶ
    - docker本家 `docker.io` の他に `quay.io` も有名
    - GitLabにも付属してるし、AzureやGCPはアカウント毎に作れる
    - dockerで簡単に構築できる
- 個々のコンテナは`[registry name]:[port]/[container name]:[tag]`の形式で一意に指定される

```
docker pull myregistrydomain:port/foo/bar:latest
```

------

コンテナの配布（命名規則）
-------------

- 慣習として`user_name/container_name`のようにアカウント名・グループ名と個別のコンテナ名でつける
    - あるいはもっと深く `group_name/team_name/task1` のようにつける
- 省略することも出来て以下のデフォルト値になる
    - レジストリ: `docker.io` 
    - ポート: HTTPSで通信するので443
    - タグ: `latest`

- 主要なOSや各言語のイメージは特別に`library`という名前空間がある

```
docker pull ubuntu
docker pull docker.io/library/ubuntu:latest
```
------

コンテナの配布（認証）
-------------

- ダウンロードは主にHTTPSで行われ、認証は `docker login` で行う（これも省略すると`docker.io`になる）
  - HTTPはデフォルトで許可されていないので、どうしても必要な場合はSSLを無効化する設定をする

```
docker login myregistry
```

------

コンテナの構築
-------------
- `Dockerfile`という独自の形式にコンテナ構築のためのレシピをシェルスクリプトで記述する
- 典型的には各ディストリビューションや各言語のコンテナの上に必要なライブラリや実行ファイルを追加していく

---------

今回扱わなかった内容
--------------------
- ネットワーク構成周り
    - 私があまり詳しくないので省きました（勉強したら追記します）
- docker-machine
    - Dockerの環境自体を構築するためのツールです。HyperVとかKVM上に仮想マシン作ってDocker環境を用意するとかの機能があります
- コンテナオーケストレーション、Kubernetes
    - コンテナをたくさん使てもっと複雑な事を行うためのレイヤーです
- podman/buildah/skopeo
    - RedHat Enterprise Linuxにも標準搭載されてるコンテナ環境です
    - 上で説明した3つの機能、コンテナ実行・コンテナ構築・コンテナ配布がそれぞれ別プログラムとして提供されています
コマンドプロンプトで部分文字列取得

## はじめに
ある日突然バッチファイルを渡されたけど、

パッと見ぜんぜんわからなかったので調べた時のメモ。

## 部分文字列の取得

### コマンド

```
set FILE=C:\hogehoge.txt
if exist "%FILE%" move "%FILE%" "%FILE:~,-3%bak"
```

### 解説 : ~,-3って何だ？

結論から言えば、部分文字列を取得してhogehoge.**txt**をhogehoge.**bak**にしてるだけだった。
(hogehoge.txtの最初の文字から、最後から3文字分除いた文字列にbakをくっつけている)

以下に書式と、出力した場合の結果をまとめてみた。
お気に入りのものを見つけてほしい。

- `%FILE%` - 変数全体の値を取得

  ```
  C:\>echo %FILE%
  hogehoge.txt
  ```

- `%FILE:~m%` - 変数のm文字目後から、最後までの文字列

  ```
  C:\>echo %FILE:~3%
  ehoge.txt
  ```

- `%FILE:~m,n%` - 変数のm文字目後から、n文字分の文字列

  ```
  C:\>echo %FILE:~3,4%
  ehog
  ```

- `%FILE:~m,-n%` - 変数のm文字目後から、最後からn文字分除いた文字列

  ```
  C:\>echo %FILE:~3,-3%
  ehoge.
  ```

- `%FILE:~,n%` - 変数の最初から、n文字分の文字列

  ```
  C:\>echo %FILE:~,3%
  hog
  ```

- `%FILE:~,-n%` - 変数の最初から、n文字分除いた文字列

  ```
  C:\>echo %FILE:~,3%
  hogehoge.
  ```

- `%FILE:~-m%` - 変数の後ろm文字分目から、最後までの文字列

  ```
  C:\>echo %FILE:~-3%
  txt
  ```

- `%FILE:~-m,n%` - 変数の後ろm文字目から、n文字分までの文字列

  ```
  C:\>echo %FILE:~-3,2%
  tx
  ```

- `%FILE:~-m,-n%` - 変数の後ろm文字目から、最後からn文字分除いた文字列

  ```
  C:\>echo %FILE:~-3,-2%
  t
  ```

- `%FILE:~-m,-n%` - 変数の後ろm文字目から、最後からn文字分除いた文字列

  ```
  C:\>echo %FILE:~-3,-2%
  t
  ```

- `echo %FILE:t1=t2%` - 変数内の文字t1を、文字t2に置換

  ```
  C:\>echo %FILE:ho=fu%
  fugefuge.txt
  ```

## おわりに
何も知らないとほんとにわかんなかったけど、調べてみれば以外に単純。
引数から値を得る shared_context, 引数がなく let で値を得る shared_examples

いつも忘れるのでメモ


## 引数から値を得る shared_context

```ruby
shared_context :validation do |type, expected|
end

include_context :validation, :empty, false
```

## 引数がなく let で値を得る shared_examples

```ruby
shared_examples :validation do
  if expected
  else
  end
end

it_behaves_like :validation do
  let(:expected) { true }
end
```
Chromium Edge を初めからInPrivateブラウズ(プライベート/シークレット)モードで起動するショートカットを作る

2019/10/10現在、[Chromium化されたEdge](https://www.microsoftedgeinsider.com/ja-jp/)がCanary・Dev・Beta版まで出ている。
これがかなり使い勝手もWeb技術のサポートも良く、バグも少ないので、個人的には本家Chromeに次いで利用している。閲覧履歴も設定画面も、コンテキストメニュー(右クリメニュー)もデザインもこっちの方が好きだ。~~正直本家越えしそうで怖い。~~

※注：　記事主がWindowsしか持ってないのでWindows7/10でしかテストできてないぞ。ご容赦を。[Macでの方法はこことかがベースになるのかな](https://aprico-media.com/posts/1627)。

#いきさつ
ブラウザには、閲覧履歴などを保存しない「**プライベートモード**」のようなものが用意されている。この名前がブラウザによってまちまちで、よく使うChromeでは「シークレットモード」(英語版では「Incognito Mode」)、IEや旧来Edgeでは「InPrivateブラウズ」などと呼ばれる。

このモードは、勤め先のPCで利用する時など、**閲覧履歴を隠したい**などの理由で重宝する。しかし、まず普通に起動し、それからメニュー開いていちいちモード切替するのは面倒だ。そのため、起動時に初めからプライベートモードで起動する方法が（公式に認められてるかどうかは知らんが）ネットには載っている。


#【復習】初めからプライベートモードで起動する方法（他ブラウザ）
まず復習がてら、これまでよく使ってきたブラウザを初めからプライベートモードで起動する方法。

1. **デスクトップにブラウザのショートカットを作る**（Windowsだと拡張子`.lnk`とかになる）
2. **ショートカットを右クリック**
3. **右クリメニューから「プロパティ」を開く**
4. **「リンク先」と書かれた欄に`"C:\Program Files\～\～.exe"`と書かれているはずなので、その末尾に起動オプションを書き加える。既存の`～.exe"`を消さずに、その`"`の直後にまず半角スペースを書き、その後に以下を書く。書き替え後は、`"C:\Program Files\～\～.exe" -オプション`のようになる。**
    - Chrome： `--incognito`　（ハイフンの数が違うので注意）
    - Firefox： `-private`
    - IE(お勧めできないが会社で現役)： `-private`
    - 旧来Edge： （旧来Edgeではなんかこの欄がグレーアウトしててできないっぽい）
5. **下の「OK」ボタンを押す。「変更するには管理者の権限(アクセス許可)」云々言われるが、そのまま「続行」。**
6. **タスクバーにピン留めしたショトカも同じようにしたい場合は、まずタスクバーにある既存のショトカを消し、先ほど改変したデスクトップのショトカから開き、それをもう一度タスクバーにピン留め。**（2020/02/05追記: Windows 10 では、6.は不可能のようだ。その代わり、右クリック→「シークレットウィンドウを開く」等を選ぶ必要がある）


---

しかし・・・

「Chromium EdgeもChromiumなのだから、Chromeと同じく`--incognito`でいけるっしょ」ってナメてかかったら、平然と普通のモードで起動された。IEやFirefoxよろしく`-private`でも駄目。ナニィ！？

**Chromium Edgeでは`--incognito`も`-private`も使えない**のだった。
`--private`とか`-incognito`とか試しても当然駄目。


#【解決】初めからInPrivateブラウズで起動する方法（Chromium Edge）

結論から言うと、Chromium Edgeは`--inprivate`が正解だった。
（但し後述するように、タスクバーからの起動も同じようにすることはできないらしい。）

1. （他ブラウザと同じ）
2. （他ブラウザと同じ）
3. （他ブラウザと同じ）
4. **「リンク先」と書かれた欄に`"C:\Program Files\～\msedge.exe"`と書かれているはずなので、その末尾に起動オプションを書き加える。既存の`msedge.exe"`を消さずに、その`"`の直後にまず半角スペースを書き、その後に`--inprivate`と書く。書き替え後は、`"C:\Program Files\～\msedge.exe" --inprivate`のようになる。**
5. （他ブラウザと同じ）
6. （他ブラウザと同じ…？） ※Chromium Edge Betaで試してみると、なぜか**6.は機能しなかった**。これはバグ？→ 2020/02/05追記: Windows 10 では、6.は不可能のようだ。その代わり、右クリック→「新しい InPrivate ウィンドウ」等を選ぶ必要がある。


#あとがき
言われてみれば、Microsoftとしては自社ブラウザのプライベートモードの名称は長年「InPrivateブラウズ」なのだから、英語版Chromeでの名称「incognito」から変更したと考えれば納得できる。
しかし、この名称はIE時代からあるもので、なぜIEと同じく`-private`にしなかったのかは疑問だ。ハイフンは2つに増え、`private`の前に`in`が追加された。

今回発見したこのオプションはググっても情報が見当たらなかったため、Qiitaに残す。

※このオプションは将来**~~Chromium Edgeが正式リリースされるまでに~~変更になる可能性もある**ため、この記事は参考までに見るようにしてほしい。~~Chromium Edgeは現在進行形で開発中だからだ。~~

#追記（2020/01/16）
正式リリース後、正式版で上記を試した所、特に変更は無く、`--inprivate`でいいようだ。
WSLのUbuntu18.04 LTSの超手抜き日本語設定

# はじめに
Windows 10で利用可能なWSLのUbuntu 18.04LTS導入直後は日本語設定されてないので、備忘録として記録しております。

# 超手抜き手順
apt -y install language-pack-ja-base language-pack-ja ibus-mozc
update-locale LANG=ja_JP.UTF-8 LANGUAGE=”ja_JP:ja”

ここで
update-locale: Error: invalid locale settings:  LANG=ja_JP.UTF-8
のエラーが出た場合は
localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
を実施。

update-locale LANG=ja_JP.UTF-8 LANGUAGE"ja_JP:ja"
source /etc/default/locale

以上
plunkerでassembler-simulator その2

#概要

plunkerでassembler-simulatorやってみた。
命令セット調べてみた。


#転送命令

```
MOV reg, reg　　　　　  regA = regB
MOV reg, address       reg = address
MOV reg, constant      reg = constant
MOV address, reg       address = reg
MOV address, constant  address = constant
```

#ビット操作命令

```
AND reg, reg         regA = regA and regB
AND reg, address     reg = reg and address
AND reg, constant    reg = reg and constant
OR reg, reg          regA = regA or regB
OR reg, address      reg = reg or address
OR reg, constant     reg = reg or constant
XOR reg, reg         regA = regA xor regB
XOR reg, address     reg = reg xor address
XOR reg, constant    reg = reg xor constant
NOT reg              reg = !reg 
```

#算術命令

```
ADD reg, reg         regA = regA + regB
ADD reg, address     reg = reg + address
ADD reg, constant    reg = reg + constant
SUB reg, reg         regA = regA xor regB
SUB reg, address     reg = reg + address
SUB reg, constant    reg = reg + constant
INC reg              reg = reg + 1
DEC reg              reg = reg - 1
MUL reg              A = A * reg
MUL address          A = A * address
MUL constant         A = A * constant
DIV reg              A = A / reg
DIV address          A = A / address
DIV constant         A = A / constant
```
#シフト命令

```
SHL reg, reg         reg = reg >> reg
SHL reg, address     reg = reg >> address
SHL reg, constant    reg = reg >> constant
SHR reg, reg         reg = reg << reg
SHR reg, address     reg = reg << address
SHR reg, constant    reg = reg << constant
```

#比較命令

```
CMP reg, reg         flag = regA cmp regB
CMP reg, address     flag = reg cmp address
CMP reg, constant    flag = reg cmp constant
```

#分岐命令

```
JC	        Carry = TRUE	
JNC	        Carry = FALSE	
JZ	        Zero = TRUE	
JNZ	        Zero = FALSE	
JA	        Carry = FALSE && Zero = FALSE	
JNBE            Carry = FALSE && Zero = FALSE	
JAE	        Carry = FALSE	
JNB	        Carry = FALSE	
JB	        Carry = TRUE	
JNAE            Carry = TRUE	
JBE	        Carry = TRUE or Zero = TRUE	
JNA	        Carry = TRUE or Zero = TRUE	
JE	        Zero = TRUE	
JNE	        Zero = FALSE	
```

#コール命令

```
CALL address
RET 
```

#スタック命令

```
PUSH reg
PUSH address
PUSH constant
POP reg
```

#その他命令

```
HLT
```

#補足

レジスタは、4つ。A、B、C、D　8bit。
8bitCPUと256byteのメモリで構成されています。
すべての命令と変数はメモリ内に収まる必要があります。
すべての命令とオペランドは1byteです。
MOV命令は3byteのメモリを使用します。
0xE8から0xFFにメモリマップされたコンソール出力があります。
スタックは、メモリの外の様。

以上。
DictionaryのValue(値)をListにする

#DictionaryのValue(値)をListにする

DictionaryのKeyをstringに、ValueをList<string>にしたかったので以下のように実装しました。

冷蔵庫に入ってるものを種類別に格納しておくようなものを想定。
Listを定義してからDictionaryにAddするのはコードも長くなるのでなるだけ簡潔に追加したいなと思って以下のようにしました。

ローカル以外では初期化できなかった(UnityだけでなくC#も？)ので、publicとして使いたいものを宣言と同時に初期化で値を入れておくことはできないのかな、と思いこういうコードに。
メソッド内の初期化を忘れており、しばらく
`NullReferenceException: Object reference not set to an instance of an object`
で怒られました。

#宣言と追加
```c#:Dictionary_value_list.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Dictionary_value_list : MonoBehaviour
{

    public Dictionary<string,List<string>> MapFridge;

    public void Setmap(){

      //ローカルで初期化
      MapFridge = new Dictionary<string,List<string>>();

      MapFridge.Add("野菜",new List<string>(){"きゅうり","トマト","玉ねぎ"});
      MapFridge.Add("果物",new List<string>(){"みかん","パイナップル","いちご"});
      MapFridge.Add("魚",new List<string>(){"さけ","サバ","はまち"});

    }

}

```

#取得と表示
```c#:Dictionary_value_list.cs
      //Keyを取得して表示
      foreach(string s in MapFridge.Keys){
        Debug.Log(s);
      }
```

コンソールでの表示
![key.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507580/279d1946-893b-c75d-b9e4-74f9eda8d4b4.png)


```c#:Dictionary_value_list.cs
      //Valueを取得して表示
      foreach(List<string> li in MapFridge.Values){
        foreach(string s in li){
            Debug.Log(s);
      }

```
コンソールでの表示
![value.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507580/26a8ae35-960d-9b4c-6dec-47024da2edc3.png)


```c#:Dictionary_value_list.cs
      //KeyとValueのPairを取得して表示
      foreach(KeyValuePair<string,List<string>> item in MapFridge){
        Debug.Log(item.Key+"はこれがあります");
        foreach(string s in item.Value){
          Debug.Log(s);
        }
      }

```
コンソールでの表示
![both.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507580/a696f867-956b-0e71-5286-a5a1eafa61dc.png)



ValueはListなのでさらにその中の要素に対してforeach。
Debug.Logはデフォルトで改行されちゃうので、同一行に出力したいときにfor文とか回してしまうと必ず改行されちゃうのが不便。
どうしても改行したくないときは、stringに連結していって最後に表示するとか。

一要素だけ取り出すときにはKeyを指定するしかなさそう。
Raspberry Piのイメージをバックアップ＆リストア（MacOS)

## 対象となるDiskを特定
``` sh
diskutil list
```
## backup
``` sh
diskutil umountDisk /dev/diskN #Nのところは、diskutil listで表示確認
sudo dd if=/dev/disk3 of=newfile.img bs=32m
```

bs(block size) は、4mでも速度に差があまりないかも。

## restore

```
sudo dd of=/dev/rdiskN if=newfile.img bs=32m
```

`of=/dev/diskN` だとやたら時間がかかり終わる気配がなかった。
`of=/dev/rdiskN` にするとはやい。
PCの空き容量が気になる場合は圧縮するのが良いかもだが、割愛。。