OmniAICreator/Qiita-1.07M huggingface dataset:
picoCTF 2018 buffer overflow 1 - Points: 200

#問題

https://2018game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f13dc1c2-0187-b6e5-f0c1-3b1a1917a693.png)


#解いてみた

バッファオーバーフローの問題のようです。
まずはソースとプログラムをダウンロードします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/934bcc5d-5a7f-50be-245e-7a061f791283.png)

頑張ってwin()を呼び出してflag.txtを出力させる問題のようです。

ディレクトリを確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/8eea907d-33bc-82e7-103c-cd6a9a61e9ff.png)

objdumpしてwin()の場所を確認します。

```
objdump -d -M intel ./vuln
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fecfbfa8-b7d9-7605-6adb-093db6dc2693.png)

080485cbがwin()の始まりということができました。
さてこれをどこに入れればいいんでしょう。
一度実行してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d2de0b3c-0f04-3b99-1afb-8a836b2ae33d.png)

たくさん入力したところ0x76757473に変わりました。
これはUTF-8のvutsです。
[Unicode対応 文字コード表 - ASH](http://ash.jp/code/unitbl1.htm)

順番が逆になってるのはリトルエンディアンだからだと思われます。
ここを先ほど確認したwin()のアドレス080485cbにすればよさそうです。

```
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
↓
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqr\xcb\x85\x04\x08
```

にして実行してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f1b1165c-cdc0-4b67-bc27-7f5223964f20.png)

ダメでした。
0x6263785cが何か調べてみると「bcx\」でした。
16進数ではなくてそのまま文字として読まれていたようです。。。

echoでエスケープシーケンスが使えるのでそれを使います。
具体的には以下でしょうか。

```
echo -e "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqr\xcb\x85\x04\x08" | ./vuln
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3fd0c704-b7e8-d40c-219e-cf08a61d9960.png)

できました。
モダンな技術を全く知らないSIer5年目がWebサービスを作ることになったため0から勉強する ~AWS編その１~

# はじめに
初のQiita投稿になります。
色々と間違ってる点や拙い文章になると思いますが生暖かく見守って、ついでにアドバイスをいただけると幸いですw


現在SIer5年目でjavascript(Jqueryのみ)、PHP(フレームワーク無し)を2年ほど、C#(Windowsアプリ)3年ほどやってきました。
色々なご縁があり、個人で最近Webサービスの立ち上げをやることになったのですが何せ本当にWebサービスを立ち上げるための知識がほぼ0に等しいです:sob:

ただ今後のキャリアを考えた時に今のままではいけないと思いチャレンジすることにしました。

まずは最初に技術を習得しないといけないので、学ぶ＆アウトプットするために毎回投稿していこうと思います。
今後身についていこうと思ってるのは下記のような技術です。
**AWS**
**Docker**
**CI/CD環境の構築(何を使うかはまだ未定)**
**Laravel**
**Nuxt.js**

今回はAWSについて学んでいきます。


# AWSアカウント作成と初期設定諸々

1. AWSアカウント作成
2. 作業用IAMを作る
3. CloudTrailを設定
4. 料金アラートを設定

## 1. AWSアカウント作成

**下記のURLからAWSのアカウントを作成する**
手順通り作成していく
[AWS公式サイト](https://aws.amazon.com/jp/)

**作成後にIAMユーザで請求確認できるように設定する**
[UserName]>[マイアカウント]

![image.png](https://qiita-image-store.s3.amazonaws.com/0/305479/274584ec-87c2-35d1-2a84-515de6e427b5.png)

この次の手順で作成するIAMユーザでも請求書を確認できるようにする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305479/9e20b8e1-f08b-6ddf-f80f-0fd72ef934ed.png)

## 2. IAMユーザの作成
AWSでアカウントを作成した直後では、rootユーザのみで全権限を持っており
アカウントの設定方法、サポートプラン変更時はこのrootユーザでなければできない
それ以外はIAMユーザに権限を与えてそちらで作業させるのがAWSのベストプラクティスらしい

それぞれのアカウントの特徴は下記の通り

#### rootユーザ
1. 全サービスを扱える特権ユーザ
2. アカウント設定変更/サポートプラン変更はこのユーザのみでしか行えない
3. セキュリティ的に通常の作業はこのユーザの仕様は非推奨

#### IAMユーザ
1. 許可されたAWSサービスしか行えない
2. 利用者ごとに払い出し、通常の作業はこちらで行い

##### IAMユーザの作成をしていく
(1) AWSサービスの検索ボックスで「IAM」と検索し、IAMユーザの画面に移動する
(2) [ユーザ]タブ>[ユーザーを追加]ボタン
(3) 任意のユーザ名を入力
(4) アクセス種類[AWSマネジメントコンソールへアクセス]にチェック
(5) パスワード設定
※他の作業者のために作成してるならパスワードリセットのチェックボックスをONにする

#### アクセスポリシーの設定
今回は一旦全てのサービスを利用できるようにするためAWSで定義されている下記のポリシーで設定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305479/1acd00ca-d196-b8bb-ead4-e61baf95108f.png)

IAMユーザの作成をしたら、ログイン用の独自のURLが発行され
作成したIAMユーザはそのURLからログインすることになる

## 3. CloudTrailの設定
CloudTrailはAWSに関する操作ログを自動取得するサービス
デフォルトでは90日まで残すようになっているが、個人ならいいが実際に稼働するサービスを構築する場合にはもっと長い期間を置いておく必要がある

cloudtrailのサービス画面に移動する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305479/e558cc57-1b40-21a2-9ac3-265b82d3d5a5.png)

移動したら次にログを永続的に残すために[証跡の作成]ボタンを押下する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305479/841079a4-294f-13ea-2896-3428cafb9d59.png)

今回はこんな感じの設定にしました。ちなみにスクショにはないけどS３のバケットを作成し、S3バケット名も定義しました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305479/75cec317-478c-b09d-8cd2-d2081fb68fc9.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/305479/38631f2b-cc73-6e89-8e03-0a1fe02c9553.png)

## 4. 料金アラートの設定
AWSの料金が指定の値を超えたら通知するように設定する

#### 「請求アラートの設定」
[マイアカウント]>[Billing の設定]
請求アラートを受け通るのチェックボックスをONにする

#### [CloudWatch機能を利用する]
CloudWatchサービスの画面に移動する
[請求]メニュー>[アラームの作成]ボタン

(1)アラームする金額設定
(2)通知先のメールアドレスの設定

