OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルレスマルウェア とは

## 勉強前イメージ

ファイルなしでのマルウェア？

## 調査

### ファイルレスマルウェア とは

マルウェアの一種で、悪意のあるファイルなどを使うのではなく
OSに元々組み込まれているソフトウェアを使用してメモリに常駐することで攻撃を行うものになります。
なので、ソフトウェアをインストールせずとも実行ファイルがなくても攻撃を仕掛けることが出来ます。
そのため再起動すると消え、セキュリティソフトでの検知が難しいという一面があります。

### ファイルレスマルウェアの仕組み

ファイルレスマルウェアはOSに組み込まれているソフトウェアを使用すると↑で記載しました。
Windowsでは特にPowerShellやWMIを使用して活動を行います。
それぞれの説明は以下になります。

- Powershell
	- windowsのCLIの一つ
	- これでほとんどの操作が可能
	- 標準搭載されているため検知が難しい
- WMI(Windows Management Instrumentation)
	- windowsの管理の根幹の技術
	- PC上のすべての情報に操作可能

新しいものをインストールせずに、OSにある便利な機能を利用して攻撃を行います。

### ファイルレスマルウェアの対策

ファイルレスマルウェアの対策としてPowerShellなど使用しないという手がありますが
基本的には必須なので難しいです。
なので、ファイルレスマルウェアに対応しているセキュリティソフトを使用するのが効果的です。

また、PCに入り込むのはスパムメールの添付ファイルが多く
知らないファイルは開かない など基本的なセキュリティの意識を高める必要があります。

## 勉強後イメージ

元々の機能ですらも攻撃側に回ってしまうとかあるの・・・・
あとメモリ上にいると検知は難しそう

## 参考

