OmniAICreator/Qiita-1.07M huggingface dataset:
Materials Projectのクエリ機能を使用して所望の計算材料データを大量に取得する。

計算材料データ（化合物安定性やバンドギャップ値）についてAPIを利用して大量に取得する際、[Materials Project][] のクエリ機能の使い方をいつも忘れるので、自分用のメモとしてここに書き記します。

# Materials Project とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367470/99c61042-d10d-5c09-9c11-e5705a81edca.png)
>物質材料の第一原理計算結果のデータベース。結晶構造、バンド構造、熱力学量、相図、磁気モーメントなどを提供する。MITの研究グループが運営を行っており、Li電池材料のデータが特に充実している。ウェブベースのユーザーインタフェースに加えて、httpベースのAPIも提供されており、ユーザ独自のスクリーニングが可能。無料であるが、要登録。
引用: [MateriApps][]

# クエリ使用例
下記の例では、[pymatgen][]（Python Materials Genomics）という[Materials Project][] が開発した材料分析用のオープンソースPythonライブラリの `MPRester` をインポートしてクエリを実行します。

```mp_query.py
from pymatgen import MPRester

# your API_KEY here: https://materialsproject.org/open
YOUR_API_KEY = "YOUR_API_KEY"
mp = MPRester(YOUR_API_KEY)

# Properties you need: mp-id; spacegroup number; composition formula; band gap
basic_properties = ['task_id', 'spacegroup.number', 'pretty_formula']
electronic_properties = ['band_gap']

all_properties = basic_properties + electronic_properties

# Query criteria: must include O element; less than 3 types of elements; space group is not equal to 1; band gap value exists
criteria = {"elements": {"$all": ["O"]}, "nelements": {"$lte": 3}, "spacegroup.number": {"$nin": 1}, "band_gap": {"$exists": True}}

# Retrieve material property data which satisfy query criteria
data = mp.query(criteria=criteria, properties=all_properties)
​
print(len(data))
# -> 21084
```

実際に取得できたデータの中身はこんな感じです：

```
[{...,                                                
 {'band_gap': 0.0,
  'pretty_formula': 'BiO2',
  'spacegroup.number': 160,
  'task_id': 'mp-1044722'},
 {'band_gap': 5.2101999999999995,
  'pretty_formula': 'SiO2',
  'spacegroup.number': 2,
  'task_id': 'mp-683947'},
 {'band_gap': 1.3498,
  'pretty_formula': 'Sb6O13',
  'spacegroup.number': 11,
  'task_id': 'mp-684679'},
...}]
```

3元系以下の酸化物について、Materials Project登録ID、空間群、バンドギャップの情報が得られていることが確認できます。

## クエリの条件の記法について
上記の `mp.query()` 内の `properties={...}` と `criteria={...}` の記法は、[MongoDB][] というNoSQLデータベースの [クエリ形式][Query and Projection Operators — MongoDB Manual] に準拠するらしいです（詳細と使用例は [ドキュメント][Materials Project · GitHub] を参照とのこと）。
>Note that the criteria and properties follows the format (and richness) of MongoDB queries. You can refer to the MongoDB documentation for more information on how to customize queries.
引用: [Materials Project · GitHub][]

# 感想
これだけ簡単に材料のデータを集められるなんて自分は恵まれた時代に生まれたなと思い、ありがたみが深いですね。
材料屋さんに限らず誰でも簡単に材料機械学習ができる時代になってきているあたり、[Materials Project][] の存在を偉大に感じます。

# 参考
・[Materials Project · GitHub][]
・[Query and Projection Operators — MongoDB Manual][]

[Materials Project]:https://materialsproject.org
[MateriApps]:https://ma.issp.u-tokyo.ac.jp/app/259
[pymatgen]:http://pymatgen.org
[Materials Project · GitHub]: https://github.com/materialsproject/mapidoc#using-this-repo
[MongoDB]:https://www.mongodb.com
[Query and Projection Operators — MongoDB Manual]:https://docs.mongodb.com/manual/reference/operator/query/
mklinkでシンボリックリンクを作った後に存在確認すると「存在しない」

# 概要

bat → powershell → cmd → mklink の流れでシンボリックリンクを作った直後に、
bat内でシンボリックリンクの存在確認(if exist)すると「存在しない」(false)になってしまうことがありました。

powershell.exe の引数に `-Wait` を入れて cmd の完了を待てば解決しました。


# 存在確認(if exist)すると「存在しない」(false)になった実装

※ 環境によるかもしれない。

```bat:check_symbolic_link.bat
@echo off

set TARGET="C:\workspace\to_dir"
set SOURCE="D:\from_dir"

REM シンボリックリンクがある場合は削除する
if exist %TARGET% (
  rmdir %TARGET%
  echo %TARGET% を削除
)

echo シンボリックリンク %TARGET% を作る
powershell.exe -Command Start-process "cmd" -ArgumentList "/C", "mklink", "/D", %TARGET%, %SOURCE% -Verb Runas

REM シンボリックリンクをチェックする
if exist %TARGET% (
  echo %TARGET% がある
) else (
  echo %TARGET% がない
)
```


`check_symbolic_link.bat` を実行してみます。

```
> check_symbolic_link.bat
"C:\workspace\to_dir" を削除
シンボリックリンク "C:\workspace\to_dir" を作る
"C:\workspace\to_dir" がない
```

なんと「**"C:\workspace\to_dir" がない**」 が出力される。 
※ if exist %TARGET% がfalseになってしまう。。。


# 原因の推測

powershellはcmdを起動できたら batに制御を戻してしまう様子。
そのおかげで、batがmklinkの完了前にさっさとif existで確認してしまうから
・・・だと思われる

# 対策

