OmniAICreator/Qiita-1.07M huggingface dataset:
No.9 ruby-5th (Recursive Fibonacci)



# 学習内容

-   ブロック
-   再起


# ブロック

-   配列などの繰り返し処理
-   例

```ruby
sum = 0
[1,2,3,4].each do |n|
  sum += n
end
```

$|n|$ はブロック引数で、[1,2,3,4] の各要素が n に代入される。


# Code

```ruby
require './assert_equal'

def fib(n)
  return 0 if n==0
  return 1 if n==1
  return fib(n-1) + fib(n-2)
end


[[0,0],[1,1],[2,1],[3,2],[4,3],
[5,5],[6,8],[7,13],[8,21]].each do |index, expected|
  puts assert_equal(expected, fib(index))
end
```


# 参考

-   講義ページ

<https://qiita.com/daddygongon/items/1bb27b8920c201d5c520>

-   プロを目指す人のための Ruby 入門

<https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus-ebook/dp/B077Q8BXHC/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ruby&qid=1605077175&sr=8-1>



------
 - **source** ~/classes/muli_scale/grad_members_20f/members/keita_k7/memo/../memo/c9.org
開発用端末・エミュレーターで任意のURLを開くコマンド

アプリ開発中にディープリンクのテストをしていたりWebアプリの開発をしていたりすると、ターミナルからコマンド一発でURLを開きたくなりますよね？
iOS, Android共にターミナルから指定のURLを開くためのコマンドが用意されています(iOS実機でできるかどうかはわからなかった)。

## iOS SimulatorでURLを開くコマンド

```
xcrun simctl openurl booted https://reality.app/profile/db58b202
```

`booted`は起動中のシミュレーターを指定するパラメーターなので、予めiOSシミュレーターを起動しておく必要があります。

## Android端末/エミュレーターでURLを開くコマンド

```
adb shell am start https://reality.app/profile/db58b202
```

Android端末がUSB接続されており、開発者モード・USBデバッグが有効になっている必要があります。
`adb devices`コマンドで一覧を出力し、該当端末が表示されていることを確認してください。
複数端末が接続されているとエラーになります。`-s`オプションを付けて端末のシリアル番号を指定するか、一台だけ接続した状態にしてからコマンドを実行してください。
helm installすると「Error: create: failed to create: Request entity too large: limit is 3145728」と出る

## エラー内容
- etcdで受け付けることができるマックスサイズを超えたのでエラー
- helm install 実行時に必要なテンプレートをtargz化されて展開される（ということだった気がする）

## 原因
.helmignoreがない場合、helm install実行ディレクトリにある、余計なディレクトリも巻き込んで展開しようとする

## 確認すること
- .helmignoreがあるかないか
    - あったら、使わないディレクトリで記述し忘れているものがないか
Python pandas strip header space

```python
import pandas as pd

data = pd.read_csv('Data/JP225_H1.csv')
data.columns = [c.strip().lower().replace(' ','_') for c in data.columns]
data = data.set_index(data.local_time)

data = data[['open','high','low','close','volume']]

data = data.drop_duplicates(keep=False)

price = data.close.iloc[:9000]
```
Bridge Pattern

#
<font color="#00f">メソッドを実装する側と、メソッドを利用する側を分離し、双方を実装クラスのインスタンスで関連づける<br>・実装側はメソッドの定義と具象化<br>・利用側は実装側インスタンスをフィールドで所持し、インスタンス経由で実装側のメソッドを利用</font>

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


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

||クラス|説明|
|-----|-----|-----|
|実装側|abstract<br>class superSam|メソッドを定義|
|実装側|sam.class|superSamを実装|
|利用側|useSam.class|実装側のメソッドを利用|
＊user　他の開発者がこのパターンを利用する、という意味合いを含みます

下記にクラスを作成します

```java:superSam.class
abstract class superSam{
  String str;
  superSam(String str){this.str=str;}
  abstract void todo();
}
```
```java:sam.class
class sam extends superSam{
  sam(String str){super(str);}
  void todo(){System.out.println(super.str);}
}
```
```java:useSam.class
class useSam{
  sam sam;
  useSam(sam sam){this.sam=sam;}
  void exec(){sam.todo();}
}
```
```java:user(Main.class)
public static void main(String[] args){
  useSam use1 = new useSam (new sam("Hello java"));
    use1.exec();
}}
```
mockito-coreとmockito-allの違い

mockitoにはmockito-coreライブラリとmockito-allディストリビューションの二つが存在する。
基本的にmockito-coreの最新バージョンを使うのが良いが、その違いを説明する。

# mockito-core
mockito-coreはmockitoの本体である。
mavenやgradleなどのパッケージ管理ツールを利用している場合は、mockito-coreをその依存関係に含めることでmockitoを利用できる

mavenの場合

```xml:pom.xml
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.6.0</version>
    <scope>test</scope>
</dependency>

```

gradleの場合

```gradle:build.gradle
testCompile group: 'org.mockito', name: 'mockito-core', version: '3.6.0'
```



# mockito-all
mockitoはhamcrestやobjenesisに依存している。
mockito-allはmockitoとその依存関係を含めたものである。

依存関係を手動で管理しているようなレガシーなプロジェクトではこちらを使う。
ただし、mockito-allはバージョン2.Xから廃止となっていてバージョン1.Xまでしかない。

# 参考サイト（英語）
公式サイト
https://site.mockito.org/
「How do I drink it?」の箇所でmockitoの使い方を説明している


The Difference Between mockito-core and mockito-all
https://www.baeldung.com/mockito-core-vs-mockito-all
Dockerとはなにか？をまとめてみた

概要
==
Dockerを学習しはじめたのでDockerとはなにか？ということについて簡単にまとめてみました。
間違いなどあればご指摘いただけたら幸いです。

Dockerの概念
-
- コンテナ型仮想環境を作成、実行、管理するためのもの。

- たとえばRailsを使いたければRailsがインストールされたコンテナを起動することで素早く実行することができる。

- 異なる環境でも簡単に同じ環境をつくることができ、人によって環境が変わってしまうということがなくなる。

Dockerの使用例
-
- 開発環境をDockerにする。
- 検証環境、本番環境でも使える。
- Dockerリポジトリ内でDockerイメージを管理する。
- Webサーバー、データベースサーバーなどの構築。

検証環境というのは本番環境とほぼ同じだが、テストなどを目的にしている環境のことを指す。
本番環境というのは実際にユーザーが使う環境のこと。

Dockerを使うメリット
-
- ポータビリティ
<br>=> 任意のタイミングで現在の状態を本番環境や検証環境へ共有、配布することができる。
- プログラムの実行環境を素早く立ち上げられる。
- プロジェクトメンバー内で同じ環境を共有することができる。
- PCに直接パッケージをインストールしないのでPC環境を汚さずに済む。
<br>=> コンテナで管理するため、何がインストールしてあるかなど管理がしやすくなる。


ホスト型仮想化、コンテナ型仮想化の違い
-
### ホスト型仮想化
- ホストOS上にハイパーバイザーというものを動作させ、仮想マシンを動作させる。ハイパーバイザーとはゲストOSが使用するCPU、メモリ、ハードウェアなどを制御するソフトウェアのこと。
<br>=>リソースの面でオーバーヘッドが大きくなる。
- 環境の違いによりバグなどが起きる可能性がある。
- 仮想マシン間の分離レベルが高いため、セキュリティに強く、他のマシンに影響が出にくい。

### コンテナ型仮想化
- コンテナにはゲストOSというものはなく、ホストOSのカーネルを使用する。
<br>=>リソースの使用が少なくて済むので軽くて高速。
- Docker Imageでまとめられているから、環境が変わっても同様に動作する。
- 分離レベルがホスト型仮想化と比べて低いため、攻撃されにくいように対策（無駄なパッケージは入れないなど）が必要。

Docke runコマンド
-

```terminal:ターミナル
% docker run ~~
```
***Docker runコマンドは以下3つのコマンドをまとめて実行できる。***
1.`docker pull`　イメージの取得
2.`docker create` コンテナを作成
3.`docker start`　コンテナの起動

