OmniAICreator/Qiita-1.07M huggingface dataset:
Python　二重リストの操作

#二重リストの操作について

Pythonでコードを組んでいて
二重リストを扱うことがあったのでメモ。

```ruby:
array = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], ... ] 
```


配列の中に配列がある…
しかも、１行で表示されていて見づらい…

これを数学の行列みたいに
「かっこ」や「,」を取り除きたい！

```ruby:
print(*array, sep = '\n')
```
おまじないでこうしてあげると…


```ruby:
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9, 10, 11]
[0, 0, 0]
```
行列っぽくなった。

```ruby:
for a in array:
    print(*a)
```
こうすると

```ruby:
0 1 2
3 4 5
6 7 8
9 10 11
0 0 0
```

もっと行列っぽくなった！！
Googleマップの「質問と回答」をPCから見る方法

以下のリンクからアクセスすると「質問と回答」を見ることができます。
http://google.com/search?tbm=lcl

また、簡単な質問に答えるとローカルガイドポイントがもらえるポップアップも表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/ce237f01-884a-f020-0f54-3df320ff2531.png)
HIP HOPとTrapのビートを作りました。

僕がトラックを作り始めたのが去年の9月頃です。最初は音の打ち込み方も何も知らないので、選択課題を参考に少しずつ作り始めました。
https://n-highschool.slack.com/files/UHW10B91N/FTRMZTUFN/introduction.aif

