OmniAICreator/Qiita-1.07M huggingface dataset:
unicode、文字コードまわりをpythonであれこれするときの基本情報

# はじめに
忘れてしまいがちな、unicode、文字コードあたりをpythonであれこれする際の基本情報をまとめてみました。

# おさらい：n進数
まず、今回のテーマを整理する上で、あれってなりがちなn進数のpythonでの扱い、振舞いについてまとめます。文字コードまわりをあれこれやる際には特に2進数、8進数、16進数というのがよく登場します。

### int型 → n進数str型への変換

```python
bin(12)  # '0b1100': bin()は数値(int)を、'0b'という接頭辞付きの2進数に変換
hex(12)  # '0xc': hex()は数値(int)を、'0x'という接頭辞付きの16進数に変換
```
### n進数str型 → int型への変換

```python
int('0b1100', 2)  # 12
int('0xc', 16)  # 12
# int('n進数文字列', n)でn進数文字列を数値(int)に変換
```

pythonではint型が人目に触れる場合、原則として10進数にて表示されます。ただ、入力においては以下のように10進数以外の記述方法も用意されています。

```python
0b1100  # 12, 0b+2進数で2進数表記の数値をint型で宣言
0xc  # 12, 0x+16進数で16進数表記の数値をint型で宣言
```

# 文字列とUnicodeコードポイントをあれこれやる時
Unicodeは文字コードに関する業界規格ですが、その中でも「符号化文字集合」では、世界中の文字を共通の文字集合として扱うために、各文字に対して番号が割り振られて管理されています。
その世界中の文字を管理するために割り振られた番号を「Unicodeコードポイント」と言います。この「Unicodeコードポイント」は後述するエンコード（UTF-8やShift-jisなど）とは異なるものであることに注意が必要です。

###文字(str)→Unicodeコードポイント（int）への変換
ord('1文字')で文字をUnicodeコードポイントに変換します。

```python
ord("a")  # 97
ord("あ")  # 12354
# ord("aa") TypeError: ord()は二文字以上の文字列は与えられない
```

###Unicodeコードポイント（int）→文字(str)への変換
chr(Unicodeコードポイントint)で対応する文字を返します。

```python
chr(97)  # 'a'
chr(12354)  # 'あ'
```
###16進数Unicodeコードポイントを文字列として扱うエスケープシーケンス
文字列中の16進数Unicodeコードポイントを文字として扱うエスケープシーケンスとして、\x、\u、\Uが用意されています。それぞれのエスケープシーケンスの後には、2桁、4桁、8桁の16進数で表されたUnicodeコードポイントが続きます。

```python
# 97(aのunicodeコードポイント)は16進数で61
'\x61です'  # 'aです'
'\u0061です'  # 'aです'
'\U00000061です'  # 'aです'

# 12354('あ'のunicodeコードポイント)は16進数で3042
'\u3042です'  # 'あです'
'\U00003042です'  # 'あです'
```

#文字とコードをあれこれやる時
文字コードとはコンピュータ上で文字を利用する目的で各文字に割り当てられるバイト表現です。またはバイト表現と文字の対応関係のことを指して文字コードということもあります。
文字コードの代表例としてUTF-8やShift-jisなどがありますが、各文字コードでは「どのような文字集合」を、「何バイト」で表すかが決められています。代表的なものでは、
- asciiは「数字、アルファベット、記号」を「1バイト」で表す
- Shift-jisは「数字、アルファベット、記号に加え日本語」を「1バイトまたは2バイト」で表す
- UTF-8は「Unicodeに含まれるすべての文字」を「1-6バイト」で表す
など。
文字を文字コード（バイト表現）に変換することをエンコード、文字コードを文字に変換することをデコードと言います。

pythonでは、'文字'.encode('文字コード')で対応する文字コードをバイト型で得て、b'文字コード'.decode('文字コード')で対応する文字を得ます。

```python
# ascii
'a'.encode('ascii')  # b'a'
'あ'.encode('ascii')  # UnicodeEncodeError: 'ascii'は日本語は対象外
b'a'.decode('ascii')  # 'a'

# Shift-jis
'a'.encode('shift-jis')  # b'a'
'あ'.encode('shift-jis')  # b'\x82\xa0'
b'a'.decode('shift-jis')  # 'a'
b'\x82\xa0'.decode('shift-jis')  # 'あ'

# UTF-8
'a'.encode('utf-8')  # b'a'
'あ'.encode('utf-8')  # b'\xe3\x81\x82'
b'a'.decode('utf-8')  # 'a'
b'\xe3\x81\x82'.decode('utf-8')  # 'あ'
```
【Laravel】MySQL5.6→JSON形式のデータ→曖昧検索

##前提条件

テーブル：favorite_fruit

|id  |data  |
|---|---|
|1  |{"fruit":["apple", "banana", "orange"]}  |
|2 |{"fruit":["plum", "pear"]}  |

検索ワード

```
$keywords = ['banana', 'melon'];
```

MySQL5.6

##Laravel
```
$fruit = DB::table('favorite_fruit')
    ->where(function ($sub) use ($keywords) {
        foreach ($keywords as $keyword) {
            $sub->orwhere('favorite_fruit.data', 'like', '%"fruit":[%'. '"'. $keyword. '"'. '%]%');
        }
    });
```

##最後に
MySQL5.７からはJSONが普通に使える
G検定メモ⑩　ディープラーニング編

G検定の勉強中にメモした走り書きを公開するよ。やっとディープラーニングにたどり着いたよ。
まっててね、バーニーおじさん！


---------------------------------------------------------------------


#5－1　ニューラルネットワークとディープラーニング

##1．ディープラーニングの基本

###1.1　多層パーセプトロン

【多層パーセプトロン】　とは、ニューラルネットワークの基本形
入力と出力の関係性が、隠れ層の中に表現されている
（入力と出力の関係性が、隠れ層の中に重みとして表現されている）
隠れ層は、入力と出力を対応づける関数に相当している
入力を受け取って、出力を吐き出す関係性を表しているだけで、関数のようなもの。

ニューラルネットワークの原点は、【単純パーセプトロン】という隠れ層のないモデル
これは、線形分類しかできない
隠れ層を追加する事で、非線形分類ができるようになった

###1.2　ディープラーニングとは

隠れ層を更に追加していけば、より複雑な問題を解くことができるようになるはず！
ディープラーニングとは、隠れ層を増やしたニューラルネットワーク
層が「深い」から深層学習と言われる。

機械学習には、いろいろな手法があるが、ディープラーニングは、その中の一つ
ディープラーニングはニューラルネットワークを応用した手法
ディープラーニングを行うニューラルネットワークのモデルを、ディープニューラルネットワークと呼ぶ

##2．既存のニューラルネットワークにおける問題
【誤差逆伝播法】
モデルの予測結果と実際の正解値との誤差をネットワークに逆向きにフィードバックさせる形でネットワークの重みを更新していく方法
ネットワークが深くなると、誤差が最後まで正しく反映されなくなってしまう。
・理由
【シグモイド関数】の特性
活性化関数としてシグモイド関数を使っていたが、シグモイド関数の微分は最大値が0.25にしかならない。1より大分小さい。
隠れ層を遡るごとに、（活性化関数の微分がかけ合わさる）伝播していく誤差はどんどん小さくなっていく。
このことを、勾配消失問題と呼ぶ。
勾配消失問題は、ニューラルネットワークを深層にする上での大きな妨げ。

#5－2．ディープラーニングのアプローチ

###1．事前学習によるアプローチ
2006年　トロント大学　ジェフリーヒントン
オートエンコーダー（自己符号化器）

###1.1オートエンコーダ
可視層と隠れ層の2層からなるネットワーク
入力層と出力層がセットになった物
オートエンコーダに与えられる入力は、
可視層（入力層）→隠れ層→可視層（出力層）の順に伝播し、出力される
「入力と出力が同じになる」
隠れ層には、「入力情報が圧縮されたもの」が反映される

※注意すべき点
入力層（可視層）の次元よりも、隠れ層の次元を小さくしておくこと
入力されたデータは隠れ層で要約されて、要約を元に、出力でもとのデータと同じになるように再現される。
要約がまちがっていれば、もとのデータと同じにならない。
入力層→隠れ層　エンコード
隠れ層→出力層　デコード

###1.2　積層オートエンコーダ
オートエンコーダを積み重ねる事で、ディープニューラルネットワークにする
ディープーオートエンコーダーをつくる
積層オートエンコーダという手法
ジェフリーヒントンが考えた手法

やりかた
それまでのディープニューラルネットワークでは、一気に全ての層を学習していた

積層オートエンコーダでは、
入力層に近い層から順番に学習させるという、逐次的な方法をとった
・例えば
一つ目のオートエンコーダAにて、可視層→隠れ層→可視層の学習をし、重みの調整を行う。次に、オートエンコーダAの隠れ層をオートエンコーダBの可視層として利用する。可視層（オートエンコーダAの隠れ層）→隠れ層→可視層
順番に学習していく
それぞれの隠れ層の重みが調整されるので、全体で見ても重みが調整されたネットワークができる。
このオートエンコーダを順番に学習していく手順の事を「事前学習」と呼ぶ

###1.3　ファインチューニング
オートエンコーダを積み重ねても、ラベルを出力することはできない
オートエンコーダでできるのは、入力から大事な情報だけを抽出するという教師なし学習の手法

そこで、積層オートエンコーダでは、
オートエンコーダを積み重ねた最後にロジスティック回帰層（シグモイド関数あるいはソフトマックス関数による出力層）を足すことで、教師あり学習を実現しています。
ただし、回帰問題においてはロジスティック回帰層ではなく、線形回帰層を足す事となる。
これにより、ネットワーク全体は隠れ層が複数あるディープニューラルネットワークが実現できる。

最後に足した、ロジスティック回帰層にも　重みの調整が必要
事前学習を終えたら、ロジスティック回帰層を足して、
仕上げにディープニューラルネットワーク全体で学習を行う。
事前学習で隠れ層の重み調整が終わっているので、一気に学習しても上手くいく

この最後の仕上げのことを「ファインチューニング」と言う

積層オートエンコーダは事前学習とファインチューニングの工程で構成される