Docke runコマンドを使うことで、DockerHubからイメージを探して取得してコンテナを作成・起動までを行う。

イメージとは？
-
Docker Imageとはコンテナを実行するのに使うファイルをまとめたもの。イメージを起動することでnginxなどの環境を再現できる。オブジェクト思考でいうところの、***イメージがクラスで、コンテナがインスタンスのようなもの***。

***※nginxとはWebサーバーの一種。静的コンテンツのみ取り出して動的コンテンツはアプリケーションにサーバーに任せるもの。***
***※静的コンテンツとはCSSや画像ファイルなどのリクエストのたびに変更されないファイルのこと。***

Dockerイメージの構造
-
- Dockerイメージはレイヤー構造になっている。
- Dockerコンテナは軽量な方で、サイズが小さい方が良い。<br>=>無駄なファイルをイメージにいれない。軽量な方が起動がはやくなる。
- Dockerイメージからコンテナをビルドすると、イメージからpullしてきたレイヤーが読み取りに使われ、そこからプラスで記述していくことができる。このプラスで記述することができるところをコンテナレイヤーと呼ぶ。

Dockerイメージの継承
-
- Dockerイメージを継承していくことで実行環境をつくることができる。（機能を付け足していく）
- 継承のメリットとして、同じレイヤーがあれば一つで足り、それを共有して使用する。そのため、通信量やストレージの節約になる。

Dockerfile
-
イメージを自ら作成することも可能。
Dockerfile内に記述をしイメージをビルドすることで実行可能。

##### 以下使用例<br>※ ~~は仮のものになります。ご自身でお好きなものを試してみてください。

```vim:Dcokerfile
FROM イメージ名:TAG名
# image作成の元になるイメージを決める。TAGも指定できるが指定しなければlatestタグになる。
RUN ~~ -y
# 新しいパッケージをインストールやアップデートを行う。-yオプションなどがあり、つけることで全てYESにしてくれて処理を止めない。
CMD ~~
# コンテナが作成された後に実行するコマンド。
```


まとめ
-
- Dockerとはコンテナという仮想技術を扱えるもの。メリットはコマンドを何行か打つだけで実行できたり、コードで管理ができるので共有や配布が簡単。
- Dockerで大事な概念はイメージ、コンテナである。
- なぜ使うのかというと、ポータビリティ（可搬性）、オーバーヘッド（リソースの使用量が少なくて済む）、Immutable Infrastructure(不変)というメリットがある。
- Dockerは1プロセスで環境を作ることができるため手間がかからない。プロセスとはプログラムが動く数のこと。
- Immutable（不変）なものとして扱える。なぜなら、スナップショットで確実に動作するものを実現しているから。スナップショットとはその瞬間を切り取ったもの。
- ホストOSのカーネルを使用するので容量を少なく起動が早い。
- メリットが多いDockerだが、セキュリティにおいて従来のものより分離レベルが低いため、攻撃されないように対策（無駄なパッケージや脆弱性のあるパッケージをインストールしない）をしたほうが良い。（もちろんDockerに限らず必要な対策）

参考文献
-
この記事は以下の情報を参考にして執筆しました。

