OmniAICreator/Qiita-1.07M huggingface dataset:
seleniumでby_class_nameでスペースが入った要素が取得できずエラーになる時の対処法

##seleniumでby_class_nameでスペースが入った複数要素が取得できずエラーになる



selenium のバージョンアップに
伴う仕様変更なのか、以前は問題なく取得できていた要素でエラーが出る様になってしまいました。

```
elem_sample = driver.find_element_by_class_name("a-link-sample a-text-normal")
```

以前はこれでOKだったのですが、
要素が見つからないと怒られてしまいます。


具体的なエラーメッセージはこんな感じでした。


```
File "error_test.py", line 30, in <module>
    elem_itempage = driver.find_element_by_class_name("a-link-sample a-text-normal")
    .........中間省略.......
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message:
```


## 原因


原因は、
selenium のバージョンアップに伴い、

`要素名にスペースが入った複数複合形の
class要素( 例：aaa bbbとかaaa bbb cccなど）は、
driver.find_element_by_class_name では取得出来なくなったという、仕様変更のようです。
`



## 解決法 


解決するには、
何らかの代替策で要素を取得する必要がありました。

いくつか選択肢がありますが、
私が、一番分かりやすく簡単に出来た方法は、

by_class_name を使わずに、

`driver.find_element_by_css_selector` メソッドを使って要素を取得するやり方です。

修正前

```
elem_sample = driver.find_element_by_class_name("a-link-sample a-text-normal")
```
これを、この様に書き換えます。


修正後

```
elem_sample = driver.find_element_by_css_selector(".a-link-sample.a-text-normal")
```


メソッドをby_class_name からby_css_selector にして、
要素の頭にドット「.」を入れてやります。
また、間にあるスペースも、ドット「.」に書き換えます。



例１：
`<class="aaa bbb">`
driver.find_element_by_css_selector(".aaa.bbb")


例２：
`<class="aaa bbb ccc">`
driver.find_element_by_css_selector(".aaa.bbb.ccc")



ポイントは、要素名を入れる際に先頭に必ず"."（ドット）を入れることと
スペースをドットに置換する事です。


これで、driver.find_element_by_css_selector メソッドを使って従来通り、
class 要素（間にスペースが入った複数名のもの）を取得できます。
~/.bash_profileをいじってターミナルの$前をカスタマイズ

## 変更前
```terminal
shun:~ matsumurashun$ ssh 172.168.XX.XXX
```

## 変更後
```terminal
(☝ ՞ਊ ՞)☝ $ ssh 172.168.XX.XXX
```

## やったこと

### ~/.bash_profileを編集
このファイルは、ログイン時に1度実行されるファイルのようです。
なので、terminalを起動したらこのファイルが1度だけ読み込まれます。
環境変数とかを記述しておくようです。

```vim:~/.bash_profile
export PS1 = "(☝ ՞ਊ ՞)☝ \W $ "
```

このPS1という部分が$前を示しているので、デフォルトを書き換えてあげる。
`\W`をつけないと今いるディレクトリを出力してくれないので注意。
ペアプロとかした時に変人扱いされそう。
【Python3】for文で２つのリストを回しながら添え字も得れる欲張り方法(zip,enumerate)

##enumerate
突然ですが、あなた

```python
for i in range(len(list1)):
  pass
```
だなんて書いてませんか？
~~私は一昨日までこう書いてました~~
indexも要素も使うときはenumerateを使ってスマートに書きましょう

```python
list1 = [1, 2, 3, 4, 5]
for i, x in enumerate(list1):
    print(i, x)
```

`実行結果
0 1
1 2
2 3
3 4
4 5
`

>enumerate(iterable, start=0)
enumerate オブジェクトを返します。 iterable は、シーケンスか iterator か、あるいはイテレーションをサポートするその他のオブジェクトでなければなりません。 enumerate() によって返されたイテレータの __next__() メソッドは、 (デフォルトでは 0 となる start からの) カウントと、 iterable 上のイテレーションによって得られた値を含むタプルを返します。

startを指定することで、カウントを何から始めるか選ぶことができるみたいですね。
~~あら便利~~

##zip
zip関数を使うとfor文で2つのリストを回すことが出来ます




>zip(*iterables)
それぞれのイテラブルから要素を集めたイテレータを作ります。

>この関数はタプルのイテレータを返し、その i 番目のタプルは引数シーケンスまたはイテラブルそれぞれの i 番目の要素を含みます。このイテレータは、入力イテラブルの中で最短のものが尽きたときに止まります。単一のイテラブル引数が与えられたときは、1 要素のタプルからなるイテレータを返します。引数がなければ、空のイテレータを返します。

**例)**

```python
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list2 = [9, 8, 7, 6, 5, 4, 3, 2, 1]
for u, v in zip(list1, list2):
    print( u, v)
```

`実行結果
1 9
2 8
3 7
4 6
5 5
6 4
7 3
8 2
9 1`

>zip() は、長い方のイテラブルの終端にある対にならない値を考慮したい場合は、等しくない長さの入力に対して使うべきではありません。そのような値が重要な場合、代わりに itertools.zip_longest() を使ってください。

長さが違うなら、短い方に合わされる。長い方に合わせたいならitertools.zip_longest()を使えだそうです。




##結論

`for i, (u, v) in enumerate(zip(list1, list2)):`

**例**)

```python
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list2 = [9, 8, 7, 6, 5, 4, 3, 2, 1]
for i, (u, v) in enumerate(zip(list1, list2)):
    print(i, u, v)
```

`実行結果
0 1 9
1 2 8
2 3 7
3 4 6
4 5 5
5 6 4
6 7 3
7 8 2
8 9 1`
【JSメモ】文字列オブジェクトの操作

#概要
文字列オブジェクトの操作

- length
文字列の数をカウント

- charAt(数値)
引数で指定した要素の文字を表示

- replace(文字列,文字列)
指定した文字列にマッチした部分を指定した文字列に変換する

- toUpperCase()
全ての文字を大文字に変換する

#使用例
```
>'hello'.length;
5

>'hello'.charAt(1);
'e'

>'hello，world'.replace('hello','hey');
'hey，world'

>'hello'.toUpperCase()
'HELLO'
```
競技プログラミングにおける綺麗な入出力（副題：可変長テンプレートを用いた関数の再帰的使用）

競技プログラミング関連の記事は初めてなので，お手柔らかにお願いします．

#競技プログラミングにおける入出力

さて，競技プログラミングをやっている方で，入出力で苦労された方はいらっしゃいますでしょうか？
私は苦労しました．

「整数Nが与えられ，整数Nを出力しなさい」

というタイプの問題の場合，LeetCode等では入出力を

```c++

int function(int N){
  return N;
}
```
と関数の引数と返り値で指定するのに対し，AtCoder等では

```c++

#include <bits/stdc++.h>
using namespace std;
int main(){
  int N;
  cin >> N;
  cout << N;
  return 0;
}
```
と標準入出力を用いる必要があります．

しかし，この方法では，入力がa, b, c, dと4つもある時は

```c++

cin>>a>>b>>c>>d;
```

となり，">"の数を間違えたり，1行が長く見辛い，といった問題が生じます．
これを

```c++

IN(a,b,c,d);
```
と指定できるようにしましょう，というのがこの記事の目的です．

#可変長テンプレート

Cっぽくマクロを使おうとしても，マクロの展開が一回しかできないため，再帰的な定義ができません，
そこで，C++11から使える可変長テンプレートを使います．

```c++

inline void IN(void){
  return;
}

template <typename First, typename... Rest>
void IN(First& first, Rest&... rest){
  cin >> first;
  IN(rest...);
  return;
}
```
このようにすると目的を達成できます．
出力についても同様に，

```c++

inline void OUT(void){
  cout << "\n";
  return;
}

template <typename First, typename... Rest>
void OUT(First first, Rest... rest){
  cout << first << " ";
  OUT(rest...);
  return;
}
```

とすれば綺麗になります．

#例

4つの入力a,b,c,dがある時に，逆順d,c,b,aで出力する．

```c++

#include<bits/stdc++.h>
using namespace std;

inline void IN(void){
  return;
}

template <typename First, typename... Rest>
void IN(First& first, Rest&... rest){
  cin >> first;
  IN(rest...);
  return;
}

inline void OUT(void){
  cout << "\n";
  return;
}

template <typename First, typename... Rest>
void OUT(First first, Rest... rest){
  cout << first << " ";
  OUT(rest...);
  return;
}

int main(){
  int a,b,c,d;
  IN(a,b,c,d);
  OUT(d,c,b,a);
  return 0;
}
```

#注意事項


このままだと，OUTを用いる時に，出力に余分な空白が生じてしまいます．
これを防ぐには，

```c++

inline void OUT(void){
  cout << "\b\n";
  return;
}
```

