OmniAICreator/Qiita-1.07M huggingface dataset:
URLパラメータの改ざん検出をする

# 目的
* URLにユーザーごとのパラメータを埋め込んで公開したい
* Twitterなどに投稿されたとき、パラメータが改ざんされているかをチェックしたい
* 改ざん検知のために、DBなどの仕組みを使用したくない
 * （単純に、パラメータが書き換えられていないかのチェックでよい）

# 使用例
上記の目的がわかりにくいと思うので、実例を説明します。
[**三点リーダー症候群チェッカー**](https://santen-leader.nankakaku.com/)というWebサービスを作りました。
自分の過去のツイートに、どのくらい三点リーダー（…）が使用されているかを表示できます。
Twitterへのシェア機能が実装されており、自分の分析結果を動的OGP画像として共有できます。

**ユーザーごとのシェアURL**：https://santen-leader.nankakaku.com/share/Misa_Fd/32/169/FX174A
![1_動的OGP例_resize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/de82d1f9-d52c-16b6-3e57-ddd7892e5e55.png)
シェアURLは、以下のような構成をしています。
/share/{**ユーザー名**}/{**スコア分子**}/{**スコア分母**}/{**ハッシュ値**}

もしパラメータに改ざんを検出した場合は、デフォルトのOGP画像が表示されます。
**改ざんされたシェアURL**：https://santen-leader.nankakaku.com/share/Misa_Fd/100/169/FX174A
![2_改ざん検出時のOGP画像_resize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/a2914af1-21b5-da03-a061-e6b29e1be0dd.png)
このユーザ名・スコア分子・スコア分母の値を使用して動的OGP画像を作成しますが、
改ざん検出の仕組みを入れないと、ユーザーが自分のスコアを偽装できてしまいます。
分析結果をサーバに保存していないため、実際のデータと比較することもできません。
そのため、末尾にハッシュ値を付加して対策しています。

# 実装概要
大まかには、以下のような仕組みを採用しています。
**URL作成時：**シェアURL生成時に、「ユーザ名」「スコア分子」「スコア分母」「ハッシュ化文字列」を使用してハッシュ値を生成する
**改ざんチェック時：**「ユーザ名」「スコア分子」「スコア分母」「ハッシュ値」が改ざんされていないか、「ハッシュ化文字列」を使用して検証する

# 実装詳細
### URL生成時
下記ような関数を使用して、パラメータからハッシュを作成しています。

```php
public static function generateShortHash($screenName, $matchCount, $totalCount, $algo = 'CRC32') {
    $hashSource = $screenName . "/" . $matchCount . "/" . $totalCount . "/STRING_FOR_HASHING";
    return strtr(rtrim(base64_encode(pack('H*', hash($algo, $hashSource))), '='), '+/', '-_');
}
```
短いハッシュを作成するための方法は、下記の記事を参考にさせていただきました。ありがとうございました。
https://qiita.com/koriym/items/efc1c419e4b7772b65c0

### 改ざんチェック時
上記の関数を用いて、送信されたハッシュ値が一致するかを検証しています。
一致する場合は動的OGP画像を生成し、一致しない場合はデフォルトの静的OGP画像を、シェアURLのOGP画像に指定しています。

# 参考ページ
[PHPで短いハッシュ](https://qiita.com/koriym/items/efc1c419e4b7772b65c0)
「ProGrids」Unity3Dでオブジェクトの移動を超楽に出来る無料ツール

#はじめに
※この記事で使用されているUnityのバージョンは2019.4.11f1です
私は九州工業大学C3所属のゆうきと言います。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081451/161ebab9-6b04-5304-4953-588ccae5c6d8.png)
皆さんUnityで作業をしているとき、上の画像の様な状況から、2つのキューブをきれいに整列させたいときどうしますか？
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081451/ebe89a66-f0f2-7638-14c7-2b28debd4c39.png)
私がUnityをさわり始めたときはTransformコンポーネントのpositionの値を書き換えていました。
しかし、
**これでは効率が悪い！**
ということで今回はオブジェクトの移動を楽にする無料ツールを紹介します。
#ProGrids
UnityのパッケージマネージャーからProgridsというパッケージをインポートすることが出来ます。（インポートの方法は後述）
![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081451/4b9dcfb6-f4fa-e5ac-5b7c-8c85f3e04cbc.png)
ProGridsのインポート後のSceneビューはこんな感じです。
ProGrids導入前と比べると、グリッド線が引かれたのが分かると思います。
この状態で矢印を引っ張ってオブジェクトを動かしてみると...
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081451/ec5ec02b-461d-935c-336d-001f1a8b7e72.gif)
Transformコンポーネントを触ること無くオブジェクトの整列が出来ました！
このようにProGridsを導入することで、オブジェクトの整列に無駄な時間を掛けること無く開発を進められるようになるので是非使ってみてください。
さらに詳しい説明が見たい方は[公式ドキュメント](https://docs.unity3d.com/Packages/com.unity.progrids@3.0/manual/index.html)などを読んでみてください。
#ProGridsの導入法
Progridsの導入方法を説明します。
![キャプチャ3_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081451/db65d82f-73fc-31ee-1625-b0437dedf124.png)
Unityエディタの左上にあるWindowをクリック、その後PackageManagerをクリックしてください。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081451/7c72c311-7981-e9ea-420b-2ed546542403.png)
するとPacageManagerウィンドウが開きます。
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081451/e9248d5b-b3d8-1925-ea61-5ad030c6970c.png)
Advancedをクリックして、Show preview packagesを選択してください。
(Unity2020ではProject Settings -> PackageManagerから
Enable Preview Packagesをオンにしてください)
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081451/327e347b-32a6-aae2-bb46-b39a8666e6ad.png)
右上の検索ボックスにProと入力するとProGridsが出てくるので、Installボタンを押すとProGridsのインストールが始まります。

#最後に
最後まで読んでいただきありがとうございました。
私の所属する九州工業大学C3のgameコミュニティでは、覚え書きとして毎週コミュニティメンバーがゲーム制作関連の記事を書くという試みを始めました。今回が覚え書き企画の第一回です。今後私以外の部員の記事が毎週投稿される予定です。もしよろしければ他の部員の記事も読んでいただけると幸いです。