powershell.exe の引数に `-Wait` を入れると「[起動するプロセスが終了するのを待つ](http://yanor.net/wiki/?PowerShell%2F%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%AE%A1%E7%90%86%2FStart-Process)」動作になるので、それを利用します。

副作用でpowershellから起動したcmdの画面が見えてしまうが、if existが安定したのでOKとした。


```bat:check_symbolic_link_fix.bat
@echo off

set TARGET="C:\workspace\to_dir"
set SOURCE="D:\from_dir"

REM シンボリックリンクがある場合は削除する
if exist %TARGET% (
  rmdir %TARGET%
  echo %TARGET% を削除
)

echo シンボリックリンク %TARGET% を作る
powershell.exe -Command Start-process "cmd" -Wait -ArgumentList "/C", "mklink", "/D", %TARGET%, %SOURCE% -Verb Runas

REM シンボリックリンクをチェックする
if exist %TARGET% (
  echo %TARGET% がある
) else (
  echo %TARGET% がない
)

```

`check_symbolic_link_fix.bat` を実行してみます。

```
>check_symbolic_link_fix.bat
"C:\workspace\to_dir" を削除
シンボリックリンク "C:\workspace\to_dir" を作る
"C:\workspace\to_dir" がある
```

安定して "C:\workspace\to_dir" がある・・・となった。


# 参考

[管理者権限でbatを実行したい時にやッた事 - Qiita](https://qiita.com/resolver/items/7187bd6ee8016ee5c741)
[Windowsでシンボリックリンク作成@非管理者権限環境 - Qiita](https://qiita.com/0x60df/items/ca0e609058c4e8921bd9)
Rubyでbitcoinの自動売買システム作成メモ

bitflyerのAPIを使用して板情報を取得したのは良いけど、ターミナル上は
{"price":2800000.0,"size":0.2}]}
こんな感じでJSON表示になっているから見やすくしていく。

（ちなみにJSONとは、JavaScript Object Notationで、データ記述言語の一種。
構造化したデータを表している。）

requireで'json'を追加することでJSONに関するプログラムを扱えるようにする。
↓↓↓

```ruby
require 'net/http'
require 'uri'
require 'json'

uri = URI.parse("https://api.bitflyer.com")
uri.path = '/v1/getboard'


https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
response = https.get uri.request_uri
puts response.body
```

次に、JSONをハッシュ表示にする。
変数 = JSON.parse(response.body)
と追加することでJSONをハッシュに変換する。
さらに、
puts 変数["知りたい値段"]
にすることで自由に値を取り出せる。
↓↓↓

```ruby
require 'net/http'
require 'uri'
require 'json'

uri = URI.parse("https://api.bitflyer.com")
uri.path = '/v1/getboard'

https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
response = https.get uri.request_uri
puts response.body
response_hash = JSON.parse(response.body)
puts response_hash["mid_price"]
```
Could not find nokogiri-1.10.4 in any of the sources

rails new　をした後でデータベースを作成しようとしたらエラーが出たので記録を残す。

```
$ bundle exec rake db:create
```
以下のメッセージが出現。

```
Could not find nokogiri-1.10.4 in any of the sources
Run `bundle install` to install missing gems.
```
次にこのコマンドを入力

```
$ rbenv exec gem install bundler
```

```
$ rbenv rehash
```

```
$ bundle install
```

改めて次のコマンドを入力する。

```
$ bundle exec rake db:create
```

```
Created database 'ディレクトリ名_development'
Created database 'ディレクトリ名_test'
```
できた！！！
Python module for Ocean Optics spectrometersのインストール方法

PythonからOcean Opticsの分光器を制御しなければならなくなり、モジュールのインストールの覚えとして記載しておきます。
詳しくは、https://python-seabreeze.readthedocs.io/en/latest/

### Install 環境
Win10 Pro
Ocean optics USB2000+ 分光器
Anaconda インストール済み
IDEとしてVS Codeを使用しました。

### Install方法
Anacond promptを開いて
conda で仮想環境を作る　Pythonのバージョンは3.6
(2022年12月時点、python=3.9で動作しました。）

    conda create -n ocean python=3.6

-n　の後は　仮想環境の名前。　ここではoceanとしている。
仮想環境へのPythonのインストールが終了したら、作成した仮想環境に移動する。

    conda activate ocean

仮想環境に移動すると

    (ocean)C:\...

と表示される。
その仮想環境で手順に従ってインストール

    conda install -c conda-forge seabreeze

一通りのインストールが終わったら
https://github.com/ap--/python-seabreeze/tree/master/os_support
にある
windows-driver-files.zip
をダウンロードし、解凍する。
解凍したファイルがあるところのディレクトリーに移動する

例えば、C:\Users\・・・\Downloads\windows-driver-filesに解凍ファイルがあるならば

    cd C:\Users\・・・\Downloads\windows-driver-files

そのあとに

    pnputil -i -a *.inf

を実行する。
そうするとデバイスセットアップファイルがインストールされる。
*のところにインストールしたいデバイス名にするとそのデバイスだけインストールされる。
うまくインストールできない場合は、管理者権限で試してください。

分光器を接続する。（USB接続）
### 動作テスト
```python
    ## ocean_test.py
    
    import matplotlib.pyplot as plt
    from seabreeze.spectrometers import Spectrometer
    
    spec = Spectrometer.from_first_available()
    spec.integration_time_micros(20000)
    
    print(spec.wavelengths())
    print(spec.intensities())
    
    plt.plot(spec.wavelengths(),spec.intensities())
    
    plt.show()
```
このプログラムを実行して測定ができているか確認する。
グラフが表示されればちゃんと動いている。
vue.jsでリストレンダリング

#vue.jsでリストレンダリングをやってみる

vue.js側に設定した配列に格納された要素全てをテンプレート側にレンダリングして表示する。
ブラウザ場でjsの実行環境を利用できるサービス [jsfiddle](https://jsfiddle.net/5ypmk8rq/32/) を利用する。

##基本形

dataプロパティ内の要素をv-forディレクティブで表示する。

>配列に基づいて、アイテムのリストを描画するために、v-for ディレクティブを使用することができます。v-for ディレクティブは item in items の形式で特別な構文を要求し、items はソースデータの配列で、item は配列要素がその上で反復されているエイリアスです:
>>https://jp.vuejs.org/

上記vue公式にある通り、v-forディレクティブを利用する場合は、`配列要素を代入する変数 in 配列名`となる



```html
<div id="app">
<ul>
  <li v-for="item in items">{{item}}</li>
</ul>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
```

```js
var app = new Vue({
	el:'#app',
  data:{
    items:["item1", "item2", "item3"]
  }
})
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339446/e07260c3-6ef9-beb4-2426-60ac11069cc7.png)




##配列に格納されたオブジェクトのキーを指定して表示する。
使い所すくなそう

```html
<div id="app">
<ul>
  <li v-for="item in items">{{item.message}}</li>
</ul>
</div>
```

```js
var app = new Vue({
	el:'#app',
  data:{
    items:[
    	{message: 'foo'},
        {message: 'var'}
    ]
  }
})
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339446/62589a41-c7c1-9c73-8306-e8c1f2d86d16.png)


##リストレンダリングの結果に配列の添字を表示する

`(配列要素を代入する変数, index) in 配列名`とすることで`index`に添字を代入できる

```html
div id="app">
<ul>
  <li v-for="(item, index) in items">{{item.message}} {{index}}</li>
</ul>
</div>
```

```js
var app = new Vue({
	el:'#app',
  data:{
    items:[
    	{message: 'foo'},
      {message: 'var'},
      {message: 'hoge'},
      {message: 'hogege'}
    ]
  }
})
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339446/96c6a8c7-aed6-1356-015e-2d697dca3aed.png)

##オブジェクトの要素をリストレンダリングする
基本的には配列の場合と同様に`(オブジェクトのvalueを代入する変数) in オブジェクト名`と書く

```html
<div id="app">
<ul>
  <li v-for="value in objects">{{value}}</li>
</ul>
</div>
```

```js

var app = new Vue({
	el:'#app',
  data:{
    objects:{
    	object1: 'foo',
      object2: 'var',
      object3: 'hoge',
      object4: 'hogege'
    }
  }
})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339446/bad5d5ae-9243-d6ff-2c41-2d7ed2fad686.png)

##オブジェクトのキー名とvalueを併せてリストレンダリング

```html
<div id="app">
<ul> 
  <li v-for="(value, index) in objects">{{index}}:{{value}}</li>
</ul>
</div>
```

```js

var app = new Vue({
	el:'#app',
  data:{
    objects:{
    	object1: 'foo',
      object2: 'var',
      object3: 'hoge',
      object4: 'hogege'
    }
  }
})
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339446/db46e58e-91da-69ab-7530-91676f4ae20c.png)
APRS Igateをラズベリーパイで構築した

こんにちは

いくつか前に類似した記事を書きましたが、その続きという事で書きます。

アマチュア無線とインターネットを繋ぐAPRSというプロトコルがある事を書きました。

ラズパイで組むと、低消費電力で、かつPCと同じ機能、ラズパイ3B以上のスペックだと、WIFIで、無線機を繋ぐコードと電源コードだけで、できてしまうという、非常に便利なものです。

私は、ラズパイ3Bに、OSはRaspbian Buster、そこにAX25toolsを入れ、souundmodemを動かして、安価に売っているCM108のUSBサウンドカードをソフトウエアモデムにして動かしています。

家族に理解が少ないので、自分で秋月電子の電源キットに無線機で使っている安定化電源を繋いでラズパイに供給しています。ほぼほぼ自己完結させているという方法をとっています。

一応、安定化電源にバッテリーと太陽電池をつないでいるので、ある程度は停電になっても大丈夫かなと。
非常通信にも使えれば御の字かもと思っています。

心配していた電源ノイズも少なく、快調に動いています。
無線機は聞くだけなので、昔のアナログ的な(CPUを使っていない)ものを敢えて選択しています。こういう、CPUを使っている無線機は、停電になると、挙動不審になったりする場合があるので、そうしています。

送信すると、スプリアスとか問題になります(採用したのはクリアしているようですが)。

あと、電波法では送信出来なくすることとか、そういった規定がありますが、送信出来ない様に、マイクコネクタには何もつけていません(PTTの線を切っていないので、これから申請するつもりですが)。

古い感じのするアマチュア無線ですが、一度資格を取得して、開局すると、自由度が広がります。ご興味のある方は、トライしてみたら如何ですか？

この記事が、何かの参考になれば幸いです。
初めてのホームページ開発手記 part2 Bootstrapとejsでページを作る

## ここまでの前提条件  
- xUbuntuのインストール完了
- node.js, Expressのインストール完了
- Express Generatorでプロジェクトディレクトリを作成済み


## Bootstrapの導入とトップページの作成

### Bootstrapの配置
1. [Start Bootstrap](https://startbootstrap.com/)からよさげなテンプレートをダウンロードする  

1. [PROJECT]/publicフォルダ配下にcss, vendorフォルダをコピー。

### ヘッダー, フッターの作成  
今回はejsでページを生成する。  
メンテナンス性を考慮し、ヘッダーとフッター部分は部品として別々に作成する  

1. [PROJECT]/views 配下に 「partials」フォルダを生成する  
1. 「partials」フォルダ内にheader.ejs, footer.ejsファイルを作成する
1. header.ejsの中身、body開始タグ までを書いておく  

    ```html 
    <!DOCTYPE html>
    <html lang="ja">
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
      <meta name="description" content="">
      <meta name="author" content="">

      <title>title</title>

      <!--
       必要なヘッダー情報を記述する
       Start Bootstrap のtemplateのヘッダー部分をコピーすると簡単に作れる  
      -->
      </head>
    <body>
    ```

1.  footer.ejsの中身, bodyタグ、htmlタグを閉じる

    ```html
        <!-- Footer  -->
        <footer >
            <!--
       必要なフッター情報を記述する
       Start Bootstrap のtemplateのフッター部分をコピーすると簡単に作れる  
      -->
            <p >Copyright XXX</p>
        </footer>
        </body>
    </html>
    ```

### トップページの作成
1. [PROJECT]/views/index.ejsからヘッダー、フッターを使用するにはincludeを記述すればよい  

    ```html
    <%- include('partials/header'); %>

      <!-- Page Content -->
      <h1>見出し</h1>
        <p>本文</p>
         
    <%- include('partials/footer'); %>
    ```

1. 以上のような形にしておけば、ヘッダー、フッターのメンテナンスが非常に楽になる。

1. Start Bootstrapのテンプレートページを使用すると、一瞬でモダンなホームページができました。<br>あとはこれをベースに自分のページ用に編集していけばよさそうです。
Goの変数について

##Goの変数宣言について

###基本的な（一番丁寧な）書き方
`var 変数名 型 = 代入値`の順番で書く

```go
 var i int = 0
 var s string = "0"
 var b bool = true
```

###省略した書き方
`var 変数名 = 代入値`の順で書く
代入値によって型を推測してくれる

```go
 var i = 0
 var s = "0"
 var b = true
```

###さらに省略した書き方
`変数名 := 代入値`の順で書く
もはやvarすらいらない

```go
 i := 0
 s := "0"
 b := true
```
[Excel]簡易な勤務報告書の作成

#Excelを使った簡易な勤務報告書を作成
※皆様のためというより…私の仕事量を減らすために記述します。
各会社や書式によってさまざまな方法がございます。
当勤務表は、省力化を目的としているものです。

##■要件概要
#####日付を何個も入力したくない
#####曜日を何個も入力したくない
#####休憩時間は自動で入力してほしい
#####現状の勤務時間の累計、残業時間の累計をすぐ出したい
#####現状の状態だと、勤務時間累計がどのくらいになるのか、残業がどのくらいになるのかを知りたい

##こんな感じにする
![勤務表_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490393/58331f2a-9415-25f5-24c5-9a1163c1a276.png)

###【１　日付】
![勤務表_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490393/024631cc-c65f-de1b-e483-24b93d174469.png)

B2に　2019/10/01 と、月の先頭の日付を入力します。書式設定にて　YYYY年MM月の形式で表示します。
B6は　≂B2　を入力し、書式設定にて、　MM/DD の形式で表示します。

#####　★日付の加算
#####　★次月の日付の非表示

B7　は　=IF(MONTH(B6+1)=MONTH($B$2),B6+1,"")
B8～B36はB7をコピー、書式設定にて、　MM/DD の形式で表示します。

これで、B2に初期日付を入れれば、自動で、日付を全部うめてくれます。

###【３　曜日・祭日】
![勤務表_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490393/e19764f2-538d-1408-d3cb-ef3fc3ad5d8e.png)

C列は曜日を設定します。

#####　★B列の同行が空白だったら、空白
#####　★B列の同業に何かあったら、曜日表記で記入

C6列　=IF(B6="","",TEXT(B6,"aaa"))
C7~C36はC6をコピー

祭日用のリストを別シートに用意します　祭日シートのB列に今年の祭日の日付を記入しています。

B17　2019/10/14
B18　2019/10/22
B19　2019/11/4
B20　2019/11/23

#####　★B列の同行の値が、祭日に当てはまったら　祝　を表示
#####　★C列の同行の値が、日、土だったら、休　を表示　※重なってもOK

D6　 = =IF(COUNTIF(祭日!B:B,B6)=1,"祝","")&IF(C6="日","休","")&IF(C6="土","休","")
D7～36はD6をコピー

###【４　休憩時間】
![勤務表_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490393/c245a4ef-763f-f9ff-4b1c-c1de45d09582.png)

こちらについては、開始業務時間やフレックス等にて影響しますので手で記入したほうが速い可能性もあります。

L列16行目　に12：00
L列17行目　に20：00　と記載しています。

#####　★始業時間が空白の場合、空白
#####　★始業時間が12：00よりも前の場合、休憩時間が60分、終業が22：00以降の場合90分
#####　★始業時間が12：00よりも後の場合で終業が22：00以降の場合30分

G6　=　IF(E6="","",IF(F6>L$17,IF(E6<L$16,"90","30"),IF(E6<L$16,"60","0")))
G7～G36 はG6をコピー

###【５　勤務時間】

#####　★始業時間が空白の場合、空白
#####　★終業時間　－　始業時間　－　休憩時間　を表示する

H6　=IF(F6="","",F6-E6-G6/(60*24))
H7～H36 はH6をコピー

###【６　集計】

![勤務表_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490393/51913b8a-b6ae-9597-9416-dd21e5ad5358.png)

L列15行目に
1日の所定労働時間　に　所定労働時間を記入しておきます。

#####　★一日の所定労働時間から、勤務実績、残業実績の集計

勤務実績　L5=SUM(H6:H36)*24
残業実績　L6=L5-COUNT(H6:H36)*L15

#####　★休日、日付から営業日数の集計

営業日数　L8=COUNT(B6:B36)-COUNTIF(D6:D36,"祝")-COUNTIF(D6:D36,"休")

#####　★働いた日数の集計

実績日数　L8=COUNT(H6:H36)

休暇日数　L9≂　公休日以外でお休みする日数を入力

#####　★営業日数、実績から平均をだし、予測を単純計算
#####　★勤務予測から残業時間の予測を単純計算

勤務予測　L12=SUM(H6:H36)*24/COUNT(H6:H36)*(L8-L10)
残業予測　L13=L12-(L8-L10)*L15

以上でございます。
【Jackson】多態性に対応してマッピングする【Kotlin】

# やること
フロントから`POST`された`JSON`をデシリアライズする場面を想定し、多態性を持つ以下のようなクラスに対してマッピングを行います。

```kotlin
sealed class Abstract {
    data class Hoge(val hoge: String?): Abstract()
    data class Fuga(val fuga: Int?): Abstract()
}
```

## 環境
`Kotlin`は1.3.50、`Jackson`は2.9.10でやっています。

## 手法
今回は以下の2つの方法を紹介します（これ以外の手段も有りますがこの記事では紹介しません）。

1. プロパティの値からマッピングする方法
2. プロパティの有無からマッピングする方法

個人的には、「フロント側で選択した結果によって`POST`内容を変えたい」時は1を、「サーバーサイドの都合で型を振り分けたい場合」は2を使うのがいいと思っています。
ただし、マップ対象が複雑なオブジェクトの場合この記事で紹介する2のやり方では大変なので、その場合は他の方法を探した方がいいと思います。

# プロパティの値からマッピングする方法
まず特定プロパティの値から型にマッピングする方法です。
`JsonTypeInfo`と`JsonSubTypes`を使い、以下のように書くことで、`JSON`の`option`プロパティの値に対応した型にマッピングできるようになります。

`property = `を書き換えてやれば、どのプロパティを見に行くか変えることができます。

```kotlin
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "option", defaultImpl = NoClass::class)
@JsonSubTypes(
        JsonSubTypes.Type(value = Abstract.Hoge::class, name = "hoge"),
        JsonSubTypes.Type(value = Abstract.Fuga::class, name = "fuga")
)
sealed class Abstract {
    data class Hoge(val hoge: String?): Abstract()
    data class Fuga(val fuga: Int?): Abstract()
}
```

```javascript:デシリアライズ対象のJSON例
abstract: {
  option: "hoge",
  hoge: "ほげ"
}
```

このやり方は型を示すプロパティが1つ増えるという特徴があります。
このため、フロント側で選択肢によって`POST`内容を変えるような場合に適したやり方だと思っています。

# プロパティの有無からマッピングする方法
次に、プロパティの有無から型にマッピングする方法です。
`JsonCreator`を使って以下のように書くことで、`JSON`内のプロパティの有無に応じてマッピングすることができます。

```kotlin
sealed class Abstract {
    data class Hoge(val hoge: String?): Abstract()
    data class Fuga(val fuga: Int?): Abstract()

