OmniAICreator/Qiita-1.07M huggingface dataset:
linuxで（時々）使う状態確認コマンド

作成や更新系は省いています。
専門でないのでたまに使うときに忘れてしまうlinuxの状態確認系のコマンドをまとめています。

```:osを確認
uname
uname -a # カーネル、リリース日など他の詳細も表示する
```

```:フルパスを確認
readlink -f ファイル名
```

```:現在ログインしているユーザーを確認
users
```
```:所属グループを確認
groups
```

```:設定されているcronを確認する
crontab -e
``` 
```:グローバルIPを確認
curl ifconfig.me
```
```:ping監視
ping ipアドレス
```
```:プロセス確認
ps aux
```
```:差分確認
# 左右並べて比較
diff -y ファイルA ファイルB

# ディレクトリで差分のあるファイル名のみ表示
diff -rq　ディレクトリA　ディレクトリB
```
個人アプリ開発

作りたいもの、デザインは固まっているが、何からどう手をつけていいかがわからない。
そのせいで、今日は全然はかどらなかったが、たくさん検索していろんなデザインのサイトを見たので少しでもいかせて行けたらいいなと思う。
javascriptで連長圧縮された文字列を解凍してみた。

今回は、前回の記事で圧縮したデータを解凍するアルゴリズムについて解説して行きます。
####[前回の記事：javascriptで連長圧縮してみた。](https://qiita.com/bigsugarG/items/18d045512db013bf99ca)

“連長圧縮”という圧縮処理を経た文字列を、解答していくわけですが、前回同様に、
はじめに例をお見せします。

###まずは例から。。。
自作のローカルページに「3A5B-2CD2E-2FG」と入力すると、前回の記事で圧縮処理をかけた「AAABBBBBCDEEFG」というオリジナルの文字列が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598885/0ea16e18-eedd-eb1d-d74b-29f098a9049e.png)
正の数字は連続の文字の回数を表しているので、その回数分、文字を連続して出力します。
（ex. 3A　→　AAA（解凍）となるわけです！）

負の数字は不連続文字の数を表しており、その回数分、不連続の文字を続けて出力します。
（ex. -5CDEFG →　CDEFG（解凍）となり、解凍後の方が情報量が少ないですね...笑）

やはり、「連続する文字が多い」という特性を持った情報でないと、効果を発揮する場面が無さそうですね。

###解凍のアルゴリズム（JavaScript）
```javascript:Rentyo.js
function doDecompress(charData){　//連長圧縮に対する復号処理
    var decompressedText = [];　//解凍結果を格納する場所
    var minusFlag = false;　//連続か不連続かの状態を決定する
    var countStock = 0;　//文字の数を数えるようの変数
    var preNumStock = [];　//前回までの文字のストック（2桁以上に対応）

    for(i=0;i<charData.length;i++){
        if(charData[i]=="-"){　//マイナスの符号を検知
            minusFlag = true;
        }
        else if(charData[i].match(/[a-z]/gi)){　//アルファベットを検知
            
            if(minusFlag==true){　//不連続だったら
                countStock = parseInt(preNumStock.join(""));
                for(j=0;j<countStock;j++){
                    decompressedText.push(charData[i+j]);　//不連続の文字の回数出力
                }
                i = i + countStock - 1;　//ループを次の状態まで飛ばす
                minusFlag = false;　//諸々初期化しとく
                preNumStock = [];
                countStock = 0;
            }else{　//連続だったら
                countStock = parseInt(preNumStock.join(""));
                for(j=0;j<countStock;j++){
                    decompressedText.push(charData[i]);　//連続の回数分、同じ文字を出力
                }
                preNumStock = [];　//諸々初期化しとく
                countStock = 0;
            }
        }else{　//数字だったら
                countStock = parseInt(charData[i]);　//int型に変換
                preNumStock.push(countStock);　//2桁以上の場合に備えて保持しておく
        }
    }    
    var resultText = decompressedText.join("");　//配列を文字列に変換
    document.getElementById("show_result").textContent = "Decompressed Result: " + resultText;
}
```

####注意すること
デコーダーにおいて一番私が躓いたのは、1文字ずつ調べるが故に、普通にやってたら2桁以上の数字に対応できない！という点でした。笑
そのためpreNumStockという配列を用意し、数字をどんどん貯め、アルファベットが始まった段階で初期化して2桁以上に対応しました。


####真価を発揮するとき。。。
連長圧縮は、2進数のように情報の種類がAとBの2種類しかない場合に、~~かなり圧縮率を高く出来ます！~~  → かつ1種類の文字が長く連続している場合には、圧縮率が高くなります。
またランレングス圧縮は白黒（情報の種類が2つのみ）のファクシミリの情報を読み取る際などに用いられているようです。
「ABBBBABABAAAAAA」という文字列があるとしましょう。最初にAが来ることを前提とすると、
「-1,4,-4,6」というふうに数字だけで表せます。
このように数字からなる情報だけで、オリジナルの文字列を解読出来ちゃいますね！
最初の文字がAかBかを決定するだけで、あとは数字のみで表せてしまうのです。（デコード出来る圧縮を可逆圧縮というそうです。）

