OmniAICreator/Qiita-1.07M huggingface dataset:
logstashで現在より古い日付のelasticsearchのインデックス名を指定する方法

# やりたいこと
elasticsearchのインデックスを、
logstash-%{+YYYYMMdd}という日付を入れた名称にして、
curatorでデータのローテーションをしている。

以前書いた
[elasticsearchのlogstashで同一IDのデータを更新/マージする方法（updateとdoc_as_upsert）](https://qiita.com/henatyokotraveler/items/a8b1b8ce01c5b63a7f1f)
でデータ処理をしていたところ、
更新する分のデータについて、現在のインデックスではなく、
１日前の日付のインデックスに更新を行いたいシチュエーションがあった。

現在ではない日付のindex名をlogstashで指定しようとしたところ、
調べた結果、一工夫必要だったので、メモとして残す。

# logstashの一般的なインデックス名の指定方法
logstashのoutputを下記のように設定して、
indexの箇所のYYYYMMddで現在の日付（UTC）の付与されたindex名になる。

```
output {
  elasticsearch {
    hosts => [ "ElasticsearchのIPアドレス:9200" ]
    index => "logstash-%{+YYYYMMdd}"
  }
}
```

# インデックス名を古い日付を指定する方法
上記の設定だと現在の日付(UTC)になるが、データの更新で１世代前の日付にしたい。
以下を参考に調べた。

**Elasticsearch output pluginのindexの説明**
https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-index

>LS uses Joda to format the index pattern from event timestamp. 

YYYYMMddの箇所は、elasticsearchの@timestampから取られている。
システム時間から取られているわけではない。
フォーマットは書いてあっても、時間をずらす方法は記載なし。

**Logstash output Indexname with old Date**
https://discuss.elastic.co/t/logstash-output-indexname-with-old-date/123433
こちらにもYYYYMMddの箇所は、elasticsearchの@timestampから取られている説明あり。
古い日付のindexを指定するには、@timestampを上書きするか、@metadataを使う方法が提示されている。
後者はプラグインとして、logstash-filter-date_formatterというのリンクがある。

**Elasticsearchのタイムゾーン問題**
https://qiita.com/hssh2_bin/items/0c4cbd1157ea230549a9
@metadataを使った設定例で、ruby filter pluginで日付を生成して、@metadataに投入している。
実雪堤としてはこちらのサイトの設定をほぼ流用した。

# 実際の設定例
現在の日付の１時間前の日付のインデックス名を指定する。
ruby filterでrubyのコードを直接書くことができるので、それで１時間前の日付を取得し、@metadataを利用して、outputのindexにする。

**Elasticsearchのタイムゾーン問題**
https://qiita.com/hssh2_bin/items/0c4cbd1157ea230549a9
からの説明の引用と、設定例の補足。

>- ruby filterのevent.setで(field,value)を作成しています。(rubyのputs的な処理)
>- field nameは[@metadata][local_time]としていますが、[@metadata]を付与することでElasticsearchにIndexingされないfieldにすることができます。
>- strftime('%Y-%m-%d')で取得した時刻を文字列に変換しています。

*補足１：下記の設定例では[@metadata][delay_date]に指定しています*
*補足２：下記の設定例では('%Y%m%d')に指定しています。strftimeの日付の記法は、[こちらのリファレンス]
(https://docs.ruby-lang.org/ja/latest/method/Time/i/strftime.html)を参照*

**下記で使用したrubyのTimeのリファレンス**
https://docs.ruby-lang.org/ja/latest/class/Time.html
リファレンスだとTimeはローカルタイムを返すようだったので、
下記の例では、UTCで合わせるためにgetutcをstrftimeの前に置いて変換している。
※現在の方のインデックスであるlogstash-%{+YYYYMMdd}"はUTCなので。

```
filter {
  ruby {
    code => "
     t = Time.now;
     t2 = t - ( 60 * 60 );
     event.set('[@metadata][delay_date]',t2.getutc.strftime('%Y%m%d'))"
  }
}

output {
  elasticsearch {
    hosts => [ "ElasticsearchのIPアドレス:9200" ]
    index => "logstash-%{[@metadata][delay_date]}"
  }
}
```
Microsoft Access Barcode Control は使わないほうが良い

# Microsoft Access Barcode Control とは

Microsoft Access(以降 Access)には、Microsoft Access Barcode Control というコントロールが含まれており、これを使用してバーコードを出力することができます。（Office 2013 以降の Access では、ＱＲコードも出力することができるようになりました）

Office Professional 以上の場合、追加アプリのインストールなしにバーコード・ＱＲコードを出力できるのが大きな魅力です。（Office Personal など Access がインストールされていない場合は、ランタイム版 Access をインストールすることで使用可能です）

しかし、後述する問題があるため、Microsoft Access Barcode Control は使用しないほうが無難です。

# Microsoft Access Barcode Control を使わないほうが良い理由

- サポートされていない

Microsoft Access Barcode Control は Access のレポート(帳票)出力に使用する場合のみサポート対象とされています。そのため、バーコードをフォーム上に表示したりExcelで使用するなどはサポート対象外となっています。
そのためか、Microsoft Access Barcode Control を張り付けた Excel ファイルを開こうとすると異常終了してしまうような不具合が発生することもあります。

- バーコードの表示に問題が発生することがある

Microsoft Access Barcode Control は ActiveX コントロールで実装されていますが、これがクセモノで、ActiveX コントロール部品は Microsoft Access Barcode Control に限らず、画面上で表示サイズが変わるなどの不具合が頻繁に発生します。
実際、Microsoft Access Barcode Control を Excel などで使用した場合では、バーの幅が不規則に変わってしまい、読み取れないバーコードが表示されてしまうことがありました。

- 作成できるＱＲコードに制限がある（ＱＲコードの規格に沿っていない）

作成できるＱＲコードには制限があり、誤り訂正レベルは L,M,Q,H のいずれかで最大文字数は半角 255 文字の制限があります。漢字は入力文字列として指定できません。
モード識別子は0100(8ビットバイト)のみで、数字・英数字・漢字のモードは選択できません。
マスクパターンも適切なものが選択されるべきところが常に000 になっているようで、入力文字列のビットパターンによってはエラー率が上がるのではないかと思われます。

- 時々間違ったＱＲコードを出力することがある

ＱＲコードを生成するアルゴリズムにバグがあるようで、稀にビット誤りを起こしたＱＲコードを作成することがあります。（体感的にはランダムな文字列1000回で1回程度あるかないか）
例えば、入力値で渡された文字列の A (0x41) が Q (0x51) に文字化けしたＱＲコードが生成されるようなことが起きます。
マイクロソフトにはバグ報告はしていますが、いまだに修正されていないようです。

文字化けが起きた場合、入力文字列の後ろに空白を1文字追加すれば文字化けは起きなくなります。
静的なＱＲコードであればそれで問題はないのですが、VBA で毎回異なるＱＲコードを作成するような用途では文字化けしているかどうか判別できないと危険です。
当方でどうしても Microsoft Access Barcode Control を使う必要があった場合には、入力文字列にチェックサム文字列を追加することで誤りを検知できるようにしていました。

# Excel (Office ファイル) でバーコード・ＱＲコードを表示するには？

静的なバーコード・ＱＲコードであれば、ネット上のバーコード作成サービスでバーコード画像を作成し、それをイメージで貼り付けるのがオススメです。
動的なバーコード・ＱＲコードの場合は、以下の記事のように、VBA でバーコードを作成するのが一番良いかと思います。 

EXCELのVBAだけでQRコード
https://qiita.com/santarou6/items/d623417ea8ba33756108
Google Colaboratoryから学習済みモデルをGoogle Driveに保存する

# 内容
タイトルの通りGoogle Colaboratoryで学習したモデルをGoogle Driveに保存する方法です。

# 環境
- Google Colaboratory
- PyTorch 1.4.0

# コード
```python
from google.colab import drive #インポート
drive.mount('/content/gdrive') #GoogleDriveのマウント
```
このコードで認証が表示されるので認証を行い、表示されたものをコピペします。
これでGoogleDriveへの接続が完了します。

```python
model_save_name = 'filename.pth' # 保存ファイル名
path = F"/content/gdrive/My Drive/機械学習/{model_save_name}" # 保存先pathの設定
torch.save(model.state_dict(), path) # 保存
```
このコードでファイル名、保存先、実際の保存を行っています。

# まとめ
ローカルに保存する際とは少し異なったのでつまづきましたが、学習済みモデルをGoogleDriveに保存することができました。
これで使い回すことができます！！
GitHub Enterprise Cloud の IP 制限機能（beta版）を使うと GitHub Actions が使えなくなる

GitHub Enterprise Cloud では、アクセス元IPを制限する機能が[ **パブリックベータとして** 提供されています](https://github.blog/2019-12-12-ip-allow-lists-now-in-public-beta/)。

この機能ですが、GitHub Actionsと極めて相性が悪く、 workflows をリポジトリに置いても一切 Action が発火しません（アクション失敗ではなく、そもそもアクションが認識されません）。

既にGitHubへこの事象は報告しておりますが、今後改善されるといいなと思っています。
git pull origin masterしたら「fatal: Couldn't find remote ref master」となる

## 事象

GitHubにリポジトリは作成されているのに、`git pull origin master`したら以下のようになる。

```shell
$ git pull origin master
fatal: Couldn't find remote ref master
```

## 原因

まだGitHubのリポジトリ上に一つもファイルを作成していないため、masterブランチが作成されていなかった。
![image.png](https://image.docbase.io/uploads/8a25120c-d8c8-40f8-a072-1e5c790062e7.png)

## 解決

一度pushした後なら、正常にpullできるようになった。

```shell
$ git push origin master
Counting objects: 8, done.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 3.02 KiB | 1.51 MiB/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To https://github.com/r-wakatsuki/hoge.git
 * [new branch]      master -> master
$ git pull origin master
From https://github.com/r-wakatsuki/hoge
 * branch            master     -> FETCH_HEAD
Already up-to-date.
```

以上
新規作成したフォルダのソース管理に、別のフォルダの変更が乗っていた件

今回新たにアプリケーションを作ることとなった為、専用のフォルダを新規作成しましたが、何故かソース管理に大量の未ステージングの変更が入っていました。
少し見にくいかもしれませんが、新規で作ったばかりでまだGitHubのリポジトリにも連携していないにも関わらず、以下のキャプチャのように別のフォルダの変更が管理されていました。
![git ソース管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/04d0b26e-5669-89e4-38da-52a4fe1745d5.png)

#原因と対処
原因はかなり単純なもので、作成したフォルダの一つ上のディレクトリに.gitフォルダ（隠しフォルダ）が作成されていたことが原因でした。
.gitフォルダが格納されている所よりも下の全ての階層の変更が管理出来ている状態となっていたようです。
このフォルダを削除し、作ったフォルダのソース管理を更新すると、「ソース管理プロパイダが登録されていません。」と初期表示が無事表れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/c76acf20-173c-2bde-4361-da5fac2806ad.png)

#.gitフォルダが作られてしまった理由
おそらくですが、以前別のリポジトリを作った際に、誤ってフォルダ全体を格納している所でgit initコマンドを打ってしまったからではないかと考えています。
調べた限り、他の原因が思い当たりませんでしたが、別の理由が判明次第、追記していきたいと思います。

#参考文献
・from44 VSCode のソース管理で変更が5000と表示されたときの対処法
https://from44.net/vscode-git-5k/
Manjaro KDEで日本語入力

#追記
2021/01/25
###[Manjaroで日本語入力(公式パッケージ編)](https://qiita.com/oioi/items/8835afc5d2db643efeda)
いつの間にか、公式のパッケージが追加されていたので記事にしました。
なお
以前に、この記事で設定された方でも、公式パッケージが優先されるので
ibusも使ってみたいなどの場合は、新しい方法で、そのまま試せます。

#はじめに
海外では人気があるらしい、ローリング・リリースのManjaroですが
デフォルトでは日本語入力ができません。
初回しかやらないので、忘れないようにメモしておきます。
##インストールと設定
ターミナルで順番にコピペして実行していく。

```
sudo pacman -S --needed qt5-translations
sudo pacman -S fcitx-mozc fcitx-gtk2 fcitx-gtk3 fcitx-qt5 kcm-fcitx
```
`/etc/environment`ファイルに追記する。

```
sudo cat <<EOL>> /etc/environment
LANG=ja_JP.UTF-8
XMODIFIERS=@im=fcitx
XMODIFIER=@im=fcitx
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
DefaultIMModule=fcitx
EOL
```
`~/.pam_environment`ファイルを作成する。

```
tee ~/.pam_environment <<EOF >/dev/null
LANG=ja_JP.UTF-8
XMODIFIERS=@im=fcitx
XMODIFIER=@im=fcitx
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
DefaultIMModule=fcitx
EOF
```
##有効化
再起動、または再ログイン後に日本語入力できるようになります。

##最後に
Manjaroは、ローリング・リリースなので、バージョンは書きませんが
いまのところ、問題ありません。
ちなみに、タイトルはKDEですが、Xfce Editionでもイケました。

##参考
[Manjaro Linux 18.1.0 KDE Editionでfcitx-mozcを使えるようにする方法](https://scrapbox.io/ugo/Manjaro_Linux_18.1.0_KDE_Edition%E3%81%A7fcitx-mozc%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
【Command】diffコマンドのエイリアス

自分が使っているコマンドのエイリアスを紹介するシリーズです。
今回は、diffコマンドを紹介します。

# エイリアス
`alias diff='colordiff -u'`

# 詳細
- `colordiff`：before,afterに色がつく。
- オプション`-u`：差分表記`<>`が`-+`に変更。

追加前
![スクリーンショット 2020-02-20 0.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418021/40a7aa49-6273-1f8d-3e41-3418415b2b61.png)
↓
追加後
![スクリーンショット 2020-02-20 0.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418021/8124324c-09b0-25cf-8cef-5071dfda56e9.png)

コードが悪かったですね、、見辛い、、、（いずれ変更）
こちらのItemにgolangのdiffを載せているので良かったら見てください。
https://qiita.com/konekato/items/834f4f0e011670dec44d

## ソースコード
使用した(見にくい)コードはこちらです。

```:b(before)
t
te
tes
test
tes
te
t
```

```:a(after)
t
t
tes

ts
te
t
```

# 余談
マークダウン コード挿入の際 \```diff ってやるとちゃんと色が出る。

```diff:ターミナル 
% diff b a

 t
-te
-tes
-test
+t
 tes
+
+ts
 te
 t
```
ElectronからPythonシェルを実行する際に、複数引数を渡してPythonを実行する。

# はじめに
ネットで調べると文字列１つを送るサンプルコードは多く出るが、複数パラメータを渡すサンプルコードが見つからなかったのでまとめた。

# 概要
ElectrionからPythonを実行する際に、複数のパラメータを渡す際の方法を記載する。
ElectronではPythonShellでPythonを実行し、Python側ではargparseライブラリで実行引数を取得する。

## Electron側のサンプルコード
PythonShellをインポートして実行する。optionsのargsに引数を並べるのがポイント。

```javascript:ElectronApp.js
const {PythonShell} = require('python-shell');

const pyMain = '/path/to/pyMain.py';
let options = {
  mode: 'text',
  pythonOption: ['-u'],
  args:[
    '-param1', 'name1',
    '-param2', 'name2' 
  ]
}
let pyshell = new PythonShell(pyMain, options);

pyshell.send();
pyshell.on('message', function(data){
  console.log(data);
});
```

## Python側のサンプルコード

```python:pyMain.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-param1", help="parameter1 discription")
parser.add_argument("-param2", help="parameter2 discription")
args = parser.parse_args()
print(args.param1) # name1
print(args.param2) # name2
```
Railsでブログアプリケーションの作成時に、postを作成するだけでからのコメントが表示されるのを解消する。

##発生した問題
タイトルにもある通り、railsで定番のブログのようなアプリを作っているときに、投稿を作成しそれの詳細をクリックしたらみられるようにshow.html.erbに記述。comment機能も追加した。しかし、投稿を作成するだけで、空のコメントが表示され、削除しようとするとRouting errorになる。

![スクリーンショット 2020-02-20 0.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528665/7abff49d-ff3a-59f4-846e-d2ed3fc262f5.png)


##解決策
投稿詳細ページ（筆者はshow.html.erb）で、以下のように表示していた。

```ruby:show.html.erb

<div class="p-comment__list mx-auto">
  <div class="p-comment__listTitle">コメント</div>
  <%= render @post.comments %>
</div>

```

それを、

```ruby:show.html.erb

<div class="p-comment__list mx-auto">
  <div class="p-comment__listTitle">コメント</div>
  <%= render @post.comments.select(&:persisted?) %>
</div>

```

と変更した。
違いに気づいていただけただろうか。@post.commentsを@post.comments.select(&:persisted?)に変更した。

![スクリーンショット 2020-02-20 0.48.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528665/40934de1-0e0b-1af3-d801-7a4e804a8297.png)

直った！！！！！！！

####参考URL
https://stackoverflow.com/questions/36680890/rails-empty-comment-on-every-new-post
PHPでFizzbuzz最短43バイト

今回は解決できてませんし、解決の糸口すら掴めていません。


PHPのFizzBuzz最短は長らく[56バイト](https://qiita.com/rana_kualu/items/6f6722558fc5c8bb204a)でした。

```php
<?while($i++<100)echo$i%3?!$$i=$i:Fizz,$i%5?$$i:Buzz,~ ;
<?for(;$i++<100;)echo$i%3?!$$i=$i:Fizz,$i%5?$$i:Buzz,~ ;
```

ところで先日なんとなく[shinh.org](http://golf.shinh.org/p.rb?FizzBuzz#PHP)を見てみたんですよ。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/bb71c0c0-f788-c2ea-b986-c5922e62c932.png)

43？？？？？？？？？

他の回答者がみな56バイトで横並びになっているところに突然3/4の長さですよ。
しかもここ、もはや古代語と言って差し支えない[PHP5.3.8](http://golf.shinh.org/version.rb)ですからね。
一体全体どうなってんだ？
完全に理解の範疇を超えています。

さらに目を引くのが0B / 30B / 13Bという文字の使用割合です。
これは[基準が公開](http://golf.shinh.org/bas.html)されていて、順にバイナリ0バイト、英数30バイト、記号13バイトを使っているという意味になります。

56バイト達成者は全員1B / 26B / 29Bとか1B / 28B / 27Bのような割合になっているので、43バイト達成者は記号が圧倒的に少ないです。
さらに改行を表す`chr(245)`のバイナリを使っていません。

しかしですねここまでくると、最低限必要そうな記号を上げていくだけで、
・PHP開始タグ`<?`
・ループ`while($i++<100)`
・改行および末尾`"\n";`

これだけで既に記号を12文字使ってるのですよ。
記号の削減は、小手先の変更でどうにかなるレベルではありません。
どうやら根本的に考え方を変えなければならないようです。

が、正直何一つ思いつきません。

私にはもう、`<?=file_get_contents("path/to/fizzbuzz");`みたいな何らかの回避ルートを見つけ出したとしか考えられません。
まあ、最近の他のコンテストを見てみると[見事に](http://golf.shinh.org/p.rb?Huh)[何かされた](http://golf.shinh.org/p.rb?golf)[形跡がある](http://golf.shinh.org/p.rb?Is+this+possible)ので、それが正解なのかもしれませんけどね。

ちょっと私のレベルではどうにもできなかったので、誰か答えよろ。
AtCoder Beginner Contest 154

https://atcoder.jp/contests/abc154

今回のコンペは、何というか…タイピング速度のコンペではないか。

###D - Dice in Line

```python
import sys
read = sys.stdin.read

n, k, *p = map(int, read().split())
res = tmp = sum(p[:k])
for i in range(k, n):
    tmp = tmp - p[i - k] + p[i]
    if tmp > res:
        res = tmp
print((res + k) / 2)
```

###E - Almost Everywhere Zero

一番早いコードを参考した。
$1≤K≤3$ですから、各々設定しても楽です。
再帰関数で高速計算できる。

```python
import sys
read = sys.stdin.read
n, k = map(int, read().split())


def count(digit, k):
    if k == 0:  # とても重要な設定。「digit個0」という解答が存在するためreturnが1
        return 1
    elif k == 1:
        return digit
    elif k == 2:
        return digit * (digit - 1) // 2
    else:
        return digit * (digit - 1) * (digit - 2) // 6


def solve(n, k):
    if k == 0:
        return 1
    digit = len(str(n))
    res = 0
    if digit > k:  # 末尾桁を0で、他の桁からk個位置を抽選し1~9を入れる。
        res += count(digit - 1, k) * (9 ** k)
    pow10 = 10**(digit - 1)
    d, mod = n // pow10, n % pow10
    res += count(digit - 1, k - 1) * (9 ** (k - 1)) * (d - 1)
    res += solve(mod, k - 1)
    return res


print(solve(n, k))
```

###F - Many Many Paths

https://atcoder.jp/contests/abc154/submissions/9997279
を参考した。
解説で言ってなかったことが一つ：
$g(r,c)+1=f(r+1,c+1)$

|g(r,c):|||||
|:--:|:--:|:--:|:--:|:--:|
||f(0,0)|f(0,1)|...|f(0,c)|
||f(1,0)|f(1,1)|...|f(1,c)|
||f(2,0)|f(2,1)|...|...|
||...|...|...|...|
||f(r,0)|f(r,1)|...|f(r,c)|
|合計|f(r,1)|f(r,2)|...|f(r,c+1)|

合計の合計にf(r,0)を加算すればf(r+1,c+1)になる。
よって、
$\quad g(r2,c2)−g(r2,c1−1)−g(r1−1,c2)+g(r1−1,c1−1)$
$=f(r2+1,c2+1)−f(r2+1,c1)−f(r1,c2+1)+f(r1,c1)$


```python
import numpy as np
import sys
read = sys.stdin.read
r1, c1, r2, c2 = map(int, read().split())
MOD = 10 ** 9 + 7


def cumprod(A, MOD=MOD):
    L = len(A)
    Lsq = int(L**.5 + 1)
    A = np.resize(A, Lsq**2).reshape(Lsq, Lsq)
    for n in range(1, Lsq):
        A[:, n] *= A[:, n - 1]
        A[:, n] %= MOD
    for n in range(1, Lsq):
        A[n] *= A[n - 1, -1]
        A[n] %= MOD
    return A.ravel()[:L]


def make_fact(U, MOD=MOD):
    x = np.arange(U, dtype=np.int64)
    x[0] = 1
    fact = cumprod(x, MOD)
    x = np.arange(U, 0, -1, dtype=np.int64)
    x[0] = pow(int(fact[-1]), MOD - 2, MOD)
    fact_inv = cumprod(x, MOD)[::-1]
    fact.flags.writeable = False
    fact_inv.flags.writeable = False
    return fact, fact_inv


fac, finv = make_fact(2 * 10**6 + 10, MOD)


# 組合せ計算
def comb(n, k):
    if n < k:
        return 0
    if n < 0 or k < 0:
        return 0
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD


answer = comb(r2 + c2 + 2, r2 + 1) - comb(c1 + r2 + 1, c1) - \
    comb(r1 + c2 + 1, r1) + comb(r1 + c1, r1)

answer %= MOD
print(answer)

```
[Rails]モデル削除コマンド

### はじめに
たまに使おうとすると、ど忘れしてしまうため、備忘録として残しておきます。
最初にコマンドの形式を記載し、その後にサンプルとして適当なモデルの作成/削除を行ってみます。

### コマンドの形式
```:コマンドの形式
$ rails destroy model [モデル名]
```

### サンプル
#### モデル作成
まず、以下のコマンドでUserモデルを作成。カラムは適当にnameだけにしておきます。

```:モデル作成コマンド
$ rails g model User name:string
      invoke  active_record
      create    db/migrate/20200219151817_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
```

#### モデル削除
以下のコマンドでUserモデルを削除する。

```:モデル作成コマンド
$ rails destroy model user
      invoke  active_record
      remove    db/migrate/20200219151817_create_users.rb
      remove    app/models/user.rb
      invoke    test_unit
      remove      test/models/user_test.rb
      remove      test/fixtures/users.yml
```

### 注意点
上記のコマンドでは、create以外のmigrationファイルを削除してくれません。
サンプルで言うと、User作成後にageを追加した場合、このmigrationファイルは残ったままになります。
なので、残ったmigrationファイルは手動で削除してください。
ざっくりsystemctlコマンド

# systemctlとはざっくり・・・

サービスを管理するコマンド。
※nginxを起動したり、firewallの自動起動したり、一時的に止めたりとか。
主にLinuxで使われていて、CentOS7やUbuntuで使われているみたい（CentOS6以前はchkconfigコマンドらしい）。

ちなみに対象のサービス名は〜.serviceと入れても入れなくてもOK。

例 ↓はどちらも同じ
`systemctl status httpd`
`systemctl status httpd.service`

ざっくりsystemctlコマンドを即時反映、自動起動、状態確認の３つの系統に分けてメモ。

### 1. 即時反映系


```:開始
systemctl start サービス名
```

```:停止
systemctl stop サービス名
```

```:再起動 
systemctl restart サービス名
```

```:リロード 
systemctl reload サービス名
```

```:強制終了
systemctl kill サービス名
```

### 2. 自動起動系


```:サービスの自動起動を有効にする
systemctl enable サービス名

#  止まっている状態で有効にしてもサービスは止まったまま
```

```:サービスの自動起動を無効にする
systemctl disable サービス名

# 動いている状態で無効にしてもサービスは動いたまま
```

### 3. 状態確認系


```:サービスの状態を確認
systemctl status サービス名
```

```:サービスの詳細を確認
systemctl show サービス名
```
```:サービスの詳細を確認
systemctl show サービス名
```
```:不具合のあるサービスを確認
systemctl --failed
```
```:アクティブかどうかの確認 
systemctl is-active サービス名
```

```:自動起動の設定確認
systemctl is-enabled サービス名
```

```:全サービスの一覧
systemctl list-units --all
```

```:アクティブなサービスの一覧 
systemctl list-units --type=service
```
COTOHA API の構文解析 を Java で100回呼んでパフォーマンス測定しました。


# CotohaNlpService クラスの作成

>投稿1 [COTOHA API の構文解析 を Java で利用してみる](https://qiita.com/oyahiroki/items/d77768d9477a115fd210)

と

>投稿2 [COTOHA API の構文解析 を Java でパースする](https://qiita.com/oyahiroki/items/a300eca1278f57d1106d)

をベースに、COTOHA APIを簡単に利用できるように、以下のクラスを作成しました。
（後日、Maven Repository にて公開予定です）

CotohaNlpService.java
https://github.com/oyahiroki/nlp4j/blob/master/nlp4j/nlp4j-cotoha/src/main/java/nlp4j/cotoha/CotohaNlpService.java

このクラスを利用すると以下のような感じで、簡単に形態素解析結果を得ることができます。
（API呼び出しに必要な変数は環境変数としてセットしておきます）
別途、JSONを整形して改行区切りでテキストファイルに保存するクラスを作成しましたので、呼び出し回数の節約も可能になりました。

```java
CotohaNlpService service = new CotohaNlpService();
DefaultNlpServiceResponse response = service.nlpV1Parse("今日は学校に走って行きました。");
// レスポンスのJSON が出力される。キーワードクラスとして返すメソッドも用意している。
System.err.println(response.getOriginalResponseBody()); 
```

# データの用意

国土交通省「自動車のリコール・不具合情報」からデータをダウンロードして、100件分を利用しました。
手でHTMLをコピペするのは当然面倒ですので、[ごにょごにょ](https://github.com/oyahiroki/nlp4j/blob/master/nlp4j/nlp4j-webcrawler/src/main/java/nlp4j/webcrawler/mlit/MlitCarInfoCrawler.java) しました。^_^;

>国土交通省「自動車のリコール・不具合情報」
http://carinf.mlit.go.jp/jidosha/carinf/opn/index.html<br>



# 100回呼んでみる

100回呼んでみた結果は以下のとおりです。

横軸が試行回数で、縦軸が処理時間です。
クライアント側でのJSONパースの処理を含んでいますが、数msと考えてよいでしょう。
最初に2000 msくらいかかっていますが、これはTokenの取得も含んでいます。
だいたいが 200-300 msに収まっているのですが、時々突発的に遅くなるようです。
DEV環境向けのは遅いという可能性も高いと思いますし、もちろんネットワーク環境にもよると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/33e7b760-4a7f-851b-cc03-1dbab1505dd1.png)

次に、文字列の長さと処理時間のグラフです。
見たところ、文字列の長さと処理時間に相関はなさそうです。（極端に長い文字などは変わる可能性が高いと思います）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/97fb04a9-5466-6180-d308-b2757979ddcb.png)


以下、生データです。

```
length,time
61,2001
73,337
54,310
79,349
58,274
51,269
41,660
21,263
38,283
74,295
52,4472
70,1138
68,3074
31,243
39,251
15,219
11,258
14,259
62,293
66,276
27,272
18,220
63,278
62,428
68,284
50,288
43,250
45,264
70,273
58,250
157,593
88,280
66,264
26,272
38,1514
8,237
42,256
53,1472
42,2668
35,230
32,235
36,241
116,325
17,254
102,309
59,268
21,220
43,278
64,249
32,246
31,247
27,252
70,3698
61,340
51,233
23,225
20,226
60,310
50,1685
72,281
37,270
45,253
13,224
54,243
64,302
52,1876
90,3251
30,9501
73,2323
70,3689
70,1304
61,303
67,262
17,3032
128,302
63,272
33,238
32,257
106,3906
57,261
103,299
82,270
71,268
158,803
41,255
36,284
62,304
36,234
38,1778
19,1478
90,345
22,239
62,310
72,2555
66,256
25,927
33,242
39,283
24,237
42,247

```


##以上
Rubyの例外について無知だったのでざっくりとまとめた

Rubyで例外処理を行うときにわからないことが多すぎたので調べた。

## シンプルに
シンプルに`begin`と`rescue`を使うパターン。`raise`を使うと意図的に例外を出すことができる。
`raise`で以下のように例外を出した場合は、例外の種類は`RuntimeError`となる。

```ruby
begin 
  raise "例外を発生させたい"
rescue => exception
  puts exception.class
  puts exception.message
  puts exception.backtrace
end
```

実行結果

```
RuntimeError
例外を発生させたい
test.rb:2:in `<main>'
```

`raise`で`RuntimeError`以外のエラーを出したいときには以下のように記述する。同時にメッセージを登録することができる。

```ruby
begin 
  raise StandardError.new('例外を発生させたい')
rescue => exception
  puts exception.class
  puts exception.message
  puts exception.backtrace
end
```
実行結果

```
StandardError
例外を発生させたい
test.rb:2:in `<main>'
```

## 関数内での例外処理

関数内で例外処理を行いたい場合は以下のように記述する。関数内の場合は、`begin`のブロックを利用する必要がない。

```ruby
def test
  raise StandardError.new('例外を発生させたい')
  rescue => exception
    puts exception.class
    puts exception.message
    puts exception.backtrace
end

test()
```

実行結果

```
StandardError
例外を発生させたい
test.rb:2:in `test'
test.rb:9:in `<main>'
```

関数内の関数で例外が発生した場合には外側の関数で捕捉される。

```ruby
def exception
  raise "関数内での例外"
end

def test
  exception()
rescue => exception
  puts exception.class
  puts exception.message
end

test()
```

実行結果

```
RuntimeError
関数内での例外
```

## 複数の例外

エラーの種類により処理を分けることができる。以下の例では`StandardError`と`RangeError`の時は上の`rescue`、それ以外の場合は下の`rescue`で捕捉される。

```ruby
begin 
  raise StandardError
  rescue StandardError, RangeError => exception
    puts exception.class
  rescue => exception
    puts exception.class
end
```

実行結果

```
StandardError
```

`ZeroDivisionError`を発生させる

```ruby
begin 
   1/ 0
  rescue StandardError, RangeError => exception
    puts exception.class
  rescue => exception
    puts exception.class
end
```

実行結果

```
ZeroDivisionError
```

## 独自のエラー

`StandardError`を継承し、独自のエラークラスを作成することができる。


```ruby
class MyError < StandardError
  def initialize(msg="Error Message")
    super
  end
end

begin
  raise MyError.new("エラーです")
rescue => exception
  puts exception.class
  puts exception.message
end
```

```
MyError
エラーです
```

## まとめ
ざっくりとまとめた。雰囲気は掴めた気がする。
mac CatalinaでRedash構築

## まえおき
mac Catalina上にRedashを構築したときにいろいろとはまったので手順をメモ

## リポジトリをクローン
```
$ git clone https://github.com/getredash/redash.git
$ git checkout refs/tags/v8.0.0
```

## 構築に必要なコマンドをインストール
```
$ brew install pwgen
```

## Dockerをダウンロードしてインストール
https://download.docker.com/mac/stable/Docker.dmg

## ディレクトリの作成
```
$ sudo mkdir /opt/redash
$ sudo chown $USER:staff /opt/redash
$ mkdir /opt/redash/postgres-data
```

## docker-compose.ymlのコピー
```
$ cd /opt/redash
$ cp <クローンしたパス>/redash/setup/docker-compose.yml .
```

## DockerのFile sharingにフォルダを追加

<img width="1040" alt="スクリーンショット 2020-02-19 23.46.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149856/1d240746-8a4e-5f36-3073-5311543107d5.png">

## <クローンしたパス>/redash/setup/setup.shの書き換え

```
#!/usr/bin/env bash
# This script setups dockerized Redash on Ubuntu 18.04.
set -eu

REDASH_BASE_PATH=/opt/redash

create_config() {
    if [[ -e $REDASH_BASE_PATH/env ]]; then
        rm $REDASH_BASE_PATH/env
        touch $REDASH_BASE_PATH/env
    fi

    COOKIE_SECRET=$(pwgen -1s 32)
    SECRET_KEY=$(pwgen -1s 32)
    POSTGRES_PASSWORD=$(pwgen -1s 32)
    REDASH_DATABASE_URL="postgresql://postgres:${POSTGRES_PASSWORD}@postgres/postgres"

    echo "PYTHONUNBUFFERED=0" >> $REDASH_BASE_PATH/env
    echo "REDASH_LOG_LEVEL=INFO" >> $REDASH_BASE_PATH/env
    echo "REDASH_REDIS_URL=redis://redis:6379/0" >> $REDASH_BASE_PATH/env
    echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $REDASH_BASE_PATH/env
    echo "REDASH_COOKIE_SECRET=$COOKIE_SECRET" >> $REDASH_BASE_PATH/env
    echo "REDASH_SECRET_KEY=$SECRET_KEY" >> $REDASH_BASE_PATH/env
    echo "REDASH_DATABASE_URL=$REDASH_DATABASE_URL" >> $REDASH_BASE_PATH/env
}

setup_compose() {
    cd $REDASH_BASE_PATH
    echo "export COMPOSE_PROJECT_NAME=redash" >> ~/.bash_profile
    echo "export COMPOSE_FILE=$REDASH_BASE_PATH/docker-compose.yml" >> ~/.bash_profile
    export COMPOSE_PROJECT_NAME=redash
    export COMPOSE_FILE=$REDASH_BASE_PATH/docker-compose.yml
    sudo docker-compose run --rm server create_db
    sudo docker-compose up -d
}

create_config
setup_compose

```

## setup.shの実行
```
$ sh <クローンしたパス>/redash/setup/setup.sh
```

## redashにアクセス
ブラウザでhttp://localhost:5000

<img width="1252" alt="スクリーンショット 2020-02-19 23.59.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149856/e5fe0dce-3979-8134-14b5-9db52643054c.png">

# 参考文献
- [最新のRedashをMac上で起動する](https://qiita.com/rhirabay/items/27a44d6f645687774b9c)
SQL構造、操作　データベース設計、構造、正規化

SQL
登録、更新、削除、検索、基礎、発展
演算子が入ると頭がパニくる、何回も繰り返しやらないとわからない

データーベース
エンティティ、エンティティ属性、エンティティ同士の関係性（リレーション）
データベースの設計の手順
ER図、キー（主キー、外部キー）、エンティティ＝テーブル、制約、インデックス
正規化が特によくわからない、紙に書いてみてもめちゃくちゃ、分からないなりにアウトプットし続けるしかないかな
【UiPath】ブラウザーを開く関連について

※プライベート端末にUiPathを入れていないため、文字のみで失礼します。

だいぶ間が空いてしまいました。
業務でUiPathを使用しているのですが、普段皆様の知識をお借りしているため、
備忘録兼誰かの助けになれば、と投稿します。

# "ブラウザーを開く"アクティビティ
その名の通りブラウザを開くアクティビティです。
このアクティビティには必須のプロパティがいくつかあります。

1. URL
2. BrowserType

どちらもそのままですが…。
2のBrowserTypeで指定したブラウザで、1で指定したURLを開きます。
また、出力結果としてブラウザ型の変数にそのブラウザを格納することができます。

# ブラウザへのテキスト入力やクリック操作
Webアプリなんかを自動化する場合、どうやっても避けては通れない部分ですね。
私事ですが、前任の方から引き継いで初めてUiPath、ならびにRPAを触っているため
もしかしたら間違った知識かもしれませんが…。

たとえばこんなページがあったとして・・・

```html:index.html
<label>ユーザー名</label>
<input type="text" name="username" id="username" placehplder="例)FooBar"/>
<label>パスワード</label>
<input type="password" name="password" id="password" />
<button type="button" class="btn postButton" id="postButton" >送信</button>
```
**テキストを入力(TypeInto)**アクティビティを使う際には、セレクターは大体以下のような指定になると思います。

```
ユーザ名："<webctrl id='username'>"
パスワード："<webctrl id='password'>"
```
IDがページの中でユニークだからできる指定ですね。
`name='username'`の指定でもおそらく動くとは思います。

送信ボタンを押す際は、UI Automation->要素->マウス->クリックのセレクターを

```
"<webctrl id='postButton'>"
```

ですかね。上記以外にボタンがなければ
`class='btn postButton'`の指定でも平気かもしれません。

さて、ここで気にしなければいけないことですが。
**webctrlでの指定はブラウザーを開くのDoの中にアクティビティを入れる**ということです。

キャプチャがないので大変申し訳ありませんが・・・

```
ブラウザーを開くDo {
    テキストを入力
    テキストを入力
    クリック
}
```
であれば、問題ないのですが・・・

```
ブラウザーを開く Do{
}
テキストを入力
テキストを入力
クリック
```

の場合だと、
`セレクターが有効ではありません(SelectorNotFoundException)`が表示されたり
`想定とは異なる場所にテキストを入力する`恐れがあります。

**ブラウザーを開いた後の処理のため、Doの中にいなくてもいいじゃん？**
私もそう思いました。それで動くと思ったのですが、きちんと動作せず…。
Doの中に入れ、webctrlでの指定を行うことで、正常に動作しました。

ウェブコントロールというだけあって、そういう縛りがあるのかな、という理解をしております。
(もし正しい知識をお持ちの方は教えていただければ、と・・・)


大した内容は書いておりませんが、今回は以上とさせていただければと思います。
最近は、UiPathだけでは難しい場合、JavaScriptを挿入したりして試行錯誤しております。
とはいっても、もっぱらquerySelectorで指定し、idを付与しているだけですが。

それを利用してあるページのTRを丸ごと引っこ抜いた話や
パブリッシュについてなんかも備忘兼学習内容として投稿させてもらえればと思います。

それでは。
【Ubuntu】リポジトリのURL変更

#リポジトリURLの変更
デフォルトのリポジトリは遅い・・・
が、大きな支障は無いので、そのまま過ごしてしまう。
分かっていても、しばらく放置をしてしまう。
~~設定変更にも時間も手間もかかるし、仕方がない・・・。~~

## 設定ファイルの場所
``` config
/etc/apt/sources.list
```

端的に設定ファイルを見ると
`http://archive.ubuntu.com/ubuntu/`
上記の設定個所を変更すると良い。

### 設定ファイルが存在しない場合。
``` conifg
/etc/apt/sources.list.d/
```
ここにあるのはディレクトリなので、配下にあるファイルを変更していく。


# 変更先のダウンロードサイトについて
変更先のURLについては日本国内のUbuntuのダウンロードサイトである
[このサイト](http://www.ubuntulinux.jp/ubuntu/mirrors)を参考に好きなものを選ぶ。

## 備考：Vimの扱いについて
結構変更箇所が多いので、一つ一つ置換するのは非常に大変。
プログラマの端くれとしては置換を簡単にしたい・・・。

VimがLinuxには基本的に入っているのでVimで編集するように
`sudo vim /etc/apt/sources.list`
から下記のコマンドを実行する。

```
:%s;<変更前url>;<変更後url>
```
AZ-103: Microsoft Azure Administrator の取得

# 目的
- 仕事はAWSメインだが、マルチクラウドな人材になるため、Azureも勉強しようと思い、成果の明確化のため、「AZ-103: Microsoft Azure Administrator」を取得することとした。
- 参考書もなく手探りだったため、後続の人の参考になればと思い、実施した内容を整理しておきたい。

# 勉強法
- Linux Academy での勉強
    - [Linux Academy](https://linuxacademy.com/) は、各種IT資格の取得支援コンテンツを提供する有料サイト。
    - AZ-103 対応のコースがあり、説明動画の視聴、ハンズオンを全て実施すると所要時間は27時間。
    - 説明内容毎に動画は分割されているため、「この機能は知ってるから大丈夫」というところは視聴をスキップ。
    - ハンズオンや模擬テストは全て実施。
    - 不明な点は公式ドキュメントや実機で補足確認。
    
- Microsoft Learn
    - [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) は、Azure（AzureだけでなくOffice365等の他のMicrosoft製品/サービスも含む）について自分のペースで勉強できるサイト。Azureの機能や使い方の説明、簡単な確認テスト、Sandbox（一定時間Azure環境を使用可能）が提供されている。
    - Azureに関する初心者向けコンテンツを概ね実施。コンテンツを完了するとポイント(XP)がもらえるので、なんとなく達成感あり。35000XPでLevel7まで到達。
  
- 実機確認
    - Load Balancer - Web Server(WordPress) - DB のような、よくある構成を作って基本的な操作手順を確認。
    - Azure Monitor, Azure Backup 等の運用に関する機能を簡単に確認。
    - azコマンド、PowerShellを少しだけ練習。（細かいことを覚えるのは諦める）

# 申込み
- 受験に関する費用(2020/2時点)
    - 受験料（通常）：　&yen;21,103 (2020/2時点 [公式サイト](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-103?wt.mc_id=learningredirect_certs-web-wwl)より)
    - 模擬試験：　&yen;12,247 (2020/2時点 上記の公式サイトよりリンク)
    - Exam Replay： &yen;28,300～ (1回目に失敗した時に2回目無料になる仕組み： 2020/2時点 [公式サイト](https://www.microsoft.com/ja-jp/learning/local-exam-replay.aspx) )

上記のような選択肢があり悩んだが、まあ大丈夫かなと思い、男らしく模擬試験なし、Replayオプションなしで一発勝負することにした。

# 受験
- 試験結果：　合格(784点)  ※700点以上で合格

# 所感
- 試験範囲としてはIaaSが中心であり、「自分Azureできます」というにはまだまだなので、引き続きPaaS/SaaS部分を触っていきたい。
- せっかく資格取得したばかりなのに、2020/3頃からまた新しい試験(AZ-104)に変わってしまう？とのこと、、、
    - [トレノケート社ブログ：Microsoft Azure「新資格」についてまとめました](https://blog.trainocate.co.jp/blog/415_018)
Nvidia GPU driverの再インストール方法

# インストール済みNvidia GPU driverの削除方法 
### ・bashを用いる場合
 
```
sudo apt-get purge nvidia-* 
sudo apt-get purge cuda-*
```
これをfish上で実行すると下記のエラーが起こる。

```
fish: No matches for wildcard 'nvidia-*'. See `help expand`.
sudo apt-get purge nvidia-*
```
```
fish: No matches for wildcard 'nvidia-*'. See `help expand`.
sudo apt-get purge cuda-*
```
そのため、fishで実行する場合は次のようにする。

### ・fishを用いる場合 
```
sudo apt-get purge 'nvidia-*'
sudo apt-get purge 'cuda-*'
```

# aptリポジトリにNVIDIA GPU Driverリポジトリを追加
```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
```

# インストール推奨Driverを確認
```
ubuntu-drivers devices
```

### 実行結果

```
vendor   : NVIDIA Corporation
model    : GM107GL [Quadro K620]
driver   : nvidia-340 - third-party free
driver   : nvidia-driver-410 - third-party free
driver   : nvidia-driver-418 - third-party free
driver   : nvidia-driver-415 - third-party free
driver   : nvidia-driver-435 - distro non-free
driver   : nvidia-driver-440 - third-party free recommended
driver   : nvidia-driver-390 - third-party free
driver   : xserver-xorg-video-nouveau - distro free builtin
```
今回はnvidia-driver-440が推奨Driverのため、これをインストールする。

# 推奨Driverをインストール
```
sudo apt install nvidia-driver-418
```

この後再起動するとnvidia-smiコマンドが使えるように。
Android10でダークテーマを有効にするとプッシュ通知の画像の色が反転する

# 事の発端
始まりは、現在の現場でお手上げ状態で放置されていたバグ。
Android10でダークテーマにすると、プッシュ通知の一部の画像の色が反転してしまうとのこと。
そこで私は調査を始めた。
(ここから余談です。忙しい方は最下部の結論まで飛ばしてください)

# 立ちはだかる壁
調べても調べても解決策が見つからない。 
`Android10 Dark Theme Negative filter` 
`Android10 Dark Theme Color Invert`
`Android10 ダークテーマ 色　反転`
etc...

いったいどれほどの検索をかけただろうか。一向に解決策が見つからない。
数多の検索結果の中でGoogle公式がこんな事を言っていた。

<img width="743" alt="スクリーンショット 2020-02-19 23.11.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589461/3bf06974-556c-c3a8-29e1-6f7aa01a0efd.png">

###動画などのメディアの中の色は変わりません
####動画などのメディアの中の色は変わりません
#####動画などのメディアの中の色は変わりません

<br>
Googleには任せておけないと思い、こんどはTwitterで調べ始める。するとその中に、Facebookアプリでも同様の現象が発生しているというツイートを見つけた。あの天下のFacebookアプリが？こりゃもう解決策など無いのでは・・・？

そんな考えが頭をよぎったとき、僕はふと、あることを思い出した。
`そういえばAndroid10にはフォースダークとかいう機能あったよな・・・`
`もしかしたら通知領域でのみそれが適用されていて、それをオフにすれば解決するのでは・・・？`
心臓が高鳴り始める。

僕は高鳴る胸を抑え、ゆっくりと検索条件を変えた。
`Android10 フォースダーク オフ`

そして、僕は見つけた。
`android:forceDarkAllowed`

うん、それっぽいパラメータだ！
絶対これに違いない！！！

しかしこのパラメータ、targetSdkVersionが29じゃないと動作しない。28のままだったので、とりあえず29にあげる。
<br>

あれ？


### 治った

# 結論
targetSdkVersionとcompileSdkVersionを29に上げましょう。
その際はこちらにも注意してね。
https://developer.android.com/about/versions/10/behavior-changes-10?hl=JA
AtCoder Beginner Contest 153

https://atcoder.jp/contests/abc153

###D - Caracal vs Monster

再帰関数で高速にできる。

```python
import sys
sys.setrecursionlimit(1000000)
 
 
def solve(n):
    if n == 1:
        return 1
    return 1 + 2 * solve(n // 2)
 
 
print(solve(int(input())))
```

###E - Crested Ibis vs Monster

2つ方法がある。
一つは、解説によるHPごとに魔力消耗を計算する方法です。

```python
import numpy as np
import sys
read=sys.stdin.read

h, n, *ab = map(int, read().split())
a = np.array(ab[::2])
b = np.array(ab[1::2])

magic = np.zeros(h + 1, dtype=np.int64)
for i in range(1, h + 1):
    magic[i] = np.min(magic[np.maximum(i - a, 0)] + b)
print(magic[h])
```

もう一つは、重複計算をキャッシュで保存するPythonのlib`lru_cache`を利用する。
ちょっとずるいと感じる。

```python
import sys
from functools import lru_cache
sys.setrecursionlimit(1000000)

H, N = map(int, input().split())
AB = []
for i in range(N):
    A, B = map(int, input().split())
    AB.append((A, B))


@lru_cache(maxsize=None)
def f(h):
    if h <= 0:
        return 0
    best = float("inf")
    for a, b in AB:
        val = b + f(h - a)
        if val < best:
            best = val
        else:
            break
    return best


AB.sort(key=lambda ab: (ab[0] / ab[1], -ab[0]), reverse=True)
bestA, bestB = AB[0]
print(f(H))
```

###F - Silver Fox vs Monster

要するにpop_leftできる`deque`を使うと便利です。lru_cacheを知らなかったら、問題Eより簡単だったと思う。

```python

import sys
from collections import deque
read = sys.stdin.read
readline = sys.stdin.readline

n, d, a = map(int, readline().split())
m = map(int, read().split())
monsters = sorted(zip(m, m), key=lambda x: x[0])

bomb_area = deque([])
bomb_power = deque([])
total_damage = 0
ans = 0
for pos, hp in monsters:
    while bomb_area:
        area = bomb_area[0]
        if area < pos:  # 前回の爆弾が今回のモンスターに攻撃しなかった
            bomb_area.popleft()
            power = bomb_power.popleft()
            total_damage -= power  # 届かなかったダメージを減算
        else:
            break
    if hp <= total_damage:
        continue
    else:
        rest = hp - total_damage
        count = rest // a + (rest % a != 0)  # 割り切れるなら商、ないなら商+1
        ans += count
        power = a * count
        total_damage += power
        bomb_area.append(pos + 2 * d)
        bomb_power.append(power)
print(ans)
```
firebaseから値を取り出すときに気をつけるポイント

今日、vue.jsを書いていた躓いたポイントについてです。

v-htmlでscriptのインスタンスを取り出そうとしたのですが、思うように取り出すことができず。

`tweets`の中で `uid` のあう `tweet` の `content` を取り出そうとしていて、このようなコードを書いていました。
tweetsはfirebaseに保存しています。


```javascript

<template>
    <div>
        <div class="content" v-html="tweet.content"></div>
    </div>
</template>

<script>
import { db } from '../main';

export default {
    props: ['uid'],
    data(){
        return{
            tweet: {}
        }
    },

    firestore(){
        return{
            tweet: db.collection('tweets').where('uid', '==', this.$props.uid)
        }
    }
}
</script>
```

propsで持ってきた`uid` を使って `contents` と照合し、`uid`のあうものを表示させるというものです。

どこが違うかわかりますでしょうか。
firebaseで返ってきた値は配列で保持されているため、`tweet.content`では取り出すことができないんですね。
ですので、先ほどの

```javascript

<div class="content" v-html="tweet.content"></div>
``` 
というテンプレート部分を、

```javascript

<div class="content" v-html="tweet[0].content"></div>
```

に変更すると、tweetの配列1番目のcontentということで、中身を取り出すことができます。

また1つ学びました。
基本情報技術者　ストラテジ系　第1章 システム戦略①


# ①情報システム戦略の基礎
全体として上手くいく、「経営戦略」との整合性を念頭におきます。

## エンタープライズアーキテクチャ (EA)
経営の見取り図とも言われる方法です。

4階層で整理し、体系化しています。

### ビジネスアーキテクチャ(BA,政策・業務体系)
ビジネスや業務活動の可視化

関連文書:
機能情報関連図(DFD)
業務説明書
業務流れ図

### データアーキテクチャ(DA.データ体系)
企業・組織の利用情報の可視化

関連文書
E-R図
データ定義表
UMLのクラス図

### アプリケーションアーキテクチャ(AA,適応処理体系)
ビジネスにおける、情報システム構造の可視化

関連文書:
情報システム関連図
情報システム機能構成図

### テクノロジアーキテクチャ(TA,技術体系)
情報システムを可視化させ、ビジネスに必要な
技術、サービスを提供する層

関連文書:
ハードウェア構成図
ソフトウェア構成図
ネットワーク構成図

## エンタープライズアーキテクチャの手順

### 現状(Asls)モデル
現状を明らかにするため作成します。

### 理想(ToBe)モデル
あるべき姿を明確にしたものを作成

### 次期(Target)モデル
上記二つの中間モデル

## BPR(Business Process Re-engineering)
プロセスや業務フローを抜本的に見直し、
再構築を行うもの

## 業務プロセス改善

### RPA(Robotic Process Automation)
提携業務や標準化されている業務をソフトウェアを使って自動化する取組

### チャットボット
人間との会話を自動的に行うもの

## ソリューションビジネス
企業コンサルタントのようなもの
ソフトウェアの販売だけてなく、顧客の問題解決を行います。

### ERP(Enterprise Resource Planning)
情報を一元管理することで、最適化を図ること
事前にBPRを行うことが重要

### ASP(Application Servise Provider)
ネットを通じて、アプリサービスを行う事業者

### SaaS(Software as a Service)
ASPと基本は一緒、ソフトウェアの分割提供

### PaaS(Platform as a Service)
ホストコンピュータの貸し出し
要はサーバのレンタル

### IaaS (Infrastructure as a Service)
Paasをさらに発展させたもので、OSや開発環境の構築、仮装ネットワーク環境など
ユーザが行います。

### SOA(Service Oriented Architecture)
各社からサービスを提供してもらう方法

## データ活用

### ビックデータ
日々発生する膨大な情報を収集したもの

### 機械学習(ディープラーニング)
問題について機械に学習させる技術

人工知能(AI)とも言います。

### テキストマイニング
文章の特性を分析する手法

### データサイエンス
データ分析に関する学問。

数学、統計学、情報化学などから
法則の導き出し、事業価値の産み出しを行います。
[備忘録]DCGANやってみた

# はじめに
この記事は自分用の~~備考録~~備忘録です。
参考にしたのは以下の記事です。
[DCGANでポケモンとアイマスを作成したった](https://qiita.com/yoyoyo_/items/4df8d78b5118190bbcd2)
[初学者がGoogle ColaboratoryでDCGANしようとして詰まってた話](https://qiita.com/Kouki0928/items/dfc14448ec0c8ce83f90)

#なぜGANなのか？
会社で学生相手に画像認識技術で何か面白いことができないか？ということで,自分の勉強がてらにやってみました.
GANのいい所として、最終的な結果が画像で出力されて出てくるため,精度云々の話をするより直感的で楽しそうだと考えたからです.

#教材について
DCGANはDeep Convolutional GANの略で自然が画像が生成できるようです.

githubで公開されている以下の記事
https://github.com/carpedm20/DCGAN-tensorflow
からコードを丸写しで作りました
実行環境はご存知Google Colaboratoryを使用しました.

#環境作り
以下のコマンドを入れるとGoogle Driveにアクセスできるようになる.

```
# Googleドライブに接続
from google.colab import drive
drive.mount('/content/drive')
```



次に必要なライブラリを導入

```
pip install scipy==1.1.0
!python -m pip install pillow
```

mnistのサンプル学習データをダウンロード

```
!python download.py mnist
```

学習開始！

```
! python main.py --dataset mnist --input_height=28 --output_height=28 --train
```
大体15分くらいで学習が完了した.

画像が生成されていく過程があったのでgifにしてみた.
![out_file.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67885/33da9b77-d19c-4bb7-2db5-4eb33071fc5f.gif)
簡単に試すことができました。

#セレブ顔の作成
次はもう一つのデモを作成.

```
!python download.py celebA
```
上記のコマンドでデータセットをダウンロードしようとしたがエラーで進まない.

続く・・・
Hyperを起動した時に%が自動で表示される

Hyperを起動すると先頭に必ず%（パーセント記号）が表示されてしまい気になります。

## 解決方法

.zshrcに下記のコードを書き足すことで解決しました。

```
unsetopt PROMPT_SP
```

参考:https://github.com/zeit/hyper/issues/2144
ArchLinuxのインストール方法

biosモードで起動している場合の方法です。
# usbメディアを作る
https://www.archlinux.jp/download/ 
から落としてきたisoファイルを適当なツールでusbメモリに焼きます。

# パーティションを作る
fdiskを使ってパーティションを1つ作り、フォーマットし、マウントします。(/dev/sdXはインストールしたディスクに合わせて変えてください)

```
# fdisk /dev/sdX
# mkfs.ext4 /dev/sdX1
# mount /dev/sdX1 /mnt
```

システムクロックの更新

```
# timedatectl set-ntp true
```

スワップ領域はあとからスワップファイルで設定できるので今は作りません。

# ベースシステムをインストール
~~/etc/pacman.d/mirrorlist　を編集して日本サーバーの行を一番上に移動してから~~(reflectorが自動でやってくれます)
pacstrapを使ってマウントしたパーティションにベースシステムをインストールします。

```
# pacstrap /mnt base base-devel linux linux-headers linux-firmware
```

fstabを生成します。

```
# genfstab -U /mnt >> /mnt/etc/fstab
```


# chroot
chrootします。

```
# arch-chroot /mnt
```

ホストネームを設定します。

```
# hostnamectl set-hostname ホストネーム
```

wheelグループのユーザーがsudoコマンドを実行できるようにします。

```
# visudo
```

を実行し

```
%wheel ALL=(ALL) ALL
```

のコメントアウトを外す。

rootユーザーのパスワードを設定する

```
# passwd
```

一般ユーザーを追加し、wheelグループに追加する。

```
# useradd -m ユーザー名
# usermod -aG wheel ユーザー名
# passwd ユーザー名
```

必要なパッケージを入れる。
ドライバーやエディター、ターミナルエミュレータは自分の環境や好みに応じて変えてください

```
# pacman -S sudo grub nvidia networkmanager plasma vim alacritty
```

sddmとnetworkmanagerを有効化

```
# systemctl enable sddm
# systemctl enable NetworkManager
```

grubをインストール

```
# grub-install --target=i386-pc /dev/sdX
# grub-mkconfig -o /boot/grub/grub.cfg
```

chrootを抜ける

```
# exit
```

電源を切ってUSBメモリを抜いてから起動する。

# ノートPCに入れる場合

ノートPCに入れる機会があったので追記します。
UEFIモードは有効になっています。

## キーボードの配列を変える

```
# loadkeys jp106
```

## インターネットに接続する

```
# iwctl
[iwd]# station <wlan> connect <"network name">
```
アジャイル開発手法一覧と教科書的な本

## 目的

新しいチームに入った人、チーム内で新しい開発手法を試す必要がある人、開発手法を見直したい人が確認するために作成しました。

## アジャイル開発

アジャイルサムライ−達人開発者への道−   Jonathan Rasmusson
https://www.amazon.co.jp/dp/4274068560/ref=cm_sw_r_tw_dp_U_x_WjttEbRMPTHA7

アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~   Mike Cohn
https://www.amazon.co.jp/dp/4839924023/ref=cm_sw_r_tw_dp_U_x_gnttEb05Z3S5R

### スクラム

エッセンシャル スクラム   Kenneth S. Rubin 
https://www.amazon.co.jp/dp/B00MB6GO7E/ref=cm_sw_r_tw_dp_U_x_dZstEb2A6QKNQ

アジャイル開発とスクラム 顧客・技術・経営をつなぐ協調的ソフトウェア開発マネジメント   平鍋健児
https://www.amazon.co.jp/dp/B00DIM66P0/ref=cm_sw_r_tw_dp_U_x_IYstEbW4GJJBM

スクラム　仕事が４倍速くなる“世界標準”のチーム戦術   ジェフ・サザーランド
https://www.amazon.co.jp/dp/4152095423/ref=cm_sw_r_tw_dp_U_x_RjttEb87XTV5E

### リーン開発

リーン開発の現場 カンバンによる大規模プロジェクトの運営   Henrik Kniberg
https://www.amazon.co.jp/dp/427406932X/ref=cm_sw_r_tw_dp_U_x_gottEb45NR6KB

リーン開発の本質   メアリー・ポッペンディーク
https://www.amazon.co.jp/dp/482228350X/ref=cm_sw_r_tw_dp_U_x_trttEb9GTN0R2

### リーンスタートアップ

図解リーン・スタートアップ成長戦略   アッシュ・マウリャ
https://www.amazon.co.jp/dp/B07713Z44D/ref=cm_sw_r_tw_dp_U_x_a5ttEb4PQNW20

リーン・スタートアップ　ムダのない起業プロセスでイノベーションを生みだす   エリック リース
https://www.amazon.co.jp/dp/B00F3UTIQY/ref=cm_sw_r_tw_dp_U_x_w5ttEbWJHWH5Q

### エクストリームプログラミング(XP)

エクストリームプログラミング   ＫｅｎｔＢｅｃｋ
https://www.amazon.co.jp/dp/B012UWOLOQ/ref=cm_sw_r_tw_dp_U_x_xsttEbZ63D4PE

XPエクストリーム・プログラミング入門―ソフトウェア開発の究極の手法   ケント ベック
https://www.amazon.co.jp/dp/489471275X/ref=cm_sw_r_tw_dp_U_x_ftttEbK2MFB84

### ドメイン駆動開発(DDD)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)   エリック・エヴァンス
https://www.amazon.co.jp/dp/4798121967/ref=cm_sw_r_tw_dp_U_x_futtEb3XJJ2TR 

実践ドメイン駆動設計   ヴァーン・ヴァーノン
https://www.amazon.co.jp/dp/B00UX9VJGW/ref=cm_sw_r_tw_dp_U_x_euttEb159NEBR

### テスト駆動開発(TDD)

テスト駆動開発   Kent Beck
https://www.amazon.co.jp/dp/4274217884/ref=cm_sw_r_tw_dp_U_x_mvttEb7F004ZW

実践テスト駆動開発 (Object Oriented SELECTION)   Steve Freeman
https://www.amazon.co.jp/dp/4798124583/ref=cm_sw_r_tw_dp_U_x_AvttEbA6AB1RQ

### ユーザー機能駆動開発(FDD)

アジャイル開発手法FDD―ユーザ機能駆動によるアジャイル開発 (ボーランドオフィシャルブック)   スティーブン・R. パルマー
https://www.amazon.co.jp/dp/4894717352/ref=cm_sw_r_tw_dp_U_x_XXttEbNZ2PWC7

### DevOps

The DevOps ハンドブック 理論・原則・実践のすべて   ジーン・キム
https://www.amazon.co.jp/dp/B073PRMWR5/ref=cm_sw_r_tw_dp_U_x_N1ttEbG1F9QY3

Effective DevOps ―4本柱による持続可能な組織文化の育て方   Jennifer Davis
https://www.amazon.co.jp/dp/4873118352/ref=cm_sw_r_tw_dp_U_x_h1ttEbC8QXRNM
JavaScriptの変数宣言「var,let,const」の使い分け

# JavaScriptの宣言var,let,constの違い

この記事はこちらに移動しました。
https://masa-enjoy.com/javascript%e3%81%ae%e5%a4%89%e6%95%b0%e5%ae%a3%e8%a8%80var-let-const%e3%82%92%e6%af%94%e8%bc%83%e3%81%99%e3%82%8b
基本情報技術者　マネジメント系　第3章 システム監査



[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより

まとめた内容を載せます。

# ①システム監査の基礎
第三者から評価のことがシステム監査のこと

## システム監査の目的と内容

システム監査基準の前文に置いて気になる単語は以下になります。

* 情報システムリスク
* 独立から専門的な立場の監査法人
* 点検・評価・検証
* 組織体の経営活動と業務活動の効果的かる効率的な遂行
* 変革の支援
* 目標達成に寄与
* 利害関係者に対する説明責任

## システム監査の種類

### 保証型監査
JISなど各評価基準に合致していること保証すること

### 助言型監査
改善点のアドバイス

## 監査人の独立性
監査人が中立的ないといけません

### 外観上の独立性
身分、組織的に独立

### 精神上の独立性
恣意的な判断はなし

### システム監査基準の記述

* 監査対象の領域または活動
* 独立かつ客観的な立場
* 外観に十分に配慮
* 客観的な視点から公正な判断

## 監査員の慎重な姿勢と倫理の保持

### 慎重な姿勢

### 守秘義務

## システム監査報告とフォローアップ

### 監査報告書の提出

### フォローアップ

## 可監査性
可能であるか
下記の二つの条件を満たしているか

* コントロールが存在
* 監査証跡が存在していること

## 監査証跡
処置過程を追跡できる仕組み、記録

業務日誌やログのこと

## 監査証拠
監査人の意見を立証する事実のこと

### 物理的証拠
書類など

### 文書的証拠
監査人が内容を検証した文書
マニュアル、契約書など

### 口頭的証拠
当事者にインタビューなど

## 監査長所
収集した情報や事実をまとめた文書

## ITシステムの内部統制
ミスが出ないよう統制機能を設ける必要があります。

主に下記のようになります。

### 予防牽制機能
警告などの予防

### 誤謬適時機能
問題発生の早期検知、警告機能

### 修正回復機能
問題検出と同時に修正して影響範囲を最小限にすること。

# ②システム監査の実施
計画に基づいて

1,予備調査
2,本評価
3,評価、結論の形成

の順番に行います。

## 監査計画

経営目的と合致させて進めます。

* 中長期計画: 2〜3年
* 年度計画書: 1年の期間
* 個別監査計画書: 毎回の監査の活動計画書

## 予備調査

コントロール整備状況の調査

## 本調査

コントロールが正しく機能し運用されているか

## 評価・結論の形式

これまでの分析

## 本調査における監査技法

### 基本監査技法

#### チェックリスト法
作成した質問書から回答

#### ドキュメントレビュー法
監査人自ら資料よりレビュー

#### 突合法・照合法
整合性の確認

#### 現地調査法
現地確認

#### インタビュー法
直接問合せ、意見・回答を入手



### コンピューター監査技法

#### テストデータ法
テストデータによる方法

#### 監査プログラム法

#### 監査モジュール法

#### ITF法、ミニカンパニ法
監査用レコードを混ぜて確認

#### 並行シミュレーション法
似たようなプログラムを作って確認

#### スナップショット法
特定のデータ、条件でメモリダンプをとる

#### トレーシング法
プログラムの流れから確認

#### コード比較法
正統性のあるプログラムと比較
使い方その3(Git,GitHub資料5)

#使い方その3

GitHubにはPull requestsの他にもたくさんの機能があります。ここではその機能を紹介したいと思います。

#Issues

Issuesは**プロジェクトやソースコードの課題を管理するための機能**です。リポジトリごとに管理されています。

作り方
まずはリポジトリのIssuesページへ行き、「New Issue」を押すと作成ページが出てくるのでタイトルに課題の内容を簡単に書き、コメントに詳細を書きます。最後に「Submit new Issue」でIssueの登録が完了します。

このIssueに対してコメントをすることもできます。
GitHubの便利なところはこの**Issueに他のIssueやPull Requestとリンクしてくれる機能**があり、見やすいように表示されます。

課題が解決したら「Close Issue」を押してクローズします。クローズしたIssueを一覧から確認することができます。

Issueには他にも便利な機能があります。以下がその一覧です。

* Assignee機能
* Milestone機能
* Label機能

###Assignee
これは**Issueに担当者を定める機能**です。Issueのサイドバーの「Assignee」からユーザーを選択することができます。

これを定めることにより誰がどのくらいタスクを抱えているかがわかり、担当者がしっかり通知を受け取ることができます。

###Milestone
これを使うことによって、機能単位の予定日やリリース日の予定日などのスケジュールを設定することができます。
これはIssueごとに期限を設けるのではなく、先にMilestoneを作成してそこにIssueを紐付けします。

Issuesのページから「Milestones」を選択し、「New milestone」から作成します。タイトル、期限、詳細を入力し「Create milestone」を押せば作成されます。
その後、各Issueのサイドバーからそれに対応させたいMilestoneを選択することで完了になります。

一覧からIssueの内容、何％クローズされたかという進捗を見ることができます。

###Label
これは増えた**Issueにラベル付けをし分類、整理できる機能**になります。

これもIssueのサイドバーから選択することができます。
ラベルはデフォルトでいくつか種類がある(bug, puestion, etc...)ので足りない場合は追加していくといいでしょう。

ラベルは複数選択が可能で、**一覧からフィルタリング**をすることもできます。

#Projects

Projectsは簡単に言うと**かんばん方式のタスク管理機能**です。
これを使用することによって「今どんなタスクが進行しているか」「タスクがどんな状態にあるか」などを確認することができます。

Projectsは**「project」「column」「card」から構成**されていて、projectの中にcolumn、columnの中にcardを追加することができます。いずれも複数作成することができます。

**作り方**
まずはprojectを作成します。リポジトリのProjectsから「Create a project」、すでにある場合には「New project」を押して、プロジェクトの名前、説明を書いて「Save project」を押して作成完了です。

次にcolumnは「Add column」から名前をつけて作成します。
columnの「＋」ボタンからcardを作成します。

cardは**ドラッグ＆ドロップで各columnへ移動**させることができます。

例えば、「To do」「Done」という２つのcolumnを作成します。
その後「ユーザー登録機能をつける」や「ログイン機能をつける」などのcardを作り、「To do」のところに置きます。cardの作業が終わったら「Done」にドラッグ＆ドロップします。
これにより今何をすればいいかや、どのタスクが終了しているかなどをひと目で見ることができます。

また、**IssueやPull Requestをcardとして追加**することができます。
projectのページから「Add cards」を押すとIssue, Pull Requestが表示されるので、それを対応するcolumnにドラッグ＆ドロップして追加することができます。

#Wiki

これはその名の通り**リポジトリ内のwiki機能**です。
GitHub公式ではプロジェクトの利用方法、設計方法、中核的な原理などプロジェクトに関する長いコンテンツを共有するために利用すると説明されています。READMEでは手短にプロジェクト内容を述べていますが、これを使えば追加のドキュメンテーションを提供できます。

**使い方**
リポジトリのWikiページへ行き「Create the first page」すでにある場合は「New Page」から作成することができます。

記述形式を9種類(Markdown, Mediawiki, etc...)から選択できます。
その他ページの追加や、特殊ページを追加することができます。

**特殊ページ**
・Home : wikiを開いた時のTopページ。(タイトルを変更すると通常のページになるので注意)
・_Sidebar : 常にwikiの横に表示されるページ。目次などで便利。
・_Footer : 常に下に表示されるページ。
【cakephp】ルーティングについて

#ルーティング

URLをどのコントローラーのアクションと関連付けるか決める機能

ルーティングの設定は**app/Config/routes.php**で変更可能

#デフォルトURL

http://example.com/controller名/actionアクション名

#Router::conect

```php:routes.php
Router::connect(
 'URL',
 array('contoroller' => 'コントローラー名' ,
       'action' => 'アクションメソッド名'),
);
```

第一引数：指定するURL

第二引数：URLのコントローラーとメソッド
Mochaによるテスト実行時に複数のレポーターを使用する方法

Mochaによるテスト実行時に、複数のレポーターを使用する方法を紹介します。

## パッケージをインストール
[@mochajs/multi-reporter](https://www.npmjs.com/package/@mochajs/multi-reporter)パッケージをインストールします。

```sh
$ npm i -D @mochajs/multi-reporter
```

## Mochaの設定ファイルを更新
Mochaの設定ファイル（`.mocharc.json`など）に`reporter`を追加し、`@mochajs/multi-reporter`を指定します。

```json:.mocharc.json
{
  "reporter": "@mochajs/multi-reporter"
}
```

`mocha`コマンドの`--reporter`オプションで指定することもできます。

```js:package.json
{
  "scripts": {
    "test": "mocha --reporter @mochajs/multi-reporter"
  }
}
```

## @mochajs/multi-reporterの設定ファイルを作成
@mochajs/multi-reporterの設定ファイルとして、`.reporters.json`ファイルを作成します。

```json:.reporters.json
{
  "spec": true,
  "xunit": {
    "output": "report.xml"
  }
}
```

設定ファイルはオブジェクト形式で、キーにはレポーター名、値には有効フラグまたはレポーターオプションを指定します。
つまり上記の設定ファイルでは、`spec`と`xunit`という2つのレポーターを使用し、かつ`xunit`のレポーターオプションで`output`を`report.xml`にするという指定になっています。

## テストを実行
あとは普通にテストを実行します。

```sh
$ npm test
```

上記の設定の場合、`spec`によって標準出力にテスト結果が表示され、`xunit`によって`report.xml`ファイルが生成されます。
こうすることで、ヒューマンリーダブルな形式で結果を表示しつつ、XMLファイルやJSONファイルを出力してプログラムで扱うといったことが可能になります。
変数についての備忘録

# 変数

変数とは

* 変数とは値の出し入れができるもの

* 値とは、数値や文字列のことです

* 変数は自由に名前をつけたりすることができます。

* 変数の命名には規則があります。
　

    * 予約語を使わない
        
        予約語とは、プログラム言語において、
        その言葉はそれは役割決まってる言語です。
        
        
        例
        ```  　
        auto, break, case, char, const, continue, default, do, dougle, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeod, static, struct, switch, typedef, union, unsigned, void, volatile, while
         ``` 
    *   数字を先に書いてはいけない
    

    などいろいろあります。今回はここまで