###1.4　深層信念ネットワーク
2006年　ジェフリーヒントン　深層信念ネットワークという手法も提唱
教師なし学習（オートエンコーダに相当する層）に制限付きボルツマンマシンという手法を用いている。

###2．事前学習なしのアプローチ
事前学習は、全体の学習に必要な計算コストが非常に高くつく
という欠点があった。
今では、事前学習を行わず、勾配消失問題の原因であった活性化関数を工夫するというテクニックで実現している。

#5－3　ディープラーニングを実現するには
###1．CPUとGPU
第三次AIブームの要因　ハードウェアの進歩
・ムーアの法則
半導体の性能と集積は、18ヶ月ごとに2倍になる
半導体の性能・集積が鍵を握る

###1.1　CPUとGPU
コンピュータにはCPUとGPUの二つの演算処理装置がある。
CPU・・・コンピュータ全般の作業を処理する役割を担う
GPU・・・画像処理に関する演算を担う
　　　　　大規模な並列演算処理に特化している
###1.2　GPGPU
ディープラーニングでは、テンソル（行列やベクトル）による計算が主になるので、同じような計算処理が大規模で行われる
この作業にはGPUが適している
GPUは画像処理に最適化されている
画像以外の計算に使えるように改良されたGPUを作った
GPGPU（ジェネラルパーパスコンピューティングオンGPU）と言う
NVIDIAが開発をリードしている。

グーグルはテンソル計算処理に最適化した演算処理装置を開発
TPU（テンソルプロセッシングユニット）と呼ぶ

###2．ディープラーニングのデータ量
ディープラーニングの学習とは、モデルが持つパラメータの最適化
パラメータが増えれば計算量も増える
アレックスネットでのパラメータ数は6千万個
必要なデータ数はどれくらいかという指標はないが目安はある
###バーニーおじさんのルール
モデルのパラメータ数の10倍のデータ数が必要
実際はデータ数が少なくてすむようなテクニックを適用する。
G検定メモ⑨　機械学習の代表的な手法編

G検定の勉強中にメモした走り書きを公開するよ。
なんか機械学習の手法をまとめたメモがいくつもあるんだけど、どんだけ機械学習の手法を理解できなかったんだって話だよね。
やばたん

---------------------------------------------------------------------

#教師あり学習の代表的な手法 

・最近傍法 ニアレストネイバー法 
最も近い 
近接データのカテゴリは同じと言う考え方 
単純なのでノイズに弱い 

・ナイーブベイズ法 
ベイズの定理を用いる 
データの特徴ごとに、どのカテゴリに当てはまるのかを確立で表現する 
それを掛け合わせた結果に基づいて判断する 
全カテゴリ中「与党」と言う単語が含まれる確率 
政治カテゴリ中「与党」と言う単語が含まれる確率 
スポーツカテゴリ中「与党」と言う単語が含まれる確率 
一番確率が高いカテゴリに割り振る 

・決定木 
ある属性が特定の条件を満たすか否かで分ける 
性格判断で使われているのと同様の手法 
与党を含む　ｙ　or　ｎ 
与党を含む　ｙ　のなかで、国会を含む　ｙ　or　n 
与党と国会両方含む物は政治カテゴリー 
質問の木が自動で作られるのが特徴 
複数の属性を扱えないので、精度を高くできないと言う特徴もある 

---------------------------------------------------------------------


1.線形回帰 
データ分布に当てはまる直線を引き、xの入力時にyの値を返す 
ラッソ回帰 L1ノルム 
リッジ回帰 L2ノルム 

2.ロジスティック回帰 
分類に用いる手法 
シグモイド関数を使い、データを0か1に分類する（二つに分類） 
ソフトマックス関数を使い、データを複数に分類する 

3.ランダムフォレスト 
決定木を用いる手法 
決定木で全パターンを出したあと、ランダムに選んで多数決をとる（ブーストラップサンプリング） 
	・複数モデルで学習させる事を「アンサンブル学習」と言う 
	・全体から一部のデータを用いて複数モデルで学習する方法を「バギング」という 

4.ブースティング 
全体から一部のデータを抽出して、逐次的に複数モデルで学習する方法を「ブースティング」という 
バギングは一気に並列で行う 
ブースティングは一つずつ改善しながら行う 
	・Adaboost 
	・勾配ブースティング（gradient boosting） 
	・XgBoost 

5.サポートベクターマシン（SVM） 
各データ点との距離を最大になる境界線を求めて、パターン分類を行う。 
距離を最大化することを「マージン最大化」という 
	・高次元データ 
	・線形分類できないデータ 
を扱う事もあるので難しい。 
「カーネル関数」を使い、データを高次元に写像（カーネルトリック）して、写像後の空間で線形分類する手法をとる 

6.ニューラルネットワーク 
	・単純パーセプトロン 
入力層と出力層だけの2層構造 
活性化関数として、シグモイド関数を使い0.1に分類する。しかし、これでは線形分類しか出来ない。 
	・多層パーセプトロン 
層の数を増やしたニューラルネットワーク 
入力層と出力層の間に、隠れ層を追加したもの。非線型分類も出来る。 
誤差逆伝播法（backpropagation）を使い、予測と実際の誤差をネットワークにフィードバックする。 



#教師なし学習の代表的な手法 
クラスタリング 
グループ分け 
トップダウンとボトムアップの方法がある 

トップダウン 
1．k-means 
クラスタ分析 
元データをｋ個のクラスタ（グループ）へ分類する手法 
元データからグループ構造を見つけ出し、それぞれをまとめる 
　1．ｋ個のクラスタに分ける 
　2．各クラスタの重心を決める 
　3．重心と各データとの距離を求め、各データを最も距離が近い重心に対応するクラスタに振り分け直す 
　4．重心の位置が変化なくなるまで、2，3を繰り返す 

ボトムアップ 
・階層的クラスタリング法 
全ての2点間のの距離を調べ、最も近い2点を一つのクラスタとする 
次に近い2点を同クラスタとする 
を繰り返す。最終的に一つのクラスタになる 
・相関ルール 
［牛乳とヨーグルトを買う客の70%はパンとバターを買う］は全体の3%だ 
これを相関ルールと言う 
70%を確信度という 
30%を支持度という 
特定の支持度を決めて、その支持度を超える集合を頻出アイテム集合と呼ぶ 

2．主成分分析（PCA） 
データの特徴量が多いとき、特徴量を少なくするために使う 
データの特徴量の相関を分析することで、データの構造をつかむ手法 
相関を持つ多数の特徴量から、相関のない少数の特徴量へと次元削減する 
この少数の特徴量のことを主成分と呼ぶ 


#強化学習 
学習を行う主体をエージェントと呼ぶ 
エージェントには、状態と、取りうる行為のペアのルール集合が与えられる 
ルールは評価値を持っている 
エージェントは外界の環境から、現在の自身の状態を把握して、評価値の高いルールを採用実行する 
環境から報酬が与えられる 
ルールの評価値を変更する 
教科学習とは、「行動を学習する仕組み」 
ある環境下でもくてきとする報酬を最大化するためにはどのような行動をとっていけば良いのかを学習する。 
一連の行動系列の結果としての報酬を最大とするように学習する。 
→ロボットの歩行、ブロック崩しゲーム 

問題点 
・状態をどのように表現するか 
・状態に基づいて、どのように行動に結びつけるか
Google Cloud Platform (GCP) でJupyter labを使用する

[Anacondaを利用してCompute Engineのインスタンス上にJupyter Notebookを導入する](https://qiita.com/tk_01/items/307716a680460f8dbe17)

以前、上記を参考にしながらGCPでJupyter notebookを使用してみましたが、もっと簡単にJupyter labを使用する方法がありましたので紹介します。

1. GCPのメニューからAIプラットフォームを選択する。
![Screenshot 2019-10-29 at 22.23.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262409/7d261ba4-db04-2dca-7dcb-fdf27773fae6.png)

2.ノートブック＞ノートブックインスタンスを表示をクリック
![Screenshot 2019-10-29 at 22.27.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262409/d39f4b74-7b04-e2e0-629a-3aa95e5079d9.png)
 
3. 新しいインスタンス＞Pythonを選択
![Screenshot 2019-10-29 at 22.29.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262409/eaed0abc-effa-6e9d-6868-81d8ea00271e.png)

これでもう、Jupyter labが立ち上がります。簡単ですね。
JavaScriptで濁音や半角カナの処理

ひょんな拍子に、JavaScriptで「ガ」のような濁点付きの仮名を「カ」に直さないといけなくなったのですが、テーブルなしで対応できることが判明しました。

## NFCとNFD

「`ガ`」と「`ガ`」、肉眼で見ればほぼ違いがないですが、データとしては全く別物になっています。

* `ガ`…文字コードは`\u30ac`、濁点まで含めて1つの文字
* `ガ`…文字コードは`\u30ab\u3099`、「`カ`+結合文字の濁点[^1]」

このように、Unicodeでは、「複数のコードポイントを結合した文字」と「結合した状態で1つのコードポイントに登録された文字」の両方が存在していることがあります。視覚的にも意味的にも全く同じものが別なコードで表されていると（正準等価）、検索の際に厄介です。

そのようなときに役立つルールとして、Unicodeは正規化の手順も定義しています。これは4つありますが、まずは2つを取り上げます。

* NFD…正準等価な文字については、結合文字に分解した形で正規化する
* NFC…正準等価な文字については、NFDで正規化したものを再度合成した形に正規化する

これを使うことで、1コードポイントで書かれた「ガ」から「カ」を抽出することが可能となります。

## JavaScriptから使ってみる

ES6でJavaScriptにも`String.prototype.normalize()`というメソッド（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)）が用意され、Unicode正規化を施した文字列を得られるようになっています。引数には、`NFC`、`NFD`、`NFKC`、`NFKD`（あと2つは後述）の4つがあります。

そして、濁音・半濁音入りの文字列をNFDで正規化すれば、1文字目は清音になるので、これを取り出せば濁点を外せます。逆に、結合文字の濁点を追加してからNFC正規化をかければ、1コードポイントになった濁音入りの仮名が得られます[^2]。

```javascript
console.log('ガ'.normalize('NFD')[0]) // => 'カ'
```

## NFKCとNFKDと半角カナ