[GitHubはコチラ](https://github.com/bigsugarG/Compressor-Decompressor)
【今日のアブストラクト】Deep Gamblers: Learning to Abstain with Portfolio Theory【論文 ほぼ Google 翻訳 自分用】

1 日 1 回 (努力目標) 論文の Abstract を Google 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ Google 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Deep Gamblers: Learning to Abstain with Portfolio Theory](https://arxiv.org/abs/1907.00208)

# Abstract

### 訳文
データの特定のレベルのカバレッジで最高のパフォーマンスを達成したい選択的分類問題 (拒否オプション付きの教師あり学習問題) を扱います. 元の $m$ クラス分類問題を $(m + 1)$ クラスに変換します。ここで, $(m + 1)$ 番目のクラスは, 不確実性による予測を行わないモデルを表します. ポートフォリオ理論から着想を得て, ギャンブルの倍増率に基づいた選択的分類問題の損失関数を提案します. この損失関数を最小化することは, 競馬のリターンを最大化することに自然に対応します. プレーヤーは, 自信がある場合の結果への賭け (予測を行う) と自信がない場合の賞金の保留 (予測を控える) のバランスを取ることを目指しています. この損失関数により, ニューラルネットワークをトレーニングし, エンドツーエンドの方法で予測の不確実性を特徴付けることができます. 以前の方法と比較して, この方法では, モデル推論アルゴリズムまたはモデルアーキテクチャをほとんど変更する必要はありません. 実験は, 我々の方法がデータポイントの不確実性を識別でき, SVHN と CIFAR10 上のデータのさまざまなカバレッジで強力な結果を達成できることを示しています.

### 原文

We deal with the selective classification problem (supervised-learning problem with a rejection option), where we want to achieve the best performance at a certain level of coverage of the data. We transform the original $m$-class classification problem to $(m + 1)$-class where the $(m + 1)$-th class represents the model abstaining from making a prediction due to disconfidence. Inspired by portfolio theory, we propose a loss function for the selective classification problem based on the doubling rate of gambling. Minimizing this loss function corresponds naturally to maximizing the return of a horse race, where a player aims to balance between betting on an outcome (making a prediction) when confident and reserving one’s winnings (abstaining) when not confident. This loss function allows us to train neural networks and characterize the disconfidence of prediction in an end-to-end fashion. In comparison with previous methods, our method requires almost no modification to the model inference algorithm or model architecture. Experiments show that our method can identify uncertainty in data points, and achieves strong results on SVHN and CIFAR10 at various coverages of the data.
【Udemy Python3入門+応用】　42. for文とbreak文とcontinue文

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■for文
#####◆for文の基本
一度for文を使わず、while文を使って例を出してみる。

```python:while
some_list = [1, 2, 3, 4, 5]

i = 0

# i < some_listに含まれているデータの個数 の間はループ
while i < len(some_list):
    # iをインデックスとするsome_listの要素をprint
    print(some_list[i])
    i += 1
```
```:result
1
2
3
4
5
```
これをfor文を使って記述すると、以下のようになる。

```python:for
some_list = [1, 2, 3, 4, 5]

for i in some_list:
    print(i)
```
```:result
1
2
3
4
5
```
このコードでは、`some_list`に含まれている要素を1つずつiに代入する反復を行っている。
このように、反復処理を行うときにfor文は有効。
もちろんfor文にも`break`や`continue`は使える。

#####◆他の例1
```python:for
for s in 'abcde':
    print(s)
```
```:result
a
b
c
d
e
```

#####◆他の例2
```python:for
for word in ['My', 'name', 'is', 'Tony']:
    print(word)
```
```:result
My
name
is
Tony
```
東京都が千葉県の吐瀉物に見えた件

ある企業のホームページを見ていて、色分けされた関東の地図が描かれていたんですが、それを見たらなんか

「東京都が千葉県の吐瀉物に見えた」

けど、そのホームページを晒すのはイケナイことのように思えたので Python で表現してみました。

[PythonでExcelファイルを開く、そして日本地図に色を塗る](https://qiita.com/maskot1977/items/b0df0f43995ff34cb952)を参考に色を塗ります。

```python
!pip install japanmap
```

    Collecting japanmap
    [?25l  Downloading https://files.pythonhosted.org/packages/6c/49/2b29122d76a631984df2ebebead802f4e5752e33fe3478ccec2a2e4073da/japanmap-0.0.21.tar.gz (167kB)
    [K     |████████████████████████████████| 174kB 2.8MB/s 
    [?25hRequirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from japanmap) (1.17.5)
    Requirement already satisfied: opencv-python in /usr/local/lib/python3.6/dist-packages (from japanmap) (4.1.2.30)
    Requirement already satisfied: Pillow in /usr/local/lib/python3.6/dist-packages (from japanmap) (6.2.2)
    Building wheels for collected packages: japanmap
      Building wheel for japanmap (setup.py) ... [?25l[?25hdone
      Created wheel for japanmap: filename=japanmap-0.0.21-cp36-none-any.whl size=166793 sha256=2f5cc7c0ed321acf04cb8eb976225ec82e4087e9c11a72f490cfd942f128bf71
      Stored in directory: /root/.cache/pip/wheels/a0/7b/2b/331437760ae95113fa973e5ad7af111588ce9c7e76feb14f56
    Successfully built japanmap
    Installing collected packages: japanmap
    Successfully installed japanmap-0.0.21



```python
%matplotlib inline
import matplotlib.pyplot as plt
from pylab import rcParams
from japanmap import pref_names,pref_code,picture

rcParams['figure.figsize'] = 12, 12
plt.imshow(picture({'千葉':'red','東京':(255, 219, 88)}))
```




    <matplotlib.image.AxesImage at 0x7f7020586748>



![output_4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/3714edf5-5616-1143-a1eb-6c547520111a.png)


どうでしょうか。そんな気がしてきませんか？
プログラムでAWSのサービスにアクセスする方法

##プログラムでAWSのサービスにアクセスする方法
①CLI
②SDK（内部的にAPIを実行）
③API　※SDKがない言語はこれを使うしかない。

##認証方法について
①IAMロール
　プログラムを配置しているサービス（EC2等）にロールをアタッチする。
　⇒ロールが一時的な認証情報を作成してくれる。
②IAMユーザー ※SDK,CLI用
　IAMユーザから振り出したアクセスキー・シークレットアクセスキーを設定する。
　※変数として設定 or クレデンシャルファイルとして配置
　⇒SDK,CLIが自動で署名を計算してくれる。
③署名V4（API直叩き）
　”②”の署名の計算を自分でおこなう。（アクセスキー・シークレットアクセスキー必要）
 ※SDKがない場合はこれを使うしかない
　
>https://docs.aws.amazon.com/ja_jp/general/latest/gr/signing_aws_api_requests.html

>https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4_signing.html

##考察
私は、API/署名V4でAWSのサービスにアクセスするプログラムを自作しましたが、
署名v4が、修正してもエラーメッセージが変わらない（認証できませんみたいなｗ）ため、
修正したところがあっているのか確証が持てないという、しんどさがありました(笑)

そこで、私はAWSにあるpythonのサンプルを自分が使用している言語にコンバート
していって、無事動くプログラムができました。
困ったときは、こういうやり方もありやなーと思いました('ω')

>https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4-signed-request-examples.html

まず、pythonのサンプルをコンバートしやすいようにきれいにして、
https://qiita.com/t20190127/items/75f5002823132ec8fb1b

それをコンバートしていった感じです！
AWSのCIDRってどう入力すればいい？

AWSでインフラの知識なく、環境構築に望まなければならなかったが、
特にVPCやサブネット作成時のCIDR入力欄で困惑したのでメモします。

![スクリーンショット 2020-01-28 21.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493132/27910a01-0466-45e5-8d3a-a9e4f59450b2.png)

## 1. 結論

**・第1オクテット〜第2オクテットまで0〜255の範囲で自由に決めて第3と第4オクテットは0でいい。**
**・ブロックサイズ(/(スラッシュ)の後ろの2桁の数字)は16〜28からの間を入力。切りがいいので20,24あたりであれば個人利用なら何も困らない**

※ただし、`0.0.0.0`だと意味が変わってしまうので×

### 1-1 オクテットとは？

例　111.222.33.44　←のようなIPアドレスだと・・・

111が第1オクテット
222が第2オクテット
33が第3オクテット
44が第4オクテット

と４つのオクテットに区切られる。
各オクテットは8bit(つまり0〜255までの整数値)で構成されるので256以上の数値は入力できない。

## ちなみにCIDRとは？
CIDRとは表記の種類のこと。
別種類表記にサブネット表記がある。

|CIDR表記|サブネット表記|
|:----------------:|:-----------------:|
|192.168.0.0/20|192.168.0.0/255.255.240.0|

参考リンク：[IPアドレスの基礎知識](https://qiita.com/mogulla3/items/efb4c9328d82d24d98e6)

・[ネットワーク計算ツール](https://www.softel.co.jp/labs/tools/network/)などでブロックサイズでネットワーク範囲を計算できる。
分かりやすさは正確さよりも重要なのか？

プログラミングは難しいと思う人達がいる。いや、実際に難しい所もあるし易しい所もある。初心者が始めに躓くのは用語や概念の難解さだ。やれ、変数だ、引数だ、関数だ、と言われても何を意味しているのかがなかなか掴めない場合がある。それこそ、オブジェクト指向とは何かと言われると、もっとよくわからない。そもそも、曖昧な概念の場合は、正解が無い場合だってある。

世の中で初心者向けと自称する記事の中で、それらの用語や概念を不正確に解説している物がある。それらに対して間違っていると指摘にしても、彼らは「初心者向けだから正確さよりも分かりやすさを重視した」と言う。それで本当にいいのだろうか？

私は、teratailとスタック・オーバーフロー[^1]でそこそこの回答をしている回答者だ。なので、それなりに、初心者であろう質問者を見てきたつもりだ。そんな初心者の中で一番回答に困るのが、話が噛み合わない人達だ。なぜ話が噛み合わないかというと、こちらが言っている意味と相手が言っている意味が異なるからだ。つまりは、その人が覚えている用語、概念、機能、動作、方法等の何かが根本から間違っていたということだった。そして、それが問題の本質であったりもする。

[^1]: 日本語版の方。英語の本家はROM専。

人は初めに覚えたことを強く信じる。とある「A」を学んでいるとき、「AはBである」と初めに教えられたとしよう。その後「AはBではなくCである」と言われたとき、人は反発する。人は自分が信じていることと異なることを信じないからだ。なぜなら、自分が信じていることの否定は自分の否定と捉えるからだ。勘違いしないで欲しいのは「知っている」のではなく「信じている」と言うことだ。それが真実であるという確証が実際の所は何もないのに、ただ「信じている」だけに過ぎないのに、人は自分が「知っている」事を真実であるかのように決めつける。そのまま時が経てば常識であるとすら思い込む。

初心者であればあるほど、初心者向けや入門と言ったタイトルやタグが付いた記事を探し、簡単や分かりやすいと評価されているものを読もうとする。しかし、もし、そこに間違った知識が書いてあったらどうだろうか？その間違いが顕在化したとき、その人は果たして混乱せずにいられるだろうか？とんできたマサカリを素直に受け止めることができるだろうか？周りに反発し、殻に閉じこもり、間違いを認めず、そのままそこで立ち止まって、終わってしまうような気がしてならない。いや、実際にそうなってしまった人達を私は何人か見たことがある。

さて、一つ言っておかなければならない事がある。この文章は初心者向けではない。**初心者向けを書く人向け**に書かれている。初心者のために文章を書こうという気概があるあなたは、きっと、優秀なエンジニアなのだろう。だが、分かりやすさという言葉を言い訳にして、正確さを軽視した文章を書いていないだろうか？それは本当に誤解を生まない文章なのだろうか？間違った知識を植え付けるものになっていないだろうか？そして、その間違いが、その初心者の人生を狂わす原因になるかもしれない…そんな懸念を抱くことはないのだろうか？

私に言わせれば、分かりやすくするために正確さを犠牲にすることは**甘え**である。初心者向けを自称するのであれば、正解、かつ、分かりやすい文章を目指すべきだ。どちらかを捨てるなんてできない、どちらも重要なのだ。より深く考察し、より慎重に検討し、言葉を紡ぐべきだろう。それができないのであれば、あなたはまだ初心者向けの文章を書く技術や知識が劣っている。できれば、そのような人に初心者向けなどと言う文章は書かないで欲しい。初心者のためにもだ。

技術的な文章において、初心者向けというのが一番難しい。私も初心者向けの文章として回答をした事がある[^2]が、一番神経を使うし、かなりの時間を掛けて書いている。時には初心者向けに書くことは諦めて、「少し難しいので、知識を得てから後で読み返してください」と注意書き付きで回答したことが何度もある。ましてや、Qiitaでは初心者向けの解説と言ったものはほとんど書いていない。そう、初心者向けの文章を十全に書くためには、私には技術や知識がまだまだ足りないのだ。だが、努力はしているつもりだし、いつか、そういった文章をすらすらと書けるようになりたいとは思っている。

[^2]: 初心者を自称する質問者への回答という意味ではない。

私自身ができていないことを押しつけるのは烏滸がましい限りであるが、もし、あなたがこれから初心者向けを書こうとしているのであれば、本当に初心者のためを思うなら、この記事に書いている内容を少しでも考慮して欲しい。正しい知識こそが上達への近道であると言うことを、あなたは知っているはずなのだから。
Python, read(), readline(), readlines()の違い 

#read()やreadline()、readlines()の違いについてメモ

#前提
例えば、testsディレクトリに以下のテキストファイルがあったとする。

```txt:articles.txt
たま,眠いにゃー
しろ,腹減ったにゃー
クロ,なんだか暖かいにゃー
たま,ぽえーぽえーぽえー
```

#（１）read()※文字数制限あり
readメソッドは開いたファイル全体を文字列として取得する。\nは含まれる。
引数に数字を入れると字数制限をする。

```
with open('tests/articles.txt',encoding='utf-8') as f:
    test = f.read(10)
    print(test)
```
とすると、

```
たま,眠いにゃー
し
```
となる。

#（２）read()※文字数制限なし
引数に何も入れないと全てを取得する。

```
with open('tests/articles.txt',encoding='utf-8') as f:
    test = f.read()
    print(test)
```
とすると、

```
たま,眠いにゃー
しろ,腹減ったにゃー
クロ,なんだか暖かいにゃー
たま,ぽえーぽえーぽえー
```
となる。

#（３）readline
そのまま実行すると、ファイルを１行だけ読み込む。

```
with open('tests/articles.txt',encoding='utf-8')as f:
    test= f.readline()
    print(test)
```
とすると、

```
たま,眠いにゃー
```

となる。

#（４）readlines
ファイル全体を行ごとに分割したリストとして取得できる。

```
with open('tests/articles.txt',encoding='utf-8')as f:
    test= f.readlines()
    print(test)
```
とすると、

```
['たま,眠いにゃー\n', 'しろ,腹減ったにゃー\n', 'クロ,なんだか暖かいにゃー\n', 'たま,ぽえーぽえーぽえー\n']
```
となる。


#（５）まとめ
testsディレクトリにarticlesテキストファイルを設定し、test.pyを実行
まとめると以下の通りとなる。

```
┬test.py
└tests
  └articles.txt
```

```txt:articles.txt
たま,眠いにゃー
しろ,腹減ったにゃー
クロ,なんだか暖かいにゃー
たま,ぽえーぽえーぽえー
```


```.python:test.py
with open('tests/articles.txt',encoding='utf-8') as f:
    test = f.read(10)
    print('\n'+'\n'+test)

print('\n--------------------------\n')


with open('tests/articles.txt',encoding='utf-8') as f:
    test = f.read()
    print(test)

print('\n--------------------------\n')

with open('tests/articles.txt',encoding='utf-8') as f:
    test= f.readline()
    print(test)

print('\n--------------------------\n')

with open('tests/articles.txt',encoding='utf-8') as f:
    test= f.readlines()
    print(test)
print('\n'+'\n')
```

```

たま,眠いにゃー
し

--------------------------

たま,眠いにゃー
しろ,腹減ったにゃー
クロ,なんだか暖かいにゃー
たま,ぽえーぽえーぽえー


--------------------------

たま,眠いにゃー


--------------------------

['たま,眠いにゃー\n', 'しろ,腹減ったにゃー\n', 'クロ,なんだか暖かいにゃー\n', 'たま,ぽえーぽえーぽえー\n']


```
中華 STM32F103のボード、通称Blue pillのMCUがクローンチップの場合の書き込み方 (STM32CubeIDE)

　AliExpressにてSTM32F103のマイコンボードを購入した
　届いたらMCUが偽物(コピー品)だった。
　STM32CubeIDEで書き込もうとするとエラーが出て書き込めなかった。
![DSC_0004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/595add76-274f-33d5-6914-2eebbea32803.jpeg)
低画質ですみません（なんとかCKSの文字が見て取れる[中科芯杯(CKS)社のクローンらしい])

#このページで解決すること
　CKS社のF103のチップにSTM32CubeIDEで書き込めるようにする。(ST-LINK/V2-1にて)

#問題と原因
　デバッグ時エラーがでる。書き込めない。
　書き込み時、MCUのIDが正規品では0x1ba01477だがコピー品は0x2ba01477であることが原因。
(エラーは出るがコンソールに0x1ba01477などの文字が出ないこともある。[デバッグプローブをST-LINK GDBを選択している場合])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/8b3ee4d1-f784-d2e8-29e6-a11241f1fb43.png)

#手順
　1.　STM32F1への書き込みの設定ファイル"stm32f1x.cfg"を編集する
　2.　デバッグ時、"stm32f1x.cfg"を利用する設定を行う(○○_Debug.cfgの編集とデバッグの設定変更)

#環境
　・STM32CubeIDE（日本語化済み）
　・日本語化してるので、初期インストール時と項目名が異なります。すみません
　・ST-LINK/V2-1(NUCLEO-F303RE)
　・CKS32F103C8T6互換マイコンボード(AliExpressにて購入)


#手順1　STM32F1への書き込みの設定ファイル"stm32f1x.cfg"を編集する
　STM32F1への書き込みの設定ファイルであるため、STM32CubeIDEに１つ存在しています（後で説明するファイルはプロジェクトごとに存在）
　私の場合は、
"C:\ST\STM32CubeIDE_1.1.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.debug_1.1.0.201910101207\resources\openocd\st_scripts\target\stm32f1x.cfg"
に存在していました。

　このファイルをわかりやすい名前に変更し、同じフォルダ内にコピーします(たとえばcs32f1x.cfg)。
　この複製したファイル内の文字の
set _CPUTAPID 0x1ba01477を
set _CPUTAPID 0x2ba01477にテキストエディタで変更します（全1か所中１か所)


#手順2　デバッグ時、"stm32f1x.cfg"を利用する設定を行う("○○_Debug.cfg"の編集とデバッグの設定変更)
"○○_Debug.cfg"は
　私の場合は、
"C:\Users\ユーザ名\STM32CubeIDE\workspace_test\test_Lchika\test_Lchika デバッグCS.cfg"
に存在していました。
　今回はtest_Lchikaというプロジェクトを対象としています。またIDEを日本語化している場合、ファイル名の"Debug"が"デバッグ"になります(どちらでも問題ないはず)。

　このファイルをわかりやすい名前に変更し、同じフォルダ内にコピーします(たとえば"test_Lchika デバッグCS.cfg")。
　この複製したファイル内の文字の
source [find target/stm32f1x.cfg]を
source [find target/cs32f1x.cfg]にテキストエディタで変更します（全1か所中１か所)

#手順3　STM32CubeIDEのデバッグの設定の変更
　実行-デバッグの構成を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/ab67e3c0-de45-b6be-f9c5-68900ea8d548.png)
　対処のデバッグ項目が存在しない場合、STM32 Cortex-m C/C++ APPをダブルクリックすると作成される。
　デバッグの項目のデバッグプローブを"ST-LINK OpenOCD"を選択する。
　Configration Scriptにてユーザ定義を選択し、ファイルを手順2で作成したファイルを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558094/10f2b625-55ff-18ba-c83e-a27c4ae00655.png)

デバッグを押す
以上です
実際にLチカが動作することは確認しました。(写真ナイケド
接続したピンは、3.3、GND、SWDIO、SWCLK、NRST
#はまったこと
　・OpenOCDではソフトウェアリセットができなさそうなので、NRST(リセットピン)を接続しなければならない。
　
#さいごに
　この方法ではデバッグは可能だが、SWVなどのトレースはできなくなる。
　プロジェクトを作成するたびに、手順２以降を実行しなければならない。
　中華なので、壊れているのか、接続ミスなのか、わからないのが大変だった(CubeIDEでのエラー内容で検索しても見つからなかった)
　STM32F103自体は安いのにADCが2つも入っていて(コンバータが2つ搭載)いい感じです


##参考にしたサイト
SW4STM32を利用した場合の書き込みについて↓
・電子工作専科　TOP > 開発環境構築 > STM32 > CS32
https://denshikousakusenka.jimdofree.com/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/stm32/cs32/

中国製のSTM32クローンチップについて↓
・Cerevo Tech blog [20日目] 100%オリジナルで高品質新しいSTM32F103完全に交換自由な船積み
https://tech-blog.cerevo.com/archives/8539/
日本のコロナウィルスの感染者数予測の情報

# はじめに
今回は情報整理のための記事で、予測はありません。

「厚生労働省が新型コロナウィルスの感染者数予測のための、目安の計算式を公表した。」と記事が出ていましたので、自分の情報整理のためまとめました。

# 計算式
北海道大大学院の西浦博教授（理論疫学）らの研究チームが作成と、記事に書かれていました。「西浦博教授」で検索したところ、以下に西浦博教授の論文へのリンクが記載されていました。

[いいね！Hokudai](https://costep.open-ed.hokudai.ac.jp/like_hokudai/contents/article/1866/)

新型コロナウィルスの論文を
　2020/2/4
　2020/2/14
　2020/2/21
と、毎週投稿していました。
しかし論文の中身は、読めていません。

# （ご参考）その他
新型コロナウィルスの世界中の感染者数が、以下にまとまっていました。
24時間毎にアップデートされるそうです。
さすが Kaggle です。

[COVID-19 Complete Dataset (Updated every 24hrs)](https://www.kaggle.com/imdevskp/corona-virus-report)

またこのページの Kernel には、様々な解析のプログラムと解析結果も掲載されています。
scssでmargin-topとmargin-rightとセレクタを自動生成する。

#はじめに

ページやブロックごとに少しづつmarginが違うときに使いたいscssです。
生成されるcssは5px刻みです。
`.mt-5`〜`.mt-200`
`.mr-5`〜`.mr-200`



デザイナーからデザインをもらったけど、`margin`が統一されていない時がよくあります。
新たなclassとcssを追加するのは運用する上で最適解ではないように思います。

普段はBEMで書いているのでできるだけシングルクラスで書いていましたが、
`margin`とその他のプロパティはそれぞれで独立させた方いいのではないかと思いました。

##動作環境
- SCSS

#コード

```margin.scss

$breakpoint:768px;
//pcとspでmarginが変わるものに対応
@mixin pc {
  @media print, screen and (min-width: $breakpoint) {
    @content;
  }
}
@mixin sp {
  @media only screen and (max-width: ($breakpoint)) {
    @content;
  }
}

//5px-200pxまで5px刻み
@for $i from 1 through 40 {
  $i: $i * 5;
  .mt-#{$i} {
    margin-top: #{$i}px;
  }
  .mr-#{$i} {
    margin-right: #{$i}px;
  }
  @include pc{
    .pc-mt-#{$i} {
      margin-top: #{$i}px;
    }
    .pc-mr-#{$i} {
      margin-right: #{$i}px;
    }
  }
  @include sp{
    .sp-mt-#{$i} {
      margin-top: #{$i}px;
    }
    .sp-mr-#{$i} {
      margin-right: #{$i}px;
    }
  }
}
```

#おわりに
こうすることで、要素に対するプロパティはその要素のデザインに関するものだけになり、
場所を移動させたり他のページにも表示させる際の`margin`の違いに悩まなくなります。

しばらく運用してみて、問題があればアップデートできればと思います。
css設計も見直しが必要かもしれないですね。
基本情報技術者　テクノロジ系　第8章　プロセスフロー図

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより


# プロセスフロー図
システム処理手順を大まかに表す図

## 集計処理

基本的な流れとして

1,整列処理をして集計準備をする
2,集計してレコード様式を最低限にしてデータをまとめる


## 順位付け処理
基本的な流れは似たような物です。

1,整列処理をして集計準備をする
2,順位付け処理をする

## ファイル突き合わせ処理
トランザクションファイルとマスタファイルを突き合わせする方法です。

トランザクションは固定されたシステム処理のことですが
整列されてないので、マスタファイルと突き合わせする手間が多いので
マスタファイルと突き合わせしやすいように、整列をさせます。
papermillを試してみた

# はじめに
[『Jupyter だけで機械学習を実サービス展開できる基盤』](https://engineer.recruit-lifestyle.co.jp/techblog/2018-10-04-ml-platform/)を読んで、基盤にjupyter notebookを直接組み込むなんてことが出来るのかととても感心しました。記事の中でjupyter notebookを外部から実行できる 『papermill』というライブラリが登場したので、これを使ってみたいと思います。

# 参考
- [nteract/papermill](https://github.com/nteract/papermill)

# 環境
- macOS Catalina 10.15.3（19D76）
- python 3.7.5

# 手順
## インストール

```python
pip install papermill
```


## 実行

フォルダ構成は下記のようにしました。`input.ipynb`が実行したいnotebookで、実行コードを`main.py`に書きます。

```
work/
　├ main.py
　└ input.ipynb
```

`input.ipynb`の中身はごくシンプルに下記のようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/0ae3c808-98ec-d2ca-acfc-a3001c9e8151.png)

ここで、１つ目のセルに`parameters`というタグがついています。タグはメニューの`View-Cell Toolbar - Tags`と選択するとセル右上のテキストボックスが表示されるので、ここに`parameters`と入力し`Add tag`をクリックして追加します。papermillはnotebook内の`parameters`タグが付いたをセルを探しに行って、セル内の変数を書き換えることができます。

python APIでの実行は次のようにします。実行後のnotebookが`./output.ipynb`として出力されます。

```python:main.py
import papermill as pm

pm.execute_notebook(
   './input.ipynb',
   './output.ipynb',
   parameters = dict(alpha=0.6, ratio=0.1)
)
```

`python main.py`で実行します。

```python
$ python main.py 
Executing: 100%|████████████████████████████████| 3/3 [00:01<00:00,  1.80cell/s]
```

`./output.ipynb`を開いてみると次のようになっています。`Injected-parameters`というタグが付いたセルが追加されていて、パラメーターが上書きされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/998a41e4-4063-d316-599d-116ecf78c4b8.png)

CLIから実行するには次のようにします。booleanや数値はpapermillが勝手に判断してくれます。 

```bash
$ papermill ./input.ipynb ./output.ipynb  -p alpha 0.6 -p ratio 0.1
Input Notebook:  ./input.ipynb
Output Notebook: ./output.ipynb
Executing: 100%|████████████████████████████████| 3/3 [00:01<00:00,  2.67cell/s]
```
パラメーターはyamlファイルでも指定できます。

```
work/
　├ main.py
　├ input.ipynb
　└ parameters.yaml
```
CLIで次のように実行します。

```bash
papermill ./input.ipynb ./output.ipynb -f ./parameters.yaml
```

クラウドストレージに保存することもできます。その場合、オプションもインストールする必要があります。

```bash
pip install papermill[all]
```
`./output.ipynb`の部分をクラウドの宛先に変えてやります。下記はAWSのS3の例です。CLIでconfigureされていれば実行できます。

```python
papermill ./input.ipynb s3://xxxxxxxxxx/output.ipynb -f ./parameters.yaml
```

## おまけ

出力先を入力と同じにすると上書きになります。

```bash
papermill ./input.ipynb ./input.ipynb -f ./parameters.yaml
```

複数回繰り返しても`Injected-parameters`のセルが上書きされるだけなので、きちんとパラメータは書き換えられます。

# おわりに
flaskで管理画面を作って学習とか管理できると面白そうです。
xrdpのログを監査し、ログイン成功したら外部メール送信する。

xrdpで、linux-desktopを開放しようとしているので、ログ監査をする。

### 改版
【2020.08.08】この方法では、接続元IPが不明なので別のやり方にする。[xrdpのログを監査し、ログイン成功したら外部メール送信する＃２](https://qiita.com/harasakih/items/fbd5ff4c3673da6960bd)へ

- ログイン成功したら、メールを送信する。
- メール送信は、swatchを使う。
- メール送信設定は、これを参考に。
[メール送信設定](https://qiita.com/harasakih/items/ec7c7cbf01b763b84ef0)


# ログ監査の検討

## ログサンプル

```
## RDPの接続
[20200309-23:03:23] [INFO ] Socket 12: AF_INET connection received from 117.160.141.46 port 51320
[20200309-23:04:44] [INFO ] connected client computer name: VJPF118-NAELQJN
[20200309-23:04:44] [INFO ] TLS connection established from 49.97.92.72 port 44339: TLSv1.2 with cipher **** 
## ここでログイン成功
[20200309-23:06:12] [INFO ] xrdp_wm_log_msg: login successful for display 10
```

## 監査プラン

| TERM | 件数 |
| :--- | :--- |
| AF_INET connection received from | 多い |
| connected client computer name | AF_INETより少ないが沢山 |
| TLS connection established from | だんだん少ないけど |
| login successful | 成功したログインのみ |



# ログ監査

## swatchをインストール
```bash
# yum install swatch
```


## swatchで /var/log/xrdp.log を監査する
swatchのスクリプト

```perl:/root/binbin/swatch.webarena.xrdp.sh
#
# Swatch for /var/log/xrdp.log on webarena (centos)
#   /lib/systemd/system/user_swatch_xrdp.service
#

## sudo command SAMPLE
#watchfor /sudo:/
#  mail=ID@YOUR.MAIL.DOMAIN,subject="xxxx.swatch:sudo command"
#  threshold track_by=/sudo:/,type=limit,count=1,seconds=300
# limit : 300秒の間に、1回を超えると,300秒経過まで無視

##
ignore   /from www.xxx.yyy.zzz.*/
##
watchfor /login successful/
  mail=ID@YOUR.MAIL.DOMAIN,subject="xrdp login successful"
    threshold track_by=/login successful/,type=limit,count=1,seconds=300
```

www.xxx.yyy.zzzからのxrdpログイン成功は無視する。


## 作成したswatchスクリプトをsystemdにサービス登録する

```conf:/usr/lib/systemd/system/user_swatch_xrdp.service 
[Unit]
Description=xrdp-log Authentication
After=rsyslog.service

[Service]
ExecStart=/usr/bin/swatch -c /root/binbin/swatch.webarena.xrdp.sh -t /var/log/xrdp.log --daemon > /dev/null 2>&1
KillMode=process
Type=simple
Restart=no

[Install]
WantedBy=multi-user.target
```
## systemdでサービス登録
```bash:
# systemctl enable user_swatch_xrdp
# systemctl start  user_swatch_xrdp
```
クラスの継承

##クラスの継承
あるクラスに定義されたメソッドを、別の新規クラスで利用できるようにしたクラスを定義することを継承と言います。
クラスの継承には、親クラスと子クラスの関係があり、元となるクラスを親クラス、親クラスのメソッドを引き継ぎ新しく作成するクラスを子クラスです。
例えば「車」の親クラスを作り、子クラスに「消防車」と「トラック」を作ったとします。
まず「車」の動作には加速や減速などがあります。「消防車」は、「トラック」はその特徴を継承することで「消防車」と「トラック」には加速や減速などを記述する必要がなくなります。なので例えば「消防車」はサイレント、「トラック」は荷物が積めるのみ記述するだけで澄みます。
【例】クラスの継承

```
class 子クラス名 < 親クラス名

end
```
Carクラス（親クラス）

```
class Car
  def speed_up
    puts "加速"
  end

  def speed_down
    puts "減速"
  end

end
```
親クラスには、共通の動作を定義します。
Firetruckクラス(子クラス)

```
class PatrolCar < Car  # クラスの継承
  def siren
    puts "ウゥーウゥー"
  end
end
```
TruckCarクラス（子クラス）

```
class TruckCar < Car  # クラスの継承
  def carry
    puts "荷物を載せる"
  end
end
```
子クラスは親クラスを継承して作られ、子クラスの中にはそれぞれの特徴となる動作が定義されています。
継承のメリットコードがすっきりするのと、編集するところが共通部分だったときは全クラスじゃなく、親クラスだけで書き換えが済むことです。
プログラムはなぜ動くのか？を読んでみてまとめることで知識の定着を図る投稿#2

[プログラムはなぜ動くのか第２版](amazon.co.jp/プログラムはなぜ動くのか-第２版-知っておきたいプログラムの基礎知識-矢沢久雄/dp/4822283151/ref=sr_1_1?adgrpid=53631245656&gclid=Cj0KCQjw0pfzBRCOARIsANi0g0tajATNcn3H7Ogokqrdst5O2JctSzMRb6A0XyW5GegcPbJwaEvZO84aAlK8EALw_wcB&hvadid=338517958683&hvdev=c&hvlocphy=2392&hvnetw=g&hvqmt=e&hvrand=9776556383623440456&hvtargid=kwd-334563073858&hydadcr=27265_11561134&jp-ad-ap=0&keywords=プログラムはなぜ動くのか&qid=1583760691&sr=8-1)

を僕が師匠と読んでいる方に進めていただき、読んでみようと思いました。
そこで、僕的にはかなり難しいこともあり、この本をまとめながら読み進めていくことによって理解度を高めようと思いました。

こちらはあくまでも推奨する記事ではなく、僕がこうした方が定着しやすいかもと思い、記録に残すことにしました。

#CPUはレジスタの集合体

は？なにってるのかさっぱりわからん。
要はレジスタがスライムでCPUはキングスライムみたいな認識であってるのかな？

レジスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/a7a84332-f03c-ace0-abcd-87a6e6aea6fb.png)

CPU
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/eb69b67e-f3a2-d777-fe13-1316075b61aa.png)

であってる？

ただこの本ではプログラマが意識するのはこのレジスタ（スライム）だけでいいそうです。残りの3つ「クロック」「制御装置」「演算装置」は気にしなくてもいいらしい。

それは「プログラムはレジスタを対象として記述されるから」だそうです。

えっと、ここを読んでいくと
「アセンブリ言語は、本来なら電気信号であるここのマシン語命令に、その動作を表す英語の様な略語（ニーモニックと呼ぶ）を割り当てたものです。

movやaddは、データの格納（move）や加算（addition)という動作を表す略語です。アセンブリ言語とマシン語は基本的に1対1で対応しています。。この点が、C言語やJavaなどの高水準言語と大きく違うところであり、CPUの動きを説明するのにアセンブリ言語が適している理由です。

知らねーよ。

アセンブル→マシン語のことを「アセンブル」
マシン語→アセンブルのことを「非アセンブル」と呼ぶ


あーなるほど少しわかってきたかも。
CPUの中にはいろんなタイプや役割を持ったレジスタがあってそのレジスタ等をマシン語によって指示・実行するわけだな

なるほど・・・

| レジスタの種類      |役割　　　　　　　　 |
|:-----------------|------------------:|
|アキュムレータ|演算を行うデータ及び演算後のデータを格納する|
|フラグ・レジスタ|演算処理後のCPUの状態を格納する|
|プログラム・カウンタ|次に実行する命令が格納されたメモリーのアドレスを格納する|
|ベース・レジスタ|データ用のメモリー領域の先頭アドレスを格納する|
|インデックス・レジスタ|ベースレジスタからの相対アドレスを格納する|
|汎用レジスタ|任意のデータを格納する|
|命令レジスタ|命令そのものを格納する。プログラマがプログラムでこのレジスタの値を読み書きするのではなく、CPUが内部的に使用する|
|スタックレジスタ|スタック領域の先頭アドレスを格納する|


##まとめ

多分だがいろんな言語で書かれたコードがコンパイルされて、CPUのレジスタにいい感じにする様になるから意識すべきポイントになるんだろうな。
Atcorder154 A~C問題　C++ (全探索)

Atcorder154
https://atcoder.jp/contests/abc154/tasks


#A問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/90b6e4a7-44b9-884e-7393-b4add34f8109.png)

```A問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;

int main(){
    string S,T; cin >> S >> T;
    int A,B; cin >> A >> B;
    string U; cin >> U;
    
    if (U==S) cout << A-1 << " " << B << endl;
    else cout << A << " " <<  B-1 << endl;
    return 0;
}
```

#B問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/36dc4930-2b5e-712a-ae06-fa24a4edaf90.png)

```B問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;

int main(){
    string S; cin >> S;
    rep(i,S.length()) S[i]='x';
    cout << S << endl;
    return 0;
}
```

#C問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/cc4b628c-45a3-bf6f-4375-b70125a1f444.png)

```C問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;

int main(){
    int N; cin >> N;
    vector <ll> A(N);
    rep(i,N) cin >> A[i];
    sort(A.begin(),A.end());
    
    rep(i,N-1){
        if (A[i]==A[i+1]){
            cout << "NO" << endl;
            return 0;
        }
    }
    cout << "YES" << endl;
    return 0;
}
```

#まとめ
・B問題 **rep(i,S.length())** の様に、**文字列の長さ**を取得する文法を忘れて、時間かかっちゃった…
・C問題　数列がN個（2≤N≤**200000**）なので１ループが余裕でできることから、ソートができる！
【Docer】A server is already running.Check /hogehoge/tmp/pids/server.pid.とか言われてもファイルがない際の対処法



  docker-compose up --buildをしたところ、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/735409da-811a-7277-6459-d615b9979b94.png)


と言われました。

ターミナルにて

```
$  cd /potepanec/tmp/pids

$  ls server.pid.
```

で探したが、 No such file or directory、ファイルがないと言われました。


## 解決策

まず```Control + C```してdockerを止める。


その次に、下記のコマンドで3つがupになっているか確認。

```
$ docker-compose ps
```

3つ全てupになっていれば正常、どれか一つがexitになっていれば異常が起こっている。
（どれか一つはexitになっていると思います。）


下記のコマンドを実行する。

```
$ docker-compose down
```

再び、```docker-compose up --build```で立ち上げたところ成功。



なぐり書きです。
ユーザーの名前検索フォームの作成

#ユーザーを名前で検索する
検索フォームに入力した文字を含む名前をもつユーザーのみを一覧で表示します。
なお、検索フォームに文字が入力されていない場合は全ユーザを表示します。
検索のため、新しくアクションを定義してコントローラーで使用する方法もあります。ですが、可読性やMVCの観点から、Railsの開発はできる限り7つのアクションを利用して開発する方が推奨されている書き方であるため、今回はnamespaceを使用し専用のコントローラを作成する方法で実装します。
以下を使用しています。

- ruby 2.5.1
- rails 5.2.4.1

###namespce(名前空間)
名前の集合を分割すること、または、分割するために付けられる識別名をnamespaceと呼びます。namespaceを用いることで、同様のクラス名を名付けたクラスであってもそれらを区別することができます。

今回の場合、usersディレクトリの配下にsearches_controller.rbを作成し、users::という名前空間が付けられるため、直感的に「ユーザーを検索するコントローラー」ということがわかります。

##実装にあたって

- 今回は前提としてユーザー機能及び、一覧表示は(views/users/index.html.hamlで)出来ている状態から始める
- ユーザーの名前を保存するカラムはnameカラムとする

###userモデルにメソッドを定義
テーブルとのやりとりに関するメソッドはモデルに置きます。
理由として、そのメソッドを別の場所でも使うことができ便利だからです。

```````user.rb
def self.search(search)
  return User.all unless search
  User.where('name LIKE(?)', "%#{search}%")
end
```````
whereメソッドとLIKE句を使用して検索の処理を作ります。
もし、引数で渡されるsearchの中身に何もなければ全ての投稿を取得できるようにしています。

###コントローラーの作成

````````
rails g controller users::searches
````````
上記を実行しコントローラーを作成します。
users:: という名前空間を付けることで、usersディレクトリの配下にsearches_controller.rbを作成できます。

###ルーティングの設定

``````routes.rb
namespace :users do
  resources :searches, only: :index
end
``````
以下が設定されます。

``````
users_searches GET  /users/searches(.:format)  users/searches#index
``````
このようにnamespace :ディレクトリ名 do ~ endと囲む形でルーティングを記述すると、そのディレクトリ内のコントローラーのアクションを指定できます。
また、必ずnamespaceメソッドの記述は、resources :usersが他にある場合それよりも上の行に書きましょう。
もし下の行に書くと、先にusersのshowアクション（users/:id）が読み込まれ、実際に検索した際にエラーが生じてしまいます。

###アクションをコントローラに定義
searches_controllerにuser.rbに定義したsearchメソッドを使用し検索結果の一覧を表示するindexアクションを定義していきます。

````````searches_controller.rb
def index
  @tweets = Tweet.search(params[:keyword])
end
````````

###検索フォームの作成

`````views/users/index.html.haml
= form_with(url: users_searches_path, local: true, method: :get, class: "search_form") do |f|
  = f.text_field :keyword, placeholder: "Name", class: "search_input"
  = f.submit "Search", class: "search_btn"
``````

searchesコントローラーのindexアクションへのパスを指定し、フォームに入力された内容をsearchメソッドの引数として渡します。

###最後にsearches/index.html.erbを作成し編集
検索後に表示するビューを作成します。

#おわり
以上の方法でユーザーを名前で検索することが可能になりました。
最後まで閲覧いただきありがとうございました。
Windows10でgit bushからsublimeを開く方法

以下のリンクを参考にしました。
https://stackoverflow.com/questions/32282847/opening-sublime-text-from-windows-git-bash

まず.bash_profileファイルを作成します。
作成は以下の動画を参考にしました。gitbashでtouch .bash_profileと打ちます。
https://www.youtube.com/watch?v=Co9-jPuNvR8


sublimeを開いて以下を入力し、先ほどの.bash_profileに上書き保存します。
alias subl="/c/Program\ Files/Sublime\ Text\ 3/sublime_text.exe"

以上でsublコマンドが使用できるようになっているはずです。
アロー関数とは

JavaScriptで出てくるアロー関数についてまとめてみました。

## 関数の宣言
JavaScriptでは、関数を変数や定数に代入することができます。

```js


const getTriangle = function(base,height){
 return base * height / 2;
};
console.log('三角形は' + getTriangle(5,2));//三角形は5

```

このとき、この書いた関数をアロー関数で省略した形で書くことができます。

```js


const getTriangle = (base, height) => {
　 return base * height / 2;
};
console.log('三角形は' + getTriangle(5,2));//三角形は5

```

このように、

```
(引数) => {関数本体}
```

で書くことができるのをアロー関数といいます。

## アロー関数の書き方のバリエーション
アロー関数は、状況によって他にも書き方のバリエーションがあります。

### 引数が1つの場合

引数が1つの場合、引数の `()` を省略して書くことができます。


しかし、引数がないときは `()` を省略することなく、

```js

const helloPrint = () => {
  print('カッコの省略はだめ')
}

```

のように書きます。



### 関数本体が1行の場合

関数本体を囲む `{}` をつけずに書くという別の方法があります。

```js
(param1, param2, …, paramN) => { statements } 
(param1, param2, …, paramN) => expression
// 上記の式は、次の式と同等です: => { return expression; }
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

（ここは省略形と認識していましたが、省略ではなく別の書き方であるという指摘をいただきました。ありがとうございます！）



これでアロー関数の説明は終了です。

また一つ学びました。
Vueで単体/複数のチェックボックスを使い分ける

Vueでカスタムチェックボックスを作る際に「単体と複数をどう判定すればいいのか」を悩んだので、Vueの公式ドキュメントを改めて確認した。

[公式ドキュメント](https://jp.vuejs.org/v2/guide/forms.html#%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9)

公式ドキュメントを参考（ほとんど同じ）にサンプルを作成した。
[作成したサンプル](https://github.com/usuba-777-314/vue-checkbox-sample)

単体と複数のチェックボックスを使い分けるという点に注目して、説明する。

結論だけ見たい人は[こちら](#単体と複数の違い)。

# 単体のチェックボックス
単体のチェックボックスを作成する場合、v-modelに指定する値の初期値をbooleanにする。
チェックが入れば、「v-modelに設定したプロパティ」に「true」が代入される。
チェックが外れれば、「v-modelに設定したプロパティ」に「false」が代入される。

```vuejs
<template>
  <div>
    <h2>単体のチェックボックス</h2>

    <input type="checkbox" id="checkbox" v-model="checked">
    <label for="checkbox">{{ checked }}</label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      checked: false
    };
  }
};
</script>
```

# 複数のチェックボックス
複数のチェックボックスを作成する場合、v-modelに指定する値の初期値をArray(配列)にして、value属性を指定する。

チェックが入れば、「v-modelに設定したプロパティ」へ「valueに設定した値」が追加される。
チェックが外れれば、「v-modelに設定したプロパティ」から「valueに設定した値」が除去される。

「value」を設定していない場合、「value」は「true」として扱われた。この挙動について、公式ドキュメントに記載は見当たらなかった。もしかしたらあるかもしれない。

```vuejs
<template>
  <div>
    <h2>複数のチェックボックス</h2>

    <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
    <label for="jack">Jack</label>
    <input type="checkbox" id="john" value="John" v-model="checkedNames">
    <label for="john">John</label>
    <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
    <label for="mike">Mike</label>
    <br>
    <span>Checked names: {{ checkedNames }}</span>
  </div>
</template>

<script>
export default {
  data() {
    return {
      checkedNames: []
    };
  }
};
</script>
```

# 単体と複数の違い
単体と複数では以下の違いがあることが分かった。

|     |初期値        |value属性 |
|-----|-------------|---------|
|単体 |true / false  |なし      |
|複数 |Array(配列)  |あり       |

この違いを踏まえた上でカスタムチェックボックスを作ると簡単にできる。
プログラムはなぜ動くのか？を読んでみてまとめることで知識の定着を図る投稿#1

[プログラムはなぜ動くのか第２版](amazon.co.jp/プログラムはなぜ動くのか-第２版-知っておきたいプログラムの基礎知識-矢沢久雄/dp/4822283151/ref=sr_1_1?adgrpid=53631245656&gclid=Cj0KCQjw0pfzBRCOARIsANi0g0tajATNcn3H7Ogokqrdst5O2JctSzMRb6A0XyW5GegcPbJwaEvZO84aAlK8EALw_wcB&hvadid=338517958683&hvdev=c&hvlocphy=2392&hvnetw=g&hvqmt=e&hvrand=9776556383623440456&hvtargid=kwd-334563073858&hydadcr=27265_11561134&jp-ad-ap=0&keywords=プログラムはなぜ動くのか&qid=1583760691&sr=8-1)

を僕が師匠と読んでいる方に進めていただき、読んでみようと思いました。
そこで、僕的にはかなり難しいこともあり、この本をまとめながら読み進めていくことによって理解度を高めようと思いました。

こちらはあくまでも推奨する記事ではなく、僕がこうした方が定着しやすいかもと思い、記録に残すことにしました。

##プログラマにとってCPUとは何か？

このタイトルみた時に「は？」という気持ちになった。そうCPUってそもそも何？ということを全くすっ飛ばしてきたのだ、当然聞かれてもう「なんか金を積んでいいの買えば処理が早くなるやつ」という認識しかないのでまぁそういうところからスタートしていく

###CPUの中身は4つに分かれるらしい

・　レジスタ
・　制御装置
・　演算装置
・　クロック

レジスタ　＝　処理対象となる命令やデータを格納する領域、一種のメモリーの様なもの。種類によって異なるが、1つのCPUの内部には20~100個ほどのレジスタがあるらしい

制御装置　＝　メモリー情の命令やデータをレジスタに読み出し、命令の実行結果に応じてコンピュータ全体を制御する

演算装置　＝　メモリーからレジスタに読み出されたデータを演算する役目をもつ

クロック　＝　CPUが動作するタイミングとなるクロック信号を発生させるもの。クロックがCPUの外部にあるコンピュータでもあります。

の4つから構成されるらしい。


うん何一つわからん。

そもそもプログラムがどの様に実行されるのか、いまいちわかっていなかった。

###プログラム実行のイメージ

1. プログラマが、C言語などの高水準言語でプログラムを記述する
2. プログラムをコンパイルしてマシン語のEXEファイルに変換する
3. プログラムの起動時に、EXEファイルのコピーがメモリー上に作成される
4. CPUが、プログラムの内容を解釈・実行する

らしい。

メモリーと呼ぶのは「メイン・メモリー（主記憶）のこと。CPUと制御用チップなどを介して繋がっていて、ここに命令とデータを格納する。

メイン・メモリーは「読み書き可能なメモリー素子で構成されていて、1バイト（＝８ビット）ずつにアドレス（番地）と呼ぶ番号がついているらしい。

文字じゃイメージが沸かん。
CPUはこのアドレスを指定してメイン・メモリーに格納された命令やデータを読み出したり、逆にデータを書き込んだりします。

メイン・メモリーに格納されている命令やデータはパソコンの電源を切ると消えてしまいます。（そうなんだ）

CPUの構造がわかると、プログラムが実行される仕組みが、なんとなく見えてきませんか？プログラムが動き出すと、クロック信号に合わせて、制御装置がメモリーから命令やデータを読み出します。

その命令を解釈・実行することで、演算装置でデータが演算され、その結果に応じて制御装置がコンピュータを動かします。

「制御」という言葉を使うと、難しいことの様に感じてしまうかもしれませんが、データの演算以外の処理（主にデータの入出力のタイミング合わせ）のことを制御と読んでいるだけです。

メモリーやディスクバイダイとの入出力、キーボードやマウスからの入力、ディスプレイやプリンタへの出力なども「制御」なのです。


##まとめ

「制御」とは演算以外のこと

メイン・メモリーは電源を落とすと消える

CPUは書き込んだり読み込んだりする

クロックて何？
基本情報技術者　テクノロジ系　第7章　VPN


[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより


# VPN
Virtual Private Network: 仮装私設網

ローコスト,高安全性のネットワーク構築と運用

## IPsec-VPN
IP拡張企画　IPv6で採用
ネットワーク層で動作するプロトコル

## SSL-VPN
トランスポート層で動作

## VPNルータ
IPアドレスの暗号化復号を行う装置

### トンネルモード
これでパケットの暗号化復号化を行う方式を
トンネルモードと呼びます。
【Udemy Python3入門+応用】　41. input関数

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■input関数
#####◆基本の使い方
```python:input
while True:
    word = input('Enter:')
    if word == 'ok':
        break
    print('next')
```
```python:result
# 「Enter:」が表示され、文字を打ち込み、「ok」ならばbreakする
Enter:dcajnv
next
Enter:cajnv
next
Enter:vaonfdaa
next
Enter:ok
```
入力した文字はstr型になる。

#####◆入力するものをint型で扱いたい場合
```python:input
while True:
    word = input('Enter:')
    num = int(word)
    if num == 100:
        break
    print('next')
```
```python:result
# 「Enter:」が表示され、数字を打ち込み、「100」ならばbreakする
Enter:1325
next
Enter:314
next
Enter:100
```
入力で受け取ったものを、int型に変換する必要がある。
python文字列削除処理の備忘録

## 概要

Pythonで文字列を削除するときにちょっとはまったので備忘のため記載
`rstrip`,`lstrip`を何気なく使っているとはまるかもしれません。

### 現象

以下のようにファイル名の接頭辞または接尾辞を削除するときについ`lstrip`または`rstrip`を使いたくなってしまうかもしれません。

```python

fileName='test_出力ファイル_20191217_001.xlsx'
# 接頭辞を削除
print(fileName.lstrip('test_'))
# 出力ファイル_20191217_001.xlsx

# 接尾辞を削除
print(fileName.rstrip('.xlsx'))
# test_出力ファイル_20191217_001


```

出力結果としては問題なさそうですがここで文字列が以下のような場合に問題が発生します。

```python

fileName='test_est_出力ファイル_20191217_001xsls.xlsx'
# 接頭辞を削除
print(fileName.lstrip('test_'))
# 出力ファイル_20191217_001xsls.xlsx

# 接尾辞を削除
print(fileName.rstrip('.xlsx'))
# test_est_出力ファイル_20191217_001

```

`test_`だけまたは`.xlsx`だけが消えてほしいのにほかの文字も消えてしまっています。
原因は`lstrip`または`rstrip`で削除するのは指定した文字列と一致するものを削除しているためです。

接頭辞で消しているパターンの場合 `test_` のいずれかの文字を削除しています。
接尾辞の場合は `.xlsx`のいずれかを削除しています。

こういったときに接頭辞または接尾辞を削除したいときは
`re` を使って正規表現で削除するのがよさそうです。
例の場合ですと

```python
import re

fileName='test_出力ファイル_20191217_001.xlsx'
# 接頭辞を削除
print(re.sub("^test_", "", fileName))
# 出力ファイル_20191217_001.xlsx

# 接尾辞を削除
print(re.sub(".xlsx$", "", fileName))
# test_出力ファイル_20191217_001

```
としっかりと接頭辞または接尾辞を削除できます。

以下のように`lstrip`または`rstrip`でうまくいかなかった例もうまくいきます。

```python
import re

fileName='test_est_出力ファイル_20191217_001xsls.xlsx'
# 接頭辞を削除
print(re.sub("^test_", "", fileName))
# est_出力ファイル_20191217_001xsls.xlsx


# 接尾辞を削除
print(re.sub(".xlsx$", "", fileName))
# test_est_出力ファイル_20191217_001xsls

```
インスタンス変数

##インスタンス変数
オブジェクトが持つ属性を定義する変数です。
定義しておくことで全てのオブジェクトが同じ属性を持ちます。その属性値は、個々のインスタンスによって別々に設定できます。
クラス内のメソッドの中で、変数名の始めに@をつけて定義します。
【例】インスタンス変数の定義

```
class クラス名
  def メソッド名
    @変数名 = 値 
  end
end
```
| 項目|インスタンス変数 |
|:-----------------|------------------:|
| 定義方法 |変数名に@を前置 |
| 用途 | インスタンスごとに異なる個別の属性値を持つ場合 |
| 扱えるメソッド | インスタンスメソッド |
##スコープ
クラス内で全メソッドで共通して使用することが出来ます。
クラスから作成されるオブジェクト毎に固有できます。
pivpnの調子が悪いときのメモ

問題なく使えてたRaspberryPi VPNサーバーでデータ通信ができなくなる時がしばしばある。DDNSもしてるしなんでだろう入れ直すのもめんどくさいなぁって思ってたときに知った対処方。

```
pivpn -d
```
または

```
pivpn debug
```
してみると


```
(略)
:: [ERR] Iptables MASQUERADE rule is not set, attempt fix now? [Y/n] y
Firewall reloaded
Done
(略)
::: Debug output completed above.
::: Copy saved to /tmp/debug.txt
::: 
```
→治った！
herokuでopencvを使うには？

#herokuでcv2を使うには？

```
git push heroku master
```

をしたら、

```
ModuleNotFoundError: No module named 'cv2'
```
というエラーがでた。

opencv-pythonを使うのだが、requirements.txtにopencv-pythonを加えるだけではうまく行かないらしい。

```
$ heroku stack:set container
```
を実行。

```heroku.yml
build:
  languages:
    - python
  packages:
    - libopencv-dev
run:
  web: gunicorn server:app --log-file -
```
とういファイルを作成。

この後、
add、commit 、pushをしたらうまくいった。
（pushにはかなり時間がかかった）

[Heroku、FlaskとOpenCVの環境構築](https://qiita.com/maeda_mikio/items/1a6899e104aac7b138fc)
【Udemy Python3入門+応用】　40.while else文

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■else文
#####◆`else`の使い方
```python:else
count = 0

while count < 5:
    print(count)
    count += 1
else:
    print('done')
```
```:result
0
1
2
3
4
done
```
`while`で指定した条件に当てはまらなかった場合、
`else`内に記述したものが実行される。


#####◆`break`と`else`
```python:break_else
count = 0

while count < 5:
    if count == 1:
        break
    print(count)
    count += 1
else:
    print('done')
```
```:result
0
```
`break`でループを抜けた場合は、`else`内で記述されたものは実行されない。
逆に言えば、`else`は、`while`を`break`によるものではなく抜けた場合、実行される。
基本情報技術者　テクノロジ系　第6章　IPアドレスの設定とサーバの設置

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより



# IPアドレスの設定

## IPアドレス
どのネットワークに属しているか
ホスト部が何ビットかに注目します。

## サブネットマスク
何ビットまでがネットワーク部、ホスト部かを表します。

255.255.255.0

と表現されることがありますが
2進数に直すと

11111111 11111111 11111111 00000000

となります。

1の部分がネットワークのアドレスを表し
0がホスト部を表します。

よって255は8ビット分ネットワークを表していると考えてください。


# サーバの設置

## DHCP
IPアドレスを自動設定するシステムのこと


## ブロードキャスト
同じメッセージを複数の受信者に同時に転送することです
ネットワークに所属する全体に送ると考えていただければ

## プロキシサーバ
webサーバアクセスの代理サーバのこと

社外に直接アクセスできない時
社内でアクセスできるところに設置して
このサーバを通してみることができるようになる。
Pythonを使って、Jupyter Notebookのテンプレートを作るCLIツールを作成した

# 3行で。
* Notebookのテンプレートを作成するツール『notelate』を作成しました。
* ```pip install notelate```でインストール。
* ``` notelate [template name]```でカレントディレクトリにipynbファイルが生成されます。

# 動機
Jupyter Labをよく使用するのですが、毎回```import pandas as pd```などと書くのが非常に面倒でした。
テンプレートを用意してコピペで増やすことで対応していました。

検索すると、Jupyterlabのアドインが公開されていました。([jupyterlab_templates](https://github.com/timkpaine/jupyterlab_templates))
しかし、自らテンプレートを登録する必要があり、面倒でした。

そこで、テンプレートをシェアできる機能をもたせたツールを作ろうと思いました。

# 使い方
## インストール
pip環境下で以下を入力することでインストールされます。
```pip install notelate```

## 使用する

### テンプレートの生成
以下のコマンドでカレントディレクトリにipynbファイルが生成されます。template nameを入力しない場合は非常に簡単なbasic.ipynbが生成されます。
``` notelate [template name]```

### テンプレートの確認
以下のコマンドで使用可能なテンプレートを確認できます。
``` notelate list```



# 参考にしたもの
以下の2記事を主に参考にしました。
[PythonでサクッとCLIツールを作る](https://qiita.com/Tadahiro_Yamamura/items/cecbc27182b76257d18f)
[PyPIデビューしたい人の為のPyPI登録の手順](https://qiita.com/kinpira/items/0a4e7c78fc5dd28bd695)
[公式ドキュメント](https://packaging.python.org/tutorials/packaging-projects/)

Pythonのコード自体はファイルをコピーするだけですので、割愛しますが、PyPIのためのsetup.pyが一番大変でした。
Githubにコードはありますので、ご覧いただければと思います。
ツール自体は1時間で作成し、PyPIの手続きで2時間ほどかかりました。

# さいごに
読んでいただきありがとうございました。
想像していたよりも簡単にツールの作成やPyPIへの登録や公開が完了し、驚きました。

コードはGithub上にありますので、スターやプルリクいただけると嬉しいです。
[Githubリポジトリ: notelate](https://github.com/punisuke/notelate)
[PyPI: notelate](https://pypi.org/project/notelate/)
【UiPath】「通常使うプリンター」をStart Processを使って変更する

## 概要
UiPathのStartProcessアクティビティからrundll32.exeを呼んで通常使うプリンターを変更します。

## 方法
以下のようにパラメータを設定し、実行すると通常使うプリンターが変更されます。
![シーケンス10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/45b0a5bb-0f92-766e-c743-ce9f3b753241.jpeg)
・アクティビティ：<b>StartProcess</b>
・ファイル名：<b>"rundll32.exe"</b>
・引数：<b>"printui.dll,PrintUIEntry /y /n ""Microsoft Print to PDF"""</b>

<b>`Microsoft Print to PDF`</b>の部分がプリンター名に当たります。
ここを変数にする場合は、
<b>"printui.dll,PrintUIEntry /y /n """ + `変数名` + """"</b>
で記述できます。ダブルクォーテーションの数に注意ですね。

### もう少し実用的に
成功時は何のメッセージも出ませんが、失敗時はエラーのポップアップが表示されます。
これを拾ってロボットでもエラーを出すようにしてみます。
![エラー5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/1bf37db4-1fa6-af6f-217c-212f887e68c3.png)
![シーケンス11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/327029d1-92ed-91dc-a554-6721dc822508.jpeg)
UiElementExistsで要素の有無を検出して、Trueが返った場合は次のCheckFalseでエラーがスローされます。
プリンター名も変数に持たせるようにしてみました。
これで完成形になります。

## 参考記事
* [通常使うプリンタをコマンドプロンプトから切り替える](https://qiita.com/rohinomiya/items/43f92cfcd19daa859425)

## 動作環境
* UiPath 2019.9.2 Community Edition
* Windows 10 Home 1903
DVWA（XXS:DOM）全レベルの脆弱性について

## 前提
- kali linux環境がある
- [DVWAのセットアップ済み](https://qiita.com/KPenguin/items/7e4f1c428c3dadf8591c)
- [初級レベル理解済み](https://qiita.com/KPenguin/items/983348dace1527ef9963)

## 目標
- 脆弱性の理解を深める。

## 手順概要
- 大まかな挙動を把握する
- コードを見て脆弱性をみつける
- コードの脆弱性を攻撃する

## 内容
###挙動の把握
- ボタンを押すとGETリクエストが飛ぶ
- クエリにdefault=hogeが乗っかる
- そのクエリをもとにoptionタグへ値が転写される（下図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/85b9c412-ed2f-e4e6-a07b-47012a670069.png)

### コードを確認
#### low
- 特に設定なし。
- scriptを差し込めば、そのまま転写される。

```php:
<?php
# No protections, anything goes 
?> 
```

#### medium
- stripos(a,"str")は、aの中に"str"が入っていれば真
- 今回の場合、<scriptが入っていれば、Englishで処理される
- 逆に言うと、<scriptを含めなければOKである

```php:
<?php
$default = $_GET['default'];
# Do not allow script tags
if (stripos ($default, "<script") !== false) {
    header ("location: ?default=English");
    exit;
} 
?> 
```

#### high
- 文字列が完全に一致しない場合、Englishで処理される。

```php:
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    } 
```

#### impossible
- コード不明。いい感じにプロテクトされているらしい。

```php:
<?php
# Don't need to do anything, protction handled on the client side
?> 
```

### 脆弱性を攻撃する
#### low
- 防御無しのため、ストレートに攻撃する。
- `<script>alert("low")</script>`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/34893ffe-784a-dd64-398c-937d01f235b7.png)

#### medium
- `<script`は封印されたので、それ以外で埋め込む。
- 注意点はDOMを壊さないように調整すること。
- `dummy</select><img src="#" onerror=alert("medium")>`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/b17bbd05-1cbd-03bd-c327-c7fb9c0e1a94.png)

#### high
- phpの特殊文字のエスケープがされていないため、コメントアウト`#`を使用し、チェックをスルーさせる。
- `French# <script>alert("high")</script>`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/5afadabf-37ee-2076-cfc8-e5e0ecab02f2.png)

#### impossible
- 無理っぽい
Google スプレッドシート試してみた

#GOOGLE スプレッドシート基礎
###GOOGLETRANSLATE関数
GOOGLETRANSLATE({cell},"{lang}","{lang}")
よく英語の訳文でよく見る「野獣先輩はアメリカで有名な男性です」はどうなるのか
GOOGLETRANSLATE1
Beast Senpai is a famous man in the United States
GOOGLETRANSLATE2
ビースト先輩は、米国の有名な人であります

「目に見えるものは全部愛おしくて 耳に届く音は何もかも美しい」の中国語だと
GOOGLETRANSLATE1
您所看到的一切都是可爱的，传到您耳朵的声音都非常美丽
GOOGLETRANSLATE2
すべてが素敵で、それはあなたが非常に美し
英語と中国語で精度に差が出過ぎてワロタｗｗ

###IMAGE関数
=IMAGE("{URL}",{Mode})
![[ここ](https://qiita.com/kawaguchi5460/items/d18b11fc572e9c93c932)の西行寺幽々子の写真](https://qiita-user-contents.imgix.net/http%3A%2F%2Flivedoor.blogimg.jp%2Frezanov88%2Fimgs%2F2%2Fd%2F2d086139.jpg?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=813e50401b9f858328ab1c9f0cb82fd7)
を表示させてみた({Mode}=2)。結果は大成功。

###BOOL関数

|関数名|引数|戻り値|
|---|---|---|
|NOT|BOOL|BOOL|
|OR|BOOL,BOOL|BOOL|
|AND|BOOL,BOOL|BOOL|
|IF|BOOL,真の時,偽の時|三項演算結果|
|SWITCH|BOOL,前が真のとき,BOOL,前が真のとき,BOOL,前が真のとき,(...,)偽のとき|最初の真の演算結果|

###加減乗除関数

|関数名|引数|戻り値|
|---|---|---|
|ADD|数値,数値|数値|
|MINUS|数値,数値|数値|
|MULTIPLY|数値,数値|数値|
|DIVIDE|数値,数値|数値|
|QUOTIENT|数値,数値|数値|
|SUM|数値又は範囲,数値又は範囲,(...)|数値|
|PRODUCT|数値又は範囲,数値又は範囲,(...)|数値|

###数学系関数
|関数名|引数|戻り値|意味|
|---|---|---|---|
|UNARY_PERCENT|数値|数値|百分率|
|POW|ソース値,指数|数値|べき乗|
|LOG|数値, 底|数値|対数|
|SQRT|数値|数値|平方根|
|PI|NULL|3.14159265358979...|円周率|

GASと組み合わせると色々便利ですよね。スプレッドシートの関数だけでも何か作れそうｗｗ。