OmniAICreator/Qiita-1.07M huggingface dataset:
btootstarap

# Boot strap

## 導入方法
1 スクリプトで読み込みしき
2　ファイルをダウンロードする

## グリットシステム
・グリットシステムとはルールが決まったクラス名にcssが当てられているフレームワーク

・横幅が12当分

・padding marginの仕方を覚える

## 変更
背景　bg-**
文字色　text-****
アラート alert-***
ラベル　label-***


この記事最高：　グリットシステム
https://qiita.com/akatsuki174/items/53b7367b04ed0b066bbf

参考になり王な記事：
https://qiita.com/zaburo/items/e5b8c51873b193bb1573
アルゴリズム・データ構造の講義

#アルゴリズム・データ構造
講義で受けた、範囲の復習・まとめです。

##検索アルゴリズム
・線形探索
最初から探索する
・二分探索
真ん中で切って考える

##ソートアルゴリズム
####バブルソート
右端から順に隣り合う2つの数字を比較して入れ替える。
この作業を繰り返す。
・たまたま小さい順に並んでいたら入れ替えはなし
・たまたま大きい順に並んでいたら毎回並べ替える
計算時間はO(n^2)
####選択ソート
数列の中から最小値を検索し、左端の数字と入れ替える。
・たまたま小さい順に並んでいたら入れ替えはなし
・たまたま複雑に並んでいたら毎回並べ替える
計算時間はO(n^2)
・挿入ソート
・ヒープソート
・マージソート
・クイックソート

#データ構造
データの順番や位置関係といったデータの設計のこと。

##どのようなデータ構造があるのか
・リスト
・配列
・スタック
・キュー
・ハッシュテーブル
・ヒープ
・二分探索木

##リスト
データとポインタが1セット。
ポインタが次のデータを指していれば、バラバラに配置することが可能。

##スタック
後に入れたデータを先に取り出す。

##キュー
先に入れたデータを先に取り出す。

##Pythonでは
データの追加・取り出しに関する関数があらかじめ用意されてある。
**例**
実際に追加：append()
末尾から取り出し：pop()
先頭に追加：popleft()
VMware ESXiへ直接ログインし仮想サーバのスナップショットを取得する方法

# 経緯
今日、VMware ESXiに直接ログインして仮想サーバのスナップショットの取得を検証したので、コマンドについてメモしておく。

本来であれば、vCenterの運用を行う端末にvSphere Clientを入れてそこからGUI操作でスナップショットが簡単に取れるのだけど、現場で触っている環境構成的に端末にvSphereClientを入れられなかった為、vCenterを導入している仮想サーバにvSphereClientを入れている。
つまり、vSphereClientとvCenterは同じ仮想サーバ上に居て、ローカル接続のみ有効になっている。

この時、このvCenterを導入している仮想サーバのスナップショットを使った一時的バックアップ&リストアを考える時、スナップショットの取得は良いものの、スナップショットからの戻しはいけるか判断出来なかった。
従ってCUIのみでスナップショット取得出来る手順が必要になった。

検索してもvCenterサーバを入れている仮想サーバ上にvSphereClientを入れている環境の話は
出てこなかったので、記載しておこうかと思った。

# 環境、前提条件：
　※あとで記載します。

#コマンド
##　1、VMIDを確認する
　 # vim-cmd vmsvc/getallvms
##　2、スナップショット取得
　 # vim-cmd vmsvc/snapshot.create [VMID] [Snapshotname] 
##　3、スナップショット削除
　 # vim-cmd vmsvc/snapshot.removeall [VMID]
##　4、スナップショット状態確認
　　vim-cmd vmsvc/snapshot.get [VMID]
##  5、スナップショット断面への戻し
　　vim-cmd vmsvc/snapshot.revert [VMID] [SnapshotID]

##  6、各コマンドのhelpの出し方
　　vim-cmd help [各コマンド]


スナップショット断面への戻しコマンドが検索しても見つけられなかったので、
まとめて記載。
わからなければ6でhelp確認しながら対応。
AthenaでS3に置いてあるcsvファイルを取得する際に気をつけること 



###サンプルクエリ


```sql

CREATE EXTERNAL TABLE IF NOT EXISTS test.test (
  `test1` string,
  `test2` string,
  `test3` string,
  `test4` string,
  `test5` string,
  `test6` string 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '\"',
   'escapeChar' = '\\'
   )
STORED AS TEXTFILE
LOCATION 's3://test/test/'
TBLPROPERTIES (
'skip.header.line.count'='1', 
'has_encrypted_data'='false'
)
```


##ちょこっとだけ解説


###ROW FORMAT SERDE

SerDeとは、あらゆるデータを入出力できる形式に変換するためのインタフェースです。
csvを扱う際に選択するSerDeは主に２つで、以下になります。

```sql
/*データの値に引用符が含まれているか、別の区切り文字やエスケープ文字が含まれている場合*/
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

/*データに引用符(")で囲まれた値が含まれていない場合*/
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
```
csv内のデータに"test"など、引用符で括られたデータがあった場合、
LazySimpleSerDeだと、"test"とそのまま取り込んでしまいます。
OpenCSVSerDeというSerDeを指定すると、引用符で囲まれた文字列を取り出すことできます。
この際、細かい「区切り文字」「引用符」「エスケープ文字」などの設定はWITH SERDEPROPERTIESで、指定することになります。

※ちなみに、どのSerDeも指定しなければ、LazySimpleSerDeが自動的に適用されます。

公式ドキュメント
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/supported-format.html

あと、このあたりに関してはクラスメソッドさんの記事が参考になります。
https://dev.classmethod.jp/cloud/aws/amazon-athena-using-opencsvserde/



###STORED AS file_format
テーブルデータのファイル形式を指定するのが、STORED AS file_formatです。
csvファイルはTEXTFILEで指定します。

```sql
STORED AS TEXTFILE
```

※省略すると、デフォルトの TEXTFILE が使用されます。
他のオプションは以下のとおりです。

|file_format|
|:---|
|align-left|
|SEQUENCEFILE|
|TEXTFILE|
|RCFILE|
|ORC|
|PARQUET|
|AVRO|
|INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname|

###LOCATION

テーブルを作成する基のデータがある Amazon S3 の場所を指定します

```sql
LOCATION 's3://test/test/'
```


###TBLPROPERTIES 

```sql

TBLPROPERTIES (
'skip.header.line.count'='1', 
'has_encrypted_data'='false'
)
```

TBLPROPERTIESでは、'skip.header.line.count'='1', を指定しています。
これは、データのファイルを読み込まない行数を選択するプロパティになります。
今回は１を指定しているので、1行目が読み飛ばされ、２行目以降がデータとして認識されます。

has_encrypted_dataは、trueに設定すると、LOCATION で指定する基になるデータを暗号化することを指定します。省略すると、false が使用されます。
LaTeXを１発でコンパイルするコマンドを作った

# LaTeXを１発でコンパイルしたい！！！！！
CSGAdventCalendarの24日目です！！もう４回目ですね，張り切っていきましょう．
明日でラストです！
## はじめに
私はplatex環境でtexをコンパイルしているのですが,とにかくタイプセットしてコンパイルってコマンド三回するのがめんどくさい．．．

***なら１発でコンパイルできるコマンド作るっきゃねえだろ？？？？？？？？***

## 要件定義

・LaTeXのコンパイルを一つの**コマンド**で
・ログファイルは残さない
・ls等のコマンドのようにどこからでも使える
・カレントディレクトリに対して行う

## 環境
・MacOS High Shierra 10.13.6
.Python3.6.5
## ながれ

###1.まずは自作コマンドを格納するフォルダを作成します

```mkdir ~/Tools```
Toolsを作業ディレクトリとします
(作るコマンドを保管する場所をわかりやすくするための処理なので好きなディレクトリで作業してもらって構わないです)

###２.command.pyの作成

実行される本体となるcommand.pyを作成していきます

```command.py
#coding:utf-8
import subprocess
import sys
args = sys.argv

file = args[1]

cut_file = file.split('.')
platex = 'platex ' + cut_file[0] + '.tex'
dvipdfmx = 'dvipdfmx ' + cut_file[0] + '.dvi'
clean = 'rm '+ cut_file[0] +'.dvi '+ cut_file[0] +'.log '+ cut_file[0] +'.aux'

subprocess.call(platex.split())
subprocess.call(platex.split())
subprocess.call(dvipdfmx.split())
subprocess.call(clean.split())
```
コマンド実行時に入力したファイル名がcommand.pyの実行時の引数となるため最終的に```platex ファイル名```としていたように使える．

引数として与えられたものを変数fileに格納しcut_fileにsplitで拡張子の前後で二つに区切ります．
そして各コマンドを実行するときと同様になるように変数に連結し格納，そして実行しログファイルを最後に消します．

```platex = 'platex' + cut_file[0]　　```としてもokです私は下との統一を図るために
```platex = 'platex ' + cut_file[0] + '.tex'```としています

動かせるプログラムは完成したので７0%くらいは完了です