と"\b"を入れてあげれば解決します．

が，"\b"を入れるとAtCoderでは何故かWAになってしまいますので注意してください．

#参考サイト

http://yohshiy.blog.fc2.com/blog-entry-300.html
https://cpprefjp.github.io/lang/cpp11/variadic_templates.html
Ruby入門1　・オブジェクト　・変数　・メソッド

Rubyの入門について書きます。



オブジェクトは　``もの``　のこと。　"hello" 123 [] 
整数オブジェクト  ``Integer クラス``
少数オブジェクト  ``Float   クラス``
文字列オブジェクト　``String  クラス``　

メソッドは　``命令``　のこと。 puts p 

puts メソッドを使って整数を表示させる。
``puts 3``
``puts 3 + 4  　　7が表示される``

文字列を表示させる。
``puts "Hello world"``

文字列と数値が違うことを覚えておく。
文字列　＋　文字列　は文字列がくっつくだけ。

変数とは　オブジェクトに付ける名札のこと。
``order = "カフェラテ"``
変数orderに"カフェラテ"を代入すると言う。

文字列に計算結果を埋め込む

```
order = "カフェラテ"
puts "ご注文は#{order}ですね？"
puts "ご注文は" + order + "ですね？"
```
``1 + 2の答えは3です`` が表示される


大きさを判断する　
``wallet = 100``
``puts wallet >= 300``
falseが表示される。


等しいことを判断する
``puts 1 == 2``
``puts 2 == 1 + 1 ``
false
true
が表示される。



条件を満たしたときに処理をする　　　if 　 　 elsif  　　 else　を使う

 ```
season = "夏"
if season == "春"
 puts "アイスを買っていこう！"
elsif season == "夏"
 puts "かき氷買っていこう！"
else
 puts "あんまん買っていこう！"
end
```
if文を一行で書く。
wallet = 500
``puts "コンビニで愛すを買っていこう！" if wallet >= 300``

条件の時、またはのものは ||（パイプ）を使う
条件の時、かつやアンドのものは　&&　を使う

２つ以上のifを使う時は、caseを使うとよい

```
order = "パフェ"
case order
when "カフェラテ"
 puts "300円です"
when "モカ"
 puts "360円です"
else
 puts "取り扱っていません"
end
```


なんども繰り返す
決まった回数だけ繰り返す　-timesメソッド
↓　メソッドの中が３回繰り返される

```
3.times do
 puts "カフェラテ"
 puts "お願いします"
end
 puts "注文は以上です"
```

条件付き繰り返し while

```
biscuit = 0
while biscuit < 2
 biscuit = biscuit + 1
 puts "ポケットを叩くとビスケットが#{biscuit}つ"
end
```
C4-Extendを使ってみる。(Touchdesigner,Trigger編)

#続き
[前回](https://qiita.com/skckmdtk2m/items/241d054fcabc8ee1d522)C4-Extendのセットアップをしました。
ここからは実際に使用できるように進めていく。
#やること
ArtnetをTouchdesignerからOUTしたものを録画していく。

・Artnet-DMX-SPIの流れ（raw出し）
・UIからArtnetパケットRecode,再生
・AnalogInputでTrigger発火
今回はここまで
・iPad（OSC）からScene再生。
・Touchdesignerから録画、Queue出し。（Artnet+OSCの検証）


#Raw出し
[PixLite](https://www.advateklights.com/pixlite-control/)あたりと同じ機能、Artnetの設定をしていく。そのままArtNetでリアルタイムにLED点灯パターンを反映させる
outputはTouchdesignerを使用。便利。

###ネットワーク周りの設定。
ルーターを挟んでEthernetで接続。Webブラウザで10.254.254.254に接続。
###Touchdesigener
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/c689177b-9df3-fcea-d2e7-50d8baba545f.png)
RGB[0-255]をArtnet出力します。
詳細はこっちみてね
[LEDTEST.toe](https://github.com/NakanishiMasaru/ArtNet_LEDTEST_Touchdesigner/blob/master/README.md)

C4-ExtendでのArtNet確認
Homeから[Settings]/[In/out configuration]の右上ツールセットにInputWatcherがある。Universeを合わせてWATCHINPUTすると今着ているデータを見れる。すごい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/dd0cbeac-0fc1-d407-07bc-0564aa320cdf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/142c4ee1-c42f-346c-c588-6d6e78c6885e.png)
カラー情報まで見れる。有難い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/4d2ffc85-7896-6c98-6342-0f31a52a5f9e.png)

#REC出し
touchからのLED出力を録画、再生してみる。
テストパターンを作った時と同じように[CreateSCene]に。
この状態でArt-NetパケットがC4-Extendに届いてるとRec可能になる。
さっき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/9fe372a1-b3fc-5f6a-c3d5-01f5c9deffc6.png)
touchからOUTPUT中
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/61cf4b47-fcf5-aa50-2959-deda97b9bfec.png)

[Recordsetting]にloop設定やフェードを入れたりもできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/bdf26f43-256f-79c5-9d77-a356532c891d.png)
よくよく見たらRecode中もArt-NetはLEDに反映できてる。
FINDLOOPすると止まってしまうが、LEDのVJ的な使い方ができるかも。
ならばTriggerだ。


#Trigger
Triggerを使えばリモートで出せる絵を切り替えられる。
PixLiteなどではリアルタイムに絵を切り替える必要があったが、RecodeしておけばC4_exted単体で演出が可能になる。

割り込み方法がいくつかあり、
・HTTPのUIから再生
・Triggerからの再生
　・AnalogInput
　・OSC
　・UDP
　・HTTP
個人的にはOSCをよく使うのでサクッとできるAnalogInputとOSC周りの使い方を試してみる。

#AnalogInput
C4-ExtendのミニプラグINの部分、4極がGNDとINPUTPULLUPでピンが出ているそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/a35cf36b-ce83-cd7b-815a-b6fa7f97c0ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/573c8eaa-400b-31aa-d0b0-4bae58d3b2d4.png)


適当にスイッチ繋げばTriggerとして使える。
繋いだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/5def7b55-be79-35e2-f19e-1506f0940863.png)
ミニプラグの線の色、種類がある、しかもポリビニル導線の事が多い。
被覆焼いて、導通を確認しながら制作しよう。


HomeからTriggerに入り、Analog3(ring2)なら以下のように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149571/84d7e868-da54-0ee3-3a9a-cbb066e659e6.png)

現場で他の機材が不要のため、これは便利。難点は3Inputのみ。
組み合わせれば7個まで当てれるがそこまで来たらめんどくさい。

#次
Triggerの取り方も分かったしOSCで繋いでいこう。
SCSSを使って要素を横並びにする方法

##やりたいこと
図の変更後のようにtableを横並びにしたい。

####変更前
![Blank-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/f01e5c83-2ec5-fb6b-4394-6b25f7fa8e66.png)


####変更後
![Blank-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/ba3cc617-484f-19a0-c4e5-28ccd217c3bf.png)

##手順
####① wrapper1に `display: inline-block;` を適用させる。
![Blank-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/2fe6f4f5-46cc-1918-ab64-f3b75bbc42ca.png)

```scss
wrapper1 {
  display: inline-block;
}
```

####②全体の横幅を100%とした時、wrapper1とwrapper2を相対的に評価して幅を決める。
例）wrapper1 : wrapper2 = 3 : 7　にする
　　wrapper1 の `width: 30%;`
　　wrapper2 の `width: 70%;`

![Blank-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/a8e33c26-fc75-9604-7010-57162f184d67.png)

```scss
wrapper1 {
  display: inline-block;
  width: 30%;
}

wrapper2 {
 width: 70%;
}
```

####③ wrapper2に `float: right;`を適用させる。
これを適用させることで、wrapper1の横に, wrapperにが潜り込む。
![Blank-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312088/5d9a0056-5d2c-398f-9f12-af4c25fc2840.png)

```scss
wrapper1 {
  display: inline-block;
  width: 30%;
}

wrapper2 {
 width: 70%;
 float: right;
}
```
ドメイン駆動設計の「ドメイン」って何？


エンジニアと非エンジニア間でのコミュニケーションがうまくいかない（できていた気になっていた）ことで、最終的に納品されたものと要求したことが異なり大ゲンカになったことがあります。
そんなことから2者間での共通言語の役割も担ってくれる「ドメインモデル」を使った設計手法である「ドメイン駆動設計」について少し勉強しました。
素晴らしい設計手法なのでぜひ紹介したいのですが、今回はそれについてではなく **ここで使われるドメインの意味** について考察したので書きます。