[各種リンク]
[C3 Twitter](https://twitter.com/c3_kyutech)
[C3 Youtube](https://www.youtube.com/channel/UCeRY2jujVBYRqmilrCZytFw)
[次の記事]（2/12までには投稿されるはず）
error messageに書くべきこと

# error messageに絶対書くべきこと

## 背景
- 世の中にあるエラーメッセージの程度が低くなっている気がする。元から低い？
- コードはシンプルに綺麗に！というのが曲解されてエラーメッセージもシンプルにされた？
- 「失敗しました。◯◯である必要があります」というエラーメッセージにすごくイライラしている。で、どうすれば良いんだよ、、が多い。

という問題に何度か遭遇して考えて自分の結論を出したので残しておく
（あとググってもそういう記事があまりなかった。error messageのhow toはあるけど、should beがない！）

## 答え

### 「どこ」で、 where
### 「あなたのどの入力が」、 what
### 「何のルールに抵触して失敗した」、  why
### 「だからどうする」  how to

（順番はもう少し考える必要があるかも。）

## サンプル

- 「権限が不足しています」
-> 　リソース設定の変更に失敗しました。あなたの権限「user」の権限では、リソース「xx」の設定を変更することができません。設定のためには「admin」権限を持つユーザが行うか、xxの箇所からあなたの権限を設定してください。

- 「ユーザ名が不正です」
-> ユーザ名の入力に失敗しました。入力された記号「ω」は、ユーザ名には許可されていません。ユーザ名は英数字及び「-」のみで入力してください。

- 「DB connect failed.」
->DB connect failed. Can't open socket. Connection was over-flow. Properly closed socket?

## 後書き
- もっといいやり方知っている人は教えてください
ABC189 C コーディングお嬢様

「な、なんですのこれは……！」
お嬢様は大変困惑しておられました。日々忙しくお勤めを果たすメイドの私にとって、週末のこの時間はいつも楽しみでなりません。
今日もコンテストがあるから21:00以降は入るなと言われていたのですが、集中しているお嬢様は部屋の扉をちょっと開けて覗き見したくらいではこちらに気づくことはありません。
解けない問題を前に呻くお嬢様を見る至福の時間。このために毎日毎日過酷な労働をしていると言っても過言ではありません。
さて、うっすら見える画面からしてあれはたぶん……C問題ですかね？
おやおや珍しい。一応緑(ギリギリ)のお嬢様が300点問題に手こずるなんて……。
私は音を立てないようにノートPCを開いて確認します。
https://atcoder.jp/contests/abc189/tasks/abc189_c
あーなるほど。たぶんお嬢様が困っているのは……。

---------------------------------------
「おかしいですわ……普通C問題がこんなに難しいはずがない……」
解法はすぐ思いつきましたが制約はなんと$1≦N≦10^4$。わたくしの考えた解法は$O(N^2)$。つまり計算回数は最大$10^8$回……。
「pythonで間に合うわけがない……！」
精進中に何度「TLE」の文字に泣いたことか……！
今回はすでにB問題で1WA。(誤差をうっかりしましたわ。あれほど小数点に気をつけろと言われていたのに！)「とりあえず提出」でまたペナルティを食らうわけにはいかない……！
「一旦落ち着きましょう……」
机の角に積んだA4用紙(裏紙)を一枚取って図を書く。
……やはり区間の最小値を取って掛け算するくらいしか思いつきません。
「もしや……」
脳裏に浮かんだのは最近見た競プロ解説動画。
googleを開き、打ち込む。

『セグメントツリー』

これを使えば区間の最小値とかがすぐに出せる！(らしい。よくはわかってない)

「しかし」

結局すべての区間を調べるのだから$O(N^2)$は変わっていない気がする……。
それにもし想定解が「セグメントツリー」の300点問題が出てきたらchokudaiのツイッターを荒らさなければ……。AtCoder昔より厳しくなったといえどそんなはずはない……。いやでもこの前F問題が緑diffになっていましたわね……ならこれくらいの難化もありうる……？
いやいやそもそもセグメントツリーを使っても$O(N^2)$以上になるのは変わりないし……。
あ、もしかして遅延セグメントツリーとかそういう……いや遅延セグメントツリーがなにかは知らないけれど……。なんかセグメントツリーの上位互換みたいなやつ……。
あ、あれか？DPか？またDPか？なんだDPって？もうDPやめてくれ。
「ぐぅぅ……」

---------------------------------------
そろそろコンテストも終わりの時間……。Fはわかりませんでしたけどほかはそこまで難しくなかったですね。お嬢様の画面を見てしまっているので提出が出来ないのは歯がゆいところですが。
さて、お嬢様は……おや。
まだCが解けていないみたいですね。C問題を上下にスクロールしながら呻いているのが見えます。愉快。
お嬢様の順位は……お、Dは解けたみたいですね。解けないCを早めに保留したのは成長でしょうか。まあDも1wa出してますけど……。
コンテスト終了まで5,4,3,2,1……。
「お嬢様ー！」
「ぐぅぅ……」
「おじょうさまぁー！」
「な、入ってくるなと言ったのに！」
「いやいやもうコンテスト終わりましたから。どうでしたか出来は？」
「……まずまずね」
「あ、4完でしたか？」
「……さんかん」
「あ、ABCだけですか？」
「……ABとD」
「え？」
私はわざとらしく驚いて見せます。
「え？」
「……」
「C、解けなかったんですか？？？」
「……」
「あらー残念ですねー、じゃ、解答を見ましょうか！」
お嬢様からマウスをお借りし、C問題の解答を見せます。
読んでいくうちにみるみる顔色が変わるお嬢様。ああ、かわいい。
「え……これ……二重ループで通るの？」
「とおりますね。まあループの中の計算量が大したことないですしこれくらいなら」
「$10^8$回？」
「はい」
「いちおくかい？」
「はい」
「pythonでも？？？」
「pythonは無理じゃないですか？」
「……」
「……」
「……おのれchokudai……。pythonが通らない想定解だと……！！！」
お嬢様、大変お怒りですね。とってもかわいい。
「まあpypyなら通りますけどね。余裕で」
「……」
「ていうかなんでC++使わないんですか？強い人みんなC++おすすめしてますけど」
「……」
「まあpythonでも工夫すれば$O(N)$にできるんで通りますけどね。最大長方形問題ってご存じないですか？わりと昔の典型」
「……」
「ほらほらお嬢様、pypyで通してる人いっぱいいますよぉ？pythonでも解けた人ちらほらいらっしゃいますねぇ」
「……すいませんでした」
ふふふ。かーわいい。
「さ、一緒に解説放送見ましょ！」
「次はとおすぅ……」

---------------------------------------
ゲーミングお嬢様みたいなやつを書きたかった。
およそQiitaに投稿する内容じゃないけどこの話がわかる人間が他の場所を見る気がしなかったのでここに投げる。
【面接受け】インフラエンジニアの志望動機

## はじめに
はじめまして！
閲覧していただきありがとうございます。

インフラエンジニアを目指していく中で、「なぜインフラエンジニアなのか」という面接が非常に多かったです。（会社の志望動機よりも）

そんな中で私の「なぜインフラエンジニアなのか」に対する答えは非常に評判がよく、インフラエンジニアを目指している方の参考になれば、、、と思い投稿させていただきます！
## 私のインフラエンジニアの志望動機
私がインフラエンジニアを目指したきっかけは、AWSのSnowMobileというサービスを知ったことがきっかけでインフラエンジニアを目指すようになりました。
___
### AWS Snow Mobileについて
AWS Snow Mobileについてはこちらの記事を参考にしました↓
https://dev.classmethod.jp/articles/amazon-snowmobile-released/

簡単に説明すると、
①, オンプレミス環境からクラウド環境にデータを移すサービスである
②, どでかいストレージを積んだトラックでクライアントのデータセンターに行き、クラウド化する
___

## 「なぜインフラエンジニアを志望したか」に対する流れ
#### まずは結論からです。

私がインフラエンジニアを目指したきっかけは、AWSのSnowMobileというサービスが非常に斬新で、「このような素晴らしいサービスを使いこなして、クライアントに提案、提供できるようなエンジニアになりたい」と思い、クラウドの根幹技術であるインフラエンジニアを目指すようになりました。

#### AWS Snow Mobile について説明
肌感で95%の面接官はSnow Mobile に食いついてきます。
食いついたらドヤ顔で説明してやりましょう！

Snow Mobileというサービスはオンプレミス環境からクラウド環境へデータを移すサービスです。
その方法が、ストレージを積んだトラックでクライアントのデータセンターに行きクラウド化する、という方法なのですが、私はこのやり方を知ったときに衝撃を受けました。

おそらく「データの移動速度を早くしたい」という課題があったのだと考えます。
私であれば「どうしたら通信速度を向上できるのか」について考えると思います。
しかしこのサービスは、物流の力を使って、データの移動速度を飛躍的に向上させました。

こういった素晴らしい画期的なサービスを使いこなして価値提供できたら、よりクライアントの役に立つことができると考えました。

## 評価していただいたポイント
①, しっかりと技術情報を学習している
②, 自分の意見があってgood!
③, キャリアプランを考えられている

## まとめ
インフラエンジニアを目指す理由は人それぞれだと思います。
しかし面接で言えない理由の方も多くいるのでは？

そういった方の役に立ったら嬉しいです。
【Git】超わかりやすくまとめたチーム開発で頻繁に使うGitチート集 (随時更新)

自分がチーム開発で使うgitコマンドをここにまとめていく。
常にアップデートしていく。
間違っているものがあれば教えていただけると嬉しいです。
# Gitのpushまでの基本的な流れ
## git initを使えるようにする
これで自分が作成したプロジェクトでgitが使えるようになる。

```
$ git init
```
## git add 変更した内容をインデックスに追加する
インデックスってなんか難しいから、僕は[選択]とかそんな風にaddを覚えている。
このadd .で、変更した全てのファイル・ディレクトリを選択できる。

```
$git add .
```
これでもaddできる。選択したいファイル名を入力する。

```
$ git add [ファイル名]
```
## git commit コミットする
addしたらcommitする。この流れは絶対。commitは、僕はaddで選択したファイルたちをgitさんに引き渡すみたいな感じで覚えている。

```
$ git commit -m "コミットメッセージ"
```
コミットはほぼこれしか使わない。ほかにもやり方あるが、これが早くて楽。
### git commit -v　
この-vオプションをつけると、変更した履歴をcommitする際にも確認することができるらしい。
慎重にコミットをしたい時は、この-vをつけてみてもいいかもしれない.

## git push リモートリポジトリにpushする
commitをしたらそれをリモートリポジトリにpushする。これによって、GitHubやGitlabなどでプルリクエストをすることができる。プルリクエストをすると、チーム開発ではほかの開発者の方にコードレビューをしてもらえたりする。

```
$ git push origin [作業ブランチ名]
```

#Gitのローカルでめちゃくちゃよく使うコマンド
## git branch 自分が今どこのブランチにいるのかを確認
これで、自分がいまどこのブランチにいるのかを確認することができる。
これを僕はひたすらやっている。

```
$ git branch
```
これをすると、こんな感じで自分がいまどこのブランチにいるのか印がつく。さらには、今ローカルにどのブランチが存在死しているのかを確認することができる。

```
  feature/company
* develop
  master
```
## git checkout ブランチを移動する
ブランチを移動したいときはこうする。

```
$ git checkout [ブランチ名]
```
これで、ブランチを移動することができるが、まだブランチを作成していないときにブランチを作ってそのまま移動することもできる。それがこれ。

```
$ git checkout -b [ブランチ名]
```
-bのオプションをgit checkoutの後ろにつけることでブランチを作成＆移動もできる。便利。
## git status ブランチの状態を確認する
自分のブランチで作業をして、変更を加えた時にaddしたかcommitしたかpushしたのかを確認することができるコマンド。

```
$ git status
```
このコマンドを叩くと、自分が変更を加えたファイルたちが赤く表示される。
例えば、こんな感じ、、、、⏬
![スクリーンショット 2021-02-05 1.24.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628093/91bd2772-7756-5457-980c-80207364e64e.png)
逆にgit add してある状態だと、こんな感じ、、、、⏬
![スクリーンショット 2021-02-05 1.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628093/c8e85719-44e5-06f3-0356-3510a49dc750.png)

ほかにもいろんなことを確認できるが試してみてください。
僕は常にこのgit statusを作業中は死ぬほどやれと教わりました。
だから、自分の作業ブランチでコードを書いている時は変更を加えた時やプルリクエストを出そうとしているときに何十回もこのgit statusをばちばち叩くようにしている。というか、染み付いた。

# Gitのローカルでまぁまぁよく使うコマンド
## git stash 変更したものを一時退避させたい
自分の作業ブランチで変更を加えた時、そして、git addをしたけど、やっぱりこの変更は一旦保留にしたいというときに使えるのがこのコマンド。

```
$ git stash -u 
```
逆にこの退避させたものをまた元に戻したい時は、、、

```
$ git stash apply
```
git stash applyというコマンドを叩く。これで、stashした直前のものを元に戻すことができる.

## git checkout . 　変更を削除する
変更を加えた時に「やっぱりさっきの変更をなかったことにしたい」そんなときに使えるのがこのコマンド。

```
$ git checkout .
```
簡単。

## git checkout 一部のファイルの変更だけなかったことにしたい
たくさんのファイルに変更を加えたけど、○○.rbとかのひとつのファイルだけ変更を削除したいなと思った時のコマンド。

```
$ git checkout [ファイル名]
```
これで特定のファイルの変更を戻す、削除することができる。

## git diff 変更した部分を確認したいとき
変更差分を確認したときにこのコマンドを使う。あんまり、差分ってなんかよくわからないから、ようするに変更した前と後が確認できるということだと思う。

```
$ git diff
```
基本的には、これだけで変更差分が確認できる。
```git diff <ファイル名>```とすれば、特定のファイルの変更差分が確認できる。
【WindowsServer】脆弱性対策：SWEET32対応（3DES暗号の無効化）

# この投稿の主題
外部公開のWindows Server 2019への脆弱性診断で検出された
[SWEET32 64ビットブロックのTLS暗号に対する誕生日攻撃（CVE-2016-2183）](https://access.redhat.com/ja/articles/2607321)
への対応として、「TLS_RSA_WITH_3DES_EDE_CBC_SHA」を無効化します。

# ハマりポイント
（※Windows Server（2019 試用版）日本語環境にて）
WindowsのUIから自動生成された文字列（後述手順の④）が、不正な文字列になっている。
（具体的には半角カンマで区切る必要がある文字列が、全角カンマで区切られて生成される）

この状態で保存・設定してしまうと暗号スイート全てが無効になり、
脆弱性に対処するどころか暗号化通信が一切できなくなってしまう。

# 対応にあたって
基本的には以下、 @shanneism さんの投稿が参考になりました。
[Windows 2012 Server で利用可能なCipherSuite を設定する](https://qiita.com/shanneism/items/03ab6589d75e508ca075)

以下、確認用のツールとしてNARTACの[IIS Crypto](https://www.nartac.com/Products/IISCrypto)を利用していますが、
本設定にあたっては必要なツールではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/d415ccbe-8dad-4aa2-ab04-ce2197c4bdbc.png)

IIS Cryptoはインストール不要で、ダブルクリックして実行することで利用できます。
今回の原因に気づくキッカケになったツールではあるので、検証環境などでは利用をお勧めします。

# 対応手順
それでは、設定手順をまとめていきます。

①検索で「gpedit.msc」と入力、ローカルグループポリシーエディタを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/bcefa808-0d49-4b8a-63c5-5540f9136511.png)

②コンピュータの構成で「管理用テンプレート」→「ネットワーク」→「SSL構成設定」と選択し、
右側ペインの「SSL暗号の順位」を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/affab54f-d708-e1fc-fbf7-829d3fc9b17c.png)

③「有効」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/c01faec3-c45e-5f63-0ab9-017574e689af.png)

④以下赤枠SSL暗号の文字列を全選択してコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/87b76be2-09e0-f785-c7eb-426f0ae73206.png)

