OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubからSSHでリポジトリをチェックアウトするまでの手順

「pubの方使えばいいんだっけ？」とかなってしまう自分用忘備録。
AWSのCodecommitも似たような方法で出来ると思います。

# 環境情報
- Windows10
- SourceTree 3.4.3
- PuTTYgen Release 0.74

# GitHubに登録する
ここはさすがに略しますゾー
https://github.com/

# SSHキー
GitHubのリポジトリのアクセス時に利用するため、
ここでコマンドを実行して作成しておきます。

## キーの生成
```sh
# PCのユーザー名とか不要なら
ssh-keygen -t rsa -b 4096 -C ""
# メールアドレスも追加するなら
ssh-keygen -t rsa -b 4096 -C "sample@example.com"
```

パスフレーズはご自由に。
完了したら`id_rsa`と`id_rsa.pub`が作成されています。

## GitHubへSSHキーを登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/ec32df93-bdbe-1d45-a796-1ab2fb3a47c5.png)
`SSH and GPG keys > New SSH Key`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/d6868ce0-f921-185c-408d-c56a746e6333.png)
`id_rsa.pub`のファイルの中身をコピペ。
タイトルはご自由に。

## リポジトリの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/bde9ccfa-44a6-8304-a9cc-c106309f550c.png)
右上のメニューから`New repository`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/fc1083ad-6c0f-7d1b-905a-00d242924292.png)
いろいろ入力したら、`Create repository`でリポジトリ作成完了。
分からなければREADMEファイルと.gitignoreファイルぐらいは選択した方が良いかも。

# リポジトリのチェックアウト
とりあえずSourceTreeでも使ってチェックアウトします。
https://www.sourcetreeapp.com/download-archives

## .ppkファイルの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/8bf7b3a5-4eaa-b789-9630-2bcb9973db3b.png)
`Import key`で秘密鍵（.pubでない方）を読み込み、
`Save private key`で.ppkファイル形式で保存します。

## チェックアウトの実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/d7924b55-4724-d9b0-067f-b1c08b51b348.png)
リポジトリ画面の`Code > SSH`で、クローンする文字列を持ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/13dfe1f6-ea41-cc68-eb53-974fb3b76df8.png)
`元のパス/URL`の箇所に先ほどの文字列を貼り付け。
SSHキーを要求されたら選択したりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642231/0b7121ab-e778-f9a4-2e1e-f4599412c0a4.png)
無事読み込まれたらこんな感じ。
README.mdとか生成していたら、Initial Commitが見えるはず。

# 参考にした記事（主にキー生成回り
https://dev.classmethod.jp/articles/ssh-keygen-tips/
https://qiita.com/suthio/items/2760e4cff0e185fe2db9
Reactとはなにか、Reactの開発からデプロイまでの流れ

#はじめに
前回の記事[[1]]でデプロイまでできたのですが、いまいち何をしているのか理解できませんでした。
そもそもReactは何をしているのか、どのような流れでデプロイするのかをまとめたいと思います。

#Reactは何をしているのか
Reactとはjavascriptのライブラリという風に書かれていることが多いと思います。
ただ、C言語の#includeライブラリ名.hみたいにインクルードすればいいのかいうと全く違います。
個人的にはダラダラと書いていたものをコンポーネントという単位でまとめて見やすくするためのUIライブラリだと思っています。この表現は正確ではないと多くの人に言われそうですが、ライブラリだと思ってると認識のずれが生じます。たぶんライブラリとかフレームワークの定義が統一されていないからこういうことになるんでしょう。

そもそもReactは単体では動きません。
大きく分けて4つのものに構成されています[[2]]。

1. javascript
当然javascriptの知識は知らないとだめです。nodejsとかの区別は一旦置いといていいです。

1. JSX
これがReactの中枢を担っている気がします。
JSXはjavascriptの拡張言語です。
一番の違いはDOMを値として扱えることです。
定数などに代入したり、DOMそのものを返り値とすることが出来ます。
そこさえ押さえておけば仕組みは分かります。

1. Babel
JSXはそうすると楽だよねって勝手に作った拡張言語です。
サーバーにアップして使う際にはjavascriptでないと当然動きません。
この拡張言語をjavascriptに変換するのがBabelです。
またjavascriptの標準的な書き方がES5からES6に移行しました。
この2つは割と大きな違いがあり、かつすべてのブラウザがES6に対応しているわけではありません。
下位互換性を持たせるためにすべてのjavascriptをES5にするべきです。
このES5への変換もBabelが担っています。
イメージとしては
JSX→javascript→javascript(ES5)
みたいな流れでしょうか。
逐次的に変換しているのか、まとめて変換しているのかは分かりませんがこんな理解でいいでしょう。
要するにJSXのjavascriptへの変換、javascript(ES5)への変換をしてくれるツールです。

1. webpack
[[2]]より引用

>webpackは、JavaScriptを依存関係を考慮してひとまとめにしてくれるツール

&emsp;要するに散らかってるjavascriptをひとまとめにしてくれるというものです。
&emsp;まとめたjavascriptをBabelに通します。

この4つによるプログラム生成の仕組みを前提として動いているのがReactです。
Reactを使うということはこれらの仕組みを使うということと同義です。
ライブラリとしてのReactはこれらの仕組みの上に成り立ったものです。
webエンジニアが直接触るのはJSXだけですが、ここら辺は理解しておきましょう。

#デプロイまでの流れ
結局JSXプログラムを書いたらどうすればいいのでしょうか。
HTML/CSS/javascriptだったらサーバーに置いたらOKです。
Cなどのコンパイル言語ならコンパイルして実行すればいいです。
pythonなどのスクリプト言語なら書いてすぐ実行できます。
しかしJSXではjavascriptをまとめて変換しないといけません。
頭ではわかってもコマンド上はどうなるのでしょうか。
そのための環境構築コマンドとしてcreate-react-appコマンドがあります。
このコマンドによってwebpack、babel、reactライブラリなどがプロジェクトディレクトリ配下のnodemodulesディレクトリにダウンロードされます。
これらをNode.jsのアプリケーションとして動かす場合は

```
yarn start
```
とすればローカルで立ち上げることが出来ます[[3]]。
しかし、webサーバーにアップロードする場合は変換しなければなりません。
この変換の作業を一般的には**ビルド**と呼ばれています。
makefileとかでもビルドという言葉使っていた気がします。
ここでのビルドはソースコードを使える状態に変換するようなニュアンスでしょう。
コンパイルと言い換えてもあまり差し支えないように感じます。
もちろんCのコンパイルのようにコードをバイナリに変換してるわけではありません。
しかし、webサーバーで使える形式に変えているのです。
コマンド上では

```
yarn build
```
などでビルド出来ますが、実際にはjsonファイルのスクリプトが実行されています。
このファイルをwebサーバー上におけばデプロイ完了というわけです。
僕の場合は

```
yarn deploy
```
でビルドとデプロイ同時にやってくれます。

あとこのサイト[[4]]が割と流れを丁寧に説明してくれているので読んでおくことをお勧めします。

#おわりに
React複雑すぎる。
こんなの一発で分かる訳ないでしょうと思っちゃいますね。
JSXの考え自体は好きなんですが、この仕組み自体をもう少し抽象化して欲しいです。


#参考文献
[1]:https://qiita.com/it_tsumugi/items/2acf8c88dbccef413f71
[2]:https://zenn.dev/haniwaman/articles/b66a3a1fa5a6fa6428a5
[3]:https://www.tuyano.com/index3?id=5712536552865792
[4]:https://jp.quora.com/react%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%8Cnode-js%E3%81%A0%E3%81%A8%E8%81%9E%E3%81%84%E3%81%9F%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%81%8B-

[[1]]:GitHub Pages で最小構成のreactのhelloworldをデプロイしてみた
[[2]]:Reactをなんとなく理解できるようになるまでのステップ
[[3]]:Reactの基本的な仕組みを理解しよう (1/4)
[[4]]:reactの基本がnode.jsだと聞いたのですがどういうことですか？書き方が同じということですか？まだ全くの初心者なのでやさしく教えていただけると助かります。
CSSでアニメーションお試し

@keyframes
アニメーションの最初を0%　最後を100%で表現する
0%
100%

https://qiita.com/7968/items/1d999354e00db53bcbd8

https://techacademy.jp/magazine/38188

CSSでまず最初に覚えておきたい3つの要素
Webページの見栄えを整えるにあたり、CSSでは次の3つの要素を用います。

セレクタ – どのHTMLタグに対して見合えを調整するか
プロパティ – どういった内容のデザインを施すか
値 – プロパティはどの程度か


プロパティ	説明文
color	文字色を指定する
background	背景の指定をする
background-color	背景の色を指定する
font-family	フォントの種類を指定する
font-weight	フォントの太さを指定する
line-height	行の高さを指定する
text-align	行の揃え位置を指定する
width	幅を指定する
height	高さを指定する
margin	マージンの指定をする
padding	パディングの指定をする
border	ボーダーの色や太さを指定する
position	要素の配置方法を指定する
display	要素の表示形式を指定する
float	左か右に寄せて配置する
z-index	要素の重なりの順序を指定する


