OmniAICreator/Qiita-1.07M huggingface dataset:
c#でatcoder その4

#概要

c#でatcoderの練習問題やってみる。

#練習問題

10000円札と、5000円札と、1000円札が合計でN枚あって、合計金額がY円であった。このような条件を満たす各金額の札の枚数の組を1つ求める問題です。

#成果物

https://paiza.io/projects/2d8nUTG7oqaMy6gUPJ5OYg

以上。
Powershellで単純パーセプトロン 

# Powershellで単純パーセプトロン

## なぜPowershellで書くのか

1. はじめににわかにAIの勉強がマイブームになった。
2. そこで素晴らしい記事に出会う。[単純パーセプトロンの解説・実装](https://qiita.com/mur999999999999/items/74a3a89ffcccb688d71f)。
3. これなら凡人たる私でもできそうだ。だが、私はPythonを知らぬ。<br/>環境を創り出すことなどできぬ。第一日である。
4. そんな私の目の前にWindows PCがあった。<br/>すると、Powershellが稼働しているではないか。第二日である。

## 書いてみた

ということで書いてみました。実行結果は1です。成功です！

```powershell
function dot($vec0, $vec1) {
    $tmp = 0;
    for ($i = 0; $i -lt $vec0.Count; $i++) {
        $tmp += vec0($i) * $vec1($i)
    }
    return $tmp
}

function step($num) {
    if ($num -gt 0) {
        return 1
    }
    else {
        return 0
    }
}

$i = New-Object 'System.Collections.Generic.List[int32]'
$w = New-Object 'System.Collections.Generic.List[int32]'

$i.AddRange([int32[]]@(1,2,3))
$W.AddRange([int32[]]@(1,2,3))
$z = step dot $i $w

Write-Output $z
```
ビュート ローバーARM(Vstone社)のCygwin開発環境構築

## Vstone社のBeauto Rover ARM(ビュートローバー)のCygwin開発環境の構築

### はじめに
Vstone社のライントレースロボのビュートローバー(ARM版)を購入した。
C言語でファームが開発でき、mbed同様にUSBメモリとして認識されるフォルダにファームをコピーするだけでファーム更新可能。
C言語開発環境のLPC Expressに取り込めるLEDサンプルプロジェクトを見たら、コンパイラがarm-none-eabi-gcc！
STM32のCygwin開発環境用にインストールしていたので、コンソールで開発することにした。

### 必要な物の確認
コンソールで開発するには、リンカスクリプトとスタートアップアセンブラが必要なので、CD-ROMのLEDサンプル [VS-WRC103LV_Sample_LED_20110118_1104.zip](https://www.vstone.co.jp/products/vs_wrc103lv/download/VS-WRC103LV_Sample_LED_20110118_1104.zip)に含まれてるか確認する。
Releaseフォルダにvs-wrc103lv_Release.ldがあり、同フォルダにあるmakefileを検索するとリンカスクリプトととして設定されていた。

```makefile:makefile
arm-none-eabi-gcc …… -T ……/wrc103lv_Release.ld ……
```

スタートアップアセンブラは、どのフォルダを探しても無かった。ARM Coretex-M3は電源投入後、0x0に設定されているアドレスをスタックに設定し、次の0x4に設定されてるアドレスをプログラムとして実行する。
ARMの標準規約でこの実行するアドレスはReset_Handlerにすることになっている。
Reset_Handlerをgrepするとcr_startup_lpc13.cに定義されていた。
内容を確認すると、インラインアセンブラで各セクションの初期化を行い、その後にmain()をコールしており問題なかった。

```c:cr_startup_lpc13.c
Reset_Handler(void) {
  …(省略)…
  __asm("ldr r0, =_bss\n"
        "ldr r1, =_ebss\n"
           …(省略)…
        );
   …(省略)…
#ifdef __USE_CMSIS
     SystemInit();
#endif
   …(省略)…
   main();
   while (1) {;}
```

あとは、SystemInit()が提供されてるかの確認。ARMの標準規約CMSISでは、マイコンコアの初期化をSystemInitで行い、ソースかライブラリで提供となっている。
SystemInitでgrepしたら、libCMSISv1p30_LPC13xx.aでヒットした。
開発に必要なものは揃っていると確認できた。

### Cygwinのインストール
[Cygwinのサイト](http://cygwin.com/) にアクセスしてインストールする。makeが必要なので無ければsetup-x86(_64).exeを実行してバイナリをインストールする。

### arm-none-eabi-gccのインストール
[GNU-RM Downloads – Arm Developerのサイト](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)からarm-none-eabi-gccをダウンロードしてインストールする。
windowsの環境変数のPathにインストールフォルダのbinを追加する。
cygwinを再起動して、arm-none-eabi-gccが実行できることを確認する。

### makefile等の修正
LEDサンプルのmakefileはLPC Expressが自動生成/更新するらしく、ライブラリパスが絶対パスになっており、これを相対パスに修正する。

```makefile:makefile
 arm-none-eabi-gcc …… -L"../lib" ……
```

subdir.mkも同様に絶対パスを相対パスに変更する。
makeを実行すると libcr_semihost.a がリンクエラーになる。
これはPCのエミュレータ環境でファームを実行したときに、printf()を出力する時に使用するライブラリである。
不要なのでリンカスクリプトのINCLUDEごとコメントアウトする。

``` vs-wrc103lv_Release.ld 
/* INCLUDE "vs-wrc103lv_Release_lib.ld" */
```

再びmakeをすると、環境によってはコンパイルに成功してファームが作成されるかもしれないが、マイコンボードに焼いても動作しない可能性が高い。
または、checksumコマンドか無くてファーム作成に失敗するかもしれない。

### checksumコマンドの差し替え
ファームにチェックサムを付加しており、ファーム更新時に正しいか確認しているらしい。
適当なチェックサムコマンドを使うと互換性がなくファームが動作しない。
次のURLからダウンロードしたchecksumを使用する。
[checksum_lpc760.zipのダウンロード](http://tiryoh.com/blog/wp-content/uploads/2015/08/checksum_lpc760.zip)
windowsの環境変数のPathにインストールフォルダを指定し、Cygwinからchecksumコマンドが起動できることを確認する。
makeを実行し、作成されたファームをマイコンボードに焼くとLEDが交互に点灯する。

### 参考文献
・Vstone社: [VS-WRC103LV取扱説明書](https://www.vstone.co.jp/products/vs_wrc103lv/download/VS-WRC103LV_doc_ver04.pdf)
Spring BootでWebプロジェクトを作ったりバージョンを変えたり

Spring Bootでできることをメモってく
リファレンス充実してるからそれをなぞって試してく感じで

# 準備

## GitHub
https://github.com/ShassBeleth/SpringBootExample

書いてあることはここで管理していきます


## Spring Initializr
Spring Bootのバージョンは2.2.2開始
バージョン上がるたびにその差分を吸収していきたい

[Spring Initializr](https://start.spring.io/)でプロジェクトを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/e02175a3-bb94-d35f-d910-96e2f92a8acb.png)

前Initializr見た時と見た目が違う・・・
これも結構バージョンアップする見たいだからちゃんと何が変わったかメモっていきたいなぁ


|選ぶヤツ|選んだヤツ|
|---|---|
|Project|Gradle|
|Language|Kotlin|
|Spring Boot|2.2.2|
|Group|com.example.spring.boot|
|Artifact|spring-boot-example|
|Name|SpringBootExample|
|Description|Spring Boot Example|
|Package Name|com.example.spring.boot.web|
|Packaging|Jar|
|Java|13|
|Dependencies|webを追加|

|選んだヤツ|思ったこと|
|---|---|
|Group|build.gradleに定義されてた<br><font color="red">けど何で活かすかわからん</font>|
|Artifact|プロジェクト名<br>setting.gradleにrootProject.nameが定義されてた|
|Name|アプリケーション名<br>HogeApplicationクラスにmainメソッドが作られたよ|
|Description|<font color="red">アプリの説明なのは名前見たらわかるけどどこに定義されるかがわからなかった</font>|
|Package Name|パッケージ名<br>これの通りに階層が作られてた|
|Packaging|<font color="red">JarとWarの違いはあまり詳しくない</font><br>最近Dockerで動かすことが多くなってtomcatとかのアプリケーションサーバに乗せるためにwarファイルを作る必要がなくなった気がする|
|Java|ここは動かす環境に合わせて変えた方がよさそう|

# Dependenciesにweb追加し忘れた・・・

`/build.gradle.kts`を編集

```gradle
dependencies {
	// 追加
	implementation("org.springframework.boot:spring-boot-starter-web")
}
```

# 動かそー
`Gradle`→`Tasks`→`application`→`bootRun`

Whitelabelだけど一応 http://localhost:8080 で動かせたでしょ

# Spring Boot 2.2.4.RELEASEに変更する

1/17追記
2020年1月17日にSpring Boot 2.2.3.RELEASEが発表されました

1/30追記
2020年1月21日にSpring Boot 2.2.4.RELEASEが発表されました

下記内容はSpring Boot 2.2.2.RELEASEからSpring Boot 2.2.3.RELEASEへの変更方法です
そのほかのバージョンでも同様の作業で変更可能です

Spring Bootのバージョンを変更するときは`build.gradle.kt`を以下に変更

```build.gradle.kt
plugins {
	id("org.springframework.boot") version "2.2.3.RELEASE"
}
```

Gradleを更新すると、ライブラリが2.2.3.RELEASEをさしてるのが確認できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/267c7324-386c-8532-3839-d476e8835938.png)

Spring Initialzrから取得できるプロジェクトとも比較しましたが、
特に追加しないといけないものもありませんでした。

<font color="gray">まぁビルドバージョンのリリースなんでね・・・変わってもらうほうが困るけど</font>
Spring Initializrで作ったWebアプリケーションをJARファイルからやっぱりWARファイルに変えたい

最近DockerでWebアプリを動かすことが増えてjarに固めることが多くなってきた気がする
つい最近まで仕事でSpring Bootを使うときはTomcatに載せてたからwarに固める必要があった（んだと思う）
まぁjarでいっかーと思ってたけどやっぱりwarにしたい！っていう時のためにメモ

# 前提

Spring Boot 2.2.2.RELEASE - 2.2.4.RELEASE
Kotlin 1.3.61
Gradle

環境は以下の記事のまんま

https://qiita.com/ShassBeleth/items/3f3afca83b8ef0b98ede

# 変更箇所
`/build.gradle.kts`の以下を編集

```gradle
plugins {
	// 追加
	war
}
```

```gradle
dependencies {
	// 追加
	providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
}
```

# 備考

`plugins`に`war`を追加しておかないと`dependencies`に`providedRuntime`を入れた時にエラーになる

# 課題

## providedRuntimeは普段使えないのか・・・？

gradleのバージョン変えちゃったか？
providedRuntimeがエラーになる・・・
後、GradleのbuildタスクにもbootWarってのが増えてるような・・・前からあったっけ？
buildのタスク見てもwar自体はスキップされてて、bootWarが呼ばれてるような・・・あれー？
Kibana の Discover を使ってみる

[Elasticsearch と Kibana 7.5.1 Windows をインストールしてみる](https://qiita.com/azumabashi/items/a6d989f02bf0e369023a)
と
[Elasticsearch に「銀の匙」を登録して検索してみる](https://qiita.com/azumabashi/items/cb6cdceebd673d5da699)
の続きです。

今度は登録した「銀の匙」を Kibana の Doscover を使って検索してみます。

Kibana の Manegement を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/dc7a5d43-d9fe-1f77-5167-0ed215c2acb2.png)

Index Patterns を選択してCreate Index Patterns を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/5fa71cdd-3ef0-dbe0-a717-3913d614364b.png)

Step 1 of 2 が表示されます。
既に j_litelature と gin_no_saji の2つのindex が作られていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/26c3a2ff-42e4-e4f5-3b7d-e62558021f0a.png)

入力エリアに gin_no_saji* と入力すると該当するindex が太文字で表示されます。ここで Next Step を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/81c69949-8417-5b7a-89aa-2ef6c67ddf71.png)

Step 2 of 2 が表示されました。Create Index Pattern を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/ed1e1cb1-b27c-c9fb-dd03-b7e61016b09b.png)

gin_no_saji* の Index Patterns が出来たようです。
次は Discover を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/ba9dc539-8ada-93c6-9b7e-96e5dc57f051.png)

Change Current Index Pattern を実行して gin_no_saji に切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/7d79cf12-476c-9c38-c65b-0aee9e575b42.png)

