OmniAICreator/Qiita-1.07M huggingface dataset:
【個人メモ】bisonbiogemeの導入からMNLのパラメータ推定まで

# はじめに
biogemeを使い始めるまでの個人メモ．あまり日本語の情報，またbisonbiogemeの情報はないので記しておくことにした．
はっきり言って素人なので間違いに注意．

# Biogemeとは
biogemeは離散選択モデルの最尤推定のためのソフトウェア．無料で利用可能．
pythonのパッケージとしても提供されているが，今回はGUIのBisonBiogemeを利用する．

# 導入
[公式webサイト](https://transp-or.epfl.ch/pythonbiogeme/home.html)から入手可能．bisonbiogemeは[Archives](https://transp-or.epfl.ch/pythonbiogeme/archives.html)にある．

最新版は不安定との噂(環境の問題かも？)で，version2.2を利用．
・　biogeme-2.2.tar.gz
・　biogeme-v22.zip
をダウンロード，解凍する．

以降，使用手順を記載するが，HPにあった[document](https://transp-or.epfl.ch/pythonbiogeme/documentation/bisonfirstmodel/bisonfirstmodel.html)にも使い方が解説されているので参照のこと．

## サンプルデータ
[ここ](https://transp-or.epfl.ch/pythonbiogeme/data.html)にサンプルデータがアップされている．今回は上記のdocumentに従ってSwissmetroのデータを利用する．このファイルは.datで，Excel等で開くことができる．

## examples
[Archives](https://transp-or.epfl.ch/pythonbiogeme/archives.html)のversion2.3 examples-v23.zipにはサンプルとなるモデル.mod(インプット)と結果のhtml（アウトプット）がある．
差し当たりの利用には，これを参考にすればよいだろう．

# 起動と使い方の概要
まずはbiogeme-v22/Biogeme_windows/guibiogeme.exeを起動してみる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647345/d5fbb69f-265f-553a-9c90-37b9a2c32d18.png)
起動画面はこんな感じ．
使い方としては，
1. Model spec. fileにモデルとなる.modファイルを選択
2. Data fileにデータファイルを選択
3. Estimateでパラメータ推定
である．
非常にシンプル．なお，Simulateは推定したモデルを用いて推計するときに使う．
ちなみに，modファイルとdatファイルは同じディレクトリにないとダメっぽい．

# Modファイルについて
上記サンプルモデル，01logit.modの中身を概説する．ここにコピペするわけにはいかないので各々で確認すること．

"//"はコメントアウトである．

ModelDescription: アウトプットファイルに記される記述．まあ無くても問題はないだろう．
Choice: 選択モデルなのでCHOICEと入れておく．
beta: 推定するパラメータについて記述する．左から順に，パラメータ名，初期値，下限，上限，パラメータを推定するか固定するかのフラグ．
LaTeX: biogemeでは，アウトプットファイルの中に.texファイルも生成されるのだが，その際に使用されるLATEXの構文．必要がなければ削除可能．
Utilities: 効用関数を記載する．左からID，名称，利用可能性(通常，1なら利用可能，0なら利用不可とする)，効用関数の記述．
Expressions: 上記で使用する変数の記述．右辺には，datファイルと同じように記述する．
Exclude: 除外するデータの記述．falseは0でtrueは1(以上)となるから，この例では，PURPOSEが1でも3でもないか，CHOICEが0であるものを示す．
Model: 推定に用いるモデルを記述．今回は多肢選択ロジットモデルであるから，MNLである．他のモデルだったらbinary probitならBP，nested logitならNLなど．



他にもいろいろ組み込めるらしい．詳しくはこちらの[document](https://transp-or.epfl.ch/pythonbiogeme/documentation/bisonsyntax/bisonsyntax.html)から．

# 実行
まず，modとdatの2種類のファイルを用意．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647345/2b449355-4050-3f5d-c109-df5839564cd9.png)

ファイルを選択，Estimateでパラメータ推定を実行．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647345/4ceaf3c5-7992-1dc6-7adc-ffd8dafaf5dd.png)

実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647345/01fe7ead-3005-f3e9-24d3-1833e84de4ce.png)

Display fileから結果を表示できる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647345/1843a7a7-ec5f-13ea-d185-ca0420906ef8.png)

これと同じ内容がhtmlやtexとして保存される．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647345/cd0df309-c6e8-cb7d-4b24-02fd89496828.png)

.resはSimulateをする際に使うモデルファイル．

# モデルを用いて推計する
次の段階として，ここで得たモデルを使って推計したい，という場合．
上記のパラメータ推定で生成された，推定したパラメータが組み込まれたモデルファイル.resを，.modの拡張子に変え，用いるデータ.datとこのモデルファイルを選択してSimulateすれば.enuファイルとして推計結果が出力される．

# おわりに
まあ，英語がわかるなら公式サイトを見ればよいと思いました(小並感)
Ubuntu 18.04 で Python3 の 仮想環境を作成後VsCodeに認識させてみる

