OmniAICreator/Qiita-1.07M huggingface dataset:
AviUtlフォルダにフォントを置くだけで追加できるカスタムフォントプラグイン #AviUtl

![ドカベン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/16b8e555-dce1-54ec-bc8d-5d56497c063f.gif)
ﾃｰﾃｰﾃｰ ﾃﾃﾃ ﾃｯﾃﾃｰ ﾋﾟﾛﾘﾛﾘ♪

# 使い方！

1. [ここ]からzipをダウンロードして展開、`localfont.aul`を取り出す！
1. `aviutl.exe`と同じ場所か`Plugins`フォルダの中に`localfont.aul`を設置！
1. `aviutl.exe`と同じ場所に`Fonts`フォルダを新規作成！[^2]
1. `Fonts`フォルダにフォントを設置！[^1]
1. フォントを選ぶドロップダウンリストに追加されている！

とっても簡単で、便利なんです。

```:AviUtlフォルダ構造例
│  aviutl.exe
├─Fonts
│      NewDokabenFont_.otf
│      あずき.ttf
├─Plugins
│  │  localfont.aul
```

![fontlist.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62354/92d5732b-0357-94c3-3dee-bab8db350dfa.jpeg)

# アンインストール

`localfont.aul`と`Fonts`フォルダを削除！
レジストリは使用していません

`Fonts`フォルダ内のフォントを使っていたオブジェクトはデフォルトのフォントに置き換わります

***

# 

動画を編集しているとあんなかわいいフォントやこんな記号が入っているフォントを使いたくなりますがそんなフォントって日常使いしませんし、特定ソフトにしか使用しないのにWindows自体にインストールするのは好みじゃありません。
なのに一瞬しか使わないニッチなフォントやキャラごとのフォントの使い分けでどんどん種類は増えていく…

一部のソフトのようにソフト内の`Fonts`ディレクトリ内のフォントを参照するようにしてほしい…

と探してみたけれど、どれも
ダブルクリック→Windowsにインストール
の記事しかみつからなかったので作りました。

こういうのってローカルフォントとかプライベートフォント、カスタムフォントとか呼べばいいのかな？
Aviutlでは別のオブジェクト拡張が同名で出ているみたいだけどね。


# メモ

フォントの寿命はAviUtl終了までですが、再起動時に再度読み込まれます。
追加されたフォントはAviUtlだけが利用できます。
AviUtl起動中に他のソフトから参照できるわけではありません。
起動時にフォントのレジストリに追加、終了時にレジストリから削除、という動きでは**ありません**


# 検証例

動画作ったことが無いので出力や保存にどこまで対応しているか不明です。
編集のレジューム機能には対応していますし、トップのgifは`x264guiEx.auo`で出力したmp4なので出力にも一応反映されそうです。


# 参考

AviUtlのプラグイン作成に関する情報が少なくてつらい