前回登録していた3件が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/03e1ebca-a077-a3a5-a18b-14cd4d5bea0c.png)

Search の入力欄をデータの各要素が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/63b99315-13a4-08fd-a4af-9f366246fca8.png)

content を選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/86d56b03-189f-66e1-9c72-169365c9c1dd.png)

equals some value を選択して 難産 と入力してみます。
1件、ヒットしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/7933a5c2-9060-7e70-e9ec-4e41225a2773.png)

今度は それは で検索してみます。
そ、れ、は　も引っかかってしまいました。
すごい、内部では１文字づつ管理しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/55621236-2b1d-faf3-ccb3-b2dfabd1002d.png)

それじゃあ "それは" で検索してみます。
そ、れ、は の単独では探しにいかないようです。
でもわけのわからないのも1件引っ張ってきています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/7e4f8566-e7e5-d666-7c9b-919929c72a18.png)

２バイト、日本語などの調整が必要かもしれません。
でも一応うまくいったということで終了とします。
Xcode Symbols tool failed

libAdapterIMobile.a というi-mobileから配布されているライブラリが原因だった。
使わないならXcodeのプロジェクトに入れない。
i-mobileのマニュアルがXcodeに追いついていない。


IDEDistiributionPipeline.log

```
openssl_grpc.framework.dSYM/
openssl_grpc.framework.dSYM/Contents/
openssl_grpc.framework.dSYM/Contents/Resources/
openssl_grpc.framework.dSYM/Contents/Resources/DWARF/
protobuf.framework.dSYM/
protobuf.framework.dSYM/Contents/
protobuf.framework.dSYM/Contents/Resources/
protobuf.framework.dSYM/Contents/Resources/DWARF/
2020-01-10 19:07:15 +0000  
2020-01-10 19:07:15 +0000  sent 4.51K bytes  received 578 bytes  10.16K bytes/sec
total size is 265.43M  speedup is 53513.80
2020-01-10 19:07:15 +0000  /usr/bin/rsync exited with 0
2020-01-10 19:07:15 +0000  Running /Applications/Xcode.app/Contents/Developer/usr/bin/symbols '-noTextInSOD' '-noDaemon' '-arch' 'all' '-symbolsPackageDir' '/var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/Symbols' '/var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a'
2020-01-10 19:07:15 +0000  error: No UUID for /var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a(GADMAdapterIMobile.o)
error: No UUID for /var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a(GADMAdapterIMobile.o)
error: No UUID for /var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a(GADMAdapterIMobile.o)
error: No UUID for /var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a(GADMAdapterIMobile.o)
error: No UUID for /var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a(GADMAdapterIMobile.o)
2020-01-10 19:07:15 +0000  /var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a [i386, 0.001686 seconds]:
/var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a [armv7, 0.001686 seconds]:
/var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a [armv7s, 0.001686 seconds]:
/var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a [x86_64, 0.001686 seconds]:
/var/folders/_h/d8hcb98135vcx2ylckn6rldr0000gn/T/XcodeDistPipeline.~~~UWwZfx/libAdapterIMobile.a [arm64, 0.001686 seconds]:
2020-01-10 19:07:15 +0000  /Applications/Xcode.app/Contents/Developer/usr/bin/symbols exited with 1

```
AWS LambdaでNODE_MODULE_VERSION系のエラーが起きたときの早見表

こういうエラーに遭遇することがある。

```
Something went wrong installing the "sharp" module

The module '/opt/nodejs/node_modules/sharp/build/Release/sharp.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 57. This version of Node.js requires
NODE_MODULE_VERSION 64. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).

- Ensure the version of Node.js used at install time matches that used at runtime
- Consult the installation documentation at https://sharp.pixelplumbing.com/en/stable/install/
- Search for this error at https://github.com/lovell/sharp/issues
```

## NODE_MODULE_VERSIONはどこでみる？

ここで確認できる。
https://nodejs.org/ja/download/releases/

## AWS Lambdaの場合
それぞれ以下のruntimeになる。

- NODE_MODULE_VERSION 57: nodejs8.10
- NODE_MODULE_VERSION 64: nodejs10.x
- NODE_MODULE_VERSION 72: nodejs12.x
正規表現の例文-任意の桁数で０埋め処理

#◆ 目的
数値の桁を揃えたいときに、数字の先頭に0をいれることで
桁数を揃えたいことがあります。

例えばIDを３桁揃えにしたいときは

ID:1
ID:12
ID:123
 ↓↓
ID:001
ID:012
ID:123

となります。
ただし、４桁が存在した場合は

ID:1234

とそのまま表示させるものとします。

#◆ 検索対象

ID:1
ID:12
ID:123
ID:1234

#◆ 検索文字列、置き換え文字列

１回では出来ないため、２回処理します。

まずは、３桁を超える量の0埋めをします。

`(ID:)(\d+)`
 ↓↓
`$1000$2`