# ドメインって何なのさ？
エリック・エヴァンスのドメイン駆動設計やユースケース駆動開発実践ガイドを読むと何度も「ドメイン」という単語が出てきます。
ですが「ドメインの意味」ついて明確に説明されてはいませんでした。
ドメインというと多くの人はDNSやお名前ドットコムを連想させるかと思いますが、ここではそのような意味で使われていないことはドメイン駆動設計に関して学習したことがある人は言われるまでもないかと思います。
ただ、**「ではここでいうドメインはどういう意味なのか」**と疑問に感じたことがある人は私以外にもおそらくいるかと思います。
なお私はエリック・エヴァンスのドメイン駆動設計を初めて読んだときここでつまづきました。

# ドメインの意味
The Oxford American English Dictionaryによるとドメインには以下の意味があります。
>1. An area controlled by a ruler or government
>2. An area of activity or knowledge
>3. A subset of the Internet with address all having the same suffix

3がドメインネームシステム（DNS）のドメインですね。
おそらく2がここでいう「ドメイン」の意味に近いかと思われます。
直訳すると
>活動や知識の領域

となります。もう少しかみ砕くと
>とある業界に関する活動や知識の対象領域

となるのかな？
例えば顧客管理システム（CRM）の開発で考えると、CRMは「顧客情報」や「組織情報」、それから「購入履歴」などを管理する必要があって、**こういったビジネス課題を解決するにあたって必要なそれぞれの要素が「ドメイン」と呼ばれている**と思われます。
そうすれば「ドメインモデル」や「ドメインエキスパート」といった言葉の意味もしっくりくるかと。

#おわりに
日本語で「ドメイン」と検索してもこういった情報はすぐに見つからなかったので参考になれば幸いです。
ご指摘などありましたら是非お願いします。

また、海外サイトを調べていると参考になりそうな情報がみつかりましたのでそちらも参照してみてください。
参考：https://airbrake.io/blog/software-design/domain-driven-design
【JSメモ】parseInt()関数 parseFloat()関数 文字列を数値に変換

#概要
- parseInt()関数
文字列を指定の基数で解釈し10進数の整数へ変換する

- parseFloat()関数
文字列を浮動小数点の数値に変換

#使用方法
```
parseInt(文字列,基数)
parseFloat(文字列)
```

#使用例
```
>parseInt('123',10);
123

>parseInt('123',8);
83

>parseInt('123',16);
291

>parseFloat('12.3');
12.3
```
Even Relation

