OmniAICreator/Qiita-1.07M huggingface dataset:
pyenv Ubuntu16.04 ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?




雑なメモです
環境: Ubuntu16.04
pyenvは公式の説明どおりインストール済み
`pyenv install`中に以下のようなエラーが出ました。

```
 % pyenv install 3.5.2              
Downloading Python-3.5.2.tar.xz...
-> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz
Installing Python-3.5.2...
patching file Lib/venv/scripts/posix/activate.fish
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (Ubuntu 16.04 using python-build 1.2.9-2-g6309aaf)

Inspect or clean up the working tree at /tmp/python-build.20190116213835.24555
Results logged to /tmp/python-build.20190116213835.24555.log

Last 10 log lines:
(cd /home/pollenjp/.pyenv/versions/3.5.2/share/man/man1; ln -s python3.5.1 python3.1)
if test "xupgrade" != "xno"  ; then \
	case upgrade in \
		upgrade) ensurepip="--upgrade" ;; \
		install|*) ensurepip="" ;; \
	esac; \
	 ./python -E -m ensurepip \
		$ensurepip --root=/ ; \
fi
Ignoring ensurepip failure: pip 8.1.1 requires SSL/TLS
```

## 解決法
なんてことはない。。。ちゃんとPrerequisitesを入れていないだけだった。。。
https://github.com/pyenv/pyenv/wiki/common-build-problems#prerequisites

```
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
    libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
    xz-utils tk-dev libffi-dev liblzma-dev python-openssl
```
ARKitのARSCNViewDelegateのイベント実行順番