https://uxmilk.jp/8077

.の場合はClass
<P class = "TEST">AAAA</P>
.test{
color:res;
}

#の場合はID
<P ID = "TEST>AAAA</P>
#TEST{
color:red;
}


https://techacademy.jp/magazine/38188
【github: 個人アカウントと会社アカウント使い分けてる人】会社アカウントでの作業に影響与えず、個人アカウントに草をはやしたかった話

# 背景
githubを会社アカウントと個人アカウント作成している
個人用アカウントには個人開発したアプリのソースをコミットしている

最近毎日草をはやしたいと思った
これまでほぼ毎日コミットしてるはずなのに草がまばらだった

草をはやしたい！！！
でもいろいろ触って会社アカウントでの作業に影響したら怖い！！！


# したこと
#### ①コミットしてるのに草が生えない原因特定
#### ②会社アカウントの作業に影響を与えずに解決

## コミットしてるのに草が生えない原因特定

https://findy-code.io/engineer-lab/github-contributions-rule

この記事のおかげで原因判明！


>①コミットに使用されるメールアドレスがGitHubアカウントと連携されていること
②フォークされたリポジトリではなく、独立したリポジトリでコミットされること
③デフォルトブランチもしくはProject Pages sitesでのコミットであること

>さらに、以下のうちどれか一つの条件を満たす必要があります。
①リポジトリの参加者もしくはリポジトリを所有しているチームのメンバーであること.
②フォークされたリポジトリを持っていること
③リポジトリにオープンなプルリクエストまたはイシューを持っていること
④スターをつけられたリポジトリを持っていること。


この条件の①コミットに使用されるメールアドレスがGitHubアカウントと連携されていることが満たせてなかった

git configに
ユーザー名やメールアドレスが記載されていないから。

githubからしたら
「ようわからん奴が勝手にコミットしてきたわ」って状態

だから僕が作業した証である草は生えない



## 会社アカウントの作業に影響を与えずに解決

ただこの記事の解決策として書かれている

```
git config –global user.name “Yuuki Takahashi“
git config –global user.email “email@example.com“
```

これは危険！


git config には３つの領域がある
systemとglobalとlocal

https://note.nkmk.me/git-config-setting/

今回は個人アカウントに草を囃したいから
個人アカウントのユーザーネームメールアドレスを設定する

globalでuser.nameとか設定したら
会社アカウントでの作業のコミットも個人アカウントですることになる（はず）


あくまでlocalのconfigだけ変更する

ここでいう、git congigのlocalは、
git initした作業ディレクトリ内のみが影響範囲。

つまり個人開発しているアプリのディレクトリで.gitファイルがある場所
この設定ファイルにだけ記載すればOK

方法はこれ

```
git config –local user.name “Yuuki Takahashi“   // -localなくてもいい
git config –local user.email “email@example.com“
```

# まとめ

複数のgithubアカウント使ってる人は
git configの設定する領域を意識する

記事に書いてある方といって不用意にコピペして実行しない方がいい！
Javaでクラスの継承を使ったコンストラクタの実験をしました

Javaでクラスの継承を使ったメソッドの呼び出し実験をしました。

```Java
package nogizaka;
// Author 2021/06/13
// 乃木坂好きのITエンジニア

class A{
	A(){

	}
	A(String message){
		System.out.println(message + "大好き");
	}
}
class B extends A{

	B(){
		System.out.println("Hello from B");
	}
	B(String name){
		System.out.println(name);
	}
}

public class Problem6_7 {
	public static void main(String[] args) {
		//継承元のAのコンストラクタを呼び出す
		A b = new A("乃木坂46");
		//継承先のBのコンストラクタを呼び出す
		B b1 = new B();
		//継承先のBの引数付きのコンストラクタをオーバーロードする
		B a = new B("山下美月");
	}
}
```
Google Maps API 関連を調べている中で気になった記事まとめ

Google Maps APIを使った実装を行なっていく中で、実際に使うわけじゃないけど、こんなこともできるんだ。と気になった記事を随時追記していく。


#### 気になった記事
・[Directions API で巡回セールスマン問題を解決する](https://maps.multisoup.co.jp/blog/1016/)
経由地の経由順を最適化できる。ルート検索を実行する際のオプション`optimizeWaypoints: true`を設定する。
スイフト勉強_ データタイプ 深化 （列挙型）

この前，スイフトのコレクション型について調べた
今日は最後に列挙形について調べたい。

##列挙型(enum)
列挙型は、関連する項目図をまとめて表現することができるタイプである。 他の値とは異なって定義された項目の値以外は追加及び修正ができない特徴がある。 したがって、制限された選択肢を与えたいか、定められた値以外はもらいたくないとき、予想された値が限られているときに使いやすい。

スイフトの列挙型は、各列挙型が固有のタイプと認められるため、誤って不具合が発生するのを防ぐことができる。

>1.基本列挙型

列挙型はenum というキーワードで宣言が可能である。

```swift
enum School {
case primary
case elementary
case middle
case high
}

enum School {
case primary, elementary, middle, high
}

var a : School = .high
var b = School.middle

a = .elementary
```

Schoolという列挙型には、primary、elementary、middle、highという項目が存在する。 各項目は固有値であり、一行にすべて表現することもできる。

>2.ウォン相場

各項目がそれ自体で値を持つが、ソース値を設定できる。

```swift
enum School: String{
case primary = "a"
case elementary = "b"
case middle = "c"
case high = "d"
}

var a : School = .high
print(a.rawValue) // d
```

一部だけ元値を支払うこともできる。

その場合、文字列は項目名の通りを原始値として持つことになり、整数の場合には最初の項目を基準に0から1ずつ増えていく値を持つことになる。

```swift
enum School: String{
case primary = "a"
case elementary = "b"
case middle
case high = "d"
}

var a : School = .high
print(a.rawValue) // d
var b : School = .middle
print(b.rawValue) // middle

enum num: Int {
case zero
case one
case ten = 10
}
print(num.zero.rawValue) //0

let c = School(rawValue:a) //primary
let d = School(rawValue: f) //nil
```

列挙型の原始値を介して列挙型の変数又は定数を生成することができる。

正しくない値を使って生成しようとするとnilを返すことになる。

>3.関連値

スイフトの列挙型各項目が連関値を持つことになれば、既存プログラミング言語の公用体形態を浮かべることもできる。

項目が自分に関連した値を持たせることができるからだ。 各項目の横に小括弧でまとめて表現できるため、他の項目が連関値を持つからといって全ての項目が連関値を持つ必要はない。

```swift
enum Topping {
case cheese, bacon, pepperoni
}
enum Dough {
case original, thin
}

enum Main {
case pasta(taste:String)
case pizza(dough:Dough, topping:Topping)
case chiken(saurce: Bool)
case rice
}

var dinner = Main.pasta(taste: "クリーム")
dinner = Main.pizza(dough: Dough.thin, topping: Topping.bacon)
dinner = Main.chiken(saurce: true)
dinner = Main.rice
```

>4.項目巡回

列挙型のすべてのケースを確認したいとき、列挙型にCaseIterable プロトコルを相続すればよい。

そうすると、その後、列挙型にallcasesという名前のタイププロパティを通じて全てのケイトのコレクションを生成してくれる。

```swift
enum School: String, CaseIterable {
case priamry = "a"
case elementary = "b"
case middle = "c"
case high = "d"
}

let all = Shool.allCases
print(all) //[School.primary, School.elementary, School.middle, School.high]
```

これについては、後でさらに深く調べる必要があるようだ。

>5) 循環列挙型

掲げる項目の連関値が、列挙型自身の値でありたいときに使用する。

これは後でまた調べることにする。 難しい···。
Ethereumの署名のRecovery ID

### Recovery ID?
Ethereum の署名には、通常の ECDSA の署名で出てくる $r$ , $s$ に加えて $v$ が必要になる。
EIP-155 に従う場合、$v$ の計算は、

```typescript
v = recoveryId + chainId *2 + 35
```

となる。chainId は、Mainnet なら 1 、Ropsten なら 3 等、すぐわかるが、 recoveryId はわかりにくい。recoveryId は署名の検証で使う。

### 署名の検証
署名の検証では、以下の式を使って計算された公開鍵が、署名に使われた秘密鍵に対応した公開鍵であるかをチェックする。

```
公開鍵 = (署名s・署名で使われた点 - メッセージハッシュ・加法巡回群の生成元) / 署名r
```

`署名r` , `署名s` 、`メッセージハッシュ`、`生成元`はわかっているので、`署名で使われた点`を、`署名r` から復元することで、署名の正しさを確認することができる。ここで Recovery ID が必要になる。


### n と p と r
ECDSA の加法は、$\bmod p$ の世界で定義されているので、楕円曲線上の点は $p$ 未満の整数になる。
また $r$ は、楕円曲線上の点の x 座標を、加法巡回群の生成元の位数 $n$ で $mod$ したものなので、$\bmod n$ の世界の数で、$n$ 未満の整数になる。
また加法巡回群は、$\bmod p$の世界の中で定義されていているので、$n < p$ になる。