* [【aviutl】#3 プラグインの入り口:いろいろ練習 - ブロマガ](https://ch.nicovideo.jp/shishi-thor/blomaga/ar1332052)
* [DLLのエントリポイント](http://eternalwindows.jp/windevelop/dll/dll10.html)
* [mingw32での「undefined reference to `WinMain@16'」](https://cat-in-136.github.io/2010/03/mingw32undefined-reference-to-winmain16.html)
* [msys2とC++で特定のDLLに依存しないwindowsバイナリを作る - siunのメモ](https://siuncyclone.hatenablog.com/entry/2018/07/21/194629)
* [c++ - How do I find the current directory? - Stack Overflow](https://stackoverflow.com/questions/4807629/how-do-i-find-the-current-directory)
* [How to check if directory exist using C++ and winAPI - Stack Overflow](https://stackoverflow.com/questions/8233842/how-to-check-if-directory-exist-using-c-and-winapi/8233867)
* [undefined reference to imp PathIsDirecto - C++ Forum](http://www.cplusplus.com/forum/general/241958/)
* [AddFontResourceExA function (wingdi.h) - Win32 apps | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/win32/api/wingdi/nf-wingdi-addfontresourceexa)

---


Qiitaのドカベンフォント記事を忘れていました
[CSSで再現するドカベンOPの文字エフェクト - Qiita](https://qiita.com/trkbt10/items/e451a9d90b90e7bb551f)
もう4年半前…

[^1]: `Fonts`内のフォルダに入っているフォントも大丈夫
[^2]: `Fonts` `fonts`どちらでも大丈夫
[ここ]: https://github.com/khsk/AviUtl-LocalFontPlugin/releases
初心者によるプログラミング学習ログ 328日目

#100日チャレンジの328日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
328日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>328日目 2h<br>・ポートフォリオ作成2h<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1265741971903004672?ref_src=twsrc%5Etfw">May 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Laravel bladeからvueにフォームで入力したoldの値を連携する時、型がmixする

Laravel5.8

BladeからVueにoldの値を連携する際はSession::getOldInput()を利用して連携するが、
oldの値がない時は配列で、値が存在する時はオブジェクトで返却するので、Vue側でエラーを履いてしまう問題。

当たり前だが、空のオブジェクトを生成して渡してあげれば良い

```
:old="{{json_encode(Session::getOldInput() !== [] ? Session::getOldInput() : new \stdClass)}}"
```
PRML　演習問題2.41　解答

## 問題 ##
>　ガンマ分布が正規化されていることを示せ。


## 解答 ##
(2.146)を積分する。
$\lambda$ = $1/\sigma^2$なので、積分範囲は $\lambda$ $\>0$である。

$\int_{0}^{\infty} \operatorname{Gam}(\lambda | a, b)=\int_{0}^{\infty} \frac{1}{\Gamma(a)} b^{a} \lambda^{a-1} \exp (-b \lambda) d \lambda$

$=\frac{1}{\Gamma(a)} \int_{0}^{\infty} b^{a} \lambda^{a-1} \exp (-b \lambda) d \lambda$

（$b \lambda=u$　とおくと、$b d \lambda=d u$　より、）

$=\frac{1}{\Gamma(a)} \int_{0}^{\infty} b^{a}\left(\frac{u}{b}\right)^{a-1} \exp (-u) b^{-1} d u$

$=\frac{1}{\Gamma(a)} \int_{0}^{\infty} b^{a} b^{-1} b^{1-a} u^{a-1} \exp (-u) d u$

$=\frac{1}{\Gamma(a)} \int_{0}^{\infty}u^{a-1} \exp (-u) d u$

$=\Gamma(a)\frac{1}{\Gamma(a)}$

$=1$

よって、題意は証明された。
④分散分析

#分散分析
分散を用いた平均値の分析。
因子の異なる水準が特性値の平均にもたらす差の有無を調べる。

>要因：データの値に変化を与える要素のこと。
因子：要因の中でも特に、母平均に差をもたらすことから研究対象となる（注目する）要因を指す。
水準：1つの要因に含まれる項目のこと。
◯元配置：データに含まれる因子の数を表す。

##一元配置分散分析
1つの因子からなるデータを分析する方法で、因子に含まれる水準間の平均値の差を見ることができる。
データ全体の平均値から因子の各水準の平均値がどのくらいずれているかを見ること。

###一元配置分散分析の流れ
1 帰無仮説(各群の母平均は等しい)$H_0$と対立仮説$H_1$を立てる。
2 有意水準$a$を設定する。
3 平方和(a.b.c.)を求める。
 $a = b + c$
>a.全体の平均値からの各データのズレ(全体)
b.全体の平均値からの因子の各水準の平均値のズレ(要因)
c.それ以外のズレ＝因子の各水準の平均値から各データのズレ(残差)
 
4 a.全体($n-1$)、b.要因($n-1$)、c.残差($a-b$)の自由度を求める。
5 b.要因とc.残差の平均平方(平方和$÷$自由度)を求める。
6 統計量Fを求める。

```math
F=\frac{s_{1}^{2}(要因の平均平方)}{s_{2}^{2}(残差の平均平方)}
```

7 F分布表(要因の自由度、残差の自由度)から値を読み取る。片側検定で行う。
8 検定統計量を元に結論を出す。

##二元配置分散分析
2つの因子からなるデータを分析する方法で、各因子における水準間の平均値の差を見ることができる。

###二元配置分散分析の流れ
1 帰無仮説(各群の母平均は等しい)$H_0$と対立仮説$H_1$を立てる。
2 有意水準$a$を設定する。
3 平方和(a.b.c.d.e.)を求める。
 $a = b + c + d + e$
>a.全体の平均値からの各データのズレ(全体)
b.全体の平均値からの因子1の各水準の平均値のズレ(因子1)
c.全体の平均値からの因子2の各水準の平均値のズレ(因子2)
d.全体の平均値からの因子1×因子2の各水準の平均値のズレからb.とc.を引いたもの(交互作用)
e.それ以外のズレ＝因子の各水準の平均値から各データのズレ(残差)
 
4 a.全体($n-1$)、b.因子1($n-1$)、c.因子2($n-1$)、d.交互作用($b×c$)、e.残差($a-(b-c-d)$)の自由度を求める。
5 b.因子1とc.因子2とd.交互作用とe.残差の平均平方(平方和$÷$自由度)を求める。
6 統計量Fを求める。

```math
F=\frac{s_{1}^{2}(各因子の平均平方)}{s_{2}^{2}(残差の平均平方)}
```

7 F分布表(各因子の自由度、残差の自由度)から値を読み取る。片側検定で行う。
8 検定統計量を元に結論を出す。

###交互作用
2つの因子が組み合わさることで初めて現れる相乗効果のこと。

>主効果：1つの因子に絞った場合の効果。

##多元配置分散分析
3つ以上の因子からなるデータを分析する方法。
Laravel + Vue のセットアップ

#書くこと
- Laravelのプロジェクト作成
- UIにVueを使えるようにする
- Vueのサンプルコンポーネントを表示してみる

#本題

##プロジェクト作成
コマンドでプロジェクト作成。
PROJECT_NAMEのプロジェクトフォルダが作成される。

```
composer create-project laravel/laravel PROJECT_NAME
```

作成したら移動しておく。
移動を忘れると後から行うパッケージインストールがプロジェクトの外にされるので注意。

```
cd PROJECT_NAME
```

Laravelを実行するのは下記のコマンド

```
php artisan serve
```

成功すると「Laravel development server started: http://127.0.0.1:8000 」と出てくる。
 http://127.0.0.1:8000 にアクセスしてLaravelのウェルカムページが出てくればOK。
（localhost:8000でもいい）


##Vueのインストールと有効化
パッケージをインストールして、UIにVueを使うように設定。

```
composer require laravel/ui
php artisan ui vue --auth
```

2個目のコマンドを実行した時点で、resources/js/componentsにExampleComponentというサンプルのVueコンポーネントが作成される。

実行後、「**Please run "npm install && npm run dev" to compile your fresh scaffolding.**（npm installとnpm run devも実行してね）」
と言われるので実行。

```
npm install
npm run dev
```

Vueに必要なモジュールのインストールとビルドをしていると思う。
Vueコンポーネントのコードを変更するたびにnpm run devを実行する必要がある。



##コンポーネント登録を自動化
デフォルトだと、新しくVueコンポーネントを作成したらresources/js/app.jsにコンポーネントを登録する必要がある。
app.jsを開いて見てみると、先ほどのコマンドで作成されたExampleComponentがすでに登録されている。

```javascript:app.js
Vue.component('example-component', require('./components/ExampleComponent.vue').default);
```

が、その上に

```javascript:app.js
/**
 * The following block of code may be used to automatically register your
 * Vue components. It will recursively scan this directory for the Vue
 * components and automatically register them with their "basename".
 *
 * Eg. ./components/ExampleComponent.vue -> <example-component></example-component>
 */

// const files = require.context('./', true, /\.vue$/i)
// files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default))
```

という記述があり、コメントアウトされている2行のコードを有効にすれば自動でコンポーネントが登録されるようになる。

これでもともと書かれていたExampleComponentの登録も行われるため、ExampleComponentの登録処理は念のためコメントアウトしておく。

```javascript:app.js
// コメントアウトを外す
const files = require.context('./', true, /\.vue$/i)
files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default))

// 一応コメントアウトしておく
// Vue.component('example-component', require('./components/ExampleComponent.vue').default);
```

##ExampleComponentを表示してみる
resources/views/layouts/app.blade.phpを開く。
このファイルはUI設定のコマンドで自動生成される。
ここまでの段階で既に作成されているはず。

idにappが設定されているdiv要素がある。
ExampleComponentを表示するよう書き加えてみる。

```php:app.blade.php
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    省略
</head>
<body>
    <div id="app">

        <!-- 追加 -->
        <example-component></example-component>

        <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
           省略 
        </nav>

        <main class="py-4">
            @yield('content')
        </main>
    </div>
</body>
</html>
```

この状態で http://127.0.0.1:8000 にアクセスするとExampleComponentの内容が表示されるようになる。
【Vuetify】NuxtのSSRでVuetifyのDatePickerを使用したら「The client-side rendered virtual DOM tree is not matching server-rendered content.  」というエラー発生

## 現象
<img width="312" alt="スクリーンショット 2020-05-28 3.51.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/77cc63ba-5234-40ce-9468-e846a957f163.png">
SSRでVuetifyのDatePickerを使用したら
`[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.`
というエラーが発生

## 解決策

調べてみると `tableにtbodyを入れると解決する`とのこと。
https://qiita.com/k5690033/items/d1e436fd3b92fcc1fe61

しかし今回はコンポーネントを丸ごと使用しているためこれができない。

### no-ssrを使う

DatePickerに関してはssrする必要がそもそもないので `no-ssr` で囲って解決した。
https://github.com/nuxt/nuxt.js/issues/1700

```vue

    <no-ssr>
      <v-date-picker
        v-model="picker"
        :landscape="landscape"
        :reactive="reactive"
        :full-width="fullWidth"
        :show-current="showCurrent"
        :type="month ? 'month' : 'date'"
        :multiple="multiple"
        :readonly="readonly"
        :disabled="disabled"
        :events="enableEvents ? functionEvents : null"
      ></v-date-picker>
    </no-ssr>
```
【Angular】同じコンポーネント内に同じ属性の<ng-content>は複数書けない話

# 概要
Angularの`<ng-content>`便利ですよね。親コンポーネントから子コンポーネントにhtmlを渡すのによく使います。
今回はそんな`<ng-content>`を同じコンポーネント内で複数設置したとき、適切にレンダリングされなかったお話です。
どんなコードで起こり、具体的にどんな問題なのか、そしてそれをどうやって解消したか紹介します。

# 前提
この記事はAngular 9.1.0を前提としています。今後のバージョンアップ次第で動作が変わる可能性があります。

# どんなコードを書いていたか
下記のようなコードです。

```html
<span *ngIf="flg">
  <ng-content></ng-content>
</span>
<ng-container *ngIf="!flg">
  <ng-content></ng-content>
</ng-container>
```

何かしらの変数（ここではflg）によって表示するhtmlが異なる、ということをしたかったわけです。今回の場合、flgがtrueの場合は`<span>`タグ内に親コンポーネントから渡されたhtmlを表示したい、flgがfalseの場合は親コンポーネントから渡されたhtmlをそのまま表示したいというケースです。そのため、`<ng-content>`が2箇所で必要でした。

しかしこれを実際に動かしてみるとflgがtrueの場合は親コンポーネントから渡ってきたhtmlが適切にレンダリングされますが、flgがfalseの場合はレンダリングされないという現象に陥りました。

# なぜ適切にレンダリングされないのか
下記のIssueに書いてありましたが、どうやら`<ng-content>`はコンポーネントテンプレート内で必ず1つにしなければならないように設計されているようです。
[Strange behaviour with multiple <ng-content> and *ngIf · Issue #22972 · angular/angular](https://github.com/angular/angular/issues/22972)

ここで言う必ず1つというのは **同じ属性が付与された`<ng-content>`** が必ず1つである必要があるということです。`<ng-content>`はselect属性を設定可能ですが、複数の`<ng-content>`で別々のselect属性が設定されていれば異なる`<ng-content>`と判別されます。逆にどれもselect属性が同じであったり、どれも全く設定されていない場合は同じ`<ng-content>`になるため、上記のような適切にレンダリングされないということが起こります。

# じゃあどうすればいいのか
解消策として、同じ属性の`<ng-content>`を複数書かないようにすればうまくいきます。具体的には`<ng-template>`を使って`<ng-content>`の部分を一つに括りだし、それを参照するようにすれば解消できます。
具体的なコードは以下のようになります。

```html
<ng-template #content>
  <ng-content></ng-content>
</ng-template>
<span *ngIf="flg">
  <ng-container *ngTemplateOutlet="content"></ng-container>
</span>
<ng-container *ngIf="!flg">
  <ng-container *ngTemplateOutlet="content"></ng-container>
</ng-container>
```

このようにすれば同じ属性の`<ng-content>`が複数個存在することがなくなるので、flgがtrueの場合もfalseの場合も適切にレンダリングされます。

# 最後に
ということで同じコンポーネント内の同じ属性の`<ng-content>`の複数設置回避方法を紹介しました。ただ先程の[Issue](https://github.com/angular/angular/issues/22972)を見ていると、この件についてもう少し柔軟にできるよう設計を変更するようなPRが2018/05時点ですでにいくつかあるようです。ただしIvy（Angular9でデフォルトとなったレンダリングエンジン）が利用可能になってからそれを目指していると記載があります。
2020/05現在、Ivyはデフォルトのレンダリングエンジンとなりましたし、`<ng-content>`周りの設計が変わりもう少し柔軟に使えるようになる日も近いかもしれません。

# 参考
- [Angular 日本語ドキュメンテーション - 構造ディレクティブ](https://angular.jp/guide/structural-directives)
- [Angular 日本語ドキュメンテーション - NgTemplateOutlet](https://angular.jp/api/common/NgTemplateOutlet)
- [[Angular] （Tips）テンプレート内でng-templateを使い回す - Qiita](https://qiita.com/RYM_A/items/48c9caa827a57f3246f5)
pip installでssl module in python is not availableとエラーがでた

##またダメになった(2020/5/29追記)
vscodeのsetting.jsonファイルを編集してたらpipの中からdjangoが消え、`pip install django`をしても下記のようにsslが使えないと怒られました。
調べたら、pythonのバージョンをあげるだけで治った人がいるらしい。
[pip install でSSL関連のエラーが出たらこれを読め！！！](https://qiita.com/kj455/items/9c50b5457631850b3bca)
自分もこれで直りました!!!!!!
具体的には、python3.7.3 -> 3.8.2に変更しました。

こういうのはなんでダメでなんで治ったのかよくわからないから困りますよね。

##始まり
`pip install Django`とDjangoをダウンロードしようとしたら、`ssl module in python is not available`と怒られた。

##やったこと
[pip installでSSLのエラー](https://note.com/yo16/n/na9ce9a63685a)を参考に頑張る。
自分がやったことは

```bash

export PATH="/usr/local/opt/openssl/bin:$PATH"
```
のパスを.bash_profileに書くこと。
他はなんとかなっていたのだが、最後の`pip install Django`でエラー。


エラー内容はあんまり覚えてないが、確か[「 LoadError: dlopen(〜): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib」と表示された場合の解決法](https://qiita.com/kota-es/items/98ae6ee84fc59aaae2ea)と同じエラー。
このサイトに習い、

```
brew update && brew upgrade
```
を行い更新をかける。
結果として、ターミナルで`python`と打ってもpythonが実行されなった。

[Homebrewをアップデートしたらpythonが死んだ](https://qiita.com/sh1ma/items/efa392f90bbb2a39b11b)を見つけ

```bash

export PATH=/usr/local/opt/python/libexec/bin:$PATH
```
を.bash_profileに追加する。
~~`find ~/usr/local/** -name python`~~(間違えました 2020/5/28追記)`find /usr/local/** -name python`で確認し、`/usr/local/opt/python/libexec/bin/python`の結果が返ってこなかったが、自分はターミナル上で`python`と打つとpythonが実行されるようになった。

最終的に`pip install Django`で無事Djangoがインストールできました。
【unity】ニフクラを使って無料でランキング機能を実装する方法

#この記事をみてできること
※無料で
（１）ゲームにログインを機能をつける
（２）ランキング機能をつける
例：ゲームでキャンペーンをする際に、ある一定期間の中で順位を把握したい際に
メールアドレスやIDでアカウントを紐づけることができる



#必要なもの
・PC
・Unity
・Visual Studio

#やりかた
以下の記事を順番にやっていく。


（１）クイックスタート
https://mbaas.nifcloud.com/doc/current/introduction/quickstart_unity.html
（２）ログイン機能実装
https://mbaas.nifcloud.com/doc/current/tutorial/unity_login.html
（３）ハイスコアをサーバーに保存
https://mbaas.nifcloud.com/doc/current/tutorial/unity_highscore.html
（４）ハイスコアランキングをつくる
https://mbaas.nifcloud.com/doc/current/tutorial/unity_leaderboard.html

#その他参考になった記事

（上記のURLはすべてこちらのチュートリアルの続きです。私は開発するにあたりチュートリアルをやっていなかったので、下記URLのソースを見ながら改修をおこないました。）

https://github.com/unity3d-jp-tutorials/2d-shooting-game/wiki/%E7%AC%AC12%E5%9B%9E-Wave%E3%82%925%E5%80%8B%E3%81%AB%E3%81%99%E3%82%8B%E3%80%81%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AE%E5%AE%9F%E8%A3%85
利率や税率をJavascriptで計算させる（指定小数位の切り捨て）

#利率や税率計算って、小数点以下を考慮しなきゃですよね
Javascript ですと、 Math 関数が使えます。
日本円の計算ですと

```Javascript:sample.js
Math.floor( 価格 * 税率);
```

みたく、安直にやると困ることが起こります。
要は **Javascript は割り切れない商は、求められる最後の小数位が変わる**　のです。
例えば
```8 / 3 = 2.66666666666666666666666666666666666```
ですが、Javascriptだと
```8 / 3 = 2.6666666666666665```
になるんですね。
やっかいなことに、四捨五入でもないんです。
専門的に言うと **JavaScript ECMAScript 2016 (ES7) が採用する IEEE 754-2008 の浮動小数点演算精度** というみたいです。
テストデータによっては、期待値になるので、見つけにくいバグです。

#結論
最後に切り上げられるのを防止するため、`割られる数と調整値の積`と`割る数の商A`を求め、あとで`Aと調整値の商を小数点以下切り捨て`するというやり方です。
演算で扱う数値を、整数にしてしまえば、小数演算の精度問題が起きないという性質を利用しています。
言葉で説明すると、ごちゃごちゃしますので、[正解：Javascript で指定小数位を切り捨てる](#正解javascript-で指定小数位を切り捨てる)を見てください。


#今回の要件をJavascriptで実装すると困ること
- とある投資商品には、年利が 8% つく
- 配当は毎月日本円で支払われる
- 月利は　年利 / 12 とする **（切り捨てない）**
- 毎月の配当金は　投資金 * 月利 とする

という要件です。
注意点は　月利計算を切り捨てないという点です。

これを安直に計算すると、以下のようになります

## 参考：そもそも計算間違い

```Javascript:sample.js
var payOfMonth = calcAmountOfMonth(12000000, 0.08); 
/**
 * 配当金月額を求める.
 * @param value 投資金
 * @param interestRateOfYear 年利
 * @return 配当金月額
 */
function calcAmountOfMonth(value, interestRateOfYear){
  return Math.floor( value * interestRateOfYear / 12);  //80,000 になります
}
```

これはそもそも計算間違いですね。
年利計算で、配当金年額を12で割っているので、要件を間違ってとらえています。

`A * B / C 　は　　A * ( B / C ) と同じ`

という数学的性質を利用すると、間違いのもとということです。

## 本題：Javascriptで起きる困ったこと

```Javascript:sample.js
var payOfMonth = calcAmountOfMonth(12000000, 0.08); 
/**
 * 配当金月額を求める.
 * @param value 投資金
 * @param interestRateOfYear 年利
 * @return 配当金月額
 */
function calcAmountOfMonth(value, interestRateOfYear){
  let interestRateOfMonth = interestRateOfYear / 12; //月利  0.006666666666666667になります？！
  return Math.floor( value * interestRateOfMonth);  //80,000 になります
}
```

割り切れない場合、最後の数値が切り上げられてしまっていますね。
こいつが間違いを引き起こします。
**これ、知らないとお客さんとケンカになりますよｗ**
無知は罪です。これで起きるバグはエンジニアに責任がありますね。（レビュアーも）

Math.floor はあくまで、小数点以下を切り捨てますので、月利計算では使えません。

# 正解：Javascript で指定小数位を切り捨てる
WEB探すと、頭がいい人ってホントいっぱいいるなと感心します。
次のコードでズバッと解決です。
注意点は、扱う金額のけたに合わせて、倍加変数を調整する必要があることです。

```Javascript:sample.js
const ADJUST = 100000000000; // 1000億以上は扱わないと想定してこの値

var payOfMonth = calcAmountOfMonth(12000000, 0.08); 
/**
 * 配当金月額を求める.
 * @param value 投資金
 * @param interestRateOfYear 年利
 * @return 配当金月額
 */
function calcAmountOfMonth(value, interestRateOfYear){
  let interestRateOfMonth = Math.floor(interestRateOfYear * ADJUST / 12) / ADJUST ; //月利  0.00666666になります
  return Math.floor( value * interestRateOfMonth );  //79,999 になります
}
```
ADJUSTも、value に応じて変数化できそうですね。
面倒だし、コストもかかりそうなので、定数のほうがおりこうさんな気がしていますが、扱う数値が経年変化する場合は、考慮が必要ですね。
[競プロ用]ダブリングまとめ

# いつ使うのか

* 同じ操作を繰り返したN回目の状態を求める時。  
(特に、一つの局面に複数の要素があり、互いに遷移する場合に有効)

# 何がいいのか

通常、端からするとO(N)のオーダーがかかるところをO(logN)に短縮することができる。
繰り返し二乗法もこの一種。
上記のような複数の要素X個に対してN回操作した結果全てを求める場合にO(XlogN)に抑えられるのは大きい。

# どうするのか

繰り返し二乗法と考え方は一緒。1回目の結果から2回目を、2回目の結果から4回目の結果を、、、と求めていく。
配列（複数の要素を同時に操作していく場合には二次元になる）に各操作後の状態をメモしていく(なんかdpみたい？)。

# イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/0c4580ea-75a3-7ea8-c765-10d431ae7670.png)

# 考えること

N回目がちょうど2^kで表せれば直接リストを参照できるが、端数になる場合には構築した配列を元に繰り返し参照してN回目を出す。
eg) 5回目は4回目の結果を参照したのち1回目の結果を参照して出せる。
この過程ではビット演算が有力。

```python:ビットに直した時に何ビット目が立っているか
a = []
for i in range(int(math.log2(K)) + 1):
    if K>>i & 1:
        a.append(i)
```

# テンプレート

X個の要素のN回操作後を求める表を作る。

```python
# 二次元配列作成
dv = []
for _ in range(int(math.log2(K)) + 1):
    l = [0] * X
    dv.append(l)

# dv[0][0:X]を初期化

# ダブリングで表を構築
for k in range(1, int(math.log2(K)) + 1):
    for n in range(N):
        dv[k][n] = dv[k - 1][dv[k - 1][n]]
```

# 使用例

##  繰り返し二乗法

```python:繰り返し二乗法
MOD = 10 ** 9 + 7

def mod_pow(x: int, n: int):
    bi = str(format(n, "b"))
    res = 1
    a = x
    for i in range(len(bi)):
        if n >> i & 1:
            res = (res * a) % MOD
        a = (a * a) % MOD
    return res
```

## [ABC167 D - Teleporter](https://atcoder.jp/contests/abc167/tasks/abc167_d)

今回に関しては10^18 ≒ 2^60なので、60まで見れば良い。
`log2(K) + 1`を都度計算しても可。

```python
def main():
    N, K = map(int, input().split())
    A = [int(i) for i in input().split()]

    dv = []
    for _ in range(60):
        l = [0] * N
        dv.append(l)
    
    for n in range(N):
        dv[0][n] = A[n] - 1
    
    for k in range(1, 60):
        for n in range(N):
            dv[k][n] = dv[k - 1][dv[k - 1][n]]
    
    a = []
    for i in range(60):
        if K>>i & 1:
            a.append(i)

    now = 0
    for i in a:
        now = dv[i][now]
    print(now + 1)
```

PythonだとTLEしたのでPyPyで。

## [ABC136 D - Gathering Children](https://atcoder.jp/contests/abc136/tasks/abc136_d)

10 ** 100(googol)回目を求めるのO(XlogN)でもきつい。
最終的にRLの間で行き来する状態を繰り返すだけになるので操作回数の偶奇だけを気にすればよい。
さらにSの右端以外全部Rみたいなケースだったとしても最大文字数10 ** 5回まわせば最終局面になることがわかる。

```python
# log2(10 ** 5) ≒ 16.6 → 最終的にans[17][]が求まれば良い。
LOG = 18

def main():
    S = input()
    N = len(S)
    to = []
    for _ in range(LOG):
        l = [0] * N
        to.append(l)
    
    for i in range(N):
        to[0][i] = i + 1 if S[i] == "R" else i - 1
    
    for i in range(1, LOG):
        for j in range(N):
            to[i][j] = to[i - 1][to[i - 1][j]]

    ans = [0] * N
    for j in range(N):
        ans[to[LOG - 1][j]] += 1

    L = [str(i) for i in ans]
    print(" ".join(L))
    return
```

# 参考

* https://www.akiradeveloper.com/post/algorithm-doubling/#%E3%83%80%E3%83%96%E3%83%AA%E3%83%B3%E3%82%B0
* https://ikatakos.com/pot/programming_algorithm/contest_history/atcoder/2019/0804_abc136
* https://www.hamayanhamayan.com/entry/2019/08/07/204315

# ダブリングを利用して数列の総和を求める方法 (2021/08/10追記)

別記事で記述。

https://qiita.com/Kept1994/items/fa3917f2812f1a3f5f96
croud9

JavaScriptをCroud９でブラウザで確認する方法ってないんでしょうか？
HTMLファイルでJSファイルを読み込もうとしてもこの表示が出ます。![javascript.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638503/92365d82-a4ce-6b06-5552-b3734ba2b690.jpeg)

設定が間違っているのか？足りないのか？
教えている方がいたらお願いします。
Mac OS (Catalina) にHomebrewでgnuplot5をインストール

##はじめに
Mac OS (Catalina) でgnuplotを使うためのメモ。

##環境
MacOS 10.15.4
Xcode インストール済み

##Homebrewのインストール
ターミナルで以下を実行。

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
参考：https://brew.sh/index_ja

brewでのエラーについては以下「エラーが出る場合」を参照。

##gnuplotのインストール
ターミナルで、

```
$ brew upgrade
$ brew install gnuplot
```
を実行。

```
$ which gnuplot
/usr/local/bin/gnuplot
```
となれば成功。

```
$ gnuplot
```

で起動する。


##エラーが出る場合
Catalinaではrootディレクトリが書き込み不可になり、Homebrewが死んだり、色々な問題が発生する。installかupgradeで以下のエラーが出ることがある。

```
$ brew install gnuplot
Updating Homebrew...
Error: The following directories are not writable by your user:
/usr/local/bin
/usr/local/include
/usr/local/lib
/usr/local/share
/usr/local/share/locale

You should change the ownership of these directories to your user.
  sudo chown -R $(whoami) /usr/local/bin /usr/local/include /usr/local/lib /usr/local/share /usr/local/share/locale

And make sure that your user has write permission.
  chmod u+w /usr/local/bin /usr/local/include /usr/local/lib /usr/local/share /usr/local/share/locale
```
この場合は、言われるがままに、sudo chownとchmodコマンドを実行する。
ついでに、

```
$ brew cleanup
$ brew doctor
```
すると、Xcodeが古いと言われたので、App StoreでXcodeを最新版（11.5）にアップデート。まだ```brew doctor```でWarningがいくつも出てるが、とりあえず無視する。

##出力ターミナルについて
gnuplotといえば、--with-x11や--with-aquaterm、それと--with-pdfオプションをつけてインストールするのがお決まりだが、

```
$ brew info gnuplot
```
すると分かるように、HEADオプションしか存在しないので、今回はオプション無しでインストールした。するとデフォルトの出力はqtになる。

```
gnuplot> set terminal
```

で出力ターミナル一覧をみてもaquatermやx11は存在しない。
一瞬マジかよと思うが、実はqt出力は優秀である。下図がグラフ出力ウィンドウ。左上のアイコンをクリックすると、PDF、画像（PNG）での保存やクリップボードやプリンタへの出力ができるので問題ない。また、```sin^2{/symbol q}```のように指定するとギリシャ文字や上付き文字も指定できる。```l```で対数目盛、```r```でルーラーなどのウィンドウコマンドも健在。

<img width="787" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644660/9eff3dbe-1f7b-4dd3-055d-5c849e5f50bb.png">

epsファイルについては、以下のようにpostscript出力を使って直接生成できる。

```
gnuplot> set terminal postscript color eps
gnuplot> set out "aaa.eps" 
gnuplot> replot
gnuplot> set out #これをしておかないとplotのたびにaaa.epsに出力され続ける。
```
青空文庫のCSVを Logstash で Elasticsearch に取り込んで Kibana で見る

[Elasticsearchを使って、青空文庫検索エンジンの作り方を 1 から丁寧に解説してみる](https://qiita.com/kaibadash@github/items/9cfb532696dc8711e408) では自前でスクリプトを書いて取り込んだけど Logstash で Elasticsearch に取り込んで見ました。
手っ取り早くテストデータが欲しいときの自分用のメモです。

環境構築は [5分でできるElastic stack(Elasticsearch, Logstash, Kibana)環境構築](https://qiita.com/kaibadash@github/items/52f7c205e74d98c5612a) が楽です。

# 作業用ディレクトリ

```diff
diff --git a/docker-compose.yml b/docker-compose.yml
index ccfe7ae..bf7ef6c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -40,6 +40,9 @@ services:
         source: ./logstash/pipeline
         target: /usr/share/logstash/pipeline
         read_only: true
+      - type: bind
+        source: ./logstash/work
+        target: /usr/share/logstash/work
```

# logstash設定

```logstash/pipeline/logstash_aozora_csv.conf
input {
  file {
    codec => "json"
    path => ["/usr/share/logstash/work/*.csv"]
    sincedb_path => "/usr/share/logstash/work/aozora_since"
    start_position => "beginning"
  }
}

filter {
  csv {
    skip_header => true
    separator => ","
    columns => [
      "author_id","author","book_id","title","kana_type","translator","inputer","editor","status","date","original_name",
      "publisher","input_version","edit_version"
    ]
  }
  # 雑ですが登録日が入っていたのでそれをkibanaのtimestampとして使います
  date {
    match => [ "date", "yyyy-MM-dd" ]
    target => "timestamp"
  }
}

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
      user => "elastic"
      password => "changeme"
      index => "aozora%{+YYYYMMdd}"
  }
  # 読み込まれない！などはデバッグ出力を見ると良い
  # stdout { codec => rubydebug }
}
```

# CSV

[作家別作品一覧拡充版:全て(CSV 形式、UTF-8、zip 圧縮)](https://www.aozora.gr.jp/index_pages/person_all.html) を取得して `logstash/work` に置く。

# Kibana

http://localhost:5601

- id: elastic
- password: changeme

changemeとある通り、このまま本番運用とか絶対ダメですよ。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/42d2325c-3d65-9ac4-a402-f659b98b7916.png)

設定からindex patternを登録しまして。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/dc67c1b2-fcc5-2236-78ce-ed90ba47ff97.png)

timestampを設定。
@付きの方は登録した日付が入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/3f0b27b2-fd0a-6d70-d913-f682d0106633.png)

日付の範囲を 10 yeas ago とかにするとデータを確認できます。
Docker Desktopインストール後WSL2でもつまずいたのでメモ

以前、[Dockerのインストールでつまずいたのでメモ](https://qiita.com/On-You/items/db897f2f30cdab3c4c91)
という記事を投稿したが、その後も実際にDockerを使えるまでにいろいろとつまずいたので自分用の備忘録。

ではいこう！

【環境】
Windows HOME(64bit)

#【流れ】
基本的には公式の手順に従ってやった。
[WindowsホームにDockerデスクトップをインストールする](https://docs.docker.com/docker-for-windows/install-windows-home/)

Windows HOMEはWSL2を使ってDockerを扱う。
なんでWSL2の設定やらなんやらしないといけないわけで、こっちも公式（MicroSoft）の手順に従ってやった
[Windows 10 用 WSL のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

手順をもらうと分かるが、MicroSoft Storeからお好きなLinux ディストリビューションをインストールすることになっている。
自分はUbuntuをインストールしたが、そのあとが問題だった。

#つまずいたトコ
###その１．0x80370102 エラー
初めての起動だとコンソール ウィンドウが開き、もろもろ自動で設定されたのちに、ログインユーザとパスワードを設定しろといわれるはずなのだが、
Setting...
という画面で数秒固まったあと出てきたのは
0x80370102 
というエラー。

####原因
コンピューターの BIOS 内部で仮想化が有効になっていなかった。
[Windows 10 用 WSL のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)にもこのエラーについては書いてあったけど~~普通に読み飛ばしてた。~~
###対処方法
BIOSを起動して仮想化を有効にする。
BIOSの起動方法はメーカーによって若干異なる。
自分のはLenovo製だったのでこっちも公式に則ってやった。
[BIOSの入り方](https://support.lenovo.com/jp/ja/troubleshoot/LPT000232?firstpdt=LPT000210)(でもこの手順、他メーカーでもいけそう。。。)

BIOSに入ったら
「UEFI firmware settings」選んで
↓
configurationのIntel Virtual Technologyをenableへ

有効になったかの確認はパフォーマンスマネージャーから
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258776/ef48be48-fbd4-01b4-42cf-f4d39f65ac6b.png)

###その２．0xC03A001A エラー
その１のエラーが解決して、「よろしくおねがいしまーーす！！」とばかりに意気揚々とEnterを押してUbuntoを起動させた。（気分はサマーウォーズのラストシーン）

しかし
Setting...
という画面で数秒固まったあと出てきたのは
0xC03A001A
というエラー。
（サマーウォーズだったら死んでた）

####原因
WSLのフォルダが圧縮対象になっていた
####対処方法
これに関してはQiitaで別に記事を上げているお方がいるのでそっち参照。
[WSL2 にしたいのにエラーが出る問題](https://qiita.com/saida/items/ab6c5a980a1f5383c23a)

###その３．0x80370109エラー
その２のエラーが解決して、再度、「よろしくおねがいしまーーす！！」とばかりに意気揚々とEnterを押してUbuntoを起動させた。（気分はサマーウォーズのラストシーン）

しかし、またもや
Setting...
という画面で数秒固まったあと出てきたのは
0x80370109
というエラー。
（サマーウォーズだったらまた死んでた）
####対処方法
再起動したら治った。~~（原因はようわからん）~~

###エンドロール
こうしてようやくUbuntoも正常に立ち上がり、Dockerの起動までもっていくことができた。
無事、「よろしくおねがいしまーーす！！」とばかりに意気揚々とEnterを押してもUbuntoが起動するようになった（サマーウォーズだったら彼女できてた。。。）
個人的によく使う便利なLinuxコマンドをまとめる (随時更新)

# はじめに
Linuxコマンドはせっかく覚えてもしばらく使わなかったりするとどんどん忘れていくので，便利だったものを随時メモとして残しておこうと思います．

### 二つのディレクトリを再帰的に検索し，存在するファイルのdiffをとる．
-rはrecursively, -qは詳細な中身は表示せずに表面的な情報だけを表示．
diffはデフォルトでは再帰検索しないので注意．

```
$ diff -rq directory-1/ directory-2/
```

### プログラム実行時間を測定
```
$ time python sample.py
```
### pcのホスト名を確認
デフォルトでだいたいpromptに表示されるが，ホスト名は以下のコマンドで確認できる．
Windowsの設定から，名前を変更することもできる．
```
$ hostname
```
Macのターミナル表示をいじってモノクロな人生に色をつけよう

Macで開発しているとターミナルはよく利用しますよね？
デフォルトで表示されている文字列はなんか長いし見づらい！
そんな方は**.bashrcを編集**して**好きな表示**にしてしまいましょう！
（編集後はsource .bashrcを忘れずに！）

<img width="３００" alt="スクリーンショット 2020-05-28 1.59.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93737/c38f630f-bf1d-d2e8-c530-d396399dc04c.png">

こちらのページ（ https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60 ）を参考にさせていただきました！
このページではわたしが利用したものをご紹介します。


##書式

```:sample
export PS1='Hello Prompt! \# \t \w \$ '
```

| 記号 | 意味 | 例 |
|:--|:--|:--|
| \h | ホスト名 | ka2ya's Macbook　 |
| \u | ユーザ名 | ka2ya |
| \w | ディレクトリ（フルパス） | ~/Documents/GitHub |
| \W | ディレクトリ | GitHub |
| \t | 時間 (24形式) | 23:29:38 |
| \T | 時間 (12形式) | 11:29:38 |
| \@ | AM / PM | PM |
| \d | 日付 | Wed Jun 20 |
| \D | 日時 | 18/06/20 23:29:38 |
| \# | コマンドの番号 (1, 2, 3...) | 1 |
| \n | 改行 |  |
| \$ | 一般ユーザーの時 $、rootの時 # を表示 | $ |


## エスケープシーケンスで囲んで色の指定も可能
 
```
export PS1='装飾なし \[\e[32m\] ここは緑色 \[\e[0m\] 装飾なし \$ '
```
| 値 | 文字色 | 値 | 背景色 |
|:--|:--|:--|:--|
| 30m | 黒 | 40m | 背景黒 |
| 31m | 赤 | 41m | 背景赤 |
| 32m | 緑 | 42m | 背景緑 |
| 33m | 黄 | 43m | 背景黄 |
| 34m | 青 | 44m | 背景青 |
| 35m | 紫 | 45m | 背景紫 |
| 36m | 水 | 46m | 背景水 |
| 37m | 灰 | 47m | 背景灰 |


## 設定例（私のやつ）

```:.bashrc
# 出力の後に改行を入れる
function add_line {
  if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}