> ID:0001
> ID:00012
> ID:000123
> ID:0001234

次に、３桁に調整します。

`(ID:)0*(\d{3,})`
 ↓↓
`$1$2`

> ID:001
> ID:012
> ID:123
> ID:1234


#◆ 解説

分解して考えます。
`(ID:)` `(\d+)`
 ↓↓
`$1` `000` `$2`

`(ID:)` `0*` `(\d{3,})`
 ↓↓
`$1` `$2`

...

まずは、下記の文字列を探索します。

`(ID:)`

置き換え後に再利用するため `( )`で囲みます。※１つ目

`(\d+)`

次に、数字も `( )`で囲みます。※２つ目
最低限１文字の数字がないと意味ないので、
・`*`(0回以上の繰り返し)ではなく
・`+`(1回以上の繰り返し)を利用。

検索にHITした値はそのまま再利用できますが、
◎文字あるから、☆文字を足す
などの振り分け処理は出来ません。
そのためいったん0を多めに入れて、次に任意の桁に調整します。

`(ID:)` 再度同じ文字列で探索開始
`0*` 多めに埋めた0を最長マッチ（多めに入れた分は削除）
`(\d{3,})` 0埋めのあとに3桁以上の数字

真ん中が、最長マッチなので、最後の数字は基本は３桁だが
４桁以上でもちゃんと取得できる

`$1` `$2`

あとは、最初と最後をくっつけるだけ
Gatling のレポートデータを加工する

## TL;DR

Gatling の HTML レポートに出力されるデータは、実は JSON でも出力されています。
この JSON ファイルをパースすることで、結果を加工したり、他のプログラムやスクリプトに渡すことができます。

## ファイルの場所

`$GATLING_HOME/reports/(scenario name)/js/stats.json` にあります。

```json:js/stats.json
{
  "type": "GROUP",
  "name": "Global Information",
  "path": "",
  "pathFormatted": "group_missing-name-b06d1",
  "stats": {
    "name": "Global Information",
    "numberOfRequests": {
      "total": 13,
      "ok": 13,
      "ko": 0
    },
    "minResponseTime": {
      "total": 238,
      "ok": 238,
      "ko": 0
    },
    ...
  }
}
```

なお、これらはHTMLレポートの "STATISTICS" の表に対応しています。

<img width="908" alt="スクリーンショット 2020-01-11 2.16.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239145/f8765bf7-1720-7046-acf6-a7a3b7432c31.png">

## JSONデータの加工

jq を使ってデータを加工してみます。

例) 各リクエストの 50pct,75pct,95pct,99pct をそれぞれCSVとして出力する。

```bash
cat js/stats.json |\
  jq '.contents[].stats | [.name, .percentiles1.ok, .percentiles2.ok, .percentiles3.ok, .percentiles4.ok] | @csv' -r
```

```csv:結果
"Home",413,456,490,496
"Home Redirect 1",322,329,335,336
"Search",238,238,238,238
"Select",339,339,339,339
"Page 1",327,327,327,327
"Page 2",338,338,338,338
"Page 3",286,286,286,286
"Page 4",297,297,297,297
"Form",892,892,892,892
"Post",359,359,359,359
"Post Redirect 1",672,672,672,672
```

これで Spread Sheet などにコピペしたり、複数のシナリオの実行結果を集計したりするのが楽できるかも。

## 参考: そもそもの経緯

結果を Excel でグラフ化するときに、HTML レポートの表をコピペするのがだるくて自動化したかったのですが、ググってもなかなか情報にたどり着けませんでした。

この Issue の最後に「JSONがあるよ」と一言コメントがありました。
https://github.com/gatling/gatling/issues/593#issuecomment-83375529
とりあえずTeXはOverleafじゃなくてVSCodeで書くことにします。

これまで、AtomでTeXを書いてきたが、Atomが重くて書きにくい！！！ってなったので、乗り換え先を探して来ました。

Online TeX Editor環境を整えて、どの環境でもTeXを書けるようにして最高になろうと思って色々探して、Overleafを使おうと思いましたが、Gitで管理やGoogle Driveにバックアップなどの機能が有料で使えないので諦めました。

結局、VSCodeのLatexWorkshop環境で書いたらそれで良いかなって結論になりました。