### r から点
#### x 座標
x 座標から作られる $r$ は、$\bmod p$ の世界から、$\bmod n$ の世界に変換されているので、変換前と後で値が変わっている可能性がある。
変わっている場合は、Ethereumで使われている secp256k1 では、$2n > p$ なので、$n + r$ になる。（ $2n$ 以上になると $p$ を超える）
なので、x 座標の値は、$r$ か $r+n$ のどちらかになる。

#### y 座標
楕円曲線は、x 軸を中心として上下に対称になっていて、一つの点の x 座標に対して、対になる点が、反対側の象限に必ず存在する。y 座標はこのどちらかの点の y 座標になる。

楕円曲線の加法では、ある曲線上の点と同じ x 座標をもっていて、反対側の象限にある曲線上の点は、加法逆元として定義されているので、対になる点同士を足すと単位元になる。

$y$ を求める計算は $\bmod p$ の世界での計算になるので、仮に片方の点の y 座標が $y$ だとすると、その加法逆元の $p-y$ がもう片方の点の y 座標になる。($y + p - y \equiv p \equiv 0 \bmod p$)。 $p$ は素数で奇数なので、$y$ が偶数なら、$p-y$ は奇数、$y$ が奇数なら、$p-y$ は偶数というように、$y$ は奇数か偶数かのどちらかになる。

#### ECDSA 署名としては正しくて、Ethereum 署名としては正しくない署名
Ethereum の Yellow Paper に $r$ は $\bmod n$ の世界の数でないといけないと書いてあるので、
ECDSAの署名としては正しくても、署名の点の x 座標が $r+n$ だった場合は Ethereum の署名として不正になる。
この記事を書いた時点では、24 ページの (300) にその記載がある。
$n$ が $p$ に対してかなり大きいため、$r+n$ になる確率は $1/2^{128}$ 位で相当低いので、引っかかることはまずない。（暗号学的にはありえないとかどこかに書いてあった。）
あとは、$s$ が $n$ の半分以下でないといけないという制限もある（Yellow Paperの (301) ）。こちらは理屈はわかってない。
ECDSA の署名をこのあたりの制限がない環境で作ると、たぶん $s$ で引っかかっているのか、5 回に 1 回くらいは Ethereum で不正な署名になる。（細かく見てない）

#### r が紐づく可能性のある点と Recovery ID
Ethereum で不正とされている範囲を除くと、$r$ が紐づく可能性がある楕円曲線上の点は、点の`x`座標が $r$ で、$y$ が 奇数のものと偶数のものの 2 通りになる。それぞれに Recovery ID が紐づいている。

```
Recovery ID=0 -> yがEven
Recovery ID=1 -> yがOdd
```

### 署名の検証での Recovery ID の役割
署名の検証時に Recovery ID を渡すことで、署名で使われた楕円曲線上の点が特定できるようになり、署名に紐づく公開鍵も計算できるようになる。
Linuxで行番号を付けてファイルを表示させる

行番号を付けてファイルを表示させる方法としては、catコマンドのオプションかnlコマンドがある
空行に番号を付ける場合と付けない場合を整理しておく

テスト用ファイル

```
# cat file
あいうえお


かきくけこ


さしすせそ
```
空行に番号を付ける場合

```
# cat -n file
     1  あいうえお
     2
     3
     4  かきくけこ
     5
     6
     7  さしすせそ

# nl -b a file
     1  あいうえお
     2
     3
     4  かきくけこ
     5
     6
     7  さしすせそ
```
空行に番号を付けない場合

```
# cat -b file
     1  あいうえお


     2  かきくけこ


     3  さしすせそ

# nl file
     1  あいうえお


     2  かきくけこ


     3  さしすせそ

# nl -b t file
     1  あいうえお


     2  かきくけこ


     3  さしすせそ
```
#参考
https://www.atmarkit.co.jp/flinux/rensai/linuxtips/541usenl.html
1bit CPUを自作した

1bit CPU を自作してみました。CPUがどんな原理で動いているか知りたかったので、最も簡単なモデルで試してみました。

# 回路図

