OmniAICreator/Qiita-1.07M huggingface dataset:
自分用メモ(三項演算子、append)

`ABC147を行った際、問題で使ったためメモ
問題を引用しています、まずかったら消します`
#三項演算子とは
- 条件分岐の文が一行で表せられる便利な記述方法

```py
'変数'='条件を満たしている時の処理' if '条件式' else '条件を満たしていない時の処理'
```
で書くことができる。

従来の条件式と見比べると、

```py
if '条件式':
     '条件を満たしている時の処理'
else:
     '条件を満たしていない時の処理'
```
と、なり前者の方がスマートに見える。
#### 例えば
今回の場合、a問題を取り上げる。
`a,b,cを足して21以上になれば"bust"、そうでない場合は"win"を出力する`ように条件を設定するので

```py
a,b,c = map(int,input().split())
ans = "bust" if a+b+c>=21 else "win"
print(ans)
```
このようにたった3行で書くことができる。
####欠点
- 条件分岐が多い場合とても見づらくなり、間違いがあったとき他の人が確認することが困難になるという点

三項演算子を用いるのは、条件分岐が二つの時に使うくらいがちょうどいいような気がする。
#appendとは
- 追記するという意味。
ここではリストに要素を追加するためのメソッドとして扱う
- 主に配列の生成や、リストの中にリストを生成したい場合に使う


#### 例えば
今回の例だと、B問題を取り上げる。
`高八士君は回文が大好きで、回文でない文字列が許せません。高八士君は文字列を 1 回ハグするごとに、文字列から 1 文字を選んで任意の文字に変える`のを判別するために入力された文字列sを逆にした文字列と比較したいから

```py

s=input()
r=[]
a=0
for i in range(len(s)):
 r.append(s[len(s)-i-1])
for i in range(len(s)//2):
    if s[i]!=r[i]:
        a+=1
```
と表せる。
このようにappendを用いることで、簡単にリストの管理が行える。
####区別
attendの他にextendも同様の役割を果たすが、リストの中にリストを入れるのと、リストとリストを連結させるという違いがあるため使い分けに気をつける必要がある(らしい)。
この辺は曖昧。
#まとめ
####三項演算子

- 条件文が一行でまとまって便利だが条件分岐が増えれば増えるほどわかり辛さが増す

####append

- ソースコードのリストを管理する際、入れ子構造を用いる場合は利用しやすい

正直他と比べるという考えることがあまりなかったので~~調べながらやってるので~~今後練習の中で色々使っていければなぁと思います。


ここまで
カルネージハートぽいAPIのJavaScript対戦ゲーム作った紹介

