OmniAICreator/Qiita-1.07M huggingface dataset:
JSONとは

## JSONとは

JavaScript Object Notationの略でデータフォーマットの種類です。
web技術で、データ通信（APIとか）をする際によく利用されます。
オブジェクトの中身は`key:value`の形で表現されます。

## 特徴
* 複雑なデータ構造でも簡単に表現できる
* xmlなどと比較してデータ量が小さい
* JavaScriptで使いやすいデータ形式


### 複雑なデータ構造でも簡単に表現できる
基本的に、JSONではかっこを使ってデータ型を表現します。
基本的に、以下のかっこしか使いません。
これを組み合わせることで、複雑なデータ構造も表現します。

* オブジェクト：`{}`
* 配列：`[]`

`{}`が出てきたら、「これはオブジェクトだな」、
`[]`が出てきたら、「これは配列だな」と考えればOKです。


### xmlなどと比較してデータ量が小さい
以下はkeyが`data`、valueが`hoge`のデータをそれぞれのデータ形式で表現したものです。

#### xml形式の場合
```xml
<data>hoge</data>
```

#### json形式の場合
```json
{"data": "hoge"}
```

xmlではvalueを`<key>`で囲っているので、その分データが冗長です。


### JavaScriptで使いやすいデータ形式
JSONはJavaScriptで扱うデータと全く同じ構造をしています。


## 例

例を見るのが一番わかりやすいと思います。
`skill`を配列で持った、オブジェクトをJSONで表現すると、以下のようになります。

```json
{
  "name": "yamada",
  "age": 24,
  "skills": [
    {"language":"html", "type": "frontend"},
    {"language": "css", "type": "frontend"},
    {"language": "php", "type": "backend"}
  ],
  "description": "webエンジニアの山田さん"
}
```

JavaScriptで扱うときは、データを変数に入れて利用することが多いため、
`data`という変数に上のデータを入れた場合、以下のような使い方ができます。

```javascript

console.log(data.name);                // yamada
console.log(data.age);                 // 24
console.log(data.skills[1].language);  // css
```
Programming paradigmsについて

#Programming Paradigmsとは
Programming paradigmsとは、簡単にいうと**プログラミングにおける型や方法**のことである。

Programming paradigmsにはたくさん種類があり、Imperative、Declarative、Structured、Procedural、Functional、Object-Oriented、などが挙げられる。

- ここで私が目をつけたのは、**Object-Oriented（オブジェクト指向）**と**Structured（構造化言語）**の違いである。
- オブジェクト指向とは**先に目標物を設定して、プログラムするというもの**で、逆に構造化言語とは、**先にプログラムしてから目標物を作るようなもの**である。

###マルチパラダイムプログラミング言語
- マルチパラダイムプログラミング言語とは**複数のプログラミングパラダイムを取り入れた言語**のことである。
- マルチプログラミング言語の例としてC++が挙げられる。C++のパラダイムは手続き型プログラミング、データ抽象、オブジェクト指向プログラミング、ジェネリックプログラミングの組み合わせである。



#参考文献
https://cs.lmu.edu/~ray/notes/paradigms/
Gitコマンド集

■用語解説
branch→枝という意味で開発用のブランチ。流れはmasterなどから派生させこれで開発し、派生元のソースにマージしながら進めていく。
master → 親ブランチ
feature → 開発ブランチ
index → コミットの一つ前の領域
リポジトリ→ソースが保管されている場所
origin → リポジトリの別名
stash → 一時保存領域


■コマンド一覧
1. 現在の設定内容
git config --list

2. ユーザ名を設定する
git config --global user.name "i-ak"

3. メアドの設定
git config --global user.email xx@xx.com

4. ソースをローカルにcloneする
【例】http.xx.comをclone
git clone http.xx.com

5. ブランチ一覧を表示する。現在のブランチは緑色などになっている
git branch

6. indexの状況を確認する
git status

7. 最新をpullしてくる。現在と同じブランチをpullしてくること
git pull origin master

8. 現在のブランチを複製しそれに移動する。
【例】現在のブランチからfeature/xxを複製
git checkout -b feature/xx

9. ブランチ名を変更する。
【例】feature/xx2に変更
git branch -m feature/xx2

10. ブランチを移動する。
【例】masterに移動
git checkout master

11. indexにstageする
【例】./test.htmlをstage
git add ./test.html

12. stageしたファイルをunstageする
【例】./test.htmlをunstage
git reset HEAD ./test.html

13. stageしたものをコミットする。
git commit -m "#A01 初回コミット"

14. コミット履歴を見る
【例】「commit xx」の「xx」の部分がコミット番号
git log

15. リモートリポジトリの URL を確認する
git remote -v

16. 現在のブランチをpushする
【例】feature/xxをpush
git push origin feature/xx
※強制pushしたい場合
git push -f origin feature/xx

17. リモートブランチ一覧を表示する
git branch -r

18. 履歴をコミット番号まで戻す。差分は削除しない。
git reset --soft コミット番号

19. 履歴をコミット番号まで戻す。差分は削除される。
git reset --hard コミット番号

20. ワークスペースの状態をstash領域に保存したい。
→コメントなし
git stash save
→コメントあり
git stash save "コメント"

21. stashの一覧を見る。
git stash list

22. stashを復元したい。
→最後のstash
git stash pop
→コミット番号指定
【例】stash@{0}を復元
git stash pop stash@{0}

23. ブランチを削除する
【例】feature/xxを削除
※まずfeature/xx以外に移動する
git branch -D feature/xx

24. リモートブランチを削除する
【例】feature/xxを削除
git push origin :feature/xx

25. 削除したブランチを復活させるための調査をしたい。
git reflog

【例】55ac84cに戻す
git reset --hard 55ac84c

26. ブランチ同士のマージをしたい
【例】masterにfeature/xxをマージ
git checkout master
git pull
git pull origin feature/xx

■SourceTree
コミットの流れが視覚的に見えて便利
Capybara で起動する chromedriver の Headless モードを環境変数で切り替える

## はじめに

Rails で Web アプリケーションを開発していると、Capybara で E2E テストをする事があると思います。

その中で、通常は Headless モードの Chrome を使い、デバッグなどをするときはフォアグラウンドでブラウザを起動して挙動を確認できるように、というふうに切り替えて使えたらいいなと思っており、調べたことをまとめます。

## 動作確認環境

* rails 6.0.0
* Capybara 3.29.0
* selenium-webdriver 3.142.4
* rspec-core 3.8.2
* ruby 2.5.5
* Rails アプリケーション作成済み
* RSpec 設定済み

## tl;dr

このような Capybara Driver Setting にしました。以下にサンプルを載せます。


```ruby
Capybara.register_driver :chrome do |app|
  args = %w(disable-gpu mute-audio window-size=1280,800 lang=ja)
  args << 'headless' unless ENV['NO_HEADLESS']

  Capybara::Selenium::Driver.new(
    app,
    browser: :chrome,
    desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(
      chrome_options: {
        args: args,
        w3c: false
      }
    )
  )
end

Capybara.default_driver = :chrome
```

環境変数 `NO_HEADLESS` の有無で、chromedriver に付与するオプションのうち、Headless モードを制御する `headless` オプションを付け替える形にしました。