#目的
[Django Girls のチュートリアル](https://tutorial.djangogirls.org/ja/)に従って、Ubuntu 18.04 で Python3 の 仮想環境を作成後VsCodeを立ち上げてみる
・Code RunnerでPython3をキックするように修正する
・仮想環境を作成後 pylint-django をインストールし .vscode\settings.json に追記して有効化する
##Python のバージョンの確認
<pre>
$ python -V
Python 2.7.17

$ python3 -V
Python 3.6.9
</pre>

##Code RunnerでPython3をキックする場合の修正点
修正になったバージョンが不明なのだけど 1.46.1 の時点では以下の手順で修正する
・ファイル -> 基本設定 -> 設定
・検索ボックスに Code-runner:Executor Map を入力する
<pre>
・setting.json で編集をクリックする
 ・修正前
    "code-runner.executorMap": {
    }
 ・修正後
    "code-runner.executorMap": {
        "python": "python3 -u"
    }
</pre>

##必要なパッケージのインストール
※デフォではインストールされていない

<pre>
$ sudo pip3 install virtualenv
</pre>

##仮想環境を作成する

適当なdirを作成後以下を実行する
<pre>
$ mkdir djangogirls
$ cd djangogirls
djangogirls$ python3 -m virtualenv myvenv
</pre>

##仮想環境を有効化する(プロンプトに利用中の仮想環境が表示されるようになる)
<pre>
djangogirls$ source myvenv/bin/activate
(myvenv) djangogirls$ python -V
Python 3.6.9
</pre>

##pylint_djangoのインストール＆有効化する」
<pre>
(myvenv) djangogirls$ pip install pylint-django
</pre>

djangogirls\\.vscode\settings.json に以下を追記する

<pre>
    "python.linting.pylintArgs": ["--load-plugins", "pylint_django"]
</pre>

##VsCodeでの設定
・仮想環境起動後、コンソールから code で vscode を起動する(初回のみ？)
・vscode の フォルダを開くで djangogirls/myvenv を指定
・表示 -> コマンドパレット で Python: Select Interpreter
　から 作成した環境を選択する -> Python 3.6.9 64-bit('myvenv': venv)
・左下のInterpreterのバージョンで選択したバージョンが表示されていることを確認する
　カーソル・オンで ./myvenv/bin/python が表示される

#参考にしたのは以下のサイト
[12. 仮想環境とパッケージ](https://docs.python.org/ja/3.8/tutorial/venv.html)
[venv --- 仮想環境の作成](https://docs.python.org/ja/3/library/venv.html)
[Using Python environments in VS Code](https://code.visualstudio.com/docs/python/environments)
[the extension can not find the path of python from microsoft store](https://github.com/microsoft/vscode-python/issues/10850)
[Linting Python in Visual Studio Code](https://code.visualstudio.com/docs/python/linting)
[VSCode Python Djangoの問題（エラー・警告）に対応する方法](https://wonwon-eater.com/vscode-python-django-lint/)
【Laravel】Email Verification(メール確認)の実装

# 概要
一般的なアプリケーションで会員登録する場合、
　1. 仮登録する
　2. メールにURLが届く
　3. URLをクリックして登録が完了する
という流れがありますよね
これができるようにLaravelのファイルをいじっていきましょう

# 前提
Laravel7で行います
あらかじめAuth機能を使えるようにしておいてください

```zsh
% composer require laravel/ui
% php artisan ui vue --auth
% npm install && npm run dev
```

また、メールが送れるようにconfig/mail.phpや.envファイルを変更しておいてください

# 方法
さすがLaravelさん、こういう時のためにちゃんと用意してあるんですね
なんと、いじるファイルはUser.phpとweb.phpの２つだけ
必要な手順は以下の通り

- マイグレーション
- User.phpの編集
- web.phpの編集

## マイグレーション
```zsh
% php artisan migrate
```
を実行してください
すでに実行している場合は必要ありません
これによって、メール確認に必要なemail_verified_atカラムを含んだusersテーブルが作成されます

## User.php
```php:app/User.php
class User extends Authenticatable implements MustVerifyEmail
```
Userクラスにimplements MustVerifyEmailを追加してください
これに必要なuseはすでに書かれてあります(さすが)
これによって、メール確認に必要な処理(URL生成やメール送信など)が追加されます

## web.php
```php:routes/web.php
Auth::routes(['verify' => true]);
```
Auth::routes()の引数に['verify' => true]を追加してください
これによって、メール確認に関連するルーティングが使用されます

# カスタマイズ
## ページの保護
仮登録や本登録を行うということは、本登録したユーザーだけがアクセスできるページがあるわけです
middlewareにverifiedを指定することで、ルートを保護できます
例を以下に示します

```php:routes/web.php
Route::get('welcome', function() {
        ......
    })->middleware('verified');

Route::group(['middleware' => ['auth', 'verified']], function() {
    Route::get('index', HelloController@index);
    // このようにして保護したいルートをここに書く
}
```

## ビュー
必要なビューは前提で実行したコマンドによって、すでに生成されています
メール確認のビューはresources/views/auth/verify.blade.phpにあります
自分の好きなようにカスタマイズしましょう

## 確認後のリダイレクト
メールアドレスを確認した後、自動的に表示させるページがあるといいですよね
デフォルトでは'/home'にリダイレクトすることになっていますが、これを変更するにためには、VerificationController.phpのredirectToにリダイレクト先を指定してください

RouteServiceProvider.phpのHOMEを変更する手段もありますが、こちらは、他のところでRouteServiceProvider::HOMEを参照している部分も一緒に変更できます

```php:app/Http/Controllers/Auth/VerificationController.php
protected $redirectTo = '/home';
```

```php:app/Providers/RouteServiceProvider.php
public const HOME = '/home'
```

# 日本語化
確認用のメールの内容を日本語化します
まず、以下のコマンドを実行します

```zsh
php artisan make:notification VerifyEmailNotification
```

生成されたVerifyEmailNotification.phpの親クラスをVerifyEmailにし、toMailメソッドを以下のように変更します(オーバーライド)

```php:app\Notifications\VerifyEmailNotification.php
use Illuminate\Auth\Notifications\VerifyEmail;

class VerifyEmailNotification extends VerifyEmail
{
    ...(省略)...

    public function toMail($notifiable)
    {
        $verificationUrl = $this->verificationUrl($notifiable);

        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable, $verificationUrl);
        }

        return (new MailMessage)
            ->subject('メールアドレスの確認')
            ->line('以下のボタンをクリックして、メールアドレスの確認を行ってください。')
            ->action('メールアドレスの確認', $verificationUrl)
            ->line('もし心当たりがなければ、メールを破棄してください。');
    }
}
```

最後に、app\User.phpに以下のメソッドを追加します(オーバーライド)

```php:app\User.php
    public function sendEmailVerificationNotification()
    {
        $this->notify(new VerifyEmailNotification());
    }
```

# おわり
簡単でしたね
[公式ドキュメント](https://laravel.com/docs/7.x/verification)や[Readouble](https://readouble.com/laravel/7.x/ja/verification.html)を読めばいいので、ここで説明する必要なかったかもしれませんが、備忘録ということで書いてみました
Apacheのアクセス制限のちょっとしたメモ

# Apacheのアクセス制限のちょっとしたメモ

```
<Directory "/var/www/html/">
  SetEnvIf X-Forwarded-For "10\.0\.0\.1"    allow
  <RequireAny>
    Require env allow
  </RequireAny>
</Directory>
```

こうすることでロードバランサー通してても
アクセス元のIPアドレスが10.0.0.1からのアクセスは許可！
ってなるかと思いますがいろんなサイト見ていると

```
  SetEnvIf X-Forwarded-For "^10\.0\.0\.1"    allow
```

みたいな記述になっている箇所がありました。
ということは最初に書いたものだと
110.0.0.1と210.0.0.1もアクセスを許可していることに！？

致命的ってほどでもないのですが一応気を付けなくてはというメモでした
JQueryで背景色を判定する

参考記事
[jQueryで単純に色を取得して使おうとしてもうまくいかない](https://syguer.hatenablog.com/entry/2013/12/23/222522)


下記のように"rgm(xx,xx,xx)"としないといけない

```js

if($("#authDisp").css('background-color') == "rgb(255, 165, 0)"){
標準機能だけでWSLを好きな場所にインストールする

# WSLを任意の場所にインストールする方法

インストール先を選べないWSLをWindowsの**標準機能**だけで、好きな場所にインストールする方法のメモ
恐ろしいことに、日本という国ではマイクロソフトの公式ツールであっても、ソフトウェア業務利用認可申請と
インストール申請が必要になり、エンジニアが使えるようになるまで1か月かる企業も存在する。（超無理、超無理）

のでメモを残しておくことにした。

## 必要なコマンド

必要なコマンドはここにある。
https://docs.microsoft.com/ja-jp/windows/wsl/reference

今回使うwslのオプション。

```powershell

--export <Distro> <FileName>

ディストリビューションを tar ファイルにエクスポートします。 標準出力の場合、ファイル名は - でもかまいません。

--import <Distro> <InstallLocation> <FileName>

指定した tar ファイルを新しいディストリビューションとしてインポートします。 標準入力の場合、ファイル名は - でもかまいません。

--list、-l [Options]

ディストリビューションを一覧表示します。

```

### WSLインストール
- [マイクロソフトの公式](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)にのっとって好きなディストリビューションをインストールする。
- インストールしたディストリを初回起動する。

### WSLを確認

```powershell:list.ps1
wsl -l -v 
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
```
### エクスポート

```powershell:exp.ps1
wsl --export Ubuntu-20.04 d:\u20.tar
              ☝リストコマンドで調べたNAMEを入力
```
###  Windowsストアからディストリを削除する。


###インポートする

ここで、任意の場所にインストールするわけだ。

```powershell:imp.ps1
wsl --import Ubuntu-20.04 d:\ubuntu20\ d:\u20.tar
```

D:\ubuntu20フォルダに、ext4なファイルが出来上がると思うので確認してくれ。

### 使えるようにする。

こうして作ったWSLの問題点
1. 起動用ショートカットがない
2. 起動するとデフォルトユーザがroot

以下のような起動用ショートカットを作成する。

```
リンク先:
C:\Windows\System32\wsl.exe -u 初期設定で作ったユーザ -d Ubuntu-20.04

作業フォルダ:
D:\temp
```
便利なショートカットキーまとめ

##ショートカットキーまとめ
###Macでのショートカットキーを忘れないようにまとめています。参考になれば幸いです。
####＊記号詳細
| ⌘ | 「command」キー 
| ⌃ | 「control」キー 
| ⌥ | 「option」キー 
| ⇧ | 「shift」キー 
| ⇪ | 「caps lock」キー
| fn | ファンクションキー 

---------------
| ⌘ + C | 選択内容をクリップボードにコピー 
| ⌘ + X | 選択内容をクリップボードにコピーし、選択内容を削除する 
| ⌘ + V | クリップボードの内容を貼り付ける 
| ⌘ + Z | 最後にした操作を取り消す 
| ⌘ + S | 変更を保存する 
| ⌘ + W | 最前面のウィンドウを閉じる 
| ⌘ + tab | 開いているアプリをリスト表示する（tabを複数回押すと切り替える） 
| ⌘ + F1(※) | 同一アプリの、別ウィンドウに切り替える 
| ⌘ + F | 画面内で文字列を検索する 
| ⌘ + T | 新しいタブを開く 
| ⌘ + N | 新しいウィンドウを開く 
| ⌃ + A（入力時） | その行の先頭に移動する 
| ⌃ + E（入力時） | その行の末端に移動する 
| ⌃ + H（入力時） | 前の文字を１つ消す（deleteと同じ） 
| ⌃ + D（入力時） | 次の文字を１つ消す 
| ⌃ + K（入力時） | カーソルの右側の文字を全て削除する 
| ⇧ + 上下左右（入力時） | 文字を選択・選択範囲を変更する 
| ⌘ + R | 更新 
| ⌘ + ⇧ + Z | 直前に取り消した変更内容をやり直す（元に戻す）
| F11 | デスクトップを表示 
| ⌘ + Q | 最前面のアプリケーションを終了する
| ⌘ + +/- | 画面の拡大/縮小 |

------

##◎ターミナルでの操作
| ↑ | 入力したコマンドの履歴を遡る 
| （入力途中で）tab | 入力補完※ 
| ls | 現在いるディレクトリのファイルを表示する 
| cd XXX | 現在いるディレクトリにある、XXXディレクトリに移動する 
| cd .. | 現在いるディレクトリの一つ上のディレクトリに移動する 
| pwd | 現在いるディレクトリを表示する 

--------

##◎テキストエディタでの操作
| ⌘ + O | ファイル/ディレクトリを開く 
| （ディレクトリを開いている時）⌘ + P | ディレクトリ内でファイル検索 
| （ディレクトリを開いている時）⌘ + B | そのディレクトリのツリー構造を表示/非表示 
| ⌘ + ⇧ + N | 新規ウィンドウを起動 
| ⌘ + F | 検索窓を表示、検索したい単語を入力すると現在のファイルから該当の箇所を表示 
| ⌘ + L | カーソルのある一行を選択（続けて押すと次の行を選択） 
| ⌘ + X | 選択範囲を切り取り 
| ⌘ + D | カーソルにある単語/選択した文字列をファイル内で検索し、選択。複数回押すと複数選択でき、一括編集できる 
| ⌥+ 上下 | カーソル行/選択した行を、行ごと上下に移動する 
| ⌥+ ⇧ + 上下 | カーソル行/選択した行を、行ごとコピーし下に貼り付ける（複製） 
| ⌘ + / | カーソル行/選択した行をコメントアウトする
興味のある論文が公開・投稿されたら通知が届くようにする




# 最新の論文を手に入れて世界の最前線を知る
研究において常に最新情報を逃さず、関連分野で新しくpublishされる論文に常に気を配ることは大切です。
* 自分の行っている研究について、今世界ではどんなことが分かっているのか、はたまた分かっていないのか
* 自分の関連分野のトレンドはどうなっているか
* ラボでのジャーナルクラブで紹介する論文の良いネタはないか

どれも気になる事柄だと思います。
とはいえ、毎日論文検索で関連ワードを検索するのも面倒です。
ここでは、生物学の論文検索に特化した内容を紹介します。
**NCBIのPubMedおよびbioRxivの新着論文アラート機能を使って、自分の興味ある論文がpublishあるいはsubmitされたらメールで通知を受け取れるように設定します**。

# NCBI PubMed
## NCBI PubMedとは？
そもそもこのページにたどり着いた皆さんならご存知でしょう。語らずもがな。省略。

## アカウントの設定
まずNCBIでアカウントを取得します。NCBIトップページ右上の"Sign in to NCBI"もしくはPubMedトップページ右上の"Log in"から行います。
![Screenshot at Oct 30 16-11-03_Fotor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/817ea9d3-bae9-796b-896b-9bbcdeaffa8e.png)

NIHやNCBIのアカウントを取得しても良いですし、Googleアカウントを利用して取得することも可能です。
![Screenshot at Oct 30 16-11-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/eafccb31-8432-972f-d2c9-dca3eedce8b0.png)

## 検索キーワード登録
一度いつも通りの手順で、PubMedで登録したキーワードを使って検索します。検索結果表示後、検索窓の下に"**Create alert**"があるので、それをクリックします。
![Screenshot at Oct 30 16-13-36_Fotor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/adddd621-6d9a-fac1-cd6f-6a423f49d80a.png)

検索方法などの設定ページに移動するので、適宜設定を変更します。

https://pubmed.ncbi.nlm.nih.gov/

## 検索設定

```
Name of saved search: NCBIのマイページに表示される設定名

Search terms: PubMedの検索窓に書き込む検索ワードをここに入力します。例えば、"(human) AND disease"とか。

Would you like email updates of new search results?: Yesの一択です。

Email: 通知を受け取るメールアドレス

Frequency: どのくらいの頻度で受け取るか変更できます。自分の関連研究はそこまで活発ではないので"Daily"に設定してあります。

Report format: 受け取り時のフォーマットを変えられます。自分はデフォルトのSummaryしか試したことはありませんが、論文タイトル・著者・雑誌社名が書かれているのでこれで十分かと思います。

Send at most: これは多めに設定して損はないのではないでしょうか？

Send even when there aren't any new results: うるさいだけなので外しておきましょう

Optional text in email: よくわかりません
```

これで設定は完了です。
自分の場合だけかもしれませんが、平日は毎日20時頃にメールが届きます。休日は朝方に届く時もあります。

「この著者の論文だけ知りたい！」「この雑誌社からpublishされる論文だけ知らせてほしい！」という場合、PubMedには**Advanced検索**が備わっています。Advanced検索で条件を絞り込んだ後、Cleate alertで追加するか、検索フレーズを丸ごとコピーして"Search terms"に貼り付けてください。例えば、"AND ("Nature"[Journal]) "と加えれば、Natureからpublishされた論文のみを絞り込むことができたりします。

https://pubmed.ncbi.nlm.nih.gov/advanced/


# bioRxivでの設定

## bioRxivとは

https://www.biorxiv.org/
>bioRxiv（バイオアーカイヴ）は2013年11月に開始された生物学のプレプリントリポジトリである。正式な表記はbioRχivで、χはエックスではなくギリシャ文字のχ（カイ）である。コールド・スプリング・ハーバー研究所 (Cold Spring Harbor Laboratory, CSHL) が運営している。プレプリントであるので、bioRχivが提供する論文は査読されていない。しかし基本的な選別と剽窃の判別は行われている。読者はプレプリント論文にコメントを付けることができる。

Wikipwdiaより転載。つまり査読前のpreprintのpaperが読めるサイトです。PubMedは査読つきでacceptされた論文しか検索・閲覧することができません。一方で、bioRxivは論文がreviewに回った段階でauthorがbioRxivに登録さえされていれば閲覧することが可能です。

## 設定
https://www.biorxiv.org/alerts
ALERTSのページから設定ができます。まず、アラートを受け取るメールアドレスを登録します。
その後、ADD NEW ALERTS > Add a new Keyword/Author Alert から自分の検索する検索ワードを登録して設定を完了させてください。
#### 注意!
このアドレス入力はPubMedのようにアカウントを作るものではない上に、後で修正が効かないのでミスなく入力してください。自分は後日メールアドレスの誤入力に気付き1週間ほどメールを受け取り損ねました。



**よい研究ライフを。**
【Ruby】if文の問題

# 背景
Rubyの問題を解いた際、自分の回答に対して、模範回答のスマートさを見て悔しかった:confounded:ので備忘録として残します。

# 問題
正の整数を入力します。その整数が、
10の倍数（10,20,30...）からの差が
2以内であるときはTrue
それ以外はFalseと出力するメソッドを作りましょう。

**出力例：**
near_ten(12)→True
near_ten(17)→False
near_ten(19)→True

# 私の回答

```Ruby:Ruby
def near_ten(num)
  if num % 10 <= 2
    puts "True"
  elsif num % 10 >= 8
    puts "True"
  else
    puts "False"
  end
end
```

# 模範回答

```Ruby:Ruby
def near_ten(num)
  quotient = num % 10
  if quotient  <= 2 || quotient >= 8
    puts "True"
  else
    puts "False"
  end
end
```

# 感想
模範回答見たときに、**スマートすぎやろぉ〜**と心の中で叫びました！（出先のもので声出せません:unamused:）

確かに、またはに該当する" **||** "の存在を忘れがち。。。。

コードは、正直動けば正解:sparkles:ではありますが、いかにスマート:star2:に書くかでカッコ良さがにじみ出るのだと改めて感じました。。。

リファクタリング頑張りやす。。。
議事録の書き方

いきなり技術とは無関係な記事を挙げます。
今までプログラマーとして活動してきた私ですが、最近客先へ行き要件定義、基本設計の打ち合わせから参加することが増えてきました。

ＳＥはこんなことまで考えているのか、自分の考え方はシステムによりすぎていて、お客様が何をしたいのかを、どう言ったら納得してもらえるのか日々学びの連続です。


その中で任されているのが議事録です。
正直怒られっぱなしです。

書き方は人それぞれだし、書けてるという人もいる。でも怒る人もいる。
ここでは指摘されたことと、そもそも議事録の意味、目的を考えてまとめていきます。


##議事録の目的
なぜ議事を残すのか？
・後で見返して、内容を確認するため
・会議に参加していないメンバーも内容を理解するため
・取引先への打ち合わせの実績

自分の議事録の悪い点は、自分自身のその会議のメモになってしまっている点です。
自分が納得した道筋を記録するのではなく、その議事を見た人がどんな経緯でその結論に至ったのか理解できるように記載する必要がある。
私の議事録はそれが出来ていないと指摘されるし、自分でもそう思います。

「議事録の目的はプロジェクトメンバー内の情報の共有」
それを簡潔に、確実に行うために重要なことを考えてみる。

##情報共有のための議事録に必要なこと
###主語の重要さ
例えば、**「単価」**という言葉だけで、その会議に参加した人は話の流れで売単価なのか仕入単価なのか判断できる、しかしその議事だけをパッと見た第三者はそうもいかない。
議事録は簡潔にかつ適切に記載する必要がある。今話していることが何なのか主語の意識大切。
あと、不要に略さないことも重要。

自分の未経験の業界だと主語自体知らなかったりするので大変。
ありがとうgoogle先生

###決定事項、課題の明記
討論の内容を簡潔に、道筋を意識して記載していく。その中で課題や決定事項が出てくる。
それを分かりやすく明記することが大事。
その際も常に誰が何をいつまでにを意識。

**5W2H**ってやつ
1.Why（なぜ）
2.What（何を）
3.When（いつ）
4.Who（誰が）
5.Where（どこで）
6.How（どうやって）
7.How much（いくら）

###言葉の言い回し、誤字
これに関しては、しっかり確認しているかどうかだけの話。
~~でも2時間の打ち合わせを3セッションもやって、全部議事録取って、誤字0って厳しい。~~
とか思っちゃダメ、見返そう。

ビジネス用語での言い回し。
必死に討論内容を理解しながら、議事録を取っているとどうしても、口語やビジネス文書にふさわしくない言い回しになる場合が多い。
これも確認の際に直す必要があるが、たくさん読んでいるうちにその言い回しに慣れてしまっているときがある。
これも最終的にはしっかり確認するしかない。

もうこんなことで怒られないようにがんばる。

##議事録の鮮度
とにかくスピードが重要。
一週間に3回打合せがあり、まとめる時間が取れないことが多々ある。
議事録がたまる。まとめる際にその会議の内容を忘れ、まとめられない。
確認する人も記憶があいまいになる。
議事録はその日のうちにまとめる。遅くても翌日には完成させる。

~~直帰とかするときつい~~

慣れると会議中にまとめられるらしい。
慣れるってなんだ。

##その他指摘されたこと
他にもまだまだあるけど。

#####この内容は基本設計打合せでは不要
お客さんの部門間での認識合わせをしておいてねって話だった。
書いてもいいような気もするけど、削除された。
これに関しては自分の中でもまだ落としどころがわからない。

#####要件定義でさんざん言われている
さんざん言われているけど、こういう話になっているから議事には書かなくていい。
これに関しては要件定義に参加していない自分は過去の内容をもっと理解しなくては改善のしようがない。
時間を作ろう。

#####箇条書きが多い
箇条書きの方がわかりやすいと思っていた。
箇条書きにして単語だけにすると第三者は理解が難しい。

#####句点はいるのか？
これは人による。
筆者的にはなしだった。でも日本語的には必要。

##最後に
とりあえず指摘されたこと、重要だと思うことを常に意識して書き続けるしかない。
会議中に理解できなかったことは、わからなかった点と明記しておき、あとに上司に聞く、加筆してもらう。
いつか褒められたい。


この記事の文章自体言い回しがぐちゃぐちゃ。。。
pythonを三行でセグフォらせる

多分これが一番早いと思います。

```console
$ docker run -ti python:3.8-slim bash
# pip install mysql-connector-python==8.0.20
# python
>>> import random
>>> import mysql.connector
Segmentation fault
```

# 何が起こっているのか。
## 前提
mysql-connector-pythonは`8.0.20`から`libcrypto.so.1.1` と`libssl.so.1.1`をbundleするようになりました。

```
$ pip show -f mysql-connector-python  | grep lib
Location: /usr/local/lib/python3.8/site-packages
  mysql-vendor/libcrypto.so.1.1
  mysql-vendor/libssl.so.1.1
```

## 解説

```python
import random
```

`random`をインポートすると `libcrypto.so.1.1`をロードします。
この時はシステムにインストールされた `libcrypto.so.1.1`をロードします。

```python
import mysql.connector
```
このimport文で`libssl.so.1.1`と`libcrypto.so.1.1`をロードしようとします。
その際、`libssl.so.1.1`はバンドルされた独自のものをロードするのですが、
`libcrypto.so.1.1`はすでにロード済みなので、ロードしません。

したがって以下のような状態になります。

```
libcrypto.so.1.1 --> /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
libssl.so.1.1 --> /usr/local/lib/python3.8/site-packages/mysql-vendor/libssl.so.1.1
```

`libcrypto.so.1.1`に互換性がないため、segmentation faultとなります。

すでにbugとして報告されています。
https://bugs.mysql.com/bug.php?id=97220

## 回避策
1. LD_PRELOADで `/usr/local/lib/python3.8/site-packages/mysql-vendor/libssl.so.1.1`等を読み込む
2. `8.0.19`以前のバージョンを使う。

# 追記
別にrandomを読み込まなくてもセグフォすることがわかりました。

```python
>>> import mysql.connector
Segmentation Fault
```

上記の理屈だと若干説明がつかないので原因は別にあるようです。
LD_PRELOADで回避できるのでバンドルされたライブラリに読み込み順序に何か問題があることは確かだと思います。

ちなみに、不思議なのですが、 `python:3.8-slim`イメージでは発生しますが、 `python:3.8`イメージでは発生しません。
JavaScript中級者になるために参考になるサイトをまとめてみた。

### 対象者
JavaScript初心者を抜け出したい方
変数やメソッドなどの基礎的なところはわかっている方
progateを終えて次のステップに進みたい方

### なぜ書いたか
プログラミングを一通り勉強してきて、初心者という枠を抜け出したいと思い、いろいろ調べている中でとても良いサイトや動画に出逢ったので自分と同じように中級者へステップアップしたい方向けに記事を書こうと思った次第であります。


### youtube
いきなり動画かよと思う方がいらっしゃるかもしれませんが、対象が初心者なので学びやすい動画を先に持ってきました。（筆者も初心者から中級者になろうとしている最中なのでとても参考にさせていただいております。）

[しまぶーのIT大学さん](https://www.youtube.com/channel/UCti6dG0zSAetLGGYcgNML4Q)
プログラミングはもちろんですが、そのほかにもJavaScriptの歴史の背景の部分を解説してくれているので、なぜこの技術が必要となったのか理解することができます。

[たにぐちまことさん](https://www.youtube.com/channel/UCphTq6mefx_15CjD35qgXgA)
JavaScript以外にもたくさんの動画を出されている方でとてもわかりやすく、本当に初心者の方はこの方の動画から入るのが良いのではないでしょうか？

[Web万屋エンジニアチャンネルさん](https://www.youtube.com/channel/UCHxqQ8bUg5F2GW79D_DvSjQ)
例えが的確すぎてとてもわかりやすいのが特徴です。
特にレキシカル環境を卵に例えた話は目から鱗がボロボロ落ちました笑
動画の対象は初心者から中級者の手前向けといった感じでしょうか。

[Code Mafiaさん](https://www.youtube.com/channel/UCQ8iiBr45MDWD7hDp3FDmQg)
JavaScript中級者への道という動画をだしている方で、初心者から中級者になるためにつまずくところをとてもわかりやすく解説してくれています。


### Webサイト

[MDN(JavaScript)](https://developer.mozilla.org/ja/docs/Web/JavaScript)

初心者から上級者までお世話になるサイトです。
初心者を抜け出したければ必ず目を通しましょう。ただ、難しいところも多いです。
初心者の方で読んだことある方は毛嫌いしているサイトであるかもしれません。気持ちはとてもよくわかります。
でも逃げていては初心者から抜け出すことはできません。筋トレと一緒で負荷をかけなければ成長はしません。筋肉痛だと思って頑張りましょう。

[現代のJavaScriptチュートリアル](https://ja.javascript.info/)
初歩的なところから深いところまで一通り学べるサイトです。
練習問題もあるので理解できたかの確認ができます。
量がとても多く難しいところも多いので少しずつ進めていきましょう。

[中上級者になるためのJavaScript](https://kenju.gitbooks.io/js_step-up-to-intermediate/content/index.html)

タイトルにあるようにJavaScriptで中上級者を目指すためのサイトになっております。目次をみてみてどういったものがあるか確認してみると良いでしょう。

### 最後に
JavaScript中級者へのステップアップを目指されている方の参考になれば幸いです。
千里の道も一歩から
がんばっていきましょう！
【centos8】logrotateが上手く起動しない

####はじめに

これまでcentos6でlogrotateは使っていたが、centos8で実装した際に躓いた点があったのでメモしました。

####➀課題
centos8で実装した際はファイルはrotateされるが、データがrotateされない。




####➁大まかなlogrotateが回る流れ。

（例）
➀/etc/cron.dailyの中のlogrotateファイルが毎分起動（/etc/logrotate.confを呼び出す）
↓
➁/etc/logrotate.conf設定ファイルが読まれる（dailyで/etc/logrotate.dディレクトリの中のファイルを実行）
↓
/etc/logrotate.dの中にsyslogファイルあり。syslogの中にrotateされたいファイルのパスを記述。
↓
指定したファイルのrotateが実行される。




####➂解決策
centos8では/etc/logrotate.dのディレクトリの中に、centos6にはなかったsyslog.rpmnewファイルが存在している。
logrotate.dのディレクトリの中でsyslog、syslog.rpmnewの2つのファイルで内容が重複していると上手くrotateされない。内容を重複しないようにすることが必要。


####➃修正したら再起動と自動起動

```
 systemctl restart rsyslog.service
```
```
systemctl enable rsyslog.service
```

####⑤接続確認
-fオプションで強制rotateして上手くrotateしているか確認。

```
logrotate -f /etc/logrotate.conf
```
データが上手くrotateされていれば完了。
アンケート調査データを分析してみる【第4回：感情分析】

今回は、アンケートの回答データを使って感情分析にチャレンジしてみたいと思います。感情分析を行うことで、自由回答中の語句から、回答者の態度がポジティブかネガティブかを判定します。

今回も以下URLより、「電子版お薬手帳を使いたい理由」に関する自由回答データを使用します。

「電子版お薬手帳に関する意識調査」を行いました
https://www.nicho.co.jp/corporate/newsrelease/11633/

①まずはライブラリをインポートします。今回はjanomeを使います。

```
import csv
from janome.tokenizer import Tokenizer
```

②次に「日本語評価極性辞書」をダウンロードし、読み込みます。これは、語句の判定に使う単語辞書のことで、例えば「誠実」はポジティブ、「弱気」はネガティブといったように、約8,500の表現に対してポジティブかネガティブかの紐付けがされています（下記URL参照）。

http://www.cl.ecei.tohoku.ac.jp/index.php?Open%20Resources%2FJapanese%20Sentiment%20Polarity%20Dictionary

```
! curl http://www.cl.ecei.tohoku.ac.jp/resources/sent_lex/pn.csv.m3.120408.trim > pn.csv

np_dic = {}
fp = open("pn.csv", "rt", encoding="utf-8")
reader = csv.reader(fp, delimiter='\t')
for i, row in enumerate(reader):
  name = row[0]
  result = row[1]
  np_dic[name] = result
  if i % 500 == 0: print(i)
```

③対象データについて形態素解析を実施、各語句と上記の辞書を照らし合わせます。以下のコード中、「p」はポジティブ、「n」はネガティブ、「e」はどちらでもないニュートラルな語句を指しており、それぞれをカウントして、ポジティブ度とネガティブ度を判定します。

```
df = open("survey3.txt", "rt", encoding="utf-8")
text = df.read()

tok = Tokenizer()

res = {"p":0, "n":0, "e":0}
for t in tok.tokenize(text):
  bf = t.base_form
  if bf in np_dic:
    r = np_dic[bf]
    if r in res:
      res[r] += 1

print(res)
cnt = res["p"] + res["n"] + res["e"]
print("Positive", res["p"] / cnt)
print("Negative", res["n"] / cnt)
```

結果は以下のようになりました。「電子版お薬手帳を使いたい理由」に関する回答なだけあって、やはりポジティブ度が高い結果になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/a4a09d79-8867-618d-c941-6ef617e36ca8.png)

因みにこの調査では、「電子版お薬手帳を使いたくない理由」についても調べています。このデータで同様の分析をするとどうなるでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265091/92d27273-598b-609d-9f96-6021eeb3fd06.png)

結果はこのようになりました。「使いたくない理由」にも関わらずポジティブ度がネガティブ度を上回っています。元の回答データを見ると、「紙の手帳のほうが良い」といった回答も散見され、上記のような結果になってしまったようです。このあたりはアンケート設計にも関わってくる部分になり、テキストマイニングの実施を前提にしている場合は留意が必要になりそうです。

###参考サイト
読み放題のネット小説をネガポジ判定で評価してみよう
https://news.mynavi.jp/article/zeropython-58/
GoogleでOpenIDConnectでIDトークンを貰う（いわゆる、Sign in with Google）

## 前提

OpenIDConnect の `Authorization Code Flow` を理解していること。

## とりあえず読む

公式ドキュメント
https://developers.google.com/identity/protocols/oauth2/openid-connect

## 手順

### Google API Consoleの設定

クライアントIDとクライアントシークレットを発行する必要がある。

↓へアクセス。
https://console.developers.google.com/

* google API Console で OAuth同意画面 を設定する。
* google API Console で 認証情報 > 認証情報を作成 > OAuth 2.0 クライアント ID する。

```
名前：ウェブ クライアント 1
Javascript生成元: http://localhost
承認済みのリダイレクト URI: https://www.google.com
```

上記実行でクライアントIDとクライアントシークレットが生成される。

### Googleで認証する

`authorization_endpoint` を使って認証する。（Cognitoで置き換えると`ログインエンドポイント`）
※`Authorization Code Flow` なので `code` を貰うところまで

↓のGETリクエストの該当箇所に埋め込んで（クライアントIDをclient_id）、ブラウザにペースト

※ここではリダイレクト先にGoogleを指定しているが、実戦時には自サイトを指定すること
※見易くするために改行しているがリクエスト投げる時は改行を消すこと

```
https://accounts.google.com/o/oauth2/v2/auth
?response_type=code
&client_id=Google API Consoleで発行したクライアントID
&scope=openid%20email
&redirect_uri=https://www.google.com
&access_type=offline
```

ちなみに、scopeにprofileを追加すると、名前（例：鈴木太郎）まで取得できる。名前はIDトークンに含まれる。
※↓が追加される。

```json-doc
{
    "name": "鈴木太郎", "family_name": "鈴木", "given_name": "太郎",
    "picture": "googleで使っているアイコンのURL"
}
```

#### 認証に成功した場合

https://www.google.com （redirect_uriで指定したURL） へ認証結果のパラメータ付きでリダイレクトされる。

### IDトークンの発行

`token_endpoint` を使ってIDトークンを貰う。（Cognitoで置き換えると`トークンエンドポイント`）
※認証時に貰った `code` をIDトークンと交換する。

* 実戦時はリダイレクト先が https://www.google.com ではなく、自サイトとなる。
* 認証成功後にリダイレクトで送られてくるパラメータ（`code`）を元に、GETリクエストを受けた時の内部処理としてIDトークンを取得する。（後述のPOSTリクエストをサーバ側の処理として実行する）
* が、今は、 https://www.google.com に飛ばしているので、IDトークン取得のリクエストは手動でやる。

※IDトークンの発行はPOSTリクエストなのでリクエストが投げれるツールを使うこと

```
POST https://oauth2.googleapis.com/token http/1.1

↓リクエストボディ
{
    "client_id": "Google API Consoleで発行したクライアントID",
    "client_secret": "Google API Consoleで発行したクライアントシークレット",
    "redirect_uri": "https://www.google.com",
    "grant_type": "authorization_code",
    "code": "GETリクエスト後にリダイレクトされたURLのパラメータとして付与されているcodeの値"
}
```

#### 成功した場合

↓がレスポンスとして返ってくる。

```json-doc
{
  "access_token": "...",
  "expires_in": 3599,
  "refresh_token": "...",
  "scope": "openid https://www.googleapis.com/auth/userinfo.email",
  "token_type": "Bearer",
  "id_token": "..."
}
```

### ちなみにその後は・・・

IDトークン内の認証情報を自サイトの情報（ID以外の自サイトから新規登録した際に生成される情報）と紐づけしてよろしくやる。

### 注意

最小限のパラメータで動作するようにしているが、実戦ではセキュリティの問題があるので、[公式](https://developers.google.com/identity/protocols/oauth2/openid-connect#sendauthrequest) の例のように、`state` にトークンを埋め込むこと
gitのブランチ作成〜リモートへの登録(git checkout ~ git push -u origin)

## はじめに
ローカルでブランチを作成し、リモートに登録するまでの手順を紹介します。
リモートにプロジェクトを登録する手順は下記を参考にしてください。
[gitの使い方(git init 〜git push)](https://qiita.com/shungo0525/items/b73ff5b1ec6d69bb5c50)

今回はmasterブランチから新しくdevelopブランチを作成してリモートに登録してみたいと思います。

### 1.ローカルでdevelopブランチを作成(git checkout)
まず現在のブランチを確認します。

```:ターミナル 
$ git branch  //ブランチを確認
* master      //現在のブランチに*がついている。他にもブランチがあると一覧として表示されます。
```

```:ターミナル 
$ git checkout -b develop master  //masterブランチからdevelopブランチを作成
($ git checkout -b develop)　//今いるブランチから作成する場合はmasterを省略可能

Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
```

再度ブランチを確認します。

```:ターミナル 
$ git branch  //ブランチを確認
* develop     //developブランチが作成されると同時にブランチが切り替わっています。
  master 
```

もしブランチを切り替えたい場合は下記で切り替えられます。

```:ターミナル 
$ git branch [切り替えたいブランチ名]
($ git checkout master)  //developからmasterに切り替わります。
```

### 2.リモートへの登録(git push -u origin)
ローカルでブランチを作成したので、このブランチをリモートに登録します。

```:ターミナル 
$ git push -u origin develop  //リモートに登録
```
githubで確認するとdevelopがちゃんと登録されています。
<img width="400" alt="スクリーンショット 2020-06-26 10.49.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/eccdad29-4fdb-7e6e-d4b5-463fc72f1cc1.png">

この後、developブランチに変更があった場合は下記の手順でpushできます。

```:ターミナル 
$ git add -A                       //変更を追加
$ git commit -m "コミットメッセージ"  //コミット
$ git push                         //一度登録した後はpushだけで大丈夫です。
```

## 終わりに
次はチームでの開発を意識したgitの使い方(merge, pullなど)を紹介したいと思います。
独学で勉強していたときは、いろいろなgitコマンドを使う機会がありませんでしたが、エンジニアに転職してからはブランチをどんどん切り替えて作業をするので、理解するのに最初はかなり苦労しました。
初心者の方でも理解しやすいようにまとめたいと思います。
[python] リストとディクショナリ　要素の取り出し方まとめ

# はじめに

- ```リスト```と```ディクショナリ```の要素の取り出し方の覚書
- 要素の追加や削除等、他にもいろいろあるけど、ここでは要素の取り出し方だけまとめる
- 使ってるうちに便利だなと思ったのは```リスト```と```ディクショナリ```を組み合わせることができること
- 特に```ディクショナリ```の中に```ディクショナリ```を入れ子にできることで、個人的に一番よく使う


# リスト
- 同じ型のデータを一列に並べたもの
- 各要素には0から順にインデックスが振られている

#### インデックスで一つづつ要素を取り出す

```python:list.py
ls = ['りんご', 'もも', 'さくらんぼ']
print(ls[0])
print(ls[1])
print(ls[2])
```
```python:結果
りんご
もも
さくらんぼ
```

####  ```for```文で一つづつ要素を取りだす

```python:list2.py
ls = ['りんご', 'もも', 'さくらんぼ']
for a in ls:
    print(a)
```
```python:結果
りんご
もも
さくらんぼ
```

# ディクショナリ
- キーと要素で一つのデータの集まり

#### キーを指定して一つづつ要素を取り出す

```python:dic.py
dic = {'フルーツ':'りんご', '野菜':'玉ねぎ'}
print(dic['フルーツ'])
print(dic['野菜'])
```
```python:結果
りんご
玉ねぎ
```
#### ```for```文でキーを取り出す
- ```keys```を使うと```key```を取得できる

```python:dic2.py
dic = {'フルーツ':'りんご', '野菜':'玉ねぎ'}
for mykey in dic.keys():
    print(mykey)
```
```python:結果
フルーツ
野菜
```

#### ```for```文で要素を取り出す
- ```values```を使うと```value```を取得できる

```python:dic2.py
dic = {'フルーツ':'りんご', '野菜':'玉ねぎ'}
for myval in dic.values():
    print(myval)
```
```python:結果
りんご
玉ねぎ
```

#### ```for```文でキーと要素を同時に取り出す
- ```items```を使うと```key```と```value```の両方を取得できる

```python:dic3.py
dic = {'フルーツ':'りんご', '野菜':'玉ねぎ'}
for mykey, myval in dic.items():    
    print(mykey)
    print(myval)
```
```python:結果
フルーツ
りんご
野菜
玉ねぎ
```

# ディクショナリの中にリスト
#### ```value```をリストにする
- ```key```とインデックスの組み合わせで要素を取り出すことができる

```python:dic_list.py
dic = {'フルーツ':['りんご', 'もも'], '野菜':['玉ねぎ', '人参']}
# キーから要素であるリストを取り出す
for mykey in dic.keys():
    for i in range(0,len(dic[mykey])):
        print(dic[mykey][i])

# 直接、要素であるリストを取り出す
for myvalue in dic.values():
    for i in range(0,len(myvalue)):
        print(myvalue[i])
```
どちらも結果は同じ

```python:結果
フルーツ
りんご
野菜
玉ねぎ
```

# ディクショナリの中にディクショナリ

#### ```value```をディクショナリにする

- ```key```と入れ子のディクショナリの```key```の組み合わせで要素を取り出すことができる

```python:dic_dic.py
dic = {'フルーツ': {'好き':'りんご', '大好き':'もも'}, '野菜': {'好き':'トマト', '嫌い':'ピーマン'}}
print(dic['フルーツ']['好き'])
print(dic['野菜']['嫌い'])
```
```python:結果
りんご
ピーマン
```
NuxtプロジェクトをHerokuにデプロイするときのコマンドメモ(Git経由)


Heroku Gitを利用するパターンです。
ほぼドキュメントの写し。メモメモ :notepad_spiral: 

すでにNuxtのプロジェクトが存在しており、HerokuでAppを作成している前提です。

## 手順 

herokuのCLIインストール

```bash
npm install -g heroku
heroku login
# ブラウザ立ち上がるのでログイン
```

リモートリポジトリをherokuで作成したappのリモートリポジトリに変更する
（作成したAppのDeploy画面で確認できるはず）

```bash
heroku git:remote -a subscription-switcher-demo
```

Nuxtプロジェクトデプロイ用の設定

```bash
# devDependenciesをインストールする設定
heroku config:set NPM_CONFIG_PRODUCTION=false

# 0.0.0.0のListen
heroku config:set HOST=0.0.0.0

# productionモードに設定
heroku config:set NODE_ENV=production
```

`Propcfile`の作成

```bash
vi Procfile

# 以下の一行を追加
web: nuxt start
```

Heroku Gitにプッシュ　勝手にデプロイされる

```bash
git add .
git commit -am "comment here"
git push heroku master
```

## おまけ　master以外のブランチをデプロイしたいとき

```bash
git push heroku [branch_to_deploy]:master
```

## 所感

すごいスピーディにNuxtアプリが公開できて感動しました。サーバレスすごい。

## 参考
- [Heroku へデプロイするには？ - NuxtJS](https://ja.nuxtjs.org/faq/heroku-deployment/)
- HerokuのappのDeploy画面のコマンド
外部設計と内部設計について


#はじめに
IT企業に転職し、開発に携わる機会が増えてきたのでシステム開発の工程の一つである
『外部設計』と『内部設計』について調べたので記事にします。


#システム設計の流れ
基本的な流れとして最初に要件定義を行い、次に外部設計を行い、外部設計を基に内部設計を行う。

#要件定義とは
クライアントが求めている機能に対して、システムの使用や範囲を決める。
例として、必要な機能、性能、要求されている信頼性や保守性などクライアントの要望に合わせ要件定義書を作成する。要件定義書の精度が高ければ、外部設計が行いやすくなる。

###一言まとめ
クライアントが求めてる機能を、要件定義書に起こす。

#外部設計
要件定義で定義した、機能、性能、制約条件を基にシステム設計を行う。
主に、UIなどユーザーから見える部分の仕様を決定したり、セキュリティ、運用規定、システム開発のスケジュール、費用などの設計を行う。

###一言まとめ
ユーザー側のシステム開発を行う

#内部設計
外部設計を基に、システム内部の動作や機能、物理データなどのユーザから見えにくい詳細な部分の設計を行う。
プログラム機能を単体に分割し、そこで使用する物理データの入出力を設計をする。

###一言まとめ
ユーザーから見えにくい部分のプログラム設計


#外部設計の主な項目

###・方式設計
アプリの全体構造の設計、ハード、ソフトウェアの機能、構造、開発言語なを決める。アーキテクチャ設計とも呼ばれる。

###・機能設計
システムをモジュール単位に分割し、各モジュールや使用するデータベースの設計を行う。
データの入出力、データベース同士のデータの受け渡し、ユーザーによる操作、帳票の出力など。
システムの使いやすさなどUIの部分の仕様を決める役割もある。

###・そのほかの設計
クライアントに求められている、機能、セキュリティ、運用規定、納期、開発費など業務として運用に必要な部分を決定する。


#内部設計の主な項目

###・機能分割
各モジュールの機能を明確化する。機能間でデータが処理される際の流れ（データフロー）を設計する。
処理の明確化で、設計バグを洗い出せる。


###・物理データ設計
システム内部で使うファイルやデータのやりとりに関する部分の設計を行う。

###・入出力の詳細設計
『機能仕様書』、『データフロー書』、『データベース物理設計書』などを作成する。


#最後に
システム開発とは、クライアントの要件を要件定義書でまとめ、外部設計でユーザー側、内部設計でシステムの作り方を考える。
いきなりプログラムを書いても、修正に時間がとられたり、最悪最初からやり直す可能性もあるので、しっかり設計に時間を使い、質の高い制作物を効率良く作りましょう。

以上
CSSのみでアコーディオンを実現！detailsとsummaryについて

jsを駆使してアコーディオンを作るたびに思います。
「毎回めんどくさい…もっと秒でやりたい…」
そんな悩みを解決してくれる要素について記事にしました。

## 使用方法
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="mgmgshake" data-slug-hash="WNNerjr" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="HowToUseDetails&amp;amp;Summary">
  <span>See the Pen <a href="https://codepen.io/mgmgshake/pen/WNNerjr">
  HowToUseDetails&amp;Summary</a> by shake (<a href="https://codepen.io/mgmgshake">@mgmgshake</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

とっても簡単ですよね！
jsいらずで、HTMLのみでアコーディオンが実装できます♪
また、スタイルを上書きできるので自分好みのアコーディオンにすることもできます。

## 対応するブラウザ
便利なdetail&summaryですが、対応するブラウザは以下のようになっております。

![](https://i.imgur.com/kSEY1Ki.png)
引用元：https://developer.mozilla.org/ja/docs/Web/HTML/Element/details

…まぁ、いつも通りですね！

chrome,Firefox,safariでは普通に動くが、癖があります。（後述）
IE, Edgeはpolyfillを入れることにより使用可能になります。

↓Edgeで見た状態
![](https://i.imgur.com/gLphmRW.png)

## 使用したpolyfill
[details-element-polyfill](https://www.npmjs.com/package/details-element-polyfill)を使用しました。

結構種類が豊富であり、４個ほどpolyfillを試したのですがまともに動作したのが2つだけでした…。
→シンプルなHTML構造ではないと使えない可能性あり？

## ブラウザごとのクセ

デフォルトでついているアイコンを削除する必要があります。
そのアイコンが、ブラウザによって扱いが異なります。

![](https://i.imgur.com/bloiV4V.png)

| ブラウザ | 状態 | 削除方法 |
| -------- | -------- | -------- |
| chorome  | details-markerという特殊な擬似要素 | summary::-webkit-details-marker { display: none; }    |
| safari   | 上と同じ    | 上と同じ    |
| firefox  | list-itemなのでlist-style扱い     | list-style none あるいはlist-style-image設定    |
| IE,Edge  | 擬似要素(before)     | ::before content ''     |
※IE, Edgeはpolyfillにより異なる

firefoxのみ
無駄に
list-styleのため、summaryにdisplay: blockをかけるとその瞬間にアイコンが消えます。ちょっと不便。
少し面倒くさいですが、list-styleを消してしまって擬似要素で共通のアイコンを設定したが早いです。

## Vue.jsとの共存
条件によってアコーディオンの初期状態を制御したいとき、
detailsにはopenという*独自の属性*があるので、そちらをv-bindします

```html
<details v-bind:open="closeOption ? false : 'open' ">
    <summary>まぐろ</summary>
    ビチビチ
</details>
```

closeOptionがtrue→open=falseになる

```ブラウザ出力:html
 // 閉じられる（普通のアコーディオン）
<details>
    <summary>まぐろ</summary>
    ビチビチ
</details>
```

false→open=openになる

```ブラウザ出力:html
// 最初から開かれる
<details open="open">
    <summary>まぐろ</summary>
    ビチビチ
</details>
```


### 扱いにくい点
開いたら開きっぱなしにしたいときや、ユーザの状態によってアコーディオンそのものを無くしたいときなどがあると思います。

例えば、アンケートページでの任意項目はアコーディオンにして隠して置いて、ユーザが開いたら出しっぱなしにしたい時などです。
（あくまで例なので、details&summaryじゃなくてv-if使えば？というご意見はなしで…！）

summaryにv-if効かない問題

```ブラウザ出力:html
// 最初から開かれる
<details open="open">
    <summary v-if="false">まぐろ</summary>
    ビチビチ
</details>
```

![](https://i.imgur.com/UogdPOd.png)
↑openDetail=falseのとき、summaryは消えずに「詳細」という内容に置き換わるだけ

v-ifでsummaryを消すと、勝手にどこかでsummaryが生成されてしまいます
CSSをあてることもできません
→どうやらsummaryのDOMがないと無理やりどこかで付け加える仕様のようです

detailsがopenのときに、summaryをdisplay noneにする記述を書けば解決することができます。

```css
details[open]
    summary
        display none
```


## 所感
まだまだ制約が多いので、デザインやアニメーションなどを凝りたい時は従来のアコーディオンの生成方法で良い気がしますが、
時間がなくてちゃちゃっと実装したい時にはいいかもしれません。

新しめのhtmlタグってなかなか触れる機会がなくて困ります…。
[iOS] fastlane register_devicesを使用して検証端末を追加する

# モチベーション
fastlaneを使用して，検証端末の登録を楽に行いたい．
特に，棚卸し時の業務を高速で行いたい．

# 課題
検証端末を追加する場合，都度depeloperサイトから1台ずつ登録している．
1. 1年に1度の検証端末の棚卸しに時間がかかっている
2. 開発メンバーや開発PCを追加する度に，メンバー自身がdepeloperサイトから登録する必要がある
3. 新規検証端末を追加する度に，depeloperサイトから登録する必要がある

# 課題の解決方法
fastalne register_devicesを導入して解決する
導入後は，上記の課題が下記のように解決される
- 指定のフォーマットでtxtを作成し，コマンドを実行する
- 追加に成功したら，slackのチャンネルに端末の追加が知らされる

**!depeloperサイトより，txtによって複数端末を一気に登録できます．本記事では，あくまでサイトにアクセスせずに完結することを目指したものです!**

# register_devicesの導入手順

## fastfileの編集
fastfileにlaneを追加します
**Tips.** 個人ではなく，会社等のチームで使用する場合は，**team_id** は明記しておくとよいです.
> Optional, if you"re a member of multiple teams, then you need to pass the team ID here.

https://docs.fastlane.tools/actions/register_devices/ より

```Fastfile
desc "Register Devices"
lane :register_new_devices do
  # see the Apple Sample (http://devimages.apple.com/downloads/devices/Multiple-Upload-Samples.zip)
  register_devices(
    devices_file: "./fastlane/devices.txt",
    team_id: "ABCDEFGH"
  )
  match_after_register
end

desc "match_after_register"
lane :match_after_register do
  # 前回との差分を見て，新しいデバイスが追加されているなら新しくprovisioning profileを作成する
  match(type: "develop", force_for_new_devices: true)
  match(type: "adhoc", force_for_new_devices: true)
  slack(message: "<@hoge> 新しい端末が登録されました！")
end
```

## sample_devices.txtの用意
http://devimages.apple.com/downloads/devices/Multiple-Upload-Samples.zip より，txtファイルをダウンロードします．
このうち，xxx-ios.txtのファイルを`sample_devices.txt`として`fastlane/`に配置します．
実際は，`sample_devices.txt`のフォーマットに従い，`devices.txt`を作成します．

```sample_devices.txt
 Device ID	Device Name
 A123456789012345678901234567890123456789	NAME1
 B123456789012345678901234567890123456789	NAME2
```

**Tips.**  .gitignoreに，`fastlane/devices.txt`を追加しておきましょう．本物のUUIDは公開する情報ではありません．
**Tips.** Makefileに，`register_new_devices`が動作できるように追記しておくと楽です．また，READMEにも書いておくともっといいと思います.
**Tips.** Makefileに，1端末ずつ追加する`register_new_device`を追加するものありです！

```Makefile
.PHONY: register_new_devices
register_new_devices:
	bundle exec fastlane register_new_devices

.PHONY: register_new_device
register_new_device:
	bundle exec fastlane run register_device
	bundle exec fastlane match_after_register
```

## register_devicesの実行
下記コマンドによって，register_devicesを実行します
AppleIDを求められるので，メールアドレスを入力してください
**Tips.** team_idのようにusernameが存在しますが，チーム内でコンフリクトするので，都度入力する方がいいと思います．

```
 bundle exec fastlane register_new_devices
 or
 make register_new_devices
```

成功すれば，下記のように表示されます

```
 [00:27:06]: Running lane `register_new_devices`. Next time you can do this by directly typing `fastlane register_new_devices` 🚀.
 [00:27:06]: Driving the lane 'register_new_devices' 🚀
 [00:27:06]: ------------------------------
 [00:27:06]: --- Step: register_devices ---
 [00:27:06]: ------------------------------
 [00:27:07]: To not be asked about this value, you can specify it using 'username'
 [00:27:07]: Optional: Your Apple ID: xxx@yyy.com
 Available session is not valid any more. Continuing with normal login.
 [00:27:37]: Fetching list of currently registered devices...
 [00:27:37]: Successfully registered new devices.
```

# 参考文献
- [fastlane register_devices](https://docs.fastlane.tools/actions/register_devices/)
Rails: マイグレーションの戻し方

ご参考までに。

### マイグレーションの状態を見る

upと表示されるのが実行済み、downは未実行です。

```
% bin/rails db:migrate:status

database: blog_rails6_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20191031052351  Create users
   up     20191031053247  Create entries
   up     20191031053324  Create tags
   up     20191031053328  Create taggings
   up     20191116013349  Create stars
```

### 1つロールバック

```
% bin/rails db:rollback
```

```
% bin/rails db:migrate:status

database: blog_rails6_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20191031052351  Create users
   up     20191031053247  Create entries
   up     20191031053324  Create tags
   up     20191031053328  Create taggings
  down    20191116013349  Create stars
```

### 特定のバージョンまで全部ロールバック

```
% bin/rails db:migrate VERSION=20191031053247
```

```
% bin/rails db:migrate:status

database: blog_rails6_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20191031052351  Create users
   up     20191031053247  Create entries
  down    20191031053324  Create tags
  down    20191031053328  Create taggings
  down    20191116013349  Create stars
```

### 特定のバージョンを1つ抜く

```
% bin/rails db:migrate:down VERSION=20191031053328
```

```
bin/rails db:migrate:status

database: blog_rails6_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20191031052351  Create users
   up     20191031053247  Create entries
   up     20191031053324  Create tags
  down    20191031053328  Create taggings
   up     20191116013349  Create stars
```

特定のバージョンのマイグレーションを1つ実行するには、`db:migrate:up VERSION=バージョン` とします。
SQL select文で得られた結果をレコード数を指定して表示する

# 目的

- 表示レコード数を指定するlimit句の使用方法をまとめる

# 例

- 出力レコードの数を制限したい時はlimit句を使用する。
- limit句のみでも使用可能であるが、order by句と併用する。
    - limit句は最初のレコードからいくつ出力する処理のため、表示順が変化すると期待した出力が得られない可能性があるため。
    - order by句に関してはこちらを参照→[SQL select文で得られた結果を並び替える](https://qiita.com/miriwo/items/a70fc2d16e207a5f63be)
- 下記にlimit句を用いたselect文の書き方の例を記載する。

    ```sql
    select 出力するカラム
    from テーブル名
    order by 並び替えの基準となるカラム名 降順、昇順などの指定
    limit 出力レコード数
    ```

# 具体例

- ユーザの年齢を格納しているageカラムと新規レコード追加時に自動インクリメントされた数値が格納されるIDカラムなどが存在するusersテーブルがあると過程する。
- usersテーブルのidカラムを基準にレコードを降順にソートして最初の5レコードの全てのカラムのデータを表示する時のSQL文を下記に記載する。

    ```sql
    select *
    from users
    order by id desc
    limit 5;
    ```
はじめに

この記事は意識表明です。


#なぜ記事を書くのか
社内ワーキング活動の一環です。

某システム会社で働く、未熟なエンジニアの知識収集のためのメモ的な何か

主にＣ＃、ＳＱＬに関する技術の情報を収集しまとめていきます。


筆者は文章力にも不安ありなので、そちらの改善も同時に行いたい。



記事ＵＰのペースは2週間に1記事目標





**やらないとおこられる**
Dockerの使い方（自分用）

# Dockerとは
ローカルにサーバーを立てるためのアプリケーション。

# インストール方法
[公式サイト](https://www.docker.com/)からパッケージをダウンロードし、インストールする。

# 使い方

## イメージ

### イメージの一覧を表示する

```
docker images
```

### イメージを削除する

```
docker rmi [イメージ名|イメージID]
```

### 使用していないイメージを一括削除する

```
docker image prune
```

## コンテナ

### コンテナの一覧を表示する

```
docker ps -a
```

### コンテナを起動する

```
docker start [コンテナ名|コンテナID]
```

### コンテナを削除する

```
docker rm [コンテナ名|コンテナID]
```

### 使用していないコンテナを一括削除する

```
docker container prune
```

### コンテナでコマンドを実行する

```
docker exec [コンテナ名|コンテナID] [コマンド]
```

### コンテナのシェルに接続する

<font color="Red">※ attachはシェルからexitで抜けるとコンテナも落ちてしまうため、exec推奨</font>

* `--user`: ログインするユーザーを選択する

```
docker exec -it --user root [コンテナ名|コンテナID] /bin/bash
```

```
docker attach [コンテナ名|コンテナID]
```

## コンテナ群

### コンテナ群を立ち上げる

* `-d`: バックグラウンドで起動する

```
docker-compose up -d
```

### コンテナ群を落とす

```
docker-compose down
```

### 特定のコンテナでコマンドを実行する
* `--rm`: 実行のために作成されるコンテナを終了後に削除する

```
docker-compose run --rm {コンテナ名} {コマンド}
```

## その他

### パイプなどを含むコマンドを実行したい場合

```
docker-compose run --rm {コンテナ名} sh -c "{コマンド}
```

# 単語集

# 関連サイト
[Docker Hub(イメージライブラリ)]
https://hub.docker.com/

[Composeファイルの書式]
https://docs.docker.com/compose/compose-file/
Windows10でRTX2060を使えるようになるまで(NVIDIA DRIVER, NVIDIA CUDA ツールキット, PyTorchのインストール)

# 初めに
機械学習をするときに、GPUを使いたいですが、GPUを使うためには専用のソフトを入れる必要があります。具体的には以下の２つでした。

- NVIDIA DRIVER
- NVIDIA CUDA ツールキット
- PyTorch

それぞれのインストールの仕方の備忘録です。

# NVIDIA DRIVER 

- [こちら](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)のサイトからダウンロードします。
容量は600MBほどなのでちょっと時間がかかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455102/84ccd8fb-ef8f-92f9-ab56-0168e27c9a3e.png)

- 僕の環境の場合は、これらを選択しました。

- インストールオプションでは、カスタムを選択しました。
- NVIDIA GeForce Experienceは既にインストールされていたのでチェックを外しました。
- クリーンインストールをしました。

# NVIDIA CUDA ツールキット

- [こちら](https://developer.nvidia.com/cuda-toolkit-archive)からCUDA Toolkitxx（xxはバージョン）をダウンロードします。
- PyTorchを使う予定の方は現時点だと10.2を使ってください。
- local版をダウンロードしました。2.5GB強あり、ダウンロードに時間がかかります。
- こちらも、カスタムでインストール。
- Visual Studioをインストールしていない場合は、確認が出ます。Visual Studioをインストールする予定がある場合は、個々の段階でインストールしたほうが良いみたいです。


# PyTorch
[こちら](https://pytorch.org/get-started/locally/)から自分の環境を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455102/510489e1-8b41-8f20-9289-cd5b5fb17913.png)
一番下に、コマンドが出るのでコピーしてコマンド プロンプトで実行しましょう。


windows消して、ubuntu入れようかな...
go修行3日目 no-struct


## no-struct

```golang

package main

import "fmt"

type MyInt int

func (i MyInt) Double() int{
	// integerにキャストする
	return int(i * 2)
}

func main() {
	myInt := MyInt(10)
	fmt.Println(myInt.Double())
}
```

```
20
```

## インターフェース

```golang

package main

import "fmt"

type Human interface {
	Say() string
}

type Person struct{
	Name string
}

func (p *Person) Say() string{
	p.Name = "Mr." + p.Name
	fmt.Println(p.Name)
	return p.Name
}

// Humanインターフェースを受け付ける
func DriveCar(human Human){
	if human.Say() == "Mr.Mike" {
		fmt.Println("Run")
	}else{
		fmt.Println("Get Out")
	}
}

func main(){
	var mike Human = &Person{"Mike"}
	var x Human = &Person{"X"}
	DriveCar(mike)
	DriveCar(x)
}
```

```
Mr.Mike
Run
Mr.X
Get Out
```
[Oracle Cloud] バックアップから新たな DBCS 作成

# はじめに

Oracle Cloud Infrastructure(以下OCI)では、Oracle DB のマネージドサービス である、Database Cloud Service (略して DBCS) が提供されています。バックアップからあらたに DBCS を構成する方法を備忘録として残します。



# 手順

Create Database

![1593099837359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1429af2d-56a3-e67c-d1bf-9ed2e7ec33e1.png)



パラメータ。気になったところをいくつか

- Edition : 変更が可能 (HP → SE に仮に変更したとすると、PDB数が制限されるのかな？)
- TDE Wallet Password : 既存で指定した DBCS の Password と同じ

![1593099921734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/35e4f482-d5b8-5aeb-b563-5c1d2be4421a.png)



Provisioning

![1593100015425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/233faf99-a98d-5197-79ca-714dcfe06226.png)



一定時間後に Available

![1593129374860.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/d8e0da1a-4d28-7292-3e5b-c0fd273619de.png)



# 確認

接続

```
[opc@newdb ~]$ sudo su - oracle
Last login: Thu Jun 25 23:42:10 UTC 2020
[oracle@newdb ~]$
```



tnsnames を更新

```
vim $ORACLE_HOME/network/admin/tnsnames.ora
```



接続

```
sqlplus sugi/Sug1_Passw0rd_dayo@pdbname
```



確認

```
SQL> SELECT * FROM EMP;

EMPNO      EMPNAME                                              GENDER_F
---------- -------------------------------------------------- ----------
1          2                                                           1
2          3                                                           1
3          2                                                           1

SQL>
```
【JavaScript】 js　繰り返し文　for / while/ case

##【ゴール】
JavaScriptで使える繰り返し文

##【メリット】
■　javascript理解度向上
■　リーダブルコード実現

##【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

##【コード】

####※**1-100まで1つずつ足されていくという処理を例にします。**

###while
※（）に条件
※{}に出力処理　＆　加算処理

```javascript:hoge.js
while(number <= 100){
 console.log(number);
 number ++ ;
}
```


###for
※forは条件を()内に全て記述、シンプルで◎

```javascript:hoge.js
for(number = 1; number <= 100; number ++){
 console.log(number);
}
```

###switch
＊（）に条件記述
＊caseのあとは**「:」(コロン)ダブルコロンじゃない!!**
＊breakで終了
＊defalutはif文のelseと同じ意味

```js:hoge.js
switch(条件){
  case 条件後の値: 
  console.log(‘出力したい文字’); 
  break;
.
.
.
  // default
}
```

以上!!!
コードライン色付けしてみました!!!

##【合わせて読みたい】
■ 【jQuery】初心者でもよく理解できたやつ
https://qiita.com/tanaka-yu3/items/a03734b248c3f2ee8461

■ 【メソッド集】　rails メソッド　まとめ　基礎　随時追加
https://qiita.com/tanaka-yu3/items/89abad875187494bec53

■ 【JavaScript】javascriptの基本
https://qiita.com/smkhkc/items/5e3729cffab6591f34c6
【Windows】hostsファイルのパス

### hostsファイルの保存場所

パス：C:\Windows\System32\drivers\etc

簡易アクセス：
ファイル名を指定して実行で「drivers」と入力し「OK」でdriversフォルダが開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602028/5e38985f-7b87-a892-f6d4-ab088cd4d684.png)
Akashic Engine にて作成したニコ生向けゲームをiOSアプリ用に移植する方法

# はじめに
本記事では、実質ニコ生ゲーム用のゲームエンジンであるAkashic Engineを使用した
ゲームをiOSアプリに移植したときの備忘録です。
HTML5で作られた他のエンジン製のゲームでも応用できるかと思います。
なお、Akashic Engineのマルチプレイ機能を用いたゲームは対象外です。

**※当記事のやり方では審査を通らない可能性が高いです。ご了承ください**

AkashicEngine 2.7
XCode 11.5

# 手順
### 1.Akashic Engineのゲームをスタンドアローン形式で出力。
https://akashic-games.github.io/tutorial/v2/7-export.html
akashic export html --magnify --output ../mygame

### 2.XCodeで新規プロジェクト作成
File→New→Project
iOSタグ→Single View App
※User Interface を Storyboardとすること

### 3.1で作成したファイルをプロジェクト直下に配置する
1で作成したmygameフォルダをそのままドラッグで良い

### 4.WKWebViewを配置し、ローカルのhtmlを表示する
```swift:ViewController.swift
import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        
        
        let webConfiguration = WKWebViewConfiguration()
        
        //これを入れないと効果音が出ない
        webConfiguration.mediaTypesRequiringUserActionForPlayback = []
        
        //WKWebView に Configuration を引き渡し initialize
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        //WKUIDelegate の移譲先として self を登録
        webView.uiDelegate = self
        //WKNavigationDelegate の移譲先として self を登録
        webView.navigationDelegate = self
        //view に webView を割り当て
        view = webView
        
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 読み込み開始
        if let html = Bundle.main.path(forResource: "mygame/index", ofType: "html") {
            let url = URL(fileURLWithPath: html)
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }


}
```
### 5.横画面表示のみとする
TARGETS→General→Deployment Info
のDeviceOrienttatitonのチェックボックスを
Landscape LeftとLandscape Rightのみとする

これで大体完成です。
アイコン等を設定すればストアに申請できます。
ただし、通りません。

Guideline 4.2 - Design - Minimum Functionality
となってしまいます。
何か機能を追加すれば通るかもしれません。

以上。

※追記
全部まとめて１つのアプリにしたら通りました。
https://apps.apple.com/jp/app/id1533177256