###5.コマンド化する
ここまできたらあとはどこからでも利用できるようにコマンドにしてあげるだけです
```alias コマンド名='実行すること```
とすることでalias(別名)を設定してあげることができ，コマンド名を入力することで実行すると定義したものを実行できます.
試しにここではalias ll='ls -l'としてみましょうするとllと入力するだけでls -lを実行できるでしょう．
しかしこのaliasには有効期限があり．ターミナルを終了するとaliasの設定した履歴も消えてしまいます．なのでこのaliasを.bash_profileに記述します

```
cd ~
ls -al
```
として.bash_profileがなければ
```touch .bash_profile```
として.bash_profileを作成してください

あることが確認できた，もしくは作成できたら
```open .bash_profile```なりviを使えるなら```vi .bash_profile```などでファイルを開き
```alias tex='python3 ~/Tools/command.py'```のようにalias コマンド名='実行する物'の形で記述してあげてください．

そうすると```tex ファイル名.tex```と実行してあげることでtexをpdfに変換することができたのじゃないでしょうか？

*シェルスクリプト(.sh)を起動して何かをするというときはchmodで実行権限を与えるというステップが増えます
以上！！！！！
闇のelif

# 実装例
```python
print('\n'.join((
    # ここから
    next((i for [f, i] in [
        [lambda: 0 == n % 15, lambda: 'FizzBazz'],
        [lambda: 0 == n %  3, lambda:     'Fizz'],
        [lambda: 0 == n %  5, lambda:     'Bazz'],
    ] if f()),
        lambda: str(n) # default
    )()
    # ここまで
    for n in range(1, 100)
)))
```

# 経緯

他の言語ならば `switch (true)` と書きたかったが `Python` に `switch` はなかった。

# 感想

毎回 `lambda` と書くのが面倒い。


# 追記 2018/09/10

より読みやすい ( と私が思う ) 書き方がありました。

```python
print('\n'.join((
    'FizzBazz' if 0 == n % 15 else
    'Fizz'     if 0 == n %  3 else
    'Bazz'     if 0 == n %  5 else
    str(n) # default
    for n in range(1, 100)
)))
```

```python
for n in range(1, 100):
    if False: pass
    elif 0 == n % 15: print('FizzBazz')
    elif 0 == n %  3: print('Fizz')
    elif 0 == n %  5: print('Bazz')
    else: print(str(n)) # default
```

# 追記 2020/06/26

match が追加されるそうです
AWSのＥＣ２のＩＰにドメインを紐付け

まず Elastic IPをつくること。これをつくると再起動してもＩＰがかわらない。

それを作ったうえで大事なのはECに紐付けをアクションする（アクションボタンはElastic IPのコンソールにある）

Route 53でHosted zonesに入り、Create Record Setボタンからリストを生成し、wwwと入力しEIPを割り当てたら完了。
AWS EC2にDockerでJenkinsを導入

## 事前準備
<a href="https://qiita.com/tu-kun/items/a8aa0926b090b7cccc9d">AWS EC2にDockerでRedmineを導入</a>のDocker, docker-composeの導入する。

## 実行情報
* Amazon Linux AMI (EC2)
* `ec2-user` で実行

## docker-compose.ymlファイルの作成
jenkinsはRedmineのymlに比べてシンプルである。
ポート3001番にアクセスことでjenkinsサービスが立ち上がるように設定。
※ ポートの開放は<a href="https://qiita.com/tu-kun/items/a8aa0926b090b7cccc9d">AWS EC2にDockerでRedmineを導入</a>参照

```yml
version: '3.5'

services:
  jenkins:
    image: jenkins:latest
    container_name: jenkins
    restart: always
    ports:
      - 3001:8080
    environment:
      JENKINS_OPTS: '--prefix=/jenkins'
    volumes:
      - /var/www/jenkins/home:/var/jenkins_home
```

`JENKINS_OPTS`に指定したパスにアクセスすることでjenkinsが起動することとなる。

* JENKINS_OPTSなし：`http://[AWSグローバルアドレス]:3001`
* JENKINS_OPTSあり：`http://[AWSグローバルアドレス]:3001/jenkins`

## jenkinsディレクトリ権限変更
AWSサーバにjenkins情報を保存するために`/var/www/jenkins/home`を用意する。
rootユーザやec2-userで作成するとjenkinsを起動したときに権限エラーでdockerが立ち上がらずStarting状態から進まない状態となるため、権限を変更する必要がある。

```bash
$ sudo su
$ cd /var/www
$ chown -R 1000:1000 jenkins
```

## Jenkins起動
```bash
$ docker-compose up -d
$ docker-compose ps
```

## Jenkins初期パスワード
ブラウザから初回アクセスするときにパスワードが必要となるので、予めメモをしておく。

```bash
$ cat /var/www/jenkins/home/secrets/initialAdminPassword
```


## Jenkinsアクセス
ブラウザから`http://[AWSグローバルアドレス]:3001/jenkins`にアクセス

### ログイン画面
Jenkis初期パスワードでログイン
![jenkins1.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/5220d946-8aaa-21d2-6e15-75d5261c61d4.jpeg)

### カスタマイズ画面
「Select plugins to install」を選択
![jenkins2.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/4798e889-8531-b6f0-17f3-0784eb2d8501.jpeg)

### プラグイン選択画面
お好みで導入したいプラグインを選択
![jenkins3.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/121734aa-aa0c-ff9d-c248-12cc2a993deb.jpeg)

### Adminユーザ作成画面
Jenkinsの初期Adminユーザを作成
![jenkins4.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/91db46b3-4ae8-fd35-babc-85c9bdfc6a4c.jpeg)

