OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでOnCollisionEnterが呼ばれない時に確認すること

## UnityでOnCollisionEnterが呼ばれない時に確認すること

Colliderを設定しているのにOnCollisionEnterが呼ばれない...と困ったことはありませんか？
衝突するオブジェクト**両方**がColliderとRigidbodyを持っている必要があります。

片方がColliderだけだったりすると呼ばれないので注意してください。

参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Leetcode #44: Wildcard Matching

```swift
func isMatch(_ s: String, _ p: String) -> Bool {
    var s = Array(s)
    var p = Array(p)
    var dp = Array(repeating: Array(repeating: false, count: p.count+1), count: s.count+1)
    dp[0][0] = true
    for i in 1...p.count {
        if p[i-1] == "*" {
            dp[0][i] = dp[0][i-1]
        }
    }
    for i in stride(from: 1, through: s.count, by: 1) {
        for j in stride(from: 1, through: p.count, by: 1) {
            if s[i-1] == p[j-1] || p[j-1] == "?" {
                dp[i][j] = dp[i-1][j-1]
            } else if p[j-1] == "*" {
                dp[i][j] = dp[i][j-1] || dp[i-1][j]
            }
        }
    }
    return dp[s.count][p.count]
}
```
Gitの三段階のファイル状態には各々どんなファイル群があるのか？SourceTreeで作業ディレクトリからGitディレクトリに移動させるまで

gitはローカルにあるファイルを下記の作業ディレクトリ、ステージングエリア、Gitディレクトリの３つの段階に分けて管理します。
今回はそれぞれの段階にどういったファイル群があるか紹介し、SourceTreeで作業ディレクトリからGitディレクトリに移動させるまでの流れを図と共に説明します。
ただし、プログラミング初心者であるため、内容に誤りがあるかもしれません。
そのため、もし、誤りがあれば修正するのでどんどん指摘してください。

###　作業ディレクトリ
  
  　変更を加えた作業中のファイル群があります。ターミナルでgit statusというコマンドを打つと作業ディレクトリにあるファイルの状態を確認できます。SourceTreeでは、「コミットされていない変更があります」を選択すると、作業ディレクトリに当たる「作業ツリーのファイル」内に作業中のファイル群があります。下の図の「作業ツリーのファイル」内にはカリキュラムという文字を追加したファイルがあります。

<img width="1280" alt="sagyou.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380428/a575aa0d-0a81-fdc1-bb05-85f01b424118.png">

###　ステージングエリア
  
  次のcommitに含めるファイル群があります。git addというコマンドで作業ディレクトリからステージングエリアにファイルを移動させることができます。SourceTreeでは、「作業ツリーのファイル」内のファイルをステージングエリアに当たる「Indexにステージしたファイル」内にドラック＆ドロップすることで移動させることができます。先程変更を加えていたファイルを実際に移動させると、下の図のようになります。

<img width="1280" alt="sagyou2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380428/d163b1a6-ec08-00f5-c89b-130f5974b0a0.png">




### 　Gitディレクトリ
  
  変更が確定したファイル群があります。git commitというコマンドでステージングエリアからGitディレクトリにファイルを移動させ、作業内容を確定させることができます。SourceTreeでは下の図のように、左上の「コミット」アイコンを選択し、右下の「コミット」をクリックすることでGitディレクトリにファイルを移動させ、ファイルの変更を確定させることができます。

<img width="1280" alt="sagyou3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380428/134a4353-23f3-b45b-a212-dad2d9c700c7.png">
<img width="1280" alt="sagyou4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380428/b1159d6b-4cbf-750e-c3a1-7375c200561b.png">
Sympyで勾配ベクトルを計算したい！

# 1. はじめに
大学の課題でSymPyを使って数式微分を行う課題が出ました．そのとき，勾配ベクトルを求めることにつまづいたので，整理します．

# 2. SymPyによる勾配ベクトルの求め方
結論から言うと，```sympy.tensor.array.derive_by_array()```関数で求めることができます．

例として，$\boldsymbol{a}=[a_1, a_2]^{\rm{T}}$，$\boldsymbol{b}=[b_1, b_2]^{\rm{T}}$のときの$f(\boldsymbol{a})=\boldsymbol{a}^{\rm{T}}\boldsymbol{b}$の勾配ベクトルを考えます．

- 手計算

まず，$f(\boldsymbol{a})$を展開します．

```math
f(\boldsymbol{a})=
\left[
a_1\ a_2
\right]
\begin{bmatrix}
b_1 \\
b_2
\end{bmatrix}
=a_1b_1+a_2b_2
```

したがって，勾配ベクトル$\partial f(\boldsymbol{a}) / \partial \boldsymbol{a}$は以下のように求まります．

```math
\dfrac{\partial f(\boldsymbol{a})}{\partial \boldsymbol{a}}
=
\begin{bmatrix}
\dfrac{\partial f(\boldsymbol{a})}{\partial a_1} \\
\dfrac{\partial f(\boldsymbol{a})}{\partial a_2}
\end{bmatrix}
=
\begin{bmatrix}
b_1 \\
b_2
\end{bmatrix}
```

- SymPyによる計算

```python:calculate_gradient.py
import sympy as sp
sp.init_printing() # Jupyter NotebookにおいてLaTex形式で表示するおまじない

# 変数の定義
a1, a2, b1, b2 = sp.symbols("a1 a2 b1 b2")

# ベクトルa,bと関数f(a)の定義
a = sp.Matrix([[a1], [a2]])
b = sp.Matrix([[b1], [b2]])
f = a.T*b

f[0] # -> a_1*b_1+a_2*b_2

# 勾配ベクトルの計算
sp.tensor.array.derive_by_array(f[0], a)
```

実行すると以下の通り勾配ベクトルが求められました．
![スクリーンショット 2019-05-18 23.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190940/b32e0470-0efc-f07c-3be2-6c0d9b72b58e.png)

# 3. まとめ
課題ではヤコビ行列も求めたのですが，関数1つで計算してくれて「技術の進歩って素晴らしいな」と思いました．また，SymPyは積分や行列計算もできるので，すごく便利だと思いました．

## 参考リンク
- https://docs.sympy.org/1.0/_modules/sympy/tensor/array.html
Build TensorFlow v1.12.2 with CUDA 9.0 from source, on Ubuntu 16.04

### 1. Requirements
> Ubuntu16.04
> CUDA9.0
> CUDNN7

### 2. Refference
>  https://www.tensorflow.org/install/source

### 3. Install Bazel v0.18.1
> https://qiita.com/madaikiteruyo/items/4232f2b94d3ddaeb6fed

### 4. Install python libraries
```
pip install pip --upgrade
pip install pip six numpy wheel mock
pip install keras_applications==1.0.5 --no-deps
pip install keras_preprocessing==1.0.3 --no-deps
pip install h5py==2.8.0
```

### 5. Build TensorFlow v1.12.1 with CUDA 9.0
```
git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout v1.12.0
./configure
bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
./bazel-bin/tensorflow/tools/pip_package/build_pip_package ../tensorflow_pkg
chown $HOST_PERMS ./tensorflow_pkg
```

### 6. Install tensorflow 
```
pip uninstall tensorflow
pip install ../tensorflow_pkg/tensorflow-1.12.2-cp36-cp36m-linux_x86_64.whl
cd ..
pip freeze | grep tensorflow
```

### 7. Result 
```
tensorflow==1.12.2
```

---------------------------------------------------
Thank you.
last-samurai
【Swift】nilじゃないのに「unexpectedly found nil〜」が出る

Swiftをいじっている中遭遇した「fatal error: unexpectedly found nil while unwrapping an Optional value」というエラー。
かなりの頻度で出くわすらしいので対処法を記載

## どう見てもnilじゃないのにnilで落ちる？

筆者が30分近くハマった出来事。

<img width="421" alt="ViewController_swift.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416433/4aaf989a-0062-7ea7-0408-a79dc5a57972.jpeg">

てっきり｢labelがnilなのかな？？」と思って調べてみるが、labelには明らかにnilでない値が入っている。

### なんでや！

## nilなのは値じゃなくて変数だった

nilなのは値じゃなくて変数だった｡
発見が遅れてしまった理由は、ビューコントローラーの名前を変えたりしているうちにアウトレット接続が失われてしまい、labelそのものがnilになってしまったこと。
普通はアウトレット接続してしまえばnilになるなんてことは起こらない｡

### 僕のバカ!(猛省)

<img width="149" alt="Main_storyboard_—_Edited.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416433/61bbf121-f103-5d6c-51ad-1f24112659a0.jpeg">

というか、検証した結果､入れようとする値がnilだとしても、代入する行で「unexpectedly found nil」で落ちることはなかった。
ググったら､このエラーが出るのは「nilを入れようとしたから」ではなく「nilのまま使おうとしたから」ということらしい。

#### 基礎がなってないなあ、と痛感。