Unicode正規化には、NFC・NFD以外に、「意味が同じになる（互換等価）」を基準にしたNFKC・NFKDというものがあります。これは、正準等価の正規化に加えて、

* 上付き・下付き文字→通常の文字
* 装飾付き文字の装飾を外す（`①`→`1`）
* 組文字を解体する（`㈱`→`(㈱)`）
* 半角・全角形を使わない形にする（`Ａｱ`→`Aア`）

のような正規化を行います（NFKCとNFKDの違いはNFCとNFDの違いと同じで、NFKCは結合済み文字を、NFKDはばらした文字を優先します）。ということで、この変換を使えば、全角英数→半角英数、半角カナ→全角カナの変換が可能です（性質上、逆変換はできません）。

## 注意点

* `String.prototype.normalize()`はES6で加わったメソッドですので、IE11には存在しません。そして、Polyfillをやろうにも、Unicodeのテーブルが必要なので、相応の容量を食うことが予想されます。
* 4つの正規化全ては、**もとに戻せません**。特に、「CJK互換漢字」という一部の漢字は、見た目が違うものにNFC・NFD正規化でも変わってしまうことがあります（`靖`→`靖`など）。これもあって、macOSでは「CJK互換漢字などを除外してNFD正規化を行う」という我流の方法でファイル名を格納しています。

[^1]: 単体の濁点（`゛`）は`\u309b`という別なコードポイントにあります。
[^2]: もちろん、結合済のコードがない場合（鼻濁音の`か゚`やアイヌ語用の`ト゚`など）は、NFC正規化してもそのままです。
G検定メモ⑧　自然言語処理編

G検定の勉強をしてる時の走り書きを公開するよ。

---------------------------------------------------------------------


・自然言語
人間が意思疎通として利用している言語
例　日本語や英語などの言語

・自然言語処理技術
自然言語をコンピュータで処理して、そこに表現されている意味をつかもうとしたり、
人間にとって有益な操作を行ったりするもの
自然言語をコンピュータで処理できるように、
各文字にはユニークな識別子（あ・・01、い・・・02など）、記号に変換され、文章は記号の羅列として表現される


・言語モデル
識別子の羅列として記号化された文章の、自然言語としての妥当さをモデリングする確率モデルのことを指す
例えば、今日は朝からさむいですね/寒い朝からですねは今日
　　　　同じ単語から作られているが前者が日本語としては普通
　　　　日本語の言語モデルでは、前者の確率が高く、後者の確率は低い
このように、言語モデルは、注目する言語の言語らしさを確率で表現する手法になる

ある言語モデルが、にほんごを適切にモデル化できているとすると、
一部の表現が下線で表現されている文を自然な表現にする事ができる。
JavaScriptとthisとEventListener

備忘録として。

---

以下のコードを見てください。

```javascript
class Hoge {
    myname;
    constructor() {
        this.myname = "taro";
    }

    onClick() {
        console.log(this.myname);
    }
}
```

Hogeっていうクラスがあって、クラスメソッドでonClickが定義されています。
何かがクリックされた時にthis.mynameを表示しています。
this.mynameはconstructorで`taro`として初期化されていますね。

関数の名前から、onClickがどんな時に呼ばれるか分かると思います。
そして分かる人なら、この時点でこのコードは上手く動かない可能性がある、とも気づくはずです。

そうです、onClickはその名の通り、何かがクリックされたタイミングで呼ばれます。
例えば以下のようなHTMLがあるとしましょう。　

```HTML
<button id="foo">Foo</button>
```

そして、jsに以下のコードが追加されました。

```javascript
let hogeObject = new Hoge();
document.getElementById("foo").addEventListener("onclick", hogeObject.onClick);
```

この時、`id="foo"`を持つボタンが押された時どんな挙動になるでしょうか。

`taro`を期待しますが、正解はundefinedです。
クラスプロパティがmynameとなっているのでundefinedです。

ここのクラスプロパティを、もしくはonClickの中で呼び出しているプロパティの入力を、間違えて`location`とか`navigator`とかと入力してしまっていると別の値が表示されるかもしれません。

EventListenerのコールバック関数で扱えるthis、そのコールバック関数がクラスメソッドだとしても、そのthisはグローバルオブジェクトを指します。

期待通り動かしたいなら、1つ無名関数をコールバックとして挟みましょう。

```javascript
document.getElementById("foo").addEventListener("onclick", (e) => {hogeObject.onClick(e)});
```
G検定メモ⑦　意味ネットワーク編

G検定を受ける前に、公式テキストを読んでメモした走り書きがあったので公開するよ。
でもこれまじで走り書きだから何の参考にもならないね。メンゴ。

---------------------------------------------------------------------

知識ベースシステム
コンピュータが処理可能な知識ベースを用いて、
知識ベース
・問題解決の対象となる世界における、事実やルールの形式的記述の集合
・何らかの形式で構造化されたデータの集合
・知識ベースシステムにおける推論エンジンを動かすための元となるものの集合
知識ベース
【できること】
・永続性がある
・複製性がある
・推論の一貫性がある（同じ質問にいつも同じ回答ができる）
【できないこと】
・融通性
・柔軟性
・適応性
・創造性

意味ネットワーク
Semantic network　

ラベル付けした「概念（人間や犬、植物など）」と、各概念の間を、is-a関係とpart-of関係でつないだネットワーク。
犬is-a哺乳類、哺乳類is-a動物、肉球part-of足、足part-of犬、などの関係性を記述する。
コンピュータが、概念どうしの関係を理解できるようにしたモデル。

■オントロジー
概念体系を記述するための方法論

オントロジーとは、対象世界を　どのように捉えた（概念化した）か？
をコンピュータに理解できる形で体系化したもの

オントロジーの目的
知識の共有と活用が目的

概念間の関係は、is-a関係、part-of関係で記述
part-of関係には、いろいろな種類の関係がある　最低5種類


オントロジーの構築
・ヘビーウェイトオントロジー　重量オントロジー
　記述は哲学的に考察して、綿密な設計の上で行っていく
　人が介在する傾向が強い、時間がかかる、コストもかかる

・ライトウェイトオントロジー　軽量オントロジー
　分類関係の正当性については、深く考えない
　コンピュータで概念間の関係性を自動で見つけよう　という取り組みと相性が良い
　→ウェブマイニング、ビッグデータ解析、データマイニング　で利用される


オントロジーを使って作成した、ウェブ上の意味ネットワークがセマンティックWeb
それを自由に使うことができるようにした物が、リンクト・オープン・データ

LOD（リンクト・オープン・データ）
ウェブ上でコンピュータ処理に適したデータを公開・共有するための技術の総称
従来のウェブがHTML文書館のハイパーリンクによって人間のための情報空間の構築を目的としてきたことに対応して、LinkedOpenDataでは構造化されたデータ同士をリンクさせる事でコンピュータが利用可能な「データのウェブ」の構築を目指している。
DataTable に AsEnumerable の定義がありません

.NET Framework 2.0 時代 (か、それより前) のプロジェクトを .NET 4 に書き換える作業で遭遇した問題。

2回目も思い出すのに時間を使ったのでメモしておく。　

## 症状

DataTable を IEnumerable\<xxx\> に読み替えようとして DataTable.AsEnumerable() したが、表題のエラーが表示されてビルドできない。

`System.Linq` を using しても症状が変わらない。

## 解決

プロジェクトの参照に、`System.Data.DataExtensions` を追加する。

.NET 4 をターゲットにしたプロジェクト (WinForms) を新規作成した場合、このアセンブリは最初から参照されていた。

## 確認した環境

- Windows 10 Home
- Visual Studio Community 2015
- Visual Studio Community 2019
G検定メモ⑥　エキスパートシステム編

G検定を受ける前に、公式テキストを読んでメモした走り書きがあったので公開するよ。
でもこれまじで走り書きだから何の参考にもならないね。メンゴ。
この走り書きで理解できる人は、ちゃんとわかってる人だね！すごいぞ！

---------------------------------------------------------------------

マイシン　mycin　抗生物質の処方を行う専門医システム
if　then　ルールで書かれた知識
デンドラル　1960
マキシマ　1960年代

エキスパートシステムの限界
知識獲得のボトルネック

知識獲得が難しい
獲得した知識の管理が難しい
知識表現が難しい



対話型システム
イライザ
単純なルールで記述しても、そこに知性を感じてしまう
イライザ効果


意味ネットワーク
セマンティックネットワーク
概念をラベルのついたノードで表し、概念感の関係をラベルのついたリンクで結んだネットワーク

is-a関係　継承関係
part-of関係　属性

Cycプロジェクト　ダグラスレナード　1984～
膨大すぎていまだに続いている


オントロジー
概念化の明示的な仕様
知識を体系化する方法論

概念感の関係の種類
is　a　の関係
上位概念と下位概念の関係　→推移律が成り立つ

part　of　の関係
全体と部分の関係



セマンティックウェブ
ティムバーナーズリー氏により考案

インターネット上にあるデータをコンピュータにわかりやすいように、
表現方法を統一してまとめた
オントロジー技術を用いたりして、インターネット上の情報が知識ベースとして利用できるようにした

リンクとオープンデータ
リンクト・オープン・データ
ネット上でデータを公開する
誰もが自由に使うことができるように

ウェブマイニングやデータマイニングで利用

ワトソン
東ロボ君
G検定メモ⑥　ボードゲーム編

G検定を受ける前に、公式テキストを読んでメモした走り書きがあったので公開するよ。
でもこれまじで走り書きだから何の参考にもならないね。メンゴ。
この走り書きで理解できる人は、ちゃんとわかってる人だね！すごいぞ！


---------------------------------------------------------------------

ミニマックス法

次の手をすべてならべ、それぞれの手にスコアをつける
そのスコアを元に、最も有利な手（スコアの高い手）を選択する手法
それぞれの手にスコアをつけなければならない。

すべての手にスコアをつけるので、計算が膨大になってしまう


アルファベータ法で、次元を少なくして、効率的に計算する
アルファカット
ベータカット


モンテカルロ法
プレイアウトして、ブルートフォースで良い結果を探す。
picoCTF 2019 shark on wire 1 - Points: 150

#問題

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/845a208b-cdf6-4e9a-bd15-2b47352e6a1c.png)

#解いてみた