⑤メモ帳などエディタにペーストし、 **全角の「、」を半角「,」に全置換** する
（これを行わないと、有効な設定になりません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/02d0677c-9c00-ddc2-c024-06aeec932b9f.png)

⑥「TLS_RSA_WITH_3DES_EDE_CBC_SHA,」を検索して削除する
（以下キャプチャでは、空文字に置換している）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/3d917933-a247-7081-6773-a2a0bb500a21.png)

⑦上記まで編集した文字列をすべてコピーし、以下赤枠の文字列を上書きする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/aeb98f93-5f98-0e2c-e232-731ee8adb613.png)
上記作業後にIIS Cryptoで確認すると、
「TLS_RSA_WITH_3DES_EDE_CBC_SHA」のチェックが外れていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/7b238634-b79c-6f84-b3d8-67ce087805a7.png)

ちなみに、⑤を行わないと全体で一つの暗号スイートとして表示される。
が、当然有効な文字列ではないようで、全ての暗号スイートのチェックが外れた状態となる。
（httpsでの通信が失敗するようになります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540892/0bfb8a26-8754-0f7b-83f5-dedb0231c847.png)

⑧Windowsを再起動する

3DES暗号の無効化作業は以上で完了です。
脆弱性診断でも検出されなくなり、無事0件となりました。

# 懸念
本設定によりリモートデスクトップ接続ができなくなるWindowsがあるとの文献があります。
[Windows 10で脆弱な暗号を削除すると、発信RDPが破損する](https://www.it-swarm.jp.net/ja/windows/windows-10%E3%81%A7%E8%84%86%E5%BC%B1%E3%81%AA%E6%9A%97%E5%8F%B7%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E7%99%BA%E4%BF%A1rdp%E3%81%8C%E7%A0%B4%E6%90%8D%E3%81%99%E3%82%8B/960035735/)
> この暗号を無効にすると、RDP from多くのWindowsステーションへのこのコンピューターが機能しなくなります（一部の2008 R2および2012 R2サーバーでは機能します）

私が対応した環境（Windows Server 2019）下ではリモートデスクトップ接続もできています。
本設定により不都合が生じる場合は、③の画面で「未構成」を選択することで元に戻すことができます。
Autify で Salesforce を動かしてみよう～ vol.0 準備編

# はじめに
- Autify で Salesforce を動かしてみよう、と思い記事にしてみます。
- TIPSなども記載できれば、と考えています。

# 読者
- Salesforce の基本的な部分について、ご存じの方。 
 - 最初以外、基本的な部分については、割愛します。

#### ご了承ください
- まだまだ勉強中の部分もあります。間違っている箇所もあるかもしれません。
- Salesforce、Autify は、この時点のバージョン(2021年1月頃) での内容になります。今後、仕様変更が変わることによって、内容の通りにならない可能性もあります。ご了承ください。
 - また、URLなども変更になっている可能性もあります。

# Salesforce ってなに？
> Salesforceは、企業と顧客をつなぐ顧客管理ソリューション。マーケティング、営業、コマース、サービスなどすべての部署で、顧客一人ひとりの情報を一元的に共有できる統合CRMプラットフォームです。

 - https://www.salesforce.com/jp/products/what-is-salesforce/ より

「SFDC (セールスフォース・ドットコム)」 とも呼ばれます。
SFDC は「マルチテナント」と言う方式を利用しています。
サーバやDBと言った機器、システム、サービスを複数の企業で共有して利用しています。

# Autify ってなに？
> 非エンジニアでも使えるアジャイル・DevOps時代のテスト自動化ツール、Autify(オーティファイ)

 - https://autify.com/ja より

ブラウザ上で操作を記録し、それをAutifyによって自動的に操作することができます。
強力な自動テストツールです。

# 準備 (Autify)
- Autify の環境が必要です。
 - 環境をお持ちではない場合「 https://autify.com/ja 」を確認してみてください。
 - 「デモ」を申し込むことができます。

- Autify の環境が用意されたら、Autify ヘルプセンターより「はじめてご利用の方」を参照して、セットアップします。
 - https://autify.zendesk.com/hc/ja/categories/900000080866-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%94%E5%88%A9%E7%94%A8%E3%81%AE%E6%96%B9
 - Autify Recorder をインストールする箇所は重要です。


# 準備 (Salesforce)
- Salesforce の環境を用意します。
 - こちらは、新規のDeveloper 組織を用意します。
  - https://developer.salesforce.com/signup
 - システム管理者のユーザを作成することになります。
- 組織が準備できたら
 - 「標準ユーザ」プロファイルをコピーして「Autifyユーザ」プロファイルを準備。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/d33acc33-60bb-edf8-f7db-adf8f0469ade.png)

 - システム管理者で「一般ユーザ」のアカウントを１つ作成します。
  - このとき、このユーザのプロファイルを「Autifyユーザ」を指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/e186e66c-40fb-df5b-f460-720abfa07cbb.png)


- テスト用のカスタムオブジェクトを作成しました。
 - カスタム項目として「テキスト」（データ型）を用意。
  - ほかの項目が必要になったら、別途用意する予定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/7c6dea37-18b7-3b25-0083-3daf269d7d6c.png)


- カスタムオブジェクトの権限をプロファイルに付与しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/8369e9de-beb2-c194-91ac-a3c2f1a20970.png)

- カスタムオブジェクトをタブに表示できるようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/70f67568-ca0a-8b8a-a3dc-db1d9dd942d2.png)

# 準備完了
- ユーザA でログインして、タブにテスト用「テスト001」が表示できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/c3e7dd5b-529f-40f8-a62c-44cc46784aeb.png)


# シナリオ作成、レコーディング、実行
- 次回につづく。　(To be continued...)

# その他
- 携帯電話を登録できるのですが、これは「電話を登録しません」を選択しました。
 - 今回の自動的テストのシナリオ上、この画面について重要ではないため。
 - 「後で知らせる」を選択すると毎回この画面が表示される。
 - シナリオを作るときにこの画面の操作もレコーディングする必要があるため。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/b6dd53b4-d46c-cc44-bbed-cf9bfae63041.png)

- ネットワークアクセス の 信頼済み IP 範囲
 - いったん未設定としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/b9538fb2-8e09-bc71-c596-9c85a8f9af26.png)

 - 理由はまた別途。