- [ファイルレスマルウェア（Fileless malware）](https://www.nec-solutioninnovators.co.jp/ss/insider/security-words/16.html#:~:text=%E3%81%84%E3%82%8F%E3%82%86%E3%82%8B%E3%83%9E%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AF%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AB,%E3%83%AC%E3%82%B9%E6%94%BB%E6%92%83%E3%80%8D%E3%81%AA%E3%81%A9%E3%81%A8%E5%91%BC%E3%81%B6%E3%80%82)
- [ファイルレスマルウェアとは？〜ファイルレス攻撃(非マルウェア型攻撃)を理解する〜](https://www.cybereason.co.jp/blog/malware/2094/)
- [ファイルレスマルウェアとは](https://www.amiya.co.jp/column/fileless_20210129.html)
Windows WSL2にROSをインストールする

本ページではWindows subsystem linux (WSL)上でROSを導入する方法を紹介します．ここでは以下の環境を想定して説明します．使用するROSのディストリビューションに合わせてUbuntuのバージョンを変更してください．

- Windows 10
- WSL2: Ubuntu 18.04.5 LTS
- ROS Melodic

**2022年6月11日追記**
WSL2のUbuntu 20.04.4 LTS，ROS Noeticでも動作することを確認．

# 概要

- [WSL2上にUbuntuをインストール](#wsl2上にubuntuをインストール)
- [X11 forwardingの導入](#x11-forwardingの導入)
    - 【Windows側】 MobaXtermのインストール
    - 【Ubuntu側】DISPLAY変数の設定
- [ROSのインストール](#rosのインストール)
- [ROSの実行](#rosの実行)

# WSL2上にUbuntuをインストール
WSL2を有効化しその上で動かすUbuntuをインストールします．WSL2の有効化は以下の記事で詳しく紹介されています．

https://qiita.com/whim0321/items/ed76b490daaec152dc69

ここでは，ROS Melodicを使うためMicrosoft StoreからUbuntu 18.04.5 LTSを検索してインストールします．Noeticなど別のディストリビューションを利用する場合，Ubuntuのバージョンも変更してください．

WSL上にUbuntu 18.04のインストールが完了したらUbuntuのターミナルを起動します．ユーザー名・パスワードを設定したのち，以下を実行しておきましょう．
```
$ sudo apt-get update
$ sudo apt-get upgrade
```

# X11 forwardingの導入
RvizなどUbuntuの画面をWindows上で表示するための準備をします．ここではX11 forwardingを利用するため，Windows側でのMobaXtermの導入とUbuntu側でのDISPLAY変数の設定を紹介します．

## 【Windows側】 MobaXtermのインストール
WindowsのX server機能はVcXsrvやXmingが有名ですが，ここではMobaXtermを紹介します．X server機能に加えてWSLにインストールしたLinuxのターミナルを開くことができたりなかなか便利です．

https://mobaxterm.mobatek.net/

上のページからインストールしてMobaXtermを起動すると，画面左側のタブ[Sessions]からターミナルを選べるのでWSLのUbuntu 18.04を開きます．

## 【Ubuntu側】DISPLAY変数の設定
MobaXtermで立ち上げたUbuntu 18.04で`~/.bashrc`を開き以下を追記します．
```
export DISPLAY=`hostname`.mshome.net:0.0
export LIBGL_ALWAYS_INDIRECT=0
```
追記したら，`source ~/.bashrc`で再読み込みします．

:::note
WSL2ではmshome.netをドメインにしたホストが割り振られており，`` `hostname`.mshome.net ``でホスト名を設定可能です．
:::

# ROSのインストール
ROSのインストールは通常のUbuntuと同じように行います．今回はUbuntu 18.04のためROS Melodicをインストールします．インストールはROS Wikiをご参照ください．

http://wiki.ros.org/ROS/Installation

http://wiki.ros.org/melodic/Installation/Ubuntu

# ROSの実行
ROSが起動し，Ubuntuの画面がWindows上で見えることを確認します．まずはMobaXtermを開いて，Ubuntuのターミナル上で以下を実行します．
```
$ roscore
```
続いて，別のターミナルから以下を実行します．
```
$ rosrun turtlesim turtlesim_node
```
これで下のようにturtlesimの画面が確認できれば無事完了です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669152/4f8a5bf0-cb28-0140-ffa1-468206d83bee.png)
crystal の AtCoder における Set の使用（健忘録）

# はじめに
https://qiita.com/u2dayo/items/906f4811aa4470b4ffab

@u2dayo さんのコードを写経していましたところ`Set`を使用されていました。
普段は`Hash`で代用していますが、`Set`の使用方法の健忘録と`Crystallizer2`の更新を行いました。

https://github.com/superrino130/crystal-on-paiza.cloud
# C問題『Poem Online Judge』
https://atcoder.jp/contests/abc251/tasks/abc251_c
# Ruby版
```rb
require "set"

n = gets.to_i
seen = Set.new
max_t = -1
ans = 0
(1...n+1).each do |i|
  s, t = gets.split
  next if seen.include?(s)
  seen << s
  t = t.to_i
  if max_t < t
    max_t = t
    ans = i
  end
end
puts ans
```
`Ruby`ですと`require "set"`しないといけないです。
# crystal版
```cr
require "set"

n = read_line.to_i
seen = Set(String).new
max_t = -1
ans = 0
(1...n+1).each do |i|      
  s, t = read_line.split   
  next if seen.includes?(s)
  seen << s
  t = t.to_i
  if max_t < t
    max_t = t
    ans = i
  end
end
puts ans
```
`crystal`では`require "set"`は本来不要ですが、あっても動作するようなので、とりあえずそのままとしています。

```diff_crystal
- seen = Set(Int32).new
+ seen = Set(String).new
```
この部分は`Int32`に決め打ちをしていますので、問題に合わせ修正する必要があります。

https://crystal-lang.org/api/0.33.0/Set.html

||Ruby|crystal|
|:--:|--:|--:|
|実行時間(ms)|183|51|
# まとめ
`crystal`の`Set`に詳しくなりました。
人生初めのスプリング講義（理論要約） 

スプリングブート概念整理

ioc制御の逆転
インバージョン·オブ·コントロール
●主導権奪取、主導権はスプリング
クラス-設計図
オブジェクト-実体化可能なもの（抽象的なものX）
インスタンス-実体化したもの
リファレンスアドレスはそれぞれのメソッドが管理
DI=依存性注入
スキャンすると個体が一つ出て、それをまたそれを持ってきて使用。
一旦メモリにのせれば、すべてのクラスのメソッドを使用可能
IOC、DI上手ならスプリングが上手
トムキャットのフィルターはフィルター
スプリングコンテナのフィルターはインターセプター(aop)

アノテーション(注釈+ヒント)-コンパイラ無視しない。
//文~(注釈)-コンパイラ無視


スプリング-アノテーションオブジェクト生成
@componentクラスメモリローディング
@Autowiredロードされたオブジェクト該当変数を挿入する
分析=リフレクション
メソッド、フィールド、アノテーションチェッキングと命令設定が可能

メッセージコンバータ
Javaオブジェクト-json-パイソンオブジェクト
Javaオブジェクトjsonでコンバーティングしてくれるのがメッセージコンバータ
要請する時も回答を受ける時もしてくれる
リクエスト=リクエスト
jsonでJavaプログラムに投げる時メッセージコンバータが作動して自動的に変える。
英語一文字=8ビット=256種類の文字転送
8ビット=1バイト=通信単位
utp-83バイト通信=現在
inputstream-バイトで~
配列=複数文字
buffedreader=可変長の文字を受け取ることができる。
request.getreader()
printwriter-もっとたくさん使う
@responsebody - buffered writer
@requestbody - buffered reader

jpa
永続性jpaapi
不揮発性で保存できるように
api=アプリケーションプログラミングインタフェース
プロトコル
お互いに同じ権限
皆同意ができるように

インターフェイス
共有できる権限がある。

jpa
ジャワ
永続性
永久的に保存するためのインターフェース

orm
object relational mapping
私の召使い,私の鐘
class=設計図2d
モデリング=実際に建てて3dに
抽象的な概念を現実世界にすること

dmlデリートアップデートインサート
もたらす行為select
class team s
int id;
string name;
string year;
データベースにあるデータをジャワにモデリング

dbを作ってjavaを作るんですけど、これは元々順番。

javaを作り、javeを通じてdb自動生成が可能
このとき、jpaのインターフェイスを守れば可能
これがorm

orm
Java-dbセッションをオープンして接続すると
コネクションを持つ
クエリー伝送が可能
応答してジャバ
DBから送ったデータをジャバのスタイルで変更！

JPAがあれば一連の作業を関数一つで解決してくれる。
crud!インサートセレクト、アップデートデリート

永続性:データ-永久的に保存
ジャワではDBに保管
コンテキスト
テキストファイル内の文字列の重複を無視したい（コマンドライン操作から）

コマンドライン操作からテキストファイル内の文字列の重複を無視したい場合は、`sort`、`uniq`を組み合わせればOK

以下のようなテキストファイルがある場合

```sh
$ cat test.txt 
hoge
fuga
hoge
fuga
piyo
hoge
fuga
piyo
hoge
fuga
piyo
```

以下のように`sort`、`uniq`を組み合わせて実行すればOK

```
$ sort test.txt | uniq
fuga
hoge
piyo
```

# 参考
https://uxmilk.jp/53546
findの結果にPermission deniedを表示しないようにしたい

findの結果にPermission deniedを表示しないようにしたい

通常、例えばルートディレクトリ(/)などで`find`すると権限の関係で`Permission denied`が表示される事がある

```shell
$ find . -name test.sh
find: ./usr/sbin/authserver: Permission denied
find: ./.Spotlight-V100: Permission denied
find: ./.PKInstallSandboxManager-SystemSoftware: Permission denied
find: ./Library/Application Support/Apple/ParentalControls/Users: Permission denied
find: ./Library/Application Support/Apple/AssetCache/Data: Permission denied
find: ./Library/Application Support/ApplePushService: Permission denied
...
./Users/seigo/mkfile/test.sh
```

`Permission denied`を無視したい場合、`find . -name test.sh 2> /dev/null`のようにすればOK

```shell
$ find . -name test.sh 2> /dev/null 
./Users/seigo/mkfile/test.sh
```

（今回の場合は１つの例であり、検索対象をもともと絞っておくなどの別解があることは留意しておきたい）
GAN：敵対的生成ネットワーク　と　機械学習プロジェクト

# GAN：敵対的生成ネットワークとは何か　「教師なし学習」による画像生成

https://www.imagazine.co.jp/gan%EF%BC%9A%E6%95%B5%E5%AF%BE%E7%9A%84%E7%94%9F%E6%88%90%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E3%80%80%EF%BD%9E%E3%80%8C%E6%95%99%E5%B8%AB/

「敵対的生成ネットワーク」（Genera tive Adversarial Networks。以下、GAN）

GANは生成モデルの一種であり、データから特徴を学習することで、
実在しないデータを生成したり、存在するデータの特徴に沿って変換できる

とされてます

GANの特性を利用した応用研究として、以下が挙げられます


GANによる超解像を利用して、物体検出における解像度の低い検知対象の検知率を向上させる

https://arxiv.org/abs/1706.05274


低解像度X線やCT画像のノイズを除去する

https://arxiv.org/abs/1706.05274



オープン認識精度の向上のためにGANを利用する手法の提案

https://openaccess.thecvf.com/content/ICCV2021/html/Kong_OpenGAN_Open-Set_Recognition_via_Open_Data_Generation_ICCV_2021_paper.html



そして、

# データ数が少ない場合に、GANで生成した画像を学習データとして加え、CNNの分類精度を改善する

https://arxiv.org/pdf/1803.01229.pdf

こちらの論文は今後日本での医療応用の可能性を増やすと思われます

本手法は、182の肝臓病変（53の嚢胞、64の転移、65の血管腫）のコンピュータ断層撮影（CT）画像からなる
限られたデータセットに対して実証されたものであるみたいです
まず、GANアーキテクチャーを利用することで高品質な肝臓病変のROIを合成
その後　CNNを用いた新しい肝病変分類法を提案
最後にCNNの学習を行い，その性能を比較されてます

## ROIとは

ROI（Region of Interest）とは、画像データのうち、操作の対象として選ぶ領域のことです。
「対象領域」「注目領域」「関心領域」などともいいます

例えば、画像の一部分にだけ処理を施す場合にROIという言葉を使います

## CNNとは

CNNとは、「Convolutional Neural Network」を略した言葉であり、日本語では「畳み込みニューラルネットワーク」とも呼ばれています
いくつもの深い層を持ったニューラルネットワークであり、主に画像認識の分野において価値を生んでいるネットワークです

https://aismiley.co.jp/ai_news/cnn/


臨床工学技士としての知見を活かして
画像解析ソフトを作りたい

となった場合は
業務で得られた画像で
画像データをGANで生成して
予想してみても面白いと思われます

# GANのソースコード

公式ドキュメントを参考にしていただくのがよいですが

https://pytorch.org/

日本語の記事などを参考にする場合は
keras を利用する場合は以下で

https://qiita.com/triwave33/items/1890ccc71fab6cbca87e

pytorch　を利用する場合はこちらが参考になります

https://rightcode.co.jp/blog/information-technology/gan-authentic-elaborate-image-generation-models


# 機械学習が得意なこと
大量のデータを駆使した予測が機械学習が得意な部分です

仮にデータをためる仕組みが医療現場にあった場合
機械学習を活用するチャンスかもしれません

例えば院内ですでにエコーデータがデータベースに保存されている場合
透析患者様のシャントエコーの画像データをGANで増やしその後
適正なシャントPTA時期を予測するなど
データが集まる仕組みがあれば様々な方法が考えられます

# 機械学習プロジェクトの流れ
それではさっそくGANを使ってみよう！
となるかもしれませんが　臨床現場で利用する場合
一般的に流れがあるみたいです

1.ビジネスの課題を機械学習の課題に定式化する
2.類似の課題を、論文を中心にサーベイする
3.機械学習しないでいい方法を考える
4.システム設計を考える
5.特徴量、教師データとログ設計をする
6.実データの収集と前処理をする
7.探索的データ分析とアルゴリズムを選定する
8.学習、パラメーターチューニングする
9.システムに組み込む
10.予測精度、ビジネス指標をモニタリングする
AppleScriptを使って写真Appで位置情報を設定する

:::note warn

いつもはSwiftの記事ばかり書いていますが、これはAppleScript+写真Appの記事です。

:::


# 写真Appは便利

昔はiPhoto[^iPhoto-wikipedia]を使っていたけど、いつのまにか[写真App](https://support.apple.com/ja-jp/photos)を使うようになっていた。なんせ、iCloudで写真を簡単に同期できちゃいますからね[^iCloud-Photos]。

[^iPhoto-wikipedia]: https://ja.wikipedia.org/wiki/IPhoto

[^iCloud-Photos]: https://support.apple.com/ja-jp/HT204264


# 位置情報の設定における苛立ち

今でこそiOS[^iOS-EditableLocation]の「写真」で位置情報を編集できるようになったものの、つい最近までmacOSの写真Appでしか位置情報を編集できなかったのです。インターフェースも分かりにくくて、「情報」ウィンドウに地名や緯度/経度を入力することで設定できます。

[^iOS-EditableLocation]: iOS 14以降だったか15以降だったか…

しかも、いざそこで設定しようとした時に…

![photo-info_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116905/c14fd054-411f-9f09-67ed-7c5dc4bef0f6.png)


「__*位置情報を検索中…*__」

この文字が表示されている間は、位置情報を設定できないという…。それも結構待たされる。
しかし、この文字が表示されている間でも位置情報(緯度/経度)を設定できてしまう裏技があるのです。


# AppleScriptを使って写真Appで位置情報を設定する

写真AppはApple純正のアプリケーションなだけあって、AppleScriptに対応しています。
まず、選択されている写真のリストを取得します：

```AppleScript
set selectedImages to (get selection)
```

緯度経度をカンマ区切りの文字で入力したら、それをそれぞれの写真に設定します：

```AppleScript
set theLocList to every text item of newLocationString
repeat with theImage in selectedImages
	set the location of theImage to theLocList
end repeat
```

全体のスクリプトは次のようになります：
([Gistにあるよ](https://gist.github.com/YOCKOW/2025b52a2fce3f01e92f48be2c44fa5a))

```AppleScript
tell application "Photos"
	activate
	try
		set selectedImages to (get selection)
		set numberOfImages to (count of selectedImages)
		set imagesDescription to ""
		if numberOfImages ≤ 0 then
			error "Please select an image."
		else if numberOfImages = 1 then
			set imageTitle to the name of first item of selectedImages
			if (not (exists (imageTitle))) or (imageTitle is "") then
				set imageTitle to the filename of first item of selectedImages
			end if
			set imagesDescription to "\"" & (imageTitle as string) & "\""
		else
			set imagesDescription to numberOfImages & " images"
		end if
		
		set dialogMessage to ("New location for " & imagesDescription & ":")
		set response to display dialog dialogMessage default answer "" buttons {"Cancel", "OK"} default button "OK" with icon note
		set newLocationString to text returned of response
		if ((button returned of response) = "OK") and (newLocationString is not "") then
			set AppleScript's text item delimiters to ","
			set latitudeLongitude to every text item of newLocationString
			if (count of latitudeLongitude) is not 2 then
				error "Invalid Location."
			end if
			repeat with theImage in selectedImages
				set the location of theImage to latitudeLongitude
			end repeat
			display alert "New location set to: " & newLocationString
		end if
	on error errorMsg number errorNumber
		display alert errorMsg as critical
	end try
end tell
```

ね？簡単でしょ。

メニューバーにスクリプトを表示させるようにすれば、とっても便利： https://support.apple.com/ja-jp/guide/script-editor/scpedt27975/mac
Markdownチートシートのチートシート

# マークダウンを覚えきれない
ということ画面1ページに収まるレベルでの（自分向けの）アンチョコ（死語)。
|要素|構文| 
|:---|:---|
|見出し|# H1 <br> ## H2<br>### H3|
|太字|\*\*太字にしたい文字\*\*|
|引用|> 引用|
|番号付きリスト|1. 最初のリスト<br>2. ふたつめのリスト|
|箇条書きリスト|- 最初のリスト<br>- ふたつめのリスト|
|コード|\`コード\`|
|区切り線|\-\-\-|
|リンク|\[title\](ht<span>tps://www.example.com)
|画像|\!<span>\[代替テキスト](image.jpg)|

これ以上複雑なMarkdown記述には、Qiita公式の[Markdown記法チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)参照で。
Viteで環境構築


## Viteとは

詳しくは公式の[Overview](https://vitejs.dev/guide/#overview)に任せるとしますが、Vite を使えば素早く立ち上がる開発サーバーを使って、より速くより無駄のない開発体験を享受できます。


## ビルドツール

Vite とはビルドツールです。
yarn build や yarn dev コマンドを入力すると build が行われてビルド結果を build(あるいは dist 等)のディレクトリに吐き出されたり、開発サーバーが立ち上がりブラウザに表示されます。  
create-react-app でプロジェクトを作った際にはデフォルトでは react-scripts が使われており、手動でプロジェクトを作った際には webpack 等を導入します。
Vite を使うと build 処理が速く、すぐに開発サーバーが立ち上がります。


## Viteの環境構築

React の create-react-app, Next.js の create-next-app 同様にテンプレートを生成してくれるのでコマンド 1 つ(+ 質問に答える)だけで開発環境を構築できます。

公式の[Getting Started](https://vitejs.dev/guide/#getting-started)を参考に以下の手順で開発環境を構築できます。

``` 
$ yarn create vite

# Vite + React + Typescript 環境のプロジェクトを作りたい場合
$ yarn create vite my-app --template react-ts
```

上記 2 つの場合コマンドライン上に TypeScript を使うか等の質問が表示されるので答えていけばプロジェクトが生成されます。

プロジェクトの生成が終わったらディレクトリを移動して以下のコマンドで開発サーバーが立ち上がります。

```
yarn install
yarn run dev
```
Reactチュートリアルで使用した二重ループ

## Reactチュートリアルで作るマルバツゲームの盤面を二重ループで作成する

自力だと良い方法が思い浮かばず色々調べた結果、いい方法を見つけたのでメモ

```jsx:index.js
class Board extends React.Component {
    renderSquare(i) {
        return (
            <Square 
                value={this.props.squares[i]} 
                onClick={() => this.props.handleClick(i)}
            />
        );
    }

    createSquares() {
        let rows = [];
        for(let i = 0; i < 3; i++){
            let squares = [];
            for(let j = 0; j < 3; j++){
                squares.push(this.renderSquare(i*3+j));
            }
            rows.push(<div classname="board-row">{squares}</div>);
        }
        return rows;
    }

    render(){
        return(
            <div>
                {this.createSquares()}
            </div>
        );
    }
}

```

[こちら](https://stackoverflow.com/questions/41667346/react-create-nested-components-with-loops)を参考にしました。

ポイントは以下の2つ
* DOMは配列にプッシュする
* 2つの配列を使用する


一つの配列のみで済ませようとすると、エラーが発生しました。
これは配列の要素を一つずつレンダリングするので、要素一つで意味がわかるようにしないといけない（閉じタグが必要）ということだと思います。


```jsx
    createSquares() {
        let squares = [];
        for(let i = 0; i < 3; i++){
            squares.push(<div classname="board-row">);
            for(let j = 0; j < 3; j++){
                squares.push(this.renderSquare(i*3+j));
            }
            square.push(</div>);
        }
        return squares;
    }
```

以上です
Unity Apple Silicon版でモジュールがインストールできない

メモ

M1でAppleSilicon版をせっかくだから使いたいと思い、ダウンロードアーカイブから指定のバージョンを入れたのち、モジュールを入れるのにつまづいた。

https://unity3d.com/jp/get-unity/download/archive

結論手順
1. Silicon版エディタをインストール
    - その際パスはApplication/Unity/直下に入る
2. 適当なプロジェクトを作り、Build Settingsから該当のプラットフォームを選択し、ダウンロードする、みたいなボタンからインストーラをDL
3. インストーラを起動し(右クリックから開く)、所定の手順でインストール
    - この際、エディタ本体のパスがApplication/Unity/直下であることが必要。そうじゃないと、エラーにより完了できませんでした、となる。
4. PlaybackEnginesがApplication/Unity/にできるので、それとエディタを適当な場所(Application/Unity/Hub/2021.hogeなど)に移動し、UnityHubを使っている場合はパスを通す。PlaybackEnginesとEditorが同じディレクトリにあれば多分動きます。
WSL2のUbuntuにffmpegをインストールする

wsl2上のUbuntuにffmpegをインストールしようとしたら入らなかった
```bash
$ sudo apt info ffmpeg
N: Unable to locate package ffmpeg
N: Unable to locate package ffmpeg
E: No packages found
```

# 環境
Windows10
WSL2
Ubuntu20.04

# 対応
以下の手順で入った

```bash
sudo add-apt-repository ppa:mc3man/trusty-media
sudo add-apt-repository --remove ppa:mc3man/trusty-media
sudo apt update && upgrade
sudo apt install ffmpeg
```
積み上げ♯2

＊＝　require treeは　コメントアウトじゃない
↑ディレクトリ

Destroyアクションについて
find(params[:id])findメソッドによってカラムのレコードを探し出す

●次の学習までの疑問点
bootstrapってどう使うんだろうか？
FineReportによく使われるJavascript

# ハイパーリンク
## ポップアップで画面を表示する方法
### 一般
```
//テンプレートパス（必要に応じて設定します）
var url = encodeURI(encodeURI("/webroot/decision/view/report?viewlet=GettingStarted.cpt"));
//Iframeウィンドウ定義
var $iframe = $("<iframe id='inp' name='inp' width='100%' height='100%' scrolling='no' frameborder='0'>");
//Iframeのsrc属性設定
$iframe.attr("src", url);
//Iframeウィンドウ属性
var o = {
    title: "タイトル",    //タイトル
    width: 680,         //幅さ
    height: 640,        //高さ
    //closable:true,    //閉じるボタン表示・非表示
    //confirm:true,     //確認ボタン表示・非表示
    //draggable:true   //ドラグ可能表示・非表示
};
//ウィンドウをポップアップする
FR.showDialog(o.title, o.width, o.height, $iframe, o);
```

作成中...
【Swagger】バージョンの違いから見るOpenAPIの最小構成

Swaggerについて書かれているサイトやブログは多く見られるが、OpenAPIのバージョンの違いが理解の障害になると感じたので、備忘録として記事に起こした。

## 表：OpenAPI2.0とOpenAPI3.0の構造の違いを簡略に
| OpenAPI 2.0 | OpenAPI 3.0 | 必須 | 役割 |
| - | - | - | - |
| openapi | openapi | ◯ | OpenAPIのセマンティックのバージョン |
| info | info | ◯ | メタデータ |
| security | security |  | API全体で使用できるセキュリティメカニズの宣言(認証と承認などの) |
| host,basePath,schemes | hosts　　　　　　　　　　　　　 |  | APIを提供するホスト |
| paths,produces,consumes | paths | ◯ | APIで使用可能なパスと操作 |
| tags | tags |  | パスごとのタグによるグループ化 |
| externalDocs | externalDocs |  | 追加の外部ドキュメント |
| definitions,parameters,responses | components |  | 仕様のさまざまなスキーマを保持する要素 |

上記の表から見て分かる通り、2.0と3.0の大きな違いは構造の違いです。2.0で細分化されていたそれぞれのフィールドがわかりやすくまとめられている。
次の章で、それぞれの細かな違いと2.0で書かれている記事を3.0で書くための変更について確認する。

# それぞれの細かなと基本的な構文
## openapi (必須)
`openapi`ではOpenAPIのバージョンを"セマンティックバージョニング(SemVer)"で指定する構文である。
v2.0ではOpenAPIに統合される前なので、`swagger`と記載している。

※記事の記載時点での最新Vesionは3.0.3である。

```yaml
# OpenAPI 2.0
swagger: 2.0

# OpenAPI 3.0
openapi: 3.0.3
#3.0.0 ~ 3.0.nの間であればOK
```

## info (必須)
`info`では、APIに関するメタデータを記載する。バージョンの違いによる大きな差はない。
必須なフィールドは、`title`と`version`の２つがある。
`version`ではSemVerで表記するのがメジャーであるが、クォテーション`""` `''`で囲うと
文字列として扱われるので自由な形式でバージョン指定ができる。

```yaml
# sample 01
info: 
  #APIの名前
  title: sample 01 API
  #APIのバージョン
  version: 1.0.0 

# sample 02
info: 
  title: sample 02 AIP
  version: "破壊的な変更　v1"
```

## security
認証や承認で用いられる`security`は、v3.0で使用できる認証タイプがかなり増えた。
- HTTP認証
    - Basic
    - Bearer (NEW)
    - Other (NEW)
- API Keys
- OAuth 2
- OpenId Connect Discovery (NEW)


構文としての違いもかなり確認される。主な変更として
1. `securityDefinitions`がComponents内に`securitySchemes`として記述する場所とフィールド名が異なる。
2. HTTP認証の種類が増えたため、typeが`basic`から`http`へ変更
3. APIキーとしてクッキーを送信できるようになった。
```yaml
# OpenAPI 2.0
securityDefinitions:
  BasicAuth:
    type: basic
    # ...

# OpenAPI 3.0
Components:
  securitySchemes:
    bearerAuth:
      type: http
      # ...
```
認証についての詳細は別の記事にて

## paths (必須)
`paths`では、APIのエンドポイントであるパスを記載する。
`paths`がAPIの基幹となっています。基本的にpathsに全て書き込むのではなく、重複するような内容は`components`に記載することが多い。
```yaml
paths:
  /ping:
    get:
      responses:
        '200':
          description: OK
          content:
            text/plain:
              schema:
                type: string
                example: pong
```

## 以上を踏まえた最小構成
以下の最小構成を参照しながら、versionの違いを埋めていくようにv2.0の資料を参考にするとerrorを吐かれずに正しく書けるはず
```yaml
openapi: '3.0.0'

info:
  title: sample api
  version: 0.0.1

paths: {}
```


## 完全に理解してない単語まとめ
- セマンティックバージョニング(Semantic Versioning/SemVer)
３つの数字で表現されるよく見るバージョン管理記法。バージョンナンバーとして`X.Y.Z`という形式に区切られ
`X`はメジャーバージョン、`Y`はマイナーバージョン、Zはパッチバージョンを表す。
さらに詳しいバージョン管理に関する規約はこちら⇨[セマンティックバージョンニング2.0.0](https://semver.org/lang/ja/)
ヒストグラムを利用して度数分布表をグラフ化

## 1. 目的
ヒストグラムを使って度数分布表をグラフ化して、データの分布を可視化したいと思います。
見た目は棒グラフと似ているヒストグラムですが、横軸に階級、縦軸に各階級のデータ数を表示して、データの分布を分かりやすく示す目的に優れています。

では、早速作成してみましょう。

## 2. データの準備とビューの作成
都道府県別の喫茶店支出額（年間平均）を分析してみようと思います。
各都道府県の支出額に関するデータは[こちら]( https://todo-ran.com/t/kiji/16685)から入手しました。
入手したデータをデータベースのテーブルに取り込みます。直接データベースに取り込む以外にも、Yellowfin [トランスフォーメーションフロー](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=2293853)を活用することも可能です。

以下の情報を参考に[ビュー](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=2294284)を作成します。
|列名|フィールドタイプ|
|---|---|
|都道府県|ディメンション (軸)|
|支出額|メトリック (集計値)|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/01779f2e-38d5-fd11-2127-9794c93bf532.png)

## 4. グラフの作成
準備が整ったら、グラフの作成に手順を進めます。新規でレポートを作成し、以下の手順に従ってグラフを作成します。

#### 4-1. [データ] ステップ
ビューに設定した軸と集計値を全てテーブルに配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/91fef1e3-bc08-2839-ec63-ef1328bfde71.png)

#### 4-2. [グラフ] ステップ
[グラフの選択] > [分析] から [ヒストグラム] を選択します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/a456e38e-569a-5003-0dc4-c73caadbf3c6.png)
横軸に「支出額」を配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/cba9accd-87f4-7566-b989-27e71ca0ad30.png)
たったこれだけで出来上がりです！カップラーメン作っている間にヒストグラムが完成してしまう勢いですね。

## 5. 分析
出来上がったヒストグラムを使って、データを分析してみましょう。
横軸の階級は、適切な数字を Yellowfin が自動で選択しています。また、データが存在しない階級があることも見て取れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/d367b830-ac61-89e5-82cf-2c234ca34d9a.png)

全体的な様子を確認すると、多くの都道府県が年間支出額3,000円から6,500円当たりに位置しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/b145713a-7e17-dd66-179b-0cbbb65509c9.png)

一方で、突出して支出額が多い都道府県は、年間で12,000 円あるいは13,000円を超す都道府県も存在します。岐阜県と愛知県ですね。喫茶店文化が昔から根付いている両県の支出はさすがですな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/34b2ba72-084f-0c27-10b2-35318569c6b8.png)
突出して支出額が少ない県は、青森県でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/ebab3ffb-d890-851a-6b01-b2daaa7dcdba.png)
こんな感じで、データの分布を視覚的に確認するためには、ヒストグラムが便利です。

## 7. 最後に
私は岐阜県に在住していますが、ほとんどの喫茶店はモーニングを提供しています。コーヒーを1杯オーダーすると、無料でたくさんの食事がついてきます。近所の某喫茶店では、例えば以下のような感じ。
&nbsp;&nbsp;【喫茶店A】 コーヒー、焼き立てパン(2つ)、茶わん蒸し、サラダ、デザート（450円）
&nbsp;&nbsp;【喫茶店B】 コーヒー、小倉トースト、ゆで卵、サラダ、デザート (450円)

なかなか素敵な食文化ですよね。皆さんも岐阜県や愛知県に来た際には、是非お試しください。
では、良いデータ分析を! Cheers! Santé !
文字列をクォーテーションで囲む!! 正規表現 

正規表現で文字列をクォーテーションで囲む方法を今回は書いていきたいと思います。
使用するエディタはVirtual Studio Codeです。

## メタ文字とは 【前提】
正規表現の中で使われる文字や記号のことを指します。

# 正規表現での囲み方
今回は`坂本`、`鈴木`、`田中`という文字列を""(ダブルクォーテーション)で囲んでいきたいと思います。

正規表現のメタ文字では、文字列の行頭を、`^`で表し、文字列の行末は、`$`で表します。

[![Image from Gyazo](https://i.gyazo.com/080b46f6719f069dd479edc673724cbb.png)](https://gyazo.com/080b46f6719f069dd479edc673724cbb)
検索と置換の二つの欄がありますが、検索の欄には正規表現を、置換の欄にはダブルクォートを挿入していきます。acと書いてある全て置換をするというボタンを押せば文字列の先頭は完了です！
[![Image from Gyazo](https://i.gyazo.com/414ec868608bac7ff8c5f11e206d5617.png)](https://gyazo.com/414ec868608bac7ff8c5f11e206d5617)
同じ要領で、文末も`$`を書いてあげれば...
[![Image from Gyazo](https://i.gyazo.com/3d4b2e573480b7744d189d67ecfa2766.png)](https://gyazo.com/3d4b2e573480b7744d189d67ecfa2766)
完成です！！

# 正規表現での囲み方 【キャプチャ編】 
本来はこれで終わりでも良いのですが、書くのを1回で済ませたいという方の為に更に一歩踏み込んでみたいと思います。
[![Image from Gyazo](https://i.gyazo.com/3c5bdd576ce92331ab68053a4dae9fb0.png)](https://gyazo.com/3c5bdd576ce92331ab68053a4dae9fb0)
検索の部分では`^(.*)$`と記載があります。

正規表現の`()`はキャプチャと呼ばれており<font color="red">文字列をグループにまとめる</font>という意味があります。
`.`は任意の一文字にマッチする。`*`には直前の文字を0回以上繰り返す、という意味があります。

__よって、`^(.*)$`は行頭から行末までに1文字以上の文字列をグループ化しているという意味になりますね！__

次に置換の部分では、`"$1"`と記載があります。

ここでいう`$1`というのは変数の事を指しています。
正規表現でキャプチャでされた文字列は`$1`,`$2`,`$3`という風に順番に代入される特性があります。

__坂本が`$1`に代入されている為、"$1"でダブルクォートが出来るという理由が理解できました！！__

お疲れ様でした！！

# 終わりに
キャプチャはあまり聞きなれない名前ですが、これを機に少しずつ覚えて行けたらいいなぁと思います。
今回紹介した`^(.*)$`は正規表現ではよく使われる書き方みたいなのでしっかり覚えておきましょう！

__補足になりますが、`^(.*)$`を使う際の^と$は省略しても問題はありません。あくまで文頭文末を明示的に記載しているという意味になります！ではでは...。__

# 参照
https://murashun.jp/article/programming/regular-expression.html
[Android] Google Play Console の「難読化解除ファイル」と「デバッグ シンボル」の警告を消す方法

# 概要
Android アプリをリリースするとき「リリースのレビュー」のところで ↓ の警告が出ることがある。

![スクリーンショット 2022-05-18 16.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34926/6baf8505-cd70-0dcc-d503-b63cb1aa2582.png)

```
⚠️ 警告
この APK に関連付けられている難読化解除ファイルはありません。難読化コード（R8 / ProGuard）を使用している場合、難読化解除ファイルをアップロードすると、
クラッシュと ANR をより簡単に分析、デバッグできるようになります。R8 / ProGuard の使用は、アプリサイズの縮小につながります。

⚠️ 警告
この APK にはネイティブ コードが含まれ、デバッグ シンボルがアップロードされていません。
クラッシュや ANR を簡単に分析、デバッグできるよう、シンボル ファイルをアップロードすることをおすすめします。
```

この警告が出るたびに「どうやるんだっけ？」ってなるので書いておく。

詳しいことは

- [アプリの圧縮、難読化、最適化  |  Android デベロッパー  |  Android Developers - コードの難読化](https://developer.android.com/studio/build/shrink-code?hl=ja#obfuscate)
- [アプリの圧縮、難読化、最適化  |  Android デベロッパー  |  Android Developers - ネイティブ ライブラリのストリップ](https://developer.android.com/studio/build/shrink-code?hl=ja#strip-native-libraries)

に書いてある。

# 作業環境
- macOS Big Sur 11.6.3
- Android Studio Arctic Fox | 2020.3.1 Patch 3

# 警告を消す方法

どちらの警告もビルド時に出力されるファイルを Google Play にアップロードする必要がある。

- 難読化解除ファイル
    - 場所
        - `app/build/outputs/mapping/release/mapping.txt`

-  デバッグ シンボル
    - 出力するには `build.gradle` に以下の記述が必要
        - `android.buildTypes.release.ndk.debugSymbolLevel = { SYMBOL_TABLE | FULL }`
    - 場所
        - `app/build/outputs/native-debug-symbols/release/native-debug-symbols.zip`

上記ファイルを [Google Play - App Bundle エクスプローラ] の「ダウンロード」タブのところからアップロードする

![スクリーンショット 2022-05-18 17.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34926/5ff300b3-73dc-c8f7-5cd5-7236b340a230.png)

- ReTrace マッピングファイル → 難読化解除ファイル
- ネイティブ デバッグ シンボル → デバッグ シンボル

以上で警告は消えるはず。

# 参考

- [アプリの圧縮、難読化、最適化  |  Android デベロッパー  |  Android Developers - コードの難読化](https://developer.android.com/studio/build/shrink-code?hl=ja#obfuscate)
- [アプリの圧縮、難読化、最適化  |  Android デベロッパー  |  Android Developers - ネイティブ ライブラリのストリップ](https://developer.android.com/studio/build/shrink-code?hl=ja#strip-native-libraries)
jQuery - 入力時、リアルタイムで半角に変換していく！

## 答え
```javascript
$(document).on('input', function(e) {
  // ① 入力内容全体を取得
  var target = $(this).val(); 

  // ② 半角に変換して上書き
  target = target.replace(/[Ａ-Ｚａ-ｚ０-９]/g,function(s){
    return String.fromCharCode(s.charCodeAt(0)-0xFEE0);
  }); 

  // ③ 変換したものをinputに代入し、カーソルの位置を合わせる
  var selectionStart = $(this).prop("selectionStart");
  var selectionEnd = $(this).prop("selectionEnd");
  $(this)
    .val(target)
    .attr("selectionStart", selectionStart)
    .attr("selectionEnd", selectionEnd);
})
```

## ポイント
### eventはどれを使う？

**change**：inputフォームからカーソルが外れたタイミングで発火

**input**：文字が一つでも変更されたタイミングで発火

今回は、リアルタイムで変更したかったため、**input**を採用しました。
同じタイミングのeventとして、**keyup**がありますが、こちらだと上書きの際に古いデータまで取得してしまう（要するにうまくいかない）ので注意が必要です。


---2022/5/19 編集履歴---
カーソル位置に関するごを指摘いただき、カーソル位置を移動させない処理を追記しました
【VBAによる業務効率化】～基本データから各シートへの情報転記～

# はじめに
本記事はこの記事の続編です。
よろしければこちらもお読みください。

https://qiita.com/toneriver_py/items/4057578da083ebb74ae1

# 今回の目標
前回の記事でシート名に氏名を記入したシートの作成まで行ったので、今回は各シートに基本データから成績を転記する処理をしていきます。
今回は各ページのレイアウトをこんな感じにしたいと思います。
![完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242763/dfe85579-dc10-290c-2cf7-ed20a506c09a.png)

# コードの記述
以下のような処理を書きます。
```vb:各シートへの転記
Sub copy_and_paste()

    Dim i As Integer
    For i = 2 To Sheets.Count
       
       'カラーコードでセルの色を指定
       Sheets(i).Range("A1:B1").Interior.ColorIndex = 36
       Sheets(i).Range("C1:G1").Interior.ColorIndex = 20
       
       '基本データの情報をコピーして各シートに貼り付け
       Sheets(i).Range("A1:G1").Value = Sheets("基本データ").Range("A1:G1").Value
       Sheets(i).Range("A2:G2").Value = Sheets("基本データ").Range(Cells(i, "A"), Cells(i, "G")).Value

    Next i
        
End Sub
```
# 実行結果
今回は「データ転記」という名前の実行ボタンを作成しました。
前回取り組んだ「シート作成」から通しで実行してみます。
![20220518_162826.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242763/14a25eae-3cfe-4b4f-40e5-8c1e0496c830.gif)
うまくシートを作成することができました。



# おまけ
おまけとして今回作成した大量のシートを一気に削除する処理を示しておきたいと思います。
以下のコードで「基本データ」以外のシートを削除できます。
```vb:シートの削除
Sub delete_sheets()

    Dim ws As Worksheet
    'シート削除の確認ポップアップを非表示
    Application.DisplayAlerts = False
     
    For Each ws In ActiveWorkbook.Worksheets
        Select Case ws.Name
        
            Case "基本データ"
            Case Else
                ws.Delete
                
        End Select
    Next ws
 
    Worksheets("基本データ").Activate

End Sub
```
![20220518_165402.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242763/cfea30e0-c58d-4795-a59a-5dc46f4386f7.gif)
一瞬で削除することができました。

# まとめ
前回と今回を通して実務で使いそうな？処理の自動化を実現することができました。
今後もネタが思いつき次第記事にしていきたいと思います。
何かあればコメントお願いします。

# 参考文献
* [Tipsfound](https://www.tipsfound.com/vba/10008)
* [Office TANAKA Excel VBAコンテンツ](http://officetanaka.net/excel/vba/)
Retrofit2でエラー時のResponseを取得する(Kotlin)

### 概要
タイトルの通り。同じようなこと書いている記事は多いのだけど、
当たり前すぎるのかこのままのワードで検索すると中々ヒットしなくて無駄に時間がかかったので書いておく。
尚、ここで言うエラー時とは、ステータスが200番台以外で帰ってきた時のことを指す。
QiitaAPIでいうエラーレスポンスの「type」や「message」を取得したいという話。

https://qiita.com/api/v2/docs



### やり方
responseの中にAPIからのレスポンスがあるとして。
```kotlin:sample.kt
var jsonObject = JSONObject(response.errorBody()?.string())
Log.d(jsonObject.getString("message"))

```

これで取れた。
Retrofitは成功時(200)のレスポンスは一つ一つ項目を指定する必要があったから、エラーも必要なのかと思って試行錯誤してたけど、errorBody()で取れるのね。
TextViewのURLをタップしたときのイベント取得

TextViewのハイパーリンクをタップしたときにタップしたURLとイベントトリガーが欲しかったので、備忘録。

TextViewに含まれるURLをハイパーリンクとして表示して、タップを検知する。

```swift
textView.text = "test \n https://google.com \n Search Google"

textView.isSelectable = true
textView.isEditable = false
textView.delegate = self

// URL部分を遷移可能なリンク化、ハイライト
textView.dataDetectorTypes = .link

textView.linkTextAttributes = [
	.foregroundColor: UIColor.systemBlue,
	.underlineStyle: NSUnderlineStyle.single.rawValue
]

```

上記の宣言でテキスト中に含まれるURLがハイパーリンクになり、タップ可能になる。

さらにタップした後のイベントトリガーとURLがパラメータとして欲しかったのでl、
クラスに`UITextViewDelegate`を継承して、デリゲートメソッド`textView(_:shouldInteractWith:in:interaction:)`を追加する。

詳しくはドキュメント(https://developer.apple.com/documentation/uikit/uitextviewdelegate/1649337-textview)

```swift
func textView(_ textView: UITextView,
			  shouldInteractWith URL: URL,
			  in characterRange: NSRange,
			  interaction: UITextItemInteraction) -> Bool {
	print(URL)
	// URLをデフォルトブラウザで開く
	UIApplication.shared.open(URL)

	return false
}

```

`UIApplication.shared.open(URL)`の部分を書き換えれば、リンクタップ時に他にも色々できそうですね
エンドポイントなんも分からんの状態からSwaggerで設計書を書くまで

新卒研修の課題として、「swaggerを用いてエンドポイント設計書を作成する」というものがあったのですが、自分はエンドポイントをはじめとしたweb周りの知識が皆無でした。
どのような流れで何を調べてエンドポイント設計書を作成するまでに至ったのかというところを記しておこうと思います。
短期間で調べただけなので、まさかり飛んでくるのを期待してます。

## 前提
研修課題なので色々と前提条件がありました。
- フロントはreact、バックはrailsで実装する
- 認証システムは自作する(ライブラリはおk

## API設計って何に気をつければいいのか
本当になんも分からんの状態だったので、どのようにAPIを設計すれば良いのかが分かりませんでした。
色々ググって参考になった記事としてmicrosoftの[RESTful Web APIの設計](https://docs.microsoft.com/ja-jp/azure/architecture/best-practices/api-design)がめちゃくちゃ参考になりました。
RESTとは何か。というところから設計時に注意すべき点、メソッドの説明などが書かれてあリます。
僕と同じように「なんも分からん」ってなってる人は最初に読むのをお勧めします。

個人的に参考になったのは、この2つの部分です。
>リソースは、単一の物理データ項目に基づく必要はありません。 たとえば、注文リソースをリレーショナル データベースの複数のテーブルとして内部的に実装しながら、クライアントには単一のエンティティとして表示することができます。 データベースの内部構造を単にミラー化する API は作成しないようにします。 REST の目的は、エンティティと、アプリケーションがそれらのエンティティに対して実行できる操作をモデル化することです。 クライアントを内部実装に公開しないでください。

>"コレクション/項目/コレクション" よりも複雑なリソース URI を要求しないでください。

「テーブルごとにCRUD用意しておけば良いんじゃね？」とか思ってた自分をぶん殴りたくなります。
どんなエンドポイント設計をすれば使いやすいのか。を考える際に常に意識したいです。

もう1つ参考になった記事としては[Web API 設計入門](https://zenn.dev/nakaryo/articles/87b15866d67efe)も様々な注意すべき点を記載してくれていてためになりました。
APIのルールを統一しよう。みたいな基本的なことからセキュリティ上の注意すべき点などを書いてくれてあります。
ただ、自分の場合は設計書を書くのに時間があまりなかったので全部は対応できてなかったです。

## 認証、認可ってどうするの？
上記の2つの記事を読んで、なんとなくですがどんな設計をすれば良いのかというイメージは掴めました。
ただ誰でもAPIを叩けるのは困る(当たり前)ので次は認証と認可に関することを調べました。

とりあえず最初に読んでよかったなと思うのが[Web API認証方式のパターン](https://architecting.hateblo.jp/entry/2020/03/27/033758)です。
認証と認可の違いから、3つのパターンの認証方式を解説してくれています。

標準化されたHTTP認証方式は[Basic認証、Digest認証、Bearer認証、OAuth認証方式について](https://architecting.hateblo.jp/entry/2020/03/27/130535)という記事で詳しく説明してくれていました。

認証周りのお気持ち理解ができました。

仕組みを知っても実装ができなければ意味がないので、railsでどのように実装するのが良いのか。を調べます。
railsのgemでdevise-token-authというものがあります。
実装もなんとかなりそうだったので、認証機能は[【Rails API 入門】devise-token-auth](https://qiita.com/tomokazu0112/items/5fdd6a51a84c520c45b5)という記事を参考にしていこうと思います。
設計もこれに合わせました。

## swaggerの書き方を調べる
API設計と認証周りのお気持ちが理解できたので、実際にswaggerで設計書を書きます。
バージョンは古いですが、とりあえず[Swaggerの記法まとめ](https://qiita.com/rllllho/items/53a0023b32f4c0f8eabb#http%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89get-post-put-delete%E7%AD%89)を読みました。
これを読んで雰囲気が掴めたら、あとは[公式のドキュメント](https://swagger.io/docs/)をみながら書いていきます。
[swagger editor](https://editor.swagger.io/#/)が便利ですね。

余談ですが、swaggerの記法を調べるときに日本語でググると情報あんま出てこなかったので、英語でググることをお勧めします。

## 最後に
特に中身のない記事になって申し訳ないですが、紹介した記事を順番に読んでいくと基本的な事柄は理解できると思います。
いろんな人が書いてくれた素晴らしい記事に感謝です。
FineReportに利用可能なgeojson地図ファイルを取得

# 説明
[FineReport](http://www.finereport.com/jp/)に組み込まれる[地図](https://www.finereport.com/jp/analysis/datamap/)ファイルは世界地図または日本地図なので、この記事を参照すると世界各国の地図ファイルを取得し、[FineReport](http://www.finereport.com/jp/)に利用できます。

# 操作方法
## 1-shq式の地図ファイルを取得
URL： https://gadm.org/download_country_v3.html

下記のような画面に入り必要な国の地図ファイルをダウンロード
![image2022-1-18_15-36-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/c8076248-3d68-442b-493f-f3c3d0aa2722.png)

## 2-Geojsonファイルを取得
URL：https://mapshaper.org/

1）先ほどダウンロードしたファイルを選択
![image2022-1-18_15-40-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/21e577a5-8efc-17eb-5dae-8c4d519e6da0.png)

2）ファイルをインポート
![image2022-1-18_15-40-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/9706e596-9922-76b2-ff39-d180daf8e2b7.png)

3）地図の効果をプレビューする

番号がより大きい程、地図がより詳しくになります
![image2022-1-18_15-42-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/96bca737-482a-784c-dee1-23ba1d788810.png)

また、下記の用に調整し地図の複雑さを調整できます
![image2022-1-20_14-44-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/a055486a-1f2f-2760-4497-1d90fd7c3a97.png)


## 3-FineReportの地図フォルダーに保存し、利用する
1）「export」をクリックし、geojsonファイルをダウンロードします
![image2022-1-18_15-45-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/87bb62c1-e317-0823-8a5f-c1217457743f.png)

![image2022-1-18_15-47-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/d46c8851-886c-6916-24b1-1a039c8a9ebe.png)


2）ファイルを解凍し、フォルダー「webroot\WEB-INF\assets\map\geographic\world」にコピーします
![20220518163357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/4f80049a-5a18-3076-25cb-00e98faebd25.png)

3）FineReportデザイナー、またはFineReportサーバーコンテナー（Tomcat、Weblogicなど）を再起動すると、利用できます

# 効果
1）国レベル
![20220518163615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/afb4b5d0-844b-a865-4dc3-5299254ac849.png)

2）エリアレベル
![20220518163754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/a73e40b3-0366-e57e-62f4-a48c99af9f06.png)

3）市レベル
![20220518163810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/ea800154-82e2-5555-09c9-396c05a10a84.png)

# そのた
FRに識別できるエリア名は「Area Name」で、取得されたgeojsonファイルのエリア名は「NAME_1」なので、ファイルを編集して一括変換する必要があります。
![image2022-1-18_16-11-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350893/21c75d22-b694-63c3-7a96-c5e68a0cd765.png)

地図を利用して何が実現されるにつて下記のデモサイトへご覧ください。
http://jpdemo.finereport.com/
ローカルのSQL ServerにASP.NET + EF Coreでアクセスする


## TL:DR
ローカルにインストールしたSQL Serverのテーブルデータを
ASP.NETで作成したAPI経由でEntityFramework使って取得してみます。
肝は.NET6を初めて触る点だけです。

## 環境

* SQL Server Express 15.0.2000.5
* .NET 6.0.300
* VS Code

## 事前準備

* SQL Server Expressをインストール。
  [SQL Server Express LocalDB](https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver15)
  ついでにSQL Server Management Studio(以下SSMS)もインストールしておく。

* .NET 6 SDKをインストール
[.NET6](https://dotnet.microsoft.com/ja-jp/download/dotnet/6.0)

* VS Codeは割愛

## テーブルの作成

SSMSからインストールしたローカルDBに接続。
ローカルDBのサーバー名はインストール時に特に設定しなければ
```
localhost\SQLEXPRESS
```
となる模様。

その後、以下の定義でテーブルを作成。
``` SQL
CREATE TABLE Customers (
  ID int PRIMARY KEY,
  CompanyName nchar(10) NULL,
  Address nchar(10) NULL,
  Phone nchar(10) NULL
)
```
※型は適当です。テスト用なので。

## APIの作成

### プロジェクト作成
適当なフォルダをVS Codeで開き、ターミナルを表示(`Ctrl + @`)し、ASP.NETプロジェクトを作成。
```
dotnet new mvc
```

今回はSQL Serverとつなぐため、必要なパッケージを取得するためターミナルで以下を実行。
```
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
```

### 各必要なクラスの作成

コードは以下を参照ください。

https://github.com/yu-sato-edu/efcoretest/tree/main

#### 詰まった点
詰まったというか凡ミスというか…。

##### 接続文字列
接続文字列は以下になります。
```
Server=localhost\\SQLEXPRESS;Database=(データベース名);Trusted_Connection=True;
```
データベース名のところを初期値の`master`のままにしてしばらく詰まってましたｗ

##### SSLリダイレクトの解除
テンプレートで作成すした`Program.cs`に記載のリダイレクトのパイプラインは削除する必要があります。

``` diff_c
- app.UseHttpsRedirection();
+ //app.UseHttpsRedirection();
```

ローカルで実施するのでHTTP接続で十分なので。

## 接続確認

なんでもよいですが、RESTクライアントツールでテストします。
私は[POSTMAN](https://www.postman.com/downloads/)使いました。

:::note warn
ただしローカル実行が必要ですので、クラウドのものとかはNGです。
:::

## さいごに
初投稿でした。自分のアウトプットのために書きましたので読みづらい文章かもしれないです。(最後に言う..
【WPF】DataTemplate.TriggerでAlternationIndexを動的に設定した件

# やりたいこと
タイトルにあるようにItemsControlのDataTemplateにAlternationIndexを条件としたTriggerをセットした。
```xml:View.xaml
            <ItemsControl
                AlternationCount="{x:Static s:Int32.MaxValue}"
                ItemsSource="{Binding List}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Label
                            x:Name="label"
                            Content="{Binding Text, Mode=TwoWay}"/>
                        <DataTemplate.Triggers>
                            <Trigger Property="ItemsControl.AlternationIndex" Value="5">
                                <Setter TargetName="label" Property="Foreground" Value="black" />
                            </Trigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
```
![スクリーンショット 2022-05-18 160953.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610751/359097d2-7245-442f-1bbd-400a1528b8f4.jpeg)
AlternationIndexを条件にすることで、Valueで設定したItemだけプロパティを設定できる。このValueを動的にしたい。。

# 試行錯誤の結果
Xaml上ではうまくいかず。。
DataTemplateをコードビハインドにすべて移すことでなんとかなった。
```cs:View.xaml.cs
                //Trigger作成
                var trigger = new Trigger();
                trigger.Property = ItemsControl.AlternationIndexProperty;
                trigger.Value = value;//ここをコードビハインドで設定できる
                trigger.Setters.Add(new Setter(Label.ForegroundProperty, new SolidColorBrush(Colors.Black), "label1"));

                //Labelコントロールのフレームワークを作成
                var label = new FrameworkElementFactory(typeof(Label));
                Binding binding = new Binding("Text");
                label.SetBinding(Label.ContentProperty, binding);
                label.Name = "label1";

                //TriggerとLabelをDataTemplateにセット
                var dataTemplate = new DataTemplate(typeof(ItemsControl));
                dataTemplate.VisualTree = label;
                dataTemplate.Triggers.Add(trigger);
                Items.ItemTemplate = dataTemplate;
```
Xamlのみで完結できる方法探してます。。
C++　変数について

Rubyを最初勉強していて、その後企業に入ってからC言語を勉強していくことになったので記事を書いていきます。

Rubyのときは
```Ruby:Ruby
変数名　=　値
```

といったように変数に直接代入するような形だったが、Ｃ言語では型というものがあるようです。

型とは「数値」、「文字列」といったデータの種類を表すもので、
例えば「数値」の型を作った場合、そこに文字列を代入することはできません。

なので変数に数値として「20」を代入したい場合。

```C++:C++
int x = 20;  // int型の変数 x を宣言し、そこに数値の20を代入している。
```
上記のような構文になる。


代表的なデータ型の種類を以下に記載します。

```C++:C++
//データ型の種類

//　符号あり整数型
int    // 数値　　-2,147,483,648　～　2,147,483,647
char   //　１文字
short  //　intよりも少ない数値  -32,768  ～　32,768
long   //　intよりも大きい数値  -9,223,372,036,854,775,808 ～　9,223,372,036,854,775,808

// 符号なし整数型(マイナスの数値が代入できない代わりに正の数値が２倍入る)
unsigned int   
unsigned char  
unsigned short 
unsigned long  

//　浮動小数点型
float  //小数点
double //小数点 floatよりも桁数が多く入る

// 論理型
bool  //　true false

//特殊型
void  //  型無し
```
と、このようなデータ型があるのだが、

数値だけにしても型の種類がある。
なぜかというと、型によってメモリのバイト数が違うので、容量や処理速度が変わるらしい。

C++は処理速度の速さで定評があるので、
こういった小さなことの積み重ねで処理を早くしているのかなとおもった。
rails5 progate 整理メモ 

# パスワードの安全な取り扱いを学ぼう
サービスには他人のアカウントに不正にログインされてします危険性がある。
それでは安全にするためにはどうすればいいのか？

## 　安全性の高いパスワード
万が一パスワードを覗き見られたり、データが盗まれても、パスワードの内容がわからない状態 

## どのように安全にするか？　ハッシュ化
ハッシュ化された特別な文字列。このようにハッシュ化することで安全性を高めることができる

## Gemfileを編集しよう
Rails でパスワードをハッシュ化する際は、gemというツールを必要。

## Gemとは
RubyやRailsでプログラミングをする際に「よく使う機能」をパッケージ化したもの
Railsにインストールすることで使用することができます。
今回は```bcrypt```という```「ハッシュ化するgem」```を使います。

## どうやってインストールするのか？
インストールしたいgemを記述するGemfileというファイルが存在します。
つまり
```Gemfile```にファイル名を記述することによってインストールできるのか?
### gemファイルのインストールの方法
```「gem 'gemの名前'」```と記述します.
その後ターミナルで```「bundle install」```というコマンドを実行すると、書かれたgemをインストールすることができます。

### Gemfile.lock
Gemfileの下にあるGemfile.lockというファイルは自動で作成されるファイルなので編集する必要はありません。

### やってみた。
```
gem 'bcrypt'
```
```
bundle install
```
成功

# has_secure_password
```bcrypt```からどうやってハッシュ化をするのか？
## ハッシュ化の手順
```bcrypt```をインストールすると、```has_secure_password```というメソッドが使えるようになります。

## has_secure_passwordメソッドをかく。
```user.rb
class User < ApplicationRecord
  # has_secure_passwordメソッドを追加してください
  has_secure_password
.
.
.  
end
```
passwordカラムのバリデーションを削除をしても問題にならない。

# password_digestカラムを追加しよう
```has_secure_password```メソッドはハッシュ化したパスワードを```password_digest```カラムに保存することになっている。
安全を考慮して書かない。

## 一つのマイグレーションファイルに複数のカラムを設定

### マイグレーションファイルを作成
```rails g migration```コマンドを用いる。

```password```カラムが削除されるよう、左の図のようにマイグレーションファイルを編集しましょう。

### マイグレーションファイルのカラムの削除
カラムを削除する場合は、```add_column```の代わりに```remove_column```を用います。

# 思ったこと
なんでパスワードカラムを削除してパスワードダイジェストカラムを追加する必要があるのか？
ハッシュ化したパスワードをパスワードカラムに入れろばいいじゃないか。

## マイグレーションファイルを作成
```
rails g migration change_users_columns
```
```change_users_columns.rb
class ChangeUsersColumns < ActiveRecord::Migration[5.0]
  def change
    add_column users :password_digest :stirng
  end
end
```
こうだったかな？
```rb
  class ChangeUsersColumns < ActiveRecord::Migration[5.0]
    def change
      add_column :users, :password_digest, :stirng
      remove_column :users, :password, :string
    end
  end
```
全てシンボルにすることと```,```で区切ることだったか。

## tweet_app $ rails db:migrate
マイグレーションファイルを正しく編集してから実行してください。
```change_users_columns.rb
add_column :users, :password_digest, :stirng
```
```change_users_columns.rb
add_column :users, :password_digest, :string
```
stringの綴り間違いだった。

ちょっと休憩。
【30歳から目指すwebエンジニア学習録】bootstrap5系の導入でちょっとつまづいた話

# 起こったこと
- こちらの記事を参考にbotstrapを導入(とても丁寧でわかりやすい記事です)
https://www.techpit.jp/courses/2/curriculums/3/sections/15/parts/51
- こんなエラーが出た。
- どうやらWebpackerが見つからないということらしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530541/b9e4f285-19e1-7336-164d-4a73ad960ca8.png)

# 解決まで流れ
- こちらの記事を参考にinstallからcompileまでをやってみた
https://qiita.com/ahuiru/items/062bbc1b351819a3eeb8
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530541/c5d645b5-c674-58e9-b91f-2a80940e4a16.png)

# installはできたが、次は「@popperjs/coreが解決できないよ」とエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530541/89c85ee2-3413-07c4-c146-5d30a3092e3e.png)

# やっと解決
-　こちらの記事を参考に下記で解決した
-　原因は、最初にbootstrap4を導入しようとしていて、popperを`$ yarn add popper.js`でインストールしていたこと。
`$ yarn add @popperjs/core`でインストールすれば良いことが分かった
https://qiita.com/zamazama/items/2aa18bc87f53ae443d6c

# 最後に
手探りで4系を入れて途中で5系にしようなんてわけわからんことをやってエラーを起こしても
どこかに解決策が乗っている記事があるなんて本当にすごいなあ
CCNA合格体験談

# はじめに

私自身のスキルアップのためと思い、CCNAの資格取得を目指し、無事、合格することができましたので、ここでその合格までの体験談みたいなのもを記しておこうと思います。

# 目次
1.受験しようと思ったきっかけ
2.受験を決意した時の私自身の知識
3.勉強方法
4.試験日
5.最後に

# 1. 受験しようと思ったきっかけ

まず、なぜ私がCCNAの資格取得を行おうと思ったかの理由ですが、
最初はほんとにこの資格取得できれば、ちょっとはネットワークが
わかる、というレベルにたどり着けるのではという安易な思いでした。
仕事ではなかなかネットワーク関係の業務とは縁も程遠い位置にいますが
それでも自分自身の知識のため、CCNAを取得することを頑張ってみよう
と思いました。

# 2. 受験を決意した時の私自身の知識

実際にCCNA取得に向けて資格試験の勉強を始めようとしたときの
私自身の知識レベルは下記のような感じになります。
これから受験しようと思っている方よりも劣っているかもしれませんので
その方の自身に繋げてもらえたらと思います。

 - ネットワーク、インフラ業務については全くの未経験
 - サブネットマスクの仕組みを初めて資格勉強でちゃんと理解した
 - 受験前で持っているベンダー資格は、AWS CLF,AWS SAAのみ
 - Cisco製品についても全く過去に触れていない


# 3. 勉強方法

勉強を開始したときにまず2冊、本を購入しました。

まずは、【　1週間でCCNAの基礎が学べる本　】
ネットワーク業界未経験＆知識もない私には最初の一歩を踏み出す
本としてはベストでした。
この本を3日ぐらいで読み、最低限の知識は頭に入ったかなといった
状態にしました。

https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7CCNA%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-%E7%AC%AC3%E7%89%88-%E4%B8%80%E9%80%B1%E9%96%93-%E5%AE%AE%E7%94%B0-%E3%81%8B%E3%81%8A%E3%82%8A/dp/4295010731/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=31L2RV3KNT49Y&keywords=CCNA&qid=1652839181&sprefix=ccna%2Caps%2C196&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExTFMxWEdaWTI3WFhPJmVuY3J5cHRlZElkPUEwNTM3NjEyMzdBUkNCN041RTVMRyZlbmNyeXB0ZWRBZElkPUExT0lUNUlLSURZMEw3JndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==




次に、【　徹底攻略Cisco CCNA問題集［200-301 CCNA］】
この本で、問題をひたすら解いて、試験対策しようという考えでした。

https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Cisco-CCNA%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%BB200-301-CCNA%EF%BC%BD%E5%AF%BE%E5%BF%9C-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%BD%E3%82%AD%E3%82%A6%E3%82%B9%E3%83%BB%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3-ebook/dp/B093BDVD5W/ref=sr_1_2_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=31L2RV3KNT49Y&keywords=CCNA&qid=1652839181&sprefix=ccna%2Caps%2C196&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExTFMxWEdaWTI3WFhPJmVuY3J5cHRlZElkPUEwNTM3NjEyMzdBUkNCN041RTVMRyZlbmNyeXB0ZWRBZElkPUFSUlhXVzY4NU1UMjQmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl

実際に問題集を解き始めたときは、1週目はボロボロ＆解説を読んで理解する
のにかなりの時間がかかり、最初の1週目を解くのに1週間かかっていました。

なかなか各章で8割以上をとることができませんでしたが、それでも
ひたすら問題を解き、解説を見て理解して、数日後にその問題を解いてみると
忘れているのでまた、解説を読んで理解して。。。の繰り返しです。
私の場合はこの本の問題をたぶん7周ぐらい実施しました。

やり方的には、1章やり始めたら、解答、解説まで見て理解を1セットとして
やることを心がけていました。解くこととその後解答して、解説を理解すること
の時間を空けてしまうと、なかなか解いた時の考えが残っておらず、
同じ間違いを繰り返してしまいそうだからです。


# 4. 試験日

AWSの認定試験を受験していたので、ピアソンでの受験は慣れていました。
ただ、英語でできた試験問題が日本語訳されている感じなのでやはり、
ところどころ日本語がうまく理解できない文で問題が出されるところがあって、理解するのが難しかったですね。。。

受験は試験勉強を2月半ぐらいから勉強し始めて、3月末に受験しました。
実際に試験予約したのは3月頭です。
1か月前の状態だと受かる気がしませんでしたが、とりあえず年度中に取りたかった
ので、予約してからさらに気持ち決める感じで勉強していました。


# 5. 最後に

これからCCNAの取得しようと思っている皆さんの自身になればと思い、
この記事を書かせていただきました。
ネットワーク未経験の私でも座学でonlyで取得することができましたので。
ただ、実際にCisco製品とか触って覚えるといったこともできればなお
よかったと思いますが、なかなか機会がありませんもんね。。。

資格取得の1歩としてアソシエイトレベルのCCNAを勉強することは
とても良いことだと思いますので皆さんも頑張ってみてください。
【30歳から目指すwebエンジニア学習録】rails generate で余計なファイルを作らない設定をする

# やりたいこと
 - rails g コマンドでは、testファイルやhelperファイルなど、一緒に作ってくれる
 - が、不要なファイルが作られてしまう。
 - そこで、config/application.rbに記述することで、生成されるフォルダを制御する

# 結論
- config/application.rb ファイルに記述。
- ORmapperやらテンプレートエンジンまで設定できる。
- fixtureはFactoryBotを使いたいときとかに設定すると便利そう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530541/d36ba371-9058-f0db-f8c7-8a565eaf9c93.png)

# 参考

##### ジェネレーターのワークフローをカスタマイズする
https://railsguides.jp/generators.html#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B