パケットです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f04e6570-df21-aada-276b-60591137f4dd.png)

「picoCTF」で検索してみましたが、ヒットなし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f640ef14-8ef6-3006-6caf-0b8bc98ffb78.png)

「パケットを右クリック⇒追跡⇒UDPストリーム」
でやりとりしているデータを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/306a46dc-2eba-36f7-f5ad-46d1ab49097b.png)

右下のストリームの数字を変えてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/801e5f35-ef06-391f-b441-9b4fb8c8d4c8.png)

6のときにフラグがありました。
ちなみに7はにせもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2673749c-38ce-f79e-d5f9-99bbbcc4935e.png)
[Excelマクロ] Cellsでセル指定できるのはアクティブシート内だけかよ，という話

データの解析で楽するためのマクロを作ろうとしたら，しょーもないところで躓いてしまった．
まとめておきます．

#何をしたかったか

Sheet1がこんな感じになっているとする．
![hoge1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325381/a6d212dd-747c-0f64-2a38-a8eb71b8cb99.png)



このとき，各条件での「Current1」だけをSheet2にまとめたい．
こんな感じ↓↓↓
![hoge2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325381/8d688c92-3ff0-9d31-0ad1-40ff73866ee3.png)

この場合は数が少ないから手でできるけれど，データが増えてくるとかなり面倒．

#コピーするだけでは？