- [Even Relation](https://atcoder.jp/contests/abc126/tasks/abc126_d)

## コンテスト中の考察

- u→vに伸びてる辺が奇数だったらvは黒に塗るとか？
- そんな感じで色々謎考察をしていた
- 本当に何も思いつかなかった
- おしまい



## 反省

### ダメだったところ

- 木構造を変に理解してた。有向グラフだと思ってたんだけど木って無向グラフだったんだね。無知すぎる
- ある頂点を根として距離を求めれば、その情報から任意の2頂点間の距離を求めることができる（LCAの求め方は知らんけど今回はLCAを無視してよかった）

### どうすればよかったか

- 式をイメージするとよかったっぽい。$d_{u-v} = d_{u} + d_{v} - 2d_{x}$みたいなやつ（xはu, vのLCA）



## 理想の考察

- 任意の2頂点u, vを選んだ時に、その距離が偶数であれば良い。
- その距離はどう求めるか？式をイメージする。
- 「uからvの距離 = 根からuの距離 + 根からvの距離 - 2 × (根からLCAまでの距離)」という式ができる。
- 数式っぽくする。$d_{i}$を根からiまでの距離とする。
- すると、「uからvの距離 = $d_{u} + d_{v} - 2d_{x}$」とできる。
- $2d_{x}$は偶数であるため、この値はこの式の偶奇に関わらない。よってこれは考えなくてよくなる。
- なので式は、「uからvまでの距離の偶奇 = $d_{u} + d_{v}$」となる。
- 考えるべきは、$d_{u} + d_{v}$である。これが偶数になれば良い。これは、$d_{u}$と$d_{v}$の偶奇が一致してればOKってこと。
- 距離が偶数の頂点は別の距離が偶数の頂点同士でつなぐとその間の距離は偶数となる。距離が奇数の頂点は別の距離が奇数の頂点同士でつなぐとその間の距離は奇数となる
- つまり、偶数頂点同士は同じ色で塗って、奇数頂点同士は別の色で塗ればいいことになる。
- 例えば偶数頂点を全て白で塗って、奇数頂点を全て黒で塗る。このとき、同じ色で任意の2頂点を選ぶ。そのとき、選んだ2頂点間の距離は必ず偶数になる。



## 解法

- 与えられた木のある頂点を根とする。
- 根からDFSをして、根から各頂点への距離を求める。
- その距離が奇数なら黒く塗る。そうでないなら白く塗る



## [コード](https://atcoder.jp/contests/abc126/submissions/5491949)

```cpp
#include <bits/stdc++.h>
using namespace std;

#define int long long

using pii = pair<int, int>;

int N;
vector<pii> G[111111];
vector<int> ans;

// 親ノード, 現在地のノード, 現在地までの距離
void rec(int from, int cur, int dist) {
  if (dist % 2 == 1) {
    ans[cur] = 1;
  }

  for (pii p : G[cur]) {
    int to = p.first;
    int tDist = p.second;
    // 逆戻りを防ぐ
    if (to == from) continue;

    rec(cur, to, dist + tDist);
  }
}

signed main() {
  cin >> N;
  ans.resize(N);
  for (int i = 0; i < N-1; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    u--, v--;
    G[u].push_back({v, w});
    G[v].push_back({u, w});
  }

  rec(-1, 0, 0);

  for (int i = 0; i < N; i++) {
    cout << ans[i] << endl;
  }

  return 0;
}
```





## 要点

- 木構造では、根を決めると任意の2頂点間u, v間の距離が$d_{u} + d_{v} - 2d_{x}$で求められる(xはu, vのLCA）
- 求めたいものの式をイメージするとよかった
  - 今回の場合、とりあえず距離を求めた場合の任意の2頂点間の距離の式を立てられるとよかった。



## メモ

- [けんちょんさんの記事](http://drken1215.hatenablog.com/entry/2019/05/19/224500)
- [エックスオア多橋君](https://atcoder.jp/contests/arc045/tasks/arc045_c)。類題らしい。解いてないからよく知らん。
Yocto を docker コンテナでビルドする

## この記事は

タイトル通り、 Yocto を docker コンテナ内でビルドします。

## Dockerfile

Ubuntu 16.04 をベースとして、

https://www.yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#detailed-supported-distros

に書かれているパッケージを追加します。
また、locale の設定も必要でした。

```dockerfile

FROM ubuntu:16.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get dist-upgrade -y && apt-get autoremove --purge -y \
 && apt-get install -y \
     gawk wget git-core diffstat unzip texinfo gcc-multilib \
     build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
     xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
     xterm \ 
     locales \
 && rm -rf /var/lib/apt/lists/*

# Locales
RUN dpkg-reconfigure locales \
 && locale-gen en_US.UTF-8 \
 && update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
ENV LC_ALL   en_US.UTF-8
ENV LANG     en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
```

## コンテナをビルド

```shell

$ docker build -t yocto:latest .
```

## Yocto をビルド

[Yocto Project Quick Build](https://www.yoctoproject.org/docs/2.7/brief-yoctoprojectqs/brief-yoctoprojectqs.html) の手順でビルドします。

いろいろやり方はあるのでしょうが、ここでは

- ホストのユーザ ID とディスクを使う
- コンテナは1回のビルドで使い捨てる

方針にしてみます。

### ソースコード取得

ホスト上で git で取得します。

```sh

$ git clone git://git.yoctoproject.org/poky
$ cd poky
$ git fetch --tags
$ git checkout tags/yocto-2.7 -b my-yocto-2.7
```

(上記 [Yocto Project Quick Build](https://www.yoctoproject.org/docs/2.7/brief-yoctoprojectqs/brief-yoctoprojectqs.html) のとおり)

### ビルド

```shell
$ docker run --rm \
    -u $(id -u):$(id -g) \
    -v $(pwd):$(pwd) \
    -w $(pwd) \
    yocto:latest \
  /bin/bash -c 'source oe-init-build-env &&  bitbake core-image-sato'
```

環境によりますが、私の環境では 3時間ほどでビルドできました。
サーバーの更新 やり方

##dev2(サーバー名)の更新(OS・パッケージ)


```terminal:ターミナル

$ #dev2(サーバー名)にssh接続
$ ssh my_address@dev2.my.domein.com
Enter passphrase for key '/Users/katoatsushi/.ssh/id_rsa': 
Last login: Wed May  8 15:47:45 2019 from wnetuser176.wnet.icts.my_domain.com
$ #dev2の更新
$ sudo yum update
[sudo] my_address のパスワード: 
Loading mirror speeds from cached hostfile
....
--> トランザクションの確認を実行しています。
---> パッケージ MariaDB-client.x86_64 0:10.2.23-1.el7.centos を 更新
---> パッケージ MariaDB-client.x86_64 0:10.2.24-1.el7.centos を アップデート
....

--> 依存性解決を終了しました。

依存性を解決しました
=================================================================================
 Package          アーキテクチャー     バージョン        リポジトリー        容量
=================================================================================
インストール中:
....
....
トランザクションの要約
==================================================================================
インストール    5 パッケージ (+16 個の依存関係のパッケージ)
更新          191 パッケージ (+ 2 個の依存関係のパッケージ)
削除            2 パッケージ

Transaction check error:
 /usr/include/python3.6m/pyconfig-64.h conflicts between attempted installs of python36u-libs-3.6.8-1.el7.ius.x86_64 and python36-libs-3.6.8-1.el7.x86_64
...
.....
.....
```
5Gの概観を探る4　最小データレート

この記事では、第5世代移動通信システム(以下、5G)の概観を把握するために、役にたちそうな情報を取りまとめていく。　その４。

#eMBBにおけるデータレートの要求
「Release16」のTS 22.261にはシナリオごとに必要な5G通信のパフォーマンスが定義されており、データレートも含まれている。

#シナリオごとに要求されるデータレートの最小値
シナリオごとに要求されるデータレートの最小値は以下。

|  |シナリオ  |Experienced data rate (DL)|Experienced data rate (UL)<br/>|
|---|---|---|---|
|1 |Urban macro|50Mbps|25Mbps|
|2 |Rural macro  |50Mbps|25Mbps|
|3 |Indoor hotspot|1Gbps|500Mbps|
|4 |Broadband access in a crowd|25Mbps|50Mbps|
|5 |Dense urban|300Mbps|50Mbps|
|6 |Broadcast-like services|Maximum 200Mbps<br/>(per TVchannel)|N/A or modest<br/>(e.g., 500 kbps per user)|
|7 |High-speed train|50Mbps|25Mbps|
|8 |High-speed|50Mbps|25Mbps|
|9 |Airplanes connectivity|15Mbps|7.5Mbps|

> 3GPP
>「TS 22.261　V16.7.0 (2019-03)」
「7.1 High data rates and traffic densities」

※一般的な用いられる訳が見つからなかったため、個人的な訳を以下に。

Experienced data rate (DL) : ユーザが体験(体感)するデータレート。シナリオごとに求められる最小値。

Urban macro : 都市部
Rural macro : 地方
Indoor hotspot : 屋内ホットスポット
Broadband access in a crowd ： イベント会場などのユーザ密集地帯
Dense urban : 密集した都市部
Broadcast-like services : 放送
High-speed train : 高速鉄道
High-speed vehicle:高速自動車
Airplanes connectivity:飛行機との接続



#####(参考)4G通信の実測値例
4Gではベストエフォートのデータレートが提供される。

・下り
最大値　568Mbps
75%値　283Mbps
中央値　208Mbps
25%値　145Mbps
**最小値　16Mbps**

・上り
最大値　67Mbps
75%値　43Mbps
中央値　33Mbps
25%値　22Mbps
**最小値　3Mbps**

>NTTdocomo 実効速度計測結果
>https://www.nttdocomo.co.jp/area/effective_speed/


>
>
初心者の方へ

自作初心者の方はまず何を目的としたPCを作るのかを考えましょう

まず皆さん自作をやるにあたってほとんどがロマンとゲーム用途でしょう！（僕の意見です）

ロマン、ゲームと言うと初期投資が大切です

「お金がないから安いのでいいや・・・」

それ！ダメ！ゼッタイ！

僕の経験談ですが、安いパーツを買い集めて作っても後々アップグレードして結果高くなります！

なので、妥協なしの大きめの初期投資がすごく大切です！

ゲーム用途で言いますと、CPU、グラボ、それぞれの性能が釣り合うように構成を妥協なく考えて、それに向かってお金を稼ぐ感じですね！

そうすれば初心者の方でも達成感と起動してゲームをヌルヌルでプレイできるという最高の環境になると思います！

まとめですが

「自作PCは初期投資を大きめに！」

です！

では今日はここらで失礼します
ESP-WROOM-02/32 で IIJ Machinist を使用する

# サービス終了のお知らせ
IIJ Machinist はサービスを終了いたしました。ご愛顧ありがとうございました。  
   
以下の記事は過去の記録として残してありますが、現在は動作させることが出来ません。ご了承ください。

# この記事について
ESP-WROOM-02(以下ESP8266), ESP-WROOM-32(以下ESP32) から、[IIJ Machinist](https://machinist.iij.jp/) を利用して値を可視化します。

# いきなりですが
[以前書いた記事](https://qiita.com/nara256/items/7179da740bf2be2389be) にもさらっと書いたのですが、簡単に使うためのライブラリを作成してあります。
前回の記事からの変更点として、前回は ESP32 でしか動作しなかったものを、ESP8266 でも動作するようにバージョンアップしました。

## 使用方法
### ライブラリのインストール方法
- https://github.com/nara256/IIJMachinistClient
 
上記ページより、緑の "Clone or download" のボタンを押し、続いて "Download ZIP"のリンクをクリックして、ファイルをダウンロードしてください。
Arduino IDE より、メニューの スケッチ → ライブラリをインクルード → zip形式のライブラリをインストール を選択し、ダウンロードしたzipを選択すれば使用可能になります。

### 事前準備
以前書いたことのコピペですが、以下のことをやっておきます。

- [Machinist](https://machinist.iij.jp/) にサインアップして、アカウントを作成します（現時点では無料です）。
- Machinistのマニュアル([Getting Started](https://machinist.iij.jp/getting-started/))を軽く読んでおきます。
- Machinistにログインし、管理UIからプロフィールの画面からAPIキーを取得しておきます。
- Machinistの管理UIから、エージェントを1つ作成しておきます。

### 実装
サンプルを開くと以下のようなコードが表示されます。
これは、乱数を Machinist にデータ送信するだけのプログラムです。

```cpp:random_value_sender.ino
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include "IIJMachinistClient.h"

#define WIFI_ID "YOUR WIFI SSID HERE"
#define WIFI_PASS "YOUR WIFI PASSWORD HERE"
#define MACHINIST_API_KEY "YOUR Machinist API KEY here"

IIJMachinistClient c(MACHINIST_API_KEY);

void setup()
{
  Serial.begin(115200);
  Serial.println();
  delay(3000);

  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_ID, WIFI_PASS);

  // wait for WiFi connection
  Serial.print("\nWaiting for WiFi to connect...");
  while ((WiFi.status() != WL_CONNECTED))
  {
    Serial.print(".");
    delay(1000);
  }
  Serial.println(" connected");

  randomSeed(analogRead(0));
  c.setDebugSerial(Serial);
  c.init();
}

void loop()
{
  float value = (float)random(10000) / 100.;

  //あらかじめ Machinist の UI から "test" という名称の Agent を作成しておきます。
  int s = c.post("test", "NAME\\SPACE", "NAME", value, "KEY", "VALUE");
  if (s == 200)
    Serial.println("OK");
  else
    Serial.println("NG status=" + String(s));
  delay(60 * 1000);
}
```

### ポイント解説
サンプルのコードはわかりにくいかもしれませんが、やるべきことは非常にシンプルです。
#### ライブラリのinclude
```
#include "IIJMachinistClient.h"
```

#### インスタンス生成 & 初期化
`IIJMachinistClient` のインスタンスをグローバルで生成しておきます。引数は Machinist の UIから取得したAPIキーの文字列です。
`setup()`関数内で、Wi-Fiに接続後、`c.init()` 関数で IIJMachinistClientの初期化を行います。

```
IIJMachinistClient c(MACHINIST_API_KEY);

void setup()
{
  // ここでWi-Fiに接続しておく
    ....
  // Machinist Clientの初期化
  c.init();
}
```

#### 値の送信
`c.post()`関数を使用してMachinistへ値を送信します。センサなどから取得した値を送ればOKです。
`post()`関数は引数により何種類かありますので、詳細は [githubの説明ページ](https://github.com/nara256/IIJMachinistClient) をご参照ください。

```
void loop()
{
  ...
  // 単純な値送信
  int s = c.post("Agent文字列", "namespace文字列", "name文字列", 送信値);
  // タグ付きでの値送信
  int s = c.post("Agent文字列", "namespace文字列", "name文字列", 送信値, "Tagキー文字列", "Tag値文字列");
  // 時間を指定しての値送信
  int s = c.post("Agent文字列", "namespace文字列", "name文字列", 送信値, "Tagキー文字列", "Tag値文字列", unixtime値);
  ...
}
```

# さいごに
このライブラリはIIJ非公式です。私が勝手に作ったものですので、ご質問・ご要望はIIJに送らないで、この記事なりgithubのページの方にいただけるとありがたいです。
自己紹介

自作erやってる沖縄のIT系専門学生です！
まだプログラムは普通高校卒なので全然わかんないです！
なので少しずつ自作PCの知識をアウトプットしていきます！
自作er歴は２年です！

自作erとは・・・自作PCを作る人のこと
はじめに



初めまして！
今年から情報系専門学校に入学した者です。

学校の授業に<strike>マンネリ</strike>慣れてきた＆プロゲート総合レベル150超えたのでQiita始めてみました！
こちらでは学びのアウトプットができればと思っています(^^)

ポートフォリオなども作成して就活のアピール材料としても使っていきたいと考えています！
（2か月に1回はポートフォリオ作りたい...）

よろしくお願いします～。
shift-jis文字列をUTF-8コードに変換

   変換したUTF-8のバイト配列を16進数文字列で表現する。

        public static string ConvertSJIStoUTF8(string text)
        {
            byte[] bytesData = System.Text.Encoding.UTF8.GetBytes(text);
            string ret = '%'+ BitConverter.ToString(bytesData).Replace('-','%');
            return ret;
        }
HTML5-CSS3-JavaScriptを基礎の基礎から

## HTMLの全体構造

### `<!DOCTYPE html>`　文書型定義

古いHTMLでは細かく定義する必要のあった文書の型(DTD: Docment Type Definition)。ブラウザはこの宣言のある無しで表示モードを切り替えている。~~HTML5からは仕様書の中にDTDを持っているためわざわざ定義する必要はなくなったが、~~ブラウザは未だに宣言のあるなしを認識しているので<!DOCTYPE html>を書いておく必要がある。

### `<html>`html要素

htmlのすべての要素を記述するためのルート要素

### `<head>, <body>`head要素、body要素

html要素の中に直接入れるこのができる要素
head要素は文書の情報を持っている。ex. 文字コード、Webページのタイトル、CSSファイルのurlなど...
文書の情報を入れているので、ブラウザで表示されるタイプのものではない。
body要素の中にはブラウザで直接見える部分の内容が書いてある。

### `<title>`title要素

Webページのタイトルとなるテキストを入力する要素。head要素内に一つだけ入れておく必要がある。head要素内であれば場所はどこでも良い。

### `<meta>`meta要素

Webページに関する様々な情報(メタデータ)を示す要素。
各種情報は属性値として記入される。属例には例えばcharset(文字コード), name/http-equiv(情報の種類), content(name, http-equiv属性で指定された種類の具体的な情報)がある

```html:meta_data.html
<!DOCTYPE html>
<head>
<meta name="generator" content="WordPress 3.4.1">
<meta name="description" content="折り紙を折る人のブルグです">
<meta http-equiv="content-type" content="text/http; charset=UTF-8">
</head>
```
Docker Imagesを作成する 

標記備忘録です.

Docker filesを用意
---
``` :Dockerfiles 
FROM python:3.6.1-alpine
CMD ["python","app.py"]
```
Dockerイメージ作成
---
```
$docker image build ./ -t hello-world //作成、名前をhello-worldに
 :
 :

$ docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
hello-world   latest              95c4b672db56        6 minutes ago       98.7MB
```

その他 dockerコマンド
---
```
docker container logs [ID] ログを見る
docker push [useername]/python-hello-world //docker hubにpush
docker image history [image名] //イメージの履歴表示
```
openframeworks iOS 0.10.1でlibofxiOS_iphoneos_Debug.aがないって言われた

超個人的メモです。

https://forum.openframeworks.cc/t/xcode-10-of-0-10-1-will-not-build-for-simulators/31234/8
↑に書いてあって助かった、ありがとうございます。

##出たエラー
no such file or directory: 
'/Applications/of_v0.10.1_ios_release/libs/openFrameworksCompiled/lib/ios/libofxiOS_iphoneos_Debug.a'

まぁ要するに「libofxiOS_iphoneos_Debug.a」がないですよ〜ってこと、でどこから持って来ればいいん？

##やったこと
0.9.8のは動いてたなと思ってそっちのlibから持ってきたらx86_64のエラーが出た。失敗。


##解決法
of_v0.10.1_ios_release/libs/openFrameworksCompiled/lib/iosの中にある
「libofxiOS_iphonesimulator_Debug.a」を複製する。
名前を「libofxiOS_iphoneos_Debug.a」にする。

以上！
Go & VSCode開発Debug環境構築


##準備
まずはGOの公式サイトからインストール。
https://golang.org/dl/
インストール完了あと、```c:\go\bin``` をシステムの環境変数に追加します。


それからvscodeの中でGOの拡張機能を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/36352885-64f2-f921-50ca-f13c894eeb10.png)

それからvscodeの中でF1を押して、出たパネルに
```Go: Install/Update tools```を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/75d2dcf3-25a9-61ff-faf1-22fbd05fafdb.png)
すべてをチェックして、インストールする。

##Hello World

```Go:main.go
package main

import (
    "fmt"
)

func main() {
    fmt.Print("Hello world")
}
```
Ctrl + Shift + Bで実行する。初めて実行する時は　tasks.json　を配置しないといけない。

```
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "run",
            "type": "shell",
            "command": "go",
            "args": [
                "run",
                "${file}"
            ]
        }
    ]
}
```

配置完了あと、hello worldは実行可能です。

##Debug
さっき```Go: Install/Update tools```した時、もし```dlv```が入ったらF5を押すだけでDebugモードに入れるが。もし```dlv```をインストールしていないなら、手動でインストールする必要があります。
https://github.com/go-delve/delve/tree/master/Documentation/installation
↑具体的なインストール方法
https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code
インストールしたあとlaunch.jsonをセットアップすればDebug可能です。

```Json:launch.json
{
	"version": "0.2.0",
	"configurations": [
		{
			"name": "Launch",
			"type": "go",
			"request": "launch",
			"mode": "auto",
			"program": "${fileDirname}",
			"env": {},
			"args": []
		}
	]
}
```
GAS EventのDebug方法はLogで行う

#TL;DR 
Logを入れ、調査するしかない。
ブレークポイントは張れなさそう

#2種類のlog
##Stackdriver Logging
Apps Script dashboardで見る。（https://script.google.com/home/executions）

console.log("checkmethod start");
var sample = "TarakoPasta is great food";
console.log(sample);
console.log("checkmethod start");

##Basic Logging
Script EditorのView > Logsで見られる。Ctrl+Enterでも見られるのでこっちのが楽。

Logger.log("checkmethod start");
var sample = "TarakoPasta is great food";
Logger.log(sample);
Logger.log("checkmethod start");


#事例
##下準備
1.コードを下のように書く。

```
function onEdit(e){
  Logger.log("LoggerLog start");
  console.log("ConsoleLog start");

  today = new Date()
  Logger.log(today);
  console.log(today);

  Logger.log("Log End");  
  console.log("ConsoleLog End");
}

```
2.GoogleSpreadSheetでセルを編集する。

##結果
###Stackdriver logs
<pre>
Stackdriver logs 
May 20, 2019, 5:21:44 PM DEBUG ConsoleLog start
May 20, 2019, 5:21:44 PM DEBUG Mon May 20 17:21:44 GMT+09:00 2019
May 20, 2019, 5:21:44 PM DEBUG ConsoleLog End
</pre>

##Basic Logging
<pre>
[19-05-20 17:21:44:706 JST] LoggerLog start
[19-05-20 17:21:44:709 JST] Mon May 20 17:21:44 GMT+09:00 2019
[19-05-20 17:21:44:710 JST] Log End
</pre>

#参考資料
https://stackoverflow.com/questions/11539411/how-to-debug-google-apps-script-aka-where-does-logger-log-log-to
https://developers.google.com/apps-script/guides/logging#stackdriver_logging
https://developers.google.com/apps-script/guides/triggers/events
Go で ABC126 F - XOR Matching を解いてみた

Go で ABC126 F - XOR Matching を解いてみました。

## 問題

> 
### 問題文
以下の条件を満たす、長さ $ 2^{M+1} $  の数列 $ a = {a_1, a_2, \dots, a_{M+1}}$ を、存在するならば 1 つ構築してください。
>
* $a$ は 0 以上 $2^M$ 未満の整数を、それぞれちょうど 2 つずつ含む。
* $a_i = a_j$ を満たす任意の $i, j$ $(i \lt j) $ について、 $ a_i $ xor $a_{i+1}$ xor $\dots$ xor $a_{j} = K$ である。
>
### 制約
>
* 入力は全て整数である。
* $0 \le M \le 17$
* $0 \le K \le 10^9 $
>
( https://atcoder.jp/contests/abc126/tasks/abc126_f より引用)

## コンテストで考えたこと

小さい数で全探索して表示するプログラムを書いたりしつつ考えましたが、 コンテスト中はそもそも次の2つの誤解をしていて死にました。（最近誤読が多い）

* $a_i$ が $2^M$ 未満ではなく$2^M$ 以下の数と誤読
    * $2^M$が入ると最上位ビットが一つ上がるので、$2^M+1$未満の数を $2^M$ 以下の数で XOR で構成できるようになる
* すべての $a_i = a_j$ を同じ距離で構成しないとだめ、と誤解

## 正しい考え方

実際には $a_i$ は $2^M$ 未満、 $a_i = a_j$ の組ごとに距離は異なっても良いので、M=2 以上の場合、
$0, 1, 2, 3, \dots ,K-1, K+1, \dots 2^M -2, 2^M -1, K, 2^M - 1, 2^M -2 , \dots , K+1, K-1, \dots ,3,2,1,0,K$
のような長さ $2^M+1$ の数列を構成すれば良いです。

この数列は直感的にいえば、次のようなものです

*  $0,1,2, \dots ,2^M-2, 2^M-1$ のように $2^M$個の数が並んだ数列を $A$ とする
*  $A$ から $K$ を取り除いたものを $A'$ とする
*  $A'$ を逆順にしたものを $A''$ とする
*  $A', K, A'', K$ の順に並べると完成

これはあきらかに 「$a$ は 0 以上 $2^M$ 未満の整数を、それぞれちょうど 2 つずつ含む。」という条件を満たしているので、「$a_i = a_j$ を満たす任意の $i, j$ $(i \lt j) $ について、 $ a_i $ xor $a_{i+1}$ xor $\dots$ xor $a_{j} = K$ である。」を満たしているか検証してみます。

まず、最後の $K$ を除いた $A' , K, A''$ の並びについて考えます。
この並びでは、 $K$ を中心とした左右対称の形をしているので、 $a_i = a_j$ となる範囲をすべて xor をとると、Kの左右同じ距離にある数がお互いに打ち消し合い、最後にKだけが残るので、条件を満たしています。

次に、 $K, A'', K$ の並びについて考えます。
$K, A''$ は 0 から $2^M -1$ までの数をすべて xor を取った数になりますが、これはたとえば $M=2$ の場合、

* 0, 0
* 0, 1
* 1, 0
* 1, 1

のようにすべてのビットパターンを網羅することになります。全パターンあるということは、すべての桁において1が偶数回登場することになるので、結果としてXORを取ると0になることがわかります。 $M=3, 4, \dots $ とMを増やしていった場合についても、それぞれパターンの数が2倍になり、その半分については上位ビットが偶数個の0、もう半分は上位ビットが偶数個の1なので、すべて xor を取ると 0 になるというのは直感的に正しそうです（厳密な証明ではありませんが）。

よって、$K, A''$ という並びはすべて xor を取ると 0 になり、そこに $K$ を加えた $K, A'', K$ という並びは 0 と $K$ の xor を取ることとなるので値は $K$ になります。

M=0, M=1 の場合は少し異なりますが、範囲が小さいので全部調べればわかります。



## 提出コード

コンテスト中には解けませんでしたが、最終的に次のようなコードを書きました（抜粋）。全体は[こちら](https://atcoder.jp/contests/abc126/submissions/5486972)

```go
func main() {
	defer stdout.Flush()
 
	M := readInt()
	K := readInt()
 
	if !solvable(M, K) {
		println(-1)
		return
	}
	if M == 0 {
		if K == 0 {
			println("0 0")
		} else {
			println("-1")
		}
		return
	}
	if M == 1 {
		if K == 0 {
			println("0 0 1 1")
		} else {
			println("-1")
		}
		return
	}
 
	N := int(math.Pow(2, float64(M)))
 
	sp := ""
	for i := 0; i < N; i++ {
		if i == K {
			continue
		}
		printf("%s%d", sp, i)
		sp = " "
	}
	printf(" %d", K)
	for i := N - 1; 0 <= i; i-- {
		if i == K {
			continue
		}
		printf(" %d", i)
	}
	printf(" %d", K)
	println()
 
}
 
func solvable(M, K int) bool {
	if K < int(math.Pow(2, float64(M))) {
		return true
	}
	return false
}
```
Autodesk Inventor のアセンブリ方法について

#パーツをアセンブリする
[過去の投稿](https://qiita.com/mat-MUNET/items/0aae003310420514409c)で題材に取り上げたパーツをアセンブリさせます。
アセンブリとは”組立て”を意味し、PC上で作成したパーツやDL
したパーツをくっつけて、完成形をシミュレートすることが出来ます。
アセンブリ情報は、パーツと別のファイルとして扱われます。
アセンブリファイルは、構成されているパーツのパスを持っている状態です。
もちろんパーツの形状等を変更した場合は、即座に反映されます。
アセンブリさせたパーツをどこかに動かしたり、消したりした場合はパスが無効になるためアセンブリエラーになります。注意しましょう。

##アセンブリの開始
新規作成から「Assembly」を選びます。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/aaabe9b4-2375-a858-cdb2-31ce815e2433.png)

「配置」からアセンブリしたいパーツを選びます。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/c5d51d88-9b2d-73b8-042d-d8e508e3d870.png)

選択したパーツを配置します。今回はまさにテキトーな場所でクリックしました。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/7c5c29d6-3d99-f041-2c39-b74187b661b1.png)

続けて、くっつけたいパーツも同様に「配置」から読み込み配置します。
これまた位置は適当です。後でくっつけるので、見やすい位置にいれば問題ないです。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/925962a0-8749-6204-8bda-4d6f02df6880.png)

##関係構築
今回は２つのパーツを配置しました。これから関係構築といって、このパーツのくっつき方を設定します。
関係構築について、Soldworksなどでは「合致」と一言で済んでいることが、Inventorでは紛らわしい言葉が並んでいるので、先に簡単に説明します。
###ジョイントと拘束の違い
####拘束
パーツ同士の結合条件を設定する。
簡単に言うと接着剤のようにくっつけたいときに設定する　こと
####ジョイント
連結条件と設定すること
例えば兆番やリンクなど動く（稼働する）前提の構築を行う場合に設定する。

今回は「拘束」を用いて関係構築を行います。
###平面のメイト
「拘束」をクリックしてタイプはメイトを選びます。解析の条件を図の通りにして、各パーツのくっつけたい”面”をそれぞれ選択します。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/5ca4aea0-5022-24c5-d7f4-e00ca2a33a71.png)

選択する面を拡大します。上の図と若干位置が違いますが、平面としては同じとなります。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/b140edad-8b57-e0b8-b4f1-26221d0b6ba2.png)
板状のパーツもくっつけたい面をクリックして選択します。
二つの面が選択された瞬間にパーツが動きますので、びっくりしないでください。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/e763ca37-d7dc-9228-ea22-ecb34ffec64a.png)
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/eed0c1ce-8b02-7861-7b51-1fa6b71ba649.png)
まだ、一つの平面のみを選択しただけなので、壊れたようにくっついています。

次は穴同士をくっつけます。
穴など円形のもの同士は、同軸上に拘束するように選択します。
つまり今回は、軸を選択します。

###軸のメイト
くっつけたい穴の軸同士を選択します。
マウスを穴に近づけると勝手に軸のマーカーが出現しますので、それをクリックします。
同じ作業を相手のパーツでも行います。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/5a7ff151-1b5e-4b6d-2374-5526efd574db.png)

今回は完全一致をしたいので、穴は二カ所以上拘束します。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/b58418d0-c554-695b-d48c-aa8eaf2a5030.png)

無事にアセンブリで出来ました。

#STLファイルへの変換
３Dプリンタなどに製造ファイルを出力する手順を簡単に紹介します。

「ファイル」→「書き出し」→「CAD形式」を選択します。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/0165182b-2fd8-303e-84ef-df9d9afb98b2.png)
ファイル形式を「STLファイル」と選択します。
STL形式は、多くのCADでサポートされていますので、このファイルを3Dプリンタの製造ソフトに読み取らせることで、Gコードを生成させることが出来ます。
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/69e58c1f-aeee-2de4-f87b-4c93f7ee3e03.png)

以上
簡単にAutodesk　Inventor　の使い方を描いてみました。
非常にわかりにくくてすみません。
ただ、CADなどは分からないなりに使っていくと要領を得ることが出来ます。
最初は、時間をかけて使い続けることが大切です。
SpreadSheetでimport_dataを作る時に気を付ける事

# 前書き

凄く下らない事だが、とある事でimport_dataを作成する時にハマってしまったのでそれについてmemo

環境
Ruby
Rails
Mysql

import_dataサンプル
￼￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241708/06748fae-4454-2f21-fea6-86c1d1f58562.png)

# 事件内容
import_data.csvをrubyでMysqlに食わす際にバグる件

# 結論から

↓これが悪い😡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241708/2f0cba03-9dfd-9d1f-9331-995a447c149d.png)

