OmniAICreator/Qiita-1.07M huggingface dataset:
Teradataの統計情報

# 特徴
Teradataの統計情報取得（初回）は表単位で取得することは出来ず、列単位で取得する必要があります。
再取得は表単位で指定可能です。その場合は、取得済の列に対して統計情報が再取得されます。

# 統計情報関連コマンド
| 実行内容    | コマンド     |
|:-----------|:------------|
| 統計情報取得（初回）       | COLLECT STATISTICS ON [表名] COLUMN [列名]; | 
| 統計情報取得（初回）複数列  | COLLECT STATISTICS ON [表名] COLUMN ([列名], [列名], …); | 
| 統計情報再取得       | COLLECT STATISTICS ON [表名];      |
| 統計情報確認       | HELP STATISTICS [表名];        |
| 統計情報確認       | SELECT * FROM dbc.TableStatsV WHERE TableName = '[表名]';        |

# 実行例

### 統計情報確認
```
HELP STATISTICS t1;

 *** Help information returned. 6 rows.
 *** Total elapsed time was 1 second.

Date     Time     Unique Values        Column Names
-------- -------- -------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------
20/08/29 12:14:06            4,194,309 *
20/08/29 12:11:34            4,194,309 c1
20/08/29 12:11:56                    1 c2
20/08/29 12:12:23                    1 c3
20/08/29 12:13:21                    1 c4,c5
20/08/29 12:14:06                    1 c6,c7

```
```
select ColumnName, RowCount, UniqueValueCount, BLCCompRatio from dbc.TableStatsV where TableName = 't1';

 *** Query completed. 6 rows found. 4 columns returned. 
 *** Total elapsed time was 1 second.

ColumnName
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
               RowCount
   --------------------
       UniqueValueCount
   --------------------
     BLCCompRatio
   --------------
c6,c7
              4,194,309
                      1
                ?
c4,c5
              4,194,309
                      1
                ?
?
              4,194,309
                      ?
               79
c2
              4,194,309
                      1
                ?
c3
              4,194,309
                      1
                ?
c1
              4,194,309
              4,194,309
                ?
```