    companion object {
        @JvmStatic
        @JsonCreator
        fun jsonCreator(json: Map<String, String?>?): Abstract? {
            return json?.let {
                when {
                    it.containsKey("hoge") -> Hoge(it["hoge"])
                    it.containsKey("fuga") -> Fuga(Integer.parseInt(it["fuga"]))
                    else -> null
                }
            }
        }
    }
}
```

```javascript:デシリアライズ対象のJSON例
abstract: {
  hoge: "ほげ"
}
```

フロント側はオプショナルな入力が有り得る内容で、サーバーサイドでその入力に応じた型の振り分けをするような場合に適したやり方だと思っています。
ただし例の通り、文字列 -> 型へのマッピング処理は関数内で手動でやる必要があるため、マップ対象が複雑なオブジェクトの場合手間が大きいです。

# 参考にさせていただいたサイト
- [Java : Jackson による JSON デシリアライズ時の型解決方法 \| TECHSCORE BLOG](https://www.techscore.com/blog/2016/06/17/java-jackson-polymorphic-deserialization/)
さくらのクラウドでアーカイブのゾーン間転送を低コストかつ高速に行う方法（APIを利用）

## はじめに
さくらのクラウドは、アーカイブ（スナップショット）のゾーン間転送に対応していますが、現時点（2019年10月5日時点）における公式な手順としては、コントロールパネル上から行う方法しかなく、APIのみでゾーン間転送を行う方法がありません。

代替となる方法はありますが、その手順は非常に冗長かつコスト高なものとなっています。具体的には次のような手順で行うことになります。

１．転送元ゾーンでアーカイブを作成する
２．アーカイブのFTP転送(FTPS)を有効化する
３．転送先にバックアップサーバのようなものを用意し、FTPでアーカイブをダウンロードする
４．バックアップサーバから転送先ゾーンへアーカイブをアップロードする
５．アーカイブのFTP転送(FTPS)を無効化する

以下のURLがイメージ掴みやすいでしょう。

- https://qiita.com/Kaz_Macintosh/items/c2706e8b19d3ecaee001
- http://febc-yamamoto.hatenablog.jp/entry/sacloud_bpc_backup

この手順の問題点は、アーカイブファイルを一時的に処理（ダウンロード、アップロード）するための中間サーバが必要なことです。

まず、一旦ファイルをダウンロードして、アップロードするという手順がボトルネックとなります。ダウンロードとアップロードという余計な処理が発生するため、コントロールパネル上からゾーン間転送を行った場合と比較して、およそ3倍以上の処理時間が必要となります。例えば、1TBのような大容量のアーカイブイメージの場合、1日以内に処理が完了しない恐れがあります。

また、中間サーバを用意しなければならないという点がコストになります。例えば、1TBのような大容量のアーカイブイメージをを転送する場合は、2TB以上のディスクを中間サーバ上に用意しておく必要があります。特に、さくらのクラウドの場合、ディスク（ボリューム）の料金が高額ですので、このコストは無視できません。特に、AWSなどのメガクラウドのすなっぷしょを普段より利用している場合、高いなーと感じると思います。

公式な手順としては上記のとおりで、このままでははっきり言って実用に耐えないのですが、実はさくらのクラウドは既にAPIによるアーカイブのゾーン間転送に対応しています。非公式な手順ではありますが、その手順について、以下で解説します。

## 手順

cURLの場合は、以下のコマンドを実行します。

```
curl -X POST \
        --user "<アクセストークン>:<アクセストークンシークレット>" \
        -d "{\"Archive\":{\"Name\":\"<転送元アーカイブ名>\",\"Description\":\"\",\"Tags\":[],\"SizeMB\":<転送元アーカイブサイズ(MB)>,\"Icon\":{}},\"Count\":0}" \
        <転送元API URL>archive/<転送元アーカイブID>/to/zone/<転送先ゾーンID>