じゃあどうすればいいのか？
↓こうすればいい
￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241708/efc3432a-640e-9c50-0415-ad03a00e5333.png)

↓もっと言うとこうしとけ
￼![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241708/9dc36a85-3bf9-4647-184b-cd4d0a548bcd.png)

# 後書き
結局は型変換ちゃんとしてね！という話ですが、
SpreadSheetとRailsを信じてDate型を雑に扱った自分が悪い・・・
Date型はデリケートなので詳しい方も一呼吸置いて扱いましょうねー
Raspberry pi 豆知識 (sshでvideo鑑賞)

#よかったらいいねしてね!pythonの講習ネタ
40年前テレックスアートなるものあった。テレタイプに活字を駆使して絵を出すことだ。昔、PDP11を習いにカルフォルニアに行ったときに、DECの講師は、見事な活字だけでプレーボーイのカレンダーガールを作り、潜水艦に送ったそうだ。
では、sshでvideo鑑賞するとしよう。rloginを使ってsshにアクセスし下記のコマンドを試してみよう。

```
pi@raspberrypi:~ $ vlc https://youtu.be/UqyT8IEBkvY
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/965acf67-c79f-597c-c8aa-29f6385370ae.png)

##動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Raspberry pi 開発中 <a href="https://t.co/vUTGbHkjQw">pic.twitter.com/vUTGbHkjQw</a></p>&mdash; utaca.rich (@RichUtaka) <a href="https://twitter.com/RichUtaka/status/1130382355644862465?ref_src=twsrc%5Etfw">May 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
CentOS ネットワーク設定トラブルメモ

なんか色々やっていっぱいいっぱいになってきたので
メモして落ち着くっ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390710/30ee641b-ebd0-da59-d60b-428c28f9c578.png)

とネットワークが正常に取れなくなった……

どこかで見たNetworkManagerが悪いというのを見て
Stop　して　Off　したけどやっぱり原因調査に必要っぽいので
chkconfig NetworkManager on
にして
service networkManager start
にしたっ

で
failed to start lsb bring up/down networking
って赤くなっているから見ているのですが

eth0   が　DEVICE　eth0
となっているので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390710/dd77512a-d9da-66c9-f226-468512254752.png)

eth0を見てみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390710/dc6c1f03-781e-709d-3e0b-861b5d5f3173.png)

で大丈夫な気がするんだけどな……

駄目なのかな？？？
WINDOWS Server2019でフォントを全アカウントで使用する

# 概要
WINDOWS Server2019でフォント管理に関する運用に戸惑ったので、備忘録です。

# フォントが全PCに反映されない
過去に触ったことのあるWINDOWS OSでは、
コントロールパネル→フォントを開いて追加したいフォントをそこへドラッグすることで
PC内のアカウントすべてに反映されていました。

この運用が変更となっているようで、上と同じ操作をした場合
フォントが追加されるのは、追加を実行したアカウントのみとなってしまい
別のアカウントでログインした場合はフォントは登録されない状態となっていました。

# WIN10の最新Ver（1809）からフォントの運用変更あり

調査したところ、WIN10の最新Ver（1809）からフォントの運用に変更があったようです。
WINDOWS Server2019はWINDOWS10ベースの管理となっているため
同様に運用が変更になっていると思われます。

https://www.atmarkit.co.jp/ait/articles/1901/31/news053.html


# フォント運用の変更点
●管理者権限がないアカウントでもフォントの追加が可能になった。
この変更のおかげで、「コントロールパネル→フォント」にファイルをドラッグして追加した場合は
個人アカウントのみで有効となるローカル利用のフォントとなるようです。
この場合のフォント管理フォルダは「%LocalAppData%\Microsoft\Windows\Fonts」となっていました。

●フォント追加方法の変更
フォントファイルを右クリックすると
・インストール
・すべてのユーザーに対してインストール
という項目が選択できるようになり、すべてのユーザーに対してインストールを実行すると
「%LocalAppData%\Microsoft\Windows\Fonts」
「C:Windiws¥Fonts」
の2か所にフォントが展開されていました。

#フォントを正しく管理するためのまとめ

●自分のアカウントだけでフォントを利用したい場合
　・コントロールパネル→フォントを開きファイルをドラッグ、もしくはフォントファイルを右クリックして「インストール」
　
●全ユーザでフォントを利用したい場合
　・フォントファイルを右クリックして、すべてのユーザーに対してインストール

上記のような操作を実行することで思い通りのフォント管理を行うことができました。
アカウント毎でフォントを別管理できるのは、メリットだと思うのですが
昔からのやり方しか知らない状態だったため、対応に戸惑ってしまいました。
アカウントが1個しかない場合は問題にはなりませんが、RDS機能を使う場合は注意してください。
【CSS】Flexboxの折返し配置、1つのときだけ真ん中にする方法

## 要件
Flexboxの折返しリストにおいて、リストアイテムが一つしかなかった場合、Flexboxデフォルトの左寄せではなく中央寄せにしたいデザインがあった。
![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235781/6fbd4f93-57dc-6311-efa7-d39bacccecee.jpeg)


## コード
### pug
```pug
.bg
  section
    h2 wrap(1)
    .wrap
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")
        
  section
    h2 wrap(2)
    .wrap
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")

  section
    h2 wrap(3)
    .wrap
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")

  section
    h2 wrap(4)
    .wrap
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")
      .itemWrap
        img.item(src="https://placehold.jp/150x150.png")
