OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでiOSアプリアイコンに必要な画像サイズに自動でリサイズしてくれるプログラム

iOSアプリ開発するときにiPhone,iPadなどのサイズに合わせたアプリアイコンを作成しなきゃいけないと思います。
リサイズするのがとても面倒だったのでPythonでプログラムを作成しました。

## 前提条件

・pythonプログラム実行可能な環境であること。
・Python画像処理ライブラリ『Pillow』が利用可能な環境であること

## 概要
iOSアプリ開発時アイコン設定が必要な以下のピクセルに画像をリサイズ出力してくれます。
20px, 29px ,40px ,58px ,60px ,76px ,80px ,87px ,120px ,152px, 167px ,180px

※画像は1024pxの画像1つを用意することで、アプリに必要な画像サイズは全て揃うはずです。



## 使い方

1. リサイズしたい.png画像の名前をicon.pngにリネーム
（iconの名前、拡張子を変更したい場合は、プログラムのicon.pngを書き換えてください）

2. iconResize.pyと同じフォルダ内にicon.pngを配置

3. iconResize.py実行すると、リサイズされた.pngが同じフォルダ内に出力されます。



```python
# iconResize.py

from PIL import Image

input_view = Image.open("icon.png")
Size = [20,29,40,58,60,76,80,87,120,152,167,180]

for size in Size:
    icon = input_view.resize((size,size))
    icon.save("icon_x" + str(size) + ".png")
```

GitHubにも載せてるので、ダウンロードして使って頂いても大丈夫です。
https://github.com/komaki1996/iconResize

出力される画像サイズを変更、追加したい場合はiconResize.pyに下記行を変更することで出力サイズの変更追加をすることが可能です。
```
Size = [20,29,40,58,60,76,80,87,120,152,167,180]
```
Pointerで連結リストの順序を逆転する

#連結リストの要素の並びを逆転する
連結リストに要素を追加したあとにその並び順を逆転するコードは下記となります。

```reversal.c

#include <stdio.h>
#include <stdlib.h>

//node declaration
struct node{
  int data;
  struct node *link;
};

//function declaration
void add(struct node **, int);
void reverse(struct node **);
void display(struct node *);

void main(){
  //declaration of pointer to point to linked list
  struct node *p;
  
  //set pointer to point to empty linked list
  p = NULL;
  
  //add nodes to linked list
  add(&p,3);
  add(&p,5);
  add(&p,7);
  add(&p,5);
  add(&p,9);
  
  //display nodes in linked list
  display(p);
  
  printf("Change order of linked list\n");
  
  //reverse order of linked list
  reverse(&p);
  
  //display nodes in linked list
  display(p);
}

//reverse nodes order in linked list
void reverse(struct node **q){
  struct node *current, *prev, *next;
  
  //set locator pointer to the first node
  current = *q;
  //set prev to null
  prev = NULL;
  
  //loop through linked list
  while(current!=NULL){
    //keep next node address
    next = current->link;
    //change link of current node to point to previous address
    current->link = prev;
    //keep current address
    prev = current;
    //go to next node
    current = next;    
  }
  
  //after looped through linked list, change p to point to the latest first node
  *q = prev;
}

//add node to the beginning of linked list
void add(struct node **q, int num){
  struct node *r;
  
  //create new node
  r = malloc(sizeof(struct node));
  //set value of new node
  r->data = num;
  //set link to point to address pointed by p
  r->link = *q;
  //set p to point to new node
  *q = r;
}

//display nodes in linked list
void display(struct node *q){
  while(q != NULL){
    printf("%d\n",q->data);
    q = q->link;
  }
}
```
DatabricksでMLflowを使う④ - モデルの呼び出し -

# はじめに

以下の記事で、Databricks のマネージド型MLflowを使ってモデルのトレーニング、ライフサイクル管理を行いました。