# はじめに
ARKitを使用して開発をする上で、[ARSCNViewDelegate](https://developer.apple.com/documentation/arkit/arscnviewdelegate)のイベントハンドリングでARAnchorを取得して
なにかしら処理をすることはあると思うが、いくつかあるイベントの実行順番が分からなかったので調べてみました。

# 結論としては
renderer(_:nodeFor:)
↓
renderer(_:didAdd:for:)
↓
renderer(_:willUpdate:for:)
↓
renderer(_:didUpdate:for:)
↓
renderer(_:willUpdate:for:)
↓
renderer(_:didUpdate:for:)
↓
renderer(_:willUpdate:for:)
↓
renderer(_:didUpdate:for:)
↓
以下繰り返し

# ちょっとおもしろかった発見
カメラで撮った写真、またはライブラリから選択した写真をPlaneに貼り付ける処理をrenderer(_:nodeFor:)に実装していたが、
カメラで写真を撮った場合は、その都度renderer(_:nodeFor:)から順番に実行されるが、ライブラリから写真を選択した場合は、
renderer(_:willUpdate:for:)からしか呼ばれないため画像が更新されなかった。
恐らくカメラを起動した場合、シーンが初期化されるのが原因だと思われる。

# まとめ
どのイベントに実装すべきか、シーンの状態にも影響されそうなので、
組み合わせて実装する機能の特性も知っておく必要がありそう。
【JSTとCSTとUTC】

#【JSTとCSTとUTC】
　
###JST：日本標準時間
###CST：米国中部標準時間
###UTC：世界で標準時として使っている時間


#【アプリ内の時間】

ある地域で共通している時刻系をその国の標準時と呼びます。
地理的にある程度近い地域では共通の時刻を使いましょうということになってます。

標準時やタイムゾーンはUTCを基準に何時間進んでいるか or 遅れているかで表現されます。
***日本標準時(JST)はUTCより9時間進んでいるので +09:00 というような表記になります。***

>2.4.2 :003 > Time.zone_default
 => #ActiveSupport::TimeZone:0x00007f9c009e5450 @name="Asia/Tokyo", @utc_offset=nil, @tzinfo=#<TZInfo::DataTimezone: Asia/Tokyo>>
2.4.2 :004 > Time.zone.now
 => Sat, 13 Oct 2018 09:56:54 JST +09:00


##設定場所
config/applicarion.rb設定ファイルの config.time_zone
ActiveSupport::TimeWithZoneがこの設定値を参照する
規定値：UTC

https://linuxserver.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/ruby/on-rails/timezone/
【一年生の頃の私へつづる言葉①】プログラミング環境構築は怖くない。

・ふと思い出したエンジニア入学者の頃。
・環境構築や学習方法、使用ツール等、様々な困難にくじけながらも、このオープン社会時代において数多くのネット記事やコミュニティに助けられた。
・現状の私はまだ青二才技術者。ただあのころよりは、微かだが成長した。
・よし。あの頃の自分へ向けて当時悩んだことの解決策を書いていこう。
・実際、映画「Orange」を見て、感化されたという、単純極まりないことは置いておこう。
## Java 環境構築
### ＜当時＞
- 「JDKのインストール」・・・[公式サイト](https://www.oracle.com/technetwork/jp/java/javase/overview/index.html)に行って、どれをインストールすればいいのかに時間をとられる。
- 「環境変数の追加」・・・長時間耐え抜き、ようやく学習にとりかかれると思いきや、環境変数とやらを追加しないと動かないという。何が何だかさっぱりわからず、途方にくれ、翌日の解決まで、時間をくってしまう。
- 「Eclipseのインストールと設定」・・・環境変数完了したし、あとはEclipseだけだなと思ったのが、運の尽き。長い・細かな設定・重い等の理由で、学習があんまりはかどらない。  


→これらの理由で、やる気低下になることもしばしば。　　
### ＜現在＞
①「***JDKのインストール***」「***環境変数の追加***」に関しては・・・・・・・・・
#### [Chocolatey](https://chocolatey.org)というツールで、コマンド一発でインストールと環境変数追加を同時にしよう。  
※Chocolateyとは、Windowsで使用できるコマンドラインパッケージ管理システムのこと。  
→これさえあれば、コマンドプロンプト等に`choco install jdk9 -y`と入力するだけで、自動的にインストールと環境変数追加も行ってくれる。  
 →Java以外にも、`choco install python`や`choco install GoogleChrome -y`等の言語やツールのインストールも可能。  
→詳しい使い方は、[ここ](https://qiita.com/rkunihiro/items/4eab4d3e90697f064809)を参照にしよう。



②「***Eclipseのインストールと設定***」に関しては・・・・・・・・・  
#### 学習という観点において、EClipse等の統合開発環境は必須ではない。  
→学習のみならば、テキストエディタのVisual Studio Code等でも拡張するだけで可能。（詳しい手順は[ここ](https://ictdiary.hatenadiary.jp/entry/2018/08/10/043301)） 
→また、[paiza.io](https://paiza.io/ja)等のブラウザ実行環境で、Java追加なしでも学習可能。  
→Eclipseが必要になるときに、調べたり聞いたりする方向でよい。
→ちなみにEclipseも上記のChocolateyでインストール可能。

### ＜過去の私へ送る言葉＞
- <font color = "tomato">最初の段階でつまずいて、学習気力がなくなるのは悲しい。</font>
- <font color = "tomato">最新ツールや便利ツールを使うのは、恥ずかしいことでは決してない。</font>
- <font color = "tomato">今つまずいていたとしても、未来は明るいから安心してね。</font>

## まとめ
- 今回は、プログラミングデビュー期ののJava構築ということで、感慨深さを全身に感じながら、記事を書く。
- 現在Chocolatey愛好家として、インストールの追加・削除を繰り返して、そのコマンドの流れをニヤリと楽しんでる趣味を、過去の自分は想像できているだろうか。
- 過去への手紙という「Orangeごっこ」は楽しいので、今後もどんどん続けていこう。
[WordPress] 公開日時と更新日時を表示しつつ予約投稿で公開日よりも更新日時が過去になるのを避ける


答えは [_s](http://underscores.me/) のソースコードにあるので、おおよそ公式ディレクトリ掲載のテーマは対応してますが、ポイントは以下。

* 公開日時は `get_the_date()` https://developer.wordpress.org/reference/functions/get_the_date/
* 更新日時は `get_the_modified_date()` https://developer.wordpress.org/reference/functions/get_the_modified_date/
* 予約投稿をした場合、公開日時よりも更新日時が **過去** になる
* 日時の比較をするときはUNIXタイムで。

答えは以下。
https://github.com/Automattic/_s/blob/master/inc/template-tags.php#L10-L36

_s では 公開日時と更新日時が **一致しない** 場合に両方表示するようにしていますが、予約投稿で公開日時よりも更新日時が過去になるのが気になる場合は if の所を変えればOK。

```php
if ( get_the_time( 'U' ) < get_the_modified_time( 'U' ) ) {
```

余談
`DATE_W3C` という定数とはなんぞやと思った人は以下
http://php.net/manual/ja/class.datetime.php

PHP 5.2.0 とPHP7で使えるDateTime クラスの定数
【PHP】時間を比較する際は気を付けましょうという話


コメント欄も見て

# 日付を比較する

単純にどちらかの日付が大きいかを比較する
比較する日付の例として**2019年7月27日**と**2019年12月27日**を比較してみます

# 間違った日付比較

```php
$firstDay  = (new DateTime())->format('Y-' . 7 . '-' . 27);
$secondDay = (new DateTime())->format('Y-' . 12 . '-' . 27);

var_dump($firstDay);
var_dump($secondDay);
var_dump($firstDay > $secondDay);
```
↓

```
[Output for 7.2.13 | took 54 ms, 14.88 MiB]
string(9) "2019-7-27"
string(10) "2019-12-27"
bool(true)
```
なぜか`$firstDay`の`2019-7-27`の方が**大きい**という判定がでる


# 正しく比較するには

**一桁の数字には0埋めするようにしましょう。**

```php
$firstDay  = (new DateTime())->format('Y-' . str_pad(7, 2, 0, STR_PAD_LEFT) . '-' . 27);
$secondDay = (new DateTime())->format('Y-' . 12 . '-' . 27);

var_dump($firstDay);
var_dump($secondDay);
var_dump($firstDay > $secondDay);
```

↓結果

```
[Output for 7.2.13 | took 50 ms, 15.21 MiB]
string(10) "2019-07-27"
string(10) "2019-12-27"
bool(false)
```

必ず`YYYY-mm-dd`の形にしてから比較しましょうというお話でした。

# おわり

- 2時間くらいじかんかえして


# 参考リンク
- https://3v4l.org/RcnjJ
【laravel】macのxampp導入が初心者キラーだったのでメモする

びっくりした……

こちらの青い本でLaravelのお勉強してたんだけど……

［PHPフレームワーク Laravel入門］
https://www.amazon.co.jp/dp/4798052582/ref=cm_sw_r_tw_dp_U_x_MSXpCb572MY8


**xamppの導入が3ページくらいで終わってる。**
が、おかしい。何かが明らかにおかしい。

しばらく混乱してたけど、何が起こったか分かったのでメモ。

【対象読者】
・青い本読みながらlaravel勉強してたけど、xamppの導入でつまづいた人

以上。
ニッチですね……
# 結論
xamppの仕様が変わったっぽいです。
しかもチョウザメからサメになるくらいの変わり方してます。

だいたいこちらの記事に書かれている通りです。

[XAMPP for OS Xからかなり変わったXAMPP-VM for OS X のメモ]
https://uzulla.hateblo.jp/entry/2017/10/26/001132

この記事読んで「あー、ローカルからVMに変わったのね！じゃあhtdocsはssh接続してvimでいじるのね！」とか分かる人ならいいんですが、「めんどくさいわ！」って人もいると思うので雑な解決法を。

**①XAMPPのダウンロードページにアクセス**
https://www.apachefriends.org/download.html
**②-VMって付いてない方をダウンロード**
![スクリーンショット 2019-01-16 20.25.33.png](https://qiita-image-store.s3.amazonaws.com/0/247157/2e8b2c9b-d7c7-75d2-b6d0-345009f40ebb.png)
で、オッケーです。

**注意点**
青い本、基本的に丁寧ですがXAMPP関連のところは結構端折ってます。
念の為macでの使い方をメモしておきます。

インストール後、アプリケーションを立ち上げるとこんな感じのGUIでサーバーを立ち上げたり引っ込めたりできます。
![スクリーンショット 2019-01-16 20.42.37.png](https://qiita-image-store.s3.amazonaws.com/0/247157/ca5efb79-dc22-b0c2-cc74-0186d64d69ff.png)
この画面でApache Web Serverが立ち上がっている場合、localhostにアクセスすればxamppのダッシュボード画面を開くことができます。

で、XAMPPをインストールする際、Applicationフォルダ直下に"XAMPP"ディレクトリができますので、その下に青本でも触れられているhtdocsとかその類のフォルダが置かれます。

また、本の通りにhtdocsフォルダ内に直接laravelでnewしたプロジェクトを置くと、localhostにアクセスした際に権限でエラーになる可能性があります。

多少雑な対応ではありますが、storageフォルダ全体に権限を与えてあげることで解決できます。

```
sudo chmod -R 777 /Applications/XAMPP/xamppfiles/htdocs/laravelapp/storage/
```

~~おそらくapacheが上記ディレクトリにアクセスしようとして権限で弾かれているようですが、必要な権限は読み取りと実行のようです。そのため775を暫定的に指定しています。~~
777じゃないと駄目っぽいです。良い運用ではないですが……

……まあローカルで試す範囲であれば、深いことは考えなくても大丈夫でしょう。

今回はこんなところで。
GrovePi+のinstall.shでCommand not foundが出たときの対処法

GrovePi+を使用するためにinstall.shを実行していたら，コマンドfeedbackに対して，Command not foundが出たのでその対処法に関する備忘録．

## 環境
- Raspberry Pi3 Model B
    - Raspberry Pi3 コンプリートスターターキット (Standard 16G)を使用．
    - OSはmicroSDにプリインストールされたRaspian Streach with Desktopを使用．
- Raspberry Pi センサーキット GrovePi+


## 手順
https://liginc.co.jp/309311 を参考に設定．

### 必要なファイルのダウンロード
Githubからファイルをダウンロード．

```terminal
$  git clone https://github.com/DexterInd/GrovePi
```

### 実行ファイルのインストール
以下のコマンドを実行．

``` terminal:
$ cd GrovePi/Script/
$ chmod +x install.sh
$ sudo ./install.sh
```

あとは「y」をひたすら押すと，インストールが完了するらしいが，筆者の環境では以下のエラーが出た．

```terminal
./install.sh: 行 11: /home/pi/Dexter/lib/Dexter/script_tools/functions_library.sh: そのようなファイルやディレクトリはありません
Special thanks to Joe Sanford at Tufts University. This script was derived from his work. Thank you Joe!
./install.sh: 行 38: feedback: コマンドが見つかりません
```
なお，このエラーを無視しても，Raspberry PiはGrovePiを検出できるようで，

```terminal
$  i2cdetect -y 1
```
を実行しても正しく検出される．
ところが予め用意されているサンプルプログラムのうち，LED1個をチカチカさせるプログラムしか実行できない．
そこで，実行ファイルのインストールをやり直す．


## インストールの再実行
https://github.com/initialstate/grovepi/wiki/Part-2.-GrovePi-Setup の通り実行する．

```terminal
$  sudo curl -kL dexterindustries.com/update_grovepi | bash
$  sudo pip install grovepi
$  sudo reboot
```

この手順を実行すると，インストールが成功し，すべてのサンプルプログラムが実行できた．
参考サイトによると，
> The step, `$  sudo pip install grovepi` , allows us to import the grovepi Python library from any directory on our Pi. If you skip this step, you will have to create all of your GrovePi projects within the /home/pi/Desktop/GrovePi/Software/Python directory (which is icky).

とある．どうやら，`$  sudo pip install grovepi`を実行しないと，任意のディレクトリからの，GrovePiの利用ができないらしい．
Vue.jsでテトリスを作成してみた

## はじめに

npmやVueは導入済みの前提で進めていきます。
あまりVueを使ったテトリスの記事がなかったので今回書いてみました。

## 環境

下記の環境で実施しております。
> OS: macOS High Sierra 10.13.6
> Vue: 2.9.6
> node: v10.7.0
> npm: 6.2.0

## 内容

[Github](https://github.com/masanori0209/ochimono)に公開しております。
簡単にロジック周りを下記で記載しておりますが、
上記のリポジトリをみていただければ把握できるかと思います。

あまり時間を割いて作成しておりませんので、不備等ございましたら、
ご連絡いただければ、と思います。

## ロジック/UI周り


**1. 見た目**

CSSが苦手なので、[Buefy](https://buefy.github.io/#/)を使用して、ある程度見た目を整えております。
例：スタート時のモーダル画面
”b-”で始まるコンポーネントが[buefy](https://buefy.github.io/#/)で使われるコンポーネントとなります。
また、CSSフレームワークである[bulma](https://bulma.io/)の派生のため、
button や is-infoなどをクラスで定義可能です。

```html:Main.vue
<b-modal :active.sync="startFlg"
         :canCancel="false">
  <button class="button is-info is-large"
          @click="startFlg=false; start()">Game Start</button>
</b-modal>
```


**2. 描画**

SetIntervalを使って描画をしていきます。
draw関数で実際に描画処理を行なっております。

```javascript:Main.vue
draw () {
  this.init()
  for (var b in this.block) {
    console.log('draw b: ' + this.block[b].x + ', ' + this.block[b].y + ', ' + this.gameTable[this.block[b].y][this.block[b].x])
    if (this.gameTable[this.block[b].y][this.block[b].x] === 0) {
      console.log('draw: ' + this.block[b].x + ', ' + this.block[b].y)
      this.gameTable[this.block[b].y].splice(this.block[b].x, 1, 1)
    }
  }
}
```

**3.ブロックの移動**

move関数を作り、x座標、y座標を引数に移動を行なっていきます。
また、移動中のブロックを”１”で定義しております。

```javascript:Main.vue
move (x, y) {
  this.init()
  for (var b in this.block) {
    this.block.splice(b, 1, {x: this.block[b].x + x, y: this.block[b].y + y})
  }
}
```


**4.ブロックの設置**

spliceを使って、”２”をセットし、ブロックが設置されたことを明示します。

```javascript:Main.vue
setBlock () {
  this.init()
  for (var b in this.block) {
    console.log('setBlock: ' + this.block[b].x + ', ' + this.block[b].y)
    this.gameTable[this.block[b].y].splice(this.block[b].x, 1, 2)
  } 
}
```


**5. ブロックを消す**

”２”となっているものが、設置されているブロックを意味していて、
それが一列に並んだ時に消す処理を行います。
unshiftを使って削除処理をおこないます。

```javascript:Main.vue
clearLine () {
  var line = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
  var clearLine = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  for (var y = 0; y < this.gameTable.length; y++) {
    if (this.arrayCheck(this.gameTable[y], line)) {
      this.gameTable.splice(y, 1)
      this.gameTable.unshift(clearLine)
      this.score += 100
      this.level -= 5
    }
  }
}
```


## 実行結果

消した後の描画や、操作周りがまだまだバギーではありますが、下記のような形となりました。
時間がありましたらFixしていきたいと思います。

![t.gif](https://qiita-image-store.s3.amazonaws.com/0/258186/012f9bee-9918-da5f-04d0-79686e68d408.gif)
Ruby で Cargo を拡張する

この記事は，分かっている人にとってはタイトルを見ただけで「ああ，あの話だろうな，アホくさ」ってなるし，そうでない方は「えっ？」って思うかもしれないけど，記事を読み終わったら「アホくさ」ってなります。

さてさて，今をときめくシステムプログラミング言語にして，WebAssembly 記述言語たる Rust ですが，cargo コマンドが便利ですよね。
こいつはサブコマンドをあとから増やすことができます。自分でサブコマンドを作ることも容易にできます。そういうことを「Cargo を拡張する」と表現するようです。

# Ruby で Cargo のサブコマンド

Rubyist なら，Rust のプログラミングでだって，ソースコードをなんかテキスト処理したり，プロジェクトディレクトリーでなんか処理を行うプログラムを Ruby で書きたいよね？

できます。

どこでもいいので，とにかくパスが通った場所にこんなファイルを置きます。ファイル名に注目。

```rb:cargo-hello
#!/usr/bin/env ruby

puts "Hello, Rust. I am Ruby."
```

でもって，実行パーミッションを付与しておきます。
要するに `cargo-hello` ってコマンドを作るわけ。

あ，ごめん，Windows じゃこういうことできませんよね。
Windows の場合，パスが通った場所に `cargo-hello.bat` ってバッチファイルを置いて，その中で

```bat:cargo-hello.bat
ruby cargo-hello.rb
```

みたいにして Ruby スクリプトを呼び出せばいいはず。

# 実行

すると，ですよ。
好きな場所で

```rb
cargo hello
```

って打ったら

```
Hello, Rust. I am Ruby.
```

って表示されます。

え？　それがどうした，だって？　だから最初に「アホくさってなる」って言ったでしょ。

# つまりどういう

『The Rust Programming Language』の
「[独自のコマンドでCargoで拡張する - The Rust Programming Language](https://doc.rust-jp.rs/book/second-edition/ch14-05-extending-cargo.html)」
にも書いてあるとおり，`cargo-hogehoge` ってコマンドが存在したら，Cargo の `hogehoge` っていうサブコマンドとして実行してくれる，という単純なルールにしたがっているわけですね。
pgAdmin4のv4.1

昨日午前に[pgAdmin4 v3.3＋PostGISがすごい！](https://qiita.com/U_ikki/items/f64815da23dc3771ba18)を読んで、[windows用のpgAdmin4のダウンロードページ](https://www.pgadmin.org/download/pgadmin-4-windows/)をチェックしたところ、バージョンv4.0になっているのに気づきました。
早速ダウンロードして見ると、UIが少々変わっていました

　TreeNodeの形状が変わっていたり、QueryToolを起動するボタンがついていたり、Analyze系のボタンがQuery実行と切り離されたりとありました。

　帰ってからまとめで書こうかと思って、上のサイトを見たら昨日付でv4.1が出ていました。
FeatureなしでBugfixのみのリリースとなっています。
React.StrictModeがあぶり出す意外な問題点

React 16.3で`<React.StrictMode>`というコンポーネントが登場しました。大半のチェック点はうなずけるものだったのですが、1つ気になることがありました。

## `<React.StrictMode>`とは

JavaScriptをやっている方なら`"use strict";`によるJavaScript自体のStrictモードはご存知かと思いますが、`<React.StrictMode>`もそれと同様、今までの書き方で問題が出る部分をあぶり出すためのモードです。なお、React本体の`production`ビルドではチェックが無効となりますので、`development`ビルドを使う必要があります。

### 背景

React 17からレンダリングを非同期化するという話が進んでいて、それで問題になるコードをチェックするために`<React.StrictMode>`が導入された、ということのようです。

### deprecatedな機能のチェック

旧式になった機能を使っていると、その旨がコンソールに出力されます。

* 古い\ライフサイクル（`componentWillMount`、`componentWillUpdate`、`componentWillReceiveProps`）
* 文字列による`ref`指定
* 旧形式のコンテキスト
* `findDOMNode`

とはいえ、このあたりはすでにdeprecatedの宣言もあり移行手順も公開されているので、（依存しているコンポーネントが変更できないなどの状況なら別として）そう大問題にはならないかと思います。

## 非同期レンダリングのフェーズ

では、ここからが本題です。以前に[別な記事](https://qiita.com/jkr_2255/items/6ab44e4fa3c863da5a66#2%E3%81%A4%E3%81%AE%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA)で書きましたが、Reactの非同期レンダリングにおいては、状態が「Render Phase」と「Commit Phase」の2つに大きく分けられます。

そして、`getSnapshotBeforeUpdate`、`componentDidMount`、`componentDidUpdate`、`componentWillUnmount`はCommit Phaseのコールバックですが、それ以外の`render`、コンストラクタ、`setState`のupdater、`getDerivedStateFromProps`、`shouldComponentUpdate`などはRender Phaseのコールバックです。

そして、非同期レンダリングを行う上では、Commit Phaseのコールバックは実行されるべき1回のレンダリングに対応して確実に1回実行されますが、Render Phaseのコールバックは**複数回実行されうる**ものとなります。そこで、`<React.StrictMode>`ではそういった問題点の洗い出しのため、`render`、コンストラクタ、`setState`のupdater、`getDerivedStateFromProps`を1回の`render`に対して2回実行するようになります。

## 複数回のコンストラクタ…？

通常、updaterや`render`で副作用のあることを行おうという人はいないかと思いますが[^1]、コンストラクタは他にも影響することを行うので、気になる例もあるかと思います。

実際に[CodePenで動かして](https://codepen.io/jkr2255/pen/pqYGow?editors=1111)調べてみると、以下のような感じでした。

* 確かにコンストラクタは2回実行される
* もう1個生成されたはずのインスタンスは、`componentWillUnmount`も何も起こさず消滅する（あとから`setState`しようとするとエラーに）

ということで、コンストラクタでやることは「インスタンス変数の設定」、そして「外部に対しては冪等になる仕事」ということになります。

* 外部に対して破壊的に働くコードについては、`componentDidMount`に移動させるのが適当でしょう。
* CodePenでやったような、「あとから値を`setState`する」ような処理も、`componentDidMount`から動かす（そして、`componentWillUnmount`した際には正しく中断できるようにする）ことが必要と考えます。


[^1]: もっとも、自分は過去に[`render()`内で`setState()`しようとした](https://qiita.com/jkr_2255/items/6ab44e4fa3c863da5a66#%E7%B4%A0%E7%9B%B4%E3%81%AB%E6%9B%B8%E3%81%8F%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB)ことがあります。
テストでダミーのユーザ名に迷ったときは「alice」や「bob」を使うといいよ

テストコードなどにダミーのユーザ名を書くことがある。ダミーの単語としては`foo`や`bar`、日本語圏だと`hoge`や`fuga`が業界的に有名だが、人物名にも業界的によく使われるものがある。アリスとボブだ。

アリスとボブは、暗号通信などの説明に登場人物名としてよく使われる。一般的に、アリスが送信者でボブが受信者、そしてキャロルがそれを傍受するといったシナリオが扱われる。

_アリスとボブが暗号通信の説明で使われる例: [楽しく学ぼう公開鍵暗号方式](https://www.slideshare.net/oroponya/ss-43791354)_

<img width="681" alt="楽しく学ぼう公開鍵暗号方式.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/c30f4bd5-33d5-752e-fbf0-dcf42cd687d6.png">

暗号通信とは関係なくても、単体テストのテストケースでユーザ名に`alice`や`bob`を使うと、`foo`や`hoge`よりもテストコードより現実っぽく表現できるし、イニシャルがABCで覚えやすいし、業界でよく使われる架空の人物名なので、僕は好んで使っている。たとえば、PHPUnitでテストを書くときはこんな感じにする:

```php
final class EmailBuilderTest extends TestCase
{
    public function test_build_email(): void
    {
        $email = (new EmailBuilder())
            ->setFrom('alice@example.com')
            ->setTo('bob@example.com')
            ->setCc('carol@example.com')
            ->setSubject('Hi')
            ->setBody('Hi there')
            ->build();

        self::assertSame('alice@example.com', $email->getFrom());
        self::assertSame(['bob@example.com'], $email->getTo());
        self::assertSame(['carol@example.com'], $email->getCc());
        self::assertSame('Hi', $email->getSubject());
        self::assertSame('Hi there', $email->getBody());
    }
}
```

イニシャルがD以降の架空の人物名を含めると、僕は次をユーザ名に使うことが多い。

* alice
* bob
* carol
* dave
* eve
* frank

## 参考

* [アリスとボブ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AA%E3%82%B9%E3%81%A8%E3%83%9C%E3%83%96)
シンプルに次の元号を予想する

# 俺の予想

Unicodeでは以下の形となっている。

|Unicode||
|---|---|
|337B|㍻|
|337C|㍼|
|337D|㍽|
|337E|㍾|

つまり順番で行けば、次は337Aの「㍺」。これに漢字を当てはめて「愛有」とかになる。

# あっ…

The Unicode Blog: New Japanese Era
http://blog.unicode.org/2018/09/new-japanese-era.html
springBoot's aproperties

server.port=8080
server.servlet.context-path=/springTest

# thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html

# 开发阶段务必关闭缓存 (=false)
spring.thymeleaf.cache=false

# db
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=6225

# mybatis
mybatis.mapper-locations=classpath:mapper/*.xml

# pagehelper properties
pagehelper.offsetAsPageNum=true
pagehelper.rowBoundsWithCount=true
pagehelper.pageSizeZero=true
pagehelper.reasonable=false
pagehelper.params=pageNum=pageHelperStart;pageSize=pageHelperRows;
pagehelper.supportMethodsArguments=false
perl

- remove below section

```
00:00:01    kbhugfree kbhugused  %hugused
00:01:01            0         0      0.00
00:02:01            0         0      0.00
00:03:01            0         0      0.00
00:04:01            0         0      0.00
00:05:01            0         0      0.00
```

```
perl -0pi -e 's;\S+\s+kbhugfree.*(\d\d:\d\d:\d\d\s+\d\s+\d\s+\d\.00)+;;s' filename.txt
```
私的　gitでよく使うコマンド


個人的によく使うgitコマンドをメモとして記載しておきます。
この記事は随時追加していくつもりです。

他にオススメがあればコメント頂けると幸いです。

#コミットの取り消し
###直前のコミットのみ取り消し

```
git reset --soft HEAD^
```
###直前のコミットのワークディレクトリごと取り消し

```
git reset --hard HEAD^
```

#ファイルの更新状況を確認する

```
git status
```
結果の内容一覧
modified：変更
add：追加
deleted：削除

###-sオプションで簡易フォーマットで出力
M：変更
A：追加
D：削除
R：ファイル名の変更

#git addのオプション

追加・削除・変更したファイルの全て追加

```
git add .
```

変更したファイルだけ追加

```
git add -u
```

#git commitのオプション

コミットメッセージを指定してコミット

```
git commit -m
```

直前のコミットメッセージを変更

```
git commit --amend
```

#ブランチの切り替え、表示

ブランチ一覧を表示

```
git branch -a
```

リモートブランチの確認

```
git branch -r
```

ブランチの切り替え

```
git checkout ブランチ名
```

ブランチを新規作成し切り替え

```
git checkout -b ブランチ名
```
初学者が独習C#をざっくり読んでみる 第0回

この記事は物理シミュレーションを"win環境"でやる案件を投げられた筆者がUnityを初めて使うことを決心し, C#の速習を始めた一連の備忘録

## はじめに
筆者です. Unityを始めました. けれどもC#, ダックタイピングの世界で羽を伸ばしてた筆者には厳しいものが. ざっくりC#本を速習することを決意.

使う本はこちら. [独習C#](https://www.amazon.co.jp/dp/4798153826/ref=cm_sw_r_tw_dp_U_x_k5VpCbTGDVRXF) 

![csharp.PNG](https://qiita-image-store.s3.amazonaws.com/0/69524/9077d21b-0986-fc98-c04e-1764a1a2cca8.png)

画像はamazonから拝借. 定番本と聞いた(amazon reviewで).

ざっくり雰囲気をつかんでいきたい.
一章/記事でまとめる予定.

## §1イントロダクション
今回, "言語仕様"を知りたい僕にとっては流し読みする部分が多かったので, かなりまとめが適当.
次回以降が本番になりそう. VSの見方, 使い方とかは他サイト参照を推奨

### 1.1 C#の特徴
正直ここら辺はあまり言語仕様を勉強する上では必要ないのでざっくりまとめると

- OOPをベースとしたマルチパラダイム言語だよ
- .NET環境の上で動くよ, これは各OSそれぞれに対応しているよ
- これはコンパイルが各OSのネイティブコードではなくてCILっていう.NETを動かすための共通中間言語で吐かれるよ
- .NETでは共通言語ランタイムが採用されているからC#, VisualBasic, C++, F#どれ使ってもパフォーマンスが同じとか, .NET Framework クラスライブラリとかいろいろなリソースがあったりとかすごいんだよ

CILが存在するからクロスプラットフォーム開発とかよく聞くのかな? と思った. 詳しくはまた今度しらべよう

### 1.2 環境構築
割愛. 要約すると

- Visual Studioの導入 (VisualStudioCommunity 2017 => C# ver 7, 7.1)
- インスト前, ワークロードで.NETデスクトップ開発と, "概要"にある.NET Framework 4.7開発ツールを選択してインストール

### 1.3 C#プログラミングの基本
.NET Framework 4.7 / コンソールアプリで作った新規プロジェクトに簡単なコードを書いて補完機能(VS上ではインテリセンスというらしい)とブレークポイント式デバッグ方法, ビルド方法を説明していた.

以下簡単なコードと, 個人的に気になったポイントをメモとして残しておく

```C#:Program.cs

///<summary>
///Project SelfCSharpのテストコード
///</summary>

using System;

namespace SelfCSharp {
  class Program {
    static void Main(string[] args) {
        Console.WriteLine("What's your name?");
        string name = Console.ReadLine();
        Console.WriteLine("hello, {0}!", name);
    }
  }
}
```

- "namespace"は名前空間の宣言. 他の名前空間のクラスを呼び出したいなら, 名前空間がHonya, クラスがMorakeだった時, Honya.Morakeと書くことになる(完全修飾名/FQCN:Full Qualified ClassName
- usingを使用することで名前空間を読み込むことができる. 例えばusing Honyaを使うとそのファイルではMorakeだけでクラスを呼び出せる.
- c.f. 右クリック→usingの消去と並べ替え
- ドキュメンテーションコメント(///)で<summary>を使うとvsの補完の説明として文面がでてくるよ


-----

### 一章の総括
言語の概要/導入/IDEの説明がほとんどなのでぶっ飛ばして読んでしまった. 二章から型の話に入るみたいなのでそこからしっかりとされどざっくりと読んでいきたい
【#PowerApps】 ギャラリー内の全ての切り替えがOn(true)の時だけボタンを有効（EditMode）に変更する方法

# 概要
PowerAppsを利用して、ギャラリーのすべての切り替えがOn(true)の時だけボタンを有効化（EditMode）に変更する方法です。

# 前提条件
ギャラリー内のすべてに「切り替えコントロール」またはそれと同等の機能を持つフラグやコントロールがあること

# コード

コードはいたってシンプルです。

ボタンのDisplayModeに対して

```button_1.DisplayMode
If(IsBlank(LookUp(gallery_1.AllItems,tgl.Value = false)),DisplayMode.Edit,Disabled)
```

でOKです。
内容としては、galleryのAllItems（全てのアイテム）の中のtgl.Value（切り替えコントロールの値）が false の場合そのレコードを返します。１件でもある場合 IsBlank() 関数は false を返しますので、このような式になります。
また全てtrueの場合（falseが一件もない場合）は空白を返すため IsBlank() は true を返します。　

```button_1.DisplayMode
If(CountIf(gallery_1.AllItems,tgl.Value = false) = 0,DisplayMode.Edit,Disabled)
```

 でも同じことができますが、おそらく LookUp() 関数の方が速度が速いと思います。(「○○件エラーが出ている」みたいな作りをしようとした場合はこちらを使う可能性はあります。)

# まとめ

意外と使うので覚えていて損はないと思います。
今回は「切り替えコントロール」ですが、入力系コントロールでも同様のことはできますので、ぜひ試してください。
IM-FormaDesiner URL、リクエストパラメータまとめ

### 前提
 - intra-mart Accel Platform 
 - IM-FormaDesiner 標準アプリケーション
 - IM-Workflow連携時は下記記事を参照
 [IM-Workflow 申請・承認・参照・確認画面 URLまとめ](https://qiita.com/doriburu/items/ad889da4a4c9805cb47c)
 userDataIdとformaのinsert_idは同じものなので、パラメータにはこれを設定する


URL指定でForma画面に遷移するには下記を指定します
##### 登録画面 URL
forma/normal/view/regist_application_view/%アプリケーションID%

##### リクエストパラメータ
| パラメータ名 | 値 | 必須  | 備考 |
|:--|:--|:--:|:--|
| imfr_callback_path |コールバックパス||formaアプリの戻るボタン遷移先|
| imfr_application_no |アプリケーション履歴番号||未指定時は有効期間内で最新|
| upp_??? | ユーザーパラメータ||複数指定可|

ルールに合致しないパラメータはforma側に渡されません
渡されたパラメータはforma前処理にて使用できます
upp_???で指定したパラメータは前処理のregist(formaParam, uppParam) メソッドuppParam内にプロパティとして渡ってきます
forma画面内で使いたい場合はそこから画面項目へ出力する流れとなります

[IM-FormaDesigner for Accel Platform プログラミングガイド](https://www.intra-mart.jp/document/library/forma/public/forma_programming_guide/texts/pre_processing/index.html#id11)

##### 指定例
サンプルアプリケーションのアプリケーションID = sample_app_equipmentの登録画面を開く場合、下記のように指定します
例は分かりやすいようにgetパラメータですがpostでも行けます
```
http://localhost:8080/imart/forma/normal/view/regist_application_view/sample_app_equipment?imfr_application_no=1&upp_arg1=test
```

##### 更新画面
forma/normal/view/edit_application_view/%アプリケーションID%

##### リクエストパラメータ
| パラメータ名 | 値 | 必須  | 備考 |
|:--|:--|:--:|:--|
| imfr_insert_id |データ登録ID|○|主キー どちらかを指定|
| imfr_sd_insert_id |データ登録ID|○|主キー  どちらかを指定|
| imfr_callback_path |コールバックパス||formaアプリの戻るボタン遷移先|
| imfr_application_no |アプリケーション履歴番号||未指定時は有効期間内で最新|
| upp_??? | ユーザーパラメータ||複数指定可|

imfr_insert_idかimfr_sd_insert_idどちらかを指定すれば動作します
どちらも同じものを指定したのと同じになります

#### 参照画面
forma/normal/view/refer_application_view/%アプリケーションID%

##### リクエストパラメータ
更新画面と同一のため割愛


##### 余談
Formaアプリの一覧画面をViewCreatorで作るとその辺の処理が勝手に作られるので、そのhtmlを見るとこの辺の実装が分かるかと思います

##### 参考資料
[intra-mart Accel Platform ViewCreator for IM-Workflow 連携ガイド](https://www.intra-mart.jp/document/library/iap/public/im_workflow/im_workflow_viewcreator_guide/texts/user_guide_forma/sample9.html)
[IM-FormaDesigner for Accel Platform 作成者 操作ガイド](https://www.intra-mart.jp/document/library/forma/public/forma_appli_maker_guide/maintain_forma_application/view-creator_outside_link.html)
[IM-FormaDesiner システムパラメータ](https://www.intra-mart.jp/document/library/forma/public/forma_specification/texts/spec/system_parameter.html)
MWCバルセロナ2019の出展者リストをCSV化するpythonコード

MWCバルセロナ2019に行くことになったので出展社を調査しようと思ったのですが、サイト上で調べるのは面倒だったので、csvファイルにするスクリプトを作成。

```python:mwc_Exhibitors.py
import requests

def main():

    #Data収集
    num=0
    exbitor_data=[]
    print 'start get company data'
    while 1:
        response = requests.get('https://www.mwcbarcelona.com/exhibition/2019-exhibitors/page/'+str(num)+'/',
                            headers={'Content-Type': 'text/html; charset=UTF-8'})
        if response.content.find("No exhibitor found.")!=-1:
            break

        for line in response.content.split("\n"):
            if line.find('data-type="exhibitor"')!=-1:
                company_url = line.split('"')[1]
            elif line.find('class="box-title"')!=-1:
                company_name = line.split('>')[1].split("<")[0]
                exbitor_data.append([company_name,company_url])

        num=num+1

    num=0
    for company in exbitor_data:
        print str(num+1) + "/" + str(len(exbitor_data))
        response = requests.get(company[1],
                            headers={'Content-Type': 'text/html; charset=UTF-8'})
        dsr_flg=0
        company_location='none'
        company_description='none'
        company_website='none'
        company_tags='none'
        for line in response.content.split("\n"):
            if line.find('class="list-location">')!=-1:
                company_location = line.split('class="list-location">')[1].split("<")[0]
            elif line.find('class="mod-content api-description"')!=-1:
                dsr_flg=1
                company_description=''
            elif dsr_flg:
                if line.find('</div>')!=-1:
                    company_description = company_description.split("<p>")[1].replace("<br />","").replace("</p>","")
                    dsr_flg=0
                else:
                    company_description=company_description+line

            elif line.find('class="web-site-link"')!=-1:
                company_website = line.split('"')[1]
            elif line.find('name="tags"')!=-1:
                company_tags = ''
                for tag in line.split('name="tags"'):
                    if tag.find('</span>')!=-1:
                        company_tags = company_tags+tag.split('</label')[0].split('>')[-1]+','

        exbitor_data[num].extend([company_website,company_description,company_location,company_tags])
        num=num+1

    fp_csv = open("mwc_exhbitor_list.csv","w")
    fp_csv.write("Company,website,description,tags,location\n")
    for company in exbitor_data:
        fp_csv.write('"'+company[0]+'","'+company[2]+'","'+company[3]+'","'+company[5]+'","'+company[4]+'"\n')

    return

if __name__ == '__main__':
    main()

```
WordPressでメディアにcssをアップロードできるようにする

# 動作確認バージョン
WordPress 4.9.9
WordPress 5.0.3

# ググってもできなかったケース
この手の問題はやはりどこでも発生するようで、
ググればいろいろ情報出てくるんだけど、
その通りやってもうまくいかない。

```functions.php
function custom_mime_types( $mimes ) {
	$mimes['css'] = 'text/css';
	return $mimes;
}
add_filter( 'upload_mimes', 'custom_mime_types' );
```
こういうやつ。

調べてみると、WordPressで取り扱う MIME の情報には、
もとからちゃんと text/css が入ってるようなので、
そもそもこれやらんでもアップできてしかるべきじゃね？という状況だった。

# 落とし穴は MIME にあった
いったいどこでエラー吐いてるんだ、と思って
wp-includes の中まで順番に追いかけていくと、
ようやく問題の条件分岐を発見し、
そこで使われてる変数の状態をdumpして愕然。

**css 上げてるのに MIME が text/plain になってやがる**

WordPress管理画面のメディアのアップロードの処理としては、
wp-admin/admin-ajax.php から始まり、
最終的に wp-includes/functions.php の wp_check_filetype_and_ext() 内で
「期待される MIME とアップされた MIME が違うっぽい」と判断され、
セキュリティ的にアップさせられないよ! というエラーを吐いていた。

# 動いたパターン

そんなわけで、「拡張子が css だけど MIME は text/plain やで」と
明示的に教えてやることで無事にアップロードできるようになった。

```functions.php
function custom_mime_types( $mimes ) {
	$mimes['css'] = 'text/plain';
	return $mimes;
}
add_filter( 'upload_mimes', 'custom_mime_types' );
```
これで解決。

今回ハマったのは、css という ASCII なデータゆえ、なのかな・・。
POST時の MIME が期待の通りに送られてないっぽい感じはあるけど、
それがフォーム側の問題なのか、ブラウザの挙動なのか、Webサーバの設定なのか、
ちょっと追いかけきれてないけど、まぁ解決したのでよしとする。
Storybook (Vue) で Vuetifyを使う


wrote: 2019.1.16

### install vuetify

```shell
vue add vuetify
```

### install storybook

```shell
npx -p @storybook/cli sb init
```

### config

.storybook/config.jsに以下を追加

```js
import Vue from "vue";
import Vuetify from "vuetify";
import "vuetify/dist/vuetify.css";

Vue.use(Vuetify, {
  iconfont: "md"
});

addDecorator(() => ({
  template: "<v-app><story/></v-app>"
}));
```


configは以下のようになる。

```js:.storybook/config.js
import { configure, addDecorator } from "@storybook/vue";
import Vue from "vue";
import Vuetify from "vuetify";
import "vuetify/dist/vuetify.css";

Vue.use(Vuetify, {
  iconfont: "md"
});

addDecorator(() => ({
  template: "<v-app><story/></v-app>"
}));

// automatically import all files ending in *.stories.js
const req = require.context("../stories", true, /.stories.js$/);
function loadStories() {
  req.keys().forEach(filename => req(filename));
}

configure(loadStories, module);
```



### 

yarn add stylus
yarn add stylus-loader


```js:preview-head.html
  <link href='https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons' rel="stylesheet">
```

#参考


[Vue + Vuetify theme not working · Issue #4256 · storybooks/storybook](https://github.com/storybooks/storybook/issues/4256)


[Quick Start — Vuetify.js](https://vuetifyjs.com/ja/getting-started/quick-start)
Github PR Issue でのコメントでは Tabキー移動ではなく Control / Command + Enter のショートカットを使うべき

You should use Control / Command + Enter in Github comment in PR or issue but no tab key 
Github PR Issue でのコメントでは Tabキー移動ではなく Control / Command + Enter のショートカットを使うべき

- Tabキーで移動すると Close PR / Issue を押してしまう
- なぜGithubにしてこのUIだ？と思ったけど、もう既に時代はTabキー移動とかは古いのかも
- それにしても古き良きタブキー移動ユーザーに配慮してくれよとは思うけど

![image](https://user-images.githubusercontent.com/13635059/51238910-5d83ac80-19bb-11e9-8c11-151c3ff403b1.png)

---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
appium + pythonでAndroidのListViewの内容をテスト

ListViewの内容があっているかテストするコードのメモ。
ListViewにはアイテムが100個、要素それぞれがアイテム番号とスコアを入れるTextViewを持っている。


```python:test_list.py
def test(self, flat_case)

    counter=100 #要素数は既知
    while(counter>0):       
        # ListViewの一行分レイアウト内の、全体を囲む要素のidを指定。ここではLinearLayoutだった
        elements = self.driver.find_elements_by_id("app_id:id/linear_whole")
        print("counter=",counter)

        for el in elements:
            try:
                #もう一段階LinearLayoutがあった
                els=el.find_elements_by_id("app_id:id/linear_id")
                for e in els:
                    try:
                        #目的の要素のアイテム番号を保持しているTextView
                        txt_id=e.find_element_by_id("app_id:id/text_id")
                        print("text_id=",txt_id.text, "counter=", counter)
                        if str(txt_id.text)==str(counter):
                            #スコアが入ったTextViewを指定
                            score=el.find_element_by_id("app_id:id/text_score")
                            score=str(score.text).strip()
                            #flat_caseは全要素分の正解scoreが入ったリスト。
                            print("score=",score, "ans=",flat_case[counter-1])
                            #正しい値であることを確認
                            self.assertEqual(score, str(flat_case[counter-1]))
                            #ListViewには100->1まで逆順に並んでいたのでcounterはデクリメントする
                            counter=counter-1
                    except NoSuchElementException:
                        continue
            except NoSuchElementException:
                continue
        #スクロール
        self.driver.swipe(0,0,0,500,300)

```


##参考
[How to find all the elements in list view](https://discuss.appium.io/t/how-to-find-all-the-elements-in-list-view/5767)
WINDOWS7からWINDOWS10にアップデートした際にpowershellでIE操作ができなくなった話

#概要
POWERSHELLを使って、IEで特定のサイトに自動ログイン→HTMLソースを取得してクリップボードにコピーしていたのですが、WINDOWS7からWINDOWS10にアップデートした際に、動作しなくなったため対応方法の覚書です。

## IEのCOMがアクセス不可
以下、IEオブジェクトを開くためのサンプル

```powershell
objShell=new-object -com Shell.Application
$ie=new-object -com InternetExplorer.Application
$ie.navigate("開きたいURL")
```

この２行目部分でInternetExplorer.Applicationが開けないと
エラーが発生するようになり、スクリプトが動作しなくなりました。
###対応
古い.NETのランタイムを削除することでOK。
WINDOWS7時代に使用していた.net 3.5系のランタイムをプログラム一覧から削除後、エラーが出なくなりました。

## HTMLソースを取得→クリップコピーした際、文字化けする
既存環境では、WIN7に標準ではいっていた、POWERSHELL 2.0を使っていました。WINDOWS10に変わった際に、POWERSHELLが5になった影響か、クリップボードに日本語をコピーした場合に文字化けが発生するようになりました。

以下、文字化けが発生したスクリプトサンプル
（開いているIEの画面からHTMLソースをクリップボードコピーする）

```powershell
$ie = $objShell.Windows() |
? {$_.Name -eq "Internet Explorer"} |
Select-Object -First 1
$html = $ie.Document.Body.InnerHTML
$html|CLIP
```


###対応
上記コードの上に以下を追記したら文字化けはなくなりました。


```powershell
[Console]::OutputEncoding = [Text.Encoding]::Default
```


## IEを開くのに時間がかかる
WIN7で実行していたころより、IEが開くのに時間がかかるようになりました。
私の環境では、スクリプトを呼び出して5秒くらいしないとIEが起動しない状態になっています。

```powershell
objShell=new-object -com Shell.Application
$ie=new-object -com InternetExplorer.Application
$ie.navigate("開きたいURL")
・
・
・
後続処理
・
・
・

```

###対応
$ie.navigateの処理後にIEのBUSYチェック処理を追加
画面が開ききるまでWAITするようになります。

```powershell
while($ie.Busy){
     start-sleep -milliseconds 500
}
```


## IEを起動したときに正常に起動せず、ゾンビ化する頻度が多くなった

IEをスクリプトから起動した際、画面が立ち上がらず、プロセスのみ起動するいわゆるゾンビプロセスが発生しやすくなった。
この状態になると次回の起動が正常に実施できなくなります。

###対応

私の環境では他を開く必要がないため、起動プロセスの前に強制的にIEをクローズするようにした。

```powershell
$ps = Get-Process | Where-Object {$_.Name -eq "iexplore"}
#開いているIEがいたら閉じる
if($ps -ne $null)
{
    Stop-Process -name iexplore
}
```

#最後に

OSのアップデートにより、思ったよりいろいろと対応が必要になってしまいました。
根本的な対応が取れていないものもあるため、改定していけたらと思います。

記事を追記しました。
WINDOWS7からWINDOWS10にアップデートした際にpowershellでDOM操作ができなくなった話
https://qiita.com/kk-ster/items/d8a993c5f6015aff809e
大学生が有料スマホゲームを作った全てを公開するよ（１）イントロダクション

これから、初心者でも出来た、スマホゲームを作ってリリースするまでの**全て**を公開しようと思う。
技術的な事だけでなく、ゲーム開発の**苦労**や**制作秘話**についても触れていくつもりだ。

同じくゲームを作っている人、これからゲームを作ろうと思ってる人は参考にしてみると良いかもしれない。

#自己紹介
はじめまして。

ボクは趣味でゲームを作っている**大学2年生**。
**２年間で２作**ゲームを作ってiOSとアンドロイドの両方で**リリースした**。
**１つは無料**で、**もう１つは有料**(120円)だ。

別にゲームの専門学校に通っているワケではない。
ただの趣味だし片手間だ。

Unityは1~2年くらい使ってる。

ゲームが好きで、昔からよくパソコンのゲームで遊んでる。
オーバーウォッチが好きな人は友達になろう。

ちなみに、スマホゲームはあんまり好きじゃない。
それでもスマホゲームを作った。

これから紹介するのは**ただのゲーム好き**が、
**独学で**スマホゲームを作ったその方法と過程の**全て**だ。

#作ったゲーム
![pertica_ScreenShot3.png](https://qiita-image-store.s3.amazonaws.com/0/343309/ed6f3599-a1e5-3114-0cad-33c474f97bba.png)
これから全貌を公開するのは**「pertica」**っていう**パズル・アクションゲーム**だ。
2018年12月21日にリリースした**有料(120円)のスマホゲーム**。
iOSとアンドロイドの両方で公開中だ。

ボクはこれまでに**「Kllaver」**と**「pertica」**っていうスマホゲームを開発してリリースした。
ちなみに、読み方は「クラベル」と「ペルティカ」。
「Kllaver」は音楽ゲームなんだけど、今回は触れないよ。

「pertica」はボクが出した*２作目のゲーム*。
**宇宙**みたいな幻想的な世界で、とっても*キラキラ*したゲームだ。
プレイヤーはそもそも**人じゃない**んだけど、**弾を飛ばす**ことができる。
弾が当たったものとプレイヤーは**位置が入れ替わる**。
ゲームは**ステージ制**で**たくさんのギミック**があるよ。
入れ替わる力で、頭を使ったり使わなかったりして**ゴールを目指す**んだ。

面白いからやってみてね。
絶対に後悔はさせないよ。

- [App Store](https://itunes.apple.com/jp/app/id1445813632?mt=8&ign-mpt=uo%3D4)
- [Android](https://play.google.com/store/apps/details?id=tmy.jack.pertica&hl=ja)



#制作期間と仲間たち
制作期間は**１０ヶ月**、主力の開発メンバーは**２人**だ。

| 時期 | やったこと |
|:-----------|:------------|
| ３月       | 企画<br>プロトタイプ作り    | 
| ４～５月     | メインの機能作り   | 
| ６月       | 一通り遊べる状態にする        | 
| ７～１０月         | お休み          | 
| １１月       | ブラッシュアップ       | 
|  １２月   | ステージ制作<br>リリース     | 

大体の制作期間はこんな感じ。
2018年3月に始まったこのプロジェクトは2018年12月に完成した。
といっても、途中４ヶ月はお休みしてるから**実質６ヶ月**で作った。

開発は基本的に**２人**でやって、たまにアドバイスしてくれる人が１人いた。
一緒に開発をしてくれたのはサークルの一つ上の先輩。
ボクより少しだけ多くの技術と知識をもってる。
学校の成績が良いとっても頼れるパートナーだ。

#役割分担
大体の役割は、**ボクがインゲーム**で、**先輩がアウトゲーム**だった。
インゲームっていうのは、実際にプレイする部分で**ゲームのメイン**になるところ。
アウトゲームは、開発する段階で**必要なツール**を作ったり、**メニュー画面**を作ったりする。

**メイン**部分をボクが作って、先輩は主に**「ステージを作るツール」**を作った。
こう聞くと先輩の方が楽だと思うかもしれないけど、「ステージを作るツール」を作るのはほぼ１つのゲームを作るのと変わらない。
しかも先輩は、手が空いたら進捗が悪い部分に回る**何でも屋**も兼ねていた。

これからゲームを作る人は、こういう**「ツール」**を作るのは意外と大変だと覚えておいてほしい。

ボクのチームにはもう一人、たまにアドバイスを出してくれる人がいた。
企画も一緒にしている。
今になってだけど、ゲームを理解していて、かつ１ユーザーとしての率直な意見を聞ける貴重な人だった。

# 使ったツール
開発に関して利用したツールを列挙しておく。 

- Unity 2017.2.0p4
- BitBucket
- Git SourceTree
- Trello
- Slack

#コメント
実はこのゲーム、全然売れてないんだ。
というか、認知されてないんだ。
でもゲームを作った過程と結果は気になる人がいると思った。
だからこの記事を書いた。

今後の記事はもっと技術的になる。
でも全くゲームを作った事無い人でも、なんとなーく分かるように書いてみるね。

これから書くのは、あくまで、こういう風にして、こういうゲームを作ったら、これくらいインストールされたよっていう事実。
参考にするかはキミに任せる。

でももしボクが書く記事を「良いな」って思ってくれたら、教材やお土産に「pertica」([App Store](https://itunes.apple.com/jp/app/id1445813632?mt=8&ign-mpt=uo%3D4), [Android](https://play.google.com/store/apps/details?id=tmy.jack.pertica&hl=ja))を買っていってくれると嬉しいな。


[大学生が有料スマホゲームを作った全てを公開するよ（１）イントロダクション](https://qiita.com/shoi_ito/items/2234414af441e448a85e)
[大学生が有料スマホゲームを作った全てを公開するよ（２）開発環境とゲームの構成](
https://qiita.com/shoi_ito/private/b9acd13f5fe80536fd0d)
[大学生が有料スマホゲームを作った全てを公開するよ（３）ゲームの成り立ち・パズルとアクションの仕組み（前編）](https://qiita.com/shoi_ito/items/a2adf87dd783c8379178)
[大学生が有料スマホゲームを作った全てを公開するよ（４）ゲームの成り立ち・パズルとアクションの仕組み（後編）](https://qiita.com/shoi_ito/items/ed485d4f956959e6cd36)
EIP155(microraiden)などの署名がtxpoolから処理されない

# 起こったこと
以下のようにtransaction poolがなっていて、これがminer.start()で処理されない。

```
> txpool.inspect
{
  pending: {
    0x202A270e7331BE4c87Eb62aFAC778A281E5D5827: {
      2: "0x897783EFB774e6053Cb2F48979AaF6f773C885C9: 0 wei + 130000 gas × 20000000000 wei"
    },
    0x578e81833BA9c2511431e57aEA69386b9D38aCF3: {
      0: "0xB70Af06ab6C873bF4D3473f18ACe65558a5E8fd2: 0 wei + 130000 gas × 20000000000 wei"
    },
    0xFF3867597E3AfA8B4351b5282D3d4BEE56847d92: {
      0: "0xe35028848AdC7B68369EC7050D1657f6DB997DEC: 0 wei + 130000 gas × 20000000000 wei",
      1: "0xe35028848AdC7B68369EC7050D1657f6DB997DEC: 0 wei + 90000 gas × 1000000000 wei",
      2: "0xe35028848AdC7B68369EC7050D1657f6DB997DEC: 0 wei + 90000 gas × 1000000000 wei"
    },
    0xfEc2C0252225BE2bc214eA718C01bdABB0fb9fe2: {
      0: "0xB70Af06ab6C873bF4D3473f18ACe65558a5E8fd2: 0 wei + 130000 gas × 20000000000 wei"
    }
  },
  queued: {}
}
```

# 解決策
go-ethereum内のコードを変更する。今回は研究用に動けば良い実装なので、これでmainnetに繋げると問題があるかも。

```go:params/config.go
227 // IsEIP155 returns whether num is either equal to the EIP155 fork block or greater.
228 func (c *ChainConfig) IsEIP155(num *big.Int) bool {
229     // return isForked(c.EIP155Block, num)
230     return true
231 }
```
AWScloud9でMySQLの文字コードをUTF-８に設定する方法

##AWSでMySQLの文字コードをUTF-８に設定する方法

AWScloud9を使ってSQLの勉強会があるので、そのための準備をしました。

数時間ハマったのでメモとして残しておきます。

ターミナル上での基本操作

```
Escキー
インプット状態を解除する
```

```
lnsキー
インプット状態にする
```

```
my.cnfファイル上、インプット解除状態で、コロン「:」
ページ最下部にカーソル移動し、コマンド入力可能になる
```

```
wqコマンド
my.cnfファイルの編集を保存し、ターミナルに戻る
```

**編集が終わったら「:wq」で保存をすること！**
**色んな記事を見てもこの保存については書いておらず、設定が反映されずにここで数時間費やしました笑**
**あまりに初歩的な部分なんだと思いますが勉強になりました。**

保存時、既にmysqlを立ち上げていれば一度再起動を行う必要があります。

```
mysql再起動
sudo service mysqld restart
```

再起動後、設定が反映されます。

ちゃんとUTF8の設定書いたはずなのに
・databaseとserverがlatin1のまま
・文字コードを指定して作ったdatabaseはutf8になっている

ということであれば、my.cnfファイルの保存が出来ているか確認してみて下さい。

その他コマンド

```
状態確認
sudo service mysqld status
```

```
起動
sudo service mysqld start
```

```
停止
sudo service mysqld stop
```

```
再起動
sudo service mysqld restart
```

```
mysqlにログイン
mysql -u root -p
```

```
MYSQL内で使われている文字コードの確認
show variables like "character%";
```

```
データベースの内容確認
show create database データベース名;
```

```
データベースを選択
use データベース名;
```

```
文字コードを指定してデータベースを作成
CREATE DATABASE データベース名 default character set utf8;
```

```
データベース削除
DROP DATABASE データベース名;
```
Docker Desktop で 21: is a directory

docker-compose up -d でエラー。

```
nginx: [crit] pread() "/etc/nginx/conf.d/xxx.conf" failed (21: Is a directory)
```

ぐぐった情報を試しても解決せず。

# とりあえず

ESET のファイアーウォールを一時的にオフにしたら動きました。

# 原因と解決法

[Docker for Windowsのドライブ共有時に必要なESETでの設定](https://qiita.com/toro_ponz/items/167250639211f264b43c)

全部ここに書いてありました！激感謝 m(_ _)m

ESET → Docker の順に入れた場合は分かりやすいエラーが出てくれるようです。
今回は既に Docker が動いている環境で ESET を入れ直しました。
エラーから直接このページへはたどり着けなかったので共有します。
WebサービスのHtml文法チェッカは業務で利用できるのか？

# WebサービスのHtml文法チェッカは業務で利用できるのか？

少し大きめのHTMLになるとタグの閉じ忘れなどを検出するのが大変です。ちょっとしたタグのミスならChromeやFirefoxで何事もなく動作してくれますが、IEでは動かないことがあります。
こういうバグは目視確認で修正するのは大変なため、業務用途でも問題なさそうなHTML文法チェッカがないか、Webサービス＋αを調べてみました。（ライセンス的なことは調べていません）

## HTML文法チェッカの種類
HTMLチェッカにはいくつかの種類があります。

| カテゴリ          | 代表的なもの                                            |
|:----------------:|:------------------------------------------------------:|
| Webサービス      | W3C Markup Validation Service,<br> Another HTML Lint – Gateway,<br> DirtyMarkup |
| ブラウザ         | HTMLエラーチェッカー(Chrome拡張)                             |
| アプリケーション  | HTML Tidy                                               |

Webサービスでは検証するURLを指定したり、HTMLファイルをアップロードするタイプがありますが、開発中の秘密情報が流出する可能性があるため利用できません。テキストを貼り付けるタイプはその実装次第となります。
また、ブラウザの拡張機能、アプリケーションもそれらの実装次第となります。これらの実装について簡単に調べました。

```html:検証に利用したhtml(bodyタグの閉じタイプミス)
<html>
<head>
<title>Hello world !</title>
</head>
<body>
Hello world !
</body1>
</html>
```

### W3C Markup Validation Service
[Validatie by URI]タブ、[Validate by File Upload]タブの機能はサーバ側での処理が明白で情報漏洩の恐れがあるため利用できません。
ブラウザの開発者ツールで確認するとわかりますが、[Validate by Direct Input]でテキストを直接貼り付けた場合も同様に、Webサービスに対してPOSTメソッドで全文が送信されており、業務利用には向きません。
![0.w3c.png](https://qiita-image-store.s3.amazonaws.com/0/333432/e8f1e294-702c-5fa3-df81-e6004579ea78.png)

[Markup Validation Service](https://validator.w3.org/)


### Another HTML Lint – Gateway
Another HTML LintもW3C Markup Validation Service同様に[URL]タブ、[FILE]タブの機能がありますが、これらは当然情報漏洩のリスクがあります。
![1.another.png](https://qiita-image-store.s3.amazonaws.com/0/333432/ee248f9a-f935-1eb7-f158-84b87e531ffd.png)

[DATA]タブでチェックボタンを押した場合も、Webサービスに対してPOSTメソッドが呼び出されていますので、「W3C Markup Validation Service」同様に業務利用には向かないでしょう。
[Another HTML Lint – Gateway](http://www.htmllint.net/html-lint/htmllint.html)


### DirtyMarkup
テキストを貼り付けと同時に文法をチェックしてエラー個所を可視化してくれます。
この時点ではサーバと通信は行われておらず、JavaScriptによりクライアント側でチェックしています。
ただし、[Clean]ボタンで整形するときはサーバとの通信が入るため、この機能の利用は避けたほうがよいと思われます。簡単なタグ補正機能も備わっているため惜しいところです。
![2.dirty-2.png](https://qiita-image-store.s3.amazonaws.com/0/333432/4073ec22-3efd-b086-bbc6-fe2c06bcfb22.png)

[DirtyMarkup](https://www.10bestdesign.com/dirtymarkup/)


### HTMLエラーチェッカー
Chromeブラウザの拡張機能です。ソフトの仕様に**「JSでソースを確認するので、外部送信は行ってません」**とあります。また開発者ツールで検証しても特別な通信はなく、業務利用は問題なさそうです。
ただし、編集中のソースもWebサーバ経由でロードさせる必要があります。(JavaScriptの制約でローカルファイルを勝手に処理できないから？)
![3.chrome1.png](https://qiita-image-store.s3.amazonaws.com/0/333432/e2edc966-a66a-fc3f-622e-78d35269b3d7.png)

[HTMLエラーチェッカー](https://chrome.google.com/webstore/detail/html%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC/ohdllebchmmponnofchalfkegpjojcaf?hl=ja)

### HTML Tidy
WindowsバイナリがないためLinuxで検証しましたが、アプリ単独でチェックしています。シンプルですがWebアプリ屋さんには使いにくいかなという印象です。

```
root@ubuntu-vm:/tmp# tidy hello.html
line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 7 column 1 - Warning: discarding unexpected </body1>
Info: Document content looks like HTML5
Tidy found 2 warnings and 0 errors!
```
[HTML Tidy](http://www.html-tidy.org/)

## まとめ
今回の検証範囲では、見た目も奇麗で使い勝手の良いDirtyMarkupか、Chrome拡張のHTMLエラーチェッカーの2択となりました。
特にChromeでのHTMLエラーチェッカーを常時有効にして普段使いしていると、世の中のサイトはエラーが多いことがわかりますよ:grin:
Arch Linux の修復

Arch Linux がブートしなくなった時の修復方法です。
次の記事とほぼ同じ方法です。
[Arch Linuxが起動しない (can't boot Arch Linux)](https://www.archlinux.site/2014/11/arch-linux-cant-boot-arch-linux.html)

私の環境は次の通りです。

```text
/dev/sda2   /
/dev/sda3   /home
```

<ol>
<li>LiveUSB の作成</li>
archlinux-2023.05.03-x86_64.iso をダウンロード

```bash
wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/2023.05.03/archlinux-2023.05.03-x86_64.iso
```

USB に書き込みます。

```text
# dd if=archlinux-2023.05.03-x86_64.iso of=/dev/sdb oflag=direct bs=1048576
```

<li>LiveUSB でブートします。</li>

<li>/dev/sda2 をマウントします。</li>

```text
# mkdir /mnt/arch
# mount /dev/sda2 /mnt/arch
```

<li>その他のマウント</li>

```text
# cd /mnt/arch
# mount -t proc proc proc/
# mount --rbind /sys sys/
# mount --rbind /dev dev/
```

<li>Wifi の接続</li>
>wifi001 というプロフィールで接続ができていたとすると、

```text
# cp /mnt/arch/etc/netctl/wifi001 /etc/netctl
# netctl start wifi001
```

<li>chroot</li>

```text
# chroot /mnt/arch /bin/bash
```

<li>/etc/pacman.conf の修正</li>
> signature check でエラーになっていたので、チェックをしないようにします。

```text:/etc/pacman.conf
（省略）
SigLevel = Never
（省略）
```

<li>ソフトの更新</li>

```text
# pacman -Syy
# pacman -Syu
# pacman -S udev
# pacman -S mkinitcpio
# pacman -S linux
# mkinitcpio -p linux
```

<li>再起動</li>
>ハードディスクから起動するように、設定を切り替えて下さい。

```text
# exit
# cd /
# umount --recursive /mnt/arch/
# reboot
```

<li>ハードディスクの Arch Linux が立ち上がったら、
/etc/pacman.conf を元に戻す。</li>

</ol>
201901: 新しいJupyter notebook を開くときにテンプレとなっている最初の数行を晒すだけです

みなさんはどんな感じでしょうか？僕は以下のような感じです

```py
%pylab inline
import matplotlib
rcParams['figure.figsize'] = (16, 5)
```

```py
%load_ext autoreload
%autoreload
```

```py
import librosa
import librosa.display
import torch
from IPython.display import Audio
import IPython
from nnmnkwii import preprocessing as P
import pysptk
import pyworld
from scipy import signal
from scipy.io import wavfile
```

気分転換にクソ記事を書いてみました。今年もよろしくお願いします。
OracleとMySQLの違い

### Oracle と MySQL の違い
- みんなちがってみんないい…とはいかない
- 気になった点のみ抜粋
- 随時更新する

#### 1.データ型
| データ型 | Oracle| MySQL|
|:-----------:|:------------:|:------------:|
| 数値| NUMBER | INT(INTEGER)/NUMERIC|
| 文字| CHAR/VARCHAR2| CHAR/VARCHAR |

#### 2.NULLと空白文字の扱い
- Oracle → NULLと空文字は同一だ
- MySQL → NULL と 空文字は別もと区別する

#### 3.limit 句
- Oracle → 使えないらしい。は？ ROWNUM をごにょればそれっぽいことができる。
- MySQL → 使える！やったー！
完全にゼロからプロのITエンジニアになる方法

#はじめに
IT業界は決してホワイトな業界ではありません。
また天才がぱっとやっているわけではほとんどなく、地道な泥臭い仕事の積み重ねで成り立っています。
※天才はいます

#個人的な意見として
プログラミング教室の広告を大量に目にするのですが、断言できますがプログラミング教室に行っただけではプロのITエンジニアにはなれません。
また、ITエンジニアは向き不向きが絶対あります。

#どうやったらなれるのか？
下記3つを読み内容を理解した上でサービスを立ち上げましょう。
そうすればほぼ間違いなくなれます。

####「モンスターがウヨウヨいるIT業界をサバイブするために、まず最低限知っていてほしいこと」
https://qiita.com/barcarunrun/items/1077def26854e8229086

####「ITエンジニアになるならこの本を読もう32選」
https://qiita.com/barcarunrun/items/5dfdc14c3c3e054b0a2e

####「ITエンジニアのスキル習得方法 ~特定の言語もしくはフレームワークを勉強する方法~」
https://qiita.com/barcarunrun/items/8b730ff341c736361958

#補足
今あなたが大学1年生であればほぼ間違いなく上記の内容を実施できるかと思います。
【RapidSSL + IIS7.0 】SSLサーバー証明書有効期限更新メモ


####1.該当サーバーからCSRを生成。
https://www.geotrust.co.jp/support/ssl/csr/iis7_renew.html
識別名プロパティは既存のものを使用。組織名は正式英語名であることに注意。

####2.更新申込み
https://www.rapid-ssl.jp/rapidssl-order/ssl-renew.htm?product=rapidssl&act.x=76&act.y=7
上記ページ一番下のお申し込みフォームへ

####3.１で生成したCSRの貼り付け

####4.支払い情報入力

####5.完了すると、数件メールが届く。
「あなたのドメインの所有権を確認してください: ドメイン名 」の件名のメールからリンクに飛び、承認ボタン

####6.「SSLサーバ証明書発行完了のお知らせ」メールが届く。
SSLサーバ証明書（PKCS #7 形式)の内容をコピーしてファイル作成。

####7.IISから証明書のインストール
https://www.geotrust.co.jp/support/ssl/install/iis7_renew.html のSTEP１を参考に設定する。
証明書の発行でエラーになっても、リストを最新状態にするとインストールされているので注意。

####8.ブラウザから期限が更新されている事を確認
全角英数字をvscodeを使ってお手頃に半角変換

## 概要

プロジェクトをよく見てみると全角と半角の英語・数字・記号がぐちゃぐちゃと混ざっているではないですか。

よーし！今こそ正規表現で一括検索・一括置換♪
と、正規表現を使って検索したものの**VScode上で正規表現を使って半角変換までこなす術がわたしにはありませんでした**。(vscode完結でそんなことできるのかな..?)

ということで、今回は自分のできる中でもっとも効率的だったやり方を書き残しておこうと思います!!

## 準備

https://marketplace.visualstudio.com/items?itemName=8amjp.convertwidth
Convert Width

こちらをダウンロードしておきます。VScodeよりエクステンションの検索で『Convert Width』を入力するとでてきます。

## 手順
全角英数字を検索し、半角英数字に変換するまでの手順です。

1. `Cmd + Shift + F`で全ファイル検索を開く
2. 検索バーに`[０-９Ａ-Ｚａ-ｚ]`を入力し全角英数時、一番右のアイコン『.*』をクリックして正規表現を有効化(`Alt + Cmd + R`)
3. 全角英数字が含まれたファイルがでてくる
4. 全選択して`Cmd + Shift + P`で出てくるConvert Widthのコマンドを適用する


### コマンド一覧

```

<A> 半角英字(句読点含む)を全角に変換
半角英字(A-Z)、アンド(&)、カンマ(,)、ピリオド(.)を全角に変換します。

<1> 半角数字を全角に変換
半角数字(0-9)を全角に変換します。

<?> 半角記号(!?)を全角に変換
半角の感嘆符(!)、疑問符(?)を全角に変換します。

>A< 全角英字(句読点含む)を半角に変換
全角英字(Ａ-Ｚ)、アンド(＆)、カンマ(，)、ピリオド(．)を半角に変換します。

>1< 全角数字を半角数字に変換
全角数字(０-９)を半角に変換します。

>?< 全角記号(!?)を半角に変換
全角の感嘆符(！)、疑問符(？)を半角に変換します。

```

## あとがき
絶対もっと効率的な方法ある..!!と、思いながら作業してました。
もしご存知な方いらっしゃいましたらこっそり教えてくださいね。

ちなみにVScodeで全角記号の正規表現を使った検索はうまくいきませんでした。
`[、-○]`で検索したのですが、なにか間違えたんですかね..