```

### 入力値について

#### アクセストークン
さくらのクラウドコントロールパネルのホーム画面の「API」キーより確認可能です。

#### アクセストークンシークレット
さくらのクラウドコントロールパネルのホーム画面の「API」キーより確認可能です。

#### API URL(エンドポイント)
https://developer.sakura.ad.jp/cloud/api/1.1/ より

https://secure.sakura.ad.jp/cloud/zone/tk1a/api/cloud/1.1/ (東京第1ゾーン)
https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/ (石狩第1ゾーン)
https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/ (石狩第2ゾーン)
https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/ (Sandbox)

### アーカイブID, アーカイブ名

さくらのクラウド コントロールパネルの各ゾーンの「アーカイブ」の一覧より、アーカイブを選択し「詳細」をクリックすることで確認可能です。

または、以下のコマンドで確認可能です。（usacloudがインストールされていること）
「Name」キーの値がアーカイブ名、「SizeMB」キーの値がアーカイブサイズ(MB)となります。

```
$ usacloud --zone <ゾーン名> archive ls --scope user
```

なお、ゾーン名は以下のコマンドで確認可能です。
Nameというキーに対応する値がゾーン名となります。

```
$ usacloud zone
```

### ゾーンID

以下のコマンドで確認可能です。（usacloudがインストールされていること）
IDというキーに対応する値がゾーンIDとなります。

```
$ usacloud zone
```


## 注意点
さくらのクラウドのアーカイブ機能は、アーカイブ作成やアーカイブのゾーン間転送が、１ゾーンあたり同時４実行までしか行なえません。（４つを超えてアーカイブ作成やゾーン間転送を行うとエラーになります）

このため、cronなどで自動実行させたい場合は、アーカイブの実行状況（同時実行数）を定期的に確認のうえ、処理を進める必要があります。

例えば、処理前に次のようなスクリプトを実行し、次のコードを実行することで、実行数が超過する場合は処理待ちとする等の工夫が必要となります。

```
while [ `usacloud --zone tk1a archive ls --scope user | jq .[].Availability |grep -e transfering -e migrating | wc -l` -gt 2 ]
do
        echo "Waiting Jobs..."
        sleep 600