PROMPT_COMMAND='add_line'

source ~/.git-prompt.sh

export PS1='\t \[\e[36m\]\u\[\e[0m\] \[\e[33m\] \W\[\e[0m\]\[\e[1;32m $(__git_ps1 "(%s)") \[\e[0m\] \n\$'
```
※ Gitフォルダだった場合にいい感じにする為に
~/.git-prompt.shを作成して以下のソースを入れとく  
https://github.com/git/git/edit/master/contrib/completion/git-prompt.sh

<img width="４００" alt="スクリーンショット 2020-05-28 1.59.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93737/c38f630f-bf1d-d2e8-c530-d396399dc04c.png">


##まとめ
「カラーがあれば、まいにちたのしい。」 by.GAMEBOY COLOR
github static page作成

makes branch : gh-pages
user名.github.io/repository名でつながる




私は最初にrepository 設定はprivateにしたので、404エラーが出た
https://myksb1223.github.io/develop_diary/2019/03/09/GitHub-pages-404-not-found.html
のように、ソースをrebuildした後にpushしたら直るらしい。

私はまだできないけど。。。

上の場合はvscのterminalでpushしたことで、
github desktopではまだpushができる状況だった。(うまく行かなかったぽい)
それで再びpushしたら正常に入るようになった
[Python]イテラブル、イテレーター、ジェネレーターをざっくり理解する

イテラブル（Iterable）、イテレーター（Iterator）、ジェネレーター（Generator）について使いこなしたいが、正直なんとなくしか分からないのでイメージしやすいように簡単にまとめました。


###イテラブル（Iterable）
繰り返しに使えるオブジェクト。list, dict, set, strクラスのオブジェクトはイテラブル。
簡単に言うと***for構文で使えるもの***

###イテレーター（Iterator）
イテレーターは、イテラブルの一種（イテラブルは、イテレーターとは限らない）
簡単に言うと***リストみたいなもの***
next()で現在の要素を返し、次の要素に進めます
簡単に言うと***リストみたいなものから空になるまで取り出していく***

###ジェネレーター（Generator）
関数中に[yield 返り値]があると、その関数をジェネレーター関数と呼ぶ。また、リストの内包表記を角括弧から丸括弧に変えたものをジェネレーター式と呼ぶ。
例***(i for i in range(N))***
その関数や式の返り値をジェネレーターイテレーターと呼ぶ。
簡単に言うと***イテレーターを返すもの***です。

イメージ図
<img width="594" alt="スクリーンショット 2020-05-28 14.47.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631457/657a3e41-8f7b-7273-5445-2f30b39aa2ec.png">




```python:ジェネレーターの特徴
def sample():
    cumsum = 0
    for i in range(1, 5):
        cumsum += i
        print(f'最初にこっち→{cumsum}')
        yield cumsum

