OmniAICreator/Qiita-1.07M huggingface dataset:
俺でもわかるterraform resource aws_rds_clusterのengine早見表2019.06版

俺です。寺フォーム原人です。

寺でAuroraガンガン立ててガンガンしたいときがあります。
Aurora MySQL 5.6.10aだけがサポートされていた時代から既に数世紀経過しているようなものでございまして
今ではMySQL5.6, MySQL5.7, PostgreSQLエンジンがサポートされています。
俺みたいな猿人がどのEngineでエンジョイしたいんだっけっていう俺のために早見表をメモしてしておきますが

[ドキュメントから抜粋するとこーゆーことらしく](https://www.terraform.io/docs/providers/aws/r/rds_cluster.html)

そしてさらに[最高の解説がこちら](https://elastic-infra.com/blog/terraform-aurora-mysqlv2-best-practices/)にあるので載せます。


```
engine - (Optional) The name of the database engine to be used for this DB cluster. Defaults to aurora. Valid Values: aurora, aurora-mysql, aurora-postgresql
```

# エンジンバージョン早見表にするとこーなります

|No|Database Engine|engine|engine_version|
|---|---|---|---|
|1|MySQL 5.6|aurora|5.6.12a|
|2|MySQL 5.7|aurora-mysql|5.7.12|
|3|PostgreSQL 9.6|aurora-postgresql|9.6|
|4|PostgreSQL 10.7|aurora-postgresql|10.7|

enjoi.
tinyMCE で勝手にtableタグに付いてしまう border 属性を除去したい


### 確認バージョン

TinyMCE 4.9.2

### 実施内容

参考：
https://www.tiny.cloud/docs/plugins/table/#table_default_attributes

ソースを見ると、table プラグインの Setting.ts で defaultAttributes 内で border 属性指定していた。
初期化時に、 table_default_attributes で定義そのものを上書きしてしまう。

```
  tinyMCE.init({
    ...
    table_default_attributes: {
        // border: '1', 
    },
...
```
インタビューに役立つやつ

https://www.slideshare.net/takaumada/good-hypothesis-for-lean-startup


https://www.slideshare.net/takaumada/lean-customer-development-lean-startup-update-2015

https://www.slideshare.net/takaumada/lean-customer-development-lean-startup-serires

https://hatlush.com/article/%E3%83%AA%E3%83%BC%E3%83%B3%E3%83%BB%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E8%AA%B2%E9%A1%8C%E4%BB%AE%E8%AA%AC%E6%A4%9C%E8%A8%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%BA/

https://www.finchjapan.co.jp/3168/
12ステップで作る 組込みOS自作入門の開発環境をDockerで構築(gcc7系)

# はじめに
　組み込み業務で使用しているクロスコンパイル環境(Ubuntu14.04)がサポート期間終了のためUbuntu18.04へ移行しました。その際にLinuxを実行する仮想環境もDockerに移行し、gccやbinutilsのバージョンアップを行いました。
　その際に得た知見を基に、組み込み学習教材として有名な[12ステップで作る 組込みOS自作入門](http://kozos.jp/books/makeos/)の開発環境をDocker上で構築し、さらにgccやbinutilsのバージョンも書籍で指定されているバージョン(gcc-3.4.6, binutils-2.19.1)からgcc-7.3.0, binutils-2.30に更新して動作確認を行いました。
　これから組込みOS自作入門を行う方や復習をする方のお役に立てればと思います。
　
## 動作確認ついて
 既にgcc-3.4.6, binutils-2.19.1で開発していたkozosとbootloaderをgcc-7.3.0, binutils-2.30で再ビルドして基板に書き込みました。それからboot、kozosの起動、echoコマンドの確認を行いました。よって、各章で少しずつ開発されるbootloaderとkozosの全ての動作確認を行ったものではないことをご了承ください。

# 動作環境
+ ホストOS 
    + Windows10
+ 仮想環境
    + Docker for windows (version 18.09.2, build 6247962)
+ ゲストOS
    + Ubuntu 18.04
+ h8300 Cross Compiler
    + gcc-7.3.0
    + binutils-2.30.0

# 環境構築
　Dockerfileをgit clone して、docker buildするだけです。作成したDockerfileは[ここ](https://github.com/kjmatu/12step_self_embedded_os_dev_enviroment)にあります。
　以下にリポジトリからDockerfileをcloneしてdocker runするまでのコマンド例を示します。

``` bash
>> git clone https://github.com/kjmatu/12step_self_embedded_os_dev_enviroment
>> cd 12step_self_embedded_os_dev_enviroment
>> docker build . -t h8300:ubuntu　<- ファイルダウンロードやコンパイルで時間がかかります
>> docker run -it --rm --name kozos -v absolute_path_to_kozos_dir:/home/kozos h8300:ubuntu /bin/bash <- kozosを開発しているフォルダを/home/kozosにマウントして起動する
root@7c3849afbc62:/home#
root@7c3849afbc62:/home# h8300-elf-gcc -v
Using built-in specs.
COLLECT_GCC=h8300-elf-gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/h8300-elf/7.3.0/lto-wrapper
Target: h8300-elf
Configured with: ./../gcc-7.3.0/configure --disable-libstdcxx-pch --disable-libssp --disable-nls --disable-shared --disable-threads --enable-gold --enable-languages=c --enable-lto --enable-sjlj-exceptions --prefix=/usr/local --target=h8300-elf --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local --disable-bootstrap
Thread model: single
gcc version 7.3.0 (GCC)
root@7c3849afbc62:/home# h8300-elf-as -v
GNU assembler version 2.30 (h8300-elf) using BFD version (GNU Binutils) 2.30
```

# bootloaderの書き込み
　ビルド環境は、Docker上で構築できたのですがDocker for windowsではシリアルポートの認識がDocker上でできないようなのでビルドしたbootloaderの書き込みはWindowsかWSL上のLinuxから行います。
　そのため書籍には書き込み時に行っているobjcopyをビルド時に行うように修正する必要があります。それ以外は書籍に指示された方法でビルドしたオブジェクトを書き込みます。
　結局は、ビルドをDocker上のUbuntuで行い、Bootの書き込みをWindowsかWSLで行うという統一性のない手続きになってしまっています。どなたか、Docker for windowsでデバイスを認識する方法をご存知ありませんか？

# 最後に
　注意として、この環境はあくまでgcc7系でH8300のクロスコンパイラが動き、kozosの動作が確認できたという実験的な環境です。書籍として学習する際に余計なエラーが出る可能性がありますのでまずは書籍に指示されている環境での学習をおすすめします。

# 参考
[DockerでH8/3069Fビルド環境構築](https://qiita.com/otmb/items/dcba3f76551902f28bfb)
【Java】エラトステネスの篩で素数を求める（その2）

# はじめに

[前回の投稿](https://qiita.com/nkojima/items/c20686f7b126809ee6e1)のコードは、@swordone さんからの指摘で「リストを全探査して割り算して篩い落とす」という高コストなコードだと判明しました。
そこで、@swordone さんから頂いたヒントを基にして、コードを大幅に直してみました。

# コード

前回のコードとの違いは以下の通りです。

* 探索リストを`List<Integer>`から`boolean[]`に変更。
 * 「2から上限値までのリスト」の代わりに、「2から上限値までの添え字のリスト」としました。
 * 最初に配列の全要素を素数扱い（true）としておき、篩い落とす時に素数以外の値（false）としました。
* 「リストを全探査して割り算して篩い落とす」のではなく、「篩い落とす値の要素にランダムアクセスして篩い落とす」形に変更。
 * for文のインクリメントを「1ずつ増加」ではなく、「現在の素数（firstNum）の値ずつ増加」させることで、現在の素数（firstNum）の倍数だけを篩い落としています。

```java:PrimeNumberFinder.java
static void printPrimeNumbers2(int maxNumber) {

	// ステップ1：「2から上限値までの整数」を探索リストに入れる。
	boolean[] targetNumbers = new boolean[maxNumber + 1];
	Arrays.fill(targetNumbers, true);
	targetNumbers[0] = false;
	targetNumbers[1] = false;

	// 素数リスト
	List<Integer> primeNumbers = new ArrayList<Integer>();

	int sqrt = (int) Math.sqrt(maxNumber);

	// ステップ3：探索リストの先頭の値が、引数の平方根に達するまでふるい落とし操作を続ける。
	for(int i=2; i<=sqrt; i++) {
		// ステップ2：探索リストの先頭の数を素数とし、その倍数を探索リストから篩い落とす。
		// ※この時、既に篩い落とされた数（false）は除外する。
		int firstNum = i;
		if (targetNumbers[i]) {
			for (int j=i*firstNum; j<targetNumbers.length; j+=firstNum) {
				targetNumbers[j] = false;
			}
		}
	}

	// ステップ4：探索リストに残った値を素数リストに移して処理終了。
	for (int i=2; i<targetNumbers.length; i++) {
		if (targetNumbers[i]) {
			primeNumbers.add(i);
		}
	}

	// 素数の表示
	System.out.println(primeNumbers.stream().map(pNum -> pNum.toString()).collect(Collectors.joining("\t")));
}
```

# どれだけ高速化したか？

* 前回のコードと比べて、10倍以上高速化していました。
* ギレン総帥じゃなくても「圧倒的じゃないか、我が軍は。」と言いたくなるほどの差です。

||上限値が$10^2$|上限値が$10^3$|上限値が$10^4$|上限値が$10^5$|
|---|---|---|---|---|
|前回のコード|54ms|55ms|61ms|102ms|
|今回のコード|0ms|1ms|1ms|9ms|

# まとめ

* 今回のコードを通じて、「計算量」を考慮した開発が重要だと再認識させられました。
 * 今回のコードでも、まだまだ改善できるポイントはあると思いますが...
* @swordone さん、色々とヒントを頂き有難うございました。
Azure VM逆引きメモ

必要に迫られたAzure VMの逆引きメモです。

## AzureVMのWindows 10 Pro 1809、Windows Server 2019の日本化
**手順**

* 言語パックの準備(ISOファイルはMSDNからダウンロード)
* 言語パックをVMへコピー
* システムの日本語化
* UIの日本語化 

**言語パック**

```:mu_windows_10_language_pack_version_1809_updated_sept_2018_x86_x64_arm64_dvd_f17c743a.iso
\x64\langpacks\Microsoft-Windows-Client-Language-Pack_x64_ja-jp.cab
```

```:mu_windows_server_2019_language_pack_x64_dvd_679192ff.iso
\x64\langpacks\Microsoft-Windows-Server-Language-Pack_x64_ja-jp.cab
```

**システムの日本語化**

```C#
$LpTemp = "C:\Microsoft-Windows-Client-Language-Pack_x64_ja-jp.cab"
Set-WinUserLanguageList -LanguageList ja-JP,en-US -Force
Add-WindowsPackage -PackagePath $LpTemp -Online
Set-WinDefaultInputMethodOverride -InputTip "0411:00000411"
Set-WinLanguageBarOption -UseLegacySwitchMode -UseLegacyLanguageBar
Remove-Item $LpTemp -Force
Restart-Computer
```
**UIの日本語化**

```
Set-WinUILanguageOverride -Language ja-JP
Set-WinCultureFromLanguageListOptOut -OptOut $False
Set-WinHomeLocation -GeoId 0x7A
Set-WinSystemLocale -SystemLocale ja-JP
Set-TimeZone -Id "Tokyo Standard Time"
Restart-Computer
```

**ようこそ画面と新しいユーザーアカウントの日本語化**
ここまでの手順では"ようこそ画面"と"新しいユーザーアカウント"は
日本語化されないのでコマンドでは無くUIから設定を変える必要がある。

![hm000004.png](https://qiita-image-store.s3.amazonaws.com/0/107413/0715e0fc-4d70-a5b9-c3dc-eb11baf8fb5e.png)

* [コントロールパネル]→[地域]
* [管理]→[設定のコピー(O)...]
* [現在の設定のコピー先：]で"ようこそ画面とシステムアカウント(W)"、"新しいユーザアカウント(N)"にチェックを入れて[OK]ボタンをクリック


**参考**
[【保存版】できるだけ楽に、Windows Server 2016 を日本語化して利用する方法
](https://qiita.com/akiyoshi-t/items/76eb446cc8f8ec360e00)
【初学者必見】プログラミングをするなら必須の設定をシェアハピ【Mac】

## はじめに

国内最大級の某プログラミングスクールでインターンとして働いておりました。
※現在は東京でフロントエンジニアとして働いています。

受講生の方の多くは、「これからプログラミングを始めるためにMacを買った」という方が多く、Macの使い方から学習される方が多い印象です。

メンターとして個別にアドバイスするよりも、より多くの方と共有したいと思い、記事にしました。

Macの基本的な使い方/設定を理解することで、プログラミングを効率的に学習することが出来ます。

システム環境設定は`デスクトップ左上のAppleマーク`から`システム環境設定`をクリックします。


## ディスプレイ
####Night Shift
<img width="669" alt="スクリーンショット 2019-03-18 12.15.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/335670/a87b61df-cefe-bc36-d90e-f2c28f6bfc1f.png">
カスタムで24時間オンにしておきましょう。

画面のトーンが暖色系になり、目の疲れが低減します。画面の暖かさは好みに設定しましょう。
最初は違和感を感じるかもしれませんがすぐに慣れます。最初の違和感よりも大切なのは、目を疲れさせない事です。慣れてきたら徐々に暖かさを上げていきましょう。スマホでも同じ様に設定できるのでしておきましょう。

ちなみに僕は暖かさ95%くらいです。

##キーボード
####キーのリピート/リピート入力認識までの時間
<img width="656" alt="スクリーンショット 2019-03-18 12.20.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/335670/74ba615f-b1b4-c975-b552-e46c454526b2.png">

それぞれMAXにしておきましょう。
キー入力が早くなり、作業効率がUPします。
むしろこれがデフォルトだと思いましょう。


##トラックパッド
<img width="662" alt="スクリーンショット 2019-03-18 12.27.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/335670/fab47c24-3737-7253-f8f2-3fef3345a6c0.png">

####軌跡の速さ
MAXにしておきましょう。
最速、俊敏スタイルで作業効率をUPさせましょう。
むしろこれがデフォルトだと思ってください。

####フルスクリーンアプリケーション間をスワイプ
![画面遷移.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335670/643b7fa1-1a27-3baf-b866-145c9e4b4123.gif)
例えばデスクトップ1でブラウザを開き、デスクトップ2でエディタを開いて、その間を3本指または4本指のスワイプで移動する事が出来ます。画面領域が広がり、生産性向上に繋がります。

個人的には4本指派です。

![Desktop作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335670/9d72f52f-71d9-5db9-7a88-5b0f595d55e5.gif)
Macには新しくデスクトップを作ったり消したり、デスクトップの配置を変える事も出来ます。

この概念を知らない人(昔の僕)はデスクトップが散らかってるマンになりがちです。

####Mission Control
![MissonControl参考.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335670/78c69d78-8587-efed-bff6-7143894fc7bf.gif)

3本指(4本指)で下から上にスワイプすると、開いてるアプリケーションとデスクトップの一覧を表示する事が出来ます。現在開いているアプリケーションやデスクトップの位置関係を把握するのに便利です。
開いたままで使ってないアプリケーションやファイルは都度、整理しましょう。
個人的には3本指派です。

####タップでクリック
トラックパッドを押し込まなくてもクリックできます。

####ページ間をスワイプ
ブラウザ間をスワイプで戻ったり、進んだりできます。
設定しておきましょう。


##Dock
<img width="664" alt="スクリーンショット 2019-03-18 12.33.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/335670/e453144d-0e8d-098d-696c-99d2822e1ccd.png">

####Dockの表示・非表示
![Dock表示.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335670/a912a56e-43fd-bb69-0b6a-2c151fae105a.gif)

デフォルトでDockは非表示にしておきましょう。
画面領域が広がるので、生産性向上に繋がります。
また、Dock自体の配置やサイズを変えたり、拡大表示出来たりします。
表示する時の拡大表示は便利なので、設定しておきましょう。
オススメは、Dockのサイズはデフォルトよりも小さくし、拡大をお好みで設定してあげると使いやすいです。
色々試してみて、好みの設定にしましょう。

####Dockの整理
普段使わないアプリケーションはDockから削除しましょう。
また使いたくなった時にいつでも戻せるので大丈夫です。

---
以上でMacの環境設定は終わりです:raised_hands:
<br />
【VisualStudio】新規プロジェクト製作時、ターゲットプラットフォームが選択できないときの対処法

## 問題発生
<img width="900" alt="スクリーンショット 2019-03-15 午後1.05.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/212160/eea77968-e53e-353c-9ef4-c54bba0a9e3f.png">
ネイディブアプリを制作しようと新規プロジェクト制作しようとしたところ、ターゲットプラットフォームのチェックボックスがグレーになっていて選択できない！

##解決法
インストーラをもう一度実行する
<img width="912" alt="スクリーンショット 2019-03-15 午後1.13.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/212160/2dc80912-6e96-7b85-1ffd-16e87150b047.png">
チェックボックスが外れた状態のiOS,Androidの項目を発見
チェックしてインストールを開始します。

## 結果
<img width="1013" alt="スクリーンショット 2019-03-15 午後1.58.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/212160/77bb0227-fb20-bc80-c0c5-fd940912f5e6.png">
無事に選択できるようになりました✌

## 最後に
解決方法は簡単でしたが、意外と詰まってしまいました。
同じ症状に陥ってしまった方の参考になれば幸いです。
最速でLet's Encryptの証明書をGETする方法

# 前提

1. 更新したいドメインがRoute53で管理されている
2. Route53の操作権を持つIAMロールを割り当てたEC2で作業する
3. EC2でDockerが使える

# 手順

下記コマンドを実行するだけ。

```bash
sudo docker run -it --rm -e AWS_HOSTED_ZONE_ID=(対象ドメインのHosted Zone ID)  -v $PWD:/app xenolf/lego --path=/app --email="(メールアドレス)" --domains="(対象のドメイン)" --dns route53 run
```

証明書がカレントディレクトリのcertificatesディレクトリ以下に保存される。
よく使用される正規表現

今、**正規表現**（以下は**Regex**)はEmail確認やURL確認といったバリデーションの目的でよく使われています。

#Regex規則のCheatsheet
<img width="728" alt="Screen Shot 2019-03-17 at 11.55.00 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/332720/0252dd87-5735-19a1-04e3-e7f028e104f0.png">

#よく使用されるRegex
**数字**

- [整数](https://regex101.com/r/Gj0F4z/1)：```/^\d+$/```
- [少数](https://regex101.com/r/Gj0F4z/2)：```/^\d*\.\d+$/```
- [整数＋少数](https://regex101.com/r/Gj0F4z/3)：```/^\d*(\.\d+)?$/```
- [負数、正数＋少数](https://regex101.com/r/Gj0F4z/4)：```/^-?\d*(\.\d+)?$/```
- [整数＋少数＋分数](https://regex101.com/r/Gj0F4z/5)：```/[-]?[0-9]+[,.]?[0-9]*([\/][0-9]+[,.]?[0-9]*)*/```

**文字と数字**

- [空白なし](https://regex101.com/r/Gj0F4z/6)：```/^[a-zA-Z0-9]*$/```
- [空白有り](https://regex101.com/r/Gj0F4z/7)：```/^[a-zA-Z0-9 ]*$/```

**Email**

- [Email](https://regex101.com/r/Gj0F4z/8)：```/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})*$/```

**パスワード**

- [パスワード](https://regex101.com/r/Gj0F4z/9)(1小文字、1大文字、1数字、長さは8文字以上にする必要があります)：```/(?=(.*[0-9]))((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.{8,}$/```

**ユーザー名**

- [名前](https://regex101.com/r/Gj0F4z/10)(アンダーライン、ダッシュ、３から１６文字までの長さを持つ名前)：```^[a-z0-9_-]{3,16}$```

**URL**

- [http(s)プロトコルのみ](https://regex101.com/r/Gj0F4z/11)：```/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#()?&//=]*)/```
- [任意プロトコル](https://regex101.com/r/Gj0F4z/12)： ```/(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/```

**日付**

- [YYYY-MM-dd](https://regex101.com/r/Gj0F4z/13): ```/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/```
- [dd-MM-YYYY(dd.MM.YYYY, dd/MM/YYYY)](https://regex101.com/r/Gj0F4z/14): ```/^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/```

**Stringで複製検索**

- [複製検索](https://regex101.com/r/Gj0F4z/15): ```/(\b\w+\b)(?=.*\b\1\b)/```

**電話番号**

- [国際番号](https://regex101.com/r/Gj0F4z/16): ```^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$```

*参照*: https://digitalfortress.tech/tricks/top-15-commonly-used-regex/
Oculus Go で Bluetooth イヤホン・ヘッドフォンを使う

Oculus Go には有線イヤホンでよく使う、ステレオミニピンジャックがついています。
原則こちらを使うことになるのですが、お気に入りのイヤホンやヘッドフォンを使いたい！でもそれは Bluetooth 接続！ということもあるかと思います。

方法としては大きく分けて2つあります
1.トランスミッターを経由する
2.Oculus Go にペアリングする

トランスミッター経由はお手軽ですが、持っていない場合は別に購入しなければなりません。
なので、ペアリングのほうが良いのですが、これがちょっと面倒。
とはいえ必要な人もいると思うので、手順を残しておきます。


# １）必要なもの
Oculus Go
adbが使えるPC

以下は必須ではないですが、Bluetoothペアリングにコードが必要な場合は
Bluetooth キーボード

# ２）adbとは？
PC（Windows、Mac OS 共に）から Android 端末をアレコレするものです。
Oculus GO の OS は Android がベースとなっているので、adb が使えるのです。
残念ながら、Windows ならコマンドプロンプト、Mac OS ならターミナルでの操作が必須となります。
詳しくは下記を参照してください。
・[Windows向け](https://sp7pc.com/google/android/34263)
・[Mac OS向け](http://monozukit.hatenablog.com/entry/2017/01/29/mac%E3%81%A7androidSDK%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%E3%80%90path%E3%82%92%E9%80%9A%E3%81%99%E3%81%BE%E3%81%A7%E3%80%91)

２）手順
adbからOculus GO の Bluetooth 設定画面を呼び出します。
下記コマンドをターミナルなどで打ちます

```
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.bluetooth.BluetoothSettings
```

# ３）Oculus Go に Bluetooth機器をペアリング・登録
ペアリング時にコードが必要な場合は Bluetooth キーボードを先に登録する必要があります。
なぜなら、Oculus GO の Bluetooth設定画面では、ソフトキーボードが使えないからです。

コードが不要の場合は、Oculus GO のリモコンだけでペアリングできます。
JSFのdataTableで表示位置を設定

JSFのdataTableで、各カラムのstyleClassで表示位置を設定しても反映されません。
ということで、なんとかして各カラムの表示位置を設定する方法をメモ。
方法自体は簡単で、dataTableにcolumnClasses要素を追加して、先頭のカラムから順番に表示位置を設定すればいいらしい。

```ruby:xhtml
<h:dataTable value="#{Test001CBb.db.listDetail}" var="m" columnClasses="center,right,,center">
  <h:column>
    <f:facet name="header">1列目</f:facet>
    <h:outputText value="#{m.first}" />
  </h:column>
  <h:column>
    <f:facet name="header">2列目</f:facet>
    <h:outputText value="#{m.second}" />
  </h:column>
  <h:column>
    <f:facet name="header">3列目</f:facet>
    <h:outputText value="#{m.third}" />
  </h:column>
  <h:column>
    <f:facet name="header">4列目</f:facet>
    <h:outputText value="#{m.fourth}" />
  </h:column>
</h:dataTable>
```

上記の例だと、
　1列目：中央寄せ
　2列目：右寄せ
　3列目：左寄せ（デフォルト）
　4列目：中央寄せ
になります。
あんまり綺麗ではないのですが、ひとまずこれで表示位置は設定できるので、参考までに。
numpyでの行列とベクトルの結合に関するメモ

#何回も間違えたので自分用にメモ

numpyでのデータの形成で同じミスを何回もしたのでメモ

ベクトルとベクトルの結合は問題なくできる

```py
v1.shape
#(2,)

v2.shape
#(3,)

v = np.hstack(v1,v2)

v.shape
#(5,0)
```

行列と行列もできる

```py
v1.shape
#(3,2)

v2.shape
#(3,4)

v = np.hstack(v1,v2)

v.shape
#(3,6)

```

行列とベクトルの場合も同じだろうたかをくくると
ValueError: all the input array dimensions except for the concatenation axis must match exactly
で泣きを見るハメになる

その場合はreshapeでaxis=1に値を入れることで解決できる。つまり、ベクトルの列数を1であると明示的に書く。

```py
v1.shape
#(3,2)

v2.shape
#(3,)

v2 = v2.reshpe(v2,1)

v2.shape
#(3,1)

v = np.hstack(v1,v2)

v.shape
#(3,3)
```


僕はこの内容で三回もつまずきました。同じミスした君は僕の仲間だね。


参考URL
https://deepage.net/features/numpy-stack.html
SourceTreeで重いリポジトリの最新のコミットだけcloneする

# はじめに
重いリポジトリをそのままcloneしようとすると、時間がかかります。下手すると数時間かかったりして、回線が貧弱だとタイムアウトしてしまったりします。そうなると、最初からやり直し・・・

とりあえず、最新のコミットさえあればよくて、それ以前のコミットは不要ということであれば、**shallow clone** をすればよいです。過去のコミットはダウンロードしないので、その分、通信量が少なくなります。

SourceTreeだとGUIでできるので、その手順を忘れないうちに残します。

# SourceTreeで最新のコミットだけcloneする

SourceTreeを起動し、いつも通り Clone の画面を開き、リモートリポジトリのURLやローカルフォルダを指定します。

![SourceTree](https://qiita-image-store.s3.amazonaws.com/0/221845/8f5d7e72-138a-45a3-6645-dd2f1e1b5b1a.png)

`詳細オプション` をクリックすると、 `クローンの深さ` という項目が出てくるので、 `1` を入力します。
`クローン` ボタンをクリックすれば、 **shallow clone** が始まります。

# 仕組み
上記の操作は、Gitコマンドで言うと、

```bash
git clone --depth 1 （リモートリポジトリのURL）
```

に相当します。 `クローンの深さ` は、 `--depth` に対応しています。
ここの数値を `10` にすれば、最新の10個のコミットを取得できます。

# さいごに
これでタイムアウト地獄から解放されました！

以下の記事を参考にさせていただきました。ありがとうございます。

- [git リポジトリの最新の履歴だけを取得する shallow clone](https://qiita.com/usamik26/items/7bfa61b31344206077fb)
magitがインストールできなかった時の対応

### 背景

Emacs環境を25.2から26にアップデートしたタイミングで環境全体の見直しをかけた。

### 課題

Magitがcommitしようとするとエラーが出た。

### 対応方法

git-commitモジュールが古かったのが原因で動かなかった。
magitとgit-commitを一度削除して再インストールしなおしたらうまく動いた。

magitだけでなくsubmodule以下も再インストールするとよくなる場合がある。
全部 TypeSctipt で書こう！

こんにちは。
突然ですが、TypeSctipt って便利ですよね。

私は今まで数年間 JavaScript のまま書いていました。
（TypeScript も知っていたが、なぜ変換させてまで別言語で書くの？と思っていた）

半年前、異動先の部署で使われていた TypeScript を使うことに。
導入コストがそれなりにあるし、億劫な気分でした。

ですが現在、 TypeScript にメロメロです。

### TypeScript の何が良いのか
- JavaScript の拡張言語であり、 ECMAScript の実装に準拠している
    - async/await や const/let など、 JavaScript の知識で書ける
- JavaScript なのに型の恩恵が受けられる
    - 型の補完とか
    - 存在しないプロパティへの書き込みに対する警告とか
- Visual Studio Code という TypeScript を正しく完璧に使うためのツールが無料

JavaScript という無法地帯に降り立った天使。それが TypeScript :angel: 

### TypeScript がチームの生産性を向上させた話

現在、私の開発チームはバックエンドエンジニアが私を含め３名とフロントエンドエンジニアが１名いますが、
私がフロントエンド (React.js) を書いたり、
フロントエンドエンジニアがバックエンド (Node.js) を書いたりしています。

JavaScript より型が安全で補完も効くので手が出しやすく、
コードレビューもフレームワークや思想など、
**本質的な議論**になる事が多いです。

少しずつそれぞれの範囲を超えて仕事できるようになってきており、
ボトルネックなタスクに**リソースが集中**できて効率的です。

また、もう２名も元々 Java エンジニアでしたが、
チームにジョイン後**１ヶ月もかからず**新機能のコンポーネントを開発してくれました。
他言語からの開発の入りやすさも言うこと無しです。

バッチ処理などのスクリプトも JavaScript の真骨頂。
もちろん TypeScript で書いています。

もう Web サービスは**全部 TypeScript で書こう！**
AWS CloudFormationでデプロイしたAPI Gatewayが更新されない

## はじめに
ある特定のケースでデプロイの結果がAPI Gatewayに反映されない場合があり、原因はわからないが解決はできたので覚書

## 解決策
AWSコンソールから何も変更を加えず手動でデプロイのアクションをする

## 状況
1. CloudFormationのテンプレートにAPI GatewayのSwaggerファイルを読み込んでいる
- API Gatewayの`method.response.header.Access-Control-Allow-Origin:`のみ変更しデプロイする
- デプロイ完了後、確認するも設定が反映されていない

## 使用したテンプレートの抜粋
``` template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: ...
Resources:
  Api:
    Type: AWS::Serverless::Api
    Properties:
      StageName: dev
      DefinitionBody:
        Fn::Transform:
          Name: AWS::Include
          Parameters:
            Location: !Sub s3://${CfnBucketName}/${AWS::StackName}/src/api/swagger.yaml

```
``` swagger.yaml
swagger: "2.0"
info:
  version: "2018-09-04T22:25:14Z"
  title: "title"
basePath: "/dev"
schemes:
- "https"

paths:
  /token:
    options:
      consumes:
      - "application/json"
      produces:
      - "application/json"
      responses:
        200:
          description: "200 response"
          schema:
            $ref: "#/definitions/Empty"
          headers:
            Access-Control-Allow-Origin:
              type: "string"
            Access-Control-Allow-Methods:
              type: "string"
            Access-Control-Allow-Headers:
              type: "string"
      x-amazon-apigateway-integration:
        responses:
          default:
            statusCode: "200"
            responseParameters:
              method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
              method.response.header.Access-Control-Allow-Headers: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
              method.response.header.Access-Control-Allow-Origin:
                Fn::Sub: "'${AllowOrigins}'"
        requestTemplates:
          application/json: "{\"statusCode\": 200}"
        passthroughBehavior: "when_no_match"
        type: "mock"
```

## おわりに
今のところ2回同じ操作をして2回とも同じ現象になっている
リソースやメソッドの追加・削除では起きたことがないので、メソッドのプロパティの変更の場合に起きるんだろうか
気が向いたら調査するかも
Storybookについて簡潔にまとめる(part1)。

# はじめに
Vue.js(Nuxt.js)でプロジェクトを遂行していくと、たくさんのコンポーネントが作られていくと思います。そのコンポーネントを整理するうえで欠かせないのが、`Storybook`です。本記事と次回の記事で、Storybookの概要(本記事)と使い方(次回)について簡潔にまとめていきます。

※僕はよくVue.jsに使用しているので、「`Vue.js(Nuxt.js)でプロジェクトを遂行していくと`」と記載しましたが、コンポーネントを扱うReact等でもStorybookは使用できます。

# Storybookとは
Storybookは、UI開発環境を提供するツールのことです。アプリの操作ができて、開発面やテスト面を助けてくれます。コンポーネントのふるまいをテストしたり、コンポーネントを一覧にしてカタログ化できるようにします（以下、Storybookの画面）。

![storybook.png](https://qiita-image-store.s3.amazonaws.com/0/374967/670418ba-90a1-0724-4898-54c66b0cc4ac.png)


Storybookを使うとなにがいいか、以下を抑えておいてください。

+ **StorybookでUIコンポーネントのカタログを作ることができる**
+ コンポーネントのCSS、フォント、画像などのUIの見た目の確認
+ コンポーネントに公開しているプロパティを動的に変更して確認
+ APIの仕様やスタイルの仕様の確認
+ **エンジニアとデザイナーの協業によるコミュニケーションの活性化**

最後の「エンジニアとデザイナーの協業」っていうのはぶっちゃけいうと認識合わせみたいなところですかね。メールやSlackでやり取りするよりもわかりやすいかなと。

# 使い方
## インストール
最初はインストールから始めましょう。

```
$ npm install -g @storybook/cli
$ getstorybook -V #確認
```

## 導入
Vue.jsプロジェクトにStorybookを追加しましょう。

```
$ cd プロジェクトのルート
$ getstorybook # プロジェクトルートでコマンド実行
```
正常に完了すると、`.storybook`ディレクトリと`src/stories`ディレクトリがプロジェクトに追加されます。

また、package.jsonに`Storybook`タスクを追記しておきましょう。

```:package.json
"scripts": {
    "storybook" : "start-storybook -p 6006",
    "build-storybook" : "build-storybook"
},
..
"devDependencies" : {
    #Vue.js向けのStorybookモジュールを追記
}
```

## 動作
```
$ npm run storybook
```
`http:localhost:6006`でStorybookにアクセスできます。
<img width="1680" alt="aaaa.png" src="https://qiita-image-store.s3.amazonaws.com/0/374967/e1352db9-63c8-806e-f69c-92e3af9fb952.png">

※src/storiesに定義したファイルが追加されていきます。
一度、サーバを立ち上げておけばコンポーネントに変更がかかると、それを検知してStorybookのリロードが入ります。毎回コマンドから立ち上げなくてもいいので、効率的ですね。

# まとめ
part2(ストーリー実装編)で書いていきます。

# 参考資料
[Storybookがなぜ必要か？(Vue.js編)](https://qiita.com/masaakikunsan/items/dad8d84807918f3a43cb)
Python銘記その１

「びぼうろく」という言葉があまり好きではないので「めいき」していきます。
<font size="-3">　※ご指摘があったので明記、ここの内容はPython2系列で、近くサポート修了なので、新Python3から始めましょう。</font>
**◆日本人がPythonを使う上で一番重要な項目**
```# coding: UTF-8```
あなたのソースコード（コメント欄も）に日本語文字（かな・漢字）が一つでも入っていたら、この宣言は絶対に必要です。

**◆変数＆型**
変数とは格納庫、宣言は単に
```a = 1```（数字型）とか
```b = "text"```（文字型）とすればOK。
そうです、Pythonでは型の宣言をしなくてよいのです。

**◆画面出力表示**
主に変数の中身を表示する
```print b```　※bは変数名
プログラムの試作段階では何かにつけて「とにかく表示させて」確認します。

**◆四則演算とか（たす・ひく・かけ・わる、あまり）**
```+ - * / %```
これはどのプログラミング言語にも共通する必須項目で、演算をしないものを私は知りません。
※あまり（%）の使い方
```a = 5```
```b = 2```
```c = a % b```　aをbで割った余りをcに格納
```print c```　画面出力すると１になります。

・
・
・
続く。
機械学習のための数学(微分基本式)

# 微分の基本式
 微分の基本公式をまとめて記載

## べき関数
$ f(x) = x^r $
$ f'(x) = rx^{r-1}　(r \neq 0)$

## 指数関数
$ f(x) = e^x $
$ f'(x) = e^x $

$ f(x) = a^x $
$ f'(x) = a^x\log_ea $

## 対数関数
$ f(x) = \log_ex　(x > 0) $
$ f'(x) = \frac{1}{x} $

$ f(x) = \log g(x)　(g(x) > 0) $
$ f'(x) = \frac{g'(x)}{g(x)} $

## 三角関数
$ f(x) = \sin{x} $
$ f'(x) = \cos{x} $

$ f(x) = \cos{x} $
$ f'(x) = -\sin{x} $

$ f(x) = \tan{x} $
$ f'(x) = \frac{1}{\cos^2 {x}} $

$ f(x) = \sin^{-1} {x}　(-1<x<1) $
$ f'(x) = \frac{1}{\sqrt{1 - x^2}} $

$ f(x) = \cos^{-1} {x}　(-1<x<1) $
$ f'(x) = -\frac{1}{\sqrt{1 - x^2}} $

$ f(x) = \tan^{-1}{x} $
$ f'(x) = \frac{1}{1+x^2} $

- $ \sin x$ ,$ \cos x$は、N階微分するとグルグル回る（符号には注意） 
- アークほにゃららもまとめておく。(アークほにゃららはy=xで対象)
 - $\ y = sin^{-1}{x} $　は　$ x = \sin{y} $　と同義。（他も同様)

# 微分のよく使う公式

## 合成関数
$ \frac{dy}{dx} = {\frac{dy}{du}}・{\frac{du}{dx}} $

関数の関数になっているような物を単一の関数に変更するために、片方の関数を変数に置き換えて解く。

- ”t = ある関数と置く”が重要 
- 置いたものも微分するのを忘れない（後で使うので”チェーンルール”）

## 積の公式
ここまでで大抵の関数は微分できるけど、あとは関数と関数の掛算の公式もある

$ f'(x)g'(x) = {f'(x)g(x)}+{f(x)g'(x)} $

- 関数と関数の掛算が見えれば、片方ずつ微分して足す。

# 公式の証明
　時間があるときに・・・やります。。
【PL/SQL】SELECT結果でINSERTする(INSERT SELECT)

#SELECT結果でINSERTする(INSERT SELECT)
##やりたいこと
SELECT結果をINSERT文に使用します。
INSERT文の基本的な構成は以下のようになります。
**(
   [更新対象列名]
)VALUES(
   [値]
)**

ここでは[値]の代わりにSELECTの結果をINSERTに使用します。
データの更新は下記を参照してください。
[【PL/SQL】SELECT結果でUPDATEする(UPDATE SELECT)](https://qiita.com/t-kikuchi/items/a90e2e5c083e8ecbefa9)

```SQL:
INSERT INTO {テーブル}
( 
  {列1},{列2}
) VALUES(
  値1,値2
);
```

##コード(列構成が異なるテーブルからのINSERT)
以下の例ではSELECT結果を2つの項目にINSERTしています。
組み合わせによっては、様々な情報を取得してINSERTに使用できます。
この時、列の数やデータ定義に注意してください。

```SQL
--SELECTした結果でINSERTする
INSERT INTO emp_mst
(address,add_no) 
SELECT address,add_no 
     FROM addno 
     WHERE add_no = '111-1111';
```
##コード(列構成が同じテーブルからのINSERT)
以下の例では同じテーブル構成を持つ「emp_mst2」から「emp_mst」へ全件のデータがINSERTされます。
データを絞りたい場合にはSELECT文のWHERE句を追記します。

```SQL
--SELECTした結果でINSERTする
INSERT INTO emp_mst
SELECT *
FROM emp_mst2;
```
openpyxlで数値の表示フォーマットを指定する

# Introduction

ここに以下のようなデータファイルtest.xlsxがあります。あるとき、「このデータのcalc_AFのデータ列を見やすくするために、小数点以下3桁までだけを表示するようにしてほしい」と頼まれました。

![スクリーンショット 2019-03-18 9.07.26.png](https://qiita-image-store.s3.amazonaws.com/0/335400/0642a201-3d21-a6f4-bd06-636ab599b3a6.png)

この作業をopenpyxlで自動化するにはどうしたらよいか、というのが今回のお題です。

# 実行スクリプトとその実行結果

以下に、上述の願いを叶えるスクリプトを示します。

```python:sheet_numberformat.py
'''
    sheet_numberformat.py
    purpose: read xlsx and set number format automatically
'''

import openpyxl as xl
from openpyxl.utils import column_index_from_string


# set input file name
inputfile = 'test.xlsx'

# read input xlsx
wb1 = xl.load_workbook(filename=inputfile)
ws1 = wb1.worksheets[0]

# write in sheet
for row in ws1:
    for cell in row:
        col = column_index_from_string(cell.column)
        
        if ws1.cell(row = 1, column = col).value == 'calc_AF':
            cell.number_format = '0.000'

# save xlsx file
wb1.save(inputfile)
```

実行結果は以下のようになります。

![スクリーンショット 2019-03-18 9.15.36.png](https://qiita-image-store.s3.amazonaws.com/0/335400/240fa45d-d156-af80-ea25-09fdc88cb30a.png)

calc_AF列の値の情報はそのままに、表示フォーマットが変更されていることがわかります。

# スクリプト詳細

## cell.number_format

```python
cell.number_format = '0.000'
```

で、セルの値の表示を小数点3桁まで表示するようにしています。

## if文がない場合の結果

for文内でif文

```python
if ws1.cell(row = 1, column = col).value == 'calc_AF':
```

を用いて、calc_AFの列のみにnumber_formatを適用しています。このif文を外すとどうなるでしょうか。以下にその結果を示します。

![スクリーンショット 2019-03-18 9.28.14.png](https://qiita-image-store.s3.amazonaws.com/0/335400/8fb8e54b-ccb9-4bfc-7161-1a9ee868c424.png)

整数で大きな値が入っていたPOS列にまで'0.000'フォーマットが適用され、正しく表示できなくなっていることがわかります。

## POS列に違うフォーマットを適用させる

POS列の整数を見やすくするために、3桁毎にカンマ区切りで表示するようにしてみましょう。そのためfor文内に以下のelif文を追加します。

```python
elif ws1.cell(row=1, column=col).value == 'POS':
    cell.number_format = '#,##0'
```

`#,##`の部分で3桁毎にカンマ区切り、`0`の部分で小数点以下を表示しない、という設定を行なっています。結果は以下のようになります。

![スクリーンショット 2019-03-18 10.00.13.png](https://qiita-image-store.s3.amazonaws.com/0/335400/303baf0d-c75d-f9bd-5811-549163b093de.png)

# from openpyxl.styles import numbers

```python
from openpyxl.styles import numbers
```

`numbers`モジュールをインポートすることで、openpyxlがデフォルトで備え持つ表示フォーマットを使うことができるようになります。以下にnumbersで指定できる定数をご紹介します。

```python
FORMAT_GENERAL
FORMAT_TEXT
FORMAT_NUMBER
FORMAT_NUMBER_00
FORMAT_NUMBER_COMMA_SEPARATED1
FORMAT_NUMBER_COMMA_SEPARATED2
FORMAT_PERCENTAGE
FORMAT_PERCENTAGE_00
FORMAT_DATE_YYYYMMDD2
FORMAT_DATE_YYMMDD
FORMAT_DATE_DDMMYY
FORMAT_DATE_DMYSLASH
FORMAT_DATE_DMYMINUS
FORMAT_DATE_DMMINUS
FORMAT_DATE_MYMINUS
FORMAT_DATE_XLSX14
FORMAT_DATE_XLSX15
FORMAT_DATE_XLSX16
FORMAT_DATE_XLSX17
FORMAT_DATE_XLSX22
FORMAT_DATE_DATETIME
FORMAT_DATE_TIME1
FORMAT_DATE_TIME2
FORMAT_DATE_TIME3
FORMAT_DATE_TIME4
FORMAT_DATE_TIME5
FORMAT_DATE_TIME6
FORMAT_DATE_TIME7
FORMAT_DATE_TIME8
FORMAT_DATE_TIMEDELTA
FORMAT_DATE_YYMMDDSLASH
FORMAT_CURRENCY_USD_SIMPLE
FORMAT_CURRENCY_USD
FORMAT_CURRENCY_EUR_SIMPLE
```

使用するときは`numbers.FORMAT_DATA_TIME1`のように記述します。
情報処理安全確保支援士 平成25年度 午後1 問3

#設問1
**・社外持出し用PCの紛失や盗難による情報漏えいリスクを低減する効果**
問題文に「他拠点への出張が多い従業員と、外出が多い営業部員には、社外持出し用PCも貸与している。」とあります。
しかし、今回リモートアクセス環境への移行により、他拠点から出張中の従業員が利用できるように共用のDTが設置されました。
このことにより出張者は社外持出し用PCの利用機会が減り、紛失や盗難のリスクが低減することが考えられます。

#設問2
**(1) a：業務データ**
社外持出し用PCには特に制限がされているような記述がないため、業務システムから取得した業務データは保存できそうです。
しかし、今回のようなNTは基本的にローカルにデータを保存するようなことは無く、サーバ上で作業を行います。

**(2) b：ハードディスク暗号化**
PCの紛失・盗難が発生し、PC内に機密情報が保存されている場合、機密情報の中身を見られる可能性があります。
中身を見られないようにするには**暗号化**対策が有効です。
しかし、ハードディスクの暗号化という文字は問題文中に出ていなかったため、中々かけないと思いました。
この設問は覚えておいてもいいかもしれません。

**(3) ①：マスタイメージを再作成する。**
管理者はV-PCを複製するために新しいマスタイメージを作成する必要があります。

**　②：V-PCの複製を行う。**
作成したマスタイメージからV-PCを複製します。

**　③：利用者にログオンし直すように周知する。**
図1(h),(i)にV-PCをログオフしたか、しなかったかでの状態について説明があります。
ここを確認すると、「ログオフせずに、V-PC接続ソフトを終了するか、またはDTの電源を切ると、V-PCの状態は維持され、次回の接続時にはそのV-PCに接続される。」とあるため、利用者に再接続を周知しないと脆弱性の残ったV-PC又はDTを利用し続けてしまうことになります。

#設問3
**・なりすましに成功すると、全ての業務システムを利用できるから**
案1はVPN装置で1度認証を行った後、業務システムごとに利用者認証を行っているため、セキュリティレベルは高いと思われますが、案2はGWサーバで1度認証してしまえばシングルサインオンの機能によって全てのシステムが利用可能になり、案1に比べるとGWサーバ利用は影響範囲が大きいです。

#設問4
**(1) 管理者：ウイルス定義ファイルの自動配信を設定する。**
**　作業者：NTをオフィスLANに接続する。**
図5(iii)を見ると、「管理者が設定することによって」とあり、修正パッチの適用とファイルの自動配信を設定する必要があることがわかります。
また、その後の文章に「利用者がNTをオフィスLANに接続する」とあり、ウィルス定義ファイルの自動配信が管理者によって配信される都度、利用者はオフィスLANに接続する必要があります。

**(2) 効果：業務データを端末に保存して社外へ持ち出すことを防ぐため**
**　理由：V-PCを経由しないと業務システムに接続できないから**
「オフィスLANからの接続はVDI-LANに限定することにした」と下線④にあります。
逆に考えるとオフィスLANから業務システムLANに接続できる環境だった場合、業務データを保存される可能性があります。
なぜならV-PC以外の端末では業務データを保存される可能性があるからです。(問題文中に記載あり)
そのため、オフィスLANのDT→V-PC→業務システムの順番でしか接続できないようにFWで制御しておけば業務データが保存される可能性はなくなります。
(カメラとかで写真、動画を撮るという物理的な話は除きますが・・・)
難しい技術こそ英語で学ぶべき7つの理由

# 難しい技術こそ英語で学ぶべき7つの理由

英語を避けているがために、技術力が伸び悩んでいる方は意外といらっしゃるのではないでしょうか。調べても英語の情報しかないため、スキップしているとか、おすすめの本が日本語に翻訳されていない洋書だったりとか。しかし、いつまでも避けていくわけにはいかないですよね。

私も一年半前くらいから、渋々英語で技術書などを読む必要性が出てきたのですが、続けていると「 難しい技術こそ英語で読むべき、学ぶべきではないか」と感じてきましたので、いくつか理由をご紹介したいと思います。

## 英語で読む時間 < 内容の難しさを咀嚼する時間

日本語で読んだとしても、その後の内容の難しさを咀嚼する方に時間が取られるので、英語を読むスピードはそれほど重要でない場合が多い気がします。

## 英語で読むほうが熟読しようとする

日本語で読むと難しい部分はどうしても読み飛ばしてしまう感じがします。あと、個人的な意見ですが、日本語で書かれた小難しい文章は眠気を襲う。英語だと、そもそも読み飛ばすと内容がわからなくなるため、じっくり読むマインドが始めから醸成されています。

## 論文読みにステップアップしやすい 

特に機械学習の分野などはこのメリットが大きいと思います。

## 単語が英語で把握できる 

googleで用語を検索するときも英語の単語で検索すればヒットしやすいです。日本語だと複数の対訳があるときに分散してしまうので検索が難しくなるし、そもそも日本語の記事がヒットしない可能性が高い。

## 日本語の解説よりもより正確で詳細

公式に配布されている日本語のドキュメントでも最新の仕様とかなりの時間差があったりしますので、英語の公式ドキュメントのほうがより正確だし、圧倒的に詳しいです。

## 翻訳でコントリビュートできる

もし、英語の技術ブログを読んでものすごく良質なものだと感じたら、著者に確認をとった上で翻訳するというチャンスもあります。qiitaは翻訳文書に対してcontributionが出やすいので、一定の成果が出たと感じるのではないでしょうか。

## 単純に英語力が上がる 

英語で一冊の本を通読することの抵抗感が薄れます。原書は良書だが、翻訳の質が悪かったりすると、本を読まない口実を自分で作りがちですが、英語への抵抗感が薄れると、原書をそのまま読もうとなります。


------

いかがでしたか? 他にも日本語訳を待たずに済むなどのメリットもあります。みなさんも試してみてください！
[progate]html&css中級編を終えてのアウトプット

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている梅原です。
題名通りhtml&cssの中級編を終えたので、なるほどと思った部分を書いてみたいと思います。
#要素の位置
cssで要素の位置を動かしたり、変更する時の書き方を学びました。
特に、中央揃え以外の独自に位置を定めたいときは、positionプロパティを使います。

```html:sample.html
<div class='parent'>
  <p class='relative'>相対位置</p>
  <p class='absolute'>絶対位置</p>
</div>
```
```css:stylesheet.css

.relative{
  position:relative;
  top:20px;
}

.absolute{
  position:absolute;
}

```
この時、相対位置のpタグはどこからの相対かというと、staticを指定していた時（もともとの位置）から、どこにどれだけ離れるかを表します。
一方、absoluteは親のボックスにstaticがあるかないかで基準とする場所が変わります。
staticのみが指定されている場合、ウィンドウ全体の左上が基準となります。
static以外のものも指定されている場合、親ボックスの左上が基準となります。
ちなみに、staticを使うことはあまりないそう。
位置の指定はtop,bottom,right,leftプロパティを使用することで可能です。
----
イマイチ、わかったようで、わかっていないなとアウトプットしながら思ったので、もうちょっとちゃんと理解して、あと見本もつけれるようになります。
わかりにくくてすみません。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
gnome-terminalが立ち上がったり立ち上がらなくなったりする現象への対処法

# 前提 
「突如gnome-terminalが立ち上がらなくなる」→「しばらく待つと勝手にその現象が治まり立ち上げられるようになる」ということが度々起こった。
その現象を起こさないようにする方法まではわからなかったけれど、対症療法的にとりあえずgnome-terminalをすぐに立ち上げられるようにする方法を記述する。

# 症状
xterm等の他の適当な仮想ターミナルを用いてgnome-terminalコマンドを打つと以下のようなエラーを吐いて起動に失敗する。

```
# watch_fast: "/org/gnome/desktop/interface/" (establishing: 0, active: 0)
# watch_fast: "/org/gnome/settings-daemon/peripherals/mouse/" (establishing: 0, active: 0)
# watch_fast: "/org/gnome/desktop/sound/" (establishing: 0, active: 0)
# watch_fast: "/org/gnome/desktop/privacy/" (establishing: 0, active: 0)
# watch_fast: "/org/gnome/desktop/wm/preferences/" (establishing: 0, active: 0)
# watch_fast: "/org/gnome/settings-daemon/plugins/xsettings/" (establishing: 0, active: 0)
# watch_fast: "/org/gnome/desktop/a11y/" (establishing: 0, active: 0)
# watch_established: "/org/gnome/desktop/interface/" (establishing: 1)
# watch_established: "/org/gnome/settings-daemon/peripherals/mouse/" (establishing: 1)
# watch_established: "/org/gnome/desktop/sound/" (establishing: 1)
# watch_established: "/org/gnome/desktop/privacy/" (establishing: 1)
# watch_established: "/org/gnome/desktop/wm/preferences/" (establishing: 1)
# watch_established: "/org/gnome/settings-daemon/plugins/xsettings/" (establishing: 1)
# watch_established: "/org/gnome/desktop/a11y/" (establishing: 1)
# Error constructing proxy for org.gnome.Terminal:/org/gnome/Terminal/Factory0: org.gnome.Terminal を StartServiceByName で呼び出そうとしてエラー: タイムアウトしました
```

# 原因
gnome-terminal-server.service(ユーザー権限)が落ちている為である。

```
$ systemctl --user status gnome-terminal-server
● gnome-terminal-server.service - GNOME Terminal Server
   Loaded: loaded (/usr/lib/systemd/user/gnome-terminal-server.service; static; vendor preset: enabled)
   Active: inactive (dead)
```

# 対処
よってこのサービスを何らかの方法で起動しなおしてやれば良い。

```
$ systemctl --user start gnome-terminal-server
```
WMI -> CIM への書き換え例

`WMI v1 Cmdlets` は廃されつつあり（Nano Server向けのPowerShellや、PowerShell Core 6.0 以降では既に廃止）、 `CIM Cmdlets` への移行が促されているので。

- [PowerShell Core 6.0 の重要な変更 - PowerShell Core で使用できなくなった機能 - WMI v1 コマンドレット](https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/breaking-changes-ps6?view=powershell-6#wmi-v1-cmdlets)
- [コンピューターに関する情報の収集](https://docs.microsoft.com/ja-jp/powershell/scripting/samples/collecting-information-about-computers?view=powershell-6)

プロパティを閲覧するだけなら、 `Get-WmiObject` を `Get-CimInstance` に、 `-Class` を `-ClassName` に置き換えるだけで済むことも多いようですが。

# CIM プロパティ・メソッドの一覧

## Class Properties の表示

```powershell
(Get-CimClass -Namespace root/CIMV2/TerminalServices -ClassName Win32_TerminalServiceSetting).CimClassProperties;
```

## Class Methods の表示

```powershell
(Get-CimClass -Namespace root/CIMV2/TerminalServices -ClassName Win32_TerminalServiceSetting).CimClassMethods;
```

メソッドの実行に必要な引数の名前はこのような感じで確認できます。

# WMI -> CIM メソッド実行の書き換え例

## 例: ログオフ

この例ではリモートコンピュータを指定しているため、対象のコンピュータ（この場合は `.` = 自分自身）で Windows Remote Management (WinRM) 機能の有効化（対象コンピュータの管理者権限のPowerShell上で `Enable-PSRemoting` を実行する）、及びネットワークのプロファイルをPrivateに設定する（Publicのネットワークからは WinRM の接続を受け入れない）。

- [Windows 10 で「ネットワークの場所（プロファイル）」を「パブリック」から「プライベート」に変更する方法](https://laboradian.com/win10-change-net-public-private/)
- [Windows 10 で Wi-Fi ネットワークを公衆またはプライベートにする](https://support.microsoft.com/ja-jp/help/4043043/windows-10-make-network-public-private)

- https://docs.microsoft.com/ja-jp/powershell/scripting/samples/changing-computer-state?view=powershell-6#logging-off-the-current-session

- WMI

```powershell
(Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).Win32Shutdown(0);
```

- CIM

```powershell
Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName .|
Invoke-CimMethod -MethodName Win32Shutdown -Arguments @{Flags=0};
```

## 例: リモートデスクトップの許可

- GUI での相当操作: `control.exe sysdm.cpl ,5` (システムのプロパティ - リモート) - リモートデスクトップ - 「このコンピューターへのリモート接続を許可する」に変更
- https://docs.microsoft.com/en-us/windows/desktop/termserv/win32-terminalservicesetting-setallowtsconnections

- WMI

```powershell
(Get-WmiObject -Namespace root\CIMV2\TerminalServices -Class Win32_TerminalServiceSetting).SetAllowTSConnections(1,1);
```

- CIM

```powershell
Get-CimInstance -Namespace root/CIMV2/TerminalServices -ClassName Win32_TerminalServiceSetting|
Invoke-CimMethod -MethodName SetAllowTSConnections -Arguments @{AllowTSConnections=1;ModifyFirewallException=1};
```
php-master-changes 2019-03-17

今日はビルドシステムのリファクタリングがあった！

# 2019-03-17
## nunoplopes: check for bison binary, not yacc
- https://github.com/php/php-src/commit/495a46aa1dc564656bf919cb49aae48a31ae15f4
- [7.4~]
- ビルドシステムで、[AC_PROG_YACC](https://lists.gnu.org/archive/html/autoconf/2001-10/msg00032.html) を AC_CHECKPROG で bison をチェックする形に修正
- Bison 3.3 で bison -y の挙動が厳格化されて posix yacc に沿わないコードを弾くようになったらしい

## petk: [ci skip] Remove make install step from README
- https://github.com/php/php-src/commit/86f2681460c7ebd28eefc82f32b879e1e26454c9
- [7.4~]
- README の「ソースからのビルド」の項から make install の部分を削除
- 他のとこに詳しく書くべきでないか、ということらしい

## nunoplopes: snmp: remove unused var
- https://github.com/php/php-src/commit/2619b138c0f3fe501f2b5b3924244237f02b7042
- [7.4~]
- [昨日の修正](https://qiita.com/sj-i/items/97a73a5aa0fb3326ff41#nunoplopes-snmp-remove-unused-var)の 7.4 へのバックポート
- やった人が git 移行後の PHP のワークフロー（下位バージョンのブランチに当ててから上位バージョンへマージしていく）に[慣れてない人だった](https://github.com/php/php-src/commit/495a46aa1dc564656bf919cb49aae48a31ae15f4#commitcomment-32780804)のでこうなった
- 今だと開発版が 7.4 と 8.0 と両方あって、8.0 専用の修正以外には常に必要だしな

## petk: Enhance the buildconf script
- https://github.com/php/php-src/commit/78ab79b9164420679da7aba1f7195335d656afda
- [7.4~]
- ビルドシステムで、buildconf を改善
- 何をやるスクリプトなのかの説明を追加
- -h、--help の追加
- メッセージを修正して次に何やればいいか分かるように
- 他ディレクトリから実行できるよう、実行時にプロジェクトルートへ cd するよう修正
- make があるかのチェック追加
- petk の人、これ系の開発環境の地ならしでめっっっっっっっっちゃ色々頑張ってて、またコミットメッセージが丁寧でほぼ毎度元実装の背景調査して変更理由きっちり書いてて、開発への参入障壁下げ続けてるので、機能面は全然触ってない人だけど長い目で見て結構なヒーローだと思う

## petk: Move distribution generator script to scripts/dev
- https://github.com/php/php-src/commit/e525ce30a56767cb5bd71221dd98bdc09f3ee60f
- [7.4~]
- ビルドシステムで、makedist、genfiles をプロジェクトルートから scripts/dev へ移動
- プロジェクトルートに入るもの限定した方がとりあえず何見ればいいか分かりやすく、リリース/パッケージ用スクリプトは普通の人そんなに使わないでしょ、ということらしい
- 実際現状で[かなりスッキリ](https://github.com/php/php-src/tree/e525ce30a56767cb5bd71221dd98bdc09f3ee60f)してて、[5.6系の](https://github.com/php/php-src/tree/05fb10165081cb4fb55a9943b44cab62c627db7a)を比較用に見ると、おーという気持ちになる
- あとドキュメント系を整理できればもっと減りそう

## petk: Remove duplicate PHP_C_BIGENDIAN check
- https://github.com/php/php-src/commit/20af19b9b3cbaf2821e56a4252c3b946e04b3190
- [7.4~]
- ext/hash で、config.m4 の不要な PHP_C_BIGENDIAN を削除
- ビッグエンディアンチェックは configure.ac で済んでるから、ということらしい

## nunoplopes: remove unneeded AC_REQUIRE([AC_PROG_YACC])
- https://github.com/php/php-src/commit/33d428252699b679e420d414507fb0c5db4b3eac
- [7.4~]
- ビルドシステムで、不要な AC_REQUIRE([AC_PROG_YACC]) を削除
- 「これもいらないんじゃない？」と[コミットへのコメントで petk の人が言ってた](https://github.com/php/php-src/commit/495a46aa1dc564656bf919cb49aae48a31ae15f4#commitcomment-32782400)奴
Ruby on RailsでGitHubからクローンしてアプリを立ち上げるために気をつけること

Railsのアプリを1から制作するための環境設定は、どの参考書にも載っていますが、GitHubからクローンしてアプリを立ち上げるための情報を、網羅している情報源は見当たりませんでした。

私は、プログラミング未経験から独学で勉強していまして、GitHubからクローン(Clone)してアプリを立ちあげるのに、かなりつまづいてしまいましたので、初学者の方に参考にしていただければ幸いです。

ちなみに、現在はRSpecについて学ぼうとしているところでして、『Everyday Rails』の環境構築で迷った経験をもとにしています。（一般化して、汎用性の高い考え方にすることを目的としています。）

##Ruby on RailsでGitHubからクローンしてアプリを立ち上げるために気をつけること

順番が重要でして、下記の通り進める必要があります。

1.Ruby/Ruby on Railsのバージョン確認
2.Gem関連のバージョン確認
3.データベースの設定

###1.Ruby/Ruby on Railsの確認(インストール/バージョンアップ/バージョンダウン)

- Ruby
- Rails

RubyやRailsのバージョンは、GitHubの「README.md」というプログラムの仕様を記述するファイルに記載されているはずです。

###2.Gem関連のバージョン確認(インストール/バージョンアップ/バージョンダウン)

- Bundler
    - "gemfile"と"gemfile.lock"に従って、gemを管理をするライブラリ
- Ruby-gems
    - gemを管理する仕組みで、Rubyで書かれたプログラムを管理するためのパッケージツール(ライブラリ)が簡単に使えるように配布されている場所

上記のバージョンを全てクリアした上で、下記コマンドでGemのバージョンを合わせます。
```bundle install
```

RubyやRailsだけでなく、GemやBundler、Ruby-gemsのバージョンも確認することがポイントですね。

私の場合は、「Bundlerのバージョンをあげようとした時に、Ruby-gemsのバージョンが低いからだめ」というエラーが出たので、「先にRuby-gemsのバージョンを上げてから、Bundlerのバージョンを上げる」ことで解決できました。

###3.データベース接続
- データベース作成（bin/rails db:create)
- マイグレーションファイル実行(bin/rails db:migrate)

データベースの設定は、クライアント側（自分のPC）で行う必要があります。

ここまでやれば、あとは「bin/rails server」でサーバーを起動して、アプリを立ち上げることができるはずです。

###最後に
GitHubからクローンしてアプリを立ちあげるために、留意すべきことを列挙しました。

あとは、エラー文をググって解決の糸口を見つけるしかないですが、その際はUNIXコマンド（ターミナルでの操作）の知識をしっかりつける必要があるな、と感じている次第です。
#2同期・非同期タグ


#1.Point(要点)
「Googleタグマネージャ」は、「同期タグ」と「非同期タグ」のうちSNSへの投稿ボタンやウェブテスト機能など同期処理が行われる同期タグの使用は推奨されていない。

#2.Reason(理由)
Googleタグマネージャは、全てのタグを強制的に「処理のタイミングが安定しない」非同期タグとして扱われる仕様となっているから。
##補足
###①Googleタグマネージャが推奨しない同期タグ
・SNSのシェアボタンを生成するJavaScriptなど「ページ構造にかかわるタグ」
・Googleアナリティクスのウェブテスト機能「同期処理が必要なタグ」
###②同期タグと非同期タグの違い
・同期タグ
HTMLの読み込み直後にJavaScriptの読み込みが発生し、その処理が完了するまでHTMLの読み込みが止まりJavaScriptの処理完了後にHTMLの読み込みが再開。
・非同期タグ
JavaScriptの読み込み/処理中にもHTMLの読み込みが行われる。
#3.Example(具体例)
SNSの投稿ボタンなど、JavaScriptでページ内の特定のHTMLを変更すようなタグを利用しようとした場合、その変更要素の読み込みがまだ完了していない状態でHTMLの画面が表示されてしまう為。画面がちらついて見えるなどユーザに違和感を感じさせてしまう可能性がある。
#4.Point(要点)
「非同期処理は、タイミングが安定しない。」と言っても実際には誤差程度の違いしかなく大抵は、
同期タグ・非同期タグどちらも正常に動作する。しかし、ウェブテストなど処理タイミングを厳密にしたい場合、「Googleタグマネージャ」を利用せず同期タグとして、HTMLに直接記述する事が推奨されている。
情報処理安全確保支援士 平成26年春 午後1 問2

#設問1
**(1) a：syslog**
UNIX系で一般的に使われているログ収集、転送方式といえば**syslog**です。
ちなみにWindowsだとイベントログです。
下記IPAのサイトにログの運用に関する記述があるため、一度目を通しておいても良いと思います。
また、下記サイトには「管理者にとって重要な情報を提供するログファイルは、常に攻撃者から改ざんの対象となっているので、ログファイルを完全に信じることは危険である。」とあります。
たまに試験でも出ているようですが、ログサーバとサーバ自身のログを比較することで改ざん有無を確認する問題も出ています。
これは有効な手段と言えます。
[8.2 不正アクセス検知のための運用](https://www.ipa.go.jp/security/awareness/administrator/secure-web/chap8/8_log-1.html)

**(2) b:-all**
問題文に「A社のメールアドレスを使ったメールを送信するのは外部メールサーバだけである」とあります。
SPFレコードには外部メールサーバのIPアドレスが既に記載されているため、他に許可IPアドレスが記述されることはありません。
それ以外を拒否するという意味で「**-all**」を利用します。
またSPFには-allではなく、~all(チルダオール)という記述の仕方も存在します。
~allの場合送信元メールサーバの認証は-allにくらべて、認証に失敗した「かも」くらいになります。
他サイト様でも違いについて記載されているため、1度確認しておくといいと思います。

#設問2
**・インターネットから迷惑メール対策装置を経由せずに送られていた**
表2を確認するとインターネットから迷惑メール対策装置、外部メールサーバへのSMTP通信は許可されています。
これは、本文中にも記載がありますが、迷惑メール対策装置が故障した際に外部メールサーバが引き継ぐためです。
次に表3ですが、1～4行目にMXとAレコードの記載があり、確認すると、msv1である迷惑メール対策装置の方が優先度が高いです。
A社にメールを送信したい場合、A社のドメインを解決するためDNSサーバに問い合わせを行います。その際、登録されているMXレコードはすべて送信元に送られます。(msv1とmsv2の情報が送られる。)
そのため、送信元はmsv2である外部メールサーバを指定してメール送信をすることも可能です。
外部メールサーバを指定して送信されていた。と記述しても解答としては間違っていないと思います。

#設問3
**(1) メールサーバのIPアドレスが変更された場合**
IPアドレスWLではメールの送信元IPアドレスをチェックしています。
メールが急に届かなくなると考えられるのはIPアドレスの変更があった場合です。
採点講評にもありますが、MXレコードの設定を変更するという記述が散見されたそうですが、IPアドレスWL(IPアドレス)に関する問題のため、MXレコードは関与しません。

**(2) 迷惑メールの送信者がドメインを正当に取得した場合**
SPF認証は送信されてきたメールのドメインのIPアドレスが、送信元メールサーバのIPアドレスと一致しているかどうかを比較する技術です。この認証が成功してしまえばどの送信元からのメールも受信してしまいます。
そのため、攻撃者が正当なドメインを取得した場合、A社では攻撃者からのメールを受信してしまいます。
以上のことから、ドメインWL、BLでドメイン名の許可/拒否を行うことは必要だと思われます。
また、SPFはエンベロープ(From)のドメイン名で送信元メールサーバの認証を行います。(ヘッダの確認は行わない)
採点講評では、「"送信元IPアドレスを詐称したパケットを送りこむ"といった解答が目立った」とあります。SMTPはTCP通信のため、IPアドレスの詐称は難しいため、試験ではできないものと考えて良さそうです。

**(3) c：プロキシサーバ**
**　効果：迷惑メールの拒否率向上**　
表1を確認するとプロキシサーバでもURLフィルタリングを行っていることがわかります。
それ以外にURLフィルタリングに関する設定を行っている機器はないため**プロキシサーバ**が入ります。
そして、期待される効果ですが表2のFWのルールを見るとメール送信の際はプロキシサーバを経由していないため、HTTP/HTTPS通信を行うときだけプロキシサーバを経由し、プロキシサーバではHTTP/HTTPS通信を行う際に接続先URLへの接続許可/拒否を行っていると考えられます。
このURLフィルタリング機能をメールのURLWL、BLにも適用することで、メールのヘッダ及び本文中に含まれるURLも検査対象になるため、迷惑メールを拒否する確率が向上します。

#設問4
**・SMTP通信を迷惑メール対策装置に振り分ける**
設問2の対策を行う問題です。
送信元は外部メールサーバを直接指定してきていたと考えられます。
問題文では「LBの設定を変更することで」とあるため、メール受信の際に1度LBを中継に設置し、そこで迷惑メール対策装置に振り分けるように設定すれば良さそうです。
DApps開発環境

DAppsの開発環境を設定していきます。

#ツール
主に以下のものが必要になってきます

・Homebrew
[Homebrewのインストールから操作まで](https://qiita.com/krtsato/items/ba567acacb93a7a02dd9)

・Docker
[Dockerインストールメモ](https://qiita.com/n-yamanaka/items/ddb18943f5e43ca5ac2e)

・Ganache
[Windowsはこちらから](https://truffleframework.com/ganache)
[Macはこちらから](https://truffleframework.com/ganache)

・Node.js

```
$ brew node install
```

・Truffle

```
$ brew install -g truffle//@4.1.1バージョン指定が必要な場合 
```

・Geth

```
$ brew install ethereum
```

#ネットワークとは
Ethereumのブロックチェーンアプリを開発する際には、ネットワークに参加してブロックチェーンをしようしていく必要があります。

ブロックチェーンにおけるネットワークの仕組みを理解しておきたいと思います。

##P2P(Peer to Peer)
![Server-based-vs-P2P-network.jpg](https://qiita-image-store.s3.amazonaws.com/0/342028/be837cd1-c19d-692a-7a58-d5b78184c964.jpeg)

今までは、サーバー型モデルと呼ばれる、サーバーがテータを保持し提供する仕組みが一般的でした。
ですがブロックチェーンではP2Pと呼ばれる、各ピア（それぞれのデバイスのこと、ノードともいう）がデータを保持し、互いにデータの提供、要求を行う自律分散型の仕組みで成り立っています。


#ネットワークの種類
実際にブロックチェーンのアプリを開発する際には３種類のネットワークがあります。

###メインネット
メインネットは実際の世界で使われているブロックチェーンです。
本番の環境ですので何かをやり取りする際には実際のETHが必要になります。
また、一度デプロイしてしまうとかき消すことはできません。

###テストネット
メインネットにデプロイする前に開発したものがきちんとどうだするか確認するための「実験場」のようなものです。
ここでのトークンは市場価値がありません。

イーサリアムの代表的なテストネットは
・Rospoten
・Kovan
・Rinkeby

だだ、テストネットもネットに繋がっており攻撃を受けることがあり、どのテストネット一長一短あります。
[Ethereum の各種テストネット比較](https://qiita.com/SAengineer/items/41c71323bc8b6d481f64)

###プライベートネット
構築者自身により構築されるネットワークのことで、個人や組織内で主に使います。

#プライベートネットの構築

##go-ethereumで構築する場合

[Geth(Go Etherium)のプライベートネットワークの立ち上げ方法](https://qiita.com/takeoworks/items/f793fa99f04343219daa)

規格のアップデートがあり仕様が変わってる部分があったなと感じたため
Gethを使ったプライベートネットの立ち上げはあまりお勧めではないです。


##gethoを利用した場合
株式会社Popshoot提供する、プライベートネットをすぐに構築できるプラットフォームサービスを利用すれば簡単に構築することができます。
https://getho.io/


##終わりに
ブロックチェーンにネットワークの仕組みな関してある程度理解できました。
C言語でファイルにランダムな数値を上書きしてから削除する


# 背景

ファイルをただ消してもhddの実体のデータは残ってると思いますので、ランダムなデータを上書きしてから消すという関数をためしに作ってみました。
関数の中で最終的にremove()を呼んでいるので、置き換えて使うことを想定しています。

# 計算方法

## ファイルサイズの取得
今回の例では、sys/stat.hのstat()でファイルサイズを取得していますが、
fseek()でも良いのかも知れません。

```c
#include <sys/stat.h>
struct stat sb;
if (stat(filename, &sb) == -1)
        return 0;
```

stat構造体のst_sizeの値を読むことでファイルサイズが得られます。

### ファイルサイズを表示する例

```c
printf("file size: %zu\n", sb.st_size);
```

## 乱数の生成
乱数の生成はrand()ではなくstdlib.hにあるrandom()が推奨されるということなのでそれを使うことにします。random()の戻り値はunsigned long int型なので今使っているこのパソコンでは8bytesでした。

```c
#include <time.h>
#include <stdlib.h>

unsigned long int r;
/*シードの初期化*/
srandom(time(NULL));
r = random();
```

## ぴったり収まるように
先に、statで取得したファイルサイズ（st_size）とsizeof(unsigned long int)の商の数だけ書き込んで、最後に余りの個数だけ書き込んでいます。

例えばファイルサイズが1003bytesでsizeof(unsigned long int)が8bytesだとすると

```
1003 / 8　= 125
1003 % 8  = 1003 mod 8 = 3
```
ということになります
C言語の/演算子は整数の場合切り捨てになっていることに注意してください。
125回8bytesを書きこんで、のこり3Bytesを最後に書き込んでいます。

もっと良い書き方が有るかも知れません。

# 出来上がったコード


```c
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

/**
 * shred() - Overwrites with random data and removes.
 * @filename  	filename
 *
 * Returns:
 *  1: success
 *  0: fail
 */
int shred(char *filename)
{
	FILE *fp;
	size_t i = 0;
	unsigned long int r;
	struct stat sb;

	srandom(time(NULL));

	if (stat(filename, &sb) == -1)
		return 0;

	fp = fopen(filename, "wb");
	if (fp == NULL)
		return 0;

	i = sb.st_size / sizeof(unsigned long int);
	while (i--) {
		r = random();
		if (!fwrite(&r, sizeof(unsigned long int), 1, fp))
			return 0;
	}

	i = sb.st_size % sizeof(unsigned long int);
	if (i) {
		r = random();
		if (!fwrite(&r, 1, i, fp))
			return 0;
	}
	
	fclose(fp);

	if (remove(filename) != 0)
		return 0;

	return 1;
}
```

何かの参考に慣れば幸いです。
引数オブジェクトの導入(Introduce Parameter Object)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/fdaf5b9d-a029-52fa-35b6-44022684defa.png)


1つずつリファクタリング技法まとめ
個人的に簡単かつ取り入れ易いと思うものから

## 目的
すぐ引き出せるようにする

## 基本作業サイクル
- システムを動かして仕様を精査
- テストメソッドを作成
- テストの失敗を確認
- テストの成功を確認
- 小さい変更、随時テスト実行(パターン追加失敗確認->成功確認)
- 最後テスト実行
- 最後動作確認

## 引数オブジェクトの導入(Introduce Parameter Object)とは
複数ある引数を1つのオブジェクトにまとめること
引数の情報は変えずに数を減らすこと
 
## ポイント
- 複数の引数に関連性があることが自明、または同じ組み合わせで渡されている引数がある時に引数の情報をイミュータブルなクラスとして作成
- 既存のメソッドにオブジェクト化した引数を追加し、少しずつ引数を差し替えて検証する
- 既存の引数を削除できたら引数オブジェクトのクラスに債務のあるメソッドを移動する

## 例

```
class Doraemon
  attr_reader :calorie

  def eat(bean_paste, castella) 
    @calorie = bean_paste + castella
  end

  def large
    @calorie += 500
  end
end
```
　　　↓

```
class Dorayaki
  attr_reader :calorie, :bean_paste, :castella

  def initialize(bean_paste, castella)
    @bean_paste = bean_paste
    @castella = castella
  end

  def large
    @calorie = @bean_paste + @castella + 500
  end
end

class Doraemon
  def eat(dorayaki) 
    dorayaki.bean_paste + dorayaki.castella
  end
end
```

## 書籍情報
Jay Fields (著), Shane Harvie (著), Martin Fowler (著), Kent Beck (著),
長尾 高弘(訳), リファクタリング:Rubyエディション
https://amzn.to/2VlyWML

## 雑感
何の組み合わせによる技法かを認識するためにも少しずつ行う