done
```

## 最後に

本手順はさくらのクラウドの公開APIとして用意されている（公式ドキュメント等に記載されている）ものではありません。コントロールパネルからアーカイブのゾーン間転送を行う際の出力結果をもとにしています。

（コントロールパネル上から確認できますので）完全な非公開APIというわけではありませんが、公式でもありませんので、APIの仕様変更や、APIの機能制限等により、予告なしに本機能（API）が利用できなくなる場合も可能性として考えられますので、その点予めご理解ください。
【Swiper】オプションが全然反映されない。。バージョンが古いからでは？

仕事で制作担当しているサイト、使用しているswiperのバージョンがことごとく古い問題。。
swiperの使い方をググっても、大抵最新の記述で出てくる。
そして古いバージョンでの記述について、情報が少ない。。（私のググり方の問題でしょうか…）

APIを見ればいいのですが、英語なのでどうしてもとっつきにくいなぁと感じる人も多いはず。
特に私のような経験の浅い人にとっては。

**API**
- [Swiper 2.x](https://github.com/nolimits4web/Swiper/blob/Swiper2/API.md)
- [Swiper 3.x](https://github.com/nolimits4web/Swiper/blob/Swiper3/API.md)
- [最新API](https://swiperjs.com/api/)

***


てことで、下記に使用頻度の高めなオプションで注意が必要なものを挙げてみます。

※ここでいう古いバージョンとは、3.x系以前という感じです。
※恐らく**3.x系以前**と**4.x系以降**で記述の仕方が変わっている？（違かったらすみません）


# 注意が必要なオプション例
## ナビゲーション
3.x系以前

```JavaScript
var mySwiper = new Swiper('.swiper-container', {
  nextButton: '.swiper-button-next',
  prevButton: '.swiper-button-prev',
});
```

4.x系以降

```JavaScript
var mySwiper = new Swiper('.swiper-container', {
  navigation: {
    nextEl: '.swiper-button-next',
    prevEl: '.swiper-button-prev',
  }
});
```

## ページネーション
3.x系以前

```JavaScript
var mySwiper = new Swiper('.swiper-container', {
  pagination: '.swiper-pagination',
  paginationClickable: true,
});
```

4.x系以降

```JavaScript
var mySwiper = new Swiper('.swiper-container', {
  pagination: {
    el: '.swiper-pagination',
    clickable: true,
  }
});
```


## 自動再生
3.x系以前

```JavaScript
var mySwiper = new Swiper('.swiper-container', {
  autoplay: 5000,
  autoplayStopOnLast: true,
});
```

4.x系以降

```JavaScript
var mySwiper = new Swiper('.swiper-container', {
  autoplay: {
    delay: 5000,
    stopOnLastSlide: true,
  }
});
```



などなど他にもたくさんあるのですが、多くの人がよく使用するのはこのあたりかと！
何かの参考になれば。


# 参考サイト
きっとこのサイトにお世話になっている人はかなりいることでしょう。
swiperについてググると大体このサイトにたどり着きますね！
私自身、旧バージョンの記述については大体このページから学びました。

→ [swiper.js使ってみたからそのオプションについて](http://reiwinn-web.net/2016/11/30/swiper-js-01/)
初めてのホームページ開発手記 part1 node.js + express 開発環境を作る

## 目的
- windows10上にVirtualBox + xUbuntu18.04環境を構築し、<br>ホームページ開発のためのnode.js, Expressをインストールしてみます。  

## Virtual Box + xUbuntu環境構築
### OSインストールまで
- Virtual Boxのインストールは省略、インストーラーと拡張パックインストーラ落として入れておく。  
- xUbuntuはここから[公式サイト](https://xubuntu.org/download#lts)に行き、Mirrorサイト Japanからisoファイルをダウンロードする。公式サイトからだと.torrentファイルになるので注意。
- Virtual Box > 新規 から仮想マシンを追加し、isoファイルをストレージにセットして、xUbuntuをインストール。細かい手順はほかの記事でたくさんあるので省略。

### OSインストール後の各種設定
#### Virtual Box Guest Addonsのインストール
これをしないとスクリーンサイズとかを変更できない。

1. xUbuntuを起動
1. Virtual Box デバイスメニュー > Guest Addons CDイメージの挿入
1. xUbuntu側で端末を起動し、インストール  

    ```bash
    cd /media/[username]/VBox_GAs_x.x.xx
    sudo ./VBoxLinuxAdditions.run
    sudo reboot
    ```

1. インストール後はメディアを取り出ししてよい。
1. Virtual Box 表示タブ > 仮想スクリーン で好みのスクリーンサイズにする
1. Virtual Box デバイスタブ > ドラッグ&ドロップ を双方向に変更 
1. Virtual Box デバイスタブ > クリップボードの共有 を双方向に変更
1. ホストOSとの共有フォルダを使用する場合の権限を追加するために、ユーザーをvboxsfグループに追加。作業後はリブートしておいた方が良い。

    ```bash
    sudo gpasswd -a <ユーザ名> vboxsf
    ```

1. とりあえずまっさらなLinux環境として、この仮想マシンをCloneしておいて保存しておくとよいよ。 



#### パッケージのアップグレード  

```bash
sudo apt update
sudo apt upgrade
```

#### VSCodeのインストール

snap packageでインストール可能。
```bash
sudo snap install --classic code 
```

- 拡張機能から以下を追加しておく。 
    - Japanese Language Pack for Visual Studio Code


### node.jsのインストール
[ここ](https://github.com/nodesource/distributions/blob/master/README.md) の「Debian and Ubuntu based distributions」を参考にインストール。
xUbuntuは正式サポートされてないっぽいけどたぶん動くよね・・・。  

1. 端末からインストールしていく。

    ```bash
    # curlが必要なので先に入れる
    sudo apt install curl

    # 今回は最新のv12を入れる
    curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash 
    sudo apt-get install -y nodejs

    # ビルドツールのインストール 
    sudo apt-get install gcc g++ make
    sudo apt-get install -y build-essential

    # 最後にバージョン確認
    node -v
    # v12.10.0 でした。
    ```

### Expressのインストール
[公式](https://expressjs.com/ja/starter/installing.html)を参考にインストールしていく。  

1. ワークスペースディレクトリを作成し、移動

1. ディレクトリ構成を統一するためにgeneratorをインストール

    ```bash
    sudo npm install -g express-generator
    ```
1. プロジェクトフォルダを自動生成する<br>これにより自動的にpackage.jsonやapp.jsが自動生成される。<br>-eはEJSというテンプレートの仕組みを使用する、というオプション。

    ```bash
    express -e [PROJECT]
    
    # [PROJECT]/配下に以下のファイル、ディレクトリが制せされる
    # app.js  bin  package.json  public  routes  views
    ```

    細かいディレクトリの構成の解説は[こちら](https://qiita.com/nkjm/items/2016e331f74f1b8ab465)の記事がわかりやすかったです。

1. npm installで必要なパッケージをダウンロード

    ```bash
    npm install 
    ```

1. とりあえず起動するか確認。

    ```bash
    npm start

    # http://localhost:3000/ にアクセスしてみてページが表示されればOK  
    ```
SAP Cloud PlatformのABAPトライアル環境を触ってみる(1.初期設定編)

#はじめに

SAP TechEd 2019 ラスベガスの開催と同時に、以前より予告されていた SAP Cloud Platform 上でのABAPトライアル環境がオープンしました。
待ってました:nerd:

ということで、SAP公式チュートリアルを参考に、ABAPトライアル環境を触ってみたいと思います。

#チュートリアルを始める前に
###環境について
以下の公式ブログを参考にしてください(他にもたくさんあります)
[It’s Trial Time for ABAP in SAP Cloud Platform](https://blogs.sap.com/2019/09/28/its-trialtime-for-abap-in-sap-cloud-platform/)

###SAP Communityの登録
チュートリアルの実績管理に必要です。
グローバル共通の自己紹介ページにもなりますので、ぜひ登録を。
[【参考】SAP Communityのメンバー登録方法について](http://www.sapsumikko.jp/entry/2019/06/24/sap-community-registration)

#今回使用するチュートリアル
2019/10/05時点のチュートリアル(SAP公式)をもとに書きます
チュートリアルの説明が基本的にはわかりやすいため、私が躓いたところや、気になった箇所のみ記載していこうと思います。

今回の参照元チュートリアルはこちら↓。こちらを見ながら当記事を読んでください。
[Create an SAP Cloud Platform ABAP Environment Trial User](https://developers.sap.com/tutorials/abap-environment-trial-onboarding.html)

※当チュートリアルの前提条件として、SAP Cloud Platform のアカウントが必要となります。まだアカウントがない方はこちらを参考に登録を。
[Get a Free Trial Account on SAP Cloud Platform](https://developers.sap.com/tutorials/hcp-create-trial-account.html)

#Step 1: Select ABAP Trial & Step 2: Configure SAP Cloud Platform Entitlements

ここでいきなりひっかけです。

Step1は、ABAP Trialのタイルを選択する方法について説明。
Step2は、ABAP Trialのタイルを表示させる設定について説明。

はじめて ABAP Trial環境を触る人は、Step2から始めてください。
![abaptrial.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/3807de2f-5f37-f2b2-c989-4d3981d2d2cc.jpeg)

#Step 3: Create instance
こちらはチュートリアル通りで。

#Step 4: Create service key
こちらも。

#Step 5: Open ABAP Development Tools
2019/10現在では、SAP TechEdでローカル端末に設定してあるEclipseを指定するようになっています。
手元にABAP in Eclipseがない方は、[こちら](https://tools.hana.ondemand.com/#abap)からADTをダウンロード&Eclipseに設定してください。

※参考　[SAP ABAP Development Tools in Eclipseのセットアップ](https://qiita.com/mahko2/items/7d287bc5794e38b732ef)



#Step 6: Create ABAP cloud project
こちらでは、Step4で生成した service key を使用します

#Step 7: Test yourself
ご自分で♪


初期設定編、以上です。
CoreDataでAttributeをTransformableにした際のエラー対処

# 環境
Xcode 11.0
Swift 5.1

# エラー
CoreDataでEntityのAttributeを `Transformable` として，シミュレータを走らせると

>
One or more models in this application are using transformable properties with transformer names that are either unset, or set to NSKeyedUnarchiveFromDataTransformerName. Please switch to using "NSSecureUnarchiveFromData" or a subclass of NSSecureUnarchiveFromDataTransformer instead. At some point, Core Data will default to using "NSSecureUnarchiveFromData" when nil is specified, and transformable properties containing classes that do not support NSSecureCoding will become unreadable. ...
>

とエラーが出てしまいました。

# 解決策
エラーの出力通りに対処をおこないました。
`XXX.xcdatamodeld` で Typeを `Transformable` にしたAttributeを選び， Transformerを `NSSecureUnarchiveFromDataTransformer` とします。

<img width="939" alt="スクリーンショット 2019-10-05 17.08.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297735/e93ba38e-d1dc-27ca-0b94-20a8bb8e174f.png">
[自分用メモ]面倒な計算不要！楽チン要素の横並び

1列●個の要素を横並びにしたいとき、widthが・・・、marginが・・・と面倒な計算をすることなく、カンタンにレスポンシブ対応の横並びが組める方法をメモ。

#例えば1列2個の場合
##html

```html:
    <div class="itemBox">
      <div class="itemBox__inner">

        <div class="item">
          <div class="itemInner">ITEM</div>
        </div>
        <div class="item">
          <div class="itemInner">ITEM</div>
        </div>
        <div class="item">
          <div class="itemInner">ITEM</div>
        </div>
        <div class="item">
          <div class="itemInner">ITEM</div>
        </div>
        <div class="item">
          <div class="itemInner">ITEM</div>
        </div>
        <div class="item">
          <div class="itemInner">ITEM</div>
        </div>
        <div class="item">
          <div class="itemInner">ITEM</div>
        </div>

      </div>
    </div>