for cumsum in generator_sample2(): #ポイント
    print(f'yieldの分→{cumsum}')
```
***<出力結果>***
最初にこっち→1
yieldの分→1
最初にこっち→3
yieldの分→3
最初にこっち→6
yieldの分→6
最初にこっち→10
yieldの分→10

```python:イテレーターの特徴1
sample_list = [i for i in range(1, 6)]
print(f'リストの中身 {sample_list}')

sample_iter = iter(sample_list) #iter()でイテレーターにする

for i in sample_iter:
    print(i)
    
print(f'リストの中身は変わらない {sample_list}')
print(f'イテレーターは使うと空になる {list(sample_iter)}')
```
***<出力結果>***
リストの中身 [1, 2, 3, 4, 5]
1
2
3
4
5
リストの中身は変わらない [1, 2, 3, 4, 5]
イテレーターは使うと空になる []


```python:イテレーターの特徴2
sample_list = [i for i in range(1, 6)]
print(f'リストの中身 {sample_list}')

sample_iter = iter(sample_list) #iter()でイテレーターにする
print(f'リストみたいなもの {sample_iter}') #ここで使ってる
print(f'リストとして見れる {list(sample_iter)}')

print(f'イテレーターは使うと空になる {list(sample_iter)}')
```
***<出力結果>***
リストの中身 [1, 2, 3, 4, 5]
リストみたいなもの <list_iterator object at 0x7fbf11e34b80>
リストとして見れる [1, 2, 3, 4, 5]
イテレーターは使うと空になる []


***<参考>***
[イテラブルについて](https://python.ms/iterable/#_1-%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AB%E8%A8%80%E3%81%88%E3%81%B0)
[イテレーターについて](https://python.ms/iterator/#_1-%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82)
[ジェネレーターについて](https://python.ms/generator/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)

*まとめてるうちに何となく理解できました。
まだまだざっくりのうちなので、もう少し理解できたらまとめます*

---
**追記**

@shiracamusさんご指摘ありがとうございます。
SAP CP MultiTargetApplicationの作成方法　その②（UI5）

前回作成したプロジェクトにUI5applicationを追加していきます。
作成したプロジェクトを右クリック→New→HTML5Moduleを選択
![スクリーンショット 2020-05-27 11.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/78957623-9a76-1b16-9776-cf022f1f2dc4.png)

SAPUI5 Applicationを選択しNext
![スクリーンショット 2020-05-27 11.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/5a56fe44-220f-f3dc-e730-a7f20eed681e.png)

Module NameとNamespaceを任意で入力（今回はUIとnamespace)しNext
![スクリーンショット 2020-05-27 12.00.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/29e88a6f-36ab-a9cb-be41-756d8bcf511c.png)

ViewTypeはXMLを選択（HTMLやjavascriptでも可能）しFinish
![スクリーンショット 2020-05-27 12.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/b6b3b785-ca54-9a70-892d-33d1ad2de78f.png)

プロジェクトにUIが追加されていることが確認できる
![スクリーンショット 2020-05-27 12.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/63062bf6-50c1-03b8-b68e-206204ac858e.png)

mta.yamlにも追加されていることが確認できる
![スクリーンショット 2020-05-27 14.02.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/eaa1defb-f43d-4ad7-8053-9c8e22a564cd.png)

Run設定
UI右クリック→Run→RunConfigration
![スクリーンショット 2020-05-27 14.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/4ae3f556-2a96-11ba-9c44-02ba8332c29e.png)

Run As WebApplicationを選択
index.html Run on Neoを選択しSave and Run
![スクリーンショット 2020-05-27 14.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/df9fde22-e178-c56c-75b5-0f21139e1b65.png)

実行されることを確認
![スクリーンショット 2020-05-27 14.07.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/a94607e8-ce95-0c9b-466e-512d065885b9.png)

別の方法があれば教えてください。
SAP CP MultiTargetApplicationのビルド、デプロイ

MultiTargetApplicationのビルド、デプロイ方法について
デプロイをしたいプロジェクトを右クリック→Build→Build with Cloud MTA Build Toolを選択
![スクリーンショット 2020-05-27 14.11.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/d70e3ad1-026c-11fb-8103-7bdea2b2cf83.png)

console.logにcompletedが出力されていることを確認
![スクリーンショット 2020-05-27 14.12.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/da333cd4-2b61-5b81-e8cd-fd64caa68c37.png)

完了するとmta_archivesフォルダにmtarファイルができていることを確認
※mtarファイルはmta.yamlの記述を元に作成されている。
![スクリーンショット 2020-05-27 14.13.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/aa62bf0c-c8e1-e773-e35a-9caad4ccf424.png)


作成されたmtarファイルを右クリック→Deploy→Deploy to SAP CloudPlatFormを選択
![スクリーンショット 2020-05-27 14.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/82ed01ce-4c99-06a4-caa0-3bc1db6de0c9.png)

任意の環境とスペースを選択し、デプロイを行う
※API EndPointについてはWebIDEのWorkSpacePreferenceの設定を参考にしている。
![スクリーンショット 2020-05-27 14.16.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/dec94eea-8493-5a0e-6194-df42741294da.png)
MQL5-単純な計算の方法 5

#はじめに
この記事は以下リンクのYoutubeビデオを翻訳したものになります。よければそちらもご覧ください。

https://www.youtube.com/watch?v=-ELtMn-MJu4&list=PLV8YK-9p3TcOmgAFIjntw-GxOJoHp9xwc&index=6

前回記事 は以下です。

https://qiita.com/James_KW/items/6c061a520aec1987fbbd

#計算
MQL5でEAを作ったり、インジケータを作ったりするのに、必ず必要になるのか計算である。今回はコードを書いて四則演算させてみる。

いつものように、Ontick関数を残してすべて消す、そこから丹羽淳にint型で変数を二つ宣言してCommand関数を使って表示させる。

ちなみにintはInteger型で正数を表すデータ型である。

```cpp
void OnTick()
  {
  int a = 5:
  int b = 3;

  Comment("The result:", a + b);
  }
