OmniAICreator/Qiita-1.07M huggingface dataset:
[SQL学習④]DISTINCT・ORDER BY・OFFSET・FETCH

<h2>①DISTINCTで重複行を除外</h2>

![スクリーンショット 2021-11-13 21.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/dd7261c6-5705-9d9b-8a04-c0f845d58601.png)

↓

![スクリーンショット 2021-11-13 21.05.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/a3ac95b4-5cf9-6c0a-30e6-9481e580ca2e.png)
登録店舗で抽出。さらに、重複行はまとめます。

```
SELECT DISTINCT　登録店舗
FROM 会員登録

DISTINCTをつけることにより重複行は削除できます。
```

<h2>②並び替え</h2>
![スクリーンショット 2021-11-13 21.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/0da2a072-8e4f-bcac-bcf9-73a48d87b3fd.png)

日付の降順（新しい順）になるように並べ替えます

```
SELECT * FROM 会員登録
ORDER BY 日付　DESC

昇順はASC
```

<h2>③複数行での並び替え</h2>
![スクリーンショット 2021-11-13 21.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/0d3c0c96-f343-84a2-b351-500d839a5918.png)

数学を降順、国語を降順で並び変える場合、以下の２パターンで並び替え可能

```
SELECT * FROM 成績表
ORDER BY 数学　DESC, 国語　DESC

SELECT * FROM 成績表
ORDER BU 3 DESC,4 DESC
```

<h2>④取得行の指定</h2>
先ほどの成績表を使用し、数学の点数の高い順に名前と数学の点数を「２件」取得してみます。

```
SELECT 名前,数学　FROM　成績表
ORDER BY 数学　DESC
OFFSET 0 ROWS
FETCH NEXT 2 ROWS ONLY
```

OFFSETには除外したい行数、FETCH NEXT ？ ROWS ONLYには所得したい行数を記載します。
FETCHを使い、2番目に数学の点数の高い、名前と数学の点数を表示します。

```
SELECT 名前,数学　FROM　成績表
ORDER BY 数学　DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY
```

<h2>①〜④までのまとめ</h2>

ハンバーガーショップの注文履歴テーブルが以下のようにあります。
![スクリーンショット 2021-11-13 21.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/7451e911-0bcd-46e0-5de9-2815825a4f77.png)

①注文順かつ枝番順に全ての注文データを取得します。

```
SELECT * FROM 注文履歴
ORDER BY 注文番号,注文枝番
```

②2021年4月に注文のあった商品名一覧を商品名順に取得します。

```
SELECT DISTINCT 商品名 FROM 注文履歴
WHERE 日付 >='2021/04/01' AND 日付　<='2021/04/30'
ORDER BY 商品名
```

③「ポテト」の商品を対象に注文金額の低い方から２〜４番目の注文の注文番号と枝番、金額を取得する。

```
SELECT 注文番号,注文枝番,注文金額　FROM　注文履歴
WHERE 分類='ポテト' ORDER BY 注文金額
OFFSET 1 ROWS
FETCH NEXT 3 ROWS ONLY
```
AWS何から勉強すればよい？

AWSに興味を持ったけど何から勉強したらと
悩める人への指針になればと思い投稿します。



# 自己紹介

・前職ネットワークエンジニア　3年

・AWS歴　1年

・AWS資格　11冠(全冠)


# 前提知識

・サーバの基礎知識がある
　サーバってなにか説明できる
　Linuxの基本コマンドがわかる
　何かしらのサーバ構築をしたことある
　

・ネットワークの基礎知識がある
　プライベートアドレスとグローバルアドレスの違いを説明できる
　CIDRとはなにか説明できる
　LANとWANの違いを説明できる
　ルーティングがなぜ必要か説明できる
　閉域網とは何か説明できる

この辺があればとりあえず何とかなると思います。
その他諸々は随時勉強していけばよいかと思います。

# 何から勉強したらよいか

何か元々使いたいサービスが決まっているのであれば、
きっとこの記事にたどり着いていないかと思います。

そんな人のために基礎として、
入り口として勉強しておいてほしいサービスは下記3つです。

・**IAM**

・**VPC**

・**EC2**

結構、この業界ではとりあえず手を動かせ！の精神が強いですが、
私は反対派です。

理由はよくわからないけど動いた・・・・
っていうのが一番タメにならないと私は思っています。

全てを理解してからである必要性はないですが、
概要をある程度理解したら、自分の言葉で要約して理解しましょう。
その理解のもと、手を動かしていくことで答え合わせができると思っています。
最初の理解が間違っていても落ち込む必要はなく、
間違っていたと気づけることで理解がより深まり記憶に定着します。

私も最初の理解が間違っていることのほうが多いです。



# IAMとは

IAMとはAWSサービスを使う上での権限管理サービスです。
全サービスが彼(IAM)の支配下にあります。

AWSアカウントを作ったときには、いわゆる**ルートユーザー**である。

ルートユーザーを一言で表すと

AWSアカウントを一つの国と例え、
ルートユーザーは王様である。

**ルートユーザーで作業をするな**といろんな記事で書いてありますが、
これはどういうことかというと、
**王様が最前線で戦いに行こう**としているということです。

王様はお城に閉じ込めておきましょう。
王様がやられてはあなたの国(AWSアカウント)が崩壊することにつながります。

ただ王様をお城に置いておくだけでは国は発展しません。
そのために働いてくれる兵士(**IAMユーザー**)が必要になるのです。

兵士(IAMユーザー)に役職(権限)を与え、必要なことだけできるようにしましょう。
あまりにも役職(権限)が強いと裏切られた時の損害は大きくなるので、
最小限の役職(権限)にとどめておきましょう。



概要はAWS公式のクラウド活用資料集(BlackBelt)で学んでください。

https://www.youtube.com/watch?v=K7F5yTThynw

https://www.youtube.com/watch?v=qrZKKF6V6Dc


# VPCとは

VPCとはEC2をはじめとするサービスを利用するための仮想ネットワークを指します。

仮想ネットワークといわれてもとっつきにくいと思うので、
例えると家を建てたりするための**土地**がVPCの立ち位置です。


AWSには、VPCを利用するサービスとVPCを利用しないサービスがあったりしますが、
とりあえずは一応2分化していることを理解しておけばよいかと思います。

VPCは、ゲートウェイつまり出口を作らない限りは、
誰も立ち入ることのできない領域になります。

インターネットへの出口であるインターネットゲートウェイ
VPNやAWSの専用線サービスでDirect Connectで利用される仮想プライベートゲートウェイ
などがあるので、用途によってVPCの出口を設置してあげます。

ここでは特に前提知識で記載したネットワーク知識が必要になります。

概要はAWS公式のクラウド活用資料集(BlackBelt)で学んでください。

https://www.youtube.com/watch?v=JAzsGRS_o4c


# EC2

最後にEC2です。
EC2は、ハードウェアの面倒を自分で見る必要がない仮想サーバです。
他のAWSサービスでもこのEC2が利用されているものがあります。

先ほど、VPCは土地と言いましたが、EC2は**家**にあたります。
そのためVPCとEC2は依存関係にあり、
土地が無ければ家は建てられないのと同様に
VPCがなければEC2は建てられないことになります。

なので順番的にも、VPC→EC2の順番で構築していくことになります。

サーバの勉強したければEC2を立てて、OS内を触ってみるとよいかと思います。
例えばwebサーバ構築したければ、Amazon linuxでapacheをインストールしてみたり、
DBサーバを構築したければ、Amazon LinuxでMySQLをインストールしてみたりみたいに・・・


初学者が一番怖いと思うのが、サーバ料金だと思います。
基本的に従量課金なので利用した時間の分だけ払うだけなので、
公開予定のないサーバであれば勉強で構築して削除というのが数分で可能になります。
とりあえずAWSアカウント作成して1年であれば無料枠があるので、
無料枠を利用していろいろ試してみるとよいかと思います。


概要はAWS公式のクラウド活用資料集(BlackBelt)で学んでください。

https://www.youtube.com/watch?v=P5zX4DdlYOE

# AWSアカウント作成

上記で概要を学んだらとりあえずAWSアカウントを作成しましょう。
作成したら期間限定無料枠があるので、もったいない精神で利用してみましょう。
またAWSアカウントを作成するだけならお金はかかりません。
初めの第一歩を踏み出しましょう。

https://aws.amazon.com/jp/register-flow/

# 最後に

最後にですがAWSサービスについて知りたいときについては、
ちょくちょく挟んでいるクラウド活用資料集(Black belt)を見ることをお勧めいたします。

初学者にはなかなか公式ドキュメントを読んでもすんなり入ってこないかと思います。
公式ドキュメントで心を折ってしまってももったいないので、
AWSジャパンが公式かつ無料で公開しているクラウド活用資料集(Black belt)を利用しましょう。

サービス別の資料集をリンクを下記に記載します。

https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
Qiita API アクセストークン発行方法

# Step1
画面右上のアイコンをクリック→「設定」→「アプリケーション」→「新しくトークンを発行する」

![スクリーンショット 2021-11-13 12.31.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/4293ec11-6ed9-09d8-f128-9b81736b8db3.png)


![スクリーンショット 2021-11-13 12.36.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/b8fcfb15-b19d-c734-8fdd-6962b7690918.png)


![スクリーンショット 2021-11-13 12.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/4395017b-5251-0f8b-0b20-84314567755c.png)