その当時、[BAD HOP］というHIP HOPクルーにハマった僕はTrapというジャンルの音楽に影響を受け、２つビートを作りました。初めてということもあり、作るのにかなりの時間を費やしてしまいましたが、カッコよくなったかと言われると全然そういう風には感じませんでした。なので、次回は短時間でカッコイイビートを作れるようになりたいです！
https://n-highschool.slack.com/files/UHW10B91N/FTRN0PT9A/resistance.aif
https://n-highschool.slack.com/files/UHW10B91N/FTG1Q50QH/silly_rules.aif
Numpy > 2次元データに対して1次元方向に補間をする > interp1d()にてaxis指定で実施する

```txt:動作環境
Python 3.6.8 (default, Aug  7 2019, 17:28:10) 
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.
CentOS 6.8
```


### 概要

- WRFという処理で使うOI SSTにおいて、時間補間をしようとしている
- 720x1440の配列が時間方向に9個あり、その状況で時間方向に補間をする
- 要素取出ししながらの補間では処理時間がかかりすぎる

### 方針

- [Best way to interpolate a numpy.ndarray along an axis](https://stackoverflow.com/questions/28934767/best-way-to-interpolate-a-numpy-ndarray-along-an-axis)


上記で紹介されているaxis指定の補間を実装する。

```
f_out = interp1d(heights, t_in, axis=1)
```


### 実装

処理対象のデータと同じ構造のarrayを用意して、それに対して補間を実装した (処理時間の確認用）。

```py
import numpy as np
from scipy.interpolate import interp1d
from time import time

# PEP8 checked

# 1. make test array
print('===DEBUG', time())
xarray = [x * 24 for x in range(-4, 5)]
print(xarray)
target = []
for val in range(9):  # value
    olist = np.array([])
    for oi in range(720):  # oi: outer index
        ilist = []
        for ii in range(1440):  # ii: inner index
            ilist.append(val)
        olist = np.append(olist, np.array(ilist))
    target.append(np.array(olist))
target = np.array(target)

# 2. interpolation long the axis of xarray
print('===DEBUG', time())
f_out = interp1d(xarray, target, axis=0)
print(target)
print(len(target))
print(target.dtype)
new_x = np.array([-50, -40, -30])
t_out = f_out(new_x)
print('===DEBUG', time())

print(t_out)

```

### 結果

-50, -40, -30に該当する補間値が求まったようだ。
処理時間は0.09秒程度。

```
===DEBUG 1581303872.2242842
[-96, -72, -48, -24, 0, 24, 48, 72, 96]
===DEBUG 1581303878.1328526
[[0. 0. 0. ... 0. 0. 0.]
 [1. 1. 1. ... 1. 1. 1.]
 [2. 2. 2. ... 2. 2. 2.]
 ...
 [6. 6. 6. ... 6. 6. 6.]
 [7. 7. 7. ... 7. 7. 7.]
 [8. 8. 8. ... 8. 8. 8.]]
9
float64
===DEBUG 1581303878.2205226
[[1.91666667 1.91666667 1.91666667 ... 1.91666667 1.91666667 1.91666667]
 [2.33333333 2.33333333 2.33333333 ... 2.33333333 2.33333333 2.33333333]
 [2.75       2.75       2.75       ... 2.75       2.75       2.75      ]]
```


### 補足

下記の補間も見つけたが、今回の目的には使わない気がする。

- [scipy.interpolate.RegularGridInterpolator](https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.interpolate.RegularGridInterpolator.html)
    - [使用例](https://stackoverflow.com/questions/35807321/scipy-interpolation-with-masked-data)
LinuxをMacにインストールしてみた

今回はターミナルにzshとtmuxをインストールしました。
かなり難しかったですが、なんとか達成できました。
またLinuxのコマンドについても学習しました。
たくさんの種類のコマンドがあり、大変便利だと感じました。
ターミナルからファイルやフォルダを作ることもできます。
Visual Stuido 2019逆引きメモ

## Nugetのキャッシュを削除

デザイナが表示されない、ビルドが通らない等原因がよくわからない場合に解決する事が有る。

```
nuget locals all -clear
```

### 参考情報
[NuGetパッケージのキャッシュをクリアする - ごずろぐ](http://gozuk16.hatenablog.com/entry/2017/03/28/171954)
基本情報17週目(02/10週)

# 目標と結果
### 目標
- 参考書をみる。
- [基本情報技術者試験ドットコム](https://www.fe-siken.com/)を使う。
- 午後で通用する様に内容を理解する。
- 情報セキュリティの勉強をする。

### 結果
- アルゴリズムの講座(2/16)に行きました。
    - 知っておかないとできない内容が意外に多いなと感じた。
        - 基本的なソートアルゴリズム
        - リスト(ポインタ、添字)
        - ヒープ(堆積物)の意味
        - 木構造の読み方
        - 二進数(AND,OR,XOR)の計算
    - 擬似言語は理解できた。
        - 独特の用語に言い直すことがある(日本語訳？)
            - グローバル→大域
            - 関数→手続き
        - ソート問題は再帰的な構造を理解してないとできないのでとても難しい。
        - プログラムどういう働きをしているかわからない事もあって苦手に感じる。
            - 大なり小なりで判定するところ
            - ループカウンタ
            - 「〜まで、〜である限り」のような
            

# 振り返り
### Keep
- アルゴリズムの勉強

### Problem
- アルゴリズムの予想以上の難しさ

### Try
- 情報セキュリティの勉強
.ipynb を .html へ変換    (with BatchFile)


# 結論
- batchファイルを置いてClick! したら直下の.ipynbをhtmlへ変換してくれるものを作った
- pythonが入っていない環境でも動く（はず）
- toc2(目次機能)が自動で挿入される　←　<strong>本機能の一推しpoint!</strong>
- macで作ったけど、windowsでもbuildしなおせば動く可能性あり。（未確認）

![demo](https://github.com/dai-a/ipynb2html-EXE/wiki/images/output.gif)

# 背景
- 送られてきた大量の.ipynbの中身を確認するために、毎度毎度ローカルサーバーを立ち上げてnotebookを開くのが大変。　さらにいうと、他業務で異なるdirectoryで作業しているといくつもローカルサーバーを立てないといけなくて業務どころじゃなくなる。

### 既存の方法
- 方法１: [@yorshka .ipynbを.htmlに変換する](https://qiita.com/yorshka/items/80a0352b745d5c10282c)

```
jupyter nbconvert --to html hoge.ipynb
```


- 方法2: [公式:Customizing nbconvert](https://nbconvert.readthedocs.io/en/latest/customizing.html)
    - template(以下の例だと"simplepython.tpl")を使ってhtml化。この方法だとtoc2などのnbextensionにある目次などもhtmlとして含められる
    
```
jupyter nbconvert --to python 'example.ipynb' --stdout --template=simplepython.tpl
```

- 方法3: LocalServer上でnoebookを開いて保存
![スクリーンショット 2020-02-11 12.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418485/0e8149c1-23af-36f7-e545-40d6b8511fcc.png)



# 解決できない問題・課題

- 大量の.ipynbをみないといけないときに辛い
- template.tplのpathを忘れる
- directoryの移動がめんどくさい
- python環境にいろいろなpackage(jupyter, nbconvert, nbextensions, toc2.tpl etc...) を入れておかないといけない。(環境はsimpleであってほしい！)
    - ↑仮想環境を作ってちょこちょこ入れ替えているからpackageの有無なんて覚えてられない。

# アプローチ
GUIベースの処理を実装する。（既存方法のコマンドを1つの実行ファイルにまとめる。）

- 使ったpackage
    - pyinstaller:  1ファイルの実行ファイルを作成
    - jupyter: nbconvertなどの関数を利用し、text -> notebook形式 -> html　へ変換していく
    - jinja2: template.tplをいくつか読み込む際に使用
    - toc2.tpl, full.tpl...: などのjupyternotebookを起動する際に、jinja2が読み込んでいるいろいろなtemplate

- 具体的な中身は気が向いたら、追記予定
    - [git link](https://github.com/dai-a/ipynb2html-EXE/)


# 効果・結論
- いまのところまともに動作していて、５秒でhtml化された便利
- 残課題
    - ファイルサイズが大きく（50MBくらい）ありhddを圧迫する。
    - 処理時間が長い。できれば0.5秒くらいでhtml化まで終わってほしい。


# おまけ（はまったところ）
- テンプレート群をbatchfileの中に組み込むのに苦労した。<br>というのも、以下のtemplate　fileをpyinstallerが認識してくれなかったから。 textからhtmlへ変換するjinja2にとって必須のファイルなんだけどーー
   - toc2.tpl
   - full.tpl
   - nbextensions.tpl
   - mathjax.tpl
   - celltags.tpl<br>

- ↑の解決策として、.tplをハードコーディングして、stringとして読みむためのファイルを作った。（data_tpl.py） .pyfileだとpyinstallerは勝手に認識してくれるみたい。
- あとは、stringで読み込んだtemplateをjinja2.dictLoaderで変換してあげれば、勝手にjinja2の継承（{%- extends 'hogehoge.html' %}）などもよしなにやってくれというわけなのだー
Premiere cc 2019 重大なエラー

#立ち上げども立ち上げども
「重大なエラーが発生したので、Adobe premiere Pro CCを終了する必要があります」
<img width="581" alt="スクリーンショット 2020-02-10 10.19.48.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/597fa165-afe2-50b6-31ea-f435f8ed2a66.jpeg">


#レンダラーの設定のせいだった
「Metal」→「OpenCL」に変更したらなおった！👏
なにかできなくなったり、
変なノイズがでたりしたらレンダラーをとりあえず疑ってみろということなのですね…
<img width="715" alt="スクリーンショット 2020-02-10 11.44.04.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/167a56fd-3c9f-a7f1-0589-f1a7a9089080.jpeg">

他の人の設定が気になる。。。
MySQLのSQLモードの確認とDBのユーザ設定の確認時のコマンド

よく忘れがちなコマンドのメモ。

## SQLモードの確認
```
mysql> select @@global.sql_mode \G
*************************** 1. row ***************************
@@global.sql_mode: NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)
```

## Hostとユーザ設定の確認
```
mysql> select host, user from mysql.user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | dev01         |
| %         | dev02         |
| localhost | development   |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
6 rows in set (0.00 sec)
```

## ユーザの権限確認

```
mysql> SHOW GRANTS FOR 'development'@"%";
```
spodbugsでエラーを無視する方法

[spodbugs](https://github.com/spotbugs/spotbugs)は、潜在的なバグを検知するための、非常に有効なツールですが、その自信がバグを抱えていることもあります。

例えば、`Kotlin`の`map`には対応していなくて、チェックをかけるとやたら下記エラーを出してきます。
`BC: 抽象コレクションへの疑わしいキャスト`
`BC_BAD_CAST_TO_ABSTRACT_COLLECTION`

ちなみにこのバグは[spotbugsにissue](https://github.com/spotbugs/spotbugs/issues/573)が発行されていますが、長い間放置されています。

もちろん、KotlinのソースをJava風に書いてエラーを回避することも可能ですが、せっかくなのでできればKotlin風に書きたいですよね。

このように、明らかにspotbugsのバグの場合は、spodbugsの設定を変えることで、そのエラーを無視することができます。

```

  <Match>
    <Class name="~.*\.*"/>
      <Bug pattern="BC_BAD_CAST_TO_ABSTRACT_COLLECTION"/>
  </Match>
```
Animation・Animator　メモ

全然知識がアップデートされてないのでメモ

■Animatorがアタッチされているゲームオブジェクトは、
　アクティブになっていると(厳密にはオブジェクトのアクティブ＋Animatorスクリプトのenabled=trueのような気がする)
　自動的に再生される。

　下記のように、必ず遷移先を逃がさないとenabled=trueとenabled=false を切り替えても２回目以降のアニメーションが
　再生されない。（ちょっと調べたけどわからん）
　![animationPauseState.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17904/9100891d-df94-3c4c-b2f0-500cfa1de759.png)

---------------
できた。下記の方のようにPlayメソッドに再生位置を指定してやればいける。

```
XXXXX.enabled = true;
XXXXX.Play("DialogEnd",0,0.0f);

```


URLもう1回再生
https://spphire9.wordpress.com/2015/02/13/unityでアニメーションをもう一度再生する/

下記のアニメーター構成でも動作する。
![animationReplay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17904/54b66dde-13fb-c7b0-d541-6f69359320dd.png)





■AnimationのLoop Timeはチェックがついているとループアニメーションになって、再生され続ける。

　●アニメーションクリップ
　　参考URL
　　https://docs.unity3d.com/jp/460/Manual/class-AnimationClip.html

■スクリプトのメソッドを呼びたければ、時間の下あたりで右クリックすると
　「Add Animation Event」をクリックするとメソッドの選択プルダウンが表示されるので選ぶ。
　ボタンと違ってprivateメソッドでも呼べるっぽい


![animationトリガー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17904/31a4324e-dda0-74ab-8045-9d951316b37d.png)

■アニメーション止める
XXXXX.enabled = false;
Markdownを印刷する

html化にはqiita-markdownを使用。activesupportを前もって入れているのは、qiita-markdownのdependencyにactivesupportを要求するのがあり、最新のactivesupportはRuby 2.3にはインストールできないからである。
なおこのactivesupportはqiita-markdownのdevelopment dependencyと同じバージョン。

pdf化には、wkhtmltopdfを使いたかったが、先頭のfont-familyだけが使われるバグがあるようなので、google-chromeを使うしかなさそう。ヘッダを消去するためにmarginを調整。

```bash
if ! ruby -rqiita-markdown -e1 2>/dev/null; then
  sudo gem install -v 4.2.6 activesupport --no-ri
  # sudo gem install charlock_holmes --with-cxxflags=\'-Wno-reserved-user-defined-literal -std=c++11\'
  sudo gem install -v 0.27.0 qiita-markdown --no-ri
fi

dir=$(dirname "$(basename "$0")")
cd "$dir"
./md2html.rb src.md
google-chrome --headless  --disable-gpu --print-to-pdf=src.md.pdf src.md.html
```

CSSはdefault-theme.cssが使える模様。
https://github.com/increments/kobito-oss/blob/master/application/src/styles/default-theme.scss をコンパイルすることで取得できます。最短手順は以下。

```
brew install sass/sass/sass
script/build
cd application/src/styles
sass default-theme.scss > default-theme.css
```

本来ハイライトエンジンがhighlight.jsとpygments.rbで違うので、もろもろおかしくてもしかたないのだが、幸いmarkdown_content.scss部分がまあまあいい感じに効くらしい。

一応。https://pastebin.com/4fTAxbHa にもgz.b64を置いておきました。

```rb:md2html.rb
#!/usr/bin/ruby
#coding:utf-8

require 'qiita-markdown'

dir = File.dirname File.realpath __FILE__
if ARGV.empty?
  STDERR.puts 'generate.rb source.md'
  exit
end
mdfile = ARGV[0]

doc = File.read mdfile
processor = Qiita::Markdown::Processor.new hostname:'example.com'
parse_result = processor.(doc)
File.write mdfile+'.html',<<EOM
<html><head>
<link rel="stylesheet" href="default-theme.css" type="text/css"></link>
<style type="text/css">
<!--
@media print {
  @page {
    margin-top: 20px;
    margin-bottom: 20px;
  }
}
body {
  overflow: visible;
  word-break: break-all;
}
.highlight pre {
  width: 99%;
  white-space: pre-wrap;
}
.markdown-content .code-frame {
  background-color: #e8e8e8;
}
-->
</style>
</head><body>
<div class="markdown-content">
#{parse_result[:output].to_html}
</div>
</body></html>
EOM
```

## 追伸

OSX版KobitoのCSSが使いたくて[実験環境作ろうとした](https://qiita.com/cielavenir/items/e5ba835b8c6cf4cd3c68)が、そもそもハイライトエンジンが違うから無駄だったっていうね。悲惨。
【Vue.js】v-forで配列をn個ずつ描画する

## やりたいこと

![kiji.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408585/f729e65a-a0e9-7b1e-bad1-d90ebb3bb3be.jpeg)

このように、配列をn個(今回は3個)並べたら改行したい。
前提：配列はAPI等で受け取るデータで、何個来るかわからない。

v-forで描画するまでやってる記事は見かけなかったのでメモです。

## そのままv-for

```vue
<template>
  <div>
    <div v-for="(item, index) in array" :key="index">
      <li>{{ item }}</li>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      array: [
        'AMETHYST',
        'BLUE-SAPPHIRE',
        'CITRIN',
        'DIAMOND',
        ...
      ]
    }
  }
}
</script>
```

## 配列分割して3個ずつv-for

computedで配列を3個ずつに分割し、それをさらに配列に入れたものを作ります。
配列の中に配列を作るイメージ。

```js

computed: {
  groupedArray() {
    const base = this.array.length
    const split_cnt = 3       // 何個ずつに分割するか
    const grouped_array = []
    for (let i=0; i<Math.ceil(base/split_cnt); i++) {
      let multiple_cnt = i * split_cnt  // 3の倍数
      // (i * 3)番目から(i * 3 + 3)番目まで取得
      let result = this.array.slice(multiple_cnt, multiple_cnt + split_cnt) 
      grouped_array.push(result)
    }
    return grouped_array
    // [
    //   ["AMETHYST", "BLUE-SAPPHIRE", "CITRIN"],
    //   ["DIAMOND", "EMERALD", "FIRE-OPAL"], ...
    // ]
  }
}
```

外側の配列でv-forし、その中で内側の配列をv-forします（伝われ）。

```vue
<div v-for="(items, index) in groupedArray" :key="index">
  <li v-for="(item, index) in items" :key="index">
    {{ item }}
  </li>
</div>
```

おわり。

## さいごに

画像をサムネイル表示するときに使いました。
みなさまのご参考になれば幸いです。

## 参考記事
[配列をn個ずつの配列に分割して、それをまとめた配列を作る](https://unformedbuilding.com/articles/javascript-array-practice-1/)
SMARTSで鎖の末端の炭素のみ反応させてみる

#はじめに
[RDKitで反応パターンをSMARTSで定義し反応物を生成する](https://qiita.com/kimisyo/items/1b4897f060a4944265c7)では、炭素原子の水酸化反応を例にSMARTSによる反応をRDKitでやってみた。しかし、全ての炭素原子を水酸化させたいケースは現実的ではない。そこで今回はより細かい条件をSAMRTSで指定してみた。具体的には、鎖の末端のメチル基を指定し、そこだけ水酸化してみた。

#方法

前回、以下のようなSMARTSを書いた。

```
[C:1]>>[C:1][OH]
```

しかしこれでは任意の炭素原子に反応してしまう。今回は鎖の末端のメチル基のみ酸化させたい。末端のメチル基は、水素原子が3つついているはずだから、以下のようにルールを変えてみる。

```
'[CH3:1]>>[CH2:1]-[OH]'
```

やってみよう。今回テストするのは前回とおなじ化合物である。前回は4つ反応物が生成されたが、今回は2つある末端のメチル基のみの反応物が生成されるはずだ。

![reactant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/f8aacbf2-e9b2-1234-4f0d-7d8c169f52ef.png)

やってみると生成された反応物は2つ。見てみよう。

1つ目。末端のメチル基が反応している。
![metablite_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/6837aedc-113b-041f-037d-5979845801fd.png)

2つ目。もう一つの末端のメチル基が反応している。予想通りである。

![metablite_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/5011d4c8-fba6-bc08-c5ad-00bfeeeacef9.png)

ちなみに、鎖の中間にある水素原子が2つ結合してる2つの炭素原子のみを反応させるSMARTSは以下の通りとなる。

```
'[CH2:1]>>[CH1:1]-[OH]'
```

#ソース
最後に画像生成も含むソースの全体を掲載する。

```python
from rdkit.Chem import AllChem
from rdkit.Chem.Draw import rdMolDraw2D
from io import BytesIO
from cairosvg import svg2png
from IPython.display import SVG
from rdkit import Chem

# 参考(rdkit-smarts)https://magattaca.hatenablog.com/entry/2019/02/10/194853
# 参考(smarts) https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5515729/table/Tab1/?report=objectonly
# https://sourceforge.net/p/rdkit/mailman/message/36294482/

def generate_image(mol, size, path, name):
    image_data = BytesIO()
    view = rdMolDraw2D.MolDraw2DSVG(size[0], size[1])
    tm = rdMolDraw2D.PrepareMolForDrawing(mol)
    view.DrawMolecule(tm)
    view.FinishDrawing()
    svg = view.GetDrawingText()
    SVG(svg.replace('svg:', ''))
    print(path + "/" + name)
    try:
        svg2png(bytestring=svg, write_to=path + "/" + name + ".png")
    except:
        print("errro")
        pass


def main():
    reactant_1 = Chem.MolFromSmiles('COc2ccc1cccc(CCNC(C)=O)c1c2')
    generate_image(reactant_1, (300, 300), "./tmp", "reactant")

    #reaction_pattern = '[CH3:1]>>[CH2:1]-[OH]'
    reaction_pattern = '[CH3:1]>>[CH2:1]-[OH]'
    rxn = AllChem.ReactionFromSmarts(reaction_pattern)
    x = rxn.RunReactants([reactant_1])
    for i, mol in enumerate(x):
        print(mol[0])
        try:
            Chem.SanitizeMol(mol[0])
            generate_image(mol[0], (300, 300), "./tmp", "metablite_{0}".format(i))
        except:
            print("Error")
            print(Chem.MolToMolBlock(mol[0]))

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

#おわりに
- 厳密には電荷等も考慮しないといけないかもしれない。化学的にはシロートなのでよくわからず。
- 今後の課題として反応部位が分かっている時に、その部位のみ反応させてみたい。また、SMARTSとは関係ないかもしれないが、反応のされやすさを評価してみたい。
- 応用として、SMARTSで反応テンプレート群を定義し、そこから生成された反応物を使って、https://www.frontiersin.org/articles/10.3389/fphar.2019.01586/full
のようなDeepLearningによる反応予測してみても面白そうではある。
VSCodeで「Command(⌘) + _ 」を押したら画面全体の文字が小さくなってちょっと焦った(Mac)

#内容
本文まま。
ミスタイプで打ち込んだら画面全体の文字サイズが小さくなり、検索してもそれらしいのが出てこなかったので一応残しておきます。

#結論
「Command(⌘) + Shift + +」で拡大できました

#試したこと
「Command(⌘) + Shift + P」でコマンドパレットを開き、「font zoom」（エディタの拡大)を実行
=>サイドバーは小さいままで作業中のファイルのフォントサイズのみ拡大
【React v16.8 FunctionComponent + TypeScript】コンポーネント作成のド基礎

react超初心者用です。
現場でReact v16.8からのFunctionComponent型（今後FCと呼びます）を使用する機会があったのでメモ程度にド基礎をまとめました。
間違っているところがあればご指摘いただけると幸いです！！
超簡単なプロフィールを表示するコンポーネントでまとめます。

#全体

```tsx
import React from 'react'

interface PersonProps {
  name: string,
  age?: number,
  agree?: Function,
}

const Person: React.FC<PersonProps> = props => {
  const {
    name,
    age,
  } = props

  const agree = () => {
    console.log(`${name}は${age}才です`)
  }

  return (
    <React.Fragment>
      <span>name : {name}</span><br />
      <span>age : {age}</span><br />
      <button onClick={agree}>agree</button>
    </React.Fragment>
  );
}

export default Person

```

順を追って説明します。

##必要モジュールのインポート
必要なのはReactのみなのでReactをインポートします。


```tsx
import React from 'react'
```

##プロパティやメゾットの定義
```tsx
interface ParsonProps {
  name: string,
  age?: number,
}
```
interfaceを使ってプロパティやメゾットの型の定義をしていきます。
```interface 名前```で定義できます。

```プロパティorメゾット: 型```で使用する型を決められます。
親からpropsで渡ってくる時、ここに記述している型以外の型の場合と、空の場合は、TypeScriptがエラーを知らせてくれます。
```age?: number```の『?』は省略可能という意味で、プロパティを使用しない場合にはundifindeが入ります。
空になる可能性のあるプロパティ、メゾットにはつけてあげるといいでしょう。

interfaceはtypeでも**ほぼ**同じことができるそうです。
違いについて知りたい方は[TypeScriptのInterfaceとTypeの比較](https://qiita.com/tkrkt/items/d01b96363e58a7df830e)
という記事が参考になったので是非

##コンポーネント作成

```tsx
const Person: React.FC<PersonProps> = props => {
  const {
    name,
    age,
  } = props

  const agree = () => {
    console.log(`${name}は${age}才です`)
  }

  return (
    <React.Fragment>
      <span>name : {name}</span><br />
      <span>age : {age}</span><br />
      <button onClick={agree}>agree</button>
    </React.Fragment>
  );
}
```
分けて見ていきます。
###Personというコンポネントを作る宣言

```tsx
const Person: React.FC<PersonProps> = props => {}
```
型にReactFC型を用いてあげて、ジェネリクスに上記で作成したinterfaceを指定してあげます。
ジェネリクスを用いることによってinterface内に複数、型があってもまとめて記述できます。
そしてpropsを引数に渡してあげます。
これによって、コンポネント内で```props.xxx```すると呼び出せます。
###propsの扱いと関数
```tsx
const {
    name,
    age,
  } = props

  const agree = () => {
    console.log(`${name}は${age}才です`)
  }
```
>コンポネント内で```props.xxx```すると呼び出せます。

と書きましたが、propsは僕はまず分裂代入してから使います。
propsの中身をそれぞれname,ageに代入しなおしてあげます。
これによってagree関数を見ると、```props.```の記述が不要になることがわかります。
**nameもageもagree()もinterfaceで型定義してあげたから使用できる**という点が大切かと思います。

###render、エクスポート
```tsx
return (
    <React.Fragment>
      <span>name : {name}</span><br />
      <span>age : {age}</span><br />
      <button onClick={agree}>agree</button>
    </React.Fragment>
  );
export default Person
```

レンダリングのところは通常どおりです。

##親で使ってみる

```tsx
import Person from '../Person'

<Person
  name="jon"
  age={12}
/>
```
親で使用時に注意なのが、name,ageには決められた型以外が入るとエラーになる点です。
これもTypeScriptの機能です。
ageは省略可能にしてあるので、プロパティの記述がなくてもエラーになりません。

![スクリーンショット 2020-02-10 10.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155363/7a406cd0-623c-1bd2-975f-73dcc72d60ce.png)
こんな感じででてきて、ボタンを押すとconsoleに『jonは12才です』とでます
##まとめ
最初にFC+TypeScriptで書かれてるのをみたときなんじゃこりゃと思いましたが、一つ一つ勉強していくと世界がかわりました。
これがプログラミングのいいところだなと思って嬉しく思ってます。
よんでいただきありがとうございました。
修正点、改善点ございましたらお待ちしています。
Pythonについての学習メモ

#自己紹介
趣味でPythonをいじっている大学一年生です。
特に話すことがないのでこれで紹介は終わり。
休日に勉強したこと、大学の講義で勉強したことを主に記録していきます。
基本的に書籍を使って勉強しています。
##使用PC、Pythonのバージョン、環境
MacBook Pro (Retina, 13-inch, Late2013)
Python 3.7.3
Jupyter notebook(使いがち/起動までが遅い)
VS code(たまに使う/使いやすい)
Google Colaboratory(書籍で使用していたので使用/起動までが楽)
ターミナル
##現在所持している書籍
[いちばんやさしいパイソンの本Pythonスタートブック[増強改訂版]](https://honto.jp/netstore/pd-book_28912467.html)
[退屈なことはPythonにやらせよう](https://honto.jp/netstore/pd-book_28393889.html)
[Python言語の基本から仕事のやり方まで　独学プログラマー](https://honto.jp/netstore/pd-book_28926695.html)
[Pythonクローリング&スクレイピング データ収集・解析のための実践開発ガイド](https://honto.jp/netstore/pd-book_29738545.html)
[Pythonでつくるゲーム開発入門講座](https://honto.jp/netstore/pd-book_29767040.html)
[今すぐ試したい！機械学習・深層学習　画像認識プログラミングレシピ](https://honto.jp/netstore/pd-book_29727443.html)

##最後に
次の記事からPythonの文法、Numpy、sympyなどのコードをメモしていきます。
間違っていることもあると思うのでそのときはコメントお願いします。
暇な時にでもふらっと見にきてみてください。
(Twitterもやっていますがフォローはオススメしません。)
WSLにPysparkをインストール

#### 目的
Win10のWSL(Ubuntu)にpysparkをpipでインストールする。

#### 環境
|Software        |       Version|
|:-----------------|:-------------------------------|
| OS             |              Windows 10 Pro |
|WSL| Ubuntu 18.04.3 LTS|

### 1. JDK 8をインストール

```
$ sudo apt install openjdk-8-jre-headless
(インストールされる)
$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-8u242-b08-0ubuntu3~18.04-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
```

### 2. pipでpysparkをインストール

```
$ python3 -m pip install pyspark
```

### 3. Pysparkを起動

```
$ export PYSPARK_PYTHON=python3
$ export SPARK_HOME=~/.local/lib/python3.6/site-packages/pyspark
$ export PATH=$PATH:$SPARK_HOME/bin
$ pyspark
Python 3.6.9 (default, Nov  7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
20/02/10 01:22:47 WARN Utils: Your hostname, DESKTOP-VOJ1TQH resolves to a loopback address: 127.0.1.1; using 192.168.181.17 instead (on interface eth1)
20/02/10 01:22:47 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
20/02/10 01:22:47 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.5
      /_/

Using Python version 3.6.9 (default, Nov  7 2019 10:44:02)
SparkSession available as 'spark'.
>>> 
```

### 4. .bashrcに追記しておく

```
# Pyspark
export PYSPARK_PYTHON=python3
export SPARK_HOME=~/.local/lib/python3.6/site-packages/pyspark
export PATH=$PATH:$SPARK_HOME/bin

$ . ~/.bashrc
```
【RasPi4入門】環境構築；Pintaでペイント♪

RasPi4で日本語記事がかけるようになったので、画像処理もやろう。
ググってみると、以下の参考があったので試してみました。
【参考】
・[Ubuntuで簡易画像編集するツール「Pinta」](http://jsstudy.hatenablog.com/entry/Pinta_simple-image-editor-for-Ubuntu)
この記事にしたがって、インストールします。
※この記事には肝心な使い方がありませんのでメモにしておきます

```
$ sudo apt-get install pinta
```
まんまインストール出来ました。
利用の仕方は、以下のとおり
1.起動
![run_pinta.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/6664b925-b422-efe2-763f-075574f0e525.jpeg)
2.スクリーンショット保存
[昨日の記事](https://qiita.com/MuAuan/items/e4e3699cabff49752a5a)より

```
$ scrot -d 5
```
3.pintaで領域選択
選択方法は左上から以下４種類あります。
四角形選択
なげなわ選択
楕円選択
魔法の杖；クリックした箇所の類似色領域を選択範囲とします
以下は、四角形選択した状態の絵です。
![pinta_selectArea2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/8b0157e6-d81d-b3ca-1bd8-aeeffa9cb256.jpeg)
4.編集→コピー
5.ファイル→新規
6.編集→貼り付け
7.ファイル→名前をつけて保存
こうして、上記のような画像が得られました。

これで、日本語入力とペイント出来るようになって便利になった。
**たまにpintaが落ちるけど。。。メモリー不足かな**
当たり前の手順も書くべし

言わずもがなだけど、あえて言語化しておくシリーズです。

このような手順を書くのは冗長だと思ったことはありませんか？

```
# パッケージのコンパイル

以下のコマンドを実行してデプロイしてください

> mvn deploy
```

（※`mvn`はMavenというJava用プロジェクト管理ツールのコマンドです。他言語の人は適当に読み替えてください）

もちろん、本番作業手順書などの厳格な文書なら当然書くでしょう。でも、GitレポジトリのREADMEのような内輪のドキュメントでは・・・:

- どのアプリでも Maven を使っていれば `mvn deploy` でコンパイルするに決まっている
- Maven を使っていることはファイル構成から一目瞭然
- うちのチームに `mvn deploy` を知らないプログラマーはいない（知らねえ奴はモグリだ！）

だから、**あえて `mvn deploy` 以外の方法を取る場合のみREADMEに書いた方が経済的だ**と思ったことはありませんか？私はあります。

でも、**やっぱり、当たり前の手順であっても、READMEに明示した方がいいと思います**。理由は二つあります。

一つ目の理由は「本当にあえて省略したのか」が、読み手には分からないことです。**実は重要な手順があるのにリリースを急いでいてうっかり書き忘れてしまった**と誤解されるかも知れません。

もう一つの理由は現在の常識が、**将来も常識である保証がない**ことです。実際、今は新しいツールが普及しており、`mvn`経験が無い Java プログラマーも多いでしょう。

もちろん、読み手が優秀なプログラマーならば「きっと`mvn deploy`でデプロイするんだろうな」と**推測**はしてくれるでしょう。しかし、**確信を持つには至りません**。「多分そうだろうけど万が一・・・」という疑念を払うために、3分、5分、ことによると１時間費やすかも知れません。

一方で、READMEに「`mvn deploy`でデプロイしてください」と書くのは10秒ぐらいしかかかりません。

自分の現在の10秒を節約するよりは、他人の未来の１時間を節約する方が、合理的と言えるでしょう。
Numpy で画像マスクを作るときは型に気をつける

# やりたいこと
画像や動画の一部以外を黒く塗りつぶして切り抜きたい場合、画像のマスクを作成して、それを重ね合わせることで実現する。

元画像
![lena.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571224/eb9d4967-e0ca-6249-fe59-40b8e8ae939b.png "元画像")
マスク済み画像
![masked_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571224/9b76bafb-5f87-cd22-4f14-aae7634d688f.png "マスク済み画像")

# 失敗
Numpy を使って黒塗りしたい範囲は 0、切り抜きたい範囲は 1 とするマスクを作成。
行列の各要素をかけるとマスクできると思ったら、思ってたのと違う出力になった。

```python
h_img, w_img = img.shape[:2]
mask = np.zeros((h_img, w_img, 3))
radius = int(h_img / 2)
center = radius
cv2.circle(mask, (center, center), radius, (1, 1, 1), thickness=-1, shift=0)
masked_img = img * mask
```

Numpy で作ったマスク (mask)
![err_mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571224/503dc489-00f9-f98a-e0b2-c473de877dc2.png)

マスク済み画像 (masked_img)
![err_masked_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571224/5c87b060-8c57-4eee-aff8-e2ca820ca4d3.png)

# 原因と解決策
Numpy で行列を定義するとき、 dtype を指定しないとデフォルトでは float64 型になる。一方で、opencv の imread で読み込んだ画像は、その輝度によって、CV_8U や CV_16F、 CV_32F で読み込まれる（通常は CV_8U）。 CV_8U だと Numpy のデータ型では np.uint8 に対応している。
つまり、失敗した例では CV_8U の画像に対して、 float64 型のマスクをかけている。

Numpy で行列を定義するときに、型を np.uint8 に指定してやる。
できた。

```python
mask = np.zeros((h_img, w_img, 3), dtype=np.uint8) # 型を uint8 に指定
```

マスク済み画像
![masked_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571224/045ae456-07e9-d703-f7a9-fd25f006e5b1.png)

マスクを画像として表示してみると、真っ黒。
![mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571224/7dbca21f-bb2a-4896-aa75-1aaefc26fc37.png)

# 所感
データ型の不一致という初歩的なミスだが、最近 python ばかり使っていて、型を意識する機会が減っているせいか、気がつくのに時間がかかった。
そもそも、 np.zeros で定義せずに、np.zeros_like を使って image の型含めて行列定義すればよかった。
Numpy > Masked array > マスクの部分を999999で置換する > numpy.ma.MaskedArray.filled() | fill_value引数指定の値で置換する

### 概要

- マスクされた要素('--')を持つarrayがある
- 後続の処理のためにマスクを数値に置換したい

### 参考

- [numpy.ma.MaskedArray.filled()](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.MaskedArray.filled.html)

### 実装1

https://ideone.com/aRMWr8

```py
    import numpy as np
    import numpy.ma as ma
     
    # checked with PEP8
     
    MASKED_VALUE = -32768
    SIZE_X = 3
    SIZE_Y = 3
     
    # 1. data preparation
    ncep = np.array([[3, 1, 4], [1, 5, 9], [2, 6, 5]])
    oisst_unmask = np.array([[2, 7, 1], [8, 2, 8], [1, 8, 2]])
    masks = np.array([[1, 0, 1], [1, 0, 1], [1, 0, 1]])
    oisst_masked = ma.masked_where(masks, oisst_unmask)
    print(oisst_masked)
    oisst_unmasked = oisst_masked.filled()
    print(oisst_unmasked)

```

下記のように置換できた。999999という値になる。

```
[[-- 7 --]
 [-- 2 --]
 [-- 8 --]]
[[999999      7 999999]
 [999999      2 999999]
 [999999      8 999999]]
```

### 実装2

fill_value指定の例。

https://ideone.com/IsWrgT

```py
import numpy as np
import numpy.ma as ma

# checked with PEP8

MASKED_VALUE = -32768
SIZE_X = 3
SIZE_Y = 3

# 1. data preparation
ncep = np.array([[3, 1, 4], [1, 5, 9], [2, 6, 5]])
oisst_unmask = np.array([[2, 7, 1], [8, 2, 8], [1, 8, 2]])
masks = np.array([[1, 0, 1], [1, 0, 1], [1, 0, 1]])
oisst_masked = ma.masked_where(masks, oisst_unmask)
print(oisst_masked)
oisst_unmasked = oisst_masked.filled(fill_value=MASKED_VALUE)
print(oisst_unmasked)
```

```
[[-- 7 --]
 [-- 2 --]
 [-- 8 --]]
[[-32768      7 -32768]
 [-32768      2 -32768]
 [-32768      8 -32768]]
```

### 関連

- [Numpy > Masked array > マスクされた箇所に別のarrayの要素を入れる](https://qiita.com/7of9/items/b451fac8e7d762597d78)
SQL 基礎用語&文法　3

#はじめに
[SQL 基礎用語＆文法 2 はコチラをクリック願います。](https://qiita.com/raigakun/items/4035bcfb9b07fbe9d6e8)
SQLを学んでいく上で、用語等を中心に整理していきます。
ターミナルにて入力する。もしくはSequelProのクエリにて入力するようにしております。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

#検索する編　ちょっと応用

- SequelProにて行います。
- テーブルにデータが入っていることを想定する。

##カラムの統合（複数の文字列を連結する。）
####CONCAT関数
- 複数の文字列を連結する。
- 文字列にNULLがあれば結果はNULLとなる。
- SELECT句の中で用いる。

```sql
-- 式
CONCAT(文字列1, 文字列2, ...)   

-- 実践してみます。
SELECT CONCAT(family_name, first_name)
FROM users

-- 結果
family_name, first_nameが統合されたカラムが検索できます。
```

##検索結果のカラム名を変更する。
####AS句

- 別名が検索結果カラム名となる。
- ASは省略可能。

```sql
-- 式
SELECT 取得するデータ AS 別名

-- 実践してみます。
SELECT CONCAT(family_name, first_name) AS "名前"
FROM users

-- 結果
family_name, first_nameが統合されたカラムが"名前"というカラムになります。
```
##重複する行を除外する。
####DISTINCTキーワード
指定したカラムの値が重複する行を除外してデータを取得する。

```sql
-- 式
SELECT DISTINCT カラム名

-- 例
SELECT DISTINCT カラム
FROM テーブル
WHERE 条件
```

##レコードのグループ化を行う。
####GROUP BY句

- 指定したカラムが同じ値をもつデータを1つのグループとしてまとめることができる。
- そのグループ単位で集計した結果を取得することができるという利点がある。

```sql
-- 式
GROUP BY カラム名

-- 例
SELECT カラム名
FROM テーブル名
WHERE 条件
GROUP BY カラム名
  　
```

##レコードの数を数える。
####COUNT関数
- グループ化されたデータに対して使用可能な集計関数の1つ。
- カラムを指定して使用することで、そのカラムがNULLではないデータの行数を取得できる。
- カラムを*(ワイルドカード)にすることで、行の値がNULLであるレコードも含めて、その行数を取得できる。
- 他の集計関数 
   -  平均を求める　AVG
   -  最大値を求める　MAX
   -  最小値を求める　Min

```sql
-- 式
SELECT COUNT(カラム名)　　

-- 実践してみます。
SELECT カラム名, COUNT(*)
FROM テーブル名
WHERE 条件
GROUP BY カラム名
```

#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
Ruby　コーティング規約について　命名規則編　1

# はじめに
[レイアウト編 3 はこちらをクリック願います。過去記事リンクあり。](https://qiita.com/raigakun/items/7416db5b4d70ea93046e)
[構文編 2 はこちらをクリック願います。過去記事リンクあり。](https://qiita.com/raigakun/items/80ba30671d7b2b18c44e)
Rubyの基礎を学習中の方に向けて記載致します。
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。

#命名規則について
① シンボル、メソッド、変数には**snake_case**を使う。

```qiita.rb
# 悪い例
:'some symbol'
:SomeSymbol
:someSymbol

someVar = 3

def someMethod
  # 処理

end

def SomeMethod
  # 処理
end


# 良い例
:some_symbol

some_var = 3

def some_method
  # 処理
end
```

② クラスやモジュールにはCamelCaseを使う。

```ruby:qiita.rb
# 悪い例
class Someclass
  # 処理
end

class Some_Class
  # 処理
end

class SomeXml
  # 処理
end

class XmlSomething
  # 処理
end



# 良い例
class SomeClass
  # 処理
end

class SomeXML
  # 処理
end

class XMLSomething
  # 処理
end
```


③ ファイル名にはsnake_caseを使う。例）hello_qiita.rb

④ ディレクトリ名にはsnake_caseを使う。例）Add/hello_qiita.rb
　　→　早速、GitHubで使ってみます。


#さいごに
毎日更新します。
皆様の復習等にご活用頂けますと幸いです。
【図解】IPythonとJupyterの関係を簡単に図解してみた

# 疑問：IPythonとJupyterにはどういう関係があるのか？
JupyterのドキュメントやStackOverflowの質問などを見ているとよくIPythonが出てきます。

IPythonとJupyterの関係ってどういう関係なのか？と気になったので少し調べてみました。

そしてせっかくなので、最近見つけたオンラインホワイトボード https://miro.com/ を使って図解してみます。

# 注意
正直、細かいところは結構間違っていると思います。なので、IPythonとJupyterの関係性ってこういうイメージなのね、ってくらいの参考にしてください。

「それにしてもこれはあきらかに間違ってるでしょう・・・」っていうのがありましたら教えていただけると幸いです。

では、IPythonとJupyterのつながりを見ていきます。

# 1. もともとはIPythonしかなかった
はじめはIPythonしかありませんでした。
よく僕らが思い浮かべる↓のようなセルとかUIのnotebook機能はすべてIPythonが提供していました。これがIPython3.Xまで続きます。

![jupyterpreview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341549/a472641c-a14a-fccc-0d66-3d31d8fd7c37.png)

無理やり図解している感はありますが図解するとこんな感じです。
![ipython 3.X.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341549/8567bf10-637e-87ef-3971-5589108dabd9.jpeg)

また余談ですが、ipython CLI(ipythonコマンド)もIPythonが提供していました。

![ipython 3.X (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341549/d65b4ef4-f151-14c3-32e2-15d00fb438e7.jpeg)

これが変わるのがIPython 4からです。

# 2. notebook部分がIPythonから分かれる
IPython 4 からはCLIを提供するだけとなります。
![Copy of ipython 4.X.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341549/c960591a-fa4b-dae1-1424-093f57207944.jpeg)
そしてnotebook部分を担うJupyterができます。
![Copy of ipython 4.X (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341549/a352e9e8-b5e0-96bc-c2c5-da13e39982e1.jpeg)
「え、じゃぁ、IPythonとJupyterって今はなんの関係もないの？」
かというとそうではなく、Pythonを処理する部分は共通モジュールがあります。ipykernelと言われています。

これを確認できるのが、例えば、`pip install ipython`とか`pip install jupyter`とかしたあとに、`pip show ipython`や`pip show jupyter`で見てみると、どちらもipykernelに依存していることがわかります。興味があれば実行してみてください。
![Copy of ipython 4.X (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341549/69d334ce-dec9-84db-d205-2ff6b18330ad.jpeg)

# まとめ
簡単に見てきましたがここまでをまとめると、
- もともとはIPythonがnotebook機能を提供していた
- notebook部分を切り離してできたのがJupyter
- 処理部分はipykernelというモジュールがあり、IPythonもJupyterも共通で使っている
となります。
mysqldump について

mysqldump について個人的なメモをまとめておきます :robot:

## 日本語の公式ドキュメントが 5.6 のバージョンで止まっている

日本語の方はすべて 5.6 にリダイレクトされてしまいます :cry:
https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html

英語の方はすべてのバージョンを確認できます！
https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
https://dev.mysql.com/doc/refman/5.6/en/mysqldump.html

## 基本的な呼び出し構文

```shell
# DB、 DB の Tables
mysqldump [options] db_name [tbl_name ...]

# 複数の DB
mysqldump [options] --databases db_name ...

# すべての DB
mysqldump [options] --all-databases
```

## よく使うコマンド

基本的に DB ユーザーの見れる範囲のバックアップをとることが多いのかなぁ
なんて思ってるので --all-databases にしてます :sunglasses:
※ MySQL 5.7 以降はデフォルトで InnoDB が選択されているため、他の DB エンジンのことは考慮してません。

```shell
mysqldump -h ${HOST_NAME} -P ${PORT} -u${USER_NAME} -p${USER_PASSWORD} --skip-lock-tables --single-transaction --all-databases > ${OUTPUT_FILE}
```

## デフォルトで --opt が有効になっている

このオプションは、複数のオプションを組み合わせた省略形です。
高速なダンプ操作ができるようになっています。もし無効にしたい場合は、--skip-opt を指定します。
下記は組み合わせられているオプションたちです。

オプション名 | 説明
--- | ---
--add-drop-table | 各 CREATE TABLE の前に DROP TABLE を書く。
--add-locks | LOCK TABLES と UNLOCK TABLES で各テーブルダンプを囲む。これによって、インサートが高速化される。
--create-options | CREATE TABLE にすべての MySQL 固有のテーブルオプションを含める。
--disable-keys | 各テーブルで、INSERT を ENABLE KEYS と DISABLE KEYS で囲む。これにより、すべての行が挿入された後にインデックスが作成されるため、ダンプファイルの読み込みが高速になる。
--extended-insert | 複数行の INSERT 構文 VALUES を利用して、ダンプファイルが小さくなり、ファイルのリロード時のインサートが高速化される。
--lock-tables | 各 DB で、 ダンプされる前にすべてのテーブルをロックする。InnoDB などのトランザクションが使えるものでは --single-transaction の方が優秀。それぞれの DB のテーブルごとにロックするため、一貫性が保証されない(異なる DB の場合はさらに)。無効にしたい場合、--skip-lock-tables を追加する。
--quick | 大きなテーブルのダンプに役立つ。record 全体を取得してメモリにバッファリングしてから書き出すのではなく、サーバーからテーブルの行を一度に1行ずつ取得するようにmysqldumpを強制する。
--set-charset | default_character_set を出力に書き込む。無効にしたい場合、--skip-set-charset を追加する。

## その他のよく使うオプション

オプション名 | 説明
--- | ---
--single-transaction | データをダンプする前に、トランザクション分離モードを REPEATABLE READ に設定し、START TRANSACTION SQL ステートメントをサーバーに送信する。MyISAM または MEMORY のテーブルでは一貫性が保証されないことには注意。
--skip-lock-tables | --lock-tables を無効にする。
--skip-opt | --opt を無効にする。
--flush-logs | ダンプを開始する前に MySQL サーバーのログファイルをフラッシュする。
--lock-all-tables | DB 内のテーブル全てをロックする。
--master-data | バイナリログファイルの名前と場所を追記する。自動的に --lock-tables が無効になり、--single-transaction が指定されてない場合は、--lock-all-tables が有効になる。
--no-data | テーブルの中身をダンプしない。定義のみダンプしたい時に指定する。
--no-create-db | CREATE DATABASE を入れない。
--no-create-info | CREATE TABLE を入れない。

## おわりに

他に何かご存知の方がいらっしゃったら
コメントなり編集リクエストなりで教えていただけると幸いです :relieved:
【絵文字】JavaScriptでサロゲートペアを含む文字列をHTML Entityに変換する

## HTML Entityへ変換

通常の文字列なら`charCodeAt`で解決できますが、[サロゲートペア](https://qiita.com/wingsys/items/81d46451d8b93ab065de)は文字が崩れてしまうので`codePointAt`を利用します。

```javascript
function convert(value) {
  return [...value].map((word) => {
    return `&#x${word.codePointAt(0).toString(16)};`;
  }).join('');
}
```

### Example

```javascript
const result = convert('😇')

console.log(result); // > &#x1f607;
```

```jsx
<p>こんにちは&#x1f607;</p>  // こんにちは😇
```

## HTML Entityから元に戻す

復元する場合は`String.fromCharCode`の代わりに`String.fromCodePoint`を利用します。

```javascript
function revert(str) {
  return str.replace(/&#(.*?);/g, (_, p1) => String.fromCodePoint(`0${p1}`));
}
```

### Example

```javascript
const result = revert('こんにちは&#x1f607;&#x1f607;&#x1f607;&#x1f607;');

console.log(result); // > こんにちは😇😇😇😇
```

## HTML Entityとは

> HTML エンティティとは、アンパサンド (&) で始まりセミコロン (;)で終わるテキスト (文字列) のひと固まりです。エンティティは（通常は HTML コードとして解釈される）予約済み文字や、(ノーブレークスペースのように) 見えない文字を表示するためによく使用されます。標準キーボードでは入力が難しい文字の代わりに使用することもできます。

https://developer.mozilla.org/ja/docs/Glossary/Entity より引用

## 何がうれしいの？

CMSなどにHTMLを直接入力できるような状況なら、CMSがサロゲートペアに対応していない場合でも絵文字を出力させることができるようになります。

## 参考文献

- [JavaScript における文字コードと「文字数」の数え方](https://blog.jxck.io/entries/2017-03-02/unicode-in-javascript.html)
- [サロゲートペアってなんでコワイの - Qiita](https://qiita.com/wingsys/items/81d46451d8b93ab065de)
Swift Package Managerでテストでしか使わないdependenciesの扱い方

Swift Package Managerを使ってライブラリをインストールしたりするときに、QuickやNimbleなどのテストでしか使わないのにclone&buildが始まってしまってビルド遅っ！と思うことがしばしばあります。

これはSwift Package Managerがdevとreleaseでdependenciesを別にするといったことができないことが主たる原因です。

[Forum](https://forums.swift.org/t/test-only-dependencies/3888)でもtest only dependenciesの要望はあがっていますが対応はされていません。 

## 対処方法

Swinjectでは[.Package.test.swift](https://github.com/Swinject/Swinject/blob/2.7.1/.Package.Test.swift)というファイルを用意して、こちらでのみQuick,Nimbleといったテストでのみ使うdependenciesを設定するようにしていました。

そして、テスト実行時に[このように](https://github.com/Swinject/Swinject/blob/2.7.1/.travis.yml#L18)Package.swiftに置き換えてテストを実行しています。

```shell

$ mv .Package.Test.swift Package.swift
$ swift build
$ swift test
```

Package.swiftと.Package.Test.swiftの両方をメンテしないといけないので、少し面倒ですが、現状はこうする他なさそうですね・・

## 参考
https://stackoverflow.com/questions/41401753/test-only-dependencies-when-using-the-swift-package-manager
【Salesforce】正規表現でメールのチェックをしてみよう！

タイトルの通りです！
Visualforce画面でメールを入力してレコードに保存した際にメール形式ではない場合、「無効なメールアドレスです！」と独自エラーが出てしまうので回避するため作成しました！

#正規表現を使用したメール形式チェック
```
List<String> mailList = new List<String>();
// 正常
mailList.add('abc.def@efg.com');
mailList.add('ABC.DEF@EFG.COM');
// 異常
mailList.add('メールだよ');
mailList.add('maildayo');

for(String mail : mailList){
    if(Pattern.matches('^[A-Z0-9._%+-/!#$%&\'*=?^_`{|}~]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$', mail.toUpperCase())){
        System.Debug('★★ 正常なメールアドレス ： ' + mail);
    }else{
        System.Debug('★★ 異常なメールアドレス ： ' + mail);
    }
}
```

#デバッグ
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/bb6c0a34-ded6-450e-8886-f2651854c2b7.png)

#参考にしたサイト様

[Stringクラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_string.htm)
→toUpperCaseメソッドを使用しています。

[Patternクラス](https://developer.salesforce.com/docs/atlas.ja-jp.222.0.apexcode.meta/apexcode/apex_classes_pattern_and_matcher_pattern_methods.htm#apex_System_Pattern_matches)
→matchesメソッドを使用しています。

[数式を作成してメールアドレスが有効な形式であることを確認する](https://help.salesforce.com/articleView?id=000329165&language=ja&type=1&mode=1)
→ほぼこちらに記載していた正規表現を使用しています。

[エスケープシーケンス](https://help.salesforce.com/articleView?id=bi_security_datasets_predicate_escapesequences.htm&type=5)
→上記の正規表現の場合、だとApexで使用できないので回避のため使用しています。
【Katalon Studio】ダークテーマ（黒背景）にする方法

# 動作確認環境

- macOS Catalina バージョン10.15.3
- Katalon Studio Enterprise 7.2.1

# 設定方法

1. 「Window」 → 「Themes」 → 「Dark」 を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/e4c300d2-989f-b1aa-63cb-e84ba63e100a.png)

2. 再起動していいかポップアップが表示されるので、「Yes」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/d8b98c69-2388-f5d5-9013-dc238e963e52.png)

# 参考文献

https://docs.katalon.com/katalon-studio/docs/katalon-studio-preferences.html#using-katalon-studio-in-dark-theme
とても個人的に多用するWindowsキーボードショートカットキー

# とても個人的に多用するWindowsキーボードショートカットキー

## Microsoft社のページ
とても親切な各OSバージョン毎のページがあります。
https://support.microsoft.com/ja-jp/help/12445/windows-keyboard-shortcuts

## 結局、覚えていて利用頻度が多いショートカットキー
前提としては、私がサーバ系インフラエンジニアってところですが。

| 組み合わせ       |       私の呼称 |    効果    |
|:-----------------|:------------------|:------------------|
| WindowsKey + R             | コマンドプロンプト | コマンドプロンプトを起動する。なお、非管理者モードの模様。  |
| WindowsKey + E             | エクスプローラー |エクスプローラーを開いてくれる。マジ便利。|
| WindowsKey + M             | やばい部長が来た！ |すべてのウインドウを最小化してくれる模様。|
| WindowsKey + D             | やばい課長が来た！ |Mより少しだけ早い。ウインドウサイズは維持してくれ、再度Dを押せば元に戻る。Mは最小化から最大化してくれない。|
| WindowsKey + L             | やばい社長が来た！ |画面ロック。|
| WindowsKey + I             | 設定 |設定パネルを開く。結構便利。WindowsKeyを押して、歯車マークを押すよりはマシ。|
| WindowsKey + Tab             | 指令部のモニター |展開されているウインドウのサムネイル表示みたいなもの。タスクビューと呼ばれるもの。その表示にする。|

コマンドプロンプトが多用してます。
もう、メニューから出す時なんて、そんなにないですね。
管理者を指定して実行の時くらいです。
さくらじまハウス2020 ~鹿児島のコミュニティ集まれ‼~

#”さくらじまハウス2020” に参加してきました🌋
2/6,7に、鹿児島で開催されたイベントに参加してきました。
その中のセッションの一つ
「鹿児島のエンジニアコミュニティ集まれ‼」
が面白かったのでまとめです(^^)/

#さくらじまハウスとは？
>「さくらじまハウス」は、「IT技術の可能性を信じるすべての方々」のためのイベントです。

>たえず最前線でご活躍されているゲストの刺激的なお話を体感し、チャレンジのきっかけを得ることができます。

>「さくらじまハウス2020」は、「エンジニアとしての生き方」がテーマです。
>特定の分野で活躍されている方やさまざまな働き方を実践されているゲストとのパネルディスカッションを通じて、エンジニ>アはもちろん、学生の方にも楽しんでいただけるイベントです。

イベントページ引用
https://www.sakurajima-house.tech/

#鹿児島のエンジニアコミュニティ集まれ‼
鹿児島でコミュニティ運営をされている5名によるセッションでした。

上釜 幸大[株式会社現場サポート/JAWS-UG鹿児島]
くすたん[ナガシゲタスク/鹿児島.mk]
鶴田 真由美[FLOW/Kagoshima WordPress Meetup]
古屋 保[鹿児島大学/K-Ruby]
政倉 智[かごんま.NET、かごべん、html5j 鹿児島、GitLab Meetup Kagoshima]

まとめると言いながら
今回の登壇者、上釜さんのブログで各コミュニティのリンク等紹介されていて、
そちらが非常にわかりやすいです。
http://kusokamayarou.hatenablog.com/

セッションの話の中で、運営の際に気を付けていらっしゃることも聞くことができました。
印象的だったのは

”内輪にならないようにすること、教室にならないようにすること”

参加者主体で行ったり、新規で参加しやすいコミュニティづくりを
考えていらっしゃったりするところがほとんどな印象でした＾＾

また、どのコミュニティに行ったらいいかわからないという声に対しては、
各コミュニティ同士の関わりがあるので
どこかに参加することで、色んなコミュニティを知る機会にもなったりするようです。

ちなみに開催情報の収集は、コミュニティ次第ですが
slack、twitter、facebook、compass等でできるそうです。
その辺も、最初に紹介した上釜さんのブログにわかりやすく書かれていました(^^)/

#感想
鹿児島のコミュニティは、知らなかっただけでたくさんありました。
どこのコミュニティも優しくしてくれそうな印象です。(飲み会もたくさんしてそうな感じだったり(笑))

コミュニティに参加すると、勉強にもなりますが刺激になったり、いい出会いがあったりするので、その辺が良さなのかなと個人的に思っています。
是非、参加したことのないものに参加してみたいと思います。
GitHubの公開鍵と秘密鍵上書きしちゃったから作り直した

 - こんな状況の人におすすめ
  - Gitのアカウント新しく作った
  - Git pushのコマンド打ったら "Permission denied" と言われた
  - Gitの公開鍵
 
 - 使うコマンド
  - ssh-keygen -t rsa
 
これ一つで↑公開鍵・秘密鍵が生成されます
 
#### 手順
てきとうに`GitBash hare`して↓コマンド実行

```
$ssh-keygen -t rsa
```
そうすると色々と言われます

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
ここですでに `C:\Users\ユーザー名\.ssh\id_rsa` があるとしたら

```
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): 
```
と言われたときにそのままエンター押すと`C:\Users\ユーザー名\.ssh\id_rsa` ここにそのまんま上書きするんで気を付けてください。
別の場所に鍵を作りたかったら

```
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): C:\Usres\hoge\key\id_rsa
```

こうすれば上書きされずにつけたい名前・パスで鍵が生成されます。
（絶対パスで書いたほうが安全かもしれない）
そしてGitに作った鍵を保存します。これすると勝手にコピー↓してくれます

```
$ clip < C:\Usres\hoge\key\id_rsa
```

Gitの`Setting`->`SSH and GHG keys`->右上の `New SSH key`に行ってください。ここですね↓
https://github.com/settings/ssh/new

Titleはなんでも大丈夫です
Keyのところに `Ctrl + V` すればさっきクリップボードで保存した鍵がペーストされます。
`Add SSH key`をプッシュして鍵の設定が完了。

めでたしめでたし・・・

備忘録
yarnが原因でdocker-compose up ができない  ( Your Yarn packages are out of date!)

`docker-compose up` すると、下記のエラーが発生。解決していきます。

```
web_1  | => Booting Puma
web_1  | => Rails 6.0.2.1 application starting in development
web_1  | => Run `rails server --help` for more startup options
warning Integrity check: System parameters don't match
error Integrity check failed
error Found 1 errors.
web_1  |
web_1  |
web_1  | ========================================
web_1  |   Your Yarn packages are out of date!
web_1  |   Please run `yarn install --check-files` to update.
web_1  | ========================================
web_1  |
web_1  |
web_1  | To disable this check, please change `check_yarn_integrity`
web_1  | to `false` in your webpacker config file (config/webpacker.yml).
web_1  |
web_1  |
web_1  | yarn check v1.21.1
web_1  | info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.
web_1  |
web_1  |
web_1  | Exiting
myapp_web_1 exited with code 1
```


## 原因

ローカルでyarnを最新にしていたから整合性が取れなくなったのかな。と考えています。
yarnのパッケージに古いものが含まれているので、アップグレードしてね！といった様子。
なので、

```
yarn upgrade
```

これで直るか！と思いましたが、エラー文は変わらず。


## 結論 check_yarn_integrity: false に変更する

先程のエラー文をもう一度眺める。

```
web_1  | To disable this check, please change `check_yarn_integrity`
web_1  | to `false` in your webpacker config file (config/webpacker.yml).
``` 

下記の様に変更。

```config/webpacker.yml
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: false
```

`check_yarn_integrity` については、
[webpacker の check_yarn_integrity オプションについて調べてみた](https://qiita.com/gotchane/items/0759c89382f5ce91d769)
が参考になります。

再度、 `docker-compose up` を実行すると、無事起動しました。
httpd への接続数をzabbixに記録する

サーバーが動いているのにも関わらず、webサイトの応答がなくなってしまう事があります。
アクセス数が急増した際に、MaxClients を超えてしまった場合などに発生しがちです。

応答しなくなっているので、実際にどれだけの数のリクエストが来ていたのかログにも残りません。
Zabbixのパラメータにも、Apacheのプロセス数はあっても80/443の接続数はありません。

サーバーへの接続は netstat で確認できます。
その中で、80番 443番の接続をでカウントすることで接続数が確認できます。
netstat -an | grep -e :80 -e :443 | wc -l

その結果を zabbix-agent から出力します。
zabbix_agentd.conf
UserParameter=httpdconnect,netstat -an |grep -e :80 -e :443 |wc -l

Zabbixサーバー側でhttpdconnectをアイテムに追加し、グラフなりトリガーなりを設定します。

なんでこういうパラメータがデフォルトで無いのか…
Debian9でAWS ECR Loginが出来ない時の解決方法

DebianでBuildしたDocker ImageをAWS ECRのレジストリーにあげようとした時、ECR Loginが出来ないことがあります。

OSとバージョンはDebian 9.9、aws cliはapt-get installで入れたものです。

```
# cat /etc/debian_version
9.9
# aws --version
aws-cli/1.11.13 Python/3.5.3 Linux/4.9.0-9-amd64 botocore/1.4.70

```

ECR Loginしようとすると以下のようにエラーが出て、ログインできません。

```
$(aws ecr get-login --region xxxx --no-include-email)
Unknown options: --no-include-email
```

解決方法は、pip3でawscliを最新バージョンにアップデートすることです。

```
# apt-get install python3-pip
# pip3 install --upgrade awscli
# aws --version
aws-cli/1.17.12 Python/3.5.3 Linux/4.9.0-9-amd64 botocore/1.14.12
```

この後、ECR Loginが出来ました。
【ふくだ学習録】アプリ制作part2【29日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)


### 今読んでいる本

なし

# アプリ制作

### Next.js ルートマスキング
ルートマスキングは、遷移先URLの表示を綺麗な文字列で表示させるための手法。

```react
const PostLink = (props) => (
  <li>
    // asプロパティに指定しているものが遷移先URLとして表示される。
    <Link as={`/p/${props.id}`} href={`/post?title=${props.title}`}>
      <a>{props.title}</a>
    </Link>
  </li>
)
```

### Next.js getInitialProps関数
APIからデータを取得し、


# 今日の一言
頭パンク。
Docker+RubyonRails でよく使うコマンドメモ

アプリを作成するときはDockerを利用するのですが、Railsコマンド打つとき最初よく分からなくて躓いてたんで自分用メモとして記します。

#gemのインストール
```
docker-compose build --no-cache
```
Docker-compose downしてから行ってください。

#dockerでrailsコマンドを打つ
```
docker-compose run --rm web rails
```

#Dockerfileやdocker-compose.ymlの変更を反映、railsサーバーを再起動
```
docker-compose up --build
```
#MySQL
```
docker-compose exec db mysql -u root -p
```
Mysqlは「database.yml」で指定したパスワードで中身を見ることができます。

#まとめ
よくこの辺を使うので参考になればと思います。