```
### scss
```scss
// 装飾
.bg {
  color: #fff;
  background: #444;
  max-width: 600px;
  margin: 0 auto;
}
section {
  margin-bottom: 80px;
}
.item {
  width: 100%;
  display: block;
}

//メイン
.wrap {
  display: flex;
  flex-wrap: wrap;
  margin: 0 -20px;
}
.itemWrap {
  box-sizing: border-box;
  flex-basis: 50%;
  padding: 20px;
   &:first-child {
    margin-right: auto;
    margin-left: auto;
  }
}
```


## 解説

### 基本
以前、紹介した余白をスマートに記述する方法を用いている。
https://qiita.com/dorara/items/89364b0ab9e9d5d5c7b7

#### flexをかける外側wrap
```scss
.wrap {
  display: flex;
  flex-wrap: wrap;
  margin: 0 -20px;
}
```
paddingを用いて余白を確保するので、`justify-content`はデフォルトのまま。
`flex-wrap`の折り返しon。（デフォルトがoff
横paddingを打ち消すためのマイナスマージン。

#### アイテム各々のwrapper
```scss
.itemWrap {
  box-sizing: border-box;
  flex-basis: 50%;
  padding: 20px;
}
```
Flexのためのdiv。アイテム（今回は画像）を囲い、幅の%指定と`padding`で余白確保を行う。
片方のpadding-left + もう片方のpadding-right でアイテム横間の余白を作るので、paddingの値は間の距離/2。



### 最初だけmargin:auto
```scss

 &:first-child {
    margin-right: auto;
    margin-left: auto;
  }
