OmniAICreator/Qiita-1.07M huggingface dataset:
読書メモ『コーディングを支える技術 成り立ちから学ぶプログラミング 作法』第11章 オブジェクトとクラス

## 前置き
`オブジェクト指向`という言葉を正確に理解するために、『コーディングを支える技術 成り立ちから学ぶプログラミング 作法』(第11章 オブジェクトとクラス)が、かなり役立ったと思ったので、memoとして残します。:pray:
僕同様、オブジェクト指向の言葉で迷った人は、一度目を通されてみると、視点が増えて整理にいいかもです🙋‍♂️

## オブジェクト指向とは何か

- **言語によって、「オブジェクト指向」の言葉の意味が違う**

### C++ (Bjarne Stroustrup)

- **型や継承にとても肯定的**
  - 「**classはユーザ定義型を作る**ための仕組み」
  - 「Stimulaの**継承機構が問題解決**の鍵」
  - 「**オブジェクト指向プログラミング とは、ユーザ定義型と継承を使ったプログラミング のこと**」

### Smaltalk (Alan Kay)

- 型や継承に否定的な立場 (**メッセージに着目**)
  - 「型に反対なわけではないが、苦痛でない型システムを見たことがない」
  - 「Simulaの継承のやり方は好きではない」
  - 「オブジェクト指向とは『状態を持った**オブジェクトがメッセージを送り合うことでコミュニケーションする』というモデルでプログラムを表現する**こと」

### オブジェクトは現実世界の模型