# 変更履歴
- 2021/02/06 画像を加工しました。
- 2021/02/18 タイトルを変更しました。
BacklogのIssueのタイトルとURLをマークダウンのリンクにしてクリップボードに保存するブックマークレット

Backlogを仕事で使っていると、進捗のミーティングなどの資料作成のためにBacklogのページのリンクをコピー・アンド・ペーストするような作業があり非常にだるい。

このだるさを少しでも楽にするために、Backlogのページでブックマークレットを実行して手間を減らした。

### 結果
このような`https://アカウント名.backlog.com/view/プロジェクト名-ID`BacklogのIssueのページを開いて、下記のjavascriptのブックマークレットを実行すると`[チケットID チケットタイトル](https://対象のURL)`というマークダウン形式のタイトルにリンクが付与されたものをクリップボードにコピーする

カンバンボード表示時にポップアップ表示させたIssueの表示にも対応している

```
javascript: var iframe,d;iframe=document.getElementById("issue-dialog-iframe-kanban"),d=null==iframe?document:iframe.contentWindow.document,(()=>{const e=d.querySelectorAll("span.title-group__title-text")[0].textContent,t=`[${d.querySelectorAll("span.ticket__key-number")[0].textContent} ${e}](${d.URL})`,n=d.createElement("span");n.textContent=t,d.body.appendChild(n),d.getSelection().selectAllChildren(n),d.execCommand("copy"),d.body.removeChild(n)})();
```

### 上記コードをコメントを添えながら

```javascript

var iframe, d;

// iframeを取得
iframe = document.getElementById("issue-dialog-iframe-kanban");

//iframの有無でカンバンボード表示時か、対象のIssueのページを開いているか判断する
if(iframe == null) {
  d = document
} else {
  d = iframe.contentWindow.document
}


(() => {
  // backlogのページからタイトルなど必要な要素を集める
  const ticketName = d.querySelectorAll("span.title-group__title-text")[0].textContent;

  const ticketId = d.querySelectorAll("span.ticket__key-number")[0].textContent;
  const url = d.URL;

  // クリップボードに保存する文字列を構築
  const display = `[${ticketId} ${ticketName}](${url})`;

  // 文字列をコピーするために適当なdom要素を作成し、body要素の子要素に追加する
  const tmp = d.createElement('span');
  tmp.textContent = display;
  d.body.appendChild(tmp);

  // bodyにdom要素を追加していると、対象の要素を選択できる
  d.getSelection().selectAllChildren(tmp);
  // クリップボードに選択要素をコピー
  d.execCommand("copy");
  // 追加した要素を削除して後始末
  d.body.removeChild(tmp);
})();
```
シェルスクリプトのecho出力で文字に色をつける

echoの出力で文字に色をつける場合は以下のような書き方をすることで実現できる。

```
echo -e "\033[0;32m緑色の文字\033[0;39m"
```

32の部分を変えることで別の色に変えることもできる。

| 数字 | 色 |
|:-:|:-:|
| 30 | 黒 |
| 31 | 赤 |
| 32 | 緑 |
| 33 | 黄色 |
| 34 | 青 |
| 35 | マゼンダ |
| 36 | シアン |
| 37 | 白 |
SpreadSheetから更新用SQLを生成するお手軽な方法

## マスタ修正の困りごと

いくらRailsなどでUIが楽に作れるといっても、エクセルやスプレッドシートでマスタを修正する機会はまだまだ残っています。

よくあるフローとしては、こんな感じ。

1. MySQLなどのDBからCSV出力
2. CSVをエクセルやGoogleSpreadSheetに取り込み
3. Sheet上で編集
4. CSVとして保存
5. CSVをロード

まぁ面倒。

## こんなフローはどうでしょう

1. DBeaverやSequelProなどのUIからマスタをコピー
2. GoogleSpreadSheet上にペースト
3. GoogleSpreadSheet上で編集
4. GoogleSpreadSheetの数式でSQL生成&コピー
5. DBeaverやSequelPro上でSQL実行

という流れです。ステップとしては変わりませんが。ファイルが一切登場せず、クリップボードのみのやりとりで可能です。

## スプレッドシート上でSQLを生成している例

こんなイメージです。左の黄色がDBからコピーしてきたテーブルです。黄色の部分で編集をします。灰色が中間の計算値フィールド、青色がペーストするSQL文です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/d5935bfa-3bf0-e386-9bce-7a77955b7a3b.png)
https://docs.google.com/spreadsheets/d/1TH1p92-F9X-AmyuEy7QOrLrVyGDI7QJSaMphS7TaaNs/edit#gid=0


## 各数式の説明

### カラム名をカンマで繋ぐ

JOIN関数で可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/e5847c0e-c8fc-7d2d-7f62-2ff80a00c1ae.png)

### カラム値をクォートしながらカンマで繋ぐ

ARRAYFORMULA関数は配列を引数に全要素に対して同じ計算をしてくれます。他のプログラミング言語でよく出てくるmap関数に近いです。ARRAYFORMULA関数でクォートで囲み、さらにJOIN関数を使ってカンマでつないでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/0ef406d5-a5bc-f5fb-d43e-3ddd97db03a8.png)

### カンマでつないだ各値をSQLに変換する

更新処理をするにはプライマリーキーが必要なので、今回もid列がプライマリーキーの前提です。プライマリーキーがあれば、「もし同じキーがあればUPDATEでなければinsert」というREPLACE構文が使えます。

```
replace inot [テーブル名] (カラム名をカンマでつないだ文字列) values
(値をカンマでつないだ文字列),
(値をカンマでつないだ文字列)
```

を作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/4bcfddac-ffe8-6017-0a50-942a96a03dad.png)

### 手抜きポイント

- フィールド内に出てきたクォートを本当はエスケープすべき
  - やろうと思えば、replace関数を全フィールドにかければいい
  - ARRAYFOMURAを使えば全フィールドに一回で処理できる
- 最後に余計なカンマがつく
    - 最後にカンマは不要だけどそのロジックをつけるのが面倒で最後までつけてる
    - SQL実行する前に削除するのは手間ではない
- 削除には対応してない
    - 主キーを元に削除するなら、特にスプレッドシートのUIは要らないから
    - この手のマスタは論理削除みたいなのが多いし
TypeScript："strictNullChecks"について

## 概要

TypeScript を勉強するにあたり、プログラミング初心者の私が詰まった点をメモに残す。 <br> 間違いがあれば教えていただけると幸いです。

## 環境

typescript: 4.1.2

## 考察

JavaScript はプログラムの変数が意図的に `undefined` や `null` を保持する柔軟な言語である。これらの型を保証し、より安全に開発を進める助けとなるのが TypeScript である。
<br> 例

```ts
const myExample = document.getElementById("example");
myExample.innerHTML = "Hello World!";
```

TypeScript を介してこれを実行してもエラーは起きない。
ID "example"を検索しようとしたときに存在しない場合は、myExample は `null `となり、null.innerHTML は読み取れない。

> Uncaught TypeError: Cannot read property ‘innerHTML’ of null

VSCode などの TypeScript をサポートする IDE でメソッドにカーソルを合わせると、次のように表示される。

```ts
(method) Document.getElementById(elementId: string): HTMLElement
```

実行時には二つの可能な値（`null` or `HTMLElement オブジェクト`）があるが、コンパイル時に TypeScript は、戻り値が常に単一な型になる。これは「**null 許容値**」の概念があるからである。
この動作を有効にするために必要なのは、*tsconfig.json*で`"strictNullChecks”: true`（または`“strict”: true`）を設定する。これにより、エラーが生じる。

> [ts] Object is possibly ‘null’

先程と同じようにメソッドにカーソルを合わせると、下記のようになる。

```ts
(method) Document.getElementById(elementId: string): HTMLElement | null
```

HTMLElement と null の共用型となっていることが分かる。
if などを用いて、真である事を確認することで、エラーがなくなる。<br> 例

```ts
const myExample = document.getElementById("example");
if (myExample) {
  myExample.innerHTML = "Hello World!";
}
```

MicroSoft の TypeScript チームは、"strictNullChecks”を有効にする事を勧めている。
より高品質なコードを書くことができるので、私も使っていきたい。

### 参考

書籍「実戦 TypeScript-BFF と Next.js&Nuxt.js の型定義-　著者 吉井健文」
https://jameshenry.blog/typescript-null-and-undefined-types/
WordPressのカスタム投稿タイプで権限を指定する

WordPressのカスタム投稿タイプで権限を指定するやり方です。

## やりたいこと
カスタム投稿タイプで、投稿者は公開できないようにする

## デフォルトの挙動
カスタム投稿タイプは通常の投稿と同様、投稿者は自分で公開することができる

## コード
LPというカスタム投稿タイプを作ってみます。

```php
add_action( 'init', 'create_post_type' );
function create_post_type() {

    $lp_capabilities = array(
      'edit_posts' => 'edit_lps', // 自分の投稿を編集する権限
      'edit_others_posts' => 'edit_others_lps', // 他のユーザーの投稿を編集する権限
      'publish_posts' => 'publish_lps', // 投稿を公開する権限
      'read_private_posts' => 'read_private_lps', // プライベート投稿を閲覧する権限
      'delete_posts' => 'delete_lps', // 自分の投稿を削除する権限
      'delete_private_posts' => 'delete_private_lps', // プライベート投稿を削除する権限
      'delete_published_posts' => 'delete_published_lps', // 公開済み投稿を削除する権限
      'delete_others_posts' => 'delete_others_lps', // 他のユーザーの投稿を削除する権限
      'edit_private_posts' => 'edit_private_lps', // プライベート投稿を編集する権限
      'edit_published_posts' => 'edit_published_lps', // 公開済みの投稿を編集する権限
    );
    register_post_type('lp', [
      'labels' => [
          'name'          => 'LP',
          'singular_name' => 'lp',
      ],
      'public'        => true,
      'has_archive'   => true,
      'menu_position' => 8,
      'show_in_rest'  => true,
      'capability_type' => 'lp',
      'capabilities'    => $lp_capabilities,
      'map_meta_cap'    => true
      ]);
}
```

