OmniAICreator/Qiita-1.07M huggingface dataset:
【Microsoft Edge便利機能】URLバーをコピーするとタイトルを含めたMarkdown形式で貼り付け可能

## 概要
業務で利用しているMicrosoftアカウントで管理ができることが一因で普及されだしたMicrosoft Edgeには、URLをタイトルも含めたMarkdown形式でコピペできる便利機能がありますので紹介します。本機能は、貼り付け先に依存するようで、メモ帳やQiita投稿画面ではURLのみの貼り付けとなり、TyporaやPower PointではURLとタイトルの貼り付けとなることに注意が必要です。

サイトのURLをコピーして貼り付けると、下記がコピペされます。

[Qiitaとは - Qiita:Support](https://help.qiita.com/ja/articles/qiita)

```html
[Qiitaとは - Qiita:Support](https://help.qiita.com/ja/articles/qiita)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cf9c7c07-457d-0919-ad24-ed7414226641.png)

## 設定画面とドキュメント
下記で設定の変更が可能です。
[edge://settings/shareCopyPaste](edge://settings/shareCopyPaste)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/03f19081-010d-c1bc-89ad-77b74bd4f318.png)

ドキュメントは下記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a5bf8acc-da7a-d69a-9ab6-15ea4626401b.png)
引用元：[Microsoft Edge での Url のコピーと貼り付けの改善](https://support.microsoft.com/ja-jp/microsoft-edge/microsoft-edge-での-url-のコピーと貼り付けの改善-d3bd3956-603a-0033-1fbc-9588a30645b4)


## 所感
私はドキュメントへの引用元の貼り付けをよく行うので、本機能を重宝してます。
あなたのチームは偽アジャイルを使っていますか？

##前書き##
__「2020年アジャイル状態報告」__によると、現在では多くの組織がアジャイルの実施を検討しています。
回答者は約半数の人は自分のチームが半分未満のメンバーがアジャイル開発を使用していると返事します。更にその中で自分の組織がアジャイル開発のレベルに足りない能力不足という現状を認識してる人は84％もいます。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939719/026a46c7-2225-79c0-2d9d-a4bb1490fd5b.jpeg)

一部の会社やチームがアジャイルさを実践した後、大きな成功を得た実績を見て、多くの人がそれを真似して、次々とアジャイル開発の行列に入ることになりました。
しかし、アジャイル開発に変更することは決して容易なことではありません。この変更の過程で最もよく見られる問題は、チームがアジャイルな原則やコアである価値観を理解しておらず、ただの猿真似をしていることです。
その結果はもちろん失敗です。そして失敗したチームメンバーがアンチ発言をばらまいて、アジャイル開発に人力と財力を無駄に消費して、時間のコストも増やしたのに何のいい効果も出来ていないという汚名を被らせて、そう宣伝しました。
果たして悪いのはアジャイル開発ですか？
勝手に勘違いをしたやつのせいではありませんか？


**アジャイル宣言**の主な内容は：

道具より**人**
文書より**産物**
契約より**協力**
計画に忠実より**変化に対応**

しかし多くの会社で、チームは“アジャイル”を笠に着て実際の行動はありえないほどにアジャイル開発宣言とその価値観から離れています。その結果はもちろん失敗です。
「どんなツールやプロセスと関係ない。**もし人々が自分の作業環境に苦しめられるなら、アジャイルとは言えない。**だから、このような“アジャイル”の皮を被ったチームは、偽物だ。」と、アジャイル宣言共著者のRobert C.Martinはインタビューに応じてそう言いました。

チームや会社が“偽アジャイル”に足を踏み入れそうなとき、どうやって一刻も早くこの問題を発見し、解決するのは我々アジャイル開発者の課題です。

##偽アジャイルさとは何ですか？##
###1.	極端なアジャイル###
####1)	アジャイルはスピードだけではありません####
アジャイルといえば，軽量級の方法として，「とにかく速い」と勘違いしている人が多い。そのため、チームメンバーに「忙しい」錯覚を与えて、最後はスピードのために質を落とすオチになります。この状況でできたプロジェクトはお客様の要望を果たすところかテストも合格できないでしょう？
####2)	アジャイルはシンプルだけではありません####
アジャイル十二原則の第10条に**“簡潔さをもとに、不要な仕事量を極力減らす芸術”**であると書かれています。
「不要なプロセスは省略ですよね。じゃ毎日の立ち会議も省略しよう」と、一部の人はそう考えるでしょう。そしてスプリントレビューも意味ないので省略、変化を応じるこそアジャイルだから企画会議も不要。
絶対主義者は、変革ならば徹底的にと思って本当に価値あることを全部省略しました。
その結果は、まだ何も理解していない開発者の負担になることになりました。
###2.	硬くなった　アジャイル###
####1)	立ち会議####
毎日の立ち会議はアジャイルチームのコミュニケーションにとって不可欠な架け橋です。毎日の立つ会議はチームメンバーが自分の仕事内容を詳細かつ明確に報告する必要がなく、2分で簡単な陳述を行うだけで、総時間は一般的に15分程度です。そして具体的な時間はチームごとのメンバ数や作業の性質によって変化する。15分を死守して時間以外の大事なことを無視してはいけません！
 ![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939719/4a074f1a-c1f4-649c-cdcd-ffa8a8f8badb.jpeg)

会議時間が硬くなると、チームメンバーに大きな負担を与えます。時間死守したらメンバーがどうでもいい話を無理やりして、もうコミュニケーションにならない状態になって、チーム内コミュニケーションを促進するという目的ももちろんできなくなります。
####2)	看板####
アジャイルチームの中で、看板を利用して任務の可視化、作業状態の透明化を実現し、チームメンバーを激励して、仕事の集中力と効率を高めることができます。
しかし、看板を設置すると、半分飾りになったり、タイムリーな更新が得られないなったり、チームメンバが看板から情報を得られないことになる問題がよくあります。
その結果、看板はアジャイルさを代表する飾りとなった。
担当者が仕事を報告するとき、壁の看板を指さして：ほら、私たちのチームはアジャイルです。
しかし実際には、アジャイルな観念が貫徹されているかどうかは、チーム内部のメンバー以外誰もわかりません。
####3)	伝統型リーダーのアジャイル####
以前に規模化のアジャイルな変革についての文章を書いたが、その中でチームが規模化するアジャイルに転換する前に、まずリーダーの思想はアジャイルに変更することを強調しました。
同様に、伝統的なチームがアジャイルに転換する過程にでも、指導者が率先して転換し、アジャイルな思考を備えている必要がある。アジャイルなリーダーになってから、チームや個人の長所を発掘し、利用することでチームのアジャイル化を推進することができます。
リーダーの考え方が伝統的なウォーターフォール式開発モデルを続けている会社をみました。チーム全体がアジャイルに変化し始めたとき、リーダーは開発プロセスの前後関係をたちきることができませんでした。そのためにチームはアジャイル開発の小周期スプリントを実施する際に大きな問題にあって、チーム全体が中途半端な状態に見られていました。
社内で統一的なアジャイル転換体勢が達成していなければ、そのときのアジャイルチームは難航する。
ということで、アジャイルに転換の効果が悪いの“呪詛”を祓うためには、チームの現制度の縛りを破り、チーム中の“偽アジャイル”現象を見破って、チームの実態に応じて適切に策略を変え、本当にアジャイルに“生きる”ことができるようにしなければなりません。
##最後に##
もっと知識を知る必要があれば、以下のリンクにアクセスすることができます。これは私が使っている__Zentao__開発ツールで、より専門的な人が問題を解決してくれます。
[オープンソースのプロジェクト管理ソフトウェア-スクラムツール - ZENTAO](https://bit.ly/3gLXSsU)
Googleログイン(OpenID Connect)を使わなくなったサービスはきちんと後始末をしましょう

# はじめに
ほとんど情報が引っ掛からなかったので、ここに記しておきます。

皆さんもOpenID Connectを使ってGoogleのログイン情報を元に自サービスの認証を行うというようなことはやっているもしくは使用した経験はあるのはないでしょうか。
しかし、Refresh Tokenはサービス側もしくはユーザー自身が削除しない限りはGoogleが保持し続けてしまいます。
ここでは、ユーザーが連携を解除した際に後始末をきちんとしようねという啓蒙のために後始末の仕方について書きます。サービス終了時にはクライアント自体を失効して対応しましょう。

Refresh Tokenを失効させない限りは使えてしまうので、ここはしっかりしておきましょう。
合わせて余計なscopeを付与しないようにとかもあるのですが、話題がそれるので記載しません。

あと聞いた話でエビデンスはない話をして恐縮なのですが、１アカウント辺りで発行されるRefresh Tokenは25個らしいです。上限を超えた際は機能しなくなることがありますので、エラーハンドリングはきちんとしておきましょう。
(Googleの仕様書に上限数の記載はありませんが、機能しなくなる話は書いてあります)

# 後始末に必要なもの
Refresh Token

最終的にAccess Tokenを使用して後始末をしますので、Refresh Tokenが必要となります。
手元にない場合はユーザーに再度Access Tokenを生成してもらってください。出来ない場合はここでの方法は使えませんので、ユーザーに手動で削除する手順を送ってやってもらうようにしてください。

# 後始末のやり方
失効用のエンドポイントをコールすればOKです。
Googleは各種エンドポイントをしっかりと公開してくれていますので(使い方はそこではわからないのですが)、エンドポイントを確認する際は以下のURLにアクセスしてみてください。

```
https://accounts.google.com/.well-known/openid-configuration
```

失効用のエンドポイントについての使い方はなぜか全然見つかりませんでしたが、Stack Overflowにあったので(URLは下に)、それを元に作らせていただきました。
Rubyだと以下でいけます。Refresh Token -> Access Tokenについては記載しません。

``` Ruby
  def revoke(access_token)
    url = URI.parse('https://oauth2.googleapis.com/revoke')
    form = {
      token: access_token
    }

    Net::HTTP.post_form(url, form)
  end
```

# 後始末をしなかった場合に発生する思ってもみない挙動
Refresh Tokenについては誰かが失効しない限りは永遠と同じものが使用されてしまいます。
そのため、以下の手順が発生した際に思ってもみないことが起きてしまいます。

```
1. ユーザーがGoogleを経由して情報をアプリケーションへ伝える
2. ユーザーが連携を解除する
3. ユーザーが再度Googleを経由して情報をアプリケーションへ伝える


■期待する動作
手順3にてRefresh Tokenが取得できる

■実際の動作
手順3にてRefresh Tokenが取得できない
```

初回のみ発行については、Googleの仕様書に記載があるので従うしかありません。
RFC的にそこの記載はないので、実装依存で問題ないようです。ただし、この実装をしているのは今のところGoogleしか知りません(同時にMSも実装しましたが、こちらは毎回もらうことが出来ています)

# 手動でのやり方
ちなみに手動でも連携は解除できます(Googleに限らずですが、ここではGoogleの情報を記載しておきます)。
やり方は簡単で、以下のURLから該当のアプリケーションを削除すればOKです。

逆にいうとユーザーが失効させてしまっている可能性もあるので、実装の際はその考慮を忘れないようにしましょう。

```
https://myaccount.google.com/u/1/permissions
```

# 終わりに
このようにRefresh Tokenが発行されないケースが今のところGoogleしか知りませんが、失効するエンドポイントが存在する場合はきちんと失効させておいた方が何かの折に面倒がなくて良いと思います。
たまに失効用のエンドポイントが存在しないサービスもあるので油断は出来ませんが、存在するのだけでもやっておきましょう。

# 参考URL
https://developers.google.com/identity/protocols/oauth2/openid-connect
https://stackoverflow.com/questions/62998100/gmail-api-get-new-access-token-after-revoke
【AWS ELB】 ELBやDockerを使って、EC2にWEBサーバ用のドメインを二つ持たせる奇行

# はじめに

「ELBを使って、EC2にWEBサーバ用のドメインを二つ持たせる」
つまり、「ELBのリスナーでWEBサーバ用のドメインを二つ登録し、同じEC2（WEBサーバ）をターゲットグループのターゲットとする」

という、ほとんど奇行ですねということを行ったのでその時のメモを残します。
あくまでこういうこともできるんだくらいな温度感で・・・はい、ご了承ください。（笑）

# 内容

以下のような構成にしました。

・ELBのリスナールールに二つのドメインを割り当てて、ターゲットグループで80と8080をルーティングするように設定
・Dockerでnginxを二つ起動させておきます

```
「ELB」→「EC2」→「Docker」→「nginx」：80ポートで待ち構えている  （nginx1とします。）
                         →「nginx」：8080ポートで待ち構えている（nginx2とします。）
```

そこで、

```
・「nginx1」には「https://hoge.com」でアクセスできるように・・・
・「nginx2」には「https://fuga.com」でアクセスできるように・・・
```
のようにします。

ドメインを二つ用意する必要あるので、サブドメイン切るなど行ってください。



うーん、それにしても奇行ですねー。


## 奇行までの環境構築

VPCやEC2、ELBの構築、ドメイン設定などは以下をご参照ください。
わかりやすく解説とともに構築までの流れを展開されています。

・0から始めるAWS入門：概要
　→　https://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde
・0から始めるAWS入門①：VPC編
　→　https://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b
・0から始めるAWS入門②：EC2編
　→　https://qiita.com/hiroshik1985/items/f078a6a017d092a541cf
・0から始めるAWS入門③：ELB編
　→　https://qiita.com/hiroshik1985/items/ffda3f2bdb71599783a3


## 奇行

### 1. ターゲットグループを作成

一つ目の「nginx1」用のターゲットグループとして、

```
・ターゲットグループ構築画面で、「Instances」→「ターゲットグループ名記入」→「ポート80」→「作成したVPC」→あとは良しなに→「Next」を選択します
・Available instancesに構築したEC2を選択し、「Include as pending below」→「Create target group」を選択します
```


二つ目の「nginx2」用のターゲットグループとして、

```
・ターゲットグループ構築画面で、「Instances」→「ターゲットグループ名記入」→「ポート8080」→「作成したVPC」→あとは良しなに→「Next」を選択します
・Available instancesに構築したEC2を選択し、「Include as pending below」→「Create target group」を選択します
```

### 2. リスナーのルールに２つのドメインを追加

一つ目の「nginx1」用のリスナールールとして

```
・ロードバランサー構築画面で、対象のロードバランサーを選択し、「リスナー」タブを選択します
・ルール部分の「ルールの表示/編集」を選択します
・ルールの挿入を行い、条件に「ホストヘッダー...」を選択し、値に「WEBサーバドメイン」を入力します。
・アクションの追加を選択し、「nginx1」用に作成したターゲットグループを割り当てます
```

二つ目の「nginx2」用のリスナールールとして

```
・ロードバランサー構築画面で、対象のロードバランサーを選択し、「リスナー」タブを選択します
・ルール部分の「ルールの表示/編集」を選択します
・ルールの挿入を行い、条件に「ホストヘッダー...」を選択し、値に「WEBサーバドメイン」を入力します。
・アクションの追加を選択し、「nginx2」用に作成したターゲットグループを割り当てます
```


# 所感

本当に奇行だと思いますし、やらないと思いますが、

```
・サーバ構築するのめんどい
・ただ動くのみたいだけだからひとまず開発環境として作ってみる
・動いた
・プログラム問題ないな、じゃあ捨てます
```

とかしたいときにいいと思います。
WindowsPCにComposer インストール

#Windowsに「MAMP4.2」と「Composer2」をインストールする
みなさんこんにちは 
[ジーズアカデミー 主席講師 山崎ですm(_ _)m](https://gsacademy.jp/mentor/)
今回はLaravelをMAMPで動作させる際に受講生が困っていた内容の一つを記事にしました。
※今後同じ事をやる人のためにメモを残します。


####（重要）Windwos/MAMP4.2で検証した内容です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/807b6849-72e8-ecd2-047c-5e178778d2ae.png" width="1000">


###対象（インストールした環境）
・ Windows10
・ MAMP4.2(php7.4.1) 
・ Composer(ver.2)


###Windowsに「Composer」をインストール


#####１．「 Composer 」ダウンロード
https://getcomposer.org/Composer-Setup.exe


#####２．「 Composer 」インストール
何もチェックせずに「Next>」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/e8f347e7-0095-4a1f-78bd-99bd20d6f8b6.png" width="700">


#####３．「 Browse...」をクリックしてMAMPのPHPバージョンフォルダ内にある「php.exe」を選択
・チェックボックスルも入れておく。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/a9a2a0b9-21e3-48e3-f345-062f69be57cc.png" width="700">
「Next>」ボタンで次へ



#####４．「Create a php.ini file」にチェックを入れる！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/e07c3367-d2e4-7fda-9663-8a187b6c72e6.png" width="700">
「Next>」ボタンで次へ

#####５．何も入力しない
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/5315b26b-bb2b-f1dd-f4f1-4e1a5331a723.png" width="700">
「Next>」ボタンで次へ

#####５．「Install」ボタンをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/c1588e95-f7fb-f47d-61fd-dc67105ec9c9.png" width="700">

#####６．「Next>」ボタンで次へ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/f420fbe2-8c89-aa46-f853-e1e3d83acc65.png" width="700">


#####７．「Finish」ボタンをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/95e107c9-9c2d-4aa1-d489-e3975ee63878.png" width="700">


##<< 「composer install」「composer update」で赤い文字のエラーが出た場合 >>
####１．php.iniの修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/e1e7dd81-bd37-400c-acd2-b2d4cced652e.png)
上記「３」で選択したphp.exeと同フォルダ内に「php.ini」ファイルができてるので

```cmd:php.ini
;extension=fileinfo
　↓　↓　↓　
extension=fileinfo
```
上記、";" コメント外し保存

####2．MAMP再起動
php.iniの修正を反映させるため、MAMPを再起動します。


#以下、追加メモ


##＊LaravelでリポジトリをGitcloneしてきた場合（以下コマンド）
1. ```composer install```
2. ```cp .env.example .env ``` （laravelフォルダ内で実行）
3. ```php artisan key:generate``` （laravelフォルダ内で実行）

######上記３つのコマンドを打つ理由は
- .envが入っていない
- KEYが発行されていない
- vendorフォルダが入っていない



##＊Laravelの動作を確認する場合
####1.「 MAMP 」→ 「 Preferences...」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/5464cf4f-5e30-ebef-b192-c5dc1c925e2b.png" width="700">

####2.「 Web Server 」タブを選択 → 「 Select... 」ボタンを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/7afce913-59a9-1156-5162-0299a14c3962.png" width="700">

####3.フォルダ選択で「 Laravel 」フォルダ内の「 public 」を選択
「 http://localhost/ 」と「 public 」はイコールとなります。

####4.「 http://localhost/ 」でブラウザから確認可能になります。
※MAMPが再起動してなければ、再起動してから確認しましょう！！






以上
Microsoftアカウントを作らないでOffice製品のライセンスを認証させる方法

officeの永久ライセンスを購入し、プロダクトキーを入力するとき必ずMicrosoftアカウントのサインインまたは、アカウント作成を要求されます。

今回、パッと思いついた方法を試したところ、Microsoftアカウントのサインインせずにプロダクトキーを入力することができました！！

##Microsoftアカウントにサインせずにライセンス認証する方法
まず、永久ライセンス版のoffice製品をインストールし、officeの製品をどれでもよいので起動します。

Office製品を起動すると以下の画面がポップアップされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/415abfeb-cf24-baea-bbf4-9762acfd1a95.png)
このまま、サインインやアカウント作成にするとMicrosoftのサインイン画面が表示されます。
その為、**ネットワークを外します！！**(LANケーブルを外すか、無線LANを切ってください。)
そしてサインインをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/5d2316c8-fdb4-c679-0b4d-283a6c53db02.png)
ネットワークに接続できないため、注意が表示されますがここに**『プロダクトキーを代わりに入力する』**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/b2d7c073-bcb9-0e91-aa49-9806cc02298c.png)
プロダクトキーの入力画面になるので、お持ちのプロダクトキーを入力してください。

プログラムの更新の画面になり、数十分程待てば更新が完了しプロダクトキーの入力は完了です！
(プログラムの更新画面はスクショするのを忘れてしまった。。。)
ここまで来ればネットワークに接続しても大丈夫です！
【CentOS8】ConoHa VPSを再構築する際の作業について

###はじめに
ssh関連の作業にハマってしまったので、自分用のメモも兼ねて書こうと思います。
一度管理していたサーバーを再構築する想定です。今回rootユーザーで全ての設定を行っています。

###環境
【クライアント側】
・MacBook Air (Retina, 13-inch, 2020)
・macOS Catalina(v10.15.7)

【サーバ側】
CentOS Linux release 8.2.2004 (Core)


### 1.サーバーを停止して再構築
conohaのコントロールパネル > サーバー > サーバー再構築から。
sshの鍵は同じものを利用する想定です。

### 2.接続するpcのIPアドレスを許可する
conoha側のコンソールを利用して、接続する自分のPCが利用するネットワークのIPアドレスをサーバーに許可させます。
ネットワークのIPアドレスはこちらから確認が可能です。
https://www.cman.jp/network/support/go_access.cgi


```
## conohaコンソール側
## "xxx.xxx.xxx.xxx"は自分のPCのネットワークのIPアドレス
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="xxx.xxx.xxx.xxx" port protocol="tcp" port="22" accept"
```

###3.sshでアクセス
手持ちの鍵を使ってVPSへアクセスします。
IPアドレスはさっき使った自分のPCのネットワークのIPアドレスではなく、VPSのアドレスを使用します。

```
## 自分のPC側のターミナルで入力
## IPアドレスの欄はVPSのIPアドレスを記入

ssh -i kagi.pem root@xxx.xxx.xxx.xxx

## 鍵へのルートは保存している場所によって変化
## macでデスクトップに鍵が置かれている場合は下記のようなイメージ
## ssh -i /Users/xxx(ユーザー名)/Desktop/kagi.pem root@xxx.xxx.xxx.xxx

```

###4.拒否される

前回構築していたサーバーと同じIPアドレスで再構築した場合は警告が出てアクセスできない筈です。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
...(中略)....
Host key verification failed.
```

sshでサーバーに接続した場合、接続先の情報がローカルに保存されるという仕組みが取られているようなのですが、今回の場合同じIPアドレス先に接続しているのに、サーバの情報が前回接続時と異なるからアクセスするのが危険だと怒られています。

###5.ローカルの接続先情報を削除する
.sshフォルダにある接続先の設定を消します。

```
## 自分のPC側のターミナルで入力
## .sshフォルダへ
cd
cd .ssh

## 設定の削除 IPアドレスの欄はVPSのIPアドレスを記入
ssh-keygen -R xxx.xxx.xxx.xxx
```
接続していた前回サーバについての情報を消すことができました。

### 6.改めて接続

```
## 自分のPC側のターミナルで入力
## IPアドレスの欄はVPSのIPアドレスを記入

ssh -i kagi.pem root@xxx.xxx.xxx.xxx
```

### 7.fingerprintについての警告
またしても警告が出る場合があります。

```
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
...(中略)...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```
`yes`と入力してあげましょう。ログイン完了です。


###終わりに
環境構築は体験する機会が少ないのでメモを取っておくのがとても大事ですね。
昔の自分がメモにまとめていたリンク先や情報が役に立ちました。

昔と同じところでつまづくこともありますが・・・・


###参考リンク
[ssh接続をする際に「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」と出てつながらない](https://www.niandc.co.jp/sol/tech/date20150729_507.php)


[MacのターミナルからLightsailのインスタンスにssh接続](https://drupal-study.info/ja/blog/20)
※こちらはLightsailについての記事ですが、「端末側の設定」についてはsshについての内容だったため参考になりました。
ウェブサイト作成用備忘録・８号：クロスブラウザコーディングとの戦い…その１

苦労してHTMLを書き上げて、Google chromeのプレビューで正常に表示されていても、戦いはまだ終わらない。
ふとedgeやIEで確認してみると、思ったように表示されない…

今回はそのような事態に遭遇した時の状況と、どのように解決したのかを記録していこうと思います。

####記事作成時の各ブラウザのバージョン<br>Google chrome：87.0.4280.88<br>Internet explorer：11.1480.14393.0<br>Microsoft edge：38.14393.1066.0<br>Firefox：83.0

---
####Ｑ・文章を右寄せする為に text-align: end を設定したが、edge、IE で反映されなかった。
###Ａ・text-align: end の代わりに text-align: right を設定する。
---
####Ｑ・文章を縦書きで表示する為に writing-mode: vertical-rl を設定したが、IE では反映されなかった。
###Ａ・IE で writing-mode を設定する場合、独自の設定を行う必要がある。writing-mode: vertical-rl の場合、一緒に writing-mode: tb-rl を設定する。
---
####Ｑ・display: flex を設定したタグの子要素に設定した margin: auto が Google chrome 以外のブラウザでは意図した通りに反映されなかった。
###Ａ・Flexbox は各ブラウザによって動作にバラツキがあるため、display: flex を設定したタグの子要素には margin: auto を設定しないようにする。（justify-content 、align-items 等を活用する）
---
今回は以上になります。
来年にはIEのサポートも終了するので、それまでの辛抱ですね…！！
UbuntuにHDDを増設する方法

# はじめに　
パソコンを組んでいて、HDDを追加する機会が何度か有り、そのたびにHDDの追加方法を調べていました。そこで自分の環境で行った手順をここに記録します。
なお、環境は`Ubuntu 20.04LTS`で、HDDがすでに接続されているものとして進めていきます。


# 追加HDDの認識状況
まずは追加したいHDDがUbuntu側でどのように認識されているのかを確認します。

```bash 
dmesg | lv
```
をたたくと、

```bash:NVMEの場合
[    2.547103] EXT4-fs (nvme0n1p2): mounted filesystem with ordered data mode. Opts: (null)
```

```bash:HDDの場合
[    1.196264] ata2: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[    1.196984] ata2.00: ATA-10: WDC WD40EFAX-68JH4N0, 82.00A82, max UDMA/133
[    1.196985] ata2.00: 7814037168 sectors, multi 16: LBA48 NCQ (depth 32), AA
[    1.197574] ata2.00: configured for UDMA/133
[    1.197712] scsi 1:0:0:0: Direct-Access     ATA      WDC WD40EFAX-68J 0A82 PQ: 0 ANSI: 5
[    1.197885] sd 1:0:0:0: [sda] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
[    1.197886] sd 1:0:0:0: [sda] 4096-byte physical blocks
[    1.197889] sd 1:0:0:0: [sda] Write Protect is off
[    1.197890] sd 1:0:0:0: [sda] Mode Sense: 00 3a 00 00
[    1.197895] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
```
のように表示されています。以下、`/dev/sda`を追加することとして話をすすめます。

# パーティションとフォーマット
2TB以上のHDDは通常のフォーマットではなく、GPT形式でフォーマットする必要が有ります。

```bash
sudo parted /dev/sda
```

これで`/dev/sda`にアクセスできるようになりますので、GPTを割り振ります。

```bash
mklabel gpt
```
その後、パーティションを作成します。

```bash
mkpart
```

ここで、セクターの開始と終了を聞かれますので、必要に応じてディスク容量を割り当てれば良いです。

最後に、

```bash
sudo mkfs.ext4 /dev/sda1
```

としてext4形式でフォーマットを行います。

# fstabの設定
以上でHDDの準備は整いましたが、ubuntu側の設定が終わっていません。
まず、ディスクのUUIDを確認します。

```bash
sudo blkid /dev/sda1

/dev/sda1: UUID="2745c617-1428-4d4d-ab18-hogehoehoed9" TYPE="ext4" PARTLABEL="pub" PARTUUID="hogehoge-1416-4c61-b6a3-hoehoe"
```

UUIDの値をfstabにコピーします。ここでは、/dev/sda1を/pubとしてマウントすることとすると、

```bash:fstab
UUID=22745c617-1428-4d4d-ab18-hogehoehoed9       /pub    ext4    defaults        0       2
```
これで、
```bash
sudo mount -a
```
でHDDがマウントされます。

# まとめ
2TB以上のHDDでは通常のフォーマットでは容量すべてを使い切ることができません。
GPTをHDDに割当て、その後、ext4などでフォーマットする必要が有ります。

以上です。
【CSS】フッター要素を表示領域に固定させる

#はじめに
駆け出しエンジニアのyosukeです！
先日、私が所属するevoluの自社サービスとして「 [小説執筆アプリ - Mono - ](https://www.mono-kaki.site/) 」をリリースしました!

サーバーサイド側は半月くらいで作り終え、デスクトップ表示の最低限のUIを作ったところでのリリース（デプロイ）でしたので、これからフロント側の改修作業しているところです！
苦手なCSSでのレイアウト整正で特にハマったところをメモります！


##フッター要素を固定にしてどの画面サイズでも表示位置を維持させたい


![スクリーンショット 2020-12-16 16.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549258/03828c05-659c-b0f3-cd5a-ac4080f820f6.png)


###書き方
```HTML:HTML
<div class="fixed_footer">
 <footer>
  #フッターコンテンツ
 </footer>
</div>

```


```CSS:css
.fixed_footer {               /* writingsページの「保存ボタンありフッター」の固定 */
    position: fixed;            /* フッターの固定 */
    bottom: 0px;                /* 位置(下0px) */
    left: 0px;                  /* 位置(左0px) */
    width: 100%;                /* 横幅100%　*/
    height: 60px;              /* 縦幅60px */
}
```

これで、画面を縮小したりスクロールしてもフッターは常にこの位置に固定表示される様になります！

以上です！
Docker/Postgresでpassword authentication failedが出た場合の対処法

## エラー内容

```
Unable to connect to the database.
error: password authentication failed for user "xxx"
```

または

```
Password does not match for user “xxx”
```

## 原因

- 一度Dockerを立ち上げた後、認証情報（`POSTGRES_USER`や`POSTGRES_PASSWORD`）を変更した場合に発生します。

- 認証情報は、初期起動時に設定されます。その後、認証情報を変えて起動しようとしても、当初設定した値と一致しないので、エラーになります。


## 対応方法

- db volumeを削除して、起動する（※db volume内のデータは失われることに注意）。

```
## docker 削除時に、container に紐付けられた volume も削除する （docker rm --help で確認可）
$ docker rm -v <xxx>
```

- 以下は、container とは別に手動で volume を削除する方法（↑で上手く行けば不要）。

```
## docker を削除
$ docker rm <xxx>

$ docker volume ls
DRIVER    VOLUME NAME
local     some_db_data

$ docker volume rm <volume>
or
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y 

## 削除されていることを確認
$ docker volume ls
```

## 参照先

https://stackoverflow.com/questions/54764965/password-does-not-match-for-user-postgres
Google recruit problem, exp and prime



# お題

    {e(自然対数の底)の値で連続する10桁の数のうち，最初の素数}

をrubyで求めよ．ただし，e(自然対数の底)は200桁までで

```
2.71828182845904523536028747135266249775
7247093699959574966967627724076630353547
5945713821785251664274274663919320030599
2181741359662904357290033429526059563073
81323286279434907632338298807531952510190
```

である．これをテキストにコピーして読みこませよ．


# 解説


## テキストファイルの読み込み

テキストファイルの内容を全て読み込みたいのであればreadメソッドを使えばよい．読み込めているかどうか心配であれば，putを用いて表示すればよい．

```ruby

exp=File.read("e.txt")
#->自然対数の底eの値200桁までの値のテキストファイルを読み込む

p exp
#->内容確認

```


## 10桁ずつ表示させる方法

whileループを用いて10桁の整数をつくる．念のため，各配列に格納されている数値を整数に変換しておく．

```ruby
#ループを回して10桁の整数を自然対数から切り出していく
i=0

while(i<200)
 j=0
 num=0
 while (j<0)
  num=10*num+exp[i+j].to_i
  j+=1
 end
i+=1
end

```


## 素数判定

素数や素因数分解を扱うライブラリであるprimeを用いた．Prime.prime?(number)は，変数numberが素数かどうかを判別することができ，素数であればtrueを，そうでなければfalseを返す．関数find\_primeは変数numを素数か否か判別するが，numが素数であればnumを返し，合成数であれば0を返すようにした．そして，返した素数はあらかじめ用意した自然対数の底に含まれる十桁の素数を格納する配列に入れていく．下記はfind\_primeのコードになる．

```ruby
require 'prime' 

def find_prime(num)

 if(Prime.prime?(num)==true) then
  return num
 else
  return 0
 end
end

```


# プログラム

上記の解説をまとめたソースコードとなる．

```ruby

require 'prime'

def find_prime(num)
  if(Prime.prime?(num)==true) then
    #puts 1
    return num
  else
    #puts 0
    return 0
  end
end

def count_digits(num)
  num.to_s.length
end

exp=File.read("e.txt")
p exp
#puts count_digits(exp)
#2重ループにして10桁の整数を切り出す

i=0
result=[]

while (i<200) do
  j=0
  num=0

  while (j<10) do
    num=10*num+exp[i+j].to_i
    j+=1
  end
  i+=1

  if (find_prime(num)!=0) then
    result.push(num)
  end
  #puts num
  #puts find_prime(num)
end

puts "素数一覧"
puts result
puts " "
puts "最初の素数"
puts result[0]

```

出力結果

    C:\Users\nobua\M1>ruby google_recruit_problem_2.rb
    "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190"
    素数一覧
    7427466391
    7413596629
    6059563073
    3490763233
    2988075319
    
    最初の素数
    7427466391


# 参考文献

<https://ist.ksc.kwansei.ac.jp/~nishitani/?GoogleEntExam>



------
 - **source** ~/grad_members_20f/members/NobuakiMori/google_recruit.org
twinetverseでツイッターのネットワーク分析

(2021/05/31追記)
M1macだとうまいこと入れられないかもしれない。
rtweetは普通に入る。


#はじめに
ツイッターのデータを使ったネットワーク分析って最近論文とかも出てきてるけどグラフデータ準備するのめんどくさいなあって思ってたらパッケージが開発されてた（当然と言えば当然）<br>

github：https://twinetverse.john-coene.com/
チュートリアル：https://twinetbook.john-coene.com/index.html


#twinetverse
###インストール
CRAN経由では落とせないぽいのでgithub経由で

```r 
devtools::install_github("JohnCoene/twinetverse") # github
devtools::install_bitbucket("JohnCoene/twinetverse") # bitbucket
```

これどうも`rtweet` / `graphTweets ` / `sigmajs `も入ってるぽいのでこれ一本で分析ができます！みたいなことらしい。

###ツイートの取得
この辺は`rtweet`なので細かいところは適当にやってしまってくだせえ。
`twinetverse`のチュートリアルだと自分のトークンを設定することになってるけど`rtweet`はもうアプリ認証経由でツイッターAPIにアクセスできるようになってるので必要ないと思う。<br>
差し当たり大統領選の不正についてのツイートでも取得してみましょう。クエリはツイッターAPI準拠。

```r
tweets <- search_tweets(q = "大統領 AND 不正 filter:retweets", 
                        n=500, include_rts = TRUE)
```

###グラフの作成
取得したツイートデータからグラフデータを作成。試しに取得したデータからリツイートネットワークを作ってみます。

```r
net <- tweets %>% #グラフデータの作成
  gt_edges(screen_name, mentions_screen_name) %>% #エッジデータを取得
  gt_nodes() %>% #ノードデータの取得
  gt_collect() # collect
lapply(net, class)

#エッジとノードを取得
c(edges, nodes) %<-% net 
##edges <- net$edges  
##nodes <- net$nodes と同じ意味を持つ

#sigmajsデータに変換
nodes <- nodes2sg(nodes)
edges <- edges2sg(edges)
sigmajs() %>% 
  sg_nodes(nodes, id, size) %>% #ノードの付加
  sg_edges(edges, id, source, target) #エッジを追加
```

`sigmajs`はどうも`ggplot`と似たような書き方ぽい？
ノードとエッジを書き加えていくイメージ

![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712546/4cb435fb-285c-824b-eb71-6a052d9082b5.png)

これだとこんな感じになるけど見た目がよくないので諸々を調整していく。

```r
sigmajs() %>% 
  sg_nodes(nodes, id, label, size) %>% 
  sg_edges(edges, id, source, target) %>% 
  sg_layout(layout = igraph::layout_components) %>% 
  sg_cluster(
    colors = c(
      "#0084b4",
      "#00aced",
      "#1dcaff",
      "#c0deed"
    )
  ) %>% 
  sg_settings(
    minNodeSize = 1,
    maxNodeSize = 2.5,
    edgeColor = "default",
    defaultEdgeColor = "#d3d3d3"
  )
```

いろいろ調整するとこんな感じ。めっちゃみやすくなった。
他にもいろいろあるらしいのでチュートリアル読んで頑張っていきたい。

![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712546/ebee41da-a230-ebc8-fe02-4c813d7323b9.png)
Expected a `const` instead of a literal type assertion. 解消

```react
// No.1
const hoge = 'xl'

// No.2
const hoge = 'xl' as 'xl'

// No.3
const hoge = 'xl' as const
```

### No.1
No.1では、TypeScriptの型推論で、hogeはstring型だと認識する。

### No.2
Reactでstring型で渡すのではなく'xl'の型としたい場合は、型アサーションを行う。
リテラルを推測するので、意図した通りになる。(No.2)
しかし、下記のeslintのエラーが表示される。

``Expected a `const` instead of a literal type assertion.``

### No.3
エラー文の通りに修正すると、eslintをパスできる。
Google Spreed Sheetの条件付き書式が分割されまくってむかついたので消す方法を探した

エンジニアのみならず、最近はGoogle Spreed Sheetでいろいろやることが増えた。

個人的にはEXCELは時代遅れで、
EXCELでしかできないことに最近出会わないので、
むしろ**Microsoft EXCEL**という文字すらほぼ見ないし、
xlsxファイルも社内のレガシーなオペレーションでしか見ない。

今回は私ががタスク管理で利用しているWBS（Work breakdown Structure）を
Google Spreed Sheetで運用していて、はまった問題の解消法について紹介する。

#Google Spreed Sheetの条件付き書式はむかつく

いや、むかつくといいつつ、とってもありがたいですよ！
今日やらなきゃいけないタスクに色付けたり、いろいろ出来るのですが、
行追加、列追加とかやっていくと、気づいたら条件付き書式がアホほど増えて、管理が大変になっていたことがありました。


#条件付き書式を抹殺したい

10個くらいなら地道にゴミ箱のアイコンで消していくのもいいのですが
私の場合恐らく1000個以上に分裂したので、消すのにも都度ロード、むかついたので以下の方法で抹殺してやった。

- 無駄に増殖した領域を指定
- ツールバー「表示形式 > 書式をクリア」

これでめでたく抹殺に成功！！


**ただし**、大量に条件付き書式を重ねている場合は全部消えるので（条件付き書式以外の背景色や文字のボールドも消えるので）気を付けてください。


～～～初投稿ｗ
2020年 Rust で使える Bluetooth Low Energy ライブラリはどうなってるの (Windows10)

RustからBLEを扱うためのライブラリ（Windows10用）を調べています。

## Windows10向けBLE実装の現状

### winrt-rs

昨年末に調べた時は[winrt-rust v0.6](https://github.com/contextfree/winrt-rust/tree/v0.6.0)一択の状況でした。今年に入ってこのrust向けwinrtの実装に変化がありました。
[crates.ioのwinrt](https://crates.io/crates/winrt)を見ると、普通にv0.7系がリリースされているように見えますが、実はv0.7から開発元が変わっていて

* contextfreeの[winrt-rust](https://github.com/contextfree/winrt-rust)はv0.6でおしまい
* v0.7からは[Microsoftが実装](https://github.com/microsoft/winrt-rs)を進めている

という状況になっています。

そしてMicrosoftが実装したv0.7はv0.6と互換性がなく、そのまま置き換えることができません。残念です。

BLEまわりを少しだけ触ってみた感じですが、v0.6からv0.7になり

* winrt側のAPIがComPtrに包まれなくなった（そのまま出てくる）
* BluetoothLEDevice2とかBluetoothLEDevice3などを生成しなくて各種APIが使えるようになった（BluetoothLEDeviceからそのまま呼び出せる）
* イベントハンドラの引数型が変更になった

注：winrt-rsでのBluetoothLEDevice2や3については、[以前に書いた記事](https://qiita.com/kaz399/items/fe5247875fdf2003f83b#%E3%83%9A%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A)にまとめてあります。

v0.6時代には実質的に使えなかったAPI（APIの引数に必要な型をRust側で生成する方法が存在しないもの）がどうなっているのかは未調査です。追って調査したいと思っています。

### btleplug

そして今年はクロスプラットフォームを謳うBLEライブラリ、[btleplug](https://crates.io/crates/btleplug)が登場しました。

このbtleplugは、Windows, MacOS, Linuxに対応しています。
使用できる機能は現段階では各OSで違いますが、同期のRead/Write程度であればどのOSでも動くようです。

Windows向けの下回りはwinrt-rs v0.6でした。
とりあえずWindowsの下回りを[winrt-rs v0.7に対応させるプルリク](https://github.com/deviceplug/btleplug/pull/98/commits/36b91b9a3cef70dd4a47e741ba9147e2a45c1bda)を投げてみました。 ~~マージされるかどうかはよくわかりません。~~ マージされましたバンザイ。
上のwinrt-rsの所では詳しく書きませんでしたが、winrt-rs v0.6とv0.7のBLEまわりの違いについて誰かの何かの参考になれば嬉しいです。

APIは[Rumble](https://crates.io/crates/rumble)に合わせていて、そのAPI体系を他のプラットフォーム上でも実現する形になっています。
元々のRumbleのAPI由来なのですが、Notifyハンドラあたりの扱いがイマイチよくわからない作りになっていて使いにくい雰囲気を受けました。

そのうち発展して使いやすくなっていくことを期待していたのですが、残念ながらbtleplugの開発者が[保守にあまり興味を持っていない](https://github.com/deviceplug/btleplug/issues/100#issuecomment-742962639)様子なので、なんだか先行き不透明です。

## （いきなり）まとめ

2020年12月現在、Windows上でRustを使ってBLEを扱える簡単便利なライブラリは未だ存在しないようです。
クロスプラットフォームを考えないのであれば、winrt-rs経由で使うのが一番素直なのかもしれません。

今後の充実に期待したいです。
SQL概要

#目的
SQLの理解が薄いため言語化し定着に勤めたいと思います。
#SQLとは
RDBの操作を行うための言語。
```RDB```（リレーショナルデータベース）表形式でデータを管理する、データベースです。カラムやレコードがある。
```RDBMS```（RDBマネジメント・システム）RDBを使用する際、それを管理するシステム。
```MYSQL```RDBMSの１つです。特徴：拡張機能が多い。：小規模から大規模のデータも取り扱いが可能。：柔軟性が高い。
SQLはデータベースやテーブルに対して様々な命令を行いますが、その命令は大きく分けて３つです。
```データを定義するDDL```（Data Definition Language）
```データを操作するDML```（Data Manipulation Language）
```データを制御するDCL```（Data Control Language）
```DDLのできること```
CREATE(データベースやテーブルの設定)
ALTER(データベースやテーブルの更新)
DROP（データベースやテーブルの削除）
```DMLのできること```
INSERT(データの登録)
UPDATE(データの更新)
DELETE(データの削除)
SELECT（データの検索）
```DCLのできること```
COMMIT(DBの変更の確定)
ROLLBACK(DBの変更の取り消し)
GRANT(ユーザーに操作権限を付与)
REVOKE(ユーザーの操作権限を無効化)

SQLはどのような種類のRDBに対しても、基本的に同じ文法で操作ができます。なので一つのSQLを学んでしまえば他のRDBを扱う時でもその知識は役立つ事が保証される。
#SQLの裏側
SQLにも文法があり、ルールに沿って記述すると「データベースからデータを取得する」事ができる。
(例)投稿一覧ページ（index）には様々な処理がされている。ターミナルでログを確認すると色文字で書かれているところがSQL文です。あくまで例ですがSQL文を見ると
```SELECT text FROM tweets;```が書かれており。textは取得したいデータ。tweetsはテーブル名となっている。
なので一覧表示ページには、取得したSQLが表示される。

#SQLを使用してみる
```find_by_sql``` => Ruby on RailsでSQL文を使用し、データを検索し取得する際に使用するメソッドです。

```
def index
      #@tweets = Tweet.includes(:user).order("created_at DESC")
    query = "SELECT * FROM tweets"
    @tweets = Tweet.find_by_sql(query)
end
```
```"SELECT * FROM tweets"```tweetテーブルからすべてのレコードを取得するSQLなのでTweet.allと同義となる。
このように、SQLを直接記述することでテーブルからデータを取得できました。
Oracle Database の set feedback on sql_id の使い方

# 概要
今更ですが、Oracle Database 18c から set feedback on sql_id を設定することによって SQL_ID を簡単に確認することができるようになっています。ちょっとした機能追加ですが、従来は v\$sql や v\$session などから確認していたところが不要になるので、検証等では意外と重宝しそうな気がしています。
ここではマニュアルを参考に、使い方を確認したいと思います。

# 使い方
使い方は簡単で、"set feedback XXX" の後ろに sql_id と追記するだけです。ちなみに、"set feedback off sql_id" とすれば「XX行が選択されました。」を抑止しつつ SQL_ID を出力してくれます。

```sql
■ デフォルト値の確認（無効化されている）
SQL> show feedback
FEEDBACK ON for 6 or more rows SQL_ID OFF

■ 設定
SQL> set feedback 6 sql_id

■ 有効化の確認
SQL> show feedback
FEEDBACK ON for 6 or more rows SQL_ID ON
```

この状態で SQL を実行すると、下記のように SQL_ID も同時に出力してくれます。

```sql
SQL> select emp_name from emp where emp_id=100;
EMP_NAME
----------
HOGEHOGE

SQL_ID: 7tq899p0fg6b1
```

また、この SQL_ID は事前定義済変数 _SQL_ID に格納されるため、例えば以下のような形で該当 SQL の関連情報を確認することができます。

```sql
SQL> set pages 999 lin 99 tab off
SQL> select * from table(dbms_xplan.display_cursor('&_sql_id'));
旧   1: select * from table(dbms_xplan.display_cursor('&_sql_id'))
新   1: select * from table(dbms_xplan.display_cursor('7tq899p0fg6b1'))

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------
SQL_ID  7tq899p0fg6b1, child number 0
-------------------------------------
select emp_name from emp where emp_id=100

Plan hash value: 2328672378

-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |       |       |     2 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP         |     1 |  1005 |     2   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | IDX_EMP     |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMP_ID"=100)


19行が選択されました。

SQL_ID: brgt5k4fpz256
```

# 参考
* SQL*Plus® リリース・ノート 19c - [SQL*Plusリリース18c バージョン18.1の新機能](https://docs.oracle.com/cd/F19136_01/sqprn/index.html#SQPRN-GUID-B336CE0F-EC31-4993-A34C-733E335046BC)
* SQL*Plus® ユーザーズ・ガイドおよびリファレンス 19c - [12.41.23 SET FEED[BACK] {6 | n | ON | OFF | ONLY} [SQL_ID]](https://docs.oracle.com/cd/F19136_01/sqpug/SET-system-variable-summary.html#GUID-2C90B73B-A7E0-4357-9382-5EBAF53BF528)
NuGet Source がなぜか消えない

今までDisktopを使っていたが、旅先なので、LapTopを持っていくことにした。環境の移行とかはしたのだが、現地で、VSを使うと、何とリストアがVSで、こける。なんでやねん、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/abcde170-eaa1-88ed-09ab-af61f54f8af9.png)

明らかに、先日削除した ServiceFabric のパッケージソースがあって、それが悪さをしてそう。ちなみに、VS のパッケージソースからは削除済みなのにいまだに出てしまう。気を取り直して、先日学んだコマンドラインの方式でやってみる。

```commnad
dotnet restore
  Determining projects to restore...
C:\Program Files\dotnet\sdk\5.0.101\NuGet.targets(131,5): error : The local source 'C:\Program Files\Microsoft SDKs\Service Fabric\packages' doesn't exist. [C:\Users\tsushi\source\repos\ScaleControllerSpike\ScaleControllerSpike\ScaleControllerSpike.csproj]
```

同じですな。ではパッケージソースは？

```command
dotnet nuget list source
Registered Sources:
  1.  Local Package Source [Disabled]
      C:\LocalNuGet
  2.  nuget.org [Enabled]
      https://api.nuget.org/v3/index.json
  3.  azure_app_service [Enabled]
      https://www.myget.org/F/azure-appservice/api/v2
  4.  Microsoft Visual Studio Offline Packages [Enabled]
      C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
```
まだおるがな。じゃあ、コマンドで削除や。

```command
dotnet nuget remove source "Microsoft Azure Service Fabric SDK"
Package source with Name: Microsoft Azure Service Fabric SDK removed successfully.
```
うむ。確認。

```command
dotnet nuget list source
Registered Sources:
  1.  Local Package Source [Disabled]
      C:\LocalNuGet
  2.  nuget.org [Enabled]
      https://api.nuget.org/v3/index.json
  3.  azure_app_service [Enabled]
      https://www.myget.org/F/azure-appservice/api/v2
  4.  Microsoft Visual Studio Offline Packages [Enabled]
      C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
  5.  Microsoft Azure Service Fabric SDK [Enabled]
      C:\Program Files\Microsoft SDKs\Service Fabric\packages
```
まだおるがな、、、

多分これは、`nuget.config` のデフォルトの問題と思い調査すると次のスタックオーバーフローがヒット。

* [Where is NuGet.Config file located in Visual Studio project?](https://stackoverflow.com/questions/42736107/where-is-nuget-config-file-located-in-visual-studio-project)
* [Config file locations and uses](https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior#config-file-locations-and-uses)

| スコープ | NuGet.Config の場所 | 説明 |
|---------|---------|--------|
| Solution | カレントフォルダ | VSのソリューションのフォルダ |
| User | Windows: `%appdata%\NuGet\NuGet.config`, Mac/Linux: `~/.config/NuGet/NuGet.Config` もしくは `~/.nuget/NuGet/NuGet.Config` | Solutionのレベルで上書きされる |
| Computer | Windows: `%ProgramFiles(x86)%\NuGet\Config`, Mac/Linux: `$XDG_DATA_HOME`つまり `~/.local/share` もしくは `/usr/local/share`| User もしくは Solution レベルで上書きされる |

なるほど。だから、ユーザーレベルのを消しても、それが、Computerレベルのものだったら、消えないわけか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/4a7de821-dd57-11c3-e8f9-c695b45e1955.png)


コンピューターレベルのデフォルトにいたので、`ServiceFabricSDK.config` を消すことで無事解決。

# Resource
* [Linux 環境上で、C# のプロジェクトから NuGet パッケージを作成して他のプロジェクトに読み込ませる](https://qiita.com/TsuyoshiUshio@github/items/d8ec8bbda9cec7a5bc6a)
[Rails]フラッシュメッセージを一定時間で消す方法

## 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina
## 実装

```java:Gemfile
gem 'jquery-rails'
```
```java:ターミナル
bundle install
```

```java:controller

  def create
    @book = Book.new(book_params)
    @book.user_id = current_user.id
    if @book.save
      redirect_to book_path(@book)
      flash[:notice] = "本が投稿されました"
    else
      @books = Book.all
      flash.now[:alart_flash] = "本の投稿に失敗しました"
      render 'index'
    end
  end
```
本が投稿された時にはnotice、失敗した際にはalart_flashと名付けて判別。ここの名前は自分で変えてもOK！
flash[:]にすると、次のアクションまで表示させる。
flash.now[:]にすると、次のアクションに移行した時点で消える仕組みになっているので
renderは指定したviewsを呼び出すだけなので、アクションではないから気をつける。
redirect_toは次のアクションになるので、flash.nowだと表示がされないので注意が必要
##フラッシュメッセージ装飾
```java:application.scss
.flash{
  width: 100%;
  height: 30px;
  font-size: 18px;
  text-align: center;
  padding: 0;
  z-index: 1;
}

.notice{
  background-color: #65A2FF;
}

.alart_flash{
  color: #FFFFFF;
  background-color: #FF0000;
}
```

##一定時間でフラッシュメッセージを消す。
```java:application.js
// フラッシュメッセージ
$(function(){
  $('.flash').fadeOut(4000);  //４秒かけて消えていく
});

```
今年も WeeklyOSM を推します

OSM をとりまく様々なニュースをお伝えしている [WeeklyOSM](http://weeklyosm.eu/ja/) の紹介です。

OpenStreetMap は世界中で編集が行なわれているため、それぞれの地域で発生している様々なニュースが発信されています。それらのニュースをキャッチし、概要をまとめているのが WeeklyOSM です。

WeeklyOSM は収集された記事が、英語中心に現在では14の言語で発行されています。日本ではタイトルも「週刊OSM」として発行されており、現在では概ね毎週日曜日の夜に更新されてます。

ニュースはカテゴリごとに分類されていて、例えば、地物のタグ付けに関するもの、コミュニティに関するもの、OpenStreetMap のサーバーの運営などを行っている OpenStreetMap Foundation に関するもの、 OSM 関連のソフトウェアに関するもの、その他、地理空間情報に関す­るものや、OSM 関連イベントのカレンダーなどがあります。

ニュースは、WeeklyOSM チームが収集したものの他、ニュースをキャッチした人や、ニュースの発信者自身が投稿したものがあります。

WeeklyOSM の更新情報は [RSS](http://weeklyosm.eu/ja/feed) や [Twitter](https://twitter.com/weeklyOSM) で確認できます。継続的に OSM に関心を持っていただけるよう、編集を行っていますのでぜひ講読いただけたらと思います。

また、WeeklyOSM チームでは一緒に編集に参加していただける方も募集しています。編集記事はそのまま公開されるわけではなく、ローカル編集チームによる相互レビューを行なうため安心です。
編集は [OpenStreetMap Blog Collector(OSMBC)](https://github.com/TheFive/osmbc)上で行ない、WordPress で公開されます。

OSMBC の編集画面では [DeepL](https://www.deepl.com/ja/translator) Pro の API を利用できるため、DeepL Pro の翻訳結果を参考に編集できます。また、日本では OSS の翻訳に利用可能な [Textra](https://mt-auto-minhon-mlt.ucri.jgn-x.jp/) などもあるため、こちらの翻訳結果も利用可能です｡
ぜひ編集に参加し、一緒に OSM ニュースの発信を行ないましょう！
Laravel 「The page has expired due to inactivity.」の非常に稀な解決法

## 何が起きているか

最初に言っておきます。
**CSRF はフォームにちゃんと入っていて設定も出来ています。**
よくある入れ忘れ、設定漏れではありません。
結構、悩みました。

ログインをすると、必ず1回は以下が表示されます。

「The page has expired due to inactivity.
Please refresh and try again.」

もう一度ログインを実行すると、目当てのページへ遷移します。

----

## 結論

このケースは非常に稀な気がしますす…。
検証環境は Laravel 5.6 です。

・これが間違い　↓

```html
<form method="POST"
```

・こうしたらちゃんとログイン出来ました…。

```html
<form method="post"
```

自分も、ここだけ大文字にしてしまった理由が分からないのですが…
（他の画面では要素はすべて小文字で書いているのに…）
**そこ**ですか、と…。

こんなミスをする人も、まずいないのだろうなと思いますが…。

同じように CSRF の設定かと思って延々、悩まれている方が、
広い世界にはいるかも知れないと思い、ここに記録を残しておきます…。

----

## おねがい

詳しいことが分かる方がいらっしゃいましたら、解説をお願い致します…。

----
第9回

\![Ubuntu-20.04.1](<https://img.shields.io/badge/Ubuntu-20.04.1-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。


# やったこと

-   assert\_equal
-   rubular


# assert\_equal

まずassert\_equalとは「イコールかそうでないか」を確かめる関数。


## お題

1==1を判定する


## 一番シンプルな解法

```ruby
p 1==1
```

rubyの場合この1行だけでtrueが返ってくる。簡単だ。<br>これをメソッド化する

```ruby
def assert_equal(expected, result)
 return expected == result
end
p 1
p assert_equal(1,1)
p 2
p assert_equal(1,2)
```

すると

```ruby
> 1
> true
> 2
> false
```

と、ちゃんと判定されている


## 文字に色を付ける

本筋から外れますが、出力に色を付けてみることができるそうな

```ruby
require 'colorize'
def assert_equal(expected,result)
  if expected == result
    puts 'true'.magenta
  else
    puts 'false'.cyan
  end                                                                                          
end
p 1
p assert_equal(1,1)
p 2
p assert_equal(1,2)
```

を実行すると

```ruby
> 1
> true
> nil
> 2
> false
> nil
```

ってqiitaだと色は分からんがな・・・色は付いたけどnilが出力されてる。ということはどこかで何かが代入されていない。何事かと思ったらassert\_equalの先頭のpを除けたらnilは消えた。colorize周りで何かが起きたのか？


## richな出力

・引数で取ってきたexpected, resultの値を出力<br>・true、false時のメッセージを出す。<br>を実現する

```ruby
require 'colorize'
def assert_equal(expected,result)
  p ['expected',expected]
  p ['result',result]
  if expected == result
    puts 'succeeded in assert_equal'.magenta
  else
    puts 'failed in assert_equal'.cyan
  end
end
assert_equal(1,1)
assert_equal(1,2)
```

これは簡単で、入力を表示するように関数内に記述するのみ。メッセージは文言を変えるだけ。\#+begin\_src ruby> ["expected", 1]> ["result", 1]> succeeded in assert\_equal> ["expected", 1]> ["result", 2]> failed in assert\_equal\#end\_src


## 関数を複数作って個別で実行できるように

assert\_not\_equalという関数も作っておこう

```ruby
def assert_not_equal(expected,result)
  p ['expected',expected]
  p ['result',result]
  if expected == result
    puts 'failed in assert_not_equal'.magenta
  else
    puts 'succeeded in assert_not_equal'.cyan
  end
end
#end_src
ついでにassert_equalとassert_not_equalで重複してる部分があるんで別の関数に
#begin_src_ruby
def puts_vals(expected, result)
  p ['expected',expected]
  p ['result',result]
end
```

これを別のスクリプトから呼び出したい。つまり、別のスクリプトで

```ruby
assert_equal(3,2)
```

と書き込んで置いたら、3と2だけを比較してくれる、というようなのを作る<br>こういうときは

```ruby
if $PROGRAM_NAME == __FILE__
  assert_equal(1,1)
  assert_equal(1,2)
  assert_not_equal(1,2)
  assert_not_equal(1,3)
end
```

としておくと、このコード書かれているファイルのファイル名(FILE)が動かしてるファイル($PROGRAM\_NAME)と一致したら実行する、というもの。別ファイルからこのファイルを呼び出したときに、1と2なんかが比較されずに済む<br>別にファイルを作る

```ruby
require './assert_equal'

assert_equal(3, 2)
assert_not_equal('MO_data', 'MO_date')
```

として実行すると\#+begin\_src rubyexpected :: 3result :: 2failed in assert\_equal.expected :: MO\_dataresult :: MO\_datesucceeded in assert\_not\_equal.\#end\_srcとちゃんと判定されてる。


# 参考記事

[チャート式ruby-IV(assert\_equal)](<https://qiita.com/daddygongon/items/f6cea87314ee26e130ea>)



------
 - **source** ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter9.org
Python で外部プログラムを実行して結果の行をパースするメモ


外部プログラミング実行して結果取得には, 基本 `subprocess.run` を使います.

subprocessについてより深く（3系，更新版）
https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4

ありがとうございます.

Python には C 言語での scanf 相当が存在しません. regex で頑張るのも面倒です.
`{}` な記述で scanf 的なのができる `parse` が便利です.

https://pypi.org/project/parse/

`pip install parse` でぺろっと入ります.

外部プログラム実行と結果取得は以下のような感じです.

```python
import subprocess
import parse

def extract_result(lines):
    for line in lines:
        print(line.decode("utf-8"))
        result = parse.parse("ret = {:g}", line.decode("utf-8"))
        if result:
            return result[0]

    raise RuntimeError("`ret = ...` line not found.")


x = 3.13

ret = subprocess.run("python func.py {}".format(str(x)), shell=True, capture_output=True)


lines = ret.stdout.splitlines()

print(extract_result(lines))
```


```py
# func.py

import sys
import numpy as np

x = float(sys.argv[1])

print("bora")
print("ret = {}".format(np.sin(x)))
print("dora")
```

`shell=True` はお好みで(False の場合(デフォルトの場合), シェルの機能(e.g. `PATH` 変数)使えないので `/usr/bin/python` などと絶対パス指定が必要)
`capture_output` で stdout の結果を取得します.

subprocess の stdout の結果は byte 文字列になっているのでデコードが必要です.
通常は utf-8 かと思います.

Convert bytes to a string
https://stackoverflow.com/questions/606191/convert-bytes-to-a-string




## TODO

`subprocess.run` で encoding 指定してもよいかもしれません.

Python の subprocess
https://qiita.com/tanabe13f/items/8d5e4e5350d217dec8f5
明日ネイティブのチームで働くことになったら使える英語表現チートシート

こんにちは。[42Tokyo Advent Calendar 2020](https://adventar.org/calendars/5125)の17日目を担当するゆーぽんこと　@upon0426 です。
今日は、夏に主に英語を使うチームでインターンをしたときのノウハウをまとめようと思います。

なお、昨日の記事KOTOさんによる[ざっくりポケモン対戦史](http://koto-science.hatenablog.com/entry/pokemon)でした。ポケモンGOで対戦おもしろいって思ったけど極めきれなかった私は興味深い＆うらやましく拝読しました。ポケモン対戦ガチ勢の方も非ガチ勢の方もぜひ読んでみてください！

# なぜ英語で？

この夏に、[Build@Mercari](https://mercan.mercari.com/articles/19631/)というプログラムを通じてAndroidエンジニアとして２か月のインターンをしました。
私のチームは半数以上が英語ネイティブのメンバーで、使う言語も基本的に英語でした。
一方私は、初めてのインターン、初めてのAndroid、そして英語を使って仕事をするのも初めての経験でした。
特に帰国子女とかでもなく留学経験もなかったですし、一番最初に参加した会議は色々分からな過ぎて面食らったことを覚えています。
でも、せっかく得たインターンの機会、最大限活用したい、、！
慣れないことだらけの中、チームとのかかわり方を試行錯誤するなかで、これを覚えていればどうにかなるなと感じた心構えとか表現がいくつかあったのでまとめておこうと思います。


# 結論
一番大事なこと：コミュニケーションをとろうとする意志を持ち続ける、諦めない

これに尽きるんですが、これが難しい。
以下、実現させるためのTIPSという感じです、、！

# あらかじめ自分の意見は整理しておく

- 1on1⇒議題を用意しておく
- 会議⇒自分の伝えたいこと、自分が確認したいことをまとめておく

これで自分が話したい・聞きたいのに最低限必要な英単語、表現を事前に調べられるため、大抵の事態は防げます:raised_hands:

あと、意外と自分の考えって曖昧だったりするので、ここで英語の準備がてら整理しておくことで結果的に就業時間中全体の効率もよくなる気がしました。



# 聞き取れない/分からないとき、うやむやにしない

- 1on1⇒なるべくその場で聞き返す
- 会議中⇒聞けそうなタイミングで誰かに聞く

私は最初Androidとか、Githubが聞き取れてなくて、インターンやっていけるかとても不安になったのですが、恥をしのんで何回も聞き返しました:see_no_evil:（恥ずかしすぎてさすがにそこはすぐ覚えた）
意識しないと、そのまま流してしちゃいがちなんですが、こいつ実はなんも分かってないなってあとで発覚したときすごく気まずいと思うんですよね。。なのでその場で恥をかいたほうが結果的に得と考えることにしました！
自分の認識であっているか確認できれば、そのあとの自分の作業も自信を持ってできるので良かったと思います！

:star:できれば自分の仮説を立てて確認する形をとれると話が進みやすいのでお得

>You mean ~~~, right ?

:star:色々無理だったらとにかく分かっていないことを伝える

> Sorry, pardon? ~~~(ここで精一杯のオウム返し)?

:star:オンラインでの会議なら、チャット欄で質問するか、誰か聞きやすい人にDM

> We are talking about ~~~ , right ? 
Actually I'm not catching what we are talking about :sob:

:star:オフラインの会議なら隣の人にこっそり聞くか、最悪メモしておいてあとで確認

> What 〇〇 was saying in the meeting is about the %%, right ? 



# 発言することをあきらめない

正しい表現はあとで調べればいいし、とりあえず何か言った方が吉だと思います
普段の自分だったら発言するようなタイミングで、英語だとなんていえば分からずやり過ごすときが多々あったのですが、繰り返していたら日本語の集まりでも発言しない人間になってしまったのにある日気づきました:scream:
その時は見送ったとしてもせめて言いたかった内容をググるなどしていました。

:star:要点を絞って重要な単語を言えば意外と伝わる

> Let me confirm, A is B , right?

:star:本当に困ったら日本語でもいい

> すいません、これどうやればいいか分かりません。。

# 分からなかったら都度ググる

そしてググっておいたものをどこかにまとめておくようにしてました。
見返す余裕があるかはさておき、最近更新していない⇒分からないまま放置していないか自分？と見直す指標になってよかったです。
私は英語とその和訳をひたすら投稿するチャンネルを自分だけのSlackに作ってました

# 背景知識をなるべくとりにいく

そもそも今チームで、または会社で、どんなことが起こっているか知っているだけで話の予想がつきやすくなりました:clap:

例えば私のチームは毎朝みんなの状況を共有する時間があるのですが、最初はみんなが何を言っているのか全然分かりませんでした。

それをメンターに相談したところ、ほかのメンバーがどんなことをしているのか、各メンバーから説明してもらう機会を設けてもらい、そのあとの次の日からは驚くほど話が分かるようになりました。

ドキュメントを探すのもありだと思います。
英語力の向上を待つよりてっとり早くていいなと思ってます！

### 余談：英語でインターンのススメ
インターンの間は基本的に英語しか使わなかったので、たまに日本語で会話するとき、日本語って本当にハイコンテクストだなって思いました（私が日本語ネイティブだからかもしれないけど）
右も左も分からないインターン生としては、下手に行間を読もうとして勘違いするよりも、ばんばん質問するほうがいいと思うのですが、英語だと言葉の壁も相まって質問しやすかった気がします！（インターン先の雰囲気がよかったのもあるかも。。）
なのでみなさんその機会があればぜひ積極的に挑戦してみてください、、！

# 最後に

お気づきとおもうのですが、例文では特に高度な表現は使っていません！不自然かもしれないですけど、とっさに出せることが大事だと思うのでひとまずこれでいいと思ってます。
これらを意識した結果、英語力は一か月くらいで飛躍的に伸びて、いろんなことを聞き取れるようになりました:muscle:インターン中も英語に関しては謎の手ごたえがありました。
１月からもまた同じチームでインターンさせてもらうのですが、コミュニケーション面はこれらを胸に、よりたくさんのことを吸収しようと思います！そして、Androidでも飛躍的な成長ができるよう、頑張ろうと思います！何かそっち方面でアドバイスがあれば教えてください！

# 明日の記事
明日の記事はふじさんのLOLについての記事のようです！好きなひとは好きですよね、、！私もやってみたい。。お楽しみに！
プログラミング未経験者がXcodeを触ってみた

#はじめに
この記事は、非エンジニア職の私がプログラミングに挑戦した感想です。
何から始めればいいのか？がわからない人の何かしらのプラスになればと書かせていただきます。

#Xcodeを選んだ理由
・アウトプットがスマホアプリなのでイメージしやすい。
・入門書も多く一人で学習をするのに適していると思った。
・今までスマホアプリに関わる仕事をしてきていた。
やはり、未知の領域の学習をするにあたり完全にゼロから始めるのではなく
興味がある、アウトプットのイメージができる領域ではないとゴールすらわからなくなると思った為

#用意したもの
・MacBook Pro
・iPhone 
・参考書「iPhoneアプリ開発 集中講座」
始める前は、入門編をやるのにPCのスペックなどを気にしていたが
スペックを気にしなくてはいけなくなるまでは当面先だと気付きました、、、。

#Xcodeから始めるメリット
**・ビジュアルから作ることができるからゴールがイメージしやすい。**
**・アプリのプレビューが簡単にできる**
**・ググればなんとかなる**

作りたいもの（今回は本の中のサンプルアプリ）をイメージしながら
今どうなっているかを確認をしやすく、わからなくなっても
すぐ解決をしやすいので、挫折をすることなく１冊を勉強をすることができました。

#これから始める人へ
**作業を始める時にやったほうがいいこと**
・プログラミングでできることをイメージ出来るようにする。
当たり前のことですが、どのような事が実現できるかをインプットしておくと学習がしやすいです。
学習中息抜きで、Swift Playgroundsというアプリを利用しながらできることを遊びながら
インプットしてました。
Swift Playgrounds：https://www.apple.com/jp/swift/playgrounds/

**Xcodeの最新バージョンと参考書に記載のあるバージョンのズレがないか確認**
細かなアップデートを繰り返すので、参考書の中で紹介されている内容とXcodeの表記のズレが
発生します。もちろん、参考書に関しては、最新バージョンとの差が少ないものを選ぶと良いです。

**参考書を読みながら進めるよりも、一度各章ごとでも読み切ってから手を動かす**
参考書と最新バージョンのズレもあるが、何を何のためにやるべきかを理解する事で何が
大事かがわかるようになります。作業を行う上で注意すべき所がわかるので失敗を
減らすことができました。

#最後に
参考書の次は、いろんなアプリを真似して作ってみることが良いかなと思っています。
たった一部を学習して得た知識でオリジナルを作るよりも他のアプリがどのような
仕組みで動いているのかを真似する方が得られるインプットが増えるかなと思ってます。
また書く機会があればその時は、○○を真似して作ってみた系をかけるといいなと思います。
放射線被ばく線量が記録されたRDSRを閲覧できる簡易アプリケーション（CT編）

# RDSR（Radiation Dose Structured Report）

放射線を利用する医療機器は、例えばCT装置であればCTDIvolなど、標準化された規格で、被ばく線量を記録しています。
昨今では、2020年に医療法施行規則の一部改正が行われて、診療用放射線に係る安全管理体制の項目が変更されました。これにより、医療施設において、被ばく線量管理体制の構築が進められています。
これまで集められなかった大規模な医療被ばくデータを収集し、人体への影響を調べるためのコホート研究などの実現に向けて、確実に前進しているようです。
画像検査に関する医療被ばくの記録は主に、DICOMデータとして管理されます。
具体的には、DICOMデータの規格のうち、RDSRというオブジェクトとして管理されます。
RDSRとは、放射線被ばく構造化レポートです。

# CTを対象としたRDSRビューワ

RDSRは様々な放射線医療機器で作成されますが、今回はCT装置を対象に、RDSRを取り扱ってみたいと思います。
RDSRは、たくさんのメタデータで情報オブジェクトがまとめられているので、被ばく線量を調べたいときに、直接、DICOMタグを調べるなどをしているとかなり大変です。
なので、簡易的なツールを開発してみました。
ここで紹介するツールは、RDSRに記録されている情報を表示する、CTDIvol・DLPをcsvで出力する、CT検査ごとにグラフに表示する、機能を持っています。

![KMII2020_RDSRViewer.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/4b186e3b-aa81-25b0-bfb3-93f96a0e775b.png)


# ソース（java）

即席コードのため、細かなところはお許しください。
Answer packageが真です。
教育・研究用に自由にお使いください。
共同研究などご希望の方は、筆者まで直接ご連絡ください。
Eclipse + Java JDK 1.8 above
https://www.dropbox.com/sh/5clpuwvmo0uxnze/AAA7XcUbWh1k6lSfwIuHa-5oa?dl=0

# 雑感

医療被ばく線量の管理で得られるメリットは、DNAレベルの損傷の最小化だろう。長期にわたる被曝は、たとえ低線量であっても、がんのリスクを増加させるリスクを高めるという疫学研究の仮説に基づく考え方だ。若い人ほど放射線の感受性が高い傾向があることも理由の一つになる。

それはそうなんだ。ALALAの原則を大切にしようと啓蒙することはいいことだと思う。しかし、まだ筆者の中では、この分野のさらなる研究に対する真のメリットがなにかということについて靄がかかっている。

その理由は、（低線量の）医療被曝と、この医療被曝によるDNA損傷に起因した発がんリスク増加とに因果関係があるのかを明らかにできるのかが疑問だからだ。

相関関係があるのは事実だろう。致死線量という概念があるのだから、被曝が多すぎることは良くないことであるという論拠のアプローチは正しいのだが、懸念はそこではない。
例えば、アイスクリームの販売量が増えると、溺死者が増加するという事実があるとしよう。実際に、相関関係にあるということになる。しかしそこに因果関係があるかというと、実は無い。どういうことかというと、アイスクリームが売れ始めるということは、季節が暑くなってきているということであり、暑くなっているということは、川遊びや海水浴に出かける人が増えるということだからだ。なので、「アイスクリームがよく売れたから、溺死者が増えた」とはならない。
医療被曝に話を戻すと、「医療被曝によって発がんリスクが高まる可能性がある」というのは、理論的に相関は主張できるのだが、因果関係はあるといえるのだろうか。実際にがんを罹患した人は、必然的にCTなどの検査数は増える。疫学研究で、このあたりのバイアスが統計学的に正しく反映されているのだろうか。「たくさんCT検査を受けた人が最後はがんで天命を全うされました。」というデータが多く含まれていたら、その解析結果の信頼性は高いとは言えないだろう。

筆者が抱える頭の中の靄は、この先、この分野の研究が「医療被曝は飛行機に乗っているときの自然放射線の被曝みたいなものです」で終わるかもしれないという懸念を持っているからだ（そうこうしているうちに低線量化もさらに進むため）。
筆者が期待するのは、まさに因果関係の説明だ。因果関係が説明できるなら、個別化医療に落とし込めるだろうし、「この方の血液検査結果から分析しましたら、放射線感受性が高い方であることがわかりました。リスクグループ分類でもHighリクス群に属す確率が高いので、CTではなくMRIファーストな方です」みたいに、医療従事者間でコミュニケーションがとれる時代が来るのかもしれない。そうなると、医療経済が動くので、研究への評価も上がるのだろう。

# Note

本アプリケーションは医用画像情報実習の教材として本記事の作者によって開発されました。

# References

- JIRA, RDSR勉強会資料:http://www.jira-net.or.jp/dicom/dicom_data_01.html
- DICOM Radiation Dose Structured Report を利用したCT検査における放射線線量管理ソフトの開発(https://www.jstage.jst.go.jp/article/mii/33/2/33_43/_pdf/-char/ja?fbclid=IwAR2i1vu94FP3h01Xg7Pe1jKE68pvVrVJUer2ZbNtLkE9m4c0H6Tq-aqkAwM)
- CT線量管理における線量値算出アプリケーションの開発：プロトコルがDiagnostic Reference Level(DRL)と異なる場合への対応（https://www.jstage.jst.go.jp/article/jjrt/80/9/80_2024-1462/_article/-char/ja）

# 改定履歴
- 2020 初版
- 20241002 修正・追記