OmniAICreator/Qiita-1.07M huggingface dataset:
ブラウザで上書き保存ができるぞぉぉ

以前までChromeのOrigin TrialsにNative File System APIとして実装されていたローカルファイルへアクセスするAPIが、ついにChrome86から標準機能として搭載され、名前も実装もだいぶ変わっていたので記事に残しておきます。

[Can I Use](https://caniuse.com/?search=file%20system%20access%20api)を確認した上での実装をお勧めします

# File System Access API
File System Access APIは[Project Fugu](https://www.chromium.org/teams/web-capabilities-fugu)の一環として実装された、主にローカルファイルの読み取り、書き取りを目的としたAPIです。実はファイルだけでなくフォルダの読み取り/書き取りもできますが、今回はファイルの読み取り/書き取りの方法を紹介します。

## ファイルを読み取る
これまでローカルファイルを読み取るには[この記事](https://www.html5rocks.com/ja/tutorials/file/dndfiles//)みたいに自分でHTMLタグを足したり、ファイル内容を切ったり貼ったりする必要があり、かなり面倒くさい実装が不可欠でした。
一方File System Access APIではたった３行で読み込みが完了します。

```javascript
[fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();
const fileContents = await file.text();
```

このfileContentsをtextareaに代入すれば手軽にファイルの読み取りが完了します。
#### 読み取りオプション
１行目の```showOpenFilePicker```は引数でオプションの設定も可能です。

```javascript
// 複数ファイルの選択を可能にする
[fileHandle] = await window.showOpenFilePicker({multiple: true});
// 複数ファイルの選択を不可能にする
[fileHandle] = await window.showOpenFilePicker({multiple: false});
```
[参考](https://wicg.github.io/file-system-access/#api-showopenfilepicker)

#### fileHandleの中身

```javascript
{
  lastModified: 1587625257478 // ファイル最終更新日時(UNIXタイム)
  lastModifiedDate: Thu Apr 23 2020 16:00:57 GMT+0900 (日本標準時) {} // ファイル最終更新日時
  name: "sample.pdf" // ファイル名
  size: 85488 // ファイルサイズ (単位はバイト)
  type: "application/pdf" // ファイルタイプ （記述のない場合もある）
  webkitRelativePath: "" // フォルダを選択した際に内部のファイル数などを表示できる
}
```

## ファイルに書き込む
従来のブラウザではそもそも上書きすることが不可能だったのですが、こちらもFile System Access APIでは簡単に書けちゃうんです。

```javascript
const writable = await fileHandle.createWritable();
await writable.write(contents/*⇦書き込む内容*/);
await writable.close();
```

さっきファイル情報を代入した```fileHandle```にcreateWritableメソッドで[FileSystemWritableFileStream](https://wicg.github.io/file-system-access/#api-filesystemwritablefilestream)オブジェクトを呼び出します。その後書き込んで、終了するだけ。非常に簡潔な仕様です。

この時ブラウザでは
![image](https://user-images.githubusercontent.com/51294895/98450827-64c50d00-2183-11eb-8d55-e9eb95bcf73d.png)
こんな感じのダイアログが表示され、「変更を保存」ボタンを押すとローカルファイルの上書きが完了します

これ以降、新たなファイルを読み込むかリロードや手動でfileHandleをリセットするまでは上書き処理を行うと自動でこのファイルが上書きされます。便利な反面、実装を間違えると取り返しのつかないことになりますのでご注意ください。

## その他の機能
FileSystemAccess APIは基本は読み取り/書き込みのみですが、深掘りしていけば色々応用できそうです。[Chromeのブログ](https://web.dev/file-system-access/)にはBlob型（画像や音声を取り扱える）の読み取りと書き込みをHTTPリクエストで可能にする方法も少し書いてあるので興味のある方は見てみてください。他にも上書きするファイルを再度ファイルピッカーを起動して選ぶ方法もあったりします。

# おわりに
このAPIはこれまで試験的機能だったこともあってまだ枯れていない段階です。実際、[ドラッグ&ドロップ機能](https://wicg.github.io/file-system-access/#drag-and-drop)なども実装はされていますが問題も多く議論が行われている最中です。

APIの性質上セキュリティがおざなりになるとChromeの脆弱性になり得るので議論中の機能は使うべきではありませんが、今後の動向には注目していきたいです。

# 参考文献
WICG仕様書...https://wicg.github.io/file-system-access/
WebDevチームブログ...https://web.dev/file-system-access/
SeasideにfileUpload可能なファイルサイズの変更

## 発生した問題
* Pharo8上のSeaside3で[fileUpload](http://book.seaside.st/book/fundamentals/forms/fileupload)した場合、ファイルサイズが16MBを超えると「ERR_CONNECTION_RESET」というエラーが発生してアップロードに失敗する
![WS000356.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80431/a17cc270-b255-4d8e-f6bd-5fe58a7746e4.jpeg)

callbackが呼ばれる前にエラーが発生するため設定箇所を調べるのに苦労しました。

## 設定箇所
アップロード可能なサイズは**ZnMaximumEntitySize**クラスのインスタンスメソッド**default**で設定されているので必要なサイズに増量してください。

```smalltalk:ZnMaximumEntitySize
default
	"By default, allow for entities of up to 16 Mb to be read from streams"
	^ 16 * 1024 * 1024
```
自動車鍵の無線を遮断する

# 結論

リレー攻撃を防ぐために電波を遮断するきんちゃく袋を作ってもらった。

# 自動車盗難とリレー攻撃

先日、というかかなり以前に自動車窃盗団が、自動車から鍵が近辺にあるかどうかの電波をリレー(増幅)することで、不正に解除し盗難するというテレビのニュースを見た。

図式にするとこんな感じ。

![car01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/b2b45264-5134-3f14-abc8-7e8d836e8adc.png)

大抵の人は自動車の鍵は玄関に置いてあるだろう(テレビドラマでもそうだし)。
家の庭に自動車が置いてあれば、不正行為者はそこから玄関まで電波を中継/リレーするということになる。

この不正行為は、電波を中継しているだけだからデジタル暗号技術/公開鍵認証技術も無力だろう。

# 自動車盗難とリレー攻撃の対策

対策となるのは、帰宅した際には、鍵は家の真ん中(中継した電波が届かないような)に置くとか、スノーデン氏がスマートフォンを冷蔵庫に保管したように、自動車鍵を冷蔵庫に保管するのもよいだろう。

# 電磁波シールドの布

たまたま、私のタイムラインに流れてきた電磁波シールドの布。

[【Mission Darkness】TitanRf EMI RFI遮断 電磁波シールド 電磁波対策 MIL-SPEC取得 軍用規格 WIFI Bluetoothブロック (111.8 x 91.4 cm, 100.22平方センチメートル)](https://www.amazon.co.jp/gp/product/B01M294MGK/)

どうも、布としての材料の販売だけでなく、ポシェットとかバックとかにして販売もしているらしい。

先日、購入した。

![DSC_1097a.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/4edd9962-0778-2833-6354-188d97943c5a.jpeg)

そして、きんちゃく袋にしてもらった。
(外側の布の柄はスルーしてくれ)

![DSC_1098a.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/f6a2ba36-b3f0-0be7-1835-7a495853e042.jpeg)

このきんちゃく袋の内側の布に電磁波シールドの布を使っている。

この際、私が所有している自動車は、布を二重にしなければ、遮蔽できなかったので二重にした。

![car03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/a0d9f2c8-58a2-ffdd-08dd-1073e154e223.png)

そうすると、帰宅している間は、このきんちゃく袋に入れておけば、この電磁波シールドによって不正中継された電波を遮断してくれる。

![car02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/c0b2c982-8a11-0792-55a1-bdb8280bbd23.png)

特殊部隊は言い過ぎかもしれない...

<!--
# YouTubeの動画(未稿)

- [ここにYouTubeへのリンク](http://www.youtube.com/)

-->

# CANインベーダー(デバガを使ったハック)

2021/11/05 [鍵はかけていたのに… なぜ盗まれた？](https://www3.nhk.or.jp/news/html/20211105/k10013332221000.html)

こちらはデバグ用端子に、デバガを接続されて、自動車のコンピュータシステムを乗っ取る方法のようだ。

CAN内部の機器IDは、車種によって異なるので、同一車種が狙われやすい。

# ゲームボーイ(2024～)

こちらは自動車から送信される電波に基づいてスペアキーを生成する。
→ 自動車から送信される電波からスペアキーが作れる仕様自体が問題だと思う。

# リンク

- [2021/09/13 車両をサイバー攻撃から守るため2022年から車両診断機能に制限。セキュリティ保護された診断機能を実行可能にする「セキュア ダイアグノシス アクセス (SDA)」をボッシュが9月13日に発売開始](https://www.nikkan.co.jp/releases/view/127446)
- [2021/09/14 高級車盗、新たな手口にご用心　車載システムに不正アクセス―愛知など](https://www.jiji.com/jc/article?k=2021091300580&g=soc)
- [2021/12/06 AirTagが車泥棒に悪用される事件増加、高級車に付けて自宅まで追跡](https://japanese.engadget.com/apple-airtag-car-thefts-canada-025912194.html)

# 以上
[php]毎月の月初日の配列を、作成したい

DatePriodが優秀なので、こんな感じで簡単に取得できます。
日毎の配列も作成できますし、範囲の指定方法もDatetimeを操作するだけなので、便利ですね！

```php:qiita.php
$datePeriod = (new DatePeriod(
    new DateTime('2021/01/01'),
    new DateInterval('P1M'),
    new DateTime('2022/01/01'),
));

foreach ($datePeriod as $dt) {
     echo $dt->format('Y/m')."\n";
}
//出力結果
//2021/01
//2021/02
//2021/03
//2021/04
//2021/05
//2021/06
//2021/07
//2021/08
//2021/09
//2021/10
//2021/11
//2021/12
```

参考

https://www.php.net/manual/ja/class.dateperiod.php
MacでDDしようとしたときに「status=progress」が使えなかった話

#前提・こんな人のために
Mac BigSurユーザー。
SDカードやSSD等のDDの進捗が見たい人。


#経緯
はじめまして or お久しぶりです。
スタバでイキるためにApple Silicon搭載のMacBook Airを購入しました。

今まではSurfaceを使用していましたが、この機会にMacBookを日常使いするようにしました。
M1を搭載し、スタイルよし、バッテリーよし（実際めちゃくちゃ持ちます）、性能よし（ツイッターとVSコードとChromeしか触ることないので実感することは少ない）。

さて、本題へ。
ある日Raspberry Pi用のMicroSDをバックアップ・量産するためにDDしたいと思いたった日のことです。
今まではWindows機でDDすることはなく、わざわざLinux機につなげてカードコピーをしていましたが、
MacBookはLinuxではないか！頻度は少ないと云えど思い立ったときに手持ちの端末でサクサクっとSDカードのコピーができるのは便利だ、ということでレッツトライ。

#やったこと
MacBookにカードリーダーをつなげ、SDを突っ込む。
Ubuntu等と同じノリで
``` sudo df -PH```
でコピー元SD、書き込み先SDをそれぞれ見つける
```sudo dd if=/dev/コピー元 of=/dev/書き込み先 conv=sync,noerror status=progress bs=4m```
と入力しエンターポチッとな

#困ったこと
エラーが帰ってくる。 ```unknown operand```だと…？
後述するが、MacOSだと```status=progress```というオプションが存在しないらしい。



#解決方法
[Quick: dd with progress indication](https://davejansen.com/dd-with-progress-indication-on-macos/)
に原因及び対策方法が書いてあったのでこの方法をトライ。
[PipeViewer](http://www.ivarch.com/programs/pv.shtml)というツールを使用する。
```brew install pv```
でインストールした後に
```sudo dd if=/dev/コピー元 | pv -s 8G | sudo dd of=/dev/書き込み先 conv=sync,noerror status=progress bs=4m```（今回は8GBのマイクロSDに書き込みするため）
結果はこんな感じ。プログレスバーが見えるので```status=progress```よりもリッチな感じで素晴らしい。
![pv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513230/457cc2f1-e3b7-b4cd-3dff-3bfa41b08149.png)

ただし、こんな回りくどいことしなくても気になった際に「control + T」で状況確認すればいいかも…
[Unity] シェーダーで半透明のオブジェクトにするコード。[入門]

######説明
画像の左にある通りオブジェクトを半透明にするシェーダーコードです。



![スクリーンショット 2021-07-14 111426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521308/33e03bdd-763c-dd94-0958-a9aa0c073ff6.png)


```cs
Shader "Custom/sample"
{
	SubShader
	{
		Tags { "Queue" = "Transparent" }
		LOD 200


		CGPROGRAM
#pragma surface surf Standard alpha:fade
#pragma target 3.0


		struct Input
		{
			float2 uv_MainTex;
		};


		void surf(Input IN, inout SurfaceOutputStandard o)
		{
			o.Albedo = fixed4(0.6f,0.7f,0.4f,1);
			o.Alpha = 0.6f;
		}

		ENDCG
	}

	FallBack "Diffuse"
}
```
Databricks（Spark）にてDataFrameReaderのmode機能を用いたエラーレコードの抽出方法

## 概要
Databricks（Spark）にてDataFrameReaderのmode機能を用いたエラーレコードの抽出方法を共有します。
mode機能にて`_corrupt_record`列に基づいて、エラーレコードを出力します。

DataFrameReaderのmode機能については、下記の記事で紹介しております。

https://qiita.com/manabian/items/0db1e529536c63283698

詳細は下記のGithub pagesのページをご確認ください。

https://manabian-.github.io/databricks_tecks_for_qiita/#export_erro_records_by_dataframereader/export_erro_records_by_dataframereader.html

コードを実行したい方は、下記のdbcファイルを取り込んでください。

https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/export_erro_records_by_dataframereader/dbc/export_erro_records_by_dataframereader.dbc

## 実施手順
### 事前準備

```python
# サンプルデータの準備
 
file_path = '/FileStore/qiita/export_erro_records_by_dataframereader'
dbutils.fs.rm(file_path, True)
 
df = spark.createDataFrame([("A", "100"),("B", "2,000"),("C", "300")],["string", "value"])
df.display()
 
## dbfs上にcsvファイルとして格納
df.coalesce(1).write.format("CSV").mode("overwrite").option("header", "true").save(file_path)

# csvのパス
file_path_to_csv = f'{file_path}/*.csv'
 
# スキーマ定義をセット
schema = """
    `string` string
    ,`value` integer
    """
 
# `_corrupt_record`列を追加したスキーマを作成
shema_with_col_record = f"""
    {schema}
    ,`_corrupt_record` string
""".strip()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7c8fc382-8d37-b2db-9797-8f7914dd9bd9.png)


### mode機能を用いたエラーレコードの抽出

```python
df_permissive = (spark.read
                     .format("csv") #ファイル形式を指定
                     .schema(shema_with_col_record) #スキーマを指定
                     .option("header", "true") #ヘッダーの有無を指定
                     .option("inferSchema", "False") #スキーマの自動読み取りの有無を設定
                     .option("mode", "permissive")
                     .load(file_path_to_csv)
                )

# `_corrupt_record`列にクエリを発行するために一度キャシュする
df_permissive.cache()
 
# `_corrupt_record`列にNULLであるレコード（エラーレコード）を保持したデータフレームを作成
df_error_record = df_permissive.where(df_permissive._corrupt_record.isNotNull())
 
# エラーレコード数が1以上の場合にレコードを表示
if df_error_record.count() > 0:
    print("想定のスキーマに一致しないデータがあります。")
    df_error_record.display()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cd4fa3bb-7d03-f48c-6b89-79b9367b9b43.png)


```python
df_permissive.unpersist()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a1b30d46-ef4c-2a99-7cd0-420ec392aada.png)


## 関連記事
### ノートブックをGithub Pageによる共有方法
[Databricks（Azure Databricks）でGithub経由でノートブックを共有する方法 - Qiita](https://qiita.com/manabian/items/3d74c18136508e0ac971)

### Githubのファイルをインポートする手順
[DatabricksにてGithub上にあるdbcファイルのインポート方法について - Qiita](https://qiita.com/manabian/items/534b14396077f31fed90)
【Google Cloud Day'21】「AI を用いたタクシー配車における BigQuery 徹底活用術」を視聴して

AI を用いたタクシー配車における BigQuery 徹底活用術
"タクシー配車アプリ GO では、日々蓄積しているタクシーデータを用いて待ち時間予測などのサービスを提供しています。本セッションでは、BigQuery、BigQuery ML の機能を徹底活用することで、それらのサービスをコンパクトに実現した方法について紹介します。機能の使用例だけではなく、BigQuery をリアルタイム運用するためのノウハウ、BigQuery ML の実用上の注意点なども紹介予定です。
"
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-da-07

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>ハイパーパラメータを制御しないで済むところがBQ MLのいいところと思っていましたが、やはり設定したいものがあると知ることができました。もし、MAX_ITERATIONS以外で調整できたらよいと思われるハイパーパラメーターがあったら教えてください。</th>
		<td>一般的な話になります。データが過学習しやすいものかによって変わると思いますが、葉の数や木の深さなどは重要なパラメータとなります。</td>
	</tr>
	<tr>
		<th></th>
		<td>ハイパーパラメータを制御したくないということでしたら、AutoML の利用などをご検討してはいかがでしょうか</td>
	</tr>
	<tr>
		<th>BigQuery GISをつかっているというお話がありましたが、以前はどういった位置情報を使っていたのですか？BQ GISのメリットはどのように感じていますか？</th>
		<td>一番利用している位置情報は車両の位置情報ですね。 BQ GISのメリットは、SQLで完結する点、大規模データでも素早く解析できる点が大きいです。</td>
	</tr>
	<tr>
		<th>ARIMAモデルはBQで利用できますが、どのようなところが課題だったでしょうか。精度に懸念があったなどでしょうか。</th>
		<td>質問ありがとうございます！BQMLのARIMAについては、精度の面の問題もありますが、リアルタイムな特徴を用いようとするとその度に再学習しなければいけないという問題がありました。</td>
	</tr>
	<tr>
		<th></th>
		<td>今回の場合は、15min毎に予測をしたく、15min毎に再学習するのはコストが高くなるため不採用となりました。</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>サービス概要</th>
		<td></td>
	</tr>
	<tr>
		<th>処理の概要</th>
		<td>駒井処理はBQではやりきれない。データサイエンティストが必要になる。モデルを使っても精度が低くなり、UXは悪くなる可能性がある。</td>
	</tr>
	<tr>
		<th>料金や処理の量について</th>
		<td></td>
	</tr>
	<tr>
		<th>BQの高速化</th>
		<td>おもしろ高速化をやると5倍くらい早くなる</td>
	</tr>
	<tr>
		<th>BQMLについて</th>
		<td></td>
	</tr>
	<tr>
		<th>BQMLの課題</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/69060a38-1a3c-2209-adb6-c313717c535d.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4802c63a-bdff-2d6c-d565-5bb1a83547cc.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/7b3e04ff-2239-33e4-2789-f7377e48a6d8.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/70d9a3d8-b45a-af3c-b171-4c4467e20d41.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/5ec402dc-fc78-b582-502f-b02a70c18caa.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/3fc32130-934b-e6d6-132a-573c4d420a66.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/7e7f09c4-744a-1fed-af2f-5188adf77fb3.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/ca036280-1c2e-c5b4-873c-e2569e26ee5e.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/0f0a6842-74a9-c908-0f87-7a1879b112c6.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/f128fe06-a3d7-e754-9cec-adcfd3dc72f9.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/6c28f9ff-8352-6c6e-6117-4266693166cf.png)
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/264871f2-eb15-48bb-acab-e4c415e654b9.png)
FiddleでRubyのCバインディングを作るときは RbConfig::CONFIG['SOEXT'] で共有ライブラリの拡張子を取得できる

タイトルの通りです。

RubyでFFIを利用してC言語のライブラリなどのバインディングを作成するときは、

* Rubyの標準ライブラリのFiddleを利用する方法
* Ruby-FFIを利用する方法

があります。その際に、プラットフォームごとに、共有ライブラリのファイルの拡張子が異なるため、`case` 文で分岐を作成する必要がありました。例えばこんな感じです。

### case文による分岐

```ruby
lib_name = case RbConfig::CONFIG['host_os']
           when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
             'libssw.dll'   # unconfirmed
           when /darwin|mac os/
             'libssw.dylib' # unconfirmed
           else
             'libssw.so'
           end
```

`RbConfig::CONFIG['host_os']` の代わりに [`RUBY_PLATFORM`](https://docs.ruby-lang.org/ja/latest/method/Object/c/RUBY_PLATFORM.html) を使ってもよいかもしれません。

### FFI::Platform::LIBSUFFIX

Ruby-FFIを利用している場合は、`FFI::Platform::LIBSUFFIX` で共有ライブラリの拡張子を取得できます。

```ruby
require 'ffi'
p FFI::Platform::LIBSUFFIX
# dll   : Windows
# dylib : macOS
# so    : Ubuntu
```

### RbConfig::CONFIG['SOEXT']

Fiddleを利用する場合は、`RbConfig::CONFIG['SOEXT']` で共有ライブラリの拡張子を取得できます。これは Ruby 2.5以上が必要です。しかし、すでにRuby2.4はRubyの公式サポートから外れていますので、これから新規作成するライブラリでは気にせずに使ってよいと思います。

```ruby
p RbConfig::CONFIG['SOEXT']
# dll   : windows
# dylib : macOS
# so    : Ubuntu
```

便利ですね。これを使えば、下記のようにすることで、不要な`case`分岐を回避できます。

```ruby
lib_name = "libssw.#{RbConfig::CONFIG["SOEXT"]}"
```

この記事は以上です。
【Google Cloud Day'21】「アジリティの高いデータ利活用 〜Looker で実現するデータの民主化〜」を視聴して

アジリティの高いデータ利活用 〜Looker で実現するデータの民主化〜
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-da-06
誰もが今あるデータを最大限に活用できる Google Cloud スマートアナリティクス ソリューションについて解説します。また、LookML を使用し、どのように柔軟かつガバナンスの効いたデータ分析環境の構築が実現できるのかデモを交えてご紹介します。

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>IAMの情報と連携して表示制御をすることは可能でしょうか？</th>
		<td>Google Cloud蓮池です。SAML認証でシングルサインオンを実装することでIAMの情報をもとに表示制御をすることが可能です。</td>
	</tr>
	<tr>
		<th>Google CloudのデータカタログとLookerのデータディクショナリーはどのように使い分けるのでしょうか？</th>
		<td>Lookerのデータディ区処なりはテーブルの定義だけでなく集計値の定義も含むことができます。また、Lookerはマルチクラウドに対応しているので、Google Cloud外にあるデータソースへもアクセスしている場合に、これらも含めて定義を１箇所で管理、公開していくことが可能です。</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>データを活用する際の課題</th>
		<td></td>
	</tr>
	<tr>
		<th>実現方法</th>
		<td></td>
	</tr>
	<tr>
		<th>データの言語の統一</th>
		<td></td>
	</tr>
	<tr>
		<th>デモ</th>
		<td>編集画面のデモが見れる</td>
	</tr>
	<tr>
		<th>アクセス制御について</th>
		<td></td>
	</tr>
	<tr>
		<th>わかりやすいデータキュレーション</th>
		<td>コミュニケーションツールやSNSに画面を表示させたり、画面に常に表示させたりできるので、業務フローの中に無理やり入れ込まずに済む。データディクショナリというものを使うと、検索するのが簡単になり、分析について新たに勉強したりという必要がなくなる。</td>
	</tr>
	<tr>
		<th>まとめ</th>
		<td></td>
	</tr>
</table>

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/09b94760-78ca-4e21-4118-3a64bb2d8c6e.png)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/c681fc01-b6d4-daad-b91d-d517be1ca5fe.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/d25864dc-dbc9-de51-866f-4dd192438cec.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/087f2392-67b2-03b5-bedb-dd4285f92523.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/ea7aee34-a17e-14a2-4927-579fb53ca880.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/3f96fd57-d1f2-567d-3921-a326354fd6be.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/0272e95f-83ee-b6b8-225a-28ea0f69da93.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/5346e69f-4e89-237f-19e2-7f24f94bd6a9.png)
循环js中的object

for(var propt in obj){
console.log(obj[propt]);
console.log(propt);
//obj[propt].toString().includes(ContainsValue)
}


一个js做filtering的例子

       let filterItems =  [];
        for(let i=0;i<Fdata.length;i++){
            let obj = Fdata[i];
            for(var propt in obj){
                if( obj[propt]!=null && propt.toString().includes('Id')==false && obj[propt].toString().includes(ContainsValue)){
                    filterItems.push(obj);
                    break;
                }
            }
        }
ローカルだけでgit管理

# はじめに

論文書くのにバージョン管理したくて、でもgithubとかにアップロードするのは何か間違えたら不安と思ってローカルだけでgitのバージョン管理する方法を調べた自分用備忘録です。

[こちら](https://creepfablic.site/2021/02/12/local-git/)をかなり参考にしていますというかこのサイトを見れば全部できます。

# 前提
- gitをインストール済み

# やること

リモートリポジトリになるフォルダを作ったうえで初期化コマンドを実行

```terminal
> mkdir test.git
> cd test.git
> git init --bare --shared
```

ローカル側のフォルダ(以下ではwork)でinit&リモートリポジトリの登録

```terminal
> cd work
> git init
> git remote add origin "C:/Users/aaaa/bbb/test.git"
```

あとはいつも通りのgitなので以下でpushできる

```terminal
> git status
> git add .
> git commit -m "first commit"
> git push origin master
```

ちなみにcloneもちゃんとできる

```terminal
> git clone C:/Users/aaaa/bbb/test.git
```

# おわりに

githubとか何か間違ってオープンアクセスにしたら研究成果盗まれたりしそうでこわいですね。自分の研究が盗まれるような成果が出せる研究かは謎ですが、、

# 参考

- [ローカルのみでgit 環境を構築し管理する | ハイパー猫背](https://creepfablic.site/2021/02/12/local-git/)
- [ローカル環境のみでリモートリポジトリを作成し履歴管理やブランチを切り替える](https://qiita.com/tom_eng_ltd/items/9784ce55eb643657e3ef)
VSCode+Pythonで未使用importがある場合、"問題"パネルに表示＋エディタ上で視認しやすくする

## 手順

※拡張機能としてPylanceが入っていることが前提

`Ctrl+Shift+P > ユーザ設定のJSONを開く（"基本設定： 設定（JSON）を開く" ）` 開いたJSONに下記を追加。

```
"python.analysis.diagnosticMode": "workspace",
"python.analysis.diagnosticSeverityOverrides": {
    "reportUnusedImport": "warning",
},
```

問題パネル上に未使用importがリストアップされるようになるので、そこから `右クリック > remove unused import` で消せる（エディタ上からも同様の操作で消せる）。

#### 備考

Pylanceの機能でlintしている。
詳細は拡張機能から Pylance を開いて、 `詳細 > "Setting and Cusomization" > "python.analysis.diagnosticSeverityOverrides"` 部分を参照。
※説明の近くにある here リンクを押すと他にどういうルールがあるか分かる

#### 余談

保存時に自動で未使用importを削除したいっていう話になると思うけど、無理っぽい？

[autoflake](https://pypi.org/project/autoflake/) を `pip install` することで、コマンドラインからコマンド実行で自動削除することは可能。

また、autoflake インストール後、VSCodeの拡張機能の Autoflake を入れることで、Ctrl+Shift+P から、`Remove unused imports` 出来るようになる。
※自動で消してくれるわけではないので注意。
※venv上で実行する場合、 `autoflake.path`のパスを合わせないと autoflakeのコマンド実行に失敗するので注意
[Unity] マウス座標の方向にRayを飛ばして衝突した座標を得る方法　

######説明
マウスポインタ座標の方向にレイを飛ばして当たった座標を得るコードです。



```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class moveControl : MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
         if (Physics.Raycast(ray, out hit, 10.0f))
         {
              Debug.Log(hit.point);
         }
    }
 

}

```
対戦ゲームを作る。

#概要

対戦ゲームを作る。
構想編。

#方針

アプリの保管場所は、plunker
サーバーは、enebularでnode-redでherokuapp
プロトコルは、websocket
フロントは、vue
エンジンは、tateno、jquery
ゲームは、オセロ。

#役割

|機能|クライアントアプリ|サーバーアプリ|
|:--|:--|:--|
|クリックを検出して、指せるか確認して、データを送る。|○|×|
|データを受信して、指せるか確認して、置く。|○|×|
|終了を確認する。|○|×|
|通信|×|○|

#やらない事

- 何人ログインしてるか。
- 勝ち負けの判定。
- 順番を仕切る。

#通信データ

jsonです。

id: ユニークなIDを持ちます。
state:　現在の状態を指します。待機中、ゲーム中、終了など。
data:　8*8の盤の状態と次の一手。

```
{ id: 1234, state: 0, data: [] }
```


#クライアントAとB、サーバーSの通信イメージ

イべント

- Aがlogin
- Bがlogin
- Aが先手を打つ
- Bが打つ


```plantuml
A -> S: login
A <-- S: pub
B -> S: login
B <-- S: pub
A <-- S: pub
==login==
A -> S: send
A <-- S: pub
B <-- S: pub
==sente==
B -> S: send
B <-- S: pub
A <-- S: pub
==gote==
```


以上。
PostgreSQL: 権限を確認するSQL

PostgreSQLでどのロールがどのテーブルで何が許可されているかの権限を確認するSQLです。

```sql
select grantee, table_name, privilege_type
from information_schema.role_table_grants
where table_schema = 'public' order by grantee, table_name, privilege_type;
```

実行結果の例

![CleanShot 2021-07-14 at 10.31.31@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/47bbe47a-97ac-102a-ed33-8dccb0fec8d8.png)

カラム単位の細かい権限の確認したい場合は、次の記事で紹介する方法をご覧ください。

https://qiita.com/suin/items/62fc7db7c1c46d893684
PostgreSQL: デフォルトの権限を確認するSQL

PostgreSQLでデフォルトの権限設定がどうなっているか確認するSQLです。

```sql
SELECT rolname   as owner,
       nspname   as schema,
       case defaclobjtype
           when 'r' then 'table'
           when 'S' then 'sequence'
           when 'f' then 'function'
           when 'T' then 'type'
           when 'n' then 'schema'
           else 'other'
           end   as type,
       defaclacl as access_privileges
FROM pg_default_acl acl
         JOIN pg_namespace ON acl.defaclnamespace = pg_namespace.oid
         JOIN pg_authid on acl.defaclrole = pg_authid.oid
order by owner, schema, type
;
```

実行結果の例:

![CleanShot 2021-07-14 at 10.16.29@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/07db9a02-04f9-65bc-26f9-ac0ebbd6d629.png)

```
      rolename=xxxx -- privileges granted to a role
              =xxxx -- privileges granted to PUBLIC

                  r -- SELECT ("read")
                  w -- UPDATE ("write")
                  a -- INSERT ("append")
                  d -- DELETE
                  x -- REFERENCES
                  t -- TRIGGER
                  X -- EXECUTE
                  U -- USAGE
                  C -- CREATE
                  c -- CONNECT
                  T -- TEMPORARY
             arwdxt -- ALL PRIVILEGES (for tables)
                  * -- grant option for preceding privilege

              /yyyy -- role that granted this privilege
```
DatabricksのPythonにてDBFS上に変数の値をファイルとして保存する方法

## 概要
DatabricksのPythonにてDBFS上に変数の値をファイルとして保存する方法を2つ紹介します。

1. dbutilsを利用する方法
1. PythonのOpenを利用する方法

詳細は下記のGithub pagesのページをご確認ください。

https://manabian-.github.io/databricks_tecks_for_qiita/#put_file_to_dbfs/put_file_to_dbfs.html


コードを実行したい方は、下記のdbcファイルを取り込んでください。

```python
https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/put_file_to_dbfs/dbc/put_file_to_dbfs.dbc
```

## 実施手順
### 1. dbutilsを利用する方法

```python
file_path = f'{file_dir}/dbutils/test.csv'
 
# データを定義
csv_data = """
string,value,date
"A","100","2021-02-01"
"B","2"00","2021-02-01"
"C","3,00","2021-02-01"
"D","400","2021-02-01"
""".strip() # strip関数により最初と最後の改行を削除

# dbfs上にファイルを保存
dbutils.fs.put(file_path, csv_data, overwrite=True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/15aa4e4a-6f47-89af-f44c-356d268d96de.png)


### 2. PythonのOpenを利用する方法

```python
# pythonでdbfsに書き込む場合には`/dbfs`直下に配置
file_path = f'/dbfs/{file_dir}/test.csv'
 
# データを定義
csv_data = """
string,value,date
"A","100","2021-02-01"
"B","2"00","2021-02-01"
"C","3,00","2021-02-01"
"D","400","2021-02-01"
""".strip() # strip関数により最初と最後の改行を削除

with open(file_path, 'w') as f:
    print("---書き込み開始---") 
    f.writelines(csv_data)
    print("---書き込み完了---")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d5000dd4-6518-bd7d-e12c-fdcb899ea2b8.png)
Eventを送信で色々動かしてみよう

こないだFileMakerでインポートが何故かできない事例が発生。
共有ファイルにエクスポートはできるのにインポートができない。
時間もない。あーーーーーーーーーーーーーーー。
と頭を抱えていました。
できないことを一生懸命に頑張る必要ないじゃないか。←

FileMakerにはEventを送信スクリプトがあるのです。
コマンドプロンプトで取得したらいいんじゃない？と考えました。
早速テスト。


```
cmd /c type C:\Users\^^^^^\Desktop\TEST.csv |clip
```

Eventを送信したらなんと中のデータがクリップボードに。

あとはこれをオブジェクトフィールドに貼り付けて

```
TextEncode ( TEST::obj ; "utf-8" ; 1 )
```

これをしたのちにフィールド内容のエクスポートをすれば、あら不思議。
任意の場所にエクスポートが出来ました。

あとは煮るなり焼くなり。

コマンドプロンプトって何でもありか。
すげぇ。ってなった話でした。

オブジェクトフィールドにテキストはめてエクスポートするやり方
結構みんな使ってないみたい。
使ってみて。結構便利。
CSVのフォーマットで1行目と２行目で違うときとかこういうので全然対応できちゃう。

ではでは。
gormとタグの指定

# 概要

Go言語にて、gormを利用してみました。
構造体を利用してORマッピングを行うことができます。

gormでのモデルの宣言は以下。

``` golang
import (
   "gorm.io/gorm"
)

type User struct {
   gorm.Model
   Name string
}
```

gorm.Modelをフィールドに持つことで、自動的に
```created_at```,```updated_at```,```deleted_at```,```id```フィールドを付与してくれます。この場合、主キーは自動的に```id```になります。

## タグでの指定
データベースの構造に対応して、各フィールドの設定を変更したい場合、タグを利用します。

``` golang
type User struct {
	gorm.Model
	ID           int      `gorm:"column:_id"`
	Name        string    `gorm:"primaryKey column:user_name"`
}
```

上記のようにタグで指定してあげれば、主キーはNameに設定され、db内では```user_name```フィールドとして保存されます。

えばAUTO_INCREMENTで付与されたフィールドの値をIDとして利用する場合、

```
u := &User{
   Name: "user"
}
result := db.Create(u)
print(u.ID) // AUTO_INCREMENTされた値
```

u.IDにdb側でレコード作成時に付与された値が格納されますが、
IDにprimarykeyの指定を忘れると、構造体のデフォルト値の0が帰ってきてしまうので注意が必要です。
let と const を使い分けよう

▪️ letとは
今後変わる予定の値に定義する場合に使う

▪️ constとは
今後変わる予定のない値に定義する場合に使う

letとconstはこのような違いがありますが、結論どちらを使っても処理は変わりません。では、なぜletとconstを使い分けなければいけないのか？
これには明確の理由があります。

”一人でコードを書く際はletとconstを使い分ける必要はありませんが、企業に属した場合チームで開発することは避けて通れません。”
そこでコードを書く際にletだけで統一したり、constでけで統一してコードを書くと他の人が見たときにこれは今後変更する値なのか、変更しない値なのか瞬時に読み取れません。だから、他の人が瞬時に読み取れるようにするためにもletとconstは使い分ける必要があります。

▪️ おまけ
varという定義もありますが、あまり使わない定義なので覚えなくても良いそうです。
独学プログラマーのまとめ　その1

#初めに
自身の学んだことのアウトプットとしてQiitaに記事を書くことにしました。

備忘録としてまとめていきますが、自分なりにわかりやすく整理していきたいです。

##独学プログラマー

独学プログラマー　Python言語の基本から仕事のやり方まで
コーリー・アルソフ　著　清水川貴之　監訳　

参考書として上記の本を選びました。
python言語の基礎知識から、プログラミング全般を広く学べる本とのことでおすすめされていました。

##第1部
初めての投稿なので1章だけ。
全体として、用語集やチャレンジ問題があるので知識の整理がしやすい。

###1章　イントロダクション

- 大事なところから学ぶ
   - 理論から学ぶのではなく、実際に動かしてみてから必要だと思った理論を学ぶほうが効率よく学べる。
- 断固として継続しよう
   - スキルが上達しない唯一の原因は継続して練習しないこと

以上の２点は特に心に留めておく。

# まとめ
アウトプットの大切さは著者の清水川さんの記事でも強調されているのでこれを継続する。
[独学プログラマー](https://type.jp/et/feature/6678/)
コマンドのみでIPアドレスを見つけてssh接続する方法（Windows）

# はじめに

今日はかなりニッチな記事を書きました。
ping attack（ディスプレイ出力できないものの見つけ方）と名付けています（他人に迷惑をかける方法ではありません）。


# 何をしたいか

PC_2 がディスプレイ接続できない時、PC_1 から ```ping``` を自動実行して PC_2 のIPアドレスを取得し、PC_1 から PC_2 に ssh 接続をすることを考えます。

* 登場機器
    * PC_1（PC_2 に ssh する）
    * PC_2（ディスプレイ接続できない）
    * ルーター

### 手順

1. PC_1、 PC_2 を同じネットワーク下に接続する（ルーター経由で接続するなど）
2. PC_1 で```ifconfig``` を実行して、IPアドレスを確認する
3. PC_1 で```ping <IPアドレス>``` を実行する
4. PC_1 で cmdファイル を作成する
5. PC_1 のコマンドプロンプトで cmdファイル を自動実行する（ping attack）
6. 4. が完了したら、```arp -a```コマンドを実行して、IPアドレスとMACアドレスを取得する
7. ssh 接続する

以下で、手順の詳細を説明していきます。

# 同じネットワーク下に接続

これは説明不要かと思います。

# ```ifconfig``` を実行して、IPアドレスを確認

PC_1 で ```ifconfig``` を実行します。

```bash
$ ifconfig
# en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
# 	options=400<CHANNEL_IO>
# 	ether aa:aa:aa:aa:aa:aa
# 	inet6 aaaa::aa:aaaa:aaaa:aaaa%en0 prefixlen 64 secured scopeid 0x6
# 	inet 100.100.100.3 netmask 0xffffff00 broadcast 100.100.100.255
# 	nd6 options=201<PERFORMNUD,DAD>
# 	media: autoselect
# 	status: active
```

PC_1 のIPアドレスは```100.100.100.3```であることがわかります。
PC_2 のIPアドレスは```100.100.100.2``` ~ ```100.100.100.254```の間に割り当てられている可能性があることが分かります。


# ```ping <IPアドレス>``` を実行

PC_1 で ```ping 100.100.100.2``` を実行します。
正しいIPアドレスに ping を実行すると、MACアドレスを取得できます。

```bash
$ ping 100.100.100.2
# PING 100.100.100.2 (100.100.100.2): 56 data bytes
# Request timeout for icmp_seq 0
# ...
```

timeout が発生しているので、このIPアドレスではないことが分かります。
これを ```100.100.100.254``` まで手動で実行してもいいのですが、さすがにそこまで暇ではありません。

そこで、cmdファイルを作成して、コマンドプロンプト で自動実行していきます。


# cmdファイルを作成

PC_1 で、```ping_attack.cmd```ファイルを作成して、```ping 100.100.100.2``` ~ ```ping 100.100.100.254```を記載して保存します。

これも手作業でやるのは大変なので、プログラムで作成するとかExcelで作成するなど工夫して作成してください。

```cmd:ping_attack.cmd
ping 100.100.100.2
ping 100.100.100.3
ping 100.100.100.4
...
ping 100.100.100.252
ping 100.100.100.253
ping 100.100.100.254
```


# コマンドプロンプトで cmdファイル を自動実行

PC_1 で、先ほど作成した ```ping_attack.cmd```ファイルを実行します。

```bash
$ ping_attack.cmd
```

かなり時間がかかるかと思いますが、別の作業をしていればいいので手間はかかりません。


# ```arp -a```コマンドを実行

PC_1 で、```arp -a```を実行します。

```
$ arp -a
```

ping コマンドで通信ができた場合、IPアドレスとMACアドレスが取得できます。

# ssh 接続

Windows なので tera term などを使用して、ssh 接続をしてください。

# まとめ

かなりニッチな状況ですのでPVは稼げないとは思いますが、自分で編み出した方法なのでまとめてみました。
力技で全くスマートではありませんが、どなたかの役に立てばなと思います。

もっといい方法があるよーという方がいれば教えてください。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
非IT分野出身者がQiita活用してみた


#はじめに
タイトルの通り、著者は入社するまで全くの別分野で研究をしていました。
（畑でチョウチョウを追いかけてました）
Qiitaを活用し始めたのは入社後で、受信発信双方で大変お世話になっています。

私は以下の記事で初めてQiitaに投稿しました。
[Pythonで手軽に始めるWebスクレイピング](https://qiita.com/Moh_no/items/a835f77b6b4e3972fbbe)
Qiitaを利用するだけで、自分から発信に使う人は初学者だと少ないと思われます。
そこで本記事では、投稿のハードルを下げることを目的として、**新入社員がQiita参加で得られた具体的なメリット**を紹介します。

私同様に、入社を機にIT分野に飛び込んだそこの貴方に役立ちたい！ そんな記事です。


##新入社員がQiita参加で得られた具体的なメリット

###自分の知識を整理する公開メモ帳
IT分野では、蓄えた知識をメモ帳やノートに書き殴っている人が多いかと思います。
気づいたこと、新たな知識、覚えておきたいURLなど、おそらく皆さん自分用のチートシートがあるでしょう。
それをまとめて記事化すれば、その題材について体系的に整理して、自分の力にできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652177/52c3080e-2443-19a9-c190-19af154e8ba6.png)

体験談ですが、久々に関わる業務について、技術をQiitaにまとめてあったかどうかで大きな差がありました。
雑多なメモの山よりも、他人に見せるために書いた記事の方が圧倒的に理解と取り掛かりが早いです。


###スムーズなノウハウ共有

社内外問わずに、自分の持っているスキルを興味を持った人に共有できることがQiitaの強みです。
私の体験談として、使っている技術の共有にQiitaを使うとスムーズに事が運びました。
例：業務の引き継ぎ、先にコア技術だけQiitaで共有しておく。


###「スキルの見える化」で評価につながる

**「何ができるかよくわからない人」**から**「こういう技術を持っている〇〇さん」**へ
特に新入社員だと、自分が何ができるかをアピールすることは大事です。
自己アピールの一環として、Qiitaの記事は広く活用できました。

###バズると嬉しい

**LGTM (いいね) の通知には中毒性がある**
参考論文：Sherman, L. E., Payton, A. A., Hernandez, L. M., Greenfield, P. M., & Dapretto, M. (2016). The power of the like in adolescence: Effects of peer influence on neural and behavioral responses to social media. Psychological science, 27(7), 1027-1035.


#おわりに
Qiitaは、初めてでも参入障壁の低い、プログラミングや開発者中心の情報共有プラットフォームです。
IT分野のバックグラウンドを持たない未経験エンジニアなどの最初の一歩に最適ですので、一緒に知のネットワークを広げていきましょう！
LoadErrorでrails sやbundleが使えない時

久しぶりの投稿となります。

# LoadError~

bundle install　を行なったとき以下のエラーが発生しました。

```
LoadError: dlopen(/Users/taniguroarata/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/rmagick-4.2.2/lib/RMagick2.bundle, 9): Library not loaded: /usr/local/opt/imagemagick/lib/libMagickCore-7.Q16HDRI.8.dylib
  Referenced from: /Users/taniguroarata/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/rmagick-4.2.2/lib/RMagick2.bundle
  Reason: image not found - /Users/taniguroarata/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/rmagick-4.2.2/lib/RMagick2.bundle
/Users/taniguroarata/originalapp/archtips/config/application.rb:19:in `<main>'
/Users/taniguroarata/originalapp/archtips/Rakefile:4:in `<main>'
/Users/taniguroarata/originalapp/archtips/bin/rails:9:in `<top (required)>'
/Users/taniguroarata/originalapp/archtips/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

```

このエラーによって、bundle~及びrails s　が起動しませんでした。

# 確認

このエラーはrmagicがImagemagicのバージョン7
に対応していないことが原因です。

Imagemagicのバージョンを確認してみましょう。

```
$ ls -al /usr/local/bin/convert

lrwxr-xr-x  1 taniguroarata  admin  45  7 13 09:10 /usr/local/bin/convert -> ../Cellar/imagemagick7.1.0-2_1/bin/convert
```

../Cellar/imagemagick/7~　となっていたらバージョンを６まで下げる必要があります。

# 修正

Imagemagic６のバージョンを下げ、Imagemagic6をリンクします。

```html
#imagemagic@6のインストール
$ brew install imagemagick@6

#linkを外す
$ brew unlink imagemagick

#imagemagic6をリンクする
$ brew link --force imagemagick@6
```

以上を実行したらImagemagicのバージョンが変更されているか確認します。

```html
$ ls -al /usr/local/bin/convert

../Cellar/imagemagick@6/6.9.12-17/bin/convert
```

Cellar/Imagemagick@6となっていたら成功です。

しかし、この状態でrails sしてもエラーが解決されない場合があります。

その場合は

```html
$ gem pristin rmagick
```

再度、rails s　で起動しました。

##参考

[rmagickで詰まった話](https://tech-essentials.work/course_outputs/196)

[bundle installがrmagickでインストールできないのがImagemagick 7が原因の件 ](https://www.tweeeety.blog/entry/2018/03/24/003104)

[RMagickとImageMagickのエラー](https://step.codebot.io/courses/46)
Databricksジョブによる複数タスクのオーケストレーション

[Now in Databricks: Orchestrate Multiple Tasks Within a Databricks Jobs \- The Databricks Blog](https://databricks.com/blog/2021/07/13/announcement-orchestrating-multiple-tasks-with-databricks-jobs-public-preview.html)の翻訳です。

> 詳細は[ドキュメント](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)で確認できます。

ビジネスインテリジェンス(BI)や人工知能(AI)により一層取り組む企業においては、シンプル、明確かつ信頼性のあるデータ処理タスクのオーケストレーションのニーズが高まります。これまでは、Databricksユーザーはこれらのタスクすべてを一つのノートブックで実行するか、他のワークフローツールを用いることで環境の複雑性を増加させるかを選択しなくてはなりませんでした。

本日(2021/7/13)、Databricksのジョブにおいて、パブリックプレビューとしてタスクのオーケストレーションをサポートしたことを嬉しく思います。これによって、有向非巡回グラフ(DAG)を用いて複数のタスクを実行することができます。ジョブは、インタラクティブ性を必要としないアプリケーションをDatabricksクラスターで実行する方法です。例えば、即時実行したいETLジョブやデータ分析タスク、スケジュールジョブを実行できます。ジョブにおいて複数のタスクをオーケストレートする機能は、追加コストなしにデータや機械学習ワークフローの作成、管理、モニタリングをシンプルなものにします。新機能のメリットには以下のようなものが含まれます：

**シンプルなタスクオーケストレーション**
今や、誰でもDatabricksのUI、APIを用いてDAGで容易にタスクをオーケストレートすることができます。これによって、データサイエンティストやアナリストが自身でジョブを構築、モニタリングでき、キーとなるAI、MLの取り組みを容易に進められるので、データチームの負荷を軽減できます。以下の例では、推薦を行う機械学習モデルのトレーニングを行う7つのノートブックを実行するジョブを示しています。
![](https://databricks.com/wp-content/uploads/2021/07/task-orch-blog-img-1.png)

**どこでも何でもオーケストレーション**
ジョブオーケストレーションはDatabricksに完全に統合されており、追加のインフラストラクチャやDevOpsのリソースは不要です。ユーザーはJobs APIあるいはUIを使ってジョブやメールによるアラートなどの機能を作成・管理することができます。データチームは、この機能を利用するために新たなスキルを学ぶ必要はありません。この機能によって、Databricks外のものであってもAPIさえ公開しているものであれば何でも(例えば、CRMからデータを取得)オーケストレートすることができます。

**次のステップ**
タスクオーケストレーションは7/13以降、パブリックプレビューとしてすべてのDatabricksワークスペースでロールアウトされます。以降数ヶ月で、ジョブ内のタスクでのクラスターの再利用、以前処理に失敗したタスクのみを実行するDAGの再起動をサポートする予定です。

Databricksジョブにおけるタスクのオーケストレーションと複数タスクに関しては[ドキュメント](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)を参照ください。そして、Admin consoleで**Task orchestration in Jobs**有効化することで、本機能を無料で利用できます。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
vimで挿入モードからノーマルモードへの移行が遅い件

# 解決したいこと

tmuxを使っている環境でvimを使うと、
挿入モードからノーマルモードへの移行がモッサりしていた。

特に補完候補が出ているときにノーマルモードに移行しようとすると問題で、
2回に1回はノーマルモードへの移行が失敗して、"jjjjj"みたいな挿入したくない文字を打ち込んでしまう。

結論としては、50msのESC判定時間を設けることで解決した。

# 問題の原因と解決策

ググると下記記事がヒットして、問題は解決した。
tmuxがESCキーを判定するためにデフォルト500ms待つ設定になっていて、それがモッサリの原因だった。

[Vimメモ : Vim + tmuxだと<Esc>でのノーマルモード移行が遅い](https://wonderwall.hatenablog.com/entry/2016/03/13/143024)

tmux.confにタイムアウト0msを指定すればよいとのこと。

```vim
set escape-time 0
```

## 0msは有害というツイートも検索でヒットしたため調査すると...

下記スタックオーバーフローの記事に注意点が記載されていた。
[.tmux.conf の escape-time について](https://ja.stackoverflow.com/questions/24312/tmux-conf-%E3%81%AE-escape-time-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

> 端末によってはM-Aというキーの組み合わせがESC+Aとしてプロセスに送られるってことです。プロセスからはユーザがESCとAを連続して押したのかM-Aを押したのか原理的には区別できないので、ディレイを見て区別する

ウェイト0msという設定をすると、
Metaキーが使えなくなる環境もあるようなので、50msにしておいた。(私の体感では問題なしだった)

```vim
set escape-time 50
```
リソースの拡張子を指定してフィルター

いろいろ試行錯誤した結果こんな感じで書くのが一番綺麗かもしれない
例 ymlのトークンを置き換える場合

```gradle:build.gradle
import org.apache.tools.ant.filters.ReplaceTokens

processResources {
    from sourceSets.main.resources.srcDirs
    filesMatching('**/*.yml') {
        filter ReplaceTokens, tokens: [version: version]
    }
}
```

いったん全部を取り込んでからfilesMatchingでファイルを指定してフィルターにかけるのがしっくり来た
DenoのreplでTypeScriptが入力可能に！

Deno 1.12.0では多数の機能が追加されましたが、ここではrepl周りの新機能を取り上げたいと思います。
[Deno 1.12.0 リリースノート](https://deno.com/blog/v1.12)

## TypeScriptが入力可能になった

TypeScriptの入力が可能になりました🎉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/9eff1d88-a6b0-d230-45b0-57dcfb148e78.png)

なお、型チェックは適用されません。この理由については、
> https://github.com/denoland/deno/issues/11078
>REPLは迅速なフィードバックループ用であり、型チェックは実行時間と邪魔な診断を追加するだけです。

とのことです。

## tab補完の一覧表示が追加された

tabキーでの補完が一覧表示されるようになりました。
例えば、`JSON.`まで入力した状態でtabキーを押すと、補完が一覧表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/17bfe096-2df4-2a82-c7b0-e80919cb4015.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/b0c4a0f4-f0af-d642-e08c-cbc41b34fbcb.png)

従来は一覧表示ではなく、一つずつ順番に表示されていました。
関係ないですが、上に写っている`Array.prototype.at()`もDeno 1.12.0で導入されました。

## `console.log`の出力がdevtoolsコンソールにも表示されるようになった

denoのreplでは、起動時に`--inspect`オプションを渡すことでChromeなどのdevtoolを利用することができます。（[参考](https://qiita.com/access3151fq/items/3fae7658deb559caea37)）

これまで、`console.log()`の出力はターミナルのみに出力され、devtoolのコンソールには出力されないという問題がありました。

Deno 1.12.0ではこの状況が改善され、`console.log()`で出力したメッセージがdevtool側にも表示されるようになりました。

## import文が利用可能になった

これまでreplではimport文が使えませんでしたが、Deno 1.12.0からimport文が利用可能になりました。

```js
// これまで
const {delay} = await import('https://deno.land/std@0.101.0/async/mod.ts')
// これから
import {delay} from 'https://deno.land/std@0.101.0/async/mod.ts'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/a0c87651-b377-e118-1ff9-28eaf296da4c.png)

動的importに書き直すのが面倒だったので、地味にうれしい変更ですね。

以上です。

この記事ではrepl関連に限って紹介しましたが、テスターやcrypto API、Workerなどに多数の新機能が追加されています。詳しい内容は[Deno 1.12.0 リリースノート](https://deno.com/blog/v1.12)へどうぞ！
AtCoderログ：0017 - ABC 069 B

# 問題：[ABC 069 B - i18n](https://atcoder.jp/contests/abc069/tasks/abc069_b) ([AtCoder に登録したら次にやること 第02問類題](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-2-%E5%95%8F--abc-081-a---placing-marbles-100-%E7%82%B9))

## 問題文
> internationalization という英単語は、i18n と略されることがあります。 これは、先頭文字 i と末尾文字 n の間に $18$ 文字が挟まっていることに由来します。
> 長さ $3$ 以上の英小文字のみからなる文字列 $s$ が与えられます。 同様の規則によって $s$ を略してください。

## 制約
> ・$3 \le |s| \le 100$  (ただし、$|s|$  は $s$ の長さを表す。)
> ・$s$ は英小文字のみからなる。

# 回答 (AC)

文字列 $s$ を変数 s で受け取り、(最初の文字) + (文字列の文字数-2) + (最後の文字) を出力すれば良いでしょう。なお、文字列を変数 s で受け取るとき、最初の文字は s.at(0), 文字数は s.size(), 最後の文字は s.at(s.size()-1) と表せます。

```C++:abc069b.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string s;
  cin >> s;
 
  cout << s.at(0) << s.size()-2 << s.at(s.size()-1) << endl;
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc069/tasks/abc069_b/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/arc080/editorial.pdf)
回答と同じ方針でした。

# 学んだこと
- 文字列の参照 (a.at(*))

# リンク
- 前の記事 → [AtCoderログ：0016 - ABC 209 C](https://qiita.com/RoadLynton/items/2463043b53f5ac24e044)
- 次の記事 → [AtCoderログ：0018 - ABC 082 B](https://qiita.com/RoadLynton/items/173226fefd9da60f0c8c)
plunkerでvue その49

#概要

plunkerでvueやってみた。
a-frame、やってみた。

#サンプルコード


```
    <div id="app">
      <div>
        ■v-ifとv-else　プロパティの真偽値による表示切り替え
        <p v-if="toggle">真偽値：true</p>
        <p v-else=>真偽値：false</p>
        <br>
        <button v-on:click="toggleBtn">toggle</button> 
      </div>
      <hr>
      <div>
        ■入力した数値の大きさにより表示を切り替え
        <p><input type="text" v-model="number"></p>
        <p v-if="number >= 5">入力値は５より：大きい</p>
        <p v-else>入力値は５より：小さい</p>
      </div>
      <hr>
      <div>
        ■複数の条件分岐
        <p><input type="text" v-model="number"></p>
        <p v-if="number == 1">入力値：1</p>
        <p v-else-if="number == 2">入力値：2</p>
        <p v-else-if="number == 3">入力値：3</p>
        <p v-else-if="number == 4">入力値：4</p>
        <p v-else-if="number == 5">入力値：5</p>
        <p v-else>入力値：整数の１〜５以外</p> 
     </div>
     <hr>
     <div>
        ■v-showによる表示・非表示の切り替え
        <p v-show="toggle">真偽値はtrue</p>
        <br>
        <button v-on:click="toggleBtn">toggle</button> 
      </div>
      <hr>
      <div>
        <input v-model="state">
        <p v-if="state == 'b'">信号は青色です</p>
        <p v-else-if="state == 'y'">信号は黄色です</p>
        <p v-else-if="state == 'r'" v-on="stateAlert()">信号は赤色です</p>
        <p v-else>「 b , y , r 」のいずれかを入力して下さい。</p>
      </div>
      <div>
        <p v-if="!toggle">
    <a-scene>
			<a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9" shadow></a-box>
			<a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E" shadow></a-sphere>
			<a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D" shadow></a-cylinder>
			<a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4" shadow></a-plane>
		</a-scene>
        </p>
      </div>
  </div>

```

#成果物

https://embed.plnkr.co/plunk/PGmHhQ2yMCVtsYlO

以上。
【備忘録】java基礎のおさらい① 形式編

<h1>java基礎のおさらい</h1>
<h2>はじめに</h2>
<p>何かの間違いで、この記事を見つけてしまった初学者の方へ<br>
これは私が私のためにわかりやすくまとめたものであって,<br>
当方、生後1か月未満のエンジニアのため、もしかしたら違う解釈をしている可能性があるので、あまり本気で参考にするのは控えたほうがよろしいかと思いますっていう<strong>忠告</strong>です。<br>
あと大体理解したつもりだったのですが、どうやらまだまだ全然くそったれだったのでシリーズ化とします。</p>

<h2>java 基本的なルール</h2>

<h3>命名のルール</h3>
<ul>
<li>変数名：例） sampleApple
<p>最初は小文字、二単語の組み合わせなら単語の初めから大文字</p></li>
<li>クラス：例）SampleApple
<p>最初とつなぎ目だけ大文字</p></li>
<li>定数：例）SAMPLE_APPLE
<p>全部大文字</p></li>
</ul>

<h3>修飾子のルール</h3>
<ul>
<li>public：どこからでもアクセス可能</li>
<li>private：同じクラス内のみアクセス可能</li>
<li>protected：サブクラス、同じパッケージ内ならアクセス可能</li>
<li>なし：同じパッケージ内からアクセス可能</li>
</ul>

<h2>3項演算子</h2>

````````````
例)int c;
if(a>b){
c = a;
} else {
c = b; }
````````````


<p>が</p>


````````````
int c = a>b ? a: b;
````````````


<p>の一文で済むようになる</p>

<h2>javaのざっくりとした書き方</h2>
<p>System.out.plintlnはめんどくさいので<strong>sysout</strong>と略してます。</p>


<h3>引数だけの形式</h3>
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144247/59aadd49-dd8b-f585-d464-a5d08e05f2d2.png">



<p>戻り値がないときは、void</p>





<h3>戻り値だけの形式</h3>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144247/8e776694-e164-2e84-ce1b-59f97f702b0a.png")

<p><br>・戻り値の型をつける<br>
・戻り値があるときは「return」<br>
・メインの方で実行する。

</p>

<h3>引数+戻り値の形式</h3>
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144247/acae48fc-dc5b-6bb1-877e-215bc64b8cb4.png)


<h3>引数が配列、戻り値ありの形式</h3>
![スクリーンショット (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144247/85f18f93-f41a-620f-3a6c-2c5a7f952ac9.png)

<p>・引数名[0]で要素の一番目を持ってこれる</p>



<h3>別クラスからのオブジェクト生成での形式</h3>
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144247/e0e1383c-149f-edd9-8093-9409089fc52c.png)
<p>・オブジェクト名は何でもいい</p>




<h3>引数列が他クラスからの参照の形式</h3>
![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144247/9a9987e3-0d33-0ab1-3c0d-89a476dd8d8e.png)
<p>☆マークはオブジェクトの生成ですね。</p>




<h3>配列込みの引数列が他クラスからの参照の形式</h3>
![スクリーンショット (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1144247/d2bc2b5d-df3b-d89d-fb1f-e50f0f5afd06.png)


<h3>クラス②で「this」を使う理由</h3>
<p>そのままだと引数名はローカル（下のメソッドでの引数名）が優先され、自分の引数名に自分の引数名を入れる謎現象が起きるので、「this」をつけることで、区別をつける。</p>

<br>
<br>
<br>
<br><p>まだまだ長くなりそうなのでこの辺で形式編①を終わります。
個々の認識間違ってるよとのご指摘是非お持ちしてます。</p>
テストplantuml


#概要

qiitaで、platumlのテスト。

#参考にしたページ

https://qiita.com/namari/items/290d7b39fe63a71337e3


#結果


```plantuml
@startuml くじ引きで席替え
title くじ引きで席替え
start
start
partition くじ引き(全員) {
    ' クラスの定義
    note left
        = 定義
        ====
        === クラス
        * 人数　　　　 : 18人
        * 出席番号　　 : 0~17
        * 前の席希望者 : n人(複数可)
        ----
        === くじ
        * くじ　　 : 18個
        * 順番　　 : 小→大
        * 席番号　 : 0~17(min~max)
        ** 希望者 : 0~(n-1)
        ** その他 : n~17
        * 使用状況
        ** 未使用[-] : false
        ** 使用済[×] : true
    end note

    repeat: 箱もらう;
      partition くじ引き(個人) {

        note left
            = 判断処理_A
            ====
            * 未使用
            * min >= くじ番号
            * くじ番号 < max
        end note

        repeat: くじを引く;
          backward :箱に戻す;
        repeat while (判断処理_A) is (No) not (Yes)
        : ・くじに「×」をつける \n ・箱に戻す;
        :紙に「出席番号」「くじ番号」を書く;
      }
      backward :次の人に渡す;
    repeat while (出席番号が18以下) is (No) not (Yes)
}
end
@enduml
```

以上。
データブリックス(databricks)紹介動画

データブリックスは皆様に提供製品を知ってもらうために3分動画シリーズを公開しています。一部、私が声とイラストを担当しています。

データブリックスにようこそ
<iframe width="560" height="315" src="https://www.youtube.com/embed/thQ0KCLovGI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

3分でわかるレイクハウス
<iframe width="560" height="315" src="https://www.youtube.com/embed/HOCajKHsLwU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

3分でわかるワークスペース
<iframe width="560" height="315" src="https://www.youtube.com/embed/7fC6h46gC0s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

3分でわかるDelta Lake
<iframe width="560" height="315" src="https://www.youtube.com/embed/iTxQWuV0Uec" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

3分でわかるMLflow
<iframe width="560" height="315" src="https://www.youtube.com/embed/atPmj4pW4ao" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

3分でわかるDatabricks SQL
<iframe width="560" height="315" src="https://www.youtube.com/embed/6ABXeFwz4aM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
CSRFについて

# 目的
CSRFについて理解を深める。

# 目次

1. [はじめに](#はじめに)
1. [CSRFとは](#csrfとは)
1. [CSRFの対策](#csrfの対策)
1. [パスワードの再入力](#パスワードの再入力)
1. [リクエストへのトークン埋め込み](#リクエストへのトークン埋め込み)
1. [トークン](#トークン)

# はじめに

今回は、投稿やメールの送信、商品購入など、本来外部より実行されてはいけない重要な処理に対してのセキュリティ攻撃について理解を深めていきます！

# CSRFとは

`CSRF`とは、攻撃者がユーザーのログイン情報を盗み出すなど、正規利用者になりすましてリクエストを送る攻撃のこと指します。
なりすましのリクエストは不正なリクエストであり、この不正なリクエストを判別できないWebアプリケーションは、`CSRF`の脆弱性があると言えます。`CSRF`の脆弱性が存在すると、主に以下のような被害を受ける可能性があります。

- 利用者アカウントが不正利用される
- 利用者のパスワードやメールアドレスが変更される
- 利用者の所持している金銭が利用される

`CSRF`は下記のような仕組みで行われます。

1. 攻撃者は、ユーザーの情報を盗み出す悪意のあるWebサイトを用意する
1. ユーザーが脆弱性のあるWebアプリケーション上でログインした状態で、悪意のあるWebサイトのリンクをクリックする
1. 攻撃者は抜き出したログイン情報をもとに、脆弱性のあるWebアプリケーションへ不正なリクエストを行う

# CSRFの対策

`CSRF`はサーバーサイド側の脆弱性であり、Webアプリケーションのサーバーサイドにおいて受け取るリクエストへの対策をする必要があります。
重要なのは、どのリクエストに対して脆弱性対策が必要なのかを知ることです。CSRF対策はすべてのリクエストに行う必要はありません。
具体的には、HTTPメソッドがPOSTやDELETEなどの、データベースの情報を書き換えるためのリクエストに対策が必要となります。

具体的な対策法としては以下のような方法が挙げられます。

- パスワードの再入力
- リクエストへのトークン埋め込み

# パスワードの再入力

この対策法は重要な処理が確定する前に、再度パスワードを入力してもらうというものです。
これはCSRF対策の他にも、利用者の意思の念押しをしたり、共用のPCにおいて正規の利用者以外の利用者が、重要な処理を実行するのを防いだりする効果があります。

パスワード変更に関わるリクエストにも、現在のパスワードを再入力させることによりCSRF攻撃を防ぐことが可能です。

# リクエストへのトークン埋め込み

この対策法は、登録画面や注文確定画面などのCSRF対策が必要なページに対して、攻撃者が知り得ないトークンを要求するようにするというものです。
これにより、不正リクエストによる重要な処理が実行されることはありません。

# トークン

トークンとは、1度だけ使用可能なパスワードのことです。ユーザーの認証などに用いられるケースが多くあります。
このトークンは、ユーザーのブラウザ上のみに保管されるものになります。
【Swift】UIColorからRGBAの値を取得する

#はじめに
今回はUIColorからRGBAの値を取得する方法を紹介します。

#パターン1
cgColorでUIColorでCGColorのプロパティを扱えるようにし、componentsで取得する方法です。

```swift
extension UIColor {

    var redValue: CGFloat {
        return self.cgColor.components![0]
    }

    var greenValue: CGFloat {
        return self.cgColor.components![1]
    }

    var blueValue: CGFloat {
        return self.cgColor.components![2]
    }
    
    var alphaValue: CGFloat {
        return self.cgColor.components![3]
    }
}
```

```swift
myView.backgroundColor = UIColor(red: 0.8, green: 0, blue: 0, alpha: 1)
print(myView.backgroundColor!.redValue) // 0.8
```

しかし、個人開発で使っていると、突然blueValueでout of rangeエラーが出て原因がわからなかったため、他の方法を探さないといけなくなりました。（原因に心当たりがある方は教えていただけると嬉しいです。。。）

#パターン2
パターン１が使えなくなったので、こちらの方法で現在は対応しています。[getRed](https://developer.apple.com/documentation/uikit/uicolor/1621919-getred)を使う方法です。

```swift
extension UIColor {

    var redValue: CGFloat {
        return getRed().red
    }
    
    var greenValue: CGFloat {
        return getRed().green
    }
    
    var blueValue: CGFloat {
        return getRed().blue
    }
    
    var alphaValue: CGFloat {
        return getRed().alpha
    }
    
    private func getRed() -> (red: CGFloat,
                              green: CGFloat,
                              blue: CGFloat,
                              alpha: CGFloat) {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        return (red: red, green: green, blue: blue, alpha: alpha)
    }

}
```

使い方は先ほどと同じです。若干コード量は増えてしまいますが、extensionで拡張しているだけなので、さほど問題ではないかなと思います。


#おわりに
原因を知っている方いましたらコメントください、、、
また、他の方法もご存知の方いましたらコメントください！