```

##css

```css:
*, *:before, *:after {
  -webkit-box-sizing: border-box; 
  box-sizing: border-box;  
}
.itemBox {
  width: 900px;
  margin: 20px auto;
}
.itemBox__inner {
  display: flex; 
  flex-wrap: wrap;   
  margin: 0 0 0 -60px; 
}
.item {
  width: 50%;
  padding: 0 0 60px 60px;
}
.itemInner {
  color: #FFF;
  height: 200px;
  padding: 20px;
  background-color: #444;
}
```
#ポイント
##1.  box-sizing: border-box;
box-sizing: border-boxで、paddingとborderを幅(width)と高さ(height)に含めることができる。
paddingを要素と要素の余白として考える。
上記の例でいうとココ

```css:
.item {
  width: 50%;
  padding: 0 0 60px 60px;
}
```
![figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287877/73c22888-00c8-c090-355c-e6fe13b25f12.png)

1列2個並び・・・ 50%
1列3個並び・・・ 33.3%
1列4個並び・・・ 25%
1列5個並び・・・ 20%


box-sizing: border-boxについては、この記事にわかりやすく書かれている。
https://saruwakakun.com/html-css/reference/box-sizing

## 2. 横並びさせたい要素の直上にひと工夫
上記の例でいうとココ

```css:
.itemBox__inner {
  display: flex;  
  flex-wrap: wrap;   
  margin: 0 0 0 -60px; 
}
```
###display: flex;
直下のすべての要素を横並びします。
float: leftは不要。

###flex-wrap: wrap;
子要素が100%を超えた場合に折り返すようになる。

###margin: 0 0 0 -60px;
.itemの左padding60px分のズレを戻す。
VSCodeでPythonのコーディング規約のpycodestyleを設定する

VSCodeでpycodestyleを利用したい場合に若干ハマったのでメモ

# 前提
- VSCode インストール済み
- Python 3.7.3 の環境構築済み

# 手順
pycodestyleとPep8をインストールしておく（Pep8はpycodestyleの旧名称）

```shell
pip install pycodestyle pep8
```

対象のディレクトリをVSCodeで開き、`.vscode/settings.json`の設定ファイルに以下を記述する（ない場合は作成する）

```json:settings.json
{
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": false,
    "python.linting.pep8Enabled": true,
    "python.linting.lintOnSave": true
}
```

ルール無効化等の設定を行う場合は、トップディレクトリに`setup.cfg`ファイルを作成し、`pycodestyle`と`pep8`のセクションに同一のルール設定を**二重に記述する**（現状、VSCodeがPep8→pycodestyleの名称変更に対応しておらず、コマンドからのLintと両立させるために二重の記述が必要となる）

以下、1行の文字数制限（80文字未満）を無視する場合の設定ファイル例

```ini:setup.cfg
[pycodestyle]
ignore = E501

[pep8]
ignore = E501
```

以上の設定により、VSCodeで自動でLintが実行されるようになる
![VSCodeでのLint表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/496b5f03-142f-c999-afb9-13adbe800536.png)

コマンドでLintを実施する場合は、トップディレクトリにて以下を実行

```shell
$ pycodestyle .
./db_operation.py:127:31: E711 comparison to None should be 'if cond is not None:'
```
commitメッセージからバグ修正や変更の多いファイルを検出するワンライナー

フリーランスエンジニアをしております。 [@taiyop](https://twitter.com/taiyop) です。


本日、どこまでテストコードを書くのかを復習する目的で以下の記事を読んでたところ、ちょっと良いんじゃないかなっていうワンライナーを思いついたので久々にqiita投稿することにしました。

- [「単体テスト」再入門！ 開発の現場でバグを確実に洗い出す最適な手法と、テストケースの作り方](https://employment.en-japan.com/engineerhub/entry/2019/10/03/103000#%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88%E3%81%A8%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88)
- [グーグルはコードの品質向上のため「バグ予測アルゴリズム」を採用している](https://www.publickey1.jp/blog/11/post_193.html)


### 使う目的

バグ修正の多いファイルを見つけて、設計のリファクタリングやテストコードの充実を行い、品質を向上させることです。


ossのソースコードを見ていると、commitメッセージにfeat/fix/refactor/choreなどをprefixにしていることがあると思います。現在の開発でも似たようなことをしているのですが、

```
feat: xxxx
fix: xxxx
refactor: xxxx
chore: xxx
```

のようなcommitメッセージから、 

「このファイルはfixが多いぞ」

というのを見つけて、テストの充実やより品質の高いプログラムに書きかえていきます。


### 本題のワンライナー

```
git log -c --grep fix: --name-only | grep app/models | sort | uniq -c | sort
```

`fix:` の部分を`feat:`に変えれば、機能追加数が把握できますし、
`app/models`の部分を変えれば、対象ファイルを変更できます。


### 実用例

例えば、[vue](https://github.com/vuejs/vue) の fix数で分析したいときは、以下のようにします。

```
git log -c --grep fix: --name-only | grep src | sort | uniq -c | sort
```

↓

```
   5 src/core/instance/render.js
   5 src/core/util/error.js
   5 src/core/vdom/create-component.js
   5 src/core/vdom/vnode.js
   5 src/platforms/web/compiler/directives/model.js
   6 src/core/vdom/create-functional-component.js
   6 src/platforms/web/runtime/modules/attrs.js
   6 src/platforms/web/runtime/modules/dom-props.js
   6 src/shared/util.js
   7 src/core/vdom/patch.js
   8 src/compiler/codegen/events.js
   8 src/core/instance/lifecycle.js
   9 src/compiler/parser/index.js
   9 src/core/util/env.js
  10 src/platforms/web/runtime/modules/events.js
  11 src/compiler/codegen/index.js
  12 src/core/vdom/helpers/normalize-scoped-slots.js
```

ちなみに`feat:` で分析したところ、以下のようになりました。

```
   2 src/server/render.js
   2 src/shared/util.js
   3 src/compiler/codegen/events.js
   3 src/core/instance/render.js
   3 src/core/instance/state.js
   4 src/core/instance/render-helpers/index.js
   6 src/compiler/codegen/index.js
  17 src/compiler/parser/index.js
```

parser/index.jsは機能追加が多いみたいですね。


### その他の活用方法


`feat:` のついたコミットメッセージで検索すれば、機能の多いファイルも把握できるかと思います。

また、feat/fix/refactor/chore/testのどれが多いのかなどを調べれば、「最近featが少ないなー」等という問題点も数字として見える化できるかと思います。

バグバッシュ大会をする際にも、どのファイルからチェックしていくかの指標にもなるのではないでしょうか。

とはいえ、rubocop、ファイルごとの行数、コードカバレッジチェックなども使うと思うので、今回の手法を使った方が良いかどうかはケースバイケースだと思います。
ただ、この手法はワンライナーでコマンドを叩くだけなのでちょっと試してみるくらいのノリで使ってみてもらえると良いのかなと思います。

最後まで読んでいただきありがとうございました。
Raspbian buster 初期設定,IP固定,開発環境 etc..

Raspbian Buster の初期設定メモです．

最初にIPを固定してVNCから操作できるようにします．
左上アイコンからRaspberryPiの設定よりVNCを有効にします．
次に
/etc/network/interfaces
を開き

```
auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotlplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

を書き加えます．
デスクトップ右上からネットワーク設定を開きIPを入力してApplyを押せば再起動後固定完了です．

次にその他インストールをしていきます．