lp_capabilitiesという変数は、カスタム投稿タイプ個別の権限を作成しています。
例えば、「publish_posts」というのが投稿を公開する権限ですが、LPのカスタム投稿タイプの場合は「publish_lps」という名前で定義します。

アンダーバーの後ろの部分がカスタム投稿タイプの名前（複数形）になっています。

専用の権限を定義しておいて、register_post_type関数でカスタム投稿タイプを作成する時に、「capabilities」で指定して登録します。

## 投稿者に個別の権限を設定する

ここから先はWordPressのプラグイン「User Role Editor」を使用するのが簡単です。

カスタム投稿タイプ「LP」は独自の権限を定義したので、「User Role Editor」で見ると以下のように上記で指定した名前の権限となっています。
このうち、以下のように「publish_lps」（投稿を公開する権限）のチェックを外して更新すると、権限の設定が完了です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049264/712807ea-732f-cd85-7e83-7b1ce7263987.png" width="200" alt="">
git logでコミット内容をファイルに出力する方法とよく使うオプション

#差分をみたいとき

```
git log -p
```

#改行でみやすくしたいとき

```
git log --oneline --graph
```

#ブランチを指定したいとき
デフォルトは現在のブランチなので指定する
####特定のブランチだけみたいとき

```
git log --first-parent <ブランチ名>
```

####全ブランチをみたいとき

```
git log --all
```

#差分のあるファイル名をみたいとき

```
git log --name-only
```

#日付指定したいとき

```
git log --since="4 days ago" --until="2015/01/22"
```

#キーワード検索したいとき
####コミットメッセージとコミットの内容
```
git log -S "キーワード" --oneline
```

####コミットメッセージのみ

```
git log --grep="キーワード"
```

#ファイル指定したいとき

```
git log -- path/to/*.sh
```

#結果をテキストファイルに出力したいとき
コマンドの末尾に > ファイル名を追記

```
 > log.txt
```

#使用例)
指定ブランチ・・feature/sample
期間・・7か月前〜2020/10/08
出力先ファイル・・sample.txt

```
git log --first-parent feature/sample --since="7 months ago" --until="2020/10/08" -p --oneline --graph > sample.txt
```

#文字化けしている場合は【windows】
環境変数に登録

```
LESSCHARSET　utf-8で登録
```

コマンドプロンプト　開き直しで反映
Azureからメールを配信する ①概念編

Azureはメール配信サービスを提供してないので、別途メール配信サービスと連携する必要があります。
SendGridがAzureとの相性が良いので、その方法を記載します。

# こうだったら楽だった(実際はできない)
Azure内にメールサーバーとメール配信サービス(またはメール配信サーバー)があって、Azure内でメール配信が完結すると楽だったのだが、実際はできなかった。下の図で、×印が存在しない。
![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/bc8e25f5-908a-562d-8eeb-ff0af262cb48.png)

# 構築する構成イメージ
メールを配信するには以下の構成を構築します。メールサーバーはどこでも良いですが、自分はお名前.comを利用しました。

* 方法①：AzureのMarket PlaceサービスからSendGridを追加

    AzureのポータルからSendGridのサービスを追加できます。一見Microsoftが提供しているサービスに見えますが、Market Place Serviceと言って外部組織が提供しているサービスをAzureは橋渡ししているだけで、設定はSendGridのサイトからになります。初期登録は簡単ですが月9.95USDの費用が掛かります(2021/02/03時点)。動作確認を時間をかけずに済ませたい場合にはこの方法がてっとり早いです。
（以前は、月額0円で利用できていたのですが、いつの間にか費用が掛かるようになってしまった。）
構成図はこんなイメージ
![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/3494a70c-cbfa-7203-068e-97af07bb2068.png)


* 方法②：Azure外でメールサービスと連携

    月額費用を絶対に払いたくない人向け。
SendGridへの初期登録時に登録者情報を詳しく聞かれるます。利用するサーバーのURLやWHOISの設定などが完了してない場合は、初期登録が完了するまで時間が掛かります。自分は方法①でサクっと動作検証を済ませて、本格的に利用するようになってから方法②で登録しました。
構成図はこんなイメージ
![img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284238/9c6e4b04-f2b9-09fe-73ac-490b66dc05eb.png)


つづく
C言語の関数をC++言語で利用する方法

#参考サイト
http://www7b.biglobe.ne.jp/robe/cpphtml/html03/cpp03047.html

>Ｃ言語とＣ＋＋言語では、関数名の内部表現が異なる。
>Ｃ＋＋からＣの関数を使うときは、プロトタイプの前に extern "C" をつける。

#メモ

拡張言語だから丸っと使えるかと思っていたが、
宣言型（C）とクラス型（C++)という構造の違いがある。　

@@YAHPBDH@Zというエラーが出る。

```hoge.h
//囲ってやれば一括でできる。
#ifdef __cplusplus
extern "C"
{
#endif

プロトタイプ

#ifdef __cplusplus
}
#endif
M1 MacBookAirを購入したのでFlutterアプリを開発する

この記事はM1 MacBookAirを購入し、ほぼモバイルアプリ開発の技術がない状態からFlutterアプリを開発していく過程を記述した学習記録です

今回はFlutter（フラッター）の特徴を押さえた上で、何を作るかを書いていきたいと思います

## Flutterとは

Flutter（フラッター）はGoogle社が開発しているアプリケーションフレームワークです

クロスプラットフォームに対応していてiOS/Androidのアプリをひとつの言語で作れるということで注目されているフレームワークです

Flutterの特徴

・クロスプラットフォーム
・Dart言語による開発
・マテリアルUI
・ホットリロード（コードをリアルタイムに反映）

補足 
フレームワークとは、ざっくり説明するとアプリを作るときには用意されたボタンや文字を使って開発をしているのですが、その用意されたものがフレームワークでそれを使うことで開発が楽になるというものらしいです

##何を作るか

・問題の発見
　除雪は雪国だと生きる上での課題レベルに匹敵するほど厄介なのでなんらかのITの力で解決できないか

・解決策を見つける
　除雪するタイミングは早すぎてもあまり意味がないし、遅すぎると大変になってしまう
　ちょうど良く除雪するタイミングを知らせてくれるアプリを作れないか

何を作るか : 除雪のタイミングを知らせてくれるアプリ（仮）

##開発目標

・最小限の機能で作る

理由 : いろんな機能を入れると大変だからというのと、リリースに時間がかかるから

・1、2ヶ月くらいで作る

理由 : 早めにリリースすることでフィードバックを得て改善することができる


##最後に

新しいM1 MacBookAirなので調べることは必須ですがそれはエンジニアとしての経験値が貯まるというつもりでやっていきたいと思います

進捗があればまた記事を書きます
擬似要素(::after, ::before)のz-indexが思い通りにいかない場合の対処法


#結論
###z-indexをマイナスの値にする。

#z-indexがプラスの値、または０の場合

####CSS

```css
body {
    margin: 0;
}

.hello {
    position: relative;
    font-weight: bold;
    font-size: 60px;
    line-height: 1;
    padding-left: 10px;
    z-index: 1;
}

.hello::after {
    position: absolute;
    content: "";
    top: 30px;
    left: 0;
    width: 180px;
    height: 35px;
    background: lightgreen;
    z-index: 0; /* ←ここが原因 */
}
```
###↓
![スクリーンショット 2021-02-04 17.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032677/d8bd2023-5cb7-1154-35a2-6d923fcfe1b6.png)

#z-indexがマイナスの値の場合

####CSS

```css
body {
    margin: 0;
}

.hello {
    position: relative;
    font-weight: bold;
    font-size: 60px;
    line-height: 1;
    padding-left: 10px;
    z-index: 1;
}