![1bit-cpu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445338/d548751f-2832-790c-b3b1-6226bc08f9bd.jpeg)
※KiCadの回路図は[GitHub](https://github.com/naoto64/1bit-CPU)よりダウンロードできます。


# スペック

|項目|スペック|
|---|---|
|汎用レジスタ|1bit x 1|
|アドレス空間|1bit|
|ROM容量|4bit|
|命令セット|ADD, JMP|
|プログラムカウンタ|1bit|
|フラグレジスタ|未実装|
|算術演算|1bitの加算（XOR）|
|最高クロック周波数|8MHz程度|
|IC総数|4個|

以上のような超低性能コンピュータです。プログラムは2行しか書けません。1bitしか扱えないため、1+1は0になります。ほぼ何もできないコンピュータです。


# 命令セット

|命令|機械語|説明|
|---|---|---|
|ADD A, Im|0|AレジスタにIm（イミディエイトデータ）を加算する。|
|JMP Im|1|Imで指定した先の番地へジャンプする。|


# プログラム例

```text:Aレジスタに1を加算し続けるプログラム
ADD A, 1
JMP 0
```

```text:Aレジスタに1を加算するだけのプログラム
ADD A, 1
JMP 1
```

```text:何もしないプログラム
JMP 0
```


# プログラムの書き込み

スイッチが無かったので、ダイオードをスイッチ代わりにしました。プログラムを書き込むときは、0にしたいビットのダイオードを取り外します。1にしたいビットのみダイオードを取り付けます。これで書き込み完了です。


# 電源ON

<iframe width="560" height="315" src="https://www.youtube.com/embed/7_g6IDrb5PI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
　　
Aレジスタに1を加算し続けるプログラムです。リセット回路に0.1μFのコンデンサが入っているので、電源を入れると自動的にリセットされます。赤ランプがAレジスタ、緑ランプがプログラムカウンタ、黄ランプがクロックです。Aレジスタ（赤ランプ）が加算されています。オーバーフローすると0になるので、0と1を繰り返し、点滅動作になります。
環境変数を設定するバッチファイル（自身を書き換える）

### きっかけ
Bitnami Redmineをインストールすると、インストール先に```use_redmine.bat```というバッチファイルが出来る。これを起動すると、Ruby関連の環境変数が設定された状態でプロンプトが起動する。便利じゃんと思ったので、自分の業務用にも作った。

業務ではJava/Mavenを使うことが多い。担当する業務ごとに JavaランタイムやM2のインストールパスが異なることがある。開発者によっても使っているバージョンが異なる場合もある。コマンドプロンプトを起動して環境設定するのが面倒なので、設定を1回で済ませるバッチプログラム（バッチファイル自身を書き換える）を書いた。

### バッチの流れ

1. プロンプトを起動すると以前に設定した環境変数を読み込む（初回起動時はブランクになる）
2. 設定がブランクな環境変数の設定を促して、当該ファイルの末尾に設定を追加する
3. 改めて設定した環境変数を読み込む
4. PATHを設定して、新たなプロンプトを開始する


### 書いたバッチ

```winbatch
@echo off
rem Load pre configured setting.
call :SET_PATH

if not exist "%JAVA_HOME%" (
  call :INPUT_JAVA
)
if not exist "%M2_HOME%" (
  call :INPUT_M2
)
rem Load configured setting.
call :SET_PATH
set path=%JAVA_HOME%\bin;%M2_HOME%\bin;%path%

rem Start new prompt in current folder.
cd /d "%~dp0"
start color F0 ^& echo JAVA_HOME=%JAVA_HOME% ^& echo M2_HOME=%M2_HOME%  ^& echo. ^& %mvn -version

exit /b
rem --------------------------------------------------
:INPUT_JAVA

set JAVA_INSTALL_DIR=
echo Input java install directory path.
set /P JAVA_INSTALL_DIR=

if not exist "%JAVA_INSTALL_DIR%" (
    echo The path is not exist.
    pause
    exit
)

echo set JAVA_HOME=%JAVA_INSTALL_DIR%>>"%~dp0%~nx0"

exit /b

rem --------------------------------------------------
:INPUT_M2

set MAVEN_INSTALL_DIR=
echo Input maven install directory path.
set /P MAVEN_INSTALL_DIR=

if not exist "%MAVEN_INSTALL_DIR%" (
    echo The path is not exist.
    pause
    exit
)

echo set M2_HOME=%MAVEN_INSTALL_DIR%>>"%~dp0%~nx0"

exit /b

rem ------------------------------------------------------------
:SET_PATH
set JAVA_HOME=
set M2_HOME=

rem User settings are written bellow.

```

### 実行例

最初に起動したバッチプロンプト（2回目以降は入力を求められない）

```winbatch
Input java install directory path.
C:\ProjectX\pleiades\java\8
Input maven install directory path.
C:\ProjectX\bin\apache-maven-3.5.2
```

次に起動するバッチプロンプト

```winbatch
JAVA_HOME=C:\ProjectX\pleiades\java\8
M2_HOME=C:\ProjectX\bin\apache-maven-3.5.2

Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T16:58:13+09:00)
Maven home: C:\ProjectX\bin\apache-maven-3.5.2\bin\..
Java version: 1.8.0_202, vendor: Oracle Corporation
Java home: C:\ProjectX\pleiades\java\8\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

C:\ProjectX>

```
uniqコマンド基本

uniqコマンドについて確認

テスト用のファイルを用意

```
# cat file
aaa
aaa
bbb
ccc
ddd
ddd
```
オプションなしでコマンド実行すると重複行は一つの行にまとめられる

```
# uniq file
aaa
bbb
ccc
ddd
```
-uオプションを使用してコマンドを実行すると重複していない行のみ表示される

```
# uniq -u file
bbb
ccc
```
-dオプションを使用してコマンドを実行すると重複している行のみ表示される

```
# uniq -d file
aaa
ddd
```
ナスを美味しく調理してみた

クックパッドマートのキャンペーンでナスをタダでいただいたので、おいしく調理しました。
おいしいナスのレシピを紹介します。

# ナスとわさびのポン酢和え
## 材料（2〜3人分）
- ナス　3本
- 砂糖　小さじ1杯
- ポン酢　大さじ3杯
- わさび　小さじ2杯
- サラダ油　適量

## 作り方
1. ナスのヘタを落とし、縦半分に切ってから斜めに切り目を入れます。長さは食べやすい大きさに切ってください
2. フライパンに深さ１センチほど油を入れて熱し、1を並べ入れます。両面を2〜3分ずつ揚げ焼きにして取り出し、油を切ります
![E6766293-E826-479D-B716-675EAFA6ADDE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/a7743fd1-1837-78ce-9f10-3c53287e1759.jpeg)

3. ボウルに砂糖、ポン酢、わさびを入れ、よく混ぜ合わせてください

![BF6676AD-82FC-4BDC-83CE-E6B8DAF4F719.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/7d83d131-669e-e609-7fc8-c251ca3b9622.jpeg)

4. ナスを3に加えて和え、粗熱を取ると完成です
![635C7C98-6D97-45E4-8A94-AC75702ADD91.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/740fbf76-6a0c-a130-c6f6-d88d6a7a4797.jpeg)

# 焼きナスとごまのポン酢和え(2人分)
## 材料
- ナス　1本
- ごま油　大さじ1
- ポン酢　大さじ1
- 白ごま　小さじ2
## 作り方
1. ナスのヘタを落とし、４等分に切りそれぞれ縦４等分に切ります
※適宜食べやすい大きさに切ってください

2. 水に5分浸しあくを抜き、ざるにあげて水気を拭き取ってください
![4E19A30A-B994-464C-8604-7FED176D3A4F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/4871dc28-606e-fa80-7490-80b679c38008.jpeg)

3. フライパンにごま油を熱し、、ナスを加え焼き色を付けながら焼いてください
![B688BF6D-7AE6-43F6-8239-F9B3BA899BF1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/2b5839aa-9a45-9b85-d5ba-70ee9cc337e8.jpeg)

4. ボウルにポン酢とごまを加え、焼き上がったナスを加え和えると完成です
強欲で怠惰なあなたに捧げるHEIFファイル表示方法

iPhone/iPadの画像をバックアップしていたらいつの間にか拡張子がJPGからHEICに変わってしまい、Windowsとかで表示できなくなって慌てているあなたに捧げます。ただし、強欲なあなたは無料のものしかインストールしたくないでしょうし、怠惰なあなたはできる限り手間を掛けたくないことでしょう。さらに強欲で怠惰なあなたは「とっとと答教えろ」と思っているでしょうから、いきなり答です。

| OS | 表示方法 |
|:-:|:-:|
| Windows | nomacs |
| GhostBSD  | Ristretto |
| Mac  | 新しいのなら多分問題なし  |

あと、一括でJPGに変換するという方法もあるようですが、同じ画像がファイル形式の違いだけでハードディスクやSSDを占有するというのは強欲なあなたにとっては許せないことでしょう。なので、ここでは取り上げません。
もちろん、ここに書いてあるもの以外に方法がないというわけではないでしょう。が、怠惰なわたしはこれ以上調べる気はないですし、強欲な私はこう言います。「お前が調べろ。」

# Windows
画像を表示できそうなプログラムを片っ端から試します。
あと「HEIF画像拡張機能」は無料ですので、すでに入れているのですよ。
## Windowsフォトビューアー
駄目でした。
## ペイント
駄目でした。
## フォト
「HEVCビデオ拡張機能」が必要と言われ、ダウンロード先のリンクが出てきます。リンク先はMicrosoft Storeです。だが、しかし、「￥120(税込)」とあります。ここであなたの強欲さが邪魔をします、残念。
ネットの記事では「『HEVCビデオ拡張機能』は無料だ」と書いてあるものもあるのですけどね。変わってしまったようです。
## IrfanView
ここで「純正」？は諦めて、フリーソフトに目を向けましょう。IrfanViewって有名ですよね。個人で使う分には問題ないはずなので、インストールしてみます。
ファイルを選ぶと表示は真っ黒になります。（今までと違いエラーにはなっていません。） Exif情報は取れるので、IrfanViewとしては表示しているつもりっぽいです。「HEIF画像拡張機能」は入っているけど「HEVCビデオ拡張機能」が入ってないことによる弊害でしょうか。
## nomacs
表示できました。めでたしめでたし。
どこまで有名か知りませんが、以前画像を一覧したいなと思って探した時以来のお気に入りのOSSです。バージョンは3.1.6でした。

# GhostBSD
以下に有名なOSSでの失敗例が列挙されてますが、実はそのOSSがHEIFに対応していないというわけではないです。pkgで何も考えずにインストールしたバイナリを使う前提です。強欲で怠惰なあなたはそういう使い方をするでしょう。
（むしろ、ここに列挙されているのは、自分でHEIF対応を謳っていたり、ネットにそういう記事があったりしたものです。なので、頑張ればきっとできるはず。でも頑張らない。）
## GIMP
駄目でした。
## nomacs
駄目でした。Windowsではできたのに。
## Image Magick
駄目でした。コンパイルオプションでオフにされているみたいです。
## exiftool
ここで表示を諦めて、Exif情報だけでもなんとかならないのかと思ってexiftoolを試します。が、pkgになってないようなので、怠惰なあなたにとっては異世界の話でしょう。でも、インストールするまでもなくExif情報が取れました。ということは何かに使えそうです。
## Ristretto
できました。というか多分試した順序がexiftoolと逆で、「Ristrettoをインストールして試してみたけど駄目だったので、exiftoolを試した。でも、別の日にRistrettoを試したら表示できるようになっていた」ということだったと思います。なので、もしかしたら、インストール後に再起動が必要なのかもです。[^1]

# Mac
（比較的）新しいMacを買ったので試してみます。でも、そもそもHEIFってAppleが担いでいる形式ですから、怠惰なあなたは画像ファイルを選んでクリックすればMacがいい感じにやってくれるはずです。なので、以下は時間があまり過ぎて困ってしまった時に読んでください。
## GIMP
公式サイトからダウンロードしてインストールしたもので開けました。
## nomacs
残念ながらMac版のバイナリーなるものは存在しないようです。ただし、以下の手順で作成できます。
1. GitHub（ https://github.com/nomacs/nomacs ）から最新版をダウンロード
1. https://github.com/nomacs/nomacs/pull/956 のパッチを当てる[^macnomacs]
1. パッチのREADME.mdにある手順に従って構築

ということで、怠惰なあなたには異世界の話でしょう。

[^1]: ごめんなさい。ちょっと嘘でした。【嘘1つ目】厳密に言うとRistrettoをインストールしただけでは表示されません。libheifもインストールしてください。そうすればGDKが頑張ってくれる模様です。【嘘2つ目】再起動が必要なわけではありません。GDKがキャッシュ情報を持っているようです。怠惰な方は自動でそれが更新されるのを待てばよいでしょう。急ぎの方はgdk-pixbuf-query-loadersで頑張れば良さそうです。が、これ以上説明するのは力尽きました。
[^macnomacs]: パッチを当てなくても画像を表示するという最低限の仕事はしてくれる感じですが、「かゆいところに手が届かない」動作になります。

# 恒例のお断り
この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。
[随時更新]コーディング対策～こんな時は、こうする～

#この記事は
筆者がコーディング対策で学習する際の備忘録＆これから、もしくは今絶賛コーディング対策中の方に向けてお助けとなる記事にしたいと思います。

メガベンチャーをはじめとするエンジニア募集企業では新卒の場合、書類選考とともにコーディング試験があります。その為、ただアプリを作ってそれを面接でアピるだけではダメで、コーディング試験もしっかりと得点しないといけないわけです。

と、筆者は最近気づき、急いで対策を始めました。

コーディング試験で用いる言語は、Pythonにしたいと思います。
理由は、文法がシンプルだから。
Androidエンジニアなので、Kotlinを使おうと思いましたが、コーディング対策をする意義は、コーディング試験を通ることが全てなので、それを達成しやすい言語を選択しました。

#ケーススタディ集
###二つの入力値をint型で受け取る
```python
X, Y = map(int, input().split(" "))
```
###数値リストで入力値を受け取る
```python
 num_list = [int(i) for i in input().split()]
```
###リストを並べ替えしたい
```
hoge_list.sort()
```
###リストを分割したい
```python
hoge_list = [0,1,2]
hoge_list.pop(0) 
print(hoge_list) # 0が出力される
```
###リスト要素の和
```python
sum(hoge_list)
```

###文字列を一文ずつ扱いたい
```python
hoge = input()
print(hoge[0])

# 出力値：h
```
これ、知らなかったわぁ。

###タプルのリストを並び替えする時
```python
sorted(hoge_list)
```

###リストの任意要素を削除
```python
hoge_list = [1,2,3]
del hoge_list[0:2]
print(hoge_list) #[3]
```

#エラー編
```
EOF when reading a line #存在しない行にアクセスしようとしているよ
```

#コラム欄的な
B問題くらいになってくると、問題が複雑になったり、標準入力が何なのか等色々と頭が複雑になってきます。
そこで、個人的にアルゴリズム構築のコツだと思うものを書いていきます。

答えは、「五文字化」です。

アルゴリズムを作る上で、難しいと思う原因は何なのか？と個人的見解をいうと、言語化ができてないことだと思っています。
例えば、以下の三種類に分けられます。

・目的（そもそも、何を出力するの？）
・入力（入力値は、なんなのか？）
・ターゲット（どの部分を実現するのか？）

この三つを箇条書きにまとめていきます。
そして、大事なのが書くことは必ず五文字以内で書くこと。
五文字以内にする理由は、折角、メモしても読み返す時間が掛かってしまうからです。
文章にすると長いので、把握しにくいし、覚えられないのです。

例えば、最終的に出力する値が、なんかの値の合計値としたら -> 合計
標準入力の一行目が、何かの処理の命令数だったら -> 命令数

そして、三つ目は一番重要です。
まず、どの部分を実現するのかを言語化することです。
というもの、コーディング試験においていきなり完成形を思い描くことは不可能です。
天才にしかできません。
A,B,C,Dの四パターンあるとしたら、取り敢えず、Aパターンだけでも動くようにするかと部分を積み重ねることで、いずれ四パターン含めて完成していくわけです。

実際には、入力例ごとに、あるいは一行ずつ実現することになるでしょう。
アルゴリズムを作るというのは、試行錯誤をすることとイコールだと考えます。

是非、使ってみてください！
Laravel Sail で環境構築　その２（TablePlusとLaravel Bleezeのインストール）

前回の記事では、Laraveのプロジェクト作成まで行いました。

今回は、DBツール**TablePlus**の設定と、
認証機能を簡単に実装できる**Larave Bleeze**のインストール
を行いたいと思います。

**TablePlus**の使い方は[こちら](https://docs.tableplus.com/)

**Laravel Bleeze**とは？
「認証機能」いわゆるログインやらユーザー登録などの機能をコマンドだけで作成できるLaravelの機能
普通だったら、コントローラーやテンプレートを作成する必要があるのですが、コマンドだけで作れてしまいます。

##TablePlusのインストール・設定##
#####1.DBテーブルの作成#####
TablePlusのインストール前にテーブルを作成します。
``` sail artisan migrate```
※sail使っていない場合は、```php artisan migrate```

#####2.TablePlusのインストール、設定#####
インストーラーをダウンロード

https://tableplus.com/

アプリを開き、右下の「create a new connection」をクリック
![スクリーンショット 2021-06-13 18.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/01288e96-66ed-795a-f98d-2f50c31d80a1.png)

**MySQL**を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/1c8d5897-f69a-b732-57de-1106392dadd4.png)

設定画面が表示されるので、Laravelプロジェクト直下にある.envファイルを見て各欄設定する
※HostとPortはデフォルトから変更してなければ未入力でOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/e8785603-b666-72b2-ee9a-a5c5e5fb19a4.png)