# Step2
* 複数のアクセストークンを発行した場合に備えて、「アクセストークンの説明」入力しておく。
* 記事を取得したいので「read_qiita」のみに ✅　 →「発行する」

![スクリーンショット 2021-11-13 12.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/4b0fd6f1-42ce-5a62-f794-4e15d4601572.png)

# Step3
**発行されたアクセストークンを控えておく**

![スクリーンショット 2021-11-13 12.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/08fa6bb6-428f-bf51-92ef-48abcf851210.png)

リロードするとアクセストークンは見れなくなり、「アクセストークンの説明」で入力した内容が表示される。
![スクリーンショット 2021-11-15 21.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/6b4b4328-0716-14c8-6b0f-5a7038942886.png)



# 参考サイト
* [Qiita APIを使って記事一覧を取得する](https://qiita.com/koki_develop/items/57f86a1abc332ed2185d)
* [Qiita API を使って、記事データを取得する方法](https://qiita.com/wakudar/items/8c594c8cc7bda9b93b4e)
[OutSystems]スマートフォンでだけ非表示になるUI部品

スマートフォンは画面が狭いために、特定のUIを非表示にしたいことがある。
標準部品でを実現する方法。

# 確認環境
Personal Environment(Version 11.13.0 (Build 31107))
Service Studio (Version 11.12.7)
対象はReactive/Mobile

# 実現したいこと
共通部品として、ユーザーに便利な情報（環境名とか、実行時間とか）を表示するBlockを提供しているとする。
スマートフォンでは画面が狭いので、この部品を非表示にしたいが、表示端末の種類（PC/タブレット/スマートフォン）ごとにモジュールを分けるのは避けたい。

# PC/タブレット/スマートフォンそれぞれで別のUIを定義するBlock (DisplayOnDevice)
OutSystems UIにAdaptiveというUI Flowがあります。
この中にあるWidgetは、閲覧している端末の種類（PC/タブレット/スマートフォン）によって見え方を変えられる。
　この仕組みは、[OutSystemsのColumn系BlockのAdaptive Pattern対応](https://qiita.com/jyunji_watanabe/items/7de49088bb92b5841dd6)に書いています。参照したドキュメントがSilk UI (バージョン10のUI Framework）なので、Reactiveと違う部分もあるでしょうが、大枠はここに書いた通りのはず。

Display on Deviceには、PC/タブレット/スマートフォンに対応するPlaceholderがあり、実行時に端末に対応するPlaceholderの中身だけが表示される仕組み。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c5345003-c209-dcb0-6857-caf0011d2126.png)

- OnDesktop Placeholder: 閲覧端末がPCのときに表示されるUIを配置する
- OnTablet Placeholder: 閲覧端末がタブレット（iPadなど）のときに表示されるUIを配置する
- OnPhone Placeholder: 閲覧端末がスマートフォン（iPhoneなど）のときに表示されるUIを配置する

# DisplayOnDeviceを利用した実装例
## DisplayOnDevice適用前のUI
例として、実行日時を表示するBlockを考えてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7f134c41-20d3-dbad-9700-f1d190ce03d4.png)

ExpressionのValueプロパティには整形した日時を編集。

```
FormatDateTime(CurrDateTime(), "yyyy/MM/dd HH:mm:ss")
```

この実装をApplicationTitle（標準で作成されるBlockでモジュール名等を表示するBlock）に配置して実行すると、当然ながら、PCでもスマートフォンでも同じものが表示される。

PCでの実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7c0d4435-3926-24ca-369f-f9a9daadc189.png)

スマートフォン（をChromeのdevice toolbarでシミュレート）の実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6389462f-a148-0fed-ce4d-6b81ae5c27f6.png)

## DisplayOnDeviceを利用する実装に変更する（スマートフォンでは非表示に）
OutSystemsUIのAdaptive/DisplayOnDeviceの参照が必要。無ければ参照を追加しておく。

DisplayOnDeviceをドラッグ＆ドロップして、端末の種類に応じて表示を切り替えたい場所のルートに配置する。
ここでは、Containerの直下にした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/0a2f9b48-1c3d-464f-0e73-13564fff41db.png)

今回は、

- PC: 従前どおりの表示
- スマートフォン: 表示なし

にしたいので、元々あったExpressionをOnDesktopに移動すればよい。PC用であることのマーカーとして「(PC)」をExpressionのValueプロパティ末尾に付加。
スマートフォン用に表示するUIは、OnPhoneだが、今回は表示なしにするので、空のままでよい。

# 実行例
PCでの実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5cd37a6d-47de-f3bb-bdff-af4978f49fa4.png)

スマートフォンでの実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3ab59589-389e-1edf-2c06-02f8a2b14af3.png)

PCでは表示されるBlockが、スマートフォンでは、非表示になるのが確認できました。

# Traditional Webの場合の補足
OutSystemsUIはReactive/Mobile用とTraditional Web用では別物。
Traditional Web用のモジュール名は「OutSystemsUI Web」。

別のモジュールであるために、利用できるBlockも異なっている。
Responsive UI Flow内に、DisplayOnDeviceとMoveOnDevice（Contentに配置したUIを、タブレットで表示されたときにはTabletWidgetIdで示すContainerに、スマートフォンならPhoneWidgetIdで示すContainerに移動する）があるので、要求に合う方を使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/22bd37c0-d236-4b4b-966a-a7e9e3870297.png)
Javaファイルを解析してホワイトボックステストのテストケースを生成するツールを作成(※C1のみ　2021/11/13 現在)

表題の内容に関するツールを作成しました。
残課題がありますが一旦の区切りとしてコミットしました。

- ソースリポジトリ(Git)
https://github.com/miwa-m/decision_generator/tree/develop

- 実行可能jar
https://github.com/miwa-m/decision_generator/releases/download/0.0.2/DecisionMatrixGenerator.jar

- 動作環境
    Java 16(Open JDK 16) 

- 概要/使用方法(Git上のREADMEから)
# decision_generator<br>(Desicion Matrix Generator)

## Overview

Desicion Matrix Generatorは指定のJavaファイルからホワイトボックステストにおけるカバレッジを担保するテストケース表をxlsxに出力するツールです

## Specification

### Usage

#### Parameters

| name | alias | default | explain | required |
---- | ---- | ---- | ---- | ---- 
| -T | --target | - | 解析対象リソースのトップディレクトリ(例:c:/hoge/fuga/target) | Y |
| -M | --mode | C1 | 網羅度の指定(C0/C1/C2/MCC) ※2021/11/13 現在 C1のみ対応  | N |
| -D | --directory | (カレントディレクトリ) | 生成ファイルの出力先ディレクトリ | N |
| -F | --file | decision_matrix | 生成ファイル名(生成時に.xlsx が付与されます) | N |

#### Execute

java コマンドでjarを実行します

```
C:\hoge> java -jar DecisionMatrixGenerator.jar
 -T "C:\target\directory"^
 -M C1
 -D "C:\output\directory"^
 -F example
```

実行例