## 参考
- [[Swift] Optional 型についてのまとめ Ver2](https://qiita.com/cotrpepe/items/518c4476ca957a42f5f1)
図で理解！畳み込み処理？Convolution層？畳み込みニューラルネットワーク（CNN）の基礎

#畳み込みニューラルネットワークとは？

前回の記事（https://qiita.com/NagisaOniki/items/a5ba48af2c42a5fd3439）
で軽く話しましたが、復習すると以下図です。

![Qiita-convolution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/9f30917c-3253-8d45-b65c-341210c0e6c1.png)

Convolution層を入れ込んだニューラルネットワークの事でしたよね。
この記事ではConvolution層について解説します。

#Convolution層とは？

「Convolution層ではどんな処理を行っているか？」の答えは簡単で、「畳み込み処理」をしています。
では実際に、畳み込み処理について解説します。
が、その前に前提知識をお話します。

###前提知識
CNNでよく使われるデータに画像があります。
が、画像をどうやって計算に使うの？と言う方に解説を入れておきます。

###画像はこう出来ている！
「画像のデータ？」「画像を計算する？」となりますよね。
画像はこのように構成されています。
![RGB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/9fda801a-07c2-a847-1093-4251d1617cf3.png)



↓↓↓↓↓詳しく↓↓↓↓↓

![RGB２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/b121ccd1-cb2d-0aa0-bede-87d96b0bd1e3.png)

↓↓↓↓↓詳しく↓↓↓↓↓

![RGB3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/68d16f7c-bbcc-33a8-3eb0-8e7f0e1c482d.png)


何となく、画像はどうやって、私達が見ている画像になるのか分かりましたか？
画像は”色の集まり”で、その色は”数字の集まり”なんです。

もっと専門的に言うと、
画像は”RGBそれぞれのチャネルを重ねたもの”で、
各チャネルは”ピクセルの集まり”で、
各ピクセルには”0~256の値”が入ります。

逆から言うと、
各ピクセルでどれだけ赤いのか表現
↓
そのピクセルの集合体が1枚のRのチャネルになる
↓
他G，B分の３チャネルが重なる事で色のある画像を作る。

参考までに、以下表を乗せておきます。
<img width="1216" alt="スクリーンショット 2019-05-18 21.22.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/24fe75d9-e434-5d8b-2e94-db055db70219.png">

これで、画像が数字で表せられることから、
なんだかネットワーク層の入力に出来そうですね。

#畳み込み処理
![畳み込み演算.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/27d742e8-7a5b-6b73-fef8-12348b1487f0.png)

![畳み込み処理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/7adb6260-2e90-3bbe-d028-60ae95b4218b.png)

（＊：畳み込み）

この図を「V＊K＝Z」と数式化することにします。
V：入力
K：カーネル
Z：出力
となります。
この図は、「3x3x1（縦のサイズx横のサイズxチャネル数）の入力を、2x2x1のカーネルで畳み込む処理」です。

簡単ですよね。

チャネルが増えればこうなります。
![畳み込みカーネル複数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/6240a119-2db4-dbb4-75a9-73a95eaadf18.png)

それぞれ同じように畳み込み処理をするだけです。

なんだか、
「3x3x3（縦x横xRGB分のチャネル数）の画像にカーネルを掛け合わせて出力を得ている」ように見えますね？
その通りです。
画像を入力とした時、Convolution層ではこのような畳み込み処理が行われるのです。

#まとめ：Convolution層とは？
畳み込み処理をしているだけでしたね。
次回は実際に”畳み込みニューラルネットワーク”を実装する解説をしようと思います。
Install Bazel v0.18.1, for building tensorflow v1.12.1  from source.

### 1. Requirements
> Ubuntu16.04

### 2. Refference
> https://docs.bazel.build/versions/master/install-ubuntu.html
> https://docs.bazel.build/versions/master/tutorial/cpp.html

### 3. Install Bazel v0.18.1
```
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python
wget https://github.com/bazelbuild/bazel/releases/download/0.18.1/ bazel-0.18.1-installer-linux-x86_64.sh
chmod +x bazel-0.18.1-installer-linux-x86_64.sh
./bazel-0.18.1-installer-linux-x86_64.sh --user
sed -i -e '$ a export PATH="$PATH:$HOME/bin"' .bash_profile
source .bash_profile
```
### 4. Build c++ sample code by using Bazel
```
git clone https://github.com/bazelbuild/examples/
cd examples/cpp-tutorial/stage1
bazel build //main:hello-world
./bazel-bin/main/hello-world
```

### 5. Result
```
Hello world
Sat May 18 13:53:53 2019
```


---------------------------------------------------
Thank you.
last-samurai
Unityで親を設定する方法

とりあえずメモとして

        GameObject ContentItem = GameObject.Find("ContentItem");
        GameObject Prefab_PanelItemSub = (GameObject)Resources.Load("PanelItemSub");
        GameObject obj;

        obj=Instantiate(Prefab_PanelItemSub, new Vector3(0.0f, 0.0f, 0.0f), Quaternion.identity);
        obj.transform.parent = ContentItem.transform;
        obj.transform.localScale = new Vector3(1, 1, 1);


スケールがおかしくなるので、自分でセットする必要あり。
DjangoCongress JP 2019 発表資料まとめ(仮)

# 謝辞
発表者の方々、カンファレンスを運営されていた方々、本当にありがとうございました。
またサイボウズ様、素晴らしい会場をありがとうございました。

# DjangoCongressJP2019公式ページ
公式ページでスライドと動画をまとめてアップされたようなので、今後はこちらを確認してください。(一応まとめておきますが)
[Django congress JP 2019](https://djangocongress.jp/)

## 発表資料
Djangoで静的ファイルとうまくやる話
- tell-kさん([@tell_k](https://twitter.com/tell_k))
- [資料](https://tell-k.github.io/djangocongressjp2019)

Make Query Great Again!
- Nakajima Yuukiさん
- [資料](https://www.slideshare.net/dattun/django-congress-jp-2019-make-query-great-again-slide-share)

現場で使える Django のセキュリティ対策
- akiyokoさん([@aki_yok](https://twitter.com/aki_yok))
- [資料](https://speakerdeck.com/akiyoko/django-security-measures-for-business-djangocon-jp-2019)
  
How to build and deploy a flexible React/Django hybrid application
- 沼倉健介さん、Patrick Sneepさん([Awakens Inc.](https://www.awakens.co/))
- [資料](https://slides.com/awakens-dev/django-jp-2019)

DjangoではじめるGraphQLとフロントエンド開発の協業
- nasumさん([@tomato360](https://twitter.com/tomato360))
- [資料](https://speakerdeck.com/nasum/djangodehazimerugraphqltohurontoendokai-fa-falsexie-ye)
  
Djangoでのメール送信 - 設定からテストまで
- thinkAmiさん([@thinkAmi](https://twitter.com/thinkAmi))
- [資料](https://speakerdeck.com/thinkami/djangocongress-jp-2019-talk)

Djangoアプリのデプロイに関するプラクティス
- Masashi Shibataさん([@c_bata_](https://twitter.com/c_bata_))
- [資料](https://www.slideshare.net/c-bata/django-deploy-django-application)

Django Girls Blogのネクストステップ 〜実務レベルへ橋渡し〜
- nikkieさん([@nikkie](https://twitter.com/ftnext))
- [資料](https://gitpitch.com/ftnext/2019_slides/master?p=django_congress_2019_blog_next_step#/)

自社サービスのDjango1.3サーバを1.11(LTS)にアップグレードするまでの道のり
- Toshikazu Ohashiさん([@LightTiger2505](https://twitter.com/LightTiger2505))
- [資料](https://speakerdeck.com/lighttiger2505/zi-she-sabisufalsedjangowo-1-dot-3kara1-dot-11-lts-ni-atupuguredosurumadefalsedao-falseri)

Authorization in Django
- Hiroki Kiyoharaさん([@hirokiky](https://twitter.com/hirokiky))
- [資料](https://gitpitch.com/hirokiky/gitpitch?p=2019djangocongres#/)
  
DjangoによるWebエンジニア育成への道
- 中澤 祐一さん([@y_nakazawa1220](https://twitter.com/y_nakazawa1220))
- [資料](https://speakerdeck.com/y_nakazawa/djangoniyoruwebenziniayu-cheng-hefalsedao)

どうなってるの？Djangoのトランザクション
- denzowさん([@denzowill](https://twitter.com/denzowill))
- [資料](https://speakerdeck.com/denzow/dounatuterufalse-djangofalsetoranzakusiyon)


##LT発表資料

明日から使うな！Django QuerySetアレバターン
- Hayao Suzuki([@CardinalXaro](https://twitter.com/CardinalXaro))
- [資料](https://speakerdeck.com/hayaosuzuki/django-queryset-are-patterns)

## etc...
削除依頼、間違えがありましたらお申し付けください。
運営の方がまとめられるようなら削除します。
webとネットワーク技術

### クライアント/サーバーシステム
コンピュータが互いに接続して情報をやりとりする**コンピュータネットワーク**の仕組みの中で、コンピュータに役割を持たせて分散処理を目的とした仕組みのことを**クライアント/サーバーシステム**という。
サーバー・・・情報やサービスを提供するコンピュータ　
クライアント・・・サーバーに対して情報やサービスを要求する(リクエスト)コンピュータ

### プロトコルとは
プロトコルはネットワークに接続された機器がお互い通信するときに使う、共通のルールや手順のこと。このプロトコルが同じだから、コンピュータ同士で情報の伝達を行うことができます。

### TCP/IP
インターネット場でさまざまなサービスを実現するためのプロトコルの集まりのことです。インターネットの普及に伴い、標準のプロトコルが必要になった結果、現在インターネットに繋がるコンピュータはこのTCP/IPを利用したものになっています。
このTCP/IPは役割毎で4つの階層(レイヤー)に分割され、レイヤー毎でプロトコルが決まっています。これらが連携することでコンピュータは互いにインターネット間で通信することができます。

・アプリケーション層(レイヤー4)
アプリケーションで使うデータを取り扱う層
プロトコル例・・・HTTP, SMTP, FTP等
・トランスポート層(レイヤー3)
ポート番号(コンピュータが提供するサービスを指定)を元にアプリケーション層へデータを渡す層
プロトコル例・・・TCP, UDP
・インターネット層(レイヤー2)
IPアドレスをもとにデータを宛先まで届ける層
プロトコル例・・・IP, ICMP等
・ネットワークインターフェース層(レイヤー1)
MACアドレス(一意な識別番号)をもとにデータを宛先まで届ける層
プロトコル例・・・イーサネット, Wi-Fi等
Oracle Java Bronzeを受けた

#Oracle Java Bronzeを受けた

##はじめに
Javaを専門学校で触って3年半
研修期間に資格勉強時間あり
(要するに8時間勉強できる)
新卒同期(以下同期)はIT初心者

Bronze合格後1週間でSilver合格

##結果
10余人全員合格


##参考書など
- [オラクル認定資格教科書 Javaプログラマ Bronze SE 7/8](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Bronze-SE-%E5%B1%B1%E6%9C%AC/dp/4798142719)

- [クラムメディア](https://www.crammedia.com/)

##勉強方法

いわゆる紫本を2周しました。
僕は経験があったので、1-6章を重点的に。
それで合格点6割は硬かったので、そういった方法もあるよとだけ。

同期は7-8章でコケてる人が多かったイメージ。
ただ、ここから結構問題が出てきたので、徹底的に潰しておかないと厳しいと思う。

紫本の最初の「試験前に覚えよう」といった目録だけ覚えたらできた人もいた。
<br>
クラムメディアに関しては、正直やらなくても良かったかな。
解答がちょくちょく間違ってるから、下手すればその確認せずに誤って覚えたり、違和感を感じてもその確認のために時間を食われたりする。

僕の場合、同期同士で確認し会えたから良かったけど、もし一人で利用するとなった場合は要注意。
<br>
白黒本は評価は聞いてたけど全く触らなかった。
クラムメディアじゃなくて、黒本でも良かったかもしれない。


##勉強時間
8時間*1-2日
もともとJava触ってたのでそんなもんかと

初めてJavaを触る同期は
大体8時間*5日くらい
もしかしたら裏で勉強してたかもしれないが


##勉強注意点
継承のところで、is-a関係の理解が大事。
**きつねうどん is a うどん**
<br>
紫本の問題を解いて、ただひたすらにどこでコケさせようとしてくるかの把握も大事だと思う。 ~~というか、そこだけに時間を食われた。~~


##試験注意点
多分Bronzeを受ける人は、今までOracle資格試験受けたことがない人が多いのかなと思うので、試験に際しては注意事項をきちんと熟読するべき。

 - 画面右上「マーク」チェックボックスで問題をブックマークできる
 - 画面右下「次へ」
 - 画面右下「次へ」の隣に「戻る」がある
 - 画面右下「戻る」の隣に「レビュー」がある。
 - 解答を右クリックで、選択肢からはずすことができる。
 - 「レビュー」画面右下「次へ」の位置に「テスト終了」

問題をブックマークしておくと、レビューから再確認することができる。
未回答問題も、レビューより確認することができる。
上でも言ってるが、レビュー画面右下はテスト終了なので要注意。
また、下手に画面をクリックしていると選択肢が変わったりするので、試験中のカチカチは厳禁。

##申し込み
[社会人1年目がJavaBronze受験の仕方をまとめてみた](https://qiita.com/oyakata/items/8368def3ce778b37fdd0)
僕の見たときの最終更新は2017/06/01だけど、この動きのまま出来た。

楽天のバウチャーは今後オラクル受けるにあたって他にもいろいろと使えるので、サイト自体をブクマしておくといいかも。
再受験無料キャンペーンを定期的にしているらしい。

##まとめ
上でもちょろちょろ書いてるが。。。

 - 重箱の隅をつついてくる
 - 再受験無料キャンペーンはもしかしたら大事(一発がベスト)
 - オブジェクト思考の問題がよく問われた
 - **初心者でも一週間(40時間)で受かる**

##おわり
そのままSilver勉強する->合格が容易かった
それはまた別の機会に
Slackで今日の自分の発言を検索

Slackで複数人のやり取りをしていると
誰に何を発言したか一度既読つけると星マークつけるくらいしか検索するのが難しい。

そこでslackの検索用の単語を利用して「今日の自分の発言」を検索します。
検索画面で以下のものを入力して検索する。

```
from:me on:today
```
これで今日自分が発言したもの全て表示されるはずです。
AnacondaとVirtualenvでサクッとtoxを動かす

# はじめに
toxを使ってサクッと複数バージョンのPythonでテストを回します。
Anacondaとvirtualenvを使ってサクッとtoxが動く環境を作ります。

そしてたぶん、この手順がもっとも簡単にWindowsでtoxを使う方法かと思います。

# 手順

## Anacondaをインストールする

手順は省略。

https://www.anaconda.com/distribution/

Python3.7をインストール

## Anacondaをrootにvirtualenvをインストールする

Anacondaをインストールしたら `conda` コマンドが使えるのでAnacondaをroot環境にvirtualenvを入れます。

ポイントとしては `conda` コマンドでインストールすることです。
どうやら `pip` ではうまくいきません。

```bash

$ conda install virtualenv
```

## toxをインストール

toxをインストールします。

```bash
(py37)$ pip install tox
```

## tox.iniを書く

toxの定義は `tox.ini` というファイルで記載します。

とりあえずこんな感じで作ってみます。

```ini:tox.ini

[tox]
envlist =
    py{36,37}
skip_missing_interpreters = true

[testenv]
description = Unit Test and Integration Test with coverages
passenv = LANG
deps =
    pytest
    pytest-cov
    pytest-pythonpath
    flake8
    pep8
    pyflakes
    pytest-flake8
    pytest-pep8
    coverage
    black
commands =
    python setup.py install
    coverage run --source=hogehoge -m pytest --junit-xml=test_results.xml
    coverage report -m
    coverage html
    coverage xml
    black hogehoge setup.py --check
```

1. `envlist` にテストしたいPythonのバージョンを記載します。ここでは、3.7と3.6をテストする環境として定義してます。動きとしては
2. `skip_missing_interpreters` を有効にしておけば、指定したインタープリターに該当バージョンの仮想環境がない場合にもテストケースをスキップするだけでエラーとして扱わなくなります。CIとかに乗っけると手元の仮想環境と異なることが間々あるので結構便利だったりします。
3. `[testenv]` の `deps` でテストランナーが必要とするライブラリをインストールします。今回は `pytest` をテストランナー、カバレッジレポートは`coverage` で、コードのフォーマットチェックは `black` で行ってます。
4. `commands` にテストのコマンドを記載すれば上から順番に実行します。 DBの用意など事前準備が必要だったり、後処理が必要な場合はそれぞれ `commands_pre` `commands_post` コマンドが用意されてますが、今回は使いません。
5. tox.iniの詳しい解説は[公式ドキュメント](https://tox.readthedocs.io/en/latest/config.html)を見てください。

ちなみにpytest自体の設定は `setup.cfg` に記載してます。 `pep8` や`flake8` の設定もここでしてます。


```ini:setup.cfg
[tool:pytest]
addopts = -v -ra --pep8 --showlocals
log_cli = false
log_level = INFO
log_file_level = INFO
timeout = 5
python_paths = ./hogehoge ./hogehoge/utils
pep8ignore =
    E501
    tests/*.py ALL

[flake8]
max-line-length = 120
doctests = True
exclude =
    .git
    .eggs
    __pycache__
    tests/*.py
    docs/
    build/
    dist/
```

## toxで回すPythonのバージョンをあらかじめ用意する

このままでもtoxはうごきますが、Windowsでtoxを動かしたインタープリターのPythonバージョン以外の仮想環境が用意できず下記のようなエラーを吐いてしまいます。

```bash
GLOB sdist-make: /tmp/pyac/setup.py
py36 create: /tmp/pyac/.tox/py36
ERROR: InterpreterNotFound: python3.6
__________________________ summary ___________________________
ERROR:   py36: InterpreterNotFound: python3.6
```

どうやら `py36` が Python3.6を使って仮想環境を作れってことがWindowsさんはわからないらしい。。。

下記のように `tox` が発見するパスに仮想環境を作る必要があるらしいです。

```bash
$ conda create -p C:\Python36 python=3.6
```

ほかにも、たとえばPython2.7の場合は

```
$ conda create -p C:\Python27 python=2.7
```

といった具合です。

## toxする

toxするときは 

```
$ tox
```

でOK。

ためしにtoxしたい人はtox.iniを書いた私のごみソースをcloneして手元で動かしてみましょう。

[ebook-homebrew](https://github.com/tubone24/ebook_homebrew)




# 参考

[Willem's Fizzy Logic—How to setup tox on Windows with Anaconda](https://fizzylogic.nl/2017/11/01/how-to-setup-tox-on-windows-with-anaconda/#step3setupthetestenvironmentsfortox)

[tox公式Doc](https://tox.readthedocs.io/en/latest/index.html)
backgroundの関数を普通に実行させるための小細工

##前書
普通にbackgroundに関数を追加して普通にContentScriptから呼びたい

##background側
- オブジェクトに関数をまとめる
- オブジェクト内の関数名を配列にして渡す
- オブジェクト内の関数を実行する

```JavaScript
"use strict"

//エクスポートする関数
const ExportFuncs = {	
	TestFunc : (a, b, c) =>{
		return a + b + c;
	},
	TestFuncAsync : (a, b, c) =>{
		return new Promise((resolve)=>{
			setTimeout(()=>{
				resolve(a * b * c);
			}, 2000);
		});
	},
}

//イベントリスナー
chrome.runtime.onMessage.addListener(function( message, sender, sendResponse ) {
	if( message.to === "background" ){
		//new Promiseはreturn trueを先に返すための小細工
		new Promise(async (resolve)=>{
			if( message.msgType === "getFuncNames" ){
				//ExportFuncs内の関数名を配列にしてレスポンスとして返す
				sendResponse(
					Object.keys(ExportFuncs).filter((key)=>{
						//一応関数でフィルター
						return typeof(ExportFuncs[key])==="function";
					})
				);
				
			}else if( message.msgType === "execFunc" ){
				//ExportFuncs内の関数を実行して結果をレスポンスとして返す
				sendResponse(await ExportFuncs[message.funcName](...(message.args||[])))
			}
			resolve();
		});
		//タイムアウト防止
		return true; 
	}
});
```

##Content Script側
- ExportFuncs内の関数名の配列から、実行させるためのメッセージを送る関数をまとめたオブジェクトを作成する
- ↑から関数を実行する

```JavaScript
"use strict";
(async ()=>{
	//初期化処理
	const backgroundFuncs = await (new Promise((resolve)=>{ 
		//関数名の配列を取得
		chrome.runtime.sendMessage({ 
			to:"background",
			msgType:"getFuncNames", 
		},(response)=>{
			//配列をオブジェクトにまとめる
			resolve(response.reduce((funcs, key)=>{
				//ExportFuncs内の関数を実行させるためのメッセージを送る関数
				funcs[key] = (...args)=>{
					//awaitできるように、Promiseでラップする
					return new Promise((resolve)=>{ 
						chrome.runtime.sendMessage({ 
							to:"background",
							msgType:"execFunc", 
							funcName: key, 
							args:args,
						},(response)=>{
							resolve(response);
						});
					});
				};
				return funcs;
			},{}));
		});
	}));



	//呼ぶ処理
	console.log(await backgroundFuncs.TestFunc(2, 3, 5)); // 10
	console.log(await backgroundFuncs.TestFuncAsync(2, 3, 5)); // 30
})();
```


##課題
- Content Script側をもっとコンパクトにしたいが、background側で関数作って文字列にして送ってevalで戻すくらいしか思いつかないし、そこまでやってもそんなにコンパクトにならない気がする
- chromeではtop-levelのawaitができた気がするがうまくいかない。何故だろう

##後書
- 関数自体の定義と実行に手を加えずにすんだのは満足
MPAndroidでグラフのデータ値を整数表記にする

# はじめに
「MPAndroidChartでシンプルな棒グラフの作成」[^1]の記事を参考にMPAndroidChartでグラフを作っていた時に、グラフの値の整数表記で使っていたメソッドがDeprecatedになっていました。
なので、上記の記事の整数表記にしている箇所を修正します。

実行環境

|項目名|Version |
|:---|:---|
|Android Studio|3.4|
|Kotlin|1.3.31|
|MPAndroidChart|3.1.0|


# 実装内容

IAxisValueFormatterがDeprecatedになっているので、ValueFormatterを使います。
まず、ValueFormatterクラスを継承したクラスを作成してgetFormattedValueをoverrideして整数の文字列を返すようにします。

```kotlin:IntegerValueFormatter.kt
class IntegerValueFormatter : ValueFormatter() {
    override fun getFormattedValue(value: Float): String {
        return value.toInt().toString()
    }
}
```
次に、上記で作成したクラス(IntegerValueFormatter)をBarchart型の変数のvalueFormatterに適応します。

```kotlin
        //Y軸(左)
        val left = chart.axisLeft
        left.axisMinimum = 0f
        left.axisMaximum = 500f
        left.labelCount = Hour
        left.setDrawTopYLabelEntry(true)
        //整数表記の記載
        left.valueFormatter = IntegerValueFormatter()
```

上記の修正を行うと以下のようなグラフが描画できました。
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294863/c34b69bb-318a-de27-8a9b-73bf5cc09881.png)


[^1]: MPAndroidChartでシンプルな棒グラフの作成 https://qiita.com/iKimishima/items/7fd192a074739cf5290b

参考URL
「How to format values inside MPAndroidChart?」
https://stackoverflow.com/questions/26883298/how-to-format-values-inside-mpandroidchart
応用数学：「 第 3 章： 情報理論」

ある事象が発生する確率の逆数の対数をとったものを自己情報量と呼ぶ。確率が大きくなれば自己情報量は少なくなる。対数の底が2の時は単位はbitとなり、コンピューター中で扱われるデータの単位となる。一方底がネイピアの場合は単位はnatとなる。
その自己情報量の期待値はシャノンエントロピーと呼ばれ、確率と自己情報量の積の和で計算できる。エントロピーとは熱力学や統計力学の分野で『乱雑さ』を表す物理量と言見ずけられているが、情報理論においても「わからなさ」あるいは「不確実性」と表す尺度（新たに何かわかったときの平均情報量）として使用される。また二つの同じ事象・確率変数（P、Q）における異なる確率分布の違いを表すカルバック・ライブラーダイバージェンスという尺度や、Qの自己情報量で、Pの分布の期待値を計算した交差エントロピーと呼ばれるものがある。
応用数学：「 第 2 章： 確率・統計 」

確率には、頻度確率（客観確率）及びベイス確率（主観確率）という二つの考えがある。
頻度確率とは単にクジで当たりがでるといった単に発生する頻度を表し、ベイズ確率とはある事象が発生するという予想の信念の度合いを表す。
確率計算の中でよく使われる式を以下にまとめる。
ある条件下（X）で発生する事象（Y）確率:
P(Y|X) = P(X∩Y)/P(A)
互いの発生に因果関係がなく独立な事象XとYが同時に発生する確率:
P(X∩Y) = P(X)*P(X)
ベイズ則：
P(X|Y)*P(Y) = P(Y|X)*P(X)
また確率変数と確率分布という考えがあり、事象を数値で表現したものを確立変数、事象が発生する確率の分布を確立分布と呼ぶ。確率変数の平均を期待値と呼び、離散型なら確率と確率変数の積の和、連続型なら確率と確率変数の積を区間で積分した値となる。また各確率変数の値が期待値からのずれの2乗の平均を分散と呼び、二つの確率変数のそれぞれの期待値からのずれを平均したものを共分散と呼ぶ。
確率分布には、ベルヌーイ分布、マルチヌーイ分布、二項分布、ガウス分布と呼ばれる、様々な事象の発生する確率を数式で表現したものがある。（例：ベルヌーイ分布とははコイントス等の二つの事象だけが発生する場合の片方が発生する確率の分布）
draw.ioがモックアップとか作成するのに便利だった件

※draw.ioのこの機能が便利だな，とか簡単なことしか紹介しません。
　詳しい説明は，他のサイトを参考にしてください。
　
　例えば，下記のようなサイトがあります。
　[draw.ioの使い方を解説〜無料の高機能作図ツールを使って資料の質をあげよう！〜](https://ferret-plus.com/8408)

## draw.ioとは
モックアップやフローチャートなどを簡単に作成できる作図ツールです。 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414375/573e78a8-d810-a0bc-1cca-f78c108aaafe.png">

特徴は，下記のようなものが挙げられます。

- Web上での使用なので，オフラインでは使用できない（<font color="red">※</font>）。
- 作成したものは，xml形式で保存する(xmlファイルをダウンロードする)。また，作成したものをhtml形式などでエクスポートもできる。
- どれだけ使用しても無料である。
- フローチャートなどの雛形が複数用意されている。
- 学習コストは低い。

draw.ioは下記のリンクから，使用できます。
https://www.draw.io/
<font color="red">
※記事投稿時は知らなかったのですが，draw.ioのデスクトップ版もあるようです。
これなら，一度ダウンロードしてしまえば，オフラインでも使用できますね。</font>
[draw.io デスクトップ版　ダウンロードページ](https://about.draw.io/integrations/#integrations_offline)

## 個人的に良いと思った点
### 雛形が複数用意されている
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414375/a1bf132c-5b61-c658-0f16-61f8639e9ad9.png">
赤い枠に複数の雛形がまとめられています。[＋その他の図形]ボタンから，AWSで使用されているようなアイコンも使用できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414375/aa21e81b-e602-b601-44d0-e3af988fda93.png">

### リンク編集機能がある
ボタンをクリックすると別のぺージに遷移する様子をこれで表現できます。
モックアップで，どのボタンをクリックするとどのぺージに遷移するのかを伝える際に，
この機能が役に立ちます。

#### 簡単な使い方の説明
1. まず，先ほど表示していたシートの名前を「トップページ」にし，それとは別に「ログイン画面」シートを作成しました。ちなみに，下記の画像で表示されているログイン画面は，用意されている雛形です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414375/844bb5bc-3719-621b-4ee4-1ff7cb308554.png">

2. 次にトップページから，リンクをクリックしたらログイン画面に遷移するようにします。任意のコンポーネントを右クリックして，「リンクを編集…」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414375/166bff73-af1c-d879-349b-259c90904c9f.png">

3. ここで，遷移してほしい画面を指定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414375/bf284cee-6496-1253-b235-ec1648b51056.png">

4. draw.io上でも画面遷移を確認できるのですが，私は一度，html形式でエクスポートして，画面の遷移を確認します(他の人に見せるとなった場合は，htmlファイルにしたほうがいいと思っています)。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414375/302d2335-58ab-90bf-ab61-90401368c4d0.png">

5. htmlファイルを開き，該当リンクをマウスオーバーすると，青色枠が表示されます。
これをクリックするとログイン画面に遷移します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414375/9852f38c-4456-e9ee-43fc-656fa0a5d316.png">

# 最後に
私はモックアップなどを作成するときに，このツールを重宝しております。
非常に便利かと思うので，皆様も使ってみてはいかがでしょうか。
言語処理100本ノックを解きながらPythonを学ぶ：01

#はじめに

タイトルにある通り「[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)」の問題を解きながらPythonを学ぶことが目的です。

なので、ただ問題を解いて終りにならないよう、理解に至るまでの過程、リファクタリングの過程、異なるアプローチからの解き方があるケースでは複数の回答を、また、関連する内容についても言及していこうと思います。

100問やり遂げた暁には、自分はパイソニスタ？パイソニスト？パイソニアン？だと胸を張って言えることを目標に。（なぜ通り名がこんなにたくさん・・・？）

[プログラマーの通り名まとめ](https://qiita.com/yukimura1227/items/b406606704db74de9a03)

#環境
- Python 3.7.2
- Win10

#01. 「パタトクカシーー」
>「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．．

##【作成したコード】
```python
>>> word = "パタトクカシーー"
>>> print(word[::2])
パトカー
```
[前回](https://qiita.com/kasashimakiyotake/items/924b70f7ae6d855e418b)スライスの動きをしっかり理解しておいたおかげで、今回はスムーズに解けました。

2,4,6,8文字目を出力する場合は下記。

```python
>>> word = "パタトクカシーー"
>>> print(word[1::2])
タクシー
```

##js、Rubyとの比較

参考までに、JavaScriptとRubyでも試してみました。

【JavaScript】

```js
const word = 'パタトクカシーー';
const policeCar = [...word].filter((v, i) => !(i&1)).join('');
console.log(policeCar);  // => パトカー
```

【Ruby】

```ruby:100knocks.rb
word = "パタトクカシーー"
police_car = word.split("").select.with_index{|v, i| (i&1 === 0)}.join("")
puts police_car  # => パトカー
```

少なくとも僕の調べた範囲では、js、rubyとも、それ単体で文字の位置を指定して出力するメソッドを見つけることが出来なかったため、どちらも、以下の手順を踏みました。

- いったん文字列⇒配列に変換
- 配列のインデックス値が偶数である要素を抽出
- 抽出した要素をつなげて文字列として返す

もう少し良いやり方がありそうな気もしますが、Pythonの勉強が主たる目的なので、そこは、あまり深追いせずに。

js、rubyともにstringオブジェクトで使えるslece()メソッドが用意されており、どちらも「〇文字目～〇文字目」という範囲の指定はできるのですが、今回のようなケースだと、stepが指定できるPythonのスライスは非常に便利ですね。

- [MDN web docs String​.prototype​.slice()
](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/slice)
- [Rubyリファレンス](https://ref.xaio.jp/ruby/classes/string/slice)

とはいえ、実務において一文字置きに抽出が必要なケースというのが、ちょっと思い浮かびませんが・・・

今回の問題は以上になります。

誤りや、もっと簡潔な書き方がある、等々、ご意見がありましたら、ご指摘頂ければ幸いです。
応用数学：「 第 1 章： 線形代数 」

スカラーとは普通の数を意味し、足し算・引き算等の計算が可能なものである。ベクトルとはスカラーに向きを持たせて矢印で図示されるものである。さらにベクトルを並べて、スカラーの表形式にしたものを行列と呼ぶ。行列計算は膨大な変数をもつ連立方程式を一度に計算できる点でメリットがあり、自然科学分野における数値解析で広く使われている。また行列計算の複雑性を減らすために、固有分解、特異値分解という考え方がある。固有値分解とは正方行列を、固有ベクトル(*1)を並べた行列、固有値(*1)を対角線上に並べた行列、固有ベクトルを並べた行列の逆行列の積で表現すること(*2)である。一方正方行列以外の場合は、その行列と行列の転置行列の積を固有値分解して、同様な形式で表すことを特異値分解(*3)と呼ぶ。

(*1)固有値、固有ベクトル
ある行列に対して、以下の数式が成り立つような特殊なベクトルxを固有ベクトル、右辺の係数λを固有値と呼ぶ
Ax=λx
(*2)固有値分解…A = VΛV-1
A:正方行列、V:固有ベクトル行列、Λ:固有値を対角線上に並べた行列

(*3)特異値分解…MMT = USST U-1 
M:正方行列でない行列、U:左特異ベクトル行列、SST:特異値の2乗を対角線上に並べた行列
ID3タグとflacファイルメタデータとRust

# 動機
* mp3とflac音楽ファイルのメタデータをどうにかしたい
* Rustで遊びたい

という思いでちょっとだけ遊んでみました。もっと遊ぶかはこれからの気分次第。
とりあえずID3とFlacメタデータについてちょっとだけ調べて、Rustで使えるライブラリを試したことを書きます。

# ID3タグ
## 仕様
http://id3.org/id3v2.3.0 とか
個人で翻訳されたものもあります。（文字コードがsjisなので注意）
http://takaaki.info/works/id3info/
ざっくりとした仕様と実例は下記のような感じ。

* まず10バイトのヘッダーがある。

| ID3v2/file identifier | ID3v2 version | ID3v2 flags | ID3v2 size |
|---|---|---|---|
| I D 3 | 03 00 | 00 | 00  14  3f  7d
flagsはいろいろ意味があるみたいですがフラグが立っている実例が見当たらなかったです。特に拡張ヘッダーが指定されていると10バイトの次の領域を考慮しなければならなくなりますが、その実例はなかったので今後の研究に任せます。

* 次にさっそくフレームが並ぶ
フレームというのがWindowsで言うプロパティと値の組み合わせのようなもの。
１つのフレームの実例を示します。

| Frame ID | Size | Flags | body? |
|---|---|---|---|
| M C D I | 00 00 00 66 | 00 00 | 38  00 ... 00 00  |
| T P E 1 | 00 00 00 0b | 00 00 | (01h) \ufeff \u9ed2 \u5d0e \u6714 \u591c |
FrameIDはプロパティの名前のようなもので、必ず４文字みたいです。MCDIは

> 4.5     MCDI    [#sec4.5 Music CD identifier]

とのこと。
サイズは４バイト。
フラグは例によって00なので説明を割愛。
値のところはbodyというのか何なのか知りません。これが文字列の場合は１バイトコードとか２バイトコードとかを先頭１バイトで指定できるようです。
TPE1の例ではまずUnicodeであることが示され、次はBOMのようです。そして漢字４文字。

## Rustのライブラリ
https://github.com/jameshurst/rust-id3 がとりあえず使えそうでした。
上記をそのままcloneして、中にsrc/main.rsを作成してREADME.mdのUsageのコードをぺたっと張り付けて実行すればOKです。

```
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.09s
     Running `target/debug/id3`
黒崎朔夜
黒崎朔夜
```

２回出ているのはそういうサンプルコードだから、というだけです。

# flacメタデータ
## 仕様
……ID3で疲れたので詳細は割愛。ID3と違ってofficial toolであるmetaflacがあるのでそれで雰囲気は十分です。metaflacはflacをapt-getしたりするとついでに入ります。

```
$ metaflac testdata/01.flac  --show-tag=TITLE
TITLE=ハツユキカズラ
```

## ライブラリ
https://github.com/jameshurst/rust-metaflac  が使えそうです。
cloneしないでUsageのようにCargo.tomlを編集すれば良いです。
が、プログラムがよろしくないので私の例を出します。

``` main.rs
extern crate metaflac;

use metaflac::Tag;

fn main() {
    let tag = Tag::read_from_path("testdata/01.flac").unwrap();

    let key = "TITLE".to_owned();

    match tag.get_vorbis(&key) {
        None      => println!("No field named {}", key),
        Some(fld) => println!("{} : {:?}", key, fld),
    }
}
```

実行結果は下記。

```
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.04s
     Running `target/debug/flac_tag`
TITLE : ["ハツユキカズラ"]
```

とりあえずはいじょです。
ブラウザで画面上のh3ノードを開発ツール上で取得して表示文字列を表示するまで

現在学習に使っているページの見出しをマインドマップに書き出したいと思ったのですが、手で書き写すくらいならDOM操作して取得してやろうと思ってやってみたので方法をメモしておきます。

```javascript

// 1. 画面に表示されているh3タグを取得する
var h3s = document.getElementsByTagName('h3') // => HTMLCollectionが返ってくる

// 2. HTMLCollectionの要素数だけfor文を回す
for (i = 0; i < h3s.length; i++) {

  // HTMLCollection.item()を叩いてNodeを取得する
  var h3 = h3s.item(i)

  // Node.textContentに格納されている文字列を取得・表示する
  console.log(h3.textContent)

  // 表示された文字はブラウザの機能で保存するかコピーする
}
```

## 追記

`querySelector`を使うと複数クラスの`NodeList`を取得できた。

NodeListならforEachメソッドもあるのでこっちの方が簡単。

```javascript
var h3AndLectureList = document.querySelectorAll('.hoge,.foo')

h3AndLectureList.forEach(node => console.log(node.textContent))
```
Windows PowerShellのコマンドの基本について

##はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている＜@yuusuket57>です。
Pythonの勉強を始めて、1か月くらいです。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください！
今回はPythonの勉強会で学んだ、Windows PowerShellのコマンドについて書きます。

##PowerShellコマンドについて
```html
cd ディレクトリ名
```
ディレクトリ名に移動

```html
cd ..
```
1つ前のディレクトリ移動する

```html
cd 
```
ホームディレクトリに戻る

```html
ls
```
フォルダの一覧表示

##まとめ
コマンドは便利なので、使いこなせるようになりたいと感じました。
まだまだ、さまざまなコマンドがあるので、勉強して、使いこなせるようになります。
JupyterLab(Anaconda3) on Docker for Mac

# 【Overview】
- Establishing an execution environments on JupyterLab via Anaconda3 using Docker.

## 【Environments】
- macOS Mojave 10.14.4
- MacBook Pro

## 【Prerequisites】
- Docker has been installed.

## 【Workflow】
### ▼Pulling the image of Anaconda3
```
$ docker pull continuumio/anaconda3
```
### ▼Provisioning Anaconda3 Container
- 【-v】ホスト側のディレクトリをコンテナ側にマウントすることでデータを永続化
- 【Format】{Any directory on host-side}:/workspace

```
$ docker run -it -p 8888:8888 --name anaconda3 -v /Users/{}/data/jupyterlab:/workspace continuumio/anaconda3 /bin/bash
```
### ▼Deactivating current environment
```
conda deactivate
```

### ▼Installing pandas_datareader(Optional)
```
$ pip install pandas-datareader
```
### ▼Displaying available Python versions
```
$ conda search python
```
### ▼Installing Python3.6
```
$ conda create -n py366 python=3.6.6 anaconda
```
### ▼Pythonのバージョン切り替え
```
$ source activate py366
```
### ▼切り替え完了を確認
```
$ conda env list
```
### ▼Launching JupyterLab
- トークンの設定なし

```
$ jupyter-lab --no-browser --port=8888 --ip=0.0.0.0 --allow-root --NotebookApp.token=''
```

### ▼Access the following URL
```
http://127.0.0.1:8888/
```
インストールしたいGemの安定バージョンを見る方法

railsをインストールする時に、最新の安定バージョンを表示させたい時に困ったのでメモしておきます。

# Gemの安定バージョンを表示

```linux:インストールしたいGemの安定バージョンを全部表示
gem list gemの名前 -rea
```

```linux:開発版を含む全部
gem list rails -rea --pre
```

```linux:最新安定版
gem list rails -re
```

# バージョンを指定してGemをインストール

```
gem install gemの名前 -v バージョン
```

```
gem install rails -v "5.2.3"
```
ゼロから始めるPHP ～何かを作ると決めるまでのマインドセット～

Laravelを使って無謀にも掲示板を作ることにした人の気持ちを表した記事です。

<h1>分からないからこそ何かを作る。</h1>
本当はLaravelの構造だったり、素のPHPとの比較など色々知識として持っておけばよかったかもしれません。
しかし、開発環境を構築してすぐに何かを作るのは自分なりの理由があります。
<h4>①いきなり技術書を読んでも入ってこない</h4>
私はまさにこれで、知らない単語だらけの技術書を読んでも全然入ってこないんです。
「眠たい、つまらない、他のことをしたい。」そんな気持ちに支配されてしまうメンタル弱い人間です。
なので試行錯誤しながら何かを作ってその後に技術書を読むことでスーッとインプットされます。
少しでもわかると面白くなってどんどん捗ります。

<h4>②分からないなりに調べた事は身に付く</h4>
事前に調べてやっても最初はうまく行かない事が多かったので、**「やりながら学んでいく。」**
本当に単語の意味も分からないけば、調べ方すら分からない。
この状態をなんとか打破するのが成長かなと思います。
「何が分からないか分からない」　⇨　「◯◯が分からない」
「何が分からないか分からない」を超える事が１つの壁だと感じています。
私はプログラミング以外の仕事でも、全部この方法で学んできたのでこれしか出来ないのもあります。

<h4>③１つ何かができると自信がつく</h4>
何も分からないけど先人のブログやQiitaの記事を見てでも**「自分の力で何かが完成した。」**
これが凄く自信になります。自分のオリジナルじゃなくても完成したという喜びが大事です。


<H1>とにかく何かを作ってみよう</H1>
私は何も分からない状態からでもすぐに何か１つ作る事を徹底しています。
結果として技術書の理解も進むし、自信もつくのでメンタルも安定します。
こんなこともやりたい！あんな機能は実装できるかな？など色々アイデアが浮かんできます。
実際はまだ技術力もないし、やり方も分からないですが前向きな気持ちは成長を促してくれます。

という事で早速、Laravelで掲示板を作ってみました！
次回は、実際に作った制作物と作りながら出たエラーや悩みを解決する記事を書いていきます。
chromeでサイトのselectタグのoptgroupとoptionの階層構造をぱぱっと取得する

## やりたいこと

セレクトボックスの階層構造をスプレッドシートやエクセルに書き出して整理したい時、書き出し作業がめんどくさいので作ったスクリプト

| サイト上 | やりたいアウトプット | 
| --- | --- |
| ![スクリーンショット 2019-05-18 20.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61095/e4e4f1a6-2bc5-1fae-5ba9-56fa9ffd54cb.png) | ![スクリーンショット 2019-05-18 20.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61095/650a3f5b-5dfd-67c6-a742-65cd928e55fe.png) |

## スニペット

```js
var text = "";
$$("select[name='tag'] optgroup").forEach(function(e) {
  text += $(e).attr('label');
  $(e).find('option').each(function(i,e) {
    text += "\t" +$(e).text() + "\n";
  });
});
console.log(text);
```

クロームのコンソールで `name` などのセレクタでselectボックスのエレメントを指定した状態で上記を実行するとコンソールに
![スクリーンショット 2019-05-18 20.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61095/6cd676c1-0c2c-7805-fbb7-d600786ee7ad.png)

のような文字列が出てくるのでこれをコピーしてスプレッドシートなどに貼り付ける
未経験アラサー女が自社開発企業に転職するまでの軌跡

#はじめに
初投稿記事なので読みづらかったら申し訳ありません！
主にRubyonRails.HTML.CSS.GitHub.少しだけAWSの勉強をしてきました！
以下スペックです。

- 20代後半の女
- 前職は販売業（PC触る機会はほぼなし）
- 大卒
- 初めての転職

プログラミングに興味をもったのは、手に職つけたかったからです！
実力をつければリモート作業も可能なので、今後結婚出産するとしても自宅で仕事できると感じました。
あとは単純にものづくりに興味がありました。
エンジニアになるんだ！と決意してから退職するまでほんと早かったです。笑

#学習に活用したもの
###①プログラミングスクール
一度は独学でやるぞ！と意気込んでいたのですが、
まず何から初めていいのか、調べても情報量が多く…何が正しくて何が間違っているか判別できませんでした。

そこで調べたところプログラミングスクールの存在を知ったのです。

しかし、スクールも多数あり、どこが良いのかわからない！
まずはオンラインスクールか通いのスクールにするのか迷いましたが、業界仲間が欲しかったのと、
家でモチベーション保ちながら自学習できる人間ではなかったので通いのスクールにすることにしました。
スクール比較に関しては３週間くらいしっかり調べて選びました。
実際スクールは良し悪しがかなりあるし、表に出てないブラックな事情が多々あります。
私が通ったところはしっかり選んだ分、とてもよかったですが。
スクールについてはまた別途で書きたいと思います。

スクールでは3ヶ月の学習期間が設けられており、
HTML.CSS.Ruby on Rails.GitHub.AWS等の基礎が一通り学べました。
また2ヶ月目にはチーム開発も行い、コーディング前の設計段階もここで学べましたし、複数人による開発の仕方(GitHub）も学びました。
3ヶ月目には一人で設計、コーディングしてポートフォリオサイトを作成しました。
多い時では週6日の1日８時間以上通っていました。
でも仲間もいたし、楽しかったので辛くはなかったです！

###②WEBの学習教材の活用
- プロゲート
- ドットインストール

一番最初にプロゲートにお世話になりました。
スクールで学ぶ前の３週間ほど、みっちり勉強しました。
スクール通われる予定の方は、まず通うまでにプロゲートやることを絶対オススメします！
私はHTML.CSS.Rubyコースを２週していたので、スクールの内容も割とすぐ吸収出来ました。
あとはデザインが可愛く、楽しみながら学習出来る仕様になっているので、挫折せず出来ます。

ドットインストールは、スクール通いながら学習していました。
技術書読むのに疲れた時に、動画学習なので気楽に学習することができました。
ただし、解説スピードが早いのと、少し説明省きがちなところがあるので、
技術書やスクールの内容のおさらいとしてざっと確認する程度にしていました。
私は音で聞くとより覚えるので、おさらいにはもってこいでした。

###③技術書
- プロを目指す人のためのRuby入門
- 現場で使える Ruby on Rails 5速習実践ガイド
- 達人に学ぶDB設計 徹底指南書
- GitHub実践入門~Pull Requestによる開発の変革
- Web技術の基本

上記５冊は全て読破しました。
他にも購入した技術書はありますが、上記にあげたものは特におすすめです。
めちゃくちゃチェリー本！みたいなのも買ったんですが、結局使いませんでした。
そういうのはプロゲートやQuiita等で充分に学べます。
ちょっと初心者脱した人用、みたいな本の方が活用できました。
特にRuby学んでいる方は『プロを目指す人のためのRuby入門』オススメします。
これほど丁寧でわかりやすい本あるのか、と感動しました。
『達人に学ぶDB設計 徹底指南書』は、アソシエーションの理解が出来ない！
DB設計わからない！って方におすすめです。
『Web技術の基本』は、そもそもWeb周り知らない！って思って買いました。
ざっくりとではありますが、Web周りの知識を網羅してくれています。
ページ数もそこまで多くなく、サイズも小さめなので電車の中でも見れますし、サクッと読みたい時おすすめです。

#学習の際、心得ていたこと
- コードをコピペしない
- わからないことはまず自分で調べる
- 調べてもわからなかったら、ヒントだけメンターさんに聞く
- 技術書は読むだけではだめ。実際にコードを書く


#いざ転職活動！
私は自社開発3社、受託1社を受けまして、１社落ちで自社開発３社から内定頂きました。
運よく早めに終わりましたが、面接対策は万全に行いました。
ポートフォリオはもちろん力を入れましたが、企業側から見ればみんな未経験は未経験。
その中で、今後成長するのか、リーダーシップやコミュニケーション能力はあるのかを見られるのです。
つまり成長意欲をアピールできなければ受かるわけないです。
割と面接対策を軽く見ている方も多く、常に疑問を感じていました。
ポートフォリオ作って企業に見てもらって、はい内定！、みたいな軽い世界ではないです絶対。
そもそも未経験なので、意欲を伝えられるのは、職務経歴書や面接でしかないんです。

#さいごに
6ヶ月前はパソコンの知識がほとんどなかった私でも、内定取れました。
勉強すれば、そして面接対策しっかりすれば未経験でもエンジニアになれます。
スクールに関しては、自分で勉強できる方なら必要はないと思います。
スクール利用される予定の方はしっかりしたスクールを選んでください。
一番大切なのは自分自身が勉強できる環境を整えること。
その為に投資することは全然普通だと思います。
私の経験が少しでもみなさんのお役に立てれば何よりです！
長文でしたがご覧いただきありがとうございました！
図で理解！ニューラルネットワークとは？

# ディープラーニング（深層学習）？人工知能？機械学習？ニューラルネットワーク？
最近流行りのディープラーニング（深層学習），人工知能，機械学習，ニューラルネットワーク……
「勉強しよう！」と参考書を買ってみても「小難しい文字ばかりで理解できない……」，「前提知識が多すぎる……」って挫折しそうな貴方に！
図でシンプルな解説をします！

自然言語処理，画像認識・生成，自動制御……
０から実装できる事を目標に解説を区切って書いていきたいと思います。

#ディープラーニング（深層学習）とは？
ニューラルネットワークという技術を使って機械学習させる技術です！
とりあえず今回は「へー」っと深く考えずに流しておきましょう〜

#ニューラルネットワークとは？
上に出てきた”ニューラルネットワーク”。
様々な参考書やネットには長々と解説が綴られる厄介もののようですが、要は以下図のことです。

![Qitta-neuralNetwork.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/ac0daf7f-b969-5e64-1e0b-eb664aeddddc.png)


と言われても、ピンと来ませんよね（笑）
この大枠の図を頭の隅に入れておいてください、細かい説明に入っていきます。

#ネットワーク層とは？
ニューラルネットワークの図を見て、これで何をどうするんだろう？と思いますよね。
その答えがこちら。

![Qiita-doind.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/6f2fb8ca-39f2-f815-e9cb-0dbc879ec5c1.png)

つまり、各ネットワーク層では、”受けとったデータ（入力）に何らかの処理を加えて新しいデータ（出力）を出す処理”をしています。

この図で言うと、入力X1,X2,X3を受け取り、Wを掛けbを足した結果を出力にしています。


＊余裕があったら覚えておいて！
一般的にWX+bの計算処理をするネットワーク層をAffine層やliner層と呼び、ネットワーク層の処理で１番ベーシックとなる構成です。


処理をしています、と言われても実装のイメージも付かないし、そもそも計算方法が分からないですよね。
まずは行列計算の解説を挟みます。

#前提知識となる行列計算！
＊分かる方は飛ばしてくださいね。

![Qiita-matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/d87572fe-f54e-a4eb-25a2-abad262d9938.png)

#WX+bの計算
しれっと行列計算の解説を挟みましたが、勘がいい貴方は気づいていますよね。
W,X,bはそれぞれ行列で、WX+bは行列計算を行っているんです。
　
#色んな役割を持つネットワーク層
ネットワーク層は、他にも沢山の種類があり、それぞれ行う計算処理が違うんです。

＜各ネットワーク層の代表例＞
・Affine層(今回説明したWX+bの処理を行うネットワーク)
・Convolution層
・ReLU層
・LeakyReLU層
・Pooling層
・Sigmoid層
・Tanh層　
・BathNormalization層
・GlobalAveragePooling層
・LSTM層
・Softmax層

などなど、他にも沢山あるんです。
それぞれの解説は別記事に記載したいと思います。

#よく聞く”畳み込みニューラルネットワーク”とは？
「ニューラルネットワーク」と検索したら、よく見かける”畳み込みニューラルネットワーク（CNN）”。
単純に、”Convolution層を入れ込んだニューラルネットワークのモデルの事”です。
![Qiita-convolution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334811/39f349a9-90b6-ed4c-68d9-e16d57466cdc.png)
＊ネットワーク層A，B？？？
CNNのルールみたいなもので、Convolution層のすぐ後ろは活性化関数のネットワークがくる、ってのがあるんですが
ここではとりあえずスルーしましょう。
CNNの解説記事に詳しく書きます。

#よく聞く”系列変換モデル”とは？
系列変換モデル、と言われるものも、
”LSTM層を入れ込んだニューラルネットワークのモデルの事”です。
こちらは、自然言語処理など、その名の通り”時系列に沿って変換するもの”に使われます。
LSTM層の他にも系列変換に特化したネットワーク層は沢山あるので、おいおい解説をしますね。

#まとめ：ニューラルネットワークとは？
それぞれの役割（計算処理）を持つネットワーク層を、何連にも繋げて、
”入力を、段々と違うものに変えて、出力を得るもの”です。

次回は、それぞれのネットワーク層について解説していこうと思います。

＊おまけ
逆伝搬・学習・学習方法・損失(誤差)関数などのキーワードが出てこないとウズウズしている方
ネットワーク層についてお話した後にたっぷりと解説しますよ。
Sass::SyntaxError at /sessions/new Invalid CSS after "...ort "bootstrap"": expected "{", was ";"

- ` <%= stylesheet_link_tag    'application', 'data-turbolinks-track': 'reload' %>`
- `<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>`

#####でエラー、、、

#解決コマンド

```
$ yarn
```

#解決サイト

https://qiita.com/SuguruOoki/items/3f4fb307861fcedda7a5


以上

参考
https://stackoverflow.com/questions/9590598/devise-rails-no-route-matches-get-users-sign-out
Magic Leap MagicScript Landscape Application. LedPattern of the control device

**Prepare**
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.2.0
https://www.npmjs.com/package/magic-script-polyfills


**Create Project**

```
magic-script init my-led org.magicscript.led "LED"
cd my-led
```

**Code**

Change app.js

```javascript
import { LandscapeApp, ui, haptics } from 'lumin';
const { UiButton } = ui;
const { LedPattern, VibeIntensity } = haptics;

export class App extends LandscapeApp {
  onAppStart () {
    const app = this;
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);    
    const button = 
          UiButton.Create(prism, 'LED', 0, 0.1);
    button.onActivateSub(function (uiEventData) {
        
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_1)}, 0);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_2)}, 200);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_3)}, 300);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_4)}, 400);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_5)}, 500);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_6)}, 600);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_7)}, 700);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_8)}, 800);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_9)}, 900);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_10)}, 1000);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_11)}, 1100);
      setTimeout(function(){ led(app, LedPattern.LED_CLOCK_12)}, 1200);

    });
    prism.getRootNode().addChild(button);
  }
}

function led(app, LED)
{
  app.triggerControlLEDHaptics(LED, 100, VibeIntensity.HIGH);
}

```

**Build**

```
magic-script build -i
```

**Run**

```
magic-script run --port=10000
```

**Reference**
triggerControlLEDHaptics (MagicScript API)
https://docs.magicscript.org/lumin.LandscapeApp.html#triggerControlLEDHaptics

LedPattern (MagicScript API)
https://docs.magicscript.org/lumin.haptics.LedPattern.html

magicscript
https://www.magicscript.org/

Thanks!
tfds.loadを使ってtf.Tensorを取得する方法

# 背景
TensorFlow Datasets（tfds）のloadは[Get started with TensorFlow 2.0 for experts](https://www.tensorflow.org/alpha/tutorials/quickstart/advanced)でも使われているように、今後世の中のデータセットを利用するときによく使うメソッドだと思います。2019年5月18日時点で69種類のデータセットが取得可能です（対してtf.keras.datasetsは7種類）。

しかし、tfds.loadはデフォルトではtf.data.Datasetを返すのですが、これでは困る場合があります。例えば、tf.keras.preprocessing.image.ImageDataGeneratorのfitやflowの入力はNumpyの4次元配列でなければいけません。それを実現するためには以下のようなコードを書く必要があり、あまり直感的ではありません（よりよい実現方法をご存知の方がいれば是非教えて下さい！）。そのため、そもそもtfds.loadにtf.data.Dataset以外の型を返させたいなぁというのがきっかけです。

```Python
dataset_train = dataset_train.batch(info.splits["train"].num_examples)
for train_x, train_y in dataset_train:
    pass

print(train_x.shape, train_y.shape)
# (50000, 32, 32, 3) (50000,)
```

# 実現方法
https://www.tensorflow.org/datasets/api_docs/python/tfds/load をよく見ると書いてありますが、`batch_size`に-1を指定すると実現できます。以下サンプルコードです。

```Python
import tensorflow_datasets as tfds

dataset, info = tfds.load("cifar10", as_supervised = True, with_info = True, batch_size = -1)

dataset_train, dataset_test = dataset["train"], dataset["test"]
print(dataset_train[0].shape, dataset_train[1].shape)
print(dataset_test[0].shape, dataset_test[1].shape)

# (50000, 32, 32, 3) (50000,)
# (10000, 32, 32, 3) (10000,)
```
請負契約でないと機敏(agile)にはできない

機敏(agile)仕事をするには、請負契約で、支払いが確実な時という経験則について。

派遣契約で、いつ仕事が終わるかわからないようだと、機敏(agile)に動けないと言われる方がおみえになりました。反論としては機敏に動けば請負契約に変更できるかもと、、、。

機敏(agile)な仕事ができている場合の見聞きした場合を記します。

1. 親子関係などの出資があり、安定した請負契約している場合

2. 親子関係などの出資はないが、長期請負契約を前提としており柔軟に内容を変更できる。

3. 特許、代理店契約など、技術的依存関係があり、請負契約を結んでいる場合

4. 特許、代理店契約などはないが重要な固有技術を提供しており、他者から提供できる可能性がない請負契約

5. 主たる技術者が独創的で、他社で探すのは相当困難な請負契約の場合

6. 技術者は独創的ではないが、御用聞き、積極的提案など顧客のかゆいところに手がとどいている請負契約

上記以外で、３年間うまくいったという話は、今のところお聞きしたことはありません。

派遣契約だった事例が、機敏にうごいたため請負契約に変更できたという事例を含みます。

上記以外の事例をご存知でしたら、ぜひご教授くださると幸いです。

お聞きしている事例数は、３桁の初めかも。

# 文書履歴(document history)
ver. 0.01 初稿 20190518
ver. 0.04 URL追記　20230302

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Leetcode #42: Trapping Rain Water

```swift
func trap(_ height: [Int]) -> Int {
    if height.count < 2 {
        return 0
    }
    var leftHeight = Array(repeating: 0, count: height.count - 2)
    var rightHeight = Array(repeating: 0, count: height.count - 2)
    var maxHeight = height[0]
    for i in stride(from: 1, to: height.count-1, by: 1) {
        leftHeight[i-1] = maxHeight
        maxHeight = max(maxHeight, height[i])
    }
    maxHeight = height.last!
    for i in stride(from: height.count-2, to: 0, by: -1) {
        rightHeight[i-1] = maxHeight
        maxHeight = max(maxHeight, height[i])
    }

    var answer = 0
    for i in stride(from: 1, to: height.count-1, by: 1) {
        answer += (min(leftHeight[i-1], rightHeight[i-1]) - height[i])
    }
    return answer
}
```
python 実行可能な圧縮ファイルの作成 (zipapp)

pythonで作ったバッチを1ファイルにして管理を楽にする場合、
python 3.5で入った機能のzipappが使えるようだがちょっと詰まったのでメモしておく。

# 前提となるファイル構成

## ファイル配置

```
myapp
+ test1.py
+ test2.py
```

## ファイル内容

#### test1.py

```python
from test2 import hello

def main():
    print('main!!')
    hello()

if __name__ == "__main__":
    main()
```

#### test2.py

```python
def hello():
    print('hello!!')
```


## シンプルな方法

公式サイト
https://docs.python.org/ja/3/library/zipapp.html

myappの1階層上のディレクトリで以下のコマンドを実行。

```
myapp> cd ..
> python -m zipapp myapp -m "test1:main"
> python myapp.pyz
main!!
hello!!
```

myapp: 圧縮するディレクトリ
test1: モジュール名(pyファイル名)
main: 実行する関数名

## 便利な方法

実際には普段の実行はmyapp内で実行することが多いので、
1階層上に移動するのとか面倒。
よって、myapp内で実行するなら以下のコマンド。

```
PS D:\myapp> python -m zipapp ../myapp -m "test1:main" -o ./myapp.pyz
PS D:\myapp> python myapp.pyz
main!!
hello!!
```

myapp: 圧縮するディレクトリ
test1: モジュール名(pyファイル名)
main: 実行する関数名
hello.pyz: 圧縮ファイル
ABC - 017 - A&B&C

#AtCoder ABC 017 A&B&C
[AtCoder - 017](https://atcoder.jp/contests/abc017)

#A - プロコン

```java
	private void solveA() {
		int res = 0;
		for (int i = 0; i < 3; i++) {
			int point = nextInt();
			int ratio = nextInt();
			res += point * ratio / 10;
		}

		out.println(res);
	}
```

#B - choku語

 - 'ch''o''k''u'が入っているとchoku語にならない
    - 'ch''o''k''u'を全部空文字に置換したら入力値の長さは0になる
        - 置換ではなくて1個ずつ調べるでもいいと思うけどjavaはreplaceの方が簡単なので

```java
	private void solveB() {
		String res = next().replaceAll("ch", "").replaceAll("o", "").replaceAll("k", "").replaceAll("u", "");

		out.println(res.length() == 0 ? "YES" : "NO");
	}
```

#C - ハイスコア

###ループ（部分点30+70/TLE)

 - 問題より
    - 全種類の宝石をとってはいけない
        - 1-n種類の宝石の内、どの宝石をとらないのが一番特典が高いのか？と読み替えられる
            - `どの遺跡を探検するのか？` ではなく、 `どの宝石をとらないべきか？` で考える
                - ある種類の宝石をとる場合は、ほかの遺跡の同種類の宝石も全て取ったほうが良いので

 - 問題を読み替えると、`ある宝石をとらない場合の得点の最大値を求める`となる
    - $宝石1をとらない場合、宝石2をとらない場合、宝石3をとらない場合・・・宝石Nをとらない場合$
 - 単純にループ回すと絶対間に合わないので、累積和っぽくやってみる

 - 入力例1:

>4 6
>1 3 30
>2 3 40
>3 6 25
>6 6 10

 - 例えば、1の宝石をとらないと決めた場合以下のようになる
    - 遺跡1には行けない
    - 遺跡2と3は行ける
    - 遺跡4は行けない
        - 1-3をとらない場合はこの点数が入らないが、4-6をとらないと決めた場合はこの点数は入る

||宝石1|宝石2|宝石3|宝石4|宝石5|宝石6|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|遺跡1||||30|30|30|
|遺跡2|40|||40|40|40|
|遺跡3|25|25|||||
|遺跡4|10|10|10|10|10||
|合計<br>(宝石をとらない場合の最大値)|75|35|10|80|80|70|

 - これだと、最後の1点が入らない
    - ただ、累積和の部分が`いもす法`で実装できそうな感じがしたので別解を試した

```java
	private void solveC2() {
		int n = nextInt();
		int m = nextInt();

		int[] l = new int[n];
		int[] r = new int[n];
		int[] s = new int[n];
		int[][] res = new int[m + 1][1];
		for (int i = 0; i < n; i++) {
			l[i] = nextInt();
			r[i] = nextInt();
			s[i] = nextInt();
			for (int j = 1; j <= m; j++) {
				if (j < l[i] || r[i] < j) {
					res[j][0] += s[i];
				}
			}
		}

		Arrays.sort(res, (x, y) -> -Integer.compare(x[0], y[0]));
		out.println(res[0][0]);
	}
```

###いもす法(101点解法)

 - 参考サイト(いもす法および累積和)
    - [いもす法](http://imoz.jp/algorithms/imos_method.html)
    - [競技プログラミングにおけるimos法・累積和問題まとめ](https://www.hamayanhamayan.com/entry/2017/07/04/020117)
    - [累積和を何も考えずに書けるようにする！](https://qiita.com/drken/items/56a6b68edef8fc605821)
    - [ABC - 035- A&B&C](https://qiita.com/shihou22/items/a0cfbeaebb73ae92c598#c%E5%95%8F%E9%A1%8C)

上記解法の以下の部分を修正した

```
			for (int j = 1; j <= m; j++) {
				if (j < l[i] || r[i] < j) {
					res[j][0] += s[i];
				}
			}
```

```java
	private void solveC() {
		int n = nextInt();
		int m = nextInt();

		int[] l = new int[n];
		int[] r = new int[n];
		int[] s = new int[n];
		int[] res = new int[m];
		for (int i = 0; i < n; i++) {
			l[i] = nextInt() - 1;
			r[i] = nextInt() - 1;
			s[i] = nextInt();
			res[0] += s[i];
			res[l[i]] -= s[i];
			if (r[i] < m - 1) {
				res[r[i] + 1] += s[i];
			}
		}

		for (int i = 1; i < res.length; i++) {
			res[i] = res[i] + res[i - 1];
		}
		Arrays.sort(res);
		out.println(res[m - 1]);
	}
```