OmniAICreator/Qiita-1.07M huggingface dataset:
LinuxのModemManagerが自作キーボードへのキーマップ書き込みを邪魔している時の対処法

# 背景

久しぶりに自作キーボード([ErgoDash mini](https://yushakobo.jp/shop/ergodash-mini/))のキーマップをいじろうとしたらハマったため共有です。
ErgoDash miniに限らず、Pro Microを使用した自作キーボード(というよりはArduino互換ボードを使用したデバイス全般)をLinux環境で扱う際に発生しうる事象です。

事象としては、[QMK Firmware](https://github.com/qmk/qmk_firmware)をクローン済のディレクトリにて、以下のコマンドでキーマップの書き込みを行おうとしたところ、

```bash
$ sudo make ergodash/mini:[キーマップのディレクトリ]:avrdude
```

以下のようなエラーが発生し書き込みに失敗しました。

```bash
avrdude: Error: butterfly programmer uses avr_write_page() but does not
provide a cmd() method.
```

発生時の環境情報は以下の通り。

```bash
$ uname -vrpm
4.15.0-76-generic #86-Ubuntu SMP Fri Jan 17 17:24:28 UTC 2020 x86_64 x86_64

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
```

# とりあえず結論

LinuxのModemManagerの割り込みによってキーマップの書き込みが失敗していました。
以下の通りModemManagerを停止させた後、書き込みを再実行して成功しました。
**※必ず、ModemManagerを利用していないことを確認してから実行してください。モバイルブロードバンド接続していたら怪しいので、踏みとどまりましょう。**

```bash
$ sudo systemctl stop ModemManager.service
```

# 解説

[ModemManager](https://www.freedesktop.org/wiki/Software/ModemManager/)は、[モバイルブロードバンド](https://ja.wikipedia.org/wiki/モバイルブロードバンド)での接続をよしなに制御してくれるデーモンです。
モバイルブロードバンド接続で利用するモデムは、USB接続のものが多く存在します。
そのため、当然ですが、ModemManagerはUSBポートを開くことができます。
キーボード(というよりも、Pro Micro)が接続されているUSBポートも例外ではなく、キーマップ書き込み処理中にModemManagerによる割り込みが発生すると処理が失敗します。

有名な問題のようで、QMK Firmwareのリポジトリでも対応するための[issue](https://github.com/qmk/qmk_firmware/issues/3804)が起票されています。
見たところ、対応策は「フラッシュ処理を実行する際にModemManagerが実行中だったら警告を出す」といったものになりそうなので、やらなきゃいけないことは変わらなさそうです。

停止したModemManagerは、利用しないのであればそのまま放置で問題ないです。
絶対に利用しないということであれば、以下コマンドで自動起動設定を無効化しても良いでしょう。

```bash
$ sudo systemctl disable ModemManager.service
```

「そうはいっても、起動していたものだから、元に戻したいな...」ということであれば起動し直しても良いでしょう。

```bash
$ sudo systemctl start ModemManager.service
```

# 参考にしたページ
[Helix キーボードキットを組み立てた - FOHTE.NET](https://fohte.net/blog/2019/07/15/build-helix-keyboard-kit/)
[avrdude: Error: butterfly programmer uses avr_write_page() but does not provide a cmd() method - Stack Exchange](https://arduino.stackexchange.com/questions/61359/avrdude-error-butterfly-programmer-uses-avr-write-page-but-does-not-provide)
[#877024 modemmanager should ask before messing with serial ports - Debian Bug report logs](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877024)
301リダイレクトと302リダイレクト

## リダイレクトとは
ITの分野では、あるページを訪れたユーザーを別のページに転送する処理のことを言います。
また、HTTPリダイレクトまたはURLリダイレクトと呼ばれることもあります。

通常はウェブページのURLが変わったときに、元のURLから新しいURLへ誘導するときに用いられます。

## リダイレクトの種類
リダイレクトには種類があり、それぞれ「301リダイレクト」、「302リダイレクト」があります。主な用途はSEO対策になります。
どちらもユーザーを転送する処理であることに変わりはありませんが、それぞれ使う場面が異なります。


### 301リダイレクト
「301リダイレクト」はURLを恒久的に変更する際に使われるリダイレクトです。(Permanent Redirect)
例えば、ページやサイトの引っ越し時に使用します。


### 302リダイレクト
「302リダイレクト」は恒久的な転送である「301リダイレクト」と異なり、一時的な転送（Temporary Redirect）を意味します。
近い内に本来のページに戻ること前提とした引越しのような意味合いで、メンテナンスを行うときやなどに使われていました。

### 使いわけについて
元々は301と302の使い分けはでページの評価を受け継ぐことができるかできないかで分けられていました。
しかし、現在では2017年にGoogleより、リダイレクトについて仕様変更が発表され、301、302どちらのリダイレクトを設定しても、ページランクは引き継がれるようになっています。
また、301と302の使い分けについては、Google側の推奨はなく、好きなほうを使ってよいと発表されています。

しかし、これからは移転先URLを今後ずっと使い続ける予定なら301を使用したほうがいいでしょう。
理由はSEO上、移転が認識されるまでの速度の問題です。
元のURLの持つ評価を転送先に譲渡することは301/302とも同じですが、検索エンジンが移転したことを認識し処理するまでの速度が301の方が速いからです。


## まとめ
URL変更等でリダイレクトをさせたい時、SEOを気にするようなサイトなら301や302等リダイレクトのさせ方を意識してみましょう。
Webエンジニアへと転職して一年が経とうとしているので振り返ってみた

# はじめに
この記事は新卒未経験SEからWebエンジニアに転職した自分が

- 転職して何が変わったのか
- 新しく触れた技術
- 携わった業務
- 転職後苦労したこと

についてまとめた内容となっています。

# こんな人に読んでほしい
- Web系エンジニアになりたい、転職したいと考えている人
- Web系エンジニアになり、業務経験がまだ浅い人
    - 他の人のモチベーションアップに繋がれば嬉しいです。

# 経歴
- 文系大学卒業(プログラミング経験無し)
- SIerでSEとして1年勤務後転職
- Web系自社開発企業入社←今ここ

# 転職して何が変わったか
- 主体的に働くようになった
    - 業務の内容もただの単純作業はなく、自分で考えて働くことが求められるようになりました。
- 業務のスピード感が圧倒的に早くなった
    - 一週間ごとに成果を求められるので、だらだらとやっているとあっという間に時間が経つため時間を意識して仕事をするようになりました。
- 業務の中で色々な技術やツールを使うようになった
    - 具体的なものに関しては後ろでまとめますが、たくさんの新しい技術に触れることが出来ました。
- 仕事が楽しくなった
    - 転職して一番変わったことです。
    
# 新しく触れた技術
- 言語
    - C#(.NET MVC)
    - Ruby(Ruby on Rails)
    - Go
- DB
    - SQL Server
    - MySQL
- インフラ
    - AWS
- ソースコード管理
    - GitHub
    - SourceTree
- コンテナ
    - Docker

# 自分が業務としてやったもの
- CSVファイルを読み込んだり出力できる機能を持った画面を作成(C#)
- アプリケーションの管理画面を一から作成(Ruby on Rails)
- メールバッチ修正(Go)
- CodePipelineを使いECSにデプロイ(CI/CD環境の構築)
    - GitHubの指定したブランチにマージされたらCodeBuildで自動的にビルドし、ECSにデプロイされる環境を構築しました。
- ECSでローリングアップデート/BGデプロイ環境構築
- プルリクエスト作成時にフォーマッタを実行させる
    - CodeBuildで作りました。指定されたブランチにプルリクエストが作成、またはプルリクエストが更新されるたびにフォーマッタを実行し、エラーが出たらマージをさせない仕組みを作りました。
- SlackにCodePipelineやCodeBuildの結果を通知

# 大変だったこと
- 動かないアプリをリリースした
    - 実装にかなり悩んだ処理があったのですが、時間がなく大して検証をしなかった結果、データを登録しようとするとエラー、戻るボタンを押すとエラー、一覧画面を表示しようとするとエラー、といったアプリケーションがリリースされてしまいました。本稼働までは時間があったので、周りの方の協力を得てなんとかバグはなくなりましたが、必要以上にチームを疲弊させてしまいました。
- 業務中に出てくる単語が分からない
    - もともとプログラミング経験も無く、コンピューターサイエンスの知識もITパスポートレベルで止まっていたため、会議で出てくる単語の意味が分からず、調べても記事の内容が理解できない、といった苦しい状況でした。

# 今後取り組んでいきたいこと
- 基本的な知識の習得
    - 基本情報(コンピューターサイエンス)の勉強
    - 言語の勉強
    - DBの勉強
- 勉強会やカンファレンスへの参加
    - デブサミやAWSサミットに参加予定です
- コードをたくさん書く
- Qiita等に技術記事の投稿

あまり残業などはしなかったので、その分の時間を勉強に充てられたなあと少し後悔してます。また、書いてあるコードをきちんと理解できていないので、言語の勉強やコードを書く量を増やさないといけないなと強く感じました。

# 最後に
転職前はこんなにも色々なことをやるとは思っておらず、慣れないことばかりでしたが、最近はようやくエンジニアとしての仕事が楽しくなってきました。

勉強しないといけないことはまだまだたくさんありますが、「勉強をしないといけない」という思いがより強まったので、これからもどんどん技術をキャッチアップしていきたいと思います。
コードの難読化について

# コードの難読化について


## 暗号化との違い
### 暗号化
- ソースコードを完全に読めないものにする

### 暗号化
- ソースコードを読みにくくする

## 難読化の目的
- ソースコードを厳重に管理したい
- 盗難防止のためにソースコードの公開を避けたい
- コードの目的の隠蔽や、リバースエンジニアリングの阻止
- 頭の体操
- など



## 最後に
近年では、多くのWebサービスのJavaScriptやCSSのソースコードで難読化がされています。
フロントエンドでは、JavascriptやCSSを難読化して管理するためにwebpackを用いた方法がよく使われています。


また、「難読化」という言葉も、新人のエンジニアでは聞いたことのない方もいるのではないでしょうか。
実際に使われている場面の多いものだと思うので、難読化という言葉と、どうしてそれが使われるのかをぜひ覚えてみてください。
MailHog をリバースプロキシに通したら Error during WebSocket handshake: Unexpected response code: 400 と怒られたときに読むページ

私はメール送信機能を持つアプリの開発時にダミーSMTPサーバとして [Mailhog](https://github.com/mailhog/MailHog) を利用しています。シングルバイナリながらも Web UI まで備える等お手軽・便利な点が気に入っていて、[ISO-2022-JP を文字化けさせないための PR をマージして生成したバイナリ](https://github.com/yokra9/MailHog-UI/releases)を配布しているくらいです。

そんな Mailhog ですが、Web UI をリバプロ経由で利用したい場合には WebSocket が貫通するように調整する必要があります。

## debian 用 Apache の場合

2つのモジュールを有効化する必要があります。HTTPのリバースプロキシを担当する `proxy_http` と WebSocket のリバースプロキシを担当する `proxy_wstunnel` です：

```shell
a2enmod proxy_http proxy_wstunnel
```

次に、ProxyPass を設定します。`apache2.conf` や `sites-available/000-default.conf` など、状況に応じて適切なものを選択してください。ここでは後者を利用します。

```000-default.conf
<VirtualHost *:80>

    # 中略

    ProxyPass "/mailhog/api/v2/websocket" ws://localhost:8025/api/v2/websocket
    ProxyPassReverse "/mailhog/api/v2/websocket" ws://localhost:8025/api/v2/websocket

    ProxyPass "/mailhog/" http://localhost:8025/
    ProxyPassReverse "/mailhog/"  http://localhost:8025/
</VirtualHost>
```

ポイントは、設定を記載する順番です。制限が厳しい順に記すルールとなっていますので、アプリ本体より API のエンドポイントを先に記載しなければなりません。エンドポイントの URL は `ws://localhost:8025/api/v2/websocket/` でないので注意しましょう。

## おまけ：Dockerfile

```Dockerfile
FROM debian:latest

USER root
RUN apt update
RUN apt install -y wget apache2
RUN a2enmod proxy_http proxy_wstunnel
RUN mkdir /opt/mailhog \
 && cd /opt/mailhog \
 && wget https://github.com/mailhog/MailHog/releases/download/v1.0.0/MailHog_linux_amd64
RUN chmod +x /opt/MailHog_linux_amd64
ADD 000-default.conf /etc/apache2/sites-available/
EXPOSE 80

ADD run.sh /bin/run.sh
CMD ["sh","/bin/run.sh"]
```

```shell:run.sh
/etc/init.d/apache2 start
/opt/mailhog/MailHog_linux_amd64
```

## 参考リンク

* [Always "disconnected" #142](https://github.com/mailhog/MailHog/issues/142)
DjangoでCustom User Modelを実装する

#はじめに
DjangoでCustom User Modelを設定します。

本記事はDjangoアプリを[Docker上に構築しAWS Fargateにデプロイする](https://qiita.com/keita_gawahara/items/66e58a6eed5c0c5f31d2)プロジェクトの一部です。

#Custom User Modelを使う理由
　Djangoにはデフォルトでユーザのモデルが設定されています。しかし、実際にアプリを作成すると、自分の作成したアプリに合わせてユーザモデルを変更したくなる時が必ずやってきます。ある程度コーディングが進んだ段階でユーザモデルの修正を行うのはとても難しい為、プロジェクトの最初からCustom User Modelを設定することが推奨されています。

#Custom User Modelの実装について
Custom User Modelを実装するには「AbstractUser」クラスまたは「AbstractBaseUser」クラスを利用します。「AbstractUser」クラスはデフォルトのユーザフィールドや認証を拡張する方法でありシンプルに実装が可能です。「AbstractBaseUser」クラスを使う方法はコーディング量が増えますが、より細かくカスタマイズができます。

今回は「AbstractUser」を使用し実装していきます。自身が開発に携わったプロジェクトでも「AbstractUser」を使用してユーザモデルをカスタマイズしました。一般的なユーザ管理をするのであれば「AbstractUser」でも十分対応できます。

#準備
[Docker+DjangoでPostgreSQLを使う](https://qiita.com/keita_gawahara/items/59a7db6046016046f0dc) で作成したプロジェクトにCustom User Modelを実装します。

#usersアプリの追加
まずはstartappコマンドでカスタムユーザを管理するusersアプリを作成します。その後setting.pyにCustom User Model関連のコードを追加します。

```
docker-compose exec web python manage.py startapp users
```
setting.pyに作成したusersを追加しましょう。また末尾にデフォルトのユーザモデルの代わりにカスタムユーザモデルを使用する旨を記載します。

```setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Local
    'users.apps.UsersConfig', #追加
]
...
AUTH_USER_MODEL = 'users.CustomUser' # 追加
```
#modelへCustomUserを追加
models.pyにCustomUserクラスを作成します。今回はデフォルトのユーザモデルからフィールドの追加はしないので直下にはpassを追加しておきます。独自のフィールドを設定する場合にはこちらにフィールドを追加してください。

```users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    pass
```
#Custom User Formsの作成

users/forms.pyを作成し、以下のコードを追加します。

```users/form.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm


class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm):
        model = get_user_model()
        fields = ('email', 'username',)


class CustomUserChangeForm(UserChangeForm):

    class Meta(UserChangeForm):
        model = get_user_model()
        fields = ('email', 'username',)
```

#Custom User Adminの設定
admin.pyに以下のコードを追加します。

```users/admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm

CustomUser = get_user_model()


class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['email', 'username',]

admin.site.register(CustomUser, CustomUserAdmin)
```

これで設定は完了です。最後にマイグレーションを行いましょう。

```
docker-compose exec web python manage.py makemigrations users
docker-compose exec web python manage.py migrate
```
ggplotの使い方メモ

Rにてggplotを使う際の忘備録を残しておきます

## 基本的なグラフの描画

基本的にはデータを指定してあとは好きなグラフを指定するという仕組み
ggplotにもとから入っているdiamondsデータを用いて基本的なグラフを描画します

### 棒グラフ

```bar.R
ggplot(data=diamonds)+
  geom_bar(mapping = aes(x = cut))
```
![bar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/021b5aa0-0b8c-f98c-0ad8-bf9c6b3aeea8.png)


### 箱ひげ図

``` boxplot.R
ggplot(data = diamonds)+
  geom_boxplot(mapping = aes(x=color,y=price))
```

![box.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/bc7dc134-342f-1433-4b73-bdb72b919240.png)


### ヒストグラム

``` hist.R
ggplot(data=diamonds)+
  geom_histogram(mapping=aes(x=price))
```
![hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/26efe19c-925c-5c75-93be-fb092c4c1681.png)


### 散布図

横軸：色，縦軸：価格としています

``` scatter.R
ggplot(data = diamonds)+
  geom_boxplot(mapping = aes(x=carat,y=price))
```
![scatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/e9c77211-a9d9-7975-3a58-22256fe284d7.png)


## おまけ

### 省略方法
dataやmappingといったものは省略することが出来ます
また，同じデータを用いて色々なグラフを描画する際にはこうやって書くと便利です

``` syouryaku.R
#箱ひげ図の例
gg = ggplot(diamonds,aes(x=carat,y=price))
gg + geom_boxplot()
```

### 色でわける
aesの中にcolorやfillを指定することでグラフを色分けすることが出来ます
colorとfillはグラフによってわかりやすさが変わるので使い分けが必要です

```color.R
ggdia = ggplot(diamonds,aes(x=carat,y=price))
#colorで色分け
ggdia +geom_boxplot(aes(color = cut))
```
![irowake1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/898f63fd-d101-beb3-1596-9da87323e75c.png)

``` fill.R
ggdia = ggplot(data =diamonds)

#fillで色分け
ggdia + geom_histogram(aes(price,fill = clarity))

```
![irowake2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/0141db81-fd99-5ea2-7907-4d211d3ddc34.png)
私が RDS を選ばなかった理由

Amazon RDS は AWS 環境に用意された RDBMS のマネージドサービスです。大規模災害にも耐えうる Multi AZ や、 MySQL, PostgreSQL に独自の拡張を行った Amaozn Aurora 等が人気で、2009年のローンチ以降、AWS のもっともよく利用されているサービスのひとつだと思います。

10年以上の歴史を持ち進化し続けてきた RDS ですが、それでもなお EC2 インスタンスに RDBMS をインストールして利用するケースがあります。そこでどのようなケースにおいて RDS を利用しない場合があったかについてまとめてみました。

## RDS を使うなという記事ではありません

この記事は RDS を利用するより EC2 を利用した方が良いという結論の記事ではありません。むしろ RDS を利用する事が多いので、そうならなかったケースを紹介する記事です。

## オールインワンで済む場合

ごく小さな規模のアプリケーションなら、アプリケーションサーバーとデータベースサーバーを小さなインスタンスにひとつにまとめてしまった方がコスパが良いですね。RDS への移行は利用者やアプリケーションの規模が大きくなってからでも良いでしょう。

## オンプレ環境のリードレプリカ（スレーブDB）として利用したい

RDS の MySQL インスタンスは、RDS 以外のサーバーをマスタとする、リードレプリカを作る事が可能です。しかし、マスタ・スレーブ同期の通信で SSL/TLS を利用可能なのは Aurora だけです（2020年2月現在）。このため、安全な通信経路を確保できない場合、RDS を利用するのは難しくなります。VPN等、別の安全な通信手段があれば、もちろん可能です。

## パフォーマンスを求めていて、かつ Aurora が利用できない

RDBMS ではすべてのデータとインデックスがオンメオリである事が理想です。しかし、実際には膨大なデータがメモリに収まり切れないケースも多々あり、そんな時はストライピングボリュームで劇的に高速化できる場合があります。クラウド環境だと単価が容量に比例するため、費用対効果も高いですね。しかし、ストライピングは RDS では選択できません。このため同価格ぐらいで性能を比較すると、EC2 で構築した MySQL の方が RDS よりはるかに速いというケースが存在します。

なお、Aurora は必要に応じてストライピングする機能が備わっているため、Aurora の方がパフォーマンスが優れているケースになる場合が多いそうです。
## スポットインスタンスを利用したい場合

EC2 のスポットインスタンスは最大でオンデマンドインスタンスの8割引きから9割引き程度で利用できる魅力的なサービスです。突然落とされるリスクが上がる事は無視できないデメリットですが、状況によってはそれを補ってあまりあるメリットがあります。データベースも一時的に利用したい場合にはスポットインスタンスが便利なのですが、RDSにはスポットインスタンスがありません。

## その他

以上は実際に私が遭遇したケースですが、以下のようなケースも RDS を利用しにくいかも知れません。

 * 標準搭載されていないプラグインを利用したい場合
 * `SELECT INTO...` 等を多用し、サーバーのファイルシステムに直接アクセスしたい場合
 * PaceMaker 等で他のリソースと連動するような HA クラスタを構築したい場合
 * 利用したいバージョンが対応していない場合
 * 少しでもいいから安くしたい場合

## まとめ

RDS は優れたサービスですが、「AWS なら RDS」と決めてかかるのではなく、ケースによっては EC2 で地道に構築した方がより良い選択肢になる場合もあります。もっともそういう手間を一切合切引き受けてくれるためのサービスが RDS なのですから、可能な限り利用しましょう。

また、改めて書いてみると私が扱ってきたケースは Aurora で解決できる問題が多そうです。色々な事情で利用できなかったのですが、Aurora も積極的に利用していきたいと思ってます。
GPD P2 Max Ubuntu Mateインストールメモ

#インストール前

http://gpd.hk/gpdp2maxfirmwaredriverbios
実行するまえにBIOSのアップデートを行う
公式ツールはWindows用
アップデートしないとタッチパネルが認識しない

#インストールについて
https://ubuntu-mate.org/download/
ISOイメージからUSBメモリ起動ディスクを作るツールで
起動メモリを作る
あとは、ガイダンス通り実行する

#タッチパネルが狂っている場合
xinputコマンドを実行
Goodix Capacitive TouchScreen           	id=16	[slave  pointer  (2)]

が表示されるので、
xinput set-prop '16' 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1
を実行すれば、タッチパネルの位置は修正できる。
自動起動するアプリに登録すれば、治った状態で起動できる

```
xinput set-prop `xinput|grep Goodix|grep pointer|awk -F'id=' '{print $2}'|awk '{print $1}'` 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1
```

#回転用のスクリプト

```sh:script.sh
#!/bin/sh

case $1 in
"help" )

echo left of help
;;
"left"|"-l" )
xrandr -o left
xinput set-prop `xinput|grep Goodix|grep pointer|awk -F'id=' '{print $2}'|awk '{print $1}'` 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1
;;
"right"|"-r" )
xrandr -o right
xinput set-prop `xinput|grep Goodix|grep pointer|awk -F'id=' '{print $2}'|awk '{print $1}'` 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1
;;
* )
xrandr -o normal
xinput set-prop `xinput|grep Goodix|grep pointer|awk -F'id=' '{print $2}'|awk '{print $1}'` 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1
esac
export MOZ_USE_XINPUT2=1
exit

#xinput set-prop '16' 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1
xinput set-prop `xinput|grep Goodix|grep pointer|awk -F'id=' '{print $2}'|awk '{print $1}'` 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1
export MOZ_USE_XINPUT2=1
```
Javaのメソッドと引数の関係を生化学式に解釈する

コメントいただいたところを取り入れて後ほど編集します




Javaをはじめたのですが、なかなか理解できないので自分なりの解釈で勉強します:ghost:

##メソッドの定義
```

public static メソッド名　（引数リスト）　{
 処理
}
```

##メソッドの呼び出し

```
メソッド名（引数）
```

###引数とメソッドの考え方
:point_up_tone1:引数＝基質
:point_up_tone1:メソッド＝酵素
と考える

```eg)
public class Main {
 public static void main(String[] args){
  hello ("Java");
 }

 public static void hello (String name){
  System.out.println(name + "こんにちは");
 }
}
```

基質（引数）が酵素（helloメソッド）を活性化する（呼びだす）
活性部位（変数の型と順番）があわなきゃダメ:helmet_with_cross:→コンパイルエラーになっちゃう

![622.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400567/1fddeef8-1455-910a-f3bf-3bbbf96d941d.jpeg)
初心者向け 少し便利なPHP関数

## はじめに
2つの配列があり、一つをキーにしてもう一つを値にして配列を作り直したい時

```php
<?php
    $array1 = [ "a", "b", "c" ] ;
    $array2 = [ "1", "2", "3" ] ;
		
    //　こういう配列を作りたい
    $combineArray = [
        "a" => "1",
        "b" => "2",
        "c" => "3"
     ];
?>
```

## 解決策
PHP7.2には、array_combine()と言う関数あり、これを使うだけで簡単に実現できます。

``` {.php}
<?php
   // 配列
　　$array1 = [ "a", "b", "c" ] ;
	$array2 = [ "1", "2", "3" ] ;

	// 実行
	$result = array_combine($array1, $array2) ;

	// 返り値
	print_r( $result ) ;
?>
```

## 結果
```
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
```

以上です。

公式リファレンス

[https://www.php.net/manual/ja/function.array-combine.php](http://)
RubyでAtcoderからテストを自動生成するライブラリを作りました

Atcoderのコンテストにチマチマでているのですが、最近Rustでテスト生成や提出ができるCLIツールを作っている方を見かけました。
https://github.com/tanakh/cargo-atcoder

丁度コンテスト時に入出力例をいちいち試すのが面倒だと感じていたので、Rubyでもテストを自動生成するGemをつくってみました。

https://github.com/QWYNG/green_day

### 使い方

#### インストール
`gem install green_day`なりでインストールしてください。

#### ログイン

`bundle exec green_day login`
でユーザー名とパスワードを要求されるので入力してください。
Atcoderからのset-cookieの中身をcookie-storeというファイルに保存します。セッションを消したかったらこのファイルを削除してください。
セッションがないと開催中のコンテストにアクセスすることができません。

#### 作業用ディレクトリ及びテストの作成

このコマンドでコンテスト用のディレクトリ及びテストを生成できます。

`bundle exec green_day new <contest-name>`


例えば[abc150](https://atcoder.jp/contests/abc150)を対象にしたいときは下のようになります。
`bundle exec green_day new abc150`
こうするとこんな感じのディレクトリ構成になります。

```
 abc150
 ├── A.rb
 ├── B.rb
 ├── C.rb
 ├── D.rb
 ├── E.rb
 ├── F.rb
 └── spec
     ├── A_spec.rb
     ├── B_spec.rb
     ├── C_spec.rb
     ├── D_spec.rb
     ├── E_spec.rb
     └── F_spec.rb
```

自動生成されるテストは例えば[abc150のA問題](https://atcoder.jp/contests/abc150/tasks/abc150_a)ならこんな感じになります。

```ruby
require 'rspec'

RSpec.describe 'test' do
 it 'test with "2 900\\n"' do
   io = IO.popen("ruby abc150/A.rb", "w+")
   io.puts("2 900\\n")
   io.close_write
   expect(io.readlines.join).to eq("Yes\\n")
 end

 it 'test with "1 501\\n"' do
   io = IO.popen("ruby abc150/A.rb", "w+")
   io.puts("1 501\\n")
   io.close_write
   expect(io.readlines.join).to eq("No\\n")
 end

 it 'test with "4 2000\\n"' do
   io = IO.popen("ruby abc150/A.rb", "w+")
   io.puts("4 2000\\n")
   io.close_write
   expect(io.readlines.join).to eq("Yes\\n")
 end

end
```

後は`abc150/A.rb`に提出用のコードをそのまま書けばOKです。

```ruby
n, m = gets.split.map(&:to_i)
 
if 500 * n >= m
  puts "Yes"
else
  puts "No"
end
```
いつものようにrspecでテストすることができます。


```
> rspec abc150/spec/A_spec.rb
...

Finished in 0.15933 seconds (files took 0.08655 seconds to load)
3 examples, 0 failures
```

テスト名に入力例をそのまま入れているのでテスト結果はそれをみて判断してください。

```ruby
  3) test test with "4 2000\n"
     Failure/Error: expect(io.gets).to eq("Yes\n")
     
       expected: "Yes\n"
            got: "No\n"
     
       (compared using ==)
     
       Diff:
       @@ -1,2 +1,2 @@
       -Yes
       +No
       
```

### 後書きとか
一応CIではRuby 2.7.0とAtcoder用にRuby2.3.3でテストしています。
(ローカルでは2.3系は入れるのが面倒だったので未確認です)
入出力例のスクレイピングは全コンテスト試したわけではないので、未対応のケースがあるかもしれません。もし見つけたら教えてくれると嬉しいです。
提出まわりはつくっていないのですが気が向いたら作ります。

## 2020/02/11追記

`spec.files`を消したままなのを忘れてリリースしてました。
すいませんでした！！！！！！！！
修正しました！！！！！！！


## 2020/02/18追記
複数行の回答の出力に対応しました
Nuxt.js『TypeError: Cannot set property 'render' of undefined  at normalizeComponent』のエラー対処

Nuxt.jsで開発中コンソールで下記のエラーが発生。

```
TypeError: Cannot set property 'render' of undefined at normalizeComponent
```

![nuxt-error.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/4c62d9cf-f6a3-0266-8d08-873c32e4bdab.jpeg)

結果として、vueファイルに下記のように空のスクリプトタグがあるのが原因。

```vuejs:.vue
<script>
</script>
````
スクリプトタグを削除するとエラーが無くなります。
【Vue.js】VM(view model) をメソッドの引数に渡す方法。 

Vue には、 `Vue インスタンス` と呼ばれるものがある

([vue インスタンス](https://jp.vuejs.org/v2/guide/instance.html)についてはこちら参照)

メソッドの呼び元の Vue インスタンスへのアクセスは極めて簡単であった。

## やりたいこと

template から method を呼んで、
呼んだタグを変数で扱いたい。

## 知ってた方法

vue インスタンスは以下のようにして取得ができる。
メソッドのコール元で、引数を指定しなかった場合、
メソッドの第1引数にわかってくるのである。


```vue
<template>
 <div v-on:click=clickAction></div>
</template>

<script>
 export default {
  methods: {
   /**
    * @param {Object} vm view model
    */
   clickAction(vm) {
     console.log(vm)
   }
  }
 }
</script>
```

## 知らなかった方法

しかし、呼び元で、vue インスタンス以外の値を引数で渡したい場合はどうなるのか

### 失敗例

```vue
<template>
 <div v-on:click="clickAction('hoge')"></div>
</template>
<script>
 export default {
  methods: {
   /**
    * @param {Object} vm "view model"
    * @param {String} str "meta variable"
    */
   clickAction(vm, str) {
     console.log(vm)
     console.log(str)
   }
  }
 }
</script>
```

これだとダメなのですね
実はこれですと

```
console.log(vm)
=> hoge
console.log(str)
=> undefined
```

となってしまい、
`template` から入れた第1引数は、そのまま第1引数に入ってしまい、
第2引数無しでメソッドを呼んでしまう。

### 成功例

なので答えは以下です。

```vue
<template>
 <div v-on:click="clickAction($event, 'hoge')"></div>
</template>
<script>
 export default {
  methods: {
   /**
    * @param {Object} vm "view model"
    * @param {String} str "meta variable"
    */
   clickAction(vm, str) {
     console.log(vm)
     console.log(str)
   }
  }
 }
</script>
```

メソッドの引数に
`$envent` を渡してあげます。

[公式](https://jp.vuejs.org/v2/guide/events.html#%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9)　に書いてありました。

> 時には、インラインステートメントハンドラでオリジナルの DOM イベントを参照したいこともあるでしょう。特別な $event 変数を使うことでメソッドに DOM イベントを渡すことができます:

---

また１つ賢くなりました。

これで、 メソッド側で DOM にアクションが容易く行えますね。
Talend（Talend Open Studio for Data Integration）備忘録

# 概要
近年、Talend で移行ツール等を作成する事が多くなったので、備忘録として本稿にまとめる。

# Talend とは？
* Talend とは、Talend社が提供する ETL ツール群  
    * ETLとは、Extract（抽出）、Transform（変換）、Load（格納）の略で、データ統合時の各プロセスの頭文字をとったもの。
    * 本稿で取り上げるのは無償版の Talend 統合開発環境 「Talend Open Studio for Data Integration」  
    有償版（Talend Platform / Enterprise）はサポートやチーム開発向けの機能等が追加されている（後述「エディション比較」参照）。
* 様々なコネクタコンポーネントが提供され、多種多様なデータソースへ接続し、取得したデータの加工、出力処理をコードレス開発できる（Javaのコードを直接書くことも可能）
* 作成したTalendジョブは実行モジュール形式でエクスポートが可能で、必要となるライブラリ等もすべて包含されているため、プラットフォームにはJREのみを導入するだけで動作可能

# エディション比較

### 概要
基本的なバッチ処理開発なら無償版で問題ないが、「チーム開発」や「処理速度」を求める場合は有償版が必須となる。

* 無償版
    * [Talend Open Studio for Data Integration](https://jp.talend.com/products/data-integration/data-integration-open-studio/)
* 有償版
    * [Talend Data Integration（エントリー版）](https://jp.talend.com/products/data-integration/)
    * [Talend Data Management Platform（プラットフォーム版）](https://jp.talend.com/products/data-integration/data-management-platform/)

### 比較表
以下比較表からポイントとなる項目のみを抜粋して掲載  

|比較項目|Open Studio|Data Integration|Data Management|
|---|:-:|:-:|:-:|
|ライセンス|無償|有償|有償|
|開発ツール・ジョブデザイナー|●|●|●|
|共有リポジトリ *1（チーム開発対応）||●|●|
|リポジトリーマネージャー|||●|
|対応コンポーネント|● *1|● *1|● *1|
|対応コネクター|● *2|● *2|● *2|
|管理・モニタリング||●|●|
|データ品質・統制|||●|
|高可用性、負荷分散、フェールオーバー|||●|
|サポート|（無し）|Web、メール|Web、メール、電話|
\*1：対応コンポーネントはエディションによる差異はなし
\*2：対応コネクタはエディションによる差異は**ほぼ**なし（Data Management版のみクレンジング、サードパーティ製アドレス辞書との連携等が使用できる）

* 出典
    * https://jp.talend.com/products/data-integration-compare-all/
    * https://jp.talend.com/download/

### 価格
* 具体的な価格情報はサイトに記載なし（問い合わせ、見積もり依頼）
* Talendで開発・運用を行うユーザ数で購入する（ユーザーライセンス）  
  注）利用者側ではなく開発者側のライセンス数
* 保守サポート料を含む1年間を単位としたサブスクリプション形式。  
→ サーバの数（コア数、CPU数）や扱うデータ量には影響されない

### ライセンス
無償版はApacheライセンスを採用。よって商用利用時の制限等はなし（Apacheライセンスを使用していることの宣言のみ）。

# Talend Open Studio（TOS）インストール関連
* Talend Open Studio（TOS）とは、Eclipse 上で動作する Talend 統合開発環境（2020/03/01 時点での最新は v7.3.1）
* あらかじめ、Java（JDK）をインストールする必要がある（Eclipse の Pleiades等に付属されるJDKはそのままでは認識しない）。
* インストーラーを起動すると、展開先を聞いてくるためデフォルトの「C:\talend」等を選択してインストール（展開のみ）、しかし実際は「C:\talend\TOS_DI-Win32-20200219_1130-V7.3.1」のように展開されるため、「C:\talend」となるように展開したファイル一式を移動する。
2/10 授業ノート

#復習
・**HTMLとは：Webページを記述するためのマークアップ言語。マークアップとはコンテンツの初めと終わりに「タグ」をつけ、その範囲に意味づけをすること。(教科書P14)**
・CSSとは：HTML文書に装飾・レイアウトを施すための言語
・CSSの記述について：セレクタ―｛プロパティ：値；｝という流れで記述。
　意味はセレクタ―→何に対して、プロパティ→何を、値→どうする
　ex:)```h1{color: red;}```→h1に対して、colorをredにする

#テストに出る！範囲
・**pxとは：相対単位の一つ。モニタの画素(ピクセル)を１とする単位
　ex:)代表的な画面解像度は1280×720(px)**
・**セクション要素(教科書P208～)
　→見出しとそれに伴うコンテンツのひとかたまりのこと。
　　文書の「アウトライン」を生成し、情報の階層構造尾を明示する役割を持っている。**

#今日習ったこと(教科書P96～)
**CSSでセクションの幅を決める**
・一般的なサイズは**width:960px**
**CSSの記述(教科書P96～)**
・セレクタ：h1、nav、olなどタグの事
・グループセレクタ―：複数のセレクタに同じ記述をする時、セレクタ同士を「,」でつないで記述
　ex:)```ul,ol{...}```と記述すると、ulとolに{}内の記述が反映される
・子孫セレクタ―：
・padding：ボックスの内側の上下左右の余白
・margin：ボックスの外側の上下左右の余白
・ショートハンドとは：関連プロパティはプロパティ毎に一括指定することができる
　ex::)
　　①margin/paddingプロパティ
	margin: A;：上下左右すべてAの値だけ余白を指定
	margin: AB;：上下(A)左右(B)の値だけ余白を指定
	margin: ABC;：上(A)左右(B)下(C)だけ余白を指定
	margin: ABCD;：上(A)下(B)左(C)右(D)だけ余白を指定
　　②borderプロパティ
	border-width: 1px;
	borderstyle: solod;-
	border-color: #fff;
	→border: 1px solid #fff;(順不同)
　　③backgroundプロパティ
 	background-image:url(original/header_herbkitchen.jpg);
background-position: left top;
background-repeat: no-repeat;
→background:url(../original/header_herbkitchen.jpg) left top no-repeat;(順不同)

**外部ファイルからCSSを参照する場合の記述**
・「```@charset "utf-8";```」と一番最初に入力
　→入力忘れるとエラーや文字化けの原因になる
・参照するファイルを指定する記述をHTML文書に記述
　→```<link rel="stylesheet" href="css/style.css">```

#ミス
```@charset "utf-8";```の記述を間違えて、
```@charset "utf-8"```(セミコロン抜け)と記述して、
```div{width: 960px; margin: 0 auto;}```
が反映されないトラブルが発生した。
**確認に使ったツール**[CSS Validation Service](https://jigsaw.w3.org/css-validator/)

#感想
無事Qiita側から凍結が解除されて、胸をなでおろした。
どうやら[2/6の記事](https://qiita.com/aachan_studyrecords/items/8eea23dcebf8c267bd78)が機械的にスパム認定されたらしい。
凍結事件のお陰でモチベーションがかなり下がったので、すぐに解除してもらえてよかった。

今日も情報量が多い日だった。
今のところ1回自力で学習して、授業を復習として利用してるのでついていけてるけれど、
正直この調子じゃjsやPHPで盛大に躓く予感しかない。
授業で心が折れる前に家でへし折っておこう…。
予習の鬼なので、そのうち予習ノート作るかもしれない。
Azure Pipelines でハマった話

Python パッケージを [Azure Artifacts](https://azure.microsoft.com/ja-jp/services/devops/artifacts/) フィードにアップロードしようとしてハマった話を一つ。

[Azure Pipelines](https://azure.microsoft.com/ja-jp/services/devops/pipelines/) から Python パッケージをアップロードするには、

```yaml
- task: TwineAuthenticate@1
  inputs:
    artifactFeed: FEED
- script: |
   python -m twine upload -r FEED --config-file $(PYPIRC_PATH) dist/*
```

のようなステップを書くと説明されているのですが、 Azure Artifacts に新たに作成するフィードは、これを書いている時点で、すべてプロジェクトスコープ フィード (project-scoped feeds) になっていて、

```yaml
- task: TwineAuthenticate@1
  inputs:
    artifactFeed: PROJECT/FEED
```

とプロジェクト名を指定する必要があったわけです。これが分かるまで何度も試行錯誤を繰り返してしまいました。

現実的には、次のように変数参照にするのが便利だと思いますね。

```yaml
- task: TwineAuthenticate@1
  inputs:
    artifactFeed: $(System.TeamProject)/FEED
```
【JavaScript】編集内容が消えて困るページに離脱前の確認をはさむ


Web ページで何かを編集していて、間違ってブラウザバックしてしまったりタブを閉じてしまうと「あっ」てなりますよね。こんなとき、いくつかのサイトでは以下:arrow_down:のような確認ダイアログが出てきて救われることがあります（Qiita の投稿画面でも出てきますね）。

![このサイトを離れますか？ 行なった変更が保存されない可能性があります。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65644/dd7afb01-4592-f79d-db7b-ee1ad1fb0e7c.png)


この実装方法を紹介します。

# コード

離脱前に確認ダイアログを出したいページに、以下の JavaScript を置いてください。

```javascript
window.addEventListener('beforeunload', function (event) {
  event.preventDefault() // (1)
  event.returnValue = '' // (2)
})
```

コードを見るとわかりますが、表示するメッセージを指定している部分はありません。確認ダイアログのメッセージは、**ブラウザ標準の固定メッセージから変更できない**ため注意してください[^1]。

[^1]: 参考文献[2]に詳しいですが、かつてはイベントリスナの戻り値や`returnValue`の設定値が確認ダイアログのメッセージとして使われるブラウザもあったようです。(2)のパターンで確認ダイアログが出る実装になっているのはその名残のようですね。

# 解説

`window` の `beforeunload` のイベントリスナを設定しています。このイベントリスナで_特定の操作_をすると、:arrow_up:のスクショのような確認ダイアログを出せます。「特定の操作」というのは、以下のどちらかです:

* (1) **イベントオブジェクトの `preventDefault` メソッドを呼ぶ。**HTML の仕様ではこちらが正当らしいが、すべてのブラウザではサポートされていないらしい（参考文献[1]参照）。
* (2) **イベントオブジェクトの `returnValue` 属性に文字列をセットする。**文字列は**何でも良い**（この例では空文字列に設定）。

上記のコードでは、いろいろなブラウザに対応するため両方の操作をやっています。

なお、この操作を行ったとしても、本当にダイアログが出るかどうかはブラウザに任せられているようです。たとえば Chrome では、フォームの入力値を変更していない場合はダイアログが出ませんでした。濫用を防ぐためでしょう。

# 参考文献

* [1] [beforeunload - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/Events/beforeunload)
* [2] [onbeforeunload が変わってた - 1](http://var.blog.jp/archives/70707876.html)
Unity NetCode 使用時のエラーの解決法

# はじめに
ゲーム開発時にUnity NetCodeをInstallして、「さて、ゲームを作ろう」という時に、いきなりエラーが出てしまいます。
本記事ではそのエラーを解決する方法を書きました。

# 環境
- Unity 2019.3.0f6
- Unity NetCode preview.0 - 0.0.4 

# 問題
Package ManagerからUnity NetCodeをInstallすると次のようなエラーが出ます。

```
Library/PackageCache/com.unity.netcode@0.0.4-preview.0/Runtime/ClientServerWorld/ClientServerBootstrap.cs(31,33): error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.IReadOnlyList<System.Type>' to 'System.Collections.Generic.List<System.Type>'
```

# 解決法

`ClientServerBootstrap.cs` の**31行目**

```cs
GenerateSystemLists(systems);
```

を次のように変更します。

```cs
GenerateSystemLists(systems as List<Type>);
```

# 参考
[Getting started with NetCode Error CS1503 - Unity Forum](https://forum.unity.com/threads/getting-started-with-netcode-error-cs1503.820878/)
タダでプログラミングを学ぶ方法を考えてみた。

# Background

[何もない状況から低コストでプログラミングを学ぶ方法を考えてみた。(Mac編)](https://qiita.com/satsukiya/items/1ca3554da096805e4228)
の続きです。

今回はスマホは持っててPC買い始めのひと向けに無料でプログラムを学ぶ方法をまとめてみました。

# OPAC - Library search system

おそらく、大卒が知っていて中卒・高卒が知らないことはOPACではないでしょうか。
大学であれば本・雑誌・論文などを探すのに一回生の最初のオリエンテーションで聞かされると思います。

Googleで
*OPAC [住んでいる市町村区]*
と検索すると図書館のリンク出てくるので、ここで
*Python*
と入力して探せば良いと思います。

予想ですが、プログラム自体何それおいしいの状態のエリアが大半であってもVBAが主力だと思います。そのため、少し大きめの図書館でなければ検索は引っかからないと思います。

ただし、三大都市圏に住んでいるのであればどこかの図書館へ行けばPythonの本は必ずあるのでこの方法で探す選択肢は持っていて損はないです。

試しに
[東京都立図書館](http://ufinity01.jp.fujitsu.com/metro/?page_id=8027)
で東京都内にあるPythonの本を探してみました。

<img width="50%" alt="OPAC.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/77747f86-4606-0930-f291-7227710530a7.png">

ここでは、[区立図書館][市町村立図書館]にチェックして"Python"で検索しました。

<img width="50%" alt="search.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/6a844cb4-5cfa-f7df-7530-b24fda857a73.png">

50音順なので足立区から表示されますがひとつの図書館に数十冊はありそうです。
左側のメニューから近くの図書館をクリックすると検索結果が反映されます。

東京都内だと約2500 ~ 3000冊はありそうです。

# Web site

- [python-izm - 基礎編](https://www.python-izm.com/basic/)
- [Let'sプログラミング - Python入門](https://www.javadrive.jp/python/)

の２つのサイトに書かれているコードを使って実行すれば大体のことは網羅できます。
(説明雑でサーセン:sweat_smile:)

あとは、公式サイトのドキュメントにもサンプルコードが書かれています。
ライブラリはたくさんあるわけですが、学習が進んで何か自分でアプリを作りたい時に必要そうな分だけ選んで使えば良くて、全て覚えている開発者はほとんどいないんじゃないかと思います。

- Python2系
    - [チュートリアル](https://docs.python.org/ja/2.7/tutorial/index.html)
    - [ライブラリ](https://docs.python.org/ja/2.7/library/index.html)
- Python3系
    - [チュートリアル](https://docs.python.org/ja/3.8/tutorial/index.html)
    - [ライブラリ](https://docs.python.org/ja/3.8/library/index.html)


# Skill Check

ひと通り学習が終わったら力試しとしてスキルテストすると良いです。
本格的に始めたい場合は[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja)でもいいのですが、難易度の設定バランスや問題の出題方式だと[Paiza](https://paiza.jp/challenges/info)の方がとっつきやすいです。S・A・B・C・Dと難易度別に問題が約200問あるのですが、C・Dの問題を多く正解できれば良いと思います。B問題ができると尚良いです。
（最低限一般の開発者が求めているスキルはB問題でしょうか。実際問題自分がなんとか一定の給与をもらって働いている。)

自分はと言いますと一回しかA問題は解けんかったです:scream:
授業で再帰・２分探索・動的計画法などを学んでアウトプットできていればとちょっと後悔しています:sweat:

![paiza.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/1cc98876-8ddb-b082-dbac-f3236ee7ec08.png)

(注： ギノの社員でも契約社員でもないとです:spy:)

# NextStage

Skill Checkで自信がついたらゲーム・webサイトを作成するなどのフェーズに移ればいいです。
[freegames](http://www.grantjenks.com/docs/freegames/)か[pygame](https://www.pygame.org/news.html)を使ってサンプルコードを改造するところから始めるとかいいかもしれないです。
(以前に[[Python]pipからゲームをインストールして遊んでみた](https://qiita.com/satsukiya/items/8c3cb67dc2f9cce13e04)で方法をまとめてます。)


# PostScript
次はPython2系とPython3系の話をしようと思います。
絵や表で見ておぼえるSQLトランザクションと分離レベル

本記事ではどのトランザクション分離レベルにすることで、どんな現象を防ぐことができるかについて。何度も見聞きするがよく忘れてしまうので、図説して絵で確認していきます。

## トランザクションとは？
>トランザクションの基本的要点は複数の手順を単一の「全てかなしか」の操作にまとめ上げることです。 (参考：PostgreSQL 11.5文書）

簡単に言うと

- 1つの作業単位として扱う**一連の操作の集まり**です
- トランザクション内の操作は**全て実行されるか、または全て実行されない**です

トランザクションが活躍する場面でよく使われる例は、銀行の振り込みです。
例えばAさんがBさんに1万円を振り込むとき、

- Aさんの口座から**出金されたが、Bさんへの口座への入金に失敗**
- Bさんへの口座への**入金に成功しているが、Aさんの口座から出金されていない**

といった問題を防ぐため、出金と入金の処理をまとめてトランザクションにします。

<img width="788" alt="transaction.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107345/0805f75d-1fa6-af1e-b814-0996f944e27d.png">
図を見ると、処理は2つありますがそれらをまとめて**トランザクション**としています。
処理結果は、**どちらも成功の場合のみ**トランザクションの処理を全て実行するようにしていますね。

これで、入出金の失敗が防げるようになりました。

## トランザクションによって起こりうる現象
こんな便利なトランザクションですが、使うことで起こる可能性のあるよく知られた現象が**3つ**あります。

**1. ダーティリード**
**2. ノンリピータブルリード（ファジーリード）**
**3. ファントムリード**


### ダーティリード
別のトランザクション(絵ではトランザクションB)で**まだコミットされていないデータを、他のトランザクション(絵ではトランザクションA)内で読み込んでしまう現象**
<img width="604" alt="dirty-reads.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107345/0bad9473-1995-2152-f00b-2593c61c2c19.png">
まだ処理が終わっていないデータを読み込んでしまっています。
トランザクションAが失敗した場合
**「Aさんの口座から1万円をマイナス」されないこと(ロールバック)**になりますが、
**Cさんは「Aさんの口座から1万円をマイナス」された結果を見てしまいます**。


### ノンリピータブルリード（ファジーリード）
あるトランザクション(絵ではトランザクションB)でデータを複数回読み取っている途中で、
他のトランザクション(絵ではトランザクションA)でデータを**書き換え（更新し）**てしまい、
**途中から違う結果のデータを読み取ってしまう現象**
<img width="539" alt="nonrepeatable-read.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107345/397892dc-3915-2227-420d-5e28c74a9025.png">


### ファントムリード
あるトランザクション(絵ではトランザクションB)の途中で、
他のトランザクション(絵ではトランザクションA)によってデータが**挿入/削除**されてしまい、
**途中から読み込むデータ(の数)が異なってしまう現象**
<img width="526" alt="phantom-read.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107345/8740bb7c-37fa-2762-96db-81f2f9890214.png">

## トランザクション分離レベル
トランザクションによって起こってしまう3つの問題を見てきました。
いずれもトランザクション中に他の処理が入ってしまうことで起きる問題です。

これらの問題を防ぐために、トランザクションは**トランザクション中の処理に対して他の処理がどの程度介入できるか**を設定することができます。

これを**トランザクション分離レベル**と呼びます。トランザクション分離レベルは4つあります。

1. **Read Uncommited**
2. **Read Commited**(PostgreSQLのデフォルト）
3. **Repeatable Read**(MySQLのデフォルト)
4. **Serializable**

下に行くほど強い分離レベルと呼ばれ、「ダーティリード、ノンリピータブルリード、ファントムリード」の問題を防ぐことが可能になります。
<img width="881" alt="isolation-level.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107345/e9d7a18f-2e88-cf50-72c5-7caf8d5b6aee.png">
**※Serializableが必ず良いと言うわけではありません**
GitHub Actionsでcpplintを使ってみた

# はじめに
GitHub Actionsを試しに使ってみたので備忘録程度に書きます。

# GitHub Actions とは

https://help.github.com/ja/actions/automating-your-workflow-with-github-actions

GitHub標準のCI/CD機能。
GitHub上で発生するイベントをトリガーに、任意のアクションを実行できます。


# cpplint とは

https://github.com/cpplint/cpplint

[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) にそったコーディングスタイルで書かれているかチェックする静的解析ツール。

とはいえ、全て上記スタイルに適用させたいわけではないと思うので`filter`オプションを使い必要なものだけチェックするのが良いです。

```bash
# 例
cpplint --filter=-legal,-runtime/references --recursive .
```

# workflow

https://github.com/cpplint/GitHub-Action-for-cpplint
cpplintで紹介されてたものをそのまま引用させていただきます。

リポジトリに `.github/workflows/cpplint.yml` ファイルを作成。(ファイル名はなんでもいい)

```yml:cpplint.yml
name: cpplint
on: [push, pull_request]
jobs:
  cpplint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - uses: actions/setup-python@v1
    - run: pip install cpplint
    - run: cpplint --recursive .
```

上記の場合はpushしたときとプルリクを作成したときをトリガーにcpplintが走ることになります。
(実際には先ほど述べたように`filter`等のオプションを追加で指定したりします。)

実行結果はGitHub上で確認できます。
![2020-02-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104703/1a3a5c7d-f162-c7a3-f373-f968299d6e31.png)


## おまけ

Marketplaceで検索するとすでに用意されたアクションが見つかるので、特に問題なければそれを使用するのが楽です。

https://github.com/marketplace/actions/action-cpp-lint

```cpplint.yml
name: cpplint
on: [push, pull_request]
jobs:
  cpplint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: action-cpp-lint
      uses: CyberZHG/github-action-cpp-lint@0.0.2
      with:
        args: --recursive . # cpplintのオプション
```

# 参考

https://it.impressbm.co.jp/articles/-/18498
初心者によるプログラミング学習ログ 235日目

#100日チャレンジの235日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

235日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>235日目<br>・Vue.jsアプリ模写<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1226599038511804416?ref_src=twsrc%5Etfw">February 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
PHPアプリで扱う設定ファイルの形式をどうするか

# 目的

PHPアプリを作る上で、挙動のカスタマイズや、DBの接続設定をどういった形式のファイルに保存するか考える。

# 結論

PHP においては ini ファイル一択。

後半にあるマトリックスでYAML,TOML,INIが同得点になったのは真実に迫っていると思う。

# 評価点

* 表現力
* 書きやすさ
* 読みやすさ
* パースの速さ
* 導入の容易さ
* ポータビリティー

# 候補

* YAML
* TOML
* JSON
* XML
* INI

# 総評

PHPはXMLとJSONとINIしか標準でパースできないので、書きやすさ、読みやすさ、導入の容易さ、ポータビリティにおいてINIの妥当性が高い。

## 表現力

どんな設定ファイルかという具体性がないのでどれだけの表現力が求められるか評価が難しいところだけど、それぞれ設定ファイルとして採用された実績は沢山あるので、表現力に関して問題になる事は想定しなくてよいのではないか。

正直なところ、INIファイルは複雑な設定ファイルになると表現力に乏しいと思う。

## 書きやすさ

パースのしやすさ(syantax的な難しさ)と、意図通りに書きやすいかという論点があると思う。
JSONはシリアライズ用のフォーマット色が強い。

JSON、XMLは書きにくい。

## 読みやすさ

XMLは読みにくい。JSONもちょっと読みにくい。

## パースの速さ

パースの速さにこだわりがちな人は多いが、設定ファイルを1回の処理で何度もパースする事はないので、評価が必要なほど遅いものは無いというだけで全部合格。

パーサーの書きやすさだとXML,JSONあたりになるだろうけど、それは別の話。

## 導入の容易さ

PHPアプリでという前提なので標準でパースできるXML、JSON、INIに軍配が上がる。
ただし、YAML、TOMLも負担はない。XML書くぐらいならYAML、TOMLを使いたい。

## ポータビリティー

YAML、INIは仕様が若干曖昧でパーサによっては扱えない事があったりするかもしれないけど、何を選んでもまず困ることはないと思う。

## モダンさ

評価点には挙げていないが、INI、XMLは古いイメージはある。

# マトリックス

||表現力|書きやすさ|読みやすさ|パースの速さ|導入の容易さ|ポータビリティー|モダンさ|合計(モダンさを評価しない)|
|--:|:--|:--|:--|:--|:--|:--|:--|--:|
|YAML|5|5|5|5|4|5|5|34(29)|
|TOML|5|5|5|5|4|5|5|34(29)|
|JSON|5|3|4|5|5|5|5|32(27)|
|XML|5|1|3|5|5|5|4|28(24)|
|INI|4|5|5|5|5|5|3|32(29)|

# 感想

この記事はPHPだと設定ファイルはINIファイルが妥当なんじゃないのかなという実感が先にあって、表現力とモダンさでINIファイルを使うことを躊躇する必要は無いんじゃないかなという意図ありきで書きました。

具体的に選定する際はそれぞれの状況において適切なものを選ぶべきだと思うけど、選定理由はきちんと説明出来るようにしたほうが良い。

モダンなものは課題を解決した結果誕生しているので優れていることは多いが、用途や要件を満たしたものの中では、モダンだからという事自体は理由にならないと思う。
Jestでカスタムイベントのdispatchを検証する方法

Jestでカスタムイベントのdispatchを検証する方法です。
調べてあまり情報出てこなかったのでメモ。

# テスト対象

単純にセレクタと、カスタムイベント名を受け取ってイベントを発行する関数を対象とします。

```trigger-custom-event.ts
export const triggerCustomEvent = (
  selector: string,
  eventName: string
): void => {
  const target = document.querySelector(selector);
  target?.dispatchEvent(new Event(eventName));
};
```

# テストコード
dispachEventで指定のカスタムイベントが発行されたことを検証するので、対象のDOMのdispachEventをモックに差し替えます。
そして、mockのcallsで発行回数、発行イベント名を検証します。

```trigger-custom-event.test.ts
import { triggerCustomEvent } from "../src/trigger-custom-event";

describe("custom actions", () => {
  let spyDispatchEvent: jest.Mock;

  beforeEach(() => {
    spyDispatchEvent = jest.fn();
    const target = document.querySelector("body");
    target!.dispatchEvent = spyDispatchEvent;
  });

  it("カスタムイベントが発行される", () => {
    triggerCustomEvent("body", "customEventName");
    expect(spyDispatchEvent.mock.calls.length).toBe(1);
    expect(spyDispatchEvent.mock.calls[0][0].type).toBe("customEventName");
  });
});
```
Macにpipenvをインストールするまでのメモ

Homebrewをインストールしたあとに・・・。

### Python3.10.11のインストール

 - pyenvでインストールします。（確定）

```shell
$ brew update
$ brew install pyenv
$ pyenv install --list
インストール可能なversionの中で最新のものを選んでください。（今回は、"3.10.11"にします）
$ pyenv install 3.10.11
```

- デフォルトで使用されるpythonのversionを確認する。(まだ`system`なので)

```shell
$ pyenv versions
* system
  3.10.11
```

- インストールした`3.10.11`を使用するように`pyenv global`コマンドで切り替えます。

```shell
$ pyenv global 3.10.11
$ pyenv versions
  system
* 3.10.11 (set by /Users/myname/.pyenv/version)
```

- versionを確認すると、Python 2.7.16になっている。(systemの古いversion)

```
$ python -V
Python 2.7.16
```

### pyenvのパスを通すためにbash_profileを編集する。

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source .bash_profile
```


- versionを確認すると、3.10.11になっている。

```
$ python -V
Python 3.10.11
```


### pipのインストール（Python3と一緒に入っているので確認するだけ）

```
$ pip install --upgrade pip
$ pip -V
pip 23.1.2 from /Users/choco/.pyenv/versions/3.10.11/lib/python3.10/site-packages/pip (python 3.10)
```


### Pipenvのインストール

 - （`pip install pipenv`をしないままだと、古い（system）に内包されたpipenvが使用されてしまうため。）

```
$ pip install pipenv
$ pipenv --version
pipenv, version 2023.4.29
```


（＾ω＾）
【メモ】jQueryで動的なselectボックスにSelect2を適用する

#背景
[こちら](https://qiita.com/betti/items/da622a6e5af7135f3e67)の記事を参考にselect2を適用したselectボックスを複製しようとしましたが
複製元のselect2の適用が消えたり不具合が多発しました



#解決法
コピー元からselect2を削除し、削除した行をコピー
挿入後それぞれに適用

```js:app.js
    //コピーアイコン押した際の行コピー
    $('.js-copy-row').on('click', function (e) {
        let row = $(this).closest("tr");
        // select2の破棄
        row.find(".select2").select2('destroy');
        // 新規追加行
        let newRow = row.clone(true);
        newRow.insertAfter(row);
        row.find(".select2").select2();
        newRow.find(".select2").select2();
   })

```
DockerでKali Linuxインストール後初期設定

#DockerでインストールしたKali Linuxでパスワード解析

[前回の記事](https://qiita.com/rui-watanabe/items/6cbc61fbc3da4fdd22f1)でSQLインジェクションによってユーザーのパスワード情報を抜き出しました。

今回はそんなSQLインジェクションのような攻撃の**ペネトレーションテスト（検証）ができる、Kali LinuxをDockerで導入**したので簡単にまとめていきたいと思います。

#Kali Linuxとは？

Kali Linuxは**Debianをベースに構築された、ペネトレーションテスト用Linuxディストリビューション**です。

ペネトレーションテストとは、実際にWebアプリケーションの攻撃手段を用いて、脆弱性をテストするといったものです。

Kali Liuxには、このペネトレーションテストのプログラムが、300以上インストールされています。

そのため、Webアプリケーションの脆弱性を調べるために、このKali Liuxが使われるということです。

#DockerでKali Linuxをインストール・起動

ここは、以下のURLの公式を見ながら進めていきます

https://www.kali.org/news/official-kali-linux-docker-images/

まずは、Kali Linucのイメージをプルします。

```
# docker pull kalilinux/kali-linux-docker
```

続いて、Kali Linuxを起動し、コンテナ内にrootで入ります。

```
# docker run -t -i kalilinux/kali-linux-docker /bin/bash
```

これで、Kali Linuxのコンテナ内にrootで入ることができます。


# Kalilinuxコンテナ内で初期設定


まず初期設定として以下のコマンドを実行します。

```
# apt-get update && apt-get install metasploit-framework　&& apt-get upgrade
```

続いて、Kali Linuxのメタパッケージ（今回はパスワード関係のkali-tools-passwords）をインストールします。

他のメタパッケージは入れたいと思ったら、以下を参照してください。
https://www.kali.org/news/kali-linux-metapackages/

```
# apt-get install kali-tools-passwords
```

このメタパッケージを入れることで、パスワード関係の攻撃をペネトレーションテストすることが可能になります。

以下のコマンドでどんなパッケージがあるか確認できるので、[公式](https://tools.kali.org/kali-metapackages)などをみながら実際にペネトレーションテストを試してみることも可能です。

```
# apt-cache show kali-linux-pwtools | grep Depend
kali-tools-gpu,cewl,chntpw,cisco-auditingtool,cmospwd,crackle,creddump,crunch,
fcrackzip,findmyhash,freerdp2-x11,gpp-decrypt,hash-identifier,hashcat,
hashcat-utils,hashid,hydra,hydragtk,john,johnny,keimpx,maskprocessor,medusa,
mimikatz,ncrack,oclhashcat,onesixtyoneophcrack,ophcrack-cli,pack,
passing-the-hash,patator,pdfcrack,pipal,polenum,pyritrainbowcrack,rarcrack,
rcrackimt,rsmangler,samdump2,seclists,sipcrack,sipvicious,smbmap,sqldict,
statsprocessor,sucrack,thc-pptp-bruter,truecrack,twofi,wce,wordlists
```

以上で、Kali Linuxの初期設定は完了になります。

次回以降、このKali Linuxを使ったペネトレーションテストも実践していければと思います。


# 参考URL
https://qiita.com/y-araki-qiita/items/131efa82c4205e83fef8
https://www.markupdancing.net/archive/kali-002.html
https://tools.kali.org/kali-metapackages
https://www.kali.org/news/official-kali-linux-docker-images/
ラプラス変換公式集

<h2>シリーズ</h2>
<a href="https://qiita.com/campbel2525/items/004270f9f89818b08e12">物理・数学・プログラムのページについて</a>


<h2>概要</h2>
ラプラス変換公式集です。

<h2>公式</h2>

```math
f(t) \rightarrow F(s)
```
```math
f(t) \rightarrow \int_0^\infty f(t)e^{-st} dt
```
```math
1 \rightarrow \frac{ 1 }{ s }
```
```math
t^n \rightarrow \frac{ 1 }{ s^{n+2} }\Gamma(n+1)   (s \geq 0)
```
```math
t^a \rightarrow \frac{ 1 }{ s^{a +2} }\Gamma(a +1)   (s \geq 0 ,a \gt -1)
```
```math
e^{at} \rightarrow \frac{ s }{ s-a }    (s-a \gt 0)
```
```math
\cos a t \rightarrow \frac{ s }{ s^2 + a^2 }    (s \gt 0)
```
```math
\sin a t \rightarrow \frac{ a }{ s^2 + a^2 }    (s \gt 0)
```
```math
\cosh a t \rightarrow \frac{ s }{ s^2 - a^2 }    (s \gt |a|)
```
```math
\sinh a t \rightarrow \frac{ a }{ s^2 - a^2 }    (s \gt |a|)
```
```math
\delta (t) \rightarrow 1
```
```math
u (t) \rightarrow \frac{ 1 }{ s }
```
```math
u (t-a) \rightarrow \frac{ 1 }{ s } e^{-as}  (a\geq 0)
```
```math
f(t-a)u(t-a) \rightarrow e^{-as}F(s)  (a\geq 0)
```
```math
e^{-at}f(t) \rightarrow F(s-a)
```
```math
周期Tの周期関数f(t) \rightarrow \frac{ 1 }{ 1- e^{-st}}F_0(s)
```
```math
space{60pt}\rightarrow \frac{ 1 }{ 1- e^{-st}} \int_0^T f(t)e^{-st} dt
```
```math
erf(\sqrt{at}) \rightarrow \frac{ \sqrt{a} }{ s\sqrt{s+a} }
```
```math
J_0(at) \rightarrow \frac{ 1 }{ \sqrt{s^2+a^2} }
```
```math
f'(t) \rightarrow sF(s)-f(0)
```
```math
f''(t) \rightarrow s^2F(s)-sf(0)-f'(0)
```
```math
\int_0^t f(u) du \rightarrow \frac{ 1 }{ s }F(s)
```
```math
t^nf(t) \rightarrow (-1)^nF(s)^{(n)}
```
```math
\frac{ f(t) }{ t^n } \rightarrow \int_s^\infty ...\int_s^\infty F(s)(ds)^n
```
指定件数のレコードを削除する

# やりたいこと
テーブルに格納されたレコードのうち、指定した件数のレコードを削除したい。

# MySQLの場合
LIMIT句を使います。

```sql
-- itemsテーブルから10件のレコードを削除する
DELETE FROM items LIMIT 10;
```

# PostgreSQLの場合
PostgreSQLではDELETE文でLIMIT句が使えないので、サブクエリを使います。

```sql
-- itemsテーブルから10件のレコードを削除する
-- "id" はテーブル内で一意の値を持つ任意のカラム名
DELETE FROM items WHERE id IN (SELECT id FROM items LIMIT 10);
```

# 備考
SQLはORDER BY句で順序を指定しない限り、表示順は担保されません。上記のクエリも、削除順を指定するにはORDER BY句で指定する必要があります。

# 参考
* [PostgreSQL: Re: using limit with delete](https://www.postgresql.org/message-id/4255CFD4.6030807%40interspire.com)
* [MySQL :: MySQL 8.0 Reference Manual :: 13.2.2 DELETE Statement](https://dev.mysql.com/doc/refman/8.0/en/delete.html)
* [DELETE - PostgreSQL 11.5文書](https://www.postgresql.jp/document/11/html/sql-delete.html)
np.whereでドツボにハマった話

## はじめに
画像処理の中で```np.where```のインデックス取り出しにおける出力が全くできなかったので
[ここ](https://note.nkmk.me/python-numpy-where/)のサンプルコードを参考にしながら理解しました・・・
なので備忘録です！
これ読み方わかったらアハ体験できるのでは！？？

## np.whereの出力！！？
[参考にしたサンプルコード](https://note.nkmk.me/python-numpy-where/)と出力です．
今回は3階テンソル($Width \times Height \times Channels = 2 \times 3 \times 4 $)
となっています．

```python
a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# output
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(np.where(a_3d < 5))
# output
# (array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 1]), array([0, 1, 2, 3, 0]))
```

ここで```np.where(a_3d < 5)```の出力を
$Width$：```array([0, 0, 0, 0, 0]) ```
$Height$：```array([0, 0, 0, 0, 1])```
$Channels$：```array([0, 1, 2, 3, 0])```
のリストだとみて
$Width$：```W```
$Height$：```H```
$Channels$：```C```
とおくと3階テンソルの要素にアクセスするためには

```python 
a_3d[W[0]][H[0]][C[0]] = 0 
a_3d[W[1]][H[1]][C[1]] = 1 
a_3d[W[2]][H[2]][C[2]] = 2 
a_3d[W[3]][H[3]][C[3]] = 3 
a_3d[W[4]][H[4]][C[4]] = 4 
```
となります．
これでやっと```np.where(a_3d < 5)```の出力が読めた！

## さいごに
最初は配列が返ってくるだけだったのでなんだこれ？っと思ってましたが
行，列，奥行きの形が見えてくると意味のある数値に変わりますね〜
アハ体験いいですよね〜
Pythonメモ(文法)

#はじめに
Pythonの環境構築などは他の記事を参照してください。
何回かに分けてPythonの基本文法を記述します。
この記事で扱うコードは分量が少ないのでインテラクティブシェルで実行します。
全てのコードはターミナルで動作確認を行っています。
この記事を読めばとりあえず関数を使えるようになるとは思います。


##この記事で出てくる関数
print()関数
input()関数
int()関数
str()関数
float()関数
len()関数
##コード

###print()関数
まずはいちばん最初に書くであろうprint関数
注意点は文字列型を表示するとき`'  '(引用符)`で表示したいものを挟むことでしょうか？

~~~python:example1.py
print('Hello World!')
~~~

~~~python:result
Hello World!
~~~

`\n(バックスペースn)`を添えて改行もできます。


~~~python:example2.py
print('Hello\nWorld! ')
~~~

~~~python:result
Hello
World!
~~~

###input()関数,int()関数,str()関数,float()関数
input()関数は好きな文字をキーボードで入力できる関数です。
今回は`favorite_food`という変数にinput()関数で`ニラ`と入力してみる。

~~~python:example3.py
favorite_food = input()     #input()関数にニラと入力する。
print(favorite_food)
~~~
結果は以下のようになります。
ニラは文字列型なので`'  ' `で挟まれてますね。

~~~python:result
'ニラ'
~~~


私はこういう風に何度か使ったことがあります。

~~~python:example4.py
favorite_food = input()     #input()関数にニラと入力する。
print('私の好きな食べ物は' + favorite_food + 'です。')
~~~

~~~python:result
私の好きな食べ物はニラです。
~~~

文字列型の数字を整数、浮動小数点数で表示したいときはどうすれば？
以下のようなコードを書けば簡単にできますね。
今回は`favorite_number`という変数を使ってみる。

~~~python:example5.py
favorite_number = input()     #input()関数に7と入力する。
print(int(favorite_number))   #int()関数で文字列型の7を整数型に変換する。
print(float(favorite_number))   #float()関数で文字列型の7を浮動小数点数型に変換する。
~~~

ちゃんと文字列型から整数型と浮動小数点数型に変換されています。

~~~python:result
7
7.0
~~~

##len()関数
この関数は文字数を整数値で返してくれます。
いちいち長い文章を打ち込むのは面倒臭いので適当に変数を作って代入しlen()関数に渡します。

~~~python:example6.py
sentence = 'ニラ炒めって美味しいよね。'
len(sentence)
~~~
ちゃんと文字数を整数で返してくれてますね。

~~~python:result
13
~~~

##最後に
今回はPythonの勉強を始めて最初の最初に学ぶ関数について書きました。
ちょっと使っただけなので面白みがないですね。
次の記事では条件分岐、ループなどについて書くつもりです。
そこでも今回使った関数が出てくると思うのでもしかしたら理解が深まるかも？
是非暇な時にでも見にきてください。
おかしなところがあればコメントよろしくお願いします。