### 完了画面
これでJenkins設定は完了！
![jenkins5.JPG](https://qiita-image-store.s3.amazonaws.com/0/248805/f52c5dc5-843c-a004-1982-1b2ec87a5719.jpeg)


よいビルド・デプロイ人生を！！！
コードジェネレーターには2種類ある

最近 `Sourcery` というOSSを使ってSwiftメタプロしてます。

色々使っていると、生成ファイルの一番上に `// DO NOT EDIT` と書いてあるのを発見しました。そこで、

**「自動生成のコードって編集しちゃだめなんだっけ？...そういえば[達人プログラマー](https://www.amazon.co.jp/達人プログラマー―システム開発の職人から名匠への道-アンドリュー-ハント/dp/4894712741)にコードジェネレーターの章があったな...。読み返そう！」**

と思ったので読み直してみたところ、「ソースコードジェネレーターは2種類ある」と記述されていました。

今回はこれについてまとめていきます。

結論を先に言うと、**<font color="Red">「(たぶん)自動生成のコードは編集して良い」 </font>**です。

# 消極的なコードジェネレーター
## 目的
タイピング量を削減する。

## 解決策
パラメーター化されたテンプレートで、入力の組みから指定通りの出力を生成する。

## 生成コードとコードジェネレーターの関係
成果物を作り出すために**一度だけ実行するもの**
それ以降、生成コードはコードジェネレーターから独立する。

## 生成後の扱い
一人前のソースファイルになり、**<font color="Red">編集、コンパイルされ、ソース管理の対象にもなる。
 </font>**

## 特徴
完全に正しいものを作る必要がない。精度が100%でなくとも、
(出力を修正するコスト + コードジェネレータに費やした時間) < (普通に書く時のコスト) 
が成立していれば良い

# 積極的なコードジェネレーター

## 目的
利便性を追求する。

## 解決策
元となる唯一の知識を読み込み、アプリケーションが必要とするさまざまな形式に変換する。

## 生成コードとコードジェネレーターの関係
**結果が必要となるたびに実行する。**
必要に応じて何度もコードジェネレーターを用いて、結果を再生成しなおす。

## 生成後の扱い
変換された形式は使い捨て。

## 例
データベーススキーマの変更に合わせて、対応するソースコードを再生成する。
(iOSなら依存性自動解決してくれるDIライブラリの[DIKit](https://github.com/ishkawa/DIKit)が思い当たった)

# 振り返り
ここまでを見ていくと**「自動生成のコードを編集する」**という使い方は、**消極的なコードジェネレーター**に当てはまる事が分かりました。

`// DO NOT EDIT` と書いてあったのは、作者が **積極的なコードジェネレーター** のみをイメージして作成したからかもしれません。

作者の意図とは異なるかもしれないのですが、 「構文解析→メタプロの組み合わせでタイピング量が更に減らせるなら積極的に使っていこう！」と楽観的に捉えています。

あと達人プログラマーは素晴らしい本なのでオススメです！
hoge(Request $request)ってなんだ??👶

#Requestと$request#
Laravelをいじっていると
確実に現れる

```
public function hoge(Request $request){
....
}
```

でどうやってリクエストの内容を受け取っているのかよくわかってなかったので調べた
程度の低い疑問である気がするが、割とまとまってる記事も少なく書いてることもバラバラだったので個人的見解にはなってしまいます。。詳しい方、訂正あればぜひご教授いただけると大変幸いです:heart_eyes:

#Requestクラスとrequestインスタンス
きもはhogeアクション引数のRequestクラスとrequestインスタンス！
Controllerの上部でuseしている中にRequestクラスの記述があり、それを使用している。
クラスがあるならインスタンスを用意して使っていかないといけない。

それがお隣にある＄request(requestインスタンス)である。
とはいっても別にnewされているわけでもないのにどうやってRequestクラスからのインスタンス化を行っているの？？という話なんですが、

Laravelに既存で搭載されているサービスプロバイダという機能を使って自動でインスタンス化を行ってくれます。

```
①Requestクラスのインスタンスをサービスプロバイダにより自動生成、$requestとなる

②$requestインスタンスにリクエストの内容を注入
```


という流れになる
なーんかいつも書いてあるけどどんな感じなのかってのはザックリこんな感じですね:helmet_with_cross:
メカトロ講座01 git シチュエーション別コマンド一覧

# 概要

自分用のメモとしてgitのコマンドをシチュエーション別にまとめました。

# 初回作業

## リポジトリの作成
プログラムのあるディレクトリの一番上に行きます。
例えばaaa/bbb/内にプログラムがあるなら`cd aaa/bbb`とします。この時のbbbの名前は実は自由です。リポジトリ名はgithubのwebページで指定します。

```
cd {リポジトリのパス}
git init
```

## githubからcloneする
githubの場合はhttpだと毎回ユーザー名とパスワードを入れる必要があります。sshは逆にあらかじめgithubのページでssh鍵を登録すればパスワード等は必要ありません。

```
git clone http://https://github.com/{ユーザー名}/{リポジトリ名}.git　# httpでアクセス
git clone git@github.com:{ユーザー名}/{リポジトリ名}.git             # sshでアクセス
```

## gitの設定
ubuntuだとデフォルトのエディタはnanoになるのでvimに変更します。

```shell
git config --global user.name "user name"
git config --global user.email username@example.com
git config --global core.editor vim
```

# ローカルでの作業

## ローカルで単純にコミット
```
git add .
git commit #ここでediterが起動してcommentを入れる。
```

コメントを決めてcommitするときは`git commit -m "comment"`

# プッシュ時の作業

## 単純にプッシュ
```
git push
```

# プル時の作業

# ブランチ作業

## 作業途中(未commit)でbranchを切り替える
###切り替え時

```shell
git stash save
git checkout {ブランチ名}
```

###戻る時
```shell
git checkout {元のブランチ名}
git stash pop
```

## リモートリポジトリのブランチを持ってくる。
```
git fetch
git branch -r
git checkout -b [name] origin/[name]
```
macにvim8.1とプラグインをインストール

vim8.1がリリースされたので重い腰を上げて数年放置している自分のvim環境をリプレースすることを決意。
以下は軌跡である。

やってみた感想:やれば結構すぐ終わるから面倒くさがらずに早くやればよかった。。。

# vim8.1へupdate
```
$ brew install vim
~略~
$ /usr/local/bin/vim --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 22 2018 13:55:00)

# .bashrcでvim8.1を向けた。このときvimrcも専用ファイルにした。
alias vi="/usr/local/bin/vim -u ~/.vimrc-local8.1"
```

# いつもの設定を.vimrc-local8.1へ移植
お好みで

```
" vi互換モードを廃止
set nocompatible

" ステータスバー2行
set laststatus=2

set expandtab     " タブ入力を複数の空白入力に置き換える
set tabstop=2     " 画面上でタブ文字が占める幅
set shiftwidth=2  " 自動インデントでずれる幅
set softtabstop=2 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent    " 改行時に前の行のインデントを継続する
set smartindent   " 改行時に入力された行の末尾に合わせて次の行のインデントを増減する

syntax on

"インクリメンタルサーチを有効にする
set incsearch
" 大文字小文字を区別しない
set ignorecase
" 検索文字ハイライト
set hlsearch

""""""""""" insert mode
" backspace
set backspace=indent,eol,start

" insertモードから抜ける
inoremap <silent> jj <ESC>

" 挿入モードでのカーソル移動
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-n> <Left>
inoremap <C-l> <Right>
```

# プラグイン管理
readmeを参考にしてvimに闇の力を注入する。
今まで使っていたneobundleからリプレース。
https://github.com/Shougo/dein.vim

# プラグインインストール
必要なプラグインをインストール
.vimrcに`dein#add('#{github path}')`を加えて、`:call dein#install()`でインストールできる

```
" 例
call dein#add('tpope/vim-fugitive')
```
* vim上でgitコマンドがつかえる  
https://github.com/tpope/vim-fugitive
* gitの変更行に印がつく  
https://github.com/airblade/vim-gitgutter
* ステータスバーのカスタマイズ  
https://github.com/vim-airline/vim-airline  
https://github.com/vim-airline/vim-airline-themes  
https://github.com/ryanoasis/vim-devicons  
* ファイルを開く  
https://github.com/Shougo/unite.vim  
https://github.com/Shougo/neomru.vim  
* カラースキーマ  
https://github.com/tomasr/molokai
* 補完 ※邪魔に感じたので結局無効化  
https://github.com/Shougo/deoplete.nvim

# gitのcommitメッセージでvimを使う

```
git config --global core.editor 'vim -u ~/.vimrc-local8.1'
```

# ctagsをmacの設定
下記を参考にした
https://qiita.com/maeharin/items/9f98c0d63ab764ee21a8
bing for businessの検索対象を調べてみた（プレビュー）

今回はスクリーンショットばっかりです。
[前回の投稿](https://qiita.com/h-nagao/items/9187a6703c15d0a69e8f)では、日本でも一部のユーザーにのみ公開されている**bing for business**が弊テナントにやってきたということを書きました。
今回は、このbing for businessでテナント内の何が検索できるのかを調べてみたので紹介します。

##そもそも検索の設定はどこにあるのか
テナント内でのbing for businessの検索設定は、Office365 admin center内の[サービスとアドイン]から設定可能です。
![bing_error (2).png](https://qiita-image-store.s3.amazonaws.com/0/202779/5dbe2520-a576-ac8c-c00f-ac04273be6c7.png)
現在はもう表示されなくなってしまったのですが、検索の対象として
「People」「Document」「Group」をON/OFFできました。
ですが、後述するように、現時点でのプレビュー機能＆弊テナントでは、「Document」「Site」が検索対象となっています。

##試してみた
テナント内のどんなコンテンツが検索にヒットするのか試してみました。
<img width="1209" alt="search_result1.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/a949971d-738a-b4c0-4a2c-d5df6d76bad8.png">
「test」という文字列で検索した結果、上手のような表示になっています。
**検索対象の大きな分類としては「ドキュメント」と「サイト」**でした。
もう少し見てみると、例えばドキュメントでは、ファイル名だけでなく、ファイル内の文字列も検索に引っかかっていることがわかります。
<img width="894" alt="search_result2.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/78f8dae5-6871-9820-d0bd-c17aa6db600e.png">
また、サイトの検索結果では、サイトURL、サイト名だけでなく、モダンページの中にあるリンクまでヒットしていることがわかりました。
<img width="1225" alt="search_result3.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/758d5695-0481-e6f2-e547-e2106238ef76.png">

少しまとめると検索対象は以下のような感じです。

- ドキュメント
    - ファイル名
    - ファイル内のテキスト
- サイト
    - サイト名
    - サイトURL
    - サイトページURL
    - サイト内文字列

※残念ながらリストアイテムや、ライブラリ名・URLでは検索に該当しませんでした

ということで、いまはまだ、SharePointのサーチセンターに劣るくらいの機能性ですが、今後の改善に期待したいと思います。
vue-cliでプロジェクトを作ってgithubページで公開する

# 手順

## vue-cliをインストールする(初回のみ)

```sh:
$ npm install -g vue-cli
```

## プロジェクト名を変数に設定

```sh:
PJNAME=vuetes
```

## プロジェクトを作成する

質問は全てENTERでOK

```sh:
$ vue init webpack ${PJNAME}
```

```sh:
$ cd ${PJNAME}
```

## jsやcssを相対パスで取得するように変更



build内のassetsPublicPathを修正する

```js:config/index.js
build: {
  :
  assetsPublicPath: '/',
  :
```

↓

```js:config/index.js
build: {
  :
  assetsPublicPath: '',
  :
```

## github pagesへのデプロイを簡単にするプラグインを追加

```sh:
$ npm install gh-pages --save-dev
```

### package.jsonを修正

scriptsにdeployを追加する

```json:package.json
"scripts": {
    "deploy": "gh-pages -d dist",
    :
}
```

## コミットする

```sh:
$ git init
$ git add -A
$ git commit -m "commit"
```

## githubでリポジトリを作ってpushする

```sh:
$ REPO=$(basename $PWD);
$ GHUSER=$(git config --get user.name);
```

```sh:
$ GHPASS=githubパスワードを入力
```

```sh:
$ curl -u $GHUSER:$GHPASS https://api.github.com/user/repos -d '{"name":"'$REPO'"}' --fail;
$ git remote add origin git@github.com:$GHUSER/$REPO.git;
$ git push origin master
```

## github pagesにデプロイする

```sh:
$ npm run build
$ npm run deploy
```

## 動作確認

```sh:
$ open https://yfujii01.github.io/${PJNAME}/
```

↓これが出たら成功

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/aa162867-d80a-a328-5361-e1baa7dbb380.png)
PureComponent考

何番煎じになるかはわからないですが、`React.PureComponent`についてまとめてみました。

# 前提
## `shouldComponentUpdate`

Reactは仮想DOMフレームワークなので、更新が多くなってもDOM操作が積もることはないのですが、コンポーネントが多くなれば仮想DOMの更新だけでも処理がかさんできます。

そこで、`shouldComponentUpdate(newProps, newState)`というメソッドを用意して、更新したいときだけ`true`を、更新不要な場合には`false`を返すようにすることで、仮想DOMの操作もカットできるようになります。

## `PureComponent`

そして、`shouldComponentUpdate`を書く場合、多くは「`props`と`state`のプロパティをそれぞれ比較」というような形になるかと思います。このような形の`shouldComponentUpdate`を造り付けた`Component`が`PureComponent`です。

`PureComponent`では、`props`と`state`のプロパティそれぞれを、浅い比較（オブジェクトが同じか）でチェックしていきます。

# 動作の比較
## 正常動作しない場合

まず、`PureComponent`で行われる比較は浅い比較ですので、プロパティにセットしたオブジェクトを破壊的に変更するような場合、比較が一致してしまうので、更新がバイパスされてしまいます。このような場所に`PureComponent`を使うと、うまく動かなくなってしまいます。

もっとも、[Reactのリファレンスでも触れられている](https://reactjs.org/docs/optimizing-performance.html#the-power-of-not-mutating-data)ように、破壊的変更に頼らないのがReact流です。ということで、`PureComponent`を使うぐらいにチューニングする以上は、`props`や`state`以下は破壊的変更を行わない、ということにして先へ進みます。

## 更新する場合、しない場合

では何でもかんでも`PureComponent`にしてしまえばいいのかといえば、そういうわけでもありません。単なる`Component`と`PureComponent`を比較すると、以下のような感じになります。

* 比較結果が一致した場合…`PureComponent`は仮想DOM関連の処理をバイパスできるので、`Component`に対して**有利**。
* 比較して一致しない場合…`PureComponent`は比較を行う分、`Component`に対して**不利**。

ということで、`PureComponent`の比較で更新をバイパスできない場合は、比較自体の処理分だけコストが乗ってしまうことになります。

# ケーススタディ
## ルートコンポーネント

Reactでルートとして`render`する、`<App>`のようなコンポーネントは、「上部のツリーが`render`されたからそれに合わせて再`render`」ということが起きない以上、`render`が走るとき=内部で`state`が変わったとき、です。つまり、`PureComponent`にしてバイパスできることはありません。比較コストが無駄になるだけです。

同様の理由で、ページを構築するような大規模なコンポーネントも、`PureComponent`にするのはデメリットのほうが大きいです。

## 配列の`map`

配列を`map`してコンポーネントに変換することも多いですが、「破壊的変更をしない」という前提では中身の変更と同時に配列ごと変更する必要があるので、配列の変更に際して`PureComponent`化しても意味はありません。

ただ、配列で`map`される子の方を`PureComponent`にしておけば、配列の中で順番が入れ替わったりしても移動だけで済みますし、効率的に運用できます。このように、コンポーネントを細かく切っておくと便利な場面も、Reactでは多々あります。

## 関数コンポーネント

`state`や`ref`、ライフサイクルメソッドを使わないコンポーネントは関数としても書けますが、`props`もシンプルな関数コンポーネントだと`PureComponent`も相性がいいものです。

ただ、関数コンポーネントのままでは`PureComponent`化できませんが、[acdlite/recompose](https://github.com/acdlite/recompose)の`pure`のような「関数コンポーネントを受け取って、それを`render`する`PureComponent`を返す関数」（高階コンポーネント、**H**igh **O**rder **C**omponent）を使うことで、わざわざそのためだけにクラス化しなくても`PureComponent`として活用できるようになります。
自宅でWebアプリ作成 [1日目]

#はじめに
未経験から右も左もわからず入社後、エンジニアとして働き早3年。
趣味の関係で自宅サーバを使ってWebアプリを作りたくなり、サーバ構築から頑張ることにしました。
非公開でいいのでセキュリティとかは考えていません。入れて作って動けばいいやって感じです。
せっかくなので備忘録として残そうと思います。
#環境
どれだけ書けばいいのかわかりませんが、ひとまず。

■クライアント
・Windows10 Home(64bit)
・HDD 1TB
このマシンで構築します。

■サーバ(仮想)
上のマシンに仮想環境構築(予定)
・CentOS7
・VMware
#無知を知る
と、環境まで書きましたが、仕事で全くサーバをさわったことのない私は、
・CentOSを入れればいいんでしょ
・あとはIIS入れとけばアプリ開発行ける！
とか思ってました・・・・。

で、そのままCentOS7(のiso)を落としてきてさぁOSインストールしよう！と思ったときに、ふと

あれ？今使ってるWindows10にそのまま入れられるのか？

と思い、ちょっと調べたら、だめでした(当たり前だ)。

ちょっと古いですが[こちらの記事](https://begi.net/read/misc/08.html)に、たどり着き、
仮想環境構築してそこにCentOSを入れることを初めて知りました。

仕事でも仮想環境はさわったことがあるのですが、それはもう構築されていてOSもインストールされている状態。
自分は何も考えずにリモート接続して作業してるだけでした。
何事にも興味を持つってなかなかできませんね・・・。

#はじめの一歩
何はともあれ、今必要なものは把握したのでCentOS7とVMwareのダウンロード中です。
ダウンロード時参考にさせていただいたサイトはこちら↓
https://www.rem-system.com/centos-install/#CentOS_7_iso

今日はダウンロードで終わりそうです。

#今後
これから毎日とはいかずとも進捗があったときは更新しようと思います。
調べてすぐ出てくるものを詳しく書くつもりはなく、めっちゃハマったときに詳しく書こうと思います。
それでは頑張ります。
初心者でもできる!!!pythonで覚える!!!!!!アルゴリズム!!!!!!!!part1!!!!!!!!!(合計値)

#合計値を求めるアルゴリズム
##1: 配列にデータを格納する
###(配列のイメージは箱の中にいくつもにデータが入っていて、指定したデータを取り出すことができる)
##2:変数を初期化する(0にする)
###(変数も同じく箱をイメージ。しかし、データは1つしか入らない)
##3:配列の最初から最後までの要素を宣言
###(要素の宣言とは、配列に格納されている各値を記述すること)
##4:変数に配列の各値を1つずつ加算していく
##5: 3,4の中で繰り返す
###(配列の要素が 1,2,3,4,5,6 なら 1加算して、2加算して、3加算して...を 6まで繰り返す)
##6:合計値が得られる
今回の場合:21

サンプルコード

<img width="712" alt="スクリーンショット 2018-09-05 23.42.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/286808/eb8d5414-95da-7e98-ca03-87a0151b425d.png">



実行結果

<img width="714" alt="スクリーンショット 2018-09-04 22.53.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/286808/07d226d9-47fe-43f3-a950-1d8bee789551.png">
CentOS6.6 で td-agent1 から td-agent2 へのバージョンアップを行った際のメモ

## 概要

td-agent1 から td-agent2 へのバージョンアップを行った際のメモです。

実際は td-agent2 をインストール後に `configtest` を叩いて、設定ファイルを修正しましたが、
可能であれば td-agent2 がインストールされた検証環境などで `configtest` を叩いていれば、
焦らずに設定ファイルの修正が出来たかなと思います。

## 環境

-   CentOS 6.6
-   td-agent
    -   変更前: 1.1.11-0.x86_64
    -   変更後: 2.3.6-0.el6

## 手順

1.  リポジトリ事前確認
    -   `インストール済みパッケージ` が v1 であること
    -   `利用可能なパッケージ` が v2 であること

    ```sh
    # yum info td-agent
    ```

2.  td-agent 停止

    ```sh
    # /etc/init.d/td-agent status
    # /etc/init.d/td-agent stop
    # ps auxwwf | grep -w [t]d-agent
    ```

3.  td-agent v1のアンイストール

    ```sh
    # yum remove td-agent
    ```

4.  td-agent v2のインストール

    ```sh
    # yum install td-agent
    ```

5.  td-agent プラグインのインストール

    ```sh
    # /opt/td-agent/embedded/bin/fluent-gem install your-plugins
    ```

6.  td-agent 起動

    ```sh
    # /etc/init.d/td-agent configtest
    # /etc/init.d/td-agent status
    # /etc/init.d/td-agent start
    # ps auxwwf | grep -w [t]d-agent
    ```

7. エラーが出てないか確認

    ```sh
    # less /var/log/td-agent/td-agent.log
    ```

## 参考記事

-   [Treasure Agent(td-agent)の1と2の今後](https://qiita.com/repeatedly/items/c8107bc8ba5ba01133f8)
-   [td-agentをv1からv2にバージョンアップした話](https://qiita.com/yoshi-taka/items/84ff34bbe083e98a1e3c)
ROS講座52 webサーバーを立てる

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 20.04 |
| ROS | Noetic |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
ROSとの通信を他のデバイスから行いたいことがあります。例えば

* ロボットへのボタン入力を行いたい。
* スマホでシステムの状態を監視しながらロボットを動かしたい
* 遠くからROSにつながっているWebカメラの画像を見たい

ということがあります。1番目のボタン入力ですが、ROSはRvizがあるので表示などの出力側は豊富にあるのですが、ボタン入力などの入力側の機能はあまりリッチではありません。人とのインターフェイスはWEB系のほうが豊富なので、Web経由でROSと通信できるとこの部分の製作が楽になります。
今回はそのはじめとしてROSの機能でWebサーバーを立てる方法を説明します。

# roswwについて

## インストール
rowwwwというROSパッケージをインストールします。これはwebサーバーを立ち上げるROSパッケージです。

```shell
sudo apt-get install ros-noetic-roswww
```

## ディレクトリ

```shell:roswwwの起動
roslaunch roswww roswww.launch 
```

roswwwを起動したらブラウザで`http://localhost:8085`というアドレスでアクセスします。このページではPCにインストールされているROSパッケージの一覧が表示されます。
![web_page1.png](https://qiita-image-store.s3.amazonaws.com/0/254442/9a857c94-8419-70c7-04c5-4ad54999b513.png)

`http://localhost:8085/{ROSパッケージ名}`というアドレスでは`{ROSパッケージのディレクトリ}/www`というフォルダにアクセスします。

# ソースコード
## html
シンプルなただ文字を表示させるだけのhtmlです。

```html:web_lecture/www/index.html 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    web_lecture index.html
  </head>
  </body>
</html>
```

# web閲覧

roswwwを起動したらブラウザを開いて`http://localhost:8085/web_lecture/index.html`にアクセスします。先ほどのwwwフォルダに入れたhtmlファイルが見えます。
![web_page2.png](https://qiita-image-store.s3.amazonaws.com/0/254442/99db297e-2e47-27d7-4a99-fcda439dfe22.png)

ブラウザによっては同じアドレスで前にアクセスしたページをキャッシュしていることがあります（FireFoxはこの仕様です）。この状態だとF5を押しても更新されません。ctrl+F5で更新しましょう。

# 参考
[ROSのwebインターフェイスを作る](https://qiita.com/yoneken/items/7e45ad3fcf8010ed98ed)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
enumの使い方を整理してみた

こんにちは。ENDoDoです。

仕事でコード書いたり、勉強を始めたものの、Qiitaのネタで新規性のあるものを常に書くのって難しいので、業務やプライベートで詰まったりしたこととかをまとめていくのもありかと思って書こうと思います。

## 第二弾
今回はenumの使い方について書きたいと思います。

といっても、自分でサンプルを作るのは大変なので、このたびとても参考になったエンジニアのヤマシタさんのサンプル内容を勝手ながら流用させていただきたいと思います。
https://www.sejuku.net/blog/35711/


## 列挙型（enum）について
enumってstructや配列とどう違うの？？とか思ってましたが、使い方が色々ありすぎて非常にとっつきづらいと感じたので、使い勝手をさっとまとめてみました。

### 通常の定義

```
enum Fruits {
    case apple
    case orange
    case melon
    case banana
    case pineapple
}
```

要素の取得は以下のようにします。

```
//列挙体の要素を取得
let basket = Fruits.apple
print(basket)
```
出力結果：apple

Fruits.apple　は　列挙体名.列挙子　と呼びます。

### 型省略

```
//列挙体の要素を取得
var basket: Fruits
basket = .apple
print(basket)
```
出力結果：apple

こんな感じで型を指定すると、.hogeって感じで値が参照できます。

### ifで比較

```
//列挙体の定義
enum Fruits {
    case apple
    case orange
    case melon
    case banana
    case pineapple
}
 
let basket = Fruits.melon
 
//if文による比較
if ( basket == .apple ) {
    print("This is an apple.")
} else if ( basket == .orange ) {
    print("This is an orange.")
} else if ( basket == .melon ) {
    print("This is an melon.")
} else if ( basket == .banana ) {
    print("This is an banana.")
} else if ( basket == .pineapple ) {
    print("This is an pineapple.")
} else {
     print("It does not apply to any")
}
```

出力結果：This is an melon.

このとき、basketには「Fruits.melon」が入ってるんですが、これはイコール「.meron」なので、上記結果が出力されます。

ただ、print(basket)　→　melon になります。
※「.melon」ではないので注意。ちょっと混乱してきます

### 値を設定

```
enum Fruits: String {
    case apple = "りんご"
    case orange = "オレンジ"
    case melon = "メロン"
    case banana = "バナナ"
    case pineapple = "パイナップル"
}
```

値も入ります。キモいですね。

```
let basket = Fruits.apple.rawValue
print(basket)
```
出力結果：りんご

取り出したかったらこうやります。
整理すると、こうですね。
* print(Fruits.apple) → apple
* print(Fruits.apple.rawValue) → りんご

### 入れ子

```
//列挙体の定義
enum Weekly {
   enum Dinner {
    case Pasta
    case Curry
    case Tenpura
  }
}

let Dinner = Weekly.Dinner.Curry 
print(Dinner)
```
出力結果：Curry

ただし、以下のようにはできません。
`case Curry = "カレー"`
こうしたい場合には、
`enum Dinner: String {`
とDinnerにStringを継承させてあげる必要があります。

すると、
print(Weekly.Dinner.Curry.rawValue)　→　カレー
と出力できるようになります。

### イニシャライザ

```
//列挙体の定義
enum Fruits {
    case apple
    case orange
    case melon
    case banana
    case pineapple
    
    init(){
        self = Fruits.apple
    }
}
 
//インスタンスを生成
let cl = Fruits()
 
print(cl)
```
出力結果：apple

イニシャライザを指定して、インスタンスを生成することもできます。まじでキモいな。。
self.appleじゃなくて、Fruits.apple　？？
自分自身.case（列挙体名.列挙子）をselfに代入する　と書きます。。。
今の僕にはなんかしっくりきません。

### 引数を指定

```
//列挙体の定義
enum Fruits {
    case apple(price: Int)
    case orange(price: Int)
    case melon(price: Int)
    case banana(price: Int)
    case pineapple(price: Int)
}
 
//引数を指定する
let basket1 = Fruits.apple(price: 100)
let basket2 = Fruits.orange(price: 80)
 
print(basket1)
print(basket2)
```
出力結果：
apple(100)
orange(80)

caseには引数も入ります。。もうヤダ

`case apple(price: Int) = "りんご"`
ということはできません。

## おわりに
enumの基本的な使い方をざっと整理しましたが、あくまで基本的な話なので合わせ技などが出てくると色々混乱してくると思います。
その辺りはまた経験を積んだらまとめたいと思います。
ES6入門まとめ

#ES6
ES6は別名ES2015と呼ばれます。
今回は、ES6の入門部分を学習した際の気になった点をまとめました。

##計算
```javascript
//%を用いると割った際の余りの数字を示せる。この場合は余り１。
console.log(9%2);
//文字列を結合して表示するやり方。Iloveyouと表示する場合。
console.log("I"+"love"+"you");
//数字も結合して表示できます。2018と表示する場合。
console.log("20"+"18");
```

##変数・定数の表記
```javascript

//letは変数を定義する
//変数名が二文字以上の場合は大文字で区別する。
let secondName = "John";
console.log(secondName);
//constは定数を定義する
```

##if文の表記
```javascript
//3の倍数であれば3の倍数であることを表記する
 if(number % 3===0){
    console.log("3の倍数です");
  }else{
    console.log(number);
  }
```

##配列
```javascript
const animal1 = "dog";
const animal2 = "cat";
const animal3 = "snake";
//配列として表す場合
const animals = ["dog", "cat", "snake"];
```
Unreal Engine 4の概要

## Unreal Engine 4 (UE4) の概要
- 特徴
    - リアルな3D表現に長けたクロスプラットフォームゲームエンジン。
    - 対応プラットフォーム : iOS/Android/Windows/Mac/etc...
- 開発言語
    - C++
- 開発者
    - Epic Games 
- Webサイト
    - https://www.unrealengine.com/


## UE4はどんなものに使われているのか
### ゲーム
- ファイナルファンタジーVII リメイク
- ドラゴンクエストXI 過ぎ去りし時を求めて
- キングダム ハーツIII
- エースコンバット7 スカイズ・アンノウン
- ヨッシー for Nintendo Switch(仮称)
- 鉄拳7
- Gears of War4
- ストリートファイターV
- etc

参考：[Unreal Engineを採用したゲームソフト一覧 - Wikipedia](
https://ja.wikipedia.org/wiki/Unreal_Engine%E3%82%92%E6%8E%A1%E7%94%A8%E3%81%97%E3%81%9F%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%BD%E3%83%95%E3%83%88%E4%B8%80%E8%A6%A7)

### ゲーム以外

- 建築業界で、建築シミュレータ
- 自動車業界で、乗用車のリアルなプロトタイピング
- etc

参考：[Unreal Studio](https://www.unrealengine.com/ja/studio)

## UE4の優れたところ
- ハイクオリティなリアルタイム3Dグラフィック表現ができる
- デザイナーとプログラマーが適切に分業できるツールが揃っている（Unreal Way）

## UE4の対抗馬
- [Unity](https://unity3d.com/jp)
    - Unityのほうが個人で使っている人が多く情報が手に入りやすい印象
    - メジャーな事例も多い(ポケモンGOなど)。
    - 細かな質感についてはUE4のほうが良いようにみえる
- [Amazon Lumberyard](https://aws.amazon.com/jp/lumberyard/)
    - Amazonのゲームエンジン
    - CryEngineベースのためクオリティはある程度期待できる
    - Amazon所有のTwitchやAWSとの連携しやすさが期待できる
    - ただし事例が少ない

## UE4の利用条件

- UE4を使うこと自体は無料。
- UE4を利用したゲームを有償で販売し、そのゲームの売り上げが四半期で$3000以上あった場合、そのゲームの売上金額の5%を支払う。
- アミューズメント施設や映像作品等・建築シミュレーションなどではライセンス料の支払いが免除される。
- 法人別のカスタムライセンスも可能。

**※利用条件は変わることもあるので、必ずUE4のサイトを確認してください。**

## UE4の事例
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Unreal Engine 4の事例 : Gears of War 4<a href="https://t.co/AtqLpbK47B">https://t.co/AtqLpbK47B</a></p>&mdash; kabosusoba (@kabosusoba) <a href="https://twitter.com/kabosusoba/status/1036954778725543936?ref_src=twsrc%5Etfw">2018年9月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Unreal Engine 4の事例 : ドラクエ11<a href="https://t.co/hmJimfHuVU">https://t.co/hmJimfHuVU</a></p>&mdash; kabosusoba (@kabosusoba) <a href="https://twitter.com/kabosusoba/status/1036961427020365825?ref_src=twsrc%5Etfw">2018年9月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Unreal Engineの事例 : 鉄拳7 <a href="https://t.co/PHUs5BjHW1">https://t.co/PHUs5BjHW1</a></p>&mdash; kabosusoba (@kabosusoba) <a href="https://twitter.com/kabosusoba/status/1036961793107668994?ref_src=twsrc%5Etfw">2018年9月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
golangでCleanArchitectureのusecase部を実装してみた

この図の右下にある、ピンク色のUse Casesの部分。
[クリーンアーキテクチャ(The Clean Architecture翻訳)](https://blog.tai2.net/the_clean_architecture.html)より
![cleanarchitecture](https://blog.tai2.net/images/CleanArchitecture.jpg) 
今一番パパっと手が動くのがScalaなので先にScalaで超素朴に実装するとこんな感じかなと。

```scala:scala
trait InputPort[I, O] {
	def run(param: I, outputPort: OutputPort[O]): Unit = outputPort.run(doRun(param))
	protected def doRun(param: I): UseCaseResult[O]
}

trait OutputPort[T] {
	def run(usecaseResult: UseCaseResult[T]): Unit
}

type Errors = List[String]
type UseCaseResult[O] = Either[Errors, O]
```

特にこのInputPortでやっているtemplate methodな部分をgolangで書くとどうやるのかなーとすぐに思いつかなかったのでトライしてみた。

こんな感じ・・・かな？

```go:go
package usecases

type InputPort struct {
	Interactor Interactor
}

func (inputPort InputPort) Run(param interface{}, outputPort OutputPort) {
	outputPort.Run(inputPort.Interactor.Run(param))
}

type Interactor interface {
	Run(param interface{}) UseCaseResult
}

type UseCaseResult struct {
	Value interface{}
	Error error
}

type OutputPort interface {
	Run(result UseCaseResult)
}
```

追記：
単にこんなんでも良いような気もする。

```go:go
type InputPort interface {
	Run(param interface{}) UseCaseResult
}

type OutputPort interface {
	Run(result UseCaseResult)
}

func Run(param interface{}, inputPort InputPort, outputPort OutputPort) {
	outputPort.Run(inputPort.Run(param))
}
```
ubuntuとwindowsをデュアルブートしたとき時間がずれたらこれを打つ

Ubuntu18.04LTS
windows10home

windowsが-9hずれる。
これを端末から入力する。

```bash
sudo timedatectl set-local-rtc true
```

参考サイト
[Oba-Q's Free Space マルチブート時の時刻設定]
(https://oba-q.com/?p=4466)
FlaskでdictConfigを使ったloggingメモ

Pythonの[Flask](http://flask.pocoo.org/)でdictConfigを使ったlogging設定備忘録です。

# 1. ソース

```python:app.py
#!/usr/bin/env python3
from flask import Flask
from logging.config import dictConfig

dictConfig({
    'version': 1,
    'formatters': {
        'file': {
            'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
        }
    },
    'handlers': {
        'file': {
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'formatter': 'file',
            'filename': './log/test.log',
            'backupCount': 3,
            'when': 'D',
        }
    },
    'root': {
        'level': 'DEBUG',
        'handlers': ['file']
    }
})

app = Flask(__name__)

@app.route('/')
def hello():
    app.logger.debug('debug')
    app.logger.info('info')
    app.logger.warn('warn')
    app.logger.error('error')
    app.logger.critical('critical')
    return 'hello'

if __name__ == "__main__":
    app.run(host='0.0.0.0')
```

# 2. dictConfig説明

|          項目          |                              説明                              |
|------------------------|----------------------------------------------------------------|
| version                | スキーマのバージョンで現在は `1` しか有効ではない              |
| formatters             | ログのフォーマットを設定する                                   |
| formatters/file        | ログフォーマットの定義名を `file` と設定している(任意)         |
| formatters/file/format | `file` のログフォーマットを指定                                |
| handlers               | ハンドラを設定する                                             |
| handlers/file          | ハンドラの定義名を `file` と設定している(任意)                 |
| handlers/class         | ハンドラで使用するモジュールを指定                             |
| handlers/formatter     | `class` で設定したモジュールの引数                             |
| handlers/filename      | 同上(ログ出力先)                                               |
| handlers/backupCount   | 同上(ローテート数)                                             |
| handlers/when          | 同上(ローテートタイミング、ここではdaily)                      |
| root                   | ルートロガーの設定                                             |
| root/level             | ログに記録するロガーレベルを設定(ここではDEBUG以上のものは記録) |
| root/handlers          | 使用するハンドラを設定                                         |

# 3. 記録されるログ例

```
[2018-09-04 21:50:37,492] DEBUG in app: debug
[2018-09-04 21:50:37,492] INFO in app: info
[2018-09-04 21:50:37,492] WARNING in app: warn
[2018-09-04 21:50:37,492] ERROR in app: error
[2018-09-04 21:50:37,492] CRITICAL in app: critical
```

# 4. 参考

http://flask.pocoo.org/docs/1.0/logging/
https://docs.python.jp/3/library/logging.config.html#dictionary-schema-details
https://docs.python.jp/3/library/logging.html#logrecord-attributes
https://docs.python.jp/3/library/logging.handlers.html#timedrotatingfilehandler
https://devlights.hatenablog.com/entry/2018/04/19/233142
max_connectionsの設定値が反映されない。

# 環境
```
Ubuntu: 16.04.5
MySQL: 5.7.23
```

# 事象
MySQLの同時接続数(`max_connections`)をデフォルトから`10000`に引き上げるため、以下内容でcnfファイルを修正したにもかかわらず、

```conf:/etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
...
max_connections        = 10000
...
```

設定値が反映されていませんでした。

```
mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 214   |
+-----------------+-------+
1 row in set (0.01 sec)
```

# 原因

`max_connections`はファイルディスクリプタの数に依存するのですが、こちらがデフォルト(1024)のままだったことが原因でした。

# 解決方法
ファイルディスクリプタの数は `/etc/security/limits.conf`で変更可能ですが、Ubuntuではサービスファイルに`LimitNOFILE`を指定することでも対応可能です。

```conf:/lib/systemd/system/mysql.service
...
[Service]
...
LimitNOFILE=65535
```

```
mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 10000 |
+-----------------+-------+
1 row in set (0.00 sec)
```
PureScriptで存在型を試す

またまたたのしい誰得記事です。PureScript知ってる人向けです。

# なんでも入る箱

Haskellにはどうやら存在量化(Existential Quantification)という言語拡張があって、以下のようなことができるようです。(参考: [https://ja.wikibooks.org/wiki/Haskell/存在量化された型](
https://ja.wikibooks.org/wiki/Haskell/%E5%AD%98%E5%9C%A8%E9%87%8F%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E5%9E%8B))

```haskell:Haskell
-- 右辺にforallが書ける
data ShowBox = forall s. Show s => SB s

-- Showのインスタンスにする
instance Show ShowBox where
  show (SB s) = show s -- showが呼べてしまう

heteroList :: [ShowBox]
heteroList = [ SB (), SB 5, SB True ] -- 異なる型をリストにまとめる

main :: IO ()
main = mapM_ (putStrLn . show) heteroList

-- output:
-- ()
-- 5
-- True
```

いわゆる、データコンストラクタを関数として見たときの型制約が書けるようになるってことですかね。何に使えるかはいまいち分からないけどたのしい。

---

試しにこれをPureScript上で書いてみると、

```haskell:PureScript
data ShowBox = forall s. Show s => SB s -- そもそも右辺にforallがかけない！コンパイルエラー！！！
```

言語機能自体がないようです。何でもshowできる箱はPureScriptで作ることはできないのでしょうか……

# purescript-exists
言語仕様としては存在しないけど、同じ事を実現できると謳うライブラリがリリースされていました。
[purescript-exists](https://github.com/purescript/purescript-exists)
なんですけど、れどめ見ても実際のAPIを見ても、どうやってこれを使ってShowBoxを？？ってなったので色々試してみました。

# できました

```haskell:PureScript
-- 任意のaに対して値とshowをセットで扱う
newtype ShowBox' a = SB { value :: a, show :: a -> String }

-- aがどこかにきえた！
newtype ShowBox = ShowBox (Exists ShowBox')

instance showSB :: Show ShowBox where
  show (ShowBox sb) = sb # runExists \(SB { show: sh, value }) -> sh value -- なかのshowにvalueをぶつけるだけ

-- コンストラクタのような
mkShowBox :: forall a. Show a => a -> ShowBox
mkShowBox = ShowBox <<< mkExists <<< SB <<< { value: _, show }

main :: Effect Unit
main = do
  let hetero = [ mkShowBox 1, mkShowBox "abc", mkShowBox [ unit, unit ], mkShowBox { x: Just 123, y: 1000.0 } ]
  traverse_ (log <<< show) hetero

-- output:
-- 1
-- "abc"
-- [unit,unit]
-- { x: (Just 123), y: 1000.0 }
```

できたけど……えっめんどくさい！
`a`の型に`Show`の制約を付けることはできないので、show関数と一緒にパックしてるのが肝です。

# しくみ
```haskell
mkExists :: forall f a. f a -> Exists f
mkExists = unsafeCoerce
```

unsafe!!!!!
単に型を覆い隠してまとめて扱えるようにしてるだけだった！！

でも、

```haskell
runExists :: forall f r. (forall a. f a -> r) -> Exists f -> r
runExists = unsafeCoerce
```

こっちはちょっと面白い。
「全ての`a`に対して成り立つ`f a -> r`の関数を用意して、それを経由してのみ中身を取り出せる」ということになってる。`Exists f`には`a`の情報は一切無いけど、型に矛盾を起こさずに操作ができるわけです。かしこい。

# おわり
存在量化っていう単語の意味もよく分かってないけど、イメージ的にはコンストラクタに入れられる型が和集合になってるような感じかな。どちらかというと、オブジェクト指向的な抽象化の一種な気がする。あっぷきゃすとあっぷきゃすと。
ちなみに、PureScriptの主流なUIライブラリの一つである[purescript-halogen](https://github.com/slamdata/purescript-halogen)のなかではこれと同じ仕組みの抽象化が多用されてる。使えるシーンでは使える……ということなのだろうか。
あと、Existential Quantificationって単語、Haskellの中でもダントツに中二感たかいと思うの(どうでもいい)

[全体のコード](https://gist.github.com/acple/5a7c89e868238dc25700f0b73f572cab)
[Xcode] "xcrun: error: SDK "iphonesimulator" cannot be located"の解消法

# 概要
xcrunでiPhoneSimulatorが見つからない、エラーが出た時の解消法を紹介します。

```
$ xcrun -sdk iphonesimulator --show-sdk-path
xcrun: error: SDK "iphonesimulator" cannot be located
xcrun: error: SDK "iphonesimulator" cannot be located
xcrun: error: unable to lookup item 'Path' in SDK 'iphonesimulator'
```
## 解消手順

以下のコマンドを実行して現状確認をする。

```
$ xcode-select --print-path
/Applications/Xcode.app  >> このようになっているべき
```

上記のコマンドを実行して"/Applications/Xcode.app"が返ってこない場合は以下のコマンドを実行してPathを修正する。返ってくる場合はスキップしてください。

```
$ sudo xcode-select --switch /Applications/Xcode.app
```

以下のようにiPhoneSimulatorが見つかればOK。

```
$ xcrun -sdk iphonesimulator --show-sdk-path
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.4.sdk
```

もし見つからない場合はXcodeを開いてSimulatorをインストールしてください。

Xcode > Preferences > Components から最新のiOSシミュレーターをインストールすれば解消すると思います。
VBA Win32API timeGetTime TimerControl Class Win64/32共用

[ストップウォッチによる経過時間の取得方法について]( https://msdn.microsoft.com/ja-jp/library/cc708866.aspx)
を改造してClass Module化する。

##標準モジュール

```vb

Sub test()
Dim startTime As Long
Dim endTime As Long
Dim clsTimer As timeGetTimeClass: Set clsTimer = New timeGetTimeClass ' Dim And New For timeGetTimeClass
Debug.Print clsTimer.Get_Timer
strattime = clsTimer.Get_Timer
endTime = clsTimer.Get_Timer
Debug.Print (endTime - startTime) / 1000 '1000
End Sub

```




##Class Module ( timeGetTimeClass)

```vb

'''''''''''''''''''''''''''''''''''''
' Class Module
' timeGetTimeClass
' Win 64/32
' Win32API 関数の timeGetTime を使用します。今回、1秒ごとに経過時間の合計を表示するため、Timer コントロールを使用します。
''''''''''''''''''''''''''''''''''''''''
#If VBA7 Then
Private Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long
#Else
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
#End If

Property Get Get_Timer() As Long
Get_Timer = timeGetTime
End Property

''''SampleCode For Module
' 標準モジュールコ用のコードです
'Sub testTimerContlrol()
'Dim clsTimer As timeGetTimeClass: Set clsTimer = New timeGetTimeClass ' Dim And New For timeGetTimeClass
'Debug.Print clsTimer.Get_Timer
'End Sub

```

システムを起動した後の経過時間を、ミリ秒（ms）単位で取得します。この時間は、システムタイマの分解能による制限を受けます。システムタイマの分解能を取得するには、GetSystemTimeAdjustment 関数を使います。
DWORD GetTickCount(VOID);
パラメータ
パラメータはありません。
戻り値
関数が成功すると、システムを起動した後の経過時間が、ミリ秒単位で返ります。
解説
経過時間は DWORD 型で保存されています。システムを 49.7 日間連続して動作させると、経過時間は 0 に戻ります。
より高い分解能のタイマが必要な場合は、「」（マルチメディアタイマ）または「」（高分解能タイマ）を使います。
Windows NT/2000：コンピュータを起動した後の経過時間を取得するには、レジストリの HKEY_PERFORMANCE_DATA キー内の System Up Time カウンタを取得します。この値は、8 バイトです。詳細については、MSDN ライブラリの「」を参照してください。
Example
次のサンプルコードは、タイマが 0 に戻る現象に対処する方法を示します。
DWORD dwStart = GetTickCount();
// 極端に長い時間が経過した場合は、実行を停止する。
if(GetTickCount() - dwStart>= TIMELIMIT)
    Cancel();
ここで、TIMELIMIT は、アプリケーションが関心を持つ特定の経過時間を意味します。
対応情報
Windows NT/2000：Windows NT 3.1 以降
Windows 95/98：Windows 95 以降
ヘッダー：Winbase.h 内で宣言、Windows.h をインクルード
インポートライブラリ：Kernel32.lib を使用
update-notifierを使ってnpmのような更新通知機能をつける

よくnpmを使っていて下と似たような通知を受けることがあると思います。

![](https://github.com/yeoman/update-notifier/blob/master/screenshot.png?raw=true)

[npm/cli: a package manager for JavaScript](https://github.com/npm/cli)



これが`update-notifier`です。npmをはじめ、色々なcliツールで使われています。

[yeoman/update-notifier: Update notifications for your CLI app](https://github.com/yeoman/update-notifier)

このツールは非常に手軽に導入できます。

```js
const updateNotifier = require('update-notifier');
const pkg = require('./package.json');

updateNotifier({pkg}).notify();
```

これだけです。

デフォルトだと、更新の確認は実行時に行われ、かつインターバルが1日なので、頻繁に通知がくることはありません。

自分の場合は、cliのオプションのパーサにmeowを使うことが多いので、以下のように書くことが多いです。

```js
const meow = require('meow')
const updateNotifier = require('update-notifier')

const cli = meow(
  `
	Usage
	  $ hello [name]

	Examples
	  $ hello
`,
  {
    flags: {
      name: {
        type: 'boolean',
      },
    },
  }
)

updateNotifier({ pkg: cli.pkg }).notify()


// ...
```
Rubyでminitestの簡易的な書き方

ドキュメントに書いていることだけど、minitestって、BDDスタイルでもunit-testスタイルでもどちらでも使える様になっていた。（特にライブラリ入れなくても）

https://www.rubydoc.info/gems/minitest
ruby2.5で試しています。

```ruby:hoge_test.rb

require 'minitest/autorun'

class TestClass < Minitest::Test
  def test_hoge_uppercase?
    assert_equal 'HOGE', 'hoge'.upcase
  end
end

describe 'TestHoge' do 
  describe 'hoge' do 
    it 'hoge uppeercase' do
      'hoge'.upcase.must_equal 'HOGE'
    end
  end
end
```

```shell:実行
$ ruby hoge_test.rb
(上記hoge_test.rbのようにBDD,unit-testスタイルが混じってても問題ない)
```

簡単にコードのとかライブラリの挙動を試すのに良いですね!!
Check! Azure Functions 2.0 (JavaScript) で binding extension がインストールされていないエラーの対処（暫定）

こんばんは、 @dz_ こと大平かづみです。

Prologue - はじめに
====
最近、 Azure Function Runtime 2.0 (beta) の JavaScript (Node.js) で、ローカルでコード書いて動作確認OK！いざ Azure にデプロイしたら動かない…って悩まされていました。

というのも、下記の更新のお知らせが来ていたのを、すっかり忘れていたのでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/23e1c413-f0e5-d7f5-b9ff-cfc56ad6dcc4.png)

Azure Functions Runtime 2.0.12050-alpha の大きな変更について
====

- [Azure Functions Runtime 2.0.12050-alpha breaking changes notice · Issue #129 · Azure/app-service-announcements](https://github.com/Azure/app-service-announcements/issues/129)

その変更点の要約はこちらです。

- Extension の更新
    - ローカル環境では、 Core Tooles (2.x) をアップデートするか、 `func extensions install` で個別にインストールする
    - Azure 上では、Extension をインストールする（後述）
- 設定ファイル `hosts.json` の変更
    -  `"version": "2.0"` が必要になる
-  _secret_ 情報が _blob_ に保存されるようになる（自動移行）
- ひとつの _Function App_ につき、単一の言語固定に
    - これまでは複数のプログラミング言語が動いたが、単一に。

@TsuyoshiUshio@github 牛尾さんが、当該記事を和訳くださっていますので、参考になると思います。

- [Azure Functions v2.0 の Breaking Change 対応 - Qiita](https://qiita.com/TsuyoshiUshio@github/items/92d7fbfc3f0327a7489b)

Extension 更新の影響
====
さて、上記の変更のうち、割とダイレクトに影響するのが Extension の変更だと思います。

例えば、 Azure Sorage にかかわるトリガーやバインディング（ _blob_, _queue_, _table_ ）を利用していて Azure にデプロイすると、新しい Extension がインストールされていない場合に下記のエラーが発生します。

```
Error:
Function (xxx) Error: The binding type(s) 'queue' are not registered. Please ensure the type is correct and the binding extension is installed. 
```

```
Error:
Function (xxx) Error: The binding type(s) 'queueTrigger' are not registered. Please ensure the type is correct and the binding extension is installed. 
```

Azure 上の Function に Extension をインストールする方法
----

こちらに公開されているアップデート手順によると、 _kudu_ のコンソールを利用して Extension をインストール（再ビルド）するようです。

- [Updating your App (portal) · Azure/azure-functions-host Wiki](https://github.com/Azure/azure-functions-host/wiki/Updating-your-App-(portal)#update-your-extensions)

ですが、私が再作成した検証環境では、Node.js だからなのか、この手順にある `bin` や `extensions.csproj` がなかったので万全でもないようです。

ここで、試行錯誤の結果、 _kudu_ を開かなくてもできる別の方法を見つけたので共有します。とはいえ、イレギュラーなやり方なので、今後は適切なアップデート方法が出るのではないかと思います。

### 手順

1. Azure ポータルで、当該の Azure Function を開く
2. ファンクションを新規作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/f4587509-3f91-515c-1fc7-78426b681fcc.png)
3. _Queue trigger_ のテンプレートを選択する
4. _Extension not Installed_ というメッセージとともに、 _Microsoft.Azure.WebJobs.Extensions.Storage_ のインストールを促されるので、 _Install_ をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/a7ee449a-a9fc-499b-5d63-1e72be2007e1.png)
5. インストールが終わったら、 _x_ （閉じる）ボタンでブレードを閉じて構いません。

これで、上記のエラーは出なくなり、正常に動作するようになったと思います。

なお、 _Integrate_ タブから、 _queue_ などのトリガー、バインディングを追加しようとしても Extension のインストールを促してくれるのですが、失敗することもあるようですので、上記手順が今のところ確実でした。

Epilogue - おわりに
====

実は、ずっとこの変更点に気づいてなくて、ただひたすらデバッグして上記の方法を探り当てたのでした :flushed:

Azure Functions で Node.js の新しめのバージョン使うときは `2.0 (beta)` が必須なので、はやく安定するのを期待しています！ :sparkles:
WSLの計算速度は仮想化環境より速いのか？

# 概要
Windows Subsystem for Linux(WSL)の計算速度は仮想化環境より速いのか？

WSL環境とVirtualBox環境(以下、VB)で
OpenFOAM v1806のチュートリアルの計算速度を比較した

# 環境
PC : SurfaceBook
OS : Windows10 pro
CPU : intel core-i7-6600U 
メモリ : 16GByte

WSL
Linux : Ubuntu16.04.4 LTS (Xenial Xerus)

VB
VirtualBoxのバージョン : 5.2.18 r1243419
Linux : Linux Mint 18 (Sarah)

OpenFOAM : 両環境ともにOpenFOAM v1806


# 対象のチュートリアル
あまり計算時間がかからないモデルでサクサク測定したいので
TJunctionを対象とする
TJunctionについてはこちらのサイトが非常に参考になる
https://www.xsim.info/articles/OpenFOAM/tutorials/incompressible-pimpleFoam-TJunction.html

結果的にTJunctionでは差が出なかったので
以下のとてもためになるサイトのbuoyantCavityも実行
https://www.xsim.info/articles/OpenFOAM/tutorials/heatTransfer-buoyantSimpleFoam-buoyantCavity.html

ともにシングルコアしか使わない

# 測定
計算時間はExecutiontimeとClockTimeを確認した
前者はCPUの実行時間、後者は実経過時間らしい
引用URL
http://ofbkansai.sakura.ne.jp/executiontime%E3%81%A8clocktime%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6openfoam

メッシュの生成時間は含めていない

# 結果
## TJunction
WSL ExecutionTime = 31.02 s  ClockTime = 131 s
VB  ExecutionTime = 31.02 s  ClockTime = 131 s
差が出なかった
実行時間と実経過時間の間で100sec近く何をしているか不明

## buoyantCavity
WSL ExecutionTime = 227.98 s  ClockTime = 232 s
VB  ExecutionTime = 260.54 s  ClockTime = 261 s
差が出た
実行時間と実経過時間で1～5secしか差がない
buoyant～ソルバの特徴なのか？
ここら辺何も分からない

結果としては10数%程度WSLが速い

# 所感
並列数を増やせばさらに差が出てくるのか？
ソースをコンパイルしなおした後なら速くなるのか？
また時間があるときに試してみたい

ただ私は計算時間がかかるケースを流すことは稀だし
でかいケースを流す場合はクラウドでも借りようかと思っているため
とりあえず個人的に満足できる結果が得られた

# 蛇足 - パフォーマンスを抑えて実行
以下では、コンセントが確保できなかったので電源を抜いた状態で試してしまい電源モードが「推奨」となっていた状態の結果を示す

buoyantCavity
WSL ExecutionTime = 452.56 s  ClockTime = 481 s
VB ExecutionTime = 467.73 s  ClockTime = 468 s

ともに電源確保出来た時の2倍近くかかっているしClockTimeはWSLのほうが遅い
こうなると前述の10数%の差より、こういう所が大きく影響しているケースもあるのかもしれない
logを表示しないことで計算速度が数%上がると聞いたこともあるし
ちょっとした計算時間の差より
コマンドを打つのを省略したり効率良く作業したり
掃除はルンバに任せたりした方が絶対に良いと思う

# 背景
とあるオープンCAEのサマースクールに参加した際に
「WSLって速いの？」と聞かれた際に
「仮想化環境よりは速いらしいですよ」と答えてしまい
そのあと不安になったのが背景。
答えとしては
「TJunctionでは差がないけど、BuoyantCavityでは10数%程度速かったです」
と回答できれば過去の私は良かったと思う。

質問した方に届けば嬉しい。