```
そして、 `itemWrap` の一番目だけ左右のmarginをautoに設定する。

2個以上の場合は、`wrap`の要素を`itemWrap`の幅がぴったり覆っているので、`margin:auto`は発動せず、1個単体のときのみセンタリングする仕組み。

## 実装サンプル
https://codepen.io/dorara_css/pen/joLQwd
Gitで毎回パスワードを聞かれないようにする

## 問題
Gitのリモートリポジトリをhttpsにしていると、`git push`などの実行時に

```terminal
Username for 'https://github.com': 
Password for 'https://github.com': 
```

といった形で毎回認証情報の入力を求められてしまいます。

## 解決方法

### 永続的に認証情報を保存

```terminal
git config --global credential.helper store
```

を実行すると、入力した認証情報が**永続的に**保存されるようになります。
ただしパスワードが平文で保存されます。

### 一時的に認証情報を保存

```terminal
git config --global credential.helper cache
```
を実行すると、入力した認証情報が**一時的に**保存されます。

デフォルトでは 900 秒（15分）で情報が破棄されます。
オプションを使うことでタイムアウト時間を指定できます。

```terminal
git config --global credential.helper 'cache --timeout=3600'
```
Cordova --- ファイルパスで BLOB を読み出す

# Platform
- Cordova

# Library
- N/A

# Usage
```javascript:readFileDataFromPath.js
var filePath = 'myFilePath/myFile.zip';
var fileType = 'application/zip'; // *3 type-> MIME Types