[DatabricksでMLflowを使う① - ノートブック上での実験トラッキング -](https://qiita.com/knt078/items/49a14a83c45f3f501ee7)
[DatabricksでMLflowを使う② - 実験パラメータとメトリクスの可視化 -](https://qiita.com/knt078/items/b1455d57a0fa6cee3f7d)
[DatabricksでMLflowを使う③ - モデルのライフサイクル管理 -](https://qiita.com/knt078/items/c40c449a512b79c7fd6e)

今回はトレーニングとステージングを行ったモデルを別のノートブックから読み込みたいと思います。
イメージとしてはトレーニングしたモデルを Pyspark ユーザー定義関数として読み込み、 pyspark のデータフレームに対して分散処理をかけるという流れになります。 

# セットアップ

呼び出したいモデルに対して["Run ID"](https://qiita.com/knt078/items/c40c449a512b79c7fd6e#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E7%99%BB%E9%8C%B2)を読み込みます。

```python:
# run_id = "<run-id>"
run_id = "d35dff588112486fa1684f38******"
model_uri = "runs:/" + run_id + "/model"
```

# scikit-learn モデルをロードする

実験済みのトレーニングモデルを MLflow API を利用してロードします。

```python:
import mlflow.sklearn
model = mlflow.sklearn.load_model(model_uri=model_uri)
model.coef_
```
次にトレーニングにも利用した糖尿病データセットを読み込んで"progression"のカラムを落とします。
そして、読み込んだ pandas データフレームを pyspark データフレームに変換しておきます。

```python:
# Import various libraries including sklearn, mlflow, numpy, pandas

from sklearn import datasets
import numpy as np
import pandas as pd

# Load Diabetes datasets
diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target

# Create pandas DataFrame for sklearn ElasticNet linear_model
Y = np.array([y]).transpose()
d = np.concatenate((X, Y), axis=1)
cols = ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6', 'progression']
data = pd.DataFrame(d, columns=cols)
dataframe = spark.createDataFrame(data.drop(["progression"], axis=1))
```

# MLflow モデルの呼び出し

MLflow API を使って Pyspark ユーザー定義関数としてトレーニング済みのモデルを呼び出します。

```python:
import mlflow.pyfunc
pyfunc_udf = mlflow.pyfunc.spark_udf(spark, model_uri=model_uri)
```

ユーザー定義関数を使って予測を行います。

```python:
predicted_df = dataframe.withColumn("prediction", pyfunc_udf('age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6'))
display(predicted_df)
```

Pyspark モデルを使って分散処理することができました。

![2020-11-05_10h45_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618791/866b9808-ba84-78a3-9779-a1530e9a0d00.png)

# おわりに

今回はトレーニング済みのモデルを MLflow API を使って呼び出し、Pyspark で分散処理させることができました。
Databricks では日々新しい機能がアップデートされており、どんどん使いやすくなっています。
これからも新しい機能がでたら追いかけていきたいと思います。
mergeコミットごとコミットを全部rebaseで1つにまとめた後にpushして、PRのfiles changedにmergeコミットの分まで含まれてしまった時の対処法

あくまで自分用のメモなのでわかりにくいのはご了承ください。

ブランチはhoge_branchとして、rebaseでコミットが1つにまとまっている状態で

```
$ git reset head^
$ git stash -u
$ git checkout develop
$ git pull origin develop
$ git checkout -b copy-hoge_branch
$ git stash apply
$ git add .
$ git commit -m "xxx"
$ git push -f origin copy-hoge_branch:hoge_branch
```

もしこの手順でやってfiles changedは正しくなったけどPRのコミットが1つにまとまってなかったら、この手順をもう1回やればコミットは1つにまとまるはず
【Java】containsメソッドで配列(やリスト)で値を検索する方法

#プログラミング勉強日記
2020年11月6日
Javaで配列を扱ったときに配列の要素の中から値を検索する方法でてこずったのでまとめる。

#配列を検索する方法
　配列内に特定の値が含まれているか検索するときにcontainsメソッドを使う方法がある。
 containsメソッドをメソッドを使用するには`hava.util.Arrays`をインポートする必要がある。containsの引数には検索したい値を入れ、存在する場合は真となり条件内の処理を通る。

```java:数値を検索する
import java.util.Arrays;
public class Main {
  public static void main(String[] args) {
    Integer num[] = {10, 20, 30};
    // 配列に30が含まれているかどうか
    if(Arrays.asList(num).contains(30)) {
      System.out.println("値が存在する");
    }
  }
}
```

```:実行結果
値が存在する
```

```java:文字列を検索する
import java.util.Arrays;
public class Main {
  public static void main(String[] args) {
    String bar[] = {"aa", "bb", "cc"};
    // 配列にaaが含まれているかどうか
    if(Arrays.asList(bar).contains("aa")) {
      System.out.println("値が存在する");
    }
  }
}
```

```:実行結果
値が存在する
```

#Listを検索する方法
　`java.util.ArrayList`をインポートする必要がある。基本的な書き方は配列と変わらない。

```java
import java.util.ArrayList;
import java.util.List;
public class Main {
  public static void main(String[] args) {
    List<Integer> num = new ArrayList<Integer>();
    num.add(10);
    num.add(20);
    num.add(30);
        
    if(num.contains(10)) {
      System.out.println("値が存在する");
    }
  }
}
```


#参考文献
[【Java】containsメソッドで配列とListの値を検索する方法まとめ](https://www.sejuku.net/blog/14166)
[特定の値を判定！Javaのcontainsメソッドを使う方法【初心者向け】](https://techacademy.jp/magazine/18605)
【Linux】管理者権限なしでPython3をインストールする

学校のサーバーでPythonのモジュールをインストールしようとしたところ、管理者権限が原因で出来なかったので、ホームディレクトリ下にPythonごとインストールしました。

## 1． ホームディレクトリにディレクトリ （ここでは`src`） を作成、移動。

```sh
mkdir /ホームディレクトリ/src
cd /ホームディレクトリ/src
```

## 2． `wget`コマンドでPythonをダウンロード。

```sh
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
```

## 3． 解凍。
```sh
tar xvzf Python-3.6.3.tgz
```

## 4． makeする。

`configure`でインストール場所を指定（ここでは`/ホームディレクトリ/local/`）。

```sh
cd Python-3.6.3
./configure --prefix=/ホームディレクトリ/local/python
make
make install
```

## 5．パスを通す。

```sh
vi ~/.bash_profile
```

以下の文を追記。

```conf:~/.bash_profile
export PATH=$PATH:/ホームディレクトリ/local/python/bin
```

### 追記方法

1. `vi`を開いた状態はコマンドモード
1. `A`を入力して編集モードへ（現在の行の末尾に追加）
1. 入力が終わったら`escキー`でコマンドモードへ
1. `:wq`を入力して、保存＆終了

ここまででインストールは終了

## 使用方法
- スクリプトの実行
  ```
  Python3 /ホームディレクトリ/local/python/bin/python3 ファイル名
  ```
&#13;&#10;
- ライブラリのインストール

  ```
  /ホームディレクトリ/local/python/bin/pip3 install パッケージ名
  ```

## makeが動かなかった人向け

主旨とはずれますが，[非公式ダウンロードページ](https://pythonlinks.python.jp/ja/index.html)にある通り，Ubuntuだと以下のモジュール類を追加することでmakeが通りました．

```sh
sudo apt update
sudo apt install build-essential libbz2-dev libdb-dev \
  libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
  libncursesw5-dev libsqlite3-dev libssl-dev \
  zlib1g-dev uuid-dev tk-dev
```
DataTablesのフィルターにwrapperクラスのdivを作成する

# 追記
DataTable ver1.10.4という古いの使い回してました。
[公式](https://datatables.net/download/)からBootstrp3とか選択してv1.10.22を使用したらちゃんとwrapperついてたので、本記事の対応は不要でした！！！

#ポイント
DataTablesの「検索窓」や「○○件表示」のdivには親クラスが内のでwrapper_divを指定して横並びとかできないのでJSで作成してみた。（できるかもしれんけど）
※スマホで見ると上記2つが縦に並んで気持ち悪い

メモ：
「○○件表示」は　dataTables_length
「検索窓」は　dataTables_filter
のclass名が自動で付与される。

それぞれ指定してwrapperクラスを作成するが、少し待機してからでないと上記2点も作成されていないので反映できない。
300ms待機してから実行するようにしている。

#ソース

```javascript
    $(function (){
        setTimeout(function () {
            $('.dataTables_length, .dataTables_filter').wrapAll('<div class="datatable-wrapper-div">');
        },300);
    });
```
ディレクトリ構造を書くときに頻出する記号「├」の変換方法

# よく見る「├」記号
QiitaやGitHubを眺めていると，ディレクトリ構造を説明するときに謎の記号「├」を頻繁に見かけますよね．
私はこれまでこんな記号を使う機会がなかったので，変換方法が分かりませんでした．
いちいちコピペするのも面倒なので，ディレクトリ構造を示すときによく使われる記号の変換方法についてまとめていきたいと思います．

# 「けいせん」で必要な記号に変換可能
試しに「けいせん」と打ってみると，以下のように候補が表示されます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486404/62226d13-f067-ac00-e7a4-7771a62cbab8.png)

これでディレクトリ構造をQiitaでも説明できる！

# 実際に書いてみる

```
.
├─ .git
|  └─...
├─ api
│  └─ main.go
└─ front
   └─ app.ts
```

実際に書いてみた感じでは

| 記号 | 構成 |
| --- | --- |
| ├─ | 「├」+「─」 |
| └─ |「└」+「─」 |
| │ | 「│」 |

と書き，記号とファイル名の間には半角スペースを入れると見栄えがよさそうです．
書く時のこだわりがある方，実はこういうルールがあるなどあれば，コメントから教えて下さい！

***追記***: 
コンソールにて，

```shell
$ tree
```

とすればディレクトリ構成が出力されます．

# 参考
[「├」や「└」などの罫線を入力するには？｜soft1.jp](https://soft1.jp/trouble/w/w046.html)
OracleのJava Development Kitが有償化したが、引き続きAndroid Studioは無料で使えるのか？

Android Studioはデフォルトで無料のOpenJDKを使用しているため、無料で使用可能。
有償化したのはOracleJDK。
非商用、非本番利用であれば、OracleJDKも無料使用可能。
[PHP] str_pos インプット文字列を対象に配列のキーで曖昧検索する方法

#やりたいこと
私の場合はこのような配列があり

```php
$prefs = [
  "北海道" => 3,
  "青森県" => 3,
  "岩手県" => 2,
  // ... 省略
  "宮崎県" => 3,
  "鹿児島県" => 3,
  "沖縄県" => 4
];
```

インプットは「東京都品川区...」のような都道府県で区切られていない文字列です。
インプットの都道府県に該当する配列の値を取得することが目的です。

#方法
このように対応しました。

```php
$res = 4; // 該当なしの場合は4を返すとする
// $prefs を1件ずつ見ていく
foreach ($prefs as $key => $value) {
  // $input（インプット文字列）内に$key（配列のキー）が存在するか
  if (strpos($input, $key) !== false) {
    // 存在したら対応する値をレスポンス用の変数にセットする
    $res = $value;
    break;
  }
}
return $res;
```

#注意事項
* 都道府県の配列を作る場合に「都」や「県」を省略しないこと

省略しこのようにつくってしまうと、都道府県と同じ地名が存在するため、予期せぬ結果になる可能性があります。

例えば実際にこのような地名があります。この場合、「東京都」、「千葉県」の値を取得したいのに「島根県」、「山梨県」の値を取得してしまう可能性があります。他にもありそうです。

* 東京都足立区__島根__...

* 千葉県四街道市__山梨__...

```php
// NG 「都」や「県」を省略しない
$prefs = [
  "北海道" => 3,
  "青森" => 3,
  "岩手" => 2,
  // ... 省略
  "宮崎" => 3,
  "鹿児島" => 3,
  "沖縄" => 4
];
```

#参考
<a href="https://www.php.net/manual/ja/function.strpos.php">PHP公式ドキュメント str_pos</a>
位置指定(position)で％を使用することで起きた弊害

#以下のようなスライドダウンで開くコンテンツがあるとする
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="yoshi090" data-slug-hash="MWeqWOz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="pull_down_1">
  <span>See the Pen <a href="https://codepen.io/yoshi090/pen/MWeqWOz">
  pull_down_1</a> by yoshida (<a href="https://codepen.io/yoshi090">@yoshi090</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

「コンテンツを開く」ボタンを押下するとヌルっと動いてしまう！！

この理由は以下である。
・位置指定で「top: -44%;」と％で指定している
・押下したあとのボタンの位置を調整するため、jsで「$(this).css('top','-9%');」とまた％指定している

コンテンツの高さが開く前と開いた後で変わるので、％で指定してしまうとボタンの位置がずれてしまう。

#こういう時はpx指定で問題なし
以下はボタンの位置をpx指定にしたもの。
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="yoshi090" data-slug-hash="vYKzYdX" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="pull_down_2">
  <span>See the Pen <a href="https://codepen.io/yoshi090/pen/vYKzYdX">
  pull_down_2</a> by yoshida (<a href="https://codepen.io/yoshi090">@yoshi090</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ボタンの不自然な動きが解消された。pxにすると、コンテンツの高さに関係なく元のボタンの位置からの距離なので固定される。
％はコンテンツの高さ（または幅）に対する割合なので、動いてしまう。

#まとめ
レスポンシブ対応では％指定が便利で何かと多用しがちだが、何も考えずに全部％指定にしているとこういう落とし穴もある。
【Rails】devise導入後のエラーと対処：Mysql2::Error: Specified key was too long; max key length is 767 bytes

# 記事の内容
devise導入時に出会ったエラーとその対応を備忘録として残します。
初投稿となりますので、至らない点等ご指摘ありましたらコメントお願いします。

# 環境
```
OS: macOS Catalina 10.15.6
Ruby: 2.6.5
Rails: 6.0.3.4
MySQL: 5.6.47
```

# エラー発生までの流れ

Gemfile最下部に```gem 'devise'``` を記述後、ターミナルで以下を実行。

```
rails g devise:install
rails g devise user
rails g devise:views
```

マイグレーションファイルに追加したいカラムを記述し、以下をターミナルで以下を実行。

```
rails db:migrate
```

すると以下のエラーでマイグレートできず。

```
Mysql2::Error: Specified key was too long; max key length is 767 bytes
```

# 原因
以下の記事にて詳しい原因を見つけました。
https://qiita.com/terufumi1122/items/9ea764618eba01144e09

デフォルトでアプリを立ち上げると文字コードは```utf8mb4```ですが、
アプリ立ち上げ時に```utf8```に修正できていなかったようです。

# 対処
database.ymlを以下のように修正しました。

```yml
（省略）
default: &default
  adapter: mysql2
  encoding: utf8 #utf8mb4から変更
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock
（省略）
```

ここで再度```rails db:migrate```を行いましたが、今度は以下のエラーが出ます。

```
Mysql2::Error: Table 'users' already exists
```

マイグレーションには失敗していましたが、テーブルはすでに出来上がっていたようです。
今回の時点ではデータベースが空でしたので、一度ドロップして作り直しました。

```
rails db:drop
rails db:create
```

再度```rails db:migrate```を実行、すると、

```
== 20201106033639 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0171s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0166s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0106s
== 20201106033639 DeviseCreateUsers: migrated (0.0445s) =======================
```

無事マイグレートできました。念の為Sequel Proでテーブルを確認したところ、追加したカラムも反映されていました。

# 終わりに
今回の課題は解決したものの、理解は追いついていないという印象です。
引き続き勉強していきいます。

# 参照記事
https://qiita.com/tetsuro0319/items/e2d39d46f48624fd68b5

https://qiita.com/terufumi1122/items/9ea764618eba01144e09
【2020年11月版】DockerfileのDevContainerをDockerネットワークに接続する【VSCode】

# Dockerfileで定義したDevContainerを既存のDockerネットワークに接続させたい

以下の設定を `.devcontainer.json` に追加でOK。

```json:.devcontainer.json
...
"runArgs": [ "--network=other-docker-network"] 
...

```

以上。

ちなみに利用可能なdockerネットワーク名は `docker network ls` でリストアップできます。

# 参考

https://code.visualstudio.com/docs/remote/devcontainerjson-reference
https://docs.docker.com/engine/reference/commandline/run/
https://docs.docker.com/network/

# 解説

VS CodeのDevContainerではdocker-composeでも定義可能ですが、リモートのDockerサーバー上でDocker-composeしたい場合は少々、問題があります。
DBやRedis、Nginxなどを別コンテナにして、開発したい場合は往々にしてあるわけです。
そこでdocker-composeを利用したい、と言うのは当然で、ローカルでdocker-composeを使う分には問題ないのです。
Dockerはサーバーに `ssh://docker@docker-server` 形式でも接続できますが、これをDokcer-composeでやると問題が発生する、と言うことです。

[https://github.com/docker/compose/issues/6336 "Docker Compose doesn't work when SSH connection used to remote Docker Engine"](https://github.com/docker/compose/issues/6336)

このイシューは、[docker-compose](https://github.com/docker/compose)のコアである[dokcer-py](https://github.com/docker/docker-py)がSSH接続で使用する[paramiko](https://github.com/paramiko/paramiko) ライブラリがAuthorizedKeysを読んでくれないとかでcompose及びdocker-py側ではお手上げ？となっている模様です。。。

今のところdocker-composeを使いたければローカルしかないのだろうか・・・？

また、そもそもVSCodeでリモートのdockerホストに接続する設定などは以下のページが参考になります。

- [VS CodeのDevContainerをVMなどssh接続先で使う](https://qiita.com/74th/items/2ccfc07bd279aba610b1)
Python-LEGO Mindstormsでモーターの角度を取得する

EV3を制御する際に一つの指標として、モーターの角度を取得したいことがある。また、Pythonを用いている中で機械学習を行う際などは必ず何かしらのデータが必要になるが、センサーのデータと合わせてモーターのデータも取得したいことがあるだろう。
今回はEV3のPython環境でリアルタイムにモーター今何度の角度分回っているのかモニターしてみる。  

## EV3について
教育版 [LEGO® MINDSTORMS EV3](https://afrel.co.jp/product/ev3-introduction)(以降EV3)

## 参考
本記事の内容は以下の書籍を参考にしている。
Pythonを使ったEV3の基本的な制御等については以下に網羅されている。

[ロボットではじめるAI入門](https://ai.afrel.co.jp/pythonai/)


## 本記事内での環境  
* PC
Windows10
Python 3.7.3
開発環境 VisualStudioCode  

* EV3
ev3dev
[APIリファレンス](https://ev3dev-lang.readthedocs.io/projects/python-ev3dev/en/stable/spec.html)

※環境構築やVSCodeでのソース作成やEV3への転送・実行方法は以下を参照  
[EV3×Pyrhon　機械学習その1　環境構築編](https://qiita.com/Hiroki-Fujimoto/items/6ce278411ca151fee750)

## ソースコード 

~~~ position.py
from ev3dev2.motor import LargeMotor, OUTPUT_B
from ev3dev2.button import Button
import time

button = Button()
lm_bT = LargeMotor('outB')
lm_bT.reset()

def main():
    while not(button.backspace):
        time.sleep(0.2)
        print(lm_bT.position)
    lm_bT.stop(stop_action = 'brake')

if __name__ == '__main__':
    main()
~~~

## 実行  
※クリックするとYoutubeに飛びます
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ZoMnvI2MzhA/0.jpg)](http://www.youtube.com/watch?v=ZoMnvI2MzhA) 

モーターの角度は正の方向に回すと＋に、負の方向に回すと－に数値が変わる。
今回はモーターにタイヤが付いているが、例えばタイヤが正の方向に1回転すれば0から360に角度の数値が変わる。

## まとめ  
今回はpositionのメソッドを利用して、モーターの角度を確認してみた。
このデータを記録したり、positionを指定することで正確にモーターを制御することができるだろう。
SwiftUI - MapKitを使ってマップを表示させる

SWiftUIでマップを表示する方法を備忘録として残します。

SwiftUIでのマップ表示は非常に簡単でした。
以下の画像のような表示させてみます。

![スクリーンショット 2020-11-06 15.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274108/c9595650-492e-a768-8acb-6b797799bce5.png)


## コード実装
```Swift
import SwiftUI
import MapKit

struct ContentView: View {
    @State private var location = MKCoordinateRegion(center: .init(latitude: 35.677735, longitude: 139.764740), latitudinalMeters: 500, longitudinalMeters: 500) //表示する座標、範囲設定、設定した座標を中心として表示

    var body: some View {
        Map(coordinateRegion: self.$location)
    }
}
```

上記コードのみだと、セーフエリアのせいで画面全体ではなく上下にスペースができてしまいます。
なので、下記コードを設定することでセーフエリアを無視して画面全体にマップを表示することができます。
```
.edgesIgnoringSafeArea(.all)
```


## 最終的なソースコード

```Swift
import SwiftUI
import MapKit

struct ContentView: View {
    @State private var location = MKCoordinateRegion(center: .init(latitude: 35.677735, longitude: 139.764740), latitudinalMeters: 500, longitudinalMeters: 500) //表示する座標、範囲設定、設定した座標を中心として表示

    var body: some View {
        Map(coordinateRegion: self.$location)
            .edgesIgnoringSafeArea(.all) //これを設定することで画面全体にマップを表示してくれる

    }
}
```
Sapperの後継と言われているSvelteKitを試してみるだけ

# はじめに
10月18日に行われたSvelte Summitで紹介されたSvelteKit。
Sapperの後継者として期待されているとも言われていたので、実際にローカルホストで立ち上げてみたいと思います。
詳しい内容を知りたい方はこちらをご覧ください。
[What's the deal with SvelteKit?](https://svelte.dev/blog/whats-the-deal-with-sveltekit)

# 新規プロジェクトの作成

まずディレクトリを作成して移動。

```bash
mkdir sveltekit-test && cd sveltekit-test
```
`npm init svelte@next`をすることで、SvelteKitの骨組みを用意することができます。

```bash
npm init svelte@next
✔ Use TypeScript in components? … yes
```

![SvelteKit-install](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325401/ff59d1cb-47ed-d401-e658-f031f92800fd.png)

Use TypeScript in components?はお好みで

作成が完了すると下記のようなディレクトリ構造になります。

```bash
.
├── README.md
├── package.json
├── snowpack.config.js
├── src
│   ├── app.html
│   ├── components
│   │   └── Counter.svelte
│   ├── globals.d.ts
│   └── routes
│       └── index.svelte
├── static
│   ├── favicon.ico
│   └── robots.txt
├── svelte.config.js
└── tsconfig.json
```

最後にローカルホストを立ち上げて動作を確認できれば完了です。

```bash
yarn
npm run dev -- --open
```

![localhost](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325401/220eb40e-77a3-9622-d2fe-0eb06d22b36e.png)

# 参考資料
[What's the deal with SvelteKit?](https://svelte.dev/blog/whats-the-deal-with-sveltekit)

# 宣伝

Qiita Advent Calendar 2020のライブラリ・フレームワーク部門に[Svelte](https://qiita.com/advent-calendar/2020/svelte)を作成致しました。
ご興味のある方は是非参加していただけると嬉しいです。
TS4.1のTemplate Literal Typesでフィールド名を一括置換した型を作成する

TypeScript 4.1から導入される、Template Literal Typesを使って遊んでみました。

# 今回やったこと

例えば、APIなどからは下のようにidとして受け取って

```typescript
interface RelationsAreIdEntity {
    categoryId: number
    groupId: number
}
```

IDを途中でオブジェクトに変換し、最終的には下のようなクラスにすることがあるとおもいます。

```typescript
interface Category {}
interface Group {}

interface Entity {
    category: Category
    group: Group
}
```

この時RelationsAreIdEntityとEntityを見ると、フィールド名と型がほとんど同じで、２回同じようなことを書くのが馬鹿らしく感じます。また、この例では1クラスかつ2フィールドだけですが、このフィールドや、クラスがどんどん増えてきたら、いちいちそれぞれのクラスをメンテするのも面倒になってきます。
なので、これをTemplate Literal Typesを使って手抜きする方法を試しました。

# 結果

```typescript

type IdFields = `${keyof Entity}Id`
type RelationsAreId = {
    [K in IdFields]: number
}
```
これだけで、RelationsAreIdが、RelationsAreIdEntityと同じ定義になります。

実際に使ってみると

```typescript

const correct: RelationsAreId = {
    categoryId: 1,
    groupId: 2
}
// CompileError: groupIdが無い
const compileError1: RelationsAreId = {
    categoryId: 1
}
// CompileError: categoryIdがnumberじゃない
const compileError2: RelationsAreId = {
    categoryId: "aaaa"
}
// CompileError: categoryIdが無い
const compileError3: RelationsAreId = {
    category: 1,
    groupId: 2
}
```

こんな感じになります。
Chrome版LINEをコマンドラインから開く [Linux]

# 結論

```
google-chrome --app=chrome-extension://ophjlpahpchlmihnnnihgmmeilfjmjjc/index.html
```

# 雑記
Linux環境でLINEを開く場合、
1. Chromeを開く
2. LINE Extensionをクリック

のような2度手間が発生していました。

各コマンドについて

* `google-chrome`: KDEのQuickLaunch等のアイコンに適用する場合は`which chrome`とかで実パスを調べましょう
私の環境では`/usr/bin/google-chrome-beta`でした。

* `--app=`: このオプションでURLバーとかが消えます。新規ウィンドウで開かれます。

* `chrome-extension://ophjlpahpchlmihnnnihgmmeilfjmjjc/index.html`: LINE Extensionの実体は32文字のIDで、これは拡張機能の詳細画面で確認できます。
また、index.htmlはすべてのアプリで同じではなく、拡張機能の種類によってhome.htmlとかapp.htmlとか様々です。

他にも

* `--new-window`: このオプションをつけると新規ウィンドウで開きます。
例) 新規タブで開く(URLバーとか付き。普通のリンクと同じ扱い):

```
google-chrome chrome-extension://ophjlpahpchlmihnnnihgmmeilfjmjjc/index.html
```

例) 新規ウィンドウで開く(URLバーとか付き。普通のリンクと同じ扱い):

```
google-chrome --new-window chrome-extension://ophjlpahpchlmihnnnihgmmeilfjmjjc/index.html
```

例) アプリっぽく開く(URLバーとかなし):

```
google-chrome --app-id=chrome-extension://ophjlpahpchlmihnnnihgmmeilfjmjjc/index.html
```
Scrum Fest Sapporo Day 1 参加レポート「Tsutomu Yasui - Happy Lucky XP ― ケント・ベックに教わったこと」

# Scrum Fest Sapporo Day 1 「Tsutomu Yasui - Happy Lucky XP ― ケント・ベックに教わったこと」

2020/11/06に開催されたScrum Fest Sapporoの発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/15008

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221788/d726137f-514d-4f7b-bde2-22a30680231c.png)
発表資料は[https://speakerdeck.com/yattom/happy-lucky-xp](https://speakerdeck.com/yattom/happy-lucky-xp)で参照できます。

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
このセッションはチーム7人中、3人で参加して、その場で実況しつつ、記事も作っています。

# Happy! Lucky! XP! が語呂いいことに気づいた

# XPとの出会い

IBMがXPを導入しておりそこでやってみようと思った

プラクティス

- ユーザストーリ
- ペアプロ
- テストファースト
- などなど（https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0）

XPはやりすぎなプラクティスでもある（エクストリーム＝極端）

# XP本初版

コードレビューがよいのであればいつでもやれば。
XXがよいのであれば、いつでもXXやればいいじゃない。
変更コストを低く抑えることは魔法のようには起こらない。
オブジェクト技術がキーとなる（オブジェクト指向）

# XP本2版

初版のプラクティスはエクストリームでなくなっていた
XPがあたりまえになり、みんなに浸透していた
プラクティスの特徴はフィードバックである

私がほかの人とプログラミングすることでFBをもらう　→ ペアプロ
私がテストを最初に書くことでFBをもらう → テスト駆動
すべてのプラクティスが誰かからフィードバックを得られるようになっている


# オブジェクト指向の原理

- アイデンティティ
	- オブジェクトが一位に識別できる
- 関係
	- 複数のオブジェクトに関係を持たせる
- メッセージパッシング
	- オブジェクトが関係でつながっていれば、メッセージを送れる
	- 関係があるからメッセージが渡せ

全体がよくなって、自分だけがよくなってもしょうがない

# 私というコンポーネント

コンポーネントは複数のオブジェクトで構成され、関連する機能を提供する単位。

- わたし
	- 右手
		- キーボード。自分の一部として使えている感覚
	- 自転車, 楽器, ペン。自分の体になじむ感覚。
	- 家族, 友人。自分の一部として感じる感覚。
	
関係性を経由して、いろんなものと繋がっている。
自分がどこまで関係しているかは、明確な関係性は分からない。

# Responsibility

- respond(v)=反応する
- rsponsible(adj)=反応できる
- responsibility(n)=反応できる能力

どこかの誰かと関係があるだろうか？
直接的には関係ないかもしれないけど、実はつながりがあるかもしれない。
そうなると、導出関係が生まれる。
関係がないのに関係ができる。
どこかの誰かが行った行動に、わたしが反応できるようになる。
一切反応しないよ、というのも反応。意識的な判断で行動できるようになる。

# [カルカソンヌ](https://www.famitsu.com/news/201512/22095955.html)

野原と道と街のタイルを繋げて、広げていくゲーム。
広がる世界の中でポイントを稼いでいくゲーム。
世界が広がっていくのが好き。
広がり続ける世界の中にある私。

# まとめ

XPから、*広がり続ける世界を看過する能力**を学んだ。

私にとってXPとは、裂け目を癒す試み。
砕けて分かれたものを、元に戻す。
わたしが元の姿に戻る試みが、XP。
調和を共有する試み。
ソフトウェア開発で人間としての欲求を満たすことである

**Happy! Lucky! XP!**

# 感想

- なんとなくXPしてたけど、「つながる」というのが１つキーワードなのかー
- すごく語呂がいい。癒された。
- XPをもう一度読み直してみたいな、と思った。関係性を広げていこう。
- XPのプラクティスが人からFBをもらえるようになっているというのは知らなかった。
剛体の衝突力学（平面）

剛体に撃力が加えられると，並進速度の変化だけでなく角速度の変化も発生する．この関係についてまとめる．

# 剛体の回転

## 慣性モーメント

![moment_of_inertia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669185/265592a3-ff4a-f767-4a2d-86c77c534361.png)

ある軸まわりの剛体の慣性モーメントを求めると，
$$
    I = \sum_i m_i r_i^2
$$
となる．ここで，$m_i$は軸から$r_i$離れた位置にある，剛体の微小分割．
これをさらに細かく分割して，微小体積$dV$の積分として表すと
$$
    I = \int \rho r^2 dV
$$
となる．ここで$\rho$は剛体の密度を表す．

## 剛体の回転

剛体に対して，軸回りにトルク$N$をかけたとき，剛体の角運動量$L$について以下が成立する．
$$
    \frac{{\rm d}L}{{\rm d}t} = I\ddot{\theta} =N
$$
ここで，$\theta$は剛体が軸周りに回転した角度．
外からトルクが加えられていない状況では，
$$
    \frac{{\rm d}L}{{\rm d}t} =0
$$
となり，$L$は一定となる．これを**角運動量保存則**という．
（概念を拡張して，$N\neq 0$のときも角運動量保存則と呼んだりする．）

## 慣性半径

**慣性半径 (Radius of Gyration)**$R$という量を定義すると便利なことがある．
$$
    MR^2 = I
$$
これは，剛体の質量$M$が，慣性モーメントを変えることなく軸から$R$の距離に集まっていると考えることができる．

## 平行軸の定理

ある軸周りの慣性モーメントが$I$であるとき，そこから$r$離れた軸回りの慣性モーメントは
$$
    I' = I + Mr^2
$$
となる．

# シンプルな振り子（準備）

質点$m$が長さ$l$の糸で点$O$から吊るされている．鉛直方向と振り子のなす角度を$\theta$とする．この系の$O$周りの慣性モーメントは
$$
I = ml^2
$$
であり，重力が及ぼすトルクは
$$
N = -mgl\sin\theta
$$
である．
したがって，角運動量保存則から
$$
\ddot{\theta} = -\frac{g}{l}\sin\theta
$$
となる．

# 剛体振り子

![rigid_pendulum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669185/42d0d2f3-8b5d-4ad1-b9eb-7b267d6582be.png)


固定された軸が質量中心を通らないような質量$M$の剛体振り子を考える．
剛体の固定点と質量中心を通る直線が鉛直方向となす角度を$\theta$とする．
この振り子の運動方程式は
$$
MR_O^2\ddot{\theta} = -Mgh\sin\theta
$$
ここで，$h$は距離$\bar{OG}$であり，$R_O$は$O$を軸とした慣性半径である．
この運動方程式は，
$$
l = \frac{R_O^2}{h}
$$
としたとき，質量$M$の質点のシンプルな振り子の運動方程式と一致する．
すなわち，質量$M$が半直線$OG$上の$O$から$l$離れた点$O'$に集まったときの振動が，剛体振り子の振動と一致する．
$$
l = h + h'
$$
$$
hh' = R_O^2 - h^2
$$
を満たすとき，点$O'$を**振動中心(center of oscillation)** と呼ぶ．


$G$まわりの慣性半径を$R_G$とすると，平行軸の定理から
$$
R_O^2 = R_G^2 + h^2
$$
となる．これを用いると，
$$
hh' = R_G^2
$$
が成立する．
この式は$h$と$h'$に関して対称である（すなわち，$h$と$h'$が入れ替わっても成立）．
すなわち，点$O'$を軸とした剛体振り子を作ると，その振動中心は$O$となる．

# 剛体に撃力を加える

![center_of_percussion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669185/f884393a-f6cb-ba16-11a6-1dce088d6ac4.png)


点$O$を軸として固定された剛体振り子を考える．
軸から$l$離れた位置にある点$O'$に撃力を加える．
撃力は直線$\bar{OO'}$に垂直な向きを向いているとする．
$O'$が，直線$\bar{OO'}$が質量中心$G$を通るとして，$h$と$h'$をそれぞれ距離$\bar{OG}$，$\bar{OG'}$とする．
点$O'$に加えられた撃力は
$$
J' = \int F' {\rm d}t
$$
である．このとき，点$O$では，固定された軸が動かないように撃力$J$が発生する．
$$
J = \int F {\rm d}t
$$
剛体の（線）運動量変化は
$$
\frac{{\rm d}P}{{\rm d}t} = \frac{{\rm d}}{{\rm d}t}(Mh\dot{\theta}) = F+F'
$$
である．ここで，$\dot{\theta}$は剛体の$O$周りの角速度．
これを積分して，撃力による運動量の変化は
$$
Mh\dot{\theta} = J+J'
$$
となる．ただし，剛体は撃力を加える前は静止していたものとした．
$O$周りの角運動量保存則は，
$$
\frac{{\rm d}L}{{\rm d}t} = \frac{{\rm d}}{{\rm d}t}(MR_O^2\dot{\theta}) = F'l
$$
であり，これを積分して
$$
MR_O^2\dot{\theta} = J'l
$$
を得る．
以上の結果を用いて$\dot{\theta}$を消去すると，
$$
hl = R_O^2\left(1+\frac{J}{J'}\right)
$$
となる．

ここで，$O'$をいい感じの場所にとって，$J=0$とすることを考えよう．このとき，$h$と$l$の関係は
$$
hl = R_O^2
$$
となる．
$l = h + h'$と，$R_O^2 = R_G^2 + h^2$から
$$
hh' = R_G^2
$$
という関係が得られる．
点$O'$に撃力を加えたとき，点$O$では角速度変化が一切生じない．
このような点$O$を，**撃力中心(Center of percussion)** と呼ぶ．
撃力中心と振動中心が同じ点であることに注意しよう．

剛体が固定されておらず，撃力中心$O'$に撃力が加えられたとき，その直後の運動は$O$周りの回転となる．

このような点は，野球でバットを振る場合などに有効である．
球を打ち返すときに，撃力中心に当てるようにすれば，回転中心である手に返ってくる力はゼロとなる．

# Reference

K. Symon, "Mechanics", Addison-Wesley Publishing, 1971.
秘密管理がDevOpsに不可欠な理由

**DevOps**戦略を成功させるためには、効果的な管理が不可欠です。鍵の管理は大規模な組織だけのものだと思っているかもしれませんが、私は...。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/using-secrets-management-to-enhance-devops_539309)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

クリス・ライリー著

開発者が自律性を高め、セルフプロビジョニングされたインフラストラクチャなどのオンデマンドサービスにアクセスできるようになると、開発者はアプリケーションの構築とデプロイの方法に柔軟性を持つようになります。しかし同時に、開発者は、より多くのツールのライブラリを管理し、維持するという側面を継承することになります。これは、すでに定期的に作業しているものに加えて、さらに別のクラスのツールを作成して、より多くの作業を継承しないようにする必要があることを意味しています。そのようなツールの一つが秘密管理です。

[アリババの鍵管理サービス](https://www.alibabacloud.com/product/key-management-service?spm=a2c65.11461447.0.0.5a9d31b8AXpSYV)のような秘密管理ツールは、開発チームの全員に、パスワードやAPIトークンなどの機密鍵を保存、共有、アクセスするための安全な場所を提供します。

多くの開発チームは、鍵を探すのにどれだけの時間を費やしているのか、あるいはチャットクライアントのような非中央集権的な方法で鍵をチームメンバーに振り分けることによってもたらされるリスクを認識していません。鍵の管理は大規模な組織だけのものだと思うかもしれませんが、単一の開発者チームに利益をもたらすことができます。また、組織のDevOps目標を迅速に達成し、改善するのにも役立ちます。

###秘密の管理：ハウスキーピングだけではない
現代のアプリケーション開発では、アプリケーションのテストやキー管理のような要素は、パイプラインを衛生的に保つために行う単純なハウスキーピング項目のように見えるかもしれません。しかし、これらの要素は、開発プラクティスでさらに多くのことを行うための方法であることに変わりはありません。ここでは、鍵管理が開発チームがセキュリティの枠を超えてどのように役立っているかをご紹介します。

1.) マイクロサービス：アプリケーション開発環境は、複数の可動部分で構成されています。外部 API、フレームワーク、アプリケーションの認証情報、クラウドサービスの認証情報、ポリシー・トークン、およびオペレーティング・システムがありますが、これらはすべて何らかの関連する秘密を持っています。しかし、マイクロサービスのような現代的なアーキテクチャを考えると、さらに多くのものがあります。マイクロサービスベースの優れたアプリケーションアーキテクチャとは、自律的なサービスがコンテナ上で自動的にプロビジョニングされ、独自のクレデンシャルを持つより多くのインスタンスが自動的に生成されることを意味します。

2.) コミュニケーション：集中管理された鍵管理ソリューションを使用すると、チームメンバーは秘密を探したり、持っていない秘密をチームメンバーに尋ねたりする必要がありません。また、メッセージングサービスを介して秘密を共有するというリスクの高い行動をする必要もありません。強力な鍵管理システムは、秘密に関するコミュニケーションを完全に排除することを意味します。開発者がコンテナにアクセスする必要がある場合、許可されている限り、資格情報はキー管理システムにあり、誰とも対話する必要がないのです。

3.) アジャイルなアクセスコントロール：すべての人がすべてにアクセスできるわけではありません。昔のITと開発の時代には、ITは通常、クレデンシャルのゲートキーパーであり、多くの企業では今後もそうなるでしょう。従来、IT部門は、開発者がサービスや計算機へのアクセスを必要とする理由を理解していたとしても、常にアクセスを阻止しようとしていました。その代わりに、ログデータやその他の部分的なアクセスを与えることで、環境変数の雪の結晶がさらに増えていました。このため、新機能の開発が遅れ、すべてのリクエストに対応するために IT チームに余分な作業が多く発生していました。秘密の管理システムを使えば、開発者は必要なものにアクセスでき、必要でないものにはアクセスできません。開発者が広範囲にアクセスして何かを壊してしまう心配も少なくなります。また、セキュリティの共有と更新のマニュアル的な側面が排除されるため、IT 部門は迷うことが少なくなり、心配する管理者の数も減ります。

現代の鍵管理ソリューションには、アクセス制御や鍵と値のペアの保存を超える機能が必要です。また、最新の開発チームやアプリケーション・アーキテクチャに必要な自動化を構築できるように、DevOpsチームがAPIを介して統合ポイント（ネイティブまたはカスタム）を持つ必要があります。

###セキュリティの面白さ
アプリケーション開発において、セキュリティはもはや異質なトピックではありません。開発者は、アプリケーションを悪用するために使用される秘密を不注意で開示した場合の責任があります。このような単純な理由から、鍵管理ソリューションは、会社、IT、および開発者にとっての保険となります。不満を持った従業員が会社を辞めた場合に、簡単に解決策を提供します。クレデンシャルが乱立して共有された場合のヒューマン・エラーを軽減し、全員の説明責任を構築することができます。セキュリティのニーズは、新しい脅威が発生するたびに常に変化しており、チームは新たな課題に直面しています。セキュリティはジョブセキュリティです。

###結論
アプリケーション開発に関連する秘密は、組織のサイズではなく、アプリケーションのサイズと複雑さに関連しています。秘密管理は、健全なソフトウェア・デリバリー・チェーンを構築し維持するための適切な衛生管理であり、多くの企業にとっては、DevOpsの実践と原則の次のステップへとパイプラインを進めるための方法です。

[Alibaba Cloudの鍵管理サービス](https://www.alibabacloud.com/product/key-management-service?spm=a2c65.11461447.0.0.5a9d31b8AXpSYV)を自分自身で試すには、現在Alibaba Cloudが提供している[300ドルの無料クレジット](https://www.alibabacloud.com/campaign/free-trial?spm=a2c65.11461447.0.0.5a9d31b8AXpSYV)を利用してみてはいかがでしょうか。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*
初めてのマイグレーション

# マイグレーションとは
DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更などを行うためのもの

# マイグレーションのやり方（初回）
Entity Frameworkを使ったマイグレーションの方法をメモする

### 1.Entity Frameworkのインストール
1. 「ツール」>「Nugetパッケージマネージャー」>「ソリューションのNugetパッケージの管理」
2. 参照タブの検索欄で「EntityFramework」を入力し、「EntityFramework」を選択
3. インストールしたいプロジェクトにチェックを付けてインストールをクリック

### 2.テーブルの作成

```c#:Person.cs
public class Product
{
    public int PersonId { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}
```

### 3.Contextクラスの作成

```c#:MemberContext.cs
class MemberContext : DbContext
{
    public DbSet<Person> Persons { get; set; }
}
```

### 4.マイグレーションの準備

「表示」>「その他のウィンドウ」>「パッケージマネージャーコンソール」
コンソール画面を開き、以下のコマンドを入力

```
PM> Enable-Migrations
 ```

「Migrations」フォルダが作成されることを確認する

### 5.テーブルの新規作成
パッケージマネージャーコンソールに以下のコマンドを入力

```
PM> Add-Migration CreatePersons
 ```

「Migrations」フォルダの中にファイルが作成されていることを確認
※「202011060546053_CreatePersons」のような「年月日+UTC_入力したファイル名」というファイル名が作成されている

### 5.テーブルの更新
パッケージマネージャーコンソールに以下のコマンドを入力

```
PM> Update-Database
 ```
無事コマンド発行が成功すると、DBにPersonsテーブルが生成される

# マイグレーションのやり方（二回目以降）
既に作成したDBに対して、変更を加えるための方法をメモする

### 1.テーブルの修正
「Person」テーブルに「Birthday」を追加する

```c#:Person.cs
public class Product
{
    public int PersonId{ get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime Birthday { get; set; }
}
```

### 2.更新用のマイグレーションファイルを作成する
パッケージマネージャーコンソールに以下のコマンドを入力

```
PM> Add-Migration ChangePersons_Birthday
 ```

### 3.テーブルの更新
パッケージマネージャーコンソールに以下のコマンドを入力

```
PM> Update-Database
 ```
無事コマンド発行が成功すると、Personsテーブルに「Birthday」が追加される
[Android]GsonからMoshiに移行しようとした時、ビルドができなくなった

## 状況
GsonからMoshiに移行した時にビルド時にエラーが出てしまった。

## Mohsiをプロジェクトに追加する
以下をgraldeに追加しMoshiを既存プロジェクトに入れる。

```Kotlin:gradle.app
    def moshi_version = '1.5.0'
    implementation "com.squareup.moshi:moshi:$moshi_version"
    implementation "com.squareup.moshi:moshi-kotlin:$moshi_version"
```

ビルドすると、下記エラーが出た。

## エラー内容
`Duplicate class kotlin.reflect.KClasses found in modules jetified-kotlin-reflect-1.1.1.jar (org.jetbrains.kotlin:kotlin-reflect:1.1.1) and jetified-kotlin-stdlib-1.3.72.jar (org.jetbrains.kotlin:kotlin-stdlib:1.3.72)
Go to the documentation to learn how to Fix dependency resolution errors.`


## 解決方法
gradleに一行追加したらビルドできた。

```Kotlin:gradle.app
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
```
Flyweight Pattern

#Flyweight Pattern
<font color="#00f">インスタンスを多重生成せずに使いまわしてメモリに優しくなる
</font>

このページでは下記について記載します
・Flyweightの基本構成
・実装

[Design Pattarm MENU](https://qiita.com/old_cat/items/852d980bedb9100dd7e3)

##Flyweightの基本構成
|クラス|説明|
|------|-------|
|factory.class|sam.classのインスタンスを重複生成させない|
|sam.class|userがインスタンスを生成する対象クラス|
|user(Main.class)|factory.classを経由してsam.classインスタンスを生成する|
＊user　他の開発者がこのパターンを利用する、という意味合いを含みます
＊user　他の開発者がこのパターンを利用する、という意味合いを含みます
factory.classとsam.classの基本構造

```java:factory.class
class factory{
  Map map;
  sam getSam(){}
}
```
factoryでは、生成したsam()インスタンスをMapで保持し
重複しないよう管理します

```java:sam.class
class sam{
  String s;
  sam(){}
}
```
sam()はコンストラクタでString sを登録します

下記で基本的な構造を実装します

```java:factory.class
class factory{
  Map map = new HashMap();        // sam()インスタンスを格納します
  sam getSam(String key){         
      sam s = (sam) map.get(key); // mapからインスタンスを取得します
      if(s != null){return s;}    // mapにインスタンスがあればuserに渡します
      sam sm= new sam(key);       // mapにインスタンスがなければインスタンスを生成
      map.put(key,sm);            // インスタンスを新規生成したらmapに登録します
      return sm;                  // userにインスタンスを発行します
  }
}
```
```java:sam.class
class sam{
  String s;
  sam(String s){}
}
```

##実装
前述のコードには問題があります。
factoryにはMapを持たせsam()インスタンスを管理させますが
factory自身が複数インタンス化されると、その数だけ異なるMapが誕生します

そうなると適切にsam()インスタンスを管理できません
そこでfactory.classをシングルトンとします
（それだけではMapの複製を防げないのですがとりあえずの処理として）

さらに検証できるようMap内容を表示するprint()メソッドも実装します

```java:factory.class
class factory{
  Map map = new HashMap();
  private static final factory fac = new factory();

  private factory(){}
  static  factory getInstance(){
          return fac;
  }

  sam getSam(String key){
      sam s = (sam) map.get(key);
      if( s != null){return s;}
      sam sm = new sam(key);
      map.put(key,sm);
      return sm;
  }

  void print(){
    Iterator it = map.keySet().iterator();
    while(it.hasNext()){
      sam s = (sam) map.get(it.next());
      System.out.println(s+":"+s.get());
    }
  }
}
```
```java:sam.class
class sam{
  private String s;
  sam(String s){this.s=s;}
  String get(){return this.s;}
}
```
```java:user(Main.class)
public static void main(String[] args){
  factory f = factory.getInstance();
  f.getSam("a");
  f.getSam("b");
  f.getSam("c");
  f.getSam("a");
  f.print();
}}
```
複数のテーブルからデータを取り出す

### はじめに
SQLの学習を始めるにあたって、備忘録として学習内容を書いていきます

#### テーブル結合
2つ以上のテーブルからあるカラムの値を基にしてテーブルを連結して、1つの結果として取り出す事を**テーブル結合**という

テーブル結合には以下のような種類がある

- 直積結合
- WHERE句を使用した結合
- 内部結合
- 外部結合

#### カラム名を修飾する

テーブルとテーブルを結合する際に、あるカラムを基に結合するため、少なくとも1つは共通のカラムが存在する必要がある

異なるテーブルだけれど、同じ名前のカラム名を以下のような書き方で示す。

`テーブル名.カラム名`

#### テーブルに別名をつける

テーブルを結合する際に「Aテーブル.id」「Aテーブル.name」のようにSQL文を書くと長いテーブル名だと手間がかかり大変

なので、**テーブルに別名をつける**とこのデメリットは解消される

**FROM句のテーブル名の後ろに半角空白を入力して、テーブルの別名を記述する**

#### 直積結合

直積結合とは、**各テーブルに存在するレコードの組み合わせ全てを取り出す結合**

`SELECT カラム名 FROM テーブル名1 CROSS JOIN テーブル名2;`

実際に使う場面はほぼない。結合の基礎を知る上では大切

#### WHERE句を使って結合する

直積結合にWHERE句を追加するとWHERE句に設定した条件の結合を行う事ができる

`SELECT カラム名 FROM テーブル名1,テーブル名2 WHERE　結合条件;`

書き方としては古い表現ではあるが、現在でも使われている結合方法である

最近ではJOIN句を使って表現する事が多い

#### 条件を満たした行を結合する（内部結合）

WHERE句を使った結合と同様に、**指定した結合条件に一致するレコードのみを取り出して結合する方法が内部結合**

`SELECT カラム名 FROM テーブル名1 (INNER) JOIN テーブル名2 ON 結合条件 (WHERE 取得したいレコードの条件);`

#### 条件を満たしていない行も結合する（外部結合)

テーブル名1またはテーブル名2のどちらか一方にしかないレコードも取り出す

`SELECT カラム名 FROM テーブル名1 LEFT OUTER JOIN (RIGHT OUTER JOIN) テーブル名2 ON　結合条件 (WHERE 取得したレコードの条件);`

基本的に3つ以上のテーブル結合を行う場合は、左側のテーブルを基準に結合していくため、それに適した`LEFT OUTER JOIN`を使う方が良い

#### 自己結合

テーブルには自分自身、つまり同じ名前のテーブルを結合する事ができる。これを**自己結合**という

この場合は`AS`を用いて別名をつける必要がある。(テーブルに同じな名前のテーブルを結合するので、単純に実行するとカラム名が2つ表示されてしまい、識別できないのでエラーになる)

`SELECT カラム名 FROM テーブル名 AS 別名1 JOIN テーブル名 AS 別名2;`

自己結合は順位付けを行なう時に有効である

上のSQL文に続けてした文を記述すると
`WHERE 別名1.カラム名<=別名2.カラム名 group by 別名1.主キー`
で順位が表示される
[Material Design] Icons のvisibility / visibility_off をパスワード入力のTextFormField で利用する場合、テキストが見えているときにvisibiltyを表示するべきなのか、見えないようにしますよという意味合いでvisibility_off を表示するべきなのか考えた結果

visibility
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132323/f99f9f5c-d65e-69bd-3a24-a9a2638fbd89.png)

visibility_off
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132323/b02e52e7-4362-0af1-07ba-22fd36a964f3.png)

#結論
以下の理由により、テキストが見えているときに「visibility」、隠しているときに「visibility_off」を使う方がMaterial Designに沿っているように感じました。

・公式のページにテキストが見えているときに「visibility」を表示している図がある
<a href="https://material.io/components/text-fields#filled-text-field">MATERIAL DISIGN > Components > Text fields > Filled text field
</a>

・Android 端末のロック解除画面でもテキストが見えているときに「visibility」が表示される

ただし、色々なアプリを見てみるとテキストが見えているときに「visibility_off」を表示しているものもそこそこあり、用途によりどちらの使い方もアリなのだと思いました。
VGGFace2データセットをサーバに直接ダウンロードする

# はじめに
VGGFace2というデータセットがあり、データをダウンロードするにはログインする必要があります。
合わせて40ＧＢほどのデータセットなので、ローカルにダウンロードせず、AWS上のサーバにダウンロードしたいですよね。
しかしAWS上のサーバはCUIなので、ブラウザを開いてログインしてダウンロードというステップはできません。
そこで本記事ではCUI環境でもログインしたのと同じ状況でwgetを使用してダウンロードできる方法を解説します。
# ローカル環境のcookiesを確認する
まずはローカル環境で次のサイトを開き、ログインします。
http://zeus.robots.ox.ac.uk/vgg_face2/
そのサイトでは、ログイン後はtokenが発行されcookiesで管理されています。
そのcookiesを使用すれば、CUIでもダウンロードできるようになります。
cookiesを見るのには、chromeのdeveloper toolsを使用し、「applications」タブを開き、cookiesをクリックするとサイトで使用されているcookiesの一覧を確認することができます。

# cookies.txtをダウンロードする
cookiesを使用して、wgetをするためにはcookies情報をtxtとしてフォーマットに合わせて保存する必要があります。
手動でフォーマットに合わせて書いてもよいのですが、Chrome extensionで「get cookies.txt」というものがあり便利なので使いましょう。
https://chrome.google.com/webstore/detail/get-cookiestxt/bgaddhkoddajcdgocldbbfleckgcbcid/related
cookies.txtをダウンロードできたら、cookies.txtをサーバ上に保存しましょう。
# wgetでdatasetをダウンロード
さてここでログイン情報を持つcookiesの準備は整いましたので、あとはwgetを使ってダウンロードするだけです。
VGGFace2のdatasetのダウンロードリンクは、下記です。
下記のリンクは、datasetのダウンロードページのリンクを右クリックしてリンクを取得することで調べました。
> Train Data_v1. http://zeus.robots.ox.ac.uk/vgg_face2/get_file?fname=vggface2_train.tar.gz
Test Data_v1 http://zeus.robots.ox.ac.uk/vgg_face2/get_file?fname=vggface2_test.tar.gz
Train_Images_v1. http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/meta/train_list.txt
Test_Images_v1. http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/meta/test_list.txt

cookies.txtを使用するwgetコマンドは下記です。このコマンドを叩くときにcookies.txtを同じフォルダに入れる必要があります。

```
wget --load-cookies cookies.txt -r -k -E  url
```

次のように、36GBもあるtrain dataをサーバに直接ダウンロードしましょう。

```
wget --load-cookies cookies.txt -r -k -E  http://zeus.robots.ox.ac.uk/vgg_face2/get_file?fname=vggface2_train.tar.gz
```
IBM Cloud(Classic Infrastructure)で25Gbps portが利用できることを確認してみた

(2021/03/04)
TOK02/TOK04/TOK05で新たに選択できることを確認。OSAはまだみたいです。

- https://www.ibm.com/cloud/blog/announcements/newly-released-25gbe-standard-on-ibm-cloud-bare-metal-servers
- https://cloud.ibm.com/docs/bare-metal?topic=bare-metal-network-options&locale=en

Baremetal Serverで対応しているのは、以下のサーバーのみです。

- 月額課金
- Dual Processor以上
- 12 Driver以上
- Cascade Lake
    - Intel Xeon 4210
    - Intel Xeon 5218
    - Intel Xeon 6248
    - Intel Xeon 6250
    - Intel Xeon 8260
- OS
    - CentOS 8.2
    - RHEL 8.2
    - RHEL 8.2 for SAP
    - Windows Server 2016, 2019
    - VMware 6.5, 6.7


#1. はじめに

IBM Cloudの物理サーバーは

- Public NW: 10Gbps x 2 port
- Private NW: 10Gbps x 2 port

のネットワーク構成が標準ですが（SAP環境とかだと特別にNIC追加の例外許可が得られる）、なんとVMware on IBM Cloudで、

- Public NW: 25Gbps x 2 port
- Private NW: 25Gbps x 2 port

のネットワークが選択できるようになっています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/56fa27e0-76c7-b73a-a576-7e3d2494db1c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/2869c83c-bef2-4684-68b5-39107a8e28d5.png)


なお、Skylake系やSAP系ではまだ選択できず、Cascade Lakeでのみの提供であり、vSphere6.7である必要があります。また、通常の物理サーバーの注文でも選択できません。ただし、もう少し（？）待てば他のDCでも使えるようになり、vSphere以外のOSでも利用できるようになるように準備中とのことです。楽しみですね！

#2. 本当に25Gbpsポートが割り当てられているか確認してみる。

（予算も限られているので）１台から注文可能な、VSSで25Gbps構成を注文してみた結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c713c87f-2aba-27c6-b5f4-d305b9275509.png)

Network Cardの欄にある、`E810-XXVDA4`は確かに25Gbpsをサポートしていそうです。
https://ark.intel.com/content/www/us/en/ark/products/192560/intel-ethernet-network-adapter-e810-xxvda4.html

```txt:vmnicは25Gbpsをサポート
[ibmvmadmin@vss25g000:~] esxcfg-nics -l
Name    PCI          Driver      Link Speed      Duplex MAC Address       MTU    Description
vmnic0  0000:3b:00.0 icen        Up   25000Mbps  Full   b4:96:91:9c:f8:00 1500   Intel(R) Ethernet Controller E810-C for SFP
vmnic1  0000:3b:00.1 icen        Up   25000Mbps  Full   b4:96:91:9c:f8:01 1500   Intel(R) Ethernet Controller E810-C for SFP
vmnic2  0000:3b:00.2 icen        Up   25000Mbps  Full   b4:96:91:9c:f8:02 1500   Intel(R) Ethernet Controller E810-C for SFP
vmnic3  0000:3b:00.3 icen        Up   25000Mbps  Full   b4:96:91:9c:f8:03 1500   Intel(R) Ethernet Controller E810-C for SFP

[ibmvmadmin@vss25g000:~] esxcli network nic get -n vmnic0
   Advertised Auto Negotiation: true
   Advertised Link Modes: Auto, 10000BaseSFI/Full, 25000BaseCR1/Full
   Auto Negotiation: true
   Cable Type:
   Current Message Level: 0
   Driver Info:
         Bus Info: 0000:3b:00:0
         Driver: icen
         Firmware Version: 2.00 0x80003f84 1.2751.0
         Version: 1.0.6
   Link Detected: true
   Link Status: Up
   Name: vmnic0
   PHYAddress: 0
   Pause Autonegotiate: false
   Pause RX: false
   Pause TX: false
   Supported Ports:
   Supports Auto Negotiation: true
   Supports Pause: true
   Supports Wakeon: false
   Transceiver:
   Virtual Address: 00:50:56:5c:0c:81
   Wakeon: None
```
SQL Server: 数千万レコードのデータが入ったサンプルDBを公開しました

# 背景
サンプルのデータベースはMicrosoftも公開しています。（[例えばこちら](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0))
命名規則など参考になる部分もあり、リレーションも沢山存在するので様々な用途で使えるDBです。

ただ、クエリチューニングの実験をする際にはレコード数がもっとあった方が良いなと思ったので、自作してみました。

# 作り方
[dbForge Data Generator for SQL Server](https://www.devart.com/dbforge/sql/data-generator/download.html)という製品を使用しました。任意のテーブルに対して、ランダムなダミーデータを大量に作成することができます。フリー版だとレコード数に制限があり、製品版を購入して作成しました。
この製品を使って自作したDBの公開も自由となっています。

# DBの概要
沢山テーブルを作るのは大変だったので、以下の2つのテーブルからなるシンプルなDBを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/130decf6-f2de-97ba-c7db-f5eb4556af0f.png)

また、レコード数の違いによるパフォーマンスの違いなどを実験できるように、レコード数が異なるDBを3種類作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/6f6849c0-b183-87b3-af7e-d4ad83a82ca9.png)

# ダウンロードURL
[こちら](https://drive.google.com/drive/u/2/folders/13xVm-alJ2kzuDQyDVvWxSyUR5i6lWx_5)からダウンロードし、ご自由にお使いいただけます。SQL Server 2012以降であればリストア可能のはずです。
先日公開した「[SQL Server : テーブルサイズの変化とクエリ実行速度の関係性について](https://qiita.com/maaaaaaaa/items/1bbb7b3b02180997e9a2)」というブログでも、このデータベースたちを使用して実験しました。

※電話番号/EMailもランダムに生成していますが、実在する可能性があるため別用途での使用はしないでください。
CloudFrontとS3を連携させたらSignatureDoesNotMatchって言われた

非公開なS3バケットにコンテンツファイルを置いて、CloudFrontで連携してインターネット側に公開して、いざブラウザで動作確認しようとしたら下記のようなXMLなエラーが表示された。

```
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
```

いやいやいや、別環境で手順書作ったときはさっくり行きましたやん…
ひとまずエラーメッセージでググると [AWS CLIでSignatureDoesNotMatchになった](https://qiita.com/tettsu__/items/165afe4570f27468b90f) という投稿が。

要はCloudFront側の秘密鍵？にたまたまバグる文字が入っちゃったのね？
ディストリビューション再作成して、その鍵も再作成されたら直るといいなー、とやってみたらすんなり行けました。
競プロのライブラリ整理~サイコロ~

ICPC用にサイコロのライブラリを作成しました。本番ではサイコロが出なかったので悔しいですが、今後出る方の参考になれば嬉しいです。回転操作の実装などは[うしさんのライブラリ](https://ei1333.github.io/luzhiled/snippets/other/dice.html)を参考にしています。
また、それぞれの面のアルファベットおよび回転の関数は自分のわかりやすい名前にしているので、使う際には都合の良いように書き換えてください。

#サイコロの図

下図において、サイコロの面のuはup,dはdown,fはfront,bはback,lはleft,rはrightを表します。つまり下図において**y軸の負の方向が前面を表し,x軸の正の方向が右面を表します**。他の面についても同様に英語に対応します。

![IMG_0742.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331393/4f0c3bac-e49a-8488-44c2-faf2fb060d3c.jpeg)



#コードの説明

サイコロを置くとき、**反対側には来ない二面を指定する**とサイコロの置き方は一意に決まります。また、サイコロの置き方は上の面を固定してから横の面の場合分けを考えることで決まるので、全部で24通りあります。その24通りをすべて書き出したのがクラス変数のstateになります。つまり、初期化の時点でわかっている2面の情報を与えることで初期化を行うことができます。また、**初期化で与えられた二面を持つサイコロが存在しないときはエラー出力をする**ようにしています。そして、サイコロの初期位置座標で初期化する必要があることも注意してください。

初期化が行えると、あとは**6方向の回転を実装するのみ**となります。このとき、それぞれのRotate関数には大文字のアルファベットが末尾についておりそれぞれ回転方向を表します。また、y軸の正方向を北(North),負方向を南(South),x軸の正方向を東(East),負方向を西(West)としています。そして、座標を変えない回転方向は前面から見て左方向(Left),右方向(Right)としています。この関数内ではサイコロの面を入れ替えるとともに、座標を変える4方向の回転については座標の値も更新します。

#コード

```python:dice.py
# coding: UTF-8
import sys

class Dice:
    #サイコロの全状態(u,d,f,b,l,rの順)(u+d=f+b=l+r=7が成り立つ)
    state=[[1,6,2,5,4,3],[1,6,3,4,2,5],[1,6,4,3,5,2],[1,6,5,2,3,4],
           [2,5,1,6,3,4],[2,5,3,4,6,1],[2,5,4,3,1,6],[2,5,6,1,4,3],
           [3,4,1,6,5,2],[3,4,2,5,1,6],[3,4,5,2,6,1],[3,4,6,1,2,5],
           [4,3,1,6,2,5],[4,3,2,5,6,1],[4,3,5,2,1,6],[4,3,6,1,5,2],
           [5,2,1,6,4,3],[5,2,3,4,1,6],[5,2,4,3,6,1],[5,2,6,1,3,4],
           [6,1,2,5,3,4],[6,1,3,4,5,2],[6,1,4,3,2,5],[6,1,5,2,4,3]]

    #u,d,f,b,l,rをそれぞれ0,1,2,3,4,5としてstate1,state2に指定
    #value1,value2はそれぞれstate1,state2に対応する面の目
    #nowは初期位置の座標
    #適切でない場合はエラー出力
    def __init__(self,state1,value1,state2,value2,now):
        self.now=[now[0],now[1]]
        for i in range(24):
            if Dice.state[i][state1]==value1 and Dice.state[i][state2]==value2:
                self.u,self.d,self.f,self.b,self.l,self.r=Dice.state[i]
                break
        else:
            print('Error:Constructor\'s Argument is missing.',file=sys.stderr)
            exit()

    #上から見てy軸の+方向に回転(後面が下面に！)
    def RotateN(self):
        self.d,self.f,self.u,self.b=self.b,self.d,self.f,self.u
        self.now[1]+=1

    #上から見てy軸の-方向に回転(前面が下面に！)
    def RotateS(self):
        self.d,self.f,self.u,self.b=self.f,self.u,self.b,self.d
        self.now[1]-=1

    #上から見てx軸の+方向に回転(右面が下面に！)
    def RotateE(self):
        self.d,self.l,self.u,self.r=self.r,self.d,self.l,self.u
        self.now[0]+=1

    #上から見てx軸の-方向に回転(左面が下面に！)
    def RotateW(self):
        self.d,self.l,self.u,self.r=self.l,self.u,self.r,self.d
        self.now[0]-=1

    #前から見て左回転(反時計回り)
    def RotateL(self):
        self.f,self.l,self.b,self.r=self.r,self.f,self.l,self.b

    #前から見て右回転(時計回り)
    def RotateR(self):
        self.f,self.l,self.b,self.r=self.l,self.b,self.r,self.f
```


#verifyした問題

[AOJ Biased Dice](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1181&lang=ja)
提出→http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=4985962