JavaScriptのプログラムを書いて対戦させるゲームを作ったのですが、カルネージハートを少し意識したルール・APIとなっているので、きっと[カルネージハート Advent Calendar](https://qiita.com/advent-calendar/2019/carnage-heart)を観に来る方であれば興味を持ってもらえるんじゃないかと思い13日目の記事として紹介。

## 作ったもの
以下のようにJavaScriptのプログラムを書いて対戦できるゲームです。 Sourcer ( https://github.com/benishouga/sourcer ) といいます。
![Sourcer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27830/1962a583-585f-0ce9-c08f-2b3406b84e3f.gif)

## カルネージハートっぽさ
- カルネージハートのように以下のように状況を判断してアクションするというようなプログラムが書きやすいAPIとなっています
  - 敵が遠くにいる ⇒ 近づく！
  - 弾が飛んできている ⇒ 避ける！
  - 敵が近づいてきた ⇒ 攻撃！
- 敵や飛来物を探すAPIはカルネージハートのように扇形のレーダーを使って探すAPIとなっています<br>
  例） `controller.scanEnemy(45, 60, 75);` で以下のような範囲の敵を探して真偽を返す<br>
  ![radar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27830/1db20362-b2fe-3500-d73f-8efe621f4928.png)
- カルネージハートのように **耐久力**・**温度**・**燃料**・**残弾** のようなステータスがあり、攻撃しすぎてオーバーヒートするというような懐かしい体験ができます

## ぽくないところ
- 3D じゃなくて 横スクロール
- 重力で落ちていくので高さの制御が必要
- チップを並べる じゃなくて JavaScriptコード書く
- 機体自体はいじれません
- 1対1の対戦です

## その他
- 攻撃手段の１つ**ミサイル**の挙動もプログラムで制御することができる
- 対戦サーバーをサクッと立てられます
  - 身内でのイベントなどに使ってもらえると嬉しいです
  - Herokuボタンもいけるはず
- サンドボックスは[vm2](https://www.npmjs.com/package/vm2)というライブラリ依存です
  - あくまで自己責任で :P

## とりあえず遊んでみたくなった人
もっと詳しく知りたい人やひとまずコード書いてみたい人はドキュメントページでお試しできます。<br>
http://benishouga.github.io/sourcer/standalone-ja.html

対戦もしてみたいという方はHerokuでサーバー立てているのでそちらから。<br>
https://sourcer.herokuapp.com/

応援したくなった方いましたら Github 上のスターもらえると励みになります :)
【Python】リスト内の要素の全ての組み合わせを出力

__リスト内の要素の組み合わせを全て知りたい__
例えば

```
['Apple','Orange','Grape']
```

のリストから

```
[['Apple'], ['Orange'], ['Grape'], ['Apple', 'Orange'], ['Apple', 'Grape'], ['Orange', 'Grape'], ['Apple', 'Orange', 'Grape']]
```

という出力を得たいわけです。要素が1つしかない組み合わせもあるし、複数含まれる組み合わせもある。$2^n-1$個の要素をまとめたリストになることはわかるのですが、実際に書こうとしたら躓いてしまった。複雑なネストになりそうじゃないですか。

こういう時に使える標準ライブラリを知りました。
[itertools --- 効率的なループ実行のためのイテレータ生成関数](https://docs.python.org/ja/3.6/library/itertools.html)

|イテレータ|引数|結果| 
|:-----------------|:------------------|:------------------|
|combinations()|p,r|長さrのタプル列、ソートされた順で重複なし|

 
例えば、

```test.py
import itertools

lis = [1,2,3,4]
for pair in itertools.combinations(lis, 2):
	print(pair)
```

上を実行すると以下の結果を得られます。

```
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
```
一応、引数を変えてもう一回試してみましょう。

```test2.py
import itertools

lis = [1,2,3,4]
for team in itertools.combinations(lis, 3):
	print(team)
```
```
(1, 2, 3)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)
```
itertools.combinations()　では、このように**リストの要素で、任意の要素数での全ての組み合わせパターンを(タプルで)得られます。**
ここで、要素数を1からはじめてリスト長までfor文で回せば、最初に欲しかった答えが得られそうです。

```all_combinations.py
import itertools

lis=['Apple','Orange','Grape']
result = []
for n in range(1,len(lis)+1):
	for conb in itertools.combinations(lis, n):
	    result.append(list(conb)) #タプルをリスト型に変換
print(result)
```
実行結果

```
[['Apple'], ['Orange'], ['Grape'], ['Apple', 'Orange'], ['Apple', 'Grape'], ['Orange', 'Grape'], ['Apple', 'Orange', 'Grape']]
```


『リーダブルコード』でも言及がありますが、普段から標準ライブラリに目を通す癖をつけておくと、良いコードを書けるんだろうなと思いました。

itertoolsについて他のメソッドも含めてまとめているQiitaの良記事がありますので参考に掲載します。


[すごいぞitertoolsくん](https://qiita.com/anmint/items/37ca0ded5e1d360b51f3)
[itertools、more-itertoolsの紹介](https://qiita.com/SaitoTsutomu/items/ddb5076ef62745f03b56)

便利だと思った標準ライブラリの紹介でした！
【10日目】トランザクションサポートデータベース実装

# まえがき
前回は自トランザクションと他トランザクションからの見え方を制御する可視性制御、という概念とその実装方針について記載しました。今回は、トランザクション内で複数の変更操作を実行した場合に、どのようにそれらの変更履歴を積み重ねていくかについて考えていきます。gitでいうならローカルブランチに対して複数回コミットをするときのイメージです。

## ローカルデータ領域のデータ構造
まず初めに、前回のローカルデータ領域のデータ構造は、共有データ領域と全く同じデータ構造をしていました。しかし、各変更操作（INSERT/UPDATE/DELETE)ごとに、参照用カラムインデックスの作り方が変わってきます。そのため、ローカルデータ領域にはどのクエリで、どういう操作が実行されたかも保持するようにします。

## 複数回の変更操作
1トランザクション内で、複数の変更操作をしたことを考える。ローカルデータ領域に対しては、変更操作が行われた順に操作の履歴を積み重ねていかなければいけない。なぜなら、下記のような変更をしたとする。

1. りんごの値段を120円に変更する
2. りんごの値段を90円に変更する

この操作をするとりんごの値段は90円になっているはずである。しかしもし、この操作を逆順に実行した場合、りんごの値段は120円になってしまう。トランザクション内ではやはり、クエリ実行の順序を保って操作をしなければならず、そうなるように可視性制御もしなければならない。

そういうわけで、クエリごとにクエリIDを発行し、トランザクション内でのクエリの実行順序を記録する。トランザクションごとに、クエリの実行順にクエリIDをリストのお尻に足していく。こうすれば、トランザクション内で、A→B→Cの順でクエリが実行されたことがわかる。これを管理するシステムテーブルはms_tx_queryと名付けておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/eacde98a-ce75-3d04-fee3-782fdc646d62.png)

続いて、ローカルデータ領域は、クエリIDをキーとして、そのクエリの操作と変更データを持つテーブルにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/939eb166-2d71-bea9-13b0-1c97ee15fba4.png)

INSERTの場合は、オブジェクトIDと挿入したデータを保持。
UPDATEの場合は、更新するオブジェクトIDと更新前の値と更新後の値を保持。
DELETEの場合は、削除したオブジェクトIDとそのデータを保持

### 自トランザクション内でSELECTする
自トランザクション内でSELECTするときは、上記のローカルデータ領域の更新を、それらが実行された順番で共有データに対して適用して参照用テーブルを作成する。SELECTが発行されるたびに、共有データに対して更新操作を適用して参照用のテーブルを作るのはコストが大きいが、それはバッファを設計するときに考慮する。

# まとめ
複数回の変更操作に対しても可視性制御を行うために、ローカルデータ領域のデータ構造を説明しました。最後に、トランザクションをCOMMITしたときに共有データ領域への書き込みフローについて明日記載します。
Tensorboardでmatplotlibのプロットを表示

# はじめに
Tensorboardでmaplotlibのプロットを表示する方法が欲しかったため考えてみた。
Tensorboardでは画像を表示することが出来るので、プロットを画像化して表示すればよいのでは？と考えた。
ということで、その方法をまとめます。
なお、ログの出力は`tensorboardX`を介して行っている点に注意してください。

# 方法
まず、matplotlibでプロットを画像で得るため、バックエンドを`Agg`に切り替える。
バックエンドの切り替えは`import matplotlib.pyplot`の前に行う必要がある点に注意。

```python
import matplotlib as mpl
mpl.use('Agg')
```

プロットの画像データは以下の方法で取得できる。

```python
import matplot.pyplot as plt
import numpy as np

fig = plt.figure() # 繰り返し表示する際にはplt.figure(0)等でFigureを指定したほうが良い

# 何かしらのプロット

fig.canvas.draw() # Canvasに描画
plot_image = fig.canvas.renderer._renderer # プロットを画像データとして取得
# tensorboardXはchannel firstのようなので、それに合わせる
plot_image_array = np.array(plot_image).transpose(2, 0, 1)
```

あとは`tensorboardX`でログを出力するだけ。

```python
from tensorboardX import SummaryWriter

summary_writer = SummaryWriter(logdir='hoge') # writerの初期化
summary_writer.add_image('plot', plot_image_array) # 画像の追加
```
以上です。

その他に良い方法があれば是非教えてください。
DockerのnginxとRedisでホストにマウントしたログをログローテーション

AWS Workspaces
Amazon Linux2
nginx 1.16.1
Redis 5.0.7
[blacklabelops/logrotate](https://hub.docker.com/r/blacklabelops/logrotate)

```
mkdir -p log/nginx
mkdir -p log/redis
chmod 777 log/redis

docker run -d \
  --name nginx \
  -p 81:80 \
  -v $(pwd)/log/nginx:/var/log/nginx \
  nginx:1.16.1

docker run -d \
  --name redis \
  -p 6379:6379 \
  -v $(pwd)/log/redis:/var/log/redis \
  redis:5.0.7 bash -c "mkdir -p /var/log/redis && touch /var/log/redis/redis.log && redis-server --logfile /var/log/redis/redis.log"

docker run -d \
  --name logrotate \
  -v $(pwd)/log/nginx:/var/log/nginx \
  -v $(pwd)/log/redis:/var/log/redis \
  -e "LOGS_DIRECTORIES=/var/log/nginx/*.log /var/log/redis/*.log" \
  -e "LOGROTATE_COMPRESSION=compress" \
  -e "LOGROTATE_INTERVAL=hourly" \
  -e "LOGROTATE_CRONSCHEDULE=*/1 * * * * *" \
  -e "LOGROTATE_SIZE=10K" \
  -e "LOGROTATE_COPIES=3" \
  -e "LOGROTATE_DATEFORMAT=%Y%m%d%H%M%S" \
  blacklabelops/logrotate
```

ログローテーション動作確認
nginxはブラウザでアクセスの繰り返し
Redisはdocker restart redisの繰り返し

```
ls log/nginx

access.log
access.log20191212171100
access.log20191212170255.gz
error.log
error.log20191212171056
error.log20191212170254.gz

ls log/redis

redis.log
redis.log20191212171228
redis.log20191212170728.gz
```
# logrotateのDockerコンテナ内に作成されていたファイル

copytruncateを使っています。
ファイルをrenameではなくcopyして、元のファイルの「内容」を
消すというものです。
コピー→削除の間に若干のタイムラグがあるので頻繁に書き込みが
行われている場合にはデータの欠損が発生する可能性があります。

```usr/bin/logrotate.d/logrotate.conf
# deactivate mail
nomail

# move the log files to another directory?

/var/log/nginx/access.log {
 su root root
 rotate 3
 missingok
 compress
 delaycompress
 copytruncate
 hourly
 size 10K
 dateext
 dateformat %Y%m%d%H%M%S
}
/var/log/nginx/error.log {
 su root root
 rotate 3
 missingok
 compress
 delaycompress
 copytruncate
 hourly
 size 10K
 dateext
 dateformat %Y%m%d%H%M%S
}
/var/log/redis/redis.log {
 su root root
 rotate 3
 missingok
 compress
 delaycompress
 copytruncate
 hourly
 size 10K
 dateext
 dateformat %Y%m%d%H%M%S
}
```
デジタルトランスフォーメーションラボを通じて考えたこと

# デジタルトランスフォーメーションラボを通じて考えたこと
## はじめに
先日、Findy様主催の[デジタルトランスフォーメーションラボ(DX-Lab2)](https://findy-dxlab-2.peatix.com/) に声をかけていただき、
パネルディスカッションを行ったのですが、
折角なので、このイベントを通じて、感じたことを書き留めたいと思います。

あくまで、一個人の意見として受け取ってもらえれば幸いです。

## DXとは
まず、デジタルトランスフォーメーション（DX）なのですが、2004年にスウェーデンのエリック・ストルターマン教授によって提唱された概念のようで、「進化し続けるテクノロジーが人々の生活を豊かにしていく」というもののようです。

経済産業省でも、2018年12月に「デジタルトランスフォーメーションを推進するためのガイドライン（DX 推進ガイドライン）」を立てるなど、
近年、様々なところでおなじみの言葉になってきました。

Webを調べると色々と出てくると思いますので、詳しくはそちらをご参照ください。

## 実際はどうなの？
今回、Google Play ベストアプリ2018で受賞した、JapanTaxi様とお話したのですが、
自分たちがDXを進めているというところには少し違和感を感じました。

と言うのも、私たちはDXを進めることを目指していたわけでもなく、
結果的に見れば、「DXだね」と言われている印象を受けているからです。

では、私は一体、何をしたいのかというと、
**「世間が期待する当たり前に、テクノロジーを通じて精一杯応えたい」**
本質的には、これだけなのかと思っています。

私が所属する企業は、全国にホテルを運営する企業なのですが、
想いとしては、私たちが提供する宿を通じて、
**「お客様に快適な旅を提供したい」**
これが原点なのです。

そのために、大量にある情報を如何に早く伝え、適切に案内することで、
予約したときから、旅行が終わる時間までを有意義してほしいのです。

これらを実現するために、テクノロジーを利用し、利便性をあげているというだけという感覚で、良いものを作り上げようとしています。

## なぜ、ここまで、DXと言われるの？
あくまで私の主観なのですが、ポイントとしては以下だと思います。
- 近年の技術の進化が目覚ましい。
- 世の中に情報が溢れることで、みんなの期待値があがった。

私たちの業界では、20年前は、電話で予約を取り、雑誌やテレビなどから行きたいホテルを探すというのが、当たり前でした。
それがインターネットができることで、Webで予約が取れる世界が実現しました。
その後、ネットワークが早くなることで、Webページに大量の写真が載り、内容が充実になる一方で、サイトのスピードも重要になってきました。
さらには、スマートフォンでの操作が当たり前になり、今度は、スマートフォンでの体験も重要視されるようになりました。

このように、世の中の当たり前は常に移り変わり、それに応えるためにテクノロジーの力が必要になります。

また、提供するサービスが変わってきています。
元々、宿というのは、温泉があって、おいしい料理があって、気持ちよく滞在できて、それだけで十分だったのです。

それが、滞在中に色々なアクティビティが体験できるようになり、
今ではSNSでみんなにシェアするために、インスタ映えするスポットも重要になりました。

そうすると、アクティビティや写真スポットを提供者の私たちは考え出し、利用者の好みに応じて案内する必要が出てきます。

もちろん、これらを解決するためにも、テクノロジーの力は必要です。


そして、技術に対する利用者の期待値が上がっているため、当たり前の閾値がどんどん高くなっているといます。
例えば、「お勧め機能」などは、AI技術が発達する前はみなさん期待していなかったはずなのですが、
今では当たり前の機能として、世間では考えられています。

世の中で次々と新しいサービスを生み出し、クラウドサービスで簡単に利用できるようになっています。
さらにSNSで世の中に情報が大量に溢れることで、数年前にはなかった当たり前のレベルが上がり、それが浸透するスピードが速くなっていると感じています。

みんなの期待値が上がるのは、自然な流れではないでしょうか？

## DXと内製化って関係あるの？
今回のディスカッションのテーマが、「プロダクト内製化と技術組織づくりの苦悩との乗り越え方」ということで、内製化というのが1つのキーワードだったのですが、
こちらについても少しお話します。

一見、DXと内製化は直接的には関係ないものなのですが、
私たちのようにサービスを提供する事業会社にとっては、
DXを推進するためのキーになっているのではないかと思っています。

理由としては以下の2点です。
- 世間の期待する当たり前の進化が早くなったので、追いつくためのスピードが必要になっている。
- 生み出すプロダクトを深く考える必要があり、それができるのはサービスを提供する社員である。

過去の経験から、外注することで、本来専念するべきところ以外で、
大量に力を注ぎ、予算・契約といったところで、壁に阻まれ、苦労してきました。

1年以上かけて内製化を進めてきたのですが、その効果をようやく社内でも感じてもらえるようになりました。

また、プロダクトがどんどん良くなるから、プロダクトをもっと良くしたいと思いますし、上がっていく期待に応えていきたいと思うようになります。

内製化するためには、一から組織を作りあげたり、
今ある組織を大きくする必要があるため、仕組みを作り直したりする必要があります。
とても苦労をするのですが、得られるものも多いと思っています。

## 終わりに
長々と思いの丈を書いてしまい、すみません。
今回、声をかけていただき、本当に良かったので、ついつい書いてしまいました。

機会があれば、勉強会などでも話していきたいと思います。
第二種電気工事試験を受けた話②

　前回話した通り、12月7日(土)に実技試験を受けてきました～。
結果はまだ届いていないけどしっかり出来ているはずなため一安心。

## 筆記試験

**過去問ゲー。**

　電気工事士の筆記試験は過去問を5年、10回分くらいやれば6割合格なところ8割くらいは行く。らしい。自分はテキストはオーム社さんのポケットサイズのを買って通学の時間中に読んでて、過去問は3回分ほどしかやらなかったから62点くらいでギリギリだったという感じ。
前半の知識問題に関しては過去問とかテキストとか普通に勉強するしかないけど、後半の配電図に関しては実技を2回ほどやってから勉強した方が理解しやすかっただろうなーと後悔したのでそうするのがお勧め。筆記しかやらないとリングスリーブの大きさとか言われてもわからん！ってなるけど実技だとその理由が実際にやって分かる。

##実技試験
　問題が予め毎年同じ13問が発表されてるからそれをやっていれば問題ない。最初は使い慣れない工具も13回やっていくうちに慣れるからだいたい1通り全部やって、直前にもっかい不安な問題の複線図を確認すればだいたい受かれるはず（複線図とは、問題として出された図、単線図を、実際の結線が分かるように書く図）
接地側は白！
**最強アイテム、ケーブルストリッパ**
　電気工事士試験推奨工具。電気工事士受けるならこれ無しでやるのは考えられないというレベル。切って良し、剥いでよし、曲げて良し、測って良しの1本4役！あまりにも最強。


https://www.shiken.or.jp/ginouanswerK/pdf/011207/R01KNo10m.pdf
上(リンク飛ばさせる形でごめんなさい)が今回僕が受けた試験の問題(No.10)で、下の画像が同じ問題を練習の時に作ったやつ。
![IMG_20191205_185736.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539483/cc7d8d0a-2909-4a2b-016e-50956236c679.jpeg)

この問題は配線が少しややこしい代わりに使う線が少なく、複線図が**確実に**書ければ余裕で終わるというもの、という認識。同じ日に受けた友達で、そのややこしい部分で間違えて終わった人もいるから確認は大事。
ふと思ったけど、この問題使う線は少ないけど電気工事士の基本的なものはだいたいあるから一番最初にやるのに向いてるかもしれない。


最後に他に練習で作ったのを2つほど置いて終わろうかな。

公表問題No.1
![IMG_20191206_175250.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539483/3126ea22-85e2-2a55-a56a-caaedf6ab798.jpeg)

公表問題No.12
![IMG_20191206_165603.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539483/2d40651a-2a6c-d78a-8e17-1dc9c9e18a8a.jpeg)


**あとがき**
　今回も遅れてごめんなさい(~~ポケモンを最近始めて楽しすぎるからね仕方がない~~)
電気工事士の試験、高専生、特に電気電子系なら外部単位として認められたり学校が工具貸し出してくれたりするかもしれないから取って損は無いと思う。試験自体はちゃんと勉強すれば普通に受かれるからぜひどうぞ。
拙い文章でしたが最後まで読んでくれてありがとうございました。

前回はこちら↓
[電気工事士を受けた話①](https://qiita.com/tanni_kosen/items/8c1da5d8af7a02e13618)
PowerShellでVSCodeのプラグインを管理する

# TL;DR

VSCodeがいろんなPCにちらかっていて環境をそろえるのに一苦労。ということで、ここにメモる。

## 一覧の出力

こちらの記事を参考にしました。
[VSCode インストール済 プラグイン一覧の確認方法 (コマンド)](https://qiita.com/koshilife/items/3ed4b1c28de233f39ebb)

```powershell:cmd
code --list-extensions
```

```text:--list-extensions
Arjun.swagger-viewer
DavidAnson.vscode-markdownlint
dbaeumer.vscode-eslint
DotJoshJohnson.xml
esbenp.prettier-vscode
mauve.terraform
ms-python.python
ms-vscode-remote.remote-wsl
ms-vscode.Go
ms-vscode.powershell
shd101wyy.markdown-preview-enhanced
octref.vetur
PKief.markdown-checkbox
redhat.java
redhat.vscode-yaml
vscjava.vscode-maven
```

## インストール

一覧をぴろっと変数にいれて改行でsplitして`Foreach-Object`でインストールする。改行は `` `n `` なのか `` `r`n ``なのか環境によって適切に処理する。
以下に、extensionの一部を抜粋してコマンド例を。

```powershell
$list = @"
ms-python.python
ms-vscode-remote.remote-wsl
ms-vscode.Go
ms-vscode.powershell
"@ -split "`n"

$list | Foreach-Object {code --install-extension $_}
```
初めてのchrome拡張機能、qiitaのヘッダの色を変更

# 前提知識
chrome拡張機能：chromeをカスタマイズできるものがある
javascript:拡張子js webページ操作に強いプログラミング言語
#やること
初めてchromeの拡張機能を作る人向け
例として、Qittaの派手な緑色をグレーに変更するためにクロームの拡張機能を作る

今回は自分で使うだけで公開設定はしない
本当に最低限の設定

~~これでQiita使っているのがぱっと見バレないね!!~~


[google拡張機能色変更　(公開しました)](https://chrome.google.com/webstore/detail/qitta-color/gjggmgogcnfnmbccgdcdmjbgpdjflfdl?hl=ja&authuser=0)

<img width="1011" alt="スクリーンショット 2019-12-13 1.24.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393556/e7089dd6-041d-e898-4705-9e0825910270.png">



# 流れ
- 自分のPCにファイルを作る
    - ファイルにはhttps\://qitta.com/がつくときにはcontent.jsを実行する用に設定するmanifest.json
    - 実行したい文を書いたcontent.js
- chromeで読み込む



# ファイル構成
```
src
 |- manifest.json
 |- content.js
```
ファイル名|解説
---|---
manifest.json|chromeの拡張機能の設定ファイル
content.js|実行されるjsファイル

## ファイル説明　manifest.json
```js:manifest.json
{
  "manifest_version": 2,
  "name": "qitta_color",
  "version": "1.0.0",
  "content_scripts": [{
    "matches": ["https://qiita.com/*"],
    "js": [
      "content.js"
    ]
  }]
}
```
このファイルはchromeで読み込む際にgoogleが指定しているファイル。ファイル名を書き換えてはいけない。またjsonファイルにコメントアウトはできないので注意()

言葉|意味|どうすればいいか
---|---|---
manifest_version|このファイルのバージョン|今の所　2でいいらしい
name|拡張機能の名前|好きに決めていい
version|拡張機能のバージョン|アップデートときに増やす、最初は1とかでいい
content_script|URLの指定とどのファイルを実行するか|ワイルドカード使ってURLを指定、jsの方は自分で作ったファイル名(今回はcontent.js)

## ファイル説明　content.js
```js:content.js
window.onload = function() {
     document.getElementsByClassName('st-Header').item(0).style.backgroundColor = '#808080';
};
```
実行したいjavascriptのファイル
追記2022.8
(qiitaの仕様変更でこれでは色が変わらなくなった)
(要素は自動で取得できると良いが、今回は本質ではないので省略)
すごいざっくり説明するからあんまり参考しないほうがいい

言葉|意味  
---|---
window.onload|ページが読み込まれたときに実行
docoment.getE.....('st-Header')|st-Hederとclass宣言されているものを取得
item(0)|取得したのの最初を参照
style|スタイル
backgroundcolor|背景色 ここをcolorとかにすると文字色が変わる
\#808080|グレーのカラーコード

今回はクラス設定されていると色変更なのでこう

Iｄ設定されている時は

```js:
document.getElementById('st-Header').style.backgroundColor = '#808080';
```



javascriptは　chromeで　右クリック　検証　console　で行うことができる
HTMLとCSSの構成も見ることができる
詳しくは「chrome　検証」でgoogle検索


<img width="1085" alt="スクリーンショット 2019-12-13 1.34.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393556/c1b84170-eb60-11be-0dfd-91105b0758d3.png">





# 読み込み方
URLにこれを入れるか　設定から拡張機能のところに行く(httpsをつけるといかないので注意)
`chrome://extensions/`

<img width="1438" alt="スクリーンショット 2019-12-12 22.01.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393556/bc30cbcb-3dac-a689-a05c-13ec3dabd585.png">

パッケージ化されていない拡張機能を読み込むを押して
srcという名前のフォルダを開けば追加される。

<img width="457" alt="スクリーンショット 2019-12-13 1.23.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393556/24681743-f0cd-cf9f-0273-caf83fb6c312.png">

こんな感じ

<img width="1011" alt="スクリーンショット 2019-12-13 1.24.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393556/40455336-142e-35f7-1e01-52ef39c141c9.png">

Qittaにアクセスする　無事グレーになっている
他のところをもっと変えたかったらjsのファイルに追加していくのがよい、今回はわかりやすさ重視でこれだけにした



# 参考
https://qiita.com/mdstoy/items/9866544e37987337dc79
https://qiita.com/RyBB/items/32b2a7b879f21b3edefc
もっと細かく作り込みたいならこの辺りを見るのがよいと思います。参考になりました
[WIP]ミラーワールドの作り方


# ミラーワールドとは

> ミラーワールドはまだ完全に存在するわけではなく、まさに誕生しつつあるものだ。近い将来、現実世界（リアルワールド）にあるすべての場所やモノ──すべての道路、街灯、建物、部屋──の実物大のデジタルツインがミラーワールドに存在するようになる。いまはまだ、その片鱗をARヘッドセットを通して見ているに過ぎない。ひとつまたひとつと、ヴァーチャルな断片が縫い合わさり、ついには現実世界のパラレルワールド版として、開かれた永続的な場所が形づくられるのだ。
> 引用：[ミラーワールド：ARが生み出す次の巨大プラットフォーム](https://wired.jp/special/2019/mirrorworld-next-big-platform)

現実世界のデジタルツイン（デジタル複製された現実世界）のこと


---

# ミラーワールドの作り方

ミラーワールドをいきなり実現することは、世界をもう一つ作ることと同義なので、本稿ではそのファーストステップである、現実にあるモノの 

- トラッキング
- センシング
- ３Dスキャニング

について説明をする。

それらが幾重にも積み上がることによって、ミラーワールドは実現できるのかと思います。

## 現実世界のデジタル化

### １． 現実世界のトラッキング

とはいっても、網羅的に紹介できるわけではないので、代表的なワードを羅列していく。

### 1.1. RGBカメラ

いわずもがなの、現実世界を２Dの色情報に落とし込むことができる、いわゆる普通のデジタルカメラ。


### 1.2. 深度カメラ

Kinnectに代表される、深度情報を２Dの情報として取得できる。

- 赤外線センサー（IRセンサー）を用いたもの
- 複数のカメラの視差から深度を復元する方法
- その複合

が主な深度カメラの仕組み。

ほかに、RealsenseやiPhoneのカメラ（ARKit)などがある。



#### 1.3 測量センサー


レーザースキャナーのLiDARなど

レーザーを投射してその反射をスキャンして正確な距離を測るセンサー。

赤外線にくらべて、正確な距離を測定できる。


#### 1.4 モーションキャプチャー

- 光学式
- 磁気センサー式
- 慣性式
- その他

##### 光学式モーションキャプチャー

Optitrack, Vicon など。　VIVEや Oculusなどのセンサー設置型のVR機器などもこれに入る。
赤外線投射機とそのカメラを３次元複合して位置を得るしくみ。

##### 磁気センサー式モーションキャプチャ

Perception Neuron などがある。
磁気センサーによるセンサー間の移動距離を測定して、３D位置へと復元する仕組み。


##### 慣性式モーションキャプチャー

加速度センサーから移動量を推定する。
Xsense MVN などがある。

##### その他

その他、RGBカメラとDeepLerningによるものや、Kinnectなどの深度カメラから身体部位を計測する方法などがある。
上記の２つの方法は、精度が荒いので使い所が限られている。

参考： [モーションキャプチャー - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3)
初投稿

####はじめに
Qiitaの記事らしくない、自己紹介と学びと意気込みの表明をするページです。
>Qiitaは「プログラミングに関する知識を記録・共有する」サービスです。政治やスポーツを語る記事、ニュースの速報など、プログラミングに関係しない記事は投稿しないでください。

とコミュニティガイドラインに書かれているので悩ましいところではありますが、今日はごめんしてください。
####自己紹介
おはようございます。こんにちは。こんばんは。萩林康歩です。男性です。
三重大学の計算研究会を見学しに来て4,5回の新米です。生活レベルがギリギリです。実はまだ計算研究会に参加表明すらしておりません。これでいいんでしょうか。
####計算研究会
三重大学のサークルです。数学を極める人、コンパイラを作ろうとする人、気ままにプログラミング言語を究めるものと、まちまちのようです。
####三重大祭
計算研究会のメンバーが力を合わせて、VRゲームの開発などいくつかの企画を立ち上げました。私は見学に来て間もなかったのでスタッフとして活動することはありませんでした。一日目は勇気が出ず「明日計算研に行きます」と言ったのに、二日目には家族に連れられ__兼六園__に行った始末です。ですから僕が三重大祭で得られたことは、「文化祭は一人で行くべきではない」という教訓です。
####意気込み
学校とは全く関係のないところで、ゲームの中の数値を、プログラムとは関係なく手動の計算で集めています。そのおかげでデータを扱うプログラミング言語の__R__や__Python__について勉強したいと考えるようになりました。この二つ、特にRを一通り扱えるようになりたいです。
宜しくお願いします。
OpenShiftでHubotを動かす

#はじめに
OpenShiftでSlackに接続するhubotを動かします。

#イメージの作成
https://github.com/keniooi/openshift-hubot

にファイルを用意しました。以下の様に実行します。何させてるかは短いのでDockerfileを見たほうがいいかと思います。hubot用に導入して起動させています。Slack用のトークンやbot名はテンプレートから選べるようにします。

```shell:wheel$
sudo yum -y install git
git clone https://github.com/keniooi/openshift-hubot.git
cd openshift-hubot
sudo docker build -f Dockerfile-hubot-base -t nodejs/hubot .
sudo docker build -t nodejs/bot4you .

```

#DockerイメージのOpenShiftへの登録

OpenShiftのImageStreamへDockerイメージを登録します。

```shell:wheel$
oc login
oc new-project nodejs
oc registry login --skip-check
sudo docker login -u `oc whoami` -p `oc whoami -t` `oc registry info`
oc registry info
sudo docker tag nodejs/bot4you:latest `oc registry info`/`oc project -q`/bot4you:latest
sudo docker push `oc registry info`/`oc project -q`/bot4you:latest
oc get is

```

#テンプレートのOpenShiftへの登録

WEBコンソールから起動できるようにテンプレートを登録します。

```shell:wheel$
oc create -f template.yaml

```
この中で

- Name
- HUBOT_SLACK_TOKEN
- HUBOT_NAME

をダイアログで指定できるようにしてあります。

Template作成するときに参考にしたもの

- cluster-admin でログインしなおして元からあるテンプレートを export したもの
- OpenLiberty を deploy するのに使った kubernetes.yaml (templateなしにデプロイする yaml)

```shell:export-template
oc login
oc project openshift
oc export template -o yaml httpd-example

```

# テンプレートを使って起動

上の通りに実行していると、プロジェクトを nodejsにして、Catalog をみると Hubot が選べます。選ぶと Configuration で以下の画像の様に指定して起動できます。

Slackで HubotのアプリでAPIトークンをとって名前を指定します。それを Configurationに指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/50a3faae-e81e-d923-45c4-862e31fc9ab5.png)

起動が出来てると Slack で botyu が Online になり help で返事をしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/ce172ade-2923-fe00-1f3b-b19ef81d5e11.png)



# 参考
[TEMPLATES (テンプレート)](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/3.9/html/developer_guide/dev-guide-templates)
[Deploying microservices to OpenShift](https://openliberty.io/guides/cloud-openshift.html)
Ethereumをさわってみよう！

## はじめに

近畿大学 Advent Calendar 2019の14日目担当の@dionomusukoです。
今回は、Ethereumのプライベートネットでの操作とマイニングについて書こうと思います。
内容としては、[Etehreum入門](https://book.ethereum-jp.net/)をやっていくのですが、初心者の方でも、わかりやすく書いていきたいと思います。（私も初心者なので）

## スペック

* macOS mojave10.14.6

## Gethのインストール

最初に、Ethereumネットワークで操作できるようにするために、Geth([go-ethereum](https://github.com/ethereum/go-ethereum))を入れます。
ターミナルで

```
$ brew tap ethereum/ethereum
$ brew install ethereum
```

と入力して、gethをインストールします。（brew tapについては、[brew tapとは](https://qiita.com/saa/items/85ed5e914d424fbf9fd6)の記事がわかりやすく説明されていると思います。）

ここで

```
$ geth help
```
と入力して、バージョン等が返ってきたらインストールできています。

## Genesisファイルの作成

Genesisファイルを作るために、ディレクトリを作ります。

```
$ mkdir eth_private_net
```

上記ディレクトリに移動します。

```
$ cd eth_private_net
```

myGenesis.jsonファイルを作ります。

```
$ vim myGenesis.json
```

vimで下記コードを入力してください。

```json:myGenesis.json
{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}
```

vimでは、iキーを押すと入力できます。
保存は、esc+:wqです。
コマンドに関しては、[こちらの記事](https://qiita.com/hide/items/5bfe5b322872c61a6896)がわかりやすいです。

## Genesisファイルの初期化

以下のコマンドを実行しブロックチェーン情報をgenesisファイルの内容で初期化します。

```
$ geth --datadir ~/eth_private_net init ~/eth_private_net/myGenesis.json
```

これで、ターミナルでlsを打つといくつかのディレクトリが作成されます。

## gethの起動

それでは、gethを起動していきます。
下記のコマンドを入力してください。

```
$　geth --datadir="eth_private_net" --ipcdisable --port 50303 --rpcport 18101 --maxpeers 0 --nodiscover --networkid=15  console 2
```
のコマンドを打つとgethが起動できます。

## アカウントの作成

下記のコマンドでアカウントを作ります。
hogeの部分は、パスワードなので忘れないようにしてください。

```
> personal.newAccount("hoge")
```

## etherのマイニング(採掘)

下記コマンドで、マイニングを開始します。

```
> miner.start()
```

止めるときは

```
> miner.stop()
```
と入力します。

## マイニングしたetherの確認

下記コマンドで、獲得したetherの確認ができます。

```
> eth.blockNumber
```

gethを止めるときは

```
> exit
```
と入力します。

以上で、プライベートネットワークでのマイニングができました。😆

## 参考サイト

* [Ethereum入門](https://book.ethereum-jp.net/)
* [Ethereumの環境構築 -アルゴリズムとかオーダーとか](https://y-nakajo.hatenablog.com/entry/2017/11/10/090922)

## 最後に

近畿大学アドベントカレンダーを企画していただいた方々ありがとうございました。
今回は詳細な説明等を省いているため、もしこの記事で興味などを持っていただけたら、参考サイトなどを確認してください。とてもわかりやすく書かれています。
日本語プログラミングする時の名前の付け方を考える

プロデルでプログラムを作るときに変数名などの識別子を日本語で考えますが、英単語を組み合わせて考えるときとは勝手が違うことがあります。今日は日本語で識別子を名付ける時のことを考えてみました。

# 日本語プログラミングを試す人が増えて来た!?

プロデルのような日本語プログラミング言語はもちろん、Unicodeに対応した最近の多くのプログラミング言語では、識別子(変数名や関数名など)に日本語(漢字,ひらがな,カタカナ)を使えるようになりました。最近では、例えばPythonやScalaなどで変数やメソッドに日本語を使う、といった「広義の日本語プログラミング」を試みている方が少しずつ見かけるように思います(ネタの意味もあるかと思いますが)。

日本語の識別子の名付け方は、広義の日本語プログラミングとプロデルのような日本語プログラミング言語で作るプログラムでも、似ている所があるはずです。ノウハウ共有できる事があるかも知れないのでQiitaに書いてみることにしました。

# 日本語で名付けるメリット

- コメントを減らすことができる
- 辞書で英単語を調べる手間が省ける
- 後で見たときにわかりやすい

「日本語はタイプ量が多くなる」というデメリットがよく挙げられがちですが、IMEそのものの補完機能やIDEの入力補完機能である程度カバーできるはずです。一方で、頭で英単語への置き換えたり逆に読み替えたりする手間は、もう少し重要視されてもよいのではないかと思っています。辞書を引く手間が省けますし、スペルミスや意味の通らない恥ずかしい英語を書いてしまう心配もありません。プログラムを書くときや長期的にメンテナンスされる観点で、日本語は利点があるはずです。

# 命名規則
大抵のプログラミング言語では、プログラムの識別子を名付ける時のルールがあり、それを命名規則とかネーミング規約と言われています。
例えば

- Javaでは、クラス名は大文字で始める(アッパーキャメルケース),メソッド名や変数名は小文字で始める(ローアーキャメルケース)
- インターフェイス型名は"I"で始める

などなど。プログラミング言語によって異なりますし、流派みたいなものもあるかと思います。
命名規則は、必ずしも守る必要は無く、ルールが1つに決まっているわけではないですが、ルールに従って名付けるとわかりやすいとされています。

# 日本語だと困る時
よく知られてる命名規則は、半角英数字を前提としているので、日本語で名付けるときには通用しないルールがあります。英単語は同じ言葉でも大文字と小文字で書き分けられる。といった違いを日本語では別の方法で書き分けないといけません。

ここでは次の識別子の書き分けについて考えてみます。

- クラス名とインスタンス名
- 配列
- 一時変数

## クラス名とインスタンス名
オブジェクト指向プログラミングでは、クラス名とインスタンス名とをアッパーキャメルケース(例:Apple)とローアーキャメルケース(apple)とで書き分けてますが、日本語では書き分け出来ないので困ります。

### ダメだったこと - カタカナとひながなで書き分けてみる
試しにキャメルケースの書き分けの代わりに、クラス名は漢字、インスタンスはひながなで書き分けてみました。

`要素`　`ようそ`  `ヨウソ`

```
ようそという要素を作る
ようその内容は、「Hello」
```

結論としては、漢字とひながなとで、ぱっと見でクラスとインスタンスとの関係があることがわかりにくいと感じました。同様にカタカナとひらがなでも何か不自然に感じました(主観的ですが)。

```
ようそというヨウソを作る
ようその内容は、「Hello」
```

### インスタンス名はクラス名を末尾に付ける
英単語で名付ける場合、「Button」クラスのインスタンスには「okButton」「cancelButton」のようにクラス名をサフィックスとして付けてと名付けることがあります。同じように日本語でも、クラス名をサフィックスとして末尾に付けて2語以上で名付ける方法で落ち着きました。

「ボタン」クラスの場合、`OKボタン` `キャンセルボタン`

## 配列
配列クラス名とインスタンス名とを単数形と複数形とで書き分けてますが、日本語は個数で書き分けることはないのでまた困ります。

### ダメだった方法 - 末尾に「たち」「ら」を付けてみる
複数形を表す「s」の代わりに、「～たち」「～ら」を付けて書き分けることを試してみました。
例 ```要素たち```　```値ら```

```
色たちは、{赤,白,黄色}
色たちを色でそれぞれ繰り返す

繰り返し終わり
```

sを付ける感覚で「たち」「ら」を付けるので名付けやすい反面、普通「たち」「ら」は人名に対して付けるので、自然な日本語からは違和感を感じてしまいました。

# 良かった方法
やはりサフィックスを付ける方法が良いように思います。末尾に「リスト」や「一覧」を付ける方法が馴染んでいます。

```
色一覧は、{赤,白,黄色}
色一覧を色でそれぞれ繰り返す

繰り返し終わり
```

## 一時変数

色々考えていると、ループなどで使用する一時変数の名付け方も気になってきます。
私がプロデルでプログラムを書く際には、ちょっと使うような変数に一般に`a`とか`b`とかで名付けるのと同様に「あ」とか「い」とかで名付けています。ループ処理では`番号`や`カウント`,`要素`といった定番の名前を決めて付けることが多いです。

また、計算ロジックなどのアルゴリズムを含むプログラムではi,jとかx,yとか、アルファベットをそのまま使うこともあります。他の方が書いたプロデルプログラムを拝見しても、そういった名付け方をしている方を見かけますし、この方が良いと思います。「日本語プログラミング言語ならば必ず日本語表記を使わなければならない」とは思いません。

```
あは、10
いは、20

1から10までカウントを増やしながら繰り返す

繰り返し終わり

1からwまでxを増やしながら繰り返す
　　1からhまでyを増やしながら繰り返す

　　繰り返し終わり
繰り返し終わり
```

# わかったこと
日本語プログラミングをしてみて思うことは、少なくても既存の命名規則をそのまま日本語に置き換えることは難しいということです。未だに「これ」という書き方を定めるには至っておらず、試行錯誤しています。

命名規則は例えばクラスやインスタンスの書き分けが必要といったプログラミング言語処理系の特有の事情にも依存するので、日本語で名付ける時にもその言語の事情に応じた命名規則を別に考えていく必要はありそうです。
プロデルのような日本語プログラミング言語の場合、言語仕様や文法として取り入れて定めるべき所と、プログラムを書く人に委ねて自由に決められる所との、棲み分けも必要かなと思っています。

一方、一般の言語ではエディタが入力補完が日本語を前提としていないため、入力補完機能に適した名付け方もあると思います。読みやすさを犠牲にしても対象入力補完が有効に働く名前を付ける必要があるかと思います。

日本語プログラミングを実践している皆さまと、色々な書き方を持ち寄って、良い書き方を探していけたら嬉しいです。
プロデルでできること

プロデル Advent Calendar 2019企画に参加させて頂きます。
数年前にQiitaに記事を投稿していましたがプロデルブログの方へ引っ越して以来、久しぶりの投稿です。Advent Calendarということで、この機会にいくつか記事を投稿できればと思います。よろしくお願いします。

今日は、日本語プログラミング言語「プロデル」でできることをご紹介します。
元々プロデルはWindowsデスクトップアプリを作ることに特化した開発環境でしたが時代の移り変わりと共に、色々な環境で動かせるようになってきました。
あまりに色々やり過ぎて整理できていなかったので、この記事でまとめてご紹介できればと思います。

##プロデルの構成
プロデルは、大きく次の4つに分かれています。インストールすると、すべて利用できます。

- プロデル言語パーサー (プログラムの構文解析等を行う)
- ランタイム環境 (パースしたプログラムを実行する)
- コンパイラ (パースしたプログラムから中間コードを生成する)
- プロデルデザイナ(開発環境:実行,デバッグ,コンパイルをGUIで提供する)

プロデルでプログラムを作るときには、専用の開発環境である「プロデルデザイナ」を使うのが便利です。
プロデルデザイナでは、プログラムを編集したり、ランタイム環境で実行したり、デバッグ作業のための解析機能を利用できます。作成したプログラムは、「実行可能ファイルの作成」でexeファイルとして作成できます。

また、プロデルデザイナを使わずにプログラムをパース・実行するだけのランタイム環境(Produire.exe,PConsole.exe)もあります。

### ランタイム環境とコンパイル済み環境
プロデルプログラムを実行する方法には、ランタイム環境とコンパイル済み環境との2種類があります。

#### ランタイム環境
ランタイム環境は、パースしたプログラムをそのまま実行する環境です。
.rdrファイルをダブルクリックすれば、すぐにプログラムが実行でき、エラーメッセージが詳細に表示されます。

#### コンパイル済み環境
コンパイル済み環境は、事前にプロデルコンパイラで中間コード(MSIL)に変換したものを実行する方法です。ランタイム環境に比べて動作が速いですがエラーメッセージが分かりづらく、匿名手順など一部の構文が利用できない場合もあります(今後対応予定です)。

コンパイラは、プロデルデザイナに内蔵されているものと、コンソールで実行できるもの(rdrc.exe)があります。
https://produ.irelang.jp/downloads/compiler.html

## 作れるもの
元々Windowsデスクトップアプリを作ることを前提としていたためのウィンドウを使ったアプリを作るためのライブラリを中心に用意しています。
またそれ以外にも、コンソールベース(CUI)のプログラムも作ることも可能です。
monoフレームワークをインストールすれば、Linux系やmacOSのターミナルでも動作します。

さらに、Apacheなどのウェブサーバと連携して、Webアプリを作ることもできます。MySQLやSQLiteなどのデータベースにアクセスするライブラリも用意していますので、ちょっとしてWebアプリを作ることもできます。


### Windowsデスクトップアプリ(Windowsのみ)

プロデルデザイナの「ウィンドウの設計」画面を使えば、ほとんどプログラムを書くこと必要なくウィンドウ画面を作ることができます。

```
メイン画面を表示する
待機する

メイン画面とは
	ウィンドウを継承する
	はじめの手順
		初期化する
	終わり
	初期化する手順
		この内容を「メイン画面」に変える
		初期化開始する
		ボタン1というボタンを作る
			その位置と大きさを｛99,67,75,23｝に変える
			その内容を「ボタン1」に変える
		初期化終了する
		この設計スケール比率を｛144,144｝に変える
	終わり

	ボタン1がクリックされた時の手順
		「こんにちは」を情報アイコンで表示する
	終わり
終わり
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101225/19b0881c-f66e-2e8f-7843-63cab21240ed.png)


### コンソールアプリ(Windows,Linux,macOS)

CUIベースのプログラムを作ることができます。コンソールアプリは、WindowsだけでなくLinux,macOSの環境下でも利用できます。

```
※コンソール
「日付を入力してください(xxxx/xx/xx)」とコンソールへ出力して改行する
コンソールから受け取って結果とする
結果を日時形式化して「ggy年M月d日」に整えたものをコンソールへ出力する
コンソールから受け取る
1で終了する
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101225/e4869325-fc9c-3480-3089-f2beafe47c01.png)


### サーバアプリ(FastCGI)(Windows,Linux,macOS)
サーバで動作するアプリを作ることができます。簡易Webサーバを常駐させる方法やCGIを使った方法があります。
[CGIで動くプロデルWebアプリを公開する](https://produ.irelang.jp/blog/2019/06/1020/)

```
※ウェブアプリ
応答として「<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>こんにちは！</title>
</head>
<body>
こんにちは！
</body>
</html>」を送る
```
なお「※」の行はプロデルデザイナに実行環境を指定するための設定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101225/36fd5776-14d4-76e7-6b6f-e3c60dd5abc2.png)

### そのほか
プロデル言語で書いたプログラムをArduino互換機であるStuduino系向けの.inoファイルとして生成するトランスレータや、FeliCa操作するプラグインなども公開しています。

[プロデルブログ](https://produ.irelang.jp/blog/
)で紹介していますのでよかったらご覧下さい。
構造化・オブジェクト指向・関数型プログラミングの自分なりの整理

#初めに
Clean Architecrureを読んで、いままでふわふわしてた腑に落ちた部分を書いていく。
今までは、
　構造化「あぁif文,for文とかね」
　オブジェクト指向　「えーっと、クラス、継承、多様性とかね」
　関数型「最近よく聞くね。」
くらいにしか頭になかった。
「これらの概念はプログラムに制約を強いている」とあり、認識が変わった部分を整理する。

#まとめ
##構造化プログラミング
直接的参照の制約＝Goto文の禁止と謳ってる。

##オブジェクト指向プログラミング
間接的参照の制約＝Global変数の禁止を謳っている
コードが多くなり複雑になるほど、Global変数は害悪になる。
誰でもどこからでもアクセス・変更可能なGlobal変数をやめ、オブジェクトに閉じてしまうことで、大規模機能を理解しやすくしようというのがオブジェクト指向。クラス、継承、多様性などはそのための手段でしかない。

##関数型プログラミング
代入の禁止＝代入しない…だとっ！ 代入するのが当たり前で"しない"という発想がなかった。
戻り値を代入して、それに対してまた代入して・・・と長い処理を書かないため、1行で何してるかを明確にする必要が出る。
そのため、ラムダ式やクロージャという手段を使うんだなと感じた。

##参考
[Clean Architecture](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656/ref=asc_df_4048930656/?tag=jpgo-22&linkCode=df0&hvadid=295723231663&hvpos=1o1&hvnetw=g&hvrand=3685871696285298759&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009333&hvtargid=pla-525559864965&psc=1&th=1&psc=1)
MongoDB学習日記 - 2019/12/12

#目的
1. MongoDBに接続する
2. CRUD実現

#MongoDBに接続する
１、 GradleでDriverをImportする

```gradle:build.gradle
dependencies {
    // Mongo db
    compile 'org.mongodb:mongo-java-driver:3.12.0'
}
```

２、MongoDBに接続して、データ抽出してみる

```java
        // MongoDBサーバに接続
        MongoClient mongoClient = MongoClients.create("mongodb://<user>:<password>@ds253428.mlab.com:53428/heroku_c3swt6jb");
        MongoDatabase database = mongoClient.getDatabase("heroku_c3swt6jb");
        MongoCollection<Document> collection = database.getCollection("parking_lot");
        Document myDoc = collection.find().first();
        System.out.println(myDoc.toJson());
        System.out.println(myDoc.get("id"));

        // サーバから切断
        mongoClient.close();
```

３、CRUD実現

```java
        // MongoDBサーバに接続
        MongoClient mongoClient = MongoClients.create(
                "mongodb://<user>:<password>@ds253428.mlab.com:53428/heroku_c3swt6jb?retryWrites=false");
        MongoDatabase database = mongoClient.getDatabase("heroku_c3swt6jb");
        MongoCollection<Document> collection = database.getCollection("parking_lot");

        // create
        Document doc = new Document("id", "testid").append("name", "C1-11.haha").append("ParkingEntID","a").append("ParkingLat","b").append("ParkingLon","c");
        collection.insertOne(doc);

        // read
        Document myDoc = collection.find(eq("id","testid")).first();
        System.out.println("this is old one: " + myDoc.toJson());

        // update
        Document docNew = new Document("id", "testid").append("name", "C1-11.haha.New").append("ParkingEntID","a").append("ParkingLat","b").append("ParkingLon","c");;
        collection.updateOne(eq("id","testid"), new Document("$set", docNew));

        // read to check if data updated correctly
        myDoc = collection.find(eq("id","testid")).first();
        System.out.println("this is new one: " + myDoc.toJson());

        // delete
        collection.deleteMany(eq("id","testid"));

        // サーバから切断
        mongoClient.close();
```

#ハマったところ
１、接続時エラー
driver version: 3.12.0
mongoDB version: 3.6.9
mongoDBのバージョンが古くて、retryWritesという新しい機能をサポートしないためです。
対策は、mongoDBのURIに、query parameterのretryWrites=falseを追加。

```java
com.mongodb.MongoClientException: This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string.
```

２、Update時エラー

```java
java.lang.IllegalArgumentException: Invalid BSON field name id
```

原因はこんなCommandだった：

```java
collection.updateOne(eq("id","testid"), docNew);
```

正しいのは

```java
collection.updateOne(eq("id","testid"), new Document("$set", docNew));
```

#References
| Description | URL |
|:-----------------|:------------------|
|HP of MongoDB driver | [URL](http://mongodb.github.io/mongo-java-driver/) |
MySQLの実行結果をCSVで出力する

# 背景・動機

業務でどうしてもSQLでの抽出結果をExcelに持っていく必要があり、CSVファイルで結果を出力できたらと思い調べたら、結構簡単にできたので備忘録をかねて投稿します。

# 概要

- MySQLの実行結果をファイルに保存するには `INTO OUTFILE ~` を使う。
- ファイルの形式をCSVにするには `FIELDS TERMINATED BY ~` を使う。

**例**

```sql
SELECT id, name FROM products INTO OUTFILE '/path/to/file.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
```

# おまけ

- CSVファイルをインポートするには `LOAD DATA INFILE` を使う。
- その場合も同じく `FIELDS TERMINATED BY ~` を使う。

**例**

```sql
LOAD DATA INFILE '/path/to/file.csv' INTO TABLE products
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES; -- ヘッダ行がある場合に指定
```

# 最後に

- Excelや他のツールとデータをやり取りする場合にCSVフォーマットはよく使うと思います。
- コマンドラインで簡単にCSVファイルの入出力ができるので、是非やってみてください。
CSS のカスケードの意味を噛み砕く

[MDNとかをみんなで編集！翻訳！ Advent Calendar 2019](https://adventar.org/calendars/4603)
12/13 分を投下させていただきます。

CSS は **Cascading Style Sheets** の略ということは、みなさんご存知のことと思います。
では最初の単語であるカスケード (cascading) の指すところは、おわかりでしょうか。

私は CSS を書くようになってから、かれこれ 10年 以上経ちますが、正直わかっていなかったです。いや、CSS のそういう振る舞いについては初学者に説明できるくらいにはわかってる（はず）のですけど、論理を立てて説明せよと言われたら難しいなというのが実際のところでした。

というわけで、以下のとおり翻訳やってきました。
超〜〜長くて大変でした。1週間くらいかかりました。

## 原文 (en-US): [Cascade and inheritance](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance)

## 日本語訳 (ja): [カスケードと継承](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance)

* [競合するルール](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#Conflicting_rules)
  * カスケード
  * 詳細度
  * 継承
* [これらの概念がどう連携するか理解する](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#Understanding_how_the_concepts_work_together)
* [継承を理解する](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#Understanding_inheritance)
  * 継承の制御
    * inherit
    * initial
    * unset
* [カスケードを理解する](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#Understanding_the_cascade)
    * ソースオーダー
    * 詳細度
    * !important
* [CSS ロケーションの効果](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#The_effect_of_CSS_location)
* [要約](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#To_summarize)
    * ユーザーエージェントのスタイルシートの宣言。例えば、他のスタイルが設定されていない場合に使用されるブラウザー標準のスタイルなど。
    * ユーザースタイルシートの通常の宣言。ユーザーが設定したカスタムスタイル。
    * 作者のスタイルシートでの通常の宣言。私たちウェブ開発者によって設定されたスタイルのことです。
    * 作者のスタイルシートの重要 (important) な宣言
    * ユーザーのスタイルシートの重要 (important) な宣言
* [学習: カスケードで遊ぶ](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#Active_learning_playing_with_the_cascade)
* [次のステップ](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#Whats_next)
* [このモジュール](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#In_this_module)

まだ少し英語的な文脈なのを、日本語的に直したいなと思いつつも、本日はここまで。
後日もう少し見直しつもりでおりますので、ご指摘ありましたらコメントください。
時々リモートワークで仕事と子育ての両立

# はじめに
からくり Advent Calendar 2019 12日目を担当します。
二児の父親でからくりでは執行役員兼モバイルソリューション事業部部長を務めています。
現在週1~3日程度はリモートワークをしており、その経緯や現在の取り組み方について紹介します。

# 自己紹介
- 31歳猫好き
- 栃木県宇都宮市出身
- iOS/Android/サーバーサイドエンジニア(現在は主にiOS)
- 2013年12月　結婚
- 2014年6月　からくり入社
- 2015年4月　グループリーダー
- 2016年4月　開発部部長
- 2016年6月　猫を銀座の譲渡会で譲り受ける
- 2017年7月　娘誕生
- 2019年1月　リモートワーク開始
- 2019年7月　息子誕生
- 2019年10月 執行役員/事業部部長

## 家族構成
- 妻：小学校の同級生/元看護師/2人目が生まれてから専業主婦
- 娘：2歳/活発/YouTube大好き
- 息子：0歳/甘えん坊/寝返りできるようになった
- 猫：3歳/自由/キジトラ

![猫.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60513/cfa8f433-fae3-543d-f23b-d3f379aeca83.png)


## リモートワークになった経緯
まず、弊社ではリモートワークは基本認められていません。

東京に住んでいる頃は、娘が9ヶ月の頃から保育園に預けて共働きで生活をしていました。
ただ、私が朝から夜遅くまで仕事をしていることが多く、平日は子育てをほとんど妻に任せてしまっている状態でした。
そんな状況が続いたせいで、娘が1歳を過ぎた頃から妻が育児ノイローゼになってしまい、家庭が崩壊しかけました。
妻に育児を任せっきりにしてしまったことを反省し、仕事と家庭のバランスを見直すことでなんとか家庭が元に戻りましたが、2人目を授かったことをきっかけに、もう東京で仕事と子育てを両立するのは難しいと思うようになりました。

そして、弊社代表と何度も話し合いを重ね、私と妻の地元である栃木県に戻りリモートワークをすることを特別に認めていただきました。

# リモートワークを行う上でのマイルール
- 必ず着替える(寝巻きで作業しない)
- 仕事部屋に余計なものは置かない
- 子供達から目を離すとまずい状況以外は仕事部屋で作業する

![仕事場.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60513/1542e270-6417-05ee-2eab-eb30b35841c2.png)

# 最近主に使用しているツール
- [Slack](https://slack.com/)
    - 基本で使用しているコミュニケーションツール
    - メッセージ/通話/ファイル送付
- [Whereby](https://whereby.com/)
    - 無料で使えるWeb会議ツール(元Appear.in)
    - Slackを使っていないクライアントとの打ち合わせやさっと通話したいときに使用
    - 地方に住んでいる方の採用面接にも使用
    - 無料だと4人までしか同時に接続できない
- [GitHub](https://github.com/)
    - ソースコード管理
- [Backlog](https://backlog.com/)
    - タスク管理
- [G Suite](https://gsuite.google.co.jp/intl/ja/features/)
    - メール、カレンダー、スプレッドシート、スライド、ドキュメント
- [Xcode](https://developer.apple.com/jp/xcode/)
    - iOSアプリ実装
    - 今はPMメインだがまだ実装をすることもある
- [SouceTree](https://www.sourcetreeapp.com/)
    - Gitの差分確認
- [iTerm](https://iterm2.com/)
    - ターミナルアプリ
    - Gitはコマンドで操作したい派
    - 複数のプロジェクトを管理しているため画面を縦分割、横分割して利用
- [board](https://the-board.jp/)
    - 売上、見積書、発注書、請求書管理

# メリット
- 周りを気にせず集中して作業ができるので、何かを考えたりコードを書く作業が捗る
- 私の場合かなりの暑がりで特に冬場の暖房が苦手なので、一人で使っている仕事部屋は温度調節がしやすい(とりわけ今の時期でもほぼ暖房をつけることはない)
- 東京に住んでいた頃は平日は家に帰ってきからは疲れて仕事も家事もできないことが多かったが、リモートワークの場合は子供を寝かしつけてから仕事や家事ができるようになった
- 家族との時間が大幅に増えて子供の成長を日々感じることができるようになった
- 私と妻は地元が同じため、両方の両親が近くに住んでおり、私がいない(東京に行く)時にすぐ援助を受けられるようになった
- 田舎なので空気、水、ご飯が美味しい

# デメリット
- オンライン会議の場合、相手の感情や会議の雰囲気を読みづらく、発言に躊躇するときがある
- ネットワークの調子が悪い時に音が途切れたりスクリーンシェアができなかったりする
- 会社のメンバーが私に確認したいことをすぐ確認できないまたは躊躇してしまう場合がある
- 私の住んでいる地域ではバスで電子マネーが使えない
- ご飯が美味しく、車社会で動くことが減ったため体重が増加した

# まとめ
現在は完全リモートワークの会社が増えてきていると思いますし、リモートワークでできるということはとてもありがたいことだと思います。
ただ、弊社の場合は今はみんなで会社を成長させていこう、という時期なので、完全にリモートワークというのは難しいと考えています。
特例でリモートワークを認めていただいている会社にも、私が仕事中子供の面倒を見てくれている妻にも感謝し、これからも時々リモートワークで仕事と子育てを両立していけたらと思います。

![公園.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60513/37364b50-ef01-1ac2-cae0-a9714a00b8ff.png)
Githubって何よ

プログラミングを始めると、Githubってのを良く目にするようになった。
あのネコのキャラクターが書いてあるやつ。

良くgitgub使いましょうとか書いてあるけど、果たしてどうなのだろうか。
必要なものなの！？

###Gitとは
Wikipedia先生によると
>gitは、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。

gitでは、各ユーザのワーキングディレクトリに、全履歴を含んだリポジトリの完全な複製が作られる。したがって、ネットワークにアクセスできないなどの理由で中心リポジトリにアクセスできない環境でも、履歴の調査や変更の記録といったほとんどの作業を行うことができる。これが「分散型」と呼ばれる理由である。 

とされている。

意味わからないんですけど！

簡単にまとめると、

・オフラインでもプログラムの編集などができる
・その変更履歴も管理できる

という事だそうな。

プログラミングでの開発は個人でもできるけど、チームで開発する事のほうが多いので、この機能は便利だ！！

だから必要な訳ね！

###じゃあ、Githubはなんだろう？
hubっていうのは、中心とかそういう意味を表すものだった気がする。

じゃあ、Gitの中心という意味か？

Githubは、Gitの仕組みを利用して、自分の作品のコードやデザインコードを公開できるサービスの事。

代表的なのがGithubなだけで、このようなサービスを展開しているものも勿論ある。

Githubは「大手」というべき感じではないだろうか。

##まとめ
つまり、Githubは、<b>Gitの仕組みを利用して、自分の作品のコードやデザインコードを公開できるサービス</b>の事である！！！

次回は、実際にGitを入れるという作業から公開までおこなったのでそれを書いて行こうと思う！！
使おうぜMobaXterm

この記事は[なんか布教したいエンジニア Advent Calendar 2019 \- Qiita](https://qiita.com/advent-calendar/2019/engineer_tail) 17日目の記事です。
当初はポケモンGOのあれこれを記録するための技術として、[Metabase](https://www.metabase.com/)とLINE BOTの布教記事を書くはずだったのですが、記事を書く直前でMetabaseサーバに使っていたRaspberry Pi 3が天に召されてスクショが取れなくなったため、急遽内容を変更しました。Raspberry Pi 4の1GBモデル早く日本に来て…。


## お前は何を布教したいの？
[MobaXterm](https://mobaxterm.mobatek.net/)というWindows向けのsshクライアントです。

## このタイミングで布教したいと思ったきっかけ

勤務先のサービス開発に使ってるサーバ70台近くが（ちょうどこの記事が公開される日に）全台踏み台マシン経由じゃないとsshできなくなるのですが、MobaXtermだと踏み台を全く意識せずにssh/scpできるよということを伝えたかったからです。
あとそれ以外にもすごい便利だからぜひ使ってほしい。

## MobaXtermってどんなsshクライアント？

私は「scpクライアント付きタブ型sshクライアント」だと思って触っています。

スクリーンショットはこんな感じ。左カラムがscpクライアントになってるのと、タブで別のサーバに切り替え可能です。
![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/610000a9-bc49-9cad-7332-d1ed2d3cd221.png)

なぜこんな曖昧な紹介になっているかというと、実際に触ってみると色々機能がありすぎるため、触る人の目的や指向で感想が異なると思うからです。

どれだけ狂ってるかは[MobaXterm を ssh/mosh/X11 クライアントとして使う（Windows） \- Qiita](https://qiita.com/mkasahara/items/c029154b5436913b20e0)という素晴らしい記事をぜひ御覧ください。

## どのあたりを布教したいか
### ここすきポイント1
MobaXtermは、踏み台が1台だけなら、ポートフォワーディングやSOCKSとか難しいことを一切知らなくても多段scp/sshが可能です。スクリーンショット赤枠部分に踏み台にしたいサーバのホストとポートとユーザさえ設定すれば秒で多段ssh/scpできます。
すごい。やばい。やばくない？
![screen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/59d24551-cc86-4521-1917-a7dd0e340022.png)

MobaXterm、SOCKSもポートフォワーディングも設定するのもめちゃくちゃ簡単なのですが、それよりさらに簡単に多段sshできるのが最高ですね。

### ここすきポイント2

他のLinuxマシンに接続するのと同じノリで、MobaXtermから一切設定することなくWSLが触れます。
PowerShellなりWSLのショートカットなりからわざわざ立ち上げずに済むので、開発サーバで「これおかしいな？」と思った部分を、WSL環境で即検証できるのが楽です。
![screen3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/b3cfa5c1-b6fd-3139-b2fe-23e6dcd1be81.png)

## 弱点

MobaXtermは無料のHome Editionと、$69（2019/12/13現在）のProfessional Editionがあるのですが、Homeのほうには、「保存できる接続先（Session数）の上限が12まで」という成約があります。家で使う分には一切問題ないのですが、勤務先は本番サーバだけで50以上台数があるので全部保存しきれません。

一応、「MobaXtermを複数インスタンス立ち上げ可能にする設定をした上で、それぞれのインスタンスで読み込ませる設定ファイルを変える」という回避策はあるのですが、接続先ごとにMobaXtermのショートカット分けないといけなくて、クソめんどくさくて発狂しそうになるのでProfessionalのライセンス買ってほしいです。根性があればMobaXtermのソースコードから自分でビルドするのですが、家じゃ困ってないからやる気にならない。

## まとめ

自分の好きな機能にフォーカスして記事を書いたのですが[MobaXterm を ssh/mosh/X11 クライアントとして使う（Windows） \- Qiita](https://qiita.com/mkasahara/items/c029154b5436913b20e0) の劣化記事みたいになってしまった…。
設定のわかりやすさと使いやすさでは群を抜いているクライアントだと思います。Tera Termでいいじゃんと思っていた時期が私にもありましたが、もうTera Termには戻れません。

## 追記

ゴネたらProfessional Edition買ってもらえた～～～やった～～～最高～～～～弱点がなくなりました。~~$69で10人まで使用可能なので少人数チームならこれで十分です。~~すいません勘違いでした。
Xcode11のコピペにつまずいた

# はじめに
まずは下記をご覧いただきたい。

![copy](https://user-images.githubusercontent.com/34936885/70726504-89312300-1d41-11ea-80ab-77cc439f490c.gif)

おわかりいただけただろうか？

Storyboard の ViewController を cmd + C, cmd + V でコピペしようとしたところ Xcode がクラッシュしたのである:scream:

# 現象
Xcode11 の Storyboard の ViewController をコピペしようとするとクラッシュする（Xcode11.0 11.2.1 で確認たまに View のコピペでも起きる...）

この現象はいつ起こるのか、なにが原因なのかは不明である。コピペできるときはできるし、できないときは何度やってもできない... 

同一 Storyboard でのコピペ、別の Storyboard へのコピペ、別プロジェクトへのコピペいずれの場合も起こる:persevere:

# 対応
stack overflow に同じ悩みを持つ人がいた:innocent:

* [Xcode 11 crashes when copy/pasting views from different storyboards
](https://stackoverflow.com/questions/58299172/xcode-11-crashes-when-copy-pasting-views-from-different-storyboards)

ここにいくつか対応策が書いてある。場合によってできるようになるみたいです。
## cmd + D でコピペする
cmd + C, cmd + V ではなく cmd + D でコピペする。（はじめて知った...[これ](https://support.apple.com/ja-jp/HT201236#finder)でファイル複製できるらしい:see_no_evil:）
私の場合はこれでできるようになりました。なぜか一度成功すると cmd + C, cmd + V でもコピペできるようになりました。

## シミュレータを停止する
シミュレータを起動している場合シミュレータを停止させます。（これでなおった人もいるみたい）

## DerivedData のファイルを削除する
ライブラリ⁩/Developer⁩/Xcode⁩/DerivedData 内のファイルを削除する。（念の為ゴミ箱からも削除）

## XML として開きコピペする
こちらは別の Storyboard にコピペするときに有効な手段です。

1. コピーしたい ViewController の Storyboard を Open As -> Souce Code で開く。  
<img width="350" alt="open" src="https://user-images.githubusercontent.com/34936885/70726550-99490280-1d41-11ea-8fce-6e5cfca3ca9d.png">
2. 対象の ViewController の `<scene>` から `</scene>` をコピーする。  
<img width="272" alt="scene" src="https://user-images.githubusercontent.com/34936885/70727537-2e98c680-1d43-11ea-9db5-b540e867f344.png">
3. コピー先の Storyboard を Open As -> Souce Code で開く。
4. `<scenes>` タグの中の適切な場所にコピーする。

これで別の Storyboard に ViewController がコピペできます。同一 Storyboard 内の場合は ObjectID が重複してしまうので使えません:crying_cat_face:（下記のようなアラートが出ます）

<img width="400" alt="alert" src="https://user-images.githubusercontent.com/34936885/70726528-93532180-1d41-11ea-97da-2162d13bc9cf.png">

# さいごに
Xcode のバグみたいですが上記のいずれかの方法でコピペできれば幸いです:innocent:
勉強記録　16,17日目 〜異なるコンパイル単位で定義されたローカルでない静的オブジェクトの初期化〜 - Effective C++ 第3版 -

#　はじめに

Effective C++ 第3版の4項23ページから勉強していきます。
今回は、「異なるコンパイル単位で定義されたローカルでない静的オブジェクトの初期化」についです。

# Effective C++ 第3版 - 4項　オブジェクトは、使う前に初期化しよう -

## 異なるコンパイル単位で定義されたローカルでない静的オブジェクトの初期化

### ローカルでない静的オブジェクトとは？

「静的なオブジェクト」とは、生成されてからプログラムが終了するまで存在し続けるオブジェクトのことです。

ここで言う「ローカルでない静的なオブジェクト」とは、グローバルなオブジェクト、名前空間をスコープとするオブジェクト、
クラス内でstatic宣言されたオブジェクト、そしてファイル内でstatic宣言されたオブジェクトのことを指す。

### ローカルでない静的オブジェクトの初期化の順番

ローカルでない静的オブジェクトの初期化の順番は未定義です。
そのため、あるファイルでは、ローカルでない静的なオブジェクトの宣言をし、
その宣言したオブジェクトを別のファイルで使う場合は、注意が必要です。
以下に、externを使った例を示します。

```cpp:4_extern_1.hpp
#ifndef EXTERN_1_H
#define EXTERN_1_H

#include <iostream>

// このファイルは、FileSystemクラスの宣言のみを行う
class FileSystem {
 public:
  FileSystem();
  std::size_t numDisks() const;
};

#endif /* EXTERN_1_H */
```

```cpp:4_extern_1.cpp
#include "4_extern_1.hpp"

// このファイルは、FileSystemの定義のみを行う
FileSystem::FileSystem(){};

std::size_t FileSystem::numDisks() const { return 3; };
```

```cpp:4_extern_3.cpp
#include "4_extern_1.hpp"

// このファイルでは、使用するローカルでないオブジェクトの宣言のみを行う
FileSystem tfs; // コンパイルが通らない
int        a;   // コンパイルが通る
```

```cpp:4_extern_4.hpp
#ifndef EXTERN_4_H
#define EXTERN_4_H

#include <iostream>
#include "4_extern_1.hpp"

// クラスDirectoryの宣言のみ行う
class Directory {
 public:
  Directory();
};

#endif /* EXTERN_4_H */
```

```cpp:4_extern_4.cpp
#include "4_extern_4.hpp"

// クラスDirectory の定義を行う
extern FileSystem tfs;

Directory::Directory() { std::size_t disks = tfs.numDisks(); }
```


```cpp:4_extern_main.cpp
#include "4_extern_1.hpp"
#include "4_extern_4.hpp"

Directory directory_g1();

extern FileSystem tfs;
extern int        a;

Directory directory_g2();

int main(int argc, char* []) {
  std::cout << "4_extern" << std::endl;
  Directory directory();
  std::cout << tfs.numDisks() << std::endl;
}
```

本では、

>「ローカルでない静的なオブジェクト」のうち1つが、別のコンパイル単位の「ローカルでない静的オブジェクト」を初期化するために
使われていた場合、初期化は行わないかもしれないのです。
と言うのは、「異なる翻訳単位にあるローカルでない静的なオブジェクト」の初期化の順番は決められていないからです。

と書いてありました。

そのため、
ローカルでない静的なオブジェクトである directory_g1 と directory_g2は、コンストラクタ内で、ローカルな静的オブジェクト tfs を使用しているので、初期化する前にアクセスされる可能性がある。
そのため、バグがでると思ったんですが特にありませんでした。

この部分は、とても理解に苦しみました。
本当にあってるか分かりません。ごめんなさい。

以下に、勉強で使用したコードを示します。

### サンプルコード

上のコードと同じ

### 実行結果

コンパイルできなかった。

## 参考文献

・https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0