OmniAICreator/Qiita-1.07M huggingface dataset:
【レポート】TDD Boot Camp 2020 Online #1 基調講演/ライブコーディングを視聴してみて

## なんの記事？
- TDDについてなんとなく本読んだりで知ってはいたが、実際にやるところなどをみて肌感を知りたく以下のイベントにオンライン参加してみたレポートです。
- アーカイブ：[TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング](https://www.youtube.com/watch?v=Q-FJ3XmFlT8)

## イベント内容
- テスト駆動開発の概要（@t_wadaさん）
- FizzBuzz問題使ってのTDD実践ライブコーディング（@t_wadaさん）
- 合間やYouTube Liveでの質疑応答

※Twitterで[#tddbc](https://twitter.com/hashtag/tddbc?src=hashtag_click&f=live)で検索すると参加された方のツイートが見れますので、内容について覗いてみることをおすすめします。

## 学んだこと
### TODOをテスト容易性が高い&重要度が高いで並べられるよう分解して整理すること
- TDDのサイクルについては知っていたが、最初のステップでTODOをつくるっていうのがかなり重要で、いかにテストしやすく分割していくかのを、解説と一緒に考えを追えたのが非常によきでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63564/66e70d89-3a37-c641-5716-019059a887eb.png)

- このTODOに落とし込む、分割する部分は@t_wadaさんいわく、「スキル」だそうで、練習すれば身に付けられるものとのこと。
- じゃあ、どうやって練習すればいいんだろう？とYouTube Liveで質問してみたら以下回答がありました
    - 実際にTDDを実践してFBをもらう（ワークショップに参加するとか）
    - [Mikadoメソッド](https://www.slideshare.net/KyonMm/wewlcjp/35)を読む
- 経験を積むのと、設計の本などを読んで理論を学ぶルート両方が有効とのこと
    - 設計に関する本としてRobert C.Martinの[Clean Architecture 達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/dp/4048930656/ref=cm_sw_r_tw_dp_x_kipjFbQZA5AJA)も挙げておられました。
- Twitterにもまとめてみたのでよろしければいいね！とかRTしてもらえると喜びます。Mikadoメソッドはこのあと読む読む。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">タスクの分解・整理について運営の方より回答いただいたのでこちらにも書いておきます。<br>・ワークショップに参加してFBもらう<br>・Mikadoメソッド<a href="https://t.co/1xWZduAT1f">https://t.co/1xWZduAT1f</a><a href="https://twitter.com/hashtag/tddbc?src=hash&amp;ref_src=twsrc%5Etfw">#tddbc</a></p>&mdash; Captain Blue (@captain_blue210) <a href="https://twitter.com/captain_blue210/status/1289382478805786624?ref_src=twsrc%5Etfw">August 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
- やっぱり、フィードバックもらえるの大事だよねということで今度はワークショップにも参加したい。

### 「テストは動作するドキュメント」とはどういうことかの実例を知ることができた
- 「テストは動作するドキュメント」みたいなのって本とかにも書いてあるけど、具体的にどういうテストが動作するドキュメントなのかはっきりとしたイメージは持てていなかったのがわかりました。
- 以下、アーカイブのスクショなんですが、仕様のツリー構造とテストのツリー構造が一致しており何をしたいのかが明確にわかります。しかもテストはコードなのでどう使うのか、どういうケースだと何を返すのかを動かして確かめることができると。確かにこれは「動作するドキュメント」ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63564/3953de22-2344-7b9d-9233-b0e25fd369f5.png)
- アーカイブだと[この辺](https://youtu.be/Q-FJ3XmFlT8?t=8014)の前後で触れている部分
- 現場でここまでできるのか、テストフレームワークによっては階層構造を表現できないなどはあるものの、これは非常にインパクトありました。

## これからやること
- 適切にTODOを分割してテスト&実装を進められるように数をこなす
- TDD Boot Campに参加してフィードバックもらうようにする
- 教えていただいたMikadoメソッドを読んでQiitaにあげる
- クリーンアーキテクチャ読む

TDD、最初はこんな理由で勉強始めたのですが、私の会社ではテストコードがなく個人開発で試していたのですが書いたり書かなかったりだったので、もっとちゃんとテスト書こうと思いました・・・
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">TDDに興味もったのが、この細かくアップデートを繰り返しつつ実装を進めるところで、物事を複雑に考えすぎてしまう傾向があるのを矯正するのによさげだったからなんだよな<a href="https://twitter.com/hashtag/tddbc?src=hash&amp;ref_src=twsrc%5Etfw">#tddbc</a></p>&mdash; Captain Blue (@captain_blue210) <a href="https://twitter.com/captain_blue210/status/1289377167030104064?ref_src=twsrc%5Etfw">August 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
PHPの超雑な開発環境を作る

```zsh
$ cd ~/sample_app
$ php -S localhost:3000
Listening on http://localhost:3000
Document root is /Users/your_name/sample_app
Press Ctrl-C to quit.
```
```sample_app/index.php
hello world
```
http://localhost:3000 にアクセスしてhello worldを確認
No such file or directory: 'chromedriver.exe'を解決する

```
% brew tap homebrew/cask 
% brew install chromedriver  
```

それで、

[seleniumを使用しようとしたら、「"chromedriver"は開発元を検証できないため開けません。」と言われた](https://qiita.com/apukasukabian/items/77832dd42e85ab7aa568)
docker-composeコマンドメモ


毎回忘れるのでメモ
参考ドキュメントはこちら https://docs.docker.jp/compose/toc.html

### 起動

```
$ docker-compose up
```

### 停止
プロジェクトのディレクトリ (docker-compose.yamlのある場所) で下記コマンド実施

```
$ docker-compose down
```
WPFで別ウィンドウを呼び出した時、別ウィンドウのタブ切り替えを指定したい

#やりたいこと
- メインウィンドウ
- サブウィンドウ
- サブウィンドウはタブ切り替えを持つ

メインウィンドウからサブウィンドウを開くとき、サブウィンドウのどのタブを開くのか指定したい

#準備
メインウィンドウとサブウィンドウを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301115/9521b1ed-4516-7f59-a22c-5432f56faefc.png)

```xml:MainWindow.xaml
<Window><!-- ここは省略 -->
    <Grid>
        <StackPanel Margin="20">
            <Button Name="BtnA" Margin="20">SubWindow タブ AAA を開く</Button>
            <Button Name="BtnB" Margin="20">SubWindow タブ BBB を開く</Button>
            <Button Name="BtnC" Margin="20">SubWindow タブ CCC を開く</Button>
        </StackPanel>
    </Grid>
</Window>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301115/cbb5eb61-7777-59fb-bb03-d5afdd5eeb64.png)

```xml:SubWindow.xaml
<Window><!-- 省略 -->
    <Grid>
        <TabControl Margin="20">
            <TabItem Header="AAA" Name="AAA">
                <StackPanel>
                    <TextBox Margin="50">タブAAAです</TextBox>
                </StackPanel>
            </TabItem>
            <TabItem Header="BBB" Name="BBB">
                <StackPanel>
                    <TextBox Margin="50">タブBBBです</TextBox>
                </StackPanel>
            </TabItem>
            <TabItem Header="CCC" Name="CCC">
                <StackPanel>
                    <TextBox Margin="50">タブCCCです</TextBox>
                </StackPanel>
            </TabItem>
        </TabControl>
    </Grid>
</Window>
```
#内容
タブ切り替え用のカウンタ変数を扱うクラス TabChange を用意します

```cs:TabChange.cs
public class TabChange
    {
        public static int tabChange;
    }
```

次はメインウィンドウの処理。ボタンを押すとタブ切り替え用のカウンタ変数 tabChange の値が変わります。

```cs:MainWindow.xaml.cs
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void BtnA_Click(object sender, RoutedEventArgs e)
    {
        TabChange.tabChange = 0;
        SubWindow sw = new SubWindow();
        sw.Show();
    }

    private void BtnB_Click(object sender, RoutedEventArgs e)
    {
        TabChange.tabChange = 1;
        SubWindow sw = new SubWindow();
        sw.Show();
    }

    private void BtnC_Click(object sender, RoutedEventArgs e)
    {
        TabChange.tabChange = 2;
        SubWindow sw = new SubWindow();
        sw.Show();
    }
}
```
次はサブウィンドウの処理。ウィンドウが生成された時のtabChangeの値によって、タブを選択します。

```cs:SubWindow.xaml.cs
/// <summary>
/// SubWindow.xaml の相互作用ロジック
/// </summary>
public partial class SubWindow : Window
{
    public SubWindow()
    {
        InitializeComponent();
        if (TabChange.tabChange == 1)
        {
            BBB_select();
        }
        if (TabChange.tabChange == 2)
        {
            CCC_select();
        }
    }
    public void BBB_select()
    {
        //BBBタブを選択状態にする
        BBB.IsSelected = true;
    }
    public void CCC_select()
    {
        //CCCタブを選択状態にする
        CCC.IsSelected = true;
    }
}
```
#あとがき
「ウィンドウを開いてタブを選択する」メソッドを僕が知らないだけでしたらすみません。
まだまだ初心者なので、コード自体の書き方、qiitaへの文の書き方でこうしたらもっと読みやすくなる、良くなる、というご指摘がありましたら是非お願い致します。
仮置きでゴリ押しする、イラストロジック解析アプリ

## はじめに
**iOS** / **Android** で動作する解析アプリを作りました。
邪道なことは重々承知していますが、イラストロジック雑誌の難問が解けないのは悔しいので。

**↓ 実行例**
![ss_50x50](https://user-images.githubusercontent.com/13220051/89090909-d51ffd80-d3e0-11ea-9c7b-0fff8ad0e68e.gif)

## プロジェクト
プロジェクトは ↓ こちら。
[https://github.com/hakumai-iida/IllustLogicAnalyzer](https://github.com/hakumai-iida/IllustLogicAnalyzer)

## 仮置き

このアプリは解析に行き詰まると、まだ埋まっていないマスに仮置きして解析を続行します。

例えば、あるマスを「黒」と仮定して解析をすすめた結果、ロジックに矛盾が生じたとします。
ロジックが成り立たないということは「起点となったマスは黒であってはならない」ということがわかります。
言い換えると「起点となったマスは白である」となるわけで、仮置きした「黒」を「白」に反転確定させて解析を進めます。

仮置き中に行き詰まると、さらに仮置きをします。
もし、延々と仮置きをしていって全てのマスが矛盾なく埋まった場合は、仮置きが全て正しかったとしてロジッククリアとします。

**↓ 仮置きでゴリ押しする様子（仮置きを起点としたマスはムラサキ色で表示）**
![ss_45x45](https://user-images.githubusercontent.com/13220051/89090902-ca656880-d3e0-11ea-9699-eca46d80ea74.gif)
ヨシ！
HTTPSかつWWWなしにアクセスを限定する(URLの書き換えとリダイレクト利用)

# 文中の表記について

リンクになってしまうのを防ぐため、URLのプロトコル部分(`http(s)`)の先頭の"h"は全角"Ｈ"に置き換えています。

# やりたいこと

久しぶりに設定して頭がこんがらがったのでメモ

やりたいことは、あるサイトへのアクセスをURLを書き換えて(Rewrite)して、リダイレクトして以下に限定すること。
(個別の記載はあるけどまとまったのがない)

* HTTPS限定
* WWWなし

ドメインを`yourdomain.jp`とした場合、以下のようにしたい。

| 元のURL | リダイレクト後 |
|:--|:--|
| Ｈttp://www.youdomain.jp  | Ｈttps://youdomain.jp  |
| Ｈttps://www.youdomain.jp  | Ｈttps://youdomain.jp  |
| Ｈttp://youdomain.jp  | Ｈttps://youdomain.jp  |
| Ｈttps://youdomain.jp  | Ｈttps://youdomain.jp<br>リダイレクトなし |

# 設定

`apache2.4`の`httpd.conf`での記述です。

ポイントは、★で囲んだ`https + wwwあり(https://www.yourdomain.jp)`のアクセス。
ここで、この元URLに対応したSSL証明書を設定する必要があります。(wwwありとwwwなしはそれぞれ異なる証明書が必要であるため)
SSL証明書設定がなくても、リダイレクト先のSSL証明書を指定してもブラウザが警告発出してしまいます。

```conf:httpd.conf
<VirtualHost *:443>
  ServerName yourdomain.jp
  SSLEngine on
  SSL設定(ファイル参照)を記述
</VirtualHost>

<VirtualHost *:80>
  ServerName www.yourdomain.jp
  RewriteEngine on
  RewriteRule .* Ｈttps://yourdomain.jp%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
  ServerName www.yourdomain.jp
  RewriteEngine on
  RewriteRule .* Ｈttps://yourdomain.jp%{REQUEST_URI} [R=301,L]
  ★SSLEngine on★
  ★SSL設定(ファイル参照)を記述★
</VirtualHost>

<VirtualHost *:80>
  ServerName yourdomain.jp
  RewriteEngine On
  RewriteRule .* Ｈttps://yourdomain.jp%{REQUEST_URI} [R=301,L]
</VirtualHost>

```
ネットワークの勘どころ ～IGP編～

##[前回](https://qiita.com/FugitHora812/items/40fead1a2d0c10ca70ed)のハイライト
>「あかん…ルーティングプロトコルがややこしすぎる…」
>
>「そういう「ややこしい」プロトコルは階層的に把握するっちゅうことが大事や」
>
>
>
>    - IGP : Interior Gateway Protocol
>        - RIPv2 : Routing Information Protocol version2
>        - OSPF : Open Shortest Path Fast
>        - EIGRP : Enhanced Interior Gateway Routing Protocol
>
>    - EGP : Exterior Gateway Protocol
>        - BGP : Border Gateway Protocol
>
>「わ、わかりやすい…」
>「主なIGPは３つありますけど」
>「どれがどう違うんです？」
>「ふふふ…それはな…」
>「次回のお楽しみや…！」

#IGPのポイント

「よっしゃ、ほなIGPをざっくり説明していくで」
「ポイントは**ルーティングアルゴリズム**と**メトリック**の２つや」
「ほお」

##ルーティングアルゴリズム
「まず、押さえといてほしいんが**ルーティングテーブル**や」
「テーブル…表ですか？」
「せや」
「ルータの中には宛先IPアドレスの参照先になる**宛先ネットワーク**と」
「**ネクストホップ**って呼ばれる、宛先までの経路上にある自分の隣接機器のIPアドレス」
「この２つが管理されとる」
「それを管理するための表がルーティングテーブルや」
「ははあ」
「ほんで**ルーティングアルゴリズム**っちゅうんは」
「ルーティングテーブルをどう作るか、っていうルールを表しとる」
「なるほど…！」
「そのアルゴリズムがプロトコルごとに違うってことですか」
「まあそういうことや」
「具体的にはRIPv2が**ディスタンスベクタ型**、OSPFが**リンクステート型**、EIGRPは**拡張ディスタンスベクタ型**って呼ばれるルールを使っとる」
「詳しいことは[このサイト](https://www.n-study.com/iprouting/algorithm/)がわかりやすいで」
「ほんまですか」
「ほな後で見ときます」

##メトリック

「ほんでもう1つのポイントは**メトリック**や」
「これは**宛先ネットワークまでの距離**を表しとる」
「距離…何kmとかですか？」
「うんにゃ、そうやない」
「ここでいう距離っちゅうのは**ネットワークにおける論理的な距離**のことや」
「具体的な算出方法はプロトコルによって違うんやけどな」
「例えばEIGRPやったら「10000×最小帯域幅(Mbps)」と「遅延(マイクロ秒)÷10」とを足して256をかけたものがメトリックになる」
「ほお」
「プロトコルによってメトリックの算出のやり方が違うんやったら」
「**プロトコルをまたいでメトリックを単純に比較することはできない**ってことですね？」
「せやな」
「そういうときは**「アドミニストレイティブディスタンス」をメトリックで割る**ってことをするんやけど」
「[この記事](https://www.n-study.com/iprouting/administrative-distance/)にわかりやすく書いとるからここでは詳しくは言わんとくわ」
「ほなこれも後で見ときます」
「ありがとうございます(*´ω｀)」

##参考

- みやたひろし『ネットワーク技術＆設計入門』(SB Creative)
- [ネットワークのおべんきょしませんか？](https://www.n-study.com/)
Python手遊び(割り算)

#この記事、何?
一言だけ投稿しようかと思って書いてみた。
一言でいうと、割り算の整数解が欲しければ「//」か「divmod」を使おうという話。


#事例
数を100で割って整数を得る。

##修正前のコード
~~~py
result = int(value / 100)
~~~

まあ、たいていの場合はこれで動く。
ただ、おっきい数でNG。

##NGの事例
~~~py
>>> 38030123828366199/100
380301238283662.0
~~~

ね?わかりやすい。

##修正後のコード
~~~py
result = value // 100
~~~

##OKの事例
~~~py
>>> 38030123828366199 // 100
380301238283661
~~~

で、境目が見てみたくなった。

~~~py
>>> 38030123828366199/100
380301238283662.0
>>> 38030123828366198/100
380301238283662.0
>>> 38030123828366197/100
380301238283662.0
>>> 38030123828366196/100
380301238283661.94
>>> 38030123828366195/100
380301238283661.94
>>> 38030123828366194/100
380301238283661.94
>>> 38030123828366193/100
380301238283661.94
>>> 38030123828366192/100
380301238283661.94
>>> 38030123828366191/100
380301238283661.94
>>> 38030123828366190/100
380301238283661.9
>>> 38030123828366189/100
380301238283661.9
~~~

なるほど、わかりやすい。
末尾のビットの気分次第でとびとびの値をとってる。そりゃそうだ。

浮動小数の保持できる限界間際の数が偶数ばかりになるというのと同じですね。
計算精度をちゃんと意識しましょう。。。
PowerQuery で階層構造のヘッダーを持つテーブルをピボット解除 V1

#はじめに
階層構造のヘッダーを持つテーブルをピボット解除する方法です。この記事を描いた後に[**もう少しシンプルな方法**](https://qiita.com/reisyu/items/5a1fce07403f5ebd2d1e)を見つけたのですが試行錯誤の記録としてこの記事も残します

#やりたいこと
ヘッダーがこんな感じで階層構造になっている表に出会いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b3a2b219-d5c0-3f29-e837-62bde458a207.png)
Power Query を使ってこの表をピボット解除してこういう形に持っていきたいと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/16280733-ca67-73aa-a837-97ad432b52ed.png)

#手順
## スタートの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/7537b8af-7d71-bfbc-6b4f-6bd9632b7b4e.png)


##担当者ごとに「目標」の列と「実績」の列とをマージする
区切り記号はコロンにしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/caadb3f5-8fae-cea5-9d3c-8732701cfd67.png)

##フィル > 上で 空白を埋める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/9b986c49-0106-43bd-79ec-96361b0aaf5d.png)

##1行目をヘッダーにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/48a70715-91b8-5e01-ed98-13c6cd7ce634.png)

##ピボット解除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a2c5f38c-b192-e12d-84f2-0e14ea56a3a3.png)

##不要な行をフィルタで除外する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/83df951c-2e46-420a-9139-f4a712fbc11f.png)

##列を分割する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a04b8dcd-3e03-4869-cb95-e5ef84a1e32c.png)

##ヘッダー名を整理して氏名の後ろのコロンを置換で取り除いて完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/16280733-ca67-73aa-a837-97ad432b52ed.png)

#まとめ
列の結合 > ピボット解除 > 列の分割 という手順で階層構造のヘッダーを持つテーブルのピボット解除ができました！
JavaScriptで２つのJSONな配列の差分を抽出する

JSONの形で与えられた２つの配列を比較して、差分を抽出したい場合があります。

```javascript
arr1 = [
  {LawName: "民法", LawNo: "明治二十九年法律第八十九号"},
  {LawName: "商法", LawNo: "明治三十二年法律第四十八号"},
  {LawName: "刑法", LawNo: "明治四十年法律第四十五号"},
  {LawName: "砂防法", LawNo: "明治三十年法律第二十九号"},
  ...
];
arr2 = [
  {LawName: "民法", LawNo: "明治二十九年法律第八十九号"},
  {LawName: "商法", LawNo: "明治三十二年法律第四十八号"},
  {LawName: "砂防法", LawNo: "明治三十年法律第二十九号"},
  ...
];
```
配列の差分が欲しければ、`Array.prototype.filter()`と`Array.prototype.includes()`を組み合わせて抽出することが考えられる…のですが、うまくいきません。
→ 参考：[js 二つの配列の差分を求める
](https://qiita.com/may88seiji/items/b8fe10ebd33c0cdaf601) 

```javascript:失敗例
arr1.filter(item => arr2.includes(item)); // return []
```
`arr1[0]`と`arr2[0]`は一見同じに見えますが、参照しているものが違うので、Array.prototype.includes()では「同じものは含まれていない」という扱いになってしまうわけですね。
（ちゃんと調べたわけではないですが、Javaのようにequals()をオーバーライドするやり方もできなさそうです。`Array.prototype.sort()`のように比較関数を指定できれば良いのですが…。）

`filter()`の中でオブジェクトが同値であるかを判定するコードをゴリゴリ書く、というのも一つの手段です。しかし、arr1の全ての要素についてarr2の全ての要素と比較するとなると、計算量が２つの配列の積になりそうな気がして嫌な感じです。

#文字列にして検索する
連想配列同士の比較には、文字列にして比較する、という手があります。（型を持つオブジェクトだと良くない気はしますが、今回は元がJSONだからへーきへーき。）
そこで、比較対象`arr2`の配列を文字列にした上で、`arr1`の各要素について、その要素の文字列表現が`arr2`の文字列表現に含まれているかどうかによって`filter()`してみましょう。

```javascript:成功例
var str_arr2 = JSON.stringify(arr2); //配列arr2の文字列表現
arr1.filter(item => str_arr2.indexOf(JSON.stringify(item))<0 ); //itemの文字列表現を検索。
// -> [{LawName: "刑法", LawNo: "明治四十年法律第四十五号"},...]
```
→ 実装例：[法技研六法：法令更新内容](http://roppou.azurewebsites.net/static/diff.html)
ということで、法令リストの更新に対し、更新内容を表示できるようになりました。
Enjoy!
JavaScriptで正規表現にマッチしない部分を置換する

## はじめに

JavaScriptには文字列置換の方法として [``replace()``](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace) がありますが、これは正規表現に「マッチした部分」しか置換できません。では以下の場合どうすればいいでしょうか？

> 文字列をHTMLエスケープせよ。ただし文字列中の文字参照はエスケープしてはならない。

ここで文字参照とは

 - 文字実体参照 (``&copy;`` など)
 - 数値文字参照 (```&#9834;```、``&#x266A;``など)

を指し、HTMLエスケープは ```escapeHTML()``` で行えるものとします。

例えば、

```
"&copy;<&#9834;&#x266A;>"
```
は

```
&quot;&copy;&lt;&#9834;&#x266A;&gt;&quot;
```
に置換されます。

## マッチする部分の正規表現

文字参照の正規表現は、```/&\w+;|&#\d+;|&#x[0-9a-fA-F]+;/``` と表せますので、マッチする部分を置換するのであれば簡単です。例えば文字参照をそれが指す実際の文字に置き換えるのなら、

```javascript
    const str = "&copy;<&#9834;&#x266A;>";
    str.replace(/&\w+;|&#\d+;|&#x[0-9a-fA-F]+;/, toChar)
```
のようにすればよいでしょう。(ただし文字参照を実際の文字に変換する関数``toChar()``は別途要定義)

## マッチしない部分の正規表現

マッチしない部分の正規表現が書ければ問題は解決ですが、ネットで探しても例がなく、なかなか難しそうです。**マッチしない部分 + マッチした部分** の正規表現であれば、

```
    /(?:(?!${pattern}).)*(?:${pattern})?/g
```
と書けますので、これを利用することにします(上記はPerl風に正規表現に変数展開していますが、javascriptではこれはできないので一工夫必要です)。実際のケースでは「マッチする部分とマッチしない部分をそれぞれ置換する」という局面が多いのですが、それにも対応できそうです。

**マッチしない部分 + マッチした部分** が取得できれば、次は

```
    /^(.*?)(${pattern})?$/
```
で、**マッチしない部分** と **マッチした部分** に分けることができます。


## JavaScriptでの実装

これを実際にJavaScriptで実装すると以下のようになるでしょう。

```JavaScript
    const pattern = "&\\w+;|&#\\d+;|&#x[0-9a-fA-F]+;";
    const regexp1 = new RegExp(`(?:(?!${pattern}).)*(?:${pattern})?`,'gi');
    const regexp2 = new RegExp(`^(.*?)(${pattern})?$`,'i');

    function replace(str = '') {
        let rv = '';
        for (let chunk of str.match(regexp1)) {
            let [ , u, m ] = chunk.match(regexp2);
            if (u) rv += unmatch ? unmatch(u) : u;
            if (m) rv += match   ? match(m)   : m;
        }
        return rv;
    }
```
``pattern`` は文字列リテラルですので、``\``が2つ必要なことに注意してください。
``match()`` はマッチしたとき、``unmatch()`` はマッチなかったときの置換関数です。

## モジュール化

この問題は度々発生するのでモジュール化しておきましょう。

```replacer.js
module.exports = function(pattern, match, unmatch, opt = '') {

    const regexp1 = new RegExp(`(?:(?!${pattern}).)*(?:${pattern})?`,'g'+opt);
    const regexp2 = new RegExp(`^(.*?)(${pattern})?$`,opt);

    return function(str = '') {
        let rv = '';
        for (let chunk of str.match(regexp1)) {
            let [ , u, m ] = chunk.match(regexp2);
            if (u) rv += unmatch ? unmatch(u) : u;
            if (m) rv += match   ? match(m)   : m;
        }
        return rv;
    }
}
```
元々の問題は、

```JavaScript
    const str = "&copy;<&#9834;&#x266A;>";
    const replace
            = require('./replacer.js')("&\\w+;|&#\\d+;|&#x[0-9a-fA-F]+;",
                                       null, escapeHTML, 'i');
    replace(str);
```
で解くことができます。
Pythonでスクレイピング(準備)

スクレイピングを触ってみようと思いPythonのBeautifulSoupを使ってみる。
とりあえず今回は準備から

#使用するもの
・Python3.6
・BeautifulSoup4
・Anaconda

#仮想環境の構築
仮想環境の構築から

```cmd
conda create --name [環境名] python=[version]
```

実際に構築
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588477/845dc1b8-f038-b61f-05b5-b602f0473e75.jpeg)
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588477/ba08ec68-93a6-3cec-e43f-0a762e711f7c.jpeg)

色々ダウンロードされて終了

#BeautifulSoupのインストール

```cmd
pip install beutifulsoup4
```

上記のコマンドでインストールする

![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588477/43628327-f83b-3fa9-1ac5-08af21522ec1.jpeg)
先ほど作成した仮想環境に入り、インストール
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588477/4056183a-ed90-0b2b-fd31-27d934a59715.jpeg)
インストールされたか下記コマンドで確認

```cmd
pip list
```

![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588477/7b9e213e-b4e5-4d07-d61f-db2bb26d95e4.jpeg)

インストールされたことが確認できたので今回はここまで

次は実際に簡単にですが使ってみます！

[Pythonでスクレイピング(データ取得)](https://qiita.com/h1r0_1126/items/0cd010e90939cc31560f)
Goでソースコードを画像化するCLIを作った

こんにちわ
ゴリラです

普段、Twitterでたまにこういうふうにソースコードの画像を貼り付けることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/4bf71de8-abd8-ffee-27e5-af3968bbe859.png)

画像を作るのに[carbon](https://carbon.now.sh/)というサービスを使っています。
このサービスできれいな画像を生成できますが、インターネットとブラウザなしでは使えないためちょっと不便と感じています。
また、[slicon](https://github.com/Aloxaf/silicon)というrust製のツールもありますが、これもcarbonと同様の制限があります。
そこで、ブラウザやネットを使用せずCLIでソースコードを画像化できたら良いなと思いCLIを作りました。

<a href="https://github.com/skanehira/code2img"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/skanehira/code2img.png" width="460px"></a>

## どんな感じ
こんな感じでpngファイルを出力できます。外部ツール依存無しでGoだけで動くのでインターネットもブラウザも必要ないです。

![](https://i.imgur.com/TjoOQct.gif)

## 使い方
2通りあります。ソースコードを標準入力で渡すか、ファイルを渡すかです。

```sh
$ code2img
code2img - generate image of source code

Version: 1.1.0

Usage:
  $ code2img -t monokai main.go main.png
  $ echo 'fmt.Println("Hello World")' | code2img -ext go -t native -o sample.png
  $ code2img -c main.go

  -t    color theme(default: solarized-dark)
  -o    output file name(default: out.png)
  -c    copy to clipboard
  -ext  file extension
```

ファイルの場合はオプションなくても使えます。カラースキーマを指定したい場合は`-t`を使用します。
使用可能なカラースキーマは[こちら](https://xyproto.github.io/splash/docs/all.html)、サポートしている言語一覧は[こちら](https://github.com/alecthomas/chroma#supported-languages)を参照ください。

`-c`で画像をファイルではなくクリップボードにコピーします。そのままツイートに貼り付けたいときに使用すると便利です。

## 実装
処理の流れは大まかと次になります。

1. コードをトークナイズして、トークンごとに色を情報をつける
2. トークンを1文字ずつpngに書き込む

ソースコードをトークナイズしてトークンごとに色(RGBA)をつけますが、ここをスクラッチで多言語に対応するのは骨が折れるので、素直に[github.com/alecthomas/chroma](https://github.com/alecthomas/chroma)というライブラリを使用しました。

このライブラリを使えば、2の処理だけを書けば済みます。

2の処理は大まかに次になります。

1. 文字を描画するfontを読み込み
2. 座標を計算しつつ、1文字ずつ描画する

fontに関してはマルチバイト対応の[Cica](https://github.com/miiton/Cica)を[github.com/jessevdk/go-assets](https://github.com/jessevdk/go-assets)で埋め込んでいます。
そのためCLIのサイズが倍くらい増えましたが、致し方ない…

文字描画の処理は次になっています。この`iterator.Tokens()`がtoken情報を返してくるので、
tokenの種類から`style.Get()`で色情報を取得しています。その後、1文字ずつpngに書き込んで、座標を計算して…を繰り返します。

ここでポイントですが、マルチバイトの場合は座標は +2 しないと文字が重なって読めなくなります。なので1文字の長さを確認して必要あればx座標を +2 しています。これでマルチバイトでも問題なく描画されます。

```go
for _, t := range iterator.Tokens() {
	c := style.Get(t.Type).Colour
	dr.Src = image.NewUniform(color.RGBA{R: c.Red(), G: c.Green(), B: c.Blue(), A: 255})

	for _, c := range t.String() {
		if c == '\n' {
			x = fixed.Int26_6(padding)
			y++
			continue
		} else if c == '\t' {
			x += fixed.Int26_6(padding)
			continue
		}
		dr.Dot.X = fixed.I(10) * x
		dr.Dot.Y = fixed.I(20) * y
		s := fmt.Sprintf("%c", c)
		dr.DrawString(s)

		// if mutibyte
		if len(s) > 2 {
			x = x + 2
		} else {
			x++
		}
	}
}
```

## エディタと連携
~~標準入力に対応しているので、Vimなどのエディタと連携してサクッと画像化出来ます。~~
[code2img.vim](https://github.com/skanehira/code2img.vim)というプラグインを作りました。

![vim-code2img.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/fb37eb6f-fb51-8666-af58-bd200229568b.gif)

## さいごに
依存なしでソースコードを画像に変換できるので、ぜひ試してみてください。エディタとも連携できて便利です。
RubyのHashのメモ

[リファレンス](https://docs.ruby-lang.org/ja/latest/class/Hash.html)
rubyのhashがPythonの辞書と混ざって混乱してたときの自分用のメモです。
間違え等あったらコメントしてくださると幸いです。
# 環境
`ruby 2.7.1`
# 定義
## 下記すべてで定義できる  
訂正コメント下さりありがとうございます。

```ruby:irb
# 文字列 と =>
hash1={"first"=>"いち"}

# シンボル と =>
hash2={:first=>"いち"}

# キーがシンボルの場合の省略した書き方
# (:"first"→:first というシンボルができる)
hash3={"first":"いち"}

# キーがシンボルの場合の省略した書き方
hash4={first:"いち"}
```

## 当然これはできない
```ruby:irb

#シンボル と :
hash5={:first:"いち"}
=>syntax error
```

## 中身は異なっている
- hash1 → 文字列がキー
- hash2,3,4 → シンボルがキー

```ruby:irb
# hash1
{"first"=>"いち"}

# hash2,3,4
 {:first=>"いち"}
```

## 呼び出すときは
```ruby:irb
hash1["first"]
hash2[:first] #hash2,3,4共通
```

# 付録
## 気をつけないと間違えそう
Pythonのつもりで書くとやらかしそう... 

```ruby:irb

hoge="second"
hash5={hoge:2,hoge=>2}
#=> {:hoge=>2, "second"=>2}
```
【アルゴリズム】Xだけ間隔がのあるN個の数字

# 問題説明
メソッドsolutionは整数xと自然数nのパラメータを受け取り、xから初めてxずつ増加する数字をn個もつリストをリターンします。
次の条件を見ていただき、条件を満足させるメソッドsolutionを作成してください。

# 条件
- xは-10000000以上、10000000以下の整数である。
- nは1000以下の自然数である。

# 入出力の例
| x       |       n |    result    |
|:-----------------|------------------:|:------------------:|
| 2|              5|        [2,4,6,7,10]|
| 4|            3|        [4,8,12]|
| -4|              2|         [-4,-8]|

# 解説
※解説は私が作成したコードなので、もっといいアルゴリズム等々ありましたら、共有してください！

```java

class Solution {
    public long[] solution(int x, int n) {
        long[] result = new long[n];
        result[0] = x; // xから初めるので、Index 0にxを初期化
        
        // 上記で0番は初期化したので、iは1からスタートし、nまで繰り返し
        for (int i = 1; i < n; i++) {
            // xずつ増加していくので、resultのIndex：i - 1の値 + xを行う。
            result[i] = result[i - 1] + x;
        }
        
        return result;
    }
}
```
JS 入力表示リスト

JSでテキストボックスに入力してボタンを押すと下にリスト表示。

すぐに忘れるので覚書しています。
もっといい方法があればコメント頂けたらありがたいです。

```js

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>JS入力表示リスト</title>
</head>
<body>

<form name="form01">
<p>メッセージを入力してください</p>
<input type="text" id="message" name="message" size="40">
<input type="button" id="btn" value="OK" />
</form>
<ul>
</ul>

<script>
window.onload = function(){
    document.getElementById('btn').onclick = function(){
      var name = document.form01.message.value;
      console.log(name);
      const item2 = document.createElement('li');
      item2.textContent = name;
      const ul = document.querySelector('ul');
      ul.appendChild(item2);
    };
};
</script>

</body>
</html>
```
Windows 10 環境で接触式 IC カードリーダーライター HX-520UJ を導入する

急遽接触式 IC カードリーダーライターが必要となったので、手元にあった 2008 年 12 月発売（！）の日立 HX-520UJ.K を Windows 10 端末に接続してみました。ところが PnP ではドライバがインストールされず、付属のCDに入っているドライバも動作しませんでした。

[ユーザサポート](https://www.hitachi.co.jp/Prod/comp/ic-card/support/index.html)を訪問したところ、`HX-520UJ.K/HX-520UJ.J(本体型式：M-520U）リーダライタドライバはWindows8および10をサポートしておりません。` という表記がありました。12 年も前の HW ですから無理もありません。しかし [ISO 7816](https://www.ipa.go.jp/security/enc/smartcard/node16.html) に変化があったわけではないので、対応ドライバさえ手に入ればまだ利用できるはずです。どうにかできないものか。

## 同型カードリーダーライターからドライバを流用する

HX-520UJ.K および HX-520UJ.J の形式番号は M-520U とされています。実は M-520U という形式番号を持った同型のカードリーダーライターはほかに二点存在しています（いずれも販売終了）：

* [マクセル MR-520UJ](https://biz.maxell.com/ja/security_peripherals/mr-520uj.html)
* [三菱電機インフォメーションシステムズ MM-520U](https://www.mdis.co.jp/service/mm-520u/download.html)

これらの商品は **OEM 元/先の関係にある**と推測できます。根拠となるのは HX-520UJ.K に付属するのドライバの著作権がマクセル精器株式会社にあることです。マクセル精器は日立マクセル（現・マクセル）傘下で IC カードリーダーライターなどを開発していた企業です。[^1] [^2] [^3]

[^1]: [マクセル精機は日立マクセルに吸収され、現存しません。](https://www.maxell.co.jp/news/pdf/maxell_news120123_1.pdf)

[^2]: [マクセル精機 WEB サイトの WebArchive には MR-500UJ / MR-520UJ が記載されており、当時は HW もマクセル精機から発売されていたことがわかります。](https://web.archive.org/web/20120510051014/http://www.maxei.co.jp/products/ic_card_rw/mr-500_520uj/index.html)

[^3]: MDIS に卸されていた理由はわかりませんでしたが、現在提供されているドライバの製造元は日立マクセル表記でした。

![hitm500u.sys.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/dc3cb591-4b94-1d7f-69f1-451255e8b5ff.png)


上記リンクから MR-520UJ および MM-520U のサポートサイトにアクセスすることで、 Windows 10 に対応したドライバ（バージョン1.0.1.4）を入手できます。[^4]

[^4]: MR-520UJ のサポートページでは Windows 10 対応は謳われていませんが、MM-520U 提供のドライバとバージョン番号は同じです。

## インストール時の注意点

[MM-520U のドライバインストールマニュアル](https://www.mdis.co.jp/service/mm-520u/install_mm520u.pdf)は非常に親切で、Windows 10 でのインストール手順も詳細に記載されています。いずれのドライバを利用するにせよ、このマニュアルを参照するとよいでしょう。[^5]

[^5]: マニュアルでは PnP でドライバがインストールされるような記載がありましたが、自分の環境では再現しませんでした。

気を付ける必要があるのは、ドライバをインストールしても Windows の Smart Card サービスは自動起動に設定されないことです。Smart Card サービスが実行されていない場合、HX-520UJ.K に IC カードを挿入しても認識されません。

また、スリープ時に HX-520UJ.K 接続が接続されていると、スリープからの復帰に失敗することがありました。これはドライバを無理やりあてたことに起因するものではなく、サポートされていたころからある既知の不具合です。

最後に、この記事は動作確認情報を共有するものであり、サポートされていない環境・ドライバでの利用を推奨するものではありません。

## 参考リンク

* [マイナンバーカードでe-Tax。[HITACHI M-520U]](https://ameblo.jp/tencho82/entry-12241178365.html)
* [M-520UのWindows 8/8.1ドライバ](https://axion.sakura.ne.jp/blog/index.php?mode=show&date=20140502&view=box)
* [Windows 7でHX-520UJ.K/HX-520UJ.Jをお使いのお客様へ](http://www.hitachi.co.jp/Prod/comp/ic-card/support/popup/w7_notice.html)
RPAでキーボード入力を使って右クリックするには？

# モチベーション

pythonに限らず、RPAをやっていると、

```text
「画像認識してマウスで右クリックさせるより、キーボードのあれ使ったほうが速くない？」
```

って時があります。
ですが、その「あれ」の概念の抽象度が高く、検索しても見つかりにくいです。

また、「キーボードで右クリックできる」ということが、
どのくらい認知されているか「LGTM」数で感じられるかもしれません。

これらのことから、Qiita貢献度の高い情報と考えて記事化に踏み切りました。

# 方言

Ubuntuだと「メニューキー」
Windowsだと「アプリケーションキー」
日本語だと「右クリックメニューが出てくるキー」「コンテキストメニューが出てくるキー」
Windowsのキーボードショートカットだと「`Shift`+`F10`」

# コードサンプル

キーボード入力で右クリックメニューを出す

```py:sample.py
import pyautogui

pyautogui.hotkey('apps')
```

# おまけ

Windowsでは、ウィンドウ最大化や最小化、ウィンドウを閉じるなどの右クリックメニューは`Alt`+`Space`で出てくるらしいです。

# 原典

[PyAutoGUI | Docs](https://pyautogui.readthedocs.io/en/latest/index.html)
[PyAutoGUI | Github](https://github.com/asweigart/pyautogui)

※[アプリケーションキーが`apps`として定義されている箇所](https://github.com/asweigart/pyautogui/blob/master/pyautogui/_pyautogui_win.py)

```py:https//github.com/asweigart/pyautogui/blob/master/pyautogui/_pyautogui_win.py
'apps': 0x5d, # VK_APPS

```

# 参考

[アプリケーションキー | 出典: フリー百科事典『ウィキペディア（Wikipedia）』](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AD%E3%83%BC)

**Excelsior!**
XcodeでArchiveしようとしたらbuildはsuccessだがorganizerに現れない

iPhoneアプリの更新リリースしようと思ったらなぜか出鼻を挫かれた。
#環境
Xcode Version 11.6
MacOS 10.15.4

#現象
Product->Archiveするといつものようにbuildの時間に入る。
"Build Succeeded"の表示が出て、通常ならこのままOrganizerが立ち上がり、Archiveの履歴が表示されるはずである。
しかし表示されない。
Window->Organizerで開いて見ても今作ったものが履歴に表示されない。これいかに。

#原因
https://developer.apple.com/forums/thread/127212
↑と同じことが起きているようである。
/Users/****/Library/Developer/Xcode/Archivesまできて
この下には日付ごとのディレクトリがある。
しかし
2020-08-01だけが所有者がrootになっておりdrwxr-xr-xときた。
書き込めてないんじゃない？

#解決策
その場しのぎではあるが、2020-08-01の権限を777にするとarchiveはうまくいった。

#もしかしてだけど
明日になったらまた同じことおこる？
それは明日考えよう。
JuliaのパッケージをJupyter notebookで追加する(簡単だった)

#一応書いておく
Jupyter notebook上でJuliaのパッケージを入れてみた　下のコードでいける
pythonみたいに!とか入れる必要はなさそう
この話をしているサイトがなさそうなので書いておく

```julia:example.ipynb
using Pkg
Pkg.add("hoge")
```

#追記
コメントで教えてもらった下のコードならUsing Pkgなしでもいけた
コメントありがとうございました

```julia:example.ipynb
]add hoge
```
P5.js 日本語リファレンス(arc)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の arc関数を説明します。

## arc()

### 説明文

画面に円弧を描きます。 x、y、w、h、start、stop のみで呼び出された場合、弧は描画され 開いた円セグメントとして塗りつぶされます。mode が指定されている場合、弧は開いた半円(OPEN)、閉じた半円(CHORD)、閉じたパイセグメント(PIE)として塗りつぶされます。原点は ellipseMode() で変更できます。

弧は常に楕円の始点から終点まで時計回りに描画されます。 TWO_PI をどちらかの角度に加算または減算してもそれらがどこに描画されるかは変わりません。開始と停止の両方が同じ場所にある場合、完全な楕円が描画されます。 Y軸は下方向に増加するため、角度は正のX方向から時計回りに回転することに注意してください。

### 構文

arc(x, y, w, h, start, stop, [mode], [detail])

### パラメタ

- x
Number：弧中心の楕円のx座標

- y
Number：弧中心の楕円のy座標

- w
Number：弧の楕円の幅

- h
Number：弧の楕円の高さ

- start
Number：ラジアンで指定された弧を開始する角度

- stop
Number：ラジアンで指定された弧を停止する角度

- mode
定数：弧の描画方法を決定するパラメータ。 CHORD、PIE または OPEN(オプション)

- detail
Number：WebGLモードのみのパラメータ。これは円弧の周囲を構成する頂点数を指定するためのものです。デフォルト値は25です。(オプション)

### 例1

```javascript
function setup() {
  createCanvas(400, 400);
  colorMode(HSB, 100);
  noFill();
  
  let x = 100;
  let y = 110;
  
  ellipse(x, y, 4);  // 中心点を描画
  
  stroke(100, 100, 100);  // 赤
  arc(x, y, 150, 150, 0, HALF_PI);
  
  stroke(80, 100, 100);  // 紫
  arc(x, y, 160, 160, HALF_PI, PI);

  stroke(60, 100, 100);  // 青
  arc(x, y, 170, 170, PI, PI + QUARTER_PI);
  
  stroke(40, 100, 100);  // 緑
  arc(x, y, 180, 180, PI + QUARTER_PI, TWO_PI);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/TGz2ly_Gc

### 例2

```javascript
function setup() {
  createCanvas(300, 400);
  
  let x = 50;
  let y = 50;
  
  // mode パラメタ別に円弧を描画
  arc(x, y      , 80, 80, 0, PI + QUARTER_PI);
  arc(x, y + 80 , 80, 80, 0, PI + QUARTER_PI, OPEN);
  arc(x, y + 160, 80, 80, 0 , PI + QUARTER_PI, CHORD);
  arc(x, y + 240, 80, 80, 0, PI + QUARTER_PI, PIE);

}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/LwZkL9UBE

### 例3

```javascript
function setup() {
  createCanvas(300, 400, WEBGL);
  
  let x = -50;
  let y = -150;
  
  // detail パラメタを指定して円弧を描画
  arc(x, y      , 80, 80, 0, PI + QUARTER_PI, OPEN, 4);
  arc(x, y + 80 , 80, 80, 0, PI + QUARTER_PI, OPEN, 6);
  arc(x, y + 160, 80, 80, 0 , PI + QUARTER_PI, CHORD, 8);
  arc(x, y + 240, 80, 80, 0, PI + QUARTER_PI, PIE, 10);

}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/4gEPDcaTK

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Windows 10 on ARM 用 7-zip (19.00) を Windows 10 on ARM 上の Visual Studio 2019 (x86) でビルドする

## はじめに
前回初投稿の「[Windows 10 on ARM 用 アプリ を Windows 10 on ARM 上の Visual Studio 2019 (x86) でビルドする](https://qiita.com/Daru-IBN5100/items/10d913854bbe254460f2)」に続きまして、今回は実際に使用するレベルのアプリ・ツールをビルドしました。

さて、Windows において何をさておいても入れておきたいツールといえばなんでしょう？
そう、皆さん大好き「 7-zip 」です！（※個人の感想です。効果には個人差がありありです）

ですが残念なことに現時点では ARM64 版は配布されておりません…

x86 版で我慢すればいいじゃないという声も聞こえてきそうですが、実は WoA の弱点で、シェルエクステンションなんかはネイティブの .dll でないと呼び出しができないのです。
シェルエクステンションの使えない 7-zip なんてク◯ープを入れないコーヒーみたいなもの（歳バレ）なので、なんとかビルドできないものかと Web で情報を漁ったり試行錯誤した結果、どうにかビルドが通りましたのでここに投稿した次第です。

## ビルド
もちろん Visual Studio 2019 (x86) がセットアップ済なのは前提ですね。

まずは、こちらから 7-Zip のソースコードをダウンロードします。
[https://sevenzip.osdn.jp/download.html](https://sevenzip.osdn.jp/download.html)

作業場所へ解凍し、`.\CPP\7zip` へ移動します。

※ ソースは .7z 形式なのでとりあえず x86 版の 7-zip を使用して展開します。

コマンド ウィンドウを立ち上げます。

※ Explorer で目的のフォルダを表示して `Shift + 右クリック` → `コマンド ウィンドウをここで開く` が楽ですかね？

Visual Studio 2019 のインストール先がデフォルトならば

```
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_arm64
```

と、打ち込んで実行させて、ARM64 用のツールセット環境を準備します。

なお、`vcvarsall.bat` の詳しい使用方法は以下のドキュメントが参考になると思います。

[コマンド ラインから Microsoft C++ ツールセットを使用する](https://docs.microsoft.com/ja-jp/cpp/build/building-on-the-command-line?view=vs-2019)

あとは、

```
nmake
```

と、打ち込んで実行させれば、時間はかかりますが大きなエラーもなく無事ビルドされました。

## インストール
きちんと調べればインストールスクリプトなんかもありそうですが、今回は手抜きをして出来上がった .exe や .dll 等をとりあえず手動で集めました。(;^_^A

ファイルの場所は各モジュールフォルダ下の arm64 フォルダにあります。

※ x64 版のファイル構成を参考に
・ `Lang`フォルダ以下 → x64 版からコピペ
・ `readme.txt` → x64 版からコピペ
・ `License.txt` → x64 版からコピペ
・ `History.txt` → x64 版からコピペ
・ `7-zip.chm` → x64 版からコピペ
・ `7-zip32.dll` → x64 版からコピペ
・ `7zFM.exe` → `.\CPP\7zip\Bundles\Fm\arm64` からコピペ
・ `7z.dll` → `.\CPP\7zip\Bundles\Format7zF\arm64` からコピペ
・ `7z.sfx` → `.\CPP\7zip\Bundles\SFXWin\arm64` からコピペ
・ `7zCon.sfx` → `.\CPP\7zip\Bundles\SFXCon\arm64` からコピペ
・ `7z.exe` → `.\CPP\7zip\UI\Console\arm64` からコピペ
・ `7zG.exe` → `.\CPP\7zip\UI\GUI\arm64` からコピペ
・ `7-zip.dll` → `.\CPP\7zip\UI\Explorer\arm64` からコピペ

## 動作確認
一応、今自分が使用している範囲では ARM64 版 7-zip に不具合は出ていません。

オプション等の設定も、`7zFM.exe` を` 管理者として実行` で立ち上げれば、`シェルコンテキストメニュー` の設定も大丈夫でした。

とはいえ、フルに検証ができているわけではないので、早く公式から ARM64 版が配布されるようになるといいですね。
flutter-webでURLをつける方法

flutter-webで作成しているとwebアプリみたいにURLをつけたいことがある。

手順はシンプル

PageClassにURLを定義する

```home.dart
class HomePage extends StatelessWidget {
  //このClassのURLを以下で定義する
  static const String route = '/mypage';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ほげ'),
      ),
    );
  }
}
```
main.dartにrouteを定義する。

```main.dart
void main() {
  runApp(MaterialApp(
    initialRoute: HomePage.route,
    routes: {
      HomePage.route: (context) => HomePage(),
      LoginPage.route: (context) => LoginPage(),
    },
  ));
}
```

これでおｋ。

#がついているの気になるが・・・まあいいか。

### 参考
https://medium.com/flutter/flutter-web-navigating-urls-using-named-routes-307e1b1e2050
PYNQ > DMA tutorial: DMA to streamed interfacesを試した > 提供されたbitstream | tclから生成されるBlock Design

```txt:動作確認
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)
```

### 概要

- PYNQ_Workshopにて掲載されているDMAの実装を試した
    - 二つのDMA (read, write) + FIFO
- 提供される.bitと.tclでの動作
- Vivado 2019.1で.bitと.tclを生成した上での動作
- Block Designの設定

### PYNQ Image

- PYNQ v2.5 Imageを使用
    - [Glasgow Release](https://github.com/Xilinx/PYNQ/releases/tag/v2.5) のPYNQ-Z1 v2.5 SDCard image

### 提供される.bitと.tclでの動作

dma_tutorial.bitとdma_tutorial.tclを/home/xilinx/jupyter_notebooks/base/にscp。

```py
from pynq import Overlay
overlay = Overlay("/home/xilinx/jupyter_notebooks/base/dma_tutorial.bit")
```

上記のようにoverlayを用意して、あとはTutorial通りに実行。
https://github.com/Xilinx/PYNQ_Workshop/blob/master/Session_4/6_dma_tutorial.ipynb

### Vivado 2019.1で.bitと.tclを生成した上での動作

1. dma_tutorial.bitとdma_tutorial.tclを任意のフォルダにコピー
    - 例: `C:\pynq_proj_2020-05-23\2020-08-01_1010_DMATutorial\dma_tutorial`
2. Vivado v2019.1を起動
3. tclコンソールにて
    - cd C:/pynq_proj_2020-05-23/2020-08-01_1010_DMATutorial/dma_tutorial
    - source dma_tutorial.tcl

Block Designが生成される。
bitstream生成までは8分41秒かかった (Core i7-6700K 4.00GHz + 16GB RAM)。


## Block Designの設定

### 全体のBlock Design

![コメント 2020-08-01 104917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/5981a81d-b571-a613-6ae0-c64d2f9fe5f9.png)

### axi_dma_from_ps_to_pl

![コメント 2020-08-01 105556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/119e250e-21da-d3b6-6280-d5bdc94e9ed3.png)

![コメント 2020-08-01 105655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/c0169e30-0188-8239-6294-99c85d110ba3.png)

### axis_data_fifo

![コメント 2020-08-01 110306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/42ff55b4-ecf4-d783-5505-bf39901fff6a.png)

![コメント 2020-08-01 110456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/89eb0093-dd5c-2a06-a891-fe99a219a341.png)


### axi_dma_from_pl_to_ps

![コメント 2020-08-01 110637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/aa2a6fc6-789b-a467-0e04-45d853dee57f.png)

![コメント 2020-08-01 110725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/a45748bd-2b16-08eb-62ba-82b4af13c3ca.png)

### Zynq > PS-PL Configuration

![コメント 2020-08-01 111216.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/f0c11a77-9229-ab83-8810-0fcdd16a2ac1.png)
Google流 資料作成術 実践編

## 目的

WEBテストの『資料読み取り問題』を苦手とする就活生が多い。（**include me !**）
その理由は、資料の**読み取りづらさ**にあると考えられる。

今回は、WEBテストに現われる<font color='OrangeRed'>**読みづらい**</font>グラフたちを<font color='RoyalBlue'>**読みやすい**</font>グラフに変えていく。

参考文献: [Google流 資料作成術](https://aax-us-east.amazon-adsystem.com/x/c/Ql4vbjlKNmNv9Ray40upz7IAAAFzg_nsnQEAAAFKASwvZwg/https://assoc-redirect.amazon.com/g/r/http://www.amazon.com/gp/product/1119002257?imprToken=Z539PtYGHGfouZy9DbANHA&slotNum=1&ie=UTF8&creativeASIN=1119002257&linkCode=xm2&tag=storytellingwithdata-20)

## 構成

### テーマ名

#### original

<font color='Gray'>**元のグラフ**</font>

<font color='Gray'>**問題文・選択肢**</font>

#### AFTER

<font color='Gray'>**グラフを書く目的**</font>

<font color='Gray'>**自分なりにアップデートしたグラフ**</font>

<font color='Gray'>**コメント**</font>

## 実例

### 【テーマ】 ごみ総排出量と一人1日あたりのごみ排出量の推移

#### original

<img width="583" alt="スクリーンショット 2020-08-01 9.50.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429781/0b99e309-d7f7-298e-5b7c-2b0151c7fea7.png">

[問] ゴミ総排出量が、前年度に比べて減少している年度を全て列挙しているものを、以下の選択肢の中から一つ選びなさい。

○ 平成8年度、11年度、13年度
○ 平成9年度、11年度、13年度、14年度
◉ 平成11年度、13年度、14年度
○ 平成11年度、14年度
○ 平成13年度、14年度

#### AFTER

このグラフで強調したいのは、『前年度に比べて、ゴミの総排出量が減少している年』である。
したがって、次のようなグラフを描けば勘違いする人はほとんどいなくなる

<img width="530" alt="スクリーンショット 2020-08-01 9.50.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429781/26aab579-e4cb-eec1-902b-4a8cb3738100.png">

答えを書いている時点で、多少ずるいかもしれない。
しかし、資料とは本来『読ませるもの』ではなく、『伝えるもの』であると思う。


### 【テーマ】 コンビニエンスストア年間商品販売額上位品目の割合

#### original

<img width="610" alt="スクリーンショット 2020-08-01 10.09.53 1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429781/7afb00b9-ab2d-c9f0-6b74-cca0b7fd9f43.png">


[問] 平成19年の菓子の年間販売額は、およそ何億円か。もっとも近いものを、以下の選択肢の中から一つ選びなさい。

○ 6060億円
○ 6070億円
○ 6080億円
◉ 6090億円
○ 7000億円

#### AFTER

originalの問題点は主に二つあると考える。

第一に、お菓子のみに注目を浴びせれば良い。
originalはお菓子以外の項目にも<font color='RoyalBlue'>**色**</font>が塗られていて雑多な印象が見受けられる。

第二に、円グラフである。ヒトは面積から定量的な値を比較しにくい。
例えば、その項目が占めている面積だけに注目すると、平成14年度の「飲料」と「タバコ・喫煙具」と「酒」の間の比較が難しい。
ヒトは、二次元的な情報から定量値を比較することが困難なのである。

以上をアップデートした結果が以下のグラフである。

<img width="465" alt="スクリーンショット 2020-08-01 10.31.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429781/2108dffe-1863-3662-f53c-c2586f50bfc2.png">



『その年の合計販売額と、各項目の割合を照らし合わせて販売額を算出する所業』を相手にさせない。そして、上位項目やその間の差も一目瞭然である。
また、菓子に<font color='DarkOrange'>**色**</font>をつけたため、平成19年度の「菓子」の販売額は6091億円と瞬時にわかる。

[注]
平成14年度から平成19年度の変化を知りたければ、線グラフが有効であるが、
ある年度の項目別の割合が知りたければ、棒グラフが有効である。


## まとめ

資料読み取り問題の戦死者たちを救いたいと願い、
この内容はシリーズ化していきたいと思います！

> 本当に必要なのは、
<font color='OrangeRed'>**読みづらい**</font>資料を読み取るスキルではなく、
<font color='RoyalBlue'>**読みやすい**</font>資料を作成するスキルである

と信じて...
[JavaScript] reduce で配列を合成する際のベストプラクティス考

# 概要

* JavaScript で reduce により配列を合成する際、どの方法が速いのかを調べてみました。

# 比較対象

* 以下の実装を高階関数で書き替えるのを想定してます。
* 高階関数使用時の比較なので、「for 文の方が速いかどうか」は、今回の調査対象外です。

```JavaScript
const info = {
  a: [11, 13, 15],
  b: [22, 24, 26],
  c: [33, 35, 37],
}
const a = ['a', 'b', 'c']

const results = []
for (const i in a) {
  results.push(...info[a[i]])
}

console.log(results)
// [11, 13, 15, 22, 24, 26, 33, 35, 37]
```

# 候補

* `[].push()`

```JavaScript
;['a', 'b', 'c']
  .map(key => info[key])
  .reduce(
    (stack, it) => {
      stack.push(...it)
      return stack
    },
    []
  )
```

* `[].concat()`

```JavaScript
;['a', 'b', 'c']
  .map(key => info[key])
  .reduce((stack, it) => stack.concat(it))
```

* `[].push()` + `,`

```JavaScript
;['a', 'b', 'c']
  .map(key => info[key])
  .reduce(
    (stack, it) => (stack.push(...it), stack),
    []
  )
```

* `flatMap`

```JavaScript
;['a', 'b', 'c'].flatMap(key => info[key])
```

# 計測

* 100万回ほど回してみました。

```JavaScript
const info = {
  a: [11, 13, 15],
  b: [22, 24, 26],
  c: [33, 35, 37],
}
const a = ['a', 'b', 'c']
const m = 100 * 10000
console.time('push()')
for (let i = 0; i < m; ++i) {
  a.map(key => info[key])
   .reduce(
     (stack, it) => {
       stack.push(...it)
       return stack
     },
     []
   )
}
console.timeEnd('push()')
// push(): 1256.3330078125ms
```

```JavaScript
const info = {
  a: [11, 13, 15],
  b: [22, 24, 26],
  c: [33, 35, 37],
}
const a = ['a', 'b', 'c']
const m = 100 * 10000
console.time('concat()')
for (let i = 0; i < m; ++i) {
  a.map(key => info[key])
   .reduce((stack, it) => stack.concat(it))
}
console.timeEnd('concat()')
// concat(): 547.2890625ms
```

```JavaScript
const info = {
  a: [11, 13, 15],
  b: [22, 24, 26],
  c: [33, 35, 37],
}
const a = ['a', 'b', 'c']
const m = 100 * 10000
console.time('push() + ,')
for (let i = 0; i < m; ++i) {
  a.map(key => info[key])
   .reduce(
     (stack, it) => (stack.push(...it), stack),
     []
   )
}
console.timeEnd('push() + ,')
// push() + ,: 1409.1591796875ms
```

```JavaScript
const info = {
  a: [11, 13, 15],
  b: [22, 24, 26],
  c: [33, 35, 37],
}
const a = ['a', 'b', 'c']
const m = 100 * 10000
console.time('flatMap')
for (let i = 0; i < m; ++i) {
  a.flatMap(key => info[key])
}
console.timeEnd('flatMap')
// flatMap: 3049.98095703125ms
```

# 結果

* 構文としては flatMap が一番スマートですが、速度では `concat()` による reduce が優る模様。

```JavaScript:優勝
const info = {
  a: [11, 13, 15],
  b: [22, 24, 26],
  c: [33, 35, 37],
}
const a = ['a', 'b', 'c']

a.map(key => info[key])
 .reduce((stack, it) => stack.concat(it))
```

* ~~さらに、コンマ演算子は reduce に渡す関数の構成で速度を僅かながら上げてくれる事もわかりました。~~
計測ミスでした。

* 高階関数を使うのは必須として、さらに速い実装があれば教えて下さい！
（・ω・）＜ for が速いのは存じております故
kerasのモデルの構築方法には2種類ある。

The Sequential model
https://keras.io/guides/sequential_model/


Keras Functional API
https://keras.io/getting_started/intro_to_keras_for_engineers/
https://keras.io/ja/getting-started/functional-api-guide/

Functional APIを用いるほうがモデルの共有など複雑なモデルを組むことができる。*1

*1 https://keras.io/ja/getting-started/functional-api-guide/
【備忘録】Power BI カスタムコネクターによるDirect Queryを実施するために

## 概要
 Power BIのカスタムコネクターにてDirecitet Queryを実施するためには、2020年8月1日時点では、ODBCによる接続が必須であるようです。

## 内容
Power Query SDKに関するドキュメントにて、下記の記載がありました。


> (optional) Enables Direct Query for your extension.
This is currently only supported for ODBC extensions.

引用元：[Handling Data Access](https://docs.microsoft.com/ja-jp/power-query/handlingdataaccess#publish-to-ui)

> (オプション) エクステンションの直接クエリを有効にします。
これは現在 ODBC 拡張モジュールでのみサポートされています。

上記文章のDeeplによる翻訳


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a9d4e581-8b95-28f0-49a3-9b8c36e97237.png)

引用元：[Handling Data Access](https://docs.microsoft.com/ja-jp/power-query/handlingdataaccess#publish-to-ui)

## その他
もし間違っておりましたら、教えてください。
Automation Anywhere v11 Error Handling利用時の注意事項 

Error Handlingコマンドの囲いは、エラーが起こると思われる**コマンド毎に、別々に囲ってください**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/969b6d5f-fc40-8b24-f4f2-09f54255d4db.png)

エラーが発生した場合のアクションについて、既定ではContinueとなっていますが、Error Handlingコマンドの囲いの中に複数のコマンドが含まれる場合、エラーが起こった行でError Handlingの囲いを離脱してしまう仕様になっているからです。つまり、エラーが起こった場合、囲われている後ろの方のコマンドは実行されなくなってしまいます( ;∀;)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/9fd7a3fd-de42-8b0e-13a5-6ce27dd8b952.png)
([公式製品ドキュメント](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/commands/error-handling-command.html?_LANG=jpjp)ではエラー時の動作は触れられていませんが、実際に実行してみるとそうなります)
【Python】データサイエンス100本ノック（構造化データ加工編） 001-010 所感+解説リンクまとめ

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

# 所感
- データサイエンス100本ノック（構造化データ加工編）の10問目までを解説して感じたことを3つ書きます。

## Pandasは「構造化されたデータを条件指定して抽出する」のに非常に便利
- 構造化されたデータは、あくまで**必要と思われるすべての情報を表形式で整理したもの**です
- 目的に応じて、見たい情報を抽出する必要があります
- そのために、条件指定をして抽出するのですが、**Pandasは条件指定のコードを簡潔に記載することができるという点で非常に便利**です

## 「どういった条件を」「どういったコードで表現するのか」がポイント
- Pandasの特徴として、条件指定とコードが対になる点が挙げられます
- 例えば、「先頭の10件を表示する」という条件指定は「.head(10)」というコードで表現されます
- このパターンを知り、100本ノックを通じて理解を深め、使えるようになるまで繰り返すことが習得の近道です
- **条件指定とコードの対を覚えることがPandasを習得する際のポイント**になります

## 実務では「何のために」「どういったデータを抽出したいのか」を常に考える習慣をつけることが重要
- ただし、**使えるようになるだけでは実務では使えません**
- 例えば、コンビニ店長になったつもりで「売上を前年比で+5%にしたい」という目標を達成するために、「よくセットで買われている商品を同じ棚に配置して、購入単価を上げる」という戦略を立てたとします
- この場合は、目的がはっきりしているので、「誰が」「いつ」「何の商品を」「いくらで」購入したのか、というデータを抽出すればいい、と考えることができます（※もちろんデータを抽出するだけではダメで、データを分析し、そこから有力な示唆を得られなければ目標を達成することはできません）
- しかし、そういった目的が不明瞭な場合、いくらデータを抽出することができるようになったとしても、ビジネス課題を解決する手段として一切機能しません
- **「データを抽出する（+データを分析する）」のは、適切な意思決定をするための手段の1つである、ということを常に念頭に置きながら、100本ノックを楽しみましょう！**

#解説まとめ
- ここからはリンクを貼ります。
- データサイエンス100本ノック初心者の方は、001から順番に解いていくことをおすすめします。
- 011から020までの解説は[こちら](https://qiita.com/TosakaNaoya/items/7ef5621a37db22702a42)をご覧ください。

## 001
[解説記事](https://qiita.com/TosakaNaoya/items/5ada8cbc09f2ef20bfee)
[解説動画](https://www.youtube.com/watch?v=ZmrtxSJlEbk&feature=youtu.be)

## 002
[解説記事](https://qiita.com/TosakaNaoya/items/9a04c3d35e826ae57ee4)
[解説動画](https://www.youtube.com/watch?v=sRGR3lhBlcY&feature=youtu.be)

## 003
[解説記事](https://qiita.com/TosakaNaoya/items/f36d4c107802ed7b82d1)
[解説動画](https://www.youtube.com/watch?v=bR1-GEwxg6g&feature=youtu.be)

## 004
[解説記事](https://qiita.com/TosakaNaoya/items/cef44946c4fccd217cd3)
[解説動画](https://www.youtube.com/watch?v=Le2h4Um1OIs&feature=youtu.be)

## 005
[解説記事](https://qiita.com/TosakaNaoya/items/cda942bc53d7c5323785)
[解説動画](https://www.youtube.com/watch?v=wVPJm9EFL9M&feature=youtu.be)

## 006
[解説記事](https://qiita.com/TosakaNaoya/items/4af35a83c2a51a4382f5)
[解説動画](https://www.youtube.com/watch?v=GVwgC7-pgno&feature=youtu.be)

## 007
[解説記事](https://qiita.com/TosakaNaoya/items/49baf085404983b4e9b6)
[解説動画](https://www.youtube.com/watch?v=F3phP67mXxE&feature=youtu.be)

## 008
[解説記事](https://qiita.com/TosakaNaoya/items/2f21b5ddb09ff6b39d61)
[解説動画](https://www.youtube.com/watch?v=muicnnHKiPQ&feature=youtu.be)

## 009
[解説記事](https://qiita.com/TosakaNaoya/items/ffb313bb9b9608f66392)
[解説動画](https://www.youtube.com/watch?v=_k0cNP4vfhs&feature=youtu.be)

## 010
[解説記事](https://qiita.com/TosakaNaoya/items/5969d6cf1ffc31a74c38)
[解説動画](https://www.youtube.com/watch?v=a3ShkYQiCcA&feature=youtu.be)