以前[こちらのサイト](http://officetanaka.net/excel/vba/cell/cell09.htm)を拝見し，「は～すご」と思ったので，コピーは以下のように書くことにしていた．

```visualbasic
Worksheets("Sheet2").Range("C5:C26").Value = Worksheets("Sheet1").Range("C5:C26").Value
```

さて，今回は一定間隔で並ぶデータをコピーしたい．
上記ダミーデータでは3条件だが，条件数は今後変わるかもなので，これを変数にしてFor文で回せるようにしよう．それならば，Cells(row,column)でセルを指定するのが何かと都合が良い．

というわけでコピーのところを以下のように書き換え．

```visualbasic
Worksheets("Sheet2").Range(Cells(5,3), Cells(26,3)).Value = Worksheets("Sheet1").Range(Cells(5,3), Cells(26,3)).Value
```

"C5:C26" を Cells(5,3), Cells(26,3) に書き換えただけですね．実際はここに変数を入れてます．

#エラー吐く

しかし，上記コードでは思ったように動かず．
![hoge3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325381/059120f4-dcea-8ed5-0647-1ff5923a3fd6.png)

調べたら，どうもCellsでセル指定できるのはアクティブシート内だけのようだ．
この情報にたどり着くまでにえらい時間をかけてしまった...

#解決策
[こちらのサイト](https://www.relief.jp/docs/excel-vba-cell-range-copy-other-sheet.html)のお世話になりました．

結論を言うと，Cellsの上位のオブジェクト式を省略せずに書けば動きます．
是非上記サイトもご参照ください．

```visualbasic
Worksheets("Sheet2").Range(Sheets("Sheet2").Cells(5,3), Sheets("Sheet2").Cells(26,3)).Value = Worksheets("Sheet1").Range(Sheets("Sheet1").Cells(5,3), Sheets("Sheet1").Cells(26,3)).Value
```

以上！

#Reference
- [Office TANAKA - セルの操作](http://officetanaka.net/excel/vba/cell/cell09.htm)
- [インストラクターのネタ帳 - セルのコピーをシート間で行うExcelマクロ](https://www.relief.jp/docs/excel-vba-cell-range-copy-other-sheet.html)
G検定メモ⑤　ロボットプランニング編

俺がG検定を受けるとき公式テキストを読んでまとめたメモを公開するよ。ロボットのプランニングについてだから需要ないと思うし、適当でいいよ。


---------------------------------------------------------------------
ロボットの行動計画

二つの部屋をロボットに掃除させるプログラム

前提条件
行動
結果

の三つを全パターン分書き出す事で、
特定の条件下において、特定の成果を出すプログラムを組むことができる。

ロボットに二つの部屋を掃除させるには、

前提条件は2パターンのみ
1．掃除された部屋にいる
2．掃除されていない部屋にいる

行動も2パターンのみ
1．部屋を移動数
2．部屋を掃除する

結果も2パターン
1．掃除された部屋にいる
2．掃除されていない部屋にいる

これらを組み合わせた命令文を書くと
前提条件　1．掃除された部屋にいる
行動　1．部屋を移動する
結果　1．掃除された部屋にいる
　　　2．掃除されていない部屋にいる

結果が2の場合は、それが前提条件になり、
前提条件　掃除されてない部屋にいる　行動　掃除する　結果　そうじされた部屋にいる

結果をまた前提条件にして、そうじされた部屋にいる　移動する　掃除された部屋にいる
となって、完了する。

これがプランニング

プランニングの有名な話

積み木の世界
テリーウィノグラード氏のSHRDLUシャードル-積み木の世界

特定条件下のすべてを記述しておけば、その条件下において質問した事はすべて答えられるし、言ったとおりに行動させる事ができる。

テリーウィノグラード氏はラリーペイジを育てた

半順序プランニング
どのような手順で行っても、結果が同じになるようなものは、
すべての手順を記載する必要がないので、記載しない
それが半順序プランニング
Ubuntu18.04 LTS GNOME環境でVNCサーバーを立てる

## 前書き
**SSH経由でUbuntu18.04にリモートデスクトップ**で接続できる環境作ろうとした時に苦労しました。Vinoやvnc4serverを試したが失敗しました。vnc4serverのインストールはできたのですが、画面がグレー色になりました。また、MATEの環境ではうまくいったのですが、デフォルトのGNOME環境を使いたかったためすこし苦労しました。僕の環境は以下の通りです。

```bash
$ lsb_release -a
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic
```
[こちらのサイト](https://www.teknotut.com/en/install-vnc-server-with-gnome-display-on-ubuntu-18-04/)を参考に漸くインストールできたので、その手順をシェアーしたいと思います。

僕がやった作業が以下の通りです。
1. tigervncのインストール
2. リモートデスクトップで接続するユーザーの作成
3. スタートアップスクリプトの作成
4. vncサーバーの起動

## 詳細
### ① tigervncのインストール
まずは、Ubuntuの最新のパッケージ情報を取得し、tigervncをインストールします。

```bash
$ sudo apt-get update 
$ sudo apt-get install tigervnc-standalone-server tigervnc-common tigervnc-xorg-extension
```

### ② VNCユーザ作成
vncを許可するユーザでログインします。

```bash
$ su <存在するユーザー>
```
そして、以下のコマンドを実行し、パスワードの設定します。
パスワードに関する質問が聞かれた「N」を入力します。

```bash
$ vncpasswd
```

vncpasswdコマンドが機能しない場合は、vncserverコマンドを使用してパスワードを入力し、vncserverを強制終了します。


```bash
$ vncserver
$ vncserver -kill :*
```

### ③ 設定ファイルの作成

次に、VNCサーバーがアクティブ化されたときに実行される初期構成としてスタートアップスクリプトを作成します。

```bash
$ vi ~/.vnc/xstartup
```

以下のスクリプトを張り付けます。

```bash
#!/bin/sh

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
dbus-launch --exit-with-session gnome-session &
```


### ④ 起動
以下のコマンドでvncサーバーを起動します。

```bash
$ vncserver -localhost no -geometry 800x600 -depth 24
```
これで準備完了、YEAH~
viewerを使ってアクセスしてみてください。


上記のコマンドで使ったパラメーターの意味は以下のようになります。
1. localhost:リモート接続のうち、セキュアトンネルを利用してないものを禁止
  (noにする事でトンネル作らずアクセスできる）
2. geometry:画面のサイズ
3. depth:画面のビットカラー
   8 (256色)、 16 (最大65536色)、 24 (最大約1600万色)のいずれかを指定

#### VNCサーバーの終了
まずは動作中のVNCサーバーの一覧を表示します。

```bash
$ vncserver -list
TigerVNC server sessions:
X DISPLAY #     PROCESS ID
:1              14534
```
上記の場合は、一つだけ起動しており、そのVNCサーバーを終了するときは以下のコマンドを実行します。

```bash
$ vncserver -kill :1
```
-killパラメーターにDISPLAY番号を指定します。
また、ワイルドカードを使う事で一気にすべてのVNCサーバーを終了させることもできます。

```bash
$ vncserver -kill :*
```
G検定メモ④　人工知能の歴史編

俺がG検定を受けるときに、公式テキストを読んでまとめたメモが出てきたので公開するよ。
試験の前にざっと見返して、「わかる、わかるぞ！進研ゼミでやった問題だ！」みたいな感覚に耽ってやる気を高めよう！



			第一章	人工知能（AI）とは
	1-1.	人工知能（AI）とは
		１．	人工知能の定義
			1.1	人工知能とは何か

1956年　【ダートマス会議】にて【ジョン・マッカーシー】が【人工知能（Artificial Intelligence）】という言葉を使った

共通認識
推論、認識、判断など、人間と同じ知的な処理能力を持つ機械(情報システム)
それ以外の解釈は多様で定義が異なる

			1.2	人工知能の大まかな分類
書籍「エージェントアプローチ人工知能」
　人工知能とは
・周囲の状況によって行動を変えるエージェント
・入力によって出力を変えるプログラム

【人工知能のレベル別分類】
■レベル１：シンプルな制御プログラム
　全ての振る舞いがあらかじめ決められている
　例）エアコンの温度調整、洗濯機の水量調整、電気シェーバーの深剃り調整
■レベル２：古典的な人工知能
　探索・推論、知識データを利用する事で、状況に応じて極めて複雑な振る舞いをする
　例）掃除ロボット、診断プログラム
■レベル３：機械学習を取り入れた人工知能
　非常に多くのサンプルデータをもとに入力と出力の関係を学習
　パターン認識×ビッグデータで進化を続けている
　例）検索エンジン、交通渋滞予測
■レベル４：ディープラーニングを取り入れた人工知能
　特徴量と呼ばれる変数を、自動的に学習するサービスや製品
　用語）特徴量・・・どのような特徴が学習結果に大きく影響するかを定量的に表したもの
　例）画像認識、音声認識、自動翻訳


			1.3	AI効果
人工知能で何か新しいことが実現されても、その原理がわかってしまうと、
「それは単純な自動化であって知能とは関係ない」と結論付ける人間の心理的な効果

			1.4	人工知能とロボットの違い
ロボットと人工知能は明確に異なる
ロボットの脳にあたる部分が人工知能
　人工知能研究は
　「考える（知的な処理能力）」という「目に見えないもの」を中心に扱っている

----------------------------------------------------------------------------

	1-2.	人工知能研究の歴史
		1.	人工知能研究の歴史
			1.1	世界初の汎用コンピュータ誕生
1946年　エニアック（ENIAC）ペンシルバニア大学にて開発

			1.2	ダートマス会議
1956年　ダートマス会議　開催　エニアック誕生から10年後
　重要な出来事
	・ジョン・マッカーシー　が「人工知能」という言葉を作った
	・ニューウェル　と　サイモン　が世界初の人工知能プログラム「ロジック・セオリスト」を開発
　伝説級の人物が参加した伝説の会議
	マーヴィン・ミンスキー
	ジョン・マッカーシー
	アレン・ニューウェル
	ハーバード・サイモン

			1.3	人工知能研究のブームと冬の時代
■第一次AIブーム　推論・探索の時代
　1950年代後半～1960年代
　【要因】
　コンピュータによる推論・探索の研究が進み、特定の問題に対して解を提示できるようになったことでブームが起きた
　【問題点】
　トイ・プロブレム問題（おもちゃの問題）
　簡単な問題はとけても、複雑な現実問題は解けない事が判明した
　（迷路や数学の定理は解けるが、現実の問題は解けない）
■第二次AIブーム　知識の時代
　1980年代
　【要因】
　データベースに大量の専門知識を詰め込んだ「エキスパートシステム（専門家システム）」が登場した
　【問題点】
　知識を蓄積・管理する事は大変すぎて出来ない事が判明した
　日本では：大型国家プロジェクト「第五世代コンピュータ」推進されていた。
■第三次AIブーム　機械学習・特徴表現学習の時代
　2010年～
　【要因】
　１．ビッグデータを用いる事で、自ら知識を獲得する「機械学習」が実用化された
　２．知識を定義する要素である「特徴量」を人工知能が自ら習得する「ディープラーニング（深層学習）」　が登場した
　その他ジェフリーヒントン率いるトロント大学がILSVRCの画像認識コンペティションで圧倒的優勝　　（ディープラーニングを利用）
　グーグルのアルファーゴがプロ棋士に囲碁で勝利などのトピックも重なって話題となった。
　レイ・カーツワイルのシンギュラリティー懸念も話題となった。
　2019年現在も進行中のブームである

	【まとめ】
　第一次AIブーム「推論・探索の時代」、第二次AIブーム「知識の時代（エキスパートシステム）」、第三次　AIブーム「機械学習と特徴表現学習の時代（ディープラーニング）」
G検定メモ③　機械学習編　②と重複もある

機械学習の概要（種類と課題と手法）

機械学習の種類は3つある
　1．教師あり学習
　2．教師なし学習
　3．教科学習

機械学習の課題も3つある
　1．回帰問題
　2．分類問題
　3．クラスタリング

機械学習の代表的な手法
1．教師あり学習での手法

　①線形回帰（回帰問題）・・・ラッソ回帰
　　　　　　　　　　　　　　　リッジ回帰
　　回帰直線を求めることで、入力データから出力の値を予測する。
　　回帰問題に使用する。

　②ロジスティック回帰（分類問題）
　　二つに分類するとき・・・シグモイド関数
　　多数に分類するとき・・・ソフトマックス関数
　　離散しているデータを分類するために使用する。
　　分類問題に使用する。

　③ランダムフォレスト
　　複数のモデルを一気に並列に作成する（バギング）
　　ブートストラップサンプリングを用いる
　　→アンサンブル学習、バギング
　　

　④ブースティング
　　複数のモデルを逐次的に作成する（ブースティング）
　　バギングは並列のブースティングは逐次的
　　AdaBoost、勾配ブースティング（gradient boosting）,XgBoost

　⑤サポートベクターマシン（SVM）
　　各データ点との距離が最大となるような境界線を求め、パターン分類を行う
　　マージン最大化（距離の最大化）
　　高次元のデータを扱う→直線でなく超平面で考える
　　データが線形分類できない→高次元に写像し、空間で線形分類する
　　高次元に写像→カーネル関数を使う、カーネルトリックと言う

　⑥ニューラルネットワーク
　人間の脳の中の構造を模したアルゴリズム
　単純パーセプトロン・・・入力と出力の2層構造の単純なニューラルネットワーク
　活性化関数としてシグモイド関数を使う
　ロジスティック回帰と数式上は同じ
　入力層と出力層の間に隠れ層を追加した物を、多層パーセプトロンと言う
　隠れ層を追加したことで表現の幅が大幅に向上するが誤差も増えてしまう。
　誤差逆伝播法（backpropagation）で調整

2．教師なし学習の代表的な手法
　①k-means
　ｋ個のグループに入力データを分類する
　グループのことをクラスタとよび、この分析のことをクラスタ分析と言う
　グループごとに分類されたものに、人間がラベル付けをする。

　②主成分分析（PCA）
　データを主成分だけになるよう次元削減を行う
G検定メモ②　機械学習編

G検定を受ける前に、公式テキストを読んでメモした走り書きがあったので公開するよ。
受験前にザーッと読んでおさらいしてね。



【機械学習の　学習方法　】
は3種類
・教師あり学習
　　正解付きデータから学習する
・教師なし学習
　　入力データそのものからその構造や特徴を学習する
・教科学習
　　報酬を定義して、それを最大化するように学習する
・半教師あり学習
　教師あり・なし学習の組み合わせによって学習する。

【機械学習の解く　課題　】
は3種類
・回帰
　ある数値から、連続値を予想する問題
・分類
　ある入力から、そのラベルを予想する物　
・クラスタリング
　ある入力を、いくつかのグループに分類する事

【教師あり学習のモデル】
1．線形回帰モデル
　データの関係性を直線で表す手法
　例　住宅価格を部屋数から予測する

2．非線形回帰モデル
　回帰を解くモデル
　データの関係性を曲線で表す手法
　株価データなど直線で表現するには限界があるもの

3．K近傍方（KNN）
　分類問題を解くモデル
　ある入力から、特徴が似ている順にK個のデータを選択し、
　最も多く取得されたクラスへ分類する手法
　Kの値は任意に設定できるので、大きくするほど境界がなめらかになる

4．ロジスティック回帰
　分類問題を解くモデル
　データを2クラスへ分類するための手法

5．サポートベクターマシン
　データを2クラスへ分類するための手法
　マージンを最大化する決定境界、識別面を求める。
　●スラック変数
　　誤分類を許容した上でできるだけ誤分類を少なくするよう決定境界を求めることが出来る。
　●カーネル法
　　線形分類できないデータに対して非線形な決定境界を求めることができる
　●カーネルトリック
　　計算コストを削減に効率よく非線形な決定境界を求めることができる


【教師なし学習のモデル】

K平均法（K-means）
データをK個のクラスに分類する手法
Kの値は任意で決定できる
クラスタリングを行うための手法

主成分分析（PCA）
学習データの分散が最大となる方向へ線形変換を求める手法
次元を削減するために利用する
1次元PCA
2次元PCA
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
機械学習　　教師あり学習　　回帰　　　　　需要予測　売上予測
　　　　　　　　　　　　　　分類　　　　　不正探知　人口予測
　　　　　　教師なし学習　　クラスタリング
　　　　　　教科学習　　　　Q学習
　　　　　　　　　　　　　　　　　　　　　　　ゲーム　リアルタイム判断
　　　　　　半教師あり学習　　　　　　　　　　自動運転
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

【機械学習モデルの学習】
モデルのパラメータを更新しながら、最も予測性能が良くなるパラメータ値を見つける。
どんなデータに対してもぴったりと予測が当てはまることは現実的にはあり得ないため、モデルには誤差がある。
この誤差が最も小さくなるパラメータの値がモデルにとって最適なパラメータと言える。

【最小二乗法】
学習データの平均二乗誤差を解析的に求める手法
平均二乗誤差　ミーンスクエアードエラー
データとモデル出力の間にある誤差を二乗したもの
（二乗しないとプラマイが相殺されてしまう）

【勾配降下法】
平均二乗誤差を最小化するパラメータを逐次的に求める手法
最小二乗法では求められない複雑なモデルに利用する
誤差関数を微分して、その傾きが0になるようにパラメーターを逐次更新する。

●学習の過程で気をつける点
過学習（over fitting）　と　未学習（under　fitting）
・過学習とは
学習データに対して、誤差が十分小さい一方テストデータに対して誤差が大きい
・未学習とは
学習データにたいして、小さな誤差が得られていない

【正則化法】
過学習を回避する手法の一つ
パラメータの値に制約を設けることでモデルの複雑性を調節する。
ｙ＝ｗ0＋ｗ1ｘ1＋ε

【モデルの評価】
モデルを学習させたあとは、その精度を検証する

【データの分割】
データを学習用と検証用データに分割
学習データで検証した場合、一般的に当てはまりは良くなる
学習データで検証した場合、汎化性能を測るのが困難

【ホールドアウト法】
データを二つに分割し、一方で学習を行い、もう一方で検証を行う方法
　学習用データの割合を増やすと、検証用データが減るため学習精度は良くなるが、検証の精度が悪くなる。
　検証用データを増やすと逆の現象が起こる
　データが豊富にある場合を除き、良い性能評価を与えられないという欠点がある。

【クロスバリデーション（交差検証）】
データをK個のグループに分割し、K-1個のグループで学習を行い、残り一個のグループで検証を行う方法
ホールドアウト法の欠点を補う物として利用される。
picoCTF 2019 extensions - Points: 150

#問題

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/281a8bed-04ed-2481-9044-d7795b485227.png)

#解いてみた

ダウンロードしたテキストファイルを開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/32c8578f-13b3-d720-c4b6-59b675d55e0b.png)

pngっぽいので、拡張子をpngにして開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3096244e-992b-7adb-8d2b-9a1f4fe3cf3d.png)


フラグ出てきました。
QGISからPythonスクリプトを実行する

QGISからPythonスクリプトを実行できると
QGISプラグインから外部のPythonスクリプトを動かしたいときや
一時的にgdalなどのosgeo系ライブラリを使ったスクリプトを起動するときに便利です。
QGISのPythonコンソールは諸々のPATHが通ってますからね。

#やり方
サブプロセスを使ってスクリプトを起動します。
Pythonコンソールでやってみましょう。

```python
import subprocess
path = "d:/test.py"
subprocess.call("python %s" % path)
```

以上です。
PlantUMLの環境構築がめんどくさい人へ

## 要約
* Javaなんてインストールしたくねぇよ！！って人へ。PlantUMLはサーバに処理させらるよ。
* VSCodeのエクステンションをインストールしたら、設定からRederとServerを[Plantumlオンラインサーバ](http://www.plantuml.com/plantuml/uml/)にすれば環境構築の必要ないよ。
* ただし、PlantUMLのコードがオンラインサーバに送られるから漏洩とか気にする人は[公式のdockerイメージ](https://hub.docker.com/r/plantuml/plantuml-server/)とか使ってね。

## はじめに

PlantUMLをサクッと試したいのに環境構築がめんどくさいと感じた人に贈ります。

### VSCodeにPlantUMLの拡張機能をインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223008/d6f34144-585c-e43d-eabc-9e181dd8c36c.png)

### VSCodeの設定を開いて、検索に`plantuml`と入力すると以下の項目があるので、それぞれ設定する。

* Render: PlantUMLServer
* Server: http://www.plantuml.com/plantuml/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223008/55a97859-c3a5-ee8c-723f-804532c768f5.png)

※公式のオンラインサーバに処理させてますが、公式のDockerイメージを使った自前サーバでもOK  
[公式のdockerイメージ](https://hub.docker.com/r/plantuml/plantuml-server/)


### 適当にPlantUMLを書いてみる。

Alt+Dでプレビューが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223008/4d03fc36-6643-a36b-0593-8104208b31bf.png)

## おわりに

~~Plantuml公式が悪いことしてるとはおもわないけど~~
外部サーバにRenderさせてるので、情報の取り扱いは自己責任でお願いします。
picoCTF 2019 What Lies Within - Points: 150

#問題

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/72f7c742-a4f0-ff45-d458-48c9443209ae.png)

#解いてみた

テキストで「pico」なしでした。

画像解析と言えば「青い空を見上げればいつもそこに白い猫」です。

ステガノグラフィー解析します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/da2bd4ef-7769-b9fa-4bc9-76530c5307f6.png)


赤色ビット0抽出のときに左上に相当ちっさい何かが出てます。
他のも試してみると青色ビット0抽出、緑色ビット0抽出のときも同じような小さいものが出てました。

ビット抽出してみます。
赤、緑、青の0をチェックしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f816ff01-d827-fbd0-68f0-89434305ab63.png)

バイナリデータ表示 してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ee5bdf0a-37a5-e25f-3881-32f4b4589027.png)

できました。
ソートしていない内部テーブルをバイナリサーチしてはいけない

表題のコーディングが原因でバグが発生しました。

バイナリサーチの仕組みを知っていれば当たり前の話なのですが、意識していないとついついやってしまいます。

VBAK(受注伝票ヘッダー)に次のようなデータが格納されているとします。
※本来であれば、主キーであるVBELNでソートされていると思いますが、例なので気にしないで下さい。

| VBELN | AUDAT    | AUART | WAERK |
|-------|----------|-------|-------|
| 101   | 2019/1/1 | XXX   | USD   |
| 104   | 2019/1/1 | XXX   | JPY   |
| 103   | 2019/1/1 | XXX   | USD   |
| 102   | 2019/1/1 | XXX   | EUR   |
| 105   | 2019/1/1 | XXX   | JPY   |


以下のようなコーディングをすると、結果は"伝票が見つかりません(>_<)"となります。
（READ TABLEの検索が失敗します。）


```
* 受注伝票を全件内部テーブル(IT_VBAK)に格納
DATA: IT_VBAK TYPE STANDARD TABLE OF VBAK.    " 受注伝票ヘッダテーブル
      ST_VBAK LIKE LINE OF IT_VBAK. " 構造


SELECT * 
  INTO TABLE IT_VBAK
  FROM VBAK.


* 対象受注伝票をST_VBAKに格納
READ TABLE IT_VBAK
      INTO ST_VBAK
  WITH KEY VBELN = ‘104’  "伝票番号104の行をREADする
BINARY SEARCH.   "バイナリサーチする

IF SY-SUBRC = 0.

write:/ ‘伝票が見つかりました!'. 

ELSE.

write:/ ‘伝票が見つかりません(>_<)'.

ENDIF.

```

まあ当然ですね。

101, 104, 103, 102, 105をバイナリサーチで探すのですから。

```
とりあえず真ん中を見る。
→103か、違うな。じゃあ103と105の間を見るか。
→102か、違うな。"104"は無いっぽいな。諦めよう。
```

となるわけです。

上記の事象を回避するには、READ TABLEする前に検索キーで内部テーブルをソートしてあげましょう。

```
SELECT * 
  INTO TABLE IT_VBAK 
  FROM VBAK.

* 内部テーブルのソート
SORT IT_VBAK  ASCENDING BY VBELN.

* 対象受注伝票をWA_TABLEに格納
READ TABLE IT_VBAK 
      INTO ST_VBAK 
  WITH KEY VBELN = ‘104’  "伝票番号104の行をREADする
BINARY SEARCH.   "バイナリサーチする
```

あるいは、最初っから内部テーブルを宣言するときにSORTテーブルにするのも手です。

```
* 受注伝票を全件内部テーブル(IT_TABLE)に格納
DATA: IT_VBAK TYPE SORTED TABLE OF VBAK    " 受注伝票ヘッダテーブル
                    WITH UNIQUE KEY VBELN.  " 伝票番号でソート
      ST_VBAK LIKE LINE OF IT_VBAK. " 構造


SELECT * 
  INTO TABLE IT_VBAK
  FROM VBAK.


READ TABLE IT_VBAK
      INTO ST_VBAK
  WITH KEY VBELN = ‘104’  "伝票番号104の行をREADする
BINARY SEARCH.   "バイナリサーチする

```

#てか、有効化するときに警告出してくれたらいいのに
配列を偶数番目と奇数番目で分けてみた

###初投稿

普段自分で勉強していて、自分の書いたソースや、
他人の参考にしたソースの内容をすぐに忘れてしまう、
次似たようなものが来ても、思い出せない、と
全く自分の知識となっていないように感じたため、
アウトプットの場として、ここを利用していこうと思います。

---
###AtCoderをやっていて
では、早速昨日AtCoderで以下の問題をやっていた時のこと。
[AtCoder Beginner Contest 141 B-Tap Dance]
(https://atcoder.jp/contests/abc141/tasks/abc141_b)

ある文字列の偶数番目と奇数番目に現れる文字が、
特定の文字であるか否かを判定し、
それに応じて出力する文字列を変えるというような問題。

私は、文字列を偶数番目用と奇数番目用の配列に分けて、
その中に、指定された特定の文字があるかの判定をしようと、考えました。


```ruby:oddeven.rb
#当初のイメージ
s = gets.chomp.split('')
#以下でsを奇数番目にと偶数番目に分ける。
odd = []
even = []
if odd.include?('指定の文字') || even.include?('指定の文字')
  puts 'No'
else
 puts 'Yes'
end
```

そこでググって見たら見つかったのが、以下の記事でした。
[Ruby | 配列の奇数番目と偶数番目を取り出す方法](https://qiita.com/ddgg7755/items/ed7db4b342b783620b41)

もうこれじゃないかと、そのままコピペしてできたコードがこちら。

```ruby:oddeven.rb
s = gets.chomp.split('')
#以下でsを奇数番目にと偶数番目に分ける。
odd = s.each_slice(2).map(&:first)
even = s.each_slice(2).map(&:last)
if odd.include?('指定の文字') || even.include?('指定の文字')
  puts 'No'
else
 puts 'Yes'
end

```

こちら、each_slice(2)によって、配列の値を2つずつ取り出し、
oddでは、2つの値のうち最初の値を、
evenでは、最後、つまり2つ目の値を取得して来ています。

「これならいけるだろう」と、意気揚々と例題の値を入力し、
結果を確認すると、
Noと出力されるはずが、Yesと出力されてしまいました。

---
### 原因 
なぜ、このようなことになったのか、原因を探ってみると、
入力した文字列が、奇数個の文字列であったことが原因であったようです。

each_slice(2)によって2つずつ値を取得しても、
奇数個であった場合、最後は1つの値しか取得できません。
1つの値だと、firstでもlastでも同じ値が取得されるので、
そこで想定とは違う値が、evenの配列の中に入ってしまっていました。


---
###解決策

それでは、どうやって私が解いたのか、というと、
このようにしました。

```ruby:oddeven.rb
s = gets.chomp.split('')
odd = []
even = []
(0..s.length-1).each do |n|
    if n%2 ==0
        odd << s[n]
    else
        even << s[n]
    end
end
if odd.include?('指定の文字') || even.include?('指定の文字')
     puts 'No'
else 
     puts 'Yes'
end
```

結局配列の何番目かというのを、0..length-1によって取得し、
それが2で割り切れるか否かで、
奇数番目なのか偶数番目なのかを特定し、
新たに配列を作った後に、特定の文字が含まれるか否かを判定する、
という流れを作りました。

---

###更に推敲

出力は正しかったものの、長い・処理時間が若干長い、ということもあったので、
他の人の回答も参考にしながら、私の中でわかりやすかった回答を新たに作ってみました。
それが、こちら。


```ruby:oddeven.rb
s = gets.chomp.split('')
s.length.times do |n|
    if n.odd? &&s[n]=='指定の文字' || n.even? && s[n] == '指定の文字'
        puts 'No'
        exit
    end
end
puts 'Yes'
```
わざわざ、奇数用と偶数用に配列を作らなくとも、
繰り返し処理を行って、その回数が奇数回目なのか。偶数回目なのかを確認すれば、
配列の中を確認せずとも、一文字一文字条件に合うかを確認できて、
簡潔に書くことができました。

---

###最後に

と、いうようにまだまだ簡単な処理を書くことだけでも、
精一杯の状態ではありますが、
日々自分の書いたソース・参考にしたソースの何がうまくいなかなったのか、
どうやって解決したのか、ということをここに残していければと思います。

勉強がんばります！
gitの使い方

## 使用環境

Ubuntu OS
Bash

まとめのイラストを用意してあるので、ざっと読むだけでも大丈夫なはずです。

## インストール

```bash
$ apt-get install git
```
[参考 - Gitのインストール](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

[参考 - このタイミングで、SSHの設定もします。](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)


## GitHubの設定

1. account作成
    
    認証用情報の登録をして、Loginする。

1. repository作成

    保管場所の指定と登録をする。

[GitHub](https://github.com)



## よく使うコマンドの役割

1. add

    情報の変更をGitに一時保存します。

1. commit

    addした情報をGitの版管理対象に登録します。

1. push

    commitした情報をGitHubなどのremote repositoryに登録します。

1. clone

    remote repositoryをlocal repositoryに持ってきます。

1. fetch
    remote repositoryの情報をorigin/masterブランチに持ってきます。

1. merge
    origin/masterブランチの変更を作業フォルダであるmasterブランチに取り込みます。

## ブランチについて
remote repository(GitHubなど)と結びついているbranchをorigin/masterブランチといいます。
origin/masterブランチは、localに存在します。

手元のPCの作業フォルダと結びついているブランチをmaster といいます。
つまり、localには、ブランチが2つ存在しています。

## まとめ
![2019-11-03 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271588/7ede7c7c-422c-c96e-c61c-0e5d592b462b.png)

意外とシンプル!

## 実際の流れ

### リモートからcloneして、変更をリモートにpushする場合

cloneする場所を決めて、そこまでcdする。その後は以下の通り

```bash
git init

git clone https://github.com/~/~.git
```
何かしらの変更をする。
現在のdirectoryの変更をすべてaddするには、以下を入力する。

```bash
git add .
```
addしたfileをcommitする。"add"はコミットのコメント

```bash
git commit -m "add"
```

commitしたら、以下で、localの変更をGitHubに登録できる。

```bash
git push origin master
```

リモートからcloneして、変更をリモートにpushする場合は、以上で終わり

pushでパスワードが聞かれたら下記のコマンドでSSHに読み替えてくれるはず

```bash
git config --global "url.git@github.com:.pushinsteadof" "https://github.com/"
```
What's "npm" ?

よく使い方を忘れるので、必要な時にサッと読み返せるように超完結にまとめておきます。

>勉強中の関連記事まとめ
>[自分用の勉強記事をまとめた目次　~擬似知識体系~](https://qiita.com/oekaki-hoho-ron/items/3194f560efc461ec03b0)

# npmとは

Node Package Managerの略で、Node.jsのライブラリやパッケージを管理するツール

- 検索
- インストール
- バージョン管理

> [npm公式サイト](https://www.npmjs.com/)

# npmをインストール

保留

# ヘルプを見る

```.zsh
npm help
npm help コマンド
npm --help　コマンド
```

# バージョン管理

### 現在のバージョンを確認

```.zsh
npm -v
npm -version
npm --version
```

### 最新版にアップデート

```.zsh
npm update -g npm
```

# パッケージをインストール

### カレントディレクトリにインストール

列挙すれば複数のパッケージを同時にインストールできる。

```.zsh
npm i パッケージ名
npm install パッケージ名
npm install パッケージ名@バージョン
npm install パッケージ名 パッケージ名 ...
```

### グローバル環境にインストール

```.zsh
npm install -g パッケージ名
```

# パッケージの内容確認

### インストール済みのパッケージ一覧

```.zsh
npm list
npm ls
npm la
npm ll
npm list パッケージ名
```

### グローバル環境にインストール済みのパッケージ一覧

```
npm list -g
```

### パッケージ情報の確認

```.zsh
npm info パッケージ名
npm view パッケージ名
npm show　パッケージ名
```

### アップデートが必要なパッケージ一覧

```.zsh
npm outdated
```

### パッケージをアップデート

```.zsh
npm update パッケージ名
```

### パッケージがインストール済みか検索して確認

npmのリポジトリを確認する。キーワードは部分一致で構わない。

```.zsh
npm search パッケージ名
npm s パッケージ名
npm se パッケージ名
```

### パッケージの削除

パッケージをアンインストールする。`-g`オプションをつけるとグローバルから削除。

```.zsh
npm un パッケージ名
npm uninstall パッケージ名
npm r パッケージ名
npm rm パッケージ名
npm remove パッケージ名
npm unlink パッケージ名
```

# package.json

パッケージのバージョン情報などの依存関係をJSON形式で記録したファイル

### ファイル生成

ファイルをコマンドで自動生成。手書きでも可。

実行すると対話形式で内容を記述してくれる。

```.zsh
npm init
```

作成したpackage.jsonファイルの内容に沿って必要なパッケージを自動インストールする

```.zsh
npm install
```

ちなみに、パッケージをインストールする時に`--save`オプションをつけると、自動で必要な内容が記述されたpackage.jsonを用意してくれる。

```.zsh
npm install --save パッケージ名
```

#エラーとの戦い方
docker-composeでDjangoの空プロジェクトを3分で作成する

ちょっとしたアプリを作ることになって、
最近docker勉強中なのでアウトプット。

DBのコンテナも接続する予定ですが、
一旦djagoコンテナの生成までということで投稿。

---

ローカルの任意の場所に
compsoeファイルを作成する。

```yml:docker-compose.yaml
version: '3'
services:
  django:
    build:
      context: ./django
    ports:
      - "8000:8000"
    volumes:
      - ./src:/app/src
    command: python manage.py runserver 0.0.0.0:8000
    tty: true
```

composeファイルと同階層に`django`フォルダを作成し、  
その中に以下の２ファイルを作成する。  

- Dockerfile  

```dockerfile:Dockerfile
FROM python:3.7.3
ENV LANG en_US.utf8

WORKDIR /app/src
ADD requirements.txt /app/src
RUN apt-get update
RUN pip install -r requirements.txt
```

- requirements.txt  

```text:requirements.txt
django==2.2
```  


composeファイルのあるパスへ移動し、  
以下のコマンドでプロジェクトを生成する。  
(今回はプロジェクト名を`blog`として作成)  

```bash
docker-compose run django django-admin startproject blog .
```

これで、ローカルのcomposeファイルと同じ階層に`src`フォルダが作成され、  
その配下にdjangoのprojectファイルが生成される。


試しに、コンテナを起動し、`http://localhost:8000/`にアクセスして、  
djangoが起動していることを確認する。  

![スクリーンショット 2019-10-29 20.06.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483835/6054c416-5d87-6b5e-4ea4-3a48b8dc9d38.png)

これで空のdjangoプロジェクトが乗ったコンテナが作成できました。
picoCTF 2019 So Meta - Points: 150

#問題

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/78584e41-67d9-723a-1af9-27c0f507a34d.png)

#解いてみた

画像をテキストエディタで開いて「pico」で検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ec3912ca-6dca-8c73-c484-0e32c5f1e35c.png)

できた。
picoCTF 2019 OverFlow 1 - Points: 150

#問題

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cf50b355-2c93-d47f-fd65-231348aca328.png)

#解いてみた

ソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/759363e3-ace9-7487-7482-d131e10c0a66.png)

flag()が実行されればflagの中身が表示されそうです。
ですけど、flag()はどこからも呼ばれていないんです。

処理の流れとしては

```
30行目のmain()が実行される。
36行目の処理で23行目のvuln()に移動する。
28行目でvuln()が終わって呼び出しもとの次の処理37行目に移動する。
終了。
```

という感じです。
vuln()からmain()に戻るアドレスをいじってflag()に飛ばす作戦でいいのかな。
つまり28行目のvuln()が終わったときに「次は37行目ですよ」という処理を書き換えて「次は11行目ですよ」とすれば良い。

と、理論は分かっても実際やれるかどうかはわからない。
とりあえず、shellの方で実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4f1c1bf2-ad78-3279-9438-221fa91caabe.png)

実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a3b351c6-23dd-5f62-00f4-e1a7a86ae3db.png)

実行すると1回入力状態になって何か入力するとジャンプのアドレスが表示されて終了する。
この表示されるアドレスはソースをみたところ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/71db50f7-4a2e-47fe-84aa-54ec7a5afd7b.png)