```

さいごのComment関数内でa+bを計算して出力している。使える演算子は以下の通りだ

```cpp
a+b //足し算
a-b //引き算
a*b //掛け算
a/b //割り算
```

もしもっと複雑な計算をしたければ、リファレンスを除くといろいろ見ることができる。
https://www.mql5.com/ja/docs/math
YAMAHA RTXでプチハマりした話

RTX810でBGPの設定中にプチハマりしました。

# BGP disbaleが直らない

RTXでは、BGPの設定変更した際に以下のコマンドを入力して設定を適用する必要があります。
※残念ながらソフトリフレッシュは無いのでぶった切られます。

~~~shell
bgp configure refresh
~~~

BGPピアに疎通性がある状態で上記コマンドを何回入れてもbgp disabledの状態であり、RTXでBGPプロセスが動いていないようでした。
もちろん`bgp use on`コマンドは入ってます。

~~~shell
show status bgp neighbor
> BGP disabled
~~~

結局原因は、以下プレフィックスフィルタが重複しているという凡ミスでした。。
変な所で厳しいですね。。

~~~shell
bgp import filter 10 equal 192.168.0.0/24
bgp import filter 11 equal 192.168.1.0/24
bgp import filter 12 equal 192.168.2.0/24 #重複
bgp import filter 13 equal 192.168.2.0/24 #重複
bgp import 65000 static filter 10 11 12 13
~~~

重複している片方だけ削除してうまくいきましたとさ。
JavaScript リンク集

ゴミの大量生産とか、怒られるかも…。
分類がおかしいかも。

# 有名なライブラリー

- [jQuery](https://jquery.com/)


# 脱 jQuery

- [You (Might) Don't Need jQuery](https://github.com/nefe/You-Dont-Need-jQuery)
- [You Don't Need jQuery - Qiita](https://qiita.com/tatesuke/items/b9548dd484b01b139b74)
- [2019年になってもまだjQueryを使用している理由 | コリス](https://coliss.com/articles/build-websites/operation/javascript/still-using-jquery-in-2019.html)
- [jQuery不要論について考える](https://www.deep-rain.com/programming/javascript/658)
- [そろそろなぜjQueryを使うのが難しいのかをちゃんとまとめようと思う。｜榊原昌彦｜note](https://note.com/rdlabo/n/ndfe07e0c0bcb)
- [jQueryとは何なのか？　なぜ使わなくても（あるいは使わないほうが）いいのか？ - Qiita](https://qiita.com/ygkn/items/eed01ae9c01339d6086a)
- [脱jQueryのためにしたこと - ICS MEDIA](https://ics.media/entry/17451/)
- [脱jQueryに向けた第一歩 | フロントエンドBlog | ミツエーリンクス](https://www.mitsue.co.jp/knowledge/blog/frontend/201912/02_0000.html)
- [脱jQueryしたい時に参考になるドキュメントやエントリーまとめ | NxWorld](https://www.nxworld.net/tips/javascript-without-jquery-of-reference-documents-and-entry.html)

# 仮想DOMフレームワーク

- [Angular](https://angular.io/)
- [React – ユーザインターフェース構築のための JavaScript ライブラリ](https://ja.reactjs.org/)
- [Introduction - Mithril.js](https://mithril.js.org/)
- [Vue.js](https://jp.vuejs.org/index.html)

# Canvas

- [canvg/canvg: Javascript SVG parser and renderer on Canvas](https://github.com/canvg/canvg)
- [html2canvas - Screenshots with JavaScript](http://html2canvas.hertzen.com/)

# グラフ（チャート）
- [Chart.js | Open source HTML5 Charts for your website](https://www.chartjs.org/)]

# 表

- [DataTables | Table plug-in for jQuery](https://datatables.net/)
- [Handsontable is a JavaScript data grid that looks and feels like a spreadsheet | Available for React, Angular and Vue](https://handsontable.com/)

# WebGL

- [PixiJS](https://www.pixijs.com/)

# サーバーサイド

- [Node.js](https://nodejs.org/en/)
- [Nuxt.js - ユニバーサル Vue.js アプリケーション](https://ja.nuxtjs.org/)

# デスクトップアプリケーション

- [Electron | Build cross-platform desktop apps with JavaScript, HTML, and CSS.](https://www.electronjs.org/)
  - [Electron 周りの個人的ブックマーク等整理 - Qiita](https://qiita.com/yasumichi/items/2b035753129b80711efc)
- [NW.js](https://nwjs.io/)
並列・並行処理（簡単な実現方法を調べる）

こんにちは。
並列・並行処理の簡単な実現方法を調べてみました。他にもあれば調べたいです。

### Unix

```shell
$ seq 10 | xargs -n 1 -P 8 exec_something
```

### Go

```go
maxProc := 8
limiter := make(chan struct{}, maxProc)
items := []int{1,2,3,4,5,6,7,8,9,10}
var wg sync.WaitGroup
for _, item := range items {
    wg.Add(1)
    go func(i int) {
    	limiter <- struct{}{}
        defer wg.Done()
        exec_something(i)
        <-limiter
    }(item)
}
wg.Wait()
```
VMware+Ubuntu20.04初期設定覚書

VMwareにUbuntu20.04を載せてフォルダ共有した時に詰まったので覚書

・ホストOS：Winsdows10Home
・ゲストOS：Ubuntu20.04LTS
・仮想環境：VMware Workstation 15

##やったこと
1.　VMware側で共有フォルダの設定
2.　UbuntuのVMware Toolsの再インストール
3.　ディレクトリのマウント設定
4.　アクセス権限の変更

##1.　VMware側で共有フォルダの設定
VMwareの[仮想マシン設定]>[オプション]>[共有フォルダ]から共有するフォルダを選択する。この時、「常に共有」チェックボックスにチェックを入れる。

##2.　UbuntuのVMware Toolsの再インストール
VMware上にOSを入れるとたぶんVMwareToolsというのが一緒にインストールされるはず。これを再インストールする。（入ってない場合は新規インストールかな？）

手順：
Ubuntuが立ち上がるときにVMwareの[Player]>[管理]>[VMwareToolsの再インストール]を選択

Ubuntuにログインすると、タスクバーのところにCDアイコンが出るはず。その中のインストーラーを解凍、Toolsなんちゃら.plを実行。
この時、なんか色んな確認事項が出るが、Enterキー連打。ただし、ファイルを上書きしますか？（～OverWrite～）と表記が出たときはYesで回答。

インストールが終わったら、Ubuntuを再起動

```
/mnt/hgfs/共有フォルダ
```
となっているはず

##3.　ディレクトリのマウント設定

```
~$ sudo /sbin/mount.vmhgfs -h
~$ sudo nano /etc/fstab
```
fstabに次を追記する
`.host:/ /mnt/hgfs vmhgfs defaults 0 0`

[詳細はVMwareのサイトを参照されたい](https://docs.vmware.com/jp/VMware-Workstation-Pro/12.0/com.vmware.ws.using.doc/GUID-AB5C80FE-9B8A-4899-8186-3DB8201B1758.html)

##4.　アクセス権限の変更
```
~$ sudo chown ユーザー名:ユーザー名 /mnt/hgfs/共有フォルダ
```

###終わりに
デキる人なら、お望みのところにマウントして使いやすいようにあれこれするのだろうけど、まぁいいやの精神

ホストOSから直接データ引っ張れるのでこれで良しとする

##参考にさせていただいたサイト
[VMware](https://docs.vmware.com/jp/VMware-Workstation-Player-for-Linux/15.0/com.vmware.player.linux.using.doc/GUID-0C23FCBF-F0CC-447B-A08E-35B90C52091E.html)
[VMWare Player で共有フォルダを設定する方法](http://blog.livedoor.jp/xvi_wisteria/archives/1069918358.html)
[VMware playerを用いて共有フォルダ設定方法（Windows7⇔Ubuntu16.04）](https://qiita.com/Plutus0827/items/9efdbe46bb2e166b3293)
Terraform実行環境の構築

# はじめに

現在Cloudformationを学習しているのですが、ついでにTerraformも学習したいと思います。
AWSで試しますのでAWSアカウント作成とIAMユーザの設定をしておいてください。

# Terraform実行環境の作成

## Terraformのインストール

Terraformをインストールする方法は３つあります、

* 直接PCにインストール
* tfenvでインストール
* 公式dockerイメージを使う

切替が楽そうなtfenvでTerraformをインストールします。
実行環境はMacです。

~~~shell
% brew install tfenv

% tfenv --version
tfenv 2.0.0
~~~

インストール可能な一覧を確認します。

~~~shell
% tfenv list-remote
0.12.25
0.12.24
#~~~省略~~~
0.1.1
0.1.0
~~~~

最新の`0.12.25`をインストールします。

~~~shell
% tfenv install 0.12.25
#~~~省略~~~
Installation of terraform v0.12.25 successful. To make this your default version, run 'tfenv use 0.12.25'
~~~

指示通り`tfenv use 0.12.25`を行います。

~~~shell
% tfenv use 0.12.25
Switching default version to v0.12.25
Switching completed
~~~

terraformコマンドが使えるか確認します。

~~~shell
% terraform --version
Terraform v0.12.25
~~~

インストールできました！

## AWSのキーをリポジトリに含めないようにする

`git secrets`コマンドをインストールして、AWSのクレデンシャル情報をリポジトリに含まないようにします。詳細はこちらの記事が参考になります。
[git-secretsはじめました
](https://qiita.com/jqtype/items/9196e047eddb53d07a91)

~~~shell
% brew install git-secrets
~~~

以下は端末全体でAWSのクレデンシャル保護を有効化しています。

~~~shell
% git secrets --register-aws --global
% git secrets --install ~/.git-templates/git-secrets
% git config --global init.templatedir '~/.git-templates/git-secrets'
~~~

試しにcommitしたらちゃんとエラ〜が出ました。

~~~shell
% mkdir workspace/aws/terraform && cd workspace/aws/terraform
% git init
% echo "aws_secret_access_key = ABcDe1F2hIjkl3nop45sTUv6XYz7aBcDEFghIJKL" > secret.txt
% git add .
% git commit -m "git secrets-test"
secret.txt:1:aws_secret_access_key = ABcDe1F2hIjkl3nop45sTUv6XYz7aBcDEFghIJKL
[ERROR] Matched one or more prohibited patterns
~~~

実行環境ができたので次回からリソースの作成していきます。
【Kotlin】find, firstOrNull, singleOrNullの違いは？調べてみました！

Android開発でKotlinを書いている中で「`find` `firstOrNull` `singleOrNull`って同じじゃね？」と思ったので調べました。

## TL;DR

- `find`と`firstOrNull`は同じ挙動なので好きな方を使えばOK
- `singleOrNull`は該当する要素が１つのみであることを確認したい場合に使うのが良さそう

## 動かしてみる

サンプル：https://pl.kotl.in/0WB5a4Efr

### find

```kotlin
fun find() {
    val numbers = listOf(0, 1, 2, 3, 4, 4)
    val four = numbers.find { it == 4 }
    println(four)
    val five = numbers.find { it == 5 }
    println(five)
}
```

結果

```
4
null
```

### firstOrNull

```kotlin
fun firstOrNull() {
    val numbers = listOf(0, 1, 2, 3, 4, 4)
    val four = numbers.firstOrNull { it == 4 }
    println(four)
    val five = numbers.firstOrNull { it == 5 }
    println(five)
}
```

結果

```
4
null
```

### singleOrNull

```kotlin
fun singleOrNull() {
    val numbers = listOf(0, 1, 2, 3, 4, 4)
    val four = numbers.singleOrNull { it == 4 }
    println(four)
    val five = numbers.singleOrNull { it == 5 }
    println(five)
}
```

結果

```
null
null
```

## 実装

### find

```kotlin
@kotlin.internal.InlineOnly
public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T? {
    return firstOrNull(predicate)
}
```

`find`は`firstOrNull`のエイリアスだった

### firstOrNull

```kotlin
public inline fun <T> Iterable<T>.firstOrNull(predicate: (T) -> Boolean): T? {
    for (element in this) if (predicate(element)) return element
    return null
}
```

要素を見つけたら返すだけ

### singleOrNull

```kotlin
public inline fun <T> Iterable<T>.singleOrNull(predicate: (T) -> Boolean): T? {
    var single: T? = null
    var found = false
    for (element in this) {
        if (predicate(element)) {
            if (found) return null
            single = element
            found = true
        }
    }
    if (!found) return null
    return single
}
```

該当する要素が2つ以上ある場合`null`を返す


## いかがでしたか？

`find`は`firstOrNull`のエイリアスだったんですね〜
この3つのメソッドのうち、`singleOrNull`は若干挙動が違うもののそこまで違いを意識して使わなくて良さそうでした。
このテーマについては[Stack Overflow](https://stackoverflow.com/questions/45520267/what-is-the-difference-between-find-and-firstornull)や[Kotlinコミュニティ](https://youtrack.jetbrains.com/issue/KT-5185)でも議論されているようなので興味のある方は見てみるといいかもしれません。
個人でRedmine環境用意する

# Redmine構築手順
個人のタスク管理にもRedmine使ってみたくなった。
最初はローカルのMacで起動させてたけどちゃんとサーバ用意して動かしたくなったのでやってみた。

## 0. サーバの用意
dockerコンテナを動かすサーバを用意する。

- 自由にできるサーバを手に入れる
 - [さくらVPSサーバ](https://vps.sakura.ad.jp/)を申し込んだ
 - とりあえず有名なところかつお財布にダメージが少なめな月額800円のやつ
 - 2週間お試しなのでひよこエンジニアにはちょうど良さそうだった
- OSインストール
 - デフォルトがCentosなのでそのままでいい場合は不要
 - 今回はCentos7を使った

## 1. dockerのインストール
今回、Redmineはdockerイメージで配布されているものを使用するのでサーバにdockerをインストールする。
（bitnami Redmineでも良かったかも）

- sshでサーバにログイン
 - 今回はパスワード認証で進める（公開鍵認証の設定は割愛）
 - rootでやってるんかいというのも一旦置いておく

``` shell
# ログイン
 ssh root@[各自のドメイン].vs.sakura.ne.jp