![execute_example](https://github.com/miwa-m/decision_generator/blob/readme_contents/readme_contents/execute_example.PNG?raw=true)

#### Details

- 処理仕様について

    対象ファイルには、
    -Tで指定したディレクトリ内の配下のディレクトリ内のファイル、ディレクトリ配下のファイル... も含まれます

    パラメータで網羅度の指定ができるが、現在はC1のみ対応

- 出力ファイルについて

    出力されるxlsxファイルには、-Tに指定したディレクトリ配下に存在するjavaファイル毎にシートが作成されます。
    シート内には、対応するjavaファイルに内に定義されているクラス、その内部に定義されているメソッド毎にテストケースが出力されます。

- 出力内容について

    (C1の為)各判定文が、真/偽となるための、判定文を構成する条件の真偽値を出力します。
    各判定文が真の時、そのブロック内での各判定文に対しても同様に解析を行い条件の真偽値を出力します。

    - ブロックについて
        
        if/else if/else
        for/while/do while
        (switch内の)case/default
        try/catch/finally
        を1ブロックとしています。

        各ブロック内への遷移(判定文が真)が発生する為の各条件の真偽の組み合わせは
        if / else if : 判定文が真となるような条件の真偽の組み合わせ
        else : 対応するif/else ifがそれぞれ偽となる組み合わせ
        for / while / do while : 繰り返しの判定が真となる条件の真偽の組み合わせ
        case : caseで指定された値に一致
        default : 対応するswitch内のcaseのいずれかに一致しない
        try : 対応するcatch内で指定されている例外が発生しない
        catch : 指定されている例外のいずれかが発生する
        finally : tryと同様
        となるように出力しています

![explain1](https://github.com/miwa-m/decision_generator/blob/readme_contents/readme_contents/explain_01.PNG?raw=true)

![explain2](https://github.com/miwa-m/decision_generator/blob/readme_contents/readme_contents/explain_02.PNG?raw=true)
    
![explain3](https://github.com/miwa-m/decision_generator/blob/readme_contents/readme_contents/explain_03.PNG?raw=true)

   - その他<br>
       あるブロックからみて、上に存在するブロック内にreturnやthrowがあったケースに関しては考慮されていません
        (⇒場合によっては各条件の真偽を揃えてテストを実行すると、あるブロックに処理が到達しない)
        三項演算子･lambdaには非対応となっています
        (上記いずれも残課題になります)
AWSのSAA-C02試験に合格してきた話

# 受験経緯
会社でAWSを扱う業務に就き、年次目標に受かる！って書いたのと、早めに合格してしまいたかったので、書くことにしました。

# 教材
最早王道というUdemyで。電車の中で動画を1.75倍速で見ていました。
ハンズオンは余裕がなくできませんでした。。。

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

模試は何度かやりましたが、合格ラインには惜しくも届かず、間違えたところを叩き込む形で復習したり、間違えたところのAWSのサービスについて公式サイトで内容を確認したり。。

# 結果
748点でしたが、ギリギリ合格、勝てば官軍というやつです。
スコアレポートとは言いつつもどこを間違えたのか教えてくれませんでした。
基本情報のスコアレポートの方がわかりやすいですね。。。
# Amazon LightSailからNTT-PC WebARENA Indigo VPSに移動③：ドメイン, Webサーバ, メールサーバ

# Amazon LightSailからNTT-PC WebARENA Indigo VPSに移動③：ドメイン, Webサーバ, メールサーバ

[前回のあらすじ](https://qiita.com/syakesaba/items/f3bcc90dc062eee4685e)

> ぼく「やっぱり基本的な機能は出来ないとね」

# 目次

1. [ドメイン](#ドメイン)
1. [Webサーバ](#Webサーバ)
1. [メールサーバ](#メールサーバ)
1. [fail2ban](#fail2ban)

# ドメイン

LightsailではDNSコンテンツサーバが無料だったが、Indigoでは有料なので注意。

# Webサーバ

懲りずにnginxを使う。

```
apt-get install nginx
ufw allow http
ufw allow https
# http://<IP>/ にブラウザでアクセスし、WelcomeでてたらOK
# 以下の設定はおまじないとしてやっておく。
# https://qiita.com/iwai/items/1e29adbdd269380167d2
echo "fs.file-max=200000" >> /etc/sysctl.conf
# https://www.mk-mode.com/blog/2014/04/13/nginx-file-discriptor-limit/
echo "net.ipv4.ip_local_port_range=18000 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse=1" >> /etc/sysctl.conf
echo "net.ipv4.ip_dynaddr=1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_rfc1337=1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout=10" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_probes=5" >> /etc/sysctl.conf
echo "net.ipv4.tcp_slow_start_after_idle=0" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog=1024" >> /etc/sysctl.conf
echo "net.core.somaxconn=65535" >> /etc/sysctl.conf
sysctl -p
vi /etc/nginx/nginx.conf #以下を設定
events {
    multi_accept on;
    worker_connections 128;
}
http {
        server_tokens off;
}
systemctl enable nginx
systemctl start nginx
#CPUの数だけnginxのworkerプロセスが起動していることを確認しておこう！
```

## LetsEncrypt

```
apt-get install certbot
#設定はなんの不自由もなくいけたので省略
# cronスクリプトは手動で作ろう。
rm /etc/cron.d/certbot
```

# メールサーバ

```
#送信サーバ
apt-get install postfix
ufw allow smtp
ufw allow smtps
ufw allow submission
#mailname勝手に入れてくれる・・・すごく楽ね・・・
#設定特につまるところナシ
#受信サーバ
apt-get install dovecot-imapd dovecot-pop3d
ufw allow pop3s
ufw allow imaps
# /etc/postfix/main.cf
# queue_directory = /var/spool/postfix
# この環境においては相対パスになるので
# smtpd_sasl_path = /var/spool/postfix/private/auth
# は間違い
# smtpd_sasl_path = private/auth
# が正解。
# CentOSはフルパス指定で動いたんだけど。
```

# fail2ban

```
#設定特に詰まるところナシ
apt-get install fail2ban
```

あとはufwでレートリミットすればだいたいOK

# ④へつづく・・・・
論文メモ：Human Pose Estimation using Global and Local Normalization

# 論文
**論文名**
*Human Pose Estimation using Global and Local Normalization*

**著者**
*Ke Sun, Cuiling Lan, Junliang Xing, Wenjun Zeng, Dong Liu, and Jingdong Wang.*

**学会**
*ICCV2017*

https://openaccess.thecvf.com/content_iccv_2017/html/Sun_Human_Pose_Estimation_ICCV_2017_paper.html


# 概要
　人物姿勢推定の論文。関節の位置というのは相対的にバラバラで実は畳み込みニューラルネットワークで関節の検出とポーズの推定を学習するのは難しい。本論文では、人体の正規化と手足の正規化2つを用いることによって、CNNの学習をより容易にし正確な姿勢推定を実現する。ベンチマークにおいて最先端手法を凌駕。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/b34d7236-16ce-1fc0-5616-839b79c7779c.png', width=500>
>Ke Sun, Cuiling Lan, Junliang Xing, Wenjun Zeng, Dong Liu, and Jingdong Wang. Human pose estimation using global and local normalization. In ICCV, pages 5600–5608, 2017.

# 貢献
- CNNの学習を促進する正規化手法の提案。ResNetやHourglassなど複数のバックボーンで有効。
- ベンチマークデータセットにおいて最先端手法を凌駕。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/9a3491a0-c0d2-c750-fd3d-3ee9493d1b48.png', width=400>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/188bae60-8612-3ab8-5b7c-81d4ae71a9da.png', width=400>

>Ke Sun, Cuiling Lan, Junliang Xing, Wenjun Zeng, Dong Liu, and Jingdong Wang. Human pose estimation using global and local normalization. In ICCV, pages 5600–5608, 2017.

# 評価
- いろんなデータセットで既存手法を凌駕（しているところもあればしていないところもある）

実験結果が多いので、論文を見る
ArduinoUNOでAND命令で遊ぶ


目的
ビット演算の理解を深める


![o_con96.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/08273a72-1a02-6303-ddfd-3938f95508da.jpeg)


![o_con97.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e6cf0131-1fd9-f71c-1166-b702a4d03127.jpeg)


![o_con98.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2f7c6bff-37f6-063a-a09b-492dac259ad0.jpeg)


![o_con91.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/89b6331b-a6b4-1873-891d-1406a79f25af.jpeg)




```c++



#include <Arduino.h>

int al; //アキュムレータ

int data_s[]={
  0x41,0x82,0x104,0x208,  0x410,0x820,0x1040,0x2080
};


void setup() {

  Serial.begin(9600); // 9600bpsでポートを開く

  Serial.println(' ');
  Serial.println("START");

  for (int jj = 0; jj < 8; jj++) {

    al = data_s[jj] & 0x80;

   Serial.print(al, HEX); Serial.print(" <-  0x"); Serial.print(data_s[jj],HEX);Serial.println("  & 0x80");

  }//for

}//setup

void loop() {
}//loop





```
AWS認定 DevOpsエンジニア – プロフェッショナル(DOP)試験に遅刻した(間に合った)話

笑い話です。

# 1.遅刻した試験概要
試験：DOP-C01: AWS Certified DevOps Engineer - Professional
受験日：‎2021年11月13日‎
チェックイン時間：09:45 JST
開始時間：10:15 JST‎‎
受験予約の時間：‎190‎ 分‎
試験会場：オンライン（自宅）

 **当日の起床時間：10:07** 
チェックイン開始は過ぎており、あと8分で試験開始の状況。
セーフっちゃセーフ。

# 2.時系列で振り返る

|時刻|行動|
|:--|:--|
|10:08|飛び起きて試験部屋を片付け始める。自宅受験では前後左右部屋の写真を撮りアップロードしなければならない。部屋から出せるあらゆるものを部屋の外に出す。動かせない本棚などは無地のタオルで覆い隠す。テレビ画面も隠すように言われるのでカーテンで画面を隠しておく。|
|10:13|免許証用意。寝起きで顔を洗う暇もなく眼鏡すっぴんなのでだいぶ顔が違う。|
|10:14|PC起動、ピアソンVUEにログイン。|
|**10:15**|**チェックインをクリック。すでに試験開始時間（ちょいすぎ）なので不安がMAX。**|
|10:16|「システムテストを実施」をクリックし、マイクやカメラの確認をする画面が表示され、なんとか本番のチェックインが進められる模様。事前にテストもしてあったのでマイク、音声、カメラすべてOK。|
|10:17|携帯で顔、免許証、部屋の写真を撮る手順に入るが、携帯で顔写真を撮ろうとするとiPhoneのブラウザ（Safari）が落ちてしまい写真が撮れない。4～5回リトライしたがうまくいかず、携帯再起動。|
|10:26|再起動した携帯で顔、免許証、部屋の写真を無事撮影完了、アップロード。|
|10:27|試験監督の方の応答を待つ時間。「安心してください。試験時間が過ぎても受験できます」という表示が出ていて安心する。|
|10:28|試験監督の方にチャットで「部屋を360°映してください」「眼鏡をはずしてカメラの前に映してください」「両腕をみせてください」など指示され、試験リリースしてもらう。|
|10:30|試験開始。特に試験時間が短くなったわけでもなく、試験画面の右上で180?190?分からカウントダウンが始まっていた（はっきり覚えていない）。始まってしまえばあとは集中するだけ。|
|11:00|飛び起きてそのまま半袖で受験していたので寒くなってくる。起きてからお手洗いにもいっていないのでお手洗いも気になってくる|
|12:40|60分ほど残して全75問回答完了。見直しに入る|
|13:35|時間切れになるまで見直し。アンケートに回答し、「合格」の表示が出る。よかった…|

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/271c9ba9-2e5a-6190-eb71-c73aa3e410e2.png)

- 自宅だったのでセーフだったが、テストセンターだったら起床時点で諦めていたかも。
- 事前に合格済みの試験で発行された特典「50% Discount on your next Exam」バウチャを使用して予約していたので\15,000（税込み\16,500）だったが、それでも無駄になるのは悲しいので間に合ってよかった。
- ピアソンVUEからのメールを確認すると **「試験の指定時間内であることを確認します (試験時間の 30 分前から 15 分後まで)。」** と記載があった。試験開始から15分以内にチェックインをクリックすれば間に合うのか、試験開始から15分以内にチェックインプロセスが終了していなければならないのかは読み取れなかった。

# 3.試験の内容
試験のガイドP9～11にガッツリ出題サービスまで記載があります。

https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/

## 出る出るといわれていて実際出たもの
- Codeシリーズ、Auto Scalling、DynamoDBなどを組み合わせたデプロイ方法を問われる問題が多い。
ダウンタイムが許容されないのか、ロールバック可能な方法を求められているのか、Blue/Greenデプロイを求められているのかなど判断して回答する必要がある。
- ElasticBeanstalk、ECSを利用したコンテナ環境のデプロイ方法を問われる問題が多い。
- CloudWatch Logs
- AWS Config
- CloudFormation
- Systems Manager
- OpsWorks

## 意外と出てきて震えたもの
- Amazon Inspector
- Trusted Advisor

※試験のガイドにはちゃんと書いてあります。

# 4.終わりに
試験当日ギリギリに起きた人の参考になれば幸いです（？）。自律神経が乱れ気味で夜布団に入るものの眠れない日が続いており、前日も布団には入ったものの眠れず。何とか合格できたのでよかったですが、自分に合う仕事を見つけて無理せず前向きに働きたいなと思います。
ArduinoUNOでシフト命令で遊ぶ


目的
ビット演算の理解を深める

![o_con95.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1295e514-11a9-d679-5470-986e4763e660.jpeg)




![o_con93.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c1503f4f-01bf-5b70-be15-9aa4632a2293.jpeg)



![o_con94.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d1751378-d811-625f-5bbe-fa540666fd61.jpeg)






```c++



#include <Arduino.h>

int al; //アキュムレータ

void setup() {

  Serial.begin(9600); // 9600bpsでポートを開く

  Serial.println(' ');
  Serial.println("START");

  for (int jj = 0; jj < 8; jj++) {

    al = 0x41 << jj;

   Serial.print(al, HEX); Serial.print(" <- 0x41 << "); Serial.println(jj);

  }//for

}//setup

void loop() {
}//loop




```
Google Cloud Storage にスクリプトでアクセス

Google Cloud Storage にアクセスする方法です。

プロジェクトの　ID を　example-project01-123456 とします。

バケットの一覧

```bash:list_buckets.sh
gsutil ls -p example-project01-123456
``` 

実行結果が次のようになったとします。

```text
$ ./list_buckets.sh 
gs://bucket001/
```

ファイルの一覧

```bash
gsutil ls -r gs://bucket001/
```

大きさも含めたファイルの一覧

```bash
gsutil ls -r -l gs://bucket001/
```

ファイルのダウンロード

```bash
gsutil cp gs://bucket001/folder_aa/file01.txt .
```
個人開発しくじり先生 ユーザ数4人でサービス終了した話

![しくじり先生part1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/3a9bbb50-e7e7-87f7-6d20-15a05d520683.png)

# 最初の個人開発サービス
みなさんは最初に個人開発でサービスをリリースしたとき、どれくらいユーザが集まりましたでしょうか？
私は友人３人と4ヶ月かけて「パンツシェアアプリ」を作ったのが最初の個人開発でして、その時の累計ユーザ数を申しますと・・・

**4人**

でした。
これは開発者3人を含んだ数字です。つまり実質1人ですね。

# タイトルコール
今回のしくじり先生のタイトルは**「4ヶ月かけて友人三人で必死でアプリを作ったけど、累計ユーザ数4人でサービス終了した話」**となります。

# いかにしてプロジェクトはスタートしたか
なぜ「パンツシェアアプリ」などという、名前を聞くだけで失敗しそうなものを作ることになったのか。

これには**深い話**があります。
大学生が３人集まって、語るとですね、俺らでも何かでかいことができるんじゃないかと盛り上がってしまいます。大学生が酒の場で盛り上がってそのままYoutubeチャンネルを開設してしまうようなものです。
その頃とあるプログラマが個人開発したサービスが会社に売却されたニュースなどで盛り上がっていました。自分たちも何かWebサービスを作れば一発当てられるのでは？と言うような話をしていたわけです。

そこで誰かが一人いいました

**「自分がいま履いているパンツを共有できたら面白くない？」**と。

私の反応は、

**「・・・」**

**「・・・面白い」**

**「「「やろう！！！！」」」**

ということで、ここから4ヶ月の地獄の開発と、私のエンジニア人生が始まったのです。

# どんなものを作ったのか
![panty-share-architect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/7861c439-9768-081d-8bbb-4f5f48e97463.png)

大まかに言うと上記のような感じです。
フロントはVue.jsでバックエンドとホスティングはFirebaseでした。
作った機能は以下の通りです。

* Twitterログイン
* パンツの形、柄、色を選べる
* コメントを書いて投稿
* そのほか色々なこだわり機能
    * いいね機能
    * コメント機能
    * Twitter共有機能
    * OGP

![panty-share.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/22125d1f-e23c-5c2c-2d0e-1f4ee0a8fcde.png)

投稿すると上記の画像のように、パンツをシェアすることができます。

# 開発
当初、３人は全員Web開発未経験でした。IT知識もほぼゼロです。
毎日大学の講義とバイトが終わった後、夜中に数時間、「この機能を実装するにはどうすればいいんだろう」と調べ、もがき苦しみながら開発を続けていました。

本当にズブの素人だったので、LocalStorageに保存しているユーザ名がXXXだったらAdmin権限を付与して投稿の削除から編集までなんでもできる、みたいなやばいコードを普通にフロントに書いてました。


# リリース
4ヶ月の地獄の開発を経て、盛りだくさんのこだわり機能を全て完成させ、ついにリリースしました。
まずは開発者の**三人が各々自分のパンツをシェアして、Twitterに投稿しました**。

しかし。。。使ってくれたユーザは全部で**１人**でした。。。

のちに我々三人はこのプロジェクトをこう振り返りました。


**「男三人が4ヶ月かけてインターネットにパンツを公開しただけのプロジェクト」**だと


# しくじりから学んだこと
しくじりから学んだこと、それは**「誰にも使われないサービスの作り方」**です。

① 友人と盛り上がってその場の思いつきで企画する

② 使われるかわからないままに作りたいものを作る

③ 全部の機能が完成するまでリリースしない

**これで誰にも使われないのに妙にめちゃくちゃ作り込まれたサービスが爆誕します** 

### じゃあどうすればよかったのか？
のちにリーンスタートアップを学び、当時どうすべきだったのかを自分にアドバイスすると次のようになります。

① 友人と盛り上がってその場の思いつきで企画する
**→ 「バーニングニーズ」を見つけよう**
自分もしくは顧客が抱える「本当の課題」を解決することを目的にプロダクト開発を行う

② 使われるかわからないままに作りたいものを作る
**→ ユーザインタビューをしよう**
買ってくれる顧客を見つけて、その人が欲しいものを作るためにすり合わせを実施する

③ 全部の機能が完成するまでリリースしない
**→ MVPを作ったらリリースしよう**
全ての機能を作ってからリリースするのではなく、最もコアの価値がある機能を作ったらそれでリリースしてフィードバックをもらう

**これによって少なくとも少数のユーザに気に入られるプロダクトが誕生できます** (もしくは早い段階での撤退ができます)

# この経験はただの失敗だったのか？
パンツシェアアプリは4ヶ月かけて実質1人にしか使われなかったサービスであったが、まるっきり失敗だったのかというとそうとも思っていません。
僕がこの4ヶ月、ゼロ知識からWebサービスを構成するための技術をたくさん経験できました。

* モダンJSフレームワーク
* API
* CSSフレームワーク
* npmライブラリ
* ホスティング
* サーバレスアーキテクチャ
* OAuth等の認証
* 外部サービス連携(Twitter)
* OGP

「作りたいもの」があったから必死になれたのだと思いますし、楽しくやれたのだなと思います。またこれをきっかけにWebサービスを作ることの楽しさを知り、今はそれを仕事にすることができています。

最後にこの言葉で締めさせていただきます。

**「個人開発は誰にも使われなくても、トータルでプラス」**

以上、ありがとうございました！

# あとがき

元ネタはスライドで作成しました。
スライドで読みたい方は[こちら](https://presen-share.yunomy.com/presentation/98)からご覧ください。(おすすめ)

個人開発しくじり先生は実はパート5まで作る予定です。
面白いと思っていただけたら是非続きもご覧ください！

* [Part2](https://presen-share.yunomy.com/presentation/99)
* [Part3](https://presen-share.yunomy.com/presentation/116)
* Part4
* Part5

Part4,5は鋭意作成中
この記事をストックしておくと変更通知でお知らせいたします。
【初心者】 IAMロールの認証情報を使い、windowsのコマンドラインでAWS CLIを利用する



#[目的]
IAMロールの認証情報を使い、windowsのコマンドラインでAWS CLIを利用する

#[手順]
###①EC2向けロールを作成

・エンティティは以下を選択して自分のアカウントを入力（別のとか書いてありますがこの設定している自分のアカウントで大丈夫です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/ec472d98-cb15-5d5c-627a-477b5e61b1d3.png)


・以下のポリシーをロール作成時にポリシーとして作成してアタッチする（JSONタブに下のようなポリシーをつけてください）

```txt:arnは自分のものをコピペ
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::1234567890:role/role-name"
        },
        {
            "Sid": "SomeServices",
            "Effect": "Allow",
            "Action": [
                "*"
            ],
            "Resource": "*"
        }
    ]
}
```

###②EC2インスタンスを作成して、作成したロールを付与

→　EC2から[アクション] > [セキュリティ] > [IAMロールの変更]で設定してください

###③EC2インスタンスに接続して、以下コマンドを実行出力結果をメモ（JSON形式の長いものが出てくるはず）

```txt:arnは自分のものをコピペ
aws sts assume-role --role-arn "arn:aws:iam::1234567890:role/role-name"  --role-session-name AWSCLI-Session

```


###④AWS CLIインストール後コマンドラインでそれぞれのファイルを修正

```txt:~/.aws/credentials
[default]
aws_access_key_id = ************
aws_secret_access_key = **************
aws_session_token = *********************************
```

```txt:~/.aws/config
[default]
region = ap-northeast-1
output = json
```

これでIAMロール等の権限を変更すれば操作できるはず・・・・

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_use-resources.html#using-temp-creds-sdk-cli
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-api.html
https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/
MS-MPIを使ったRust並列処理

# はじめに

Rustで並列処理を行ってみます。並列処理としてMicrosoft MPI(MS-MPI)を利用します。RustでMS-MPIが実行できるコードを作成するため、mpiクレートを利用します。

# 環境

- Windows 10 home
- Rust(1.53.0)
- Visual Studio Code(1.62.2)
- MS-MPI(10.1.2)

# 準備

MS-MPIのインストール方法は、[以前の記事](https://qiita.com/matsxxx/items/e2e3e5d47d2e5c8ec35e)を参考ください。[Rust](https://www.rust-lang.org/tools/install)もインストールしておきます。

MS-MPIのインストールが終われば、以下の図のようにMS-MPIの環境変数を設定します。環境変数を設定しないと、mpiクレートにある`mpi-sys`のビルド時にエラーが発生しました。
![mpi_envorinment_variable_trim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/ab4f39b3-5eed-f74c-0d8e-8d87834ab07a.png)

# mpiクレート

RustでMPIを使うため、mpiクレートを利用します。crates.ioのmpiクレートだと、2021/11/13時点で、MS-MPIに対応していないため、githubにある[mpiクレート](https://github.com/rsmpi/rsmpi)使います。cargo new で作成したフォルダのCargo.tomlに、以下のようにgithubのURLを指定します。

```:command
cargo new mpi_qiita
```

```toml:Cargo.toml
[package]
name = "mpi_qiita"
version = "0.1.0"
edition = "2018"

[dependencies]
mpi = {git="https://github.com/rsmpi/rsmpi", branch="master"}
```
# Rust並列処理コード

[以前のc++で作成したコード](https://qiita.com/matsxxx/items/e2e3e5d47d2e5c8ec35e)と同じ動きをするRustコードを作成します。

```rust:main.rs
use mpi::traits::*;
fn main() {
    let universe = mpi::initialize().unwrap();
    let world = universe.world();
    let size = world.size();
    let rank = world.rank();
    print!("Hello world I am {} of {}", rank, size);
}
```

ビルドします。

```:command
cargo build
```

mpi_qiitaというパッケージ名にしたので、`mpi_qiita\target\debug\mpi_qiita.exe`という実行ファイルが出来上がります。

# MS-MPIでの実行

MS-MPIで実行ファイルを動かします。

```:command
mpiexec -n 7 mpi_qiita.exe
```
![rust_mpi_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/88bd78f7-8d69-9511-eabe-8982879a575c.png)


# 参考

https://github.com/rsmpi/rsmpi
いらすとやの画像をスクレイピングしよう！

# いらすとやの画像をスクレイピングしてみよう！
資料作成などで「いらすとや」さんの画像をよく利用しますが、ガバっと取り出したいときがあります。「とりあえず全部」みたいなことありますよね。
すぐに作れそうだったのでやってみようと作成。


参考にしたサイトは [こちら](https://hashikake.com/scraping_img)です。
参考にしたスクリプトから関数ベースにアレンジを加えてみました。
関数ベースなのでよりステップバイステップでどんな値が返されてるのかわかるかと思います。

## 作成した環境について
1. windows10
2. python3.9

フォルダ作成の関数に関してはwindows環境のみ適用されるものになっています。

## 必要なライブラリ

```
pip install requests
pip install beautifulsoup4
pip install lxml
```

## スクリプト

``` irasutoya.py
# 「いらすとや」さんの画像データを集めるスクリプト
import re
import time
import requests
from pathlib import Path
from bs4 import BeautifulSoup

# デスクトップに検索の保存フォルダ作成と作成済みの場合
# 保存されているファイルを削除
def make_temp_savedir(folder_name):
    desktop_path = Path.home().joinpath('Desktop')
    output_folder = Path(desktop_path).joinpath(folder_name)
    output_folder.mkdir(exist_ok=True)
    files = list(output_folder.iterdir())
    [file.unlink(missing_ok=True) for file in files]#検索結果
    return output_folder


# 検索結果ページより表示されている各イラストのurlを取得
def fetch_search_result_url(search_word):
    search_url = f'https://www.irasutoya.com/search?q={search_word}'
    html = requests.get(search_url).text
    soup = BeautifulSoup(html, 'lxml')
    a_list =soup.select('div.boxmeta.clearfix > h2 > a')
    return [a.attrs['href'] for a in a_list]


#　イラスト一覧できるurlからimgタグ部分を取得
def fetch_img_tag(picture_url):        
    page_html = requests.get(picture_url).text
    page_soup = BeautifulSoup(page_html, "lxml")
    time.sleep(1)
    return page_soup.select('div.entry > div > a > img')


# imgタグの中のsrc部分の文字列を取得
def fetch_img_url(source_url):
    return [(url.attrs['src']) for url in source_url]


# 保存先のpathを作成
def get_saved_path(img_urls,output_folder):
    file_names = [re.search(".*\/(.*png|.*jpg)$",img_url) for img_url in img_urls]
    return [output_folder.joinpath(file_name.group(1))  for file_name in file_names]


# 画像元urlから画像取得
def get_and_save_picture(img_url,save_path):
    try:
        image = requests.get(img_url)
        with open(save_path, 'wb') as f:
            f.write(image.content)
        time.sleep(1)
    except ValueError:
        pass


"""search_irasutoya関数の処理手順
1.検索結果のurlのhtmlを取得
2.検索結果のhtmlの中に画像が置かれたurlを全て取得
3.画像が置かれたurlのimgタグ部分のみを全て取得
4.imgタグのsrc部分を抜き出して画像元のurlを全取得
5.保存先のフォルダ名と画像元のurlのファイル名を結合してパスを作成
6.画像元のurlから画像データを抜き出して,5のパスに保存する。
"""
def search_irasutoya(search_word,save_folder_name):
    output_folder = make_temp_savedir(save_folder_name)
    picture_urls = fetch_search_result_url(search_word) #1,2
    for picture_url in picture_urls:
        img_tags = fetch_img_tag(picture_url) #3
        img_urls =fetch_img_url(img_tags) #4
        save_paths = get_saved_path(img_urls,output_folder) #5

        for img_url,save_path in zip(img_urls,save_paths):
            get_and_save_picture(img_url,save_path) #6

if __name__ =='__main__':
    search_word = 'PC'
    save_folder_name = 'いらすとや検索結果'
    search_irasutoya(search_word,save_folder_name)
```
[Flutter] 常にスクロールバーを表示する方法

Flutterでスクロールバーを表示させたい場合、いくつか選択肢がある。が、「**常にスクロールバーを表示**させたい」なーと思って`ScrollBar`に`isAlwaysShown: true`を設定すると、なぜか途端にエラーの山にのまれて大変なことになるので、迷わないように定型化してみた。

## 結論

```dart
final _scrollController = ScrollController(); // ScrollControllerは必須

// 中略

Scrollbar(
  isAlwaysShown: true,
  controller: _scrollController, // <- 同じScrollControllerを配置

  child: SingleChildScrollView(
    controller: _scrollController, // <- 同じScrollControllerを配置
    
    // 以下、ScrollView内に配置したいWidget
    child: ListView( 
      // ListViewを配置する場合、以下2行は必須
      shrinkWrap: true,
      physics: NeverScrollableScrollPhysics(),
      children: [
        // ...
      ]
    )

  )
)
```

実際の動作は以下のDartPadで確認できる。
https://dartpad.dartlang.org/?id=d1330072fc1e7f2b9c9af52a1bd87edf&null_safety=true

<iframe src="https://dartpad.dev/embed-dart.html?id=d1330072fc1e7f2b9c9af52a1bd87edf"></iframe>

## 解説

特にListViewと併用する場合などに詰まってしまうパターンがよくあると思うので、まとめてテンプレ化した。

解説は以下参考ページに詳しく書かれているので割愛。`isAlwaysShown: true` する場合もしない場合も、このテンプレを基本にしておくと役立つと思うので、まとめてWrapしたWidgetにしておくと便利かもしれない。

同じページに複数のスクロール画面がある場合は、もちろん各場所でScrollControllerは分ける必要があるけれど、その場合も`Scrollbar`と`SingleChildScrollView`では共通のScrollControllerが必要。

## カスタムWidgetにまとめる

ということで、こんな感じにWidget化しておくと使いやすい。使うときは`SimpleScrollView`あるいは`ScrollListView`を呼べばよいので迷いがない。

```dart
import 'package:flutter/material.dart';

void main() => runApp(App());

class SimpleScrollView extends StatelessWidget {
  SimpleScrollView({required this.child, this.isAlwaysShown = true});

  final Widget child;
  final bool isAlwaysShown;

  final _scrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return Scrollbar(
        isAlwaysShown: isAlwaysShown,
        controller: _scrollController,
        child: SingleChildScrollView(
          controller: _scrollController,
          child: child,
        ));
  }
}

class ScrollListView extends StatelessWidget {
  ScrollListView({required this.children});

  final List<Widget> children;

  @override
  Widget build(BuildContext context) {
    return SimpleScrollView(
        child: ListView(
            shrinkWrap: true,
            physics: const NeverScrollableScrollPhysics(),
            children: children));
  }
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Material(
      child: Scaffold(
        body: ScrollListView(children: [
          for (var i = 0; i < 50; i += 1) ListTile(title: Text("Item $i"))
        ]),
      ),
    ));
  }
}

```

DartPad
https://dartpad.dartlang.org/?id=bbd86b3e8515a4559255238b7588bf95&null_safety=true

## 参考

https://stackoverflow.com/questions/54963284/always-show-scrollbar-flutter?utm_source=pocket_mylist

https://qiita.com/tabe_unity/items/4c0fa9b167f4d0a7d7c2
Watson Studio と Watson Machine Learning の関係

# はじめに
IBM Cloud で機械学習モデルを作成してデプロイして利用したい場合は、以下の2つのサービスを利用するとこになります。

* **Watson Studio**
    - データの準備、データの分析と視覚化、およびモデルの作成を行うためのツール
    - 計算リソースを提供する環境定義
* **Watson Machine Learning**
    - デプロイメント・スペースでモデルのデプロイおよびデプロイされたモデルの管理を行うためのツール
    - 計算リソースを提供する環境定義
    
具体的な使い方の記事は多数あるのですが、2つのサービスとそのコンポーネントがどのような関係にあるのかを記載したものがなかったので、整理してみました。

---
# Watson Studio と Watson Machine Learning の関係
Watson Studio と Watson Machine Learning の主要なコンポーネントと、モデルの操作時にどのような動きになっているのかを以下に図示しました。
![WS-WML関係2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305774/eb0ed863-91d7-d883-302b-2ee5eea26bda.png)


---
## 1.Watson Studioの主要なコンポーネント
Watson Studioには多数のコンポーネントがありますが、ベーシックな「モデル作成→デプロイ」に関連するコンポーネントについてのみ簡単に解説します。

- **分析プロジェクト**
    - Watson Studio内で分析を始める最初の一歩で、「枠」を定義します。
    - 分析の単位などで作成するとよいでしょう。複数定義可能です。
    - 共同作業するユーザーのアクセス権を定義できるので、アクセスを制御したい単位で分ける必要があります。
- **データ資産**
    - 生データやクラウドおよびオンプレミスのデータ・ソースへの接続など分析で使用するデータを登録します。
- **Notebook**
    - Watson Studio上でJupyter Notebookが使えます。
- **Modeler Flow**
    - Watson Studio上でSPSS Modelerが使えます。ローカルPCで稼働するSPSS Modeler Clientと比べるとUIが少し異なります。
- **AutoAI**
    - Watson Studio上で使用できるAuto MLをなります。
- **モデル**
    - プロジェクト内で作成され保存されたモデルが表示されます。

---
## 2.Watson Machine Learningの主要なコンポーネント
- **デプロイメントスペース**
    - Watson Machine Learning上でも「枠」となるようなスペースを定義します。
    - モデルを管理していく単位で作成するとよいでしょう。複数定義可能です。
    - 分析プロジェクトと同様に、共同作業するユーザーのアクセス権を定義できるので、アクセスを制御したい単位で分ける必要があります。
- **資産**
    - 「データ資産」と「モデル」を登録できます。
    - 登録方法は以下の2種類があります。
        - Watson Studioのプロジェクトからプロモート
        - Watson Machine Learning上で直接インポート
- **デプロイメント**
    - モデルのデプロイ方法としては、以下の2種類があります。
        - オンライン：予測をオンラインでリアルタイムに生成します。
        - バッチ：ファイルやデータベースなどを入力にバッチで処理します。

---
## 3.モデルの操作
図中に吹き出しで表現しているモデルに対する操作について解説します。

- **モデルの保存**
    - NotebookやAutoAIなどで作成したモデルを**保存**すると、分析プロジェクト内の「モデル」として登録されます。
- **モデルのプロモート**
    - 保存されたモデルをWatson Machine Learningで使えるように**プロモート**すると、Watson Machine Learningのデプロイメントスペースの「資産」として登録されます。
- **モデルのデプロイ**
    - Watson Machine Learningのデプロイメントスペースの「資産」にあるモデルを**デプロイ**すると、スコアリングできる状態になります。
    - デプロイの方法としては、オンラインとバッチが選択できます。

---
# 参考リンク

Cloud Pak for Data as a Service の概要
https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/overview-cpdaas.html?context=cpdaas&audience=wdp
IIS web アプリケーションからOracle Autonomous database接続時のrequest timed outとORA-00542エラー対応

#概要
IIS web アプリケーションからOracle Autonomous database接続時下記のエラーが発生して、調査と解決方法のメモです。

エラー1

```
connection request timed out
```

エラー2

```
ORA-00542: Failure during SSL handshake
```


#対応方法
先に対応方法を記述、まず試してみてください。
##Step1：IISの該当Application　PoolのLoadUserProfile　を　True に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123679/de548508-734b-bd8c-a03a-a61a4b9d9d1b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123679/1ff71134-e1d1-40ff-2cb1-0abb343a3a5c.png)

##Step2:　IIS or 該当Application　Pool再起動

---

#調査経緯

１、 最初はIISのWeb ApplicationからAutonomous databaseに接続の際、　```connection request timed out```　というエラーになる。
同じサーバー別のツールや、テスト用のNet　Application　からAutonomous databaseへ無事に接続できる。
ネットワーク、ファイアウォールなどの問題ではない、IISの問題と判断。

:::note warn
ただ、ここで数時間いろいろ調査して進展なし、心が折れそう:cry:
:::

2、tnsname.ora の中身を確認
  
```
 *****=(description= (retry_count=20)(retry_delay=3)********
```

retry_count=20を注目、retry_count=1 に変更して再度テスト。

今度エラーは```ORA-00542: Failure during SSL handshake```になった


:::note info
光が見えてきた。:smile::smile:
:::


3、ORA-00542とAutonomous を検索して、下記の記事を参照して問題解決

https://medium.com/oracledevs/tips-for-connecting-net-apps-to-oracle-autonomous-database-185aeff1a62c


#後記

今回のトラブルシューティング、最初は　connection request timed out　というエラーばかり注目、何も進みませんでした。
retry回数が多いことによってtimed outエラーになり、本来のORA-00542をキャッチできませんでした。
ダメ元でretry回数変更してテストしたら大きな進展がありました。

感想：
１．エラーの表象から問題解決のヒントをまったく得られない時ある
２．アイディアがありましたら、なんでも試してみること重要


良い経験になりました。:beers:
続わかりやすいパターン認識　実験メモ

# はじめに
続わかりやすいパターン認識の再現実験し理解を深めることを目的とする。
個人の備忘録であるのであしからず。
間違いがあれば教えてくだされば幸いです。

# 第5章5.5節の教師なし学習の再現実験
第5章5.5節の教師なし学習の再現実験をした。
実験内容は書籍に記載されている通りなので省略する。

書籍と同様の結果が得られた。

![fig5.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139678/364d674c-ee19-8afe-5409-4f8e02bd1af1.png)


![fig5.3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139678/ac9dcb4c-ab24-3ed7-4e45-6ec50574dbc5.png)



以下にコードを示す。

```python
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib
import copy
import pandas as pd

global pi1, pi2, pi3
global th11,th21,th31
global th12,th22,th32
global n,r1,r2

pi1 = 0.3
pi2 = 0.5
pi3 = 0.2

th11 = 0.8
th21 = 0.6
th31 = 0.3

th12 = 1 - th11
th22 = 1 - th21
th32 = 1 - th31

n = 10000
r1= 4746
r2= 5254

def P_w1_v1(pi1,pi2,pi3):
    return pi1*th11/(pi1*th11+pi2*th21+pi3*th31)

def P_w1_v2(pi1,pi2,pi3):
    return pi1*th12/(pi1*th12+pi2*th22+pi3*th32)

def P_w2_v1(pi1,pi2,pi3):
    return pi2*th21/(pi1*th11+pi2*th21+pi3*th31)

def P_w2_v2(pi1,pi2,pi3):
    return pi2*th22/(pi1*th12+pi2*th22+pi3*th32)

def P_w3_v1(pi1,pi2,pi3):
    return pi3*th31/(pi1*th11+pi2*th21+pi3*th31)

def P_w3_v2(pi1,pi2,pi3):
    return pi3*th32/(pi1*th12+pi2*th22+pi3*th32)

def log_Px(pi1,pi2,pi3):
    return r1 * np.log(pi1*th11+pi2*th21+pi3*th31) + r2 * np.log(pi1*th12+pi2*th22+pi3*th32) 

PI1 = []
PI2 = []
PI3 = []
LOGPx=[]
for i in range(100):
    PI1.append(pi1)
    PI2.append(pi2)
    PI3.append(pi3)
    LOGPx.append(log_Px(pi1,pi2,pi3))
    
    pi1_ = ( r1*P_w1_v1(pi1,pi2,pi3) + r2*P_w1_v2(pi1,pi2,pi3) )/n
    pi2_ = ( r1*P_w2_v1(pi1,pi2,pi3) + r2*P_w2_v2(pi1,pi2,pi3) )/n
    pi3_ = ( r1*P_w3_v1(pi1,pi2,pi3) + r2*P_w3_v2(pi1,pi2,pi3) )/n
    
    pi1 = pi1_
    pi2 = pi2_
    pi3 = pi3_
    
df = pd.DataFrame()
df["PI1"] = PI1
df["PI2"] = PI2
df["PI3"] = PI3
df["LOG"] = LOGPx
df.to_csv("sample.csv")

plt.figure()
plt.plot(PI1)
plt.plot(PI2)
plt.plot(PI3)
plt.legend([r"$\pi_1$",r"$\pi_2$",r"$\pi_3$"])
plt.grid()
plt.ylabel(r"パラメータ$\pi_i$の推定値")
plt.xlabel("繰り返し数")
plt.savefig("fig5.3.png")
plt.show()

plt.figure()
plt.plot(LOGPx)
plt.xlabel("繰り返し数")
plt.ylabel(r"$\log P(x)$")
plt.grid()
plt.savefig("fig5.2.png")
plt.close()
```
メモ〜OneToOneFieldの注意点

今回のお題
-
今回は、djangoアプリの`OneToOneField`を用いた際に経験した落とし穴について書きます。

結論
-
以下のようなモデルがあったとします。

```python
class School(models.Model):
  name = models.CharField(max_length=20)

class Teacher(models.Model):
  name = models.CharField(max_length=20)

class Club(models.Model):
  name = models.CharField(max_length=20)
  teacher = models.OneToOneField(Teacher, on_delete=models.PROTECT)

class Student(models.Model):
  name = models.CharField(max_length=20)
  school = models.ForeignKey(School, on_delete=models.PROTECT)
  clubs = models.ManyToManyField(Club)
```
モデルとして学校・生徒・クラブ活動・大学があります。

学校と生徒は１対多数、クラブと生徒は多数対多数、クラブと教師は１対１で結びついています。

ここで、SchoolモデルとTeacherモデルにはレコードが一つずつあり(schoolとteacherとする)、それらに紐づいているstudentインスタンスとclubインスタンスは存在しないとします。

またそれとは別に部員０人のクラブ(clubとする）と帰宅部の生徒(student)が存在するとします。

この時

```python
school.student_set.all()
```
これはエラーになりません。

同様に

```python
if school.student_set.all():
```
これもfalseに分岐するだけです。

また多数対多数に関しても

```python
club.student_set.all() #これはOK
if club.student_set.all() # これもfalseに分岐するだけ
```

となるので特に問題ありません。

逆パターンに関しても問題なしです。

```python
student.clubs.all()
if student.clubs.all()
```

ですが１対１になると

```python
teacher.club #これはエラー
if teacher.club: # これもflaseに分岐せずにエラーになる
```

関連するレコードが存在するのかを調べる方法として`hasattr`関数が用意されているので、条件分岐処理の際にはこれを用いることになります。

```python
if hasattr(teacher, "club"):
# これであればfalseに分岐する
```
Canvas LMS でシステム外で算出した成績・得点を履修者に伝える

# 背景
* Canvas LMS内の採点システムは、各問題に配点を設定して合計するだけ、という単純な設定しかできない。

# 目的
* Canvas LMS で行ったオンライン試験（クイズ）の結果をダウンロードし、Canvasの外で採点を行う。
* 採点結果をCanvas LMS にアップロードし、「成績 Grade」で確認できるようにする。
    * 履修者は自分のスコアだけを確認できる。
    * 担当教員は、履修者のスコアを一覧できる。

# 方法

## 結果のダウンロード
* REST APIを使うとけっこう面倒。個別の問題に対する受験者の回答（答案）にたどりつくまで、インスタンスからインスタンスへと何層ももぐっていく必要がある。
* GUIからダウンロードする方が簡単。
    * 各クイズのページ → 「クイズの統計情報」 → 「受講生分析」 から CSV 形式でダウンロードできる。
        * クイズの統計情報をクリックすると、「クイズの概要」というページに遷移する。このページの URL は `/courses/{コースID}/quizzes/{クイズID}/statistics`
            * クイズID と 課題ID は異なるので混同しないように注意。
    * CSV ファイルには、受験者の各問題のスコアと回答が含まれる。
        * ただし、回答の内容は完全に分かるのは、１問１答形式の問題のみ。複数回答の問題に関しては不完全な情報になる。

## 採点結果のアップロード

### 課題をつくる
* Canvas LMS 上に結果を通知するための課題を新しくつくる。以下、**結果通知課題** と呼ぶ。
    * 「提出物のタイプ」を「提出なし」に設定する。（履修者には対応を求めない）
    * 「点数」には、採点基準に合わせて満点の数値を記入する。

### アップロード用のCSVファイルをつくる
* 「成績 Grade」ページの「操作」→「エクスポート」から課題の採点結果を CSV ファイルでアップロードできる。
* CSV ファイルのテンプレートとして使うために「成績 Grade」ページから成績をエクスポートする。CSVファイルがダウンロードされる。以下、**成績 CSV ファイル** と呼ぶ。
* 成績 CSV ファイルのバックアップを取る。あるいは、コピーしたファイルで以下の作業を行う。
    * 以下の作業で、誤って上書きしてはならない情報を上書きしてしまった際に復元するためにバックアップをとっておくのは非常に重要。
* 成績 CSV ファイルの内容を確認し、１行目に結果通知課題の名前の入った列があることを確認する。課題名の末尾にカッコ書きで付いている数字は 課題ID
    * 該当する列が含まれていない場合には、テスト受講生の成績欄にダミーでスコアを書き込むなどして再試行してみる。（精確な条件は未確認）
* 成績 CSV ファイルから、別の課題や、課題グループごとの総合点など、今回の作業で上書きしない情報が記載されている列をすべて削除する。
    * ただし、１列目から、セクションの列（５列目あたり）まではそのまま残す。
    * 結果通知課題の名前の入った列は残す。
* 結果通知課題の名前の入った列に各履修者のスコアを記載する。

### アップロード（Canvas LMS にインポート）する
* 「成績 Grade」ページの「操作」→「インポート」から加工済の成績 CSV ファイルをアップロードする。

# おしまい
* 成績 CSV ファイルの６列目にあたる列の名称（１行目）を存在しない課題名に設定すると、その名前の課題が新たにつくられて、そこに流し込まれるようですが、試していません。
    * その場合、課題IDは不要

# 参考
* **[Instructure社 Canvas Instructor Guide](https://community.canvaslms.com/t5/Instructor-Guide/tkb-p/Instructor)**
    * [How do I use the Gradebook?](https://community.canvaslms.com/t5/Instructor-Guide/How-do-I-use-the-Gradebook/ta-p/701)
    * [How do I import grades in the Gradebook?](https://community.canvaslms.com/t5/Instructor-Guide/How-do-I-import-grades-in-the-Gradebook/ta-p/807)
いつでも歌うよ！ 〜音楽理論に基づいた自動作曲〜

# 概要
+ 2021/12/18開催のバーチャル学会2021向けの記事
+ 研究成果のまとめ（自動作曲による生成楽曲を掲載）

#目次
+ [ざっくり紹介動画](#ざっくり紹介動画)
+ [補足](#補足)
+ [研究成果まとめ(というか歩み)](#研究成果まとめというか歩み)]
 + [自動作曲アルゴリズムとうた曲生成システムの概要図](#自動作曲アルゴリズムとうた曲生成システムの概要図)
 + [(0) ほぼ自動生成うた曲詰め合わせ](#0ほぼ自動生成うた曲詰め合わせ)
 + [(1)「それってあなたのかんそうですよね」](#1それってあなたのかんそうですよね)
 + [(2)「KoumeHaTenshi（仮題）」](#2koumehatenshi仮題)
 + [(α)（自動作曲楽曲を適当に手編曲したもの）](#α自動作曲楽曲を適当に手編曲したもの)
+ [感想](#感想)

# ざっくり紹介動画
https://twitter.com/tsukuri32/status/1464925009554464773?s=20

## 補足
+ ↑の作曲アルゴリズムからそこそこ機能拡張しました
+ ポスター発表会で体験できるワールドでは機能拡張版を体験できます

# 研究成果まとめ(というか歩み)
## 自動作曲アルゴリズムとうた曲生成システムの概要図
![fig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281191/d159a85e-be82-c30c-cb42-7f4b0ffd8b30.png)

## (0)ほぼ自動生成うた曲詰め合わせ
歌詞を流し込むことで自動生成されたうた曲

https://soundcloud.com/yurume-kitsume/sets/itsuutasongs?si=eb44ead4e39d47e18c8a0399e2e32932&utm_source=clipboard&utm_medium=text&utm_campaign=social_sharing

※一部曲に<a href="https://twitter.com/Izaber">Izaber33氏</a>の歌詞を拝借しております。

## (1)「それってあなたのかんそうですよね」
※自動作曲で 8小節フレーズx2 生成 → メロディに歌詞割り当て → AIきりたんに歌わせたもの。システムの完全自動化はできてない。

### 自動作曲
http://picotune.me/?BWZF0ndz

### うた曲生成
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">それってあなたの感想ですよね🤔（歌：きりたん）<br>Automatic😏 <a href="https://t.co/Z7PhZAdNFC">pic.twitter.com/Z7PhZAdNFC</a></p>&mdash; yurume (@tsukuri32) <a href="https://twitter.com/tsukuri32/status/1458091374922895372?ref_src=twsrc%5Etfw">November 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## (2)「KoumeHaTenshi（仮題）」
※自動作曲で生成した8小節フレーズx3に脳死で歌詞をつけてyurumeが歌ったラフトラック。うた曲生成システム未使用。

### 自動作曲
http://picotune.me/?06NePa28

### 手編曲
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">実験的ラフトラック「KoumeHaTenshi」(仮題)😌✨<br>いろいろと拙い点はご容赦を😌<br>Automatic😏✨ <a href="https://t.co/F6oHxtPiEs">pic.twitter.com/F6oHxtPiEs</a></p>&mdash; yurume (@tsukuri32) <a href="https://twitter.com/tsukuri32/status/1459787946349850624?ref_src=twsrc%5Etfw">November 14, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## (α)（自動作曲楽曲を適当に手編曲したもの）
https://twitter.com/tsukuri32/status/1454084072922222597

https://twitter.com/tsukuri32/status/1453019642453114885

https://twitter.com/tsukuri32/status/1452651415923421189


# 感想
自動作曲システムはまだチープです。必ずしも超名曲ができるわけではありません。ＡＩも取り入れられてません。しかし、単純な音楽的制約のみでもサイコロが仕事しておおっという曲ができることがわかりました。
「単純なルールでそれっぽい曲ができる。」とても良い気づきです。
駆け出しエンジニアが社内勉強会主催してみたら結果、けっこうイイ感じだった。

人生初のプロジェクトアサインの際に、やってみたことが続けてきて業務の中でも活きていると思ったので、書いてみました。

# 自己紹介
* 21/5 ～ 別業種・別職種からエンジニアに転職
* 21/8 ～ 研修を経て、初プロジェクトにアサイン
* 現在はPHP（Laravel）で、新規プロジェクト内の新機能追加実装中
* 最近JS（Vue.js）のタスクにアサインし始めました。

# 背景
*  21/8 ～ 人生初アサイン
* 苦戦しながらなんとか開発を進める
  * 会社として初のLaravelプロジェクトなので、サンプルコードもない…
  * LaravelAdminという少しクセのあるライブラリを使い、慣れるまではそのクセに苦戦…
* 自分と同時期に入社した同期はいるが、２名とも実務未経験

# 気づいたこと
* 普段のコミュニケーションの中でレビュワーから

`「指摘事項が同期の３名の中で重複しているんだよねえ」`

と聞いていた

* マジリクのコメントを見ても確かに重複が多い…

`「そもそも自分らの実力不足で開発に遅れが出ているのに、これはまずい…」`

* 全体の開発から見て**非常にムダな工数**

⇒何かできることを模索

# 対応策
### 提案

* `「レビュー内容共有の仕組み化ができればいいなあ」`

と思う中転職活動前に自ら勉強会を主催し、その場でＬＴなどを開くことでプログラミング初学者同士の知識の共有に活きていたのを思い出した。

* `「ありかもしれない」`

と思い、提案した結果やってみることに。

### 内容
* 勉強会の内容はざっくりこんな感じ
 
---
#### <勉強会>
* 週一で終業後に同期のみで実施

* １回の勉強会で１つのマージリクエスト（※）を決める
  * ※タスクの中で出したGitlabのマージリクエスト

* そのMR内のコード、コードに対するレビュワーの指摘を勉強会までに読込み、改善点、気づきを共有
---

### 結果

* よく出てきた学びは
  * 知らなかった関数のインプット
  * 初めて見るアルゴリズムの実装
  * タスク着手前の設計フェーズでやること
  * 命名で気を付ける点
など駆け出しエンジニアにとってつまづきやすい点が題材に上がりました。

# 効果は…

効果としては以下が見られました。

### 全体で見えた効果
* 各々の知識量が増えた
* 同期同士のコミュニケーションが取れる（フルリモートのため、時間を意識的に確保しないと関係が薄くなってしまう）
  * 日々のタスクの気づきの共有すべき点を共有するようになる
* レビュワーの共有事項の工数削減

### 個人で感じた効果
* ソースコードの理解力が早くなった
  * 自分自身ソースコードを読む抵抗感が無くなり、コードリーディングの習慣が付いた
* アウトプットの習慣がついた

# 結論
とにかく**やってよかったな**、という感じです。

今後は３名の関わるプロジェクトが異なった際に、使う言語に差が出てき始めるので、どのように開催するか要検討です。

まあ、でも各々が持ち寄った知見を共有する形で、日々の備忘録を共有するだけでも学びになりそうですね。

# 最後に

同じように知識の共有が課題に感じている方、普段の勉強に飽きてきた方いらっしゃれば、勉強会の開催も一つの手段のひとつです。

特に僕のケースのように

* 複数人の同期
* 皆、実務経験がない（もしくは浅い）
* 同じ言語を扱うプロジェクトにアサインしている

という状況であればかなり効果はあると思います。

読みにくい記事ではありますが、最後までお読みいただきありがとうございました！
Photoshop 整列　真ん中に

#■長方形のレイヤーの真ん中に文字を置きたい。

①長方形のレイヤーをcmmandを押しながら右下の画面で選択
点ので囲まれる。

![スクリーンショット 2021-11-13 17.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/f58f3105-4dfe-dea3-5603-c9d2fe959cb7.png)

②真ん中にしたい文字を選択
選択ツール上部で整列させる。

③点点を消す。command+D

![スクリーンショット 2021-11-13 17.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/8686a74f-e570-44d9-9f79-5e16ae7c5c69.png)
JavaでExcelファイルに書き込み・出力する。

現在、参画している案件でJavaを扱っています。
その際Java上でExcelファイルに書き込み・出力するコードを書きましたので、自身の勉強のために記録として残しておきます。(2021年11月時点での情報ですので、間違っていたら申し訳ないです。)

Mavenやpomの設定なんかは調べて出てくるものを真似して使いました。
こちらがExcelに書き込み・出力する簡単なコードになります。
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280983/9f4a20c1-ea67-6367-1a90-75f1ea08624f.png)
①まずWorkbookクラスで書き込みたいExcelファイルを指定します。
②次にExcelのシートを指定します。
③そしてRowの位置を指定した後に、Cellの位置を指定します。
※Row = Excelでいうと縦の列, Cell = Excelでいうと横の列
④書き込む文字を指定した後は、出力ファイルを作成します。(元々のファイルに出力しても構いませんが、テンプレートを1つ持っておきたいですね。)
⑤最後に書き込みして終了、といった感じです。

元々何も書かれていないファイルに
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280983/5b551657-c729-bcb8-8b1b-1481f6a2ffec.png)
指定した文字列が書き込まれました。
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280983/3132df88-136f-cb32-578b-84c509e0cf91.png)
ここで注意するのは、縦横を数える際に1からではなく0から数えます。(実際に間違えて混乱しました)



以上、Java上でExcelファイルに書き込み・出力する簡単なコードを復習の意を込めて書いてみました。文字を出力するだけでなくExcel上に線を引く・セルを結合する・色を付けるなどExcelで出来ることは大体コードで書けます。

その他にもExcelをPDFに変換して出力といったことも行いました。
Javaは何でも出来ると聞いたことがありますが本当に何でも出来るんですね・・・！

また時間があるときにまとめていこうかなと思います。
Cloud9 で rails server 終了せずにターミナルを閉じてしまった時の対処法

## この記事について
`rails server`起動したまま、ターミナルを間違って閉じてしまった😭という時の対処法があまりにも簡単だったので、記事にしてみました。`A server is already running`エラーでググると、`kill`コマンドや`server.pid`の削除などが出てくると思いますが、難しいことをしなくても対処できるのでお試しください👍


### 事前に確認する

ブラウザ上で開いてあるローカルサーバーを**リロードしてみて、もう繋がらない状態であれば今回の対処は不要**です。 新しくターミナルを開いて`rails server`し直し、作業に戻りましょう👌

## 対処法
### 1. ターミナルを新しく開く
元の二分割画面で開きたい場合は、ファイルの左上にあるメニューから分割スタイルを選択します。
[![Image from Gyazo](https://i.gyazo.com/e5dff84a2127df50e49bb89758328d40.png)](https://gyazo.com/e5dff84a2127df50e49bb89758328d40)

＋マークから「New Terminal」を選択します。
[![Image from Gyazo](https://i.gyazo.com/3211ddd77aa948197962bf4c5048366d.png)](https://gyazo.com/3211ddd77aa948197962bf4c5048366d)

### 2. ターミナル上で右クリックする
右クリックで出てくるメニュー内の「Tmux」→「Restart All Terminal Sessions」をクリックすると、先ほどの`rails server`を切ることができます。この段階で、先ほど開いていたローカルサーバーには接続できなくなっているはずです。
[![Image from Gyazo](https://i.gyazo.com/72dfeab885597beffef37e77da1f3136.png)](https://gyazo.com/72dfeab885597beffef37e77da1f3136)

### 3. `rails server`し直す
もう一度`rails server`で再起動できます👌

以上です😊