OmniAICreator/Qiita-1.07M huggingface dataset:
RxJavaの基本的な処理シーケンス（古め）

# Reactiveの勉強記事
Reactiveを理解したいが何もわからんので、
[Reactive Programming With RxJava](https://www.oreilly.com/library/view/reactive-programming-with/9781491931646/) のサンプルコードが、裏でどのように動いているのかを記述していく。

2016年の本なので、`Observable.create` のような Deprecatedとなっている古いAPIなどを使用している。


## RxJava 
### 簡単な登場人物
![study-RxJava.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213002/65120aa3-fc40-5772-41ae-effd6c57ad8c.png)



![store-uml-RxJava_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213002/a0cf3551-b966-6608-0bcd-555cc4db0e9e.png)


### シンプル

```kotlin
fun main(args: Array<String>) {
    Observable.create<String> { s ->
        s.onNext("one")
        s.onCompleted()
    }.subscribe { s -> println("VALUE -> $s") }
}
```

![store-uml-RxJava_sequence1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213002/6167a98a-cbc4-0d32-e2f8-8695b0244fcf.png)


- `create {s -> s.OnNext("one") ...}` 
    - 引数のラムダ式は `OnSubscribe` の実装として解釈される。
- `subscribe { s -> println("VALUE -> $s") }` 
    - 引数のラムダ式は `Action1` という内部的に使用されるインターフェイスの実装となる、
    - `subscribe` の内部で `Action1` をwrapして `Subscriber` のインスタンスを作成
    - その後 `OnSubscribe` の `call` を呼び出す。 
        - これによって `create` の引数のラムダ式が呼び出される。 
        - `call` の引数は直前に作成した `Subscriber`
    - ラムダ式は引数の `Subscriber` に対して、 `onNext` を呼び出す。
    - `Subscriber` の `onNext` は、 `subscribe` の引数のラムダ式をcallすることで呼び出す。

### doOnNext

```kotlin
fun main(args: Array<String>) {
    Observable.create<String> { s ->
        s.onNext("one")
        s.onCompleted()
    }.doOnNext { i -> println("doOnNext $i") }
            .subscribe { s -> println("VALUE -> $s") }
}
```
![store-uml-RxJava_sequence2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213002/9cef5aac-a872-6344-ab96-d03d5d70c34e.png)

オレンジが `doOnNext` 関連によって作成される処理
proxy的な動きをしていることがわかる

### map

```kotlin
fun main(args: Array<String>) {
    Observable.create<String> { s ->
        s.onNext("one")
        s.onCompleted()
    }.map { "hello $it" }
            .subscribe { s -> println("VALUE -> $s") }
}
```

![store-uml-RxJava_sequence3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213002/e71bff75-215b-5970-08c1-89c6b1c9bb86.png)

`doOnNext` とほぼ同じ動作

### 別ThreadからのPublisher

```kotlin
fun main(args: Array<String>) {
    println(Thread.currentThread())
    Observable.create<String> { s ->
        Thread {
            println(Thread.currentThread())
            s.onNext("one")
            s.onNext("two")
            s.onCompleted()
        }.start()
    }.subscribe { s -> println("VALUE -> $s by ${Thread.currentThread()}") }
}

// 出力結果
Thread[main,5,main]
Thread[Thread-0,5,main]
VALUE -> one by Thread[Thread-0,5,main]
VALUE -> two by Thread[Thread-0,5,main]
VALUE -> three by Thread[Thread-0,5,main]
```

![store-uml-RxJava_sequence4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213002/731fd4af-d7a6-64a6-3ea5-db1c190ce57b.png)

別スレッドでpublishされた場合は、そのスレッドでsubscribeされる。
VirtualBoxでWindowsとUbuntuの共有フォルダ設定がうまくできない時の確認ポイント

VirtualBoxでは、ホストOS・ゲストOS双方で参照できる共有フォルダを設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459893/3ac666b0-037e-b5b6-6d00-912876caf866.png)

設定は、VirtualBoxマネージャーから各ゲストOSの設定メニューにある「共有フォルダー」で行います。

ただ、ここで設定しただけではうまくいきませんでした。

追加で以下2点実施したところ、設定が反映されました。

1. Gust Additionsのインストール
2. 以下コマンドの実行

```
sudo gpasswd -a ｛ユーザー名｝ vboxsf
```
wp2txtのインストール中、nokogiriがないと怒られた時の対処法




```
sudo gem install wp2txt
```
を実行したところ、nokogiriというものをインストールするところでエラーが発生。

散々調べて色々試した結果、公式サイトっぽいところに掲載されていた以下コマンド実行したら、無事解決。長い戦いだった・・・。


```
sudo apt-get install build-essential patch ruby-dev zlib1g-dev liblzma-dev
gem install nokogiri
```

https://nokogiri.org/tutorials/installing_nokogiri.html
python テキスト読み上げ (pyttsx3)

# pyttsx3の理解を深める。
pyttsx3 はpythonのテキスト読み上げ変換ライブラリ。
題材はボディービルの掛け声にして勉強。
興味があるものを題材にした方が意欲がわく。
#### 参考
https://pypi.org/project/pyttsx3/
https://coolfitness.jp/bodybuilding_kakegoe/
## 目次
１．install と import
２．使用法
３．調整
４．使ってみる（ボディービルの掛け声）
## 1.install と import
```python:install　import
pip install pyttsx3
import pyttsx3
```
## ２．使用法
```python:基本形
engine = pyttsx3.init()
engine.say("切れてるよ")     #出力したい言葉
engine.runAndWait()
```
## ３．調整（速度：rate と音量：volume）
```python:調整
engine = pyttsx3.init()


#rate デフォルト値は200
rate = engine.getProperty('rate')
engine.setProperty('rate',200)

#volume デフォルト値は1.0、設定は0.0~1.0
volume = engine.getProperty('volume')
engine.setProperty('volume',1.0)


engine.say("切れてるよ")
engine.runAndWait()
```
## ４．やってみる（ボディービルの掛け声）
```python:やってみる
import pyttsx3
engine = pyttsx3.init()

#参照した言葉
words = ["腹筋、板チョコ！","ナイスバルク！","でかいよ！、他が見えない！",
        "土台が違うよ、土台が！","もうでかい！","切れてるよ！","バリバリ",
        "仕上がってるよ！","三角チョコパイ！","腹筋グレネード！",
        "腹筋ちぎりパン！","腹斜筋で大根をおろしたい！","脚が歩いている！",
        "グレートケツプリ！","カーフでかいよ！","胸がケツみたい！",
         "胸がはち切れる！","背中に羽が生えてる！","空も飛べるはず！",
        "背中に鬼が宿ってる！","背中にクリスマスツリー！",
         "上腕二頭筋ナイス！チョモランマ！","さんとうもいいね〜",
        "肩メロン！","肩にちっちゃいジープ乗せてんのかい！"]

rate = engine.getProperty("rate")
engine.setProperty("rate",200)

volume = engine.getProperty('volume')
engine.setProperty('volume',1.0)

#参照した言葉の出力
for word in words:
    engine.say(word)

engine.runAndWait()
```

漢字が正確に読めてないのはありますが、日本語が上手くない方が話している風が出ています。
個人的には満足です。
OpenCVの基本コード（python）

# はじめに
pythonのopencvコード一覧。まだまだ書き足すつもりです。

# ライブラリの読み込み

```py
import cv2 # opencv
import numpy as np # numpy
```

# 画像の読み込み

```py
img = cv2.imread('/home/kono/画像/image01.jpg') # imgに入れる
```

# 画像の書き出し

```py
cv2.imwrite("/home/kono/画像/output_img.jpg", img)
```

# 画像の表示(不確定)

```py
cv2.namedWindow('img', cv2.WINDOW_NORMAL) # ウインドウの大きさ設定
cv2.imshow('img', img)
cv2.waitKey(2000) # 画像の表示時間
cv2.waitKey(1)
cv2.destroyAllWindows() # ウインドウをすべて閉じる
cv2.waitKey(1)
```

# ガウシアンフィルタ
```py
gaus = cv2.GaussianBlur(img, ksize=(3, 3), sigmaX=10)
```

カーネルサイズと標準偏差x, yを指定

# HSVでマスク処理

```py
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV変換
lower_color = np.array([10, 100, 100]) # HSV下の値
upper_color = np.array([20, 240, 160]) # HSV上の値
hsv_mask = cv2.inRange(hsv, lower_color, upper_color) # 与えられた範囲で二値化
output = cv2.bitwise_and(img, img, mask = hsv_mask) # マスク
```
Pixel4のカメラで学ぶDepth map-4(pre-process最終回)