.hello::after {
    position: absolute;
    content: "";
    top: 30px;
    left: 0;
    width: 180px;
    height: 35px;
    background: lightgreen;
    z-index: -1; /* ←マイナスの値にする */
}
```
###↓
![スクリーンショット 2021-02-04 17.27.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032677/4da18cee-d5d7-45b2-9eb2-71f903b63c1f.png)

#参考URL
z-index :after　:before　で装飾したとき親要素を一番上にする
http://noanoa.bangofan.com/html%E3%80%81css/z-index%20-after%E3%80%80-before%E3%80%80%E3%81%A7%E8%A3%85%E9%A3%BE
Gitについて

#はじめに
2月からマイスターギルドに入社しました！
技術的な部分もQiitaもまだまだひよっこのため、
研修の内容をこれからアウトプットしていきたいと思います。
よろしくお願いします。

今回は「Gitについて」書いていきたいと思います。

# 学んだこと
### Gitとは
編集した内容、履歴を管理することができるツール

○○を表示されるようにした
××を修正した

などの記録を残して管理することができる

### ローカルとサーバーの違いは？
ローカルは自分のみの作業場所
サーバーはみんなで共有できる作業場所（GitHubなど）

### Git用語
#### commit
編集内容をリポジトリ（保管場所）に記録する

##### なぜcommitの前にaddが必要なのか？
addをすると、リポジトリとワークツリー（作業場所）の間にあるインデックスという場所に保管される
これを経由することで必要のない変更を含めずにcommitできたり、一部の変更のみを指定してcommitすることができる

#### push
ローカル上にコミット3つ　サーバー上にコミット2つ
「ローカルのコミットをサーバーに反映させたい！」

→　pushするとサーバーに反映される

#### pull
ローカル上にコミット2つ　サーバー上にコミット3つ
「サーバーのコミットをローカルに反映させたい！」

→　pullするとローカルに反映される


### pull request
push後、GitHub上でpull requestを投げてレビューしてもらう

意識することはreviwersが見やすいpull request！
何のために書いたのか作業内容・目的を明記する

- タイトル、本文の記載
- 変更概要、タスクへのリンクを貼る
- 変更箇所へのコメントの記載

#### merge
作業内容を取り込む時に使う
今までのbranchを統合する

`fast merge`
進行度合いが同じだった場合、merge、commitがそのまま取り込まれる

`non-fast merge` 
進行度合いに違いがあった場合、元commitのあとにmerge commitという修正内容は同じだが違うcommitがつくられる

##### 進行度合いに違いがあるときにもfast mergeできる？
rebaseを使うとbranchの進行度合いが揃う ＝ fast mergeできる！

### fetch
リモートの最新情報をローカルにもってくる
origin / ブランチ名（リモート追跡ブランチ）が更新されるだけで、ローカルブランチ自体は更新されない

`fetch`：リモートのmasterブランチからローカルのorigin / masterブランチに最新情報がくる
`merge`：ローカルのorigin / masterブランチからローカルのmasterブランチに最新情報がくる

このfetchとmergeを合わせたものが `pull`

### rebase
ブランチを生やし直す
変更内容は同じで新たなcommitがつくられる

### GitHub上で使うmerge（3種類）
どういうmergeするのか決まりをつくって開発していく

`create a merge commit`
何をmergeしたのかcommitが残る

`rebase and merge`
編集内容は同じだけどcommitとしては別のものがつくられる
履歴が一本化されて見やすくなる

`squash and merge`
merge元の複数のcommitをまとめて完全に新たなcommitをつくる
まとめすぎるとmergeが戻せなくなるので、機能単位でsquashするのがよい

#### コンフリクト
複数人で作業していて同じ行で異なる修正をしてmergeした場合などに起こる
手動で変更が必要

##### conflictが起きないように意識できること

- プランニングの段階でコンフリクトは予見できるので作業が平行しないように調整する
- コードの責務が明確な状態になっている
- タスクの範囲とcommitの変更内容を一致させる
- フォーマッタのルールを統一する

### Git Bashを使ったrebase
#### git rebase -i ＜commit位置＞
commit位置に入るもの

- branch名
- commit hash
- HEADからの相対位置
 - 「HEAD~~~」とするとHEADから3commit前という意味になる

##### 補足：HEADとは？
現在作業している場所、作業ブランチのこと
※commit自体を指すこともある


### branch運用の考え方　～git flow～
4つのフェーズに分けて考える

`開発フェーズ`
新しい機能が追加される

使うブランチ：develop、feature(feat)
親ブランチ：master

`運用フェーズ`
本番環境でアプリが動いている

使うブランチ：master

`保守フェーズ`
バグを修正する
リファクタする

使うブランチ：fix(hotfix)　
親ブランチ：master、release（開発後relaseブランチで修正するとき）

`テストフェーズ`
（開発は終わっている状態）
新しい機能やバグの修正、リファクタを加えた状態の動作確認をする

使うブランチ：release
親ブランチ：develop

# まとめ
今まで深く考えずにGitを使用していたため、研修という形で学ぶことで理解が深まりました。
実際に手を動かして操作する際に、今回SourceTreeを利用したことで、インデックスという場所があることも視覚的に確認でき、コミットの動きなどがイメージがしやすくなりました。
Git bushでのvimの操作だったり、rebaseなど初めて使うコマンドも多かったのでこれから使いながら覚えていきたいと思います。
Pythonで学ぶアルゴリズム　第30弾：ユークリッドの互除法

# #Pythonで学ぶアルゴリズム< ユークリッドの互除法 >

##はじめに
基本的なアルゴリズムをPythonで実装し，アルゴリズムの理解を深める．
その第30弾としてユークリッドの互除法を扱う．

##ユークリッドの互除法
2つの自然数の最大公約数を求める方法として有名．
なお，最大公約数を扱う際によく**gcd**の文字を見かけるが，これは最大公約数を英語にした**Greatest Common Divisor**の頭文字であり，最大公約数を表している．

####定理
**2つの自然数a, bについて，aをbで割ったときの商をq，あまりをrとすると，「aとbの最大公約数」は「bとrの最大公約数」に等しい．**

これは高校数学で学んだものである．簡単に最大公約数を求める手順について以下に示す．

【step1】: aをbで割り，あまりrを求める
【step2】: a, bをb, rでそれぞれ置き換える
【step3】: あまりrが0なら，その時の割る数bが最大公約数で，そうでなければstep1へ戻る


##実装
先ほどの説明に従って，Pythonでの実装を行う．なお，ソースコードは3つ作成した．以下にそれらのソースコードとその時の出力を示す．

#####ソースコード①（ユークリッドの互除法：自然数対応）
先ほどの手順を忠実に再現したものとなり，理解しやすいプログラム．


```python:gcd1.py
"""
2021/02/04
@Yuya Shimizu

最大公約数を求める（ユークリッドの互除法）
gcd : Greatest Common Divisor
"""

def gcd(a, b):
    r = a % b

    while r != 0:
        a, b = b, r
        r = a % b

    return b

if __name__ == '__main__':
    num1 = 120
    num2 = 28

    GCD = gcd(num1, num2)

    print(f"({num1}, {num2}) → gcd: {GCD}")
```

#####出力
```
(120, 28) → gcd: 4
```
#####ソースコード①（ユークリッドの互除法：0も許容）
ソースコード①とほとんど同じだが，引数に0を入れてもエラーにならないようになっている．


```python:gcd2.py
"""
2021/02/04
@Yuya Shimizu

最大公約数を求める（ユークリッドの互除法）
gcd : Greatest Common Divisor
"""

def gcd(a, b):
    """変数を用意せず，直接余りを扱うことで，引数bが0でもエラーが出ない"""
    while b != 0:
        a, b = b, a%b
        
    return a

if __name__ == '__main__':
    num1 = 120
    num2 = 28

    GCD = gcd(num1, num2)

    print(f"({num1}, {num2}) → gcd: {GCD}")
```

#####出力
```
(120, 28) → gcd: 4
```

#####ソースコード③
最後に示すプログラムは，ユークリッドの互除法を用いない方法である．これは私が他の教材で勉強した「差を用いた方法」である．（参考文献にその教材も示しておく）
簡単に説明すると，「**負にならないように2つの数字を引き算していき，引く値が互いに同じとなるとき，すなわち差が0となるとき，その値が最大公約数である**」というものである．このようなアルゴリズムも学んでいるので，ついでに示しておくこととする．ちなみに，除算の操作がないため，ソースコード②同様，引数に0が入力されても特に問題はない．

```python:gcd3.py
"""
2021/02/04
@Yuya Shimizu

最大公約数を求める（減算の利用）
gcd : Greatest Common Divisor
"""

def gcd(a, b):
    while a != b:
        if a > b:
            a, b = b, a-b
        else:
            a, b = b, b-a
    return a

if __name__ == '__main__':
    num1 = 120
    num2 = 28

    GCD = gcd(num1, num2)

    print(f"({num1}, {num2}) → gcd: {GCD}")
```

#####出力
```
(120, 28) → gcd: 4
```

##感想
今回は高校数学でも習っていたこともあり，非常に簡単であった．これで今までこれらのアルゴリズムを学んできた教材(参考文献)も学習の部分は完了した．残るは，演習の中で紹介されている．圧縮アルゴリズムだけとなった．よって，この教材を使ったアルゴリズムの学習は次回が最終回である．随分と学んだ気がするが，すべてを学んだわけではないので，また新たに学習は進める予定である．

##参考文献
Pythonで始めるアルゴリズム入門　伝統的なアルゴリズムで学ぶ定石と計算量
　　　　　　　　　　　　　　　　　　　　　　　　 増井 敏克　著　　翔泳社

Javaによるはじめてのアルゴリズム入門　　河西 朝雄　著　技術評論社
Virtual Box Ubuntu 20.04 LTS をセットアップしたときのメモ

新PCの上に開発環境として Ubuntu 20.04 LTS を Virtual Box で入れたのだが、調べた点をメモ。

## 解像度を変更する方法

以下の記事で説明されている通り、Guest Additions を入れて再起動すれば大丈夫。

https://qiita.com/ryotaro76/items/d9a72d50d9dacfe9939c

## クリップボードの共有

Vitual Box 側の設定で「共有する」を選ぶ。 以下を参照。

https://pc-karuma.net/virtualbox-clipboard-share/

## 共有ディスクをマウントする

以下の記事の「共有フォルダの作成」で説明されている通りの方法で、`/media/sf_shared` が VM 内からアクセス可能な共有ディスクとなる。

https://qiita.com/SUZUKI_Masaya/items/3444a010cf9903a088b3

なお、このディレクトリは `root:vboxsf` の `770` のパーミッションとなるので、利用するユーザーを `vboxsf` グループに所属させること。


## 日本語キーボードの設定がリセットされる

日本語 (Mozc) を利用している場合の話。  一度は日本語キーボードで動いたのだが、再起動する度にキーボードが US キーボードになってしまい、入力がうまくいかない。

https://ja.stackoverflow.com/questions/43015/ubuntu%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%9F%E3%81%B3%E3%81%AB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%8C%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%82%8B

で説明されている通り、`/usr/share/ibus/component/mozc.xml` の layout 要素を `jp` に書き換えることで対処できた。

```bash
/usr/share/ibus/component/mozc.xml
<layout>○○<layout>を<layout>jp</layout>
```
【Rails】modelに設定しているattr_accessorの全ての値を取得したかった

使えるかどうかは、個々人のプロジェクト・プログラムに委ねるとして、今回は個人用メモとして、雑にコードを載せておくだけです。

## 内容
各モデルで設定されているattr_accessorの値全てを取得する。


## コード
``` ruby:model
class ApplicationRecord < ActiveRecord::Base
  def accessor_attributes
    accessor_attributes = {}
    self.class.attr_accessors.each do |accessor|
      accessor_attributes[accessor] = public_send(accessor)
    end
    accessor_attributes
  end

  class << self
    def attr_accessor(*vars)
      @attr_accessors = vars
      super
    end

    attr_reader :attr_accessors
  end