vulnが戻る先のアドレスっぽいです。
ということで長い文字を入れればスタックが書き換わってここのアドレスも書き換わるはずです。
長めの文字を入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/23008b9f-da5e-a247-759e-c7200a065c8a.png)

さっきの実行でジャンプ先は「0x8048705」だということが分かってます。
この1回目をみると「0x8048705」で合っています。
2回目がジャンプ先が2個出てくる意味はよく分かりません。
3回目をみると「0x8040061」に変わってます。61はaの意味です。
aを増やすごとに61が増えていくことが分かります。
なのでこれで書き換えることができます。

次にやることは、flag()のアドレスです。

```
gdb ./vuln
```

を実行したあと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2e5db9b3-fff5-da71-4b7f-dd17e6f96f61.png)

とやるとflagのアドレスがわかります。
「0x80485e6」です。
*とか&はよくわかってません。
全部やってみましたが、全部一緒の結果でした。

リトルエンディアンに注意しながら実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cb288e12-ecea-d1e9-7d08-39e44110861a.png)

ということでflagが出ました。
線形探索（番兵法）

#はじめに
　順番に全部探索していくということで、「for文で一発やんけ!w」と思って説明を読んでいきました。すると、番兵法というものを見てよくこんなこと思いつくなぁと思いました。

