OmniAICreator/Qiita-1.07M huggingface dataset:
【mysql】Access denied for userが出たときの対処法

Mysql(ver8)の開発用DBを、さくっと作りたい人向け。
そして、せっかちでじっくりドキュメントを読みたくない人向けです。
コピペしたけど実行したら、うまくいかないって場合に読んでみてください。

そもそもちゃんとドキュメント読めという話は一旦置いておいて・・。

以下のようなエラーが出たときの対処法。

```
28000Access denied for user 'xxxxx'@'xxxxxxxxxxxxx' (using password: YES)
```

```
42000Access denied for user 'xxxxx'@'xxxxxxxxxxxxx' (using password: YES)
```

##参考
[ユーザを作成](https://www.dbonline.jp/mysql/user/index1.html)
[ユーザに権限を設定](https://www.dbonline.jp/mysql/user/index6.html)

##前提
Mysqlのデータベースは、「localhost」に構築済。
各コマンドは、rootユーザで実行。
作成するユーザは、ユーザID：test パスワード：test

#1.データベースの作成
```
create database testDB;
```
#2.ユーザの作成（コピペを間違える。。）

```
create user 'test'@'192.168.0.1' identified by 'test';
```

以下のエラーがでます。

```
28000Access denied for user 'test'@'192.168.0.1' (using password: YES)
```

#2-1.ユーザの作成（やり直し）
一度、ユーザを削除

```
drop user 'test'@'192.168.0.1';
```

上記のdropコマンド実行後に以下コマンド

```
create user 'test'@'localhost' identified by 'test'; --localhostからのアクセスを許可
```

もしくは

```
create user 'test'@'%' identified by 'test'; --全hostからのアクセスを許可
```

#3．DBに接続

接続しようとすると、権限が無いので、以下のエラーが発生。

```
42000Access denied for user 'test'@'localhost' (using password: YES)
```

#3-1.権限の付与
※以下コマンドの「localhost」の部分は、適宜「%」にするなど、変更してください。

```
GRANT ALL ON testDB.* TO 'test'@'localhost'; --testDBに対するすべての権限を付与
```

もしくは

```
GRANT ALL ON *.* TO 'test'@'localhost'; --全DBに対するすべての権限を付与
```

これでデータベースを操作できるようになるはず。
Elixirで可変長なLISTの2番目の値を取得する方法

Elixirにはパターンマッチがあるので要素数がわかっているLISTであれば以下のような感じでかけます。

```elixir
pry(1)> [a,b,c] = [1,2,3]
[1, 2, 3]
pry(2)> IO.puts b
2
:ok
```

ところが要素数がわかっていないとエラーになってしまう。

```elixir
pry(7)> [a, b] = [1,2,3,4,5]
** (MatchError) no match of right hand side value: [1, 2, 3, 4, 5]
```

パターンマッチなのでマッチできない要素があるとエラーになるのは当たり前ですね。

Elixirには `cons演算子`,または `hd`関数？があるので可変長LISTでも要素の先頭を取得するのは簡単です。

```elixir
pry(14)> head = hd [1,2,3,4,5]
1

pry(15)> [head|_] = [1,2,3,4,5]
[1, 2, 3, 4, 5]
pry(16)> head
1
```

今回はこの2番目がほしい

`hd`と `tl`関数を使ってLISPのように取得する方法

```elixir
pry(17)> hd(tl([1,2,3,4,5]))
2
```
`car`と `cdr`を駆使して要素にたどり着く感じ、好き！
でも今回は2番目なのでもうちょっと手を抜きたい。そこで以下のようにした

```elixir
pry(18)> [a,b|c] = [1,2,3,4,5]
[1, 2, 3, 4, 5]
pry(19)> b
2
```
↑のやり方ならc以降は可変長に対応( `tl`相当)するうえに2番目の要素がなにかも見ればすぐにわかる！


コメントにて以下のやり方もできると教えていただいた :pray: 
というかこれが他の言語で使うよくやるやり方のような気もするぞ :thinking: 

```elixir
second = [1,2,3,4,5] |> Enum.at(1)
```
【ふくだ学習録】インフラエンジニア教本-ネットワーク構築技術解説- part6【56日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 今読んでいる本
[インフラエンジニア教本 ~ネットワーク構築技術解説](https://www.amazon.co.jp/dp/4774170348)

# 第1章 DHCPサーバーの教科書

### AmazonVPCのDHCPオプション

#### domain-name-servers
DNSサーバのIPアドレス。デフォルトは「AmazonProviderDNS」が指定されており、AmazonDNSサーバが使用される。AmazonDNSサーバのIPアドレスはVPCのネットワークアドレスに「2」を加えたものになる。（ネットワークアドレスが`10.0.0.0/16`なら、DNSサーバは`10.0.0.2`）

#### domain-name
ドメイン名を指定。デフォルトはリージョン固有のドメイン名（TOKYOリージョンならば「ap-northeast-1.compute.internal」）が指定される。

#### ntp-servers
NTPサーバ（時間調整）のIPアドレスを指定。デフォルトは指定なし。

#### netblos-name-servers
NetBios Name Service(WINS)サーバのIPアドレスを指定。デフォルトは指定なし。

[WINS](http://e-words.jp/w/WINS.html)

#### netbios-node-type
NetBIOSノードタイプを指定。デフォルトは指定なし。

### DHCPオプションセットの利用
#### DHCPオプションセット
VPCでDHCPオプションを指定するには、「DHCPオプションセット」を作成し、各VPCにDHCPオプションセットを関連づける必要がある。

# 第2章 ルータの教科書

### ルータはどういう時に使用される？
LANとWANやインターネットを接続する際に使用される。またそのため、NAT機能や、ファイヤウォール、VPNやQoSなどの様々な付加機能を持っていることが多い。

### QoSとは
ネットワーク上のサービスを安定して使えるようにするために、データを通す順番や量を調整する技術のこと。
[QoSとは？](https://network.yamaha.com/knowledge/qos)

# 今日の一言
捗らん！

# 読了した本

#### 技術系
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)
[PHPフレームワーク Laravel入門](https://www.amazon.co.jp/dp/4798052582/ref=cm_sw_r_tw_dp_U_x_zzeyEbJBSQ5Y0 )
[サーバ/インフラを支える技術](https://www.amazon.co.jp/dp/4774135666)


#### ビジネス系
[サブスクリプション](https://www.amazon.co.jp/dp/B07HY1TND9/ref=cm_sw_r_tw_dp_U_x_lp4NEb3EEGD7Y)
[Running Lean ―実践リーンスタートアップ](https://www.amazon.co.jp/dp/4873115914/ref=cm_sw_r_tw_dp_U_x_UsMREbV6Y41Y8)
[amazon 世界最先端の戦略がわかる](https://www.amazon.co.jp/dp/4478105057)
[Lean Analytics ―スタートアップのためのデータ解析と活用法](https://www.amazon.co.jp/dp/4873117119)
[ピーター・ティール 世界を手にした「反逆の起業家」の野望](https://www.amazon.co.jp/dp/4864106010)
[Airbnb Story 大胆なアイデアを生み、困難を乗り越え、超人気サービスをつくる方法](https://www.amazon.co.jp/dp/4822255190)
[ユダヤの商法](https://www.amazon.co.jp/dp/4584139008)
[How Google Works](https://www.amazon.co.jp/dp/4532198348)
[イシューからはじめよ](https://www.amazon.co.jp/dp/4862760856)
[ピクサー流　創造するちから](https://www.amazon.co.jp/dp/4478016380)
[ストーリーでわかる財務３表超入門](https://www.amazon.co.jp/dp/4478015619)
nuxt.jsでRoute(URL)の末尾にスラッシュを追加したいとき

`nuxt.config.ts`(または`nuxt.config.js`？)に以下を追加すると解決しました。

```typescript:nuxt.config.ts
export default {
// ...
  router: {
    trailingSlash: true
  },
// ...
}
```
【Premiere Pro】初めて動画を書き出してみる！！！

##本記事の目的
Premiere Proを扱ったことがない方が対象となっております。

動画編集を行うまでの工程で、挫折し月額は発生しているというのに、

作業を行うことができなかったという筆者の経験をもとに、

Premiere Pro初学者が気持ちよく動画編集を行えることを目的に書いております。


##動画を書き出すまでの流れ
１、プロジェクトの作成

２、編集用コンテンツのダウンロード

３、シーケンスの作成

３、動画編集（ここでは解説しません。）

４、編集した動画を書き出してみる！

##実際に書き出しまでやってみる！
###１、プロジェクトの作成

PremiereProを起動し、新規プロジェクトを選択します。

このプロジェクト内で、動画を作業を行なっていきます！

その後に表示される画面（以下参照）で、まずプロジェクト名を決めます。

自由に自分が分かりやすいもので良いです！

続いて、ファイルの保存先を選択します。

ここも自由に選択して問題ないですが、

あらかじめプロジェクトを保存するためのフォルダーを作成しておき、そこを選択することをお勧めします！

その他の設定に関しては、今回は初期設定で問題ありません！

ここまで完了したら、"OK"を押します。

![premiere001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678345/657f4ed8-2bbd-cf81-8058-2d43c481d3b0.jpeg)


###２、編集用コンテンツのダウンロード

ワークスペース、ソース、プログラム、タイムライン、プロジェクトが表示されている状態になります。

![premiere002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678345/9bc079a1-09d0-87b3-2158-6eb49715d3b3.jpeg)


いずれかが表示がされていない場合は、

”編集（ワークスペース）”　＞　”右クリック”　＞　”保存したレイアウトにリセット”

を選択することで、表示されます。

また、ワークスペースの一覧が表示されていない場合は、

”ウィンドウ”　＞　”ワークスペース”　＞　”すべてのパネル”

を選択することで表示されます。

次に、編集する動画や画像、音声をダウンロードしていきます。

Finderから動画ファイルを選択し、プロジェクトへドラッグ&ドロップすることでダウンロードができます。

###３、シーケンスの作成

シーケンスとは、ダウンロードしたコンテンツを実際に編集を行う場所になります。

まず、

”ファイル”　＞　”新規”　＞　”シーケンス”

を選択します。

次に、表示された画面上から

”ARRI”　＞　”1080p”　＞　”ARRI 1080p 30”

を選択した状態で”OK”を押します！

![premiere003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678345/183ea35d-47ff-29bd-3b50-5c48d154af2d.jpeg)


以上を終えると、右下のタイムラインにシーケンスが追加された状態になります。

この後、タイムラインにダウロードしたコンテンツを載せることで、

ようやく動画編集の作業に映ることができます。

この作業は簡単で、ダウンロードしたコンテンツをタイムライン上へドラッグ&ドロップすることで完了します。

![premiere004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678345/b447f7d0-6abf-9362-7d53-33ab7e12c35c.jpeg)


###４、動画編集（ここでは解説しません。）

いよいよ動画の編集だ！！！

という気持ちなのですが、今回この手順は省略します。。。

###５、編集した動画を書き出してみる！

動画の編集が終わった！となったら書き出しを行います。

動画の完了地点にピンを移動させ、

”右クリック”　＞　”アウトをマーク”

を選択することで、書き出す範囲を選択できます。

![premiere005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678345/c1ce64a8-fead-c954-23ae-7b92ca2ec0b7.jpeg)


次に、

”ファイル”　＞　”書き出し”　＞　”メディア”

を選択します。

表示された画面上で、

形式　　　：h.264
プリセット：YouTube1080pフルHD

を選択します。

最後に、出力名をクリックすることで、

書き出す動画ファイルの名前と保存先のフォルダーを指定することができます。

![premiere006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678345/806fb56c-98a3-668f-aabc-7fab186c77c6.jpeg)


ここまでが完了すれば、”OK”を押し書き出しも終わりです！

##まとめ

以上で、初めての方も問題なく編集作業に専念できるかと思います。

メインの動画の編集に関しては、Youtubeなどで詳しく解説されているので、

参考にしながら勉強していくと捗ると思います！
AWS 認定クラウドプラクティショナー(CLF)を、これまでの振り返りを兼ねて取得したやったことまとめ

# はじめに
AWS 認定クラウドプラクティショナー(CLF)について、これまでの振り返りを兼ねて受験してみました。

クラウドプラクティショナー認定については、Qiita記事が多く投稿されていますので、少し視点を変えて、クラウドプラクティショナー認定に特化した内容は何だったのか感じた内容をお伝えできればと思います。
変則的とはなりますが、クラウドプラクティショナーに関わるAWS関連サービスのイメージを掴んでいただければ幸いです。


# 本記事の主な対象者
- クラウドプラクティショナーの受験を検討している方
- 取得に向けて有効な学習方法などの情報収集したい方

# 筆者のAWS認定履歴

|AWS認定  |取得日  |
|---|---|---|
|ソリューションアーキテクト - アソシエイト  |2018-05-13|
|デベロッパー - アソシエイト  |2018-06-03|
|SysOpsアドミニストレーター - アソシエイト | 2018-06-10|
|ソリューションアーキテクト - プロフェッショナル  |2018-07-29|
|DevOpsエンジニア - プロフェッショナル  |2018-08-26|
|ビッグデータ専門知識  |2019-08-25|
|セキュリティ専門知識  |2019-12-08|
|機械学習専門知識  |2020-02-23|
|高度なネットワーキング専門知識  |2020-06-20|
|データベース専門知識  |2020-07-04|
|Alexaスキルビルダー専門知識  |2020-07-24|
|クラウドプラクティショナー  |2020-07-27|

# 今回のスコア(2020-07-27受験)
```
総合スコア: 949/1000 (ボーダー700)
```

# AWS 認定クラウドプラクティショナー(CLF)について
ここからが本題となります。
まずは、以下の公式ページから試験概要の把握を行いました。

 - [AWS 認定クラウドプラクティショナー トップページ](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)
 - [試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Exam-Guide.pdf)
 - [サンプル問題](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Sample-Questions.pdf)

# 実際に認定試験を受けてみて感じたこと
 - その他の認定区分とシナジー効果があったのは、「セキュリティ専門知識」「SysOpsアドミニストレーター」かなと感じました。これは、これは試験ガイドにも記載があります通り、「セキュリティ」と「請求と料金」 が、クラウドプラクティショナーの試験内容となっているためです。

 - テクニカルな部分以外の問題も散見されました。例えば、サポートプラン（ベーシック、開発者、ビジネス、エンタープライズ）については、それぞれ何ができて何ができないのかを整理しておくことが必要かなと思います。あとは、不意打ち的なところですと、APNパートナーなど、AWSで定義される人物ロールがいくつかの設問に登場してきました。

# おわりに
足掛け２年ほど。AWS認定12区分を取り終えることができました。
振り返ると、認定の取得自体は一種の筋トレで、基礎体力を獲得するようなものでした。AWSのサービスは日々アップグレードしていますので、引き続き継続した学習を続けたいと思います。
今後受験を検討される方の一助になれば幸いです。

#### 著者関連リンク
 - [AWS認定ビッグデータ専門知識(BDS)を、１ヶ月の準備期間で取得した試験準備やったことまとめ](https://qiita.com/go_sougen/items/bfdf5e5d1c6c57ca6141)
 - [AWS認定セキュリティ専門知識(SCS)を、１年の空白期間を経て取得したやったことまとめ](https://qiita.com/go_sougen/items/7a96d2358ffc5eceb960)
 - [AWS認定機械学習専門知識(MLS)を、２ヶ月の集中期間で取得したやったことまとめ](https://qiita.com/go_sougen/items/6a813eac0b2208e43bfb)
 - [AWS認定高度なネットワーキング専門知識(ANS)を、３ヶ月のハンズオン期間を経て取得したやったことまとめ](https://qiita.com/go_sougen/items/ed2df8131b3a2df8a0e8)
 - [AWS認定データベース専門知識(DBS)を、ほぼぶっつけ本番で取得したやったことまとめ](https://qiita.com/go_sougen/items/5e97feaacb387c36e9d1)
 - [AWS認定Alexaスキルビルダー専門知識(AXS)を、ツンデレメイドスキルを作りながら取得したやったことまとめ](https://qiita.com/go_sougen/items/7a78bac3f6a9300901c9)
TypeScript: CouchDB のデータを削除 (Delete)

```ts:couch_delete.ts
// ---------------------------------------------------------------
//	couch_delete.ts
//
//					Jul/27/2020
// ---------------------------------------------------------------
console.error ("*** 開始 ***")
const axios = require('axios')

var key_in: string=process.argv[2]

console.log (key_in)

const url = "http://localhost:5984/nagano/" + key_in

axios.get(url)
	.then(async function (response) {
	console.log(response.data)
	console.log(response.data._rev)
	const url_del = url + '?rev=' + response.data._rev

	await delete_proc(url_del)
	})
	.catch(function (error) {
		console.log("*** error ***")
		console.log(error)
		})
	.then(function () {
		console.error ("*** 終了 ***")
		})

// ---------------------------------------------------------------
function delete_proc(url_del)
{
	console.log(url_del)

	axios.delete(url_del)
		.then(function (response) {
		console.log(response.data)
		})
	.catch(function (error) {
		console.log("*** error ***")
		console.log(error)
		})
	.then(function () {
		console.log ("*** delete_proc *** end ***")
		})

}

// ---------------------------------------------------------------
```

実行

```bash
export NODE_PATH=/usr/lib/node_modules
ts-node ./couch_delete.ts t2022
```
TypeScript: CouchDB のデータを更新 (Update)

```ts:couch_update.ts
// ---------------------------------------------------------------
//	couch_update.ts
//
//						Jul/28/2020
// ---------------------------------------------------------------
const axios = require('axios')
// ---------------------------------------------------------------
console.error ("*** 開始 ***")

var key_in: string=process.argv[2]
var population_in=process.argv[3]

console.log (key_in + "\t" + population_in)

const url = "http://localhost:5984/nagano/" + key_in

axios.get(url)
	.then(async function (response) {
	console.log(response.data)
	console.log(response.data._rev)
	const url_update = url + '?rev=' + response.data._rev

	const name = response.data.name
	await update_proc(url_update,name,population_in)
	})
	.catch(function (error) {
		console.log("*** error ***")
		console.log(error)
		})
	.then(function () {
		console.error ("*** 終了 ***")
		})

// ---------------------------------------------------------------
function update_proc(url_update,name,population_in)
{
	console.log(url_update)
	const date_mod = get_current_date_proc ()

	const args = {"name": name,
		"population": population_in,
		"date_mod": date_mod}
	axios.put(url_update,args)
		.then(function (response) {
		console.log(response.data)
		})
	.catch(function (error) {
		console.log("*** error *** update_proc ***")
		console.log(error)
		})
	.then(function () {
		console.log ("*** update_proc *** end ***")
		})

}

// ---------------------------------------------------------------
function get_current_date_proc()
{
	var today = new Date();
	var ddx = today.getFullYear() + "-" + (today.getMonth() +1)
	ddx += "-" + today.getDate()

	return ddx;
}
// ---------------------------------------------------------------
```

実行

```bash
export NODE_PATH=/usr/lib/node_modules
ts-node ./couch_update.ts t2025 21894500
```
TypeScript: CouchDB のデータを読む (Read)

```ts:couch_read.ts
// ---------------------------------------------------------------
//	couch_read.ts
//
//					Jul/27/2020
// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const axios = require('axios')

const url = "http://localhost:5984/nagano/_all_docs?include_docs=true"

axios.get(url)
	.then(function (response) {

	response.data.rows.forEach (function(row)
		{
		var out_str = row.id + "\t"
		out_str += row.doc.name + "\t"
		out_str += row.doc.population + "\t"
		out_str += row.doc.date_mod;
		console.log(out_str)
		})

	})
	.catch(function (error) {
		console.log("*** error ***")
		console.log(error)
		})
	.then(function () {
		console.error ("*** 終了 ***")
		})

// ---------------------------------------------------------------
```

実行

```bash
export NODE_PATH=/usr/lib/node_modules
ts-node ./couch_read.ts
```
emacs color on terminal for catalina



# 初めに

catalinaに変えて，dark-modeを使い始めたんですが．．．terminal上のemacs のorg-modeで表示される文字が暗くて見えません．具体的には，dark-blueとかmidnight-blueです．なんで，それを変えようとしてはまりました．照度を上げると見えるんですが，エコじゃないんで，出来るだけ低い照度でしかも視認性がよくって，さらに心が躍るcolorを追求していきます．

現在の設定では次のようになっています．

| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/2dca2164-8282-745d-0e88-a260161b247b.png)| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/a7ff60e3-06ab-7057-60e9-13b6f49836ad.png)|
|:------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------|
| ruby-mode                                                                                                   | org-modea                                                                                                   |

こんなのがいいよというお勧めがあったらコメください．


# [Emacsで、特定の文字の色を変更する](https://qiita.com/AnchorBlues/items/91026c4f1c0745f5b851)

ちょっとメモとる手間なやり方が書かれていますが，下の手順で簡単に可能．

1.  M-x describe-face
    1.  returnでより詳細な設定表示で，customize\_this\_faceを選ぶとそのまま編集画面
    2.  Foregound -> Chooseで選択
2.  M-x list-faces-display


# defaultに戻す

-   M-x list-faces-displayでfaceのtitleを選んだ段階で，
-   Revertボタンを押す
-   挙動が選べる
-   2(Erase custamization)でdefaultに戻る


# emacs color

-   [emacs theme gallery](https://pawelbx.github.io/emacs-theme-gallery/)


# themeのactivation

```el
(add-to-list 'load-path              "/path/to/alect-themes")
(add-to-list 'custom-theme-load-path "/path/to/alect-themes")
```

    M-x load-theme RET alect-light, black, dark

でいくはずですが，行かない．

    (setq alect-display-class '((class color) (min-colors 256)))

をinit.elに足すと行くようになりました．重たくなりそうな感じ．やめようか．


# 最終的に

-   **terminalの調整:** terminalはbasicなんですが，ANSIカラーの青系統を明るめに設定．
-   **emacs color:** themeを変えるのはやめました．defaultのcolorの多彩さがrubyを書くときに気持ちがいいから．でも，org-modeのtitleとかは読みづらいです．そこで，org-document-info, titleをcolor-21に変更しています．
-   **line high light:** ln-lineを使っているのですが，これも変更しています．これは相当悩みました．

```el:init.el
(global-hl-line-mode)
;; (set-face-background hl-line-face "gray13")
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(hl-line ((t (:inherit highlight :background "cyan"))))
 '(org-document-info ((t (:foreground "color-21"))))
 '(org-document-title ((t (:foreground "color-21" :weight bold)))))
```


# hl-line

hl-lineは遅くなるという記述があります．確認できていませんが，本当なら下を参考に．

-   <http://emacs.rubikitch.com/global-hl-line-mode-timer/>
-   <https://stackoverflow.com/questions/4495406/hl-line-mode-emacs-color-change>

------
 - **source** ~/git_hub/ruby_docs/qiita/qiita_post/emacs_color.org
Swift オプショナル型とアンラップを理解

#Swiftでは変数の宣言時に、何も値が無い状態を許すか許さないかを、データ型で指定する必要がある。「オプショナル型」はデータ型の種類のひとつです。

#オプショナル型とは
###値が無い状態を許すデータ型はオプショナル型で、変数宣言時のクラス名の後に「？」か「！」を指定します。「？」か「！」を付けない宣言は、値がない状態を許さない「非オプショナル型」になります。一般的なオプショナル型は「？」を利用します。　「？」も「！」は両方とも「nil」を保持することが許されてますが、違いはわかりません。。すみません。複雑らしいので。。　最初はオプショナル型を宣言する場合は「？」を利用すればいいと覚えておいて大丈夫かと。

#アンラップとは
###オプショナル型の変数やメソッドを、安全に取り扱う手法をアンラップといいます。　宣言時以外で「？」や「！」を見かけたら、アンラップを行っているんだなと理解できれば問題ないかと。。
nuxt.js × Rails CSVアップロードフォームを作る

## はじめに
新卒エンジニアの@yhorikawaです
nuxt.jsとRailsを使ってCSVアップロードフォームを作るのに苦戦したので、記事として残します。

## csvファイル
```
1,hoge,100
2,foo,200
3,bar,300
```
このようなcsvが存在していて、一行ずつ保存したいと仮定します。

## フロント側
```vue

<template>
  <div class="container">
    <input @change="handleChange" type="file" name="file">
    <button @click="handleSubmit" type="submit">保存</button>
  </div>
</template>
<script>
export default {
  data: {
    file: null,
  },
  methods: {
    handleChange(e) {
      this.file = e.target.files[0];
    },
    handleSubmit() {
      let formData = new FormData();
      formData.append('file', this.file);
      this.$axios
        .$post('csvFileUploadUrl', formData)
        .then(response => {
          // 成功した時の処理
        }).catch(err => {
         // エラーの時の処理
        });
    },
  },
};
</script>
```

ファイルをpostできなくて苦戦していたのですが、
FormDataを利用することで簡単にファイルアップロードをすることができました！

## Rails側
```ruby
require 'csv'
def csv_upload
  CSV.foreach(params[:file]) do |row|
    # 保存処理
  end
end
```

## おわりに
今回はファイルアップロードフォームを作成しました。
単純に実装できそうだと思って作り始めたのですが、意外と難しかったので記録として残しておこうと思います。
Windows環境のAtomでプロキシを越える方法

職場等のプロキシ環境下でAtomを使用する際、
パッケージの検索やインストールがまず動かない。

そこで、以下のことを行なう。

## .apmrcファイルを作成

インストールフォルダ (デフォルトはC:\Users\[User]]\.atom\)内に
".apmrc"という名のファイルを用意する。
エクスプローラでは、"."で始まるファイルを作成できない
(「ファイル名を入力してください」とエラーダイアログが表示される)ので、
新規ファイル作成時に、ファイル名を".apmrc." (←最後にドットを付けておく)とすると、
最後のドットが消えて".apmrc"となるのでお試しを。
(コマンドプロンプトでrenameしたり、テキストエディタ等で保存時のファイル名にしていしたりしてもOK)

## .apmrcファイルの編集

作った.apmrcファイルに、以下のように書き込む。

```.apmrc
https-proxy = http://[User]:[PWD]@[Host]:[Port]/
http-proxy = http://[User]:[PWD]@[Host]:[Port]/
strict-ssl = false
```

必要に応じてAtomを再起動する。

これでプロキシを越えて、快適な(?)Atomのある生活が過ごせます(^^)

注意）職場によってはアカウントのパスワードを定期更新することがあると思います。
その時は.apmrcに記載したパスワードも更新してくださいね。
いつか役に立つかもしれないngrepチートシート

## ローカルのアプリケーションのリクエストを見る

```sh
sudo ngrep -q -W byline -d lo0 port 9901
```

## VirtualBox上のアプリからMySQLに発行されているリクエストを見る
```sh
sudo ngrep -q -W byline -d vboxnet0 '' dst port 3306
```

### 補足
いくつか手元の環境に依存していることあるので補足

- VirtualBox が使うネットワークインターフェースが vboxnet0
  - ifconfig で調べられる
- MySQLが使用しているポートが 3306
Railsでbootstrap-iconsを簡単に使う

## rails(webpacker)で[bootstrap-icons](https://icons.getbootstrap.com/)を使う方法

現時点では`v1.0.0-alpha5 `が最新なので今後変わると思います。

npm
`npm install bootstrap-icons`

yarn
`yarn add bootstrap-icons`

次に `app/helpers/application_helper.rb` に以下を追記します。

```ruby
module ApplicationHelper
  ...
  # 追加
  def icon(icon, options = {})
    file = File.read("node_modules/bootstrap-icons/icons/#{icon}.svg")
    doc = Nokogiri::HTML::DocumentFragment.parse file
    svg = doc.at_css 'svg'
    if options[:class].present?
      svg['class'] += " " + options[:class]
    end
      doc.to_html.html_safe
  end
end

```


viewはslimを使用しているので

```slim
=icon("hdd", class: "text-gray")
```

で表示されます。

![スクリーンショット 2020-07-28 0.10.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29354/a2b98de3-4620-038a-f914-a270a16bcc4a.png)
phpと.datファイルのか

ファイルハンドルに test.dat ファイルをひも付け、ファイルオープン。値を取り出して、インクリメントして閉じる式。
![スクリーンショット 2020-07-28 6.25.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606144/3bbd6e59-1075-79ea-552d-e74ecd3d92a6.png)


これと、test.dat ファイルに、0と入力し、FTPソフトでアップロード。
ファイルパーミッションを、php=705,dat=706にセットして完成。
GoogleDriveへファイルを自動でアップするいくつかの案

自動でGoogleDriveにアップする仕組みが欲しくなったのですが、いまいち簡単にできませんでした。
まだまだ調査段階のため勉強不足ですが、メモとして残します。


# 1.バックアップと同期(アプリ) を利用する
https://www.google.com/intl/ja_ALL/drive/download/backup-and-sync/
アプリケーションを使用して、Windowsパソコン上に同期フォルダを作成する。
その同期フォルダへファイル等コピーすることでアップロードが可能になる。
同期フォルダへはバッチかPowerShellでCopy叩く必要はありますので、コーディング0にはなってません。

####メリット
- アプリケーションを使用するのでイメージしやすく非エンジニアにも優しい
- バッチなどでコピーができれば自動化が組める
- パパっとできそう

####デメリット
- PC内のドライブ領域も無駄に使用する (同期するサイズ分)

#####やり方は下にメモ
- https://www.imobie.jp/cloud-tips/fix-set-up-google-drive-synchronization.htm
- https://igozutt.com/google-drive-folder-sync/

重要なのは「マイドライブをこのパソコンに同期」のチェックボックスでしょうか。
パソコン→GoogleDriveの同期はしても、GoogleDrive→パソコンへの同期をしないようにできます。

# 2.gdrive(ツール)を使用する
- https://github.com/gdrive-org/gdrive

####使い方
- https://woodysv.com/blog/42.html
- https://takuya-1st.hatenablog.jp/entry/2016/07/06/034412

セキュリティ面がなんともわからない。
このツール自体いつまで保守してくれるかは気になります。
調査不足なのでこれ以上下手なことは言わないでおきます。

# 3.GoogleDriveAPIを使用する
私は使用していないので、情報の信ぴょう性は低いです。(すみません)
むしろ誰か一緒にGCP勉強会したい...。プログラムは簡単そうですが、概念的なところとか、金額とかふわっとしてて踏み込みづらいです...。

####メリット
- GoogleCloud自体はいろんなことに使用できるので、少しずつ覚えて技術力を高めることができる
- 最適な動作をカスタマイズして組むことができる。

####デメリット
- 学習コストがある
- ドキュメントが少ない。エンジニア向けの資料が目立ち、基礎概念的な部分がすっ飛ばされてることが多い。

#####使い方メモ
- https://developers.google.com/drive/api/v3/about-sdk

-----
今回は調査まで、詳しくわかれば追記していきます。
どんなことでもコメントで気軽に突っ込んでいただけますと嬉しいです。
Slack仕草

社内Lightning Talk用 :woman_tone1:

世に存在するSlack作法というものを集めました。

私の個人的主義主張と異なるものも含みます。

----

## @here, @channel
そもそも公式のところ。
[Slack | @here @channel @everyone @group の違い](https://qiita.com/Yinaura/items/539e59149b41b9d516c1)


----
## ミュート
たまに @here に怒り怒られる場面に遭遇するが、本来、受ける側で制御できる。
[通知って難しいよね。Slackの通知を受け取る・送る心構え](https://liginc.co.jp/484075)

----
## メンション
Mention, Not Notifying, 等調べても英語圏にそのような作法は無いように見える、が...

----
送る側でメンション風のことをして制御すべきという作法がある。社内でも見る。

「遅い時間なのでメンションなしで失礼します」

[Slackでメンションを付けつつ通知しない配慮isジャポネーゼ](https://blog.animereview.jp/slack-mention/)

---

本当はこれ...

[Slackデスクトップ通知ガイド(Slack)](https://slack.com/intl/ja-jp/help/articles/201355156-Slack-%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E9%80%9A%E7%9F%A5%E3%82%AC%E3%82%A4%E3%83%89)


----
## 「お疲れ様です」

世間様は、どうやって使っているのか。

[Slackとか社内チャットで「お疲れ様です」って必要？不要？みんなの意見は… (Cancam)](https://cancam.jp/archives/846384)

----
> いろいろ考えるとどちらがいいか難しいですね。挨拶文化は残したいと思うけれど、形式だけの挨拶は判子文化のように悪しき習慣になるような気もしなくもないです。時代の変化に合わせつつ、相手の受け取り方を考えることが大切ですね！

大人な意見。

----

その「相手の受け取り方」とはSlack自身も言っているところのものらしい。

[Slackを使う上で最も重要なのは「相手への思いやり」だという(Slack Japanの公式見解 - IT media)](https://www.itmedia.co.jp/business/articles/2001/21/news032_2.html)

----

[ネットで叩かれている「Slackマナー」は本当にアホらしいのか？　良しあしを真剣に考えてみた](https://www.itmedia.co.jp/news/articles/2001/09/news073.html)

> 「画面の下部に『入力中……』を出さないよう、メモ帳などで推敲（すいこう）してから文章を貼り付けるべき」などが存在するという。

----

> 機能面での自由度が高まったからといって、失礼な使い方をしても許されるわけではない。がんじがらめなマナーで縛ったり、メールに回帰したりするのはアホらしいが、画面の向こうに生身の人間がいることを念頭に置き、周囲への気遣いを忘れずに使っていくべきではないだろうか。


そのうち「入力中」を表示させない機能が欲しくなりそう

----

[引用: https://togetter.com/li/1452945](https://pbs.twimg.com/media/ENp2Pu6UYAEeQuy.jpg)![ENp2Pu6UYAEeQuy[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/419c3382-482a-eff6-a207-546f56e974a2.jpeg)


----

## まとめ

[Slackコミュニケーションで心がけたい10のポイント　コロナ影響、テレワークで導入進む(Forbes Japan)](https://forbesjapan.com/articles/detail/33065/1/1/1)

> やはり直接話すのが一番である。

----


えっ、Slack要らないじゃん... 


、と感情的にならず、Slackはもはやコードを書く人以外も使っているということなので。

「例えば自分なら、弊社役員にメンションを飛ばすことができるか？」等、少しだけ想像する。

----

ユーザの利用場面、考え方を一つ一つ分析、検証して、時々丁寧に反論していくことが、実は、テレワークの本当の難しさであり、本当に必要なことなのだとおもう。

----

次回予告！オンライン会議編！
[｢在宅でもスーツを着ろ｣｢Zoomは上司より先に退出するな｣意味不明なビジネスマナーが日本企業を滅ぼす](https://www.businessinsider.jp/post-217335)


(時期未定) 

----

なお今回の発表はこんなゆるゆる業務外話でしたが、普段の私は

- バッチサービスのFargate化のために [WindowsローカルのAWS SDKでJavaプログラムを動かしたり](https://qiita.com/e99h2121/items/7b153c12f61470ffdf48) 

- [障害対応](https://qiita.com/e99h2121/items/3c7b170a5725c7c0d0e5) 等の活動に励んでいます


以上です :zipper_mouth:
Chrome ExtensionのbackgroundからWebAssemblyを呼び出す

ソース付き最小構成の記事が見当たらなかったので追加。

chrome拡張の background 内から WebAssembly を実行するサンプルを纏めました。

[githubはコチラ](https://github.com/tobisako/chromeextension-memo/tree/master/execwasm)


```text:フォルダ構成
execwasm
 └ src
   └ crate    // rust
     └ src
       └ lib.rs
       └ utils.rs
     └ Cargo．toml
   └ img
     └ kani_128.png
   └ js
     └ background.html
   └ manifest.json
 └ package.json
 └ webpack.config.js
```

# 使い方

### ビルド
```text
 $ npm install
 $ npm run build
```
ビルドすると、 `dist` フォルダが生成され、フォルダ内に chrome拡張機能インストール時に必要な `manifest.json` が格納されています。

### Chrome Extension に登録
Chromeのメニューから [その他のツール] > [拡張機能]　を選択し、Chromeをデベロッパーモードに切り替えてから、 `パッケージ化されていない拡張機能を読み込む` ボタンを押してフォルダ `dist` を選択すれば、インストール完了です。
![スクリーンショット 2020-07-28 1.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280104/dc415843-34be-5ccb-5815-f23543c00ebd.png)

### 実行
インスールした直後に、自動的に `background.js` が実行され、そこから rust `lib.rs` の関数 `greet()` が呼び出されます。

```javascript:src/crate/src/lib.rs
#[wasm_bindgen]
pub fn greet() -> String {
    alert("Hello, from Rust!");
    "from_Rust!".to_string()
}

```

まず、インストール直後に、`alert()` が実行され、ポップアップが表示されたと思います。
![スクリーンショット 2020-07-28 2.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280104/d06afd93-bffb-5fd0-eca9-00ffa9ec9577.png)

次に、「background.html」をクリックし、 console でログを見てみましょう。
![スクリーンショット 2020-07-28 2.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280104/446ee907-f83f-0de1-e45a-9f7b565737e0.png)

表示されたログから、 `background.js` で、 Rust-api `greet()` を呼出し、戻値を受け取り表示している事が確認出来ます。

※ `rust` ソースコード `lib.rs` の関数 `greet()` の最終行 `"from_Rust!".to_string()` が関数の戻り値（ `String` 型）です。


# ポイント
webpack で `@wasm-tool/wasm-pack-plugin` を使用している為、 `npm run build` コマンド一発で rust のビルドも自動的に行われます。
manifest には、 `"content_security_policy"` の設定が必要です。これを定義する事で、background で実行できる様になります。


# その他
参考サイト
https://stackoverflow.com/questions/48523118/wasm-module-compile-error-in-chrome-extension
Docker ローカルのファイルをコンテナ内にコピーする

# 目的

- MacやWindowsなどのローカルにあるファイルをDockerのコンテナの中にコピーするコマンドを紹介する。
- ※筆者の環境はMacのためMacのローカルからコンテナ内にファイルをコピーする方法を記載する。

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

# 例

1. Macのローカルのターミナルで下記コマンドを実行する

    ```terminal
    $ docker cp コピーしたいファイル コンテナ名:コンテナ内のコピー先パス/コピーしたファイルを設置する時のファイル名
    ```

# 具体例

1. Macのローカルの`~/Download`直下にあるmy_dump.sqlというファイルを、「docker_mysql_1」というCONTAINER IDのコンテナの`/dump`ディレクトリ直下に同じファイル名でコピーしたい時のコマンドを下記に記載する。

    ```terminal
    $ docker cp ~/Downloads/my_dump.sql docker_mysql_1:/dump/my_dump.sql
    ```
Bootstrap Your Own Latent A New Approach to Self-Supervised Learning のメモ

- Deep Mind のたくさん
- https://arxiv.org/pdf/2006.07733.pdf

- BYOL は普通 Bring your own licenseだが、ここではBootstrap your own latent の略
- self-supervised。2つのネットワークを使う。onlineとtarget.

- 通常の対比学習はpositive pairとnegative pairを使うが、これはpositive pairしかつかわないと。なんでそんなことが可能なんだ。

- とにかく性能がいいと主張。supervisedに匹敵する性能が出ている用に見える。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/e047f626-5c81-d94f-c5ef-f22d38d7f520.png)

- Deep RL のtarget networkにヒントを得ている？

- targetネットワークのパラメータξはonlineネットワークのパラメータθのexponential moving averageである。これは近接点に大きな重みを置くmoving averageの一手法。重みのアップデート式はMocoと全く同じだな。


- 一つの絵に2通りのaugmentを施して上と下に食わせて、それぞれパスを通す。上のonlineパスで、下のz'を予想する。

- Loss は下の式。上のバーはL2正規化を示す。イコールの上に⊿が乗ったのは、定義を表す。

- 上下のネットワークに入れる画像を入れ替えて2組作ってそれを最小化する。

- 最適化するのは上のパスのθだけ。ξはθを使って更新する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/58d427b0-42d1-7399-f205-6a1b967b5f58.png)


## motivation 
3の頭に書かれている。

- self-supervisedは、あるview から別のviewを予測する場合が多い
- representation のレイヤでこれをやると、representationがcollaptする。つまり、常に予測可能な同じ物が出てくるようになる。
- contrastive method はnegative sampleを入れることでこれを回避する。prediction 問題をdiscrimination 問題に置き換えている。
- しかし、タスクが十分難しくなるには、大量のnegative sampleを使って十分近いものを探してこなければならない。

- collapse を防ぐための簡単な方法としてランダムに初期化したネットワークで予測ターゲットを作るという方法がある。こうすると、collapseは防げるがあまり良い性能にはならない。
- とはいえ実はそこそこ性能がでる。これにヒントを得てBYOLを考えた。
- ターゲットネットワークは、固定ではなく非常にゆっくりと変化する。


## 感想
- 多分実装はなんとなく理解できたと思うのだけどなんでこれでうまくいくのかわからない。。online はtarget を予測して、targetは徐々にonlineによっていくということなのだろうけお、なんで、それでよいrepresentationがでてくる保証がある？？うーん。

- と思っていたら、こんな記事が。実はバッチノーマライゼーションが対比学習と同じような効果を導入していたのではないか、ということらしい。確かにバッチノーマライゼーションで同じバッチ内のデータの情報がリークするのか。
https://untitled-ai.github.io/understanding-self-supervised-contrastive-learning.html
ウェブページを作るにあたって

#ウェブページを書く前に。
ウェブページを作るにあたっては、個別サイトか企業サイトかで中の作りが変わってくるので作りたい方に必要な要素などを書き出してから進めるといい。

#ホームページの種類は従来型とブログ型（CMS）に大きく分けられる。

##従来型
###メリット
自己紹介や会社概要などの時系列を持たないコンテンツの配信には従来型のホームページが適している。
###デメリット
一から作成していく必要があるので、コンテンツを追加しようとすると手間がかかってしまう。

##ブログ型（CSM）
###メリット
日々更新するような日記やニュースなどはブログを使った配信の方が適している。本文を簡単に投稿するだけで簡単にページを作成することができる。
###デメリット
常に新しいコンテンツが優先してしまうので、古い記事の大事な内容が読者の目に止まりにくくなってしまう。

##最近では両方のメリットを兼ね備えたページもある
最近では従来型とブログ型のメリットを生かして、自己紹介や会社案内、お問い合わせなどは常に表示されるようにして、ニュースやお知らせなどは投稿するだけで新しい記事になっていくものもある。
Microsoft Sharepoint にブロックチェーン導入

最近、驚きの発表がありました。
SharePointにブロックチェーンが導入されました。
SharePointは、Microsoft365、及びOffice365で提供される、ファイル共有・情報共有サービスで有名なソフトウェアです。
エンジニアでは使用している人が多いのではないでしょうか。

SharePointは主なプランがあります。
[Microsoft 365 Business Basic　(旧 Office 365 Business Essentials)](https://onamae-office.com/office365business/#anchor-2)
[Microsoft 365 Business Standard　(旧 Office 365 Business Premium)](https://onamae-office.com/office365business/#anchor-3)

###単体プラン###
[SharePoint Online プラン](https://www.microsoft.com/ja-jp/microsoft-365/sharepoint/compare-sharepoint-plans)

部署ごとにポータルサイトを作る事ができます。
画像の共有、チームごとの予定表を設置したり、作業手順書、マニュアル、報告書などのファイルの管理ができます。
掲示板を設置して情報を共有したり、会議に議事録などを張り付けもできます。
SEやプログラマーなどは、使っている人は多いと思います。
SharePointにある機能の中での特にワークフローです。
以前は承認が必要な報告書は印刷するかメールで添付して送っていました。
このワークフローはそんな手間を省き、SharePoint上で上司と書類を共有が出来るのでスムーズに承認が可能になります。
SharePoint Online の使い方や概要が以下の動画を参考にして下さい。
![sharepoint.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118762/67e4304c-0532-a606-f883-78c83642f082.jpeg)(https://youtu.be/VRUPCxzthb0)

営業なら見積書や積算設計書などを共有すれば上司と円滑に確認できます。
顧客などの社外との共同作業もできます。
社外で作業するなら、顧客先で作業をしてその報告書やデータを共有すれば社内や常駐先で共同作業もできます。
営業なら、会議資料や議事録をチームの共有サイトにアップしておき共有して置き会議をスムーズに進めることもできます。

SharePointは、ワードやエクセルと連携しているので、ドキュメントなどのファイルを容易にアップロードできます。
ワードやエクセルなどの「名前を付けて保存」を選択するとOne-DriveかSharePointを選んで保存することができるようになっています。

私は主に、開発・検証作業で利用していました。
主に社内での製品の開発や検証作業の報告書やデータを公開してチームで共有したり、作業マニュアルをSharePointのポータルサイト内に添付してチームで共有します。
印刷して上司にメールで報告する必要はなく、SharePoint内で承認を得ることができるので作業が円滑です。
そのほか、過去の作業データを検索して調べたり、メーリングリストを設置したり様々です。
企業機密が多いので、当然、セキュリティーが重要です。
営業なら契約書や見積書など社外秘を扱います。


![spheren.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118762/46a0562c-e539-e872-e85f-38c7880c8c85.jpeg)![LTONETWORK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118762/b7debbb6-1e4e-0827-214d-9a0918779b71.jpeg)![Microsoft.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118762/5e085586-c797-c860-1ceb-0fe916efc282.jpeg)Microsoft 

スケーラブルなセキュリティアプリケーションを通じてデジタル分野での信頼を築くことを目的として2016年に組み込まれています。
ソフトウェア開発者、システムインテグレーター、企業と共同でソリューションを構築し、標準のプラグインとAPIを使用することで Sphereon Gatewayを通じて既存のビジネスシステムを様々なブロックチェーンテクノロジーと統合するのに役立つことができます。


[Sphereon](https://sphereon.com/)がブロックチェーンサービスをSharePointに追加しました。
ブロックチェーンを日常の大規模および日常のドキュメントとトランザクションの処理に使用できるようにします。
SharePointとOffice365用のアドインとSDKにより、SharePointのドキュメントとプロセスにブロックチェーンベースのソリューションを非常に簡単に実装できます。
 Sphereon SharePointアドインとSDKは、SphereonのブロックチェーンAPIを使用しています。これらは、パブリック、許可済み、プライベートのブロックチェーンと、
Ethereumベースのスマートコントラクトで利用できます。

Sphereonは、ブロックチェーンベースのソリューションの実装を非常に簡単にします。

    存在証明
    真正性の証明
    処理の証明

主なブロックチェーンプロトコルは、
    Factom Protocol
    HyperLedger
    Ethereum
    BigChainDB
    Multichain
これによりセキュリティは更に安全性が高くなります。
そして、新たにハイブリッドブロックチェーンの<strong>LTO Network</strong>が加わりました。
現在最も効率的で高速なデータ整合性ブロックチェーンソリューションとしての地位を確立しつつあります。
競合アプリがあるとは言え、ワードやエクセルを利用する会社は大多数を占めています。
LTO Networkは、統合が単純です。
魅力的なエコノミクスモデル を有し、1日あたり約50.000のデータオブジェクトを保護。
さらに1.2秒のブロックタイムにより、データ整合性はほぼ瞬時に確認され、コストは競合他社よりも大幅に低くなっています。
コロナウィルスの影響で、リモートワークが進んでいますが、問題となっているのはセキュリティ問題です。
ブロックチェーンを利用することにより、より安全に情報を共有することができます。
SpringのRest Templateで配列形式のJsonを取得するときの対応

## 概要
SpringBootで外部のAPIからデータを取得する際に、Rest Templateを使うことがあると思います。Rest Templateの使い方については[Kotlin + Rest TemplateでのHttpリクエスト(GET編)](https://qiita.com/akkino_D-En/items/520085f50990c3edaec1)の記事を参照頂きたいのですが、今回はレスポンスが配列形式で来た場合にどのように対応したらよいか書きます。

## 前提
* 実装の言語はKotlinを前提とします。
* レスポンスはJsonを前提とし、以下のような配列形式で返ってくるものとします。

```sample.json
[
  {
    "id": 1
    "name": "test1",
  },
  {
    "id": 2
    "name": "test2",
  },
]

```

## 対応
一度テキストで取得してからJsonをパースしても良いのですが、出来ることならObjectでレスポンスを取得したいです。配列形式のJsonをObjectでどう読み込んだら良いかとなると、StackOverflowの[Kotlin call java method with Class<T> argument](https://stackoverflow.com/questions/39679180/kotlin-call-java-method-with-classt-argument)に色々と対応方法が書いてあります。以下の通り、個人的にはArrayでくるんで受け取る方法が一番簡潔に書けるかなと思います。

```sample.kt
return restTemplate.getForObject(uri, Array<SampleObject>::class.java).toList()
```
【Rails6】#constantizeで学んだ複数単語モデル名の命名規則

###はじめに

`constantize`メソッド使用時に発生したエラー`NameError (uninitialized constant Texttweet`　`Did you mean?  Texttweet):`とエラーがでてしまった時に学んだ対処をまとめました。
補足で`constantize`メソッドの、ネームスペースの参照フローを考察しました。

###解決策

***`TextTweet`という定数が定義されてないですよー、もしかして`Texttweet`ですか？***という感じのエラー文ですので、どこかの命名が間違ってるっぽい。

```tweets_controller.rb
"TextTweet".constantize
```

```texttweet.rb
class TextTweet < Tweet #STI(単一テーブル継承）しています
end
```
という事で命名規則をおさらい

####複数単語の命名規則

|名称|例|解説|
|:--:|:--:|:--:|
|モデル名|text tweet|
|モデルクラス名|TextTweet|先頭大文字・キャメルケース|
|ファイル名|text_tweet.rb|先頭小文字・スネークケース|
|#constantizeで変換|"TextTweet"|先頭大文字・キャメルケース・文字列|

つまり、、、
モデルのファイル名が一単語になってる！！
`texttweet.rb`×
`text_tweet.rb`○

```text_tweet.rb
class TextTweet < Tweet 
end
```

これでOKでした。
命名規則大事ですね！

###補足

上記の事から`#constantize`はまず、ファイル名から探してるみたいですね、そして、そのなかでクラスが定義されているか確認してるっぽいです。

なので、以下のように編集して試してみてもエラーが帰ってきました。

```text_tweet.rb
class Texttweet < Tweet #モデルクラス名を一単語に
end
```

詳しい流れも今後機会があれば学びたいです！
JavaとGradleでHello world

## はじめに

何番煎じかわかりませんが、学習のためにJavaとGradleを使って「Hello world.」と表示するプログラムを作成してみました。

## 前提

* Java version
  * 11
* Gradle version
  * 6.5.1
* OS
  * Windows 10

上記の環境で動作確認しています。ただし、ごく簡単なことしかしないため、多少のバージョンの違いは適宜読み替えれば問題ないはずです。

## Gradleプロジェクトの作成

Gradleプロジェクトを作るためにまず適当なフォルダを作成します。  
コマンドならば次のようになります。

```
mkdir hello-gradle
cd hello-gradle
```

ここではフォルダを`hello-gradle`という名前にしました。

次に、gradleコマンドでプロジェクトを作成します。
プロジェクトを作成したいフォルダをカレントディレクトリにして、（つまり、`cd hello-gradle`してフォルダの中にいる状態で）次のコマンドを実行します。

```
gradle init --type java-application
```

するといくつか質問をされます。

```
Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2]
```

ビルドの設定を行うスクリプトをGroovyかKotlinのどちらで記述するか選択します。Javaプロジェクトの場合は普通Groovyを使うと思われるので、「1」を入力してEnterします。

```
Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
```

次にテストフレームワークを選択します。今回はHello worldするだけなので、テストは何でもよいのですが、とりあえず「4」を入力してEnterします。

```
Project name (default: hello-gradle):
Source package (default: hello.gradle):
```

最後に「Project name」と「Source package」をそれぞれ聞かれます。ここではデフォルトで進めることとし、何も入力せずEnterします。

これで`hello-gradle`フォルダの中に各種ファイルが生成されるはずです。  
「Hello world.」するために必要なソースコードはすでにすべて出来上がっています。  
今回もっとも重要な「Hello world.」を標準出力するメインメソッドは`src/main/java/hello/gradle/App.java`にあります。

なお、最初に`gradle init --type java-application`しましたが、`--type`の指定無しで`gradle init`だけでもいくつか質問事項が増えるだけで同じ結果になるはずです。  
ただ、Javaのコマンドラインアプリケーションを作成するなら`--type java-application`を指定したほうが速いです。

`--type`に指定できるタイプは[Supported Gradle build types](https://docs.gradle.org/current/userguide/build_init_plugin.html#supported_gradle_build_types)に記載されています。たとえば、`kotlin-application`を指定するとKotlinのプロジェクトができるようです。

## 動作確認

`hello-gradle`フォルダにおいて、コマンドプロンプトなら、

```
gradlew.bat run
```

のコマンドを実行します。すると`Hello world.`の文字列が出力されているはずです。これでJava + GradleによるHello worldは完了です。

## テストを実行

Hello worldを標準出力するだけのプログラムなのでテストをしても意味がないですが、せっかくテストコードが用意されているのでテストも実行してみます。

動作確認時と同じように、コマンドプロンプトなら、

```
gradlew.bat test
```

を実行します。  
すると、テストは成功し、`BUILD SUCCESSFUL`と表示されます。

なお、テストコードは`src/test/java/hello/gradle/AppTest.java`にあります。  
このクラスの`appHasAGreeting`メソッドがテストメソッドです。  
このテストはメインメソッドのある`App`クラスの`getGreeting`メソッドがnullを返さない、ということを検証しているだけです。このメソッドは`Hello world.`という文字列を返しているので当然テストはパスします。


この`getGreeting`メソッドをたとえば、

```java
package hello.gradle;

public class App {
    public String getGreeting() {
        // return "Hello world.";
        return null;
    }

    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}

```

のようにnullを返すように変更してテストを実行すると、今度はテストが失敗し、`> Task :test FAILED`という文言と失敗したテストメソッドが表示されます。
rails db:migrateでのエラー

#プログラミングの勉強日記
2020年7月28日　Progate Lv.226
Railsでアプリケーションを作成中

#rails db:migrateを実行したときのエラー
　ターミナルで`rails db:migarate`を実行したときに下記のようなエラーが出てきた。

```terminal
user@itpro2_ubuntu:~/travel$ rails db:migrate
== 20200727142030 AddUserRefToPost: migrating =================================
-- add_reference(:posts, :user, {:foreign_key=>true})
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: user_id: ALTER TABLE "posts" ADD "user_id" integer
/home/user/travel/db/migrate/20200727142030_add_user_ref_to_post.rb:3:in `change'
/home/user/travel/bin/rails:9:in `require'
/home/user/travel/bin/rails:9:in `<top (required)>'
/home/user/travel/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

以下省略
```

#原因と解決方法
　この前のコマンドではマイグレーションで何らかのエラーが起きてしまっている。

```terminal
データベースのリセットを行う
$ rails db:migrate:reset

$ rails db:migrate
```

<font color=blue>`rails db:migrate:reset`でデータベースのリセットを行うと、データベースの中身が消えてしまうので注意する</font>
renderメソッドとredirect_toの違い

**※この記事は私の勘違いが含まれています。正確な内容はコメント欄でご指摘頂いている通りです。**

　ツイッターのようなツイートアプリを作成中なのですが、表題の通りrenderとredirect_toの違いってなんや？
と思い私なりの結論が出たのでアウトプットのため、記事にしています。

#結論
- renderは同じコントローラー内のファイルしか基本読み込まないため、同じコントローラーのビューファイルを表示されることに向いている。
- redirect_toはurlを指定できるので、別のコントローラーのindexのビューファイルを表示させたい場合に向いている。

この結論に至った経緯は以下の通りです。
まずは以下のコードを見てください。

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController

  def edit
  end

  def update
    if current_user.update(user_params)
      redirect_to root_path
    else
      render :edit
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email)
  end
end
```
これはユーザー管理用のusersコントローラーの記述です。
`updete`アクションで、ユーザーアカウントの編集ができた場合は`root_path（messageコントローラーのindexアクション）`へリダイレクトする。
できなかった場合は`render :edit`で再度編集画面（`users`コントローラーの`edit`のビューファイル）へ戻すというものです。

では`redirect`を`render`に変えた場合どうなるのか考えてみました。

```ruby
def update
    if current_user.update(user_params)
      render template : "messages/index"
    else
      render :edit
```
これで同じになったやろ！
と思ったらエラーになりました。
原因は`message/index`のビューファイルは部分テンプレートを使用していたからでした。

```erb:app/views/messages/index.html.erb
<div class="wrapper">
  <div class="side-ber">
    <%= render "side_bar" %>
  </div>
  <div class="chat">
    <%= render "main_chat" %>
  </div>
</div>
```
　ここでmessagesフォルダ内にある部分テンプレート`side_bar`,`main_chat`を読み込むという記述があります。
　試しに部分テンプレートを`app/views/users`フォルダの直下に入れたら正常に表示されました。
###以上のことからわかったこと
- `users`コントローラーから`messages/index`のビューファイルだけを呼び出した。
- ビューファイル内に部分テンプレートを呼び出すコードがあったため`users`のビューファイル内で部分テンプレートを呼び出そうとしたが部分テンプレートがないためエラーになった。



###まとめ
- 同じコントローラーのビューファイルを指定する場合は`render`の方が早い
- redirect_toはリクエストがルーティングに戻されるので別コントローラーのビューファイルを表示させる時に使う。
【小ネタ】Realm Studioを使ってGUIでRealmをいじる

# はじめに
SwiftでWebsocketのチャットを触っているときに、RealmSwiftでいちいちデータの状態をいろいろ変えたりするのが面倒だったので、ラクなやり方を探してみました。
データの登録や削除や編集がGUIで簡単にできました！

## Realm Studio
[Realm Studio](https://realm.io/jp/products/realm-studio/)をダウンロードします。

<img width="1440" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/6f73c8f0-5ed1-9734-fab6-722f4c67ac92.png">

僕はMacだったのでMac用のものをダウンロードしました。
開発元が確認できませんみたいなのが表示されたら、**システム環境設定**の**セキュリティとプライバシー**のところを確認してみるといいと思います。

## Realmファイルを開く
次は、Realm Studioで編集するためのRealmファイルを見つけます。
[こちらの記事](https://qiita.com/i_nak/items/5d6062333b205275b85b)がとても参考になりました。

```swift
print(Realm.Configuration.defaultConfiguration.fileURL!)
```

この`print()`で出力されたパスをfinderで`command + shift + G`で開き、そのディレクトリをRealm Studioで開きます。
これでDBの管理画面のようなものが表示されると思います。

<img width="1403" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/efb8cdc5-fc0c-9dc5-caa7-17785422cf1f.png">

# さいごに
本当はチャットの部分も載せたかったのですが、まだ公開ができないのでRealm Studioの導入の部分だけ載せておきました。
ありがとうございました。

# 参考リンク
> https://qiita.com/i_nak/items/5d6062333b205275b85b
Unityでアセットをインポートするときに忘れてしまいそうなこと

さて、Unityの2020がようやく！リリースされました。その際に、いつも使っているアセットをインポートすることになるのですが、たまーにこういう警告が出ます。

![unity_asset_caution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101034/171722cf-32a3-7dab-9534-0c7952647467.png)

こういうときは、すかさず！　「スキップ」を押します。

「インストール／アップグレード」を選ぶと大抵ロクな結果になりません。
内包しているアセットより古いバージョンのものがインストールされて（アップグレードとか言いながら…）、原因不明のエラーに苛まされることになります。

という Unity の罠に引っかからないように皆さん良い Unity ライフを！
[Swift] var-forパターンを避けよう

# はじめに

**var-forパターン**は既存の言葉ではありません。
このアンチパターンよく見かけるので自分で**var-forパターンと勝手に命名**しました。
コードレビューとかで**「これvar-forパターンだよね」**という感じで使えるかもしれません。

本記事の内容はSwiftの初心者向けです。

# var-forパターンとは

以下のような**一時変数varとfor文（forEach、while、repeat-whileなども含む）**を利用したロジックです。

例題）1から10までの整数を3倍して、6の倍数のみの配列を生成

```swift
var result = [Int]()
for number in 1...10 {
    let tripleNumber =  number * 3
    if tripleNumber % 6 == 0 {
        result += [tripleNumber]
    }
}
```

よくあるのが、配列から特定の条件を満たした別の配列を作る時です。

## var-forパターンの置き換え

たいていのvar-forパターンは以下のように**mapやcompactMap、filter、reduce**などの高階関数で置き換えられます。
※高階関数がわからない方向けの記事：[イメージで理解するSwiftの高階関数（filter, map, reduce, compactMap, flatMap）](https://qiita.com/shtnkgm/items/eaad3c6ab368463de8e3)

```swift
let result = (1...10)
    .map { $0 * 3 }
    .filter { $0 % 6 == 0 }
```

## var-forパターンのデメリット

### 可読性が低い

読み手の頭の中を想像して、var-forパターンのロジックを日本語にしてみます。

```swift
var result = [Int]() // 要素がInt型のresultという名前の配列を定義し、空で初期化する
for number in 1...10 { // 1から10までループさせ
    let tripleNumber =  number * 3 // numberを3倍したtripleNumberという名前の定数を用意する
    if tripleNumber % 6 == 0 { // もしもtripleNumberが6で割り切れたら、
        result += [tripleNumber] // resultにtripleNumberを追加する
    } // tripleNumberが6で割り切れなければ何もしない
}
```

次に、高階関数を利用したパターンです。

```swift
let result = (1...10) // 1から10までの整数を
    .map { $0 * 3 } // 3倍して、
    .filter { $0 % 6 == 0 } // 6の倍数のみにした定数resultを定義
```

上記を比較してみます。

**var-forパターン**

> 要素がInt型のresultという名前の配列を定義し、空で初期化する、1から10までループさせ、numberを3倍したtripleNumberという名前の定数を用意する、もしもtripleNumberが6で割り切れたら、resultにtripleNumberを追加する、tripleNumberが6で割り切れなければ何もしない

**高階関数パターン**
> 1から10までの整数を3倍して、6の倍数のみにした定数resultを定義

どちらがわかりやすいでしょうか？
後者の方が例題そのものの性質をよく表現しており、より人間が読みやすく、**宣言的**なコーディングスタイルになっています。
（プログラミングパラダイムでいうと、前者は**命令型プログラミング**、後者は**宣言型プログラミング**と分類できます）

### 修正がしにくい

例題にこんな仕様変更があったらどう修正するでしょうか？

1から10までの整数を3倍して、6の倍数のみにした**先頭要素2つ**の配列を生成

var-forパターンの場合、このような修正が思いつきますが、**要素数が2個未満の場合に要素を追加する**というのはあまり宣言的ではなく、`result.count =< 2`のような間違ったコードを書いてしまう可能性もあります。

```swift
var result = [Int]()
for number in 1...10 {
    let tripleNumber =  number * 3
    if tripleNumber % 6 == 0 && result.count < 2 {
        result += [tripleNumber]
    }
}
```

高階関数パターンであれば、以下のようにprefixを追加するだけです。

```swift
let result = (1...10)
    .map { $0 * 3 }
    .filter { $0 % 6 == 0 }
    .prefix(2)
```

### バグを生みやすい

**修正がしにくい**にも書きましたが、可読性が悪い、変更がしづらいというのはバグを生みやすいコードです。
また、let定数でなく、var変数のように、コード内に値が変化する箇所があるというのもバグを生みやすい原因になります。

よりバグの少ないない安全なプログラムを作るには**変化する箇所をできるだけ減らす**ことが有効です。
状態がなく、変化しないものはテストパターンが少なく済むので、バグを見逃す確率がぐっと減ります。

 - varよりもletをなるべく使う（変化させない）
 - class（参照型）よりもstruct/enum（値型）を使う（変化を伝播させない）
 - プリミティブ型よりも独自型やenumを利用する（変化する値のとりうる範囲を制限する）

# まとめ

 - var-forパターンよりも高階関数を利用する
 - var-forパターンは可読性、修正しやすさ、安全さが劣る場合がある
【git】日常的に使うgitコマンドとそれを使う理由（？）のまとめ

## はじめに

自分が日常的に使っているgitコマンドとそれを使う理由（？）のようなものを備忘録がてらまとめる

なお、チーム開発かつGitHubやBitbucketなどを利用することを想定している

## 変更をステージング

```
$ git add [ファイル名]
```

## 全ての変更を一括でステージング（あまり使わない）

これはあまり使うべきでないかと（個人的な意見）
そのコミットに含めるべきでない変更点までコミットしてしまう危険性があるため

```
$ git add .
```

## コミット

コミットメッセージは英語でも日本語でも良いので基本的につける

```
$ git commit -m "コミットメッセージ"
```

## リモートのhogeブランチにプッシュ

たまにプッシュに失敗することがあるが、リモートリポジトリの権限が原因であることが多い気がする
リポジトリをいじれる権限が与えられているか、sshkeyが追加されているか、など確認すれば解決は難しくないはず

```
$ git push origin hoge
```

rebaseした後はローカルとリモートのブランチで整合性がとれないため、強制プッシュする必要あり
（rebaseについては後述）

```
$ git push -f origin hoge
```

## リモートのhogeブランチをプル

プッシュと同じく、失敗することがたまにあるが、原因はプッシュできない場合とおそらく同じ

```
$ git pull origin hoge
```

## ローカルにあるブランチ一覧の確認と現在いるブランチの確認

```
$ git branch
```

## ローカルブランチの削除

例えば、``feature/hoge``ブランチをリモートにプッシュし、そのブランチがリモートで``dev``にマージされた場合、ローカルの``feature/hoge``ブランチは不要になる
不要なブランチは削除する必要あり

```
$ git branch -D feature/hoge
```

## 最新のコミット確認

```
$ git show
```

## ログ確認

基本的に見やすくなるためのオプションをつけて使う

```
# オプションなし
$ git log

# 見やすくするためのオプション
$ git log --graph --oneline
```

## ブランチの分岐点を修正する

rebaseを使う
rebaseは共同開発でめちゃくちゃ使う
developブランチに対してrebaseすることが多いかと

※厳密には、rebase＝ブランチの分岐点を修正、ではないので注意

```
# 現在のブランチをdevelopブランチにrebaseする
$ git rebase develop
```

### rebaseを使う場面

基本的な開発は以下の流れで進むと思う

- ``develop``ブランチから``feature/hogehoge``などといったブランチを切って作業する
- 作業終了後、developブランチにマージするようなプルリクエストをGitHubやBitbucket上で作成する
- プルリクが承諾されたらいよいよマージ

**このマージされる段階で、``feature/hogehoge``ブランチは``develop``ブランチの先端から生えている必要がある**
**もし先端から生えていない（つまり``feature/hogehoge``ブランチを作成したときよりも``develop``ブランチが進んでいる）場合、rebaseが必要になる**

## コミットをまとめる

こちらでもrebaseを使う

```
# 最新のコミットとその1つ前のコミットをまとめる
$ git rebase HEAD~~
```

上記のコマンドを叩くと、vimエディタが開き、下記のようなものが表示されるかと

```
pick コミットID コミットメッセージ
pick コミットID コミットメッセージ
```

上記を下記のように修正

```
pick コミットID コミットメッセージ
s コミットID コミットメッセージ
```

コミットメッセージを編集する画面に移るので、編集すればOK

> 参考
[rebase -i でコミットをまとめる - Qiita](https://qiita.com/takke/items/3400b55becfd72769214)

## 一時退避、stash

別のブランチに移動して作業したい
でも、現在のブランチでの変更はコミットしたくないし、変更点を他のブランチに持っていくこともしたくない（addする前の変更点はブランチ移動すると一緒に持っていくことができてしまう）

そんな時にstashを使う
名前やメッセージをつけてstashすると管理しやすいかと

```
# 現在stashされているものの一覧確認
$ git stash list

# 名前というかメッセージをつけてstashする
$ git stash save [メッセージ]

# stashしたものを戻し、stash一覧から削除
# nはstashした際に自動的に振り分けられる番号、stash listで確認できる
$ git pop stash{n}
```

## 後からgitignoreを適用させる

``.gitignore``ファイルに無視したいファイルを記述しても、すでにgit管理下にある（追跡されている）ものは無視してくれない
このような場合、対処法は2パターン

その1

```
# キャッシュを全て削除（git管理下から全て削除）する方法
$ git rm -r --cached .
```

その2

```
# .gitignoreファイルの内容を反映させる方法
$ git rm --cached `git ls-files --full-name -i --exclude-from=.gitignore`
```

上記のいずれかをやった後、addしてコミットすればOK

> 参考
[あとからまとめて.gitignoreする方法 - Qiita](https://qiita.com/yuuAn/items/b1d1df2e810fd6b92574)

## さいごに

rebaseコマンドを使う部分に関しては、誤解を生むような表現を用いている可能性が高く、また、本記事通りのコマンドを使っても上手くいかない場面も多いかと思うので、別途調べていただければ

修正点や追加点などあれば随時更新する
Cg/HLSLにおけるswizzling, smearing, maskingについて

# ShaderにおけるSwizzlingとは何か
ShaderにおけるSwizzlingとは、 packed array、つまり複数の要素を持つ型において要素の順番を自由に入れ替えたり、適当な要素を自由に選んで代入することが出来る機能のことを指します。

```hlsl:入れ替えの例
// 赤と青色を入れ替えて代入する。
fixed4 input;
fixed4 output;

output = input.bgra;
```
要素数の異なる配列への代入も可能です。

```hlsl:要素削減の例
// 透明度を削って代入する。
fixed4 input;
fixed3 output;

output = input.rgb;
```

同じ要素を繰り返すことも可能です。

```hlsl:要素の繰り返しの例
// 赤色成分のみを使ったグレースケールを作成する
fixed4 input;
fixed3 output;

output = input.rrr;
```

# smearing

smearingとは、スカラー値をpacked arrayに代入した時に、要素を複製して代入してくれる機能のことを指します。

つまり、packed arrayである型に対して単一の値を代入した場合、全部の要素に同じ値を代入してくれるという意味です。

```hlsl:smearingの例
// 黒色と白色を作成する
fixed3 black = 0; // (0, 0, 0)という値が代入される
fixed3 white = 1; // (1, 1, 1)という値が代入される
```

この機能はglslにはなさそうで、Cg/HLSL特有の機能だと思います（hlslのリファレンスがどこにあるか分からないので、思うだけです）。

# masking

maskingとは、packed array型の一部の要素を選択して値を代入できる機能です。

```hlsl:maskingの例
// 赤色と緑色のみ抽出する
fixed3 input;
fixed3 output;
output.rg = input.rg; // 青はそのまま
```

# GLSLにおけるswizzling, smearing, masking
GLSLにおいてはswizzlingとmaskingは使うことができますが、smearingの機能はありません。
vec3やvec4などを作って代入すれば同等のことができます。

```glsl:smearingの例
// 黒色と白色を作成する
vec3 black = vec3(0); // (0, 0, 0)という値が代入される
vec3 white = vec3(1); // (1, 1, 1)という値が代入される
```

# 参考文献
UNITY 5.x SHADER AND EFFECTS COOKBOOK ：https://www.amazon.co.jp/Unity-5-x-Shaders-Effects-Cookbook/dp/1785285246
[Git]よく使うgitコマンド一覧（初心者編）

#概要
プログラミングの勉強を始めて1ヶ月目でよく使ったgitコマンドです。
まだ勉強を初めて3ヶ月とかですが、参考にしてください。
間違いがあれば、指摘をいただけますと助かります。


#初期設定

この設定を行うことでgit hubに草を生やすことができる。
pushをしても草が生えないときはこの設定を忘れていることが多い。（多分）

```
$ git config --global user.name "XXXX"
$ git config --global user.email "XXXX@hogehoge.com"
```

#ローカルにリポジトリを作成しリモートにpush
新規でリポジトリを作成して、pushするときはこの流れ！
git add * の「*」は「全てのファイル」を意味する。

```
$ git init
$ git add *
$ git commit -m "Initial commit"
$ git remote add origin https://github.com/XXXX/XXXXXX.git
$ git push -u origin master
```

#現在のリポジトリを確認

```
$ git remote -v
```

#リモートの変更をローカルに反映

```
$ git pull
```