- **現実世界の「モノ」(object)の「模型」(model)をコンピュータの中に作るにはどうすればいいか？** 
  - その結果生まれたのが、**「オブジェクト指向」という概念**
  - Cf. [ALGOL60の設計者のHoareの講演内容 1996](http://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-9-pdf/k-9-u2293-Record-Handling-Hoare.pdf)

### クラスとは

- C++ (静的型付け言語)
  - 「クラスはユーザが定義できる型」のこと
- Java
  - 「クラスという部品を定義して、それを組み立てることがプログラミング だ」という設計の言語

## 変数と関数を束ねて模型を作る方法

- プログラマの目的は、**「まとめて模型を作りたい」**

#### 方法1: モジュール、パッケージ

- 関連性の強いものを「いくつかのまとまり」に分けたほうが理解が楽である。
  - 理解が楽なようにプログラムを設計すると、いくつかの「お互いに結びつきの強いグループ」ができる傾向がある。
- モジュールとは、「まとめる方法」

#### 方法2: 関数もハッシュに入れる

- **ファーストクラスの値**
  - 「変数に代入する」「関数の引数として渡す」「関数の戻り値として返す」などが可能である値のこと。
    - JavaScriptでは、関数もファーストクラスの値である。

#### 方法3: クロージャ

- オブジェクト的なものを作るためのテクニック
- 関数を関数の中で定義でき、ネストできる静的スコープがあり、関数を戻り値で返したり変数に代入したりできる言語では、単に関数をネストするだけで状態を持った関数を作ることができる

#### 方法4: クラス

##### Hoareの考えたクラス

- Hoareにとって**クラスは分類**
  - 「現実世界のモノ(objects)は、しばしば便宜上、いくつかの相互排除的な種類(classes)に分類される」

##### C++のクラス

- **クラスはタイプ(型)である**
  - ユーザが型(type)を定義するために作られた
- **クラス(=型)は仕様の表明でもある**
  - クラスは「オブジェクトがどういうメソッドを持っていて、どういうメソッドを持っていないか」という仕様を宣言する役割を持っていた。

##### Smalltalkのメソッド呼び出し

- 「こういう名前のメソッドを実行してくれ」というメッセージをオブジェクトに送るこ
- そのメッセージを受け取ったオブジェクトがどう振る舞うのかは、受けてオブジェクトが自由に決めることができる

#### (補)クラスとは結局何であるか

- クラスとは、たかだか数十年前に、誰かが「こういう仕組みがあると便利じゃないかな？」と作ってみたものに過ぎない
- 「そうかけたほうが楽だから」という理由で作られた約束事に過ぎない

### クラスが持つ3つの役割

1. **まとまったものを作る生成器**　(`鯛焼きの型`)
2. **どういう操作が可能かという仕様**  (`Javaのインターフェース`)
   - 動的型付け言語では重視されない 
3. コードを再利用する単位 (`継承`)

## 感想

言語によって、オブジェクト指向が指しているものが違うという考えは、今までオブジェクト指向の言葉の理解を邪魔していたものを取り払ってくれたように感じる。:pray:
特に、C++では、クラスとは型であるという考えが新鮮だった。
Rubyでは、Smalltalkの影響を受けているため、Alan Kayの `メッセージに着目する`考え方が大事であると理解。
この章を読むことで、オブジェクト指向への自分のモヤが結構スッキリした気がする。🙋‍♂️
*(アスタリスク)

ちょっとびっくりしたので
#search
```
index=*
```
普通ですね。
#rename
```
|rename delta(*) as p_*
```
`delta`の結果を一括変換する。
#filldown
```
filldown col*
```
`fillnull`と違って`filldown`は使える。
#foreach
[記事参照](https://qiita.com/toshikawa/items/4ac72cfd61df1bbb1d80)
#table
```
|table cola * 
```
順番を指定したいもの以外は適当でいい時に使う。
#stats
```java:stats.spl
| makeresults count=100
| fillnull cola colb colc
| foreach * [ eval <<FIELD>> = random() % 100]
| stats avg(col*) as mean_*
```
衝撃的でした。
#まとめ
結構いろいろと使えます。
フィールド名に使えない文字は受け付けないので、必要ならば最後に`rename`しましょう。
vi(vim)の設定、操作など

linux導入直後などでviの操作は少しでも知っておいた方が良いかと。

- 操作方法  
[普段はここを参照しています](http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/command/vi.html)

||キー|操作|例|
|:--|:--|:--|:--|
||u|undo||
||ctrl + r|redo||
||<n<|タブ削除(nは行数)||
||>n>|タブ追加(nは行数)||
||@:|コマンドの繰り返し|
|コピー|yw|単語をコピー||
||ynl|n文字をコピー(nは行数)||
||yny|n行をコピー(nは行数)|y4y|
|切り取り|dd|1行を切り取り||
||dnd|n行を切り取り|d4d|
|ペースト|p(小文字)|カーソルの右に張り付け||
||P(大文字)|カーソルの左に張り付け||
|検索|/|下に検索(/の後ろに検索単語を入力)||
||n|次を検索||
||:noh|検索ハイライトの消去||
|置換|:s/old/new/g|カーソル行の全置換(old->new)||
||:LS,LEs/old/new/g|LS行目からLE行目の全置換(old->new)|:10,15s/old/new/g|
||:%s/old/new/g|ファイル全体の置換|:%s/old/new/g|
|モード切替|i|入力モード切替(カーソルの左)||
||a|入力モード切替(カーソルの右)||
|ファイル操作|:w|上書き||
||:wq|上書きして終了||
||:q|終了||
||:q!|強制終了||
||:n|次のファイルに移動||
||:prev|前のファイルに移動||
||:rew|先頭のファイルに移動||
|コマンド操作|.|直前のコマンドを実行||


- 設定  
1行目に「source $VIMRUNTIME/defaults.vi」を入れておくのが推奨とのこと

```vim:~/.vimrc 
source $VIMRUNTIME/defaults.vim
"-------------------
set number    "行番号を表示する
set hlsearch  "検索文字のハイライト
set incsearch "インクリメンタルサーチ
set tabstop=2 "タブのスペースを2
set expandtab "タブキーでスペース入力
set list      "タブ、空白、改行を可視化
set listchars=tab:▸\ ,eol:↲,extends:❯,precedes:❮ "不可視文字の指定
let &t_ti.="\e[1 q" "カーソルルをブロックに変更
set nowrap "折り返しなし
```

随時、更新予定
Nuxt.js で動的にOGPを表示させたい

# 要件
ディレクトリ構造が以下のようになっている時に、`item/_id`ページのOGPでそのアイテムの名前とか画像とかを動的に表示させたい！
(item/1, 2, ... で表示させるものを変える)

```
-item
|-_id.vue
|-new.vue
|...
```

# OGP実装
## 基本
基本的な実装は[この記事]を参考にしてください。どちゃくそわかりやすく書かれています。(https://qiita.com/amishiro/items/b7260116b282d2cf2756)

## 本題
上の記事を読んでいただいて

- nuxt.config.jsにデフォルトのogp設定済み

のような環境になってからここを読み始めてください。

恐らく、item/_id.vue内でitem情報をapi等から取得してきていると思いますが、そのデータを用いてmetaタグの中身を書いていきます。

_id.vueに組み込むmixinを以下のように書きます。

```ogpMixin.js
export default {
  data() {
    return {
      meta: {
        title: "",
        description: "",
        type: "",
        url: "",
        image: ""
      },
      // ベースとなるurl。自分の環境に合わせてください。
      base: "https://example.net"
    };
  },
  head() {
    // 相対パスを取得。例えば'/item/1'とか
    const path = this.$route.path;

    ----------------------------------------
    // 点線内は書かない
    // 組込先（item/_id）に次のようなデータがあるという設定を示す
    item: {
      name: '~~~',
      explanation: '~~~',
      image: '~~~'
    },
    ----------------------------------------

    // ここでmetaの中身を更新
    this.meta.title = this.item.name;
    this.meta.description = this.item.explanation;
    this.meta.type = "article";
    this.meta.url = this.base + path;
    this.meta.image = this.item.image;
    
    // ここから先でmetaタグを書いていく
    return {
      title: this.meta.title,
      meta: [
        { hid: "description", name: "description", content: this.meta.description},
        { hid: "og:description", property: "og:description", content: this.meta.description},
        { hid: "og:title", property: "og:title", content: this.meta.title },
        { hid: "og:type", property: "og:type", content: this.meta.type },
        { hid: "og:url", property: "og:url", content: this.meta.url },
        { hid: "og:image", property: "og:image", content: this.meta.image },
        { name: "twitter:title", content: this.meta.title }
      ]
    };
  }
};

```

ポイントはhead()内で処理を行うことです。
ogpで探しにくるボットはクライアントサイドの処理を待ってくれないので、クライアントサイドでのみ行われるmouted()等で書くとうまく実行されません（ページのmetaタグは表示されるが、ogpが表示されない）

もし参考になったらいいね！お願いします！！
【Rails】細かいあれこれ

# 細かいあれこれ

## 1.リンク付きでFont-awesomeを実装したい！

```html:html.erb
<%= link_to(content_tag(:i, '', class: 'Font-awesomeの名前'), 遷移先のパス名(もし引数を渡したかったらここにモデル名を入れる)) %>

Ex)
<%= link_to(content_tag(:i, '', class: 'fas fa-pen'), edit_list_path(list)) %>
```
content_tagはHTMLを生成するメソッド。
【Rails devise】Deviseの実装周りのあれこれ

# Deviseの実装周りのあれこれ

### 1.Gemのインストール
```Gemfile:Gemfile
gem 'devise'
```

```command:command
bundle install
```

### 2.deviseファイルの生成
```command:command
rails g devise:install
```

### ３.deviseのビューファイルの生成
```command:command
rails g devise:views
```

### 4.deviseのモデルの生成
```command:command
rails g devise User(ここは任意です！Adminとかでもおけです)
```

### 5.deviseのテーブルの生成
```command:command
rails db:migrate
```

参考：
https://github.com/heartcombo/devise

以上！
マイグレーションファイル、カラムの「型」とは

マイグレーションファイルは、テーブルの設計図・仕様書。db/migrate/20XXXXXXXXXXXX_create_XXXXX.rbのマイグレーションファイルを編集する。
create_table :posts do |t|
t.timestamps
の間にt.カラムの型 :カラムを必要なものを入れる
t.text :tite
t.string :text
t.text :image
など、、、
カラムの「型」は
|:-----|:-----|:-----|
| 型 | どのような型か | 用途 |
| integer | 数字 | 金額、回数など |
| string | 文字(短文) | ユーザー名、メールアドレスなど |
| text | 文字(長文) | 投稿文など |
| boolean | 真か偽か | はい・いいえの選択肢など |
| datetime | 日付と時刻 | 作成日時、更新日時など |
を参考にして記述する。
このままではデータベースにテーブルを作成はまだできてないので、ターミナルでrails db:migrateを実行する。Sequel Proでテーブルを作成できていればテーブルの完成
bundle install時にsaasに関するエラーが発生した

## 発生したエラー

RUNTEQのRuby on Railsの技術試験を受験し、環境構築をしている際に以下のエラーが発生しました。

ターミナルで以下のコマンドを入力

```:ターミナル
bundle install --path=vendor/bundle
```
すると最後の段階で以下のエラーが発生

```:ターミナル
Ruby Sass has reached end-of-life and should no longer be used.

* If you use Sass as a command-line tool, we recommend using Dart Sass, the new
  primary implementation: https://sass-lang.com/install

* If you use Sass as a plug-in for a Ruby web framework, we recommend using the
  sassc gem: https://github.com/sass/sassc-ruby#readme

* For more details, please refer to the Sass blog:
  https://sass-lang.com/blog/posts/7828841
```
何やら使用しているものに関する注意書きのようです。
googleで翻訳をしてみると

## エラーを解読

```:ターミナル

Ruby Sassはサポートが終了したため、使用しないでください。

* Sassをコマンドラインツールとして使用する場合、新しいDart Sassの使用をお勧めします
  主な実装：https://sass-lang.com/install

* SassをRuby Webフレームワークのプラグインとして使用する場合は、
  sassc gem：https://github.com/sass/sassc-ruby#readme

*詳細については、Sassブログを参照してください。
  https://sass-lang.com/blog/posts/7828841
```
とのこと、私はコマンドラインツールは別のものを使用しているため、今回は2番目のRaisでsassを使用する際に発生した注意みたいですね、記述通りにgithubに飛びREADMEを確認すると対応が書いてありました。

## 解決策

```ruby:Gemfile
gem 'sassc'
```
こちらを記述すれば良いみたいです。
その後bundle installすると、無事完了しました。

## 原因
・sassって？
後日記載します
Ruby/GTK3 - LinkButton

`gem install gtk3`

# LinkButton

ウェブブラウザで使用されるハイパーリンクのようなボタン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/f650fda5-9846-03bf-799e-f14f368ea464.png)
クリックするとQiitaが開く。

```ruby
require 'gtk3'

class LinkButtonWindow < Gtk::Window
  def initialize
    super
    set_title 'LinkButton Demo'
    set_border_width 10

    button = Gtk::LinkButton.new('http://qiita.com', 'Visit Qiita')
    add button
  end
end

win = LinkButtonWindow.new
win.signal_connect('destroy') { Gtk.main_quit }
win.show_all
Gtk.main
```

[Python版](https://python-gtk-3-tutorial.readthedocs.io/en/latest/button_widgets.html#id3)
C言語におけるループ処理の簡単なまとめ

#Cには全部で3つのループ文が用意されている
- for文 : 回数指定
- while文 : 条件指定（先判定）
- do~while文 : 条件指定（後判定）

##回数指定ループ（for文）
### for文 : 回数指定
```c
int i;
for (i = 1;i <= 繰り返し回数;i++) {
繰り返す文;
}
```

#####ループを強制終了させる
これは全てのループ処理で使える。

```
break;
```
##条件指定ループ（while文とdo~while文）
###while文 : 条件指定（先判定）
- 実行前に条件式を判定する

```c
while (条件式) {
繰り返す文;
}
```

forのように使いたいときは下記のように書く

```c
初期化;
while (条件式) {
	　　繰り返す文;
	　　更新;
}
```
###do~while文 : 条件指定（後判定）
- 実行後に条件を判定する
    - 必ず一度実行したい場合はこちらを使用する

- 入力チェックのときに威力を発揮する。間違っていたら再入力させるときに

```c
do {
繰り返す文;
} while (条件式);
```
MacでAVCHD(.MTS)ファイルを扱う|複数のMTSファイルをmp4に変換する

# はじめに
 - 個人的なメモです（誰かの役に立つと嬉しい）
 - 撮影機材:ミラーレス一眼カメラ**Panasonic LUMIX DMC G7**
 - FullHD 60fpsの場合**mp4形式**で撮影すると**29分59秒**で一度録画が切れてしまう
 - **AVCHD**形式で撮影する場合は電源とSDカードの容量が許す限り**無限**に動画が撮影できる
 - 動画撮影中に切のいいところで撮影を停止することを繰り返すと複数の**MTSファイル**が残る

# 解決したいこと
- MacでMTSファイルを取り出す方法
- MTSファイルを**1本のmp4ファイル**に結合したい

``※動画編集ソフトでも動画ファイルの結合から書き出しは可能だが、エンコードに時間がかかりCPUパワーも必要なためNG、この方法のほうが比較的高速にエンコードが完了する.
（技術的理由は不明）``

# MacでMTSファイルを取り出す方法
録画データはSDカードに入っているのでMacPCにアダプターなどを使ってMacPCに接続する。

MacOSのFinderでAVCHDファイルを開こうとすると1つのファイルのように見える。
<img width="785" alt="スクリーンショット 2020-02-26 20.55.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252959/e45e40b5-c687-0f50-a850-8577afdf916b.png">

そのファイルを右クリックすると``パッケージ内容を表示``のメニューが表示されるのでクリックすると中身のファイルを表示することができる。
<img width="606" alt="スクリーンショット 2020-02-26 20.56.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252959/bb0648bd-aba2-9994-751f-c16d04a63855.png">

そのファイル中には``BDMV``ファイルがあり同じようにそのファイルを右クリックすると``パッケージ内容を表示``のメニューが表示されるのでクリックすると中身のファイルを表示する。

<img width="554" alt="スクリーンショット 2020-02-26 20.59.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252959/41da93b5-d837-5e81-81a4-8798c03b5c6d.png">

BDMVファイルを開くとようやくMTSファイルが表示される。
<img width="769" alt="スクリーンショット 2020-02-26 21.01.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252959/2fd2dd66-64b3-525b-c551-39495f34b004.png">

このままでは**ffmpeg**からアクセスするとエラーを吐くので、適当なディレクトリにコピーする。
今回はホームディレクトリのムービーディレクトリの中にコピー
``/Users/merarli/Movies/AVCHD_FILE/AVCHD_mac_test2/00000.MTS``
``/Users/merarli/Movies/AVCHD_FILE/AVCHD_mac_test2/00001.MTS``

# MTSファイルを1本のmp4ファイルに結合したい
今回はわかりやすいようにMTSファイルと同じディレクトリに``list.txt``を作成
<img width="781" alt="スクリーンショット 2020-02-26 21.05.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252959/7c8fd4f9-9720-9d12-fe6b-9c3eaf223491.png">

以下のように結合したい順番に動画ファイルパスを記述
``/Users/merarli/Movies/AVCHD_FILE/AVCHD_mac_test2/list.txt``


```list.txt
file '/Users/merarli/Movies/AVCHD_FILE/AVCHD_mac_test2/00000.MTS'
file '/Users/merarli/Movies/AVCHD_FILE/AVCHD_mac_test2/00001.MTS'
```

## ffmpegでmp4に変換する
ffmpegはターミナルで以下のコマンドを入力することでインストールできる。
すでにインストール済みの方はスキップしてOK

```bash
brew install ffmpeg
```

最後に``list.txt``に記入した動画ファイルを結合する。
以下のコマンドで``/Users/merarli/Movies/AVCHDtomp4/``のディレクトリに``mov.mp4``ファイルが出力される。

```bash
ffmpeg -safe 0 -f concat -i '/Users/merarli/Movies/AVCHD_FILE/AVCHD_mac_test2/list.txt' -c copy '/Users/merarli/Movies/AVCHDtomp4/mov.mp4'
```
以下のように**mp4ファイル**が確認できたら成功です！！
<img width="780" alt="スクリーンショット 2020-02-26 21.14.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252959/eb5410d2-da7c-a7d5-b0d4-9f64f2d78b5e.png">
モデルとは、モデルの作成

モデルは、Railsの中でデータベースへのアクセスをはじめとする情報のやりとりに関する処理を担当している。簡単な解釈で書くとコントローラー→モデル→データベース、データベース→モデル→コントローラーと受け渡しになってるが、コントローラーは日本語、モデルは通訳、データベースは英語みたいに考えるとわかりやすいかも
モデルの作成はターミナルでrails g model モデル名で作られる。モデルを作るとVs codeの中にdb/migrate/ディレクトリに20XXXXXXXXXXXX_create_XXXXX.rbが作られる。
インベントリファイル

#1.インベントリファイルについて

　インベントリファイルは、Ansibleが設定対象にするサーバーやネットワーク機器を記述します。
　IPアドレス、またはhostsやDNSで解決されている名前を記述します。
　機器をグループ化することができます。グループにより、ansibleコマンドでの実行単位を指定することができます。

```text:hosts記述ルール
[グループ名]
(IPアドレス)
(/etc/hosts, DNSに登録されているホスト名）

[グループ名]
　　・
　　・
```

```text:hosts　記述例
[WebServer]
web-1
Web-2

[TomcatServer]
192.168.10.21
192.168.10.22

```

※インベントリファイルには、ホスト変数を指定したり、連番の機器名の省力化をしたりと様々な記述ができます。
　詳細は下記を参照。

　　参考URL：https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
ITEA Deliverable


69 Requirements on Function Inhibition Manager
https://www.autosar.org/fileadmin/user_upload/standards/classic/19-11/AUTOSAR_SRS_FunctionInhibitionManager.pdf

の文書のreferenceに

6.2.1 ITEA-EAST
Related standards and norms
[10] D1.5-General Architecture; ITEA/EAST-EEA, Version 1.0; chapter 3, page 72 et seq.
[20] D2.1-Embedded Basic Software Structure Requirements; ITEA/EAST-EEA, Ver- sion 1.0 or higher
[30] D2.2-Description of existing solutions; ITEA/EAST-EEA, Version 1.0 or higher.

があるが、どこにあるかわからない。
それなら、ITEAの全文書の一覧を作るしかないかもと作り始める。

# 一覧

D2.1 Multimodal Interfaces for Disabled and Ageing Society
Project number: ITEA 2 - 07008
https://itea3.org/project/workpackage/document/download/369/07008-MIDAS-WP-2-MIDASWP2D21OverallMidasArchitectureSpecification

Deliverable 2.1
Evaluation of IoT-platforms and Definition of the IIoTplatform
Architecture
https://itea3.org/project/workpackage/document/download/5469/16043_D2.1_Evaluation%20of%20IoT%20Platforms_Definition%20of%20IIoT%20Platform%20Architecture.pdf.pdf

DELIVERABLE SUMMARY
D2.1.3 – System Architecture Specification
https://itea3.org/project/workpackage/document/download/1495/D2.1.3.%20MEDIATE%20-%20System%20Architecture%20Specification%20v1.0%20-%20Summary.pdf

Annex 6 for D2.3 Scripting support for Papyrus
https://itea3.org/project/workpackage/document/download/5137/D2.3%20OPENCPS%20-%20FMI%20Master%20Simulation%20Tool%20Annex%206%20M36.pdf

D2.3 Medolution Best Practice Architecture
Work package 2: architecture and system integration
https://itea3.org/project/workpackage/document/download/4887/14003-Medolution-WP-2-D23MedolutionBestPracticeArchitecture

FIONA Deliverable D2.3.1 FIONA Platform Architecture
https://itea3.org/project/workpackage/document/download/2227/D2.3.1.%20FIONA%20-%20Platform%20Architecture.pdf

CyberFactory#1 Deliverable D2.4 - SoS design and validation plan
https://itea3.org/project/workpackage/document/download/6106/D2.4%20SoS%20design%20and%20validation%20plan.pdf

WoO - Web of Objects Project
D3.3 Reference Architecture
https://itea3.org/project/workpackage/document/download/1566/10028-Web%20of%20Objects-WP-3-D33WoOReferenceArchitecture-final.docx

D3.1: Identification of relevant state of the art ITEA 3 Call 2
Project start: November 2016 Project end: December 2019
https://itea3.org/project/workpackage/document/download/4442/15010-REVaMP²-WP-3-D31v5:Identificationofrelevantstateoftheart

D5.1 Multimodal Interfaces for Disabled and Ageing Society
Project number: ITEA 2 - 07008
https://itea3.org/project/workpackage/document/download/368/D5.1.%20MIDAS%20-%20User%20Interface%20Design.pdf
ライフサイクルのタイミングを出力する LifecycleLogger

```kotlin
class LifecycleLogger: LifecycleObserver {

  @SuppressLint("LogNotTimber")
  @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
  fun l(owner: LifecycleOwner, event: Lifecycle.Event) {
    Log.d("###", "${event.name} → ${owner.lifecycle.currentState} $owner")
  }

}
```

Activity や Fragment でこう呼ぶ。

```kotlin
   init {
     lifecycle.addObserver(LifecycleLogger())
     ...
   }
```

<a href="https://android.benigumo.com/20200213/lifecyclelogger/" target="_blank">👉 LifecycleLogger とか。&nbsp;<img src="http://b.hatena.ne.jp/entry/image/https://android.benigumo.com/20200213/lifecyclelogger/"></a>
【Rails】最短でRailsにFont-awesomeを導入する

# 最短でRailsにFont-awesomeを導入する

### 1.Gemのインストール

```gemfile:gemfile
gem 'font-awesome-sass', '~> 5.12.0'
```

```command:command
bundle install
```

### 2.scssでFont-awesomeを読み込む

```scss:application.scss 
@import "font-awesome-sprockets";
@import "font-awesome";
```

5秒ですね！

参考：
https://github.com/FortAwesome/font-awesome-sass
【Rails binstubs】Rails sできない時

# Rails sできないとき

この記事では
・Rails sできない
・なにやらエラーにbinstubsという単語がある

という方のエラー解決に役立てればと思います！

# 1.binとやらを消す
```command:command
rm -rf ./bin
```

# 2.binディレクトリを刷新！
```command:command
rake app:update:bin　　　#railsのバージョンが5.2以上の方はこちら

rake rails:update:bin　　　#railsのバージョンがそれ未満の方はこちら
```

参考：
https://stackoverflow.com/questions/7546869/problem-running-rails-s
今更ながらWPFに置き換えてみる（3）

#BitmapをImageにセットする
エクスパンダコントロールはいまいちよくわからないのでVBでの実装と同じように自力でセッティングの画像をクリックしたら下に設定項目を表示することにする。
ちっこい▼のICONをプロジェクトに組み込んでBITMAP化し、Imageコントロールに表示する。
単純にTOBITMAP()でセットはできないようなのでBITMAP化した後でハンドルを取得して、ハンドル経由で取得する。

```C#
System.Drawing.Icon ico = Properties.Resources.ctl_close1;
System.Drawing.Bitmap bitmap = ico.ToBitmap();
IntPtr hbitmap = bitmap.GetHbitmap();
this.image1.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hbitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

```
#コントロール記述の順番の重要度
あと軽くはまったのがデザイナ上でオブジェクトをツリー形式で登録する場合の順番。
先に登録しているコントロールのイベントで、後述のコントロールのプロパティを変更しようとするとエラーになる。

スライダの値を表示させるラベルオブジェクトをデザイナ上でスライダの後に記述すると、スライダのChange Valueイベントに記述しているラベルのCONTENTへの代入で
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」が出てしまう。
下のようにラベルをスライダの前に移動することでエラーは解消。

![デザイナ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590512/1180588e-190f-a887-38ae-bf8935a0d68e.png)

当たり前といえば当たりまえなのだが、デザイナに慣れてしまっているとコントロール記述の順番とかほとんど意識しないのでやってしまいがち。

デザイナ上で何となくスタックパネル使って設定部のON/OFFしようとおもってた。でOFFの場合は下のパネルのTOP切り替えればいいかなくらいに考えてたのだが、TOPとかそういうプロパティはないんですね。
#追記
上記でコントロール記述順番を入れ替えれ云々言ってますが、XAML上で変わらなかったら意味がないですね。
AndroidStudio3.6に更新したら、mapping.txtの配置場所が変わった

本日、AndroidStudio3.6のstable版がリリースされました。
https://android-developers.googleblog.com/2020/02/android-studio-36.html

早速アップデートして、作っているアプリのgradleバージョンも上げてビルドしてみたところ、mapping.txtに関して詰まったポイントがあったので記載します。

# 変更点
mapping.txtの配置場所が(地味に)変わりました。
flavor/buildType→flavorBuildTypeになっています。(flavorとbuildTypeに階層が無くなった)

```shell:変更
# 以前
app/build/outputs/mapping/flavor/buildType/mapping.txt
# AndroidStudio3.6
app/build/outputs/mapping/flavorBuildType/mapping.txt

# 例
app/build/outputs/mapping/flavor/debug/mapping.txt
↓
app/build/outputs/mapping/flavorDebug/mapping.txt
```

# 問題と解決法
## 問題
CIにflavorとbuildTypeを渡してビルドしていたのですが、成果物としてmapping.txtを保存する処理で、エラーになりました。
具体的にはmapping.txtを成果物フォルダにコピーしようとしており、下記のようなスクリプトを書いていました。
(CIではビルド時にFlavorとBuildType(debug/releaseなど)を指定しています)

```:成果物コピー
cp app/build/outputs/mapping/${Flavor}/${BuildType}/mapping.txt Outputs/
```
新しいディレクトリに対応できていないので、エラーになります。

```:エラー
cp: cannot stat ‘app/build/outputs/mapping/flavor/debug/mapping.txt’: No such file or directory
```

## 解決法
buildTypeはdebug/releaseという形で先頭が小文字だったのでどうしようかと思っていたのですが、bashに先頭を大文字にできる機能がありました。

```
cp app/build/outputs/mapping/${Flavor}${BuildType^}/mapping.txt Outputs/
```
参照時に`^`をつけると先頭だけ大文字にしてくれるようです。
(Bashのバージョンによるかもしれません)
これで無事mapping.txtの新しい階層に対応できました。
Accuracyなどの混同行列の評価が使えない理由

前回の投稿からかなり時間があいてしまいましたが、これからも時々更新していく予定です。  
機械学習の精度を評価する際によく利用されているAccuracyなどの指標ですが、金融分野ではほとんど使用されることはありません。  
なぜ利用されないのかを説明する前に、混同行列とAccuracyなどの評価指標について説明します。説明が不要な方は問題点と結論だけをご覧ください。


### Confution Matrix (混同行列)
混同行列とは機械学習の2項分類において、予測と結果をマトリックスにしたものです。
機械学習の2項分類では、通常予測確率とそれに基づく予測分類がアウトプットとして出力できます。
例えば、Credit scoreにおいては、延滞になる確率と延滞になる・ならないを０と１で出力します。
それを元に、予測と結果の合致をマトリックスで表すと以下のようになります。  

- | 予測(延滞にならない) - Positive | 予測(延滞になる) - Negative
--- | --- | ---
結果(延滞でない) - Positive | TP(True Positive) | FN(False Negative)
結果(延滞) - Negative | FP(False Positive) | TN(True Negative)

学習結果で延滞にならないと予測して、結果が延滞でない場合はTPに該当し、延滞にならないと予測して、結果が延滞の場合はFNに該当します。
予測が正しかった場合は、TPかTNに該当することになります。

### 評価指標
上記の混同行列を使用した評価指標には以下のような種類があり、それぞれ特徴があります。どれも数値が高いほど性能がよいとされています。

1. Accuracy (正確率、精度)
よく利用されているもので、全体の中で予測と結果が正しかったものの割合がどれくらいあるかを示しています。

    $Accuracy = \frac{TP + TN}{TP + FP + FN + TN}$

2. Precision (適合率)
Positiveと予測された（延滞にならない）中で結果もPositiveだった割合。

    $Precision = \frac{TP}{TP + FP}$

3. Recall (再現率)
結果がPositiveなものをどれだけ予測できていたかの割合。

    $Recaall = \frac{TP}{TP + FN}$

4. Specificity （特異度）
結果がNegativeなものをどれだけ予測できていたかの割合。

    $Specificity = \frac{TN}{FP + TN}$

### 評価指標の問題点と特徴
例えば以下のような予測結果だった場合は、

- | 予測(延滞にならない) - Positive | 予測(延滞になる) - Negative
--- | --- | ---
結果(延滞でない) - Positive | 980(TP) | 0(FN)
結果(延滞) - Negative | 20(FP) | 0(TN)

$$ Accuracy = \frac{TP + TN}{TP+ FP + FN + TN} = \frac{980}{1000} = 0.98 $$

となり、Accuracyの数値は高いものになります。
ただし、内訳を見てみると予測はすべてPositiveとなっており、結果がNegativeのものを1件も予測できていません。データの偏りによってはでたらめに全部Positiveと予測しても、Accuracyは高い数値になります。
そこで、Specificityを計算してみると

$$ Specificity = \frac{TN}{FP + TN} = \frac{0}{20} = 0 $$

となり、Negativeになる予測がまったくできていないことがわかります。

### その他指標
評価指標が数種類あり、それぞれが特徴を持つと評価が複雑になりがちです。そこでF値（F-score, F1 score, F-measure、F尺度）などと呼ばれる指標を使用することがあります。これはPrecisionとRecallの調和平均の値となります。

$$ F1 = 2\frac{Precision * Recall}{Precision + Recall} $$

### 問題点
混同行列を使用した様々な評価指標を述べてきましたが、これらを利用することはありません。混同行列の根本は、PositiveとNegativeの2項に分類し、その分類の正しさを測っています。分類の仕方は、予測された確率を基に決められたしきい値より低ければPositive、高ければNegativeになります。  
最初の問題点として、データに偏りがあった場合です。元のデータでPositiveが99%、Negativeが1%のような場合、評価指標の数値は偏ったものになりがちです。
第二はしきい値の設定です。しきい値をどこにするかで当然PositiveとNegativeの割合が変化しますが、そのしきい値が適切なのかが曖昧になりがちです。  
例えば、これをCredit scoreなどで利用すると、A社では延滞予測が5%以上は契約しないので、しきい値を5%に、B社では10%をしきい値に用いて、Negativeに分類された人は契約しないとしましょう。ではPositiveに分類された人がすべて延滞にならないかというとそうではなく、必ず延滞になる事案が発生します。これは、すべての与えられた情報（例えば属性や取引履歴）が同じでも、延滞にならない・なるケースが発生するためです。
Credit scoreで一番重要視されるのは、リスク度合いに合わせた商品設計なので、大事なことは何%の確率か（リスク度合い）ということで、PositiveやNegativeに分類される正確さではないのです。  

### 結論
リスク度合いを考慮せずに、いかに高い精度で2項に分類するかが重要な場合は、当然上記の評価指標が重要になることもあります。  
結論として、どう利用されるかによって使う指標を選ばないと、なんの意味もない指標をもとに学習モデルの精度を測り、精度がいい・悪いを評価してしまうことになります。  
モデルの評価や予測した理由を説明する方法についてはこちらを御覧ください。
[理解されるPOC作成のために、機械学習したモデルをどう評価し説明するかのまとめ。](https://qiita.com/Derek/items/562cdce4fe357df96242)
three.js でタッチ系のイベントが発火しない時

## 環境
three.js - 113

## 困ったこと

`click`に設定したイベントがマウスクリックでは問題ないのに、タッチで発火しないという事象に悩まされる。

こんな感じでイベントを設定↓

```javascript
window.addEventListener('click', () => {
  // 発火せず
});
```

ちなみに、タッチ系もだめだった↓

```javascript
window.addEventListener('touchstart', Callback);// 発火せず
```

## 原因

three.jsにサンプルとして付属している `OrbitControls` を使っていることが原因。
内部で各種イベント伝播が 「食べられて」しまう実装になっている。

「食べられて」が正しいのか知りませんが、こちらのIssueで気に入ったので使っていきます。
https://github.com/mrdoob/three.js/issues/16254

## 対策
`OrbitControls.js` から `event.preventDefault()` を削除することで、イベントを食べられないようにすることができます。

https://github.com/mrdoob/three.js/blob/dev/examples/js/controls/OrbitControls.js

```javascript:OrbitControls.js
  function onTouchStart( event ) {
    if ( scope.enabled === false ) return;
      // ↓こいつが邪魔なのでコメントアウト
      // event.preventDefault(); // prevent scrolling
      switch ( event.touches.length ) {

```

これで、`click`に設定したイベント処理が実行されタッチパネルでも問題なく動くようになりました。

ちなみに、この変更による副作用も存在するようなのでご自身の環境で問題ないことを確認してくださいね。
(私の環境では特に問題なかった。多分)
https://github.com/mrdoob/three.js/pull/18612
Pythonの繰り返し処理

pythonの繰り返し処理についてまとめました。
初級者向けです。
pythonバージョン：3.6.9
公式ドキュメントは以下が参考になります。
[for文・while文](https://docs.python.org/ja/3/reference/compound_stmts.html#the-while-statement)
[range](https://docs.python.org/ja/3/library/stdtypes.html?highlight=range#range)

#Rangeを使用するfor
Rangeオブジェクトを使用する繰り返しは、主に回数指定のループ処理に使用します。
Rangeオブジェクトは`range(start, stop, step)`とすることで生成でき、for文中で用いることでstartからstop - 1 まで(stop自体は含まれません)をstepずつ増やしながら実行することができます。以下にいくつか例を挙げます。
##N回繰り返す
```python
for i in range(5):
  print(i)
# 0 ~ 4 が出力される
#Rangeのイニシャライザは、startが0、stepが1のデフォルト値があります。
```
##1から始めて、2ずつ増やしながら繰り返し
```python
#stepに与える値を変えることで任意の順序でループができます
for i in range(1, 10, 2):
  print(i)
#1, 3, 5, 7, 9 が出力される
```

##値を減らしながら繰り返す
逆に減らしながらの実行も可能です。

```python
#startが10、stopが-1、stepが-1なので、10から始まり0までを1ずつ減らしながら処理します
for i in range(10, -1, -1):
  print(i)
#10 ~ 0が減少しながら出力される
```

#For
こちらは`range`を使用しない場合の`for`の使用方法です。
主にイテラブルなどの集合操作に使用します。
##リストなどの要素をすべて繰り返し処理する
Javaなどで言うところのforeach に該当するものです。
処理することができるのは、イテラブルと呼ばれるオブジェクトです。リストやセット、タプルなどがこれにあたります。
（`__iter__()`を実装しているものがイテラブルと呼ばれるのですが、詳細な解説は割愛します。）

```python
#リストの全要素を繰り返す
a = [1, 3, 5, 7]
for n in a:
    print(n)

#セットに対しても同様
s = {1, 2, 3, 4}
for n in s:
    print(n)

```
なお、ディクショナリについては、ディクショナリが持つメソッドを用いてキーと値を取り出します。

```python
#キーをすべて処理する
for k in m.keys():
  print(k)

#値をすべて処理する
for v in m.values():
  print(v)

#キーと値のペアに対して処理をする
for k, v in m.items():
  print(str(k) + v)
```

##インデックス付きで繰り返す
要素を走査しつつインデックスも使用したい場合は`enumerate`を使用します。

```python

a = ['a', 'b', 'c', 'd', 'f']
for i, n in enumerate(a):
    print(i, n)
#以下のように出力されます。
#0 a
#1 b
#2 c
#3 d
#4 f
```

##複数のイテラブルを同時に処理する
複数のイテラブルの要素を順に同時に扱いたいときは`zip()`を使います。

```python
a = [1, 2, 3, 4, 5]
b = ['a', 'b', 'c', 'd', 'e']

for i, j in zip(a, b):
    print(str(i) + j)

```
注意点として、イテラブルの要素数が異なる場合、余分な（要素数の多い方の）要素は無視されます。

```python
#リストaが持つ要素のうち、後ろ3つは処理対象になりません
a = [1, 2, 3, 4, 5, 6, 7, 8]
b = ['a', 'b', 'c', 'd', 'e']

for i, j in zip(a, b):
  print(str(i) + ' ' + j)

#1 a
#2 b
#3 c
#4 d
#5 e

# 6 ~ 8 が出力されません！
```

#While
whileは、「ある条件を満たしている間」処理を実行し続けます。

```python
#この例だと、iが10未満の間、処理を続けます
i = 0
while i < 10:
  print(i)
  i += 1
# 0 ~ 9 が出力されます。
```
条件を満たしている間実行し続けるので、下記のコードは無限ループです。

```python 
#無限ループの簡単な例
#whileの条件が常にTrueのため、無限ループ
while True:
  print('hoge')
```

#continue, break, else
`continue`, `break`, `else`は、それ単独ではループ処理を実現しませんが、上記に挙げた`for`や`while`と組み合わせることで、ループ処理中に処理の中断やスキップなどができるようになります。

##continue
`continue`は、以下の処理をスキップして、次のループ処理に移ります。
特定の条件の場合は処理をしたくないときなどに使用します。

```python
for i in range(10):
  if i % 2 == 0:
    #偶数の場合、continueが実行され、次のループ処理に移ります
    continue
  print(i)
# 1,3,5,7,9 が出力されます
```

##break
`break`は、ループ処理そのものを終了します。特定の条件を満たした場合にループ処理を終了させたい場合などに使用します。

```python
for i in range(10):
  # i が7の時に処理を終了するため、7以降の数字は出力されません。
  if i == 7:
    break
  print(i)
#0,1,2,3,4,5,6が出力されます
```

##else
`else`は、ループ処理が終了後、かつbreakでループが終了していないときに実行されるブロックです。

```python
for i in range(10):
  print(i)
else:
  print('done!')
#0 ~ 9が出力された後、done! が出力されます。
```
breakでループから抜けた場合はelseは実行されないため、下記の例ではelse句は実行されません。

```python
for i in range(10):
  if i == 7:
    break
  print(i)
else:
  print('done!')

# 0 ~ 6が出力され、処理が終了します
```

以上、他にループ処理についての知見が増えたらまた編集します。
AWS ソリューションアーキテクト アソシエイトを取得しました

初めまして，yourilと申します．
タイトルの通りAWSソリューションアーキテクト(アソシエイト)を取得しましたので，
自分が行った勉強方法などをまとめようと思います．

※本記事は2020年2月時点の内容です．


# TL;DR

- 取得までの期間: 4ヶ月(間に2ヶ月のブランクあり)
- AWSの利用経験: なし
- 勉強方法: 
   - Udemyの動画講座+模擬試験
   - 対策本2冊
   - 公式の模擬試験


# 勉強前の知識

オンプレミスがメインのネットワークエンジニアとして働いており，
普段はAWSを始めとしたパブリッククラウドとはほぼ無縁な仕事をしています．
なのでNWはそれなりに分かるものの，サーバやストレージ，データベース等はあまり触れる機会がなく，
知識も新人研修で学んだ程度です(もう大分忘れてますが...)．


# 勉強期間

2019年10月下旬～2020年2月下旬の4ヶ月．
ただし11月下旬～1月下旬まで諸事情によりブランクがあったため，実質2ヶ月程度．
この期間は1日1～2時間程度，以下の教材を用いて学習していました．
ブランク後の思い出す期間も含めてなので，通しであればもう少し短い期間でも取得できたはず......


# 教材

## AWS認定資格試験テキスト　AWS認定 ソリューションアーキテクト-アソシエイト

https://www.amazon.co.jp/dp/B07R1H87Y1/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

2019年4月発売の対策本．
試験範囲のサービスについて広く分かりやすく解説されており，用語レベルで分からない状態から概要が分かるところまでレベルアップできました．
AWSのサービスは日々進化しているので，この手の対策本は**出来るだけ新しいものを選ぶ**ことが重要．
自分は学習し始めた時に1周，試験を受ける前に1周の合計2周読みました．


## これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け22時間完全コース）

https://www.udemy.com/course/aws-associate/

大体どの合格体験記にも登場する動画教材．セールの時に買いましょう．
一昔前は20時間(?)のコースだったのが，今は22時間みたいです．
基本的な知識は前述の対策本で身についているのと，22時間はさすがに長いので，1.25倍～1.5倍速で見ると良いです．
ハンズオンも全部やる必要は無く，むしろ最後の模擬試験を繰り返し解いて知識を定着させる方が重要です．


## 公式の模擬試験

AWSが公式で出している1回2000円の模試．
本番と同じ形式なので，~~お布施~~練習と思って受けると良いです．
問題そのものよりも，見直し機能や英語に切り替える機能を試すための練習です(他のベンダー試験を受け慣れている人は不要かも)．
問題の難易度は本番試験よりも低め．


# 不要だった教材

- AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（5回分325問）
    - https://www.udemy.com/course/aws-knan/
    - Udemyで購入できる5回分の模擬試験．本番試験よりも難易度が高く，下手にやると自信を失くします．
    - 逆に本番試験でこの模試以上の難易度の問題はほぼ無かったため，これが解ければ十分とも言えます．
- 合格対策 AWS認定ソリューションアーキテクト －アソシエイト
    - https://www.amazon.co.jp/dp/B01LZ2CBKB/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
    - 学習初期に読んだ対策本．170ページしかなく内容が薄い上，2016年発売なので情報が古く，今から買って読む必要は無いです．


# 本番試験の所感

- 単純な知識を問う問題はあまり無い．
- 他の選択肢も間違いではないものの，コストやセキュリティの観点から最適なものを選ぶ必要がある．
- 130分で65問を回答するので時間はあるが，問題文が長いので途中で疲れる．
- 他のベンダー試験にありがちな，日本語が怪しい問題はほぼ無かった．
    - なので英語に切り替える機能もあまり使わなかった．


# あとがき

自分は4ヶ月もかけてしまいましたが，1日2時間で毎日学習すれば，1ヶ月程度で取れるかと思います．
最後まで読んでいただきありがとうございました．
自己紹介

はじめまして。

普段ははてなブログでアウトプットをしているのですが、
今年頑張ることの関係でプログラムとかDeepLearningのことを発信したり教えてもらうこともあると思い
まずは、自己紹介をすることにしました。
はてなブログはこちら
https://teyoblog.hatenablog.com/
ちなみにツイッターは　@mari_tw1229


### 経歴
高校、大学と理系で卒業し社会人ウン年目です。
DeepLearningを趣味で勉強しようとしています。
2020年は1000時間勉強しようと目標を立てて勉強中です。
目下の目標はG検定合格。

使用言語はC# Python

### 余談ですが趣味について
・ベース
・写真
・旅行
・モンスト


何よりも文章能力が低いのが悩みですが今後とも宜しくお願いします！
時間の計算　演算子　datetime timedelta

```py:
import datetime

now = datetime.datetime.now()

d = datetime.timedelta(weeks=-1)
d2 = datetime.timedelta(weeks=1)
d3 = datetime.timedelta(days=365)

print(now)
print(now + d)
print(now - d2)
print(now - d3)
```

```:実行結果
2020-02-26 11:24:59.726696
2020-02-19 11:24:59.726696
2020-02-19 11:24:59.726696
2019-02-26 11:24:59.726696
```
【Laravel】フラッシュデータを使おう

#はじめに
Laravelを触り始めた時、簡単なCRUD機能を持ったToDoアプリを作りました。
その時、データベースに保存したり、削除したりできるような機能を実装していました。
しかし、保存ボタンや削除ボタンを押してもアクションの処理が走るだけで味気ないです。保存できても出来てなくてもリダイレクトしたページを表示するだけです。
そんな味気ないアプリケーション嫌だ！！！！「保存に成功しました」ぐらいのステータスメッセージを表示はしてほしい。。。メッセージがないと成功か失敗かわからないですよね。
しかし、意外とステータスメッセージを自力で実装することはめんどくさいです。その理由を2つあげます。。

- 保存処理が実行した時にメッセージの内容を設定します。保存処理では最後にリダイレクトすることがほとんどだと思うので、メッセージの内容をリダイレクト先のアクションへ渡します。受け取ったアクションからビューへ受け渡すようにコードを書かないといけません。
- ステータスメッセージの表示は基本的に一回だけです。保存処理後のリダイレクト先のページから他のページにアクセスする時にメッセージを表示されないようにしないといけません。

上記の理由でステータスメッセージを自力で実装するのはとてもめんどくさいです。。
**そんな時にセッションのフラッシュデータです！！！**
セッション？フラッシュデータ？となると思いますので、ざっくり説明します
セッションを使うことでWebブラウザが閉じるまで一時的にサーバー側にデータを保存することが出来ます
フラッシュデータは次のリクエストまでの間セッションに保存されるデータのことです。
次のリクエスト（他のページへアクセスなど）では削除されます。ですので、フラッシュデータは主にステータスメッセージなど継続しない情報にはもってこいです！！

ではフラッシュデータを使ってステータスメッセージを表示させる方法を解説します。

#フラッシュデータの渡し方
フラッシュデータの渡し方は主に３種類あります
##flashメソッドで渡す
Flashメソッドを使うとセッションへ`status `という名前のデータを保存できます。
`status `の中身は`処理が完了しました`です

```php:保存アクション内
$request->session()->flash('status', '処理が完了しました');
return redirect('/');
```

##スタティックメソッドを使う
Sessionクラスのflashメソッドを使うことでも値を渡すことができます

```php:保存アクション内
\Session::flash('flash_message', '処理が完了しました');
return redirect('/');
```

##withメソッドを使う

`flash`メソッドと同じようにフラッシュデータを渡せる`with`メソッドもあります

```php:保存アクション内
return redirect('dashboard')->with('status', '処理が完了しました');
```

#ビューでの表示
次にビューでの表示の仕方について説明します
Bootstrapを使えばいい感じに表示してくれます

```php:
@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif
```

以上がフラッシュデータを使ったステータスメッセージの表示仕方です。

#おまけ
以下おまけです。
##フラッシュデータを1つ先のリクエストまで持続させたい場合
`reflash`メソッドを使うと全フラッシュデータを次のリクエストまで保持できます。

```php:
$request->session()->reflash();
```

##特定のフラッシュデータのみ持続させたい場合
`keep`メソッドを使います。

```php:
$request->session()->keep(['user', 'email']);
```


以上です！！！
**ここまで読んでいただきありがとうございました！！
疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**
阿佐志保『プログラマのためのDocker教科書 第2版』の誤植情報を集める

阿佐志保『プログラマのためのDocker教科書 第2版』(翔泳社, 2018)

- 出版社サイト： https://www.shoeisha.co.jp/book/detail/9784798153223
- GitHub： https://github.com/asashiho/dockertext2

出版社サイトの正誤表を見ると2件しか載っていなかったのですが、私が見つけただけでも10件ほどありましたのでまとめてみます。
まだ読み終えていないので読み終えたら問い合わせフォームからお知らせしようと思っています（問い合わせしました 2020/4/27）。
他にも見つけた方はコメントか編集リクエストで教えてください。

|ページ|誤|正|
|:--:|:--:|:--:|
|27|DBMS(省略)呼ばれることもあります|DBMS(省略)**と**呼ばれることもあります|
|29|需要な業務であるインフラ構成管理|**重要**な業務であるインフラ構成管理|
|48|バージョン管理手間がかかる|バージョン管理**の**手間がかかる|
|88|これは、コンテナIDを呼ばれるもので|これは、コンテナID **と**呼ばれるもので|
|93|「Offical」|「Official」|
|109|最下部の指定できるオプションの表 `-I`|`-i`|
|111|defaultというホスト名のサーバを操作していている|defaultというホスト名のサーバを操作**している**|
|136|一番下の表がおかしい。false という余計な文字が入っている||
|140|リスト4.3がおかしい。/tmp/etc にコピーしていない||
|140|nginx.cong|nginx.conf|
|144|1つのみなります|1つのみ**と**なります|
|156|Docker image ls コマンド|docker image ls コマンド|
|188|リスト5.60がおかしい。host.html は /docker_dir/web の下にあるはず||
|213|プライベートレジストリからのダウンロードしたイメージ|プライベートレジストリ**から**ダウンロードしたイメージ|
|219|既存のシステムの問題点のすべて解決される|既存のシステムの問題点**が**すべて解決される|
|222|80番ポートを公開(port:)して|80番ポートを公開**(ports:)**して|
|227|リスト7.8のインデントがずれている||
|228|リスト7.9のインデントがずれている||
|229|bool演算子(true/false/yes/no)|**bool値** (true/false/yes/no)|
|268|パブリッククラウドクラウド|パブリッククラウド|
|303|imageview:blue|imageview:green|
|341|Google Cloud Platfor m|Google Cloud **Platform**|

あと、誤植ではないのですが、6章の GitHub と Docker Hub の連携で使用する Dockerfile のビルドが失敗します。誰か助けて！

- https://hub.docker.com/repository/docker/hoxom/dockertext-cavityflow

Enjoy!
Apache環境でのMysql周りのあれこれ（備忘録）

## Mysqlにログイン

```Command:Command
> mysql -u ユーザー名(たとえばroot) -p
```

## Mysqlにアクセスして、データベースの一覧をみる

```Command:Command
mysql> Show databases;   #このコマンドでデータベースを確認
```

## Mysqlの特定のデータベースからデータを抽出し、ローカルに移す

### 1. Mysqlのデータファイル（Dumpファイル）を作成する

```command:command
$ mysqldump -u root -p データベース名 > 抽出を反映したファイル名（任意） 
```
AtCoderのテストツール for Pythonを作った

# 序

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155933/f204561a-4aba-9995-eb04-643fb932f573.png)

AtCoderの問題を解き、入出力サンプルによるテストで動作確認する際、
手作業でコピーして出力を確認…の繰り返しでは意外と時間がかかってしまい、
特に100点～200点問題の正解時間に影響を与えます。

これを削減するために入出力データの組を与えて自動でテストを行うツールを作成しました。

# ソース
https://github.com/mui-nyan/atcoder_testtool

# 導入

* 上のリンクからソースをダウンロードして適当なディレクトリに配置します。
* `.bashrc`などに関数として追加(↓)するか、`atcoder_testtool`をPATHに追加します。
  * Windowsの場合は、Git-BashやCygwinなどの環境を使用してください。

```bash
actest_python() {
    bash ~/Documents/dev/atcoder_testtool/actest_python.sh $1 $2
}
```

# 使い方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155933/a1ea4fd8-3947-eacf-c527-463864b86152.png)


テストしたいソースファイルと同じディレクトリにデータファイルを作成します。ここでは`input`というファイル名としました。
データファイルのフォーマットは以下のように、`入力---出力===`の繰り返しになっています。

```
入力1
---
出力1
===
入力2
---
出力2
===
```
(最後の出力のあとも`===`が必要)

`actest_python`を実行し、引数にソースファイル名とデータファイルを与えれば順にテストされます。

```
$ actest_python B.py input
AC 91ms Expect: 2 Actual: 2
AC 92ms Expect: 0 Actual: 0
AC 91ms Expect: 5 Actual: 5
```

不正解や制限時間オーバーの場合の表示サンプルです。
制限時間は固定で2secとしました。

```
$ actest_python B.py input
WA 96ms Expect: 2 Actual: 3
TLE 2192ms Expect: 0 Actual: 0
AC 91ms Expect: 5 Actual: 5
```

# データファイルを楽して作りたい

テストは楽に行なえますが、データファイルの作成がやっぱり面倒なので、
データファイルの作成を補助するツールも作りました。

上のGitHubにも含まれていますが、これです。

```
javascript: (function(){ let ans = ""; let i=0; while($(`.lang-ja #pre-sample${i}`).length > 0) { const input = $(`#pre-sample${i}`).html().trim(); const expect = $(`#pre-sample${i+1}`).html().trim(); ans += input + "\n---\n" + expect + "\n===\n"; i += 2; } console.log(ans); navigator.clipboard.writeText(ans); })();
```

これをブックマークに登録し…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155933/01ad9735-83a1-e44e-5023-50c22d5494d7.png)

問題ページで実行して…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155933/5fd27a12-3933-4fc2-1f90-f383390c79f2.png)

貼り付けると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155933/10e9aeb1-01d9-3431-ddaa-cdc9e52ee59d.png)

データファイルができます！

# 結果

嬉しい！
動的計画法でnCrを求める

#導入
こんにちは。けちょんです。
皆さんは**組み合わせの総数を出力するプログラム**を書けますか？
自分は競技プロで出会ったときに書けませんでした。
恥ずかしくて復習です。

#方法
今回は以下の漸化式を利用して、動的計画法で導きます。

```
nCr = n-1Cr-1 + n-1Cr
```
ちなみに、この漸化式のイメージは以下です。

```
n個からr個を選ぶ組み合わせは、以下の和である。
（n個から一個除いて考える）
1.追加されている1個が選択されている場合
　総数はn-1個、選択する数は残りr-1個
2.追加されている1個が選択されていない場合
　総数はn-1個、選択する数は残りr個　
```
図で書きたかったんですが、怠けました。

ソースは以下です。

```java
import java.util.Scanner;

public class Main {
	static Integer[][] dp;

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int R = sc.nextInt();

		dp = new Integer[N + 1][R + 1];

		// 初期値を設定
		for (int i = 0; i <= N; i++) {
			dp[i][1] = i;
		}
		for (int i = 0; i <= R; i++) {
			dp[0][i] = 0;
		}

		// "nCr = nCn-r" を使い、計算量を節約
		if (R > N / 2) {
			R = N - R;
		}
		int res = comb(N, R);
		System.out.println(res);
	}

	private static int comb(int n, int r) {
		if (r == 0) {
			return 1;
		}
		// "nCr = n-1Cr-1 + n-1Cr"を使用
		return getInt(n - 1, r) + getInt(n - 1, r - 1);
	}

	private static int getInt(int n, int r) {
		if (dp[n][r] != null) {
			// 与えられた(n,r)に対して、dp表から値を返す。
			return dp[n][r].intValue();
		}
		// dp表に無い場合は、combに渡し、導出する
		return comb(n, r);
	}
}
```

ちゃんと動いていそうです。
ちなみに計算量はO(n^2)らしいです。
参考：https://www.slideshare.net/chokudai/abc021

動的計画法を使わないと計算量が莫大になるので注意です。

#次回
次回は逆元を用いる方法を紹介します。
計算量はなんと**O(n logp)**とのこと
※p = 10^9+7 であり、出力値をpで割る前提
[漏洞通告]CVE-2020-0688/Microsoft Exchange .Net反序列化远程代码执行漏洞

### 漏洞描述
  2020年2月11日,微软发布了针对`Exchange Server`中的.Net反序列化远程代码执行漏洞`CVE-2020-0688`的补丁程序.
  当服务器在安装时无法正确创建唯一密钥时,`Microsoft Exchange Server`中将存在一个远程代码执行漏洞.该漏洞是由于Exchange控制面板（ECP）组件中使用了静态密钥`validationKey和decryptionKey`。这些密钥用于为`ViewState`提供安全性。`ViewState`是ASP.NET Web应用程序在客户端上以序列化格式存储的服务器端数据。客户端通过`__VIEWSTATE`请求参数将此数据传回服务器。经过身份验证的攻击者可以诱使服务器反序列化恶意制作的`ViewState`序列化数据，从而在`Exchange`控制面板Web应用程序的上下文中执行任意.NET代码。由于Exchange控制面板Web应用程序是以`SYSTEM`权限运行，因而成功利用此漏洞的攻击者可以以`SYSTEM`权限执行任意命令，并完全破坏目标Exchange服务器.
###漏洞编号
CVE-2020-0688
### 漏洞威胁等级
高危

### 影响范围
Microsoft Exchange Server 2010 Service Pack 3 Update Rollup 30
Microsoft Exchange Server 2013 Cumulative Update 23
Microsoft Exchange Server 2016 Cumulative Update 14
Microsoft Exchange Server 2016 Cumulative Update 15
Microsoft Exchange Server 2019 Cumulative Update 3
Microsoft Exchange Server 2019 Cumulative Update 4

### 漏洞验证
使用dnslog将username信息带出
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/9fcf1f29-885c-68ac-c9ef-e1deffc67193.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/2caf6620-ab83-0320-cde5-3a253fb8810c.png)
### 修复建议
微软已发布补丁:
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0688
### 时间轴
[0] 2020/02/11 微软发布补丁
[1] 2020/02/25 ZDI公开细节和演示
[2] 2020/02/26 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告
### Reference
https://www.zerodayinitiative.com/blog/2020/2/24/cve-2020-0688-remote-code-execution-on-microsoft-exchange-server-through-fixed-cryptographic-keys
https://mp.weixin.qq.com/s/cUWL15YsS2GrId2Fo8ZsbA
githubからherokuにデプロイ

######前提として

- laravelのアプリケーションがある
- githubにpushしている


###herokuにnew appを作る

なんか適当な名前をつけて**create new app**ボタンをピッ！！！

###githubにあるアプリケーションをデプロイする

new appが作れたらそのappをクリックして、上にある**Deploy**をクリックする

<img width="609" alt="スクリーンショット 2020-02-26 18.13.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490844/7c2c7cf7-cd2b-f5c7-a61b-4372a0c6bd94.png">

githubを選んで、その下でレポジトリを選ぶ。

最後にbranchを選んで**deploy**ボタンをピッ！！！

###APP_KEYを設定する

今の状態だと、デプロイはできるものの
**Whoops, looks like something went wrong.**
ってエラーが画面に出てくるので、
APP＿KEYを設定する必要がある

これは**setting**をポチッとして上から２番目のConfig Varsというところに、

ターミナルで
`php artisan key:generate --show`
と入力しててできたkeyを登録すればいい

右側にはAPP_KEYと入力
【Rails Devise】ログインユーザーのみ、内容を見れるようにするには

# ログインユーザーのみ、内容を見れるようにするには

Devise使用時に、ヘッダーやログアウトボタンなどの内容をログインユーザーのみに表示させたい場合などに、
ご参考にして頂ければと思います！

めちゃめちゃ簡単です！

```Ruby:html.erb
<% if user_signed_in? %>
   <%# この間に書かれた内容はログインユーザーのみ見れる %>
<% else %>
   <%# この間に書かれた内容はログインしていないユーザーのみ見れる %>
<% end %>
```

こんな使い方！

```ruby:html.erb
<% if user_signed_in? %>
   <li><%= link_to 'LOGOUT', destroy_user_session_path, method: :delete %></li>
<% else %>
   <%= link_to "ログイン", new_user_session_path, class: 'post' %>
   <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
<% end %>
```

これでログインユーザーだけがログアウトできて、ログインしていないユーザーだけが新規登録やログインができます！
JasmineでServiceのテスト時にPrivate propertyにSpyする方法

Jasmine3.3

一度anyのオブジェクトに入れ替えるとプロパティが挿入できる。
これで正しいかは謎ですが、、、(any敗北説

```javascript:test.service.spec.ts

describe('TestService', () => {
let testService: TestService();

  beforeEach(() => {
    testService = new TestService(); //サービスの初期化
  });

  it('test') () =>{
    let testSpy: any = testService;
    testSpy.undefinedProperty = 0;
    testSpy.func();
  });
});
```

```javascript:test.service.ts
private undefinedProperty: number

  func() {
    if(this.undefinedProperty === 0){
      //something
    }
  }
```
datetime その1

```py:
import datetime

now = datetime.datetime.now()
print(now)
print(now.isoformat())
print(now.strftime('%d/%m/%Y-%H:%M:%S:%f'))
print('##########')

today = datetime.date.today()
print(today)
print(today.isoformat())
print(today.strftime('%d/%m/%y'))
print('##########')

t = datetime.time(hour=1, minute=15, second=30, microsecond=100)
print(t)
print(t.isoformat())
print(t.strftime('%H:%M:%S:%f'))
```

```:実行結果
2020-02-26 10:56:54.691417
2020-02-26T10:56:54.691417
26/02/2020-10:56:54:691417
##########
2020-02-26
2020-02-26
26/02/20
##########
01:15:30.000100
01:15:30.000100
01:15:30:000100
```
fragmentで読み込んだ画像データがメイン画面に出力されない⁉︎

# フォルダから参照したはずのファイルが…
私初めてのAndroidアプリの開発に取り組んでいるのですが…
なんともwebとは勝手が違い大変なことになっています。そこで私が直面したのはこれです！
fragmentを起動しそこで読み込んだ画像をMainActivityのImageView(id=display)に出力していくというプログラムを書きました。実際のプログラムは以下の通りです。

```:Kotlin

if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
            val imageBitmap = data!!.extras!!.get("data") as Bitmap
            display.setImageBitmap(imageBitmap)
            Log.d("写真",imageBitmap.toString())
        }
        //カメラロールの画像を出力
        else if(requestCode == READRE_REQUEST_CODE){
            try {
                data?.data?.also { uri ->
                    val inputStream = this.context!!.contentResolver?.openInputStream(uri)
                    val buffered = BufferedInputStream(inputStream)
                    val opt = BitmapFactory.Options()
                    opt.inJustDecodeBounds = false
                    val image = BitmapFactory.decodeStream(buffered,null,opt)
                    inputStream!!.close()
                    display.setImageBitmap(image)
                    Log.d("写真",image.toString())
            }
            } catch (e: Exception) {
                Log.d("写真","失敗")
            }
        }
```

ここで問題が発生しました。
なぜかMainActivityのdisplayに画像が出力されないのです。
おかしい？
一応バグは見当たらないしうまくいくはずなのですが…
う〜ん私にはわからないな！諦めて教えてもらおう！カモン先輩！
ということで我が先輩を召喚することにしました！
すると意外にもあっさり解決してしまいました。

# 何が問題だったのか？
私にとっては一見何も問題なく見えるコードでしたがこのプログラムには大きな問題がありました。
それはこれが**fragmentのKotlinファイル**であることです。つまりいくら読み込みができてもここで指定したid、つまりdisplayというidはfragmentの中には**存在しない**ので新たなidがfragmentの中で作られているだけという状況になっていたのです。
## 解決策
解決策は至ってシンプルでした！
やるべきことはたった一つです
fragmentのなかにMainActivityのdisplayを宣言してあげればいいのです！
僕のイメージはポケモンの学習装置でした。
この場所にいなくても間接的に関わることで経験値をゲットできるなんてサイコーかよ！
というわけで解決策はこうです！

```:Kotlin
class CameraFragment:Fragment(){

    private lateinit var display :ImageView
//以下省略
}
```
というわけで以上のようにfragmentのはじめに定義してあげました。
ちなみに`lateinit`をもちいてdisplay変数を指定してあげることで初期化済み変数として指定されるので情報の重複がなくなるのでエラーが出にくくなります。つまりMainActivityで宣言した`display`とfragmentで使用しようとした`display`が別のものとして定義されていたという状況になっていたのを回避したのです。初期化してある`display`を呼び出してそこに取得した画像情報を代入して画面表示するようにしてあげればいいというのが今回の解決方法です。
ということで以上のようにすることで私は解決することができました。
ご視聴ありがとうございました...
Pythonで単語のカウント (paizaランク C 相当)を解く

# 初めに
paizaのレベルアップ問題集を解いていたのですが、模範解答がなかったので自分で作ってみました。
言語はPython3です。

# 問題
Paizaのスキルチェック見本問題 単語のカウント (paizaランク C 相当)
https://paiza.jp/works/mondai/skillcheck_sample/word-count?language_uid=python3
ログインしないと問題文が見れませんでした。
登録は無料ですぐにできるので、とりあえず登録してみることをおススメします。

# 解答コード
```python:sort-number.py
s = input().split()
word_list = []
for word in s:
    if not word in word_list:
        print(word, s.count(word))
        word_list.append(word)
```

# 参考
https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c

# 最後に
分からないところがあれば気軽にコメントしてくださいね。
できるだけ答えますよ！
PythonでFizz Buzz (paizaランク C 相当)を解く

# 初めに
paizaのレベルアップ問題集を解いていたのですが、模範解答がなかったので自分で作ってみました。
言語はPython3です。

# 問題
Paizaのスキルチェック見本問題 Fizz Buzz (paizaランク C 相当)
https://paiza.jp/works/mondai/skillcheck_sample/fizz-buzz?language_uid=python3
ログインしないと問題文が見れませんでした。
登録は無料ですぐにできるので、とりあえず登録してみることをおススメします。

# 解答コード
```python:fizz-buzz.py
N = int(input())

for i in range(1, N+1):
    if i % 3 == 0 and i % 5 == 0:
        print("Fizz Buzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)
```
解説は、[こちら](https://qiita.com/rA9-S/items/9d1c4108e23dae56bfce)
# 参考
https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c

# 最後に
分からないところがあれば気軽にコメントしてくださいね。
できるだけ答えますよ！
CircleCIのスペックを上げたい

## はじめに

CircleCIでコンテナのスペックを上げるには、resource_classを指定する必要があります。

本記事は、このresource_classの簡単な解説です。

## 環境

CircleCI 2.1

## resource_classとは

ジョブのコンテナに割り当てるCPUの数とメモリ容量の組み合わせを、以下のクラスから指定することができます。

| クラス|仮想CPU数|メモリ容量|
|:-------|:----|:-------|
| small  |    1|     2GB|
| medium |    2|     4GB|
| medium+|    3|     6GB|
| large  |    4|     8GB|
| xlarge |    8|    16GB|

([公式](https://circleci.com/ja/pricing/)を見ると、さらに上のクラスも存在する様子)

## resource_classを使うには

CircleCIのconfig.ymlで、以下のように指定します(Version 2.1である必要もあります)。

```yaml:.circleci/config.yml
version: 2.1
jobs:
  build:
    docker:
      - image: circleci/php:7.4-node-browsers-legacy
    resource_class: medium+ # ここで指定
    working_directory: ~/laravel
```

ただし、この機能を使うには、有償のPerformance Plan以上を契約した上で、サポートに依頼して有効化してもらう必要があります。

有効化を行わないまま、CircleCIを実行すると、CircleCIの画面上に以下のような警告が出ます。

<img width="640" alt="warinig" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/be6498c4-d4ba-1cf7-79df-7bb55a49fab9.png">

>Resource class medium+ for docker is not available for your project. This message will often appear if the pricing plan for this project does not support medium+ use. Default class medium will be used. Please contact your CSM person or our support team to whitelist your project.
>
>Dockerのリソースクラスmedium +は、プロジェクトでは使用できません。このメッセージは、このプロジェクトの価格プランが中程度以上の使用をサポートしていない場合によく表示されます。デフォルトのクラス媒体が使用されます。 CSM担当者またはサポートチームに連絡して、プロジェクトをホワイトリストに登録してください。

サンプルのconfig.ymlでは`medium+`を指定しましたが、機能が有効でないと、

- Default class medium will be used.

とある通り、デフォルトである`medium`が使用されます。

サポートには以下から問い合わせ可能です。

- https://support.circleci.com/hc/ja/requests/new

## 参考

- [CircleCI 設定リファレンス - resource_class](https://circleci.com/docs/ja/2.0/configuration-reference/#resource_class)
Pythonで数の並び替え (paizaランク D 相当)を解く

# 初めに
paizaのレベルアップ問題集を解いていたのですが、模範解答がなかったので自分で作ってみました。
言語はPython3です。

# 問題
Paizaのスキルチェック見本問題 数の並び替え (paizaランク D 相当)
https://paiza.jp/works/mondai/skillcheck_sample/sort-number?language_uid=python3
ログインしないと問題文が見れませんでした。
登録は無料ですぐにできるので、とりあえず登録してみることをおススメします。

# 解答コード
バブルソートを自分で書いてみました。

```python:sort-number.py
# 入力された値を保存する
n = int(input())
a = []
for i in range(n):
    a.append(int(input()))

# バブルソート
def bSort(a):
    for i in range(len(a)-1):
        for j in range(len(a)-1, i, -1):
            if a[j] < a[j-1]:
                a[j], a[j-1] = a[j-1], a[j]
    return a

# 答えを出力する
for i in bSort(a):
    print(i)
```

# 参考
https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c

# 最後に
分からないところがあれば気軽にコメントしてくださいね。
できるだけ答えますよ！
Pythonで文字の一致 (paizaランク D 相当)を解く

# 初めに
paizaのレベルアップ問題集を解いていたのですが、模範解答がなかったので自分で作ってみました。
言語はPython3です。

# 問題
Paizaのスキルチェック見本問題 文字の一致 (paizaランク D 相当)
https://paiza.jp/works/mondai/skillcheck_sample/diff_str?language_uid=python3
ログインしないと問題文が見れませんでした。
登録は無料ですぐにできるので、とりあえず登録してみることをおススメします。

# 解答コード
```python:diff_str.py
# 入力された文字列を保存する
a = input()
b = input()

# 文字列を比較し答えを出力する
if a == b:
    print("OK")
else:
    print("NG")
```


# 解答コード　その２
頑張って一文で書くとこんな感じになりました。
これが一般的なのですかね？

```python:diff_str.py
print("OK" if input() == input() else "NG")
```

# 参考
https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c

# 最後に
分からないところがあれば気軽にコメントしてくださいね。
できるだけ答えますよ！
コードレビューする前に読みたい記事まとめ

たくさん勉強になる記事があったのでまとめました。

- [コードレビューの際に気をつけること](https://qiita.com/awakia/items/8344ba751426e386e0f5)
- [コードレビューの虎の巻](https://qiita.com/teradonburi/items/2fa475c860d0fb16c0eb)
- [レビュワーの指摘の価値を上げるほんのちょっとした工夫](https://qiita.com/gakuri/items/53a0802ab82115501473#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E5%93%81%E8%B3%AA%E7%89%B9%E6%80%A7)
- [Google's Engineering Practices Documentation コードレビューで何を期待するべきか](https://shuuji3.xyz/eng-practices/review/reviewer/looking-for.html)
- [Mercari Engineering Blog より良いコードレビューをするために気をつけていること](https://tech.mercari.com/entry/2019/12/22/080000)
- [BASE DEVELOPER'S BLOG 私がコードレビューの際に気をつけているコメントの書き方](https://devblog.thebase.in/entry/2019/06/13/110000)
- [レビュー目的・観点設定の効果と課題](https://www.slideshare.net/AdachiKenji/ss-59510938)