```
sudo apt-get install ibus-mozc
sudo apt-get install -y apt-transport-https
sudo apt-get install  vim
//vimがこのままでは見にくいので，
vim .vimrc
の中にsyntax on  colorscheme evening と打ち込んで下さい

sudo apt-get install build-essential
sudo apt-get install gcc 
sudo apt-get install cmake
sudo apt-get install make
//visual-studio-code
 sudo su
. <( wget -O - https://code.headmelted.com/installers/apt.sh )
sudo apt-get install code-oss=1.29.0-1539702286

sudo apt-get install libi2c-dev
sudo apt-get install git-core

```
WiringPiについて
https://github.com/WiringPi/WiringPi からファイルをとってきます，
解凍後，解凍したファイル内で ./build
(Mac)Composerのインストール

Windowsと違って、MacOSの場合Composerの専用インストーラが用意されていないので、
composerのファイルを直接ダウンロードします。



####①composerのファイルをダウンロード
ターミナルで以下のインストールコマンドを実行する

```
php -r "readfile('https://getcomposer.org/installer');" | php
```
これでいまいるディレクトリの直下に `composer.phar` というファイルがダウンロードされる。


####②ファイルを移動させる
以下のコマンドを実行する。

```
mv composer.phar /usr/local/bin/composer
```

ダウンロードしたファイルを `/usr/local/bin/` 直下に移動させ、ファイル名を `composer`に変更することで、
いつでもcomposerが呼び出せるようになる。


####③インストールできているか確認
ターミナル上で、

```
composer
```

と実行し、

```
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.0 2019-$$-$$ $$:$$:$$
``` 

このような画面が表示されていたら無事インストール完了。
[SwiftUI memo] Buttonのカスタムスタイルを作成する (タップしたら縮小するアニメーションを付けてみる)

アプリを作る時にボタンをカスタマイズするのはよくあります。

SwiftUIではボタンは`Button`を使います。

```swift
Button(action: { ... }) { Text("Hello") }
```

タップした時のインタラクション・アニメーションはデフォルトで適用されます。
これは`ButtonStyle` protocolに準拠したオブジェクトによって行われます。

つまり、ButtonStyleオブジェクトを自分で作ることによってタップした時のアニメーションやスタイルなどをカスタマイズすることができます。

例として、タップしたら縮小するButtonStyleを作ってみます。

```swift
 struct ShrinkButtonStyle: ButtonStyle {
    
    func makeBody(configuration: Self.Configuration) -> some View {
      
      let isPressed = configuration.isPressed
      
      return configuration.label
        .scaleEffect(x: isPressed ? 0.9 : 1, y: isPressed ? 0.9 : 1, anchor: .center)
        .animation(.spring(response: 0.2, dampingFraction: 0.9, blendDuration: 0))            
    }
  }
```

作ったStyleは`.buttonStyle()`で設定します。

```swift
 Button(action: {}) {
   Text("Hello")
     .padding(10)
     .background(Color.gray)
     .cornerRadius(8)
 }
 .buttonStyle(ShrinkButtonStyle())
```

![Screen Recording 2019-10-05 at 16.50.49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8358/3b544440-f3c8-042e-d59e-9ba668e37845.gif)

## 補足

スタイルを設定するにあたって、`isPressed ? 0.9 : 1` のような記述をしています。
これはアニメーションを正しく実行するためにこのような記述の方が安定する様子。

```
if isPressed {
  return AnyView(...)
} else {
  return AnyView(...)
}
```

みたいな書き方でしっかり分けることもできると思うのですが、うまくいかなくなることが多い印象を受けました。

## 参考

https://www.youtube.com/watch?v=slzc0-24q-I
AmbientでESP-WROOM-02(esp8266)のアナログ入力を送信　遠隔制御