## 補足：AWS料金の調べ方
最近Qiitaで良さげなの見つけたんでこれ貼っときます
[ざっくりAWS](https://aws.noplan.cc/)
リージョン丸ごと綺麗にしてみた

環境作りの練習に使っていた環境を削除するので、その様子をメモ書きします。  

# やったこと
1. CloudFormationのスタックを削除する準備
2. CloudFormationのスタックを削除する
3. 残ったものを削除する


# 1. CloudFormationのスタックを削除する準備
* ECRを削除します。  
あらかじめ消さない場合、以下のようにCloudFormationのスタック削除が失敗します。

```
in registry with id '******' cannot be deleted because it still contains images (Service: AmazonECR; Status Code: 400; Error Code: RepositoryNotEmptyException; Request ID: cbe340fe-39e6-11e9-90f7-******)
```

* API GatewayのVPC Linkを削除します。  
VPC Linkが参照しているリソースは削除できないためです。

* RDSインスタンスを削除します。  


# 2. CloudFormationのスタックを削除する
普通にCloudFormationのコンソール画面からスタックを削除します。  
![](https://i.imgur.com/76vryy4.png)

# 3. 残ったものを削除する
* EC2のマネジメントコンソールからネットワークインターフェースの一覧を表示し、それを削除対象のVPCで絞り込み、利用しているリソースを削除します。  
![](https://i.imgur.com/fFxq55Z.png)

* ENIを利用しているリソースを削除したら、次はENIをでタッチします。

* 最後にVPCを削除します。
![](https://i.imgur.com/kp42kpF.png)

* Route53で登録されているドメイン名から、使わなくなったものを削除します。
【Swift4.2】UILabelに行間を設定する

## 概要

iOSアプリ開発のUIでよく使われる `UILabel` に行間を設定する２つの方法を紹介します

## 前提

- Xcode 10.1
- Swift 4.2

## Storyboardで設定する

まずは適当な `Storyboard` or `xib` 開き、UILabelを設置します。

<img width="922" alt="スクリーンショット 2019-03-02 11.22.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/126441/0d76cff3-0879-b92d-97c2-c9587ded3f0b.png">

画面右側の `Inspector` の `Attribute Inspector` を見てみます

<img width="803" alt="スクリーンショット 2019-03-02 11.23.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/126441/da389327-9941-b5a4-3b93-b55f34f01eab.png">

`Label` -> `Text` が `Plain` の状態では行間を設定できないので、ここをattributedに変更します

最後に、下記GIFのように設定すると行間を変更できます

![line-height-storyboard.gif](https://qiita-image-store.s3.amazonaws.com/0/126441/7811d84f-54ae-dcdf-8fc1-b1427b83b8b2.gif)

<img width="375" alt="Simulator Screen Shot - iPhone 8 - 2019-03-02 at 11.15.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/126441/8e68ee6f-5e98-33b3-28e3-f443cd7f1cda.png">

## コードから動的に変更する

- IBOutlet接続する
- UILabelのattributedText に `NSAttributedString` をセットする

```swift
class ViewController: UIViewController {
    
    @IBOutlet private weak var titleLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        var attributes: [NSAttributedStringKey: Any] = [:]
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 10.0
        paragraphStyle.alignment = .center
        attributes.updateValue(paragraphStyle, forKey: .paragraphStyle)
        titleLabel.attributedText = NSAttributedString(string: "投稿がありません\n最初の投稿をしてみよう", attributes: attributes)
    }
}
```

他の画面でも簡単に使えるように、 `NSAttributedString`の`extension`に定義しておきましょう

```swift
class ViewController: UIViewController {
    
    @IBOutlet private weak var titleLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        titleLabel.attributedText = NSAttributedString(string: "投稿がありません\n最初の投稿をしてみよう", lineSpacing: 10.0, alignment: .center)
    }
}

extension NSAttributedString {
    convenience init(string: String, lineSpacing: CGFloat, alignment: NSTextAlignment) {
        var attributes: [NSAttributedStringKey: Any] = [:]
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.alignment = alignment
        attributes.updateValue(paragraphStyle, forKey: .paragraphStyle)
        self.init(string: string, attributes: attributes)
    }
}
```
【Kotlin】List をコピーする ／ to〜 と as〜 の違い

## List をコピーする

List などのコレクション系のクラスには、[`toList`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-list.html) や [`toSet`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-set.html) などの、他の型に変換する拡張関数があります。
これらは変換後の型が変換前の型と同じであっても新しいインスタンスを生成するため、
インスタンスのコピーにも使えます。

```kotlin
val list = listOf('A', 'B')
val copiedList = list.toList()
println("list: $list") // > list: [A, B]
println("copiedList: $copiedList") // > copiedList: [A, B]

val mutableList = mutableListOf('A', 'B')
val copiedMutableList = mutableList.toMutableList()
println("mutableList: $mutableList") // > mutableList: [A, B]
println("copiedMutableList: $copiedMutableList") // > copiedMutableList: [A, B]

mutableList += 'C' // コピー元を変更してもコピー先は影響を受けない。
println("mutableList: $mutableList") // > mutableList: [A, B, C]
println("copiedMutableList: $copiedMutableList") // > copiedMutableList: [A, B]
```

## `to〜` と `as〜` の違い

[`toList`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-list.html) や [`toSet`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-set.html) などの `to〜` 系の関数は元のオブジェクトとは独立したオブジェクトを生成します。
元のオブジェクトを変更しても生成されたオブジェクトは影響を受けません。

部分再掲：

```kotlin
val mutableList = mutableListOf('A', 'B')
val copiedMutableList = mutableList.toMutableList()
println("mutableList: $mutableList") // > mutableList: [A, B]
println("copiedMutableList: $copiedMutableList") // > copiedMutableList: [A, B]

mutableList += 'C' // コピー元を変更してもコピー先は影響を受けない。
println("mutableList: $mutableList") // > mutableList: [A, B, C]
println("copiedMutableList: $copiedMutableList") // > copiedMutableList: [A, B]
```

一方、[`asIterable`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/as-iterable.html) や [`asSequence`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/as-sequence.html) などの `as〜` 系の関数が生成するオブジェクトは元のオブジェクトが変更されるとその影響を受けます。

```Kotlin
val mutableList = mutableListOf('A', 'B')
val reversed = mutableList.asReversed()
println("mutableList: $mutableList") // > mutableList: [A, B]
println("reversed: $reversed") // > reversed: [B, A]

mutableList += 'C' // 生成元を変更すると生成先が影響を受ける。
println("mutableList: $mutableList") // > mutableList: [A, B, C]
println("reversed: $reversed") // > reversed: [C, B, A]
```

`to〜` 系で生成したオブジェクトは生成元の変更の影響を受けないため安全に扱えます。
しかし生成されたオブジェクトも全ての要素の値・参照を持つため、メモリを喰いますし、生成に時間がかかります。

`as〜` 系で生成したオブジェクトは生成元の変更に追従するため、追従する必要がないときに使うと思わぬバグを生むことになります。
しかし軽量です。

違いを理解して適切に使い分けましょう。
Android の CSV ライブラリ

Java のライブラリなら、
なんでも Android で使用できると思っていたが。
そうではなかったので、まとめておく。

## Open CSV

カンマで分解して、文字列の配列にして、並び順で取得する。

http://opencsv.sourceforge.net/

サンプルプログラムは、ここに
https://github.com/ohwada/Android_Samples/tree/master/Csv1

下記のようなヘッダー行があるファイル
は、Java オブジェクトにマッピングする機能もある。

```
"Name","Quantity"
"Apple", "10"
"Banana", "20"
```

しかし、Android　では、下記のエラーになる。

> NoClassDefFoundError: Failed resolution of: Ljava/beans/Introspector


Android に は必要なライブラリがないようです。

参考 : [Didn't find class “java.beans.Introspector” when Using OpenCSV to parse csv files](https://stackoverflow.com/questions/50173340/didnt-find-class-java-beans-introspector-when-using-opencsv-to-parse-csv-file)

## univocity-parsers

CSV ファイルを Java オブジェクトにマッピングする機能がある。

https://www.univocity.com/pages/univocity_parsers_tutorial

### 使い方

CSV ファイルのカラムに合わせたJavaクラスを用意する。
アノテーションでカラムと変数の対応を指定する。

```
@Data
public class Hoge {

@Parsed(field = "Name")
public String name = "";

@Parsed(field = "Quantity")
public int quantity = 0;
```
### CSV ファイルの読み込み

```
    // Assetフォルダーから読み込む場合
    Reader reader = new InputStreamReader( getAssets().open(ファイル名) );

        CsvParserSettings settings = new CsvParserSettings();
    BeanListProcessor<Shopping> rowProcessor = new BeanListProcessor<>(Hoge.class);
        settings.setProcessor(rowProcessor);

 CsvRoutines routines = new CsvRoutines(settings);
List<Hoge> list
 = routines.parseAll( Hoge.class,  reader );
```
サンプルプログラムは、ここに
https://github.com/ohwada/Android_Samples/tree/master/Csv2

## Apache Commons CSV

カンマで分解して、文字列の配列にして、並び順で取得する。

https://commons.apache.org/proper/commons-csv/

サンプルプログラムは、ここに
https://github.com/ohwada/Android_Samples/tree/master/Csv3
flutter run実行時にNo connected devices.が表示される(Mac OSでの開発)

```
No connected devices.

Run 'flutter emulators' to list and start any available device
emulators.

If you expected your device to be detected, please run "flutter
doctor" to diagnose
potential issues, or visit https://flutter.io/setup/ for
troubleshooting tips.
```

こんなの出てくる。

```
$ flutter emulators
Unable to find any emulator sources. Please ensure you have some
Android AVD images or an iOS Simulator available.
```

端末のイメージがない。。。。うーむ。

# 解決策

単純でした。

```
$ open -a Simulator
```

シミュレーター切っちゃってたみたい笑

公式のドキュメントに則って立ち上げていくと、

端末のイメージはシミュレーターから引っこ抜いてくるみたいですね。

https://flutter.dev/docs/get-started/install

なので立ち上げていないとエラーになっちゃう。

同じようなエラー文がケースを変えて今後も出てくると思うので、追記していきます。
GitHub の公開鍵には GitHub 全体がスコープのユニーク制約がある

# tl;dr

同じ公開鍵を複数のユーザで使い回すことはできないし、あるユーザの公開鍵をリポジトリの Deploy key として登録することもできない。GitHub の公開鍵には GitHub 全体がスコープのユニーク制約がある。

ぐぬぬ。公開鍵は Identifier でもあるのだから当たり前と言えば当たり前なのか……

デプロイ用ユーザの公開鍵を GitHub ユーザとしてでなく、リポジトリの Deploy keys として登録すると大変に往生します。
リポジトリごとに公開鍵を使い分ける羽目になります。

# 公開鍵を使い分ける

[git clone 時に秘密鍵を指定する - Qiita](https://qiita.com/sonots/items/826b90b085f294f93acf)

@sonots さんの記事です。ハマってから初めて意義がわかりました。

# 公開鍵を使い分けない代替案

- デプロイ用ユーザを登録してユーザとして公開鍵を登録する
- デプロイ用ユーザを登録して [Personal access token](https://github.com/settings/tokens) を作成して使う

トークンに権限設定してトークン単位で Delete できる Personal access token の方がまさかの漏洩時にその後の対処がしやすいとは思います。
秘密鍵の全とっかえという大変なことにならない。はず。
[TypeScript] VSCodeでファイル保存時にtslint.jsonに沿った整形を行う

# 前提
* `tslint.json` は設定済み



# 拡張機能と設定
次の拡張機能と設定で実現できる。

## 拡張機能
本記事で扱う TSLint の拡張機能は以下の2つ｡
どちらか一つで実現できるので､好きな方を選べば良い｡

* [TSLint](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin)
or
* [TSLint(deprecated)](https://marketplace.visualstudio.com/items?itemName=eg2.tslint)

## 設定
設定の対象は TSLint, TSLint(deprecated) のどちらも同じ｡
VSCode の設定ファイルである `setting.json` を編集する。`setting.json` はユーザ設定でもワークスペース設定でもどちらでもお好きな方で。

### TSLint の設定
まずは [TSLint](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin) の設定｡

```json:setting.json
{
  // エディタの自動整形機能は Off にしておく
  "editor.formatOnSave": false,
  "editor.formatOnPaste": false,
  "editor.formatOnType": false,

  // 拡張機能が提供している自動整形のプロパティ
  // ファイル保存時に tslint.json のルールに則って自動整形する
  "editor.codeActionsOnSave": {
    "source.fixAll.tslint": true
  }
}
```

# TSLint(deprecated)の方の設定
次は [TSLint(deprecated)](https://marketplace.visualstudio.com/items?itemName=eg2.tslint) の設定｡

```json:setting.json
{
  // エディタの自動整形機能は Off にしておく
  "editor.formatOnSave": false,
  "editor.formatOnPaste": false,
  "editor.formatOnType": false,

  // 拡張機能が提供している自動整形のプロパティ
  // ファイル保存時に tslint.json のルールに則って自動整形する
  "tslint.autoFixOnSave": true,
}
```


# 要点
両者ともに

1. エディタ( VSCode )が提供する自動整形のプロパティは無効にする
1. 拡張機能が提供している自動整形のプロパティを有効にする

のがポイント｡
とくに 1 点目の「エディタ( VSCode )が提供する自動整形のプロパティ」はハマりポイント｡

```json:setting.json(抜粋)
  "editor.formatOnSave": false,
  "editor.formatOnPaste": false,
  "editor.formatOnType": false,
```

ファイル保存時に自動整形する設定である `editor.formatOnSave` を `true` に設定して機能を ON にすると期待通りに動かない｡
どうもこの設定が ON の場合は **エディタの自動整形の方が優先的に働く** らしく、`tslint.json` のルールが適用されなくなる。

例えば

* 文字列を「シングルクォーテーション」でくくるというルールを決めているのに、ファイル保存時に「ダブルクォーテーション」に変換される
* メソッドの引数で勝手に改行されてしまう

とかいう目にあう。
もし同じような現象にあっている方が居られたら、上記を見直すと良いかと。
Arduino でビルドした .bin を取り出す

※超初心者が書いた自分への備忘録です。

- Arduino IDE > ファイル > 環境設定 > 以下のファイルを直接編集すれば、より多くの設定を行うことができます。  
C:\Users\admin\AppData\Local\Arduino15  <-- この表示をクリック
- Arduino IDE を閉じる
- preferences.txt の最終行に下を追加   
build.path=C:\Users\admin\OneDrive\Documents\Arduino\\.arduino_build
- .arduino_build ディレクトリを作成
- 検証でビルドするとフォルダに出来上がる。（次のビルドで消える）
[Notch] StandAloneで頑張るために その１

現場などで、自作ソフト を使ってキャプチャーした映像にエフェクトをのせたりしてます。
Notchは、まだ使い始めて数か月ですので、そこまで詳しくはありません。
昨年から現場導入しましたので、現場で使うにあたっていろいろ調べたことを書いていきます。
あまりこの辺の情報が無いなぁと思いましたので。
また、すぐにわすれるので備忘録的な感じで。

StandAloneで頑張るために

そう。StandAlone App で書き出してExeで何とか戦いたい。

現場で使うにはメディアサーバを導入するのが手っ取り早い。でも、、、金額が、、、、
ということがあります。
同時に4,5物件の現場が重なってきたりすると、
レンタルするにも予備機を含めるとなると台数確保が困難だったりするのです。

それにNotchmarksによるとHippotizerとRTX2080で、そんなに処理速度変わんないじゃん！
ということもあります。
（でも本当はメディアサーバが欲しい。。。。Hippotizer便利そうだから、使ってみたい。。。それに現場にどーんとHippoの卓とかDisguiseの卓とあるとかっこいいよね。。。大手の映像会社さんはいいなぁ。。。。。）



さて、現場にどっぷりとつかっている身から、
StandAloneで頑張るために何が必要か？
を数回に分けて書いていきます。

１回目なので、諸問題のリスト化をします。
その後にどのように解決したかを書いていきます。（解決していないこともありますが、、、、、）
もっと、いい方法があったら教えてください。（そりゃメディアサーバいいよなぁ。。）

ひとまず、リスト。

1、映像キャプチャの問題（主にHD-SDI環境の話) 
キャプチャーボードの話とか、BMDはダメとか（これはBMDが悪いのか？？)
また、マルチソースをキャプチャしたい！！！！とか

2、オペレーションの問題
Exeでは上下キーでレイヤー選択できるけど、これ毎回たたくのは、今どきではないのでは、、、、、
そりゃメディアサーバに書き出せばいろいろできるのは知ってるけどさぁ。。。タイムラインをコントロールしたいのよ。StandAloneで。
再生とか停止とかどうするのか？タイムライン上で飛べるの？とか、OSC用に別アプリ作んなきゃダメ？とか、なにこれ嫌がらせ？とか、その辺です。

3、どの辺のコンピュータがいいのか？　
これは悩みました。。。

4、送出の問題
これは割とあっさりと。

リストといっても4つでしたね。
ここを解決できれば、もう楽ちんなのですよ。はい。
では次回　映像キャプチャの問題　から。
DonkeyCar「Azure Virtual Machine」を使ってGPUで訓練する（旧バージョン2.5.8）

#ディープラーニング用仮想マシンを作成
Azure にサインイン
ポータル画面を開く
「＋リソースの作成」をクリック
"Deep Learning"で検索
「Deep　Learning Virtual Machine」をクリック
「作成」をクリック
##１ 基本
「Name」名前を決める
「Select OS type for ...」はLinuxを選択
「User name」は仮想マシンにログインするユーザー名を決める
「Password」は同パスワードを決める
「Confirm password」は上と同じものを再入力
「サブスクリプション」はそのまま
「リソースグループ」は新規作成で名前を決める
「場所」はそのまま
「OK」をクリック
##２ Settings
「Virtual machine size」
デフォルトの「NC6」で良いが変更する場合は「サイズを変更します」をクリックしてVMサイズを選んで「選択」をクリック
##３ 概要
「OK」が青くなったらクリック
##4 購入
「作成」をクリック
4分ほど待つとインスタンスが作成されたとメッセージが出る
#vmに接続
Azureポータル画面左側メニューの「Virtual Machines」をクリック
作成した名前をクリック
「パブリックIPアドレス」にターミナルからsshで接続する
#インストール
$ sudo apt-get install virtualenv build-essential python3-dev gfortran libhdf5-dev
$ virtualenv env -p python3
$ source env/bin/activate
$ pip install tensorflow-gpu==1.9.0
$ git clone https://github.com/autorope/donkeycar
$ pip install -e ./donkeycar[tf_gpu]
$ donkey createcar ~/mycar
$ cd mycar
#訓練
ラズパイの~/mycar/tub/を手元のホストPCの~/mycar/tub/に転送して圧縮しvmに転送
ホストPCにターミナルでログインして
$ rsync -r pi@donkeypi.local:~/mycar/tub/ ~/mycar/tub/
$ zip ~/mycar/tub
$ rsync -r ~/mycar/tub.zip (vmのユーザー名)@(vmのパブリックアドレス):~/mycar/
vmで~/mycar/に解凍
$ unzip tub.zip
訓練を実行する
$ time python manage.py train --tub tub/ --model models/mypilot
「Epoch xxxxx: early stopping」が出れば訓練終了
vmの~/mycar/models/mypilotをホストPCの~/mycar/models/に転送
$ rsync -r (vmのユーザー名)@(vmのパブリックアドレス):~/mycar/models/mypilot ~/mycar/models/
ホストPCの~/mycar/models/mypilotをラズパイの~/mycar/models/に転送
$ rsync -r ~/mycar/models/mypilot pi@donkeypi.local:~/mycar/models/
ラズパイの ~/mycar/tub/は不要になったので削除する
$ rm -rf ~/mycar/tub
ラズパイで自動走行
$ python manage.py drive --model=~/mycar/models/mypilot
#停止
Azureポータル画面左側メニューの「Virtual Machines」をクリック
作成した名前の右端の「・・・」をクリックして「停止」を選択
#料金
https://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/linux/
「NC6」(デフォルトのインスタンスのサイズ)の従量課金は￥100.80円/時間
vmを停止してもストレージの課金は発生する
たまに使うだけなら削除してまた使う時にvmを作成しインストールを行う
#使用した費用の確認方法
左側メニューの「サブスクリプション」をクリック
「従量料金」をクリック
「コスト管理」の「コスト分析」をクリック
「累積コスト」をクリックして「1日あたりのコスト」を選択
実際の料金は翌日以降でないと反映されないようだ．．．
味気ない記事にちょっとだけ味付けをする画像集

「記事を書いてみたものの文字ばかりで味気無い」、という時にちょっとだけ変化を付けられる（...かもしれない）ビジネスマンの画像をつくってみました。
[![cci95logo_big2.gif](https://qiita-image-store.s3.amazonaws.com/0/43869/745411f7-145a-8334-e3de-e6c37d8be479.gif)](https://github.com/k-tamura/cocha-icons-9to5er-edition)
[GitHub](https://github.com/k-tamura/cocha-icons-9to5er-edition)に上げたので、よかったら使ってみて下さい（記事以外でも使えるかもしれません）。

![all.png](https://raw.githubusercontent.com/k-tamura/cocha-icons-9to5er-edition/master/all.png)

吹き出しに一言付け加えて記事の合間に配置すると、アクセントになると思います。実際にこれを使って書いた記事が[こちら](https://qiita.com/tamura__246/items/5ed6d693480da428fbd5)です。このようなストーリー性のある記事には使えるのではないかと思います。

絵の下に何をしているところかを表す作者（私）の意図を書きましたが、これに必ずしも従う必要はありません（見え方が曖昧なものも多いので）。

効果的に使用するには、以下のようなことに気をつけてください。

 - 使い過ぎない
 - 吹き出しを付ける場合は、言葉は短くする
 - 拡大・縮小しすぎない

ちなみに全てPower Pointで一からつくっています（これをつくりたいので、Power Point 2019買ってしまいました...）。[GitHub](https://github.com/k-tamura/cocha-icons-9to5er-edition)に一部の画像のPower Pointネタを上げました。
　　　　![ppsmall.png](https://qiita-image-store.s3.amazonaws.com/0/43869/4517a94b-5cbc-0b26-26a1-eab28c7f8190.png)
グループ化を解除すると、どう作っているか分かります（本当にテキトーです）。
　　　　![ppsmall2.png](https://qiita-image-store.s3.amazonaws.com/0/43869/854235c2-2f2f-2ff5-9e6f-dcbdb25ef841.png)

イシュー登録（追加要望など）やプルリクエストも大歓迎です（誰もしないですね...）。意図が伝わるレベルでつくっていただければ、修正してマージします。

# ライセンス <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a>

このアイコン集は<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンス</a>の下に提供されています(一応)。クリエイティブ・コモンズ・ライセンスを守る範囲であれば、自由に使うことができます。商用利用も可能です。クリエイティブ・コモンズ・ライセンスについては、[こちらのページ](https://creativecommons.jp/licenses/)を参照下さい。

# 最後に

使用する場合は、[GitHub](https://github.com/k-tamura/cocha-icons-9to5er-edition)にスターを付けて[^1]、以下の画像を作成物のどこかに付け加えていただくようお願いします。

[![dive_movie.gif](https://raw.githubusercontent.com/k-tamura/cocha-icons-9to5er-edition/master/cci95logo.gif)](https://github.com/k-tamura/cocha-icons-9to5er-edition)

Qiitaの記事で使うのであれば、以下を本文の最後に埋め込んで下さい。

```
[![cci95logo.gif](https://raw.githubusercontent.com/k-tamura/cocha-icons-9to5er-edition/master/cci95logo.gif)](https://github.com/k-tamura/cocha-icons-9to5er-edition)
```

HTMLの場合はこちら:

```html
<a href="https://github.com/k-tamura/cocha-icons-9to5er-edition">
    <img src="https://raw.githubusercontent.com/k-tamura/cocha-icons-9to5er-edition/master/cci95logo.gif" alt="cci95logo.gif" style="max-width:100%;">
</a>
```

[^1]: ライセンスに関する指摘があったので、補足しておきます。MUSTではなく、そうしていただけると嬉しいという意味です。
Ubuntu向けLinuxカーネルのdebパッケージ作成 (+perf, ftrace)

Ubuntu向けのLinuxカーネル関連debパッケージであるlinux-image, linux-headersに加えてlinux-tools(perf等が含まれる)を作成するための手順/スクリプトについて整理しています。

最新Linuxカーネルをビルドして適用したものの、カーネルバージョンの不一致によりperf, ftrace等を利用できず困ってる人向けです。


# 背景

Linuxカーネルはバージョンが上がる度に様々な機能、バグフィックス、最適化が加わります。また、パフォーマンスチューニングや解析のために必要なカーネル周りのメトリクス・ツール周りも積極的に強化されるため、新しいLinuxカーネルを積極的に導入＆検証する方も多いと思います。

しかし新しいLinuxカーネルをビルドして適用した場合、perf, ftrace等のカーネル周りのイベント等を監視するためのツールもカーネルのバージョンに合わせて更新しなければ利用できなくなります。

apt/yum等のレポジトリに登録されているLinuxカーネルの場合、基本的にそのカーネルバージョンに対応するパッケージ(ex. linux-tools)が提供されているため特に問題はありません。
しかしそれ以外の手段(ex. Linux本家のソースコード、Ubuntu mailine ppa)でLinuxカーネルを適用する場合、perf, ftrace等がデフォルトでは含まれていなかったり、これらを含めるために結構色々な知識や試行錯誤が必要となることが多いです。

Linuxカーネルの最新版を適用しても、perf, ftraceを利用できなければ解析や検証の幅が極めて狭くなってしまいます。

このため本記事では以下のものを利用して、linux-image, linux-headers等のdebパッケージに加えてlinux-toolsのdebパッケージを作成するための「Dockerを活用した手順/スクリプト」について記載しています。

- Linux本家のLinuxカーネル ソースコード
- Ubuntu mainline ppaのパッチファイル

# 前提

- ビルドマシン環境の前提
    - Ubuntu 16.04 or 18.04
    - Docker 18.09 (おそらく17.xxでも問題なし)
- ビルド実施者の前提
    - Linuxカーネルのビルド、コンフィグ設定、インストール等ができることを想定。
    - perf, ftrace等のツールの重要性を理解している。
    - プロダクト環境等に導入する場合は、事前に十分な検証を行ったり、リスク評価を行ったりする必要があると十分に理解していることを想定。

# ビルド手順

下記gistに手順および資材ファイルを載せています。

https://gist.github.com/yoichiwo7/70f81429813c5ec32cc620a950495b3e

手順はgistのREADME.mdにも記載していますが、簡単に日本語で記載しておきます:

gistにある`Dockerfile`と`build-kernel-with-perf.sh`を同じディレクトリにダウンロードします。

ダウンロードしたディレクトリにcdして、下記コマンドを実行してカーネルビルド用のDockerイメージを作成します。何故Dockerを使っているかは簡単に後ろの節で説明しています。

```bash
docker build -t kernel-build .
```

Dockerイメージを作成後、Dockerコンテナを起動してカーネルをビルドします。コマンドの最後のパラメータはLinuxカーネルのバージョンなので、ビルドしたい適切なバージョンに適宜変更してください。

ちなみにLinuxカーネルのビルドには数時間レベルの時間がかかるので注意しましょう。

```bash
TARGET_KERNEL_VERSION="4.20.13"
docker run \
    --rm \
    -u $(id -u):$(id -g) \
    -v $PWD:/Output \
    kernel-build $TARGET_KERNEL_VERSION
```

ビルドが完了すると、同じディレクトリ配下に*.debのLinuxカーネル関連のdebパッケージが配置された状態となります。debパッケージは以下のコマンドでインストールすることができます。(インストール順は重要です)

```bash
dpkg -i linux-headers-*
dpkg -i linux-modules-* linux-image-*
dpkg -i linux-tools-*
```

# (補足) ビルド用Dockerイメージを使う理由

Linuxカーネルの各種debパッケージをビルドをするためには様々なUbuntuパッケージが必要となります。さらにUbuntuの16.04/18.04とかDesktop/Serverでも微妙に必要なパッケージ条件が異なる可能性があります。

このためDockerを使わずに様々なバージョンのUbuntu環境でカーネルビルドを実施すると、どうしても試行錯誤を繰り返しがちですし、Ubuntu環境自体に色々なパッケージがインストールされて汚れてしまいます。そして色々入れ過ぎたり設定したりした結果、何が正しいビルド条件なのかが把握できなくなることも珍しくはありません。

このため本手順ではカーネルビルド用のDockerイメージ(ベースイメージをubuntu 18.04に固定)を作成することで「より確実かつ環境を汚さず」にビルドを実施できるようにしています。
情報処理安全確保支援士 平成28年度春 午後2 問1

下記の問題集を参考させていただいでおります。
[午後(I・II)に集中！情報処理安全確保支援士精選17問](https://www.amazon.co.jp/%E5%8D%88%E5%BE%8C-I%E3%83%BBII-%E3%81%AB%E9%9B%86%E4%B8%AD%EF%BC%81%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E5%AE%89%E5%85%A8%E7%A2%BA%E4%BF%9D%E6%94%AF%E6%8F%B4%E5%A3%AB%E7%B2%BE%E9%81%B817%E5%95%8F-%E6%9E%97%E7%A7%80%E6%A8%B9-ebook/dp/B07B7LHCVN/ref=sr_1_21?s=books&ie=UTF8&qid=1551168594&sr=1-21&keywords=%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E5%AE%89%E5%85%A8%E7%A2%BA%E4%BF%9D%E6%94%AF%E6%8F%B4%E5%A3%AB)

#設問1
**a：対応の要否**
「重要度や優先度を考慮して」表1番号3か番号6(対応するorしない)に飛んでいます。
対応するかしないかの判断をしているため**対応の要否**です。

#設問2
**(1) 報告すべきインシデントの範囲**
問題文中に「A社IRTに報告すべきインシデントの範囲についても明確に定義していない」、「マルウェア感染時の社内連絡先」という記載があります。
従業員の多くがマルウェアに感染したときの連絡先という認識で、インシデントが発生したときは事業部内で対応している様子で、**どんなインシデント(マルウェア感染も含みますが)を報告するのか**が不明確になっています。

**(2) インシデントがA社全体に与える影響度に基づいた対応を指示するため**
A社でのインシデント発生前は事業部内で発生したインシデントを事業部内で対処していました。
しかし、今回インシデントが発生することによりIT部から独立し、経営陣直属の組織となります。
独立したことで表1番号5を直接実施できるようになり、事業部内でインシデント対応させることを改善します。
表1番号5の内容は「インシデントの影響度に基づいて、対応内容を決定し、対応指示を行うこと」です。

#設問3
**(1) IT部のOA用PCに攻撃メールが送信され、PCがマルウェアに感染し、起動したマルウェアがサーバLANに不正アクセスする攻撃**
運用管理セグメントを新設することで、対処できる攻撃内容についての問題です。
Hさんが「サーバLANの管理用ポートへのアクセスは利用者LANのIT部セグメントからしか許可を与えていないため、運用管理セグメントとほぼ同様な構成になっているから意味がない」と言っています。
しかし、利用者LANとサーバLANのセグメントは分かれているものの、FWを通した構成にはなっていません。
さらに今回はSS部のZ主任に攻撃用メールが送られており、IT部に攻撃メールが送信される可能性もあります。
そうなるとIT部のOA用PCがマルウェアに感染し、サーバLANへのアクセスも可能になってしまいます。
また、LDAPがHTTP通信のため管理用IDやパスワード等を取得されてしまう可能性もあります。

**(2) IT部運用チームのメンバのLDAPID以外によるログイン要求の検知」**
リバースブルートフォース攻撃はブルートフォース攻撃とは逆でパスワードが固定で、IDを総当たりに試す攻撃です。
LDAPサーバへのログインはIT部の運用チーム4名のLDAPIDのみで、他のLDAPからのログインはあり得ません。
そのため、他LDAPIDからのログイン要求=攻撃の可能性というのが考えられます。

#設問4
**(1) A社IRTが収集すべき脆弱性情報を把握できるため**
構成情報を正しく把握しておけばどのような効果があるのかという問題です。
現状、脆弱性対処などは各部署ごとで行われていますが、多忙な時などは対処が遅れインシデントにつながっているようです。
ここでA社IRTが各部署の構成情報を把握しておけば、利用されている機器を基に脆弱性情報を収集しやすくなります。

**(2) A社IRTが各部署のインシデント発生時や対策時の、影響範囲の特定に活用する**
なぜ構成管理情報を把握しておくことで、インシデント対応でも有効に活用できるのかという問題です。
設問4(1)にも記述した通り、各部署は多忙なこともあり、脆弱性対処が遅れインシデント発生が増加しているようです。
ここで、構成管理情報があればインシデント発生時もどの機器でインシデントが発生しているの、影響はどれくらいの範囲なのか特定が容易になります。
解答では対策時にも有効だと記載があります。

#設問5
**・各部署が収集している脆弱性情報の提供を受ける。**
A社各部署の取り組みとどのように連携するのかという問題です。
A社各部署で行われている取り組みは〔脆弱性情報のハンドリング〕より「脆弱性情報の収集」と「脆弱性修正プログラムの適用」です。
今回の問題である図5課第2は脆弱性情報の収集に対する課題で、長期的には増員するようですが、短期的に行えることとしてはすでに情報収集がされた脆弱性情報の共有を受けることが行えると思います。

#設問6
**(1) 現状評価基準**
ゼロデイ攻撃はパッチなどの修正プログラムが適用する前に行われる攻撃です。
問題文より現状評価基準は「時間の経過によって変化し、脆弱性を公表する組織が、脆弱性の現状を表すために評価する基準」と記載があります。
ゼロデイ攻撃はパッチが適用されるまでの時間は攻撃が可能なため、端的に言えば時間で左右されます。

**(2) c：ネットワーク d：ローカル e：FW1**
表3のFW1には「外部事業者の担当者が遠隔地からインターネットを経由し」とあるためFW1には攻撃元区分の**ネットワーク(c)**が当てはまります。
FW2は表3より「SS部が管理する」「SS部の担当者がMPC(管理用PC)にログインし」とあるため攻撃元区分には**ローカル(d)**が当てはまります。
そして攻撃の多さはローカルよりネットワークの方が当然多いため、深刻度のスコアは**FW1(e)**が大きいです。

#用語
インシデントマネジメント：インシデントに関する情報を収集、発生した場合の影響度を評価、発生時の連絡・共有先、インシデント終息後の対応方法等の将来の発生する可能性を見込んで対策を検討すること
インシデントハンドリング：「インシデントの検知・連絡受付」、「インシデントのトリアージ・対応要否の決定」、「影響範囲の特定・応急処置」、対応策」の4つで構成されており、インシデントマネジメントに含まれている。
bsh-コマンドセパレータ

# shellのコマンドセパレータ
コマンドは普通、行の終わり（改行コード）で完結して、一つのコマンドとなる。
しかし、特定の文字をコマンドの区切りとして使用することができる。

- 改行 １コマンドの区切り
- ;　１コマンドの区切り
- |　結果を次のコマンドの引数とする
- & バックグランドで実行する
- ||　OR制御演算子
- &&　AND演算子

## セミコロン（;）
コマンドがセミコロンで区切られていた場合、左から順次実行される。

```bash
cd /tmp; ls
```
tmpに移動して、lsの結果を表示する。

## パイプ（|)
左側のコマンドの出力結果を右側のコマンドの入力とすること。

```bash
echo abc | wc
//        1       1       4
```
echo abcの出力結果をwcの入力にしている。

## アンパサンド（＆）
アンパサンドをつけたコマンドはバックグランドで実行される。
つまり、コマンドの終了を待たずに次のコマンドを実行する。

## OR演算子（||)
左側のコマンドが失敗して、右側のコマンドが初めて実行される。

## AND 演算子（&&）
左側のコマンドが成功した時だけ、右側のコマンドが実行される。
ノスタルジアpc-9801 その11

#概要

整理していたら、フロッピーディスクが出てきた。
せっかくなので、エミュで動かしてみた。

#環境

- windows vista
- t98-next
- disk explorer

#n88basicで、再帰。

gosubの中で、自分を呼ぶ


![saiki.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/9fa1b87c-e9d5-be18-21bb-17824b4c5e61.jpeg)

#サンプルコード

6の階乗を求める。

```
10 kai = 6
20 n = kai
30 gosub 80
40 print n
50 end
60 '
70 '
80 'kaijyou
90 if kai = 1 then return
100 kai = kai - 1
110 n = n * kai
120 gosub 80
130 return

```

以上。
Unityのコライダー勉強


OnCollisionStay や OnTriggerStay が記述されたスクリプトがアタッチされたオブジェクトは、多数のオブジェクトと接触していた場合、ちゃんと「接触したよ！」って認識してくれるのかなぁと思い、
    void OnCollisionStay(Collision n){
        Debug.Log(n.gameObject.name);
    }
と記述したスクリプトをCube（緑）にアタッチして、Cube（オレンジ）３つに同時に接触させてみた。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/285370/835f2a39-d868-c205-3dda-20fa3d967c5c.png)
↓
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/285370/a04e2b5a-b919-1d55-2268-b6f28e78737a.png)


ちゃんと、オレンジ3つのcubeと衝突判定を行ってくれた。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/285370/ae122c24-9837-94a4-8d66-d8f2d0443377.png)
Amazon EFSで数百GB以上のデータを運用する場合のハマりポイント

複数EC2インスタンスからアクセス可能なキャッシュとしてEFSを利用し、数百GB以上のデータを定常的に運用している。その中でいくつかハマりポイントが見つかったので書いておく。

## EFSとは

[えごったー](https://github.com/ts-3156/egotter)では、ツイッターAPIのデータのキャッシュとしてEFSを利用している。EFSは簡単に言うと、複数EC2インスタンスに同時にマウントできるEBS。その他の特徴は下記の通り。

- 複数EC2インスタンスに同時にマウントできる共有ストレージサービス
    - 内部的にはNFS
- フルマネージド、複数AZへの冗長化あり
- アクセス速度は、ローカルストレージ（=EBS）よりは遅い、(使い方によるが)S3よりは早い
    - EBS > **EFS** > S3
- 料金は、EBSよりも高い、S3よりはもちろん安い
    - **EFS** > EBS > S3
- **保存するデータ量に応じてサイズが自動で増減する**

この中でも **サイズが自動で増減する点が他にはない特徴かつ非常に役に立つ点** 。自動で増加するサービスは多いが、減少するサービスは比較的珍しい。柔軟性が高い分、EBSよりも料金が高くなっている。

ただし、良い点だけでなく注意が必要な点もいくつかある。それを順に書いていく。

**注意点**
**この規模のデータになると通常のファイルシステム（ext4など）でもそれなりに遅くなります。EFSだけが遅いというわけではない点にご注意ください。**

## データが大きくなるとファイルの一覧表示（ls）に数十分以上の時間がかかるようになる

今回、EFSには183GBのデータを保存している。

```sh
$ df -h
ファイルシス                                                   サイズ  使用  残り 使用% マウント位置
ap-northeast-1b.fs-00000000.efs.ap-northeast-1.amazonaws.com:/   8.0E  183G  8.0E    1% /efs
```

すると、ファイルの一覧表示ができなくなってしまう。

```sh
$ ls /efs/cache

# 結果が返ってこない
```

ディレクトリ構造は一例として下記の通り。1, 2, 3, 4がファイルで中身はJSONが入っている。ファイル数は250万ほどある。

```
$ tree /efs/cache
├── 032
│   └── 320
│       └── 1
├── 033
│   └── 330
│       └── 2
├── 034
│   └── 340
│       └── 3
├── 035
│   └── 350
│       └── 4
```

もちろん、ディレクトリのサイズ表示(du -sh)もできない。

```sh
$du -sh /efs/cache

# 結果が返ってこない
```

### ファイルの一覧表示ができないと困るのは有効期限切れのキャッシュを削除するとき

似たような例として、Redis等のキャッシュシステムではキーの一覧表示は非常に負荷がかかる処理であり、本番環境では実行しないように注意する必要があることはよく知られている。

それと同様に、lsをしなければよいと思うかもしれないが、それではうまくいかないケースがある。

Redisは有効期限切れのキャッシュの削除を自動で行う仕組みが用意されているが、 **ファイルシステムベースのキャッシュは有効期限切れのキャッシュの削除を次回アクセス時に行う実装になっていることがある** 。

つまり、ある時点で作ったキャッシュは削除されずにずっと残り続ける。それではデータが増えすぎてしまうため、定期的に削除する必要があるが、ファイルシステムベースのキャッシュは有効期限切れキャッシュの探索にlsと類似する仕組みを用いることがあり、このケースに当たると利用しないキャッシュがいつまでも削除されないことになってしまう。

一例として、Rails（ActiveSupport）のFileStoreは上記のような実装になっており、EFSをキャッシュ保存先として利用していると、データが大きくなるにつれ下記のコードで有効期限切れのキャッシュ削除をすることができなくなってしまう。

```ruby
ActiveSupport::Cache::FileStore.new(dir).cleanup

# 一覧表示ができないためそもそも始まりすらしない
```

この問題に対して、[えごったー](https://github.com/ts-3156/egotter)では、定期的にキャッシュを保存するディレクトリを変更することで対処している。

```sh
# 1月のキャッシュ。2月になったらrmで削除可能
/efs/cache/201901

# 2月のキャッシュ
/efs/cache/201902
```

ただし、EFSに数百GBのデータを保存すると、ファイルの削除にも非常に時間がかかるため、rmの実行にも注意が必要となる。

## データが大きくなるとファイルの削除（rm）にも数十分以上の時間がかかるようになる

183GBのデータをrmで単純に削除すると、約3時間かかることになる。この点も注意してEFSを運用する必要がある。

```sh
$ time rm -rf /efs/cache

real    183m54.272s
user    0m9.202s
sys     1m33.282s
```

**注意点**
**この規模のデータをrmで削除すると、通常のファイルシステム（ext4など）でもそれなりに遅くなります。EFSだけが遅いというわけではない点にご注意ください。**

## 参考リンク

[えごったーのGitHubリポジトリ](https://github.com/ts-3156/egotter)
bsh-クォーテーション

# bshのクォーテーションについて
bshではシングルクォーテーション(')とダブルクォーテーション(")で挙動が違います。
些細な違いですが、正しく把握することが重要です。

## シングルクォーテーション（')
シングルクォーテションに囲まれた文字列の特殊文字は普通の文字と同じ扱いとなる。  

```bash
echo 'today is `date`'
// today is `date`
```

## ダブルクォーテーション(")
$,`(バッククォート`),\の三つの文字をエスケープしない。
それ以外の文字はエスケープする。

```bash
echo "today is `date`"
// today is 2019年 3月 2日 土曜日 09時16分06秒 JST
```

## 使い分け
囲んだ文字列の中でコマンドや変数を使用する場合は、ダブルクォーテーションを使用する。


## ついでに、バッククォート（`）
バッククォートに囲まれたものは、コマンドとなる。
ノスタルジアpc-9801 その10

#概要

整理していたら、フロッピーディスクが出てきた。
せっかくなので、エミュで動かしてみた。

#環境

- windows vista
- t98-next
- disk explorer

#n88basicで、AM変調、復調。


![am.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/3a07aee4-fde6-aad9-8303-f46a47756f36.jpeg)

#サンプルコード


```
10 CLS 3
20 DEFSNG A-Z
30 PI = 3.14159265#
40 DIM SRC(300)
50 DIM AM(300)
60 DIM I(300)
70 DIM Q(300)
80 DIM I2(300)
90 DIM Q2(300)
100 DIM O(300)
110 FOR T = 0 TO 299
120  SRC(T) = SIN(T / 8000 * 2 * PI * 220) * 2 - 1
130 NEXT
140 FOR T = 0 TO 299
150  AM(T) = (.6 * SIN(T / 8000 * 2 * PI * 220) + 1!) * SIN(T / 8000 * 2 * PI * 3000) * 2 - 1
160 NEXT
170 FOR T = 0 TO 299
180  I(T) = AM(T) * COS(T / 8000 * 2 * PI * 2800)
190  Q(T) = AM(T) * SIN(T / 8000 * 2 * PI * 2800)
200 NEXT
210 Q = 1!
220 OMEGA = 2! * PI * 300 / 8000
230 ALPHA = SIN(OMEGA) / (2! * Q)
240 A0 = 1! + ALPHA
250 A1 = -2! * COS(OMEGA)
260 A2 = 1! - ALPHA
270 B0 = (1! - COS(OMEGA)) / 2!
280 B1 = 1! - COS(OMEGA)
290 B2 = (1! - COS(OMEGA)) / 2!
300 IN1 = 0
310 IN2 = 0
320 OUT1 = 0
330 OUT2 = 0
340 FOR T = 0 TO 299
350  I2(T) = B0 / A0 * I(T) + B1 / A0 * IN1 + B2 / A0 * IN2 - A1 / A0 * OUT1 - A2 / A0 * OUT2
360  IN2 = IN1
370  IN1 = I(T)
380  OUT2 = OUT1
390  OUT1 = I2(T)
400 NEXT
410 IN1 = 0
420 IN2 = 0
430 OUT1 = 0
440 OUT2 = 0
450 FOR T = 0 TO 299
460  Q2(T) = B0 / A0 * Q(T) + B1 / A0 * IN1 + B2 / A0 * IN2 - A1 / A0 * OUT1 - A2 / A0 * OUT2
470  IN2 = IN1
480  IN1 = Q(T)
490  OUT2 = OUT1
500  OUT1 = Q2(T)
510 NEXT
520 FOR T = 0 TO 299
530  O(T) = SQR(I2(T) * I2(T) + Q2(T) * Q2(T)) * 4 - 6
540 NEXT
550 FOR T = 0 TO 299
560  X = T
570  Y = 25 + SRC(T) * 2
580  PSET (T, Y)
590  Y = 50 + AM(T) * 2
600  PSET (T, Y)
610  Y = 75 + O(T) * 2
620  PSET (T, Y)
630 NEXT

```


以上。
Athenaでダミーテーブルを作ってクエリを動かす方法

## 目的

Athenaで巨大なテーブル(例えば、数百GBとか）に対してクエリを動かすまえに、意図通りに動くかどうか確認したいので、

ダミーテーブルを作ってクエリを動かす方法を備忘録として残します

## 方法

たとえば、IPとUserAgentの構成しているテーブルをダミーテーブルとして作りたい場合は、つぎのように記述します

``` sql
WITH
-- ここからダミーテーブル
log AS (
  SELECT tbl.ip, tbl.ua
  FROM UNNEST(ARRAY[
    CAST(
      ROW('127.0.255.255', 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1') AS ROW(ip VARCHAR, ua VARCHAR)
    ),
    CAST(
      ROW('127.3.0.0', 'Mozilla/5.0 (Linux; Android 4.0.3; SC-02C Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31') AS ROW(ip VARCHAR, ua VARCHAR)
    ),
    CAST(
      ROW('127.0.255.255', 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1') AS ROW(ip VARCHAR, ua VARCHAR)
    )
  ]) t(tbl)
)
-- ここまでダミーテーブル

-- ダミーテーブルの中身を確認
select * from log
```

これをAthenaで実行すると、以下の結果が返ってきます

|  | ip | ua |
|--:|:--|:--|
| 1 | 127.0.255.255 | Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 |
| 2 | 127.3.0.0 | Mozilla/5.0 (Linux; Android 4.0.3; SC-02C Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 |
| 3 | 127.0.255.255 | Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 |

あとはこのダミーテーブルをつかえば、あとはこんな感じにIP毎のアクセスカウントなどを求めるなんてこともできます

``` sql

WITH
-- ここからダミーテーブル
log AS (
  SELECT tbl.ip, tbl.ua
  FROM UNNEST(ARRAY[
    CAST(
      ROW('127.0.255.255', 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1') AS ROW(ip VARCHAR, ua VARCHAR)
    ),
    CAST(
      ROW('127.3.0.0', 'Mozilla/5.0 (Linux; Android 4.0.3; SC-02C Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31') AS ROW(ip VARCHAR, ua VARCHAR)
    ),
    CAST(
      ROW('127.0.255.255', 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1') AS ROW(ip VARCHAR, ua VARCHAR)
    )
  ]) t(tbl)
)
-- ここまでダミーテーブル

-- IP毎のアクセスカウントを求める
select ip, count(*) access_count from log group by ip
```

|  | ip | access_count |
|--:|:--|--:|
| 1 | 127.0.255.255 | 2 |
| 2 | 127.3.0.0 | 1 |
Firefox の cache を読み解く

##環境
Firefox 65.0

##目的
Firefox のキャッシュがどういう形式で PC に保存されているかを書いておきます。Firefox のバージョンによってキャッシュの構造も結構変わってるので、あくまでも現状（2019年3月現在）の情報です。

##保存場所
`about:cache`で確認できます。

##index
cache2 ディレクトリの直下に index ファイルがあります。キャッシュの索引を管理するためのファイルのようです。最初の 12bytes がヘッダになっています。

↓ヘッダの構造

|Offset |Size|Type        |Description  |
|:------|:---|:-----------|:------------|
|0      |4   |BE Integer  |Version      |
|4      |4   |BE Unix Date|Last Modified|
|8      |4   |-           |Dirty Flag   |
![index.png](https://qiita-image-store.s3.amazonaws.com/0/353186/817595e7-75ac-85a8-ae2e-599c3b525b33.png)

ヘッダの後は 44bytes 毎に個々のキャッシュの情報が保存されています。最初の 20bytes が Key(:URL) の SHA1 ハッシュ値で、その後の 24bytes に色んな情報が保存されています。（それぞれどういったパラメータなのかはよく分かりません😓）

|Size |Type        |Description       |
|:----|:-----------|:-----------------|
|20   |SHA1Sum     |Hash of Key       |
|4    |BE Integer  |Frecency          |
|8    |-           |Origin Attrs Hash?|
|4    |BE Unix Date|Expiration Date   |
|2    |-           |On Start Time?    |
|2    |-           |On Stop Time?     |
|4    |-           |Flags             |
![index2.png](https://qiita-image-store.s3.amazonaws.com/0/353186/02e8d93b-c3de-daf6-f193-aa4881fc585c.png)
↑ 以下 44bytes 毎に同じ構造の繰り返しになってます。

##entries
entriers フォルダにキャッシュのデータが保存されています。URL の SHA1 ハッシュ値がファイル名となっていて、.jpg とか .css とか生データがそのまま保存されているわけではないです。構造としては下記のように生データの後に色々なメタデータ（最終更新日時、HTTP ヘッダ、データサイズなどなど）とともに保存されています。こちらもバージョンによって結構構造が変わっていて、解析するときにはバージョンチェックが必須です。

|Size        |Type        |Description       |
|:-----------|:-----------|:-----------------|
|[Data Size] |-           |Raw Data          |
|4+([Data Size]/262144+1)*2|-   |Hash + Chunk Hash|
|4           |BE Integer  |Version           |
|4           |BE Integer  |Fetch Count       |
|4           |BE Unix Date|Last Fetched Date |
|4           |BE Unix Date|Last Modified Date|
|4           |BE Integer  |Frecency          |
|4           |BE Unix Date|Expiration Date   |
|4           |BE Integer  |Key Length        |
|4           |-           |Flags             |
|[Key Length]|String      |:URI              |
|(Optional)  |-           |(HTTP Header, etc...)|
|4           |BE Integer  |Data Size         |

##参考
[cache2 - DXR](https://dxr.mozilla.org/mozilla-central/source/netwerk/cache2)
[Firefox Cache2 Storage Breakdown](https://www.guidancesoftware.com/blog/digital-forensics/2015/02/11/firefox-cache2-storage-breakdown)←ちょっと情報が古い
GoPiGo3 on Ubuntu Mate(RaspberryPi3)

GoPiGo3を使ってROS開発してみようかと思い購入してみた。
まずはせっかく既製品を購入したので、そのまま使ってみようかと

# 購入
GW真っ只中の5/1(火)の昼過ぎに注文
せっかくだったので、
- GoPiGo3 ベースキット
- GoPiGoサーボキット
- Raspberry Pi カメラモジュール v2
- HC-SR04超音波距離計
- Raspberry Pi 3コンピュータボード
の一式購入(税抜きで2万円ちょっとくらい)
購入はRobotShopさんのHPより
(amazonよりも安かったので)
ちなみに、この時に迷ったのが、初心者キットや上級者キット
正直何が違うのかわからなかったが、同じくらいの構成にしようとすると
上級者キットでは１万円ほど高くなる。
翌日の5/2(水)には出荷され、5/3(木)到着
# 組み立て
5/3(木)から組み立て
ベース部分は多分３０分ほどで組み立て完了
Raspberryの組み込み作業になり、microSDが同梱されていないことに
気づき(同梱とも書かれていなかったが)一旦中断
この勢いで、単３乾電池８本とmicroSDを購入に出かける
# RaspberryPiセットアップ
とりあえず、ROSのこともあったので、一旦UbuntuMATEで仕込むことにし、
## UbuntuMATEのブートSDの作成
### UbuntuMATEのダウンロード
[UbuntuMATE本家ダウンロードサイト](https://ubuntu-mate.org/download/)より
以下のように
### 圧縮ファイルの解凍
自分はMacなんで、xzの解凍用にxyをインストール
`brew install xz`
### SDカードへの書き込み
`dd bs=1m if=<イメージファイル名> od=<デバイス名>`
デバイス名は`diskutier list`で調べておく
## RaspberryPi3の起動
先ほどのmicroSDカードをRaspberriPi3に入れて、電源投入
この時はHDMIケーブルでモニタとの接続及びキーボード、マウスが必要
## sshの設定
`sudo raspi-config`
## GoPiGoのインストール
### まずはgit
git cloneするために、まずはgitのインストール
`sudo apt-get update`
`sudo apt-get upgrade`
`sudo apt-get install -y git`
### GoPiGoのgit clone
/home/pi/Dexter/GoPiGo3にcloneする事が大切
`mkdir Dexter `
`cd Dexter `
`sudo git clone http://www.github.com/DexterInd/GoPiGo3.git /home/pi/Dexter/GoPiGo3`
### GoPiGo3のインストール
`sudo bash /home/pi/Dexter/GoPiGo3/Install/install.h`
最後に再起動を聞かれる。人によってはハマると書いてる人もいるが、結局再起動するしか
ないので、Yesで問題ない
### ここで問題（でも解決はもう少し後）
なんかpythonでeasygopigo3をimportするとエラーになる
I2C_mutexのロードができないとか
はて、前回はこんな事起きた記憶がないのだが
### Scratchのインストール
再起動後、または再起動させなかった場合には以下のコマンドでScratchもインストールする
`sudo bash /home/pi/Dexter/GoPiGo3/Install/install_scratch.h`
### 問題の解決
ここで、解決

    /home/pi/Dexter/lib/Dexter/script_tools
    sudo bash ./install_script_tools.sh --install-python-package --use-python3-exe-too --system-wide

/home/pi/Dexter/lib はScratch環境のインストールで作成されるので、それまで待てばOK
自力でビルドしてもいいが、libffi-devのインストールなども必要
ちなみに、デスクトップに作成されたScrachはsudoがないので全然モータが動かなかった
# 動作確認
git したフォルダにいくつかのサンプルがあるので試してみる。
## まずはやっぱりモーター制御
`cd /home/pi/Dexter/GoPiGo3/Software/Python/Examples/`
`sudo python Motor.py`
前進と後退を繰り返せばOK
## GoPiGo3ボード上のLEDの点灯
サンプルあるのかなぁ
    
    import time
    import easygopigo3 as easy
    
    gig = easy.EasyGoPiGo3()
    
    for i range(100):
        easy.open_eyes()
        time.sleep(0.5)
    
        easy.close_eyes()
        easy.open_left_eye()
        time.sleep(0.5)
    
        easy.close_eyes()
        easy.open_right_eye()
        time.sleep(0.5)
    
        easy.close_eyes()
        time.sleep(0.5)
選択範囲テキストをTrelloにカード作成したかった1(Trelloにカードを投稿するコマンドを作るまで)

# はじめに
普段Trelloにメモ書きすることが多いのですが
メモしにTrelloを開くたびに他に意識を取られて集中力が切れてしまっているので、開かずしてカードを登録したくなったのでちょろちょろ手順を備忘がてらメモしようかと。

目標としては
1 コマンドでユニークなボード、リストにカード登録したい(今回はここまで)
2? 既存のリストを表示したい
3? コマンドで任意のリストにカードを登録したい
4? macにて選択範囲のテキストをショートカットでカード登録したい

リッチさは最初は置いておいて、今回は１まで。

# 目標
- 今回の目標
    - ユニークなボード、リストにカードを作成する

# やったこと
## 必要な情報を取得（APIKey, token）
- 以下、Trelloにログインした状態で進める。

### APIKeyの取得
https://trello.com/1/appKey/generate
にアクセス。
そしたらキーって書いてあるところメモ。
今回はAPIKeyの方しか使わないのでそっとしておきます。
（API:Application programing interface, おそらくwebAPIと呼ばれているものは、ここを叩けばこうなるよっていう確実性のある機能を指していて、それを今回のようにhogehogeして利用できる、みたい。認証方法とか、OAuthとかはまた今度メモする。）

### Tokenの取得
- 期限無制限でRead/Write権限のついたトークンを取得します

https://trello.com/1/authorize?key=<取得したAPIKey>&name=<アプリケーションの名前（任意）>&expiration=never&response_type=token&scope=read,write

にアクセス。そしてメモ。

### curlで必要な情報を取得
#### 準備(curl, jq のinstall)
HTTPリクエストをTrelloに実際に飛ばして、必要なボードだとかリストだとかのIDを取得する。レスポンスがjson形式で返ってくるのですがそのまま見ると見にくいのでjqをinstall。

- curl
    - もともと入ってた。そのままでGET, 今回はカード登録でPOSTもするので-Xつかったり。
    - https://qiita.com/yasuhiroki/items/a569d3371a66e365316f
    - ここで知った後、仕事でもcurl使えると楽なことがあったのでこういうの含め今後細々メモしていきたい。。。

- HomeBrew
    - ついこの間mojaveにアップデートしてからそっとしておいたためにHomeBrewからのinstallとなりました。。。もう少しプログラミングやらの頻度を上げたい、、、
    - https://brew.sh/index_ja

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
- jq
    - 業務でも使い始めました。ありがてぇ。

```
brew install jq
```

- 送信先のボード、リストの作成(事前に作成しておく必要があります)
    - 今回は次のようなボードを作成しました。
        - ボード : サンプルボード
        - リスト : コマンドで送信したよリスト

#### 取得

- 練習がてらまずはボードリストを取ってきましょう。
    - UserName : trelloで使っている@〜〜の〜〜部分
    - APIKey : さっき取得したもの
    - Token : さっき取得したもの

```
curl "https://trello.com/1/members/<UserName>/boards?key=<APIKey>&token=<Token>"
```
多分すんごい色々返ってきた上めっちゃ見にくいのでfilterをかけ、ありがたいjqさんを使いましょう。

```
curl "https://trello.com/1/members/<UserName>/boards?key=<APIKey>&token=<Token>&fields=name" | jq
```

↑見切れてますが末尾あたりが変わっています。
そうすると次のような出力が得られるはず。

```
[
  {
    "name": "Trelloへようこそ",
    "id": "aaaaaaa"
  },
  {
    "name": "サンプルボード",
    "id": "xxxxxxx"
  },
]
```

idは"aaaaaaa"と"xxxxxxx"に変更してしまいました。多分それなりに長い奴が出力されているはず。
こんな感じで以下curl, jqを用いていきます。


- ターゲットのボードにあるリストを取得します


```
curl "https://trello.com/1/boards/<BoardのID(上では"xxxxxxx"に当たる)>/lists?key=<APIKey>&token=<Token>&fields=name" | jq
```

そうすると次の感じの出力があるはず

```
[
  {
    "id": "ccccccc",
    "name": "コマンドで送信したよリスト"
  }
]
```

上でも記述しましたが、ボード、リストは事前に作成しておく必要があります。

#### よし！カードを投稿しよう！
上のリストのIDを取得できたところで、必要な情報は揃いました！
なのでカードを投稿しましょう！

```
curl -X POST "https://trello.com/1/cards?key=<APIKey>&token=<Token>&idList=<先ほど取得したListのID（上の"ccccccc"に当たる）>" -d "name=テストのカードだよ"| jq
```

これで、「テストのカードだよ」カードが作成されているはずです。多分。

やったね、というわけで後日macのショートカットに登録することにして、一旦ここまでとします。

お疲れ様でした。
CpawCTF Q.10 writeup

まず、画像の情報を見る。
Macだと、Finderで開いて、右クリック→情報を見る→詳細情報→緯度、軽度から、緯度経度を獲得し、GoogleMapで見る。
https://www.google.com/search?q=31°%2035'%202.76"%20N%20130°%2032'%2051.726"%20E
https://www.google.com/maps/place/甲突川/@31.5770972,130.552248,15z/data=!3m1!4b1!4m13!1m7!3m6!1s0x0:0x0!2zMzHCsDM1JzAyLjgiTiAxMzDCsDMyJzUxLjciRQ!3b1!8m2!3d31.5841!4d130.5477017!3m4!1s0x353e60b1aab2f5bb:0xc6f56ec334bd44ab!8m2!3d31.5770623!4d130.5611463
読み方を、検索すると、出てくる。
入力方法に少し気をつけて、flag獲得。
例外を使うときの条件についてまとめ

# 概要

例外と返り値でBoolean型を返すのとどう使い分けんの？が疑問だったので、まとめることにした。

# 前提

そもそも例外の方針にも種類があることを知っておくことが大切らしい。
検査例外。

# そもそも例外とは

> 外部的、または内部的な要因により、防ぎきれないエラーが発生する可能性がある

こういう箇所についてその状態になってしまった時の対処として生まれた概念である。


# 例外を用いるパターン

- 自分ではコントロールできない要素を持ってエラーが起こりうる場合

例えば

1. DBの負荷が高くなりすぎてアクセスができない場合
2. 通信ができない場合
3. ブラウザ自体がうまく働いていない場合

などなど、プログラムの実装による原因だけでなく、外部的な要素も絡んでくる場合に
大体の場合は例外を用いることとなる。


# 内容

> 例外は呼び出す側が契約を履行したが、呼び出される側が契約を履行できなかった場合に、投げるもの
>   #java_ja より

また、もう一つ考慮すべき内容が技術的な例外とビジネスロジック的な例外である。
技術的な例外とは、ネットワーク障害、DBの接続不良などによるもの。

ビジネスロジック的な例外とは、元々の考慮になかった状態、条件などが、
メソッドの処理に入ってきた場合などがそれに当たると言える。

# 参考

参考にさせていただきました。ありがとうございました。

[公式ドキュメント - php.net - 例外(exceptions)](http://php.net/manual/ja/language.exceptions.php)
[SlideShare - 例外設計における大罪 - Takuto Wada さん](https://www.slideshare.net/t_wada/exception-design-by-contract)
[エラー設計についての参考 - @yodatake さん](https://qiita.com/yodatake/items/9440ffcb8848abadfafa)
[PHPにおける例外クラスの設計考察](http://blog.tojiru.net/article/455279557.html)
[例外処理の指針 - @tassi-yuzukko さん](https://qiita.com/tassi-yuzukko/items/ba8381c0edd34f717968)
[契約による設計から見た例外 - @Kokudori さん](https://qiita.com/Kokudori/items/2e4bd32abf7abea3186f)
[例外 Advent Calendar 2014](https://qiita.com/advent-calendar/2014/exception)
[PHPの例外 - @koriym さん](https://qiita.com/koriym/items/17cfd1bbbaead1a2e5a9)
基本的なDjango 開発の流れ

環境
OS : macOS Mojave
Anaconda : python3.6.7
Django==2.1.5

**注意**
基本的に環境での前提で書いていくのでWindowsでは違った入力が必要になる場合があります。(主にTerminalコマンド)
あまり説明は書かないつもりなのでご了承ください。
(以前投稿したチュートリアルのページを参考に貼るので必要であればそちらを確認してください)

Djangoの準備の予備知識・準備についてはこちら([第1回](https://qiita.com/yuta_rug/items/5445ec20b820b81b622c))

#1.プロジェクトスタートと基本設定

```:Termanial
mkdir project_name
cd project_name
django-admin startproject config .
mkdir templates
mkdir static
```
```python;config/settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_NAME = os.path.basename(BASE_DIR)
]
:
:
:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
:
:
:
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
:
:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
```

**参考** [第2回](https://qiita.com/yuta_rug/items/95f10dc79e26dfb6d0a8)

#2.アプリの作成
```:Terminal
python manage.py startapp app_name
```
```python:config/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_name',
]
```
**参考** [第3回](https://qiita.com/yuta_rug/items/47051ee341068585c615)

#3.アプリ開発の流れ
1.モデルの作成 (app_name/models.py)
2.管理者ページの作成 (app_name/admin.py)
　スーパーユーザー(管理者)の作成
3.アプリ直下にurls.pyの作成

```:Terminal
touch app_name/urls.py
```
```python:config/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('app_name.urls'))
]
```
```python:app_name/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
]
```

4.ビューの作成(app_name/views.py)
5.ビューをURLパターンへ登録(app_name/urls.py)
6.ビューに応じたテンプレート(.html)の作成
　base.htmlを始めに作成しそれを拡張していくと簡単
7.作り込み
　4~6の作業を繰り返す
　必要であればフォームの作成(app_name/forms.py)
8,CSSとBootstrapなどによる装飾

**参考**
[第4回 モデルと管理者ページ](https://qiita.com/yuta_rug/items/e8e3f9202081278dbb95)
[第5回 URLとビューとテンプレート](https://qiita.com/yuta_rug/items/cfc5cd64df8f2c23e85d)
[第6回 CssとBootstrap](https://qiita.com/yuta_rug/items/f4b2e7641998b68a1a6e)
[第7回 テンプレートの拡張](https://qiita.com/yuta_rug/items/b0119b8ea3f952d5afcc)
[第8回 フォームの作成](https://qiita.com/yuta_rug/items/7d6fb0590731a01df4d4)
[第9回 ログイン状態の有無によって表示を変える](https://qiita.com/yuta_rug/items/4671506f047eba5fb90a)
Django Webアプリ作成(9) リンクの表示有無

環境
OS : macOS Mojave
Anaconda : python3.6.7
Django==2.1.5

#ここまで
前回まででアプリは、ほぼほぼ完成しています。
今回は、管理者ユーザーのみに編集リンクを表示するようにします。

#htmlの編集
base.htmlの

```html:base.html
<a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
```
部分を以下のように編集

```html:base.html
{% if user.is_authenticated %}
    <a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
{% endif %}
```
また、post_detail.htmlの

```html:post_detail.html
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>
```
部分を以下のように編集

```html:post_detail.html
{% if user.is_authenticated %}
     <a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span></a>
{% endif %}
```
これで一度実行してみましょう!
もしまだ、アイコンが見えている場合は一度管理者ページ(/admin)に行きログアウトしてみましょう。
ログイン状態でないと投稿・編集ボタンが見えないと思います。

#終わりに
以上で長く書いてきた基本的なDjangoの使い方は終わりです。
お疲れ様でした。