- [ゼロからはじめる Dockerによるアプリケーション実行環境構築](https://www.udemy.com/share/101XUuAEEbdFZURnUF/)
- [入門 Docker](https://y-ohgi.com/introduction-docker/)
qiita post を楽にしてみた

\![ruby-2.5.5p157](<https://img.shields.io/badge/ruby-2.5.5p157-brightgreen>) 


# 目的

qiita post は非常に便利ですが、目的の org ファイルを毎回 post するのは骨が折れます。なので少し楽に post できるように **<fontcolor="red">Shell Script** 書いてみました(^^)


# ソースコード

-   docs(名前はなんでもいい)/ 以下に org ファイルを配置しておくこと
-   **<font color="red">docs 以下の org ファイルを qiita に post します**

```
#!/bin/bash

for i in $(ls *org| grep -v "template.org");do
   # template.org は邪魔なので除外してます
   qiita post $i private
done

rm *~

```

-   追記(11 月 11 日) 以下で public 共有できます

```
#!/bin/bash

for i in $(ls *org| grep -v "template.org");do
   # template.org は邪魔なので除外してます
   qiita post $i public
done

rm *~
```


## 実行方法

-   実行権限(chmod)を与えているなら、./program 名
-   実行権限(chmod)を与えてないなら、bash program 名


## 注意

-   プログラムを実行するには、既に qiita\_org のインストールと設定をしておかないといけません。


# 追記(11/15)

既に daddygongon さんから同じ内容で Issues が GitHub 上でたてられていた。。。。

-   <https://github.com/yamatoken/qiita_org/issues/8>

これにより既に all というコマンドが完成しているらしい。だが、まぁShellScript の勉強にもなったし、いいかなと思う今日この頃です。


# さいごに

是非使ってみてください。要望があれば qiita のコメントに宜しくお願いします!!



------
 - **source** ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/extra2.org
知っておくと今日から使える Linux command(基礎編)

\![ruby-2.5.5p157](<https://img.shields.io/badge/ruby-2.5.5p157-brightgreen>) 


# 目的

将来エンジニアまた、それに関係する仕事を希望する場合は最低限のshell command を扱えなければいけない。

なので今後、<strong><font color="red">コマンドやシェル関連の情報</strong> をまとめていこうと思う。


# 参考サイト

基礎的なコマンドであれば以下の URL を参考にすれば理解できる。今後は、<strong><font color="red">Shell Script</strong> の文法なども、まとめていく予定。

[基本コマンドについて](https://qiita.com/savaniased/items/d2c5c699188a0f1623ef)



------
 - **source** ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/extra1.org
マルチスケールシミュレーション特論：第 7 回をまとめてみた

\![ruby-2.5.5p157](<https://img.shields.io/badge/ruby-2.5.5p157-brightgreen>) 


# はじめに

qiita ではよく Markdown を使うのでメモ用に qiita の記事を以下に残しておく事にする。[Markdown 書きかたチートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)


# 授業内容


## Convention over Configuration

[Configuration over Configuration の詳細について](https://en.wikipedia.org/wiki/Convention_over_configuration)


## shebang

今回は、shebang について説明が行われた。

shebang とは何なのか。shebang は UNIX のスクリプトの #! から始まる 1行目のことで、起動してスクリプトを読み込むインタプリタを指定する物である。


## path の設定について

path の設定をしているとコマンド化する事ができて、便利にプログラムを扱う事ができる。


### シェルの設定ファイルにパスを通すやり方

1.  emacs ~/.bashrc  ← bash 以外は別の設定ファイルに変更する
2.  export PATH=".:~/bin:$PATH"
3.  source ~/.bashrc

この設定なら、~/bin 以下のプログラムは<strong><font color="red">実行権限があれば簡単に使用可能になる！！

実行権限は chmod コマンドを使う。<strong><font color="red">man chmod </strong>で内容確認できる。


## Ruby 構文

Ruby では以下のようにして if-else 文を扱う

```ruby
if 式 [then]
  式 ...
[elsif 式 [then]
  式 ... ]
...
[else
  式 ... ]
end
```

授業の復習  1

-   ruby での if-else 文の扱い方

```ruby
p year = ARGV[0].to_i
# .to_i は int 型に変換するメソッド
if year % 4 == 0
  p true
end
```

授業の復習  2

-   ruby での配列またループ文の扱い方

```ruby
[2004, 1999].each do |year|
# [] で配列（python の list と同じ）
# each メソッドで要素を順番に取り出していく
  p year
  if year%4 == 0
    p true
  else
    p false
  end
end
```

授業の復習 3

-   より詳しいループ文

```ruby

[1900,2004,1999].each do |year|
  p year
  # 一つ目の if 文
  if year % 100 ==0
    p false
    next # next は python の continue 文と同じ
  end 

  # 二つ目の if 文
  if year % 4 == 0
    p true
  else
    p false
  end
end
```


# 参考文献

-   <https://qiita.com/Qiita/items/c686397e4a0f4f11683d>
-   <https://en.wikipedia.org/wiki/Convention_over_configuration>



------
 - **source** ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/class7.org
マルチスケールシミュレーション特論：第 8 回をまとめてみた

\![ruby-2.5.5p157](<https://img.shields.io/badge/ruby-2.5.5p157-brightgreen>) 


# 授業内容


## rake コマンドについて

rake のイメージ → make, ant の ruby 版

[そもそもmakeとは ??](https://www.creatology.jp/unix/make.html)

Rakefile の中身を<strong><font color="red">ruby 言語</strong>で記述すれば Rakefile が動作するようになっている


### Rakefile の記述例

-   以下のプログラムで 1 回の操作で GitHub 上にプログラムを載せる事が可能になる

```ruby
desc 'git push'
task :push do
  # p でコメントを残す事ができる
  # 分かりやすいようにコメントを残していっている
  p comm = "git add -A"
  # system で外部コマンドを使えるようになる(ただし動作が遅い)
  system comm

  p comm = "git commit -m \'hoge\'"
  system comm
  p comm = "git pull origin main"
  system comm
  p comm = "git push origin main"
  system comm
  exit
end
```


## command\_line

上記のプログラムで簡単に GitHub 上にプログラムをあげる事ができるが、しかし system call を使って外部コマンドを使用しているので<strong><font color="blue">動作が遅い</strong>

そこで組み込み関数を使う。

-   [組み込み関数について](https://www.tutorialspoint.com/ruby/ruby_builtin_functions.htm)

しかし、問題として system からの戻り値は出力ではなく，コマンドが成功したかとなっている。

なので，<strong><font color="red">標準出力(stdout)などを取り出すのはcommand\_line</strong> を使う。

-   command\_line のインストール方法
    
    ```bash
    gem install command_line
    ```


## org to\_html, to\_platex

emacs の `org-mode` には <font color="red"> **html** </font> や <font color="red"> **latex** </font> へ出力する為の command が用意されている(便利すぎ、、、、)

-   実行コマンド

```
c-c c-e ho # export as [h]tml, [o]ut
c-c c-e ll # export [l]atex, [l]atex 
```

`org-mode` で書いた物が簡単に html や latex にフォーマット変換ができるので超便利!!

しかし、デフォルトだと出力では見にくいのでプラスの設定をしているとより分かりやすい


# 参考文献

-   <https://www.creatology.jp/unix/make.html>
-   <https://www.tutorialspoint.com/ruby/ruby_builtin_functions.htm>



------
 - **source** ~/Downloads/git/grad_members_20f/members/taiseiyo/memos/class8.org
SwiftでFPSカウンターを作る

# ソースコード

```FPSCounter.swift
import Foundation

class FPSCounter {
    private var baseTime: Int!
    private var count: Int = 0
    private var fps: Float = 0

    func getFPS() -> Float {
        return fps
    }

    func tickStart() {
        baseTime = timeSince1970Millis()
    }

    func tick() {
        count = count + 1;
        let now = timeSince1970Millis()
        if (now - baseTime >= 1000) {
            fps = Float(count * 1000) / Float(now - baseTime)
            baseTime = now
            count = 0
        }
    }

    private func timeSince1970Millis() -> Int {
        return Int((Date().timeIntervalSince1970 * 1000.0).rounded())
    }
}
```

# 使い方

```ViewController.swift

final class ViewController: UIViewController {

    private var fpsCounter = FPSCounter()

    override func viewDidLoad() {
        super.viewDidLoad()
        fpsCounter.tickStart()
    }

    private func hoge() {
        // なんらかの処理

        fpsCounter.tick()
        print("fps: \(fpsCounter.getFPS())")
    }
}
```
「コンピュータの回路」 ⑤　ビットの反転と抽出

##ビットを反転させる操作の仕組み
コンピュータが引き算をするためには、引く数を2の補数表現にして、「2の補数を足す」必要があります。
また、2進数を2の補数表現にするためには、各ビットの値を反転させ、「$1$」を加えるという操作が必要になります。
これらの操作において、足し算に関しては半加算器と全加算器を使うことで実行することができるのですが、「**ビットを反転させる**」という操作については特殊な操作が必要になります。

ビットを反転させる操作を可能にするためには**排他的論理和(EOR)**と「反転させたい場所と同じ位置に『$1$』がくるビット列」を使用します。

この理由を理解するために排他的論理和(EOR)の真理値表を以下に示します。
![スクリーンショット 2020-11-11 13.17.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/48ed360e-647a-ef29-94a1-47789feed3c5.png)
まず、排他的論理和(EOR)についてですが、この論理演算の特徴として、「演算する値が同じ場合には『$0$』を返し、異なる場合には『$1$』返す」というものがあります。
この特徴を踏まえて青色の行に注目してみます。この行では「元の値」がそれぞれ「$0$」と「$1$」になっています。その一方で、「加えた値」についてはどちらも「$1$」になっています。

この表から、元の値が「$0$」のとき、同じ位置に「$1$」を置いて、排他的論理和の論理演算を行うと「$1$」に反転し、元の値が「$1$」の時も同様の操作を行うことで値が反転するということが分かります。

次に、この操作を具体例を用いて確認してみたいと思います。
たとえば、「$00111100$」という8ビットの数のうち、右から4ビット目までの値「$1100$」を反転させたいとします。
そのために、まずは右から4ビット目までが「$1$」である8ビットの数「$00001111$」を用意します。そして、これらのビット列を排他的論理和(EOR)で論理演算します。

演算の様子を以下の図に示します。
![スクリーンショット 2020-11-11 14.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/c4ec1af3-9394-00c4-c120-c981ba9ed97c.png)
この図から、元の数の右から4ビット目までの値が排他的論理和(EOR)によって反転されていることが分かります。
このために用意した、「$00001111$」という右から4ビット目までが「$1$」の数のことを**マスクパターン**と呼びます。

したがって、ビット列を反転させる時には、反転させたいビット列と同じビットに「$1$」を入れたマスクパターンを用意し、排他的論理和(EOR)で論理演算すれば良いということになります。

##ビットを抽出する操作の仕組み
コンピュータが特定のビット列を抽出するときの操作についてですが、この場合も先ほどの反転操作と同様に、抽出したいビット列と同じビットに「$1$」を入れたマスクパターンを使用します。
また、抽出するための操作として、論理積（AND）を使います。

元の値とマスクパターンを論理積（AND）の真理値表で表現すると以下の図のようになります。
![スクリーンショット 2020-11-11 14.38.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/b5c29258-70ce-59b1-1296-0c954157f57a.png)
まず、論理積(AND)についてですが、この論理演算の特徴として、「演算する値が両方とも『$1$』の場合には『$1$』を返し、それ以外の場合には『$0$』を返す」というものがあります。
この特徴を踏まえて青色の行に注目してみます。青色の行では「元の値」がそれぞれ「$0$」と「$1$」になっています。一方で、「マスクパターン」についてはどちらも「$1$」になっています。

この表を踏まえると、元の値が「$1$」のとき、マスクパターンの同じ位置に「$1$」を置いて、論理積の論理演算を行うと「$1$」になることが分かります。
また、元の値が「$0$」のとき、マスクパターンの同じ位置に「$1$」を置いて同様の操作を行うと「$0$」になることが分かります。

次に、この操作を具体例を用いて確認してみたいと思います。
たとえば、「$00111100$」という8ビットの数のうち、右から4ビット目までの値「$1100$」を抽出したいとします。
そのために、まずは右から4ビット目までが「$1$」である8ビットの数「$00001111$」を用意します。そして、これらのビット列を論理積(AND)で論理演算します。

演算の様子を以下の図に示します。
![スクリーンショット 2020-11-11 14.53.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/b4d07401-ef81-d7e8-a02d-e5274b38a333.png)

この図から、元の数の右から4ビット目までの値が排他的論理和(EOR)によって反転されていることが分かります。

したがって、ビット列を抽出する時には、抽出したいビット列の部分（ビット）に「$1$」を入れたマスクパターンを用意し、論理積（AND）で論理演算すれば良いということになります。

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

##学習してみて
以前から引き算について学習してから、2進数の引き算をする時に、コンピュータはどうやって2の補数を作ってるんだろうかと気になっていたのですが、今回の学習でその仕組みをようやく知ることが出来ました。
結構複雑なのかと身構えていたのですが、案外そうでもなかったのでかえって驚きました。
抽出の操作についても、論理演算を使えばこんなことも出来るのかと感心してしましました。
「n進数」の仕組みから始まり、コンピュータで四則演算やビット操作が出来るようになる仕組みまでを学習してきたわけですが、なかなか長かったですね。
Linux系PCでsudo ~~ 実行時にパスワード入力をなくす！

個人所有のLinuxPCであれば，何かとsudo su したくなると思います．
毎回パスワード入力しても良いですが，打ち込むのだるくないですか？
何回も探すの面倒なので，ここにメモ代わりとして残して置きます．
#お願い
各個人によってPCの使い方は人それぞれだと思います．
あくまでも以下に記載するのは私のPCにおける設定であり，各個人によっては設定をいじらないといけない場合もあるので，そこは自己責任でお願いします．

#どこをいじるのか？(ユーザー情報が記録されているsudoersファイル)

```
$sudo visudo 
#sudoersファイルに記録されていません等のエラーが出る場合は
$su でroot権限になってください．
```
visudo内に以下の記述があると思います．

```
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d
```

それを以下のように書き換える.

```
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
username  ALL=NOPASSWD: ALL
# See sudoers(5) for more information on "@include" directives:

```

#注意点
使用環境によってはPC立ち上げ時もめんどいから自動ログインでっ！
って方もいると思います．
そのような場合はPCの電源つけて$sudo su と打ち込まれたら何でもできてしまうので注意です．

※sudo権限(super user で do する権限)ってのが、PCの管理者権限になるので、sudo権限でPCを破壊することだってできちゃうので、怖いです...

便利さを追求していしまうとセキュリティガバガバ事案になることもあります．
そのへんは各自自己責任でお願いします．
S3のリダイレクションルールがJSONになったのにマニュアルがXMLのまま

マネジメントコンソールのS3のUIが変わってリダイレクションルールがの入力形式がXMLからJSONに変わってるんだけど、公式マニュアルがXMLのままでどういうJSON書いたらいいのか困ったのでメモ。

XML入れていい感じにやってくれないかと思ったけど、`Expected params.WebsiteConfiguration.RoutingRules to be an Array`エラーになった。

```
[
    {
        "Condition": {
            "KeyPrefixEquals": "test.html"
        },
        "Redirect": {
            "HostName": "test.com",
            "ReplaceKeyPrefixWith": "test/test.html"
        }
    }
]
```
No.8, ruby_4th(assert_equal)



# 学習内容

-   継承
-   テスト開発用プログラム


# colorize

-   ref: <https://github.com/fazibear/colorize>

-   文字の色や背景色などを変更可能
-   String クラスを拡張、または ColorizeString クラスを追加することで実装


# 疑似変数 \`\_\_FILE\_\_\`

-   現在のソースファイル名を出力

-   使用例: テスト用プログラム
    
    -   ファイル名とプログラム名が一致するなら if 内を実行(require で呼び出すなどで、ソースファイル名と実行ファイル名が異なるなら実行しない。)
    
    ```ruby
    if $PROGRAM_NAME == __FILE__
      assert_equal(1, 1)
      assert_equal(1, 2)
      assert_not_equal(1, 2)
      assert_not_equal(1, 1)
    end
    ```


# Code

```ruby
require 'colorize'

def assert_equal(expected, result)
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end

def assert_not_equal(expected, result)
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end

assert_equal(1, 2)
assert_not_equal(1, 1)

```


# 参考

-   講義ページ

<https://qiita.com/daddygongon/items/f6cea87314ee26e130ea#%E3%81%8A%E9%A1%8Cassert_equal>

-   プロを目指す人のための Ruby 入門

<https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus-ebook/dp/B077Q8BXHC/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ruby&qid=1605077175&sr=8-1>



------
 - **source** ~/classes/muli_scale/grad_members_20f/members/keita_k7/memo/../memo/c8.org
ScrollReveal.jsを使えば「スクロール後に要素がふわっと浮き上がる」動きを最も少ない記述量で実装できる

# ScrollRevealとは

スクロールによって表示された要素が、指定したアニメーションを実行してくれるJavaScriptのライブラリ

[ScrollReveal - 公式サイト](https://scrollrevealjs.org/)

# ScrollRevealを使うメリット

- 記述量がとにかく少ない

- 実装まで時間がかからない

- CSSのtransitionプロパティやopacityプロパティなどを一切使わない

# 実装方法

## 1. ライブラリの読込み

```html:ScrollReveal.js
<script src="https://unpkg.com/scrollreveal"></script>
```
bodyタグの閉じタグ直前にコピペしましょう。

## 2. HTMLの対象の要素にclassを付与する

```ScrollReveal.html
<div class="container">
  <div class="block">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <div class="block">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <div class="block">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <div class="block">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <div class="block">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
</div>
```
class="box"
を付与している要素が、今回ふわっと表示させる要素になります。

## 3. ScrollReveal関数を呼び出す

```ScrollReveal.js
ScrollReveal().reveal('.box');
```
1.で読み込んだライブラリとbodyタグの閉じタグの間に、このコードをコピペ。

あ、これで終わりです。

## 4. 実装まとめ

- HTMLファイル：実装させたい要素にclassを１つ付与
- JSファイル：ライブラリに１行読込み と ScrollReveal関数１行 だけ

※別ファイルを作成してScrollRevealを記述してもいいし、HTMLファイルのbodyタグの閉じタグ直前に書いてもOK

## 5. 結果

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="hamaboh_younect" data-slug-hash="VwjVxQK" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ScrollReveal">
  <span>See the Pen <a href="https://codepen.io/hamaboh_younect/pen/VwjVxQK">
  ScrollReveal</a> by はまちゃん👶🏻🍼 (<a href="https://codepen.io/hamaboh_younect">@hamaboh_younect</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


# カスタマイズ

現在取り掛かっている案件に実装しているものが以下の記述です(resetは消すかも)。

```ScrollReveal.js
ScrollReveal().reveal('.box', {
  duration: 1500, // アニメーションにかかる時間(単位：ms)
  reset: true, // リロードしなくても何回もフェードインする
  viewFactor: 0.5, // 要素が全体の ？？ % まで表示されたら実行(0〜1)
  origin: 'top', // 要素がどの方向からフェードインするか
});
```

カスタマイズのためのオプション一覧は
[公式サイト](https://scrollrevealjs.org/) > API > 画面左のメニュー
にあります。
discord botを利用してスマホから.emlを読めるようにする


## 概要

iOSでメールアプリとしてSparkを使用しているのですが、たまに転送メールが本文に表示されず`.eml`ファイルとして添付されていることがあります。(これはThunderbird利用者側の設定など原因で生じるそうです。-> [Mozilla質問箱](https://support.mozilla.org/en-US/questions/1176024))
この`.eml`ファイルはiphoneで直接開くことができません。有料アプリやオンラインの変換ページを利用すれば見ることはできますが、微妙に手間です。これをdiscord botで解決します。


今回のdiscord botのsourceはPythonで書かれています。
`.eml`ファイルから内容を抽出する過程はこちらの内容を利用させていただきました。-> [Qiita](https://qiita.com/denzow/items/a42d344fa343cd80cf86)

### 目標の機能

- スマホから.emlファイルをdiscord botのいるチャンネルやDMに送信すると、その内容のテキストファイルがdiscordに送信される。
- 添付ファイルも送信される。(**こちらの機能は未確認です**)

メールの本文は長くなりがちなので、discordにmessageのcontentではなく、テキストファイルとして送信するようにしました。

## source

### importなど

`MailParser`以外は今回はあまり関係のない内容です。

```Python:main.py
from MailParser import MailParser

import discord
from discord.ext import commands
description = ""
bot = commands.Bot(command_prefix="?", description=description)

@bot.event
async def on_ready():
    print("Logged in as")
    print(bot.user.name)
    print(bot.user.id)
    print("------")
```

### ファイル受信

`@bot.event`の`on_message`の末尾にでも追加します。

```Python:main.py
@bot.event
async def on_message(message):
    # 添付ファイルがある場合に
    if (len(message.attachments) > 0):
        for att in message.attachments:
            # 拡張子が.emlかどうか判断
            file_extension = att.filename.split(".")[-1]
            if file_extension == ".eml":
                await read_eml(message.channel, await att.read())
```

### emlの内容送信
文字化けを避けるため、Shift-JISでencodeしています。

````Python:main.py
async def read_eml(discord_channel, file_content: bytes):
    """emlファイルを読み込み, 内容を表示します"""
    # eml読み取り
    eml_result = MailParser(file_content).get_attr_data2()
    # 
    file_path = f"{os.path.dirname(__file__)}/../out/eml.txt"
    # shift-jisじゃないと文字化けする -> Chromeくんさぁ
    with open(file=file_path, mode="w", encoding="shift-jis", errors="replace") as f:
        f.write(eml_result["content"])
    await discord_channel.send(file=discord.File(file_path))
    for att in eml_result["attach"]:
        with open(f"{os.path.dirname(__file__)}/../out/{att['name']}", "wb") as f:
            f.write(att["data"])
        await discord_channel.send(file=discord.File(att["name"]))
```

### emlの内容読み取り(MailParserを少し変更)

contentにsubjectを追加し、添付ファイルも返すmethodを追加します。

```Python:main.py
def get_attr_data2(self):
    """
    メールデータの取得
    """
    mail_content = f"""\
SUBJECT: {self.subject}

----

FROM: {self.from_address}
TO: {self.to_address}
CC: {self.cc_address}

----

{self.body}

----

ATTACH_FILE_NAME:
{",".join([ s["name"] for s in self.attach_file_list])}
"""
    return {"content":mail_content, "attach":self.attach_file_list}

setattr(MailParser, get_attr_data2.__name__, get_attr_data2)
```

## 使用方法

1. `.eml`ファイルを共有からDiscordに送信します。
2. botがテキストファイルを送り返します。
3. browserで開くと、内容が表示されます。

![EML_view_ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306461/abad2fc7-a035-62e2-9fb1-caaf279a7f6d.png)
[問題]　連休の天気(Ruby編)

#[問題]　連休の天気(Ruby編)を解く
#Q
###あなたは7日間の連休をもらいましたが、降水確率が 30% 以下ならば外に出掛ける事に決めました。
7日間の降水確率(%)が改行区切りで入力されるので、出掛ける日数の合計を出力してください。
#例
13
0
15
31
89
100
30
と与えられた場合
4
と出力するプログラムを作成してください。
#入力される値
入力は以下のフォーマットで与えられます。

t_1
t_2
t_3
t_4
t_5
t_6
t_7
#期待する出力
7日間の降水確率が改行区切りで入力されるので、出掛ける日数の合計を出力してください。
#私の答え
```java:
t_1 = gets.chomp.to_i
t_2 = gets.chomp.to_i
t_3 = gets.chomp.to_i
t_4 = gets.chomp.to_i
t_5 = gets.chomp.to_i
t_6 = gets.chomp.to_i
t_7 = gets.chomp.to_i
int = t_1, t_2, t_3, t_4, t_5, t_6, t_7 
str = int.select do |i|
    i <= 30
end
print str.size
```
#解説
###今回は t_1 から t_7 までの数値を int= で配列の中に格納しました。こうする事によって、配列の中から特定の値を取り出す事ができる<font color="Red">selectメソッド</font>が使えるようになります。なのでprintでstrを出力すると<font color="blue">[13,0,15,30]</font>という結果になります。今回はその数を出力する問題なのでsizeメソッドで値の数を出力しました。
#以上！
【Dart】インスタンス化のときにnamedでparameterを渡す方法

## やりたいこと
Widgetのchildみたいにnamedでインスタンス化。

```dart
  Person obj2 = new Person(name: 'nitaking');
```

## How To

```dart
class Person {
   String name;
   String age;

   Person({this.name = "defaultName", this.age = "defaultAge"});
}
```

こうすると

```dart
void main() {
  Person obj = new Person();
  Person obj2 = new Person(name: 'nitaking');
  
  print('hello ${obj.name}');
  print('hello ${obj2.name}');
}

```

こう出力される

```console
hello defaultName
hello bruno
```

---

## Default Valueがないバージョン

```dart
class Person {
   String name;
   String age;

   Person({this.name, this.age});
}

void main() {
  Person obj2 = new Person(age: '2');
  
  print('hello ${obj2.name}  ${obj2.age}');
}

```
マルチスケールシミュレーション特論：第7回

# shebang

shebang(シバン，シェバン)とは，スクリプトの#!から始まる1行目のこと．スクリプトを読み込むインタプリタを指定できる．例えば，以下のようなファイル helloを書く．

```ruby:hello
#!/usr/bin/env ruby
p 'hello world'
```

chmod a+x helloとし，executableにする．すると./helloとするだけで実行できるようになる．

# pathの設定

exportコマンドを使って環境変数を設定できる．例えば~/binをpathに追加する場合は~/.bashrcに以下の一行を追記する

```
export PATH=".:~/bin:$PATH"
```

これで次回ログイン以降は~/binがpathに追加されるが，ログアウトせずに今すぐ変更を反映したい場合は

```
source ~/.bashrc
```

と，sourceコマンドを使えばできる．

# Ruby勉強：第3回

## 条件分岐ifの使い方

うるう年ならtrueを返し，そうでないならfalseを返すメソッド leap?を実装する場合，以下のように書ける．

```ruby
def leap?(year)
  if year % 4 != 0
    return false
  elsif year % 100 != 0
    return true
  elsif year % 400 == 0
    return true
  else 
    return false
  end
end
```

## array, eachの使い方

array, eachを使ってメソッド leap?をテストするコードは以下のように書ける．

```ruby
[2004, 1999, 1900, 2000].each do |year|
  p leap?(year)
end
```

# 参考文献

-   [チャート式ruby-appendix-III(bundler)](https://qiita.com/daddygongon/items/14218c96df5cbcf35c62)
-   [チャート式ruby-III(if, case, Array.each by leap year)](https://qiita.com/daddygongon/items/a550bde1ed6bff5217d8)

------
 - **source** ~/grad_members_20f/members/ryuta-kikuchi/qiita_articles/lecture7.org
iOS14.1でsandboxの設定が出てこない時にしたこと

## 背景
今回初めてApple Developer Programに加入し、いざ課金テストをするべくsandboxアカウントの設定について調べると、iPhoneの「設定」に出てくるはずのsandbox関連の項目が無く、英語で検索かけたりしてみるもどうやら近頃同じ状況の人がいるようでした。

## 解決した方法
とにもかくにもまずは公式ドキュメントを見よというやつで、ここの
https://developer.apple.com/documentation/storekit/in-app_purchase/testing_in-app_purchases_with_sandbox
「Sign In to the App Store with Your Sandbox Apple ID」の章によく見ると書いてありました。（英語苦手..）
> The sandbox account in Settings appears after the first time you use the device to attempt a purchase on a development-signed app. Sign in using a Sandbox Apple ID. There’s no need to log out of the nontest Apple ID.

開発中のアプリで購入処理走らせてサインイン求められたらsandbox用のアカウントでサインインしてよと。
それ１回やれば設定に表示されてきますよということで、実際にやってみるとsandbox用のアカウントでサインインでき、設定にも現れてきました。（設定＞App Store の一番下）
【JavaScript】プルダウンメニューの作成

#プログラミング勉強日記
2020年11月11日
項目を選択すると別ページに移動するプルダウンメニューの作成をしました。

#出力結果
![pull-menu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/854121/5a7dc626-0b5b-ae20-96ec-c3a3fb69c595.gif)

#コード
htmlファイルは日本語用、英語用、中国語用の3つ用意します。
各htmlファイルのoptionタグにselected属性は使わずに作成しました。

```index.html
 <section>
        <form action="" id="form">
            <select name="select">
                <option value="index.html">日本語</option>
                <option value="english.html">英語</option>
                <option value="zh.html">中国語</option>
            </select>
        </form>
        <h2>日本語のページ</h2>
    </section>
```
```script.js
const lang = document.querySelector('html').lang;

if(lang === 'ja') {
    document.querySelector('option[value="index.html"]').selected = true;
} else if(lang === 'en') {
    document.querySelector('option[value="english.html"]').selected = true;
} else if(lang === 'zh') {
    document.querySelector('option[value="zh.html"]').selected = true;
}


document.getElementById('form').select.onchange= function () {
    location.href = document.getElementById('form').select.value;
}

```

#コードの解説(自分用)


```script.js

document.getElementById('form').select.onchange= function () {
    location.href = document.getElementById('form').select.value;
}
```
* `document.getElementById('form').select`はid属性がformの要素を取得し、form要素内でname属性がselectのvalue属性の値を取得します。

* `.onchange`は現在と違う\<option>が選ばれたとき(例：日本語→英語、日本語→中国語)に発生するイベントです。

* `location.href = document.getElementById('form').select.value;`はまずid属性がformの要素を取得します。次に、form要素内でname属性がselectのフォーム部品の値を取得します。その取得した値をlocation.hrefに代入します。

* `location.href`でURLを書き換えています。ブラウザはURLが変更されると、即座に新しいページを表示しようとするので、すぐに次のページに移動できます。

```script.js
const lang = document.querySelector('html').lang;
```

* `document.querySelector()`は()内に書かれたCSSのセレクタを取得しています。今回の場合、`html`なので要素型セレクタを取得しています。

* `.lang`はhtmlタグのlang属性(例：ja、en、zh)を取得しています。

```script.js
if(lang === 'ja') {
    document.querySelector('option[value="index.html"]').selected = true;
} 
```
* `document.querySelector('option[value="index.html"]')`は、value属性の値がindex.htmlであるoption要素を取得します。

* `.selected = true`は取得したoption要素にselected属性を追加します。.selected = falseとするとselected属性を削除します。

* その他のelse if文も役割は上記と同じです。

#注意点
上記のif文がないと日本語から英語、日本語から中国語にはページの移動ができますが、英語から日本語、中国語から日本語のページには移動できません。

.onchangeイベントは現在と違うoption要素が選択されたときに発生します。

今回の場合、どのページを選択しても、最初にプルダウンメニューに選ばれているのは『日本語』です。

つまり、日本語のページから英語のページに移動して、また日本語のページに戻ろうとしても.onchangeイベントが発生せず、戻れないことになります。

下記にif文を書かなかったときの挙動を載せます。
![not-pull.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/854121/c8e910cc-158b-285b-a504-2a71f13a6b35.gif)


#参考資料
* [確かな力が身につくJavaScript「超」入門 第2版 ](https://www.amazon.co.jp/%E7%A2%BA%E3%81%8B%E3%81%AA%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FJavaScript%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E7%8B%A9%E9%87%8E-%E7%A5%90%E6%9D%B1/dp/4815601577/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3R3KVUKK3A4N7&dchild=1&keywords=javascript&qid=1605073475&sprefix=java%2Caps%2C385&sr=8-1)
Kerberos协议之PAC及MS14-068

# PAC介绍
介绍PAC之前，先重新捋一捋Kerberos协议的流程

1. AS_REQ Client使用自己的hash加密时间戳发送给kdc请求TGT
2. AS_REP kdc使用Client Hash解密验证时间戳，如果正确则就返回用krbtgt hash加密的TGT票据
3. TGS_REQ Client使用TGT票据向KDC发起针对指定服务的TGS_REQ请求
4. TGS_REP KDC使用krbtgt hash解密tgt票据，如果解密正确则返回特定服务hash加密的tgs票据
5. AP_REQ Client使用TGS票据请求特定服务
6. AP_REP 特定服务使用自己的hash解密，如果验证正确向KDC发送TGS票据询问该Client是否有权限访问自身服务。

PAC在其中出现的节点为AS_REP和AP_REP。在AS_REP中，KDC返回的tgt票据中包含了PAC。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/d1a181f6-d90d-8df7-2da7-1b28070386cc.png)

在AP_REP中，服务解密验证正确后将PAC发送给KDC，KDC根据PAC的值来判断用户是否有权限访问该服务。

**而在TGS_REP中，不管Client是否有权限访问特殊服务，只要Client发送的TGT票据是正确的，那么就会返回服务hash加密的tgs票据，这也是kerberoating利用的原因。换而言之，不管你是什么用户，只要你的hash正确，那么就能请求域内任意服务的TGS票据。**

krbtgt服务的密码是随机生成的，就别想了。

PAC的结构看不懂，见daiker师傅文章吧。这里介绍下因为pac引发的高危漏洞MS14-068

# MS14-068

以下内容摘抄自[《深入解读MS14-068漏洞：微软精心策划的后门？》](https://www.freebuf.com/vuls/56081.html)

1. 在KDC机构对PAC进行验证时，对于PAC尾部的签名算法，虽然原理上规定必须是带有Key的签名算法才可以，但微软在实现上，却允许任意签名算法，只要客户端指定任意签名算法，KDC服务器就会使用指定的算法进行签名验证。
2. PAC没有被放在TGT中，而是放在了TGS_REQ数据包的其它地方。但可笑的是，KDC在实现上竟然允许这样的构造，也就是说，KDC能够正确解析出没有放在其它地方的PAC信息。
3. 只要TGS_REQ按照刚才漏洞要求设置，KDC服务器会做出令人吃惊的事情：它不仅会从Authenticator中取出来subkey把PAC信息解密并利用客户端设定的签名算法验证签名，同时将另外的TGT进行解密得到SessionKeya-kdc；
4. 在验证成功后，把解密的PAC信息的尾部，重新采用自身Server_key和KDC_key生成一个带Key的签名，把SessionKeya-kdc用subkey加密，从而组合成了一个新的TGT返回给Client-A

## kekeo
直接打，需要一个域账户。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/fec91b68-b9e8-6c70-7a36-e7c83cfdc781.png)

## impacket
goldenPac.py windows的在 https://github.com/maaaaz/impacket-examples-windows 下载
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/e6e940a4-5b87-45d8-34b1-12433d707d0a.png)

## pykek
https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068

exe和python版本，演示py的版本。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/bb165a46-3a43-c70c-dc41-ce583624f8c2.png)

拼接domain sid和域用户id

```
S-1-5-21-514356739-3204155868-1239341419-1111
```
生成tgt票据
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/a84fa640-4975-d56b-b28e-cfd1c0dfc9ca.png)
ptt过去
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/db4b7bff-8120-7c43-e64f-d61c0e0fac78.png)

# 参考
1. https://daiker.gitbook.io/windows-protocol/kerberos/3
2. https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068
3. https://github.com/mubix/pykek
4. https://gist.github.com/TarlogicSecurity/2f221924fef8c14a1d8e29f3cb5c5c4a
【GCP】IAM Conditionsを設定してみた

つくづくわかりずらいなと思うのですが、GCPのコンソールで「IAM　conditions」と調べても何も出てきません。

やってみた感じとしては、「IAM→条件設定のところ」をみたときに、条件追加をいろいろ設定できるところのことを指しているみたい。

＝＝＝
【参照したドキュメント】
https://cloud.google.com/iam/docs/conditions-overview
https://qiita.com/atsumjp/items/94604bc42dbf5bf813c8
https://cloud.google.com/iam/docs/conditions-attribute-reference?hl=ja
https://qiita.com/kz-takahashi/items/67e97344c183777e8394

＝＝＝
【ポイント】
・閲覧者、参照者などプロジェクト管理者単位ではIP制限は設定できない感じみたい。
・IAM→条件設定のところ→Cloud IAPで[webアプリ〜]に設定して、条件エディタで設定すると保存可能
・コンソールにアクセスさせたくなければ、各機能ごとに権限を与えればいけそうだった。（検証済み）
[HTML/CSS]アイコンを導入したい（material icons）

__ボタンをテキストフォントではなくアイコンフォントにしたい。__

## material icons とは

__公式サイト__

* [Icons – Material Design](https://material.io/resources/icons/?style=baseline)
* [Material Icons Guide](http://google.github.io/material-design-icons/)

Material Design は Google が提唱しているデザインシステムのことで、その一部として、マテリアルアイコンが配布されています。
オープンソースのため、商標に使用する目的でもない限りは、ほぼ自由に使用できます。

## 導入方法
1. htmlのhead要素にマテリアルアイコンを利用するための記述をする。
2. 導入したいアイコンを選んでソースコードをコピーする。
3. 使用したい箇所にソースコードを挿入する。

__htmlのhead要素にマテリアルアイコンを利用するための記述をする。__

```html
<head>
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
```

head要素内に記述を追加します。
下記のURLからソースコードを取得。

* [Icon fonts for the web](http://google.github.io/material-design-icons/#icon-font-for-the-web)

__導入したいアイコンを選んでソースコードをコピーする。__

下記のサイトから使用したいアイコンを選び、画面左の`<span>~</span>`を全てコピーする。

* [Icons – Material Design](https://material.io/resources/icons/?style=baseline)

[![ソースコードをコピーする](https://i.gyazo.com/45463b0ccd969bffbb3e1e16c5ce53d2.gif)](https://gyazo.com/45463b0ccd969bffbb3e1e16c5ce53d2)

__使用したい箇所にソースコードを挿入する。__

```html
<div class="sp-menu">
 <span class="material-icons">menu</span>
</div>
```

配置の調整などは、適宜する必要がありますが、こんな感じで表示できる。
[![menuアイコンの表示例](https://i.gyazo.com/f0bc8b98bed66dac1739cd2aca5b9438.png)](https://gyazo.com/f0bc8b98bed66dac1739cd2aca5b9438)
Storyboardを使わずにXibファイルに分けて開発する方法

今回が初投稿になります！りーさんです。
勉強で学んだことを忘れないようにメモ感覚で投稿していこうと思います。

実務ではStoryboardはほぼ使わないそうですね。
Storyboardを使わずにXibファイルに分けて開発する方法を紹介していきます。

#開発手順

まずはプロジェクト作成後にViewControllerとStoryboardを削除しましょう！！
![スクリーンショット 2020-11-11 13.24.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/b5b68236-625a-98b3-2622-582a67d13ba6.png)
削除したら、ファイルを追加します。
cocoa TouchClassでファイルを追加する前に必ずAlso create XIB fileをチェックします。
今回はsampleViewControllerという名前にします。
![スクリーンショット 2020-11-11 13.25.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/d76047a7-89a4-6fe8-126a-e94d301a6f8a.png)
ファイルを作成したら、Info.plistで設定します。
この画面の下から4番目[Main storyboard file base nameをマイナスで削除します。
![スクリーンショット 2020-11-11 13.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/3d2e8e35-74ee-4cab-a3c2-702409e8c87e.png)
その次にApplication Scene Manifestの矢印を押していくと画像のようになります。
[Item 0]のStoryboard Nameもマイナスで削除していきます。
![スクリーンショット 2020-11-11 13.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/3a87cfd9-2123-2c76-7c6d-346e53602faa.png)

ここまで設定の方は終わりです。
ここからはプロジェクト作成後に自動で作成される
SceneDelegate.swiftファイルにコードを書いていきます！
ここのコードは自分でも何を書いているのかわからないので呪文のように覚えましょう笑


```swift:SceneDelegate.swift
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let scene = (scene as? UIWindowScene) else { return }
        window = UIWindow(windowScene: scene)
        window?.makeKeyAndVisible()
        
        let sampleVC = sampleViewController()
        let rootVC = UINavigationController(rootViewController: sampleVC)
                window?.rootViewController = rootVC
    }

```

こう書くことによってナビゲーションバーも追加されます！！
このようにエラーなく真っ白の画面が最初に表示されるようになりました。
![Simulator Screen Shot - iPod touch (7th generation) - 2020-11-11 at 14.00.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/79d4c621-f05b-ece7-f82f-e038d39c8571.png)

Storyboardは無くなったのでこれからは画面のUIをXIBで行っていきます。
以上でStoryboardを使わずにXibファイルに分けて開発する方法でした！！
ddコマンドを用いたクローン

# 新しいHDD/SSDにクローンをしたい

1. gnomeのディスクマネージャ等[要CUIでの方法]で新しいものに入り切るようにパーティションを縮小する。
2. `dd`を使ってクローンする

   ```console
   # dd if=<inputDisk> of=<outputDisk> bs=1G conv=noerror,sync count=<n_size> status=progress
   ```
ここで容量が$input < output$と$input >= output$の二通りがある

* inputのほうが大きいとき
    * パーティションの縮小はいらない
    * `count`の指定はいらない
* inputのほうが小さいとき(例として、input = 500GB, output = 200GBとする)
    * 500GBのうち、移動させるパーティションを200GBより小さくする
        * 180GBぐらい?(90%) [要出典]
        * count=180にする ($bs \times count == 180$になるように)
    * dd後、ディスクマネージャでパーティションを拡大し、ディスクを使い切るようにする

## 参考

[ディスクのクローン - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3)
MySQLで湯婆婆を実装してみる

## はじめに

@Nemesisさんの[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)に便乗して`MySQL`で湯婆婆を実装してみました。`Function`とか`Procedure`ではなく普通のSQLです。
MySQLはまだない…ないよね？

## コード

```sql
SET @契約書だよ。そこに名前を書きな。 = '荻野千尋';
SET @お前の名前 = SUBSTR(@契約書だよ。そこに名前を書きな。,TRUNCATE(RAND()*CHAR_LENGTH(@契約書だよ。そこに名前を書きな。),0)+1,1);
SELECT 
	@契約書だよ。そこに名前を書きな。 AS フン。
    ,'' AS というのかい。贅沢な名だねぇ。
	,@お前の名前 AS 今からお前の名前は
    ,@お前の名前 AS だ。いいかい、
    ,@お前の名前 AS だよ。分かったら返事をするんだ、
    ,'' AS ！！
```

## 実行結果

|フン。|というのかい。贅沢な名だねぇ。|今からお前の名前は|だ。いいかい、|だよ。分かったら返事をするんだ、|！！|
|---|---|---|---|---|---|
|荻野千尋||荻|荻|荻||

## コードの解説

解説も何もあったもんじゃないですが、処理の内容は次の通りです。

- 1行目の`SET`文で湯婆婆に名前を聞かれているので文字列を代入してください
- 2行目で湯婆婆が新しい名前を考えます
- 3行目の`SELECT`文で罵りながら新しい名前を教えてくれます

## 最後に

面倒くさいSELECT文作ってて疲れたので息抜きに作りました。
Qiitaの投稿ってこんなのでいいのかな…

まあ、変数名に全角文字使っても意外と動くもんだなー、
と地味な気づきがあったのでよし。
abstract Factory Pattern

#
<font color="#00f">userはabstractクラスやinterfaceだけを使い目的物を得る
userはFactory Patternを利用ことで、目的物の組成に必要な各種オブジェクトや、その組み合わせを意識する必要がない</font>

以下ではabstract Factory Patternのサンプルコードを記述します

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

##
以下のクラス構成とします

|クラス|説明|
|-----|-----|
|abstract<br>factory.class|abstract createメソッドを定義|
|samFactoryA.class|factoryを拡張する<br>目的物を組成するに必要なパーツクラスを生成し組み合わせる|
|samFactoryB.class|同上|
|interface face1<br>interface face2|パーツ用インターフェイス|
|parts1.class ～ parts4.class|目的物の組成に必要なパーツクラス|
|user(Main.class)|動作を確認|
＊user　他の開発者がこのパターンを利用する、という意味合いを含みます

下記のサンプルコードでは２つのFactoryを使っています
abstract Factory Patternは容易に複数のFactoryを作れるため
userの利便性が上がる特徴があります

```java:factory.class
abstract class factory{
  String msg;
  int    len;

  factory(String msg){
    this.msg = msg;
    len =msg.length();
  }

  abstract String create();
}
```
```java:samFactoryA.class
class samFactoryA extends factory{
  samFactoryA(String msg){super(msg);}

  String create(){
    String partsA = new partsA().s;
    String partsB = new partsB().s;
    return partsA+super.msg+partsB;
}}
```
```java:samFactoryB.class
class samFactoryB extends factory{
  samFactoryB(String msg){super(msg);}
  
  String create(){
    String partsA = new partsA().s;
    String partsB = new partsB().s;
    String partsC = new partsC().s;
    String partsD = new partsD().s;
    return partsA+partsC + super.msg + partsD+partsB;
}}
```
```java:interface_face1
interface face1{}
class partsA implements face1{String s="<<< ";}
class partsB implements face1{String s=" >>>";}

interface face2{}
class partsC implements face2{String s="[[[ ";}
class partsD implements face2{String s=" ]]]";}
```
```java:user(Main.class)
public static void main(String[] args){
  factory f1 = new samFactoryA("Hello java");
    System.out.println(f1.create());
  
  factory f2 = new samFactoryB("HELLO JAVA");
    System.out.println(f2.create());
}}
```
Azure Active Directory B2C テナントを作ってみた

Azure Active Direcotry B2C は他のサービスとの作成方法異なりますので、ここで紹介します。

## Azure AD B2C テナントを作成
1. 画面上部に **Azure Active Directory B2C** を入力し、Marketplace から **Azure Active Directory B2C** を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/2eea5a70-8ccd-0535-7e78-e6af93c0b1f2.png)

2. **\[Create a new Azure AD B2C Tenant] (新しい Azure AD B2C テナントの作成)** を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/ce9cf28e-f260-2150-427b-b51dfbb4c012.png)

3. 必要な情報を入力し、**[Review + Create]** ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/8772de41-a35d-809a-715f-15cf267e0be7.png)

4. 確認画面で **[Create]** ボタンをクリックし、作成完了までを待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/fdb3bdc0-69fd-926b-b3dd-20312af265f3.png)

5. 作成完了しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/33a726a6-1bdc-e5ba-21dc-b9fcc7d5a3f1.png)

## サブスクリプションへのテナントのリンク
Azure AD B2C 作っても、そのまま使えませんので、サブスクリプションとリンクする必要があります。

1. **[ディレクトリ + サブスクリプション]** アイコンを選択し、Azure AD B2C テナントが**含まない**ディレクトリをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/bac0010a-3ba1-ff22-dd9c-eb40941e3dbc.png)

2. 画面上部に「Azure Active Directory B2C」を入力し、Marketplace から **Azure Active Directory B2C** を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/6003a63e-cb2d-817f-34f6-a4c91e2f6c40.png)

3.  **\[Link an existing Azure AD B2C Tenant to my Azure subscription] (既存の Azure AD B2C テナントを Azure サブスクリプションにリンクする)** を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/64580510-31ac-8a96-ee08-2fdd22d2172b.png)

4. 作成した **Azure AD B2C テナント** を選択し、ご利用の **サブスクリプション** を選択し、最後 **[Create]** ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/85c3b564-1ee0-7d9b-2eee-43fc0b256962.png)

5. ここまで作成は完了しました。最後作った Azure AD B2C テナントに切り替えましょう。上部の「ディレクトリ + サブスクリプション」アイコンを選択し、Azure AD B2C のディレクトリをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/a6019b88-571d-c448-f2a4-6d2afc0e2936.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/e638bcd4-b9d7-eef2-f8f5-6f95f4cdbbd1.png)
CSSの厳選小技！！①

# CSSの技はたくさん存在する！！
最近、CSSについて再度学習しているのだが、小技はたくさん存在している。
一度に全て紹介するのは大変なので、厳選したものをいくつか紹介していく。

# textareaのリサイズを禁止にする方法
実はブラウザによってtextareaのサイズをユーザーが調整できる機能があります。
デザイン的にいまいちの場合はこれを無効にすることができます。
（UXの観点から見ると、リサイズできた方がいいとは思いますが、あしからず）
以下、コードです

```CSS
textarea {
  resize: none;
}
```
※調査の結果、Chrome,Edge,Safariは対応しているみたいですが、IEは対応していないみたいです。（[対応ブラウザ](https://caniuse.com/css-resize)）

# CSSでカラーピッカーを表示
inputタグに`type="color"`を指定するだけで簡単にカラーピッカーを表示させることができます。
ユーザーに色を選んで欲しい時に重宝しますね。
以下、コードです。

```HTML
<input type="color" value="#e66465">
```

`value="#e66465"`のようにデフォルトを設定することもできます。

# まとめ
かなり知らないことがたくさんあってびっくりしましたが、まだまだあるので便利だと思ったものを
また紹介していきます。
CSSの可能性は無限大！！！
JavaScript push()の戻り値

#push()の戻り値
配列の末尾に要素を追加することができる```push()```ですが、[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/push)によると、戻り値として返すのは要素を追加した後の新しい配列ではなく、新しい配列の**要素数**を返します。

新しい配列を返すと思っていたので、下記のような処理を行おうとした際にハマってしまいました。。。

```JavaScript:confirmPushedArrayLength.js
let students = ['sato', 'suzuki', 'takahashi', 'tanaka', 'ito'];
//studentsに"watanabe"を追加して、追加後の要素数を取得したい。
let studentsCount = students.push("watanabe").length;
console.log(studentsCount); //undefined 取得失敗。
```

``studentus.push("watanabe")``の戻り値が``"watanabe"``追加後の``students``の要素数``6``であるため、``.length``が``Array.length``へのアクセスとならず、存在しないプロパティ``length``にアクセスすることになり、``undefined``を戻り値として返します。

```JavaScript:confirmPushReturnValue.js
let students = ['sato', 'suzuki', 'takahashi', 'tanaka', 'ito'];
console.log(students.push("watanabe")); //6 戻り値は"watanabe"追加後のstudentsの要素数。
```

``map()``や``filter()``はコールバック関数による処理後の新しい配列を戻り値として返してくれるなど、JavaScriptの```Array.prototype```の各メソッドの戻り値は当然ながらそれぞれ違うので、思い込みで戻り値を推定しないように気を付けたいですね！
Python エラー: ModuleNotFoundError: No module named 'flask'

久しぶりにLINEbotを作成する段階でHerokuと連結したら以下のエラーを吐きました。

`ModuleNotFoundError: No module named 'flask'`


この手No module named 'XXX'のエラーが多く、毎回調べて解決していたのですが面倒臭がりな僕の解決策として

###一度消して入れ直してみる

これが結局簡単なことがわかりました(根本的解決ではなさそう)


よってターミナル上で以下の操作を行います。(例としてflaskでやってます)
まずはモジュールがインストールされているかどうかを確認します。

ターミナル上

``` 
(base) MacBook-puro:*********$ pip show flask
Name: Flask
Version: 1.1.1
Summary: A simple framework for building complex web applications.
Home-page: https://palletsprojects.com/p/flask/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD-3-Clause
Location: /Users/***(ユーザー名)/opt/anaconda3/lib/python3.7/site-packages
Requires: itsdangerous, Jinja2, click, Werkzeug
Required-by: flask-ngrok, Flask-Compress, dash

```

このように表示されたら一応モジュール自体は入っていることがわかります。
正式にはLocationからの設定が正しいのですがここでは一旦モジュールを削除して入れ直してみます。


```
#消して入れなおす

pip uninstall flask && python -m pip install flask

```

これで戻る場合が多いです。理由としてはpathの位置、またバージョンの変更によるものだと思います。
根本的な解決については他の方の記事をみていただけたらいいかと思います。