#はじめに
この記事は[Note](https://note.com/sv_engineer/m/m98195ca0c6e1)で連載している記事で扱っているCode部分のみを切り出しています。技術背景等にご興味がある方はNoteの記事の方をご参照ください。
　今回は前処理部分の最終回となります。今まで[Dark shading補正](https://qiita.com/BOPsemi/items/37f5cb253cfc26dd7161)及び[画像修正処理](https://qiita.com/BOPsemi/items/afb47ad0565237593ba4)で下準備ができたので、これらを統合し、Pre-process部分を完成させます。
#Enum定義
　Global定数として使用する値を先に定義しておきます。画像サイズやプロジェクトのフォルダー関連情報を一箇所に集めておき管理しやすくするのが目的です。

```python:parameter.py
class ProjectFolder(Enum):
    """ Define project folders
    TOP
     project top folder
    DARK
     folder of dark shading
    PGM
     folder for pgm, the folder should include left and right raw image data
    JPG
     folder for saving JPEG images
    DISPARITY
      folder for saving disparity images as a result of depth estimation
    """
    TOP = #Projectのトップレベルの絶対パス
    DARK = 'dark/'
    PGM = 'pgm/'
    JPG = 'jpg/'
    DISPARITY = 'disparity/'


class ImageSize(Enum):
    """ Define image size
    WIDTH
     image width
    HEIGHT
     image height
    """
    HEIGHT = 1512
    WIDTH = 2016
```

#Main関数定義
　全ての準備は揃いました。それではMain関数を定義します。

```python:main.py
import parameters
import dark
import dualpixel
import helper
import matplotlib.pyplot as plt


if __name__ == "__main__":
    # path setting
    DARK_PATH = parameters.ProjectFolder.TOP.value + parameters.ProjectFolder.DARK.value
    PGM_PATH = parameters.ProjectFolder.TOP.value + parameters.ProjectFolder.PGM.value
    JPG_PATH = parameters.ProjectFolder.TOP.value + parameters.ProjectFolder.JPG.value

    # image size setting
    width = int(parameters.ImageSize.WIDTH.value)
    height = int(parameters.ImageSize.HEIGHT.value)

    # initialize dark image
    print('--- Start dark shading correction ---')
    dk_sh = dark.Dark(DARK_PATH, 'pgm', dsize=(width, height))
    
    # calculate gain map for dark shading correction
    # left_gain_map     :use this map to correct left-PD image
    # right_gain_map    :use this map to correct right-PD image
    left_gain_map, right_gain_map = dk_sh.get_gain_map(kernal_size=32, analog_gain=[0.6, 0.6, 0.6], \
        left_offset=(0, 150), right_offset=(-80, 150))

    # initialize dualpd class
    print('--- Start raw data cooking ---')
    dualpd = dualpixel.DualPixel(PGM_PATH, 'pgm', dsize=(width, height))

    # set left and right gain map
    dualpd.set_dksh_gain_map(left_gain_map, left=True)
    dualpd.set_dksh_gain_map(right_gain_map, left=False)

    # run process
    raw_data_file_list, proc_imgs = dualpd.run_process(bi_kernel_size=5, bi_disp=75, \
        unsharp_sigma=2, eq_grid_size=2, eq_sigma=32, eq_mean_value=128)

    # write images
    print('--- Outputing the processed images to folder ---')
    helper.write_img_to_path(JPG_PATH, raw_data_file_list, proc_imgs)

    print('--- Finished !! ---')
```
今まで定義したものを処理順に並べて流すだけです。
【Java】hasNext関数の使い方

#プログラミング勉強日記
2020年12月27日
[【Java】標準入力を取得・出力する方法](https://qiita.com/mzmz__02/items/3e4c0a7ccbf3bae6f5d3)で標準入力について扱っているが、そのときにhasNextの存在を知らなかったので、今日簡単にまとめる。

#Scannerクラスとは
　標準出力するときやファイルのなかみを読み込むときに使う。
　Scannnerクラスのインスタンスを作る際に標準出力の場合は`System.in`をファイルを読み込む場合はfileオブジェクトを設定する。

```java:基本的な書き方
Scanner 変数 = new Scanner(値);
```

#hasNext関数とは
　Scannnerクラスでファイルを読み込んだときにまだ繰り返し処理ができるかどうか判定する処理である。前から順番に値を取得して、まだ値を取得できるときにはtrueを、これ以上値を取得できないときにはfalseを返す。
　いくつ入力されるかわからない場合は、for文で回数を指定して受け取ることができないので、そういったときに使う。


　hasNext関数とセットで使われるのがnext関数である。next関数は前から順番に値を取得していき、hasNext関数で値があるかを判定する場所を次に進める。

```java:基本的な書き方
while(繰り返したいオブジェクト.hasNext()) {
  String 変数 = 繰り返したいオブジェクト.next();
  後続処理;
}
```

　

#サンプルコード

```java:ファイルの内容を読み込むプログラム
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Sample {
  public static void main(String[] args) throws FileNotFoundException {
    File file = new File("sample.txt");
    Scanner scanner = new Scanner(file);
    while (scanner.hasNext()) {
      String str = scanner.next();
      System.out.println(str);
    }

    scanner.close();
  }
}
```

```java:キーボードから入力された文字を反転して表示するプログラム
import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        try {
            while (s.hasNext()) {
                String value = s.next();
                System.out.println(new StringBuilder(value).reverse());
            }
        } finally {
            s.close();
        }
    }
}
```


#参考文献
[ScannerのhasNextメソッドの使い方](https://jpliterature.hatenablog.com/entry/java-scanner-hasnext)
[JavaのScannerクラスのhasNext関数について現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/38172)
[キーボード入力から取得！JavaでScannerクラスを使う方法【初心者向け】](https://techacademy.jp/magazine/19025)
FactoryBotで関連データを一緒に作成 自分用

## after(:crate)を使いましょう

####case

userがteacher_accountにアップデートした際、
user_performanceを関連データとして作成。

user_performanceはポリモーフィック関連を利用

####code

```ruby
FactoryBot.define do
  factory :user do
    sequence(:username) { |n| "Testuser#{n}" }
    sequence(:email)    { |n| "tester#{n}@example.com" }
    password            { 'password' }
    phone_number        { "0#{rand(0..9)}0#{rand(1_000_000..99_999_999)}" }
    confirmed_at        { Date.today }

    trait :teacher_account do
      teacher   { true }

      after(:create) do |user|
        create(:user_performance, performancable: user)
      end
    end
  end
end

```
Gmailの自動振り分け設定（受信済のメールに対する適用や設定の確認・削除についても）

# 自動振り分け設定の作り方

自動振り分けしたいメール本文を開いて下記の **メールの自動振り分け設定** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7868cb61-2f97-7edb-b071-b165aad5abac.png)
あとはもう読んで字のごとくです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/dd7f0580-a5a2-2e6b-e695-fc8a63083c79.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3a35caa4-7bd8-c95f-14e4-e361785c88e0.png)

# 受信済のメールに適用するにはどうすればいい？
（自動振り分けの確認・削除の手順も兼ねてます）

右上の歯車マークをクリックして **すべての設定を表示** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e4937373-8b17-b789-6dc1-5bdf134166e9.png)
**フィルタとブロック中のアドレス** のタブ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3c1ab9bb-abfa-e14a-cda3-78e0585ba3dc.png)
いじりたい設定の **編集** を。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/76d1d203-3e14-0534-536a-7bb6470b667a.png)
**一致するメッセージにもフィルタを適用する** = 受信済のメールに自動振り分けを適用させる です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7e0bdd98-54f7-9002-4627-f04ff900b539.png)

# 蛇足

手作業で振り分けていた時代が私にもありました。。

『いろんなアカウント取得』とか『お買い物通知（クレジットが不正使用されてないよね確認）』とか、なんやかんやでメールは使いますん。


# バージョン
Windows10 Pro バージョン20H2 OSビルド19042.685
Google Chrome 87.0.4280.88
RSpecにてプライベートメソッドのテスト方法　自分用

##結論

sendで送る

calculate_average_scoreはプライベートメソッド

```ruby
let!(:user) { create(:user) }
context 'calculate_average_score' do
  subject { user.send(:calculate_average_score) }
  it      { is_expected.to eq ** }
end
```
M1 MacでNode.js(arm64)をNVMを使ってインストールする

最新のNVMとNode.jsをインストールすればいけると思ってたら罠でした。
多くの方は迷わずインストールできると思いますが、arm64版以外のNode.jsをイン

## TL;DL


```terminal
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
$ nvm install 15
```