#前提#
・ESP-WROOM-02がWi-Fiに接続されている→[もしできてないならこちら(ESP-WROOM-02開発ボードでwi-fi接続からのWebサーバーにする)](https://qiita.com/kikuchiTakuya/items/fd0aa45c6e2c2a867d9b)
・Ambientでアカウントを登録済み→[もしできてないなら(AmbientのWebページ)](https://ambidata.io/)


#1:Ambientライブラリのインポート#
[こちら](https://ambidata.io/docs/esp8266/)を参考にAmbientのライブラリをインポートしてきてください。

#2:チャネルを作成して公開する#
まず、**チャネルを作る**ボタンを押してチャネルを作成してください。
![1m2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/f5a0d6b0-3ef0-aa4f-1b01-52c32741cf65.png)

次にチャネルの歯車マークを押してチャネルの設定を開いてください。
![am3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/992f9fe8-2949-8c14-4324-9c9fd2226762.png)

公開チャネルにチェックをつけてチャネル属性を設定してください。
![am4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/01d3f45b-f742-f04b-5778-fe7629adb5f3.png)


#3:データをAmbientに送信#
Arduino IDEを開いてプログラムを書いていきます。
A0からの入力を送信するプログラムを書いていきたいと思います。

###必要なもの###
・作成したチャネルのチャネルID
・作成したチャネルのライトキー
・Wi-FiのSSID
・Wi-Fiのパスワード

###プログラム###
とりあえずこんな感じです。

```c
#include <ESP8266WiFi.h>
#include <Wire.h>
#include "Ambient.h"

#ifndef STASSID
#define STASSID "ssid"
#define STAPSK  "password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

unsigned int channelId = channelId;
const char* writeKey = "writekey";

WiFiClient client;
Ambient ambient;

int analog_value_zero = 0; 

const int led = 13;

//esp8266でアナログ入力するために必要
extern "C" {
#include "user_interface.h"
}



void setup() {
  // put your setup code here, to run once:

  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  ambient.begin(channelId, writeKey, &client);

}

void loop() {
  // put your main code here, to run repeatedly:

　//system_abc_read()でアナログ入力を読み込む
  analog_value_zero = system_adc_read();
  float analog_value_zero_float = float(analog_value_zero);

  Serial.println(analog_value_zero_float);

　//値をセットして送信する
  ambient.set(1, analog_value_zero_float);
  ambient.send();

  delay(1000);
}
```

#4:確認#
作成したチャネルからグラフをみてちゃんとデータが送られているか確認しましょう。

#参考#
・[Arduino ESP8266で温度・湿度を測定し、Ambientに送ってグラフ化する](https://ambidata.io/docs/esp8266/)
Atomを使うためにとりあえずやったこと

## Atomとは

フリーで使える高機能テキストエディタです。
GitHub製。
読み方は「アトム」らしいけどつい「エイトム」って言っちゃう。

公式サイトはこちら。
[Atom : https://atom.io/](https://atom.io/)

こんな感じのエディタです。
![SS20191004_atom1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507796/9228fb79-b0d4-f89b-5988-28627c7e46c0.png)

## ダウンロードとインストール

私は Windows 10 環境なのでそれで説明していきます。
[公式サイト](https://atom.io/)からインストールパッケージをダウンロードしてきます。
ダウンロードしたファイルをダブルクリックするとインストールされます。


## 日本語化

画面左上のメニューから
File > Settings > Install
と進みます。
![SS20191004_atom2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507796/46cca046-1675-20ba-ee60-9eafbbeb7a23.png)

「japanese-menu」と検索して、出てきた以下のパッケージをインストールします。
![SS20191004_atom3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507796/fbd7ae2e-661f-6c98-cb86-3a73f6cfa00c.png)


## タブが1つしか開かないのを直す

デフォルト状態では「プレビュータブ」というのを使う設定になっていて、一度ファイル名をクリックしてからさらにタブ上のファイル名をダブルクリックするか編集を開始すると複数タブが開けるという仕様になっています。使わないので無効にします。

設定 > コア設定
と進み「プレビュータブを使う」のチェックボックスをオフ。
![SS20191004_atom4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507796/e47cb59a-5633-788d-0ed5-ba712f5ee600.png)


## エディタ内の縦線を消す

エディタ内にガイドとなる縦線が入っているので消します。
![SS20191004_atom5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507796/e2951241-2a45-ee8a-7d7b-7caa9f8f7a61.png)

設定 > パッケージ
と進み、コアパッケージの「Wrap Guide」を無効にします。
![SS20191004_atom6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507796/3dec3203-f67b-439a-dd22-fb789a8d8fe1.png)


## 参考にしたサイト・ブログ記事など

* [エディタ「Atom」のインストールと初心者向け初期設定 : https://pg-happy.jp/atom-texteditor.html](https://pg-happy.jp/atom-texteditor.html)
* [Atomでエディター内の縦線を消す方法 : https://www.ideaxidea.com/archives/2015/01/atom_settings.html](https://www.ideaxidea.com/archives/2015/01/atom_settings.html)
* [【ソフト】Atomでタブが新規に開けないときの対処方法！: https://kurokinomizuiwa.hatenablog.com/entry/2018/11/09/atom-trouble-shooting](https://kurokinomizuiwa.hatenablog.com/entry/2018/11/09/atom-trouble-shooting)
#VsCode で 拡張/プラグインの設定変更を元に戻す方法はあるけど、なんか一個ずつ操作しなきゃいけないし、地道な作業…。

- サイドバーで拡張を選ぶ
- 歯車をクリックして Configure Extension Settings を選ぶ
- 設定一個あたりにカーソルを合わせると、歯車マークが浮き上がるので、クリックして Reset Setting を選ぶ

![image](https://user-images.githubusercontent.com/13635059/66250397-289fcb80-e77d-11e9-8fe0-a72e673a3e46.png)

![image](https://user-images.githubusercontent.com/13635059/66250394-19208280-e77d-11e9-97fa-1e2bc7a57ab5.png)

一気に戻す方法は、設定ファイルを探して削除してしまうとか？誰か教えて。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2559








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Configuring cron option under systemd

cron can be configured in **either way of these two.**

- /etc/systemd/system/cron.service.d/option.conf

```
[Service]
Environment='EXTRA_OPTS="-L 0"'
```

- /etc/default/cron

```
EXTRA_OPTS="-L 0"
```

This is possible as this is written /lib/systemd/system/cron.service .

```
[Service]
EnvironmentFile=-/etc/default/cron
```

----

Some articles says docker can be configured only by /etc/systemd/system/docker.service.d/http-proxy.conf .

```
[Service]
Environment="HTTP_PROXY=http://localhost:8888/" "HTTPS_PROXY=http://localhost:8888/
```

This is because EnvironmentFile is not mentioned in /lib/systemd/system/docker.service .
vue.js 動的にclassを操作する

# 動的にclassを操作する

リファレンス
https://jp.vuejs.org/v2/guide/class-and-style.html

```
v-bind:class="{ クラス名: 真偽値 }"
```

を使用。

**defaultMargin** というクラスを付与。

クラス名はキャメルケースで。
styleタグの中に書くクラス名もキャメルケースにすること。

クラスが適用されるかどうかは、**isDefaultMargin**というプロパティの真偽値で決まる。

trueなら適用されcssが反映される。
falseなら適用されずcssも反映されない。

```js:some_component.vue

<div class="scafold-wrapper text-center" v-bind:class="{ defaultMargin: isDefaultMargin }">

<style>
/* クラス名はキャメルケースで書くこと */
.defaultMargin {
  margin: 0 0 0 110px;
}
</style>

<script>
data: function() {
    return {
      isDefaultMargin: true
    }
}
</script>
```
[SwiftUI]UIViewRepresentableのプレビューでsizeThatFitを有効にする

SwiftUIでUIKitのコンポーネントを利用する場合、UIViewRepresentableを利用します。

```swift:TextView.swift
import SwiftUI

struct Label: View {
    var body: some View {
        InternalUILabel()
    }
}

private struct InternalUILabel: UIViewRepresentable {
    typealias UIViewType = UILabel
    
    func makeUIView(context: UIViewRepresentableContext<InternalUILabel>) -> UIViewType {
        let label = UILabel()
        label.text = "hello world"
        return label
    }
    
    func updateUIView(_ uiView: UIViewType, context: UIViewRepresentableContext<InternalUILabel>) {
        
    }
}

struct Label_Previews: PreviewProvider {
    static var previews: some View {
        Label().previewLayout(.sizeThatFits)
    }
}
```

<img width="323" alt="Screen Shot 2019-10-05 at 16.30.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/f6fea0ef-a07d-ee45-1362-34dfb8043695.png">

この状態でプレビューを表示すると、previewLayoutを指定しても上記のように画面いっぱいに表示されます。

プレビューでsizeThatFitsを有効にするには、UIViewRepresentableで返すcontentHuggingの優先度を上げて返してあげる必要があります。

```swift
func makeUIView(context: UIViewRepresentableContext<InternalUILabel>) -> UIViewType {
        let label = UILabel()
        label.text = "hello world"
        label.setContentHuggingPriority(.defaultHigh, for: .horizontal)
        label.setContentHuggingPriority(.defaultHigh, for: .vertical)
        return label
}
```

<img width="261" alt="Screen Shot 2019-10-05 at 16.33.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/bf70df00-892b-d83a-756e-46e14d51dc65.png">

この手法が使えるのは返すUIViewのintrinsicContentSizeがある場合なので、決定しない場合はサブクラスなどを作ってintrinsicContentSizeをoverrideする必要がありそうです。
Debian stretchでsnoopyの設定をする


Configuring snoopy on Debian stretch

## 前説

snoopyは、フィルタ条件を設定ファイルで変更することができますが、https://github.com/a2o/snoopy/blob/master/doc/FILTER_exclude_spawns_of.md によると、`--enable-filtering --enable-config-file`を有効にしてコンパイルする必要があります。

しかし、Debian stretchの2.3.1-2はそうなっていません。Debian stretchでsnoopyをインストールすると、`/usr/share/doc/snoopy/FILTER_exclude_spawns_of.md.gz`が導入されるので、/etc/snoopy.iniを自分で作れば読み取られるように見えますが、罠となります。。

snoopy can change the filtering criteria by config file, but it requires specific compiling option, but Debian stretch lacks the feature. FILTER_exclude_spawns_of.md.gz existence is midleading.

## 回避策

Debian busterのパッケージ https://packages.debian.org/ja/buster/amd64/snoopy/download をダウンロードしdpkgで導入するか、busterのソースパッケージをコンパイルします。
(依存関係には問題ありません)

Install buster binary package or compile source package.
#VsCode で #git / #github PRのモブ・コンフリクト解消作業をした感想

- VSCode の LiveShare の共同編集機能を使いながら作業した。
- zoomで音声通話をしながら、ドライバーはVsCodeとは別に画面共有もしながら作業した。
- VSCode プラグイン Git Lens で カーソル行の git blame を自動表示してくれるのが便利。誰がどんな変更したかが分からないと辛い。
- VSCode プラグインの Git Blame が良い。カーソル行の commit に対して Github commit のURLにジャンプできる (ブラウザで)
- Live Share の動作にまだ不安定感があった。ファイル一覧でうまくコンフリクト状態が反映されなかったりしたので、LiveShareにログインしなおしたりしていた。 
- 自分が実装担当したところはすごく分かるし、そうでない箇所はまるで分からない、という傾向がわかった。やはり実装担当者がconflict解消するのが一番効率が良い。
- 「lint修正は自動でコマンド実行できるよ！」とか「VsCodeのこのプラグイン良いよ！」とか、やはりツール・知見共有はモブの最大効果の一つだと思った。
- 他の人が実装担当した箇所を自分がコンフリクト解消できないと、なんだか自分の頭がすごく悪いような感じがしてきたが、そうでもなかった。多分。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2558








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Pythonで代入しながら結果をreturnしたい

競技プログラミングで、メモ化再帰のコードを書く際によく出てくる書き方。
C++だと、returnで代入しながらreturnできる
こんな感じのやつ↓

```c++
bool func(int i, int x) {
    ...

    return dp[i][x] = 0;
}
```

が、Pythonだと以下のように書くと怒られる

```python
def func(i, x):
    ...
    return dp[i][x] = 0

```
returnのあとには文を指定できない（式じゃないとだめ）なのかと思い、いろいろ調べて見たところ…

# 代入式
結論から言うとPython 3.8から導入される**「代入式」**を使えば書けそう。

```python
def func(i, x):
    ...
    return dp[i][x] := 0
```

# 参考
https://atsuoishimoto.hatenablog.com/entry/2019/09/03/110508
nRF52840でBME280を使う場合のDevice Tree定義

Zephyrで /zephyr/samples/sensor/bme280 (I2C接続） 使う場合、 /zephyr/boards/arm/nrf52840_pca10056/nrf52840_pca10056.dts に直接書くか、zephyr/samples/sensor/bme280/nrf52840_pca10056.overlayに定義する。

```
&i2c0 {
  compatible = "nordic,nrf-twi";
  status = "okay";
  sda-pin = <26>;
  scl-pin = <27>;

  bme280@76 {
    compatible = "bosch,bme280";
    reg = <0x76>;
    label = "BME280";
  };
};
```

以下のコマンドでビルドする

```
west build -b nrf52840_pca10056 zephyr/samples/sensor/bme280
```