# 参考
[統計文 • Teradata Vantage™ SQLデータ定義言語 構文規則および例 • リーダー • Teradataドキュメント]
(https://www.docs.teradata.com/reader/RknaJAFX_2CtUAZfB4_rTA/_9F6XXJ30kKl0hxcnLLpMQ)
[TableStatsV • Teradata Vantage™ データ ディクショナリ • リーダー • Teradataドキュメント]
(https://docs.teradata.com/reader/fMqp0D_uNdzh8~BHZ2S~9w/OSyWI~ERlUsaXLjEjRlPAw)
アクターをナビメッシュの対象外にする方法

##アクターを配置した際ナビメッシュに影響を起こしてしまいAIの挙動に問題が起きてしまう問題の対処方

![コメント 2020-08-30 013156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/37b19b1a-bcf0-22a3-4bf4-8d90a8e04d36.png)

とてもシンプルでアクターのコリジョンの設定のCanEverAffectNavigationのチェックを切るだけ
![コメント 2020-08-30 013345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/c90e569e-62ef-0227-f55a-a5ac7a830cf5.png)

###解決
![コメント 2020-08-30 013403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/b2c0b80a-80d4-f441-815b-deca45535899.png)
PostgreSQL10へのPostGIS機能追加

## はじめに
PostgreSQL10でGeometory型を使うまでに少しハマったため、メモを残しておく。

## 実行環境
・Windows 10 Pro
・PostgreSQL 10.13
・PostGIS 2.5

## 今回のやる事

１．拡張機能の確認。
２．指定のデータベースに [postgis] 機能拡張。
３．Geometory型が作れるかどうか確認。


### １．拡張機能の確認
■以下のpsqlコマンドより、機能拡張を行いたいデータベースに接続する。

```
psql -d [データベース名] [ユーザー名]
```
※Windows10の場合、psqlコマンドでユーザ名を省略するとOSのログインユーザ名が使われる様なので、明示しなければいけない。
（そもそも [psql] コマンドが使えない場合はPathの設定が必要。以下のサイトを参考に！）
https://www.dbonline.jp/postgresql/install/index3.html

■以下のコマンドより、インストール可能な拡張機能 ＆ インストール済みの拡張機能を確認。

```
[データベース名]=# select * from pg_available_extensions;
```

実行結果
![Qiita-no006_img01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/1c3686b3-780b-d25f-550f-5df7607712a8.jpeg)
※赤枠（installd_version）の部分に何かしらの数字が入っていれば "インストール済み" である。


下の方に進み [postgis] あることを確認。
![Qiita-no006_img02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/70cbd584-076e-b04a-d01e-28b5f52a5b57.jpeg)



### ２．指定のデータベースに [postgis] 機能拡張

■以下のコマンドより、指定のデータベース＆スキーマに [postgis] 機能拡張。

```
[データベース名]=# create extension postgis;
```
　『CREATE EXTENSION』と表示されれば拡張完了！


■以下のコマンドより再度確認。

```
[データベース名]=# select * from pg_available_extensions;
```
実行結果
![Qiita-no006_img03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/3c39c7a7-2150-360b-6486-eb7847fa362e.jpeg)
インストール済みとなっている事を確認。

（終わってから気付いたけど、拡張機能のインストールは**『pgAdmin』** からでも可能で、実際そっちの方が操作は簡単。）　



### ３．Geometory型が作れるかどうか確認
■[postgis]機能拡張をしたデータベースで、以下のCreate文を実行してみる。

```
CREATE TABLE sample_tb (  
  gid SERIAL PRIMARY KEY,  
  geom GEOMETRY(POINT, 4326)  
);  
```
無事作成できたら、Geometory型のカラムを持てているため[postgis] 機能拡張は使えている。

## 補足
機能拡張するDBを、今回指定したところとは違うDBにして同じ事を試してみたが、『ERROR:  作成先のスキーマが選択されていません』となってしまった。
試しにスキーマを選択して [postgis] 機能拡張し、インストールできている事も確認できたが、Geometory型を作ろうとすると失敗してしまい、うまく拡張モジュールを読み込めていない様だった。


## まとめ
今回はPostgreSQLに空間データを扱うための拡張機能であるPostGISを追加した。
補足に書いてあことは、また気が向いた時に調べてみたいと思います。
firebase hostingにカスタムドメインを設定する

# firebase hostingにカスタムドメインを設定する

firebase hostingで公開しているサイトにドメインを割り当てることにしたので、その手順をまとめました。

## ドメインの取得

今回はfirebaseを利用していることもあり、Google Domainsでドメインを取得しました。

[Google Domains](https://domains.google.com/)

サイトの案内に従って必要事項を入力していけば特に問題なく取得できるかと思います。

今回、自分は`tocomi.net`というドメインを取得しました。

## firebaseでの設定

firebaseコンソールからhostingを開くと、右上に`カスタムドメインを追加`とあるのでここから設定します。

設定するドメインを聞かれるので、先程取得したドメインを入力します。

## 所有権の確認

今回はGoogle Domainsでドメインを取得しており、アカウントも同一のためスキップされたようです。

他のサービスからドメインを取得したり、別のアカウントで取得したドメインを利用する場合はおそらく確認作業が発生するはず。

## DNS設定

セットアップモードを選択できるので、今回はクイックセットアップを選択しました。
firebase側からAレコードをDNSに設定するように言われます。

Google Domainsから`DNS > カスタムリソースレコード`を開き、firebaseから示された2つのレコードを設定します。

![screenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190770/07a7cdc7-d59f-2c8c-7fb7-9d9507df4ee0.jpeg)

正しく設定されると、firebase hostingの画面で保留中と表示され、ドメイン設定の反映待ちになります。

![screenshot 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190770/f3310cb1-b312-5b8a-e7a9-0d676b7fcc57.jpeg)

## 設定反映待ち

試しにドメインにアクセスしてみると、保留中の状態でもページは表示されました。
ただ証明書が無効の状態なので警告が表示されます。
証明書が有効になるまでに時間を有するようです。

12時間くらいたった後に確認してみたら、firebaseコンソールで接続されていますと表示されて、証明書も有効になっていました！

## まとめ

今回はドメインの取得とサイトの公開をどちらもGoogleのサービスで行ったというのもあってか、想像以上に簡単にドメインを割り当てることが出来て良かったです！
PC分解・部品交換・自作に当たって揃えておくと便利なグッズたち


# はじめに

最近、古いデスクトップの分解と部品取りだし・新規PC自作を試みる機会を得た。

それなりにPC歴の長い私だが、本格的に「自作」に挑戦してみたのは初めて。いろいろ雑誌記事・web記事のお世話になったのだが、意外にそれらに書いてないことで、これは補完したほうがいいと感じたのが、これらの作業に必要となる道具立てだ。

中には「マイナスドライバー一本で楽勝」的に、その作業のお手軽さを強調している記事もある。確かに可能といえば可能だ。だが、本当にマイナスドライバーだけで問題なく快適に作業が進められるかといえば、それは言い過ぎだろう。

ここでは、意外にそうした記事に書いてないが持っておいて便利だったと思えたグッズをいくつか列挙しておきたいと思う。

## ラジオペンチ

さすがにこれは多くの記事では「揃えておいたほうが良いもの」にリストアップされている。特に、マザーボードに電源ボタン・リセットボタン系の小さい端子を抜き差しする過程において、ラジオペンチは必携と言えるのではないか。100均の安いものでもあるとないとでは効率が大違いだ。

## [プライヤー](https://electrictoolboy.com/media/16813/)

ラジオペンチ的にも使えるが、固く締めすぎたナットを力づくで外したいなどという時に役に立つ。私は古いCPUファンを取り外すときに使用した。

## [ピルケース（1週間分日毎時間帯毎小分けタイプ）](https://gourmet-note.jp/posts/10770)

特に分解作業時に、ひそかに、しかし強くお勧めしたいグッズ。取り外したネジの一時置き場として使う。対象PCの個々のネジの場所に番号を振っておく。ケースにも番号を振っておく。対応する番号のところにネジを置いていけば、再構築の時に迷わなくて済む。PCで使うネジは一見同じようで微妙に違う複数種類のネジが使い分けられている。その道を究めれば一瞬でこれらを見分けられるのかもしれないが、私には無理であった。
![pillcase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383429/6de986fa-c644-7c80-37aa-48d769883dce.png)

## 小型LEDスタンド

作業箇所が暗いと、細かい端子のツケ外しをしたいときなどなかなか狙いが定まらなくてストレスたまるよ。LEDで照らしておけば断然楽。

![ledstand.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383429/90024d63-14d2-2ce6-ad8e-4a455506fb01.png)

# おわりに

この手の解説記事をいくつも読んだが、どの記事でも記述が欠落している「暗黙の了解事項」のようになっている項目がいろいろありそうだ。分かっている人には当たり前すぎるが、初めての人はカジュアルに陥ってしまう罠。こういったことを経験者はもっと丹念に拾ってドキュメント化する必要がありそうだ。こんな陳腐な内容なんてと思わず、どんどん出していこう。
ショートカットキーを効率よく覚える方法(覚えられないあなたに)

# ようこそ
はい、このページにたどり着いたあなた。お疲れ様でした。
ショートカットキーはそもそも覚える必要がありません。
よくある「ショートカットキー　覚え方 」とかで検索すると出てくる

>ただ闇雲に覚えるのではなく、こんな感じで意味のあるものとして効率的に覚えましょう
>まず、基本となるキーの覚え方です
>Ctrl キーは 「コントロール (制御)」で...
>Shift (シフト) 元々はタイプライターの文字をズラす (シフトする) ためのキーで...
>Winキーは....

みたいになんだかお説教くさいページもきっと見たことがあるかもしれません

そもそも、ググればショートカットキーなんて出てくるのだから
「忘れる度にいちいち何回も検索すんのもうめんどくせーな」って人がそんな説教くさいページを見たらどう思うでしょう？「めんどくせーな」が加速します！

#ショートカットキー使って「ショートカット」したいのに！
#「一生懸命、意味を覚えて勉強」して！
#「回り道」してどうすんじゃ！
#「本末転倒」じゃないか！

そんな「効率化」という言葉に真っ向から矛盾しているくだらないお説教サイトは見ないようにしましょう！

今から3分で、ショートカットキーマスターになりましょう！



# 何はともあれ「Clibor」
[Clibor：ダウンロード](https://chigusa-web.com/download/)
クリップボード履歴ソフトです。本来の使い方ではないですが
今回はこれを使っていきます。
自作で似たようなツールを作れる人はどうぞお好きに、


## 使い方
ダウンロードして実行するとタスクトレイに
![タスクトレイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187949/c94c0c97-b12c-38c4-94be-5521de59eecb.png)
が、できるので右クリックして
定型文編集(T)
を選択
![VSCodeスペース30個.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187949/ef61f88a-5dca-898e-9bcf-1b7b39363087.png)
ネットから適当に「VSCodeショートカットキー」とかでググった
一覧をコピペします。本文はほどほどにスペースを空けて
一行目は、プログラム名 + [半角スペース30個くらい]にすると後々見やすいです

そして、登録(I)を押して

おんなじノリで、ほかのソフトもショートカットキーを登録していきましょう、(今回はGoogleChromeを登録しました)

そして
![定型文](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187949/3229b2a9-c9c2-1341-0ed0-4dc8305296c2.png)
画面表示制御 ＞　タブ制御　＞　メイン画面のメインタブを「定型文にする」にチェック
右下「設定変更(S)」をクリック

# 完成！

デフォルトでは、Ctrlキー２回で呼び出せます
画像は矢印で、VSCodeとGoogleChromeのショートカットキー一覧を入れ替えています

![Ctrl２回押す.png](https://gyazo.com/67745c731288f29b51dcbd5eff91f630.gif)

はいできました、あなたの脳には
「Ctrlキー２回」
という記憶スペースがあれば十分です！

１２バイトです！

もう何もいりません！

あとは設定で色や透明度を変えたり、固定位置に表示できるようにしたり、呼び出しを別キーにしたり、自分好みにカスタマイズしましょう、個人的にショートカットキー用途なら、特に変えなくてもこれで十分だと思います

## 他のクリップボード管理ソフトと併用したい場合！
わたしは[CLCL](https://www.nakka.com/soft/clcl/)と併用しています
(こっちはAlt + C で呼び出し)
CentOS7 MailCatcherを実装する

# 目的

- MailCatcherの実装方法をまとめる。

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | CentOS 7 (7.8.2003) |
| ハードウェア | Dell Studio 1537 |
| プロセッサ | Intel(R) Core(TM)2 Duo CPU     P8400  @ 2.26GHz |
| メモリ | 4 GB DDR3 |
| グラフィックス | 不明 |

# 前提条件

- 下記、または下記に準ずる方法でCentOS7のPCが構築されていること。
    - [Cent0S7をPCにインストールする](https://miriwo.hatenablog.com/entry/2020/08/09/144030)

# 前提情報

- 本説明で実行するコマンドは特筆しない場合、CentOS7のPCにssh接続を行い実行する物とする。

# 読後感

- MailCatcherを起動しブラウザから確認することができる。

# 概要

1. Rubyのインストール
1. 使用パッケージのインストール
1. MailCatcherのインストールと起動
1. 確認

# 詳細

1. Rubyのインストール
    1. 下記コマンドを実行してRubyをインストールする。

        ```terminal
        $ sudo yum install ruby
        ```
1. 使用パッケージのインストール
    1. 下記コマンドを実行してruby-develをインストールする。

        ```terminal
        $ sudo yum install ruby-devel
        ```
    1. 下記コマンドを実行してgcc-c++をインストールする。

        ```terminal
        $ sudo yum install gcc-c++
        ```
    1. 下記コマンドを実行してsqlite-develをインストールする。

        ```terminal
        $ sudo yum install sqlite-devel
        ```
1. MailCatcherのインストールと起動
    1. 下記コマンドを実行してMailCatcherをインストールする。

        ```terminal
        $ sudo gem install mailcatcher
        ```
    1. 下記コマンドを実行してMailCatcherを起動する。

        ```terminal
        $ mailcatcher
        ```
1. 確認
    1. ブラウザで下記にアクセスする。
        - [http://127.0.0.1:1080](http://127.0.0.1:1080)
    1. 下記のページが表示されることを確認する。

    ![MailCatcher__0_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9c1cb580-82d5-b992-1d3e-c6204fd2b089.png)

# 参考文献

- [LaravelでMailCatcherを利用してテストメールを送信する](http://vdeep.net/laravel-mailcatcher)
- [MailCatcher 公式](https://mailcatcher.me/)
- [MAILCATCHERを使ったメール送信テスト](https://laravel10.wordpress.com/2015/02/23/mailcatcher%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E3%83%86%E3%82%B9%E3%83%88/)
- [https://github.com/estelora/mailcatcher-demo](https://github.com/estelora/mailcatcher-demo)
- [https://erorr.org/217/](https://erorr.org/217/)
- [https://wiki.rookie-inc.com/development/mailcatcher](https://wiki.rookie-inc.com/development/mailcatcher)
- [https://www.d-wood.com/blog/2013/05/22_3674.html](https://www.d-wood.com/blog/2013/05/22_3674.html)
[高階関数/Higher-order function] 英語の記事・動画まとめ No.1


#The coding trainの解説
元動画: https://www.youtube.com/watch?v=H4awPsyugS0

```
function hello () {
}
```

上は普通のfunction。

高階関数とは2つ以上の関数(function)を使用するということ。それはparameterに入れたり、戻り値としてfunctionを設定したり、いろんなことが出来るんです。

```
function hello(function) {
  return funtion 
}
```

#具体的にみてみよう

1) 例えば以下のようにsingという関数がla la la -- という文字数を出すとしましょう

```
function　sing(){
  console.log('la la la la la')
}
```
2) la la la laの他にも他の音を一緒に出したい時はどうしましょう？
このような時は、別でmeow meowというfunctionを作って、singの引数として渡してしまえるんです！

```
function　sing(callback){
  console.log('la la la la la')
  callback();
}

function meow(){
    console.log('meow meow')
}
```

3) 以下のようによりシンプルな表現にすることも可能です

```
sing(function(){
  console.log('meow meow');
});
```

#function を戻り値にする場合

```
function multiplier (x, factor) {
  return x * factor; 
}
```

でも、もしこの計算をしてくれるfunctionを戻り値として出したい場合はどうなるでしょうか？

```
function multiplier (factor) {
  return function(x) {
    return x * factor; 
  }
}
```

1) multiplierに数字を入れて、その結果を変数に入れてみると・・・

let doubler = multiplier(2)といれると、undefined となりますが、
ここで戻ってきているのは関数・・・そう、function(x){return x * 2}ということになる！！　

2)その次に,doubler(2) と入力すると、　そう・・・・　4が結果として表示されます！！

![Screen Shot 2020-08-29 at 17.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647842/459e4f14-4f9e-22b1-cf70-221c29ad1e22.png)
UiPath　ワークフローを細かく分割しよう

# ワークフロー（xamlファイル）を分けられる理由
ワークフローを分けられる理由は改めて説明するまでも無いでしょう。
「ワークフローを再利用するため」ですね。

再利用性や修正のしやすさを考えずにワークフローを作ってしまい、後で困るといったパターンをよく見かけます。

そういったワークフローは将来的に負債として扱われてしまいます。
「うわ、あのワークフローか。。。修正めんどくさいな。」と後継の方に言われることでしょう。

# どう分割したらいいの？
単一責任の原則に従って分割できていれば、まずまずだと思います。
単一責任の原則はオブジェクト指向言語の原則ですが、UiPath向けに解釈するとこうなります。

「1つのワークフローは1つだけの責任を持つ。すなわち、ソフトウェアの仕様の一部分を変更したときには、それにより影響を受ける仕様は、そのワークフローの仕様でなければならない。」

もう少しだけ分かりやすく説明します。
1つのxamlファイル内でAサイトとBサイトの2つのサイトを操作しているとします。
Aサイトが改修されたとき、そのxamlファイルを修正します。
Bサイトが改修されたとき、そのxamlファイルを修正します。
AサイトとBサイトは、それぞれ独立しているのに片方が改修されたら同じxamlファイルを修正しています。
つまり、2つの責任をそのxamlファイルは持っているということです。

Aサイトを操作したいなら、Aサイトだけを操作するxamlファイルを作る。
Bサイトを操作したいなら、Bサイトだけを操作するxamlファイルを作る。
といった具合に、責任を分けてあげることが大事です。

「これもあれもそれも俺に任せろ！」といったワークフローを作るのではなく、
「俺はこれだけしかできないぜ！」というワークフローを作れということです。
そうすることで、「えーと、要件がこう変わったから、、、このファイルを修正すればいいのか。」と簡単に修正対象のファイルを見つけることができます。

ただ、注意しなければいけないことがあります。
「同じ責任を複数のワークフローに持たせるな。」です。

ログイン処理の一部が変わっただけなのに、「このファイルと、このファイルと、あのファイルも修正が必要だな。」なんてことになると分割するだけ損になります。
初めてopenvinoのface_detectionに触て、及び出会った問題

環境：
centOS7
Docker19.03.12
python3.8.5

##OpenVINO™ Model Server---face_detection
https://github.com/openvinotoolkit/model_server
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691360/6551405f-bbc6-55ce-13d6-4caf339b9aa7.jpeg" width="50%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691360/d7d0e89d-5378-f32e-c9ea-1d97d4ce8797.jpeg" width="50%">

##

```docker
#最新モデルサーバイメージをダウンロード
docker pull openvino/ubuntu18_model_server:latest

#モデルをダウンロード
curl --create-dirs.
https://download.01.org/opencv/2020/openvinotoolkit/2020.2/open_model_zoo/models_bin/3/face-detection-retail-0004/FP32/face-detection-retail-0004.xml 
https://download.01.org/opencv/2020/openvinotoolkit/2020.2/open_model_zoo/models_bin/3/face-detection-retail-0004/FP32/face-detection-retail-0004.bin 
-o model/face-detection-retail-0004.xml -o model/face-detection-retail-0004.bin

# 9000ポートでgRPC用のコンテナを起動
docker run -d -v $(pwd)/model:/models/face-detection/1 -e LOG_LEVEL=DEBUG -p 9000:9000 
openvino/ubuntu18_model_server /ie-serving-py/start_server.sh ie_serving model --model_path /models/face-detection --model_name face-detection --port 9000  --shape auto

#クライアントスクリプトのダウンロード
curl https://raw.githubusercontent.com/openvinotoolkit/model_server/master/example_client/client_utils.py -o client_utils.py 
https://raw.githubusercontent.com/openvinotoolkit/model_server/master/example_client/face_detection.py -o face_detection.py  
https://raw.githubusercontent.com/openvinotoolkit/model_server/master/example_client/client_requirements.txt -o client_requirements.txt

#分析するイメージをダウンロード
curl --create-dirs 
https://raw.githubusercontent.com/openvinotoolkit/model_server/master/example_client/images/people/people1.jpeg
-o images/people1.jpeg

#クライアント依存関係のインストール
pip install -r client_requirements.txt

#結果のフォルダを作成
mkdir results

#推論を実行し、結果を新しく作成したフォルダに保存
python face_detection.py --batch_size 1 --width 600 --height 400 --input_images_dir images --output_dir results

```
問題点は：

ModuleNotFoundError: No module named 'cv2’
解決：

```
pip install opencv-python
```
ModuleNotFoundError: No module named 'grpc'
解決：

```
python -m pip install grpcio
```

ModuleNotFoundError: No module named 'tensorflow'
解決：

```
pip install --upgrade --ignore-installed tensorflow
```

ModuleNotFoundError: No module named 'tensorflow_serving'
解決：

```
pip install  tensorflow-serving-api
```
MVCって何だろうか。

##MVCって何
　ウェブシステムの本を読むと，必ず「__MVC__」ということばが載っています．もう30年以上前から考えられている概念で，デザインパターンの一種，いや，元祖です．
　MVCのMは__モデル__．Vは__ビュー__．Cは__コントローラ__．何のことだかさっぱりという人に分かるように書きたいと思います．
　MVCというから分かりにくい気もします．ここでは，CVMといってしまいます．コントローラ，ビュー，モデル．
##コントローラ
　まず，__コントローラ__ってなにか．昔無線でラジコンって流行りましたよね．あと，任天堂のゲーム機もコントローラを持って遊びますよね．テレビにもリモコンがあります．こういう，操作するための「操縦」装置をコントローラといいます．そしてこれはつまり「__入力__」装置なんですね．
##ビュー
　そして，ラジコンもゲームもテレビも，動いている様子を見ますよね．ラジコンで飛んでいる飛行機模型や，液晶画面，テレビ画面．そういうコントローラで動かしているのが分かるような装置を__ビュー__といいます．つまり「__出力__」装置ですね．
##モデル
　そして，ふつうは入力と出力があれば充分楽しいのですが，作る側のことを考えると，もうひとつ大事なものがあります．何だかわかりますか．それは，__データ__の処理です．入力装置からのデータを出力するために，データをどうにかしなければなりません．そのデータを__モデル__というんですね．
　データですから，大抵のウェブシステムはデータベースを使います．データベースが使えない環境でも，モデルにデータを持つ処理を書きます．こうしてデータを保存するところを作って，入力データを入れて，出力データを出して，システムは動きます．その出し入れをうまく行うために，モデルを書くんですね．
　どこにデータを持つか．これは重要です．それに劣らず，どうやってデータを見せるか，どこからデータが入ってくるか．これも重要．もうお気づきのように，データの持ち方はモデル，データの見せ方はビュー，データの入り方はコントローラなのです．ようやくMVCの順になりました．
##まとめ
　MVCは30年以上前からある考え方で，ゲーム機もテレビもウェブサイトも，この考え方を知っているエンジニアが作ってきました．そのくらい，ウェブをエンジニアリングしやすくする考え方なので，ぜひこの先へ進んでいってください．
ImageViewを角丸にする方法

## 概要
Androidには、画像リソースを表示するためにImageViewクラスが存在します。これを使用することで、UIに画像を表示することが可能になります。しかしながら、下の画像のように**丸いアイコンのような画像を表示させる属性は、存在しません**。(2020/08/29現在)

なので今回は、**ImageViewを角丸にする方法を紹介します**。サードパーティのライブラリも複数存在しますが、今回はそのよなライブラリに頼らずAndroid標準のライブラリのみ使用して実装する方法を紹介します。

![hojge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199988/e7af4b25-d910-448f-76b0-673655218283.png)


## 実装方法
実装のコードは下記のようになります。
ポイントはCardViewを使用することです。

```xml
<androidx.cardview.widget.CardView
    android:id="@+id/icon"
    android:layout_width="40dp"
    android:layout_height="40dp"
    app:cardBackgroundColor="@color/colorAccent"
    app:cardCornerRadius="20dp"
    app:cardElevation="0dp"
    
    <ImageView
        android:id="@+id/image_view"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:src="@drawable/test_jpg"
        android:scaleType="centerCrop"
        android:layout_gravity="center"
        />
</androidx.cardview.widget.CardView>
```

ざっくり実装方針を説明すると、CardViewの子としてImageViewを配置し、CardViewで角丸を作成しています。

CardViewには、`app:cardCornerRadius`という属性が存在し、角の半径を指定することができます。この属性により角丸が実現できます。


## まとめ
今回はImageViewを角丸にする方法を紹介しました。
サードパーティのライブラリを使用しなくても、簡単に実装できますので、ぜひ使用してみてください。

## 追記
OutlineProviderを仕様することでも可能です。
紹介した方法と比べてxmlのネストが減らせるメリットがありますが、java/kotlinのコードから動的に指定する必要があります。
アクター生成時にAIControllerが機能しなくなり固まる問題



AIコントローラーを使用するアクターをSpawn Actorでアクターを生成するとAIコントローラーが機能しなくなります。
![コメント 2020-08-30 002202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/d7ed094e-54bf-e3f2-9944-d047cb5b9aea.png)

AIコントローラーを使用するアクターを生成する際は SpawnAIFromClassで生成すると正常に動きます。
![コメント 2020-08-30 002038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/d759dd21-b751-ce85-b885-18814f007019.png)


参考にさせて頂いたサイト
http://unrealengine.hatenablog.com/entry/2015/06/22/220000
仮想ＤＯＭについて

次に参画させて頂ける案件でフロント側でVue.jsを使用するので、現在勉強中です。
学習の前提として仮想DOMの仕組みについてメモ書きです。


#DOMとは
Document Object Model。
わかりやすく、オブジェクトではないがオブジェクトのような感じで、HTMLにアクセスすることが出来る形データの事。
https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction
#仮想DOMとは
DOMをコピーしたjavascriptのオブジェクトの事。


#前提
・DOMに直接アクセスして処理を加えるというのは非常に遅い
・documentはコード上にあるのではなくブラウザにあり、そこにアクセスするのに時間がかかってしまう（DOMはブラウザ上にある）。
・なら、自分でjsでdocumentと全く同じオブジェクトを作ればアクセス時間が短くなる。


#仮想DOMの差分検出アルゴリズム
…「描画処理前」の仮想Nodeツリーから更新対象となる仮想Nodeを抽出する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425289/30b8fd2f-e89b-b005-63e7-8806b615a760.png)

順番としては
１：仮想DOMツリーを作成する
２：変更前後の仮想DOMの差分を比較
３：仮想DOMからリアルDOMに反映する
４：差分を検知する
５：検知した差分でリアルDOMをブラウザがレンダリング
の流れで反映する。

#覚えておくポイント

・スピードが速くなるわけではない、不要なDOM操作が発生せず、ブラウザレンダリングの量が少なくなる為、「遅く」なりづらくなる。
・仮想DOMを採用している技術によってレンダリングのトリガーの仕組みを正確に理解していないと、期待した描画がされない可能性がある。
pythonコマンドでpythonはpython3.8を指す

linuxでPythonコマンドを入力するとデフォルトで指すのは/usr/bin/python2.7です。
使いやすいのため、[シンボリックリンク]を作成して、pythonコマンドはpython3を指す。
[シンボリックリンク]:https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%83%AA%E3%83%B3%E3%82%AF

##健忘症患者のメモ:head_bandage:
```shell
#pythonのバージョンを表示
$ python -V
Python 2.7

#元のシンボリックリンクを削除
$ sudo rm -rf /usr/bin/python

#python関連ファイルを検索
$ whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/bin/python3.6.5　/usr/bin/python3.8.5 

#シンボリックリンクを作成
$ sudo ln -s /usr/bin/python3.8 /usr/bin/python

#pythonのバージョンを表示
$ python -V
Python 3.8.5
```

pipも同じです~~
Dom国とJavaScript国の間の橋は狭い

# 昔聞いた先輩社員の名言
* DOM国とJavaScript国の間の橋は狭いので、頻繁に行き来しないように気をつけろと言われたのを思い出したので、ある意味初歩的なことではあるが、自戒も込めて記事にしておく

# 先に結論
* 要は`DOM操作は遅いので、JavaScriptの(特にループの中で)DOM操作を頻繁に行うと性能劣化につながる`というお話

# 経緯/背景
* 私の所属するプロジェクトの終盤で、性能問題が顕在化した
* パッケージ製品を使っており、パッケージの大幅な更改があったのだが、その前後で画面描画が倍以上遅くなっている
* パッケージが新しくなっているのに、よく使うデフォルト的な画面が圧倒的に遅くなるのはありえない。1ヶ月以内になんとかしろと言うことに
* その画面は表形式のデータを表示する画面で、数千行(一度の画面描画は150件程度)が処理対象になる
    * 列は10項目程度

# 原因
* ソースコードレベルまで追跡した結果以下2点が判明

## 1. 画面描画時にリサイズイベントが呼ばれ、同じ関数が2回呼ばれている
* 画面ロード時に自身とリサイズイベントで関数が2回呼ばれている。
    * ただ実は、これは体感的には問題にならない
    * なぜなら呼ばれる関数は描画に関数するもので、1回目が終わればレンダリングが行われ、その後の関数の再呼び出しと再レンダリングは見栄え上何も変わらないためである。

## 2. 二重ループの中でDOM操作
こちらが問題の本質

* 画面に表示される表の各セルの文字が見きれないように、それぞれの幅を計算して描画幅を調節している
* その過程で、行のループの中の列のループでセルごとに処理を実施
* セルごとに以下の処理を行う
    * spanタグを作成
    * append
    * 幅を計測
    * remove
* そのため、DOMアクセスが数万回単位の凄まじい回数で行われ、追加/削除も伴うため、DOM再構築も頻繁に行う

## 解決法
どちらも結構シンプルです

1. そもそも別のイベントなので、リサイズのイベントを呼ばないようにする
2. 毎回DOMの生成などをせずに、cssやその他のものを使って幅を計算する
    * 今回は幅の問題でしたが、それ以外でもDOM操作を一括で行う。画面描画分だけを対象にするなど、工夫はいくらでもできると思います。

結果、画面描画に10秒近くかかっていたのが、1秒未満になりました。

# 某キャラ風にいうならば

今回の件から俺が得るべき教訓は、

`DOM国とJavaScript国の橋は狭く輸出入のコストが高いので、エンジニアという監察官が、通して良いものと通さないものをきちんと吟味しないと、両国が損をすることになる。そしてそれは、流通量が増えたときにしか気づかず、そのときにはすでに手遅れになっている。`

ということだ

ってことですね。
データセンターについて

クラウドサービスを支えるサーバーやネットワーク機器などは、安全な運用に適した**`データセンター`**に設置されている。

#データセンターの所在地

- 震災や津波などの災害リスクが少なく、地盤の硬い場所
- 耐震構造や免震構造の建物


#データセンターのセキュリティ
- 建物内に監視カメラがあらゆるところに備え付けられている
- 入退館の管理を厳重に行なっている

#データセンターの環境
- 大量のサーバーやネットワーク機器などの稼働と空調管理のために、膨大な電力を消費する
- 外気でサーバーの発熱を冷却する外気空調を採用するなどして、空調の電力量を抑え、環境負荷を低減している。
[javascript]変数の書き方

#変数の書き方
javascriptでは変数の前にvarをつけることで、変数を宣言できます。
varはvariable(変数)の略称です。

```
var hello = "Hello, World";
```

```app.js
var hello = 'Hello World';
alert(hello);
```

```index.html
<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    <script src="app.js"></script>
  </body>
</html>
````

また、「Hello, World」は文字列なので、ダブルクオテーションで囲みましたが、
数値を変数に代入する場合は、ダブルクオテーションは不要です。

```
var int = 5;
```
[JavaScript] 複数の戻り値を個別の変数に入れたい時

#複数の戻り値を別々の変数にいれる場合の手順

1) 配列またはオブジェクトとして値をまず一つにまとめる
2) 分割代入を利用して、それぞれの変数に代入する

```
function getMaxMin(...nums) {
  return [Math.max(...nums), Math.min(...nums)]; 
}

let result = getMaxMin(5, 1-, 10, 20, 50)
console.log(50, -1) 

//これをそれぞれの変数にいれる！分割代入を使う！
let [max, min] = getMaxMin(5, 1-, 10, 20, 50); 
console.log(max) //50 
console.log(min) //-1
```
【Mac】Macのデスクトップにフォルダを作成したい

<< [【Mac】MacOSの基本操作を覚える](https://qiita.com/hiroyuki-eguchi-0731/items/99a0d771fda18adac9f0)

# Macでデスクトップにフォルダを作成するのはどうやるのか？

何気にWindowsで一時的にデスクトップに作業用フォルダを作成するときは、右クリックしてメニュー表示からの [新規作成] - [フォルダ] となるんですけど、これに相当するオペレーションがわからない・・・。

## Finder のメニューから作成する

デスクトップを表示している状態で画面上にあるFinderメニューから [ファイル] - [新規フォルダ] で作成できる。。。
と、これはすぐに気づいたのですが、どうもしっくりこない。
Windowsの右クリックみたいな感じないんですかね？


## control ＋ クリックでメニューを表示して作成する

Macで右クリックってあんまり聞いたことがなかったので、何かのボタンと組み合わせるんじゃないの？と感じて、一番それっぽいcommandボタンとクリックを組み合わせてみた。

何も反応しない・・・。

shiftでもな、optionでもない。
control？そういえばcommandと何が違うんだろう？

cotrol＋クリック　→　メニューが表示された！！！

凄いですね。こんなところにあったんだ・・・。

## Shift ＋ command ＋ N で作成する

![スクリーンショット 2020-08-29 23.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/f1763e91-ac09-1d1d-7741-7f5057516989.png)

Finder のメニューにショートカットの記号が書いてあるのですが、commandボタンとNボタンは想像できるものの、左側にある矢印みたいなマークが何を意味しているの把握できず、これがShiftであることに気づくのに時間がかかりました。。。

これが一番よさそうだ。

---

2020-07-29 初稿
RustでWebAssembly: spawn_local() へ渡すasync functionに状態を持ったObjectを渡したいときの抜け道

# はじめに

[`spawn_local()`](https://rustwasm.github.io/wasm-bindgen/api/wasm_bindgen_futures/fn.spawn_local.html) は wasm-bindgen で、asyncな関数を実行する便利な(JS側を介さない)方法ですが、

```rust

pub fn spawn_local<F>(future: F) 
where
    F: Future<Output = ()> + 'static, 
```

という型になっていて Futureが使う参照は`'static` なlifetimeをもつものしか渡せません。
つまりこれは、以下のように書くことができないということになります。

```rust
impl MyApp {
  fn some_func(&mut self) {
     spawn_local(my_async_process(&mut self)); // &mut selfの lifetimeがstaticではないのでダメ
  }
}
```

この制約が厄介だなーと思っていたのですが、抜け道を見つけた（いや、最初からそこにあったのでしょうが)のでメモしておきます。Rust初心者にはちょっと気が付きにくいなぁと思ったので。

# 抜け道
## `'static MyApp` を用意しておく
これは [前回](https://qiita.com/mokemokechicken/items/b6e5f44781b0dc3d97e2) 考えた方法で、まあ確かにこれならうまくいきます。
しかし、my_async_process の中に入れたいのが staticにできるものとは限りません。複数あるObjectとかだとこの方法は使いにくいです。(もちろん、なんとかはできますが)。

## `Rc<RefCell<MyApp>>` を渡す
参照(&)を渡すことはできないですが、 `Rc`構造体を渡すことはできるようです。
なので、spawn_localしたい部分に、いつもの `Rc<RefCell<MyApp>>` みたいなのを持ち込むことがでていれば渡すことができます。
Localで作成した普通のObjectならこの方法が良いかもしれないです。`Box<HogeHoge>` とかでも良いような気がします。

```rust
// 仮にこれをselfが持っていれば渡せることになる
let x: Rc<RefCell<MyApp>> = Rc::new(RefCell::new(MyApp::new()));
spawn_local(my_async_process_with_ref_cell(x.clone(), self.clicks));

...

pub async fn my_async_process_with_ref_cell(my_app: Rc<RefCell<MyApp>>, param: u32) {
    // 何か await とかしたりできる(fetchとか)
    // spawn_local() で使えるのは static な 参照しかないが、 Rcに包まれたものは有効。
    my_app.borrow_mut().async_count += param;
}
```

## Raw Pointerを渡す
Rustには 「参照(`&`, `&mut`)」とは別に「RawPointer(`*`)」というのがあります（というのを思い出した）。
https://doc.rust-lang.org/reference/types/pointer.html

「参照」の方は lifetime が管理されていたり、`&mut` が排他的な扱いをうけたりしていてRustの特別な感じを醸し出していますが、「RawPointer」にはそういうのがありません。代わりに Dereferenceするときは NULLかもしれないし、もう値がないかもしれないので `unsafe {}` で囲わないといけないことになっています。で、 spawn_local は 「`'static` ではない参照」を禁じているのであって、RawPointerについては何も言及していません。なので、実はRawPointerを渡すことができるようです。

つまり、こんな抜け道がありました。んー気が付かなかった。

```rust
spawn_local(my_async_process_with_raw_pointer(
    self as *mut MyApp,
    self.clicks,
));

...

pub async fn my_async_process_with_raw_pointer(my_app: *mut MyApp, param: u32) {
    // *mut MyApp は 「参照」ではなく 「RawPointer」
    // spawn_local() で使える「参照」は static な 参照しかないが、 Raw Pointerなら渡せる!!
    unsafe {
        (*my_app).async_count += param;
    }
}
```

# さいごに
まあ、どの方法もケースバイケースで使い分けると良さそうです。
いろいろやり方はあるものですね。
[Makefile] 「Hello World!」する方法

#概要
Makefile を vim で編集し、「Hello World」と表示する方法についてまとめる。

#手順

###makefile の作成
作業用フォルダー（ここでは、「workspace」）にmakefile を作成

```
workspace $ touch makefile //makefile の作成
```
###vim で編集
```
workspace $ vi makefile　//vim で makefile を開く
```
黒い画面が表示されるので「i」をタイプすると、画面下部に「-- INSERT --」と表示され、文字の入力が可能になる
![スクリーンショット 2020-08-29 23.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663833/04b09fbe-4a6a-78c0-d45a-4dd97a8e61b0.png)

makefile に以下のように入力

```:makefile
message = Hello World!!

helloWorld:
        echo $(message)
```
入力終了後は [esc] キーで insert モードを終了し、「:wq」(write quit) を入力してターミナルに戻る

####makefile の書き方

```
target名:
        実行するコマンド
```
コマンドは Unix コマンド
半角スペースではなく、タブを利用する


###ターミナルで実行

```:ターミナル
workspace $ make helloWorld
echo  Hello World!! //実行されたコマンド
Hello World!! //返り値
```
####makefile で指定したターゲットの実行方法

```
make ターゲット名
```



#参考資料
[Makefikeとは](https://nonbiri-tereka.hatenablog.com/entry/2014/06/21/133305)
[【初心者必見】最強エディタVimの使い方/コマンド30種まとめ](https://www.sejuku.net/blog/5570)
UbuntuでShiftキーなしでアンダーバーを（力技で）打てるようにする

最終的にやることとしては、XKBの設定を以下のように変更します。

```diff
- key <AB11> { [ backslash, underscore] };
+ key <AB11> { [ underscore, backslash] };
```

# xkbの正しいカスタマイズ方法

『Ubuntu18.04+英字配列で日本語入力の切替を左右altで行う+caps lockを左ctrlと入れ替え』
https://qiita.com/takashyx/items/e13daccee31797444beb

まずは上記記事などを参考に、正しい方法にてxkbの設定をカスタマイズしてみてください。

しかし、僕は色々頑張っても再起動時にカスタマイズ設定を反映させることができませんでした。
（他の記事の説明も上記記事と同様でしたので、僕固有の問題の可能性があります）

# 無理やり解決

諦めて元の設定ファイルを直接変更することにしました。

```bash
$ vi /usr/share/X11/xkb/symbols/jp
```

`underscore` という文字列で検索し、冒頭のdiffを適用します。
保存後、再起動して設定が適用されたことを確認しましょう。
可変長引数(Rest Parameters)の英語記事を日本語で説明

Rest parameter (...)
引用元：https://javascript.info/rest-parameters-spread

通常、ファンクション(関数)はいくつもの引数を使用することが可能！
以下、例

```
function sum(a, b) {
   return a + b; 
}

alert (sum(1,2,3,4,5));//結果3
```
この場合、最初の1,2のみが適応されるので、結果は3となります。


#...を使うことで複数ある引数をArray(配列)にいれることが可能
例えば以下↓

```
function sumAll(...args) { // ここでいうargsは配列の名前になります
  let sum = 0;

  for (let arg of args) sum += arg;

  return sum;
}

alert( sumAll(1) ); // 1
alert( sumAll(1, 2) ); // 3
alert( sumAll(1, 2, 3) ); // 6

```
この場合、引数が1であっても、1,2,3であっても、その時の引数の数に合わせて結果が異なります。


#最初のいくつかを変数に、残りを配列にいれることも可能！

```
function showName(firstName, lastName, ...titles) {
  alert( firstName + ' ' + lastName ); // 最初の2つが出るので、PaulとSamが出る

  // その残りのLisaとRoseがtitlesという配列に入る
  // 例) titles = ["Lisa", "Rose"]
  alert( titles[0] ); // Lisa
  alert( titles[1] ); // Rose
  alert( titles.length ); // 2
}

showName("Paul", "Sam", "Lisa", "Rose");

```
MySQL｜ダンプのインポートで「ファイルを読み込む際、選択したエンコーディングで読み込めないためエラーが起こりました 」

いつまで経っても環境構築でつまづく、やまうちです。涙

今回はmysqlのDBにダンプをインポートしようとしたものの、「ファイルを読み込む際、選択したエンコーディングで読み込めないためエラーが起こりました 」というエラーが出てうまくいかなかったので、メモ的な投稿です。

## 環境
Mac OS

## 結論
ダンプをインポートする際のエンコーディングを「**欧米（Mac OS Roman）**」にしたらうまくいった。

## 雑談
普段、DBクライアントはTablePlusを使っているんですが、インポート周りが微妙なんですよね（個人の感想です）。
今回も途中で全然動かなくなったと思ったら、突然終わって、Successfulとか出てて「いや、絶対失敗してんだろ！」と思ってSequelPro使ってみたら、タイトルのエラー。。。
とはいえ普段はすごい優秀なツールなんで、TablePlusはおすすめですよ！！
https://tableplus.com/
大規模なエンタープライズ企業におけるマイクロサービス開発について思うこと

#はじめに
マイクロサービスごとに開発チームが存在せず、開発と運用が別チームになっているようなケースで、マイクロサービスを開発、運用する場合の考慮ポイントを考えてみたいと思います。

マイクロサービスの開発としては、正攻法として既存のモノリスをデカップリングしてマイクロサービスにする方法があると思いますが、本記事では最初からマイクロサービスとしてアプリケーションを開発する場合について考えたいと思います。

Amazonなどすでにマイクロサービスを開発運用している企業におけるマイクロサービスと開発、運用チームの関係性は以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/56c05c13-23a9-f7a3-e87c-48d239ef9f91.png)

基本的に各マイクロサービスごとに開発運用チームが存在します。つまり、サービスと開発運用するチームは、1：1になります。

以下は、請負などで開発を他社に依頼するようなケースにおけるマイクロサービスと開発、運用チームの関係性のイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/b1680bc4-c56d-d3f5-e89a-3ac158b3f822.png)

大規模なエンタープライズ企業においては、アプリケーション開発を内製せずにSIerなどに開発を依頼する場合があると思います。
そう言った場合は、サービスと開発運用するチームが、１：１にならないケースがあります。そう言ったケースにおいては、マイクロサービスの数が増えすぎると、運用が大変になるケースがあります。理由の１つとして、運用チームがマイクロサービスごとではなく、システム全体で一つになることが挙げられます。

#マイクロサービスのメリット

2つ目のような組織体制であっても、もちろんマイクロサービスにおける、以下のようなメリットを享受できます。
- スケールイン・アウトを効率的に行う
    - モノリスであれば、一部機能だけより処理性能が必要になった場合も、必要のない機能も含めてスケールアウトすることになる
- リリース時の影響の局所化
    - 機能追加時に、機能がマイクロサービスとして別れていると影響を局所化できる。

#2つ目のような組織体制の場合における考慮点

##複数のマイクロサービスに対して変更が必要になった場合、マイクロサービスの数が多いと運用チームへの負荷が高くなる
###ケース1 複数のマイクロサービスで同じ処理ロジックを実装しているケース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/bda461fc-9e68-05b0-f9f3-a41c2b04f7c2.png)
これは、そもそもマイクロサービスの切り方に問題があるか。。

###ケース2 アプリケーションコンテナのベースイメージの変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/34c522ff-4085-af13-da38-7ee030b1b3e0.png)

###ケース3 アプリケーションコンテナごとに作成するCICDパイプラインの処理の追加、ビルド用またはテスト用のイメージの変更
具体的には、Cloud BuildなどCIサービスで使用するBase Imageの更新など。マイクロサービス数CIの再設定が必要になり、１つの運用チームで変更作業を実施するのは、運用負荷が高い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/f65f80e9-f3b7-758a-b0c7-70bf8d39feb1.png)

##その他
マイクロサービスとは直接関係ないが、開発と運用が別れていることにより、どこまでどのチームがやるかという責任境界の問題も発生する。
mac編　MAMPにcakephpをインストールする方法

#手順公開（備忘録）

##1.macにMAMPをインストール

##2.MAMPのphpにPATHを通す(ターミナルでmac内のphpからMAMPのphpにPATH)

ターミナルで

```
macbook:~ user$ which php
```

を実行すると、現在の状態がわかるので（/usr/bin/php）と表示されるはず。
調べるとこのphpは元々macに入っているphpだそうでこのままじゃダメだそうです。

この場合MAMPのphpにPATHが通っていないので、
ターミナルで

```
macbook:~ user$ .bash_profile
```
を実行してvim操作にうつる。

##3.VimでMAMPのphpにPATHをとおす

Vimの画面でインサートモードに切り替えて

```
export PATH=/Applications/MAMP/bin/php/php？.？.？/bin:$PATH
```
を実行。
/php?.?.?/の部分はphpバージョンを選ぶ。
インサートモードを終了して保存してVim画面も終了。
※Vimのコマンド操作は事前に見とく。（インサートモード切り替え、Vim画面の終了の仕方や保存の方法など。簡単。）


その後、ターミナルに戻り

```
% source ~/.bash_profile
```
でVimの設定を反映させる。
ターミナルで

```
 macbook:~ user$ which php
```
を実行して

```
/Applications/MAMP/bin/php/php?.?.?/bin/php
```
と表示されればOKです。

##4.composerをインストールする
ターミナルで

```
macbook:~ user$ curl -sS https://getcomposer.org/installer | php
```
を実行。
composerをインストールした後

```
macbook:~ user$ composer -v
```
を実行してcomposerのバージョンが確認できればおkです。

その後『composer.phar』を先ほどPATHで指定したフォルダに移動させる。

##5.cakephpをインストール
インストールしたいフォルダに

```
macbook:~ user$ cd インストール先のフォルダ（自分の場合はMAMPのhtdocs）
```
移動して

```
 macbook:~  htdocs $ php composer.phar create-project --prefer-dist cakephp/app バージョン指定　フォルダ名
```

問題なくインストールできればとりあえず完了です。

初めての記事なので自分用ですが、誤りなどありましたらすいません。
アラフィフベテランエンジニアをSESで雇ったら大変だった話

エンジニア歴30年超のアラフィフベテランエンジニアをSESで雇った時の話。

開発はRubyでの仕事で、そのベテランさんはRubyの経験は浅かったものの、Java、PHPなどの開発経験は豊富だったので、まあ行けるだろうと思い契約。

主な仕事は外部APIからデータを取得してDBに保存するバッチ処理の開発。

----

ベテ「開発完了しました」

わい「ありがとうございます。動作確認しますねー」

・・・・・・・・・・・・

わい「あれ？データ取れてないな。これテストしました？」

ベテ「はい、しました」

わい「動きました？」

ベテ「私の開発環境では、動きました」

わい「DBに値が保存されないんですが、そこまで確認しました？」

ベテ「そこまでは確認してません」

**わい「・・・バッチを実行してエラーが出ないことだけ確認したってことですか？」**

----

ソースを見たら一瞬でバグを発見。
それ以外にも無限ループがあったり、if文がカオスで条件漏れがあったりと、ミスの仕方がプログラミング初心者。
プログラミング以前に、エラーが出なきゃいいくらいに思っている節があり、仕様通りのものを作る気も、正しく動作しているか確認する気もない仕事姿勢で、まるでやる気のない新入社員のよう。

総じて、**「お前は30年間一体何をしてきたんだ」**と思った。

30年間の開発経験が詐称だったのかどうか問い詰めたりはしなかったが、その後、設計からソースコード、単体テスト内容まで厳しくレビューするようにしたら、**70点**くらいのものは作ってくれるようになった。

----

SESの経歴詐称が話題になっていて思い出したので記念カキコ。

この人以外にも、同じチームの別の人がやった作業をあたかも自分がやったかのように経歴に書く人は多い。
Azure SQL Database のデータを LocalDB にリストアする

以前、[MS SQL Server のデータを LocalDB にリストアする](https://qiita.com/miyamiya/items/ede26a72572b5427632c)記事を書いたことがありますが、似たような話が 1 年後にくるとは...

今回は Azure SQL Database での備忘録

## 手順

手順は大きく分けてこのようになります

1. ストレージアカウントとコンテナを作成
2. Azure SQL Database から bacpac ファイルをエクスポート
3. bacpac ファイルをクライアントにダウンロード
4. sqlpackage の準備
5. LocalDB にリストア

## 1. ストレージアカウントとコンテナの作成

bacpac ファイルの出力先として、ストレージアカウントとコンテナを作成しておく

## 2. Azure SQL Database から bacpac ファイルをエクスポート

PowerShell でもできそうだったけど、やりたいのは LocalDB へのリストアなので、Azure Portal からポチポチ

1. Azure Portal から、対象の SQL データベースを開き、[エクスポート] をクリック
2. 適宜項目を埋める
   - Storage は手順 1 で用意したストレージアカウントとコンテナを指定
   - 認証の種類は「SQL Server」にして、データベースのアカウントを設定
3. [OK] を押すとエクスポートが始まる  
   ※進捗や結果は、対象の SQL Server を開き、[インポート/エクスポート履歴] で確認できます  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118961/dfa7750f-2d74-d4a5-d297-de49185d8c41.png)

## 3. bacpac ファイルをクライアントにダウンロード

「1. ストレージアカウントとコンテナの作成」で作成したコンテナを開き、右端の 3 点リーダーをクリックして、ダウンロードをクリックしてダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118961/f4522e39-c1cb-ebb0-a28c-6a243a5563a1.png)

## 4. sqlpackage の準備

Visual Studio のインストールフォルダ内(`C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\130`)にあったのですが、改めて MS のサイトからダウンロードする

1. [sqlpackage をダウンロードしてインストールする](https://docs.microsoft.com/ja-jp/sql/tools/sqlpackage-download?view=sql-server-ver15) にアクセスして、Windows .NET Core の zip ファイルをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118961/40b0a4ff-68b0-6442-2dd3-f122b2555833.png)
2. ダウンロードした zip ファイルを右クリックして、このファイルを許可する  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118961/f963311e-240e-bd1c-9193-1518dcd50ce5.png)
3. 適当な場所に展開する

## 5. LocalDB にリストア

コンソール(手元では Windows Terminal を利用)を立ち上げ、展開したフォルダに移動後に、コマンドでインポートする

```powershell
PS> cd C:\soft\sqlpackage-win7-x64
PS> .\sqlpackage.exe /Action:Import /SourceFile:"C:\Users\miyamiya\Desktop\xxxxxxxx-2020-8-24-22-5.bacpac" /TargetConnectionString:"Data Source=(localdb)\mssqllocaldb;Initial Catalog=20200824db; Integrated Security=true;"
```

しかし、私の環境では `SQL72014` が発生してインポートに失敗しました

そこで、[こちらを参考にして](http://www.sqlcoffee.com/Troubleshooting213.htm) 、SSMS で LocalDB につないで、下記クエリーを流しました

```sql
sp_configure 'contained database authentication', 1;
GO
RECONFIGURE;
GO
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118961/513c662a-8b05-79e3-d5b4-a88c7f8d77d5.png)

その後、もう一度クエリーを流したらインポート成功しました

## 参考

* [BACPAC ファイルへのエクスポート - Azure SQL Database および Azure SQL Managed Instance](https://docs.microsoft.com/ja-jp/azure/azure-sql/database/database-export)

* [sqlpackage をダウンロードしてインストールする](https://docs.microsoft.com/ja-jp/sql/tools/sqlpackage-download?view=sql-server-ver15)

* [Error SQL72014 .Net SqlClient Data Provider Msg 12824.](http://www.sqlcoffee.com/Troubleshooting213.htm)
【CSS】flexコンテナを利用してヘッダーのロゴやリンクを横並びにきれいに配置する

###経緯
スクールではliやdivを横並びにするときにfloatで習ったけど、これが初心者にはバグる原因になりました。

特にfloatの次の要素がその上にかぶってきたりすることでほんとに時間がかかった。

どうやらflexを使えばきれいに配置できるし、画面サイズが変わっても折り返してくれるので、レスポンシブ？

###DEMO

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="rjwxfqli" data-slug-hash="xxVrXVE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ヘッダーリンクの横並び">
  <span>See the Pen <a href="https://codepen.io/rjwxfqli/pen/xxVrXVE">
  ヘッダーリンクの横並び</a> by 大野原 信 (<a href="https://codepen.io/rjwxfqli">@rjwxfqli</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

左の画面のHTMLなどのボタンをポチポチして表示・非表示を切り替えるとRESULTの幅が変わるので、挙動がわかると思います。


###説明

親要素：　フレックスコンテナ　→　display: flex;
子要素：　フレックスアイテム　→　自動的にフレックスアイテムになる

親要素の中に2つ子要素があったら、その2つが横並びになる。

nav　親
div　子　→　これが横並びに

divの中にulがあり、その中にliがあるとき、
ul　親　→　display: flex;とすることで　liがフレックスアイテム、つまり横並びになる。

入れ子の構造になる。

navの中に、
左に配置したいもの、と右に配置したいものがあるとすると、まずはその二つのdivが必要になる。
そしてその二つのdivの配置を指定する、justify-content: space-between;を書く。
これで、間に適切なスペースをとって、要素が左から右まで配置されるようになる。

このままではul liも、リストスタイルで右に配置されるだけ。
ulの中で同じことをしてあげれば、リストもきれいに横並びで配置される。


###Tips
画面サイズが小さくなると、縦にずれるようにするには、フレックスコンテナ（親）に
flex-wrap: wrap;
を書く。

また、liの幅が文字列の幅になっているので、縦にずれるようにした場合、見た目がジグザグになってしまう。
よって、liの幅を指定してあげれば、縦にずれて折り返しになるときも、ある程度見た目がきれい！
dllexportとdllimportの使い方

#DLLで関数を共有する方法
Windowsでライブラリ（DLL）を作る時、以下の方法で関数を他のDLLやEXEに共有できます。
①DEFファイルで共有
②DEFファイル無しで共有

上記の①は、関数名をDEFファイルに記載することで共有する方法になりますが、本記事は上記の②をメモします。

#ファイル構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/899c6dbb-c2cb-d5f6-6bfc-e826b1c0181b.png)

①DLLをコンパイル
②EXEがDLLのヘッダーファイルとLIBファイルを参照
③EXEのソースファイル、参照されているDLLのヘッダーファイルとLIBファイルを用いてEXEをコンパイル
④EXEの実行時にDLLが参照される

#関数のエクスポートとインポート
##他のDLLやEXEに関数をエクスポート

```c++:a.h
// 関数の宣言
void __declspec(dllexport) hello();
```

```c++:a.c
//関数の定義
void hello(){
   printf("hello\n");
}
```
「__declspec(dllexport)」を使って、「この関数を外部に公開するよ」という宣言で共有したい関数を公開できます。
これに対して、この共有関数を使いたい他のDLLやEXEで、「dllexport」ではなく「dllimport」を使えば、
「この関数は、外部から取るよ」のように関数を宣言できます。
以下は例です：

```c++:b.c
void __declspec(dllimport) hello();   // 外部関数の宣言（リンカーでa.libを指定する必要がある）

int main(){
   hello();   // 外部関数の実行
   return 0;
}
```

##もう少し工夫する
上記のように、EXEのCファイルに直接外部関数の宣言を書いても実行できますが、
参照のDLLにある関数が変更するたびに、EXEのCファイルも合わせて変更しないといけません。

このため、DLLのヘッダーファイルを直接に参照できれば便利になります。

しかし、DLLのヘッダーファイルをそのまま参照しますと、EXE側も「dllexport」になりますので、
下記のように、もう少し工夫する必要はあります。

```c++:a.h
#ifdef A_EXPORTS
#define DECLSPEC __declspec(dllexport)
#else
#define DECLSPEC __declspec(dllimport)
#endif
```

DLLのヘッダーファイルをこのように修正すれば、DLLのプロジェクトで「A_EXPORTS」という
マクロをプリプロセッサで定義するだけで、DLLでは「A_EXPORTS」が定義されいるため
エクスポートになって、EXEでは「A_EXPORTS」が定義されていないためインポートになります。

これで、上記のファイル構成図のような構成で、DLLの関数の関数名や引数の型・数が
変更されない限り、DLL側で関数の処理の中身を変更しても、EXE側で何もしなくてもよいです。
Spigot 法による pi 計算

# Spigot 法
1991 年に Stanley Rabinowitz が、いくつかの数学定数を整数演算だけで 1 桁づつ求めてゆくアルゴリズムを論文にしましたが、その時アブストラクトに円周率 $\pi$ を小数点以下 1000 桁求める 14 行の FORTRAN プログラムを示しました。

ここではそれを modern fortran に書き換えます。と言ってもほとんどそのままですが･･･
 
## オリジナル
- http://stanleyrabinowitz.com/publications.html

- PDF
http://stanleyrabinowitz.com/download/piabstract.pdf

## FORTRAN 77　元のもの
小文字を使っていますが、77 末期にはありがちでした。L は小文字が見間違えやすいので大文字で書いているのでしょう。スカラー変数は暗黙の型宣言に従っています。桁上がりをする carry が karry と書かれているのはそのためと思われます。配列宣言は暗黙の型を破っていますが、こういうのはいちいち宣言部に戻って型を確かめるのが面倒なので嫌われていました。

```fortran
      integer vect(3350), buffer(201)
      data vect/3350*2/, more/0/
      DO 2 n=1, 201
          karray = 0
      DO 3 L=3350, 1, -1
          num = 100000*vect(L) + karry*L
          karry = num/(2*L-1)
3         vect(L) = num - karry*(2*L-1)
      k = karry/100000
      buffer(n) = more+k
2     more = karry - k*100000
      write(*,100) buffer
100   format(1x ,I1,'.'/(1x,10I5.5))
      end
```
なおこのプログラムでは桁上がり処理を簡略化しているので 5 桁以上繰り上がりが出る場合このままではまずいようですが、$\pi$ 1000 桁まででは大丈夫な模様です。

```
3.
14159265358979323846264338327950288419716939937510
58209749445923078164062862089986280348253421170679
82148086513282306647093844609550582231725359408128
48111745028410270193852110555964462294895493038196
44288109756659334461284756482337867831652712019091
45648566923460348610454326648213393607260249141273
72458700660631558817488152092096282925409171536436
78925903600113305305488204665213841469519415116094
33057270365759591953092186117381932611793105118548
07446237996274956735188575272489122793818301194912
98336733624406566430860213949463952247371907021798
60943702770539217176293176752384674818467669405132
00056812714526356082778577134275778960917363717872
14684409012249534301465495853710507922796892589235
42019956112129021960864034418159813629774771309960
51870721134999999837297804995105973173281609631859
50244594553469083026425223082533446850352619311881
71010003137838752886587533208381420617177669147303
59825349042875546873115956286388235378759375195778
18577805321712268066130019278766111959092164201989
```


## modern fortran 書き換え
変数は明示的に宣言することにします。
do loop での文番号は do ... end do 構文にします。

data 文での変数や配列の初期化は modern fortran では推奨されません。

Format 文は直接 READ/WRITE に書き込みます。これは 77 でもできたのですが、90 以降では文字列を示す引用符としてシングル・ダブルどちらのクォーテーション対でも許されるようになったのでやりやすくなりました。

```fortran
    program pi
        implicit none
        integer :: vect(3350) = 2, buffer(201)
        integer :: carry, n, L, k, more = 0, num
        do n = 1, 201
            carry = 0
            do L = 3350, 1, -1
                num = 100000 * vect(L) + carry * L
                carry = num / (2*L - 1)
                vect(L) = num - carry * (2*L - 1)
            end do
            k = carry / 100000
            buffer(n) = more + k
            more = carry - k * 100000
        end do    
        write(*, "(1x, I1, '.'/(1x, 10I5.5))") buffer
    end program pi
```
AtCoder Beginner Contest 177 B問題「Substring」解説(Python3,C++,Java)

皆さんこんにちは(コンテスト後の方はこんばんは！)Ruteです！

<b>AtCoder Beginner Contest 177 B問題</b>の解説をこれから始めます！
A問題,C問題の解説は以下のリンクより見ることが出来ますのでご確認下さい！！

##各問題の解説
|A問題|B問題|C問題|
|---|---|---|
|準備中です|<b>この記事です</b>|準備中です|

#問題概要
文字列$T$が$S$の<b>部分文字列</b>となるように、$S$のいくつかの文字を書き換えます。
少なくとも何文字書き換える必要があるでしょう。
ここでの<b>部分文字列</b>は連続する部分列のことを指します。
<font color = "red">例) `'xxx`'は`'yxxxy'`の部分文字列であるが、`'xxyxx'`の部分文字列ではない。</font>

問題URL : https://atcoder.jp/contests/abc177/tasks/abc177_b

##制約
・$S$,$T$は$1$文字以上$1000$文字以下
・$T$の長さは$S$の長さ以下
・$S,T$は英小文字のみを含む


#解説
$S$の部分文字列のうち、文字列$T$と同じ長さの部分文字列を取得します。
部分文字列の個数は($|S|-|T|+1$)個となります(ここで、$|S|$は$S$の長さを指します)

これらの文字列について、$T$の文字列と一致している文字数を調べます。

$|T|$から一致している文字数のを引いたものがこの部分文字列における<b>「書き換える必要がある文字数」</b>となります。これの最小値を求めれば良いです。
(つまり、
<b>($|T|$ - (一致している文字列の最大数))</b>
が最終的な答えになります)

以下、各言語(Python3.C++,Java)での解答例を示します。
(22:26時点 : Javaの解答例が出来ていないので、Python3,Javaでの解答例を示します)

##各言語解答例


<details><summary>Python3での解答例</summary><div>

```{ABC177B.py}
s = input()
t = input()
ls = []
for i in range(len(s) - len(t) + 1):
    ls.append(s[i:i+len(t)])
now = 0
minimum = len(t)
for i in range(len(ls)):
    now = 0
    for j in range(len(t)):
        if t[j] == ls[i][j]:
            now += 1
    if len(t) - now < minimum:
        minimum = len(t) - now
print(minimum)

```
※Pythonでは`文字列[開始インデックス:終了インデックス+1]`で`文字列`における<b>開始インデックスから終了インデックスまで</b>の部分文字列を取り出すことが出来ます

</div></details>

<details><summary>C++での解答例</summary><div>

```{ABC177B.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  string s;
  string t;
  //文字列s,tを受け取ります
  cin >> s >> t;
  vector<string> ls(s.size()-t.size()+1);
  // |s|-|t| + 1のサイズのstring配列を作成します。
  //部分文字列を列挙し配列lsに挿入します
  for (int i = 0; i < s.size()-t.size()+1; i++){
    ls.at(i) = s.substr(i,t.size());
  }
  int now = 0; //同じ文字の数
  int minimum = t.size(); //出力する答え
  for (int i = 0; i < s.size()-t.size()+1; i++){
    now = 0; //初期化
    for (int j = 0; j < t.size(); j++){
      if (t.at(j) == ls.at(i).at(j)){
        now++;
      }
    }
    if (t.size() - now < minimum){
      // |t| - now がminimumより小さかったら更新する
      minimum = t.size() - now;
    }
  }
  // minimumを出力する
  cout << minimum << endl;
}

```

</div></details>

<details><summary>Javaでの解答例</summary><div>

準備中

</div></details>

このような文字列処理の問題ですが、直近のB問題だと以下の問題があてはまります。

ABC172B [Minor Change] (https://atcoder.jp/contests/abc172/tasks/abc172_b)<b>　★今回の問題と類似した問題です</b>
ABC159B [String Palindrome](https://atcoder.jp/contests/abc159/tasks/abc159_b)　文字列処理の問iですが、若干難易度が高いと思います
ABC152B [Comparing Strings] (https://atcoder.jp/contests/abc152/tasks/abc152_b) 
★Difficulty11と、文字列処理の問題の中では簡単な部類です。この機会に解いてみましょう。

以上で、<b>B問題</b>の解説を終わります。次は<b>C問題</b>の解説です！！
AtCoder Beginner Contest 177 A問題「Don't be late」解説(Python3,C++,Java)

皆さんこんにちは(コンテスト後の方はこんばんは！)Ruteです！

<b>AtCoder Beginner Contest 177</b> の解説をこれから始めます！

##各問題の解説
|A問題|B問題|C問題|
|---|---|---|
|<b>この記事です</b>|準備中です|準備中です|

この記事では主に<b>A問題「Don't be late」</b>の解説をします！！

#問題概要
高橋君は青木君と待ち合わせをしています。
待ち合わせ場所は高橋君の家から$D$メートル離れた地点であり、待ち合わせの時刻は$T$分後です。
高橋君が今から家を出発し、分速$S$メートルで待ち合わせ場所にまっすぐ移動するとき、待ち合わせ場所に間に合うかどうかを判定しなさい。

##制約
・ $ 1 \leq D \leq 10000$
・ $ 1 \leq T \leq 10000$
・ $ 1 \leq S \leq 10000$

#解説
待ち合わせ場所に間に合うかどうかを判定すれば良いです。
つまり分速$S$メートルで$T$分移動した距離が、$D$メートル以上になるかどうかを判定すれば良いです。
式で表すと $D \leq S×T$となるかを条件分岐すれば良いです。

以下、各言語(Python3,Java,C++)での解答例を記します。

##各言語解答例

<details><summary>Python3の解答例</summary><div>

```{ABC177A.py}
d,t,s = map(int,input().split())
if d <= s * t:
    print("Yes")
else:
    print("No")
```


</div></details>

<details><summary>C++の解答例</summary><div>

```{ABC177A.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  int d,t,s;
  cin >> d >> t >> s;
  if ( d <= s * t){
    cout << "Yes" << endl;
  }else{
    cout << "No" << endl;
  }
}
```


</div></details>

<details><summary>Javaの解答例</summary><div>

```{ABC177A.java}
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    int d = scan.nextInt();
    int t = scan.nextInt();
    int s = scan.nextInt();
    if (d <= s * t){
      System.out.println("Yes");
    }else{
      System.out.println("No");
    }
  }
}

```


</div></details>

条件分岐に関する問題はABCでも多く出題されており、
ABC175の[Air Conditioner](https://atcoder.jp/contests/abc174/tasks/abc174_a)や、ABC164の[Sheep and Wolves](https://atcoder.jp/contests/abc164/tasks/abc164_a)などが当てはまります。

以上で、<b>A問題</b>の解説を終わります。次は<b>B問題</b>の解説です！！
[GoogleAppsScript(GAS)] 関数を API として公開し、ターミナルから実行する方法

#概要
GAS で作成した関数を API として公開する。makefile で curl で API を呼び出し、ターミナルから実行する手順についてまとめる。

#成果物
「name」「hp」「attack」列を用意しているスプレッドシートに、makefile で指定した値を追加する
![スクリーンショット 2020-08-29 22.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663833/ddd75f68-1a38-1b8d-313e-483c1edbe0be.png)
　　　　　　　　　　↓
![スクリーンショット 2020-08-29 22.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663833/4f94623b-98e6-ad52-f4c7-42228798a5cd.png)

#前提知識
[GoogleAppsScript(GAS) で 「Hello World」する方法](https://qiita.com/ub0t0/items/df688e0f2042df1325f4)

#全体像
![スクリーンショット 2020-08-29 22.30.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663833/9494f0a3-7d40-febc-5926-a2e9aa823f5b.png)


#手順

### GAS で関数を作成
スプレッドシートの [ツール] → [スクリプトエディタ] に以下のコードを記述
シート名は「monsters」とする

```.js:.gas
const doPost = (e) =>{
  const data = {
   name:e.parameter.name,
   hp:e.parameter.hp,
   attack:e.parameter.attack
 }

  appendMonster(data);
  return ContentService.createTextOutput("OK!")
}

const appendMonster = (data) => {
  const spreadSheet = SpreadsheetApp.getActive();
  const monstersSheet = spreadSheet.getSheetByName("monsters")
  monstersSheet.appendRow([data.name,data.hp,data.attack]);
}
```
通信する際に利用する関数名として、「doPost」と「doGet」がある。呼び出した値を利用する場合は「doPost」、呼び出した値を返す場合は「doGet」を利用する。ここでは、呼び出した値をスプレッドシートに書き込むため「doPost」を利用した。

### API として公開
![スクリーンショット 2020-08-29 22.07.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663833/ab676d74-6967-c10d-c61a-4aaf198d15c1.png)
[Project version:]で [New] を選択
※理由は不明だが、「New」を選択しないと URL が更新されない。
![スクリーンショット 2020-08-29 22.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663833/1c2cb492-2bd8-b2b8-c502-8e484c244a7d.png)

### Makefile を作成し、curl を利用して API を呼び出す記述を追加

作業フォルダーとして、「gas-client」 フォルダーを作成し、その中に Makefile を作成する
Makefile には、変数で API の URL を定義し、appenddata で curl コマンドを実行する

```.js:Makefile
API_URL = 'API 公開時に取得した URL'

appenddata:
	curl -L $(API_URL) \
	-F 'name=リベンジ' \
	-F 'hp=50' \
	-F 'attack=10'
```


ターミナルで実行

```:ターミナル
gas-client $ make appenddata
curl -L 'API 公開時に取得した URL' \
	-F 'name=リベンジ' \
	-F 'hp=50' \
	-F 'attack=10'
OK!gas-client $ 
```




#参考
[GoのためのMakefile入門](https://qiita.com/seihmd/items/42996d5abb14badf775e)