#コード
```linear_search.py
def linear_search(A,key):
    i = 0
    A.append(key)
    n = len(A) - 1
    while A[i] != key:
        i += 1
    if i == n:
        return "NOT_FOUND"
    return i
```

#説明
　引数に配列Aと探したい値keyを取ります。見つかれば最初に見つかった配列のインデックス、見つからなければNOT_FOUNDという文字列を返します。keyを配列の末尾に追加（番兵）することによって、whileの終了が保障されているため終了条件がいらなくなっています。（なんかすごい）

#参考文献
プログラミングコンテスト攻略のためのアルゴリズムとデータ構造(https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E6%94%BB%E7%95%A5%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-%E6%B8%A1%E9%83%A8-%E6%9C%89%E9%9A%86/dp/4839952957)
AtCoder Beginner Contest 084 D  2017-like Number (エラトステネスの篩)

# AtCoder Beginner Contest 084 D - 2017-like Number

https://atcoder.jp/contests/abc084/tasks/abc084_d




```python

import sys

sys.setrecursionlimit(2147483647)
INF = 10 ** 13
def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def I(): return int(sys.stdin.buffer.readline())


def primes(n):
    is_prime = [1] * (n + 1)
    is_prime[0] = 0
    is_prime[1] = 0
    for i in range(2, int(n**0.5) + 1):
        if not is_prime[i]:
            continue
        for j in range(i * 2, n + 1, i):
            is_prime[j] = 0
    return {i for i in range(n + 1) if is_prime[i]}

n = 10 ** 5
prime_set = primes(n)
q = I()
C = [0] * (n + 1)
for i in range(n + 1):
    if i % 2 and i in prime_set and (i + 1) // 2 in prime_set:
        C[i] = 1


acc = list(accumulate(C))
for i in range(q):
    l, r = LI()
    print(acc[r] - acc[l - 1])

```
AngularでBootstrap(scss)を使いたい