end

class User < ApplicationRecord
  # DBには保存しない何かしらの値を格納する変数
  attr_accessor :type, :name
end

```

attr_accessorに設定している全ての値を取得する

``` ruby:controllerなど
user = User.last
user.type = 'admin' 
user.name = 'Hello Qiita'

# attr_accessorに指定してある値を取得
user.accessor_attributes
# => { type: 'admin', name: 'Hello Qiita' }
```
R, Pythonでの共分散、相関係数の求め方

#はじめに
これはRの基本コマンドをPythonで書き換えていき、自身の理解を深めようという目的で記事を書いている。

参考文献：「[Rによるやさしい統計学](https://shop.ohmsha.co.jp/shopdetail/000000001781/)」


#共分散と相関係数
2つの変数の関係を表すものに共分散と相関係数がある。

変数 $x$ と変数 $y$ の不偏共分散は以下の式で表される。
$$s_{xy} = \frac{1}{N-1}\sum_{i=1}^{N}(x_i-\bar{x})(y_i-\bar{y})$$
$\bar{x}$ は $x$ の平均を意味する。以上を用いると、相関係数は、
$$r_{xy} = \frac{s_{xy}}{s_x s_y}$$
と表される。分母の $s_x$ は変数 $x$ の標準偏差を表している。

相関係数の値は-1~1の範囲を取り、1に近いと正の相関があり、-1に近いと負の相関があるという。0に近い場合は無相関となる。

#Rでの共分散、相関係数

```R:コード
x <- c(1,3,10,12,6,3,8,4,1,5)
y <- c(20,40,100,80,50,50,70,50,10,60)

cov(x, y) #不偏共分散
cor(x, y) #相関係数
```

```:出力
[1] 90.11111
[1] 0.9092974
```
$x$ と $y$ には強い正の相関があることが分かる。

#Python での共分散、相関係数
いろいろと方法はあるが、`numpy`の関数を使った方法が一番簡単そう。

```python:コード
import numpy as np

x = np.array([1,3,10,12,6,3,8,4,1,5])
y = np.array([20,40,100,80,50,50,70,50,10,60])

print(np.cov(x, y)) #不偏共分散
print(np.corrcoef(x, y)) #相関係数
```

```:出力
[[ 13.78888889  90.11111111]
 [ 90.11111111 712.22222222]]
[[1.        0.9092974]
 [0.9092974 1.       ]]
```

出力を見て分かる通り、Python では共分散行列と相関係数行列が出力される。つまり、`np.cov`関数の出力は

```math
\left( \begin{array}{cc}
s_{xx} & s_{xy} \\
s_{yx} & s_{yy} 
\end{array} \right)
```

を表しており、`np.corrcoef`関数の出力は

```math
\left( \begin{array}{cc}
r_{xx} & r_{xy} \\
r_{yx} & r_{yy} 
\end{array} \right)
```
を表している。
【共同開発】　レビュワーする時のgit コマンド

共同開発をしていると必ずと必ず誰かがレビューをしなくてはいけません。
そこで使用したコマンドをメモ書き程度ですが、紹介します^^

それでは行きましょー！！

## レビュワーの作業内容
差分確認（自動作成ファイル以外）→ 動作確認

## 手順

作業ブランチからmaster(develop)に移動

``` 
$ git switch master
```

 そしてレビューするブランチをローカルに取り込みます！

```
$ git fetch origin pull/プルリクの番号(ID)/head:[ブランチ名]
```

実行する！

```
$ git fetch origin pull/5/head:hoge

remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 5 (delta 3), reused 5 (delta 3), pack-reused 0
Unpacking objects: 100% (5/5), 461 bytes | 57.00 KiB/s, done.
From github.com:hoge/hellow-world
 * [new ref]         refs/pull/5/head -> hoge

```

ブランチを確認!




```
　$ git branch

    * master
      hoge
```

レビューするブランチが確認出来たら移動^^

```
$ git checkout hoge  
```

あとは動作確認してコメントするなりして
おっけいーです^^

## おわりに
初めてのレビューをさせてもらったので、
まだまだわからない事が多いですが
日々積み上げ頑張ります^^🙌
##### やったもん勝ちですww
Gravio 4を使ってCO2濃度が高くなってきたらライトの色を変える

CO2の情報は可視化できるようになりましたが、常にPower BIとにらめっこすることはできないですよね。
そこはやっぱりGravioなのでレンタルできるGravioライトも使って可視化したいなと。
せっかく色が使えるので、CO2濃度が1000ppmを超えたら赤、700ppmを超えたら黄色、それ以下なら緑というふうにしてみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/5517f94d-4332-930c-42a2-243a27b170cf.png)

# 使用環境

* Raspberry Pi 4 Model B w/4GB RAM
* Ubuntu Server 20.04.1 LTS
* Gravio HubKit v4.1.0-6380
* Gravio Studio v4.1.5432.0
* Gravio ライト
* Gravio CO2センサー

※GravioライトはBasicプラン、Gravio CO2センサーはStandardプランを契約するとレンタルすることができます。

# 事前準備
* Gravio CO2センサーとGravioライトをペアリングしておきます。
* Gravio CO2センサーを適当なレイヤーに登録しておきます。

# 手順

## Gravioライトを点灯するアクションを作成
新しいアクションを下のように作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1ce4feac-3a77-a9fc-30ab-891950f7b88a.png)

ここでポイントは、Pre Mappingで以下のように色に `tp.Color` をマッピングしたところです。
`tp.`はトリガープロパティを参照するためのプレフィックスで、トリガーから値を渡せます。渡し方は後で説明します。

```
cp.Color = tp.Color
```
## トリガーを作成
次のようにトリガーを3つ作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/22e58291-ec2b-21e3-1902-fb086cfaa038.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/7159207c-c6cd-b470-0eb9-3379861406c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/8681c360-eaa5-b6fa-d91c-4288fc481dfe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1d2292c8-e6e0-009d-9cf0-64cd1de307e8.png)

エリアとキーレイヤーは同じCO2センサーのものを指定します。
CO2の条件のところで、`>= 1000`、`700 ~ 1000`、`< 700`となるようにそれぞれ指定します。
条件に「範囲」を指定した場合、大きい方の値は含まれないので注意が必要です。
そして、アクションにも、上で作った同じ `TurnOnLight`を指定しますが、上述の通りトリガープロパティとして色をそれぞれ渡します。
トリガープロパティ名に `Color`を入力し、その値にそれぞれ、`red`、`yellow`、`green`を指定します。

## 結果
いい感じに色が変わりました。これで換気のタイミングもバッチリです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/dc3fbdb5-1f87-805a-4174-cd257dae715c.png)

# ポイント
* ライトのアクションは一つだけ作って、トリガープロパティで色を渡す
* CO2濃度値の条件はトリガーで指定する
* 「範囲」の場合、「A <= 値 < B」となり、大きな方の値は含まれないので注意

# 参考
* [Gravio][]
* [CO2センサーのセットアップ][Gravio-CO2]
* [Gravio Lightコンポーネント](https://doc.gravio.com/manuals/gravio4/1/ja/topic/gravio-light)
* [トリガー変数とトリガープロパティー](https://doc.gravio.com/manuals/gravio4/1/ja/topic/triggervalandtriggerprop)
* [アクション内で利用できる変数と変数型][Gravio-Variables]
* [Pre Mappings / Post Mappingsでの式の記述の仕方][Gravio-Mappings]


[Gravio]:https://www.gravio.com/jp
[Gravio-CO2]:https://www.gravio.com/jp/sensor-setup-guide#Gravio-CO2
[Gravio-Variables]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/available-variables-in-action
[Gravio-Mappings]:https://doc.gravio.com/manuals/gravio4/1/ja/topic/premappings-postmappings
docker-compose+Django+Postgresql+Pycharmで開発環境構築時に躓いた事とその対処

#この記事について
Webアプリの開発環境構築にあたり、docker-compose up 時とPycharmでrunする時に躓いたので、同じ悩みを抱えている人は、参考にしていただければと思います。

##環境
OS : Windows10 pro

##チュートリアルでのDockerfileとdocker-compose.yml等
####Dockerfile
```dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
```
####docker-compose.yml
```
version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```
####requirements.txt 
```
Django>=1.8,<2.0
psycopg2
```
上記のファイルを作成後、以下のコマンドでcomposeexampleプロジェクトを作成します。

```
docker-compose run web django-admin.py startproject composeexample .
```
プロジェクトのsettings.pyを以下のように編集します。

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
```
そしてdocker-compose upをすると、passwordがどうたらこうたらとエラーを吐かれます。