window.resolveLocalFileSystemURL(filePath, (fileEntry) => {  // *1

    fileEntry.file((resFile) => {  // *1

        var reader = new FileReader();  // *2

        reader.onloadend = (evt) => {  // *2 callback when file completed load
            var blob = new Blob([evt.target.result], { type: new String(fileType) });
            resolve(blob);  // Return BLOB file
        };

        reader.onerror = (e) => {  // *2 callback when error occured
            reject(e);
        };

        reader.readAsArrayBuffer(resFile);  // *2 check *2 for more method to read file
    });
}, (error) =>{
    reject(error);
});
```
# Reference
****1*** https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/
****2*** https://cordova.apache.org/docs/ja/3.1.0/cordova/file/filereader/filereader.html
****3*** https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
[Ionic4] iOS/Androidアプリ用ビルド時のエラー対策

# 概要
参考書籍: Ionicで作るモバイルアプリ制作入門
↑のCHAPTER02 SECTION-007 「アプリとしてビルドしよう」にしたがって、iOS/Androidアプリとして実機かエミュレータで動かす
ビルドが通るまでに苦戦したため解決方法の備忘録

# バージョン
Ionic CLI 4.12.0

# iOSアプリとしてビルドする
```
$ ionic cordova build ios --prod
```
## こんなエラーが出た
- 実機を接続したままビルドしていたら、archive not found at path  等のエラーが出た。--buildFlag="-UseModernBuildSystem=0" をつけても解消しない。-> 実機はずすとすんなりビルドが通った。
-  config.xmlをビルド前にいじると、Merging project's config.xml into platform-specific iOS config.xml のエラーが出る。 -> platforms/ios フォルダを削除してから実行すると解消。
-  XCodeで開いて動かす際、Bundle Identifierは変更してもよいが、Display Nameを変更するとエラーになる。

# Androidアプリとしてビルドする
```
$ ionic cordova build android --prod
```
## こんなエラーが出た
- ビルド時に以下のようなエラーメッセージが出る。<br/>
No resource found that matches the given name (at 'networkSecurityConfig' with value '@xml/network_security_config').<br/>
AndroidManifest.xml が作成されていないのが原因か？ <br/>https://stackoverflow.com/questions/47926796/cordova-does-not-create-androidmanifest-xml<br/>
-> Cordova Android を6.3.0から7.0.0にバージョンアップして解消。

```
$ ionic info
(略)
    Cordova Platforms     : android 6.3.0, ios 4.5.5
(略)
$ ionic cordova platform rm android
$ ionic cordova platform add android@7.0.0
$ ionic info
(略)
    Cordova Platforms     : android 7.0.0, ios 4.5.5
(略)
```

- Android Studioで開いた際にGradle Plugin のアップデートを促されても断る。
Homebrewのインストール時に発生したエラーを解決！

rbenvをインストールするために、まずはHomebrewをインストールしました。
その際にエラーが出たので解決方法を残しておきます。

### Homebrewのインストール
まずはこのコマンドを実行。

```console:console
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
### 正しくインストールされたか確認

`$ brew doctor` と打ち込んで確認します。
すると、下記のようなエラーが出ました。

## エラー内容
```console:console
Warning: Unbrewed dylibs were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
  /usr/local/lib/JPKIPKCS11.dylib
  /usr/local/lib/JPKIPKCS11Auth.dylib
  /usr/local/lib/JPKIPKCS11Sign.dylib
  /usr/local/lib/JPKIServiceAPI.dylib
```
このエラーの内容としては、/usr/local/lib 配下に予期せぬ要らないファイルがあるから削除した方が良いよ〜！ ということです。

削除した方が良いファイルは、Unexpected dylibs:以下に表示されているファイルたちです。

そこで、`rm -f` コマンドを使ってそのファイルたちを削除します。
(-f オプションで「削除しますか？」といった確認を省略できます。）

```console:console
$ rm -f /usr/local/lib/JPKIPKCS11.dylib
...
```
全て削除したら、もう一度`$ brew doctor` を行ってみます。

```console:console
$ brew doctor
Your system is ready to brew.
```

このような表示が出れば完了です！

---
### 参考
[brew doctorでのWarningを解決してみた(for Mac)](https://qiita.com/FrogWoman/items/7c0fdaa7550dc5895a33)
【蟻本】迷路の最短路 p.37 をPython3で書いてみた

プログラミングコンテストチャレンジブック（通称蟻本・アリ本）第2版のp.37の「迷路の最短路」をPython3で書いてみました。
リストの初期化の仕方に気をつける必要があります。（一応コメントとしてコードの中に書いてあります）

```python
N, M = 10, 10
maze = [['#', 'S', '#', '#', '#', '#', '#', '#', '.', '#'],
        ['.', '.', '.', '.', '.', '.', '.', '#', '.', '#'],
        ['.', '#', '.', '#', '#', '.', '#', '#', '.', '#'],
        ['.', '#', '.', '.', '.', '.', '.', '.', '.', '.'],
        ['#', '#', '.', '#', '#', '.', '#', '#', '#', '#'],
        ['.', '.', '.', '.', '#', '.', '.', '.', '.', '#'],
        ['.', '#', '#', '#', '#', '#', '#', '#', '.', '#'],
        ['.', '.', '.', '.', '#', '.', '.', '.', '.', '.'],
        ['.', '#', '#', '#', '#', '.', '#', '#', '#', '.'],
        ['.', '.', '.', '.', '#', '.', '.', '.', 'G', '#']]

INF = 10**10

sx, sy = 0, 0  # スタートの座標
gx, gy = 0, 0  # ゴールの座標

for i in range(N):
    for j in range(M):
        if maze[i][j] == 'S':
            sx =i
            sy = j
        if maze[i][j] == 'G':
            gx =i
            gy = j

d = [[0] * N for i in range(M)] # 各点までの最短距離の配列
# こうしてはダメ   d = [[0] * N] * M  

dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

# (sx, sy) から　(gx, gy) への最短距離を求める
# たどり着けないとINF
def bfs():
    que = []
    # 全ての点をINFで初期化
    for i in range(N):
        for j in range(M):
            d[i][j] = INF
    # スタート地点をキューに入れ、その点の距離を0にする
    que.append([sx, sy])
    d[sx][sy] = 0
    
    # キューが空になるまでループ
    while len(que):
        # キューの先頭を取り出す
        p = que[0]
        que.pop(0)

        # 取り出してきた状態がゴールなら探索をやめる
        if p[0] == gx and p[1] == gy:
            break
        
        # 移動4方向をループ
        for i in range(4):
            #　移動した後の点を (nx, ny) とする
            nx = p[0] + dx[i]
            ny = p[1] + dy[i]
            
            # 移動が可能かの判定とすでに訪れたことがあるかの判定（d[nx][ny] != INF　なら訪れたことがある）
            if 0 <= nx and nx < N and 0 <= ny and ny < M:
                if maze[nx][ny] != '#' and d[nx][ny] == INF:
                    # 移動できるならキューに入れ、その点の距離をpからの距離+1で確定する
                    que.append([nx, ny])
                    d[nx][ny] = d[p[0]][p[1]] + 1
    return d[gx][gy]

def solve():
    res = bfs()
    print(res)

solve()
```
GPT-2で日本語生成

# イントロダクション
こんにちわ！この記事ではOpenAIが出したGPT-2で日本語の文章を出力してみるシリーズを紹介します。
# GPT-2とは
OpenAIのGPT-2は文章を出力する機械学習のアルゴリズムであり、フェイクニュースや人物のなりすましなどが恐れられているほどの文章が生成できるアルゴリズムです。サンプルコードはもう公開されています。しかし、現在は英語の文章にしか対応してません。なので、よくやられていることは単純にその英語の文章を[Google翻訳することです](http://cedro3.com/ai/pytorch-gpt-2/)。
そこでGPT-2を最初から日本語の文章に対応させたら、どんな文章が生成されるのかっというのに興味を持ってこのシリーズを始めました。
# 段階
####1. ウェブスクレイピング
ウェブスクレイピングとはウェブサイトからテキストデータなどのデータを摘出することです。例えば、このサイトのデータをウェブスクレイピングしようとすればここのテキストデータをすべて.txtのファイルに保存することもできます。GPT-2を作ったOpenAIはRedditというアメリカのほぼ何でも投稿できるサイトで学習させたので、日本語のウェブサイトAmebaとLivedoorっていうサイトからデータをとってみようと思います。

####2. コードを編集
GPT-2は先ほど言ったように英語のみに対応しています。なのでテキストデータを機械が認識できるデータに変える際にも英語のみに対応した文章や単語の区切り方（スペースで区切る、's, 'veなどを区切る）などの工夫がされています。なので日本語では日本語独自の単語の区切り方を使うようにコードを編集しないといけません。

####3. 学習
正直これが一番大変だと思いますが、最後には最初からGPT-2のモデルを日本語のデータで学習させてみます。
####4. テスト
最後には実際にLivedoorとAmebaにブログを１個か２個程度載せてみて実際に人気あるか試してみます。