OmniAICreator/Qiita-1.07M huggingface dataset:
EC2のEBSのボリューム(gp2)を増やす手順

## はじめに

EC2にアタッチされているEBSのボリューム(gp2)をデフォルトの8Gから16Gに拡張した際の手順です。

## aws console

**EC2 > EBS > ボリューム**
1. サイズを変更したいボリュームを選択
2. すでに大事なデータが保存されている場合はスナップショットを作成しておく
3. **アクション>ボリュームの変更**からサイズを8から16にする
4. ボリュームの状態が"in-use - optimizing (0%)"になるまで待つ

## EC2インスタンス
[ボリュームサイズ変更後の Linux ファイルシステムの拡張](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html
)

### パーティションの拡張

#### 確認
`lsblk`コマンドでボリュームに拡張が必要なパーティションがあるかどうかを確認する。
下の例ではxvdaが16G、xvda1が8Gになっているので拡張が必要。

```
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  16G  0 disk
└─xvda1 202:1    0   8G  0 part /
```

#### 拡張

`growpart`コマンドを使用してパーティションを拡張する

```
$ sudo growpart /dev/xvda 1
CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=33550303 end=33554399
```

#### 再確認
`lsblk`コマンドで再確認。xvdaとxvda1が共に16Gになったので拡張成功。

```
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  16G  0 disk
└─xvda1 202:1    0  16G  0 part /
```

### ファイルシステムの拡張

#### 確認
ファイルシステムのサイズは拡張前のままであることを確認。

```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         474M     0  474M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  436K  492M    1% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  4.6G  3.5G   58% /
tmpfs             99M     0   99M    0% /run/user/1000
```
↑/dev/xvda1がまだ8.0Gのまま

#### 拡張

##### ファイルシステムの識別

ファイルシステムによって拡張コマンドが変わる。
`file`コマンドの-sオプションでパーテーションのファイルシステムの型を判定する。

```
$ sudo file -s /dev/xvd*
/dev/xvda:  x86 boot sector; partition 1: ID=0xee, starthead 0, startsector 1, 16777215 sectors, extended partition table (last)\011, code offset 0x63
/dev/xvda1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
```
XFSを使用しているので`xfs_growfs`コマンドを使用して拡張する。
ext4の場合は`resize2fs`コマンドを使用する。