![スクリーンショット 2021-06-13 17.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/4ba8fdb4-3f25-2122-d126-646af658561d.png)

接続完了するとDB画面が表示されます。
※左欄にはmigrateで作成したテーブルが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/945dc906-d386-9b0f-1303-fa867be0d30d.png)





##Laravel Bleezeのインストール#
#####1.インストール#####
以下のコマンドを順番に実行
```sail composer require laravel/breeze --dev```
```sail artisan breeze:install```
```npm install && npm run dev```
```sail artisan migrate```
※migrateができなかったら、キャッシュクリアする
#####2.ユーザー登録（テスト）#####
インストールが完了するとLaravelのトップページ（``http://localhost/``）にlogin/registerボタンが表示されます。
registerボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/3a15094b-77cb-6f6a-98aa-bb799ecdb62f.png)
ユーザー名やメールアドレスなどを登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/29c80e3d-4df6-e07a-7afa-9d85be8d6825.png)
ユーザー登録成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/7d50b975-7250-5340-f1fa-e669a1cd0e3d.png)

TablePlusでuserテーブルを確認すると、登録したユーザーが表示されているのが確認できます。
![スクリーンショット 2021-06-13 18.21.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/6550630f-da3d-84e2-8226-0544117970bb.png)

以上でBleezeでの認証機能設定は完了です。
すごい簡単でした。。

また、色々設定したら記事を書いていきたいと思います。
Herokuにデプロイ後にCSVで作成したデータをテーブルに登録したい Rails

あらかじめデプロイする前に

```db/seeds.rb
require "csv"
CSV.foreach("db/archive.csv", headers: true) do |row|
  Archive.create(
    id: row["id"],
    archiveid: row["archiveid"],
    archivetitle: row["archivetitle"],
    archiveviews: row["archiveviews"],
    archivepostdate: row["archivepostdate"],
    archiveurl: row["archiveurl"],
    archiveimg: row["archiveimg"],
    created_at: row["created_at"],
    updated_at: row["updated_at"],
  )
end
```

を記述して、該当のディレクトリにCSVを格納しておきます。
これは要はHerokuにデプロイした後に、

```
heroku run rake db:seed
```

を実行して、インポートしようという算段です。

https://qiita.com/show1107/items/5dbdac581d561909cf84

https://qiita.com/mmmasuke/items/545afaf5876d3dc52670

Herokuへのデプロイのやり方は省略します。

ただし、今回はデプロイ時にいくつかポイントがありました。

ローカル環境でもそうでしたが、今回絵文字を多用しているので、テーブルに登録するデータのエンコードはutf8mb4にしなければなりません。

ということで、

```ruby
heroku run rails db:migrate
```

する前に、設定を変更しましょう。

```
heroku config:set DATABASE_URL="mysql2://<username>:<password>@<host>/<database>?reconnect=true&encoding=utf8mb4"
```

これでMySQLのエンコードをutf8mb4にすることになります。

そして

```db/migrate/20210************_create_***.rb
class CreateMusics < ActiveRecord::Migration[6.0]
  def change
    create_table :musics, options: 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4' do |t|
#OPTION以降を追記
```

コミット、プッシュして、Herokuにもプッシュ

この状態で

```
heroku run rails db:migrate
```

でマイグレーション。

更に

```
heroku run rake db:seed
```

これで登録ができるはず・・・・

## トラブルシューティング

実際はこれでできなかったから困りました。

そこで対応したこととしては

①Herokuへ再度プッシュ
②DBのリセット

今回は②が有効でした。

```
heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```

https://qiita.com/saika_0/items/7afe389471adb4e69f9a
個人的raspberry pi ネットワーク設定

#サーバーの書き込みの設定
- Read Onlyでロック
- Read Writeでロック解除
- Overlayは常にDisabledにすべき
- 設定変更後、再起動することで反映される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524479/8da84109-4fb1-11a2-e891-6a38ef129ab7.png)

#サーバーSSID変更
- コマンドラインで、sudo nano /etc/hostapd/hostapd.confと入力
- SSID=　設定したいSSID　に変更
- ctrl+Xを入力後、Yを入力しEnterで最初のコマンドラインの画面に戻る。
- sudo reboot と入力し再起動、再起動後任意のSSIDで起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524479/0dd2ff3e-f535-cf62-4328-63c2a033c314.png)


#子機の書き込みの設定

- 子機起動後、コマンドラインで以下のコマンドを入力
- 再起動後、設定が反映される

###書き込み許可

```

#!/bin/sh

if [ -e /mnt/boot-ro/config.txt ]; then
    sudo mount -o remount,rw /dev/mmcblk0p1
    sudo grep -v initramfs /mnt/boot-ro/config.txt >/tmp/config.txt
    sudo cp /tmp/config.txt /mnt/boot-ro/config.txt
    sudo reboot
else
    echo Already write enabled
fi

```

###書き込み禁止
- 書き込み禁止にする際はPythonのコードを起動時に実行するように保存したおいたら便利

```
cd ../ 
cd ../ 
sudo cp home/pi/Desktop/test.py opt/test.py

#!/bin/sh

if [ -e /mnt/boot-ro/config.txt ]; then
    echo Already write protected
else
    sudo grep -v initramfs /boot/config.txt >/tmp/config.txt
    sudo echo initramfs initrd.gz >> /tmp/config.txt
    sudo cp /tmp/config.txt /boot/config.txt
    sudo reboot
fi
```

