OmniAICreator/Qiita-1.07M huggingface dataset:
桁落ち、丸め誤差、情報落ち、打ち切り誤差

平成31年春期 午前問題2

2019h31h_ap_am_qs.pdf　問2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/faf63165-92d0-ea3e-b708-db676ffed589.png)

１、桁落ち
桁落ち(けたおち)は、計算誤差のひとつで、絶対値の差が非常に小さい2つの値の差を求めたときに、仮数部の大半が打ち消しあい、計算結果の有効桁数が少なくなることによって生じる誤差です。
例：
■ けた落ち
数値を10進数で表現し・仮数部の最大桁数が３桁（0.は含まない）とすると、
0.123 – 0.122 = 0.001 ← 有効桁が３桁から１桁になり…
0.001 => 0.100 * 10^(-2) ← 正規化されます

なぜ、0.001は、有効桁が１桁になってしまうのは、理解しにくいですね。



２、丸め誤差
定された有効桁数で演算結果を表すために，切捨て，切上げ，四捨五入などで下位の桁を削除することによって発生する誤差

３、情報落ち
絶対値の非常に大きな数値と小さな数値の加算や減算を行ったとき，小さい数値が計算結果に反映されないことによって発生する誤差

４、打ち切り誤差
無限級数で表される数値の計算処理を有限項で打ち切ったことによって発生する誤差

例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b731605d-21b2-c8f8-a587-801022c78970.png)


参考：
桁落ち
https://technologicaladvance.blog.fc2.com/blog-entry-45.html
https://www.souya.biz/blog/2017/03/31/%E3%81%91%E3%81%9F%E8%90%BD%E3%81%A1%E3%83%BB%E6%83%85%E5%A0%B1%E8%90%BD%E3%81%A1%E3%81%A8%E3%81%AF/

有効数字と有効桁
https://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=%B7%E5%CD%EE%A4%C1%A4%CB%A4%C4%A4%A4%A4%C6
Macとラズパイ間でファイル転送したいのでラズパイをファイルサーバー化する

Raspberry Pi 3B(以下:ラズパイ)で開発をしていると、ホストPCからファイルをサクッと転送したくなります。
本記事では、ラズパイ側にファイルサーバー建ててMacからアクセスできるようにしてみます。

先人たちのやり方に則って`samba`の環境構築を進めます

```shell
# sambaインストール
$ sudo apt-get install samba samba-common-bin

# 共有したいフォルダ作成
$ sudo mkdir /var/samba

# ユーザーを追加
$ sudo useradd smbuser

# ユーザーログインするためのパスワード設定
$ sudo passwd smbuser

# ユーザー権限を変更
$ sudo chown smbuser:smbuser /var/samba/

# ユーザーをデータベースに追加
# -aオプションはユーザーの追加と同時にパスワード同期を直ちに行ないたい場合に使用する
$ sudo pdbedit -a smbuser
```




## Samba設定ファイルの更新 

```shell
# バックアップ
$ sudo cp -p /etc/samba/smb.conf /etc/samba/smb.conf.backup
# 設定ファイルの修正
$ sudo vim /etc/samba/smb.conf
```

ファイルの末尾に以下を追記します

```smb.conf
[raspberryPi]
    comment = RasPi FileServer
    path = /var/samba
    writable = yes
    browsable = yes
    valid users = smbuser
    force user = smbuser
```

項目 | 内容 
--- | --- 
comment  | 説明 
path  | 共有するディレクトリ 
read only  | ReadOnlyフラグ 
browsable  | ネットワークに表示するフラグ 
valid users | アクセス可能なユーザー(,区切り)
force user | アクセスしたら強制的にこのユーザーになる 

sambaを再起動して準備は完了です。

```
$ sudo /etc/init.d/samba restart
```

## sambaにMacからアクセス

`Finder > 移動 > サーバ接続..`からラズパイの`smb://IPアドレス`と入力して接続します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/e903420a-c468-f27c-6ce7-f378a176b193.png" width=450 />


先程設定したユーザー/パスワードでログインします。


無事にMacからラズパイにアクセスでき、ファイルのやり取りが楽になりました。

## 環境

- Raspberry Pi 3B
- Raspbian GNU/Linux 9.8 (stretch)
- Samba Version 4.5.16-Debian



## 参考

- http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/pdbedit.8.html
- https://qiita.com/suppy193/items/9f84cfb17c61b8a3be36
- https://tmegane.hatenablog.com/entry/2018/10/21/164752
- https://www.atmarkit.co.jp/flinux/rensai/linuxtips/184sambaspuser.html
ElmerをUbuntu18.04にインストール


# Elmerとは

有限要素法（FEM）をベースにしたオープンソースのシミュレーションソフトで、流体力学、構造力学、電磁気学、熱伝達、音響などを単独または連成で解くことができる優れたソフトです。


Windows向けにはバイナリが準備されていますが、Linux向けにはLaunchPadからインストールする方法とソースからインストールする方法の2つが準備されています。

今回はソースからインストールする方法について、公式の手順を基に紹介します。
なお、詳細なインストール方法は公式サイトよりもgithubのリポジトリの方に載っていますので、参照してください。