これから当分は、議論用の小さい文章は[overleafの無料プラン](https://ja.overleaf.com/)や自前で立てたOverleaf環境で書いて、ファイルが大きくなって重要な文章になったらVSCodeでGit管理するようにしようかな。

ちなみに、AtomはTeX環境を整えるのに4つのプラグイン(language-latex, latex, latexer, pdf-view)を入れますがVSCodeならLatexWorkshopのみです。また、両方使ってみましたが、明らかにVSCodeのが安定してます。これからTeX環境を整えるときにAtomとVSCodeで書くのを迷ってる人は、VSCodeをおすすめします。
Git入門 ~gitの登録からpushまで~

# はじめに
この記事ではgitの使い方を「これはどのような意味？」ではなく「どうやったら使えるか」を中心に書きます．なので，時間がない人，とにかく一回成功させてみたい人向けです．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/f804acbe-fb70-ab1d-ba99-1a0bfa919f21.png" width="400">

# ここだけLinux,Windows向けの話
gitが最初から入っていないので以下の記事を参考にインストールをしてください
[Linux向け](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
[Windows向け](https://qiita.com/kamishi/items/5a3eed06c122f28fe2ea)

# そもそもgitとは
「バージョン管理ツール」ってよく言われます．僕は簡単に説明する際にタイムマシンとも呼んでいます．
つまりどうゆうことかといいますと，
1日目: コードAを書いた
2日目: コードAにBを追記した
3日目: コードAにCを追記した
4日目: コードAにDを追記した
5日目: コードC,Dにバグ発見！全く別物のコードが必要になった！！

* ここでgitがないとき
さて，どれが3,4日目に書いたコードかわからなくなってしましました．
A「その一行，２日目のコードだっけ？」
B「いや，３日目のコードだよww」
A「じゃあ消すか」
~次の日~
A,B「やばい！昨日消したコード必要だった！！」

* ここでgitがある時
**2日目と3日目の間にタイムワープできます**

はい，便利ですね．他にも共同開発の効率化だったりクラウドストレージとしてだったり様々な用途で使えます．

# GitHubの登録
[ここ](https://github.com/)にアクセスしてください．
![スクリーンショット 2020-01-11 1.45.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/1accfc57-66bf-9186-7dd4-eb72c4281f0e.png)
そしたら右上のsign upを押して，必要な項目を入力した後，メール認証すれば終わりです．

# 準備
そのまま左上あたりの「create repository」を押してください．
![スクリーンショット 2020-01-11 1.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/df9d36be-dc9e-1892-79ca-4c6456378b40.png)
こんな感じになるので，repository nameに「Test」とか入れてください．これは，レポジトリと呼ばれるgithub上のフォルダを新規作成して，名前をつけているような物です，

終わったらデスクトップに戻ってください．そしたら，好きなように新規フォルダと中にファイルを作ってください．なんでもいいです．このフォルダとgithub上のレポジトリを対応付けます．今回は非公開リストとか記載しないので個人情報とかはかかないでください．全部ネットに上がります．
![スクリーンショット 2020-01-11 1.51.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/e77ab989-159e-7e1f-2d0f-523ae920389f.png)

そこまでやったらターミナル(コマンドプロンプト・端末)でそのフォルダへ移動してください



# 最初一回だけ打つコマンド
これ是非覚えてください！！（でもググれば無限に出てきます）

```sh
$ git init
$ git remote add origin ここにさっき作ったレポジトリのURL
```

さっき作ったレポジトリのURLとはhttps: // github.com/あなたのユーザーネーム/レポジトリ名(もしtestと言う名前ならtestです)
これでフォルダとレポジトリが紐づきました．
![スクリーンショット 2020-01-11 1.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/e7db46ab-515f-37c0-7a9b-dba6d1120f02.png)


# 毎回打つコマンド
これも是非覚えてください！！（同じくググれば無限に出てきます）

```sh
$ git add --all
$ git commit -m 'コミットメッセージ'
$ git push -u origin master
```

ここで注意点です．初めてgitを使うときだけ(多分)メールアドレス，ユーザID，パスワードあたりを聞かれることがあります．そしたら答えてあげてください．
また，二行目のcommitメッセージなんですが，「何を変更したか」を書いてください．でも今回は「初めてのgit」「test」などなんでもいいです．

# 結果
こんな感じになれば成功です．
![スクリーンショット 2020-01-11 2.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/be1d3829-a6bd-16fc-a3e5-c46cbc851f8e.png)

githubの方も見てみましょう．リロードするとこんな感じになっています．これで成功です！おめでとう！
![スクリーンショット 2020-01-11 2.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/94aa20a1-a01f-081b-de93-18f1c11ec4bb.png)

# pushできない時に試すべきコマンド
原因がわからないので「お試しあれ」って感じなんですが，この辺で治ることがあります．あくまで参考です．

```sh
$ git pull origin master
$ git fetch origin
```
# 最後に
とりあえず「できた！」を体感していただけたのなら幸いです．意味はわからなくても，「できた」の後に「このコマンドの意味はなんだろう」で僕はいいと思ってます．なのでもし興味を持てましたら調べてみてください．また何か抜けてればご指摘いただけると幸いです．
UIWindowが上手く動いてくれない時に

#結論

エラーも出ないのに、UIWindowがらみのプログラムが動かない時には、
`Info.plist`の中に`Application Scene Manifest`という項目を削除してみてください。

この項目は、Xcode11でプロジェクトを新規作成すると自動的に作成される項目のようです。
私の場合、特にSceneの設定はしてないつもりでしたので、おそらく`プロジェクトを新規作成した段階でScene対応が有効になっていた`ということになります。

>SceneとはアプリのUIを表示するための窓の事です。iPadでは以前から複数のアプリを同時に分割表示する事ができましたが、同一のアプリを同時に複数表示する事はできませんでした。iOS13からはこれが可能になります。この時、分割されている画面1つがSceneに対応します。同一のアプリが複数表示されているときは、内部的にアプリケーションとしては1つのプロセスだけが起動していますが、Sceneオブジェクトは複数生成されており、ユーザはそれぞれの画面ごとに独立した画面遷移を利用できるというしくみです。
(引用：　https://qiita.com/omochimetaru/items/31df103ef98a9d84ae6b)


#今回起こった問題（ご参考に）

初回起動時に、アプリのチュートリアルページを表示するため、
AppDelegate.swiftにて以下のようなコードを記述しました。

しかし、起動しませんでした。
コンパイルエラーも起こらず。
エラーがないということは、他のコードによって制限がかけられているのだろうと察しました。(原因が上述した内容でした。)

※OnboardingViewController = チュートリアルページを表示するコントローラ。

```swift:AppDelegate.swift

var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")

                if launchedBefore != true {
                    
                    print("first launch.")
                    //起動を判定するlaunchedBeforeという論理型のKeyをUserDefaultsに用意
                    UserDefaults.standard.set(true, forKey: "launchedBefore")
                    let introViewController = UIStoryboard.init(name: "Main", bundle: nil)
                        .instantiateViewController(withIdentifier: "onBoarding") as! OnboardingViewController
                    let navigationController = UINavigationController(rootViewController: introViewController)
                    self.window?.rootViewController = navigationController

                } else {

                    print("Not first launch.")

                    //動作確認のために1回実行ごとに値をfalseに設定し直す
                    UserDefaults.standard.set(false, forKey: "launchedBefore")
                }

        return true
    }
```

#引用文献（スペシャルサンクス）
- [iOS13のSceneDelegate周りのアプリの起動シーケンス](https://qiita.com/omochimetaru/items/31df103ef98a9d84ae6b)
Laravelでテスト時などにprevious URLを手動でセットしたい

Laravel version:5.8

結論
sessionの"_previous.url"にURLをセットする

Session/Store.phpにある
previousUrl()がセッション_previous.urlを呼んでいる

元々は
Routing/UrlGenerator.phpにあるprevious()から呼ばれている。
headerにrefererがない場合、previousUrl()を呼んでいる
正規表現の例文-複数行にまたがる処理

#◆ 目的
正規表現は普通に書くと１行単位で検索されてしまいますが、
改行を含んだ複数行にまたがる対象を検索、置換したい場合は
下記のように指定します。

#◆ 検索対象

> 文章のここから
> ２行目
> ３行目
> ４行目ここまで
> を対象とする場合
> ここからここまで

#◆ 検索文字列

`ここから[\s\S]*?ここまで`

#◆ 検索結果

> 文章の`ここから
> ２行目
> ３行目
> ４行目ここまで`
> を対象とする場合
> `ここからここまで`

#◆ 解説

分解して考えます。
`ここから` `[\s\S]` `*?` `ここまで`


まずは、下記の文字列を探索します。

`ここから`

この文字列から対象範囲が開始されます。
次に、`[ ]`で、中の文字のいずれか１字という意味になります。

`[\s\S]`

の、それぞれの意味は、

* `\s` 垂直タブ以外のすべての空白文字 改行を含む
* `\S` \s 以外のすべて

となります。この２つを`[ ]`で囲むことで、

* `[\s\S]` 改行を含む全ての文字１字

という意味になります。

`*?`

上記の文字を`*`で0文字以上繰り返します、`*`だけだと最長マッチになるため
`?`をつけることで最小マッチ（条件に合う最も短い範囲）にすることができます。

`ここまで`

最後に、この文字列が最初にでたら探索終了となります。
 

#◆ 補足

`ここから[\s\S]*ここまで`

最小マッチの`?`をつけないと、

> 文章の`ここから
> ２行目
> ３行目
> ４行目ここまで
> を対象とする場合
> ここからここまで`

となります。
brew audit の実行

こんにちは。
```brew audit``` の実行に際して、準備として ruby ライブラリの最新版のインストールを行うらしく(?)、実行開始までには時間がかかるようです。
したがって、時間に余裕がある際に、何か適当な ```formula``` を定期的にバックグラウンドで実行すると良いかもしれません。

```console
$ brew audit --strict a_formula
```
なお ```homebrew-cask``` の ```formula``` に対しては、

```console
$ brew cask audit a_formula
```
【Nuxt.js】 超基本的なルーティングについての備忘録

# 目的
下記の読者・将来の自分への技術的な備忘録

- 「 Nuxt.js でページのルーティングを実装してみたい 」という方
- 「 あれ？Nuxtでルーティングってどうやるんだっけ？ 」という方 

# 目次
- 前提条件  
- 実装（ルーティング）
- まとめ

## 前提条件
Nuxtアプリケーションを`「npm run dev」`で開発環境サーバー（"http://localhost:3000/"）  が立ち上げられている状態。

### ディレクトリ構成
```bash
- nuxt-app
  - pages
    - navi (*今回追加)
      - mypage.vue (*今回追加)
```

 
*「nuxt-app」は作成したアプリケーション名。 
今回、新たに「pages」と「mypage.vue」を作成する。


## 実装（ルーティング） 

### 実装手順
1.「pages」のディレクトリ内に「navi」ディレクトリを作成する。
2.「navi」ディレクトリ内に「mypage.vue」ファイルを作成する。
3.「mypage.vue」に下記内容を記述する。

```vue
<template>
<h1>MyPage</h1>
</template>
```

4.「pages」のディレクトリ内の「index.vue」に下記を追加する。

```vue
<nuxt-link to="/navi/mypage">MyPage</nuxt-link>
```

### 確認
開発環境サーバー（"http://localhost:3000/"） で上記の「index.vue」で追加した「Mypage」リンクをクリックすると、追加したMypage（"http://localhost:3000/navi/mypage"） へ遷移する。
遷移先のページで「mypage.vue」が表示されたら実装完了。

## まとめ
ルーティングがディレクトリ構成によって構築されるのは、新鮮だった。余談だが `「npm run dev」` コマンドを実行すると、「.nuxt/router.js」にルーティング情報が記述されている為、無事ルーティングが出来ていることも確認した。
Windows10で、選択した文字をGoogle翻訳するPythonスクリプトをショートカットキーで起動したい。

僕は英語がわからないので[Google翻訳](https://translate.google.co.jp/)をよく利用します。

メモ帳で開いた英文を部分的に翻訳したい場合など、次のような流れになり**コピペ**や**アプリの切り替え**が少し面倒に感じます。

```
　翻訳したい文章をコピーします。
　　　　　　↓
　GoogleChromeを起動します。
　　　　　　↓
　[Google翻訳](https://translate.google.co.jp/)を開きます。
　　　　　　↓
　コピーしてた文章を貼り付けます。
　　　　　　↓
　翻訳された文章をコピーします。
　　　　　　↓
　メモ帳に戻り貼り付けます。
```

そこで、Pythonスクリプトで次のように出来たら手間が省けるかなと思いました。

```
　翻訳したい文章を選択します。
　　　　　　↓
　[CTRL] + [ALT] + [z] を押して翻訳します。
```

![ApplePen.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280129/5556ff1e-102e-8ff8-1067-f3e085d079a7.gif)


## 必要なモジュール

- **googletrans**（Google翻訳できる）
    `pip install googletrans`

- **pyautogui**（Windowsを操作できる）
    `pip install PyAutoGUI`

- **pyperclip**（クリップボードを操作できる）
    `pip install pyperclip`

## スクリプト
スクリプトはこれだけです。
クリップボードを翻訳するので`ClipTrans.py`にしました。

```python:ClipTrans.py
# 選択範囲を翻訳する。

from googletrans import Translator
import pyautogui
import pyperclip

# 元のアプリに切り替える
pyautogui.hotkey('alt', 'tab')

# 選択範囲をコピーする
pyautogui.hotkey('ctrl', 'c')

# クリップボードの5000文字を取り出す。
OrgTEXT = pyperclip.paste()[:5000]

# GoogleTransで翻訳（成功するまで繰り返すように修正(2020/11/9)）
tr = Translator()
while True:
  try:
    NewTEXT= tr.translate(OrgTEXT, dest="ja").text
    break
  except Exception as e:
    tr = Translator()

# 結果をクリップボードにコピー
pyperclip.copy(NewTEXT)

# 選択範囲に貼り付ける
pyautogui.hotkey('ctrl', 'v')
```

## Windows10 のショートカットキーで起動する。
次に、スクリプトを指定してPythonを起動するバッチファイルを用意して、そのバッチファイルにショートカットキーを割り当てます。

バッチファイルといっても内容は一行だけです。
ファイル名は`ClipTrans.bat`としました。

```:ClipTrans.bat
python ClipTrans.py
```
`ClipTrans.py`と`ClipTrans.bat`は同一のディレクトリに置きます。
僕は`C:\Users\maboy\scripts`に置きました。
`ClipTrans.bat`のショートカットを **デスクトップ** に作成します。
作成したショートカットのプロパティを開き **ショートカットキー** を割り当てます。
![プロパティ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280129/1a8e2dcb-24d4-93ac-4f62-467f9f3a5e45.png)
[なし] をクリックし、キーボードの [z] を押すと [Ctrl] + [Alt] + [z] が入力されます。
他に [Ctrl] + [Shift] + [好きなキー] なども割り当てることができます。
今回は [Ctrl] + [Alt] + [z] を割り当てました。
![プロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280129/f6e73e80-3032-42a1-4dfd-8f9133d693e9.png)

これでショートカットキーで`ClipTrans.py`が起動できるようになりました。

ただし、この方法でショートカットキーを割り当てるための**ショートカット**は特定の場所に配置する必要があり、そうでないとうまく動作しませんでした。

場所を変更して動作しなくなってしまった場合、元の場所に戻しても動作しませんでしたが、再ログインで動作するようになりました。

**動作が確認できた場所**

- デスクトップ  
    `C:\Users\maboy\Desktop\`
- スタートメニュー  
    `C:\Users\maboy\AppData\Roaming\Microsoft\Windows\Start Menu\`
- 旧スタートメニュー  
    `C:\ProgramData\Microsoft\Windows\Start Menu\`
【Go】GOPATH変更できないときにやったこと

#### 1. はじめに
[anyenv](https://github.com/anyenv/anyenv)経由でインストールした[goenv](https://github.com/syndbg/goenv/goenv)ですが
どうにもGOPATHやGOROOTの設定が動いてくれませんでした。
(結果としてGOPATH設定変更しなくて良かったようですが)
GoのWebフレームワーク [echo](https://echo.labstack.com/)を導入するときに、インストール先がGOPATHが設定されているディレクトリだったので「なんかそこじゃ嫌だな〜」と思って、GOPATH設定変更を試みました。
そのときに行ったことを備忘録として書きます。

*Homebrew、anyenv、goenvのインストール手順は書いていません。
お気付きのことがあれば、コメントいただけると幸いです。*


#### 2. 環境

```
macOS Mojave ver. 10.14.6
Homebrew インストール済
go version go1.13.5 darwin/amd64
shell： bash
```

#### 3. 最終的な解決策
`$ vi ~/.bash_profile`を開いて以下追記。

```
// GOPATHの管理を無効にする
GOENV_DISABLE_GOPATH=1
```
これに加えてGOPATHに関するすべての記述を削除して、保存。

bash_profileで環境変数設定したらパスを通して、ターミナル再起動。

```
$ source ~/.bash_profile

// シェルの再起動
$ exec $SHELL
```
再度GOPATHの設定を見てみたら、スッキリしていました。

```
$ go env GOPATH
/Users/XXXX/go
```

#### 4. 解決策に至るまで

まずGOPATHがどこに向いているのか確認。

```
$ go env GOPATH
/Users/XXXX/.anyenv/envs/goenv/shims/go
```
もしくは、GOROOTなどGoに関するすべての情報を見たければ

```
// Go環境の情報一覧
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
￤
GOPATH="/Users/XXXX/.anyenv/envs/goenv/shims/go"
￤

```

「え、このディレクトリにecho入れるとかやだ」と思ったので
bash_profile開いて変更

```
// bash_profile開く
$ vi ~/.bash_profile
```

そしたら


```
export PATH="$HOME/.anyenv/bin:$PATH
eval "$(anyenv init -)"
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$PATH
```

いろいろ自分で書いててよく分からん＼(^o^)／ ←


本来ならばひとつずつ削除して
GOPATHがどこに設定されるのか調べていくのが筋なのでしょうが
goenvのGitHubに環境変数設定に関して記述があったので
これを使ってみることにしました。


| 環境変数 |    デフォルト | 説明 |
|:--|:-----|:--|
| GOENV_VERSION |  | 使用するGoのバージョンを固定する。`$ goenv help shell`で詳細確認 |
| GOENV_ROOT | ~/.goenv | Goバージョンとshimsがあるディレクトリ以下に定義する。`$ goenv root` で現在の設定表示 |
| GOENV_DEBUG |  | デバック情報の表示。`$ goenv --debug <subcommand> `でも表示可。 |
| GOENV_HOOK_PATH |  | goenv hooksを検索するためのコロン区切りのパス一覧|
| GOENV_DIR | $PWD | .go-versionファイルを検索するためのディレクトリ|
| GOENV_DISABLE_GOROOT | 0 | GOROOTの管理を無効にする。エクスポートしたGOROOTを設定したければ、1を設定|
| GOENV_DISABLE_GOPATH | 0 | GOPATHの管理を無効にする。エクスポートしたGOPATHを設定したければ、1を設定。複数のGoバージョンを使用している場合、それらのバージョンの混合を防止するため、0を設定することが推奨される。詳細：`https://github.com/syndbg/goenv/issues/72#issuecomment-478011438 `|
| GOENV_GOPATH_PREFIX | $HOME/go &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|  GOENV_DISABLE_GOPATH=1を設定していない場合、GOPATH prefixがエクスポートされる。例えば Go 1.12.0 を使用しているなら、`$HOME/go/1.12.0`が設定される。|


#### 5. GOPATHやGOROOTの設定って…

goenvのインストール手順を熟読すると、ちゃんと書いてありました。
以下の順番で環境変数設定してあげることが正しいようです。
anyenv経由だと勝手が違うと思いますが…

```
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
export PATH="$GOROOT/bin:$PATH"
export PATH="$PATH:$GOPATH/bin"
```
goenvを使えばディレクトリ毎にバージョン管理ができますし、
もちろんアプリ毎にもこれは適用できて便利ですよね。
最初はこの設定でやってみて、開発を進めていく中で
必要に応じて変更していけば、各所に影響与えずに済みそうです。

また気づきなどあれば追記します。

#### 6. 参考資料
- [Environment variables (goenv GitHub)](https://github.com/syndbg/goenv/blob/master/ENVIRONMENT_VARIABLES.md)
- [Installation (goenv GitHub)](https://github.com/syndbg/goenv/blob/master/INSTALL.md)
【Laravel】同一テーブル内のリレーション

###同一テーブル内でのリレーションとなる場合
例）twitter的なアプリでユーザ間のフォロー関係を表現したいとき

三人のユーザ（フィル、カイ、ラミー）のフォロー関係が下のようになっている
![フォロー関係.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502145/ace11b40-91b2-f263-664b-bacff8fb1741.png)
**usersテーブル**

|id|name|
|:----:|:---|
|1|フィル|
|2|カイ|
|3|ラミー|

関連を持たせるのはユーザ同士、つまり同一テーブル内のデータ同士。
もちろん、ユーザーは複数人のユーザをフォローするため多対多のリレーションになる。
→中間テーブルとしてfollowersテーブルにユーザ間の関係をまとめる。

**followersテーブル**

|following_id(フォローする側)|followed_id（フォローされる側）|
|:-:|:-:|
|1|2|
|1|3|
|2|1|
|3|2|
following_idをフォローする側のID、followed_idをフォローされる側のIDとすると、このように関係性が表せる。

###リレーションメソッド
```php:User.php
public function followers()
{
   return $this->belongsToMany(self::class, "followers", "followed_id", "following_id");
}

public function follows()
{
   return $this->belongsToMany(self::class, "followers", "following_id", "followed_id");
}
```
第一引数で参照するテーブルを指定するが、今回は同一テーブルなので自身のテーブルになる。第二引数には中間テーブルとなるfolloersテーブルを指定。

followers()はフォローされているユーザIDから、フォローしているユーザIDにアクセスする。

follows()はその逆向きのアクセス。
Excelで配列範囲をしらべる関数

Excelの１次元配列、２次元配列、SPILL、Range、テーブル(ListObject)のLBound,UBoundをしらべる関数です。

(A1) =LUB(T14#)          ' 1-3,1-6:Range
(A2) =LUB(NA_)           ' 1-31,1-21:Range T NA_
(A3) =LUB(A_("1 2 3"))   ' 1-3:Variant()

```vb
Function LUB(R, Optional S = "") ' LOW-UP BOUND
    On Error Resume Next
    
    V = R
    S = CC(S, LBound(V, 1), "-", UBound(V, 1))
    S = CC(S, ",", LBound(V, 2), "-", UBound(V, 2))
    S = CC(S, ":", TNAME(R))
    If ￢(R.ListObject Is Nothing) Then S = CC(S, " T ", R.ListObject.Name)
    
    LUB = S
End Function

Function ￢(A)
    ￢ = Not (A)
End Function

Function A_(V, Optional S = "")
    A_ = Split(V, " ")
End Function
```
EM-uNetPi の Raspberry Pi 4 対応 その１

年末にRaspi4買ったけど、冬コミとか仕事がアレで完全に放置プレイまっしぐら。
いい加減どうにかしないとー、、って、思い腰を上げたのだけど、のっけから詰みました。

__／ 2.5Aの電源アダプタだと動作が不安定すぎた ＼__

公式では、5V/3Aと言われてるが、一応動くだろ？
と舐めてました。

実際、何もつけない状態では動いていたんだ、信じてほしい。

が、

- タッチパネル
- 無線LANアダプタ
- 有線LANアダプタ x 2

を繋いだ瞬間にオワタ Σ(´□｀;)

仕方ないから純正のアダプタを買うかー、、とも思ったんだけど、USB-Cなら高出力のものが転がってんじゃん？

と思って調べました。<font color="gray" >__†闇でした†__</font>

- [日本で出たRaspberry Pi 4と電源問題とファームウェアの件](http://akkiesoft.hatenablog.jp/entry/20191128/1574911998)
- [Raspberry Pi 4のUSB Type-Cポートが規格通りでない話の詳細](https://hanpenblog.com/11049)
- [USBのおべんきょう　その2（自分用：USB Type-Cについてまとめてみた）](http://makoro.hatenablog.jp/entry/2017/06/23/123257)

つまり、一般的なUSB-Cのアダプタを安全に流用したければ、ケーブル選びに気をつけ給えよ！ちみー！

E-Markedなチップ非搭載な可能性の高い、USB2.0まで対応の、USB-C to USB-C を買えって、そんな都合のいいものが、怪しくないケーブルであるわけ...

__ありました！__

- [Anker PowerLine II USB-C & USB-C 2.0 ケーブル](https://www.amazon.co.jp/dp/B07THW64SD/)

横にある、別用途の数台のRaspberry Pi 2/3系の電源も賄いたいし、アダプタをこの辺つかえばええな。

- [Anker PowerPort I PD - 1 PD & 4 PowerIQ](https://www.amazon.co.jp/dp/B072KBG9W4/)

というわけで、来週に乞うご期待。

頑張れ進捗、作業の再開はAmazonの配送時期にかかっているぞ。
Cloud9とGithubを連携する方法

### 前提
* Githubのアカウントを持っている
* Cloud9を使用できる状態

### Cloud9でSSH認証の公開鍵を作成する
1. ./sshに移動する
`$ cd ~/.ssh`

2. 公開鍵を作成する
`$ ssh-keygen`

色々聞かれますが、とりあえずはEnterで進めて大丈夫です。

3.公開鍵ができているか確認する
`$ ls`

コマンド実行後、id_rsaとid_rsa.pubというファイルが出来てたらOKです。
→id_rsa.pubファイルの中身が公開鍵になります。

4.公開鍵をコピーする
`$ cat id_rsa.pub`

実行後に表示された、文字列をコピーしてください。

### Githubに公開鍵を登録する

Githubの`Settings`→`SSH and GPG keys`→`New SSH key`をクリック

![スクリーンショット 2020-01-11 0.34.04（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328873/50c8f312-2375-0094-0569-d8462d9f719d.png)

以上の設定でCloud9からGithubへSSH接続ができるようになります！

### 参考記事
[Cloud9とGitHubを連携させる方法（初心者向け）](https://qiita.com/higu1988/items/3a9c4fe528c2388bdc7f#cloud9%E3%81%A7ssh%E8%AA%8D%E8%A8%BC%E7%94%A8%E3%81%AE%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92%E4%BD%9C%E3%82%8B)
とりあえず何でもffmpegでファイルを変換したい!!

# ラジオ音源を深層学習のデータにしたい
- deeolearningにおいて重要なことはなんですか?
- 「データでしょ!」(古い!!)
- よって超A&Gのラジオデータをぶっこ抜いてデータとして使おうと考えました．
- `注意`著作権とか色々ありますので使用は各個人の自己責任で
- いろんなデータの変換にも使えるので公開しておきまshowということ

# プログラム手順
1. 変換したいデータがあるディレクトリがある
2. コマンドラインでインプットディレクトリとアウトディレクトリを指定
3. あとはsubprocessを噛ましてffmpegで変換

## ポイント
- ffmpegのコマンドについて
- 今回のプログラムではflvファイルをwavファイルに変換することと16000HZに変換を同時に行ってます。
- ffmpegの簡単なまとめは以下の通り

```bash:
#まずは拡張子の変換
$ffmpeg input.hoge output.hoge #hogeは拡張子

#サンプリングレートの変換
$ffmpeg input.hoge -ar 16000 output.hoge #-ar newsamplingrate

```

```python:aandg.py
# -*- coding: utf-8 -*-
import sys
import glob
import os
import subprocess

#ディレクトリの指定
if len(sys.argv) != 3:
    print("python3 aandg.py [inputfile_dir] [outputfile_dir]")
    sys.exit()

else:
    print(sys.argv[1])
    inputpath=path = os.path.abspath(sys.argv[1])
    #今回は入力されたディレクトリの中の.flvのみをリスト化
    file_list=glob.glob(inputpath+"/*.flv")
    #アウトプットディレクトリなかったらっ作成
    if not os.path.exists(sys.argv[2]):
        os.mkdir(sys.argv[2])
        print("make dir",sys.argv[2])
    
    output_path = os.path.abspath(sys.argv[2])
    
    for item in file_list:
        #subprocessで変換拡張子なしのファイル名も取得しておく
        basename_without_ext = os.path.splitext(os.path.basename(item))[0]
        #今回はflvを16,000HZのwavに変換
        cmd = "ffmpeg -i "+item+" -ar 16000 "+output_path+"/"+basename_without_ext+".wav"
        runcmd = subprocess.call(cmd.split())
```

- サンプルコードとかは[github](https://github.com/kapibarasyun/til/tree/master/tools)に載せときます．あとはいい感じでよろしく
Excel方眼で入力画面を作成する（改）

これも以前投稿した[Excel方眼で入力画面を作成する](https://qiita.com/matumoto_onga/items/fb4226962006b802390c)を少しマシにして、範囲指定ができるようになりました。

```vba
Sub DGET(M, R1N, R2N)
    N = Range(R1N).Columns.Count
    
    Set R1 = Range(R1N).Offset(M - 1).Resize(1, N)

    Range(R2N).Resize(N, 1) = WorksheetFunction.Transpose(R1)

End Sub

Sub DSET(M, R1N, R2N)
    N = Range(R1N).Columns.Count
    
    For I = 1 To N
        Range(R1N).Offset(M - 1, I - 1).Resize(1, 1) = IFZS(Range(R2N).Offset(I - 1, 0).Resize(1, 1).Value)
    Next I
End Sub

Sub LOAD()
    If Not (ActiveSheet.Name Like "情報入力") Then Exit Sub

    I = IFSZ(Range("JI_[KJ]").Value)
    
    If I = 0 Then Exit Sub
    
    Call START_MANUAL
    
    Call DGET(I, "KJ_[製品名]", "K2")
    Call DGET(I, "KJ_[材料]", "Z2")
    
    Call DGET(I, "KJ_[[D]:[R]]", "F4")
    Call DGET(I, "KJ_[[01]:[38]]", "L4")
    Call DGET(I, "KJ_[[項目1]:[項目7]]", "C17")
    Call DGET(I, "KJ_[[基準1]:[基準7]]", "F17")
    
    Call DGET(I, "KJ_[[秒]:[在庫]]", "AA4")
    Call DGET(I, "KJ_[備考]", "AA13")
    
    Call START_AUTO
End Sub

Sub SAVE()
    If Not (ActiveSheet.Name Like "情報入力") Then Exit Sub

    I = IFSZ(Range("JI_[KJ]").Value)
    If I = 0 Then Exit Sub
    
    Call START_MANUAL
         
    Call DSET(I, "KJ_[製品名]", "K2")
    Call DSET(I, "KJ_[材料]", "Z2")
        
    Call DSET(I, "KJ_[[D]:[R]]", "F4")
    Call DSET(I, "KJ_[[01]:[38]]", "L4")
    Call DSET(I, "KJ_[[項目1]:[項目7]]", "C17")
    Call DSET(I, "KJ_[[基準1]:[基準7]]", "F17")

    Call DSET(I, "KJ_[[秒]:[繰越]]", "AA4")
    Call DSET(I, "KJ_[備考]", "AA13")
 
    Call START_AUTO
End Sub
```
Day1 ローカル環境構築とGithub連携

#ローカル環境構築
主な手順は、RailsTutorialに書いてあった日本語のものにしたがった。
https://railsgirls.jp/install

Railsのインストールがうまくいかず、バージョンを確認してもインストールされていないことがわかり、同様のエラーを検索したところ、解決策が見つかった。
https://qiita.com/libertyu/items/1eb74adc817ab8971100

開発環境を構築しているときはまだ、qiitaにアウトプットとして残すことは決めていなかったため、どのようなエラーが出てどのように解決したかは、整理ができていない。次回以降、逐次エラーは記録に残し、最終的にはここにまとめるようにしたい。

#Githubとの連携
先月Cloud9で行った時は、エラーの連発でできず、Githubは使わずAmazonのCodeCommitを利用していたが、少しだけGitもわかってきたこともあり、今回はスムーズに行くことができた。全体的な流れは以下の通り。

##ローカルレポジトリ
1.name,emailを設定。
<img width="447" alt="スクリーンショット 2020-01-11 0.03.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/4895de3a-0a33-72ec-2f8b-717cb40e9a9d.png">
2.git init で新しいレポジトリの初期化。
>Gitのinitコマンドは、一言で言うと「リポジトリを新規に作成」するときに使用するコマンドです。
3.git add -A でコミット対象を選択。
4.git commit -m "message"でコミット。

##リモートレポジトリ
1.GithubでRepositoryを新規に作成。
2.git remote add origin http~ (コマンドはGithubが用意してくれる）でorigin をリモートレポジトリとして設定。

→ターミナルでgit push -u origin master(次回からgit pushでできるようになる）とし、GithubにPushして完成。

#課題
Atomの使い方
Git、特にpullなど理解を深める。
Git LFSが見つからないときの対処法

# git push時にエラーメッセージ
以下のメッセージが出た時の対処法です

```
This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/pre-push.

error: failed to push some refs to 
```

# とにかくインストール
1. [公式サイト](https://git-lfs.github.com/)からダウンロード
2. ダウンロードしたのちに以下のコマンドを実行

```
git lfs install
```
以上で完了です。
installではダウンロードしたgit-lfsを/usr/local/bin/に移動しています。

# GIT LFSとは
動画などの大容量ファイルを扱うための拡張機能のようです。
大容量ファイル自体はリモートサーバーに格納し、
Gitではメタ情報だけを管理する仕組みですね。
ChromeのGlobal Media Controlsに情報とコントロールを付ける

Chrome 79で最近[Global Media Controls](https://japanese.engadget.com/2019/12/23/chrome-79/)というのが有効化されるようになりました。
割と前から？テストしていたみたいですが、この記事を書いた時くらいから勝手に有効化するようになったみたいです。
Youtubeの動画を再生すると以下見たいな感じに表示されます。

![media.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326006/f8687de0-da5c-45d9-d911-887754ea4270.png)


基本的にはvideoやaudioの様なメディアに反応して出てくるのですが、Youtube以外は再生/停止ボタンしか出ずGoogleだからか？と思いましたが違いました。
スマホでは多分よく使われている[Media Session API](https://w3c.github.io/mediasession/)を使うとデスクトップでも情報として取ってくれます。

```html
<html>
<video src='./bbb_buny.mp4' width="720" controls autoplay></video>
<script type="text/javascript">
navigator.mediaSession.metadata = new MediaMetadata({
	title: 'Big Buck Bunny',
	artist: 'https://peach.blender.org/',
	artwork: [
		{ src: 'https://sample.com/test.jpg', sizes: '256x256', type: 'image/jpg' },
	]
})
</script>
</html>
```

メディアのコントロールを付けたい場合は`setActionHandler`にハンドラを増やして行くと良いです。

以下はvideoに対しての一例です。

```js
navigator.mediaSession.setActionHandler('play', async () => await document.querySelector('video').play())
navigator.mediaSession.setActionHandler('pause', async () => await document.querySelector('video').pause())
navigator.mediaSession.setActionHandler('seekbackward', () => document.querySelector('video').currentTime-=5);
navigator.mediaSession.setActionHandler('seekforward', () => document.querySelector('video').currentTime+=5);
```

<img width="1184" alt="media2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326006/a6c5855f-a8d6-6bb9-9704-f9418d2fe3b0.png">


これでYoutubeみたいに情報を表示できます。もっと細かく情報やハンドラを付けたい場合は大体モバイルの話ベースですが、
[Google](https://developers.google.com/web/updates/2017/02/media-session?hl=ja)の解説を読みましょう。

私みたいにタブをバカみたいに開く人には良い機能かもしれませんが、邪魔だという人は `chrome://flags/#global-media-controls` から無効化できるみたいです。

Chrome OSでは前からあったみたいです。最近はスマホのUIなどを最近デスクトップ版にも取り込むような動きなんでしょうか。
AWS CLI アカウントを切り替える方法

# はじめに
AWS CLIをインストールして便利になったんですが、
なぜか動かない（パスが通ってなかった）とか別のアカウントで操作したいけどどうすればいいか分からないとか、
時間がかかってしまったので、ここでまとめさせていただきます。

他にはまってしまっている方の役に立てば・・と思います。。

# AWS CLI
AWS コマンドラインインターフェイス (CLI) の略。
AWS サービスを管理するための統合ツールで、ターミナルにて操作できる。

## インストール
インストールについては下記リンクをご確認ください。

* AWS CLI のインストールと設定
    * https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

## パスを通す
パスを通さないと動かないのでご注意を。。

```
// ${ユーザー名}には、各環境毎に変更してください。
$ export PATH=/Users/${ユーザー名}/Library/Python/3.7/bin:$PATH
```


## ユーザー情報呼び出し方法

下記コマンドで今設定されているユーザー情報が呼び出される。

```
$ aws configure
```


## アカウントの切り替え方法

下記コマンドを実行すると、~/.aws/credentials を編集できる。

```
$ vim ~/.aws/credentials
```

~/.aws/credentialsの中身を見てみると、[default] / [test_1] / [test_2] の３つがあることがわかる。
[default] は [test_1] / [test_2] のどちらかと同じ内容が記載されている。


```~/.aws/credentials
// デフォルトで使用されるアカウント
[default]
aws_access_key_id = A1******************
aws_secret_access_key = A1**************************************

// ユーザー１
[test_1]
aws_access_key_id = A1******************
aws_secret_access_key = A1**************************************

// ユーザー2
[test_2]
aws_access_key_id = A2******************
aws_secret_access_key = A2**************************************
```


--profile オプションをつけずに AWS CLI を実行すると、[default]に設定されたアカウントの情報で AWS CLI が実行される。

```
// --profile オプションをつけずに AWS CLI を実行すると、[default]に設定されたアカウントの情報で AWS CLI が実行

$ aws configure

AWS Access Key ID [A1******************]:
AWS Secret Access Key [A1**************************************]:
Default region name [None]:
Default output format [None]:
```

一方で、--profile オプションをつけて実行すると、そのユーザー情報で AWS CLI が実行される。

```
// --profile の後に test_1 と指定すると、ユーザー１の情報が呼び出される。

$ aws configure --profile test_1

AWS Access Key ID [A1******************]:
AWS Secret Access Key [A1**************************************]:
Default region name [None]:
Default output format [None]:




// --profile の後に test_2 と指定すると、ユーザー2の情報が呼び出される。

$ aws configure --profile test_1

AWS Access Key ID [A2******************]:
AWS Secret Access Key [A2**************************************]:
Default region name [None]:
Default output format [None]:
```


# まとめ
個人で使用する分にはあまり意識する必要はないと思いますが、組織でAWSを使用する際は複数のアカウントを使用すると思います。
どのユーザー情報を使っていたか確認するときにも使えます。

# 参考
* AWS CLI のインストールと設定
    * https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
Microsoft Learn 41日目

2019年12月に Advent Calendar を使って [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) で学んでいく...と試みてなんとか完遂した([記事はこちら](https://qiita.com/advent-calendar/2019/d01tsumath_learn))。
しかし、スローペースだったのもあり25日間毎日受講しているとは言え、コースの半分しか終わってない。
そこで、「Azure の基礎」コースが終わるまで続けていこうと思う。毎日はキツい、でもがんばる。

と、いうことで。以下、受講記録のはじまりはじまり～。

1/10は
Azure Resource Manager での Azure リソースの管理と整理
 - リソースグループの原則
 - タグ付けを使用してリソースを整理する
を受講した。

# Azure Resource Manager での Azure リソースの管理と整理
## リソースグループの原則
### リソースグループとは何か。
リソースグループは Azure プラットフォームの基礎要素で、Azure でデプロイされているリソース用の論理コンテナー。
仮想マシン、Application Gateway、Cosmos DB インスタンスなど、リソースはすべてリソースグループに属する必要がある。
1つのリソースが属することができるリソースグループは1つに限られるが、リソースグループ間で移動することができる。
リソースグループを入れ子にすることはできない。
#### 論理的なグループ化
Azure リソースの管理と整理に役立てるためにあるので、用途、種類、場所が類似したリソースを配置することで、Azure で作成するリソースを整理することがベスト。
#### ライフサイクル
リソースグループを削除すると、中に含まれているリソースもすべて削除されるため、実験を行い、完了後に破棄する非運用環境では、リソースをライフサイクルごとに整理すると良い。
#### 承認
リソースグループは、ロールベースのアクセス制御 (RBAC) のアクセス許可を適用するための範囲でもあるため、RBAC アクセス許可をリソースグループに適用することで、管理を簡単にし必要なものだけにアクセスを限定できる。

### リソースグループを作成する
How to & Try 部分なのでメモ略。

## タグ付けを使用してリソースを整理する
### タグとは何でしょうか。
テキストデータの名前と値を組み合わせたものであり、リソースやリソースグループに付けることができる。
タグを利用することによって、リソースに設定される標準の Azure プロパティに加え、次のような自分のリソースだけに関する詳細を関連付けることができる。

### リソースにタグを適用する
How to & Try 部分なのでメモ略。
【DS】特定のエクセル行を削除して、データは他のファイルに転載する

【アルゴリズム】
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/30322a8b-9ee1-6b3e-3bf2-78c51221f4e5.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/b3a64da9-06e6-dc79-7f64-edcc9e7e66f4.png)


【ポイント】
転載するエクセルを書き込み可能で開く
↓
編集可能なエクセルとして参照元（行を削除するエクセル）を開く
↓
編集しないエクセルを ie as excel で開く
※上記３つのエクセルはグローバルでOK
↓
ループをつかう
↓
参照するだけのエクセルでどの行が削除対象かをイテレーションを取得して特定する
↓
転載先のエクセルをカレントウィンドウで選択しておく
↓
対象となった行の値を転載
↓
編集するエクセルでイテレーションの番号と一致する行を削除する動作をいれる
↓
これで削除できる
↓
ファイルに出力する

※要は参照するエクセルと、行を削除する編集用のエクセルを別々にしておく。

・削除するときは名前をつけて削除する　以下の感じ
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/f26febeb-11fa-9db7-165f-8bdf13df397d.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/d64a224f-57a7-ed0b-8fd9-92ab87b20036.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/b1d9d63f-81a6-fd06-008f-c3c6228963f9.png)

【備考】
・以下の感じで一つのエクセルで完結しようとするとエラーが出る
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/dfcd044b-4988-96f7-279d-68bc56d998f9.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2c2b5a17-9570-99e2-ecf2-21338e716f3a.png)
git blame の表示範囲を絞り込む

`git blame`は指定されたファイルの行ごとに、最後に変更したリビジョンの情報を表示するコマンド。

## 行範囲を指定する

`-L`オプションで、特定の行範囲のみ、最後に変更したリビジョンの情報を表示する。

### 例

```sh
# ファイルの10行目から終わりまで表示する
$ git blame -L 10 example.txt
```

```sh
# ファイルの先頭から10行目まで表示する
$ git blame -L ,10 example.txt
```

```sh
# ファイルの5行目から10行目まで表示する
$ git blame -L 5,10 example.txt
```
[Python3 入門 5日目] 3章 Pyの具：リスト、タプル、辞書、集合（3.1〜3.2.6）

# 3.1 リストとタプル
pythonには文字列以外に**タプル**と**リスト**の2種類のシーケンス構造があり、0個以上の要素を持つことができる。文字列との違いは要素は型が異なっても良い。
###タプルの特徴
タプルはイミュータブルであり、要素を代入すると、それは焼き固められたように書き換えられなくなる。
###リストの特徴
ミュータブルであり、要素の削除と挿入ができる。


# 3.2 リスト
リストは要素を順番に管理したい時、特に順序と内容が変わる場合がある時に向いている。文字列とは異なり、リストはミュータブルのため直接変更できる。

## 3.2.1 []またはlist()による作成
リストは0個以上の要素をそれぞれカンマで区切り、全体を角かっこで囲む。

```py
>>> empty_list = []
>>> weekdays=['Monday','Tuesday','Wednsday','Thursday','Friday']
>>> another_empty_list=list()#list()関数で空リスト[]が作成できる。
>>> another_empty_list
[]
```


## 3.2.2 list()による他のデータ型からのリストへの変換

```py
#文字列を1文字ごとにの文字列リストに変換している。
>>> list('cat')
['c', 'a', 't']

#タプルをリストに変換
>>> a_tuple=('ready','fire','aim')
>>> list(a_tuple)
['ready', 'fire', 'aim']
>>> birthday="1/4/1995"

#split()関数を使えばセパレータによって分割し、リストにする。
>>> birthday.split("/")
['1', '4', '1995']
>>> splitme="a/b//c/d//e"

#セパレータが連続している場合、リスト要素として空文字列ができる。
>>> splitme.split('/')
['a', 'b', '', 'c', 'd', '', 'e']
>>> splitme="a/b//c/d///e"
>>> splitme.split('//')
['a/b', 'c/d', '/e']
```

## 3.2.3 [offset]を使った要素の取り出し
文字列と同様にオフセットを指定すればリストから個々の要素を取り出せる。

```py
>>> marxes=["TTTTTT","aaaa","bbbb"]
>>> marxes[0]
'TTTTTT'
>>> marxes[1]
'aaaa'
>>> marxes[2]
'bbbb'
>>> marxes[-1]
'bbbb'
>>> marxes[-2]
'aaaa'
>>> marxes[-3]
'TTTTTT'

#オフセットは対象のリストの中でも有効なものでなければならない。（すでに代入済みの位置である必要がある。）
>>> marxes[-34]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
```

## 3.2.4 リストのリスト

```py
>>> small_birds=["a","b"]
>>> extinct_birds=["c","d","e"]
>>> carol_birds=["f","g","h","i"]
>>> all_birds=[small_birds,extinct_birds,"AAA",carol_birds]
>>> all_birds#リストのリスト
[['a', 'b'], ['c', 'd', 'e'], 'AAA', ['f', 'g', 'h', 'i']]
>>> all_birds[0]
['a', 'b']

#[1]はall_birdsの第二要素、[0]はそれの内蔵リストの先頭要素を指す。
>>> all_birds[1][0]
'c'
```

## 3.2.5 [offset]による要素の書き換え
ここでもリストオフセット対象リストの中で有効でなければならない。

```py
>>> marxes=["TTTTTT","aaaa","bbbb"]
>>> marxes[2]=["CCCC"]
>>> marxes[2]="CCCC"
>>> marxes
['TTTTTT', 'aaaa', 'CCCC']
```

## 3.2.5 オフセットの範囲を指定したスライスによるサブシーケンス取り出し
```py

>>> marxes[0:2]
['TTTTTT', 'aaaa']

#スライスは１以外のステップを指定できる。
>>> marxes[::2]
['TTTTTT', 'CCCC']
>>> marxes[::-2]
['CCCC', 'TTTTTT']

#リストを逆順にする。
>>> marxes[::-1]
['CCCC', 'aaaa', 'TTTTTT']
```

#感想
４章入ったが眠いので今日は程々にした。


######参考文献
「Bill Lubanovic著 『入門 Python3』(オライリージャパン発行)」