#子機の接続先SSID変更

- コマンドラインでsudo nano /etc/wpa_supplicant/wpa_supplicant.confと入力
- SSIDの箇所を接続したいSSIDに変更
- ctrl+Xを入力後、Yを入力しEnterで最初のコマンドラインの画面に戻る。
- sudo reboot と入力し再起動、再起動後任意のSSIDに接続する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524479/87cf8cc2-75b4-bbb1-a6bc-263d35ca8573.png)
ps1スクリプトを一般ユーザで起動したとき管理者権限で起動しなおすスクリプト

# 概要
Powershellあるあるですが、「管理者として実行」するのが手間なので、スクリプト側で勝手に管理者起動しちゃうようにしました。
（確認ダイアログは出ます）

# 本文

## 1. コード

```powershell:main.ps1
# 管理者権限でない場合、現在のスクリプトを管理者権限で実行して自分は終了
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    $commandPath = $PSCommandPath
    echo ("not admin. restart as admin:" + $commandPath)
    
    # 引数を、管理者権限実行用に作り直す
    # 引数が、クォートされた空白を含む文字列である場合を想定。
    # そこまで考えないでいいなら、Start-Process の $argsToAdminProcess の代わりに$Argsを入れても問題ない。
    $argsToAdminProcess = ""
    $Args.ForEach{
        echo ("not admin: args: " + $PSItem)
        $argsToAdminProcess += " `"$PSItem`""
    }

    # 実行
    Start-Process powershell.exe "-File `"$commandPath`" $argsToAdminProcess"  -Verb RunAs
    # デバッグ用に、閉じる前に止める。
    Pause
    exit
}

echo "admin."

# 管理権限実行に渡ってきた引数を確認する
$Args.ForEach{
    echo ("admin: args: " + $PSItem)
}

# デバッグ用に、閉じる前に止める。
Pause
```

## 2. コマンドと実行結果

```powershell:コマンドと実行結果
PS C:\dev\src\tmp> .\main.ps1 aaa "bbb ccc" ddd
not admin. restart as admin:C:\dev\src\tmp\main.ps1
not admin: args: aaa
not admin: args: bbb ccc
not admin: args: ddd
続行するには、Enter キーを押してください...: 
```

```powershell:管理権限で起動された側の実行結果
admin.
admin: args: aaa
admin: args: bbb ccc
admin: args: ddd
続行するには、Enter キーを押してください...:
```

`$Args.ForEach{...` で引数を組みなおさなかった場合、引数は `aaa` `bbb` `ccc` `ddd` の4つになります。

## 3. はまったところ

```powershell
    # 実行
    Start-Process powershell.exe "-File `"$commandPath`" $argsToAdminProcess"  -Verb RunAs
```
`Start-Processの引数` と `powershell.exeの引数` が混ざってると気づくまでは意味が分からなかったです。
`Start-Processの引数` は `powersshell.exe` と `-Verb RunAs`、
`powershell.exeの引数` は ``` "-File `"$commandPath`" $argsToAdminProcess" ``` です。
そしてここがだめだと、Start-Processで起動したウィンドウが即消滅するので、何が悪いのか手がかりがつかめず辛かった。。。
おかげで `[Security.Principal.WindowsPrincipal]` `[Security.Principal.WindowsIdentity]` の中身とかまでのぞき込むはめになったものの収穫なしという。


## 4. 短くした版
デバッグ用のechoとか削った版です。
コメント入れて8行なので、管理権限が必要なスクリプトの頭に一律コピーしても、そんな邪魔でもないんじゃないかなと思います。

```powershell:短くした版
# 管理者権限でない場合、現在のスクリプトを管理者権限で実行して自分は終了
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    $argsToAdminProcess = ""
    $Args.ForEach{ $argsToAdminProcess += " `"$PSItem`"" }
    Start-Process powershell.exe "-File `"$PSCommandPath`" $argsToAdminProcess"  -Verb RunAs
    exit
}

echo "admin."

# 管理権限実行に渡ってきた引数を確認する
$Args.ForEach{
    echo ("admin: args: " + $PSItem)
}
```