これをbashなりzshなりで実行するだけです。現在バイナリが用意されていないので、ソースコードをダウンロードした後にビルドが始まります。
ビルド完了後、`node -p process.arch`と入力し`arm64`と表示されれば成功です。`x64`と表示された方はもう少しお付き合いください。

## 環境

```terminal
$ uname -a
Darwin Mac-mini.local 20.2.0 Darwin Kernel Version 20.2.0: Wed Dec  2 20:40:21 PST 2020; root:xnu-7195.60.75~1/RELEASE_ARM64_T8101 arm64

$ sw_vers
ProductName:	macOS
ProductVersion:	11.1
BuildVersion:	20C69

$ nvm --version                                                             
0.37.2
```

arm64に対応しているNode.jsのバージョンは15以上です。

## `node -p process.arch`で`arm64`以外が表示される

Pythonのアーキテクチャがx86_64の場合にNode.jsのビルドに失敗します。arm64版のHomebrewからPythonを再インストールし終えたらNode.js v15の再インストールを行ってください。

## 結果

```terminal
$node -p process.arch
arm64
```

## 参考

- [nvm install node fails to install on macOS Big Sur M1 Chip](https://github.com/nvm-sh/nvm/issues/2350)
goのechoでファイルへログを出力できるようにする


```golang

fp, err := os.OpenFile("logs/debug.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
	panic(err)
}

e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
	Output: fp,
}))

```
3.3Vから5Vへの昇圧型スイッチング電源(5V液晶用等)HT7750A

目的　5V液晶や5V,OLED用に最低の部品数とコストで昇圧を作る

5Vキャラクター型液晶1602系は、3.3Vで使おうとすると液晶の
コントラストが低くて薄くて見えない。いろいろな方法があるが
安価に3.3Vで使いたい。

そこでHT7750Aを使うと4個の部品で昇圧回路が出来る。

部品
HT7750A 1個　通販コード　I-02800
16v47uFコンデンサー 1個
10v100uFコンデンサー 1個
33uHコイル 1個
1ss178ダイオード 1個

約1個　100円で出来る。

作り方
1. コンデンサーのマイナス側同士を半田する。
2. 100uFコンデンサーのプラス側にコイルを半田する。
x接着材で固定する。
3. ダイオードをicに半田する
4. icの5vを47uFコンデンサーのプラス側に半田する
5. icのアースを半田する
6. icのLXをコイルに半田する
7. 出来上がり。

![3v-5v_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/28af91ee-a83c-2698-c3e7-1f3823609acb.jpeg)


![3v-5v_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ac2ab0c5-8287-aed5-a210-637d54c7fac4.jpeg)

![3v-5v_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3b632f44-a980-85fd-c42e-ddad3a292d71.jpeg)
XPS13(7390)にArchを入れた(備忘録)

#はじめに
XPS13(7390)にArchを入れた時の手順とハマったことの備忘録．

#参考にしたサイト
[Arch wiki インストールガイド](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)
[My Arch Linux Install and Configuration on a Dell XPS 13 7390 (2019)](https://www.mccurdyc.dev/posts/2020/03/my-arch-linux-install-and-configuration-on-a-dell-xps-13-7390-2019/)
[メモ：Dell XPS 13 (7390)にArch Linuxをインストールしたときのメモ](https://notchained.hatenablog.com/entry/2019/10/07/225728)
[Arch Linux - wifi-menuがないのでiwctlコマンドで無線接続する](https://qiita.com/matoruru/items/f75ee1bfa92e6e275097)

基本的にはこの辺を参考にしました．

#ハマったことと解決策
## Critical Error Message No bootable devices found.
->[ArchLinuxのインストール(3つのブート方式ごとの設定)](https://qiita.com/Gen-Arch/items/da296b7cbe5d87abc5a4#grub%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

## Rebootしたら，Error:device '/dev/mapper/vg0-root' not found.
->[[SOLVED] Installed LTS kernel- device '/dev/mapper/vg0-root' not found](https://bbs.archlinux.org/viewtopic.php?id=255329)
ここが一番ハマった...

```cmd:/etc/mkinitcpio.conf
HOOKS=(base udev autodetect keyboard keymap consolefont modconf block lvm2 encrypt filesystems fsck)
```


```cmd:/etc/default/grub
GRUB_CMDLINE_LINUX=”cryptdevice=UUID=[UUIDofdevice]:vg0 root=/dev/mapper/vg0-root”
```

UUIDは下のコマンドで確認．

```cmd
# cryptsetup luksUUID /dev/nvme0n1p2
```

## インストール後にReboot->wifi接続できない  
->iw，dhcpcd，wpa_supplicantをあらかじめインストールしておく．  
[My Arch Linux Install and Configuration on a Dell XPS 13 7390 (2019)](https://www.mccurdyc.dev/posts/2020/03/my-arch-linux-install-and-configuration-on-a-dell-xps-13-7390-2019/)

## wifi接続する
-> [wpa_supplicant](https://wiki.archlinux.jp/index.php/Wpa_supplicant#wpa_passphrase_.E3.81.A7.E6.8E.A5.E7.B6.9A.E3.81.99.E3.82.8B)
-> [netctl](https://wiki.archlinux.jp/index.php/Netctl)
-> [Arch Linux - 無線 LAN 接続](https://aznote.jakou.com/archlinux/wireless.html)
-> [ワイヤレス設定](https://wiki.archlinux.jp/index.php/%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E8%A8%AD%E5%AE%9A)

この辺が役に立ちました．wifiはnetctlではなくNetworkManagerにしたらうまくいきました．またうまくドライバが動作しない時は，他のドライバと競合していないか確かめるのが良いです．

```cmd
# systemctl list-unit-files --state=enabled
```
AnacondaでOpenCVのインストール

# はじめに
AnacondaでOpenCVをインストールしたい。

# インストール
Anaconda Navigatorを開く。
Environments
ここで仮想環境を作れるらしいが、今回はbase(root)にインストール。
search packageでopencvを検索したが、出てこない。
右上のUpdate index やChannelsをいじっていたら出てきた。よかった。

- libopencv
- opencv
- py-opencv

をインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963393/d3ab4271-db53-62d4-2618-c926b31a9b6e.png)

# Jupyter Notebook上で実行
base(root)上でjupyter notebookを開く。

```
import cv2
```

が実行できればOK。

# まとめ
ユーザー名に漢字を使っていたりするとAnaconda Navigatorが動かない。
私はそこで躓きました。
【Dart】Mapのvalueを使ってソートする



Mapのvalueでソートしたい事があったので調査しました。

[SplayTreeMap<K, V> class](
https://api.dart.dev/stable/2.10.0/dart-collection/SplayTreeMap-class.html)
SplayTreeMapのfromにソートしたいmapとcompareを渡せばソートできるみたいです。

下記のようなオブジェクトを作成しました。属性idでソートする予定。

```Dart:Object
class Employee{
  int id;
  String name;
  Employee(this.id,this.name);
}
```
最初の並び順は下記の様な感じです。

```Dart:unSort
  Map<String,Employee> map = Map<String,Employee>();
  map['hoge'] = new Employee(1, "sato");
  map['huga'] = new Employee(3, "tanaka");
  map['piyo'] = new Employee(2, "yamashita");

  map.forEach((key, value) {
    print("key:"+key+" | id:"+value.id.toString()+" | name:"+value.name);
  });
```
### 出力
```
key:hoge | id:1 | name:sato
key:huga | id:3 | name:tanaka
key:piyo | id:2 | name:yamashita
```

ソート後のMapを作成し再度出力すると…

```Dart:sorted
final sortedMap = SplayTreeMap.from(
    map, (a, b) => map[a].id.compareTo(map[b].id));

sortedMap.forEach((key, value) {
  print("key:"+key+" | id:"+value.id.toString()+" | name:"+value.name);
});
```
### 出力
```
flutter: key:hoge | id:1 | name:sato
flutter: key:piyo | id:2 | name:yamashita
flutter: key:huga | id:3 | name:tanaka
```

オホ
できましたね。
古地図を扱う新概念HTGCLと、OSMデータを時代を結ぶ背骨にするアイデア

この記事は[OpenStreetMap Advent Calendar 2020](https://qiita.com/advent-calendar/2020/osmjp)の23日目の記事を、26日目が過ぎてから書いているものです。
今年もいくつかのAdvent Calendarに参加して、多くを12/20の週末に書き溜めていたのですが、書き溜められなかったものはやはり次の週末まで書けませんでした。
申し訳ありません。

また、この記事は基本、[State of the Map 2020 Japan Online](https://stateofthemap.jp/2020/)での私の発表を紹介するだけの記事です。
発表記事へのリンクはこちらになります。

[![thumbnail](https://files.speakerdeck.com/presentations/67b33f8a83a64688b9dc40952854cd64/slide_0.jpg?16663670)](https://speakerdeck.com/kochizufan/sotm-japan-2020)
[A vision to make OSM data the backbone of history across time and space - Introduction to HTGCL -](https://speakerdeck.com/kochizufan/sotm-japan-2020)

発表以降の新たな情報は特にないので、以上、なのですが、それではあまりに不親切なので、簡単に説明を加えます。

### 何を発表したか

私の開発している[Maplat](https://github.com/code4history/Maplat/wiki)というオープンソースの古地図ビューアアプリがあるのですが、そのアプリの新しい機能である、線を線に対応する座標変換を使って、古地図を現代地図に対応させる際に、現代地図側の線ネットワークとしてOSMの道路や河川のネットワークを用いよう、という案について発表させていただきました。
そのことにより、OSMという現代の地図ネットワークを背骨として、過去のいくつもの時代の地図が共通の位置基盤を元につなげることができるようになるというアイデアです。

### 新概念HTGCL
Maplatの座標変換での新機能で、古地図と現代地図の位置を対応させる際に、線（道路や河川など）を線に対応させるものがあります。
![thumbnail](https://files.speakerdeck.com/presentations/67b33f8a83a64688b9dc40952854cd64/slide_18.jpg?16663674)
従来のGISなどでの座標変換では、古地図と現代地図を対応させる際には、GCP(Ground Control Point)と呼ばれる点と点（たとえば現代地図の交差点と対応する古地図の交差点、など）を対応させて、点と点の間は計算で補完して対応させてきました。
しかしこの点を元に対応付ける方法だと、点と点を結ぶ線などは、中間で座標の対応がズレる場合などが発生してしまいます。

Maplatでは線を線に対応して変換させられるので、このような座標変換ズレは発生しません。
この、古地図座標変換での新しい「対応線」という概念を、対応点の際のGCPになぞらえて、HTGCL(Historical Topographic Ground Control Line)と名付けました。
![thumbnail](https://files.speakerdeck.com/presentations/67b33f8a83a64688b9dc40952854cd64/slide_21.jpg?16663674)

### HTGCLの現代地図側線ネットワークとして、OSMを使う案
このHTGCLを古地図ごとに作る際に、現代地図側の線ネットワークを古地図ごとに作り直す考え方もありますが、単純に重複して無駄な作業になりますし、また微妙なずれで対応づけにくくなる分、分析などで利用しづらくなります。
それを防ぐため、現代地図側の線ネットワークとして共通のOSMデータを用いようというのが、SotM Japan 2020で発表したアイデアの肝になります。
![thumbnail](https://files.speakerdeck.com/presentations/67b33f8a83a64688b9dc40952854cd64/slide_24.jpg?16663674)
これが実現すると、これまで個別に現代地図と紐づいていた古地図が、OSMという線ネットワークを背骨のように共通に持って、強く結びつくようになります。
街の時代に伴う変化などを研究解析する際にも、マッピング済み古地図データの価値が高まることが期待されます。

### 実現に向けての課題
私は以前熱心にOSMの活動を行っていましたが、Maplatを始めてからは、そちらの活動が忙しすぎるためOSM活動はあまり行っていませんでした。
歴史を扱うMaplatに対し、OSMは現在を扱うので、今後はあまりOSMにかかわる機会もなくなるのかなと考えておりましたが、思わぬアイデアでOSMとかかわる可能性が生まれ、うれしく思っています。
とはいえ、このアイデアはまだ温めているレベルで、具体的な実装にはまだ至っていません。
解決すべき課題も多く、具体的な実装に移れるのは年レベルで後のことになるかもしれません。
たとえば、OSMデータを共通に背骨として持つといっても、OSMデータは誰もが自由に編集できるデータですから、昨日は1つだったラインが次の日には2つのラインに分割されていた、といったことも普通に起こるでしょうし、そのような際にどのように同一性を担保するか、といったところも難しい問題になります。
もしかすると、完全にOSMデータとしてノードIDなども取得して管理するよりも、もっとカジュアルに、現代地図側のHTGCLの編集を行っている際に、編集中の線のノードがOSMのノードにスナップされる機能、程度でもいいのかもしれません。

以上、古地図を扱う新概念HTGCLと、OSMデータを時代を結ぶ背骨にするアイデアについて、述べさせていただきました。
Ubuntu 20.04 で pyenv を使用して Python を導入する

本記事では、Ubuntu 20.04 上に [pyenv](https://github.com/pyenv/pyenv) を使用して Python を導入する手順をまとめます。

# 注意

- そもそも pyenv が必要なのか確認しましょう。pyenv で期待通りに動作する Python を導入するのは簡単ではありません。（私は 1 時間くらいネットをさまよいました。）
  - ただ Python が欲しいだけの方は、環境構築で苦労したくなければ OS 標準のパッケージ（Ubuntu なら `sudo apt install python3-pip`）や [Anaconda](https://www.anaconda.com/) などに頼ることをおススメします。
  - 個人的に、pyenv は環境構築で困ったときにネットで対応策を探す面倒を受け入れられる人でないと使えないと思っています。正しく導入できれば便利なんですけどね…。
- 下記の手順の一部は、Ubuntu 20.04 に依存しています。Ubuntu 18.04 にすら対応していません。
  - 一応、該当箇所には Ubuntu 20.04 以外のユーザ向けの手順が書いてあるページのリンクを貼っています。

# 環境

- OS: Ubuntu 20.04
- 下記でインストールする pyenv のバージョン: 1.2.21
- 下記でインストールする Python: CPython 3.9.0

# インストール手順

## 1. 必要なコマンドの準備

まずは、pyenv 本体の導入や pyenv を通した Python のインストールで利用する基本的なコマンドをインストールします。

```console
$ sudo apt install git wget curl
```

## 2. Python が依存するライブラリのインストール（環境依存）

続いて、Python が依存するライブラリ類をインストールします。
pyenv で CPython をインストール際は、ソースコードからのビルドが行われるため、それに必要なライブラリを一通りインストールします。（これが難しいポイントです。）

OS が Ubuntu 20.04 でない方は、[1. Getting Started — Python Developer's Guide](https://devguide.python.org/setup/) を読んでください。

Ubuntu 20.04 では、`/etc/apt/sources.list` に

```
deb-src http://archive.ubuntu.com/ubuntu/ focal-updates main
```

を追加し、以下のコマンドを実行します。

```console
$ sudo apt update
$ sudo apt build-dep python3.8
```

`apt install` でなく、`apt build-dep` であることに注意してください。`apt build-dep` はソースコードからビルドするのに必要なパッケージをまとめてインストールしてくれるコマンドです。ここでは、CPython 3.8 のビルドに必要なパッケージをインストールしています。`python3` でなく `python3.8` のようにマイナーバージョンまで入ったパッケージを選ぶ必要はありますが、使いたい Python のバージョンと一致させる必要はありません。（マイナーバージョン違いなら依存ライブラリは変わらないだろうということです。）

## 3. pyenv のダウンロード

Pyenv のダウンロードは、ソースコードをクローンすることで行います。
クローンしたリポジトリ内にこれからインストールする Python が配置されますし、PATH を通しますので、特別な理由がなければ下記のコマンドをコピペしましょう。

```console
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

適宜使いたい pyenv のバージョンのタグをチェックアウトしておいてください。（とりあえず最新リリースのタグにしておけば良いと思います。）
2020/12/27 現在の最新バージョンであれば、下記のようになります。

```console
cd ~/.pyenv
git checkout v1.2.21
```

## 4. 環境変数の追加（環境依存）

Ubuntu 20.04 であればコンソールは通常 bash ですので、以下を `.bashrc` ファイルへ追記してください。

```bash
PYENV_ROOT="${HOME}/.pyenv"
PATH="${PYENV_ROOT}/bin:${PATH}"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
```

使っているコンソールが bash でない方は、[pyenv の README](https://github.com/pyenv/pyenv#basic-github-checkout) を確認してください。

## 5. Python のインストール

お好みの Python をインストールしましょう。
私は CPython 3.9.0 をインストールしました。

```console
$ pyenv install 3.9.0
```

ソースコードからビルドするため、多少時間がかかります。

## 6. 動作確認

インストール後は、動作確認をしてください。
依存するライブラリが足りていなかった場合、パッケージの import の段階になって「_ctypes がない」とか言い出したりしますので、使いたいパッケージをインストールして import するところまで確認しておくことをおススメします。

# あとがき

元々 [個人的なメモ](https://musicscience37.gitlab.io/til/development/python/pyenv.html) に書いていたものを Qiita にも公開しようと思って書きました。
pyenv で困っている方の役に立つことを願います。
Ruby学習#33 Inheritance

class Chef
  def make_chicken
      puts "The chef makes chicken"
  end
  def make_salad
      puts "The chef makes salad"
  end
  def make_special_dish
      puts "The chef makes bbq ribs"
  end
end

class ItalianChef < Chef
  def make_special_dish
    puts "The chef makes eggplant parm"
  end
  def make_past
    puts "The chef makes pasta"
  end
end

chef = Chef.new()
chef.make_chicken

italian_chef = ItalianChef.new()
italian_chef.make_pasta
webpackでtypescriptをjavascriptに変換



## 準備

```
$ yarn init -y
$ yarn add -D webpack webpack-cli
$ yarn add -D typescript ts-loader
```

index.tsを用意

```src/index.ts
let a : number = 0

console.log(a)
```

## tsconfig.jsonを作成

```
$ npx tsc --init
```

## webpack.config.jsでts-loader適用する

```webpack.config.js
module.exports = {
    entry: path.resolve(__dirname, 'src', 'index.ts'),
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'main.js',
    },
    module: {
        rules: [
            {
                test: /\.ts$/,
                use: 'ts-loader',
            }
        ],
    },
    resolve: {
        extensions: [ '.ts', '.js'],
    },
}
```

## ビルド

```
$ npx webpack
```

結果

```dist/main.js
(()=>{"use strict";console.log(0)})();
```
Ruby学習#32 Building a Quiz

class Question
 attr_acessor :prompt, :answer
 def initialize(prompt, answer)
   @prompt = prompt
   @answer = answer
 end
end


p1 = "What Color are apples?\n(a)red\n(b)purple\(c)orange"
p2 = "What Color are bananas?\n(a)pink\n(b)red\(c)yellow"
p3 = "What Color are pears?\n(a)yellow\n(b)green\(c)orange"


questions = [
  Question.new(p1, "a"),
  Question.new(p2, "c"),
  Question.new(p3, "b")
]

def run_test(questions)
  answer = ""
  score = 0
  for question in questions
    puts question.prompt
    answer = gets.chomp()
    if answer == question.answer
     score += 1
    end
  end
  puts ( "You got " + score + "/" + question.length())
end
ローカルにあるHTMLファイルを正しくブラウザで確認する方法

この記事はDockerが動作する環境が前提です。

## 目的

サクっとローカルにあるHTMLファイルをブラウザで確認する。

## よくあるケース

「このHTMLなぜか動かないので確認してもらえますか？」みたいな感じでざっくりHTMLファイルを渡されたとき、そのままブラウザ開くと外部ファイル読み込みがうまく行かずに悩むことありますよね？

一昔前ですとXAMPやMAMPを立ち上げたり、OS標準の共有サービスを使ったりしていました。
公開手順もちょっと面倒ですし、公開を止めるのを忘れたりして余計なリソースを使い続けてしまうことが多々ありました。

Dockerの誕生でOSを極力汚さずに手軽にローカルHTMLファイルを確認する方法があります。

## 方法

ローカルにサーバを立ち上げてHTMLファイルがあるディレクトリを一時的に公開。

コンソールでHTMLファイルのディレクトリまで行き

```
docker run -v $(pwd):/usr/share/nginx/html:ro --rm -p 8080:80 nginx
```

これだけでtest.htmlっていうファイル名であれば
http://127.0.0.1:8080/test.html
でファイルにアクセスできるようになります。

-dオプションを付けずデーモンとして立ち上げないので通信ログも見えますし、Ctrl+Cプロセスを止めると--rmによりコンテナも消えるのでクリーンです。--nameでコンテナ名を付けなくて良いのでコマンドも短くなり覚えやすいですね。

宗教上の理由でApacheしか受け付けない人は

```
docker run -v $(pwd):/usr/local/apache2/htdocs/:ro --rm -p 8080:80 httpd
```

で立ち上げてください。

$(pwd)が動かないとか意味がわからない方は以下のように公開したいディレクトリパスを指定してください。

```
docker run -v /Users/qiita/Downloads:/usr/share/nginx/html:ro --rm -p 8080:80 nginx
```

## あとがき

過去に似たような記事を書きましたが別にデーモン化させる必要もなく終わったあとの後片付けも--rmオプション使えば良いことに気づいたので改めて記事化しました。

前の記事
https://qiita.com/rspepe/items/6f7f5eb31a04185bafbd
Pythonで素数生成プログラムを作ってみた

# 発想

ある自然数について、それより小さい素数で割り切れなければ、その自然数は素数である。

という発想でプログラムを書いてみました。

あるリストを用意しておいて、素数をつぎつぎとそのリストに保存していきました。

# コード

```python
import time

primes_list = []          # このリストに素数を保存していく
upper_lim   = 10000       # テキトーな数を設定
start_time  = time.time() # 開始時刻を記録

for integer in range(2, upper_lim + 1, 1): # 2-10000の整数に対して、
    if len(primes_list) < 1 :              # primes_listが空だったら、
        primes_list.append(integer)        # primes_listにinteger(=2)を追加する
    else:                                  # その他の場合（本題）、
        is_divisible = False               # integerが割り切れない、つまり素数であることを仮定する
        for prime in primes_list:          # 今までに保存された全ての素数"prime"について、
            if integer % prime == 0:       # integerがprimeで割り切れるならば
                is_divisible = True        # 割り切れます（つまり素数じゃない）
                break                      # そしたらもうこのforはやる意味がないです。
        # integerが合成数ならどっかのprimeでis_divisible = Trueになる
        if not is_divisible:               # すべてのprimeについてこの判定をしたのち、それでもなおis_divisible = Falseならばもうそれは素数
            primes_list.append(integer)    # integerを素数として認め、primes_listに追加する

print(primes_list)
print(len(primes_list), "prime numbers foud.")

elapsed_time = time.time() - start_time # 経過時間 = 現在時刻 - 開始時刻
print ("run time: {0}".format(elapsed_time) + " seconds")
```

出力：

```
$ python prime_numbers.py
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 

（...省略...）

9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973]
1229 prime numbers foud.
run time: 0.0615689754486084 seconds
```

# 実行時間について

- $10^2$まで探索: 0.0001 sくらい
- $10^3$まで探索: 0.001 sくらい
- $10^4$まで探索: 0.06 sくらい
- $10^5$まで探索: 4 sくらい
- $10^6$まで探索: 240 s = 4 minくらい
- $10^7$以降: ??? 数時間くらい？

環境は
- MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)
- プロセッサ：2.4 GHz クアッドコアIntel Core i5
- メモリ：16 GB 2133 MHz LPDDR3


# 続く

[Pythonで素数生成プログラムを作ってみた2](https://qiita.com/okazakik/items/b0423e2274f6d2e25b5a)
Ruby学習#31 Object Methods

class student
  attr_accessor :name, :major, :gpa
  def initalize(name,major,gpa)
    @name = name
    @major = major
    @gpa = gpa
  end

  def has_honors
   if @gpa >= 3.5
     return true
   end
   return false
  end
end

student1 = Student.new("Jim","Business",2.6)
student2 = Student.new("Pam","Art",3.6)

puts student2.has_honors
Anacondaの再インストール

# はじめに
前回アンインストールしたAnacondaを再インストール。今度は慎重に。
目的としてはJupyter Notebookを使いたい。

# インストール
ここから。
https://www.anaconda.com/products/individual

すべてデフォルトの設定でインストール。
ただ、インストール先のパスに漢字が含まれているとダメなので、
Cドライブ直下に置いた。`C:\anaconda3`
ちなみに前回は`C:\Program Files\anaconda3`だったみたいです。
そこにすればよかったかな。。

# PATHの設定
再インストールしたものの、状況は変わらず。
やっぱり初期設定の問題かー。。

とりあえずこの3つのPATHを追加。

```
C:\anaconda3
C:\anaconda3\Library\bin
C:\anaconda3\Scripts
```

# Jupyter Notebookの起動
`Anaconda Prompt`から`jupyter-notebook`と入力し起動。
なんか新しくコマンドプロンプトが出てきて
沢山の英語が表示されたのちに止まった。

調べた結果、最後のURLを開けばいいらしい。

開いた結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963393/59fa3dd1-fb61-775e-80f4-c50e91301f8e.png)

起動できたことになるのかな。


（追記）
ユーザー名に日本語が入っているのが原因でAnaconda自体が上手く動作しないらしい。
ので、やっぱりまたアンインストールしました。

# condaのアップデート
ついでに調べてるときに見つけたcondaのアップデート。

```
conda upgrade --all
```
Ruby学習#30 Initialize Method

class Book
  attr_accessor :title, :author, :pages
  def initialize(title, author, pages)
    @title = title
    @author = author
    @pages = pages
  end
end

book1 = Book.new("Harry Potter","JK Rowling",400)
book2 = Book.new("Lord of the rings","Tolkein",500)

puts book1.author
gitメモ

# 環境
Win 10 pro

# コンピューター上のすべてのリポジトリについて無視するファイルを設定する
すべてのリポジトリでもvscodeやeclipceのプロジェクトファイルなど共有したくない場合とか

## 方法(`.vscode`のファイルを無視する)
Git Bashを開く

```
git config --global core.excludesfile ~/.gitignore_global
```

```
echo .vscode >> ~/.gitignore_global
```

# 状態に戻し仕方

マージする前の状態に戻す

```
git merge --abort
```

コミットする前の状態に戻す

```
git reset --soft HEAD^
```


ステージングする前の状態に戻す（ステージングを削除、作業は残す）

```
git rm --cached -r .
```

# 改行コードの自動変換について
commit + pushすると、CR+LFな改行コードのファイルをLFに変換
pullするときはLFな改行コードのファイルをCR+LFに変換

基本は

```
git config --global core.autocrlf true
```
でいい

リリース作業で想定していない改行コードの不具合を出さないようにするようにgitで自動変換しないようにする

```
git config --global core.autocrlf false
```
NumPyの1次元配列の要素数を2のべき乗にする(0埋め)

(※より効率的な方法を求めています)

高速フーリエ変換をする下準備として、配列の要素数を2のべき乗にしたいときがあります。

要素数を2のべき乗に切り上げ、後ろを0で埋める方法を書いておきます。

いくつか関数を定義します。また、各関数の引数に対してチェックすべきこともあるので、そちらについても適宜記し、本記事の最後に例外`raise`を含めたものをまとめます。

## 正の整数を2のべき乗に切り上げ

まずは任意の正の整数を2のべき乗に切り上げる関数を定義します。(負数のチェックは省きます)

```python
import numpy as np

def round_pow2(x :int) -> int:
    """xを2のべき乗に切り上げる
    
    60 -> 64
    40000 -> 65536
    """
    
    return 1 << x.bit_length()
```

```python
print(round_pow2(1000))
# => 1024
```

この関数は`x`のbit列の先頭の1までの長さを取得し、1をその分大きくなる側へシフトしています。bit列`1 0 0 ... 0`は2のべき乗になります。`2 ** x.bit_length()`でも同じです。


## NumPy配列を広げある数値で埋める

ほしいのは0埋めですが、「ある数値で埋める」という抽象化が可能なのでそのように定義します。この関数もチェックすべきことはありますが省きます。

```python
def back_padding(xs: np.ndarray, n: int, a) -> np.ndarray:
    """n個の要素になるように後ろをaで埋める"""

    v = np.empty(n, dtype=type(a))
    v[:xs.shape[0]] = xs
    v[xs.shape[0]:] = a

    return v
```

```python
print(back_padding(np.arange(10), 15, 0))
#=> [0 1 2 3 4 5 6 7 8 9 0 0 0 0 0]
```
チェックすべきこととして、`xs`が1次元配列であること、および`xs`の要素数が`n`以下である必要があります。`a`の型が`xs`の要素の型と一致していることも必要です(こちらはそれほど気にする必要はないかもしれません)。

## 要素数が2のべき乗になるように後ろをある数値で埋める

上記で定義した関数を組み合わせれば完成です。こちらも`back_padding`と同じく一次元配列であること、配列の要素の型と`a`の要素の型が一致している必要があります。

```python
def to_pow2_length(xs: np.ndarray, a) -> np.ndarray:
    """要素数が2のべき乗になるように後ろをaで埋める"""

    return back_padding(xs, round_pow2(xs.shape[0]), a)
```

アレンジするとしたら、埋める側の前後を選択できるようにしたり、初期値として`a`を`0`や`0.0`にしたりすることだと思います。私個人的にはこの定義で十分と思いましたのでこのままにしました。

## まとめ

以下にdocstringおよび例外を含めた定義をまとめます。

```python
import numpy as np


def round_pow2(x :int) -> int:
    """xを2のべき乗に切り上げる
    
    例)
    60 -> 64
    40000 -> 65536

    Arguments:
        x (int > 0): 正の整数

    Returns:
        int: 2のべき乗の整数
    """
    
    if x < 1:
        raise ValueError("xは正の整数である必要があります。")

    return 1 << x.bit_length()


def back_padding(xs: np.ndarray, n: int, a) -> np.ndarray:
    """n個の要素になるように後ろをaで埋める
    
    Arguments:
        xs (np.ndarray[shape=(m,)]): 配列
        n (int > m): 要素数
        a (xs.dtype): 埋める値

    Returns:
        np.ndarray[shape=(n,)]: 余分なところをaで埋めた配列
    """

    
    if len(xs.shape) > 1:
        raise ValueError("配列xsは一次元配列である必要があります。")

    if xs.shape[0] > n:
        raise ValueError("nは配列xsの要素数より大きい必要があります。")

    if xs.dtype != type(a):
        raise ValueError("aの型は配列xsの要素の型と一致している必要があります。")
    
    v = np.empty(n, dtype=type(a))
    v[:xs.shape[0]] = xs
    v[xs.shape[0]:] = a

    return v


def to_pow2_length(xs: np.ndarray, a) -> np.ndarray:
    """要素数が2のべき乗になるように後ろをaで埋める
    
    Arguments:
        xs (np.ndarray[shape=(n,)]): 一次元配列
        a (xs.dtype): 埋める値

    Returns:
        np.ndarray[shape=(2**p,)]: 要素数が2のべき乗で後ろがaで埋まった配列
    """

    return back_padding(xs, round_pow2(xs.shape[0]), a)

```
Ruby学習#29 Classes & Objects

class Book
  attr_accessor :title, :author, :pages
end

book1 Book.new()
book1.title = "Harry Potter"
book1.author = "HK Rowling"
book1.pages = 400

puts book1.pages
>> 400

book2. = Book.new()
book2.title = "Lord of the rings"
book2.author = "Tolkein"
book2.pages = 500

puts book2.author
>> Tolkein
webpack 試す

webpackを試す

## package.json作成

npmのinitコマンドを作成する。yオプションをつけると全て初期設定でpackage.jsonが作成される。

```
$ npm init -y
```

```package.json
{
  "name": "test2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

または、`yarn init -y` でも可


## gitignore追加
giboのNodeを使用。

```
$ gibo dump Node > .gitignore
```

## webpack インストール

yarnを使用。webpackとwebpack-cliをインストール。-Dオプションをつけることで開発環境のみインストールされるようにする。

```
$ yarn add -D webpack webpack-cli
```

## ビルド

webpackコマンドでビルドすることができる。
デフォルトではsrc/index.jsをdist/main.jsにビルドする。


```src/index.js
console.log('hoge')
```

webpack実行。modeを指定していないのでワーニングが出ている。

```
$ npx webpack
asset main.js 20 bytes [emitted] [minimized] (name: main)
./src/index.js 19 bytes [built] [code generated]

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/

webpack 5.11.0 compiled with 1 warning in 143 ms
```

```dist/main.js
console.log("hoge");
```


## jsをバンドルする

hogeモジュールを用意してバンドルする。

```src/modules/hoge.js

const a = () => {
    console.log('a')
}

export default a
```

```src/index.js
import a from "./modules/hoge";

console.log('hoge')

a();
```

developmentモードでビルドする。

```
$ npx webpack --mode=development
asset main.js 4.13 KiB [emitted] (name: main)
runtime modules 668 bytes 3 modules
cacheable modules 117 bytes
  ./src/index.js 58 bytes [built] [code generated]
  ./src/modules/hoge.js 59 bytes [built] [code generated]
webpack 5.11.0 compiled successfully in 65 ms
```

結果。developmentモードだとバンドルはされないらしい。

![スクリーンショット 2020-12-27 0.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278474/1e431ce5-2dd1-4604-f47d-d27492f0e4a2.png)


productionモードでビルドするとmain.jsにバンドルされて1ファイルで完結するようになった。

```
$ npx webpack --mode=production 
asset main.js 60 bytes [emitted] [minimized] (name: main)
orphan modules 59 bytes [orphan] 1 module
./src/index.js + 1 modules 117 bytes [built] [code generated]
webpack 5.11.0 compiled successfully in 153 ms
```


![スクリーンショット 2020-12-27 0.48.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278474/8f5b93f3-3181-e7ff-13ec-2de39bd6257b.png)


## webpack設定を書く

https://webpack.js.org/configuration/

webpack.config.js に設定を書く。
entoryで読み込むファイルを指定し、outputで書き出すファイルを指定する。

```webpack.config.js
const path = require('path')
module.exports = {
  entry: path.resolve(__dirname, 'src', 'index.js'),
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'main.js',
  }
}
```
Ruby学習#28 Handling Errors

lucky_nums = [4,8,15,16,23.42]

lucky_nums["dog"]
> into Integer(Typeerror)


begin
 num = 10 / 0
rescue
 puts "Division by zero error "
end
>>Division by zero error

begin
 lucky_nums["dog"]
 num = 10 / 0
rescue ZeroDivisionError
 puts "Division by zero error "
rescue TypeError => e
 puts e
end
【Ruby On Rails】DBに一意性を与えるユニーク制約（unique）の正しい記述場所

備忘録です。

# ユニーク制約とは
一意性制約のことです。DBにおいてデータを追加や更新する際の制約。カラムに独自性を与えます。

例えば、ユニーク制約を適用することで、ユーザーが新規登録をする際に、既に登録されているemailアドレスと同じアドレスで登録しようとした場合にエラーを返すことができます。


# uniqueの書き方

```ruby
add_index :テーブル名, [:カラム名1, :カラム名2, :カラム名3, ...（続く）], unique: true
```

テーブル名をcontents、カラム名をpart_idとwordとした場合は次のようになります。

```ruby
add_index :contents, [:part_id, :word], unique: true
```

# 記述場所

以下のように、マイグレーションファイルのchangeメソッド内に記述するようにしましょう。

```ruby:マイグレーションファイル
class CreateContents < ActiveRecord::Migration[6.0]
  def change
    create_table :contents do |t|
      t.integer :part_id, null: false
      t.string  :word, null: false
      t.references :user, null: false, foreign_key: true
      t.timestamps
    end
    add_index :contents, [:part_id, :word], unique: true #この行です。
  end
end
```

# 記述場所を間違えた場合

例えば、次のようにchangeメソッドから外して記述してみます。

```ruby:マイグレーションファイル
class CreateContents < ActiveRecord::Migration[6.0]
  def change
    create_table :contents do |t|
      t.integer :part_id, null: false
      t.string  :word, null: false
      t.references :user, null: false, foreign_key: true
      t.timestamps
    end
  end
  add_index :contents, [:part_id, :word], unique: true #この行です。
end
```

この状態でrails db:migrateを実行するとエラーが出ます。

```terminal
% rails db:migrate
-- add_index(:contents, [:part_id, :word], {:unique=>true})
-- add_index(:contents, [:part_id, :word], {:unique=>true})
rails aborted!
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'hoge_development.contents' doesn't exist
```
GCPの永久無料枠でデータ蓄積

# １．GCPの永久無料枠などで安価に継続的なデータ取得ができる
GCP(Google Cloud Platform）には最初の3か月間利用できる無料枠のほかにリージョンやリソースに制限があるとはいえ、永久的に無料でサーバーを利用することができます。
##### Google Compute Engine
1 f1-micro インスタンス（バージニア州北部 [us-east4] を除く米国リージョンのみ）
30 GB の HDD（期間合計）、5 GB のスナップショット（期間合計）
1 GB の北米から全リージョン宛ての下りネットワーク（中国とオーストラリアを除く）
##### Google Cloud Storage
5 GB の Regional Storage（バージニア州北部 [us-east4] を除く米国リージョンのみ）
5,000 回のクラス A オペレーション
50,000 回のクラス B オペレーション
1 GB の北米から全リージョン宛ての下りネットワーク

この他にも利用できるサービスがありますが、今回はPythonを使ってスクレイピングしてクラウドストレージにデータを蓄積することを目的としてみたいと思います。
＊上記にあるようにネットワークの利用に1GBの制限があるため<strong>完全無料にはならない可能性がある</strong>のことには注意が必要です。
# ２．PythonでGCEからGCSを操作するには
＊GCE,GCSそれぞれのインスタンスが既に作成されていることを前提とします。

まず、GCE（Ubuntuなど）のインスタンス上でPython向けのライブラリをインストールします。

```
$ pip install --upgrade google-cloud-storage
```

### 2-1. GCSを操作するためのライブラリをインポート
ここはすべての操作をする際に必要です。

```
from google.cloud import storage
client = storage.Client()
bucket_name="test_bucket"
bucket = client.get_bucket(bucket_name)
```

### 2-2. バケット内のオブジェクトの操作方法
#### 2-2-1. オブジェクト一覧取得

```
for blob in client.list_blobs(bucket_name):
    print(blob.name)
```

#### 2-2-2. オブジェクトのインスタンス作成

```
blob = bucket.blob("sample.txt")
```

#### 2-2-3. オブジェクトのダウンロード

```
blob.download_to_filename("sample1.txt")
```

#### 2-2-4. オブジェクトのアップロード
GCEはデフォルトでストレージへのアクセスは読み取りのみとなっているので、インスタンスを立ち上げる前にストレージへの書き込みについてもアクセス権を与えてあげましょう。

```
blob.upload_from_filename("sample2.txt")
```

# ３． 例
GCEにあるデータをGCSにアップロードするにはこのようになります。

```
from google.cloud import storage
client = storage.Client()
source="test.txt"
bucket_name = "test-bucket"
bucket=client.get_buket(bucket_name)#bucketのオブジェクトを取得
blob = bucket.blob(source)#オブジェクトのインスタンスを作成
blob.upload_from_filename(source)#ダウンロード
```
Ruby学習#27 Writing Files

Jim, Sales
Andy, Sales
Kelly, Customer Service
Creed, Quality Assurance
Michaes, Manager

stack overflow Questions Ruby IO 

mode meaning

 r read-only
 w write-only, truncates existing file to zero length or creates a new file for writing
 a write-only, starts at end of file if file exists, otherwise creates a new file for reading and writing


File.open("employees.txt", "a") do |file|
   file.write("\nOscar, Accounting")
end

>>Jim, Sales
Andy, Sales
Kelly, Customer Service
Creed, Quality Assurance
Michaes, Manager
Oscar, Accounting

File.open("employees.txt", "w") do |file|
   file.write("\nOscar, Accounting")
end
>>Oscar, Accounting

File.open("index.html", "w") do |file|
   file.write("<h1>Hello</h1>")
end

index.html にHello Worldできてる。

from stackoverflow
 r+ Read-write, starts at beginning of file.

File.open("index.html", "r+") do |file|
   file.readline()
   file.write("Hi")
end

>>Jim, Sales
Hidy, Sales
Kelly, Customer Service
Creed, Quality Assurance
Michaes, Manager
Oscar, Accounting


File.open("index.html", "r+") do |file|
   file.readchar()
   file.write("Hi")
end
アドベントカレンダー24日目：SREを読んでみた「単純さ」編①

今回から新しい章に入ります。単純さ、システムがシンプルであることは保守や改善において、非常に有用であると想像できますが、今回の章で単純さついて、概要を見ていきます。

## 単純さを知る前に
元来、ソフトウェアシステムは、動的で不安定なものです。ソフトウェアが完全に安定するのは、そのソフトウェアが捨てられたときです。
SREは、システムの進化と安定性のバランスをとることが仕事になります。

## システムの安定性とアジリティ
安定性が犠牲となることが妥当な時もあります。システム開発は試行錯誤をしなければ、問題点を発見することができないことが多くあります。しかし、その試行錯誤のすべてがリリースされるのは、安定性において、問題が生じます。そのため、試行錯誤のコードを有効期限付きのコードとして、リリースする方法があります。これにより有効期限があるコードはユーザーに使われません。また、SREは安定性の確保を行いますが、開発のアジリティへ与える影響を最小限にすべきです。プロダクション環境へのロールアウトの信頼性を高めることは、バグが生じたときの解決の速度を速めます。

## 退屈の美徳
ソフトウェアは、退屈であるべきです。ここでいう退屈とは、想定外のことが起きないということです。想定外のことを起こす可能性があるのは、それが流動的で複雑なものです。
ここで、受け入れるべき複雑さと必要のない複雑は分けることが重要です。
受け入れるべき複雑さとは、ある問題が本質的に抱えている向き合うべき複雑さです。必要のない複雑さとは、本質ではなく周囲の環境によって、流動的に変化することによる複雑さです。これはエンジニアリングによって、解決されるべきです。
システムの想定外の複雑さを差し戻し、継続的にシステムから複雑さを取り除く努力をしなければなりません。

## コードはあきらめない
エンジニアは、自分の書いたコードに愛着を持つものです。そのため、ソースツリーから自分のコードが削除されることに抵抗することがあるかもしれません。しかし、ソース管理のシステムを用いれば、変更の取り消しは容易です。無用なコード（コメントアウトも）が残っていることは、後の負債になりえます。すべてのコードは、本質的な目的を持っているべきです。

## まとめ
* アジリティと安定性のバランスを保つ
* 無用な複雑さは排除する

#### 参考文献
1. Betsy Seyerほか　SRE サイトリライアビリティエンジニアリング　オライリー　101-103
linux sarコマンド CPU使用率

sar -u
 

00時00分01秒 CPU %user %nice %system %iowait %steal %idle
00時01分01秒 all 0.69 0.00 1.11 0.00 0.00 98.21
00時02分01秒 all 0.22 0.00 0.20 0.07 0.00 99.52


オプション	確認項目
%user	ユーザが利用しているCPU使用率
%nice	nice値を変更しているプロセスのCPU使用率
%system	システムが利用しているCPU使用率
%iowait	IO待ちしているCPU使用率
%steal	ゲストOSが割り当て要求をしたが、割り当ててもらえなかったCPU使用率
%idle	待機中のCPU使用率


http://naoberry.com/tech/sar/#-u_CPU
PHP 月末の日にちを取得する

# 目的

- PHPで月末の日にちを取得する方法をメモ的にまとめる

# 前提情報

- 下記サービスを用いてWeb上でコードの動作を確認した。
    - [https://paiza.io/ja](https://paiza.io/ja)
- 忘れそうなのでメモ的にまとめる。

# 詳細

1. ひと月前の月末の日にちを取得したい時は下記を実行する。（YYYY/MM/DDの形式で情報を取得する事ができる。）

    ```php
    $last_day_of_last_month = date('Y/m/d', mktime(0, 0, 0, date('m'), 0, date('Y')));
    echo $last_day_of_last_month;
    ```

1. 今月の月末の日にちを取得したい時は下記を実行する。（YYYY/MM/DDの形式で情報を取得する事ができる。）

    ```php
    $last_day_of_this_month = date('Y/m/d', mktime(0, 0, 0, date('m') + 1, 0, date('Y')));
    echo $last_day_of_this_month;
    ```

1. 来月の月末の日にちを取得したい時は下記を実行する。（YYYY/MM/DDの形式で情報を取得する事ができる。）

    ```php
    $last_day_of_next_month = date('Y/m/d', mktime(0, 0, 0, date('m') + 1, 0, date('Y')));
    echo $last_day_of_next_month;
    ```

# 参考文献

- [https://www.php.net/manual/ja/function.date.php](https://www.php.net/manual/ja/function.date.php)
- [https://www.php.net/manual/ja/function.mktime.php](https://www.php.net/manual/ja/function.mktime.php)
CHIRIMEN Open Hardware コミュニティ 2021 年活動ついて


この記事は [CHIRIMEN Open Hardware Advent Calendar 2020](https://qiita.com/advent-calendar/2020/chirimen_oh) 25 日目の記事です。
最終日はこ2020年度の総括をさせて頂きます。

### 2020 年 コミュニティ活動の振り返り
#### 公式サイト
- 公式サイトのリニューアル・移行の議論
- より訪問者が使い易いサイトを検討

#### オープンソースソフトウェア
- [各種ドライバーの更新・追加](https://github.com/chirimen-oh/chirimen-drivers)
- [node版 WebGPIO](https://github.com/chirimen-oh/node-web-gpio)
- [node版 WebI2C](https://github.com/chirimen-oh/node-web-i2c)

#### イベント参加
- [技術書典9](https://techbookfest.org/event/tbf09) に出展しました。
- [技術書典10](https://techbookfest.org/event/tbf10) に出展します。

#### 総括
- 今年は、初めて技術書典の出展が実現しました。
- コミュニティとしてのイベントが開けなかったのが課題です。


### 2021 年 コミュニティ活動について
#### オープンソースソフトウェア
- CHIRIMEN版 Raspberry SD イメージ更新
- microbit サポート更新
- 各種サンプルの追加・更新(Raspberry Pi micro:bit)

#### イベント
- コミュニティとしてのオンラインイベント開催
- 技術書典の継続参加
- 技術書典の新刊本の出版

色々な人達と協力して、様々な事を実現していけたらと思います。

### SNS へのアクセス
コミュニティ活動に興味を持たれた方は、いずれかの SNS を通じてコンタクトして頂ければ、誰かしら回答させて頂きます。

- [Twitter](https://twitter.com/chirimen_oh)
- [facebook Group](https://www.facebook.com/groups/chirimen)
- [Github](https://github.com/chirimen-oh)
- [slack invite](https://docs.google.com/forms/d/1GzkGfCcsRn4A6-uHPsLu2LszkqKcNJ3sFI4XRishHsE/viewform)
discord.pyでカスタムprefixを実装しよう！

**この記事はdiscord.py commandフレームワークを使用している方向けです。**

そういえば知ってますか？
この記事はDiscord Botアドカレの７日目の記事らしいんです。
~~もうクリスマスですね、、~~
クリスマスも終わってますね、、

# 何それ美味しいの
いわゆるカスタムprefixとは、botは通常どのサーバーでもprefixが変わらないのに対して、サーバーごとにprefixを動的に設定できる機能のことを指します。
botが多数導入されていて、prefixが被ってしまう場合に割と有用です。

## 実装方法
commands.Botのcommand_prefixは通常、文字列やstrのlistで渡しますが、`commands.Bot`, `discord.Message`を引数に取る**関数**を渡すこともできます。
この仕様を用いてprefixを動的に設定していきます。

## 保存方法
さて、prefixをどう保存するかですが、.jsonファイルやデータベースを用いるのもいいですが、今回はよりお手軽にするためにニックネームに保存したいと思います。`[hoge]botの名前`みたいな感じ。(この場合`hoge`がprefix)

# 実装
自分は下記のように実装しました。

```py:main.py
import discord
from discord.ext import commands

def _prefix_callable(bot: commands.Bot, msg: discord.Message) -> str:
    if msg.guild is None:  # dmの場合
        return "/"
    else:
        if msg.guild.me.nick is None:
            return "/"
        nick = msg.guild.me.display_name
        result = nick.replace("[", "").replace(f"]{bot.user.name}", "")
        return result

bot = commands.Bot(command_prefix=_prefix_callable)
bot.run("TOKEN")
```

dmの場合はprefixが被ることはないので(そもそも他にbotがいない)、`if msg.guild is None` で分岐して`/` を返しています。
また、`if msg.guild.me.nick is None:` でニックネームが設定されていない(=カスタムprefixが設定されていない)場合に`/` を返しています。

さて、ここからが本題です。カスタムprefixが設定されている場合に、どう処理しているかについて解説します。
仮にbotの名前を`hoge`、ニックネームを`[prefix]hoge`としておきます。
まず、`msg.guild.me`でbot自身の`Member`オブジェクトを取得し、`.display_name`でニックネームを取得し`nick`に格納しています。
そして`nick`から`[`と`]hoge`を`replace`し、`prefix`という文字列を取得します。
最後にこれをreturnしておしまい！

# 最後に
今回はだいぶ雑な記事になってしまいすみません、、
次回からしっかりしますのでお許しを

カスタムprefixを使用していいdiscord botライフを！
Ruby学習#26 Reading Files

employees.txt
 Jim, Sales
 Andy, Sales
 Kelly, Customer Service 
 Creed, Quality Assurance
 Michaes, Manager


File.open("employees.txt","r") do |file|

  puts file.read()

end
>>Jim, Sales
 Andy, Sales
 Kelly, Customer Service 
 Creed, Quality Assurance
 Michaes, Manager

  puts file.read().include? "Jim"
>>true

puts file.readline()
>>Jim,sales

puts file.readline()
puts file.readline()
>>Jim,Sales
Andy,Sales

puts file.readchar()
puts file.readchar()
puts file.readchar()
>>J
i
m

puts file.readlines()

>>Jim, Sales
 Andy, Sales
 Kelly, Customer Service 
 Creed, Quality Assurance
 Michaes, Manager

puts file.readlines()[2]
>>Kelly, Customer Service

for line in file.readlines()
  puts line
end

>>Jim, Sales
 Andy, Sales
 Kelly, Customer Service 
 Creed, Quality Assurance
 Michaes, Manager

file = File.open("employees.txt","r")

puts file.read

file.close()


>>Jim, Sales
 Andy, Sales
 Kelly, Customer Service 
 Creed, Quality Assurance
 Michaes, Manager
ワードプレスのプラグインで文字サイズを変えられるやつ

use any font をインストールします


![mfqlkw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/e3bead82-8c9f-c6f4-72a7-44d40921a248.png)

するとこんな感じで投稿の時にフォントサイズなど選べます


![fqwfq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/ed03f8c0-690e-8f24-b024-a09060cb1f71.png)