##修正後
先に申し上げておくと、Dockerfileとdocker-compose.ymlは編集していません。
settings.pyのみ編集します。

####settings.py

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
```
これで、runを行い、[http://localhost:8000](http://localhost:8000)にアクセスすることで、Django の Welcome ページを確認できます。

##問題のPycharmでの実行方法
Pycharmの実行/デバッグ構成画面で、適当な名前の実行構成を作成します。(ex: runserverなど)
ホスト欄に「0.0.0.0」と入力します。
このままだと、ブラウザーの実行欄が「[http://0.0.0.0:8000](http://0.0.0.0:8000)」となりますが、この状態で実行して、urlをクリックしても正常にアクセスできません。
なので、ブラウザーの実行チェックボックスに✔を入れ、入力欄を「[http://localhost:8000](http://localhost:8000)」と変更します。
これで、実行後のurlをクリックすると正常にwelcomeページにアクセスできます。

##参考文献
この記事は以下の情報を参考及び一部引用して執筆しました。

- [クィックスタート: Compose と Django](https://docs.docker.jp/compose/django.html)
Ethereumのopeツール、openzeppelin defender がよい感じ

#はじめに
openzeppelin defenderというサービスを試してみました。
https://github.com/ConsenSys/ethereum-developer-tools-list#developer-tools


#openzeppelin defenderとは
イーサリアムの運用を自動化するサービス。運用のためのオペツールと考えると良い。
個人的には、https://oneclickdapp.com/　
などを使っていたが、運用時の操作を全てremix上でやるのは面倒だし、ミスが起こる可能性もあるため、defenderを利用すると良いのではということらしい。いくつか機能があるうちで、個人的にはRelayerをアドオンする機能が非常に素晴らしいと感じた。

#コントラクト実行
コントラクトに書き込みを行う処理をdefenderから行える。
メリットとしては、操作履歴にコメントが残せたり、GnosisSafeによるマルチシグで実行が行える点。承認者にproposalをするなど、実運用時に絶対必要になるだろうなという機能が付いている。

![スクリーンショット 2020-11-18 19.22.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/64fd2875-8d5d-82dd-fd66-95a47acb0f5c.png)

![スクリーンショット 2020-11-18 19.28.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/ec9410fd-1d0a-100c-6daa-c07433387951.png)


#Relayerの追加

![スクリーンショット 2020-11-18 19.08.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/6f32fb3c-bb30-cc92-f46b-697f6c16061c.png)


#batch処理の追加
あとでかく

#Conclusion
あとでかく
remixdのアップデートが必要


先週まで触っていたはずのremixの調子がおかしい。

remixd -s ./ --remix-ide https://remix.ethereum.org

すると指定したディレクトリではなく、remixのlocalhostにPCのルートディレクトリのようなものが表示されている。
localのremixを古いものに戻したり色々やってみるが解消せず、困った。。
最初はremixの何か変更があったのかとlogを調べていたのだが、どうにも違う。

remixdをみてみると16時間前に新しいバージョンのお知らせが来ている。。。
下記のように一度アインインストールして、入れ直したら動きました。

https://www.npmjs.com/package/@remix-project/remixd

![スクリーンショット 2021-02-04 16.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/f354240d-64f1-b32a-89a6-637c443dbcac.png)

remixdのnpmアドレス自体がなぜ変更になっているのかを調べる必要があるが、
突然動かなくなるのはやめてほしい。。
rust-opencvのcargo buildでlibclang.dylib（macOS）がみつからなかったときのメモ

rustでディープラーニングしてみようと思い、

```
$ cargo new rust-opencv-study
```

```Cargo.toml
[package]
name = "rust-opencv-study"
version = "0.1.0"
authors = ["user.name <user.email>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
opencv = "0.49.1"
```

の、

```
$ cargo build
```

で、こんなとき

```
   Compiling opencv v0.49.1
error: failed to run custom build command for `opencv v0.49.1`

Caused by:
  process didn't exit successfully: `/Users/takahiro/Documents/source/rust-opencv/target/debug/build/opencv-eee0ce442a19ac9b/build-script-build` (signal: 6, SIGABRT: process abort signal)
  --- stderr
  dyld: Library not loaded: @rpath/libclang.dylib
    Referenced from: /Users/takahiro/Documents/source/rust-opencv/target/debug/build/opencv-eee0ce442a19ac9b/build-script-build
    Reason: image not found
```

には、

```
$ ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib /usr/local/Cellar/rust/1.49.0_1/lib/rustlib/x86_64-apple-darwin/lib/libclang.dylib
```

で、

```
$ cargo build
```

```
   Compiling opencv v0.49.1
   Compiling rust-opencv v0.1.0 (/Users/takahiro/Documents/source/rust-opencv)
    Finished dev [unoptimized + debuginfo] target(s) in 2m 24s
```

ダン、でした。

## リファレンス

[@github rust-lang/rust - rust-lld fails with "dyld: Library not loaded: @rpath/libLLVM.dylib" on 1.30.0-nightly (02cb8f2a4 2018-08-29) #53813]
(https://github.com/rust-lang/rust/issues/53813#issuecomment-417375284)
Salesforce Classic での Pardot を使用した対ビジネスマーケティングの自動化 ⇒ B2B Marketing Analytics の基本 ⇒ B2B Marketing Analytics の設定

１．Analytics アプリケーションを有効にする場合の出発点はどこですか?
２．Salesforce アカウントと Pardot アカウントを結び付けるために必要なユーザロールは何ですか?
３．「Analytics の表示」権限セットを作成するために選択する 2 つのユーザ権限はどれですか?
４．権限セットをユーザに割り当てるとき、システム管理者が実行しなければならないことは何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/7961727c-7294-732e-f30c-996c69b9e124.png)
学び直し Rubyがミニツク Part3

今日の教科書
[Rubyがミニツク便利なオブジェクト](http://www.minituku.net/courses/566428009/contents/369770655.html)

#便利なオブジェクト
##メモ

[文字列](http://www.minituku.net/courses/566428009/contents/740993459.html)

 - 式展開は「””」の中でできる。
 - #{ }という記号を使う
 
[正規表現](http://www.minituku.net/courses/566428009/contents/891549707.html)

 - Rubyでは「//」で囲まれた文字列が正規表現オブジェクトになる
 - パターンがあれば位置を返し、なければnilを返す
 - パターンと文字列が合うか調べることをマッチングと呼ぶ
 - =~演算子を使うことでおこなえる
 - 複数の文字をパターンにした時は最初の文字の位置を返す
 - 記号を文字として認識させるには、記号の前に「\」を付ける
 - if文の条件にも使える



```
str = "abcde"
if /a/ =~ str
  puts("パターンにマッチした")
end
```

[配列](http://www.minituku.net/courses/566428009/contents/35965084.html)

```
変数 = [要素１, 要素２, 要素３]
ary = [1, 2, 3]
p ary[0]   #=> 1
```
 - Rubyの配列は、オブジェクトを要素として並べたもの
 - 変数名の後に付ける[]はメソッド。ary0は`ary.[](0)`というメソッド呼び出しと同義であり、0は[]メソッドの引数
 - 配列オブジェクトの各要素に割り当てられた番号をインデックスという
 - lengthメソッドで要素数を返す
 - eachメソッドはオブジェクトの集まりから各要素を取り出して操作する
 - ハッシュオブジェクトでeachメソッドを呼び出すと、キーと値の両方が表示される
 - 配列オブジェクト同士の減算(-)は、左から右の要素を取り除いた内容の新しい配列オブジェクトを返す
 - 元の内容を変更しないメソッドは非破壊的なメソッド、逆に元の内容を変更するメソッドは破壊的なメソッドという

```
オブジェクト.each do |変数|
  繰り返したい処理
end
```

 - doからendまでをブロックという

[ハッシュ](http://www.minituku.net/courses/566428009/contents/473980225.html)

 - ハッシュは配列と似たようなデータの集まり
 - ハッシュではキーを使って値を取り出す、配列は要素をインデックスで取り出していた
 - ハッシュオブジェクトは{}を使う
 - 配列と同じく[]メソッドを使って値を取り出す
 - キーを指定して値を取り出す
 - Hash.new でもハッシュオブジェクトが作成できる
 - キーと値のペアで指定しないとエラーが発生する
 - ハッシュオブジェクトの[]の参照演算子と[]=の代入演算子は混同しやすいので注意
 - 文字列のキーとシンボルのキー、両者はオブジェクトとして全く別のもの。別々に出力される

```
変数 = {キー => 値}
hash = {"key" => 23} 
p hash["key"]  #=> 23
hash = {:foo => 23} 
p hash[:foo]  #=> 23
hash[:foo] = 42
p hash[:foo]  #=> 42
```
 - 「:」が文頭に来るのはシンボルと言いキーの指定に使える
 - 「,」でハッシュオブジェクトを区切ることがでる

```
hash = {:ary => ["foo", "bar"]}
p hash[:ary][0]  #=> "foo"
hash = {:hash => {:foo => 23, :bar => 42}}
p hash[:hash][:foo]  #=> 23
```

 - シンボルで指定したハッシュオブジェクトのキーにインデックスを指定して値を取り出す
 - ハッシュオブジェクトの要素としてハッシュオブジェクトを入れることもできる
 - deleteメソッドは引数にキーを指定すると、その要素を削除する
 - clearメソッドは全ての要素を削除する