なお、chrome 75 から`w3c: false` を追加しないと、付与したオプションが有効にならないようです。（[参考](https://stackoverflow.com/a/56490226)）

### 使い方

#### ファイル読み込み設定修正

まず `spec/rails_helper.rb` の、以下記述のコメントアウトを解除します。
これで、`spec/support/xx.rb` のファイルも rails_helper の処理の中で読み込んでくれます。

```ruby:spec/rails_helper.rb
# コメントアウトを解除
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
```

#### ファイル作成

`spec/support/capybara.rb` というようなファイルを作成し、上記の Capybara 設定を記述します。


#### コマンド実行

利用するときは、以下のような形で利用します。

```bash
# Headless モードで実行する
$ bundle exec rspec spec/features/xx_spec.rb

# ブラウザを起動して実行する
$ NO_HEADLESS=1 bundle exec rspec spec/features/xx_spec.rb
```

## おわりに

何気なく Capybara を使っていたのですが、設定ファイルを読み込むのは勉強になりました。Capybara に限らずドキュメントやソースコードを読んでいこうと思います。


## 参考

* [Cannot call non W3C standard command while in W3C mode (Selenium::WebDriver::Error::UnknownCommandError) with Selenium ChromeDriver in Cucumber Ruby - Stack Overflow](https://stackoverflow.com/a/56490226)
* [GitHub - teamcapybara/capybara: Acceptance test framework for web applications](https://github.com/teamcapybara/capybara)
Ajaxの書き方について（jQuery利用）

#jQueryでのajaxの書き方が実はVer３から書き換わっています。書き換え方を書きたいと思います。
##ｊQuery２までは、ajaxの書き方はSucess&Errorの書き方でした。
```javascript:jQuery2までのajax
$.ajax({
		 url:'アクセスするURL', //アクセスするURL
		 type:'postかget',　　 //post or get
		 cache: false,        //cacheを使うか使わないかを設定
		 dataType:'json',     //data type script・xmlDocument・jsonなど
		 data:data,           //アクセスするときに必要なデータを記載
		 success:function(mydata){
			 //データの有無を確認
			 //成功したときの実行したいScriptを入力
		 },
		 error:function(){　
　　　　　　　 //失敗したときの処理させたいScriptを記入する
		 }
});
```

これが通常でした。
jQuery3系からは書き方が変わります。
##jQuery3以降の書き方は以下のとおりです。done＆fail&alwaysに変わります。
doneは成功時に実行したいスクリプトを記載します。
failは失敗時の実行したいスクリプトを記載します。
alwaysは結果に関わらず実行したいスクリプトを記載します。

```javascript:jQuery3系のajax
$.ajax({
        url: 'アクセスするURL', //アクセスするURL
        type: 'postかget',　　 //post or get
        cache: false,        //cacheを使うか使わないかを設定
        dataType:'json',     //data type script・xmlDocument・jsonなど
        data:data,           //アクセスするときに必要なデータを記載      
      })
      .done(function(response) { 
         //通信成功時の処理
         //成功したとき実行したいスクリプトを記載
      })
      .fail(function(xhr) {  
　　　　　 //通信失敗時の処理
         //失敗したときに実行したいスクリプトを記載
      })
      .always(function(xhr, msg) { 
　　　　　//通信完了時の処理
        //結果に関わらず実行したいスクリプトを記載
   });   
```
このように変わります。
C#のtry catchを思い浮かべてみればよくわかります。
下に書いてみます。

```C#:C#でのTryCatch
try{
   //エラー処理を拾いたい処理
}
catch(Exception){
   //エラー処理
}
finally{
   //処理終了時の処理
}
```
感じ的にはにているんですが。
try catchはあくまでもエラー処理なのでajaxの例としては**通信処理をtry catchしていると伝えたほう**が簡単です。
難しく考えなくても簡単に作ることはできると思います。
内容を書き換える時は通信正常時のみに行わせ、通信異常時はAlertを表示させる、通信完了時には通信の正常化エラー化を表示させればフォームが作り上げられるということになります。
**ローカル実装でのajaxはChromeではエラーになるのでFirefoxを入れておく**といいでしょう。
Chromeの正常系のURLはhttpはブロックされますのでFirefoxで実行すると正常系と扱われます。
このあたりも気をつけてください。
実行できないと悩んでいる場合は別のブラウザを使うと意外といいのかもしれませんね。
サイト構成を手早く確認する為のTips

## 概要

色々なサイトを見ているときに、
**「ここは結局、何をどんな感じに提供してくれているサイトなの？」**
と感じる時があります。

それを解消する、サイト構成を手早く確認する為のTipsです。


## やったこと

大概のサイトには「サイトマップ」のページが公開されていて、
その殆どは、TOPページにリンクが設けられていると思います。

この「サイトマップ」を見れば、
そのサイトのことはだいたいわかるはずなので、
「サイトマップ」をGETして「BeautifulSoup」でaタグをかき集めてみます。


## 手順

以下の流れとなります。

- (1) 対象サイトのサイトマップをGETする

- (2) BeautifulSoupで対象ページのaタグを抜き出す

- (3) aタグをリンク部とテキスト部に分けていく

- (4) テキスト出力


## 実装

手短です。エラーケースとかはもう少し拡充した方がよいかも。

````python
from bs4 import BeautifulSoup
import requests

urls = ''
path = './urls.txt'

# 対象サイトのサイトマップをGETする
r = requests.get("https://xxxxx..../sitemap")
c = r.content

# BeautifulSoupで対象ページのaタグを抜き出す
bs = BeautifulSoup(c, "html.parser")
a_list = bs.select("a")

# aタグをリンク部とテキスト部に分けていく
for a in a_list:
    name = a.get_text()
    link = a.get("href")
    urls += name + ':' + link
    urls += '\n'
    print(link, "\t", name)

# テキスト出力
with open(path, mode='w', encoding='UTF-8') as f:
    f.write(urls)

````

※ テキスト出力結果は、サイト構成によってマチマチですので割愛します。


## まとめ

上記ソースコードでやっていることは、
**「ブラウザでサイトマップを1回開いた後、エディタでソースを開いてaタグをかき集める」**
という作業を自動化した、というものです。

GETリクエストを1回投げているだけですので、
よそ様のサーバに無用な負荷をかけるといったこともないはず。
使いどころはチョイチョイあるかなと感じています。


## 参考

PythonとBeautiful Soupでスクレイピング
https://qiita.com/itkr/items/513318a9b5b92bd56185
vmcore を読んでみる(4)

この記事のつづきです。
https://qiita.com/intrajp/items/92f78772ba0bf8b68e12

log コマンドをもう一度実行してcrash 時のシンボルを確認します。

```
crash> set scroll off
crash> log
[<経過時間>] Call Trace:
（略）
```

★ 重要 ★
ここで、逆アセンブルを行い、panicポイントの命令列を得ます。
まずは、全部見てみます。

```
crash> dis <コマンド>
（略）
```

以下、仮想メモリアドレスを、kmem の引数として与えれば、ソースコードの何行目かがわかるので、そこを
追っていけば、どの処理で止まったのかがわかると思います。

以上です。
Android で日付の表記がおかしくなる…それ、SimpleDateFormat を複数スレッドで使ってません？

# 概要
Android アプリにて、まれに日付に表記が未来になる事象がありました。
原因は SimpleDateFormat がスレッドセーフではないのに、複数スレッドから使用していたことが原因でした。

SimpleDateFormat を使い続けるなら各スレッドごとにインスタンス生成、もしくは、 [DateTimeFormatter](https://developer.android.com/reference/java/time/format/DateTimeFormatter) や [ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP) などを利用すると良いでしょう。

# 事象
`2019-10-05` と表示されるべき所に `4520-10-05` のような未来の日付が表示されることがある。
（再現性はまちまち）

# 再現確認
```Kotlin
private val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.JAPAN)

fun hoge(){
    (1..20).forEach {
        Thread {
            val dateTime = sdf.parse("2019-10-05T01:23:45+09:00")?.time ?: 0
            Log.d("★", sdf.format(Date(dateTime)))
        }.start()
    }
}
```
実行結果

```
2019-10-05T01:23:45+0900
4520-10-05T01:23:45+0900 // !!
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
4520-10-05T01:23:45+0900 // !!
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
4520-10-05T01:23:45+0900 // !!
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
2019-10-05T01:23:45+0900
```


# 仕様
[SimpleDateFormat](https://developer.android.com/reference/java/text/SimpleDateFormat#synchronization) より

```
Synchronization

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.
```

たしかに、スレッドセーフではない旨が書かれていますね。

# 対応
修正範囲をミニマムにするのであれば、SimpleDateFormat を使うときに都度生成すれば事足ります。

```Kotlin
private val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.JAPAN)
```
↓

```Kotlin
private val sdf get() = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.JAPAN)
```

また、[DateTimeFormatter](https://developer.android.com/reference/java/time/format/DateTimeFormatter) や [ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP) などを利用するという手もあります。

# さいごに
ハマった人の救いになれば幸いです。
Lambdaの詳細設定を調べていく

#目的
lambdaの設定を把握し、必要に応じて使用できるようになること
#設定の説明（キャプチャに吹き出し）
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/ddc68375-a058-2465-5a11-7d7662c047ab.jpeg)
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/b03e0ad9-0b61-df73-a840-2620f01f73a1.jpeg)
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/b487dafb-98c3-ce09-082e-66bd960dacc2.jpeg)
![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/b22752e7-2a76-8170-5bcc-2680a7897f8a.jpeg)
![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/1cbd85e3-6700-7a24-f2b4-e2ec89e6de64.jpeg)
docker-compose upをしたときに、A server is already running.というエラーがでたときの対処法について

## はじめに
Railsを使ってECサイトを作っているときに、`docker-compose up` をしたら、`A server is already running. Check /app/tmp/pids/server.pid.` というエラーに苦しめられたので、解決方法をまとめてみました。

## 環境
・macOS High Sierra バージョン10.13.4
・Docker version 19.03.1
・Rails 5.2.1

## docker-compose upでエラーがでて、起動できないときは？
**エラーメッセージ**
`A server is already running. Check /app/tmp/pids/server.pid.`

### ◆解決策１
・エラーメッセージで指摘されているとおり、`app/tmp/pids/server.pid.`があれば、削除して再起動する

### ◆解決策２
・`docker-compose down`でリセットした後、再起動する

## エラーが起こらないようにするには？
・Dockerを終わるときは、`control+c`だけで終わらずに、`docker-compose stop`を忘れずにして、サービスを停止する

## おまけ：docker-compose upとdocker-compose startの違いは？
### ◆docker-compose up
・`docker-compose.yml`で定義したサービスを開始、再起動させる

### ◆docker-compose start
・すでに作ったコンテナを再起動する（※新しいコンテナは作らない）


## おわりに
ぼくの場合は、Dockerを終わるときに`docker-compose stop`を忘れて、エラーになることが多かったです・・・
そのときは、`docker-compose down`でいつもリセットしてから再起動をしていたので、完全に２度手間でした（笑）

おわり


## 参考
・[Docker >> docker-compose コマンド概要](http://docs.docker.jp/compose/reference/overview.html)


・[Docker >> よくある質問と回答 >> up ・ run ・ start の違いは何ですか？](http://docs.docker.jp/compose/faq.html)
jest.isolateModules() を使ってモジュールの振る舞いをテストケース内に閉じ込める

# はじめに

[jest.isolateModules(fn)](https://jestjs.io/docs/ja/jest-object#jestisolatemodulesfn) を利用すると、モジュールの振る舞いをテストケース内に閉じ込め、テストごとに独立した試験をすることが可能になります。

使い所としては、`process.env`の値によって振る舞いが変わるモジュールのテストなどで便利です。

サンプルとして、 [jestで現在時刻を固定化する](https://qiita.com/bearII/items/d8a3bc0e83b14b36e64e) で使った `Date` オブジェクトがテストケース内で固有のものになるようにしてみます。[^1][^2]
# 使い方

```javascript
const moment = require('moment')
// 固定したい時間
const MOCKED_TIME = '2019/8/1 12:00:00';

describe('モックした現在時刻のテスト', () => {
  // setup
  const OriginalDate = Date; // 退避
  const now = new OriginalDate(MOCKED_TIME);

  beforeEach(()=> {
    // 各テストケースの中では固有のDateにする
    jest.isolateModules(() => {
      // Date.now() と new Date() のみmocking
      Date.now = jest.fn().mockReturnValue(now.valueOf());
      jest.spyOn(global, 'Date').mockImplementation((arg) => {
        if (arg === 0 || arg) {
          return new OriginalDate(arg);
        }
        return now;
      });
    });
  });
  afterAll(() => {
    jest.restoreAllMocks();
  });


  test('現在時刻をYYYY/MM/DDの形式で表示できる', () => {
    const actual = moment().format('YYYY/MM/DD');
    expect(actual).toBe('2019/08/01');
  });

  test('Dateコンストラクタで現在時刻が固定化される', () => {
    const actual = new Date();
    expect(actual.valueOf()).toBe(now.valueOf());
  });

  test('Dateコンストラクタで時刻を指定できる', () => {
    const actual = new Date(0);
    expect(actual.valueOf()).toBe(0);
  });
})

describe('現在時刻がモックオブジェクトになっていないことのテスト', () => {
  test(`現在時刻は${MOCKED_TIME}ではない`, () => {
    const now = new Date();
    expect(now).not.toBe(new Date(MOCKED_TIME));
    expect(moment(now).format('YYYY/MM/DD HH:mm:ss')).not.toBe(MOCKED_TIME);
  });
})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267482/4b2eb5bc-0e53-6e81-7be5-27229795be1b.png)

[^1]: `jest.spyOn` で作成したモックは `restoreAllMocks` では[もとに戻せない](https://jestjs.io/docs/ja/jest-object#jestrestoreallmocks) が、試験終了後に [mockFn.mockRestore()](https://jestjs.io/docs/ja/mock-function-api#mockfnmockrestore) を呼ぶようにするとこのサンプルと同じことが可能です
[^2]: コード https://github.com/ryo-rm/TIL/tree/master/jest/001
Windows10 の不具合およびその対応

筆者が体験したWINDOWS10の不具合およびその対応内容を記述します。

##1. Explorerが起動しない  
###発生原因
クイックアクセスツールバーにボタンを追加したら、突然Explorerが起動しなくなった

###対処方法
レジストリの
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Ribbon
の「QatItems」を初期化すれば解決
レジストリエディタで「QatItems」のキーを削除すればOK
削除してもExplorer起動時にデフォルト値で再作成されます。

参考サイト：[クイックアクセスツールバーの内容をバックアップ／復元する](https://news.mynavi.jp/article/windows-383/)



##2. ExplorerでＳＤカードを開こうとしたらバーコード付きのブルースクリーンでハングアップ
 
###発生原因
Explorerに表示するアイコンを変更しようとして何らかの不具合が発生した模様（詳しくは対処方法参照）
Windows7からアップグレードしたPCで発生

###対処方法
開こうとしたＳＤカードには「autorun.inf」ファイルとそのファイルが参照するアイコンファイルがあったので、そのアイコンファイルを削除。
筆者の環境では「autorun.inf」もアイコンの変更だけのために存在したファイルだったので同時に削除
vmcore を読んでみる(3)

前回のつづきです。
https://qiita.com/intrajp/items/a66c7b142441fc19054d

runq コマンドを実行することで、プロセススケジューラのランキューに接続している
実行中のプロセスが表示できます。

今回は、CPU <数値> なので、そこを見ます。

```
crash> runq
（略）
```

先程実施した、ps コマンドに、引数 -a node_exporter を与えて、そのプロセスに与えられ
たコマンドライン引数と環境引数を表示させてみます。

```
crash> ps -a <実行していたコマンド>
PID: <数値>  TASK: <アドレス>  CPU: <数値>   COMMAND: "<コマンド名>"
ps: cannot access user stack address: <アドレス>
````

ユーザーのアドレスはアクセスできないことがあります。

-t オプションを与えて、プロセスの動作時間、開始時刻、ユーザ空間および
カーネル空間での実行時間を表示させます。

```
crash> ps -t <実行していたコマンド>
```

task コマンドで、task_struct 構造体（プロセス管理用データ構造）を表示
させてみます。

```
crash> task
（略）
```

task -x も実行してみます。

```
crash> task -x
（略）
```

以下に注目します。
    sp0 = <アドレス値>, 
    sp = <アドレス値>, 
stack ポインタが分かったので、rd -s でスタック領域を参照してみます。
rd コマンドは、メモリの内容を読むコマンドです。
これは、bt -t に近い情報となります。
16進数にしなければいけないと思います。もう16進数ですが、そうでない場合は、
以下のコマンドで可能です。
crash> eval <数値>
やってみます。

```
crash> set scroll off
crash> rd <spの値> -e <sp0の値> -s
（略）
```

bt -t <PID> もやってみます。 

```
crash> bt -t <実行していたPID>
（略）
```

もう一度、ps <PID> を確認します。

```
crash> ps <PID>
   PID    PPID  CPU       TASK        ST  %MEM     VSZ    RSS  COMM
> <数値>      1   1      <アドレス値>  RU   0.x    xxxx   xxxx  <コマンド>
```

ST が、RU であることから、<コマンド> が実行中であったことを示しています。

次に、メモリの状況を確認します。
kmem -i とすると、メモリ全体の利用状況が表示できます。

```
crash> kmem -i
（略）
```

kmem は、カーネルのメモリ使用状況を表示できます。
-s オプションは、スラブキャッシュの情報を表示します。
/proc/slabinfo の情報と同等です。

```
crash> kmem -s
（略）
```

-p オプションで、メモリマップを表示できます。

```
crash> set scroll on
crash> kmem -p 
```

大変な行数となります。

メモリを直接指定もできます。

メモリアドレスが分かっているので、直接指定して、このメモリが
利用されていたか、既に解放されていたかを確認します。

```
kecrash> kmem <アドレス値>
CACHE             OBJSIZE  ALLOCATED     TOTAL  SLABS  SSIZE  NAME
xxxxxxxxxx...
  SLAB              MEMORY            NODE  TOTAL  ALLOCATED  FREE
xxxxxx.....
  FREE / [ALLOCATED]
  [<アドレス値>]

    PID: <数値>
COMMAND: "<コマンド名>"
   TASK: <アドレス値>  [THREAD_INFO: <アドレス値>]
    CPU: 1
  STATE: TASK_RUNNING (PANIC)

      PAGE       PHYSICAL      MAPPING       INDEX CNT FLAGS
xxxxxxxx....
```

[] で囲まれているページは、まだ解放されていないことを示します。
以下の行に注目します。

```
   TASK: <アドレス値>  [THREAD_INFO: <アドレス値>]
```

メモリマップで確認します。

```
crash> kmem <アドレス値>
（略）
```

まだ確認したい項目があります。
PID <PID> が開いていたファイルを確認します。
files <PID> で確認できます。

```
crash> files <PID>
PID: <PID>  TASK: <アドレス値>  CPU: 1   COMMAND: "<コマンド>"
ROOT: /    CWD: /
 FD       FILE            DENTRY           INODE       TYPE PATH
（略）
```
開いているファイルがわかりました。
つづきです。
https://qiita.com/intrajp/items/cf7482f2a084f47c303f
Shell Linux コマンド の 実行結果 を ファイル に 出力する 

# 目的

- Linuxでコマンドを実行したときのすべてのログをファイルに記載し、ターミナル上にも出力する方法を知る。

# 書き方の例

- 下記にShellの処理を記載する。

```shell
$ 実行コマンド 2>&1 | tee 結果を記載するファイル名
```

# より具体的な例

- コマンド`echo "Hello miriwo"`の実行結果をテキストファイル「result.txt」に記載する。
- 下記にShellの処理を記載する。

```shell
$ echo "Hello miriwo" 2>&1 | tee result.txt
```
Windows上のbatファイルからWSL上のPHPスクリプトで対話型処理をさせてログファイルを残す

# はじめに

需要が多いとは思えないけど、特定の状況でかなり都合のいい運用ができたので。
なお、WSL上で実行できればPHP以外のスクリプトでも同じことができるはず。

## 想定環境

- Windows10 1803以降 (Windows上でwslコマンドが使えること)
- PHPを実行できるWSL環境を構築済み

## 想定利用ケース

- Windows上で実行したいけど、Windows上に実行環境を構築したくない時
- 既存の資産をWindows上に移行して処理を実行したい時/実行させたい時
- プロンプト操作ではなく、アイコンクリックで処理を実行したい時/させたい時

## サンプル

### 用意するファイル

![folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/f58fd36c-61c1-fc56-6a14-12ba73490eb6.png)

```bash:これをダブルクリックしてね.bat
@set dt=%date%
@set tm=%time: =0%
@set FileName=%dt:~0,4%%dt:~5,2%%dt:~8,2%_%tm:~0,2%%tm:~3,2%%tm:~6,2%_log.txt

@wsl php test.php 2>&1 | wsl tee %FileName%
@pause
```

```php:test.php
<?php

echo "なにか入力してください" . PHP_EOL;
$stdin = trim(fgets(STDIN));

echo PHP_EOL;
echo PHP_EOL;
echo "入力内容は、、、" . PHP_EOL;
echo $stdin . PHP_EOL;
```

### 実行結果

これをダブルクリックしてね.batをダブルクリック（Windowsの設定によってはクリック）するとコマンドプロンプトが表示される。
実運用するときは入力内容を示唆したり、重要な場所には色を付けたりすると良いんじゃないかな。
![input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/5309bc52-4a29-063a-1c52-68e836373407.png)

コマンドプロンプト上で入力結果が表示されて、logファイルも出力される。
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502524/6048096a-5454-f51f-43c2-25558fccc0d8.png)

```text:20191005_112251_log.txt
なにか入力してください


入力内容は、、、
日本語を入力したあとBack spaceしてもうまく消えないけど仕方ないね
```
ionic アプリ名を変更する方法(Capacitor)

#前提

この記事では[Capacitor](https://capacitor.ionicframework.com/docs/getting-started/with-ionic/)を使っています。

Cordovaと同じかもしれませんが、未検証です。

#iOS

開くファイルはこれ。

<img width="602" alt="スクリーンショット 2019-10-05 14.16.23.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/0f602477-f64d-888c-c9f5-620aef4bf110.jpeg">

`ionicアプリ/ios/App/`の中にある。

このファイルを開くとxcodeが起動し、**Info.plist**ってファイルが開かれる。

<img width="522" alt="スクリーンショット 2019-10-05 14.16.50.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/0ee39225-88a0-d4f7-c636-aec55b1f3718.jpeg">

Bundle display nameを変更。

当然日本語にもできる。

#Android

開くファイルは**strings.xml**
このファイル、ぱっと見じゃどこにあるかわからない笑。

androidフォルダ内を検索する方が早い。

一応場所を載せておく。

まずは`ionicアプリ/android/app/src/main`

<img width="597" alt="スクリーンショット 2019-10-05 14.53.59.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/5d48b4bc-3e07-8f9d-32a9-d4c40acf7914.jpeg">

次に`res/values/strings.xml`

<img width="551" alt="スクリーンショット 2019-10-05 14.52.27.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/4bf726c3-0eda-196f-4cef-32f06c4f040b.jpeg">

**strinfs.xml**を開いて`<string name="app_name">`のタグ内を変更すればOK

<img width="410" alt="スクリーンショット 2019-10-05 14.52.56.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/b2ad9a3e-66ab-a0a5-1f2e-9a35fff94448.jpeg">


Capacitorに関する情報が少ないので、これだけの事でも一苦労・・・。

#参考
https://capacitor.ionicframework.com/docs/ios/configuration/

https://capacitor.ionicframework.com/docs/android/configuration/
Firebase Summit 2019で発表された新機能まとめ


Firebase Summit 2019が公式ブログで紹介されていた。
https://firebase.googleblog.com/2019/09/Whats-new-at-Firebase-Summit-2019.html

面白そうな機能がたくさん紹介されていたので、簡単にまとめてみた。

また、既にQiita記事があればリンクを載せておく。

## Firebase Extensionsの発表

生産性を向上させるように設計されており、独自のコードの調査、作成、デバッグを行うことなく、アプリに拡張機能を提供する
簡単にいうと、よくある機能のコードをバンドル化して提供します、という事かな。

公式ページをみると「ベータ版」とあった
これからもっと更新されるっぽい
https://firebase.google.com/products/extensions/

### Resize Images
画像のリサイズ
Cloud Storageにアップロードされた画像のサイズを指定されたサイズに変更し、元の画像とサイズ変更された画像の両方を保存します。

Qiita記事 : [[Firebase Extensions] Resize Images](https://qiita.com/giiiita/items/d918911bf6effcdf38a8)

### Translate Text
テキストを翻訳
Cloud Firestoreコレクションに書き込まれた文字列を複数の言語に翻訳します。
（Cloud Translation APIを使用）

Qiita記事 : [Firebase Extensionsをサクッと試してみた　〜Firebase Extensions機能一覧、Translate Textの使い方〜](https://qiita.com/ryo2132/items/5e102136a1d7ad5d5e43#%E4%BD%BF%E3%81%84%E6%96%B9%E4%BE%8B-translate-text)

### Sync with Mailchimp
Mailchimpと同期
Firebase Authenticationから指定されたMailchimpオーディエンスに新しいユーザーを追加します。

### Trigger Email
トリガーメール
指定されたCloud Firestoreコレクションに書き込まれたドキュメントの内容に基づいて、電子メールを作成して送信します。

### Export Collections to BigQuery
コレクションをBigQueryにエクスポートする
指定されたCloud FirestoreコレクションからBigQueryにリアルタイムの増分更新を送信します。

### Shorten URLs
URLを短縮
指定されたCloud Firestoreコレクションに書き込まれたURLを短縮します。
（Bitlyを使用）

### Distributed Counter
分散カウンター
Cloud Firestoreへの高速書き込みに対応するために、イベントカウンターを大規模に記録します。

### Limit Child Nodes
子ノードを制限する
RealeTime Databaseで使用する。
ノードの数を、指定されたリアルタイムデータベースパスの指定された最大数に制限します。

### Delete User Data
ユーザーデータを削除する
ユーザーがアカウントを削除するときに、Cloud Firestore、Realtime Database、Cloud StorageからuserIdにキー設定されたデータを削除します。

Qiita記事 : [[Firebase Extensions] Delete User Data](https://qiita.com/giiiita/items/fdf81985a72689f87858)

## Firebase Emulator Suite
開発のためのローカル環境にFirestore, Functions, Realtime Databaseのエミュレータを提供する。

# アプリの品質とユーザーエンゲージメントの向上

### Firebase App Distribution
テスターにiOSおよびAndroidテストアプリを配布できる。

### Googleアナリティクス、Firebase Remote Config、Firebase Cloud MessagingでWebアプリの機能を拡張
これまでネイティブにしか提供していなかったが、ウェブもサポートに含めるようになった。
Googleアナリティクスとの統合を拡大してウェブのサポートを含めるの

### Firebase Predictions
アプリのユーザーの行動をアナリティクス データに機械学習を適用し、ユーザーの予測された行動に基づいて動的にユーザー セグメントを作成します

# 制御、柔軟性、透明性の向上

### Firebase SDKのオープンソース化
SDKがGitHubでオープンソース化したらしい

#### Android
firebase-android-sdk
https://github.com/firebase/firebase-android-sdk

#### iOS
firebase-ios-sdk
https://github.com/firebase/firebase-ios-sdk

#### Web
firebase-js-sdk
https://github.com/firebase/firebase-js-sdk

### Firebaseプロジェクトへのアクセスを制限
Firebaseプロジェクトとデータへのアクセスを適切な人に制限するために、事前定義されたFirebaseロールを使用するか、独自のカスタムロールを作成できます。

# Firebase Summit 2019からのその他のエキサイティングなニュース

### Firebase Test Labでテストの実行時間を短縮
Test Shardingでテストを高速化できるようにした

### ファブリックの移行に関する更新
Fabricダッシュボードは2020年3月31日に終了、Firebase App Distributionに移行しましょう
Swift 簡易DI

# 目的・目標

- Swiftで手軽にDI
- ライブラリは使わずお手軽に
- 細かいことは気にしない

# リポジトリ

アーキテクチャは、よりDIのありがたみを感じられそうな`MVP + Clean Architecture`を選定

[https://github.com/iwanagat85/SwiftDI]

# さっそく作っていく

### Injector

`AppInjector`で`UIViewController`にインスタンスを注入する。

```swift:AppInjector.swift
import Foundation

public struct AppInjector:
        MainViewInjector {
}

protocol MainViewInjector: AppProvider {
    static func inject(_ controller: MainViewController)
}

extension MainViewInjector {
    static func inject(_ controller: MainViewController) {
        controller.inject(presenter: provide(controller))
    }
}
```

### Provider

コンストラクタで要求されるインスタンスを提供する。
なにも考えずにコンストラクタの引数に`provide()`って書いていけばいいので割と楽。
別名を付けれないからアプリの規模が大きくなると辛みが出てきそう。

```swift:AppProvider.swift
import Foundation
import UIKit

protocol AppProvider {
}

// Presenter
extension AppProvider {
    static func provide(_ controller: MainViewController) -> MainPresenter {
        let presenter = MainPresenterImpl(useCase: provide())
        presenter.view = controller
        return presenter
    }
}

// Domain
extension AppProvider {
    static func provide() -> TodoUseCase {
        return TodoUseCaseImpl(repository: provide())
    }
}

// Data
extension AppProvider {
    static func provide() -> TodoItemRepository {
        return TodoItemRepositoryImpl(dataSource: provide())
    }

    static func provide() -> TodoItemDataSource {
        return TodoItemDataSourceImpl()
    }
}
```

Singletonにしたいときはこんなのを使う。
Dictionaryを弱参照にしてもいいか。

```swift:SharedInstanceManager.swift
class SharedInstanceManager {

    static var shared = SharedInstanceManager()
    
    private var container: [String: Any] = [:]

    private init() {
    }

    func provide<T>(_ alias: String? = nil, _ selector: () -> T) -> T {
        if let sharedInstance = container[alias ?? String(describing: T.self)] as? T {
            return sharedInstance
        } else {
            let instance: T = selector()
            container[alias ?? String(describing: (T.self))] = instance
            return instance
        }
    }
}

static func provide() -> TodoItemDataSource {
    return SharedInstanceManager.shared.provide { () -> TodoItemDataSource in
        return TodoItemDataSourceImpl()
    }
}
```

### Presenter

```swift:MainPresenter.swift
import Foundation
import UIKit

public protocol MainPresenterView: PresenterView {
}

public protocol MainPresenter: Presenter {
}

public class MainPresenterImpl: MainPresenter {

    var view: MainPresenterView?

    private let useCase: TodoUseCase

    init(useCase: TodoUseCase) {
        self.useCase = useCase
    }

    public func initialize() {
    }

    ...

}
```

### Controller+View

```swift:MainController+PresenterView.swift
import Foundation
import UIKit

extension MainViewController: MainPresenterView {

    func inject(presenter: MainPresenter) {
        self.presenter = presenter
        self.presenter?.initialize()
    }

    ...
}
```

# 所感

- 画面数が少なかったり遷移が単純なアプリなら十分使えそう
- `provide`を繋げていけばData層までDIできる
    - ユースケース等多くなってきたら循環参照に注意
- スコープやエイリアス、気になりだすと、、、
    - 世のDIライブラリの凄さを改めて実感
PythonのImage.open後にcloseしなくてもいいのか

# pythonのopen

pythonでファイルを開くときは組込関数の`open`を使う。`open`を使うとファイルオブジェクトを返してくれるので、ファイルオブジェクトの持つAPIを使ってファイルの読み書きができるようになる。

ファイルオブジェクトというのはディスク上のファイル等にアクセスするために用意されたAPIであり、pythonでは標準的には`open`を使って呼び出す。非常に基本的な操作なので、Pythonを扱う人なら誰もが使う機能である。

# ファイルオブジェクトのclose

`open`を使うときは`with`句とセットにして使うか、`close`メソッドを明示的に使うかの処理を行う必要がある。

```python
with open('xxxxx.txt', 'r') f:
    contents = f.read()
```

```python
f = open('xxxxx.txt', 'r')
contents = f.read()
f.close()
```

このように何かしらの形でファイルオブジェクトを閉じる必要があるのは、ファイルオブジェクトを大量にあけてしまうと`Too many open files`のOS Errorを起こしてしまうためである。

# 画像を扱うpillowのImage

pythonで画像を開くときによく使われるのがpillowのモジュールの`Image`である。

```python
from PIL import Image
im = Image.open('xxxxx.jpg')
```

ファイルにアクセスするので内部的にファイルオブジェクトを生成しているはずだが、組込の`open`と同様に、`with`や`close`を使わなくてもいいのか。

# Imageのライフサイクル

`Image`は`open`したときにファイルオブジェクトを作る。そして、実際に画像データを読み込むときに`load`メソッドが内部的に実行される。これが実行されると自動的にファイルオブジェクトは`close`される（ただし、これはsingle-frameのpngやjpg等の話で、multi-frameのgif等では`close`されないことに注意）。このため、`Image`は`close`のメソッドも持つが、通常の場合は`close`しなくても問題なくなる。

まとめると、

- jpgやpngなどのsingle-frameの画像ファイルの読み込みでは、`close`をする必要はない。
- ただし、gifなどのmulti-frameの画像ファイルを読み込む場合は勝手に`close`されないので注意。


# 所感

- 画像を扱うときに一回データを呼び出したら、ファイルオブジェクトを再度使うことはあまり想定されないと思うのでよくできた仕組みだなあと思った。
- よくできた仕組みではあるが、組込の`open`との違いをちゃんと把握しておかないと混乱しそうだなあと思った。


# 参考

- [File Handling in Pillow](https://pillow.readthedocs.io/en/stable/reference/open_files.html#file-handling)
- [Image Module](https://pillow.readthedocs.io/en/stable/reference/Image.html)
- [Source code for PIL.Image](https://pillow.readthedocs.io/en/stable/_modules/PIL/Image.html#open)
javascriptでカメラのフロント・バックを切り替える方法

#概要
WebARやWebビデオ通話など、カメラを使うWebアプリを作る際、フロントとバックを切り替える必要がある。
javascriptを使ってカメラを切り替える方法を共有する。

#コード

```index.js
var cameraFacing = false;

// clickイベントリスナーで、切り替えボタンがタップされた時に切り替えを行う。
change_btn.addEventListener("click", function(e){

    e.preventDefault();

    var vi = document.querySelector('video');
    const mode = cameraFacing ? "environment" : "user";

    // フロントカメラをそのまま使うと、左右反転してしまうので、activeクラスとcssでミラー処理
    cameraFacing ? document.querySelector('video').classList.remove("active") : document.querySelector('video').classList.add("active");
    // canvasはAR.jsを使っている時
    cameraFacing ? document.querySelector('canvas').classList.remove("active") : document.querySelector('canvas').classList.add("active");

    // Android Chromeでは、セッションを一時停止しないとエラーが出ることがある
    stopStreamedVideo(vi);

    // カメラ切り替え
    navigator.mediaDevices.getUserMedia({ video: { facingMode: mode } })
            .then(stream => vi.srcObject = stream)
            .catch(err => alert(`${err.name} ${err.message}`));

    cameraFacing = !cameraFacing;
});

// videoセッション一時停止
function stopStreamedVideo(videoElem) {
    let stream = videoElem.srcObject;
    let tracks = stream.getTracks();

    tracks.forEach(function(track) {
        track.stop();
    });

    videoElem.srcObject = null;
}
```

```common.css
/* インカメで左右反転 */
video.active, canvas.active {
    transform: rotateY(180deg);
    -webkit-transform:rotateY(180deg);
    -moz-transform:rotateY(180deg);
}
```

#解説
environmentでバックカメラ、userでフロントカメラに切り替えることができる。

```index.js
// バックカメラに切り替え
navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } })
         .then(stream => vi.srcObject = stream)
         .catch(err => alert(`${err.name} ${err.message}`));

// フロントカメラに切り替え
navigator.mediaDevices.getUserMedia({ video: { facingMode: "user" } })
         .then(stream => vi.srcObject = stream)
         .catch(err => alert(`${err.name} ${err.message}`));
```

ボタンをタップするたびに、バックとフロントを切り替えるために、グローバル変数で現在のカメラ状況を管理して切り替えている。
（本当は現在使っているカメラの状況を取得して切り替えたいが、やり方が見つからなかった。知っている方は、教えていただけると助かります）

```index.js
var cameraFacing = false;
...
const mode = cameraFacing ? "environment" : "user";
...
cameraFacing = !cameraFacing;
```
vmcore を読んでみる(2)

前回のつづきです。
https://qiita.com/intrajp/items/d31b4a86b50fd65f0995
手っ取り早く、カーネルのどこで引っかっかっているかを検出します。

set は、crash した時に実行していたプロセスそのものを表示します。
実行してみます。

```
crash> set
    PID: <数値>
COMMAND: "<実行していたコマンドが表示される>"
   TASK: <アドレスが表示される>  [THREAD_INFO: <アドレスが表示される>]
    CPU: 1
  STATE: TASK_RUNNING (PANIC)
```

ここまでで、以下がわかりました。

実行していたコマンドとそのプロセスおよびCPU

では、このプロセス確認します。
crash>ps

パニック時には、CPU0 と CPU1 にて xxxxxxxx コマンドが実行されていました。
理由:アクティブなタスクが行頭の > となるため。

```
   PID    PPID  CPU       TASK        ST  %MEM     VSZ    RSS  COMM
> <数値>      1   0  <アドレスが表示される>  RU   <数値>  <数値>  <数値>  <コマンドが表示される>
  <数値>      1   0  <アドレスが表示される>  RU   <数値>  <数値>  <数値>  <コマンドが表示される>
  <数値>      1   0  <アドレスが表示される>  IN   <数値>  <数値>  <数値>  <コマンドが表示される>
> <数値>      1   1  <アドレスが表示される>  RU   <数値>  <数値>  <数値>  <コマンドが表示される>
```

ページを繰っていきます

crash>log
G を押下して、最終行に飛びます。
あるいは、set scroll off とすると、最終行まで一気に表示します。

```
...(snip)...
[経過時間] Call Trace:
[経過時間]  [<アドレスが表示される>] xxxx+0x../0x..
[経過時間]  [<アドレスが表示される>] xxx+0x.../0x...
[経過時間]  [<アドレスが表示される>] xxx+0x../0x..
[経過時間]  [<アドレスが表示される>] xxx+0x../0x...
[経過時間]  [<アドレスが表示される>] xxx+0x../0x..
[経過時間]  [<アドレスが表示される>] xxx+0x../0x..
[経過時間] Code: xxxxxxxx
[経過時間] RIP  [<アドレスが表示される>] <コマンド>+16進数
[経過時間]  RSP <アドレスが表示される>
```

ここで確認できたメモリアドレスを、メモリマップで確認すると、どのコードの何行目かがわかります。

```
crash> kmem <メモリアドレス>
<メモリアドレス> (t) <関数名>+<数値> /usr/src/debug/<カーネルバージョン>/linux-xxx/xxx/xxx/xxx.c: 行数

      PAGE       PHYSICAL      MAPPING       INDEX CNT FLAGS
<仮想アドレス>  <物理青レス>           0        0  1 xxxx reserved
```
つづきです。
https://qiita.com/intrajp/items/92f78772ba0bf8b68e12
YOLOv3 追加学習

非常に雑に作りました。
一時的にアップさせていただきます。



追加学習するとき
1. 画像を集める
2. アノテーションをする
3. 以前から学習しているモデルの画像フォルダとAnnotationフォルダに追加して加える
4. 以前のtrainval.txtファイルに新しいtrainval.txtの内容を追加で書き込む
5. コマンドプロンプトでディレクトリに進み、 voc_annotation.pyを実行
6. 実行後、2007_train.txtが生成され、これをtrain.txtに名前を変える
7. ただし、jpgファイルであることを確認する
8. tiny_trainし終わった後は、a_trained_weights_final.h5ファイルを置き換えるだけ
CANについて

# CANとは

CAN（Controller Area Network)oller Area Network)は、主に自動車、医療機器、FA機器、産業機器などなど様々な分野で採用されている**シリアル通信プロトコル**である。
CANはISO(国際標準化機構)によって、**ISO11898、ISO11519**として規格化されている。

#CANの始まり

1970年代に自働車の低コスト、低公害（排気ガス等）、安全性等の向上を目指して電子化が進んでいた。様々な電子制御システムが開発されたが、統一規格がないため複数のバスラインが構成され、配線が増加した。配線の重量やスペースも大きくなるなどの負担が増えたため、「**配線の削減**」、「**複数LANでの大容量高速通信**」を実現するために車載ネットワーク用に開発されたのが始まりである。
現在では、CAN以外に「**LIN（Local Interconnect Network）**」、「**「MOST（Media
Oriented System Transport）**」、「**FlexRay**」、「**Ethernet**」などの通信規格がある。
また、自動運転などによって通信需要が増えたため、近年ではCANの拡張、上位版である「**CAN FD（CAN with Flexible Data rate)**」プロトコルも登場した。

# CANの特徴

 **1.ライン型ネットワーク（バス型？）**
　ネットワークにつながる様々な通信機器はノードと呼ばれる。複数ノードを繋げてネットワークを構築する方法には、スター型、リング型などがある。CANではライン型を採用しており、シンプルにネットワークを構築できる。元々配線の複雑さや増加を解消するためにCANが開発されたため、**配線設計を比較的容易に、ラインの追加削除も容易**に行えるライン型が採用されている。

**2.マルチマスター方式**
　バス（通信経路）が空いているときは、バスに接続されているすべてのノードが各ノードに対してバスアクセスが可能となっている。メリットとして、「**優劣がないため、均一な設計が行える**」、「**優劣がないため、イベント指向通信に向いている**」、「**ノードの追加が容易になる**」が挙げられる。

**3.CSMA/CA（Carrier Sense Multiple Access with Collision Avoidance）**
　上記、マルチマスター方式によって各ノードがバスが空いているときに同時にメッセージを送ろうとする場合がある。同時にメッセージを送信するとメッセージが衝突し、通信に影響がでてしまう。
  メッセージの衝突を減らすため、CANではCSMA/CAが採用されている。CSMA/CAは、メッセージにIDを付与することでIDの優先順位によってメッセージの送信を遅らせたりする。このIDの比較を通信調停（アービトレーション）という。

**4.耐ノイズ性**
　車載ネットワークに使用するために開発されたため、信頼性の高い通信規格である必要があった。外部からのノイズも多いため、その影響を受けないように「**2線式作動電圧方式**」が採用されている。
　通常は１本線のみで電圧レベルによって0-1を判定するが、外部ノイズによって誤判定を起こしやすい。2線式作動電圧方式では、2本線を用いてそれぞれに流れる電圧差を用いて0-1を判定するため、外部ノイズの影響を受けにくくしている。
　
**5.その他**
その他にもエラー検出機能や、様々あるが割愛！

# 用語関連

### ドミナント/レセシブ
　CAN通信は、デジタル信号"0","1"で行われる。"0"を「**ドミナント(優勢）**」、"1"を「**レセシブ(劣勢)**」と表し、CAN様々な仕様や機能はこのドミナントとレセシブが大きく関係する。

### バスアイドル
　CANは通信を行っていない場合、レセシブとなっている。この状態のことを「**バスアイドル**」という。

### DLC
　DLCはデータレングスコードと呼ばれ、送信するデータの大きさ(Byte)を示す。0~8Byteの間で設定ができる。

### CRC
　CRCは、データ送信におけるデータの誤りや破損を検出する。ただ、データの改ざん等に対する耐性はない。

# 最後に

フレームタイプ、CANの上位プロトコルであるJ1939、High Speed CANとLow Speed CANなどなど書こうと思えば幾らでもあるが一旦ここまで。

# 参考資料
[はじめてのCAN/CAN FD](https://www.vector.com/jp/ja/know-how/beginners/beginners-cancan-fd-jp/)
#Github で複数行に対してレビューをつける ( 左の行番号エリアでShiftを押しながら二行分を範囲選択してプラスボタンを押す  )

# 環境

Mac + Google Chrome

# 左の「行番号のエリア」をクリックして一行選ぶ

![image](https://user-images.githubusercontent.com/13635059/66245763-d5148a00-e74a-11e9-9f6e-87eb489b2469.png)

# Shiftを押しながらもう一行選ぶ

![image](https://user-images.githubusercontent.com/13635059/66245766-d5ad2080-e74a-11e9-9e5d-1389136bc8b9.png)

2019年9月現在、上から下の順でしか選べない様子。まあ、そのうち改善されるでしょ。

# プラスボタン + を押してコメントする

![image](https://user-images.githubusercontent.com/13635059/66245768-d6de4d80-e74a-11e9-9da2-715081de3f79.png)

# 見栄えはこんな感じ

![image](https://user-images.githubusercontent.com/13635059/66245769-d776e400-e74a-11e9-9b0a-c55cb6fdbbdc.png)

# 二個以上コメントをつけた場合って、混沌としないの？

コード表示画面だとちょっとカオス。

![image](https://user-images.githubusercontent.com/13635059/66245843-38062100-e74b-11e9-9ee2-d8d14c01d2af.png)

Conversationsには綺麗に出てくれるよね

![image](https://user-images.githubusercontent.com/13635059/66245988-3ab54600-e74c-11e9-9a78-34881f080fe1.png)

# どんな時に便利なの？

- 今までは範囲に対してレビューしたくても、1行を選んでいた。その判断が微妙だった。
- git的な変更があるときにうまく outdated 担ってくれる一行を見つける必要があった。
- 今回の変更で、範囲に対するレビューは、範囲に対してつけられるようになった。


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
大量のダミーデータを作ってみる

ダミーデータを簡単に作りたいと思ったので、試しに作成してみました。
いわゆる売上データのようなタイプを想定しています。
この例では6万件程度のレコードができ、データモデルへのロードには10～20秒くらいかかります。

###設定のいじり方
「複製数」の箇所を増やせば、件数が増えます。（変更後の件数は「目安」の箇所を見る）
「パターン」に入れている数値を変えると、発生パターンが変わり、各日付あたりの件数とその生成される値を変更することができます。
※Number.Random()を使わず、ロードするだけでは値が変わらないようにしたつもりです。

###コード

```pq:サンプル生成
let
    //乱数生成のパターン指定。これを変えない限りは、同じ数になる。
    パターン　=1,

    元の日付=List.Buffer(List.Generate(()=>#date(2000,1,1),each _<=#date(2019,9,30),each _+#duration(1,0,0,0))),

    複製数=15,
    目安 =List.Sum({1..複製数})/List.Count({1..複製数})*List.Count(元の日付),

    複製パターン=List.Transform( List.Random(List.Count(元の日付),パターン),
                                each Number.Round(
                                      (_+0.5/複製数)*複製数,0        //四捨五入で0にならないように調整。
                                     )
                ),
    複製後日付= List.Transform( List.Positions(元の日付),
                               each List.Repeat({元の日付{_}},複製パターン{_})
               ),

    //リストのリストになっているので、1重のリストに変換。
    日付リスト = List.Combine(複製後日付),

    //レコード数把握用にもステップを分けた。
    件数 = List.Count(日付リスト),

    //面倒なので、関数にまとめて同じ仕組みで生成。要件次第ではそれぞれ別内容で書くもよし。
    整数発生関数=(下限,上限)=>
                    [初期生成 =List.Transform(List.Random(件数,パターン),
                                             each [x =Number.Round(_*上限,0),y=if x>=下限 then x else null][y]
                              ),
                     null削除後=List.RemoveNulls(初期生成),
                     件数あわせ=null削除後 & List.FirstN(null削除後,件数-List.Count(null削除後))
                ][件数あわせ],

    IDリスト = 整数発生関数(1,1000),
    値リスト = 整数発生関数(100,100000),

    //リストをテーブルに変換する。
    テーブルへ合成 = Table.FromColumns({日付リスト,IDリスト,値リスト})
in
    テーブルへ合成
```
jQueryを活用したメッセージ入力ウィンドウの表示・非表示

先日ちょっとしたアプリをつくってみたところ、思いの外、反響があったので、特にご質問を多くいただいたメッセージの入力ウィンドウについて簡単に記事を書かせていただきます。

まずは動画をご覧ください。
![Alt text](https://gyazo.com/c5bf504035f8a6a75771e1b88c8047de/raw)

こちらはブログの投稿編集機能を持った簡単なアプリケーションですが、デザインに合わせてなるべくシンプルな投稿機能を実現したく、jQueryのclickイベントを利用したメッセージ入力ウィンドウの表示・非表示設定を行いました。

具体的なコードは以下に記載させていただきますが、至って単純ですね。笑
Newボタンを押したらメッセージ入力画面がfadeInし、メッセージ入力画面のcloseボタンを押したらそのまま入力画面がfadeOutするように設定しているだけです。

ただ、短いコードでも結構見た目的には映える設定ができるんだな、と個人的な気づきもあったので、みなさまの何かの参考になれば幸いです。

```javascript:header.js
$(function(){
  $(".before-form").on("click",function(){
    $(".before-form").fadeOut('fast');
    $('.blog-form').fadeIn('slow');
  });
});

$(function(){
  $(".close__btn").on("click",function(){
    $(".blog-form").fadeOut('fast');
    $('.before-form').fadeIn('slow');
  });
});

/* 以下、メッセージ送信機能の非同期化に伴う設定 */
$(function(){
  $(".input-box__submit").on("click",function(){
    $(".blog-form").fadeOut('fast');
    $('.before-form').fadeIn('slow');
  });
});
```

以下、大元となるhamlのコードも掲載します。
ちなみに、今回は本文（ブログの記事部分）がスクロールしても、Newボタンは残したかったため、Newボタンはヘッダーとして設定しています。

```haml:_header.html.haml
.header
  .header__left
    .header__logo
      =link_to blogs_path, class: "header__logo" do
        Blog
  .header__right
    =link_to edit_user_path(current_user), class: "top-menu1" do
      Edit User
    =link_to destroy_user_session_path, method: :delete, class: "top-menu2" do
      Signout
  .header__user-name
    Login user：
    =current_user.name

  .blog-form
    .input-box
      = form_for [@blog], html: {class: "new_blog"} do |f|
        = f.text_area :content, maxlength: 50 ,cols: 29.5, rows: 12, class: 'input-box__text', placeholder: '入力してください（50文字まで）'
        .input-box__image
          = f.label :image, class: 'input-box__image__file' do
            = fa_icon 'image', class: 'icon'
            = f.file_field :image, class: 'input-box__image__file__hidden'

        .close__btn
          Close
        = f.submit 'Send', class: 'input-box__submit'

  .before-form
    New!
```

以上、
祝・初投稿、自分。笑
2019-10-05 LPC > LPCXpresso54628 > IDE > SDKのインストール > SDK Builder | Installed SDKの表示の仕方 | Install SDK

```txt:動作環境
OS: Ubuntu 18.04 LTS
基板: LPCXpresso54628
IDE: MCUXpresso IDE v11.0.1 [Build 2563] [2019-09-01]
```

### 関連

- [LPC > LPCXpresso54628 > IDE > setupと実行](https://qiita.com/7of9/items/d5e74908f547a6aa61e5)


### 概要

- LPCXPresso54628で開発をしようとした
- プロジェクト新規にてSDK WizardのAvailable boardsで選択できない
- SDKをインストールする必要があるようだ

### SDK Builder 

各基板のSDKは下記のサイトから取得できるようだ（要ユーザ登録）。

https://mcuxpresso.nxp.com/en/welcome

今回は`SDK_2.6.0_LPCXpresso54628.zip`を取得した。

### インストール方法

Getting Started with MCUXpresso SDK, Rev. 10, 06/2019
p4に下記の記載がある。

> Drag and drop the SDK zip file into the "Installed SDKs"

"Installed SDKs"がIDEのどこにあるか分からない。

### Installed SDKの表示の仕方

- Web + Video : [MCUXpresso IDE - Importing MCUXpresso SDK](https://www.nxp.com/video/mcuxpresso-ide-importing-mcuxpresso-sdk:MCUXPRESSO-IDE-IMPORTING-SDK)

1:10あたりに表示方法の説明がある。

Window > Show View > Other...
MCUXPresso IDE > Installed SDKs

Other...
分かるか、ぼけ！

### SDKのインストール

ようやく表示されたInstalled SDKsに`SDK_2.6.0_LPCXpresso54628.zip`をドロップするとインストールされました。

めでたしめでたし

### 所感

LPCのシステムはわかりにくい。
説明資料が膨大にあるわりに、お互いがself-containedでない。
何かをするたびに「資料を探す」になる。
挫折した人のためのオブジェクト指向設計リベンジ

#はじめに#
オブジェクト指向設計が分からず挫折を繰り返した私が、習得のための考え方をご紹介します。
自分が挫折した経験を踏まえて書きますので、現状うまくオブジェクト指向が消化できていないという方にこそ読んで頂きたいです。
＃オブジェクト指向設計の方法論については既にQiitaに優れた記事がたくさんあるので、ここでは語りません。
＃私はWindowsに囲われた悲しきSIerなので、用語は.Net Framework基準になります。ご了承ください。

#オブジェクト指向に正解はない#
私がオブジェクト指向を覚えはじめた頃、社内のレビューで「どうしてこの設計にしたの？なぜ？」とかなりキツめに問い詰められました。
その時私は、自分が間違った設計をしていて怒られていると考えてしまいました。オブジェクト指向には私の知らない正解があるはずだと悩みました。
そして正解を求めて勉強を重ねるうち、ある言葉に出会いました。**「オブジェクト指向設計がどうあるべきかは設計者の視点で変わる」**と。
レビュアーは私が「どう考えて、どういう理由でこの設計したのか？」を知りたかっただけで、問い詰める意図はなかったのです。

オブジェクト指向設計は100人やれば100通りのクラス図ができると言われます。
設計原則さえ守られていれば、あとは正否ではなくプロジェクトが求める保守性と拡張性を達成できているかどうかの問題になります。
大事なのは自分がどう考えて設計したのか、はっきり説明できるようにしておくことです。
**オブジェクト指向設計に正解はありません。**アナタのソフトがどんな設計であるべきか、決めるのはアナタです。

できうる限りのケースを想定し、改造対してオープンで修正に対してクローズな設計を作りましょう。
考えに考え抜いた事実があれば、レビューの場でも自信を持って説明できるはずです。

#コンピューター世界をデザインしよう#
オブジェクト指向設計を説明する際に「現実世界をそのまま設計する」と表現している本やサイトは非常に多いです。私は、これはあまり良くないと考えています。
なぜなら、我々が作るプログラムはコンピューター世界に他ならないからです。
現実世界にデータベースはありません。フォームもテキストボックスも、演算子もありません。これらはコンピューター世界の住人です。

実際のオブジェクト指向設計では動物や車ではなく、架空の責務や概念をオブジェクトと捉えることがほとんどです。
現実世界の～は取っ掛かりの初心者へ説明するための比喩と理解し、発想の羽を広げてコンピューター世界をデザインしましょう。

#オブジェクト指向設計の宣伝文句を鵜呑みにしない#
頭の良い人たちは、しばしば不都合な真実を当たり前の認識として隠し、メリットのみを主張します。
頭の悪い私は言葉を額面通りに受け取り、え？？そうなの？分からない・・と悩まされました。
かつて私が悩まされた宣伝文句をご紹介します。
###オブジェクト指向設計をすると、if文が無くなってシンプルなコードになる###
本当でしょうか？嘘です。
ソフトの仕様として「～の場合は～する」と書かれている以上、プログラムのどこかにif文は存在します。
ただ、手続き型に比べると、if文の書かれる場所が変わってくるのです。
FactoryパターンやStrategyパターンはif文を生成側で持つことにより、結果としてビジネスロジックのif文を減らしています。

###オブジェクト指向設計をすると、改造ではクラスを追加するだけで済む###
本当でしょうか？嘘です。
クラスを追加すると、当然生成のためにFactoryクラスなどにも改造が入ります。
そうツッコむと「それは当たり前でしょ」と流されますが、なら追加する「だけ」とか言うな（怒

※他にもあれば、是非コメントでお寄せください！

#レビューをしよう！#
設計ができたら。どんどんレビューで人から意見を募りましょう。
様々な視点からアイデアを出し合うことで設計は洗練されていきますし、設計テクニックの引き出しも増えます。
アナタの設計が、必ずしも他の人に理解できるとも限りません。
アナタのソフトを受け継ぐ後任者のためにも、人が見てすんなり理解できるような設計にしておくことが大事です。

レビュアーがオブジェクト指向設計に精通していなくても構いません。
自分の考えを言葉にするだけでも客観視できるようになり、設計の良い部分や足りない部分に気づくことができます。
何より、知らない人に教えるというのは、最高のスキルアップ手段になります。

#責務集約のコツ#
最後にちょっとだけ技術的な話をします。
特に手続き型からオブジェクト指向に挑戦した人が苦しむポイントです。
電卓を例に説明します。
手続き型の人が、オブジェクト指向的に設計すると以下のようなクラス分割になります。
（関連やメソッドの引数などは省略します）
![クラス図0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506949/79de009f-e4ee-910a-1649-566f9cb36f12.png)
演算子ごとのクラスと演算処理クラスに分ける形ですね。
一見、良いクラス図に見えますが、これはNGです。
なぜなら、演算子クラスがすでに存在するのに、重複した責務を持つ演算クラスが存在するからです。
これは単一責務の法則に反します。

クラスの責務を単一にすることを考えると、以下のようなクラス図になります。
![クラス図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506949/e9c695d9-1904-a362-8f1a-5dcacb64b930.png)
演算子クラスにそのまま計算メソッドを持たせてしまうのです。
これにより、足し算という責務はPlusクラスに集約されました。

手続き型でのプログラミングをしていると、処理で分ける癖がついてしまい、データと操作を一緒にするという考え方になかなか慣れないと思います。
私自身この考え方の違いには苦労しました。
たくさん設計して感覚を変えていきましょう。

#まとめ#
・オブジェクト指向に正解はない。自分の考えをしっかり説明できることが大事。
・現実世界に囚われず、自由な発想で設計する。
・宣伝文句に惑わされない。
・レビューはどんどんやる。
・過去の設計手法に囚われず、感覚を変えていこう。

以上。お読み頂き、ありがとうございました！
エンジニアスタンプラリー～フロントエンド編＃9

## 企画主旨
[Frontend Developer Roadmap](https://roadmap.sh/frontend)をひたすら巡回する企画 
詳しくは[こちら](https://qiita.com/tonchan1216/items/8d5f072cf769dfe1bc4f)

## 今回の実施内容
CSS in JS
スタイルすらコンポーネント化するJSの強欲さ。
オレンジ項目だが、軽く触れていく。

## CSS in JS

#### Styled Components
黄色テーマの1つであるStyled Componentsを選択。
公式資料のGetting Startedとして、[Styled-components: Basics](https://www.styled-components.com/docs/basics#getting-started)の記事を参考にした。
SASSで作ったスタイルをひたすら移行する。

```javascript:TopBar.js
const Title = styled.h2`
  margin: 0;
  padding: 20px 0;
  text-align: center;
  background-color: ${props => (props.status === 'active' ? '#ffffd9' : 'white')};
`;

const Button = styled.button`
  border: none;
  background-color: inherit;
  text-align: center;
  width: 100%;
  height: 120%;
  :hover { text-decoration: none; }
`;

```

## 成果物
ただインポートするだけじゃなくて、JS内にスタイルを定義できた。
コードとしての視認性は高い気がする。
https://tonchan1216.github.io/WDR-frontend/v9/
https://github.com/tonchan1216/WDR-frontend/tree/v9.0
AR.jsでスクロールバーが発生する件

#課題
AR.jsで生成されるVideoタグで、Android ChromeやiOS Safariでスクロールバーが発生したり、拡大縮小できてしまったりする。
Safariでは、aframeのscreenshotメソッドを使うとスクロールバーが発生してしまう。

ピンチイン・アウトでモデルの大きさを変えたり、ドラッグで位置を変えたい時、スクロールバーが発生していると操作がうまく行かない。

```
aframe 0.8.0
ar.js 1.7.7
```

#解決策
まず、htmlのmetaタグに以下を指定する。

```index.html
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1, shrink-to-fit=no,user-scalable=no,viewport-fit=cover">
```

そしてjsファイルに、スマホのドラッグ操作を禁止するコードを追加すればOK。

```index.js
document.addEventListener("touchmove",
   function(e) {
      e.preventDefault();
   }, { passive: false }
);
```

ドラッグやピンチでモデルの位置・大きさを変えたい時は、別途指定してあげる。
touchmove のイベントリスナーはスマホでしか動作しないので、注意。

```index.js
let divElement = document.getElementById("target");

divElement.addEventListener("touchmove", function(event) {
   // ドラッグ時の処理
}
```

#参考
- [github](https://github.com/jeromeetienne/AR.js/issues/512)
[Python]Excelの期間データを抽出し、その結果を別のExcelに書き込む

#pythonで Excel の読み書きをさせる基本テクニック
###必要なモジュール
`pip install pathlib pandas datetime`
　・pathlib（Windowsのパスをそのまま書いて通用させるため） 
　・pandas（Excelのデータ操作をさせるため）
　・datetime（日付の大小を判別させるため）
　(下のコードの time は時間計測用に入れただけなので、いれなくてもOK)
　この３つでOK。

####[処理環境]
・Windows8.1 64bit
・Python3.7.4

```Excelの期間データを抽出し、その結果を別のExcelに書き込む.py
# モジュールのインポート
import os
import pathlib #Windowsパス
import pandas as pd #Excel→csv等のEXCEL操作
import time #時間計測用(時間を測る必要がなければ入れなくてOK)
from datetime import datetime #日付取得用; datetimeクラスをインポート

start = time.time() #処理開始

# pathlib.WindowsPath(r の rオプション によって、わざわざ \\ と書かなくてよくなる。
# これで、WindowsPCであれば ローカル/社内サーバー に関わらず、絶対パスをそのまま指定して通用する。

# 見たいExcelファイル
rfl = pathlib.WindowsPath(r'\\Server-01\Public\売買台帳\2019.xlsx')
# 集計した結果を貼り付けるExcel
wfl = pathlib.WindowsPath(r'C:\Users\username\Desktop\201908.xlsx')

# 読みたいExcelシート名
stu = '売上'
sts = '仕入'

# Excelシートの中にある、読ませたい列の名前（例では、決済日）
ksb = '決済日'

# Excelファイルの読み込み
dfu = pd.read_excel(rfl, stu, index_col=None)
dfs = pd.read_excel(rfl, sts, index_col=None)

#読みたいデータ列の型を整える（例では決済日を見たいので、日付型に変換）
dfu[ksb] = pd.to_datetime(dfu[ksb], errors='coerce')
dfs[ksb] = pd.to_datetime(dfu[ksb], errors='coerce')

#抽出開始(例では、2019/8/1～8/31 までに決済されたデータを絞り込む)
dfu1 = dfu[(datetime(2019,8,1) <= dfu[ksb]) & (dfu[ksb] < datetime(2019,9,1))] 
dfs1 = dfs[(datetime(2019,8,1) <= dfs[ksb]) & (dfs[ksb] < datetime(2019,9,1))]

# 結果をExcelに出力する
with pd.ExcelWriter(wfl) as writer:
    dfu1.to_excel(writer, sheet_name='売2019.08')
    dfs1.to_excel(writer, sheet_name='仕2019.08')

'''
# CSV形式で出力
data1.to_csv(os.path.join(dDir, '売上.csv'), encoding='utf_8_sig')
data2.to_csv(os.path.join(dDir, '仕入.csv'), encoding='utf_8_sig')
'''
elapsed_time = time.time() - start #処理終了
tkinter.messagebox.showinfo('ウェ～イ♪', format(elapsed_time) + "[sec]")
```

　フタを開けてみたら簡単なプログラムなのですが、日付の判定のところでコンパイルが通らなくて、意味不明なエラーが出て悩みました。

　 **`import datetime`** と **`from datetime import datetime`** ですね。

　コイツらは曲者でした。カタチは似ているけれど、全然別物だったとは。自分は知りませんでした。 

　しっかし…昨日から完徹してマスターした「[サーバーからコピーしたExcel](https://qiita.com/kazta/items/f44d79e70a6c8e97ff50)をデータ抽出して書き込み」
　このpythonテクをさらに応用していったら、確実に実務効率に直結するのが嬉しくて仕方ありません。 多分今までの３倍位早くなります（推定）。

　おそらく私だけではなく、似たようなルーチンを抱えてる人にお役立ちできるのではないかと思います。たたき台として修正・改良いただけましたら望外の喜びです。

　まだまだ先は長いですが、とりあえず一歩進めたので意欲が湧いてきました＼(^o^)／。エラー解決の情報を残してくれた、多数の見知らぬ先人の方々。本当にありがとうございました。