# 参考にさせていただいたページ
[Powershellスクリプトを管理者権限で再実行する方法](https://bgt-48.blogspot.com/2018/10/powershell.html)
かなり汎用的に書かれています。

[【PowerShell】PowerShellを管理者権限で実行したい！ソースの先頭に埋め込むだけで自動で管理者権限に昇格するスクリプト！ - これくとろぐ](https://correct-log.com/powershell_auto_admin/)
ワンライナーで書かれてます。引数は考慮されてませんが、引数文字列内の空白考慮なしでいいなら、$Argsを忍び込ませればいけます。

# あとがきという落ち
引数を反映させようとしてがんばったわけですが、引数を使う時点で高確率でpowershellを起動させているので、引数対応の必要性は低い気がしました
ouch... :head_bandage:
ノートPCのメモリを換装してみた。

プログラミングをやっていて、どうもPCの動作が遅い。特殊な動作をしているわけではないのでメモリを増設すればまぁ解決するでしょう。ということでメモリを増設してきました。

メモリを増設しておけば、次回PCを買ったときにメモリを再利用できる気がする…気がしない？

# やったこと
ノートPC(Lenovo IdeaPad S540)のメモリ(RAM)を換装しました。
元のメモリが8GB
交換先が16GB
使用したのは[G.Skill の16GBメモリ](https://www.dospara.co.jp/5shopping/detail_parts.php?bg=1&br=12&sbr=1187&mkr=850&ic=451633&lf=0)です。10,000円ぐらいでした。
とてもサクサクになりました。

![DSC_1091.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/8a2e5bf1-f604-0f81-d488-734605c6446d.jpeg)
下がPCです。上に乗っているのが新しく購入したメモリ。

# 使った工具
精密ドライバー。特にトルクスドライバー。[セットで買いました](https://www.monotaro.com/g/02921055/)。

# 実際の行動

## 0.初めに
最初のPCのメモリ状況です。タスクマネージャーで確認しました。
![スクリーンショット 2021-06-11 130711.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/6cd2d5f6-6b6b-c942-2c30-29de89c3e009.jpeg)
メモリは8GBです(右上)。割と上限ぎりぎりまで使ってました。

## 1.PCのふたのねじを外す
![DSC_1093.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/a6dc6f6d-1492-ebb6-6aed-4a6bc85c962d.jpeg)
こんな星形のねじを開けます(スマホのオートの接写はこれぐらいが限度かも…)。トルクスねじです(これは商標なので本当は「ヘックスローブ」という名前らしい)。上のドライバーセットの、いちばん小さなトルクスドライバーでしっかり差し込まないとねじを舐めてしまいます、気を付けてください。

## 2.PCのふたを開ける
ねじをすべて外してもふたを開けるのはちょっと難しいです。正直、ねじは必要ないんじゃないかというぐらいしっかり閉まっています。ふたの隙間にマイナスドライバーをねじ込むなどして何とか開けました。ちゃんとした開け方を知りたい。
![DSC_1097.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/77dcca48-03da-f9f6-b024-6f439b41af2d.jpeg)

### 2.1 中身を観察
ノートPCの中身ってこんなんになっているんですね。
![DSC_1098.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/aeeded87-5aa6-ae9a-a8f0-7d537784ccf3.jpeg)

真ん中の銀色の四角いケース状の部分の中に換装できるメモリが入っています。

## 3.メモリが入ったケースを開ける
![DSC_1100.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/dab0ed8b-d9d4-ccbb-4dc7-372de6ead6b8.jpeg)
ふたがこんな感じで開きます。根本はテープで張り付いているので、このような形です。
![DSC_1099.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/6f11a571-aad3-4a6e-d0b9-5cea381614f8.jpeg)

開くとこんな感じです。青くて基盤がむき出しになっているパーツがメモリです。
これを取りだすのがなかなか大変でした。

## 4.メモリのストッパーを外す
このメモリは簡単に外れてしまわないようにストッパーが付いています。

![InkedDSC_1099_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/e4cf318b-ae4f-52b7-ed2a-d24b53d97616.jpeg)
そのストッパーを図の方向に引っ張ると外れます。
外れるとメモリーは下の図のような状態になります。
![DSC_1101.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/64a6fd3a-12e4-49b5-f380-5e5cec8bf9e9.jpeg)

## 5. メモリを外す
上図の状態からメモリと水平の向きにまっすぐ引っ張るとメモリが抜けます。
(説明の図はないです)

## 6. メモリをつける
逆の手順で新しいメモリを挿入します。上図の状態からメモリを倒していくとストッパーが自動的に挟まります。

![DSC_1102.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/b9179f42-890c-9bc1-5e76-8c891f4e4ded.jpeg)
メモリが換装できました。
## 7. ふたを閉めていく
手順を逆にふんでいき、ふたを閉めていきます。
トルクスねじはかなりねじを舐めてしまいやすいので注意してください。

## 8.最後に
メモリがちゃんと認識されているかの確認です。
![スクリーンショット 2021-06-11 135253.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070392/f9e8906a-40a2-efc4-fe74-6848dc5e036c.jpeg)
ちゃんとメモリが認識されていそうです。4GBのメモリを外して16GBのメモリを付け替えたので12GBの増設、20GBのメモリになっています。
ページネーションのリンクが表示できなかった。（備忘録）

ページネーションを実装中にエラーになったので、備忘録として残しておきます。
#エラー内容

```
BadMethodCallException
Method Illuminate\Database\Eloquent\Collection::links does not exist. (View: /var/www/html/resources/views/articles/index.blade.php)
```
![paginate error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935364/8dcdf334-f7a7-ad50-2da5-28d2e6adffac.png)

#該当するソースコード
```PHP:ArticleController.php
public function index(Request $request)
    {
        //検索機能
        $search = $request->input('search');
        $query = Article::query();

        //タイトルと本文の曖昧検索を実施
        if (!empty($search)) {
            $query->where('title', 'LIKE', "%{$search}%")
            ->orWhere('body', 'LIKE', "%{$search}%");
        }

        $articles = $query->paginate(10)->sortByDesc('created_at');

        return view('articles.index', ['articles' => $articles]);
    }
```
```HTML:index.blade.php
@extends('app')

@section('title', '一覧ページ')

@section('content')
@include('nav')
<div class="container">
    <div class="row">
        <div class="col-md-12">
            @guest
            <img src="/images/Construction-pana_r1.png" width="100%">
            @endguest
            <form method="GET" action="{{ route('articles.index') }}" class="d-flex">
                <input class="form-control me-2 mt-3" name="search" type="search" placeholder="検索" aria-label="Search">
                <button class="btn btn-outline-success mt-3 mb-0 ml-0 py-0" type="submit"><i class="fas fa-search"></i></button>
            </form>

            @foreach($articles as $article)
            @include('articles.card')
            @endforeach
        </div>
        {{ $articles->links() }}
    </div>
</div>
@endsection
```
#`sortByDesc`を`orderByDesc`にすることで解決
`$articles = $query->paginate(10)->sortByDesc('created_at');`だと「10件取得した結果から並べ替える」になっています。
`$articles = $query->orderByDesc('created_at')->paginate(10);`に修正することで、「並べ替えた結果から10件取得」ことになります。
また、`sortByDesc()`はコレクション（配列を拡張した（機能を加えた）もの）で返していたのが原因だったと考えています。
クエリビルダの機能である`orderByDesc()`を使用することで、指定したカラムでクエリ結果をソートし表示することができたと思います。
HTML/CSS/Javascript/JSXのコメントアウトの方法

#はじめに
コメントアウトの方法をよく忘れるのでまとめておきます
こちら[[1]][[2]]を参考にさせていただきました。

2021/6/13追記
コメントで指摘されたHTMLのコメントアウトについて修正しました。

#コメントアウト
|言語|1行コメントアウト|複数行コメントアウト|
|:--------:|:---------------:|:------------------------:|
| HTML|<!–- コメント -–>|左と同じ|
| CSS |/* コメント */|左と同じ|
| javascript|//コメント|/* コメント*/|
| JSX |{//コメント}|{/* コメント*/}|


#おわりに
HTMLとCSSのコメントアウトめんどくさい。
それではまた。

#参考文献
[1]:https://creive.me/archives/13347/
[2]:https://qiita.com/naoiwata/items/c590667765143c41d87a
[[1]]:【HTML】コメントアウトの書き方！注意点や便利な使い方も紹介
[[2]]:今更聞けない JSX のコメントアウトの構文
Cisco IOS基本操作

#はじめに

土日なので、引き続き学習を進めていきます。

#Cisco IOSとは？

スイッチやルータに実装されているCiscoのソフトウェア。
Cisco機器のOSを差す。Cisco IOSが起動されない限り、Cisco機器が動作することはない。
基本的にCLI操作。
様々な「モード」が階層化されている。

#Cisco IOSの各モードについて

①ユーザモード (プロンプトは">")
↓　<font color="red">>enable</font>
②特権モード (プロンプトは"#")
↓　<font color="red">#configure terminal</font>
③グローバルコンフィギュレーションモード(プロンプトは"(config)#")
↓・fa0/0の設定の場合<font color="red">(config)#interface fastEthernet 0/0</font>
↓・コンソールやtelnet,AUXポートの場合<font color="red">(config)#line console 0</font>
↓・VTY接続の場合<font color="red">(config)#line VTY [開始ライン番号] [終了ライン番号]</font>
④コンフィギュレーションモード

#Cisco機器のメモリ

**①RAM**
running-configを格納しているメモリ。
電源のON/OFFをするとRAMの情報は消える。

**②ROM**
ルータの起動や保守を行う基本的な機能データが格納される。
電源ON/OFFでは情報は失われない。

**③NVRAM**
設定情報(startup-config)が格納される。
ルータの電源がOFFになると、組み込みバッテリを使用してデータを保持し続ける。

**④Flashメモリ**
Cisco IOSのイメージが格納される。
このメモリが壊れると、Cisco IOSが起動せず機器も正常に起動しない。

#基本コマンド

・今動いている設定を確認するコマンド
<font color="red">Router#show running-config</font>

・保存されている設定情報を確認するコマンド
<font color="red">Router#show startup-config</font>

・running-configをstartup-configに保存する。(ゲームでいうセーブ)
<font color="red">Router#copy running-config startup-config</font>

・startup-configの中身を消す。初期状態に戻したい時に使う。
<font color="red">Router#erase startup-config</font>

・IOSのバージョンを確認。
<font color="red">Router#show version</font>

**(showコマンドの先頭に"do"を入れると特権モードに戻らなくてもコンフィギュレーションモードでも設定を見ることができる。)**

#最後に

CCNAの参考書をネットで購入し、今日届いたのですが分厚さに驚きました。
受験予定の皆さん、頑張りましょう。
【Swift】@IBInspectableと@IBDesignable

#はじめに
今回はIBDesignableとIBInspectableについて解説してみたいと思います！

#IBInspectable
これを使うとストーリーボードのInterfaceBuilderで設定できるようになります。
[前回](https://qiita.com/REON/items/a5b2122785792f83f851)のプロジェクトを使って解説します。

このように、placeHolderに対して`@IBInspectable`を使います。

```swift
    @IBInspectable
    var placeHolder: String = "" {
        willSet {
            self.placeHolderLabel.text = newValue
            self.placeHolderLabel.sizeToFit()
        }
    }
```

すると、ストーリーボードのInterfaceBuilderで変更可能になります。

![ScreenShot 2021-06-13 17.13.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/54da4630-e8e1-38fd-0fe7-480f7fc60662.png)

![ScreenShot 2021-06-13 17.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/29c1b6c2-d84e-e35e-31d9-ae27a9aab5bc.png)

![ScreenShot 2021-06-13 17.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/805d6abf-c1a0-3b75-345f-77ea623d2979.png)

ただし、コードでplaceHolderを指定した場合はそちらが優先されます。

```swift
final class ViewController: UIViewController {
    
    @IBOutlet private weak var textView: PlaceTextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        textView.placeHolder = "カキクケコ"
        
    }
    
}
```

![ScreenShot 2021-06-13 17.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/903601bc-c22c-2abd-5c3f-42447fd8eb42.png)


#IBDesignable

IBInspectableを指定し、リアルタイムで見た目の変更をストーリーボードで見れるようにしてくれます。
つまり、ビルドしなくても確認できるようにするためのものです。

ストーリーボードで適当にUIViewを配置してください。


![ScreenShot 2021-06-13 17.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/baeff08c-78a8-4c86-d580-fffa11574017.png)

そして、ViewControllerで以下のように書いてみます。

```swift
final class DesignableView: UIView {
    
    @IBInspectable
    var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
        }
    }
    
}
```

先ほど配置したViewにこのDesignableViewを継承させます。

![ScreenShot 2021-06-13 17.39.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/5583984d-7246-34cb-cc2d-5e3c177fbef2.png)

先ほどの`@IBInspectable`のおかげでストーリーボードから変更できるようになっているので、適当に値を変えます。

![ScreenShot 2021-06-13 17.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/2c2fbf1d-981f-78d5-3839-4e1886eea94e.png)

ただし、この時点では`@IBDesignable`をまだ使っていないのでリアルタイムでは変更されません。

![ScreenShot 2021-06-13 17.41.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/4b371eb8-6ba7-3152-5046-c6aa8c5a7cd7.png)

`@IBDesignable`をつけてあげます。

```swift
@IBDesignable
final class DesignableView: UIView {
    
    @IBInspectable
    var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
        }
    }
    
}
```

すると、このようにリアルタイムで変更が見られるようになると思います！

![ezgif.com-gif-maker (7).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/be2652dc-3094-7e52-a63e-8e46a4f1af99.gif)

#おわりに
`@IBInspectable`と`@IBDesignable`は便利ですね！積極的に使っていきたいです！
Chromebook で 日本語入力が出来なくなってしまった場合には、キーボードの入力モードが「ひらがな」になっているか 確認しましょう！

「**かな↔英数**」キーなどを押して、日本語入力モードに切り替えているはずなのに、アルファベット入力しか出来なくなってしまう場合、キーボードの入力方法が「**ひらがな」**になっているか、確認しましょう！

何らかのタイミングで「**半角英数**」など、別のモードに(意図せず)変更した場合、
次回 再度、**かな↔英数** を押して日本語入力モード(カーソル位置で「**あ**」って表示されます)に変えても、「**ひらがな**」には変更されないので、日本語入力できなくなります。
![Chromebook_Japanese.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273671/205fc9c6-afb6-e71c-bd15-65030a60cb34.jpeg)

そういう場合は、手動で「**ひらがな**」を選択すれば、**元通り、日本語入力できる**ようになります。

これ、なんでモードを維持する必要があるんだろう？
初心者は、戸惑うと思うんだけど...
SyntaxErrorでエラーを起こしました

こんにちは！
エラーが発生したのをきっかけに、
SyntaxErrorInTemplateについて調べて
アウトプットしたいと思います！


<h1>エラー内容</h1>

[![Image from Gyazo](https://i.gyazo.com/1334954bb5bd011577f5aa137d9c7dc6.png)](https://gyazo.com/1334954bb5bd011577f5aa137d9c7dc6)

上記に該当する実際のVSコード

[![Image from Gyazo](https://i.gyazo.com/817e10a137031155c5c2a33c4b44aefe.png)](https://gyazo.com/817e10a137031155c5c2a33c4b44aefe)

SyntaxErrorInTemplateというエラー内容です。
SyntaxErrorInTemplateについて調べてみたところ
以下のエラー問題点に関する仮説を立てました。
①ビューに乱れがある？
②Controller#showとshow.html.erb間で
読み込めないていないので
Controller#showで行った変数定義に誤りがあるのか？

①だとするならば36行目がの記述に誤りがあるのかと
思い、「,」や()の抜け漏れやspellチェックなどを確かめてみましたが
エラーは解消できませんでした。

②の場合、Controller#showを調べてみましたが
特に誤った記述は確認できませんでした。



<h1>SyntaxErrorInTemplateはviewに関するエラーの可能性が高い</h1>
正直ね、ここで僕３時間ぐらい悩みました。
これだけ悩んだら質問していいだろうと思い
メンターの方に聞いてみました。

そもそもSyntaxError自体は構文エラーで
書き方に誤りがあるのでビューファイルに
問題がある可能性が高いとのことを伺いました。

本当にありがとうございました。

<h1>user_signed_in?メソッドの使用方法に誤り</h1>
```
<% if user_signed_in? %>
```
と記述しなきゃいけないところを

```
<% if user_signed_in ? %>
```

とinと?の間に半角スペースがあったことで
user_signed_in?メソッドが処理されなかったことで
エラーが起こっていただけでした。
Codemagicでリポジトリにないファイルを追加してビルドする

Codemagicでは簡単にFlutterアプリをビルド・配信できますが、google-services.jsonなどのリポジトリに登録されていない機密ファイルをビルドに含めるのが少し面倒なので、記載しておきます。

# 考え方

以下リンク先に記載の通りですが、ファイルを文字列に変換し環境変数として持っておき、ビルド前にファイルに再変換する、というステップを踏みます。
https://blog.codemagic.io/how-to-load-firebase-config-in-codemagic-with-environment-variables/

1. 追加したいファイルをBase64エンコードします。
2. 環境変数にエンコードした文字列を設定します。
3. pre-buildスクリプトで、環境変数からBase64デコードしてファイルを出力します。


# 実際にやってみる

リポジトリにコミットされていない機密ファイルをBase64エンコードします。
Windowsではcertutilを使うとできます。標準で入っています。

~~~
certutil -encode messages.json messages.txt
~~~

エンコードした文字列を環境変数に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/18c95ce4-98eb-6d68-d292-21c93ce56df8.png)


pre-buildスクリプトを設定します。
pre-buildスクリプトの入力欄は、Buildの１つ上の「＋」ボタンを押すと出てきます。
ここに環境変数をファイルに変換するスクリプトを記載します。

~~~
#!/bin/sh
echo $MESSAGES | base64 --decode > $FCI_BUILD_DIR/assets/data/messages.json
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/83f1d529-ee6a-e9de-2c22-7604d66b0eb1.png)

以上で設定は終わりです。
実際にビルドして動作を確認します。

おしまい。
[自動化] サブドメインの監視・報告システムを作ってみた。

Webアプリを監視し、新しいサブドメインが見つかると報告してくれるシステムを作ってみました。

ほぼHaklukeさんのyoutube動画の内容です。こっち見た方がいいかも
[5 Minutes to Build a Basic Monitoring and Alerting System for New Subdomains](https://www.youtube.com/watch?v=gWpX1Exqzes&t=880s)

#利用するツール
オープンソースのツール3種類を使います。
- [Anew](https://github.com/tomnomnom/anew) (Tomnomnomさん)
- [Haktrails](https://github.com/hakluke/haktrails) (Haklukeさん)
- [Notify](https://github.com/projectdiscovery/notify) (ProjectDiscovery)

#環境設定
環境設定をしていきます。

###VPSの設定
ここでは[DigitalOcean](https://m.do.co/c/9999b0f0d2cd)を使っていきます。
OSにはUbuntuを設定しました。

###各種ツールのインストール
各種ツールを利用するためにGolangをインストールします。

```
sudo apt update && sudo apt install golang
```

SSHで回線が切れたときのためにTmuxをインストールします。

```
apt install tmux
```

オープンソースの各種ツールをインストールします。

```
GO111MODULE=on go get -v github.com/projectdiscovery/notify/cmd/notify
go get -u github.com/hakluke/haktrails
go get -u github.com/tomnomnom/anew
```

###GOBINに$PATHをとおす。

毎回`~/go/bin/haktrails`と打つのはめんどくさいのでGOBINに$PATHを通します。

まず`~/.bashrc`に`export PATH="$PATH:~/go/bin/"`を追加します。
そしてターミナルを再起動後、`source ~/.bashrc`と打ちます。

###Configファイルを設定する。

[SecurityTrails API key](https://securitytrails.com/corp/api)を取得します。
`haktrails-config.yml`ファイルの`<yourkey>`を取得したkeyに書き換えます。

```~/.config/haktools/haktrails-config.yml
securitytrails:
  key: <yourkey>
```

`notify.conf`にアラートをとばしたい`discord_webhook_url`を入力します。

```~/.config/notify/notify.conf
discord: true
discord_webhook_url: https://a.b.c
discord_username: test
```

###サブドメインの収集
サブドメインを収集するコマンドは以下のようになります。
Tomnomnomさんのanewツールを使用しています。

```
echo <ターゲットのURL> | haktrails subdomains | tee subdomains.txt
```

###監視ツールの作成
常時ターゲットURLの監視を行うスクリプトを作ります。

```monitor.sh
while :
do
    echo securitytrails.com | haktrails subdomains | tee subdomains.txt
    sleep 3600
done
```

実行権限を付与した後、実行可能となります。

```
chmod +x ./monitor.sh
Run ./monitor.sh
```

###新しいサブドメインだけ収集するようできるようにする。
新しいサブドメイン情報だけを取得したい。
そういった場合はteeをTomnomnomさんのanewツールに書き換えます。

```monitor.sh
while :
do
    echo securitytrails.com | haktrails subdomains | anew subdomains.txt
    sleep 3600
done
```

###アラートを送る
実行結果をDiscordにとばすためにnotifyツールを使います。

```
./monitor.sh | notify
```
メモ　GCPのAutoMLで画像を取り込む時に気をつけること

#やろうとしていること
　焼肉のときにいくつか内臓系を頼んだは良いが、
　持ってきてもらったときの説明を聞けず、どれがどれかわからなくなったときに、
　画像からどの内臓かを確認する。

#目指している構成
　LINE→LINE Messaging API→GASでリクエストを受ける→AutoMLで画像分類→LINEに結果を返す

#今できていること　ここまで前置き

+ LINEアカウントの設定
+ LINEで画像を送ったときにGASで受ける
+ GASにチャネルシークレットの埋め込み
+ リクエストから画像を取得

```javascript 
// LINEに送信されてきた画像データを取得
function getLineImageData(messageId) {
 
  var url = "https://api-data.line.me/v2/bot/message/" + messageId + "/content/";
  var headers = {
      "Authorization": "Bearer " + getScriptProperty("CHANNEL_ACCESS_TOKEN"),
      "Content-Type": "application/json; charset=UTF-8",
  };

  var options = {
      "method" : "get",
      "headers" : headers,
  };
  console.log("imageだよ");
  return UrlFetchApp.fetch(url, options);    
}
``` 
+ いったんDriveに画像を置く。直接でもいけるかも

# 今やっていること

+ AutoMLにとりあえず最小のモデルを作ってみる
  - GCSのバケット構成の作成
  - GCSにトレーニングデータを置いて画像読み込み


__気をつけること__

+ ストレージのバケットのロケーションは「uscentral-1」である必要がある
+ ストレージのクラスは「Standard」である必要がある

# 今後やること
+ Driveに配置したデータを、APIを使ってモデルに食わせて分類結果を得る
+ LINEに結果を返す