[resize2fs: Bad magic number in super-blockとなった時の対応方法](https://qiita.com/ponsuke0531/items/04153c6228516e48a55e)

```
$ sudo xfs_growfs /dev/xvda1
meta-data=/dev/xvda1             isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 4193787
```

#### 再確認
/dev/xvda1サイズが16Gに拡張されていることを確認する

```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         474M     0  474M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  436K  492M    1% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1        16G  4.6G   12G   29% /
tmpfs             99M     0   99M    0% /run/user/1000
```
C 言語でセグフォらせる (おそらく) 最短コード

セグフォブームに便乗して。多分これが一番短いんじゃないかな？というのを昔調べたことがありました。

結論からいくと、 GCC は `main` シンボルが宣言されていればとりあえず実行ファイルを生成できます。

宣言時の型は省略できる (暗黙に `int` になる) ので、 `main;` とだけ書いておけばとりあえず `main` シンボルを宣言できます。したがって以下の５文字でとりあえず実行ファイルを作ることができます。

```C:segfault.c
main;
```

```terminal
$ gcc segfault.c 
segfault.c:1:1: warning: data definition has no type or storage class
 main;
 ^~~~
segfault.c:1:1: warning: type defaults to 'int' in declaration of 'main' [-Wimplicit-int]
```

実行すると `main` 関数を呼び出そうとしますが、もちろんまともな実体がないので死にます (「`main` らしきもの」を `call` した次のステップで、変な命令を踏んで死)。

```terminal
$ ./a.out 
Segmentation fault
```

ちなみに `main` シンボルすら定義しない空のプログラムも、 C のプログラムとしては valid なのでコンパイルまではできるみたいです。ただし実行ファイルを作ろうとするとリンカが死ぬので、実行はできません。

```C:kyomu.c
```

```terminal
$ gcc -c kyomu.c # コンパイルはできる
```

```terminal
$ gcc kyomu.c # リンクはできない
/usr/lib/gcc/x86_64-redhat-linux/7/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
```

----

追記: 「16文字」の記事のコメント欄で同じアイデアが先に言及されてました 🙏 おもしろいと思ったらぜひそちらにいいねお願いします！
【Android 9.0 Pie】ActivityやFragment以外でのstrings.xmlの呼び出し方の例

## 初めに
定数の管理に便利なstrings.xmlですが、ActivityやFragmentを継承していないクラスで呼び出す際の方法をメモしておきます。

## 実装方法
私はApplicationクラスを継承したクラスにコンテキストを生成してしまい、定数取得用の関数を作成して呼び出し側のコードを少しでも削れるようにしてみました。

```java:Model.java
public class Model extends Application {
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
    }

    /**
     * 定数取得関数
     * strings.xmlに定義した定数をどこからでも取得できる
     * @param resId R.string.resId
     * @return String 定数
     */
    public static String getConst(int resId) {
        return context.getResources().getString(resId);
    }
}
```
```xml:strings.xml
<string name="chat_list_delete_button_label">DELETE</string>
```
呼び出し側は以下のような記述で呼び出せます

```
Model.getConst(R.string.chat_list_delete_button_label);
```
以上です。

どなたかの参考になれたら幸いです。
より良きシステムのための検討事項

#はじめに
各種検討が幅広く必要だし、有効であることの計測方法もさまざまある。
信用を測ることも大事だし、未知の中で決心して進めることも大事。
信じて確定させる箇所と、疑って調査や検討がたくさん必要になる箇所がある。
そしてリソース（時間、金、人間、やる気）は有限である。

#速いプログラムを作るには
メモリの使い方
キャッシュの利用
効率的なSQL
並列処理
差分更新
データの形式
言語の選定
データのソート方法
ネットワーク構成
画面構成

#システムを継続するには
機器選定
コード可読性
サービスの選定
ドキュメント保守
関係者の信頼関係
継続技術の利用
python dictとsorted関数について

pythonの勉強をしていると、sorted関数とはは避けて通れないものです。しかもよく忘れるので、メモっておきますね。ここは辞書に対してsorted関数を使っています。
気をつけるべきポイントはlambdaの後ろのyやxは別に何でもいいということです。例えば、lambda aaa:aaa[0]としても構わないのです。なぜなら、ここのyやxはただ前のlistの(例ではlistA, listB, listCのことです)中身なのですから。ここさえ押さえておけば大丈夫そうですよね。
以下の例を見てみてください。

```python
listA = [3, 6, 1, 0, 10, 8, 9]
print(sorted(listA))
#结果1
#[0, 1, 3, 6, 8, 9, 10]

listB = ['g', 'e', 't', 'b', 'a']
print(sorted(listB))
print(sorted(listB, key=lambda y: y[0]))
#结果2
#['a', 'b', 'e', 'g', 't']
#['a', 'b', 'e', 'g', 't']
listC = [('e', 4), ('o', 2), ('!', 5), ('v', 3), ('l', 1)]
print(sorted(listC, key=lambda x: x[1]))
#结果3
#[('l', 1), ('o', 2), ('v', 3), ('e', 4), ('!', 5)]
```

**sort、sortedの違いについて：**
1. sortはリストの関数であるのに対し、sortedはlistのみならず、辞書dictなどのすべてのイテラブルに対して使えるのだ。
2. sortはもともとのリストを操作して、そのリストを変形させるのに対し、sortedはもともとの対象に手を加えず、新たにlistを作成してそれを戻すという作業の流れの違いはあるので、ご注意を。

さてさてまたね。
Ubuntu(linux)でkeychainを使ってSSHのパスフレーズをいちいち聞かれないようにする

SSHでssh-agentとssh-addを使ってパスフレーズレスログインをしているとちょっと面倒なので`keychain`を使っていい感じにする。

## keychainのインストール

```
sudo apt-get install keychain
```

## 設定

~/.bashrcや、~/.zshrcに下記の設定を追記する。

```
/usr/bin/keychain $HOME/.ssh/id_rsa
source $HOME/.keychain/`hostname`-sh
```

公開鍵がないと登録できないので、秘密鍵しかない場合は、[SSHの秘密鍵から公開鍵を生成する方法](https://qiita.com/reoring/items/76f47edc7699f11fa8f6)を参考に公開鍵を生成する。

`id_rsa`のような鍵名は適宜置き換える。

## 使う

```
source .zshrc
```
vistaでquartus その14


#概要

vistaでquartusやってみた。
karutaでLチカしてみた。

#インストール

ubuntu 18.04 64bit


```
snap install core
snap install karuta
```

/snap/binに入った。
versionは、0.5.9

#環境

windows vista 32bit
quartus ii v13.0
ep2c5t144ボード

#写真

![CIMG2963.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/26e1e54d-993a-3293-af7e-20e33e11435a.jpeg)


#サンプルコード


```
shared L object = Kernel.clone();

@ExtIO(output = "led2")
func L.f(b bool) {
  print(b);
}

func L.main() {
  var b bool = false;
  while (true) {
    wait(10000000);
    f(b);
    b = ~b;
  }
}

L.compile();
L.writeHdl("led.v");

```

以上。
さくらのVPS(Ubuntu18.04)でSSHログインできなかったはなし

供養として投稿します。

## 顛末

契約直後、コンソールからOSインストールでUbuntu18.04を選択。
稼働中のステータスになったあとSSH接続を試行。SSHキーも登録したので以下のように入力。

```shell
$ ssh root@IP_ADDR -i ~/.ssh/id_rsa
```

しかしつながらない、それどころか何故かパスワードを要求される始末。はて？

契約時に送られてくるパスワードも、OSインストール時に入力した管理者パスワードも、果てはさくら自体のパスワードを入力してもダメ。どないなっとるんや！！

## 原因

ユーザー名が違いました。OSインストール画面にご丁寧に表示されるのを思いっきり見逃していた。。。

```shell
$ ssh ubuntu@IP_ADDR -i ~/.ssh/id_rsa
```

無事接続。良かった。恥。
SSHの秘密鍵から公開鍵を生成する方法

```
ssh-keygen -y -f ~/.ssh/id_ecdsa > ~/.ssh/id_ecdsa.pub
```

秘密鍵がパスフレーズで暗号化されている場合はパスフレーズの入力を求めるプロンプトが表示されるので入力する。
2020年オレ流パソコン選択

#　はじめに

今回の記事は、**Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」です** って書かれているけど、少しくらいズレていても良いかな？って話題です。

- プログラミングするには、パソコンあった方がいいよね？
- だったら、どんな機種がおすすめ？

基本は、あまりにも当たり前だけど、
**いろいろある制限の範囲内で、自分が良いと思ったものを買う**

これで終わりじゃ、記事にならない（汗）
いろいろ書いてみる。

# オレ流

## 予算
一番に思いつく制限事項は「予算」だね。
（ガッツリ稼いでもいないし、親がお金持ちでも無いから）
でも、最初に予算で絞り込んでしまうと「良い物」が見えてこないので
お金を貯めることを前提に、あとで検討するべき項目だと思う。

## パソコン形状
これは**ノート型**以外選択しようがない。

- 何時間も CPU に高負荷をかけるわけじゃ無い
- 数テラバイトのファイルを扱うわけじゃ無い
- 何枚ものGPUを使い倒すわけじゃ無い
- 4kとか高画質のデータを扱うわけじゃ無い
- 他に何かあるか？？？？？

## トラックパッドとキーボード
トラックパッドの使い心地は個人的に譲れません。
（キーボードはホームポジションで使うことにこだわりはない）

今までの経験では
キーボードは使っているうちに体が慣れたけど
トラックパッドは慣れない

いまどきのOSは、ポインター操作が思い通りにならないと
**ストレス MAX** です

ノート型パソコンを使ってる人で
**『マウスがないと使えない』**と言う人がいるけど

それは、**使いにくいトラックパッドのパソコンを使っているから**。

世の中に**使いにくいマウス**が存在するように
世の中には**使いにくいトラックパッド**が存在する。
マウスは取り替えることができるが
**トラックパッドは取り替えることができない**

残念なことに、自分の知る限り
トラックパッドに気を配っている（と思える）メーカーは１社

**Apple**のみ

新しい機種ではキーボードも改善されたようで Good!

※ホームポジションでトラックポイントの人は**ThinkPad**をどうぞ

## CPU
ある程度の性能でOKで、あとはコスパかな？

- 常に高負荷で使うのであれば、十分に検討項目になる（あなたの使い方は？）
- 高負荷時の１０％〜２０％の性能向上に、いくら払える？
- 高性能のCPUが必要なら、排熱も考えてデスクトップ型を検討すべき


## メモリ容量
考える必要は、そんなに無い

- 最低ラインが、16GB
- 予算に余裕があるなら、32GB以上


## ストレージ
考える必要は、そんなに無い

- 512GB 程度
- 予算に余裕があるなら、残りの予算を全部注ぎ込んで大容量を選択

## GPU
ある程度の性能でOKで、あとはコスパかな？
使い方次第では、上位のGPUを選択すべき

- ゲームする？
- VR する？
- 学術計算する？
  - 個人でこんなことする人は少ないはず 
  - 仕事なら、勤務先で用意してもらうべきでは？

## OS
macOS/Windows/Linux/*BSD 好きなのを選べば良い。
Appleの売っている機種にも Windows は導入可能だ。

## 予算（再掲）
欲しいパソコン機種が絞り込まれたところで、**予算**

避けて通れません。どうする？

- 貯める
  - 何年？何ヶ月？
- 借りる（使い方にご注意）
  - 身内（親、夫or妻、子供）
  - 分割（ローン、リボ）
  - 金融機関（これは、お勧めしない）
- 機種検討
  - 性能、容量などを削る
  - 安価な別機種

# おわりに
AppleはWWDC 2020で、CPUをIntelから変更することを発表した。
OSにWindowsを選択するのであれば、Intelを使っているうちにパソコンを購入しよう。

<!-- eof -->
Excel VBA設定

#まとめてコメントアウト
・ツールバーで右クリック＞ユーザー設定
・ショートカットメニューに✔を入れ、ショートカットメニューを表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335742/0377ef88-38e0-f85f-1b67-3e24968fa97b.png)
・コードウインドウ＞コードエディタウインドウを表示する
・ユーザー設定＞コマンドタブ＞分類：編集を選択
　「コメントブロック」「非コメントブロック」をコードエディタウインドウにドラッグ＆ドロップする。
・ユーザー設定を閉じる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335742/e4d2252f-f2b7-a004-05b8-f015f572e469.png)
・コードエディタウインドウを閉じた後、ユーザー設定を閉じる。
・VBAエディタを右クリックすると、「コメントブロック」「非コメントブロック」が追加されている。
10進数を2進数に変換する方法

# はじめに

今回は、10進数を2進数に変換する方法を考えていきます。

# 原理

10進数と2進数の関係といたしましては、以下の通りです。

a_0*10^0 + a_1*10^1 + a_2*10^2 + ・・・　= 
b_0*2^0 + b_1*2^2 + b_2*2^2 + ・・・
（a,bはどちらも整数としています。）

これだとわかりにくいので、例として、14を2進数に置き換えてみると、

4*10^0 + 1*10^1（１０進数：14） = 0*2^0 + 1*2^1 + 1*2^2 + 1*2^3（２進数：1110）

というようになります。これを踏まえて、２進数に変換する流れを書くと

#### ①　numberをなんらかの整数とする（例として14を考える）

#### ②　numberを2で割ったあまりを求める（例だと、0*2^0 + 1*2^1 + 1*2^2 + 1*2^3/2の余りなので0）

#### ③　②で出した余りが2^0の係数となり、最初の桁は0となる。

#### ④　numberを2で割る（例で言うと、1*2^0 + 1*2^1 + 1*2^2となる）

#### ⑤　あとは②③④を繰り返すだけで2進数に変換することができる。

```ruby
number = 14 

number % 2 # →　0
number / 2 # →　7
number % 2 # →　1
number / 2 # →　3
number % 2 # →　1
number / 2 # →　1
number % 2 # →　1
number / 2 # →　0

余りの部分だけ見ていくと
number % 2 # →　0
number % 2 # →　1
number % 2 # →　1
number % 2 # →　1
→　1110
```
RecyclerViewで消えないScrollbarを表示する

## 概要
RecyclerViewで要素が多い際に、まだスクロールできることをユーザーに伝えたかったので調べた際のメモです。

## Scrollbarを表示する
表示されるようにするだけなら`RecyclerView`に`scrollbars`項目を指定してやれば良い。
しかしこれだけだと、時間経過でフェードアウトしてしまう。

```
android:scrollbars="vertical" // 横向きならばhorizontal
```

## Scrollbarが消えないようにする
時間経過で消えないようにするため上述の要素に加えて`fadeScrollbars`に`false`を指定する。

```
android:scrollbars="vertical" // 横向きならばhorizontal
android:fadeScrollbars="false"
```
[Pytorch] torch.catの動きを理解する

## はじめに
[PyTorchの公式](https://pytorch.org/docs/master/generated/torch.cat.html)(1)にある```torch.cat```の例だけでは良く分からなかったので他の例を使って理解するための書き残しです．


## sample code

```python
import torch
input1 = torch.randn(2, 3, 4)
input2 = torch.randn(2, 3, 4)
input3 = torch.randn(5, 3, 4)
input_list = [input1, input2, input3]


output1 = torch.cat(input_list, dim=0)
print(output1.size()) # torch.Size([9, 3, 4])

output2 = torch.cat(input_list, dim=1) # error
print(output2.size()) 

output3 = torch.cat(input_list, dim=2) # error
print(output3.size()) 
```

## torch.catの例示
torch.catの入力を見てみると
>tensors (sequence of Tensors) – any python sequence of tensors of the same type. 
 Non-empty tensors provided must have the same shape, except in the cat dimension.
 dim (int, optional) – the dimension over which the tensors are concatenated
 out (Tensor, optional) – the output tensor.

と3つ引数があるようです．[sample集](https://www.programcreek.com/python/example/101262/torch.cat)(2)を見ていても第一と第二を使用することが多く第三引数はあまり使われてないようです．なので，第一と第二を使っていきます．

## 第一引数(tensors)
第一引数は```tensors (sequence of Tensors)```なミソですね．
これはTensorが```list型```か```tuple型```で入力される必要があるので以下のように準備します．注意が必要なことは，次元の大きさがすべて同じことです．今回は3次元としています．

```python
input1 = torch.randn(2, 3, 4)
input2 = torch.randn(2, 3, 4)
input3 = torch.randn(5, 3, 4)
input_list = [input1, input2, input3]

print(len(input1.size())) # 3
print(len(input2.size())) # 3
print(len(input3.size())) # 3
```

## 第二引数(dim)
説明を見ても結合する次元とだけ書かれているので理解できそうでできない雰囲気ですね．
今回の例(```output1```)だと```dim=0```なら```input1.size(0), input2.size(0), input3.size(0)```サイズを結合(足し合わせ)します．
この時，```dim=1, dim=2```の```size```が同じである必要があります．
手書きですが，図で書くと以下のようになります．
![20200702_013939852_iOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/1190df57-5fb9-d58a-4587-dbc8917efa04.png)
```dim=1, dim=2```の```size```が```3, 4```なので，結合できますね．
したがって，```output1.size()```は，```torch.Size([9, 3, 4])```になります．
結合する次元を```dim=1, dim=2```にしたときは，```dim=0```が合わないので結合できないとエラーが返ってきます．

## さいごに
ちなみにerrorとなっている部分に対して，input1,input2,input3のsizeをすべて同じ形にするとなくなります．でも，それはPyTorchの公式を見れば十分かと
torch.viewとtorch.catはCNNのPoolで見かけることが多いな～と思う今日この頃

## 参考文献
(1) [TORCH.CAT](https://pytorch.org/docs/master/generated/torch.cat.html)
(2) [Python torch.cat() Examples](https://www.programcreek.com/python/example/101262/torch.cat)
CAD・形状モデリング２　CSG

[**ここ**](https://www.jstage.jst.go.jp/article/jjspe/79/2/79_144/_pdf)に次のような記述がある（一部改変）。
> 現在主流のソリッドモデルは大きくCSGとB-Repの２つに分かれる。CSGはプリミティブ（略）を組み合わせ、その履歴を覚えていくことにより表現されるものである。一報B-Repはサーフェースモデルで用いられている幾何情報に加えて隣接関係をいれることにより、閉じて囲まれた領域を立体として表現するもので、現在もっとも多くの３次元CADに取り入れられている方法である。

今回は、ここにでてくるCSGについて解説する。

プリミティブと呼ばれる基本形状（球、直方体、円錐、、、）がいくつか定義されており、これらをブール演算することで複雑な形状を表現する方法である。丁度、マイクロソフト製品によくあるオートシェイプで、曲線を使わないで図形を描くことをイメージしてもらうと良い。中心を重ねて円を２つ描いて小さい方を除算すれば、円環のようなものが描けるし、”職人”になれば複雑な絵を描くのも可能である。

このCSGを使うメリットとして、データが軽いことである。３次元でなく２次元で考えてみてもこれは顕著で、例えば128x128でチャンネル数が1の画像は、128x128x1=16384バイトになる（実際はヘッダーが入るのでもう少し大きい）。これに対してCSGで定義すれば、4つの頂点座標（４つのエッジ情報）さえあれば、あとは直方体を示す番号でもとっておけば表現できるため、バイト数の比較すら億劫なレベルである。

具体的に、MATLABを使って見てみる。
例えば長方形を考えるのであれば、まず以下のルールに従ってエッジ情報を与える必要がある。これはプリミティブを作っている部分に相当する。

|行      |値                                      |
|--------|---------------------------------------|
|1       |3 (長方形を識別する番号)                 |
|2       |4 (ライン/辺の数)                       |
|3~6     |エッジの開始点におけるX座標（頂点のX座標） |
|7~10    |エッジの開始点におけるY座標（頂点のY座標） |
参考は[**こちら**](https://jp.mathworks.com/help/pde/ug/create-geometry-at-the-command-line.html)

例えば、R1 = [3,4,-1,1,1,-1,-.4,-.4,.4,.4]';などと入力すればよい。ベクトル表現になっている。通常は、多数の形状を作成し、どういうブール演算をするかも定義する必要があるが、まずはこれだけを使うこととする。
プリミティブが揃い、演算が定義できればそれを実行するだけである（ただしくは、形状を構成する最小単位に分解する）。実行すると、以下となる。

|列1     |列2     |列3     |列4     |
|-----|-----|-----|-----|
|2	|2	|2	|2 |
|-1	|1	|1	|-1 |
|1	|1	|-1	|-1 |
|-0.400 |-0.400	|0.400  |0.400 |
|-0.400 |0.400	|0.400  |-0.400 |
|1	|1	|1	|1 |
|0	|0	|0	|0 |
ここでは、各列が各々エッジ（辺）に対応しており、上から順に、曲がっていない線分、開始点のX座標、終了点のX座標、開始点のY座標、終了点のY座標、このエッジにより分離された領域の左側のID、右側のIDとなっている。詳細は[**こちら**](https://jp.mathworks.com/help/pde/ug/create-geometry-at-the-command-line.html#bulfvw4-1)へ

こうして、以下の形状を描くことができた（空白についてはご容赦）。
![untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609099/71212d28-0097-4f8e-8770-61922eb67776.png)

ただ、この方法だと複雑形状を描くためには”職人”にならないといけないし、何より、曲率の変化が一定な形状を描きたいとか考えると、プリミティブにそういう形状がないので、非常に描きづらい。諦めて多角形で描くのも一つだが、そういう形状を使って流体シミュレーションをすると、角張ったところで余計なことが生じるだろう。
と考えると、CSGは軽くて便利なのだが、表現力に乏しいということがわかる。そこでB-Repになるのだが、それはまた後日・・・。
ExcelVBA備忘録

「たった1秒で仕事が片付くExcel自動化の教科書」を読んで、ドッグイア―したところを記載。

#設定
**1. 変数の宣言を強制 & 自動構文チェックなし**
・VBE起動＞ツール＞オプション＞編集タブ
・「自動構文チェック」を外す
　⇒構文に不備がある度に警告が出現するのを防ぐ
・「変数宣言を強制する」にチェックを入れる
　⇒変数名の打ち間違い等の特定を容易にする
・OKで閉じる
※次回設定変更するまで反映される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335742/f92a41b9-0b8d-04d2-d845-fe7e10bd5aca.png)

**2. Excel画面更新の停止**
画面が頻繁に切り替わるマクロの場合、Falseにすると高速化する。
Application.ScreenUpdating = False

#構文
**1. With構文**
一括で指定したい場合に用いる。
下記の場合、「Re.」を「.」入力するだけでOK。

```
Sub test()

Dim i As Integer
Dim Re As Object　'正規表現=Regular expressions
Set Re = CreateObject("VBScript.RegExp")  '正規表現オブ

With Re
   For i = 5 To Cells(Rows.Count, 1).End(xlUp).Row '最終行取得
        .Pattern = "ABC"  '検索したい文字列を定義　
        .Global = True　'True:文字列全体を検索
         Cells(i, 7) = .Replace((Cells(i, 7).Value), "")
   Next i
End With
```


**2. Offset**
Offsetは**セルの移動**。
・書式
　**Rangeオブジェクト.Offset(行, 列）**
　RangeオブジェクトをOffsetに指定した分だけ移動させる。
例）
　Range("A1:D5").Offset(0, 2).Select

**最終行、最終列取得**

```
Dim  m, n As Integer
    n = Cells(Rows.Count, "B").End(xlUp).Row
　　　'B列の最終行を取得
    m = Cells(2, Columns.Count).End(xlToLeft).Column
　　　'2行目の最終列をす
```
【Unity】Sceneをまたいだ値の受け渡し方

#初めに
Scene間での値の受け渡しに関してはまだ様々なところでこっちの方がいい、あっちの方がいいなど議論されています、ですのでどれが正解なのかは各個人によって決まります。
今回はいくつかの方法をお伝えできればと思います。

#目次
* DontDestroyOnLoad
* PlayerPrefs
* 静的クラスまたは静的変数

#DontDestroyOnLoad
Unityには**DontDestroyOnLoad**という関数があります、この関数はObjectをSceneをまたいでも引き継がれるObjectにするための関数です。
この**DontDestroyOnLoad**なObjectに値を渡すことで次のSceneでも値を引き継ぐことができます。

##サンプルコード

```C#
	//値を保存用
	public int Score { set; get;}

    void Start()
    {
    //↓これを呼び出せばDontDestroyObjectにできます
	DontDestroyOnLoad(gameObject);
    }
```

###実行結果
![FadeOut.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211130/9fda0d9f-7ac4-cd9d-3bae-39cc3a64d5f2.gif)

#PlayerPrefs
**PlayerPrefs**に関しては過去にまとめた記事がありますので[こちら](https://qiita.com/tilyakuda/items/e3ccfbf507acfb16404f)を参照してください。

##サンプルコード

値を保存

```C#
    void Update()
    {
		if (Input.GetKeyDown(KeyCode.A))
		{
			PlayerPrefs.SetInt("Score",int.Parse(GetComponent<InputField>().text));
			SceneManager.LoadScene("2");
		}
    }
```
値を呼び出す

```C#
    void Start()
    {
		GetComponent<Text>().text = PlayerPrefs.GetInt("Score").ToString();
    }
```

###実行結果
![PlayerPrefs.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211130/4cc26922-f1ba-25e2-52fd-9fa4c2744a35.gif)

#静的クラスまたは静的変数
静的クラスなどはゲーム開始時に最初にメモリ領域を確保してゲーム終了までそのメモリ領域を解放しませんので値が常に保持されているということができます。

###サンプルコード

値保存用クラス

```C#
public static class Test
{
	public static int Score { set; get;}
}
```

値を入れる

```C#
    void Update()
    {
		if (Input.GetKeyDown(KeyCode.A))
		{
			Test.Score=int.Parse(GetComponent<InputField>().text);
			SceneManager.LoadScene("2");
		}
    }
```

値を呼び出す

```C#
    void Start()
    {
		GetComponent<Text>().text = Test.Score.ToString();
	}
```

### 実行結果

![static.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211130/3138ec3a-a815-c34a-5557-8bb7f5ce3d3d.gif)


#まとめ
実行結果が少しわかりずらいのでなくてもよかったかな？って感じる…
ぶっちゃけScene間の値のやり取りって難しいですよね、今回記事にした内容以外にもいくつかやり方ありますし、そもそもScene遷移しないという選択肢もあるわけで…
とりあえず色々試して自分に一番合うものをお探しください！
UbuntuでmacOSのpbcopyのようにコマンドの出力をクリップボードに入れる方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/41e0e8cd-8898-e6ce-dac2-a77ef0deb110.png)


## まずはxclipをインストール

```
sudo apt-get install xclip -y
```

## aliasを設定

.bashrcや.zshrcに書き設定を追記。

```
alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'
```

## 設定を反映

```
source ~/.zshrc
```

## つかってみる

```
ls | pbcopy
```

これでクリップボードに入っていればOK!
GAS Calendarの予定削除

#### GAS Calendarの予定削除
---
カレンダーを全て取得して
ある日程から先の予定を全て削除する。

Exceptionエラーとなり、操作できないと表示されるが
何度か繰り返すと予定は削除された。


```javascript:コード.gs
function Delete_CalendarEvents() {

  var calendars = CalendarApp.getAllCalendars();

  const startTime = new Date('2020/7/3 7:00:00');
  const endTime = new Date('2021/1/1 12:00:00');
  
  for (var i in calendars) {
    var id = calendars[i].getId();
    var calendar = CalendarApp.getCalendarById(id);
    //Logger.log(id)
    var events = calendar.getEvents(startTime, endTime);
    for (var i in events) {
      var event = events[i];
      
      event.deleteEvent();
    }
  }
}
```

### 7/8追記
---
複数の予定があると例外エラーとなって使い物にならず
Jupyter Notebook メモ

Jupyter notebookの機能等について備忘録。


セルの実行を限定する
===
特に長いnotebookでの作業で、例えばあるセルまで前半のコードを実行したい場合、

```Python
raise SystemExit('Stop here!')
```
を入れたセルで実行をストップできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656299/453c6be7-b125-8049-1d89-818d50238208.png)



Markdownセルへの画像の挿入
===
挿入する画像を保存したうえで、パスとして指定。例えば、

```markdown
<img src="plots/EMmanifold_SEpoincare.png" alt="Drawing" style="width: 600px;"/>
```

もしくは

```markdown
![EMmanifold_SEpoincare.png](attachment:EMmanifold_SEpoincare.png)
```

前者でやると画像のサイズをpxで調節できるため便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656299/d5d93f88-a82a-e14d-c170-4535f37f1a9f.png)
Next.js + TypeScript で path alias を使う

### プロジェクトルートに alias を設定

``` next.config.js
const path = require('path')

module.exports = {
  webpack(config) {
    config.resolve.alias['@'] = path.join(__dirname)
    return config
  },
}
```

``` tsconfig.json
{
  "compilerOptions": {
    ...

    "baseUrl": "./",
    "paths": {
      "@/*": ["./*"]
    }

    ...
  },
  ...
}
```

### 使う
``` index.tsx
import Layout from '@/components/Layout'
```
『プリンシプル オブ プログラミング』読書記録　第６章

#はじめに
今回『プリンシプル オブ プログラミング』という本を読みましたので、自分なりにアウトプットしていく目的でまとめます。
リンク：[『プリンシプル オブ プログラミング ３年目までに身につけたい一生役立つ101の原理原則』](https://www.shuwasystem.co.jp/book/9784798046143.html)

#第６章　手法〜プログラマの道具箱〜

##一言まとめ

 - 曳光弾
    - 実際にリリースするものとして初期の段階で最低限の機能を備えた骨格となるシステムを作成する。
 - 契約による設計
    - 関数と関数を呼び出す側で、役割を分ける。
 - 防御的プログラミング
    - 受け取ったデータについて、まず検証しエラーないし停止の措置を取る。
 - ドッグフーディング
    - 自らの作ったシステムを自ら使ってみる。
 - ラバーダッキング
    - 悩んだら、その内容を整理して話してみる。
 - コンテキスト
    - 一番最初にコンテキストを読み取り、設計に活かす。

##補足

###曳光弾
　プロジェクトを進める際、まずは「曳光弾」として優先的に検証したい部分、土台となる部分のみのソフトウェアを作り実際の環境下で動作させることで、開発の精度が向上する。今まで構築したことのないようなソフトウェアを開発する場合は、特に重要となってくる。その利点としては以下が挙げられる。

 - ユーザーからのフィードバックが早いうちから得られる
 - コードに具体化することでプログラマ作業を行いやすい状態となり、全員が生産的になることが出来る
 - デバックやテストが早く正確に出来る
 - ステークホルダーに対するデモが可能なソフトウェアを確保できる。
 - 進捗が明確になる

　ソフトウェアの最終形態まで残るコードとして作成をする。そこに少しずつ肉付けをしていく形で作り上げていく。これはプロトタイプと似ているが明確に異なるものである。

　プロトタイプとは問題に対しての解決策を得られるような使い捨てのソフトウェア、例えばUIの確認のために本物の機能を搭載しない見た目にだけ動作をする画面を作り、作成の方針について「学ぶ」ためのものである。曳光弾とはソフトウェア全体がどのように連携するのかを明らかにするものであり、今後も使用し続けること前提で作成をする。そしてシンプルながらも実際の機能を搭載し動作するものを作成し、システム最終型の骨格とする。

###契約による設計

　関数と関数を呼び出す側で、互いに「契約」を結んでいると見なしてプログラミングをすることを「契約による設計」という。関数を呼び出す側は正しい引数を渡すことを「契約」とし、関数は呼び出し後に保証されるべき条件を整えることを「契約」とする。これらを守ることで以下のようなメリットがある。

 - 要求通りのことを行うコードを書くことが出来る
 - 正しい引数が渡されていることを前提として関数の処理コードを書くのでコードをシンプルにすることが出来る。
 - 問題を早めに見つけることが出来る

　これを実現するために必要なことは、呼び出し側の仕事と呼び出される側(関数)の仕事を分けることである。呼び出し側では呼び出される側に、正しい値を渡せるよう、入力値(ユーザー入力値などにミスがないか)を検証し、呼び出され側ではそのチェックのみを行い、条件に沿うように変換する処理は行わない。また、書くコードを減らすために、受け付ける想定は厳格にし、結果を戻す際には可能な限り確約を少なくするよう努める。

　プログラミング言語には、たいてい「assert」という真偽式をチェックする機能が提供されている、これは「アサーション」と呼ばれる。アサーションが真であることは、全てが順調に実行されていることを意味する。アサーションが偽であることは、コードから「予想外」のエラーが検出されたことを意味する。偽になった際には、早期に実行を停止する必要がある。
　このアサーションを使用する際には、注意点が有り、アサーションに渡す条件式には変数の値を変えないものにする。また、アサーションはエンドユーザー用では無いため、リリース版には組み込まないよう気をつける。

###防御的プログラミング
　関数に不正なデータが渡された時に、被害を受けないよう「防御的な」コードを書く必要がある。外部インターフェースからデータを取得した場合は、そのデータが許容範囲内のものか検証し、エラー処理を行う必要があり、また、別の関数から渡された場合は、不正な値であれば直ちにプログラムを停止するようにする。
 これらを行うことで、開発中、運用中の安全性を担保できる。例えば、開発中には、早めに不正なデータを見つけエラー等で把握することによって、別の場所への波及を防ぐことが出来る。また、運用中には、二次災害の防止だけでなくセキュリティの観点でも、エラー処理の不備を無くすことが重要となる。具体的には、インターフェースを使用し、通過するデータを検証して適切でないデータからモジュールを守ることが肝要である。

###ドッグフーディング
　自らが作ったソフトウェアをリリース前に自分で実際に使用してみることは非常に効果的である。いち開発者としてではなく、いちユーザーとして使用することで、必要のない機能や、付け加えるべき点が見えやすくなる。そしてリリース後も、自ら使い続け、それが「便利」であることを自ら証明するべきである。

###ラバーダッキング
　作業する中で何か問題が発生した際には、まずその問題について説明してみることで、問題の原因に気付けることが多くある。順を追って説明することで、コードの中に存在する暗黙の仮定など自分では見えづらくなっていたことが浮き彫りになり、問題解決が早まる。話す相手としては同僚が最適だが、時間を取ることとなるので、最初は無機物相手でも構わないので話してみても効果がある。

###コンテキスト
　コンテキストとは、周りの状況は背景のことである。コードを読み書きする際に、モジュール名や変数名によってその機能の説明を端的に行ったり、そのコードの周囲の状況を考える手がかりになったりする。このコンテキストから適した作業方法を読み取れるか否かが達人プログラマと初心者プログラマの差である。
　コードを書く際は先にコンテキストを示すようにし、何についてのコードか読み手に把握してもらえるようにする。また、問題解決の際には、コンテキストを前提に考えるようにする。作業全般において、最終的には絶対的なルールにただ従うのではなく、主体的に問題を解決できるようになるべきである。また、作業にあたる戦略としては「着眼対局、着手小局」を心がけていく必要がある。
　チーム間ではハイコンテキスト、つまり共通認識が多く、少ない情報で様々なことをやる取りする状況が望ましい。ただ、新しいメンバーに対してはローコンテキスト、つまりは自明であると思われることに関しても順を追って説明するようにする必要はある。


##参考文献
『プリンシプル オブ プログラミング　３年目までに身につけたい一生役立つ１０１の原理原則』上田勲 著　株式会社秀和システム　2016年3月29日　p.234~265
[Android]インストラメント化テストとローカルテストでコードを共有するには

# はじめに
Androidプロジェクトのテストは、テストの実行環境で以下のふたつに分けられます。

- **ローカルテスト**
`module-name/src/test/java/` にあります。
マシンのJVM上で実行されるため、実行時間・リソースがより少なく済みます。
Androidフレームワークを必要に応じてモックする必要があります。

- **インストラメント化テスト**
`module-name/src/androidTest/java/` にあります。
実機またはエミュレータ上で実行するため、再現性が高く実行時間・リソースがより多くかかります。
Instrumentation APIからContextなどの値を参照できます。

# テストソースにファイルを追加する
これらのテストでコードを共有したり、任意のファイルを参照するには、gradleでテストソースを指定します。

例えば、ローカルテスト・インストラメント化テストでコードを共有したい場合、
`module-name/src/sharedTest/java/{アプリのパッケージ名}`配下にファイルを作成し、アプリモジュールのbuild.gradleでテストソースを追加します。

```gradle
android {
   ...
   sourceSets {
       androidTest 
           java.srcDirs += "src/sharedTest/java
       }
       test {
           java.srcDirs += "src/sharedTest/java"
       }
   }
}
```

# 参考記事
https://proandroiddev.com/sharing-code-between-local-and-instrumentation-tests-c0b57ebd3200
複数の背景画像をCSSで設置する

# はじめに
こんな相談を受けました

- canvasの背景に設置した画像が重すぎて困っている.
- バックエンド側で軽量化したり画像形式を変えてみたが一長一短.
- 分割したらどうかとおもうが、可能？

`background` `background-***`は複数設定出来たと思ったのですが、うろ覚えだったので備忘をかねて投稿します。

# 実装
基本的には`,`区切りで複数設定できます。
最後に`;`を忘れずに。

```css:css

background-image: url("http://placehold.jp/56c7c7/ffffff/200x100.png?text=1"), 
url("http://placehold.jp/22a31d/ffffff/200x100.png?text=2"), 
url("http://placehold.jp/75b4d9/ffffff/200x100.png?text=3"); 

```
画像は重なるように表示されます。
その際、一番最初に指定した設定（画像path）が一番上（手前）に表示されます。

画像のサイズ（縦/横）によっては、画像が重なって見えない場合があるので、
必要に応じて`background-position`を設定すると良いかと思います。

```css:css
background-position: left 0px top 0px,
left 0px top 100px,
left 0px top 200px;
```
## 表示されない時のチェック事項
- 記述や画像のpathは正しい？
- カンマある？
- 画像が重なっていない？
- 繰り返しとかされていない？

＊１度、設定した画像を1つにしてみるとわかりやすいです。

# 実装例
<p class="codepen" data-height="414" data-theme-id="light" data-default-tab="js,result" data-user="H_Naito" data-slug-hash="pogWNGL" style="height: 414px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Multiple_background_settings">
  <span>See the Pen <a href="https://codepen.io/H_Naito/pen/pogWNGL">
  Multiple_background_settings</a> by H.N (<a href="https://codepen.io/H_Naito">@H_Naito</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## この例の実装ポイント
- こちらの実装ではJavaScriptで出力してます。
- 背景画像の共通設定は`background`プロパティで設定し、個別の設定を`background-***`で部分的に上書きしています。

# 参考

background-image
https://developer.mozilla.org/ja/docs/Web/CSS/background-image
Vue.jsで作ったサイトをgh-pages, AWS Amplifyで公開できるようにした。詰まったところの備忘録

参考資料：
Vue.jsを用いてサイト作成、AWS Amplify を使って自動デプロイについて
https://www.techpit.jp/courses/enrolled/881634

gh-pagesへの表示について
https://www.shookuro.com/entry/2019/02/02/174655


気を付けたところ：
gh-pagesでは、ソース変更しただけではサイトへの変更が反映されない。

ソース変更
→ビルド
```npm run build```
→コミット
→プッシュ

の流れでやる必要がある
（ビルドしたファイルもコミット&プッシュしなければならない）

詰まった：
Amplifyの方では
一旦失敗。
ログを見てみると
```Error: Artifact directory doesn't exist: dist
```
とあったので、ビルドの設定を見てみた。
ビルドのデフォルト設定
```  artifacts:
    baseDirectory: dist
    files:
      - '**/*'```
は、gh-pages向けに出力先をvue.config.jsでdocsに変更していたため、ここをdocsとすることで
無事ビルドが通るようになった。
SharePointに保存されているファイルにメタ情報を付加して、ページにメタ情報を表示する。

#はじめに
SharePointに置いてあるファイルにメタ情報を付与するをする方法とそのメタ情報を表示させる方法について解説します。

Microsoft Teamsを使っていると共有されたファイルがSharePointに保存されます。共有するファイルのファイル名はばらばらになりがちなので、
整理するためにメタ情報を付与し、検索しやすいようメタ情報をページに表示できるようにしました。

#メタ情報を付与する
まずはファイルにメタ情報を付与します。SharePointのドキュメントを開き、右上の歯車をクリックした後に「ライブラリの設定」をクリックします。

![ライブラリの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168941/3fcf9e9b-a1fc-4562-3f37-5221b58f9e1d.png)

ドキュメントの設定ページが開き、その中の「列の作成」をクリックします。新しい列（メタ情報）が作成できるので、作成します。
簡単な型などを設定できます。

既定のビューに追加をチェックすると、Teamsに表示されるファイルにもメタ情報が付与された状態で表示されるようになります。
![規定のビュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168941/b4cd80eb-2aa5-6eda-e7a1-41bf6ff1714c.png)


これでファイルに対してメタ情報が付与できるようになりました。ドキュメントから各ファイルにメタ情報を付与していきます。

![メタ情報の付与](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168941/c7ee20e7-b41c-57e0-cfed-0f084302cfbd.png)

#表示用のビューを用意する

次は表示用のビューを用意します。先ほどと同様にドキュメントのライブラリの設定を開きます。

一番下部にある、「ビューの作成」をクリックします。「標準ビュー」をクリックし、ビューの設定を行います。

ビューの設定でメタ情報の列にチェックを入れ、並び順の序列をつけます。ここでつけた序列は表示される時、左から順に表示されるようになります。
![メタ情報の表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168941/0a5f74eb-80ad-6a5d-2d7d-b7dd1ff149c1.png)


#ページを作成する

最後にビューを用いたページを作成します。SharePointのページより、新しいページを作成しページの中に「ドキュメントライブラリ」を作成します。ドキュメントライブラリの設定で「表示」の部分に先ほど作成したビューを指定します。

![ビューの指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168941/b5a2c660-c099-23c6-6354-b340323b58ca.png)

ファイルのメタ情報が表示されるようになります。メタ情報ごとにグルーピングも出来るのでフォルダの整理や命名規則も必要ありません。

![表示のされ方](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168941/2909b551-7f66-9b3b-70eb-8d1cd83446c9.png)
現場で気づいたCircleCIのメリット

#CircleCIとは？
一言でいうと`コマンド記憶装置`です。

類似のシステムでcapistranoというものがあり、私のスクール時代の課題では、下記のコマンドを`bundle exec cap deploy production`という１つのコマンドでまとめて実行していました。

CircleCIはそのコマンドもなく、クリックで当初設定したコマンド集を動かすシステムになっています。

つまり、いちいちコマンド忘れて調べたり、タイプミスに悩まされたりすることがなくなるという装置です。


```:capistranoで打ち込んでいたコマンドたち
#本番環境でgithubからpullして、
git pull origin master

#mysqlをrestart->migrateして、
sudo service mysqld restart
rake db:migrate RAILS_ENV=production

#scss,画像をそれぞれcss,バイナリ表示にコンパイルして、
rails assets:precompile RAILS_ENV=production

#ユニコーン（railsアプリを動かしているもの）のプロセスをkillして、
kill xxxxx(masterのプロセスID)

#ユニコーンを立ち上げる
RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D

```

#メリット
一言でいうと、**capistranoの上位互換で、ヒューマンエラーがなくなり、コマンドの検索が不要になるため業務効率が上がります。**

#どういうこと？（長いのでお急ぎの方まとめをご参照ください）
え？capistranoで十分では？となりそうなぐらいすごいのですが、CircleCIのメリットは`デプロイ以外のコマンドもさらに実行できるところ`にあります。（自分が把握したところだと主にdocker,jenkins,terraform（環境構築のコマンド集）の実行をしていました）

おそらくこの記事をご覧になっている方は初学者の方が多いと思うのでもう少し噛み砕いて説明すると、仕事としてwebアプリケーションを作るのには、最低３つ同じものを動かす必要があります。

１．自分のパソコンで動かしながら作成するためのローカル環境（基本的に仕事（それも自社で提供している会社に限る）でなければ１しか使いません。）
２．お客様に提供する本番（プロダクト）環境
３．お客様に提供する際に万が一エラーが起きては困るので、本番と全く同じ状態のもので、リリースして本当に大丈夫か実験を行うステージング環境

1についてはnpm（ダウンロード用のソフト。hombrewみたいなもの）のバージョンが人によって違ったり、bashが本番環境だけど手元はzshを使っていたりといろいろ違ってくるので、dockerでバージョン管理されたものが手元で動くなら自分で必要なものをダウンロードして環境構築してもらえばいいのですが、2と3はどうでしょうか。

たしかに最悪動けばいいので、最初に作った人（Aさんとします）が情報通でダウンロード用に使うnpmを最新版（非安定バージョン。今ならver6.14）を使って、２だけを作ったとしましょう。

その後何らかの原因（転職など）でAさんがプロジェクトから離れた場合、ステージング環境は後続の人（Bさんとします）が作ることになります。

そのときに安定志向のBさんは安定版のnpm(今ならver6.10)を使って３を環境構築したとしましょう

さてここで読者の皆さんに質問です。dockerでバージョン管理しているから３で動けば２でエラーは起きないのでしょうか。

答えはNoです。環境構築用のソフトのバージョンが異なると動作用のコマンドが変わっていたり、ソフト同士の互換性が切られていたりするからです。

そのためあとから運用保守するようにAさんが手順書をエクセルなどで作っていたとしても、手順通り行かなかったり、docker以外のソフト同士の互換性がなくなっていたりして、ステージング環境が本来の役割を果たすことができなくなってしまいます。

このようなことを防ぐべく、現場ではエクセルでまとめたりしてすべてのバージョンをだれがやっても同じように作れるようにしたあと作業が行われています。

あれ？CircleCIは使っていない？と思った方はご安心ください。

確かにエクセルですべての手順書を作ってはいますが、それはログインIDが含むコマンドなど作業する人によって変わってきてしまうコマンドが主です。

CircleCIには作業する人に依存しない部分の殆どのコマンドを任せています。

そのおかげで現場では環境構築でヒューマンエラーが起きることがなくなり、コードを調べ直す時間がなくなるため業務の効率化を行うことができるのです。

そして今回の例でAさんがCircleCIを使っていれば、２のコマンド集を作り終えたと同時に３も終わったことになります。

このように同じ環境を作る、ないしは製品のバージョン更新をするために以前使ったコマンドをもう一度呼び出す際に楽で、ミスの予防に一役買ってくれるのがCircleCIというものです。

#まとめ
CircleCIとは...
・コマンド記憶装置
・ほぼすべてのコマンドを使うことができます
・違う人が同じ環境を作成するのに適している
・ミスがなくなり、業務効率が上がる
・ローカル開発（リリースしない）なら正直必要ない。
ようなものです。

#余談
筆者は技術アピールのためにポートフォリオにCircleCIを入れようとしていました。

最終的には入れる前に今の会社に内定をいただけたため使わなかったのですが、今の自分が昔の自分を見て「CircleCIが使えます( ･´ｰ･｀)ﾄﾞﾔ」という顔で来たと考えたとき、なんでこんなかんたんなもの使えるだけでこんなイキってるんだろうと思ってたなと思います。

なので就活のアピール材料にしたいのであれば、CircleCIを使えることがすごいのではなく、CircleCIを使いたくなるポートフォリオ（ないしは製品）を作っているというのがすごいのだという認識を持たれると良いと思います。
[Node.js] Expressサーバーのタイムアウト時間を変更する

2023/01/06追記
この記事のやり方だとレスポンスが返らないので、その対策をした記事を書きました

https://qiita.com/YOS0602/items/87f8ac88f9a008029e2f

# デフォルト

Expressでは、リクエストのタイムアウトデフォルト値が**2分**に設定されています。

# タイムアウト時間を設定

以下のように、オプションとして`timeout`が用意されています。そちらの値をミリ秒で指定することで、タイムアウト時間を変更することができます。

```app.js
const express = require("express")
const app = express()
...
const appServer = app.listen(80, () => { })
appServer.timeout = 1000 * 60 * 5 // 5min
```

# 参考

※2022/5/19追記：見れなくなっちゃってますね
[Node.js サーバーのタイムアウトの時間を変更する](http://backham.me/blog/2019/10/24/node-js-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E6%99%82%E9%96%93%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/)
（備忘録）ディープ以外の機械学習でメモリが足りない時のincremental learningまとめ

# sklearn
公式回答。非線形モデルはMLPぐらいか？

https://scikit-learn.org/stable/modules/computing.html#strategies-to-scale-computationally-bigger-data

# xgb

stack overflowの回答。あまり使わないので正しいかはわからない

https://stackoverflow.com/questions/38079853/how-can-i-implement-incremental-training-for-xgboost

# lightgbm
githubの公式リポジトリのissueから

見た感じ「sklearnで言う`partial_fit`を再現する方法を見つけた」と自己解決しているっぽい

https://github.com/microsoft/LightGBM/issues/2718


Towards Data Scienceより

xgbでのやり方も乗っている

https://towardsdatascience.com/how-to-learn-from-bigdata-files-on-low-memory-incremental-learning-d377282d38ff
JavaScriptの関数学習に特化したサイト作りました【JavaScript関数ドリル】

## 詳細

詳細は以下の記事にまとめているので、詳しくはそちらもご覧になっていただけたらと思います^^

https://bit.ly/2VC7WLn

## 概要

以下のような悩みを持っている方に向けて、「JavaScript関数ドリル」という、JavaScriptの関数学習に特化したサイトを作りました^^

- 「JavaScriptの関数の仕組み頭では理解したけど、自分で作れない…」
- 「JavaScriptの関数の知識を定着させたいから、たくさんの関数の問題を解きたい！」


内容としては「JavaScriptの関数の課題をひたすら解く」という感じです。

現在は「初級編」だけを用意している状態で、今後は「中級編」「上級編」を随時追加していく予定です。

興味がある方は、最初の方に張ったリンク先のページで、サイトの全体像のイメージを動画でも解説しているので、そちらもご覧になっていただけたらと思います^^
バラ曲線のnとkを変えた場合のグラフを、タイル状に描画する

```python
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(30,30)) 
c=1
for k in range(1,6):
  for n in range(1,6):

    ax = fig.add_subplot(5,5,c) 
    ax.spines['right'].set_visible(False)
    ax.spines['top'].set_visible(False)
    ax.spines['bottom'].set_position('zero')
    ax.spines['left'].set_position('zero')
    ax.axis([-1,1,-1,1]) 

    th = np.arange(0, (2*np.pi)*k, 0.01)

    r = np.sin((n/k)*th)
    x = r * np.cos(th) # 極座標からの変換
    y = r * np.sin(th) # 極座標からの変換

    ax.plot(x, y) # 描画

    c+=1
```

実行結果
![lose.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649181/a5ed673a-dcdf-2526-dc81-cad2445d9dc0.png)
PythonとSeleniumでGoogle Chromeを動かしてみる

# PythonとSeleniumでGoogle　Chromeを動かしてみる

## サマリ

- [公式のチュートリアル](https://pypi.org/project/selenium/)を見つつMacでやってみました。
- 少し詰まった部分があったのでメモ。

## 試した環境

- OS: macOS Catalina 10.15.5
- Python:3.8.0
- Google Chrome:83.0.4103.116
- webdriver:ChromeDriver 83.0.4103.39

## インストール

### Pythonのライブラリをインストール

```zsh
pip install -U selenium
```

### ブラウザドライバーをインストール

ドライバーは使っているブラウザバージョンに合わせて必要なものをDLします。
ブラウザをアップデートしていてもドライバーの最新版をインストールすればいいわけではありませんでした。
（よく見たらバージョンが違ったのでご注意を）
わたしはプログラムを実行するディレクトリと同じ場所に置きました。

```zsh
vaivailx@MacBook-Pro-2 selenium_test % tree.
├── chromedriver
├── memo.md
└── sample.py

0 directories, 3 files
vaivailx@MacBook-Pro-2 selenium_test %
```

以下は同じMacでも人によって違うかも環境によるかも。ダウンロードしたものは実行できませんみたいな文言がでたらやってみてください。
ドライバーをDLして解凍したあと、「システム環境設定」の「セキュリティとプライバシー」を開いておく。
解凍したファイルを実行すると、「ダウンロードしたアプリケーションの実行許可」の項目に実行を許可するかどうか出てくるので許可する。

## サンプルプログラムを実行

[公式のチュートリアル](https://pypi.org/project/selenium/)にはdriverを置いている場所にパスを通せって書いています。

ただ、ドライバークラスのインスタンス生成時にドライバーを置いているパスを渡せばいけるようだったので、パス指定でやってみました。

```Python
from selenium import webdriver

browser = webdriver.Chrome(executable_path="./chromedriver")
browser.get('http://seleniumhq.org/')
```

動いた！

<img width="1203" alt="動作結果.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18485/dac55d67-29b8-562e-f770-d0013e9ca12f.png">


seleniumでブラウザ操作するとき、chromeだと「Chromeは自動テスト　ソフトウェアによって制御されています。」ってでるんですね。

知らなかった。
印象を表す語と10色の関係を表す行列を作る

```python
from google.colab import drive
drive.mount('/content/drive')

from PIL import Image
import numpy as np
import os
from scipy.spatial import distance

# filepathで指定した画像ファイルを読み込み、その画像のRGB値の平均をNumpyのArrayで【行ベクトルで】返す関数　ext_mean_rgb(filepath)
def ext_mean_rgb(filepath):
  image = np.array(Image.open(filepath).convert('RGB')).reshape(-1,3)
  return np.array([np.mean(image[:,0]),np.mean(image[:,1]),np.mean(image[:,2])])

# RGB値をnumpy array、qcolor=np.array([r,g,b])で与えられると[赤,橙,黄,緑,青,紫,ピンク,白,グレー,黒]の重みを成分とする10次元ベクトルが出力される関数gen_color_vec(qcolor)
def gen_color_vec(qcolor):
  colorvec=np.array([])
  palette=np.array(
      [
       [255,0,0], #赤
      [255,102,0],  #橙
      [255,255,0],  #黄
      [0,128,0],  #緑
      [0,0,255],  #青
      [128,0,128],  #紫
      [255,0,255],  #ピンク
      [255,255,255],  #白
      [128,128,128],  #グレー
      [0,0,0] #黒
      ])
  for col in palette:
    colorvec=np.append(colorvec,distance.euclidean(col,qcolor))
  colorvec=1-colorvec/np.linalg.norm(colorvec,np.inf)
  return colorvec

filepath='/content/drive/My Drive/Colab Notebooks/Lec02img/pp.jpeg'
x=gen_color_vec(ext_mean_rgb(filepath)).reshape(-1,1)

red=["暑い","強い","危険","闘争","怖い","派手","情熱的","明るい","元気","興奮"]
orange=["暖かい","明るい","元気","友情","青春","希望","可愛い","楽しい","夏","希望"]
yellow=["明るい","元気","喜び","幸福","輝き","未来","優しい","夢","友情","危険","注意"]
green=["自然","安らぎ","落ち着き","安心","平和","生鮮","夏","若さ","成長","健康"]
blue=["冷たい","冷静","悲しみ","涼しい","寒い","青春","広大","夏","誠実","平和","自由"]
purple=["高貴","高級","大人っぽい","嫉妬","不安","セクシー","神秘的","和風","悪趣味","孤独"]
pink=["可愛い","優しい","幸せ","恋愛","甘い","柔らかい","心","春","夢","明るい","わがまま"]
white=["純粋","清潔","神聖","清楚","無","天使","平和","自由","潔白","きれい","雪","うさぎ","天国"]
gray=["不安","曖昧","暗い","悩み","迷い","控えめ","疑惑","不正","孤独","寂しい","悲しい"]
black=["恐怖","孤独","闇","強さ","絶望","夜","静寂","高級感","シック","かっこいい","重い"]
imp_colors=[red,orange,yellow,green,blue,purple,pink,white,gray,black]
colors=red+orange+yellow+green+blue+purple+pink+white+gray+black
#重複なしの印象語
impression=set(colors)

imp=[]
for n in imp_colors:
  for i in impression:
    if i in n:
      imp.append(1)
    else:
      imp.append(0)

A=np.array(imp).reshape(10,88)

#印象を出力
color_impression=[]
y=np.dot(A.T,x)
for Y,c in zip(y,impression):
  color_impression.append([Y,c])
pic_imp=sorted(color_impression,key=lambda x: x[0],reverse=True)
for _ in pic_imp:
  print(_)
```
正規表現での置換時にマッチした値をそのまま使うには

正規表現でマッチした値をそのまま使用したい時には？

###例
1234,ABC -> ABC,1234 にしたいなど

###やり方
```
置換前(条件)：([1-9].+),([A-Z].+)
置換後：$2,$1
```

そのまま使いたい部分を() で囲んであげると「$」で使用できる
【Vue.js】Vue.jsについて

Vue.jsについて必要な知識をまとめました。
自身の備忘録として記載します。

#Vue.js
リアクティブプログラミングといいます。
『再度アクティブになる』ということで、データが更新されると自動的にデータを利用している画面表示も更新されます。

#Node.jsとnpm
本格的なWebアプリ開発になると、クライアント側だけでなくサーバ側の開発も合わせて行う必要があるためNode.jsを使用します。
Node.jsを利用するとサーバー側だけじゃなく、クライアント側もJavaScriptだけ作成できるようになります。
npmはパッケージ管理ツールで、Node.jsのプログラムに組み込まれている。

#Vue.jsでメッセージを表示

```
<head>
<script src="https://unpkg.com/vue"></script>
<head>

<div id="sample">
{{ message }}
</div>

<script>
var app = new Vue({
    el : '#app',
    data : {
         message: 'Hello Vue!'
    }
})
</script>
```
上記コードでは、Vue.jsを使用してHello Vue!と表示させています。

#参考書籍
Vue.js & Nuxt.js超入門
https://www.amazon.co.jp/dp/4798056596?tag=maftracking247988-22&linkCode=ure&creative=6339https://www.amazon.co.jp/dp/4798056596?tag=maftracking247988-22&linkCode=ure&creative=6339
IMのドキュメント内にある様々な関数をまとめてみる その１

#IM開発備忘録

##IMのドキュメント内にある様々な関数をまとめてみる その１

###関数ボックスの基本の演算子

Formaには関数ボックスなるものが存在し、その中にFormaがサポートする様々な関数が存在する。
それらを駆使することで、比較的簡単にクライアント処理などを作り出すことができる。
バグもほぼない（私は確認したことがない）ので安全かつ高速に使える

その内の演算子（+-*/など）を以下にまとめる

+ +(和)

```js:sample.js
{加算対象の値1} + {加算対象の値2}
```

+ -(差)

```js:sample.js
{減算対象の値1} - {減算対象の値2}
```

+ *(積)

```js:sample.js
{乗算対象の値1} * {乗算対象の値2}
```

+ /(商)

```js:sample.js
{除算対象の値1} / {除算対象の値2}
```

+ =(等しい)

```js:sample.js
if({対象の値} = “test”, “○”, “×”)
```

+ <>(等しくない)

```js:sample.js
if({対象の値} <> “test”, “○”, “×”)
```

+ >(より大きい)

```js:sample.js
if({対象の値} >= “10”, “○”, “×”)
```

+ >=(以上)

```js:sample.js
if({対象の値} > “10”, “○”, “×”)
```

+ <(より小さい)

```js:sample.js
if({対象の値} <= “10”, “○”, “×”)
```

+ <=(以下)

```js:sample.js
if({対象の値} < “10”, “○”, “×”)
```


###他の記事

IMのドキュメント内にある様々なAPIをまとめてみる その１
https://qiita.com/ChrisKasahara/items/c3187249112e7114aa12

IMのドキュメント内にある様々なAPIをまとめてみる その２
https://qiita.com/ChrisKasahara/items/ac038ce0b704574ada16

IMのドキュメント内にある様々なAPIをまとめてみる その３
https://qiita.com/ChrisKasahara/items/b2b5724af834b85d6269
aws tips

# Tips
調べたことを、自分用にメモ

## VPCから、他VPCへのアクセス
VPCエンドポイント ->　ルートテーブル　-> サービス
S3バケットの利用などは使用前提でいるべし

##ホスト名にアクセスをVPCへ
route53 -> alb -> サービス

##自動デプロイ
ECR -> codeCmmit -> codeBuild
・buildspecをつかって、aclにてzipファイルのアップロード

##Lambdaで共通関数を利用
Lambda Layer

##ログ検知メール
CloudWatch(サブスクリプション -> lambda -> SNS

##lambda 15分超える場合
ECR -> ECS
Webpacker::Manifest::MissingEntryError in Devise::Sessions#newというエラーが出た時の解決法

#開発環境
・Rails 6.0.3.1
・Ruby 2.6.6

#エラー時の状況

```
$ rails s
```

コマンドを実行して`localost3000`にアクセスすると、

```
【エラー内容】


Webpacker::Manifest::MissingEntryError in Devise::Sessions#new
Showing /Users/XXXX_XXXX/Desktop/XXX_XXX_XXX/app/views/layouts/application.html.erb where line #9 raised:

Webpacker can't find application in /Users/XXXX_XXXX/Desktop/XXX_XXX_XXX/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:

```
というエラーが出た。

該当部分は

```application.html.erb

<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```
と書いてある。

#解決方法

```
$ bundle exec rails webpacker:install
```
を実行したらエラーが解決できた。
IMのドキュメント内にある様々なAPIをまとめてみる その２

#IM開発備忘録

##IMのドキュメント内にある様々なAPIをまとめてみる その２

###Formaに隠されている様々な機能を呼び出すAPI

- 入力チェック実行

本来は「登録」の押下で発火するが、先んじてチェックを掛けられる。

```js:sample.js
inputCheck (inputCheck, temporaryFlag, formId, transitionOrderNo)
```

- エラー情報クリア関数


```js:sample.js
formaClearError()
```

- エラー情報表示


```js:sample.js
showErrorInfo(result)
```

- 項目エラー表示

スクリプトアイテムやアクション設定のカスタムスクリプトで
上記APIを使うとクライアントサイドスクリプトでエラー表示が可能となる

Formaの標準でない論理チェックに欠かせないAPI

```js:sample.js
formaItems.%画面アイテムID%.AcceptError(event)
```

- 項目エラー表示クリア

スクリプトアイテムやアクション設定のカスタムスクリプトで
上記APIを使うとクライアントサイドスクリプトでエラーの非表示が可能。

```js:sample.js
formaItems.%画面アイテムID%.ClearError(event)
```

- 印刷

そのまま。画面を印刷するAPI。
IMは大手の案件が多いため、まだまだ「紙ベースでほしい」という要件をいただくので
このAPIにはかなりお世話になった。

```js:sample.js
printPage()
```

- インジケータ表示

インジケータ表示を表示するAPI

```js:sample.js
formaIndicator(target, mode)
```

- アラートメッセージ表示

```js:sample.js
formaShowMessage(message, detailMessage)
```

- グリッドテーブル 列定義取得

```js:sample.js
formaItems.product_80_gridtable.getColInfo[tableId]
```

- グリッドテーブル 関数式実行

任意のタイミングで関数式を実行できる。便利。

```js:sample.js
formaItems.product_80_gridtable.doTableExpression(tableId)
```


###他の記事

IMのドキュメント内にある様々なAPIをまとめてみる その１
https://qiita.com/ChrisKasahara/items/c3187249112e7114aa12

IMのドキュメント内にある様々なAPIをまとめてみる その３
https://qiita.com/ChrisKasahara/items/b2b5724af834b85d6269
Ruby インスタンスメソッドについて

インスタンスメソッドについての曖昧な知識の補完として書きます。
間違いなどありましたら、コメントいただけますと幸いです。

# インスタンスメソッド
・クラス定義式内でメソッドを定義するとインスタンスメソッドになる。
（構文→定義式に修正しました）
・そのクラスのインスタンスに対して呼び出せる。

```ruby
class Car
# インスタンスメソッドを定義する（ここではnameメソッド）
  def name
    "yellow cab"
  end
end
# クラス名.newでインスタンスを作成して変数taxiに代入
taxi = Car.new
# インスタンスメソッドを呼び出す
taxi.name #=> "yellow cab"
```

# まとめ
・インスタンスメソッドはクラス内で定義する。
・インスタンスを作成してから、インスタンスメソッドを呼び出す。
・インスタンスメソッドは、「インスタンス.メソッド」で呼び出せる。

# 参考にしたリンクや書籍
・メソッドとクラスメソッドとインスタンスメソッドが曖昧だった
https://qiita.com/right1121/items/c74d350bab32113d4f3d
・【Ruby】クラスとかインスタンスについて改めて学習してみた
https://qiita.com/ksk_diffeasy/items/734b4961e9e6c7480d33
・「プロを目指す人のためのRuby入門」　伊藤淳一[著]
https://ruby-book.jnito.com/
爆速！ AWS EC2(Amazon Linux)環境でHTTPS環境を建てる方法 (Caddy)

# 注意
Caddy v2からconfigが変わっています。
もしEC2で導入したバージョンがv2である場合は、configが一部異なっています。

この記事の中だと、

proxy が reverse_proxy

websocket が

```
header_up Host {http.request.host}
header_up X-Real-IP {http.request.remote}
header_up X-Forwarded-For {http.request.remote}
header_up X-Forwarded-Port {http.request.port}
header_up X-Forwarded-Proto {http.request.scheme}
header_up Connection {http.request.header.Connection}
header_up Upgrade {http.request.header.Upgrade}
```

になっています。置き換えて読んでください。


# EC2でHTTPS化するの面倒
HTTPSは人権！
でもEC2環境だと。ロードバランサーやCDNをつけてやるのはお金がかかる！
かといって、Let’s Encryptのコマンド叩きたくない！　Nginxを触るのも面倒！
そういうことよくありませんか？

そんなお悩みCaddyなら解決します！

Caddyを使えば、Let’s Encryptの証明書をとってきて、自動でリダイレクトまでやってくれる！
HTTP/2対応！　Golangで書かれててなんかすごい気がする！
さああなたも試しましょう！

# 環境
マシン: EC2 t2.micro インスタンス

OS: Amazon Linux (Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-0a1c2ec61571737db)

# How to

ドメインの購入と、EC2のIP固定と、ドメインのAレコードをEC2のIPに向けるのは省略！
あともちろんセキュリティグループの設定で、ポート80と443はパブリックアクセスするのを忘れずに！

できた人は、SSHでEC2に入ります。

その後以下のコマンドを実行！

```
$ sudo amazon-linux-extras install epel

$ sudo yum install caddy

$ cd /etc/caddy/conf.d

$ sudo vim xxx.conf
```

以下の通りに編集！

```
example.jp {
  # 公開するディレクトリのパスを書くだけ
  root /var/www/public
}
```

```
$ sudo service caddy start

$ sudo service caddy status
```

なんとこれだけで対応したドメインでHTTPS化をして、HTTPからのリダイレクトもやってくれる...
つよい...

# リバースプロキシしたい！

Node.jsとかで書いたAPIをHTTPSで出したいけど、リバースプロキシは面倒！
そんなお悩みもCaddyで解決！
さきほどのxxx.confを以下の通りにするだけ！

```
example.jp {
  # proxy パス プロキシするアドレスとポート
  proxy / localhost:8080

  # socket.ioを使用する場合は、websocketを追記するだけ！
  proxy /socket.io localhost:8080 {
        websocket
  }
}

```

※conf書き換えたら、ちゃんとリスタートしよう

```
$ sudo service caddy restart
```

Nginxなら数行書かないと対応しないWebSocketも一行で対応！
これは便利！

# インスタンスが再起動しても動かしたい
このままだとインスタンスの再起動を行うと自動的に上がってこないので、その方法も紹介

```
$ sudo systemctl enable caddy

ちゃんと確認も...
$ systemctl is-enabled caddy
```


# まとめ
これなら、AWSの無料枠のEC2でも気軽にHTTPS化！
タノシイ！

※ プロダクション環境では、もう少しちゃんとした方がいいです
※ Caddyのドキュメントわかりずらいと思うの自分だけ？
※ Amazon Linuxの例がなかったので書いてみた
windowsでiverilog その43

#概要

windowsでiverilogやってみた。
float32やってみた。
加算やってみた。

#参考にしたページ

https://qiita.com/Soleiyu/items/5bbb991de443e61e318e

#テストベンチ

0.1 + 0.2
期待値　32'h3e99999a

```
module test();
	reg clk;
	wire [31:0] out;
	wire [31:0] a = 32'h3dcccccd;
	wire [31:0] b = 32'h3e4ccccd;
	float_add u(.clk(clk), .v1(a), .v2(b), .vres(out));
	initial
	begin
		clk = 0;
		forever #1
			clk = ~clk;
	end
	initial
	begin
		$monitor("%h %h %h", a, b, out);
	end
	initial
	begin
		#10
			$finish();
	end
endmodule
```


#実行結果


```

3dcccccd 3e4ccccd xxxxxxxx
3dcccccd 3e4ccccd Xxxxxxxx
3dcccccd 3e4ccccd 3e999999

```

以上。
windowsでiverilog その42

#概要

windowsでiverilogやってみた。
float32やってみた。
乗算やってみた。

#参考にしたページ

https://qiita.com/Soleiyu/items/5bbb991de443e61e318e

#テストベンチ
0.2 * 0.5
期待値　3dcccccd

```
module test();
	reg clk;
	wire [31:0] out;
	wire [31:0] a = 32'h3e4ccccd;
	wire [31:0] b = 32'h3f000000;
	float_mul u(.clk(clk), .v1(a), .v2(b), .vres(out));
	initial
	begin
		clk = 0;
		forever #1
			clk = ~clk;
	end
	initial
	begin
		$monitor("%h %h %h", a, b, out);
	end
	initial
	begin
		#10
			$finish();
	end
endmodule
```

#実行結果


```

3e4ccccd 3f000000 xxxxxxxx
3e4ccccd 3f000000 3dcccccd

```

以上。
まだまだ丸め誤差と闘わないといけない件について

Difficulty 24の問題でコケてしまった悲しみ。

[AtCoder Beginner Contest 165のB問題](https://atcoder.jp/contests/abc165/tasks/abc165_b)、問題名「1%」は、高橋くんが100円持っていて、銀行に預けると年利1%(複利)の利子がつくのですが、ある金額X円に達するには何年かかるか答えよ、という問題です。

自分で作った回答コードはこちら。

```PHP
<?php
fscanf(STDIN, "%d", $X);
// 預金額
$money = 100;
// 利子（％）
$risoku = 1;
// 答え
$ans = 0;
while($X > $money) {
    $money += intval($money * ($risoku / 100));
    $ans++;
}
printf("%d", $ans);
```

結果、不正解となったコードですが、どこが間違っているか分かりますでしょうか？

利子を変数にして1%じゃなくても答えが出せるんだぜ的にしてしまったのが悪かった。

正解になったのはこちら。

```PHP
<?php
fscanf(STDIN, "%d", $X);
// 預金額
$money = 100;
// 答え
$ans = 0;
while($X > $money) {
    $money += intdiv($money, 100);
    $ans++;
}
printf("%d", $ans);
```

変数とか使った私が愚かでした。単純に100で割って端数を切り捨てた整数を返してくれる `intdiv` を素直に使いました。

ちなみに、不正解となったテストケースは「99-after-contest-01.txt」という名前で、値Xは `974755271730884810` です。
具体的にいくらかというと、 `97京4755兆2717億3088万4810円` ということなので、 **ビル・ゲイツも真っ青なお金なので1年の誤差なんか気にすんな** という気分になりますが、不正解は不正解。
テストケース名から分かる通り、コンテスト後に作られたテストケースなので、コンテスト時はいわゆる `嘘解法`*(テストケース的にはOKだけどコードとしては実際には間違っている、の意）* で通した人も少なからずいるんでしょうね。

不正解のコードと正解のコードでは、3432年後から値に差が出始めます。（■がついているところは同値）
左が不正解のコードで、3431年後の金額、…66199円の1%は…661円なので、3432年後は …66199+…661=…860となるべきところ、…861となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/e687a84a-0d81-ef75-0848-a32eb7a3f758.png)

この影響で、差がどんどん広がり、不正解のコードでは `974755271730884810` に達するのは3757年後と算出するのに対し、正解のコードでは3758年後となるので、不正解となるのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/7c59f1b8-b578-6f1b-6d8c-f1822865b93f.png)

いやぁ、不正解のコード、そんなに悪いコードですかねぇ🤒、という気分になってしまいますが、いまだに浮動小数点を含む演算には気をつけなければいけないケースがあるんだなぁ、ということは留意しておいた方が良いんですね、というお話でした。
Git 使い方 git push origin masterまで

#Gitでのpushまでの道のり

gitの学習メモ
pushまでの手順。

githubのアカウントは持っている前提。

##1、リポジトリの作成

###・リモートリポジトリ
・GitHubにログイン
・画面右上＋ボタンを押す。
・New repositoryを選択
・リポジトリ名を付ける
・Create Repositoryを押す

###・ローカルリポジトリ

・ローカルのソースコードのあるディレクトリに移動
・git init でローカルリポジトリ作成

#リモートリポジトリの指定

・git remote add origin https ~ .git
・https ~ .git は　GitHubの作ったリポジトリのCodeのページのHTTPSのボタン押したところのやつ

#add、commit、push

ソースコードの変更をローカルリポジトリに追加し、リモートリポジトリにローカルリポジトリを反映する。

・git add . ( . は全部のファイルって意味)
・git commit -m "何を変更したかとかのメッセージ"

・git push origin master
  これでリモートリポジトリへの反映