**環境**
- Angular 8.2
- Bootstrap 4.3

AngularのComponent内でbootstrapのmixinを使用したくなってググり始めた

```scss
.hoge {
  @include media-breakpoint-down(xs) {
    text-align: left;
    ..
  } 
}
``` 

[これ](https://stackoverflow.com/questions/43557321/angular-4-how-to-include-bootstrap)とか[これ](https://medium.com/codingthesmartway-com-blog/using-bootstrap-with-angular-c83c3cee3f4a)とか見れば分かるけど、

1. angular.jsonのstylesとscriptsに記載
2. 1で読み込んだスタイルシートの中でimport
3. 使いたいスタイルシートの中でimport

などの方法がある

僕の環境では1がすでに実装済みだった

それはそのはず、普通にクラス名に`d-flex`とか`mx-0`とか書いて使ってるからね

でもね、上述のinclude文のエラーが消えないんだ！

なんでだなんでだ…調べても調べても同じ内容の記事ばかりが出てきやがる…！！

# 結論

angular.jsonで読み込んでたのはただのcssファイルなんだ

includeで呼び出すminxinはcssじゃなくてscssで書かれてるんだ

つまりbootstrap.cssじゃなくてbootstrap.scssを引いてこなきゃいけないんだ！！

3の方法で試したところ
Angularさんから無事OKが出た！

```scss
@import "~bootstrap/scss/bootstrap";
..
.hoge {
  @include media-breakpoint-down(xs) {
    text-align: left;
    ..
  } 
}
``` 

解決！

ちなみにangular.jsonのstylesにbootstrap.scssを記載しても読み込んでくれなかった
OS の Status を取得する VBScript を作成する

今回は少々レガシー系の記事を書きたいと思います。働き方改革と色々言われる中で、PC の状態を一括で管理したいという企業のリクエストが多くなってきている様な気がします。そのような背景もありつつPCの状態が一括監視できるように、今回は Windows の 起動状態を把握できる VBScript を作成したいと思います。

#イベントログの取得について
今回は VBscript でイベントログからデータを抽出するようなスクリプトを作成します。PC の状態を示すイベントログはをまとめると以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/5bcd70f6-1e20-5459-5158-dc8a993ad3b2.png)

参考記事
Windows のイベントビューアーを使って、何がいつ起きたか調べる
https://laboradian.com/find-out-event-using-event-viewer/

#サンプルスクリプト
今回は単純にPCの開始/終了の時間を取得するスクリプトを作成しました。

```sample.vbs
'取得ログをローカル時間に合わせる
Const CONVERT_TO_LOCAL_TIME = True
Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime") 
Set dtmEndDate = CreateObject("WbemScripting.SWbemDateTime") 
DateToCheck = Date
dtmStartDate.SetVarDate DateToCheck - 7, CONVERT_TO_LOCAL_TIME
dtmEndDate.SetVarDate DateToCheck + 1, CONVERT_TO_LOCAL_TIME
 
'イベントログの取得 今回は起動ログとシャットダウンのログ
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colEvents = objWMIService.ExecQuery _ 
    ("Select * from Win32_NTLogEvent Where TimeWritten >= '" _ 
        & dtmStartDate & "' and TimeWritten < '" _ 
        & dtmEndDate & "' AND (EventCode = 6005 OR EventCode = 6006)")
 
'ログ生成
Dim msg
For each objEvent in colEvents
    Set tempDate = CreateObject("WbemScripting.SWbemDateTime") 
    tempDate.Value = objEvent.TimeWritten
If objEvent.EventCode = 6005 then
    msg = msg & "Start : " & tempDate.GetVarDate(True) & vbCrLf
ElseIf objEvent.EventCode = 6006 then
    msg = msg & "Stop : " & tempDate.GetVarDate(True) & vbCrLf
End If
Next
 
'ログ出力
Wscript.Echo msg
```
#実際に実行してみる
このスクリプトを作成し「sample.vbs」等の適用な名前を付けて、任意の場所に配置します。コマンドプロンプトからこのスクリプトを呼び出すことで、PCの状態を Echo してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/d10f7ce6-88ae-5b14-19d7-f2e48f679bc5.png)

上記のことをイベントビューワーで確認することができますが、イベントビューワーから生成しようとするとかなり時間がかかってしまいます。また、業務時間の管理などに行う場合は、一人ひとりみるのは非常に手間がかかるので、上記のような形でスクリプト化するととても楽かもしれません。次回の記事では、実際に仮想空間に何台かデバイスを立ててみて、ログの一括取得を実施したいと思います。

#参考記事
PCの起動時刻の取得 出退勤管理用
https://qiita.com/a2kiti/items/123894813a0975f19470

Windowsイベントログをコマンドでエクスポートする
http://quatrefromage.hatenablog.jp/entry/2016/08/06/164436
[Unity]スワイプ操作、マウス操作でオブジェクトをくるくるさせるやつの作り方

ビューワーによくある、こういうやつを作ります。
![A.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344267/52cb594f-155d-73a5-8e0e-4edeb57cca00.gif)


#オブジェクトの構成
オブジェクトを固定し、入れ子にしたカメラの親を動かす形になっています。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344267/3adc6ada-c700-5de9-3f34-6ec83379a11d.png)



#ソース
```C#
Vector3 StartFrick, NowRotation;

    void Start()
    {
        //角度の初期化
        NowRotation = new Vector3(-360, 0, 0);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            //現在の角度と画面にタッチしたVector3値の和を格納し、Update関数を終了
            StartFrick = Input.mousePosition + NowRotation;
            return;
        }

        if (Input.GetKey(KeyCode.Mouse0))
        {
            //マウスでクリックし続けてる間のみ、
            //現在のタッチしているVector3値とStartFrickの差分で角度を変更する
            NowRotation = StartFrick - Input.mousePosition;
            gameObject.transform.localEulerAngles = new Vector3(NowRotation.y * 0.5f, -NowRotation.x * 0.5f, 0);
        }
```

もっと良い書き方があったらコメントください。
ゲームをつくる：実装してわかったHexマップ座標系構造

#この記事は、
ヘックス・ターン制SLG好きが、最近スマホでその手の面白いゲームが無いので自分で作ると、頑張る記録です。

# この記事のまとめ

- 実装してみた結果、Hexの座標系は交互にずらす形が良い
- ヘックスの並びは横一直線が良い
- ヘックスを縦に潰してみた

この記事は、実装してみてわかったHexマップ構造のポイントを書いています。
実装内容は[こちら](https://qiita.com/papipu-games/items/c9e24e4c1b68d868cad8)。


## 前回までの考え
[前回の記事](https://qiita.com/papipu-games/items/7978a7b51a47df8ace38)で、飛び飛びの座標系が良さそう、と書きましたが、実装してみると扱いづらいことに気づきました。


### 飛び飛びの座標系はこんな感じ
<img width="506" alt="hexss.png" src="https://qiita-image-store.s3.amazonaws.com/0/157328/9ae23c9b-4c05-eb66-690e-ec9160b1dfff.png">
飛び飛びの座標系のメリットは、２点間の距離の距離計算が楽なことです。(詳しくは[前回の記事](https://qiita.com/papipu-games/items/7978a7b51a47df8ace38))

ですが、プロフラム的な観点から考えれば、描画位置の計算やタップ位置の検出など、直感的でないことが結構コーディング効率に悪影響があることに気づきました。距離の計算の際に前回の考え方で計算すればよいだけですね。

## 交互にずらす座標系
<img width="906" alt="スクリーンショット 2019-10-29 20.47.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157328/ec585066-bc3d-dfc3-85b8-e066bb689349.png">
実際にCocosで実装して表示した画面です。
交互にずらす座標系に変えただけでなく、以下のような変更点があります。

#### 左下を原点とした座標系にした
Cocosの描画座標系が、右上に向かって増加する形なので、直感的にプログラムが書けるようにそうしました。
左上原点の右下加算座標系は、将棋とかの考え方が元になって、ボードゲームとかでは常識だったかもしれませんが、どうせお客様には見せないので、開発効率重視です。

#### ヘックスの並びを横一直線にした
大戦略のヘックスを見ると横一直線になっていました。
大戦略リスペクトの意味もありますが、スマホ横持ちを想定しているので、マップが横長になると思います。その場合、ユニットが横方向に移動することが多くなると思います。横一直線のほうが、横方向に直線的に動くので、ガクガク移動しなくて気持ち良いでしょう。

#### ヘックスを縦に潰してみた
疑似見下ろし視点のマップチップやユニットを置く予定なので、ヘックスを縦に潰してみました。画像は70%に潰した形ですが、調整できるようにコーディングしてあります。
また、戦略ゲームとしては注視点を中心に、周囲の情報量が増えて良い、という効果もありますね。縦持ちにすると、縦方向に不必要に情報量が多くなり、横方向が狭いので、横持ちとの相性が良いです。

次は、タッチした座標を取得するインターフェイスを実装しようと思います。