```

- yumの更新とリポジトリの設定（念為）

``` shell
# 更新
yum update
yum upgrade
# yumリポジトリの設定
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

- dockerのインストールと設定

``` shell
yum install -y docker-ce docker-ce-cli containerd.io
```

- dockerの起動と自動起動の設定

``` shell
# 起動
systemctl start docker
# サーバ起動時に自動で起動する設定
systemctl enable docker
```

## 2. Redmineの導入
[公式のdockerイメージ](https://hub.docker.com/_/redmine)を使ってRedmineを構築する。


- dockerイメージの入手と起動
 - 引き続きsshでログインした状態で作業

``` shell
# イメージの入手
docker pull redmine
# コンテナの起動（バックグラウンドで実行）
docker run -p 3000:3000 --name redmine redmine &
# 確認
docker ps
curl http://localhost:3000/
```

## 3. プラグインの適用
かんばんを使いたかったのでAgilePluginをRedmineに導入する。
不要な場合はここはスキップして問題ない。

- プラグインをローカルで入手、解凍する
 - [公式](https://www.redmineup.com/pages/ja/plugins/agile)からダウンロード
- ローカル → サーバにプラグインを転送
 - 転送用のディレクトリをサーバに用意

``` shell
# （サーバにログインした状態で）任意のディレクトリで作成
mkdir tmp
cd tmp
# 確認
pwd
```

- プラグインの転送
 - サーバではなくローカルのシェルで実行

``` shell
scp -r [ダウンロードしたプラグインのパス] root@[各自のドメイン].vs.sakura.ne.jp:[作成したtmpディレクトリのパス]
```

- サーバに転送したプラグインをコンテナに持っていく
 - 最終的にプラグインを持っていくコンテナ上のディレクトリを確認する

``` shell
# （サーバにログインした状態で）コンテナに入る
docker exec -i -t redmine bash
# プラグインを入れるディレクトを確認する
cd plugins/
pwd
# コンテナから出る
exit
```

- Redmineを動かしているコンテナにプラグインを持ち込む

``` shell
# 作成したtmpディレクトリの1つ上のディレクトリで実行
docker cp ./tmp/. redmine:[コンテナ上のプラグインを入れるディレクトリのパス/]
```

- プラグインをコンテナ上にインストールする（インストール後再起動）

``` shell
# コンテナに入る
docker exec -i -t redmine bash
# プラグインのインストール
bundle install
bundle exec rake redmine:plugins NAME=redmine_agile RAILS_ENV=production
# コンテナから出てコンテナ再起動
exit
docker restart redmine
```

- ブラウザから以下にアクセスしてRedmineのトップページが表示されればOK
 - http://[各自のドメイン].vs.sakura.ne.jp:3000/
 - お試し期間終わったらhttpsにします
  
- admin/adminでログイン後、Agileプラグインが有効になっていることを確認して終わり
<img width="301" alt="スクリーンショット 2020-05-27 23.39.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137875/7363c2cd-66ff-e594-a9e1-1936e8a545d5.png">



## おわり
割とあっさり用意できたので満足。
いくつか課題も残ってるのでその辺りは使いながらおいおい対応。
1ヶ月でG検定に合格したい Day 1

2020年7月4日試験日のG検定に先ほど申し込みました。
まだなにも勉強していないのですが、頑張ろうと思います。
まずは合格体験記や、合格までのロードマップ的なのをきっと誰かが書いてくれていると思うので、そういうのを読みあさってみようと思います。

どういう知識が問われるんだろうか。難しかったらどうしよう。。。
MQL5-データ型 4

#はじめに
この記事は以下リンクのYoutubeビデオを翻訳したものになります。よければそちらもご覧ください。

https://www.youtube.com/watch?v=_bNsvoLjz60&list=PLV8YK-9p3TcOmgAFIjntw-GxOJoHp9xwc&index=6&t=8s

前回記事 は以下です。

https://qiita.com/James_KW/items/9e50e7aba7bc2104ba78

#データ型
ほかのプログラミング言語を触ったことがある人ならばすでに知っていることであろうが、MQL5を触るにはいくつか知っておかなくてはならないデータ型がある。
例えば、前々回に作ったコードでLocalTime()をつかってチャートの端っこに現在時刻を表示させたりしたが、ここにつかわれているのも特殊で知っておくべきデータ型である。

#とりあえず触ってみる
今回の内容を理解するために、新しくEAを用意しよう。用意の仕方は第1回に伝えたとおりである。
[ファイル]>[新規作成]>[次へ]>[完了]とおして、
あとはOnTick()を残して、そのほかをすべて消そう。

###String型
これは文字を使うためのものである。画面に特定のメッセージを表示したりするのに便利である。しかし、ここに数字を入れたとしても一切の計算はできない。

```cpp
void OnTick()
  {
  
   string Text = "The value is:";
  }
```
これはText という変数名ものもにstring型で文字を代入した様子。

###double型
計算することができるデータ型の一つとしてdouble型がある。これは浮動小数点を示すデータ型である。上の例に続いて書くと、

```cpp
void OnTick()
  {
  
   string Text = "The value is:";
   double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
  }
```
これはdouble型でbalanceに口座残高の値を代入している。

###DataTime型
このデータ型は主に日付や時刻を格納するのにつかわれる。前述したTimeLocal()の出力に使われている。

また上記コードの続きから核と

```cpp
void OnTick()
  {
  
   string Text = "The value is:";
   double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
   Comment (Text, Balance,TimeLocal());
  }
```

最後のComment関数で今まで出たものをすべて並べて出力している。
これをコンパイルして、実データバックテスト（緑の再生ボタン）を実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96388/6d197537-ceb8-afd5-ad58-9d55eb34d653.png)

うまく表示されただろうか？
AtCoder abc168_a

# A - ∴ (Therefore)
- https://atcoder.jp/contests/abc168/tasks/abc168_a
 
```
read N
case ${N: -1} in
  2|4|5|7|9 ) echo "hon" ;;
  0|1|6|8 ) echo "pon" ;;
  3 ) echo "bon" ;;
esac
```