>Elmer公式サイト：[Elmer](https://www.csc.fi/fi/web/elmer/elmer)
>github：[ElmerCSC/elmerfem](https://github.com/ElmerCSC/elmerfem)

# 必要なライブラリの導入
まずは依存関係のあるライブラリ類をインストールします。

```bash
$ sudo apt install git cmake build-essential gfortran libopenmpi-dev libblas-dev liblapack-dev
```

### 【補足】ElmerGUIを使う場合
Elmerはテキストベースで解析の設定を行いますが、ElmerGUIと呼ばれるGUIも存在しており、設定だけでなく計算の実行や残差の確認なども簡単に行う事ができます。

慣れないうちはGUIで操作したいので、ElmerGUIに必要なライブラリも導入しておきます。

```bash
$ sudo apt install libqt4-dev libqwt-dev
```



# Elmerのダウンロード

まずはhome/にインストール用のディレクトリを作成します。

```bash
$ mkdir elmer
$ cd elmer    
$ mkdir build       
```

次に、ソースコードをgithubからダウンロードします。`~/elmer/`で、

```bash:~/elmer/
$ git clone git://www.github.com/ElmerCSC/elmerfem
```

と実行することで、`elmerfem`と名前のついたディレクトリが生成されます。

`git clone`が上手くいかない場合は、[リポジトリ](https://github.com/ElmerCSC/elmerfem)からzipファイル（elmerfem-devel.zip）をダウンロードして、`~/elmer/`の直下に`elmerfem`と名前を変更して展開して下さい。


現時点のディレクトリ構成はこんな感じ↓

```
~/elmer/
┣ build/    （空）
┗ elmerfem/ 
    ┣ ElmerGUI/
    ┣ ElmerGUIlogger/
    ：
```

# Elmerの構築
必要な準備が済んだら、Elmerを構築していきます。
まずはcmakeを使ってmakefileを生成します。

```bash
$ cd ~/elmer/build
$ cmake -DWITH_ELMERGUI:Bool=TRUE -DWITH_OpenMP:Bool=TRUE -DWITH_MPI:BOOL=TRUE -DCMAKE_INSTALL_PREFIX=../install ../elmerfem
```

オプションでElmerGUI、OpenMP、MPIをTRUEとすることで使用することができるようになります。インストール先は`~/elmer/install/`になります。

エラーが生成されない場合、コンパイルしてインストールを行います。

```bash
$ make
$ make install 
```

インストールが上手くいったかのテストを行う事ができます。

```bash
$ ctest
```


# 起動テスト
インストールされたElmerGUIを起動してみます。

```bash
$ export PATH=$HOME/elmer/install/bin:$PATH
$ ElmerGUI 
```
以下のようなGUIが立ち上がれば成功です。お疲れさまでした。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439095/11c779cb-3673-b6bc-b1e7-7d518b8e0825.png)

いくつかチュートリアルが用意されているので、また別記事で紹介していきたいと思います。
ESXi のホスト情報をバックアップしたりリストアしたりする

# 概要
仮想マシンのバックアップではなく、ESXi 本体のバックアップについて記載する。
なお、本手順の実施には [VMware-vSphere-CLI](https://my.vmware.com/jp/web/vmware/details?downloadGroup=VCLI600&productId=491) がクライアントに必要。

# 手順
[VMware-vSphere-CLI](https://my.vmware.com/jp/web/vmware/details?downloadGroup=VCLI600&productId=491) が必要。

Windows 版と Linux 版のパッケージが存在するが、バンドルされている Perl のライブラリもしくはインタプリタが違うだけで、Perl で作られたコマンドがいっぱい入っているだけなので、作り自体に違いはない。

Windows 版を使う場合は UAE が邪魔をするので、パッケージインストーラでインストールした後に、同時にインストールされる ActivePerl と CPAN ライブラリにパスを通す時に、管理者で実行を付与しておくとよい。

## インストール
パッケージのセットアップだけで問題ない。
Windows(6.0.0 64bit版の場合)はインストーラーを実行してインストールするのみ。

```cmd
./VMware-vSphere-CLI-6.0.0-3561779.exe
```

Linux版(6.0.0 64bit版の場合)は適当なディレクトリにパッケージを展開し、`vmware-install.pl` を実行して画面に表示されるライセンスに同意してインストール先を指定するだけ。

```
cd /opt
tar zxf VMware-vSphere-CLI-6.0.0-3561779.x86_64.tar.gz
cd vmware-vsphere-cli-distrib
./vmware-install.pl
```

## バックアップ
下記の環境でバックアップ/リストアをする場合を例として。
なお、バックアップ時は仮想マシンを停止する必要はない。

- ESXi:192.168.0.100
- バックアップ先:192.168.0.200

Windows の場合は、VMware vSphere CLI をスタートメニューから選択して、コマンドプロンプトを起動して下記を実行する。  

```
vicfg-cfgbackup.pl --server 192.168.0.100 --username root --password (パスワード) -s c:\temp\(バックアップファイル名).bak
```

Linux の場合は、ターミナル上で下記を実行する。  

```
vicfg-cfgbackup --server 192.168.0.100 --username root --password (パスワード) -s /opt/(バックアップファイル名).bak
```
※`--password` は未指定だと対話式で入力を求められる

## リストア
前項で取得したバックアップをリストアする例。
なお、リストアは仮想マシンを全て停止する必要がある。  
Windows の場合は、VMware vSphere CLI をスタートメニューから選択して、コマンドプロンプトを起動して下記を実行する。

```
vicfg-cfgbackup.pl --server 192.168.0.100 --username root --password (パスワード) -f -l c:\temp\(バックアップファイル名).bak
```

Linuxの場合は、ターミナル上で下記を実行する。

```
vicfg-cfgbackup --server 192.168.0.100 --username root --password (パスワード) -f -l /opt/(バックアップファイル名).bak
```

※`--password` は未指定だと対話式で入力を求められる
Flexboxで子要素の幅を指定する

#プログラミングの勉強日記
2020年8月4日　Progate Lv.226
Flexboxで`width`が効かなかったので原因を調べて解決した。（メモ）
`flex-shrink`を0にすることで`width`の指定をすることもできるみたいだが、今回は`width`を使うのをやめて`flex-basic`を使った。

#直面した問題
　Flexboxで指定すると、画面幅によって子要素が伸びてしまい、綺麗に見れなくなってしまった。
<img width="571" alt="0804.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/d022c726-b336-7dc7-94a5-b5c42da53823.png">
　下の画像のように子要素の幅を指定することで、画面幅によって子要素が伸びないようにしたい。
<img width="571" alt="0804-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/0d041464-4fb7-6c6d-cde0-ac156e3a3533.png">

#解決方法
　`flex-basis`を使う。子要素に対して`width`と同じように%やpxで幅の値を指定することができる。初期値は`auto`になっていて、`auto`と指定した場合は子要素のコンテンツのサイズが適応される。

```html:html
<div class="parent">
  <div class="children">
    <!--省略-->
  </div>
</div>
```

```css:css
.parent{
  display:flex;
}

.children{
  flex-basis: 500px;
}
```
スクリプトで頂点番号をビューポートに表示させる（3dsMAX）

今回はmaxscriptです。
別のツールを作ってるときに
3dsMAXで頂点番号調べるにはどうしたらいいんだ・・・・？
と思ってぐぐって見た結果見つけたのが尊敬する大翔士さんのこのツイート。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Mayaで頂点番号を表示できるのを知って、Maxでもスクリプトなら出来るのかなーって思ったら出来た。<br>文字ならなんでも好きな場所に表示できるし、他に使い道がありそう。<a href="https://twitter.com/hashtag/maxscript?src=hash&amp;ref_src=twsrc%5Etfw">#maxscript</a> <a href="http://t.co/dO2d030M5J">pic.twitter.com/dO2d030M5J</a></p>&mdash; 大翔士 (@d658t) <a href="https://twitter.com/d658t/status/601292631059075072?ref_src=twsrc%5Etfw">May 21, 2015</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

どうも、標準機能ではかんたんに見られる術はなさそう。
上記ツイートのツリーに大翔士さんが作ったサンプルのURLが記載されていたのですが、なにせ5年前のツイート。
ファイルはなくなっていました。

#こうなったら自分で書くしかない！
ということで頑張って書いてみました。

```displayVertexNumber.ms
o=$selection as array --選択オブジェクトを配列oに代入--

unregisterRedrawViewsCallback GW_displayVertexNumber --コールバック関数を解除--
fn GW_displayVertexNumber =
(
    for i = 1 to o.count do --選択オブジェクトの数だけ繰り返し
    (
        theMesh = snapshotAsMesh o[i]  --配列oのi番目にあるデータをメッシュに変換して「theMesh」としてメモリに乗せる--
        theVertCount = theMesh.numverts  --「theMesh」の頂点数をカウント--

        for v = 1 to theVertCount do  --「v」の1番目から、カウントした頂点数分繰り返し--
        (
            gw.setTransform (matrix3 1)  --3次元空間を2次元空間に変換--
            thePos = (getVert theMesh v)  --v番目の頂点の座標を「thePos」に代入--
            gw.text thePos (v as string) color:yellow  --V番目の頂点の位置に、頂点番号を黄色で表示--
        )
    )
    gw.enlargeUpdateRect #whole  --描画領域の拡張--
)
registerRedrawViewsCallback GW_displayVertexNumber --コールバック関数を登録--
```
中身としては下記のmaxscriptヘルプのサンプルの改変です。
http://help.autodesk.com/view/3DSMAX/2016/JPN/?guid=__files_GUID_1B088FF0_6A36_420E_9F37_F0DBE9FB2676_htm
http://help.autodesk.com/view/3DSMAX/2016/JPN/?guid=__files_GUID_853014AC_9DC8_4F5C_B14B_3643E5925AD8_htm
※こちらも大翔士さんのツイートで紹介されています。

そもそものMaxscriptによるビューポート再描画メソッドが「gw.~」の部分で、これを利用するために、
```
registerRedrawViewsCallback <fn>
unRegisterRedrawViewsCallback <fn>
```
で関数を登録（または解除）しないといけないようです。
重複を避けるために、最初にunregisterして、最後にregisteで登録します。

全体としては関数を登録しているだけなので、頂点番号の表示を消したいときは
```
unregisterRedrawViewsCallback GW_displayVertexNumber --コールバック関数を解除--
```
で関数の登録を解除してあげればOKです。
Visualforceページのベストプラクティス

# Visualforce
- 小文字のみ使用する（alt属性など値が文字列の場合は除く）
- それぞれのブロック/リスト/テーブル要素ごとに新しい行にし、子要素にはインデントをつける
- 属性値にはダブルクオテーション（””）を使用する
- IDやクラス名別々の単語はハイフンで繋ぐ（例：#nav-header）
- 埋め込みリソースからプロトコル表記（http:,https:）を省略する
- マルチメディアの要素には、意味のある代替テキストをalt属性として提供する
- すべてのVFページには、\<apex:page title="Purpose of the page">のように「title」属性を指定する
- すべてのインタラクティブVFページには、ページエラーを表示するための \<apex:pageMessages/> セクションを設ける
<br>
<br>
- すべてのインタラクティブVFページには、セッションヘッダ\<apex:sectionHeader title="" subtitle=""/>を設ける
- 可能な限り、JavaScriptコードは静的リソースに格納する
- Salesforce.com標準またはSLDSでスタイル設定が使用できない場合は、カスタムCSSを追加して参照用に適切にコメントする必要がある
- URL QueryString引数を使用する場合は、引数に対しnullチェック処理する
- VFページにデータを表示する場合は、XSS攻撃を回避するためにELステートメント（{! expression }）を直接出力するのではなく、必ずELステートメントをVFタグで囲む（例： \<apex:outputText value=”{!EL}”/>）
- VFページのパフォーマンスの最適化（例：遅延読み込み、transient変数)
【Vue.js】オブジェクト、オプション、プロパティ、プロパティ名の違い

##【Vue.js】オブジェクト、オプション、プロパティ、プロパティ名の違い

呼び名で迷うことがあるのでメモ。

＜条件＞
・変数appに生成したVueインスタンスを格納。
・入れ子構造のデータが存在。

```js:.js
var app = new Vue({
    el: "#app",
    data:{
        user:{
            age:27,
            lastName:'Toroki',
            firstName:'Takashi'
        },
        product:{
            serise: 'iphone10',
            price: 110000
        }
    },
    methods:{
        onClick:function(){
            alert('Clicked!')
        }
    }
})
```

##オブジェクト
一つの塊。（複数の）プロパティから成る。
`app`がオブジェクト。

##オプション
正式名称はコンポーネントオプション。用途毎にオプションを指定する。

オプションの中身は（複数の）プロパティになっているため、各オプションのデータをオプションオブジェクトと呼ぶ。

###▼主なオプション
| オプション | 内容 |
|:-:|:-:|
| el  | テンプレートと紐付けるid名を記述。.html(DOM)にVueインスタンスを与える  |
| data  | データオブジェクト  |
| filters  | 書式の設定  |
| methods  | イベント発生時の処理 |


・コンポーネントオプション公式ページ
https://012-jp.vuejs.org/api/options.html


##プロパティ
`プロパティ名:値`のセットの呼び名。
入れ子構造をとる。

el: "#app"
data:{ }
user:{ }
age:27
LastName: 'Todoroki'
method:{ }


▼入れ子の例（プロパティ３つ）
dataプロパティの中の、userプロパティの中の、ageプロパティのプロパティ名がage, 値が27。

```js:.js
data:{
        user:{
            age:27,
        }
    }
```
UIT INSIDE(Podcast)のVue 3 Study回をまとめます

2020年7月18日にVue 3.0がRC（Release Candidate）ステージに入りましたので
そろそろVue 3 キャッチアップしたい皆さんが多いと思います。

ということで、
LINE UIT室の開発者による「最新のフロントエンド」をキャッチアップできる
Podcast「[UIT INSIDE](https://uit-inside.linecorp.com/)」の Vue 3 Studyの回のみURLをまとめます。

|  更新日 | タイトル | URL |
| --- | --- | --- |
|  2020/02/07 | ep.32 Vue 3 Study <br>「RFC を全部読んで理解する Vue 3.0 の進化」 | https://uit-inside.linecorp.com/episode/32 |
|  2020/02/21 | ep.34 Vue 3 Study <br>「バンドルサイズを減らすTree Shakingとその方法」 | https://uit-inside.linecorp.com/episode/34 |
|  2020/03/26 | ep.36 Vue 3 Study  <br>「何が変わる？ Composition API」 | https://uit-inside.linecorp.com/episode/36 |
|  2020/04/17 | ep.39 Vue 3 Study  <br>「Render function で React の世界を覗いてみる」 | https://uit-inside.linecorp.com/episode/39 |
|  2020/06/26 | ep.51 Vue 3 Study <br>「Teleport でキレイに解消するモーダルの z-index 問題」 | https://uit-inside.linecorp.com/episode/51 |
|  2020/07/10 | ep.53 Vue 3 Study <br>「Vue.js にもやってくる Fragment」 | https://uit-inside.linecorp.com/episode/53 |

音声を1.5倍にすると、サクサク聴けてオススメです！

UITはイベントも開催してるみたいです。
https://uit.connpass.com/

# Vue 3 参考リンク

v3のドキュメントと移行ガイドはまだベータ版です。

- RCアナウンスメント
    - https://github.com/vuejs/rfcs/issues/189
- v3ドキュメント
    - https://v3.vuejs.org/
- 移行ガイド
    - https://v3.vuejs.org/guide/migration/introduction.html#where-should-i-start-in-a-migration
- 公式ライブラリのステータス
    - https://github.com/vuejs/vue-next#status-of-the-rest-of-the-framework
rails routes.rbのmemberとcollectionの違い

## routes.rbのmemberとcollectionの違い
railsのroutes.rbでルーティングを設定する時にmemberとcollectionの違いに関して記載します。

## menberの場合
```routes.rb
resources :buy_additional_actions, only: %i[] do
   member do
      get 'index' => 'buy_additional_actions#index'
```

menberの場合は生成されたurlに:idが自動で追加されます。

```
buy_additional_action GET　/buy_additional_actions/:id/index(.:format)　buy_additional_actions#index
```

## collectionの場合
```routes.rb
resources :buy_additional_actions, only: %i[] do
   collection do
      get 'index' => 'buy_additional_actions#index'
```

collectionの場合はurlには:idが付与されません。

```
buy_additional_actions GET　/buy_additional_actions/index(.:format)　buy_additional_actions#index
```
[自分用メモ]オブジェクト指向を軽く勉強してみた

## 自己紹介
Javaを勉強したての社会人一年目です。
Javaのオブジェクト指向を理解するため、このような記事を書きました(メモする感じで笑笑)。
Javaに関するアドバイス等募集中です。

##オブジェクト指向とは
さっそく、本題に入っていきましょう。
そもそもオブジェクト指向ってなんやねんっ最初感じますよね！？(自分もそうやったので...)

オブジェクト指向は、プログラミングを行う上での数多くある考え方の一つみたいです笑笑
オブジェクト指向によって、以下の3つを実現しているそうです。
　　1. プログラムの「**独立性**」
　　2. プログラムの「**再利用性**」
　　3. プログラムの「**拡張性**」

## 「独立性」を実現するには
オブジェクト指向で「独立性」を実現する考え方として、「**カプセル化**」というのがあるみたい。

### カプセル化
調べたところ、データ(属性)とメソッド(手続き)を1つのオブジェクトにまとめて、その内容を隠蔽する考え方だそうです....
簡単に言っちゃうと(言っちゃていいのか分からないが笑笑)、外からプログラムの処理が見えないようにする考え方かな。

## 「再利用性」を実現するには
オブジェクト指向で「再利用性」を実現する考え方として、「**メソッド**」と「**継承**」というのがあるみたい。

### メソッド
プログラムの一連の処理をまとめたもの。「手続き」とも言われているみたいです。

### 継承
あるクラスの変数やメソッドを別のクラスで使用できるようにする考え方...

## 「拡張性」を実現するには
オブジェクト指向で「拡張性」を実現する考え方として、「**抽象化**」というのがあるみたい。

### 抽象化
複数クラスの共通部分を抜き出して、他は無視する考え方みたいです...
Node.jsでtmpに一時ディレクトリを作るにはfs.mkdtempSyncを使う

Node.jsで/tmpに一時的なディレクトリを作るには、[fs.mkdtempSync]を使います。

[fs.mkdtempSync]: https://nodejs.org/api/fs.html#fs_fs_mkdtempsync_prefix_options

```javascript
const fs = require('fs')

const dir = fs.mkdtempSync('/tmp/foo')

console.log(dir)
//=> "/tmp/foo4xeXpJ"
```
Laravel6.x ページネーションで検索条件を引き継ぐ

一から作るプロジェクトだとつい忘れてしまうのでメモ。
検索条件のパラメータを引き継ぎつつ、ページネーションを使いたい時に活用してください。

# ページネーション（通常）

```
{{ $users->links() }}
```

`links()` ... ページネーションHTML生成

2ページへ遷移した時のURL
`http://localhost/user?&page=2`


# ページネーション（パラメータ保持版）

```
{{ $users->appends(request()->all())->links() }}
```
`appends()` ... 引数に指定したパラメータを追加
`request()->all()` ... リクエストの全パラメータを配列で取得

2ページへ遷移した時のURL
`http://localhost/user?gender=1&page=2`
【Android/Kotlin】世界測地系を日本測地系に変換する

# 世界測地系と日本測地系
測地系とは緯度経度を表すときの基準になるものです。
（詳しくはググってください）
普段GoogleMap等で目にするのは世界測地系ですが、まれに日本測地系を使用する場合があります。
今回その例に遭遇したので、変換方法をメモしておこうと思います。

# ライブラリのインストール
使用するライブラリ→ [Proj4J](https://search.maven.org/artifact/org.osgeo/proj4j/0.1.0/jar)

```
// 測地系変換を実現するPROJライブラリ
implementation 'org.osgeo:proj4j:0.1.0'
```

# 測地系の変換
最後の`convertPoint`に変換後の緯度経度が入っています。

```
val crsFactory = CRSFactory()
// wgs84(世界測地系)
val wgs84 = crsFactory.createFromParameters(
            null,
            "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
// 日本測地系
val tokyo = crsFactory.createFromParameters(
            null,
            "+proj=longlat +ellps=bessel +towgs84=-146.336,506.832,680.254,0,0,0,0 +no_defs")
val transformFactory = CoordinateTransformFactory()
val transform: CoordinateTransform = transformFactory.createTransform(wgs84, tokyo)
// 変換したい緯度経度
val targetPoint = ProjCoordinate(lng, lat)
var convertPoint = ProjCoordinate()
convertPoint = transform.transform(targetPoint, convertPoint)
```
RPAはなぜ、プログラミング未経験者におすすめなのか？

こんにちはPeaceful morning社でインターンをしている高橋です！

RPAは、IT未経験者の人でも扱いやすく、事務職出身の方でも始めやすいものとしてよくおすすめされています。
**今回は何故RPAがIT未経験者の方にも勧められているのかについて**紹介できたらと思っています。

さらに詳しく、本格的にRPAエンジニアの魅力を知りたい方はこちらをご覧ください
**事務職から転職したRPAエンジニアが語る仕事の2つの魅力↓**
https://rpahack.com/attraction-of-rpa

##RPAはイメージがしやすい
「RPA」と聞いて一見プログラミングのような感じがして、難しいのではないかと思われる方も多くいるかと思います。しかし、実際はそんなことありません。

RPAを何の知識も持たないデスクワーク作業を代理でやってくれるもう一人の自分だと考えてみてください。その人に同じ作業をやってもらうには自分の作業工程を一つずつ教える必要がありますよね。RPAを扱う時はそのような感覚で、フローを作成することができます。

またRPAのフローを作成する際、一部のRPAツールでは**一つ一つの動作がカードのような形**になっていて、それをドラッグアンドドロップで並べることで完成できるものもあります！
実際の様子をご覧になりたい方はこちらをご覧ください。↓

**UiPathの新製品StudioXとは？ 特徴～勉強方法まで解説！**
https://rpahack.com/uipath-studiox

また変数を使う際もプログラミングでは英語が主流ですが、**RPAでは日本語を使うことができる**ので、その点でもプログラミング未経験者の方でも馴染みやすいかもしれません。

**たしかに、フローを作成する際、プログラミングの基礎知識が必要な場面も多く出てきます。ただプログラミングをゼロから学習するよりかはRPAを勉強した方が容易であると私は考えます。**

##今後、RPAエンジニアへの需要が高まる
RPAは日本ではまだそれほど万人が知っているほど浸透しておらず、まだ日本のRPAデベロッパーが多くないため穴場だと考えられます。

ただ今後、RPAに対する需要はますます日本でも高まっていくと思われるので、**RPAエンジニアに対する需要も同じように高まっていく**と考えられます。なので、ぜひ今の仕事に満足していないという方がいらっしゃいましたら、RPAを勉強してRPAエンジニアの道を目指してみるのもよいかもしれません。


##まとめ
RPAはIT未経験者が使うと未経験らしい所が見え、エンジニアが使うとエンジニアらしさが出てくると思います。

未経験とエンジニアでは設計の組み方が違うのでそれぞれのらしさが出てきて新たな発見ができて、よりRPAが面白く感じるのではないでしょうか。

まずは、未経験者の方も一度、無料で使えるツールもございますので、触ってみてください！


###記事を読んで、実際にRPAを動かしてみたい人に向けて
**UiPath StudioXでCSV/Word/Outlookメールを自動化！**
https://rpahack.com/uipath_studiox_4

**【UiPath StudioXの使い方】Excelを自動化！**
https://rpahack.com/uipath_studiox_3

**UiPath StudioXでUI操作を自動化！～入金システムインプット例①**
https://rpahack.com/uipath_studiox_2

**UiPath StudioXの基本をマスター！～画面構成/カード/アクション**
https://rpahack.com/uipath_studiox_1
Windows で git bash + tmux な環境づくり

# git bash を手に入れましょう

[Git for Windows](https://gitforwindows.org/)

# tmuxをインストールできるようにしましょう

下記のページにあるとおりに、まず`pacman`をインストールします。
その後、`tmux`をインストールします。

[Git for Windows で pacman を使う](https://yujiorama.hatenablog.com/entry/2019/07/22/095214)

```bash

git clone --depth=1 https://github.com/git-for-windows/git-sdk-64 gfw-sdk

cp gfw-sdk/usr/bin/pacman* /usr/bin/
cp -a gfw-sdk/etc/pacman.* /etc/
mkdir -p /var/lib/
cp -a gfw-sdk/var/lib/pacman /var/lib/
cp -a gfw-sdk/usr/share/makepkg/util* /usr/share/makepkg/

pacman --database --check

curl -L https://raw.githubusercontent.com/git-for-windows/build-extra/master/git-for-windows-keyring/git-for-windows.gpg \
| pacman-key --add - \
&& pacman-key --lsign-key 1A9F3986

pacman -S tmux
```

以上です。
自宅のPCをWake On LANで起こそう

# 自宅のPCを Wake On LAN で起こそう

自宅に以下の仕様の自作PCを置いています。

* CPU: AMD Ryzen 9 3950X
* GPU: NVIDIA GeForce RTX2080 SUPER
* RAM: 32.0GB (G.Skill Trident Z Neo F4-3600C16D-32GTZNC (DDR4-3600 16GB×2))
* SSD: 2.0TB  (addlink SSD 2TB S90シリーズ M.2 2280 PCIe Gen 4.0×4 NVMe)
* MOTHER: ASUS AMD AM4対応 マザーボード ROG STRIX X570-E GAMING 
* COOLER: Corsair iCUE H150i RGB PRO XT 簡易水冷CPUクーラー 360mm
* POWER: Thermaltake TOUGHPOWER DIGITAL iRGB PLUS 1000W -GOLD- PC電源ユニット

自宅を離れたときに、この贅沢で潤沢な計算力を持つPCを寝かせておくのは、とてももったいないです。
宅外から自宅内にVPNを張れるようにはしていますが、このPCを常時起動させておくのは電気代がもったいないです。
この"もったいない"x2の状況を乗り越えるために、Wake On LANを活用します。

具体的には、自宅で常時起動しているラズパイに、宅外からVPNを通ってログインします。
宅外から自宅のラズパイにVPN接続する方法については、こちらをご覧ください。

* [自宅の外から自宅のラズパイにVPN(WireGuard)でアクセスしよう][]

そのラズパイからWake On LANで自宅のデスクトップPCを起こしてあげます。

# Wake On LAN のお勉強

まずは、Wake On LAN とは何かから理解するために、以下を読みます。

[Tech TIPS： Wake On LANでコンピュータを起動する][]

とても分かりやすいですし、どのようなパケットを送信すれば良いのかを理解できます。

# Mother board & Network Interface Card の確認

使っているマザーボード、NICがWake On LANに対応しているかを確認します。
今回は、マザーボードのNICを使用しますので、以下のようにBIOSの設定を変更しておきます。

[Wake On LAN - ROG - Asus][]

# Wake On LAN ツールのインストール

幸運なことに、Wake On LAN の Magic Packet を送信するためのツールは、
Ubuntu, RaspiOS ともにaptを使ってインストールすることができます。

```bash
pi@raspi4:~ $ apt info wakeonlan
Package: wakeonlan
Version: 0.41-12
Priority: optional
Section: net
Maintainer: Thijs Kinkhorst <thijs@debian.org>
Installed-Size: 29.7 kB
Depends: perl
Homepage: https://github.com/jpoliv/wakeonlan
Tag: admin::boot, implemented-in::perl, interface::commandline,
 network::configuration, protocol::ethernet, protocol::udp,
 role::program, scope::utility, use::transmission
Download-Size: 10.5 kB
APT-Manual-Installed: yes
APT-Sources: http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
Description: Sends 'magic packets' to wake-on-LAN enabled ethernet adapters
 With this package you can remotely wake up and power on machines which have
 motherboards or network cards that support 'Wake-on-Lan' packets.
 .
 The tool allows you to wake up a single machine, or a group of machines.
 .
 You need the MAC addresses of machines to construct the WOL packets, but,
 in contrast to 'etherwake', you do not need root privileges to use the
 program itself as UDP packets are used.
```

```bash
pi@raspi4:~ $ apt install wakeonlan
```

# Wake On LAN の使用

対象の デスクトップPC の Mac Address を事前に調べておき、コマンドの引数に渡すだけです。

```bash
pi@raspi4:~ $ wakeonlan <対象のPCのMACアドレス>
```

# まとめ

以上で、宅外から自宅PCを Wake On LAN で起こすことができるようになりました。
残念ながら現時点(2020/08/04)では、COVID-19の影響で外出するのが難しい環境下にありますが、
きっと近い将来、外出を自由に楽しめるときが来ると信じて、そのときのために準備して
今を楽しみたいと思います。

# References

* [Tech TIPS： Wake On LANでコンピュータを起動する][]
* [Wake On LAN - ROG - Asus][]
* [自宅の外から自宅のラズパイにVPN(WireGuard)でアクセスしよう][]

[Tech TIPS： Wake On LANでコンピュータを起動する]: https://www.atmarkit.co.jp/ait/articles/0602/25/news014.html
[Wake On LAN - ROG - Asus]: https://rog.asus.com/forum/showthread.php?93081-HERO-Wake-on-LAN
[自宅の外から自宅のラズパイにVPN(WireGuard)でアクセスしよう]: https://qiita.com/naomori/items/1ee1a314cbdd3010f3ee
rails5中級チュートリアル中に発生したSassC::SyntaxError in Pages#index対処法

[rails5中級チュートリアル](https://techracho.bpsinc.jp/hachi8833/2018_02_06/51401)中にエラーが発生 以下エラー画像
<img width="1436" alt="415e5c6c8622f2ea3ffb780959431d92.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673977/db1fecd0-1781-649b-c001-14b0eef91630.png">

####仮説と試したこと
エラー文の解説を翻訳してみると

>>「エラー：インポートするファイルが見つからないか、読み取れません：bootstrap-sprockets。
         app / assets / stylesheets / application.scssの15：1行
@import "bootstrap-sprockets";」

となる。 importの読み込み記述はされているが、sprocketsが存在しないことになっていると仮説。


エラー文で検索した際に出てくる多くのサイトではrails sをしていなかったのが原因と述べられているものが多いが、自分の場合rails sでの再起動を行うが効果なし。
[参考サイト](https://www.it-swarm.dev/ja/ruby-on-rails/sass-syntaxerror%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%8B%E5%88%A4%E8%AA%AD%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%EF%BC%9Abootstrapsprockets/1049262166/)


####解決
application.scssをいじっていたら解決する事ができた

```ruby:application.scss修正前
@import "bootstrap-sprockets";
@import "bootstrap";
@import "protospace";
```
三行目を削除

```ruby:application.scss修正後
@import "bootstrap-sprockets";
@import "bootstrap";
```

どうやら解決するためにいくつかサイトを見ていた際、誤ってprotospaceをimport読み込みしていたのが原因だったらしい。
そのため解決法は rails s不足と誤ったimportを記述してしまっていた事であった。
VScodeでER図を描く【Draw.io】

DB設計をする際にER図を描くかと思いますが、フリーで簡単に使えるものって意外となかったりします。
VScodeを使うとER図が簡単に描けるので使い方をさらっと紹介します。

かなり直感的に作図できるので試してみてください。

※ ER図を他人と共有したいという場合は、GoogleドライブでDraw.ioを使えば良いかと思います。

## 導入
VSCodeの拡張機能検索窓で「Draw.io Integration」と検索してインストール
<img width="1009" alt="e9c2425d6b71d03e695132176e51a025.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/d7b266cf-4d9b-daa2-5fd3-ab707f82f4e1.png">

## 使い方
拡張子が`.dio`のファイルを作成すればOKです。
<img width="896" alt="02cae1c1b754e00bd6c22033cca85874.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/4714736f-0c0f-1654-f2c6-31b171d64f70.png">

## ER図を描く
ファイルを開いた時に左下にある`その他の図形`をクリックしてERにチェックを入れて適用をクリックします。
<img width="702" alt="010835432bb7de1326af6e2e4cc2b708.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/eed0dfe8-f34e-00ba-4603-7451e2138982.png">

そうすると左側にERという項目が現れるので、そこから使いたい図形をドラッグアンドドロップするだけです。（クリックするだけでも追加できます）
![341901dd0971ed9214e2672826a30528.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/192989c5-6722-95dd-736e-ee07fd7fddc8.gif)

リレーション用の線を引くときは、図形の縁にカーソルを合わせると矢印が出てくるのでそこからドラッグ&ドロップで別の図形まで引っ張るだけです。
線の始点終点のスタイルは右側のスタイルタブで変更できます。これで１対多などのリレーションを表現できます。
![c43e9f4956dc07a110ac630dc4572ef2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/93f94d55-b894-9435-363a-b66e73b2e715.gif)

## エクスポート
左上のファイルから`形式を指定してエクスポート`を選んで好きな形式を選択するだけです。
<img width="518" alt="97300725ae0423baa20706d25463bc21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/d8958152-7c73-6c13-7cc9-2228f4d3d38f.png">

`形式を指定してエクスポート`が表示されない場合は[こちらの記事](https://qiita.com/tfukumori/items/0f2b52088cd39f5c124e)を参考に設定を変更してみてください。
.NET Coreの画像処理ライブラリはどれが良い？

## 概要

- 本記事は[Microsoft 開発者ブログ](https://devblogs.microsoft.com/dotnet/net-core-image-processing/)の引用で、Conclusionを[Deepl](https://www.deepl.com/translator#en/ja/)で和訳、整理したものになります。
- 詳細はリンク先を参照ください。パフォーマンスや品質についても述べられています。
- 2017年1月時点の情報なので、今は状況が変わっているかもしれません。

## 結論

.NET Core上での画像処理のためのライブラリは、さまざまな要件に対応できるように、今日では多くの選択肢がありますが、近い将来さらに多くの選択肢が出てくるでしょう。

- パフォーマンスを優先するならば、CoreCompat.System.Drawingが良い
    - ただし、Windowsサーバーのシナリオでのロック問題がアプリケーションを停止させてしまわない場合に限る
- SkiaSharpは、Linuxのセットアップ問題が解決されれば、品質を損なうことなくパフォーマンスを提供する素晴らしい選択肢となる
- 品質を最優先に考え、Windowsのみで動作する場合、MagicScalerはパフォーマンスを犠牲にすることなく、素晴らしい選択肢となる
- ファイルタイプのサポートを優先するのであれば、Magick.NETが良い
    - ただし、クロスプラットフォームのサポートはまだ不十分
- 現時点で利用可能な唯一の純粋なマネージドコードライブラリであるImageSharp
    - その性能はMagick.NETに近い
    - ネイティブに依存せず、.NET Coreのどこでも動作することを保証している
    - このライブラリはまだアルファ版であり、特に将来のSpan<T>とrefリターンの使用により、大幅なパフォーマンスの向上が見込まれる。

## 私見

.NET Coreはどのプラットフォームでも動作するという点が強みであると考えています。したがって、上記の記事を読む限りでは、ImageSharpが最も有力であるかなと思いました。
ただ、2年前の記事であるので、ちゃんと選定したい場合には各ライブラリの対応状況を確認したほうが良いと思われます。

.NET Coreの画像処理ライブラリに知見を持つ人がいらっしゃれば是非コメントをお願いします！
WPFアプリにおいてタイマ処理でUIを更新できない場合の対処法

## はじめに
本記事は、開発で得た小さなTipsを備忘録として残すことを目的としています。

## 遭遇した問題
WPFアプリにおいて[こちら](https://docs.microsoft.com/ja-jp/dotnet/api/system.timers.timer?view=netcore-3.1)のタイマクラスを使っている。タイマ時間経過時に実行されるハンドル処理内で、Dispathcerクラスを使ってUI更新をするとUIスレッドにアクセスできず、例外が出てしまう。

## 対処法
[こちら](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatchertimer?view=netcore-3.1)のSystem.Windows.Threading.DispatcherTimerクラスを使えば、タイマ時間経過後の処理は必ずUIスレッドで実施されるため、Dispathcerクラスを使わずとも例外発生せずUI更新できる。
使い方は[こちらの記事](https://www.atmarkit.co.jp/ait/articles/1812/12/news014.html)を参照のこと。

## まとめ
遭遇した問題は自分のDispathcerクラスの使い方が不適切で発生している可能性もあるが、タイマ処理内でUI更新処理をすることが初めからわかっている場合は、System.Windows.Threading.DispatcherTimerクラスを使うのが良いと個人的に感じた。
GitHub APIのレスポンスが 403 Forbidden になったら

`User-Agent`ヘッダーは設定していますか？？
https://docs.github.com/en/rest/overview/resources-in-the-rest-api#user-agent-required

### コード例

以下はissueを作成するコードです。
認証はパーソナルアクセストークンで行います。

`PersonalAccessToken`, `organization`, `repository`はご自身のものに置き換えてください。

```github.ts
import https from 'https'

const createIssue = async (title: string, body: string, labels: string[]): Promise<number> => {
  return new Promise((resolve, reject) => {
    const req = https.request({
      method: 'POST',
      headers: {
        'User-Agent': 'YourApp', // これ大事
        'Accept': 'application/vnd.github.v3+json',
        'Content-Type': 'application/json',
        'Authorization': `token ${PersonalAccessToken}`
      },
      host: 'api.github.com',
      path: `/repos/${organization}/${repository}/issues`,
    }, (response) => {
      let res: any = ''

      response.on('data', (chunk) => {
        res += chunk
      })

      response.on('end', () => {
        res = JSON.parse(res)
        resolve(res.id)
      })

      response.on('error', (err: Error) => reject(err))
    })
    req.write(buildPayload(title, body, labels))

    req.on('error', (err: Error) => reject(err))
    req.end()
  })
}

const buildPayload = (title: string, body: string, labels: string[]): string => {
  return JSON.stringify({
    title, body, labels
  })
}
```

### まとめ

全ての原因がこれに当てはまるかは分かりませんが、私はこれで解決できました。
（[@octokit/rest.js](https://octokit.github.io/rest.js/v18)などを使った方が早いかもしれませんね）
WSL上で実行したPython(Jupyter notebook)がAbortedになる現象への対処法

# 概要
WSL上でPython(Jupyter notebook)を実行した際にエラーが発生し正常に実行できない現象への対処方法。
起動直後ではなく、起動後かなり時間が経過した後に発生する傾向。

## 環境
* Windows10
* WSL (Ubuntu 18.04.2 LTS)

## エラー内容
```bash
Fatal Python error: _Py_InitializeMainInterpreter: can't initialize time
OverflowError: timestamp too large to convert to C _PyTime_t

Current thread 0x00007f0232c21080 (most recent call first):
Aborted (core dumped)
```

# 原因
uptimeがオーバーフローして負の範囲になってしまっている。
[issue](https://github.com/microsoft/WSL/issues/3514)

```bash
$ uptime
 11:23:19 up -24855 days, -3:-14,  0 users,  load average: 0.52, 0.58, 0.59
```

# 対処方法
PC自体を再起動する。
もしくはPowershellを管理者モードで起動し、以下のコマンドを実行。WSLを再起動する。

```powershell
PS XXXXXX> Get-Service LxssManager | Restart-Service
```

## LxssManagerとは
> Windows Subsystem for Linux 関連。Linuxでよく使用されるバイナリのフォーマットである ELF を Windows で動作させる機能に関するサービス。

[参考](http://tooljp.com/Windows10/doc/Service/LxssManager.html)
JS 第一引数の配列を第二引数で要素ごとに連結して返す

## lodashのjoin関数を作ってみた

配列後方毎に連結させる想定でいた

~~~~javascript
const join = (array, join = ",") => {
  let index = array.length - 1
  let linking = ""
  for (let i = 0; i < index; i++) {
    linking += array[i] + join
  }
  linking += array[index]
  return linking
}

console.log(join(["a", "b", "c"], "~"))
// => a~b~c
~~~

配列前方毎に連結させる方がすっきり書けるっぽい。

~~~~javascript
const join = (array, join = ",") => {
  const arrayCopy = [...array]

  //array最初の要素を取り出す
  let linking = arrayCopy.shift()

  for (let i = 0; i < arrayCopy.length; i++) {
    linking += join + arrayCopy[i]
  }

  return linking
}

console.log(join(["a", "b", "c"], "~"))
// => a~b~c
~~~

こんな発想ができるようになりたいなぁ。
関数作るのはすごく勉強になる。
操作記述子 2 03 yyy のサポート（まだできていない）

こういう、ジタバタしている過程が日本語で書かれていることが、ソフトウェアの品質それ自体とは別の価値だと思うので、メモしておきますよ。[GitHub では bufrconv の issue #49](https://github.com/etoyoda/bufrconv/issues/49) の対応過程で考えていることです。

# 発端
実際のGTS電文をBUFRデコーダに食わせているわけですが、毎3時間にプロット図を描くのとは別に、1日1回とりまとめて解読エラーメッセージをブログに載せています。いろいろな未対応機能や、発信側バグかもしれない何かがもたらされるわけですが、遅くとも [2020-06-25](https://toyoda-eizi.blogspot.com/2020/06/bufrval-2020-06-25.html) 以後、操作記述子 2 03 014 が未実装というメッセージが毎日出るようになりました。

# 調査
[国際気象通報式別冊](http://www.jma.go.jp/jma/kishou/books/tsuhoshiki/kokusaibet/kokusaibet_31.pdf#page=361)をチェックすると、 2 03 yyy は参照値変更オペレータであることがわかります。簡単な操作記述子、たとえば資料幅変更（2 01 yyy）や尺度変更（2 02 yyy）と異なり、資料節から都度都度（仮に反復された場合その回数だけ） yyy ビットを抽出して参照値を得るので、データ依存性が異なります。

具体のデータ、ISMD02 LLBD をダンプしてみると、記述子列はは次の通りでした。
203014,007030,007031,203255,301150,307080
観測所標高 007030 と気圧計標高 0007031 の参照値を14ビットの臨時値に変えようとしています。本来参照値は17ビットらしいので異なります。
あと、どうでもいいのですが、 301150 （WIGOS 地点番号）があるので新種の観測データです。

# bufrconv ではどうするか
コードみて何をしているか思い出せなくて、しばらく[リファレンス bufrdump.md](https://github.com/etoyoda/bufrconv/blob/master/bufrdump.md)みて思い出したのだけれど、このデコーダのキモは [BufrDecode](https://github.com/etoyoda/bufrconv/blob/master/bufrdump.md#class-bufrdecode) クラスの仮想機械なんですね。

* 簡単な操作記述子、たとえば資料幅変更（2 01 yyy）や尺度変更（2 02 yyy）は、仮想機械の内部状態にだけ作用します。
* データっぽい操作記述子、たとえば文字列（2 05 yyy）なんかは、あたかも要素記述子であるかのようにふるまい、資料節から読み出しをしてデータを排出することになります。
* 今回の 2 03 yyy は、資料節から読み出しは行うけれど、データは排出せず、仮想機械の状態を変えます。

臨時変更の参照値が 2 03 yyy の直後の要素記述子1個にだけ適用されるのであれば、必ずしも仮想機械に持たせなくても、解読計画 `tape` を破壊的に上書きしてしまう手もあるのですが（良い趣味かどうかはともかく）、今回出くわした実例でも複数の要素記述子に適用されるので、仮想機械に持っておかねばなりません。

# 実装1
通報式の記載を素朴に考えるとこうだと思いました。

* 2 03 yyy(!=255): yyyビットを読みだして、仮想機械の仮参照値 `@tmprefv` にセット
* 2 03 255: 仮想機械の仮参照値をクリア
* 要素記述子:
 * 仮参照値があるならば: 解読計画 `tape` の参照値を仮参照値に差し替えてデコード
 * さもなくば: 解読計画の参照値を使ってデコード

ところが[これを素朴に実装すると](https://github.com/etoyoda/bufrconv/commit/d21e2ed1a2152ea60be79e64fe288e2a02863036)ビットずれっぽい動きをします。

# こういう意味ではないか
どうやら、 2 03 yyy(!=255) と 2 03 255 で挟まれた要素記述子は、要素をあらわすのではなく、
参照値の変更だけを行うのではないでしょうか。仮想機械にするとこういうことです。

* 仮想機械には初期モードと参照値変更モードがある。
* 初期モード：
 * 2 03 yyy(!=255): 参照値変更モードに入り `@tmprefv = yyy` を保存。
 * 0 xx yyy: DB から記述子を抽出するにあたり、仮参照値がセットされていれば差し替え
 * その他は従来通り
* 参照値変更モード：
 * 2 03 255: 初期モードに戻る
 * 0 xx yyy: 資料節から `@tmprefv` ビットを呼び出し、当該記述子の仮参照値にセット
 * その他はエラー

ところがです。この処理ができるのは `tape` を仮想機械が処理しはじめたときなのですが、
今の実装ではそれまでに要素記述子の参照値は確定させてしまっています。

たぶん設計をまずったのでしょう。集約展開（Table D参照）だけをやって `tape` を作って、処理時に仮想機械が Table B を参照するようにすれば簡単になったはずです。
が、どうやってそんなこと予知しろってんだよ！

仕方がないので、仮想機械に参照値変更機能をつけることにします。

# 2020-08-23追記

コードを読んでみると、参照値のさしかえは BufrDecode#read_tape でやるのがよさそうです。実データを読んで参照値を得るために、仮想機械が走る最終段階で処理したいわけです。それであれば、このさい、Table B を参照する処理をなるべく遅延させて、BufrDecode の仮想機械が走るまで遅延させられないでしょうか。それが BUFR が予定した処理構造なのでしょうから。

いまは Table B を参照する BufrDB#table_b の呼び出しは BufrDB#compile で行われています。
ここで table_b を呼び出さないと、次の問題が生じます。

* 操作記述子 206yyy の処理は、 table_b が偽を返したときのエラー処理なので、同じ場所に移さねばならない。
* 操作記述子 205yyy も要素記述子に準ずるので、同じ場所に移さねばならない。
* bufrdump -c の出力が変化する、これによりテストを変更するか、テスト用互換出力ルーチンを設けるかする必要がある

最後のがちょっと「うっ」となりますね。
ソースコードを読むとき

既存プロジェクトに入った際、各Classがどのようなメソッドをもっているかを確認する必要があると思います。

その際、自分がどのように確認を行っているかを以下で述べていこうと思います。

[環境]
Ruby
Rails
Solidus

今回は、RailsのSolidusというGemを使って、説明させて頂ければと思います。
<img width="850" alt="download.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436942/899318f5-4e48-8f1d-95f9-0f70c49b03cb.png">

$rails c
でコンソールの中に入る。

そこで、上記のように、任意の文字にオブジェクトを代入する。
（Spree::Taxonはオブジェクト）

$a.methods
を実行。実行することで、そのオブジェクトが持っているmethodが表示される。

<img width="850" alt="download (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436942/d092374d-2b02-d8b4-69ef-bd43b152bdcb.png">

$a.methods.grep /product/
とすると、productにまつわるmethodのみを取得できる。
上記のようにgrepを使う事で検索結果を絞って検索する事ができるので、結構使う機会も多いと思います。

<img width="850" alt="download (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436942/6cb94c0f-33a5-4320-9541-e24e42f20771.png">

$a.method(:before_remove_for_products=).source_location
上記のように、method(メソッド名).source_locationとすることで、
どこのファイルにそのメソッドがあるかを探す事もできます。
シンボリックリンク作成時に 「オリジナルの項目が見つからない」エラーの対処法

シンボリックリンクを張ると以下のようなエラーが出て失敗してしまったので、その解決備忘録です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/cc300efd-c808-a9bf-4ea8-006a76b6f92f.png" width=450 />


## 経緯

僕はPhotoshop Script(jsx)を開発する際に、git管理したいので作業環境のjsxをPhotoshopディレクトリ内にシンボリックリンクを張って作業します。

```
作業環境/hoge.jsx
↓
/Applications/Photoshop 2020/Presets/Scripts/hoge.jsx
```

以下のおなじみの`ln`コマンドで張ります。[^1]

```zsh
$ sudo ln -s '作業環境/hoge.jsx' '/Applications/Photoshop 2020/Presets/Scripts/'
```
[^1]: /Applications配下--9-9^-9-0^¥-09-0^9-0-09^-090-9-97-アクセス権限的に`sudo`を使っています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/21141b36-40af-ac29-b12e-0193e193405d.png)

アイコンが何かおかしい。
ダブルクリックしてみると、冒頭のキャプチャのエラーダイアログが表示され失敗したことが分かります。
※ファイルの情報でも確認できます。


## 解決方法

```zsh
$ ln -s 元ファイル絶対パス リンク先絶対パス
```
このように絶対パスで`ln`コマンドを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/c9b6442e-0bec-ad65-e169-3e98fd5a1a79.png)
関連付けされたAtomのアイコンが表示されて、ダブルクリックするとオリジナルファイルが開くようになりました。

成功。


## まとめ

シンボリックリンクを張る場合は、相対パスではなく**絶対パスを使用**する。
重複登録の防止（備忘録）　section76

現在のままではユーザー名やメールアドレスが一緒でも登録してしまうので
重複登録を防ぐようにプログラミングコードを書いていく

データベースの重複を防ぐためには
データベースに接続して、
ユーザー名があるかどうか確認する必要があるため
index.phpでもDB接続する必要がある。

```
require('../dbconnect.php');
```
index.phpの先頭でDBに接続しておく。

次に必須項目のチェックを行った後、ファイルのチェックを行った後に
重複しているかどうか確認していく。

エラーが無ければcheck.phpに移動するというコードの前に記述する


まずは、必須項目やファイルなどがしっかり$_POSTに入っているかチェックする。
ユーザー名やメールアドレスにblankが入った状態で重複チェックを行うと
データベースが誤作動を起こす可能性があるので予めblankがあるかどうかのチェックは
済ませておく必要がある。



```
$member = $db->prepare('SELECT COUNT(*) AS cnt FROM members WHERE email=?');
$member->execute(array($_POST['email']));
$record = $member->fetch();
```

`SELECT COUNT(*)`で件数が何件かというのをカウントする（ここではメールアドレスがいくつあるかCOUNT）

'cnt'はショートカットのキーとして扱う一時的にこちらに保存する

'FROM members WHERE email=?'　membersのテーブル内からemailを?で絞り込んでいく
　?　には現在入力しているメールアドレスを指定してそのアドレスがDB内にあるかどうか検索をしていく

検索して一致したら`$member`に保存する

`$member->execute(array($_POST['email']));`
? に`$_POST['email']`を指定する

`$record = $member->fetch();`

`$member`に保存されている値をfetch()で取り出して`$record`に格納する
emailのアドレスが存在したら１、無かったら０が入っているはず。

```
if($record['cnt'] > 0){
	$error['email'] = 'duplicate';
}
```

cntにはCOUNT(*)でとった数字（０か１）を保存しているので
もし`$record['cnt']`が０より上の数字が入っていれば
`$error['email']`にduplicateというエラーキーを
保存する


```
<?php if($error['email'] === 'duplicate'): ?>
 <p class=error>※指定されたメールアドレスは既に登録されています</p>
<?php endif; ?>
```

エラーメッセージを表示したい場所に以上のコードを記述
`$error['email']`にduplicateというエラーキーが入っていれば
メッセージを表示する
Cloud Functions スケーリング動作の制御

# 概要
Cloud Functions で同時接続数に制限のあるデータベースなどに接続する場合に、インスタンスに制限をかける方法のメモ

# スケーリング動作の設定方法
スケーリング動作の設定方法は２種類

1. `gcloud` コマンドラインツール
2. Cloud Console

## gclou コマンドラインツールでの設定方法
`gcloud` コマンドラインツールを使用して設定する場合
デプロイ時に `--max-instance` フラグを使用する

### 最大インスタンス数の制限を設定する

```
gcloud function deploy FUNCTION_NAME --max-instance 10
```

### 最大インスタンス数の上限をクリアする
関数の制限をクリアするには、デプロイ時に `--clear-max-instance` フラグを使用する

```
gcloud function deploy FUNCTION_NAME --clear-max-instance
```

最大インスタンス数を０に設定する

```
gcloud function deploy FUNCTION_NAME --max-instance 0
```

## Cloud Console での設定方法
### 最大インスタンス数の制限を設定する

1. Cloud Functions の概要ページに移動する

![スクリーンショット 2020-08-03 15.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47143/28fa4427-12ff-39e2-43a3-bdb4b52f255d.png)

2. 既存の関数をクリックして、その詳細ページに移動する
![スクリーンショット 2020-08-03 15.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47143/3534f239-d905-0528-85d2-57dda76eaffc.png)

3. [編集] をクリックする
4. [VARIABLES, NETWORKING AND ADVANCED SETTINGS] をクリックする
5. [詳細] をクリックして詳細設定を表示する
![スクリーンショット 2020-08-03 15.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47143/e443e66a-d889-3017-49cc-580a8b2621c5.png)
6. [関数インスタンスの最大数]セクションで、数値を入力する
※ [0] を入力するか、フィールドを空白にすることで上限をクリアできる
7. [次へ]をクリックする
![スクリーンショット 2020-08-03 15.32.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47143/f7fe0cf6-4459-7d56-e0f4-d80fe153f417.png)
8. [Source code]セクションで、[Inline Editor, ZIP Upload, ZIP from Cloud Storage, Cloud Source repository] から deploy するコードを選択する
9. [デプロイ]をクリックする
Worpressのbody直下にスクリプトを入れる方法





```functions.php

/**
 * bodyタグ開始に挿入
 */
add_action( 'wp_body_open', function() {
	?>
	<!-- ここから挿入したいソースコードなどスタート -->
	<script src="//accaii.com/abcd/script.js" async></script><noscript><img src="//accaii.com/abcd/script?guid=on"></noscript>
	<!-- ここまで -->
	<?php
});

```
Chromeで個別のGoogle スプレッドシートを開こうとすると「キャッシュと Cookie の消去」のページに飛ばされてしまう場合の対応方法

Googleのマイドライブを開くことはできても、個別のスプレッドシートを開こうとすると「キャッシュと Cookie の消去」のページ（ https://support.google.com/accounts/answer/32050 ）に飛ばされてしまうという事象が起き、検索しても似た事象がWeb上に見つけられなかったので、書き留めておきます。

Googleのサポートにチャットで問い合わせをして解決しました。（サポート内容の公開許可もいただいています。ありがとうございます）

まず、この現象が起きる状況としては、ブラウザに保依存されている「キャッシュ」または「Cookie」とうまく整合性が取れないとこのページが表示される場合があるとの説明を受けました。

その上で、キャッシュとCookieの削除を行ったか確認されました。
私は、直近のものを削除して、それでも改善しなかったので、全期間のキャッシュとCookieを削除済みだと回答しました。

ここで直る場合もあるようです。

すると、使っているブラウザが Chromeか確認されたので、はい、と回答すると、以下のような手順を試して見るように言われました。

- chrome://settings/siteData このURLをアドレスバーにコピーして開く
- 「すべてのCookieサイトデータ」の画面が開かれることを確認
- 右上の検索で「docs」と検索し、出てきた Google.docs を削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180861/62fed9f2-52c1-4f54-6971-63c4974aaccc.png)

この手順で、無事にスプレッドシートを開くことができるようになりました。

サポートしてくださった方、丁寧にありがとうございました。

### その他に試したこと
- Chromeの別プロファイルでログインし、スプレッドシートを開けるか確認（開けました）
- 拡張のオフ（すべての拡張をオフにしましたが、現象は変わりませんでした）

以上のことから最悪Chromeのプロファイルを作り直せばいいかとも思ったのですが、拡張を入れ直すのが手間だったのでサポートに問合せを行いました。
VBScriptことはじめ

※この記事は新入社員の問いにあることないことないことないこと話した備忘録です。

# 本日の困りごと
VBScriptって何ぞや？どうやって組むものなの？

# 経緯
新入社員にVBScriptの[糞コード](https://qiita.com/kotauchisunsun/items/d03c1e6936ffb250e4a1)を修正してもらうことになったよ！
…いや、糞コードではあるが、糞コードの修正…というと語弊がある。
やってもらうことは単なるバグフィックスだ。「稼働当時から一切機能していない」プログラムの改修だ。誰だよ作ったヤツ(せめて動作確認してくれ)。。
そして新人ちゃんたちはどうか「イケてないんで、全部修正しますね！」とは言いださないでほしい。

# 今回の解決方法
~~久々にggrksって言った~~VBScriptについて簡単に説明するよ！
今回の記事にはサンプルコードは用意してないよ！

## VBScriptとは何ぞや？
Microsoftの開発したプログラム言語の一つ。
VisualBasicシリーズに名を連ねるScript言語だ。
Script言語とはJavaScript然り、「実行するのに面倒な作業が要らない」言語である。

**実行するのに面倒な作業が要らない**ということは、
コンパイルして(エラーが出て)ビルドして(エラーが出て)実行して(エラーが出る)…という手順を踏まなくても大丈夫。
病める時(上手く動かない時)も健やかなる時も、すぐに結果が返ってくる親切設計だ。

Microsoftのプログラム言語なので、Excel操作やAccess操作を自動化することに優れている。Accessでクエリやマクロを動かしてExcelにデータをエクスポートするとかね。
え？PythonやRPAツールは使わないのか？
色々と理由はあるけど…一番の理由は作ったの10年前だからじゃないかな。

## VBScriptは何で開発する？
特別必要なものは何もない。お気に入りのテキストエディタさえあればOK。
強いて言うなら…
**そのテキストエディタは文字コードを「ANSI」に設定できますか？**ということだろうか。とはいえ、これはWindows標準装備のメモ帳でも問題がない。
VBScriptだけでなく、プログラム言語には**利用できる文字コードと利用できない文字コード**があるとだけ覚えていてほしい。
日本語(マルチバイト文字列)を利用するなら、この文字コードは必須だと思っていてほしい。

私はごたぶんに漏れず[VSCODE](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)を利用している。
シンタックスハイライトだけであれば[サクラエディタ](https://sakura-editor.github.io/)も優秀なのだが、
コードの自動補完をされてしまうと、もう元に戻ることはできない…
大昔、[Eclipse](https://mergedoc.osdn.jp/)が解禁された後(新人は研修中使ってはいけないルールだった) 、Javaのコンパイルもmainメソッドもできなくなったあの頃に似ている。mainメソッド、今も書ける気はしないけど。

メモ帳を開いて、実行したい処理を書く。そのファイルを拡張子`.vbs`で保存すれば完成だ。
わー。言うのはめちゃくちゃ簡単ー☆

## VBScriptを動かそう！
VBScriptを作るにはメモ帳があれば充分…と言った。では実行環境はどうだろう？

VBSファイルを実行するにはそのファイルをダブルクリックするだけでOKだ。
訳あってコマンドプロンプトから実行したい場合は`cscript`を利用する。

```cmd
cscript sample.vbs
```

え？`wscript`っていうのを見たんですけど？
…それは幻じゃないかな。

`wscript`で実行すると対話型と言って、出力させたい内容がダイアログボックス(ポップアップ)で返ってくる。
正直サンプルコードを実行するぐらいで、実際の仕事の中で使ったことはあまりない。
コマンドプロンプトから実行したい場合はバッチ化して複数のスクリプトを連続操作したいとかいう要件が多いんじゃないかな？と思う。

詳細な違いは以下のサイトが詳しい。
[cscript と wscript の違い | 文字の出力方式](http://tooljp.com/windows/chigai/html/WSH/cscript-wscript-chigai.html)

## さいごに
…最後に…と言っても何も書くことはないのだが…
私が新人の時に受けた研修は、親ライオンが子ライオンを千尋の谷に突き落とすスタイルだったので、全くの新人に何かを教えないといけない時は何を教えりゃいいのか、毎回とても困っている。
自分に聞かれるまで進んで教えないというスタイルも~~親ライオン~~当時の上司の姿を忠実に再現しているので、どうか今の上司は「教えてやれよｗｗｗ」と突っ込まず、生温かい目で見ていてほしい。
AWSから請求書が届いた

#背景


先月からAmazonWebService（以下AWS）を利用し始めました。


個人的な感覚としては、サーバーとかすぐに構築できて便利だなーっといった軽い気持ちです。


そんな軽い気持ちでいたのですが、
先日請求書が届いたので確認して見たら、なんと料金が2000円を超えていたのです。


内訳が気になるので明細書を見てみます。


自分の場合、どうやらNATゲートウェイに対して請求が発生していたようです。


料金について調べてみます。

#AWS公式サイトの確認

以下AWS公式サイトから抜粋
https://aws.amazon.com/jp/vpc/pricing/

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
NAT ゲートウェイ料金

VPC 内に NAT ゲートウェイを作成することを選択した場合は、NAT ゲートウェイがプロビジョニングされ利用可能であった "NAT ゲートウェイ時間" に対して料金が請求されます。データ処理料金は、トラフィックの送信元か送信先にかかわらず、NAT ゲートウェイで処理されたギガバイト単位で適用されます。1 時間未満の NAT ゲートウェイ時間は、1 時間分として請求されます。また、NAT ゲートウェイを介して転送されるすべてのデータに対して標準的な AWS データ転送料金が発生します。NAT ゲートウェイへの課金を止めたい場合は、AWS マネジメントコンソール、コマンドラインインターフェイス、API を使用して NAT ゲートウェイを削除します。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝


AWSのサービスは従量課金制と聞いてはいたのですが、全く使用していなかったサービスで請求されるとは思っておりませんでした。


#対処法


使用していなかったNAT ゲートウェイを削除しました。



これで来月請求はないはず。




NATゲートウェイに限らずAWSにおいては使用していないものは削除しておいた方が良いみたいですね。
MS Forms/Google Formsにアップロードされた画像ファイルをPDFに一括変換する

# MS Forms/Google Formsに提出された画像ファイルをPDFに一括変換する

### MS Formsにアップロードされた画像ファイル形式
- MS Formsを通してアップロードされるファイルは以下のようになる．
  - ファイル名_学生の姓名.拡張子．という形式になっている．人によっては名姓になっていることもあるので注意
  - 0FBABF78-CCCB-4958-A17B-61BC43EF27D3_工大 太郎.jpeg
  - 0FBABF78-CCCB-4958-A17B-61BC43EF27D3_工大 太郎 1.jpeg
    - フォームで提出するフォーマットとして画像を指定していれば，jpg,png,pdfなどが存在する．ファイル名部分は学生に依存するので，仮に同名のファイルが提出されていた場合，名前 1.jpegのように通し番号がつくっぽい
  - test_工大 花子.png
- これを以下のように学生番号_通し番号.pdfなファイルに変換したい
  - X0111_1.pdf
  - X0111_2.pdf
  - X0123_1.pdf

### Google Formsにアップロードされる画像ファイルの形式
- Google Formsを通してアップロードされるファイルは以下のようになる．
  - ファイル名 - 学生の姓名.拡張子．という形式になっている．学生によっては名姓になっていることもあるので注意
  - 0FBABF78-CCCB-4958-A17B-61BC43EF27D3 - 工大太郎.jpeg
  - 0FBABF78-CCCB-4958-A17B-61BC43EF27D3 - 工大太郎(1).jpeg
    - 同名のファイルを同じ学生がアップロードすると2つ目から(1)などが後ろにつく
  - test_工大花子.png
- これを以下のように学生番号_通し番号.pdfなファイルに変換したい
  - X0111_1.pdf
  - X0111_2.pdf
  - X0123_1.pdf

### できることとできないこと
- MS FormsやGoogle Formsのファイルアップロード機能を利用して提出された画像ファイルを名簿情報に基づいて学生番号_通し番号.pdfのようなPDFに個別に変換することができる
- 画像ファイル以外のPDF変換はできない
  - 画像ファイルで対応しているのはjpg,pngだけ．heicなどその他のフォーマットには未対応
  - docx,pptx,htmlなどはren_*file2sid.pyでファイル名を変換してからAcrobatで一括変換を想定
    - Acrobat起動->ファイル->作成->複数のPDFファイルを作成

### できなかったけどできるようになったこと
- 元のファイルで姓名がひっくり返っていた
  - 姓名と名姓の両パターンで検索を実施するように修正
- 同名のファイルを同じ学生が一度にアップロードしている場合があった
  - ファイル名末尾に" 1.jpg"や"(1).jpg"みたいに通し番号がつくっぽいのでファイル名から姓名を取り出すときに数字を正規表現を利用して削除した
- Value errorなどで変換に失敗することがある->プログラムを再実行すると変換に成功する(今の所ほぼ100％再実行で成功している．原因不明)．
- ○に4のような機種依存文字がファイル名に含まれているとcsv出力時にcp932だと失敗する
  - 出力時の文字コードをutf8に変更

## 準備
- 以下のようなフォーマットのcsvファイルを作成する
- 姓名の間に空白が含まれている必要がある
- ファイルはExcelからcsv出力されたcp932の文字コードであること
  - このプログラムでは変換したファイル名を管理するためのcsvを出力するが，そちらはutf8で出力する（機種依存文字がファイル名に使われていることがあるため）

|sid	|name|
|----|----|
|B88000	|工大　太郎|
|B87999	|工大　花子|
- アップロードされた画像ファイルを特定のフォルダにまとめてほりこむ

## MS Formsに提出された画像ファイルのPDF変換
### ファイル名の変更(ren_msfile2sid.py)
- https://github.com/igaki/renconpdf/blob/master/ren_msfile2sid.py
- 準備で作成した番号と氏名が書かれたcsvファイル名，画像ファイルがあるフォルダ名を指定してプログラムを実行する
  - `python ren_msfile2sid.py cpu2020.csv exama`のように実行する
  - 第1引数が名簿のcsvファイル名，第2引数が画像等のファイルが格納されたディレクトリ名
- 画像ファイルがあるフォルダにあるファイルが指定したフォルダ/output に移動される
- 画像ファイルがあるフォルダ名.csvファイルに，どの学生がどのファイルを提出し，どうリネームされたかが記述される


### PDFファイルへの変更(con_sid2pdf.py)
- https://github.com/igaki/renconpdf/blob/master/con_sid2pdf.py
- ren_....pyで指定した第2引数（画像フォルダ名）と同じものを第1引数に指定して実行する
  例 `python consid2pdf.py cpuexama`を実行する
- `画像フォルダ名/output`にある学生番号_通し番号.jpgなどの画像データがcompleteに移動され，同時にpdf化されたファイルがpdfフォルダに作成される
- 変換に失敗した画像データがある場合はoutputに残る．その場合，con_sid2pdf.pyを再実行すると正しく変換されることが有る．

## Google Formsに提出された画像ファイルのPDF変換
### ファイル名の変更(ren_gfile2sid.py)
- https://github.com/igaki/renconpdf/blob/master/ren_gfile2sid.py
- 準備で作成した学生番号と学生氏名が書かれたcsvファイル名，画像ファイルがあるフォルダ名を指定してプログラムを実行する
  - `python ren_gfile2sid.py se2_2020.csv exama`のように実行する
  - 第1引数が学生名簿のcsvファイル名，第2引数が画像等のファイルが格納されたディレクトリ名
- 画像ファイルがあるフォルダにあるファイルが指定したフォルダ/output に移動される
- 画像ファイルがあるフォルダ名.csvファイルに，どの学生がどのファイルを提出し，どうリネームされたかが記述される

### PDFファイルへの変更(con_sid2pdf.py)
- MS Forms側で利用したものと同じ
Railsでのモデルとマイグレーションについて

Railsでのモデルとマイグレーションについて

知っておきたい内容
テーブルはデータベース内に情報を収納する場所のことです
モデルはデータベースと情報をやりとしている担当しています。
マイグレーションはデータベース内に保管するための情報を具体的に何を入れるか記述したもの。例えるなら設計図や仕様書見たいなものです。

知っておきたい内容を例え話にすると
通販サイトで商品を買ったこと例にあげる
お客さんが通販サイトで物を買う。配達する人（モデル）がその情報をみてお客様に運搬する。買った物（マイグレーション）をお客様が自分の収納する棚（テーブル）に入れる。

モデルを作成するためには
コマンド
rails g model モデル名　

モデル名はどんな情報にするかで名前がかわる。学校の生徒を管理するならstudent、ユーザーを管理するならuserという名前に変わる。

ファイルはどこにあるかというと
studentで作成した場合、app/models/student.rbで保管されています。

マイグレーションを作成する
モデルを作成する時にマイグレーションファイルが作成されています。
ファイルがどこにあるかというと
db/migrate/作成した日付_create_students.rbで保管されています。

マイグレーションファイルの情報が反映されて、テーブル作成・変更ができます。

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :students do |t|
      t.string :student_name	
      t.timestamps
    end
  end
end

 t.string :student_nameのようにt.に続くのがカラムの型でその右にあるシンボルでカラムの名前です。カラムの型にはそのカラム名に対してどんな情報なのか指定することができます。


カラムの型の種類
string : 文字列
text : 長い文字列
integer : 整数
float : 浮動小数
decimal : 精度の高い小数
datetime : 日時
timestamp : タイムスタンプ
time : 時間
date : 日付
binary : バイナリデータ
boolean : Boolean
マイグレーションに記述した内容を、データベースに適用することをマイグレートと呼びます。


コマンドは
rails db:migrate

マイグレーションを実行し、データベースにテーブルが追加されています
【2020年夏】VSCode で作る Docker 開発環境

# 前書き
今までスペックの低いコーディング環境だったので、EC2 に環境作って開発してたんですが、多少メモリに余裕のあるコーディング環境が用意できたので、Docker を使用した環境に移行することにしました。

が、思ったより、環境作るのに遠回りしたので、メモ書きを残しときます。

**要するに「公式読め！」って記事です。たどり着ければ終了なので、ただのリンク集です。**

# 最初に見るべきサイト

公式の記事です。
[Developing inside a Container - code.visualstudio.com](https://code.visualstudio.com/docs/remote/containers)
remote - overview から読んだ方がよいかもしれません。

環境構築自体は、ドキュメントに従って作るだけなので、ドキュメント読み慣れてる人なら問題は起こらないと思います。
設定のポイントは`.devcontainer/`にできる`Dockerfile`と`devcontainer.json`です。

# `Dockerfile`と`devcontainer.json`

**Remote-Containers: Add Development Container Configuration Files...**を叩いた後、上記の 2 ファイルが、初期ファイルとして作成されます。
これを自身の環境用に改修していきます。

改修時に参照すべきは以下です。
[microsoft / vscode-dev-containers](https://github.com/microsoft/vscode-dev-containers)

「Sample projects」って項目がありますが、参照すべきはそちらでは無く、[vscode-dev-containers/containers/](https://github.com/microsoft/vscode-dev-containers/tree/master/containers) のようです。使いたいテンプレートを clone できないのがちょっとメンドイ。
全体を clone してそこからコピーしろということのようです。

`devcontainer.json`の書式は、以下に従ってください。
[devcontainer.json reference - code.visualstudio.com](https://code.visualstudio.com/docs/remote/devcontainerjson-reference)

これで大体必要なリンクは載せられたと思います。
まだ、実際の開発に使用していないので、いったん記事としてはここまでです。
どんどん作って壊して効率よく開発していきましょ！
量子コンピュータで金融計算

量子コンピュータは暗号解読以外に役に立つの？　という素朴な疑問から調査しました。


#概要
QAE (Quantum Amplitude Estimation) による European Call Option Pricing を紹介します。
古典計算機による Monte Caro 法に対して Quadratic Speedup が期待できます。
[![Screen Shot 2020-08-09 at 6.34.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123482/b1ccc528-3b20-d1db-249d-ec6c814e5984.png)](https://www.slideshare.net/KenjiTanaka5/ss-237452756)


#内容
スライドの方が見やすかったので blog 化断念します。 slide share で見てください。。
[![Screen Shot 2020-08-06 at 16.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123482/9341a783-10c5-7aa0-673e-c1b6187f2fd5.png)](https://www.slideshare.net/KenjiTanaka5/ss-250016784)
[slideshare](https://www.slideshare.net/KenjiTanaka5/ss-250016784)

<br />
<br />
YouTube 動画もあります。

https://www.youtube.com/watch?v=DZHdoqjb35s

<br />
<br />
<br />

###参考
[Quantum computational finance: Monte Carlo pricing of financial derivatives] 
(https://arxiv.org/abs/1805.00109)
[Qiskit Aqua Tutorial: European Call Option]
(https://qiskit.org/documentation/tutorials/finance/5_european_call_option_pricing.html)