OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで大津の二値化がオーバーフローする問題と対策

#はじめに
　大津の二値化とは、画像を二値化する際の閾値を自動で決定してくれるアルゴリズムです。既にOpenCV等のライブラリで実装されていますが、Pythonでの実装を見つけたので触ってみました。タイトルには問題とありますが、おそらく私の実行環境が悪かったために発生したものだと思います。

#コード
 コード自体は私が書いたものではなく、他の人が描いたブログ[[1]](https://algorithm.joho.info/programming/python/opencv-otsu-thresholding-py/)からの引用です。

```python:ots.py
#大津の二値化（引数のgrayはグレースケール画像）
def threshold_otsu(gray, min_value=0, max_value=255):

    # ヒストグラムの算出
    hist = [np.sum(gray == i) for i in range(256)]

    s_max = (0,-10)

    for th in range(256):
        
        # クラス1とクラス2の画素数を計算
        n1 = sum(hist[:th])
        n2 = sum(hist[th:])
        
        # クラス1とクラス2の画素値の平均を計算
        if n1 == 0 : mu1 = 0
        else : mu1 = sum([i * hist[i] for i in range(0,th)]) / n1   
        if n2 == 0 : mu2 = 0
        else : mu2 = sum([i * hist[i] for i in range(th, 256)]) / n2

        # クラス間分散の分子を計算
        s = n1 * n2 * (mu1 - mu2) ** 2

        # クラス間分散の分子が最大のとき、クラス間分散の分子と閾値を記録
        if s > s_max[1]:
            s_max = (th, s)
    
    # クラス間分散が最大のときの閾値を取得
    t = s_max[0]

    # 算出した閾値で二値化処理
    gray[gray < t] = min_value
    gray[gray >= t] = max_value

    return gray
```

#問題

下の様な写真に対して二極化を行ったときに、オーバーフローの警告が出ました。

![img5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/25eec446-a8c3-b633-be58-30c49e00e1c6.jpeg)

```
RuntimeWarning: overflow encountered in long_scalars
  s = n1 * n2 * ((mu1 - mu2) ** 2)
```

　その際、閾値は137となり、OpenCVで大津の二値化を行った際に得られる78から離れてしまいます。

#発生原因
　n1とn2に対してtype(n1)、type(n2)を実行すると、\<class 'numpy.int32'\>という結果になりました。そのため、計算結果がint32型の範囲（-2147483648 〜 2147483647）を超えていることが原因になっていると考えられます[[2]](https://jakevdp.github.io/PythonDataScienceHandbook/02.01-understanding-data-types.html)。

#対策
　2つの対策を考えました。1つ目は、n1とn2の型をfloat型にすることです。下記の様に1行追加することでhistの型が変わり、結果としてn1とn2の型も変わります。

```python:
# ヒストグラムの算出
hist = [np.sum(gray == i) for i in range(256)]
hist = np.array(hist, dtype=np.float64)
```

　2つ目は、logを用いることです。sは値そのものよりも相対的な大きさが重要になるため、sの両辺にlogを取り、右辺を分解します（logを取った結果はfloat型になります）。中身が1とマイナスの場合を除き、logをとっても順番は変わりません。


```python:
import math
...

# クラス間分散の分子を計算
#s = float(n1 * n2 * ((mu1 - mu2) ** 2))
        
if n1 == 0 or n2 == 0:
    continue
if mu2 >= mu1:
    s = math.log(n1)+math.log(n2)+2*math.log(mu2-mu1)
elif mu1 < mu2:
    s = math.log(n1)+math.log(n2)+2*math.log(mu1-mu2)
...
```

　無事に解決できました。下の写真は、プログラムを実行した結果です。
![otsu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/95a45638-8183-8cad-d0f3-5f7fed18abb8.jpeg)

　また、閾値の値も79（OpenCVは閾値以下、このプログラムは閾値未満で二値化している）となり、プログラミングが正常に動くことも確認できました。
　最後に、一番目と二番目では、圧倒的に前者の方が簡単ですが、面白そうだったので後者も載せました。

#おわりに
　型がずれてしまったのが問題発生の要因だと考えられます。Pythonで画像処理を行う際はよく型に苦しめられるので、良い勉強になりました。

　最後までご覧いただきありがとうございました。感想・ご指摘等ありましたら宜しくお願いします。

#参考URL
[1]https://algorithm.joho.info/programming/python/opencv-otsu-thresholding-py/
[2]https://jakevdp.github.io/PythonDataScienceHandbook/02.01-understanding-data-types.html
Wordpress プラグインを使わずカスタムMetaBoxを作成する方法

metaboxはカスタムフィールドの強化版みたいな感じ。デフォルトのカスタムフィールドはkeyに対して値を入力するだけだが、metaboxを使うことでカレンダーや画像の選択、セレクトボックスなどのフォームを利用できるようになる。

一番簡単に実装するなら以下のようなプラグインを使う。ここではプラグインを使わず実装する方法をまとめる。

- [Advanced Custom Fields](https://wordpress.org/plugins/advanced-custom-fields/)
- [Meta Box](https://wordpress.org/plugins/meta-box/)

## カスタムMetaBoxの作り方
metaboxを作るのに必要なのは３つの関数。１つのmetaboxで複数のフォームを作成することも可能。

- add: metaboxの定義
- save: データの保存
- html: フォームの定義

```php
function my_custom_meta_box_add()
{
  add_meta_box(
		'post_meta_box_id',          // Unique ID
		'メタボックスのタイトル',     // タイトル
		'my_custom_meta_box_html',   // フォーム関数の呼び出し
		'post',                 // 投稿タイプ
    'default'         // 表示する位置
	);
}

function my_custom_meta_box_save($post_id)
{
  if (array_key_exists('my_custom_meta_box_field', $_POST)) {
    update_post_meta(
      $post_id,
      'my_custom_meta_box_key',
      $_POST['my_custom_meta_box_field']
    );
  }
}

function my_custom_meta_box_html($post)
{
  $value = get_post_meta($post->ID, 'my_custom_meta_box_key', true);
  ?>
  <label for="my_custom_meta_box_field">メタボックスのラベル</label>
  <select name="my_custom_meta_box_field" id="my_custom_meta_box_field" class="postbox">
    <option value="">カラーの選択</option>
    <option value="red" <?php selected($value, 'red'); ?>>Red</option>
    <option value="green" <?php selected($value, 'green'); ?>>Green</option>
  </select>
  <?php
}

// metaboxの定義
add_action('add_meta_boxes', 'my_custom_meta_box_add');
// metaboxのデータ保存
add_action('save_post', 'my_custom_meta_box_save');
```

## カスタムMetaBoxのフォームの表示と保存
`add_meta_box()`で定義した投稿タイプに自動的に表示される。

<img width="744" alt="metabox-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549249/aab0ac02-82b6-6f9c-d5d6-215a7a62de3b.png">


表示する位置はデフォルトでカスタムフィールドの下、`side`に設定すると、カテゴリやアイキャッチのあるサイドバーに表示される。

データはfunctions.phpで`save_post`のフックを入れておくことで、記事を保存したり更新したりした際に一緒に保存されるようになる。

## カスタムMetaBoxのデータをテンプレートに表示
テンプレートにmetaboxのデータを表示するには、カスタムフィールドと同じ方法で良い。

```php
get_post_meta($post->ID, 'my_custom_meta_box_key', true);
```

記事ページでの実装例

```html
<ul class="nav">
  <li>投稿日: <?php echo get_the_date('Y-m-d'); ?></li>
  <li>カラー: <?php echo get_post_meta($post->ID, 'my_custom_meta_box_key', true); ?></li>
</ul>
```
活動記録(2020.3.15)

#今週やったこと
・3月の繁忙期に一旦キリがついた…(本決算対応地獄前の静けさ…)

・Classmethodブログの***『CircleCI+ECS+ECR環境でDockerコンテナのCD(継続的デプロイ)環境を構築する』***
https://dev.classmethod.jp/cloud/circleci-ecr-ecs-1/
が手頃そうだったのでやってみたが後編のデプロイで詰まった…。
CircleCIではSuccessedと表示されるがページが表示されない。
ここでハマっていても仕方がない(超繁忙期の4月まで時間がない…)のでさっさとポートフォリオ開発へ。

・その後Docker+Railsでの環境構築が何とか完了。ようやく本格的なアプリ開発へ。この辺は備忘もあり別記事へ。（デプロイ周りの環境構築は上記のこともあり後回し。）
***Gitでブランチを切って作業する事によってとにかく作業効率がアップした。Udemyの『もう怖くないGit！チーム開発で必要なGitを完全マスター』が非常に活きた。Git万歳。***

・***『DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive』***
https://www.slideshare.net/TokorotenNakayama/dxdevopstechlive
を見て感銘を受ける。DevOpsを進めていく事はとても興味深くやりがいがありそうだけど、事務管理系と共通するような組織運用上のジレンマを抱えているんだなぁと。

#課題・不明点
・Dockerコンテナ・イメージの掃除を定期的に行う必要がある。
・ルート、ポート、DNS等ネットワーク周りの知識が弱い→基本情報技術者テキスト
・データベース周りの知識が不足している。
・AWSは公式のレクチャーを見るべき。
・デプロイはCircleCIではなくGitHubActionsを採用するのもいいかも。

docker-compose環境下で再びこの画面へ。感動。
<img width="1022" alt="スクリーンショット 2020-03-14 1.37.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561657/05fdbd8b-729e-d0d6-afd6-d15396170870.png">
Railsポートフォリオ環境構築備忘メモ(参考にした記事とか)

#Railsポートフォリオ環境構築備忘メモ
環境構築で行った手順を忘れてしまいそうのでメモしておく。
(Docker環境構築もサーバーまでは正常に立ち上がったが、結果的にDocker周りのエラーを連発し、初学者の自分ではエラーの切り分けが困難なため、一旦ローカルでの開発に環境を戻した。
下部にローカルでの環境構築手順も追記。)

#Dockerを使用する場合

前提条件（バージョン）
Ruby 2.7.0
Rails 5.2.4.1
MySQL 5.7
をDocker、docker-composeを使用して環境構築する。

参考にした記事：
①***丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)***
https://qiita.com/azul915/items/5b7063cbc80192343fc0
本当に丁寧。こちらを基本にしてRails.new前の各種ファイルを作成。バージョンと一部内容は変更した。
（自分なりに理解してやりたかったのだが、自分のにわか変更によりハマりまくった…）

②***仁科俊晴氏ブログの『ローカル開発環境の構築不要！Dockerを利用したRailsアプリ起動手順』***
https://nishinatoshiharu.com/docker-rails-server/
こちらも参考にした。かなり分かりやすく入門Dokerや公式ガイドと合わせて理解の助けになったが、複数記事に渡っていてこちらのみを参考にしつつ構築したらハマった。(多分自分のコードが誤っているのだろう）

③***他の方があげているポートフォリオ***

その他気をつけること：
・ymlのインデント周りでエラーを吐きやすい。
・bundle(gem)のバージョン周りでエラーが発生しがちのようだが適当なトラブルシューティングに辿り着けないとハマる。***(対策を考えておく。)***
・Dockerコンテナやイメージが散らかるので定期的に掃除しておく。

#ローカルで環境構築する場合

ワイ、いきなりdocker-compose経由での環境構築から始めたためローカルで始める方法を知らなかった（オイ）。
入門書と色々条件が違い、エラー祭りだったがこれまでの知識（と先人の知恵）を動員したら割とすんなりできた。(Docker周り以外は上の環境と同じ)

6系のエラーを避けるため安定版の5系をバージョン指定する。

```
rails _5.2.4_  new . -d mysql
```

(Gem::GemNotFoundException)長々としたエラーが出るので以下を実行。

```
gem install bundler
bundle install
```

更に怒られて以下を実行しろと表示されるので実行。

```
bundle update
```

mysqlサーバーを立ち上げる。
記事や入門書ではなぜかこの工程がカットされているがよく分からない。
mysqlサーバーが立ち上がっていない状態でrails db:createしてもエラーが起こる。

```
mysql.server start
```

DBを作成。

```
rails db:create
```

railsのサーバーをバックグラウンドで立ち上げる。
(-dを付けてバックグラウンド実行しないと再度ターミナルを立ち上げることになる。)

```
rails s -d
```

localhost:3000を確認。
<img width="1021" alt="スクリーンショット 2020-03-21 22.04.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561657/4de0947c-e3e9-52a8-887b-0788bb7e48e6.png">
Bracketsでmdファイルをプレービューする

#プラグインをインストール
Bracketsのウィンドウの右側にあるブロックのようなアイコンをクリックしてプラグインのウィンドウを開きます。
<img width="499" alt="スクリーンショット 2020-03-16 0.32.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/c6b17565-d2bf-b661-7eb9-32549d7e62b4.png">
markdownと検索して、Markdown Previewを探してインストールします。
<img width="754" alt="スクリーンショット 2020-03-16 0.35.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/d9096619-8b90-17c9-62ae-ee523e62113b.png">

#mdファイルを作り、プレビュー
mdファイルを作り、ウィンドウ右側に追加されるMarkdown Previewのアイコンをクリックすると下にプレビューが表示されます。
<img width="795" alt="スクリーンショット 2020-03-16 0.39.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/0a911023-7f19-81e9-693a-f61cf12f90d1.png">
ディープラーニングG検定 用語を集めてみた [初版：列挙編]

#この記事、何?
珍しく、コードを書かない投稿です。
結局G検定を受けなかったので、次回は受けようかと思って用語の整理をしようと。
で、問題集を見たりあれこれしてみて、「自分の言葉で説明できない用語」をとりあえず集めてみた、というところ。

これから少しずつ用語解説を投稿しようかという前振り。

#つまり?
ここ数日、ねっと見てみたりして集めた言葉でちゃんと理解していない言葉を集めたリスト。
・・・まあ・・・単に並べただけ。。。

#列挙
AlexNet
Arxiv
AutoEncoder
BERT
BigGAN
CNN
DARQ
DENDRAL
DNN
Deep Learning
Discriminator
ELIZA
ELMo
ENIAC
Elastic Net
FFNN
Fine-Tuning
F値
GAN
GDPR
GPGPU
GRU
Generator
GoogLeNet
He
ICCC
LDA
LSTM
Lasso
Maas
Memory Networks
Mini-Max
PARRY
Pre-training
Q学習
RFC439
RNN
ReLU
ResNet
Ridge
SAE J3016
SHRDLU
STRIPS
Squeeze and excitation
TF-IDF
TPU
Transformer
VAE
VGG16
VQ-VAE-2
Watson
XLNet
Xaas
Xavier
attention
bidirectional transformer
fastText
seq2seq
stacked autoencoder
word2vec
x-means、Ward法
イアン・グッドフェロー
インダストリー4.0
エキスパートシステム
クラスタリング
クラスター分析
クロスバリデーション
グリッドサーチ
シンギュラリティ
ジェフリー・ヒントン
ジョン・サール
ステップ関数
セマンティックセグメンテーション
ソフトマックス関数
ダートマス会議
トマス・ミコロフ
ノーフリーランチ定理
バギング
バッチ正規化
ヒンジ損失関数
ブートストラップサンプリング
プーリング層
ベイズ最適化
マルチモーダル
ミニバッチ学習
モラベックのパラドックス
ヤン・ルカン
レイ・カーツワイル
一気通貫学習
中国製造2025
中間層の活性化関数
事前学習
交差検証
内部にループ構造
内部に閉路
再帰型ニューラルネットワーク
分散表現
前の中間層の状態
協調フィルタリング
周辺
形態素解析
意味ネットワーク
探索と推論
推計統計
構文解析
機械学習に必要なデータはモデルのパラメタ数の10倍以上であるという法則
正規化
正解率
深層信念ネットワーク
深層学習ライブラリ
画像認識
畳み込み層
知識(エキスパート)シ ステム
線形分離可能
自然言語処理
記述統計
識別器
適合率
重回帰分析
音声認識
サブシェルによる実行（および変数更新）

こんにちは。
サブシェルによって実行される場合を簡単にまとめてみました：

1. コマンドを括弧「( )」で囲った場合[^1]。
2. パイプラインの前後。
3. シェルコマンドへ文字列・テキストを渡して実行させた場合[^2]。

#### コマンドグループ（サブシェルではなく元シェルで実行）
これに対して、下記の一塊の実行単位は、そのままでは元シェルで実行されます[^3]。

* コマンドグループ（すなわち brace「{ }」で囲う）
* 関数、
* ```while do 〜 done``` ループ [^4]

### サブシェルによる実行例
パイプラインとコマンドグループとの組み合わせは勘違いしやすかったです。下記例を読み解くと、

```shell
command1; command2; { command3; command4; } | { commmand5; command6; }; command7; command8
```

1. 元シェルで実行されるのは：
   - ```command1, command2```
   - ```command7, command8```
2. サブシェルで実行されるのは：
   - ```command3, command4```
   - ```command5, command6```


### サブシェル内の変数更新
次にサブシェル内の変数更新を考えると、これは元シェルへは伝播しません。下記例で末尾の ```echo $n``` の出力は空となります。

```console
$ unset n; { n=0; printf 'a\nb\n'; } | cat; echo $n
a
b

$ unset n; printf 'a\nb\n' | (n=0; while read -r line; do n=$((n+1)); done; echo $n); echo $n
2

$ unset n; printf 'a\nb\n' | { n=0; while read -r line; do n=$((n+1)); done; echo $n; }; echo $n
2

$ 
```

### 「サブシェル内の変数更新」を回避
元シェルでの変数更新であれば、「サブシェル内の変数更新」を回避できます。下記例は混み入っていますが、```n=0``` は元シェルで実行され末尾の ```echo $n``` の出力は ```0``` となります。

```console
$ unset n; { n=0; printf 'a\nb\n' | cat; } ; echo $n
a
b
0
$
```

#### 「ヒア・ドキュメント」の利用
同様に元シェルでの変数更新とするために、「ヒア・ドキュメント」を利用する方法もあります（パイプラインを回避できます）。下記例で末尾の ```echo $n``` の出力は ```2``` となります。

```console
$ unset n; { n=0; while read -r line; do n=$((n+1)); done << EOT
 $(printf 'a\nb\n')
EOT
 echo $n; }; echo $n
2
2
$
```

もしくは、POSIX shell ではなく、Bash などでは Process Substitution を利用できます：

```console
$ unset n; { n=0; while read -r line; do n=$((n+1)); done < <(printf 'a\nb\n'); echo $n; }; echo $n
2
2
$
```

[^1]: 括弧「( )」で囲ったサブシェル実行の標準出力を得る ```$(...)``` の形式も同様です。しかし ```$((...))``` の形式は元シェルで実行されます（「[サブシェル内における変数](https://qiita.com/kkdd/items/7a21cdf4b58444dd4403)」）。

[^2]: シェルスクリプトを実行させたり、```sh -c 'n=0; echo $n'``` のような実行例を指します。これに対して ```source``` コマンドを用いて動かすと、元シェルで実行されます。

[^3]: これは、括弧「( )」で囲った場合と似ていますが、サブシェル扱いとなるわけではありません。

[^4]: 例えば、```printf 'a\nb\n' | while read -r line; do echo $line; done```。
Sequel ProでEC2サーバーのDBに接続する方法

#はじめに
本番環境のデータベースの状態を確認するために、わざわざEC2サーバに接続してSQL文で中身を確認してると時間がかかる…
Sequel Proで簡単に確認できるよ！と聞いて実践してみたものの、かなり時間がかかってしまったので、備忘録として作成しました！

## 接続手順
・AWSを使用し、EC2サーバーでMySQLの設定まで終了している状態を前提条件とします。

<img width="1440" alt="スクリーンショット 2020-03-15 17.43.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526620/46780e03-4fa2-9c33-05b8-9369c4770652.png">


### 1.接続先入力画面で接続先を追加
・接続先入力画面左下の「＋」から接続先を追加。名前の指定はないのでアプリ名等、自由に設定して構いません。

### 2.「SSH」を選択

### 3.各内容を入力
|     項目     | 値|　　備考　　
|:--------------:|:-:|:-:|
| MySQLホスト|127.0.0.1|サーバーに接続してからMySQLに接続する為､127.0.0.1
| ユーザー名|root|デフォルトだとroot
| パスワード|本番環境MySQLで設定したパスワード |MySQLのrootユーザーのパスワード
| データベース|               |空白でもOK！
| ポート|3306           |3306を入力
|      |               | 
| SSHホスト|11.111.11.11   | Elastic IPを記述
| SSHユーザ|ec2-user        | AWSの場合デフォルトがec2-user
| SSHパスワード |.pemファイルを選択 | 以下を参照
| 　SSHポート         |22          　　| デフォルトは22。（セキュリティグループ→インバウンドでポート範囲を確認できます）

#### SSHパスワードについて
SSHパスワード＝AWSでEC2インスタンスを作成した際に設定したキーペア名を入力すれば良いっ！と思っていましたがここは入力欄右側の**鍵マーク**からダウンロードしたキーペア(.pemファイル)を選択する必要があります！
もう一つ注意したいのが、選択するキーペアは**.sshディレクトリ**に配置されているものでなければいけません！
そもそもEC2サーバーの理解が足りていませんでしたが、今思うとEC2サーバーに入るためにはダウンロードしたキーペアを.sshディレクトリ以下に移動させて

```
ssh -i キーペア名.pem ec2-user@Elastic IP
```
のコマンドでログインするのでダウンロードディレクトリにあるキーペアを選んでも接続できないですよね:sweat_smile:

### ４.接続テストを実行
SSHポートまで入力ができれば「接続テスト」ボタンを押して成功したら「接続」ボタンでDBを確認できます！
PythonでABC158のA~Cを解く

### はじめに
忘れてて参加できなかったので解く。深夜テンションで解いた + 深夜に書いてるので、文が崩壊しているかもです。

### A問題
[問題](https://atcoder.jp/contests/abc158/tasks/abc158_a)

**考えたこと**
Sの中にあるA,Bを数えればいい。全てA,Bであるときだけ、Noにすればいい。。str.countでカウントしてifにつっこんだ。

```python
s = str(input())
station_a = s.count('A')
station_b = s.count('B')
if station_a != 3 and station_b != 3:
    print('Yes')
else:
    print('No')
```

### B問題
[問題](https://atcoder.jp/contests/abc158/tasks/abc158_b)

**考えかた**
A+Bの組がNに何個あるかを数えればよい。$A+Bの組の数*A$だけでは、余りの個数を含んでいません。ですので$N % (A + B)$で余りを計算してそれを足します。と思ったら余りが、Aよりも大きくなる場合もあるのでmin(a,(n % (a + b)))を足してます。

```python
n, a, b =map(int,input().split())
p = n // (a + b)
ans = a * p + min(a,(n % (a + b)))
print(ans)
```

### C問題
[問題](https://atcoder.jp/contests/abc158/tasks/abc158_c)
1WA
**考えたこと**
普通に計算しました。1WA出た理由は、for文のstopを1001ではなくて1000としたからです。このせいで、どちらかが答えが1000になるケースに対応できませんでした。みんなもforのstopには気を付けよう。

<追記>丸めると1009*0.10も100になるので、1010にしないといけない

```python
import math
a, b = map(int,input().split())
ans = []
for i in range(1010): #ここを1000にしてた
    price_8 = math.floor(i * 0.08)
    price_10 = math.floor(i * 0.1)
    if price_8 == a and price_10 == b:
        ans.append(i)

if len(ans) != 0:
    print(min(ans))
else:
    print(-1)
```

### まとめ
簡単なABCくらいなら深夜にでも解けることが分かった。おやすみなさい
コードからCPUの命令まで（2023/1/2色々と編集追加）

# コードがどうやって機械語に翻訳されているの？の忘備録
高水準言語（Cとか）→コンパイラに通す（コンパイルする）→
→アセンブリプログラム→アセンブラに通す（アセンブルする）→
→オブジェクトプログラム→リンカに通す（リンク、連結編集とも呼ぶ）→
→実行形式
・コンパイルツールをコンパイラ
・アセンブルツールをアセンブラ
・リンクツールをリンカ
と呼ぶ。

**命令セット**とは、**CPUが使用できる命令の集合**（一覧表）のこと。
命令の集合とは例えば、入出力のニーモックはINとOUTがあり、その命令コードは0000 0010と0000 0011のような組み合わせ表のことを指している。

**CPUに対する命令のことをオペコード**と呼ぶ。
また、オペコードが動く先（目的）のことをオペランドという。
**ニーモックとは**、**人間がわかりやすく見えるようにCPUに対する命令にあだ名**（ニックネーム）をつけたもの。当然ニックネームなのでメーカーによってバラバラ。
例えば、CASL IIの場合、LDというニーモックはLoadを指すのでメモリからCPUへデータを読み込めという命令と定義されている。
上記を総合した例として、オペコード（ニーモック）がLD、オペランドがGG1,Aと表記されれいた場合の意味合いは、GG1にA番地のデータを読みだせとCPUに命令していることになる。
asdf-vmを使おう

## asdf-vmとは？

https://github.com/asdf-vm/asdf

プログラミング言語及びツールのバージョン管理ツールです。類似ツールに `anyenv` があります。 `anyenv` と比較すると、下記の点で優れています。

- `direnv`や`sops` 等のツールもプロジェクトごとにバージョン管理できる→READMEに記載するインストールセクションをすっ飛ばせる
- バージョン管理したいツールはプラグインにより拡張できる
    - プラグインはURL指定できるので、
- `asdf global` コマンドを使うと、ユーザーグローバルにツールのバージョン管理ができる ($HOME/.tool-versionsに永続化されているので、dotfilesと相性がいい)

## 使い方

### インストール

基本的に https://asdf-vm.com/#/core-manage-asdf-vm を読んでインストールすればOK。 macOSでhomebrew を使っている場合は

```shell
brew install asdf
```

でインストールできます。

Gitのみでもインストールできて

```shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
cd ~/.asdf
git checkout "$(git describe --abbrev=0 --tags)"
```

としましょう。

### shellに読み込ませる

https://asdf-vm.com/#/core-manage-asdf-vm?id=add-to-your-shell

asdf環境をセットアップするため、homebrewを使っていてbashを使っているユーザーであれば下記を叩きましょう。

```shell
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile
echo -e "\n. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash" >> ~/.bash_profile
```

zshやfishをお使いの場合は上記のリンクにまとまっているのでそちらを参照してください。

#### プラグイン共通で使うパッケージ

`openssl`や`curl`など、プラグイン共通で使うパッケージがあるので下記をインストールしましょう。

```shell
brew install \
  coreutils automake autoconf openssl \
  libyaml readline libxslt libtool unixodbc \
  unzip curl
```

### プラグインの追加/削除

利用可能なプラグインの一覧は

```shell
asdf plugin list all
```

で確認できます。例えば`ruby`の場合、`anyenv`と違って内部的に `rbenv` を使っているわけではありません。プラグインごとに必要な依存ツール等あるので、適宜プラグインのREADMEを参考にしてください。

#### 例: nodejs pluginの場合

https://github.com/asdf-vm/asdf-nodejs

内部ではgpgを使って問題のあるバージョンではないことを検証しています。そのため、

```shell
brew install gpg
```

と叩いてgpgをインストールしておきましょう。

```shell
asdf plugin add nodejs
bash ~/.asdf/plugins/nodejs/bin/import-release-team-keyring
```

というように、nodejsのプラグインをインストールした後、nodejsのリリースチームのキーリングを取り込む必要があります。

### ツールのインストール

`asdf install <plugin> <version>` と叩くと指定したツールのバージョンがインストールされます。

利用したいディレクトリで

```
asdf local <plugin> <version>
```

とすると、そのディレクトリ配下に `.tool-versions` ファイルが生成され、プラグインとバージョンが保存されます。

#### `.tool-versions` vs `.node-version` etc

最近のバージョンの `asdf` は `.tool-versions` ファイルに利用するツールとバージョンを記述するようになりました。もし `.node-version` や `.ruby-version` など他のツールとの互換性を大事にする場合は

```:$HOME/.asdfrc
legacy_version_file = yes
```

と設定しましょう。

## プラグインの作成方法

調査がてら、fzfのプラグインがなかったので作成してみました。

[kompiro/asdf-fzf](https://github.com/kompiro/asdf-fzf)


[公式ドキュメントはこちらです。](https://asdf-vm.com/#/plugins-create)

さて、プラグインの実態は特定のファイルを含んだ Git リポジトリです。プラグインを追加するとき

```bash
asdf plugin add <plugin-name> <git-url>
```

というように`plugin-name` の他 `git-url` を指定できますが、ユーザーがcloneできればよいのでプライベートリポジトリも利用できます。

実装すべき内容は下記の2つです。

1. bin/list-all: list-all はインストール時に指定可能なバージョンを指定するためのスクリプトです。バージョン番号をスペース区切りで標準出力すると、呼び出し元のプロセスが良しなに開業して表示します。
2. bin/install: install は実際のインストールスクリプトです。 downloadスクリプトを別に分離することもできるようですが、多くのプラグインでは install 内でダウンロードも行っています。

GitHubを利用しているのであれば、GitHub API 経由でタグやリリースの一覧を取得し、それに添付されている成果物をダウンロード後、ソースしかなければビルドする、という流れをとっているものが多いです。

### まとめ

asdf を使うと、プロジェクトごとに異なるバージョンのツールを切り替えながら使えます。コンテナ化によりプロジェクト専用の環境を用意することもできますが、コンテナにはまだまだなれないメンバーもいる状況では、`asdf`は非常に便利ではないでしょうか。
CircleCI+ecspressoでECSにデプロイする

## ECSのデプロイ
ここ数年、基本的にECSを利用しているのですが、デプロイをどうやって行うかでいつも迷います
GitHubでデプロイ用のブランチ(たとえば`production`ブランチ)にマージされたらデプロイを行いたいとして、手段はかなりいろいろあると思うんですよ
僕が今までやってきたのだと、
AWSのCodePipelineを使ってイメージのビルド=>タスクの更新=>サービスの更新
だとか
CircleCIのOrb(aws-ecr/aws-ecs)使ってデプロイ
とか

いずれもそんなに大きな不満はないです
**最初に設定を理解するのが難しい**、くらいで

しかし「もっとわかりやすいのあるんじゃないか」くらいの気持ちで見ていたら、たまたま[ecspresso](https://github.com/kayac/ecspresso)を見つけたので今回試してみることにしました

## [ecspresso](https://github.com/kayac/ecspresso)
面白法人カヤックさんが作ったツールだそうです
Golangで書かれている点が個人的には好きです

使い方もとてもシンプルで、予め`.aws`ディレクトリに`config`的な、awsと疎通できる状態にしたうえで

```shell
$ ecspresso init --region ap-northeast-1 --cluster クラスタ名 --service サービス名 --config hogehoge.yaml
```

と、initコマンドを叩くと、指定したクラスタ/サービスの設定を引っ張ってきてくれます
`hogehoge.yaml`はこんな感じ

```yaml
region: ap-northeast-1
cluster: クラスタ名
service: サービス名
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
timeout: 10m0s
```

`hogehoge.yaml`と一緒に降ってくる`ecs-service-def.json`がサービス定義、`ecs-task-def.json`がタスク定義になるので、変更したいときはこの辺を適宜変えてあげればいいって寸法です

デプロイする際は

```shell
$ ecspresso deploy --config hogehoge.yaml
```

とdeployコマンドを実行するだけです！
シンプル！わかりやすい！好き！！

## CircleCIで実行しよう
### プラン
なるほど、これだけシンプルならあとはこれをCircleCIで実行してあげるだけですね :thinking: 
[ちゃんとOrbありました](https://circleci.com/orbs/registry/orb/fujiwara/ecspresso)

流れとしては

```
GitHubで対象ブランチにマージされる
↓
CircleCIでテスト実行
↓
CircleCIでイメージビルド&ECRにpush
↓
CircleCIでecspresso使ってdeploy
```

これでいきましょう

イメージビルドに関しては、aws-ecrのOrb使うのが手っ取り早いのでそうします
その後は上述のecspressoのOrb使ってdeployを実行しましょう

### .circleci/config.yml
できあがったconfigはこんな感じ

```yaml
version: 2.1

orbs:
  aws-ecr: circleci/aws-ecr@6.7.1
  ecspresso: fujiwara/ecspresso@0.0.5

executors:
  docker_build:
    machine:
      docker_layer_caching: true

  general:
    docker:
      - image: cimg/base:stable

workflows:
  main:
    jobs:
      - test

      - aws-ecr/build-and-push-image:
          name: push app image
          executor: docker_build # DLCオプション付けたexecutorつくっておく
          requires:
            - test
          dockerfile: Dockerfile
          repo: "hogehoge"
          tag: "fuga"

      - deploy:
          requires:
            - push app image

jobs:
  test:
    # 今回の本題と関係ないので省略

  deploy:
    executor: general # 軽いイメージのexecutor用意しておく
    steps:
      - checkout
      - ecspresso/install # Orbはecspressoを簡単にinstallをしてくれる
      - run:
          command: |
            # deployの前にmigrateしたいんや
            ecspresso run --config hogehoge.yaml --task-def=ecs-task-def-migrate.json
            ecspresso deploy --config hogehoge.yaml

```

しれっとmigrateしてるのがポイント←
ecspressoはrunコマンドを使えばちょっとtask流したいだけみたいなのも簡単にできます
今回はmigrate用のタスク定義.json(Railsなら`bundle exec rails db:migrate`コマンドになってるようなやつ)を用意しておいて、それを実行することでmigrateを済ませてからdeployする流れになってます

あ、ところでCircleCI上で実行する際は`AWS_ACCESS_KEY_ID`と`AWS_SECRET_ACCESS_KEY`の環境変数を設定するのをお忘れなく

## 感想
CircleCI+ecspressoで簡単にデプロイできちゃったので気持ちよかったですし、すごくシンプルでわかりやすくて使いやすかったです
まだローリングデプロイとか試してないので、今後はその辺を使ってみたいところ
もちろんCI上ではなく、手元でECSゴニョゴニョしたいときに使うコマンドとしてもかなり使いやすくていいなと思いました
自分はECS操作はecspressoメインでもいいなって思いました

以上、なにかの参考になれば幸いです :bow:
Ruby, Rails たまに使うけどすぐ忘れるやつ

RailsとかRubyの過去に学んだものを適当に残しておく（最近はRailsもRubyも触ってない・・）
思い出したら随時追加する。

# rakeタスクをrails consoleから実行する

```ruby
require 'rake'
Rails.application.load_tasks
Rake::Task['hoge:huga'].execute
# 引数つけて実行
Rake::Task["hoge:huga"].execute({ hogege: 'hugaga' })
```

# bundle でバージョン指定してインストール

```bash
# bundle installするときはGemfile.lockのバージョンを確認してから実行
bundle  _1.16.1_ install
```

# rakeタスク内のメソッドはObjectクラス直下に作られちゃう

https://blog.freedom-man.com/rake-definemethod-namespace

namespace配下にメソッド書いていると思っていてもObjectクラス以下に作られるのでバグの原因になるかもね

# SQLをrails consoleから実行

```ruby
sql="SELECT * from hoge);"
result=ActiveRecord::Base.connection.select_all(sql).to_hash
```

# rspecの書き方で参考になるページ

http://www.betterspecs.org/jp/
https://speakerdeck.com/willnet/clean-test-code-revised

# ruby引数処理

わかりやすい記事
キーワード引数をhashとして受け取る方法とか
https://qiita.com/metheglin/items/306e81c95f8a5cdea296

# privateメソッドをrails consoleから呼び出す

```ruby
# User.find_by(id: 1)は引数
# Hugaはクラス, hoge_private_methodはHugaクラス内のプライベートメソッド
Huga.send(:hoge_private_method, User.find_by(id: 1) )
```

# CSV書き出し

使い捨てコード書くときによく使う

```ruby
CSV.open('/tmp/hoge.csv','wb') do |csv|
   csv << [1,2]
end
```

# テキスト読み込み

```ruby
File.foreach("tmp/hoge.txt"){|f| s << f.chomp.to_i}
```

# rakeタスクの確認

```ruby
bundle exec rake -vT
```

# rails consoleでexplainを実行

https://railsguides.jp/active_record_querying.html#explain%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B

```ruby
User.where(id: 1).joins(:articles).explain
```

# ActiveSupportのString拡張(活用形)まとめ

https://qiita.com/hana-da/items/ec9ac3e1c8803f5fa1fc

```ruby
"Invoice".tableize     # => "invoices"
```

# メール送信

手元のメール送信確認はmailcacherを使ったことがある
https://qiita.com/pocari/items/de0436c39ffc65647cf0

```ruby
ActionMailer::Base.mail(to: "to@example.com", from: "from@example.jp", subject: "題名", body: "本文").deliver_now
```

# メソッドの定義場所を探す

https://docs.ruby-lang.org/ja/latest/method/Method/i/source_location.html

```ruby
Hoge.method(:huga).source_location
```

# sqlファイルをrails dbに食わせる

```bash
bundle exec rails db < my_db.sql
```

# 日付と時刻を扱う

https://qiita.com/prgseek/items/c0fc2ffc8e1736348486

```ruby
t = Time.parse("2017/04/25 19:23:55"); p t  # 2017-04-25 19:23:55 +0900
```

# クエリ高速化

わかりやすい, Rails6はあまり知らない
https://texta.pixta.jp/entry/2016/02/10/180244
https://qiita.com/leon-joel/items/f26556c9e56833983856

# rails consoleの再読み込み

```ruby
reload!
```

# find_each

わかりやすかった
https://blog.toshimaru.net/rails-find_each/#order%E4%BB%98%E3%81%8D-find_each

# スクリプト実行

Rails機能を使いつつ単独のスクリプトを実行する。

```bash
bundle exec rails runner hoge.rb 'huga'
```

# pry

わかりやすい
https://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f
https://www.slideshare.net/cuzic/pry-repl

# FactoryBotをrails consoleから使う

https://qiita.com/ganta/items/616bcb11ee7833b24a8a

# アクションの前後にフィルタ/処理を挟み込む

https://ruby-rails.hatenadiary.com/entry/20141129/1417223453

# BundlerでGemfileを変更せずにローカルの:pathのgemを使う

https://qiita.com/quattro_4/items/8ec707d527d64e109ee0
Javascript 覚書

## JavascriptでTinderのスワイプ自動でやるための基本操作

1. 基本

- くり返し系
    - setIntervalとsetTimeout
    
```javascript:hoge.js
function hoge(){
 console.log('hoge');
}

setInterval(hoge(), 1000)
// 1000m秒間隔でhoge()を永遠にクリア返す

setTimeout(hoge(), 1000)
// 1000m秒間隔でhoge()を一回くり返す
```
- 要素取得系（セレクタ）

```javascript:hoge.js
Document.getElementBy~
//~はIDとかclassNameとか
Document.querySelector("~")
//Jqueryみたいにかける

getAttribute
//アトリビュート指定。（例：aria-label="いいね"のaria-label部分とか）


//Jqueryが埋め込まれてるサイトであれば、
$('')
//でいろんな要素取れる
//http://www.hp-stylelink.com/news/2013/11/20131122.php

//基本、要素に対してクリック
click();
```
追記
2020/3/15現在、setIntervalとかが禁止されていてできない。多分。
２週間でAWS認定ソリューションアーキテクト-アソシエイトに合格したので、合格までの目安と知識をまとめてみます

# はじめに
こんにちは、[Tamari](https://twitter.com/Tamarin_3)と申します。
この度、AWS認定ソリューションアーキテクト-アソシエイト試験に合格したので、（１回落ちて、２回目での合格）合格までの目安などや必要となる知識をまとめられたらと思います。

# 前提
・未経験

私自身、社会人15年目ぐらいになりますが、新卒の会社と、直近の２年間くらいしかIT業界におらず、AWSというサービスの概要は知っていましたが、実際には操作したこともなく、細かいEC2、S3等のサービス名は知らず、未経験となります。

#やったこと
##全体像をつかむ
未経験でサービス名とか全くわからない状態だと、問題読んでもさっぱり何を言っているのかわからないので、まずはUdemyと黒本を用いてサービス全体を掴むような学習をしました。

###Udemy
Udemyでは以下のコンテンツで学習をしました。22時間とありますが、動画の時間が22時間なので、ハンズオンを合わせると、動画を1.5倍速でやったとしても、30時間以上はかかるかと思います。
[・これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け22時間完全コース）
](https://www.udemy.com/course/aws-associate/)

###黒本
黒本も全体的なサービスの説明や、試験で問われる可用性などの観点事に章がまとまっているので、読んで参考にしました。上記のUdemyコンテンツをやり終えた後だと、比較的内容がスッと入ってきました。また、模擬テストもついてるので繰り返し解きました。
[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/gp/product/4295005495?pf_rd_r=C0DATWS7GXVX7SS5A5FN&pf_rd_p=3d322af3-60ce-4778-b834-9b7ade73f617)

##問題演習
問題演習を行ったのは、以下の４種類です。
主観ですが、難易度を１〜３に分類してみました。
No.1〜3を２回ずつくらい解いた時点で、1回目の模擬試験を受けたのですが、700点で不合格でした。。（おそらく後１問正解していれば合格。。）

|No |模擬試験名  |難易度  |テストの数　|
|---|---|---|---|
|1 |黒本  |1.5  |1
|2 |Amazon公式  |1  |1
|3 |これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け22時間完全コース(Udemy) |2 |3
|4 |AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（5回分325問） (Udemy)|3 |4

###１回目の本試験受験時の習熟度と結果
|No |模擬試験名  |１回目正答率  |2回目正答率　|
|---|---|---|---|
|1 |黒本  |49%  |83%
|2 |Amazon公式  |72%  |-
|3 |これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け22時間完全コース(Udemy)模擬試験① |35% |64%
|4 |これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け22時間完全コース(Udemy)模擬試験② |41% |75%
|5 |これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け22時間完全コース(Udemy)模擬試験③ |52% |75%

<img width="789" alt="スクリーンショット 2020-02-23 8.52.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603100/f1dfabc8-637b-7e3c-0121-17a8842f9ff7.png">

模擬試験は受験後、解説を理解し、繰り返し受験することで、点だった知識が徐々に線になっていく感覚がありました。学習を始めてから１週間後に試験を受けましたが、700点で不合格でした。。
５種の模擬試験で、7割程度正解できるようになっていましたが、試験問題は多種多様で、模擬試験よりも難しいなと感じた問題もありました。

###2回目の本試験受験時の習熟度と結果

後ほど、まとめられたらと思います。
試験については、無事合格していました。

<img width="791" alt="スクリーンショット 2020-03-14 14.54.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603100/7992bba6-7f98-7605-c836-8af4d3dac681.png">

#必要となる知識
合格までに必要となる知識を順次まとめて行ければと思います。

##AWSサービス全体の概要

###AWS Well-Architectedフレームワーク
AWSがサービス開始依頼、多くのユーザーにクラウドサービスを提供してきた経験をベストプラクティス集として整理したもの。

以下の５つの観点がある

+ 運用上の優秀性
+ セキュリティ
+ 信頼性
+ パフォーマンス効率
+ コスト最適化

[AWS Well-Architectedフレームワーク](https://aws.amazon.com/jp/architecture/well-architected/)

###AWSインフラストラクチャの概要

■リージョンとAZ

AWSは世界中にリージョンとアベイラビリティゾーン（AZ）がある。
リージョンは世界中に20箇所程度あり、そのリージョンの中に複数のAZがある。
各AZ間は、冗長化された高速なネットワークで接続されており、それぞれの地理・電源・ネットワークが独立した施設で構成されているため、天災などの場合も、他のAZでシステムを継続することが可能。

■エッジロケーション

Amazon CloudFrontのコンテンツやAmazon Route 53のDNSサービスを利用するためのデータセンターでAZより多い。ユーザーは、地理的に近いエッジロケーションから配布されるコンテンツを利用することで、低レイテンシーで効率よくコンテンツを配布可能。

■AWSのサービス範囲
AWSサービスの範囲は以下の３種類に分類できる。

|サービス範囲|説明|サービス例|
|:---|:---|:---|
|グローバルサービス|リージョンに依存しないサービス|IAM,CloudFront,Route53|
|リージョンサービス|特定のリージョン内でのみ利用するサービス|VPC,DynamoDB,Lambda|
|アベイラビリティゾーンサービス|特定のAZ内で利用するサービス|VPCのサブネット,EC2,RDS|

##長くなりそうなので、順次追記していきます。
Codeforces Round #587 Div.3 D. Swords : GCD

https://codeforces.com/contest/1216/problem/D

# 概要
- n種類の剣がある
- 今、各種類の剣は[a1, a2, ..., an]本ある
- この件は最初、x本ずつあったはずである。しかし、y人の盗賊が1人につき、ある種類をz本盗んだことが分かった。このx,y,zは与えられない
- 尚、盗賊はある1つの山には一切手を付けていない
- 最小のzとなる、y および zのペアを述べよ

# 考えたこと
まず、1つの山は一切手を付けられていないということから、xは配列aの最大値である。この上で、問題を以下のように読み替える。

- 最初、[x,x,x...x]であった配列がある
- ここから各要素が0にならないようにz回、yを引いたものがaである。
- つまり、$[x - y \cdot z_{1}, x - y*z_{2}, ... , x - y*z_{n}]$であり、各$z_{i}$は0以上であり、この和は$n \cdot x \cdot y$以下である。

例1を例にすると、

- [3, 12, 6]ということは、最初、x本 = max(a) = 12本あったのだから盗まれたのは[9, 0, 6]である。
- y人がどこかの山からz本ずつ盗んだということは、15人で1本ずつ盗んだ可能性もあれば、5人で3本ずつ盗んだ可能性もあり、今回は、zを最小化したい。
- これは、盗まれた本数の9,6の最大公約数に他ならない
- yはそれぞれの盗まれた本数からzを割ったものの総和である

# 実装
```Python

import math
n = int(input())
dat = list(map(int, input().split()))
dat_loss = []
m = max(dat)
nn = 0
for i in range(n):
    if dat[i] != m:
        dat_loss.append(m - dat[i])
        nn += 1
res = 0
for i in range(nn):
    res = math.gcd(res, dat_loss[i])
res2 = 0
for i in range(nn):
    res2 += dat_loss[i] // res
print("{0} {1}".format(res2, res))
```
AtCoderの入力例を一度に試すための1行（Ruby）

AtCoder等のプログラミング問題を解く際、提出前に手元の環境で動作確認すると思う。私の場合は便利な環境を用意できていなく[^env]、代わりに [paiza.io](https://paiza.io/) を利用している[^ver]。

問題には入出力の例が複数与えられているのでなるべく全て試したいが、**入力例をいちいち変えるのが辛い**。自分で例を追加する場合は尚更である。

> 環境を整えてさえいれば、テストの自動生成なども可能なようだが…
>
> [RubyでAtcoderからテストを自動生成するライブラリを作りました - Qiita](/QWYNG/items/0e2e6b72bd1969d0d751)

何とかならないか考えた結果、Rubyにおいて1行で解決する方法を思いついた。

[^env]: 電車の中からタブレットで参加することもあった
[^ver]: 言語のバージョンを合わせられないのでお勧めはしない

## 方法
Rubyスクリプトの最後に以下の1行を追加する。解答のメソッド化などは必要ない。

```ruby
load __FILE__ unless $stdin.eof?
```

あとは入力例を結合して読み込ませれば、全ての出力がまとめて表示される。

【追記】
スクリプト内で `exit` を使う可能性を考慮したより汎用的な方法。Rubyスクリプトの先頭のほう（必ず実行される場所）に以下の1行を追加する。

```ruby
END { load __FILE__ unless $stdin.eof? }
```

### 制限
解答のスクリプト内では「入力終端まで読み込む」ことをしてはいけない。問題に与えられた数字をもとに `#gets` などで**正確な行数だけ取得**しなければいけない。

## 動作原理
単に**同じスクリプトを何度も実行**している。

[`Kernel.#load`](https://docs.ruby-lang.org/ja/2.3.0/method/Kernel/m/load.html) は `Kernel.#require` と異なり、常に指定ファイルを読み込む。指定ファイルとして[自分自身](https://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fvariables.html#pseudo)を与えれば、スクリプトを再び先頭から実行する効果が得られる。あとは無限ループ防止のために「入力終端でなければ」という条件を追加すればいい。

【追記】
`END` を使った方法はRubyの[終了処理](https://docs.ruby-lang.org/ja/latest/doc/spec=2fterminate.html)の仕組みを利用している。「同じスクリプトの実行」を**終了処理の一環**として登録することで、スクリプトの途中で終える場合でも動作する。

## 例
AtCoder Beginner Contest 154 の [A問題](https://atcoder.jp/contests/abc154/tasks/abc154_a) に適用してみる。この問題は入力が3行で与えられる。

```ruby:abc154_a.rb
s, t = gets.split
a, b = gets.split.map(&:to_i)
u    = gets.chomp

if u == s
  a -= 1
else
  b -= 1
end

puts "#{a} #{b}"

load __FILE__ unless $stdin.eof?
```

入力例が2つあるので、それらを結合して与える。

```text:入力例1,2
red blue
3 4
red
red blue
5 5
blue
```

すると、それぞれの結果がまとめて表示される。

```text:出力
2 4
5 4
```

### 制限に違反した場合
解答のスクリプト内で「入力終端まで読み込む」ことをしてしまうと、一度に試すことはできなくなる。提出する分には問題ない。

```ruby:abc154_a.rb
s, t, *ab, u = $stdin.read.split
ab.map!(&:to_i)
ab[u == s ? 0 : 1] -= 1
puts ab * " "

load __FILE__ unless $stdin.eof?
```

```text:出力
3 3 0 0 0 5 5
```
markdown -> docx変換

# markdown -> docx変換

１億煎じくらいの投稿。自分用のメモ。

## ツール

* pandocを使う。  
  1. windows(個人開発、テンプレ作成) -> msiを使ってインストール。場所は[ここ](https://github.com/jgm/pandoc/releases)
  2. Linux(CI用) -> tarの展開。[ここ](https://github.com/jgm/pandoc/blob/master/INSTALL.md)を参照

## 使い方

### テンプレ作り

1. `pandoc --print-default-data-file reference.docx > reference.docx`でテンプレを生成する。
2. テンプレをいじっていく。(テンプレで使われているスタイル以外は認識しなさそうなので、reference.docxの各スタイルをいじっていく。)
> 表はテンプレ化ができないっぽい。ここは諦めるか.... 

### 変換

`pandoc インプットファイル(.md) --reference-doc=reference.docx -o アウトプットファイル(.docx)`

1ファイルずつ変換していくので、CIみたいに一括で変換する場合はシェル化したほうがよさげ。
【WordPress】こんなことかよ、、をなくす豆知識

#経緯
この記事を投稿するにあたって、自分自身がWeb制作をはじめるにあたって、最初にぶつかった見えない壁についてを共有していきたいと思います。
はじめたばかりの頃「あれ！？ここってどうなってるんだ？？」ってところがググってみても意外に見つからなかったりするんですよね。
他の人は当たり前のようにできていることなのかな？なんて思いましたが、自分のメモと同じような苦悩を抱えている方の一助になれば幸いでございます。

#注意
ここでは、HTML＆CSSのコーディングとWordPressのはじめ方のような導入部分の解説は行いません。
すでに、ローカルでの環境構築は行われていることを想定しております。
その際にHTML＆CSSでコーディングした時とWordPressにあげた時とで、壊れるところが個人的に戸惑ってしまったので、そのポイントを中心に多くしていきたいと思いいます。

#【目次】今回つまづいたポイント
1.謎の空白
2.表示されない画像
3.お問い合わせフォーム
4.効かないCSS・SCSS

#1.謎の空白
直接自前エディターで記述を行う際には全く問題ないのですが、WordPressの固定ページに直接コードを入力する際には全く身に覚えのない空白が発生してしまうことがあります。
こちらを解決するための方法は非常に簡単で、自作テーマ内のfunctions.phpに以下のコードを入力するだけで綺麗に解決しますので、お試しください。
また、functions.phpをいじる際には前もってバックアップを取っておいたほうがいいそうですよ。

 ```functions.php
add_action('init', function() {
remove_filter('the_excerpt', 'wpautop');
remove_filter('the_content', 'wpautop');
});
add_filter('tiny_mce_before_init', function($init) {
$init['wpautop'] = false;
$init['apply_source_formatting'] = ture;
return $init;
});
```

#2.表示されない画像
こんなことあるのか、、というようなアクシデントですが、少し頭を使わないとなかなか抜け出せない沼になっております。
一般的にWordPressにアップロードする際には<img>タグに以下のようなテンプレートを入れる決まりとなっております。

```
<img src="<?php echo get_template_directory_uri(); ?>img/image.jpg"/>
```
フロントページのようにエディターでのコーディングで済むものであれば上記のコードを組み込めば問題ないのですが、それ以外の固定ページ等に画像を挿入する際にはこれではいけません。
原因としては、おそらく外部からの読み込みではなくWordPress内部で読み込まれるということで、テンプレートではなく階層構造での読み込みとなるそうです。

```
 <img src="/wordpress/wp-content/themes/wordpress/img/image.jpg"/>
```
これがわからないと、画像が表示できなくて大変なことになってしまうのですが、意外と解説している書籍やサイトが少なくて困ってしまいますね。

#3.お問い合わせフォーム
これはシンプルにプラグインだよりなのですが、contact form 7とmw wp formの両方を試してみて、個人的にはmw wp formが直感的に使いやすかったので、お問い合わせフォームの実装で詰まっている方はぜひ試してみてください。
詳しい設定方法はこちらで習得しました。
→https://newstd.net/user_manual/mwwpform
ただ、実際に実装してみた時にフォームがうまく機能しなくなってしまうことがありました。
原因は埋め込んだショートコード自体にもともと<form>タグが入力されていたことに気がつかず、その上から二重で<form>タグで囲ってしまっていたことにあります。
気をつけましょう。

```
[mwform_formkey key="195"]
```

#4.効かないCSS・SCSS
WordPressにあげる前、HTML&CSSのみのコーディングであればなんの問題もなくCSSが反映されていたんでけど、WordPressにあげた途端反映されなくなってしまった、、という方も多いかもしれません。
しかし、それが反映されなくなったのではなくて遅くなっただけなので、焦らずに対応しましょう。
方法は簡単ですが、実行する前によく確認してみましょう。
①クロームの右上にある縦黒３点をクリックしてこの画面を開く
　その他のツール→閲覧履歴を消去
<img width="737" alt="スクリーンショット 2020-04-04 23.45.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602592/e39fef27-a425-189c-b377-99ee1d57198f.png">
②削除期間を指定して実行
　※削除前に確認しましょう
<img width="525" alt="スクリーンショット 2020-04-04 23.46.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602592/6165f2e4-aa58-3b93-8c0b-d7abed5a9860.png">

#最後に
せっかくWeb制作をはじめたのに、つまらないところで挫折したらもったいないですよね。
難しいと思うような問題も時間と執念をかければ大抵のことはなんとかなるはずですので、頑張りましょう。
これからも、気づいた情報を共有していきたいと思いますのでよろしくお願いします！
機械学習のお勉強〜Numpy編〜

#機械学習のお勉強〜Numpy編〜

今回はNumpyについて勉強したのでそれについてのアウトプットをします。

##1.Numpyとは？

機械学習においてデータを整理してくれる外部ライブラリのひとつ。
外部ライブラリではあるが、Anacondaにはインストール済みなのですぐ使用できる。

##2.インポート

まずは下記のようにインポート

```python:test.ipynb
import numpy as np
```

簡単でしょ？
Anacondaじゃない場合はpipにインストールしましょう。

##3.どんな時に使うの？

主にデータの整理で使います。
この整理が機械学習においてとても重要なのでNumpyやPandasなどの
データ整理のライブラリはしっかり使えるようにしよう。

##4.主な関数

###array関数

配列を作成する時に用います

```python:test.ipynb
#1次元
test = np.array([1,2])
#２次元
test2 = np.array([[1,2],[3,4]])
```

###arange関数

規則的な配列を作成する際に用います。
注意点は最後の値を含まないこと

```python:test.ipynb
#0から5まで間隔は1
test = np.arange(5)
#0から９まで、間隔は2
test2 = np.arange(0,10,2)
```

引数は始点、終点、間隔の順番
始点、間隔は引数の指定がなくても良く、指定がない場合は始点は0、間隔は1になる

###linspace関数

等間隔の配列を作成する。
arange関数と異なる点は終点も配列の中に含むこと。

```python:test.ipynb
#始点0 終点10 個数１０の配列を作成
test = np.linspace(0,10,10)
```

###reshape関数

配列の整形をする

```python:test.ipynb
a = np.arange(10)
b = a.reshape(2,5)
```

0~9までの１次元配列を２次元配列にしました。

##四則演算

sum()などの四則演算を行う関数も備わっていますが、今回は割愛。
平方根を求めるsqrt関数、行列積を求めるdot関数などはメモ書き程度に記載しておきます。

##5.まとめ

・Numpyやベクトルや行列の演算が得意
・配列の作成はareay、規則的な配列を作成する場合はarangeやlinspaceを用いる

以上
Jupyter NotebookでKernelを追加する際のお決まりお作法

Jupyter Notebookで新しくKernelを追加する際のPipenvのお決まり作法

これやっておけば基本問題ない。毎回忘れて調べてしまって時間が無駄なので備忘。コピペでおk

--python 3.7 は必要なpythonバージョン
--name はjupyterで選べるカーネル名
--display-name はブラウザで表示される任意のカーネル名

```
pipenv --python 3.7 #3.6
pipenv install ipykernel python-dotenv
pipenv run ipython kernel install --user --name=kernel_name --display-name=kernel_display_name
pipenv shell
```
AtCoder Beginner Contest 161をPythonで実装

#はじめに
AtCoder Beginner Contest 161をPythonで実装したので、復習も兼ねて投稿します。
C++で実装する人が多いですが、私はPythonに最も慣れているのでそちらで記事を細々と書いていけたらなと考えています。

[AtCoder Beginner Contest 161](https://atcoder.jp/contests/abc161)

#A - ABC Swap
A問題は３つの箱(a,b,c)があって、その中に数字が入っています。
入力として３つの数字が渡され、

・aとbの箱の中の数字を入れ替えます。
・aとcの箱の中の数字を入れ替えます。

この二つの操作のあと、a,b,cの箱の中の数字を出力します。

1行目でinput()をstring型で受け取って、空白で分割してリストを作成し、リストの要素を変数に代入しました。2行目で二つの操作が終わったあとの数字を出力しました。


```Python:
a,b,c=input().split()
print(c,a,b)
```

単純なので、素早く解きたい問題です。
書くことも少なくて困っています笑

入力の受け方として、map関数を使うことも可能です。

```python:
a,b,c=map(str,input().split())
```

#B - Popular Vote
入力として
n,m
A1 A2 ... An
が与えられます。nこの商品のそれぞれの得票数がA1のように与えられていて、その内mこの商品を選ぼうとしています。その時、商品の得票数はそう得票数の${1/{4m}}$倍以上でなければならないです。


まず、これらの入力をn,m,numで受け取りました。
num配列を降順にする事によってm-1番目までの要素が上の条件を満たしているかを考えれば良いです。（コンテスト中はこのように実装しましたが、forを使わずにnum配列のm-1番目の要素が条件を満たすかどうかだけ考えれば十分でした。後述。）
for が途中で止まればNo、止まらずに終わればYesと出力しました。


```python:
n,m=map(int,input().split())
num=[int(i) for i in input().split()]
num=sorted(num,reverse=True)
sum_num=sum(num)
for i in range(m):
    if num[i]<sum_num/(4*m):
        print("No")
        break
else:
    print("Yes")
```

先ほどのforが不要な件。num配列を降順にしている段階で、m-1番目よりも手前の要素は大きいので考える必要がありません。この問題は入力数が少なかったので大丈夫でしたが、下のように実装した方が無難ではあります。

```python
n,m=map(int,input().split())
num=[int(i) for i in input().split()]
num=sorted(num,reverse=True)
sum_num=sum(num)
if num[m-1]<sum_num/(4*m):
    print("No")
else:
    print("Yes")

```

#C - Replacing Integer
入力としてnとkが与えられて、
n=|n-k|として更新していき、nが最も小さくなる時の値を考えます。
愚直に引き算していくことが考えられますが、nのオーダーが$10^{18}$であるので、kに１などの小さい数が入力された場合にタイムアウトしてしまいます。
ですので、別の方法を考えなければなりません。


具体的な数で考えてみます。n=128,k=5とした時にnはどんどん小さくなっていくので、0以上の時で最小となるのは3です。これは128を5で割った時の余りです。
また、n=|3-5|=2とnが0以上の時で最小となる値からkを引くと、絶対値の中が負の場合のnの最小値を求めることができました。これは-128を5で割ったあまりと考えられます。この二つの値の内どちらかが、最小値となるのでmin()関数を用いて出力しました。

```python
n,k=map(int,input().split())
print(min(n%k,-n%k))
```
この問題はオーダーが明らかに大きかったので、工夫しなければならないことを発想しやすかったと思います。

#終わりに
ご覧いただきましてありがとうございました。今回は実装よりも思考力が必要となる問題であったと思います。まだまだ未熟ですが、できれば毎週記事にしていこうと思います。時間内にはC問題までしかできなかったので、D問題も解いて追記できればなと考えています。
Apache Nginx の自動起動を停止する

自動起動させないようにする
chkconfig を使えとの記事が多かったが Ubuntu 18.04 ではコマンドがないため

```
$ sudo systemctl disable apache2.sevice
$ sudo systemctl disable nginx.service
```
もとに戻す

```
$ sudo systemctl enable apache2.sevice
$ sudo systemctl enable nginx.service
```
django rest frameworkインストール

[インストール](https://www.django-rest-framework.org/#installation)

```
python3 -m pip install djangorestframework
python3 -m pip install markdown
python3 -m pip install django-filter
```

プロジェクトへの設定の追加

```python:settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
]
```

ブラウズ可能なAPIを使用する場合は、おそらくRESTフレームワークのログインビューとログアウトビューも追加する必要があります。ルートurls.pyファイルに次を追加します。

```python:urls.py
from django.conf.urls import url, include
...
urlpatterns = [
    ...
    url(r'^api-auth/', include('rest_framework.urls'))
]
```

```
python3 manage.py migrate
python3 manage.py createsuperuser
```
【knex】this.dialectに関してのエラー解決

##エラー文
Using 'this.dialect' to identify the client is deprecated and support for it will be removed in the future. Please use configuration option 'client' instead.

##解決法

```javascript
var knex = require('knex')({
    dialect: 'mysql',
    connection: {
        host: 'localhost',
        user: 'root',
        password: '（パスワード）',
        database: '(データベース名)',
        charset: 'utf-8'
    }
});
```

上の文の、dialectをclientに変更する。
Vue.js で作るForm(フォーム)

# Vue.jsで作るフォーム

form の input 要素 や textarea 要素、 select 要素に双方向 (two-way) データバインディングを作成するには、**v-model ディレクティブ**を使用することができます。それは、自動的に入力要素のタイプに基づいて要素を更新するための正しい方法を選択します。ちょっと魔法のようですが、v-model はユーザーの入力イベントにおいてデータを更新するための基本的な糖衣構文 (syntax sugar) で、それに加えて、いくつかのエッジケースに対しては特別な配慮をしてくれます。

**<参考文献>**
>https://jp.vuejs.org/v2/guide/forms.html

## 入力フォーム input (text)
**HTML**

```html

<!-- v-model.lazyでinputからカーソルが離れた際に発火するようにする -->
<input id="title" type="text" v-model.lazy="eventData.title">
<pre>{{ eventData.title }}</pre> <!-- 確認 -->
```

**JavaScript**

```javascript

export default {
  data(){
    return{
      eventData:{  //eventDataプロパティにtitleの初期値を設定
        title:'',
      }
    }
  }
}
```

## 入力フォーム input (number)
**HTML**

```html

<!-- v-model.numberでvalueを数値に固定 -->
<input id="maxNumber" type="number" v-model.number="eventData.maxNumber"> 
<p>{{ typeof eventData.maxNumber }}</p> <!-- 確認 -->
```

**JavaScript**

```javascript

export default {
  data(){
    return {
      eventData:{
        maxNumber: 0,
      }
    }
  }
}
```

## input (先頭と後尾の改行を取り除く)
**HTML**

```html

<!-- v-model.trimで改行を取り除く -->
<input id="host" type="text" v-model.trim="eventData.host"> 
<pre>{{ eventData.host }}</pre>
```

**JavaScript**

```javascript

export default {
  data(){
    return{
      eventData:{
        host: ''
      }
    }
  }
}
```

## チェックボックス(単体)
**HTML**

```html

<input type="checkbox" id="isPrivate" v-model="eventData.isPrivate">
<label for="checkbox">非公開</label>
<p>{{ eventData.isPrivate }}</p>
```
**JavaScript**

```javascript

export default {
  data(){
    return{
      eventData:{
        isPrivate: false, //boolean型で返ってきます
      }
    }
  }
}
```

## チェックボックス(複数)
**HTML**

```html

<input type="checkbox" id=10 value="10代" v-model="eventData.target"> 
<label for="10">10代</label>
<input type="checkbox" id=20 value="20代" v-model="eventData.target"> 
<label for="20">20代</label>
<input type="checkbox" id=30 value="30代" v-model="eventData.target"> 
<label for="30">30代</label>
<input type="checkbox" id=40 value="40代" v-model="eventData.target"> 
<label for="40">40代</label>
<p>{{ eventData.target }}</p>
```

**JavaScript**

```javascript

export default {
  data(){
    return{
      eventData:{
        target: [], //配列で指定
      }
    }
  }
}
```

##  ラジオボタン
**HTML**

```html

<input type="radio" id="free" value="free" v-model="eventData.price">
<label for="free">無料</label>
<input type="radio" id="paid" value="paid" v-model="eventData.price">
<label for="paid">有料</label>
<p>{{ eventData.price }}</p>
```

**JavaScript**

```javascript

export default {
  data(){
    return{
      eventData:{
        price: "free"
      }
    }
  }
}
```

##  セレクトボックス
**HTML**

```html

<select v-model="eventData.location" multiple>
<option v-for="location in locations" v-bind:key="location">
{{ location }}</option>
</select>
<p>{{ eventData.location }}</p>
```

**JavaScript**

```javascript

export default {
  data(){
    return {
      locations: ["東京", "埼玉", "千葉", "神奈川"],
       eventData:{
         location: []
       }
    }
  }
}
```
【手順を解説】Atomエディタで作成したHTMLファイルを実際のWebブラウザで確認する方法

##「Atomエディタで作ったHTMLをWebブラウザでどうなるか見たいな！手順が知りたいです。」

一番最初に使う時が、一番難しいですよね！

####このページでわかること
- Atomエディタ初の人が、作ったホームページ（HTML)をWebブラウザで確認してみる方法
- CSSがPreviewに反映されなくて困っている
- 画像付きでどこをクリックすればいいか知りたい

ということがわかります。


このページでは、Atomエディタ初の人が、作ったホームページ（HTML)をWebブラウザで確認してみる方法を写真を交えて解説しています。

今回の記事は、すでにWebブラウザで確認するhtmlファイルがある場合の手順解説記事です。

##HTMLがPreviewで見れるのに、CSSがPreviewに反映されなくて困っている
そんな場合にも、この記事が対処方法として、ブラウザでCSSの反映を確認することができます。

###■【手順を解説】Atomエディタで作成したHTMLファイルを実際のWebブラウザで確認する方法

Atomエディタタブの一番左側、projectタブから、作成したHTMLファイル
今回は「mysite.html」を右クリックし、Finderから開くを選択します。
![スクリーンショット 2020-04-04 20.18.02 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613819/6e4cfb7a-4e2f-2d9a-b6c4-5c793561b471.png)

すると、下記の画面が開きます

![スクリーンショット 2020-04-04 20.10.47 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613819/a291590a-db12-d85c-40b3-55bf7cf28090.png)

Finderのウインドウから、「mysite.html」を右クリックし、
このアプリケーションで開く＞Google Chrome　をクリックします。
＊Google Chromeブラウザをインストールしていない方は、プログラミングに便利なブラウザなので、この際にインストールしておきましょう。
https://www.google.co.jp/chrome/?brand=CHBD&gclid=CjwKCAjw4KD0BRBUEiwA7MFNTQjqbgW-vKOBw7_6W0rqxJiH_DsQdMPY4toq9CBA3soBGu8hrDQq_hoC7YIQAvD_BwE&gclsrc=aw.ds

![スクリーンショット 2020-04-04 20.22.48 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613819/30c777ea-bf2f-8457-914f-ba410fbaa884.png)

すると、Webブラウザでmysite.htmlが表示されます。
【今日のアブストラクト】Visualizing and Understanding Convolutional Networks【論文 DeepL 翻訳】

1 日 1 回 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Visualizing and Understanding Convolutional Networks](https://arxiv.org/abs/1311.2901)

# Abstract

### 訳文

最近, 大規模畳み込みネットワークモデルは, ImageNet ベンチマークで印象的な分類性能を示している. しかし, なぜこのような性能を発揮するのか, あるいはどのように改善するのかについては, 明確な理解が得られていない. この論文では, この2つの問題に取り組む. 中間特徴層の機能と分類器の動作を理解するための新しい可視化手法を紹介する. また, 異なるモデル層からの性能寄与を発見するために, アブレーション研究を行う. これにより, ImageNet 分類ベンチマークにおいて, Krizhevsky et al. を上回るモデルアーキテクチャを見つけることができる. また, 我々の ImageNet モデルが他のデータセットにもよく適用できることを示す. softmax 分類器を再訓練した場合, Caltech-101 とCaltech-256 のデータセットでは, 現在の最先端の結果を確信を持って打ち負かすことができる.


### 原文

Large Convolutional Network models have recently demonstrated impressive classification performance on the ImageNet benchmark. However there is no clear understanding of why they perform so well, or how they might be improved. In this paper we address both issues. We introduce a novel visualization technique that gives insight into the function of intermediate feature layers and the operation of the classifier. We also perform an ablation study to discover the performance contribution from different model layers. This enables us to find model architectures that outperform Krizhevsky \etal on the ImageNet classification benchmark. We show our ImageNet model generalizes well to other datasets: when the softmax classifier is retrained, it convincingly beats the current state-of-the-art results on Caltech-101 and Caltech-256 datasets.
PythonでABC161のA~Cを解く

### はじめに
ノリで書いたツイートが謎に伸びました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こんにちは　chokudaiだよ<br>ABCをはじめるよ<br>*コーダーのお前らならば<br>余裕で解けるよね<br>ハイA、ハイB、ハイC、D、C</p>&mdash; tax_free (@taxfree_python) <a href="https://twitter.com/taxfree_python/status/1246069375318110208?ref_src=twsrc%5Etfw">April 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ひさしぶりにABCで解けた!と思いました。A~Cの三完です!

### A問題
[問題](https://atcoder.jp/contests/abc161/tasks/abc161_a)

**考えたこと**
AとBを入れ替える→AとCを入れ替える、ということは最終的に[C,A,B]の並びになるということなのでそれを出力する。

```python
x, y, z = map(int,input().split())
print(z,x,y)
```

### B問題
[問題](https://atcoder.jp/contests/abc161/tasks/abc161_b)

**考えたこと**
forで商品を一つずつ取り出して、取り出した商品の票数が条件(全体の$\frac{1}{4M}$)を満していればansに足して、ans>=Mで分けます。

```python
n, m = map(int,input().split())
a = list(map(int,input().split()))

s = sum(a) #sumでaの合計を計算
ans = 0
for i in a:
    if i >= s*1/(4*m):
        ans += 1
if ans >= m:
    print('Yes')
else:
    print('No')
```

### C問題
[問題](https://atcoder.jp/contests/abc161/tasks/abc161_c)

**考えたこと**
最初は素直にそれぞれのminを計算しようかと思いましたが、それではTLEするので楽に計算する方法を考えなければいけません。差が自然数の範囲で最小になるまで引き算し続けるのなら、割り算してその余りを求めればいいじゃない方針で解きました。
コンテスト中は不安だったのでmin(n,n%k,abs(n%k-k))で提出しました。不安だったのは$n<k$のときを考えてなかったからです。今考えると、$n<k$のときでもn%k=nなのでmin(n%k,abs(n%k-k))で通る。

```python
n, k = map(int,input().split())
a = n % k
print(min(a,abs(a-k)))
```

### D問題
[問題](https://atcoder.jp/contests/abc161/tasks/abc161_d)
**考えたこと**
桁DP?やなんとか優先探索で解くのかなと思って調べてみましたが、解けませんでした。諦めてEを考えてました。

### E問題
[問題](https://atcoder.jp/contests/abc161/tasks/abc161_e)
**考えたこと**
Sのo、xをboolに置き換えて、出勤できる日だけをlistにしました。しかし、[1,6,10,11]のようにCを満さないようなlistもできるのでどうやって処理するかを考えているとコンテストが終了しました。グラフとかDPとかでできる?


### まとめ
健闘できたABCでした。次のコンテストで脱灰できるように精進します。