OmniAICreator/Qiita-1.07M huggingface dataset:
【CI/CDツール】Jenkinsに触れてみる

# Jenkinsとは
今回はCI/CDツール(継続的インテグレーション/継続的デリバリー)のJenkinsを触ってみました。
以前GitLab上の拡張機能であるRunnerに触れてみましたが、今回使用するJenkinsはCI/CDに特化したツールであるためプログラムの自動ビルドに対して様々な機能を持っているようです。
JenkinsもGitLabと同様無償版が提供されていますので、気軽に試すことができます。

# ジョブ作成
まず最初にJenkinsで動作させるジョブを作成します。
以下画像がJenkinsのトップ画面となります。トップ画面にある「新規ジョブ作成」をクリックします。
![Jks_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/51cbc691-20ad-31ed-127b-53730fde4574.png)
すると以下のような画面に移りますので、以下青枠内に任意のジョブ名を入力します。
今回は汎用的なジョブを作成しますので、緑枠の「フリースタイル・プロジェクトのビルド」をクリックします。
それからオレンジ枠の「OK」をクリックします。
![Jks_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/c3a17a33-f714-0195-1a24-d906724cd9c5.png)
ジョブの基本設定を実施後以下の詳細設定画面に移動します。
ここでジョブの細かい動作を設定する事ができます。
ジョブの詳細設定はあとからでも設定可能なので、一旦一番下にある「保存」をクリックしてジョブの作成を完了します。
![Jks_031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/504d1d8a-b487-d6c2-7562-1d4c9576db51.png)
![Jks_032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/5214b9fc-3ee5-ace2-caec-0b9a20285cb9.png)
ジョブの作成が完了すると以下のように「プロジェクト　＜プロジェクト名＞」の画面に移動します。
![Jks_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/2e02bcc6-a907-c2f0-8d0e-cf56954dccb4.png)

# ジョブの設定
ジョブの作成は完了しましたが、ジョブ自体に何も設定していないのでこのままでは何も出来ません。
簡単な動作を実行する設定を追加してみます。
以下画面の「設定」をクリックすると先程のジョブの詳細設定画面に移動します。
![Jks_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/40043a62-e9eb-81d8-fe7e-e5ded841cfa0.png)
今回は単純なシェルスクリプトの実行を行います。
「ビルド」から「シェルの実行」を選択し、四角いテキストボックス内に以下のコマンドを入力しました。

```
DATE=`date "+%Y%m%d%H%M%S"`
touch $DATE.txt
ls -l
```
設定が完了したら以下オレンジ枠の「Apply」をクリックして「保存」をクリックします。
（実は「Apply」を押さずとも「保存」をクリックすれば設定は反映されます）
![Jks_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/1fe5698e-95aa-32a7-5195-9bee14177022.png)
設定完了後、左側にある「ビルド実行」をクリックします。
![Jks_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/c26a824e-8a8a-60f2-50c8-1a69e3704f42.png)
しばらく待つと（といっても単純なコマンドしか実施していないので一瞬で完了しますが）以下画面の赤線部に青い丸と「#1」という表記が追加されます。
「#1」をクリックします。
![Jks_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/04b87be5-ed52-7566-871f-ecbdc046fa18.png)
すると以下のような画面に移動します。
ここで実行したジョブの情報を確認することができます。
以下画面の「コンソール出力」をクリックします。
![Jks_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/fa20a85d-33e5-280b-f022-c677a0ab8e53.png)
コンソール出力の画面で、先程設定した３つのコマンドを実行している結果が表示されています。
青枠内に作成した空のテキストファイルが表示されていますので、問題なくコマンドが全て実行出来ていることが分かりました。
オレンジ枠内に書いてある「Finished: SUCCESS」という表記は、ジョブが全て実行完了したことを表しています。
![Jks_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/8bc1eb54-0222-c993-89ca-8d93e8505779.png)
以上で基本的なジョブの触り方は完了です。
今回まででプログラムファイルの管理ツールのGitLab,プログラムの自動ビルドツールのJenkins,ビルド後の成果物を格納するArtifactoryの使い方を学習出来たので、次回は３つのツールを組み合わせた動作を試してみたいと思います。
Docker ComposeでLaravel開発環境を構築その参

前回、docker-compose.yml達と一緒にLaravelをリポジトリ管理して、かなりスッキリした。
[Docker ComposeでLaravel開発環境を構築その弐](https://qiita.com/_bobtabo_/items/8dae5b256f1454c082ec)

でも、ふと思った、、、Laravelは別リポジトリで管理したいな。。。

# マシンスペック
* Mac mini 2018
* macOS Catalina（10.15.x）
* Intel Core-i7 3.2GHz 6コア
* メモリ 32GB
* SSD 512GB

# やること
* Docker Compose環境のLaravelを別リポジトリにする

# 前提条件
* 空リポジトリを用意しておく

# Docker Compose環境の準備

[Docker ComposeでLaravel開発環境を構築その弐#使い方](https://qiita.com/_bobtabo_/items/8dae5b256f1454c082ec#%E4%BD%BF%E3%81%84%E6%96%B9)

# laravelを別リポジトリにする

### 現在の構成

ディレクトリ構成は、こんな感じ。

```
[docker] ← クローンして来た
 |-docker-compose.yml
 |-.git
 |-...
 |-src
    |-laravel ← コイツだけリポジトリ管理したい！
       |-app
       |-...
```

.gitがdockerディレクトリ直下にあるので、プッシュすると丸ごと（dockerディレクトリごと）行ってしまう。
なので、docker/src/laravelだけリポジトリ管理したい！
結論としては、.gitがdockerではなく、docker/src/laravelにあれば良い。


### src/laravelを別リポジトリにする

* やる事
 * docker/.gitを削除
 * docker/src/laravelをバックアップ（以下、旧Laravel）
 * docker/srcにリポジトリをクローン（以下、新Laravel）
 * 旧Laravelを新Laravelにコピー
 * 新Laravelをプッシュ

##### docker/.gitを削除

```console
[Mac]$ pwd
/Users/xxx/docker

[Mac]$ rm -fdR .git
```

##### docker/src/laravelをバックアップ（以下、旧Laravel）

```console
[Mac]$ cd src
[Mac]$ mv laravel laravel_bak
```

##### docker/srcにリポジトリをクローン（以下、新Laravel）

```console
[Mac]$ git clone <前提条件で用意したリポジトリURL> laravel
```

##### 旧Laravelを新Laravelにコピー

```console
[Mac]$ cp -pR laravel_bak/. laravel
```

##### 旧Laravelを削除

```console
[Mac]$ rm -fdR laravel_bak
```

##### 新Laravelをプッシュ

IDEで src/laravel を開いてプッシュする。

![スクリーンショット 2021-04-28 1.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/ef4a7fe4-31b4-d38c-d233-9b2fc10ee23b.png)

![スクリーンショット 2021-04-28 1.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/64e1a134-6d98-1e58-7210-99fd7a62e6dd.png)
ViewBindやり方


```build.gradle(モジュール)
：
android{
    ：
    buildFeatures{
        viewBinding true
    }
    ：
}
：
```

# Activity

```MainActivty.kt(viewBindingあり)
class MainActivity : AppCompatActivity(){
    //追加
    private lateinit var  binding:ActivityMainBinding

    override fun onCreate(savedInstanceState:Bundle?){
        super.onCreate(savedInstanceState)
        
        //追加
        binding = ActivityMainBinding.inflate(layoutInflater)
        
        //setContentView(R.layout.activty_main)ではない
        setContentView(binding.root)

        //textViewはid
        binding.textView.text = "test"
    }
}
オープンストリートマップとGoogleスプレッドシートを利用した、簡単にデータを更新できるマップ

#はじめに
　こちらの[Googleスプレッドシートを利用した、たぶん史上最も簡単にデータを更新できるマップツール](https://qiita.com/champierre/items/e7758b69b39476148492)を参考に、[オープンストリートマップ](https://openstreetmap.jp/ "openstreetmap")でも同じことをやってみました。オープンストリートマップを表示させるためには[leaflet](https://leafletjs.com/)を利用しました。

#leaflet
　leafletとは地図データを扱うためのJavaScript ライブラリです。公式のチュートリアルや[こちらの記事](https://qiita.com/TakeshiNickOsanai/items/783caa9f31bcf762da16 "Leaflet + OpenStreetMap で地図情報を扱うサンプルコード")を参考にしました。

#作成サイト
~~[デモサイトはこちら]()~~ 今は公開していません 
![デモサイト画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755113/60080229-c81a-e5d9-a11e-07587790af17.png "デモサイト")

#コード(元と違うところ)
　全体のコードはデモサイトの方で見ていただけたらと思いますので、違う点だけ紹介します。

```html:index.html&#x20;(1)
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"
integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A=="crossorigin=""/>
<!-- Make sure you put this AFTER Leaflet's CSS -->
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"
integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA=="crossorigin=""></script>
```
leafletを使うためにleafletのCSSとleaflet.jsを呼んできます。この順番は変えてはだめだそうです。

```js:index.html&#x20;(2)
var tileLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
});
tileLayer.addTo(map);
```
今回は地図としてオープンストリートマップを使うのでtileLayerにオープンストリートマップを呼んできます。leafletではほかにもいろいろな地図を表示できます。
##地図上にdiv要素を追加
```css:index.html&#x20;(3)
/* 作成するdivのCSS */
.sidebar {
  width: 250px;
  height: 250px;
  border: 1px solid #666;
  padding: 6px;
  background-color: white;
  font-family: Meriyo UI;
  font-size: 14px;
  overflow-y: scroll;
}
```
```js:index.html&#x20;(4)
//右下にdivコントロールを表示
var sidebar = L.control({ position: "bottomright" });
sidebar.onAdd = function (map) {
  this.ele = L.DomUtil.create('div', "sidebar");  //divを作成
  this.ele.id = "sidebardiv";  //後で使うためにidを設定
  return this.ele;
};
sidebar.addTo(map);

var div = L.DomUtil.get('sidebardiv');
L.DomEvent.disableClickPropagation(div); //div要素上で地図のclickを制御
L.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation); //同じくスクロールを制御
```
leafletではhtml要素をそのまま地図の上に表示しようとするとtileLayerの下に隠れるような形になってしまいうまく表示できませんでした。そこで[こちら](http://ktgis.net/service/leafletlearn/advanced.html#step13)を参考にして地図上に独自のDOM要素を追加しました。また、そのままではサイドバー上でマウスホイールを使っても地図の方がスクロールされて使いにくかったので、[こちらの一番下の回答](https://qastack.jp/gis/104507/disable-panning-dragging-on-leaflet-map-for-div-within-map)を参考にサイドバー上での地図操作を制御しました。
　(他にも細かい点は違いがありますが、省略。)
##できなかったこと
　leafletにはGeoJSON形式のデータを一気にプロットする方法もあるのですが、そうしたときにサイドバーの名前をクリックして一つのポップアップを開く方法が分からなかったので、今回は一つずつプロットする方法にしました。
#まとめ
　自分は初心者なのですが、sheet2gmapを利用すると思った以上に簡単に地図に表示することができ感動しました。そこで調子に乗ってOSMでもやってみたのが今回です。他にもいろいろできそうなのでまたやってみたいです。
##おまけ flyTo()
　マーカーをクリックするとそのマーカーのところに飛んで行ってズームするのはflyTo()を使っています。サイドバーの名前をクリックしても飛んでいきます。動きがヌルヌルしててその動きにハマったので採用してみました。(やりすぎると酔いそうになるので注意です笑)
【合格体験記】AWS認定SysOpsアドミニストレーター–アソシエイト(SOA-C01)

# 本記事の概要

AWS認定SysOpsアドミニストレーター–アソシエイト(SOA-C01) を取得したので勉強方法を備忘録として投稿します。
AWS-SOAを受けようと思っている方や、現在勉強している方がこの記事を参考の一つにしていただけたら幸いです。

# 使用した教材

WEBサイト
・[awsWEB問題集で学習しよう] (<https://aws.koiwaclub.com/>)

Udemy
・[Ultimate AWS Certified SysOps Administrator Associate 2021] (<https://www.udemy.com/course/ultimate-aws-certified-sysops-administrator-associate/>)

WHIZLABS
・[AWS Certified SysOps Administrator Associate] (<https://www.whizlabs.com/aws-sysops-administrator-associate/>)

# 勉強の流れ

AWSについては、AWS-SAAを取得済みということもあり
大体のサービスについては理解している状態からのスタートです。

まずはkoiwaclubさんの**awsWEB問題集**からとりかかりました。
半分くらいまで解いていると、`CloudWatch`や`CloudFormation`の理解が
SAAの範囲だけでは補えていないと思い、
Udemyの**Ultimate AWS Certified SysOps Administrator Associate 2021**を実施。

こちらは全部やるのではなく、`CloudWatch`と`CloudFormation`のセクションに絞って実施しました。
すべて通してやろうとするとかなりの量なので、
SAAを取得している方は自分が不安なサービスのみに絞るほうがいいと思います。
Udemyの最後には模擬試験(65問)があるのでそれも是非解きましょう！

Udemyの講座終了後は、再度WEB問題集に取り掛かり1週終了。
WEB問題集終了後は、[SAA試験の際](2020-12-04_AWS_191dc5c77fbaf238ce28.md)もお世話になった**WHIZLABS**のセクション毎問題を実施。
**WHIZLABS**のSysOps用コースは、セクション毎の問題が少なめなので全問完璧に正解できるまで繰り返し内容を理解しました。

**WHIZLABS**が終わったらあとは試験日まで**awsWEB問題集**を繰り返し解いて試験問題になれましょう。

# 試験結果

受験日：2021年1月11日
スコア：782
合格ライン：720
結果：pass

[証明バッヂ](https://www.credly.com/badges/f9397112-e2f0-4bdd-940d-882c067076e1/public_url)

SOAは、SAAの時とは違いWEB問題集やWHIZLABSで実施した問題が
そのまま出題されたので自信があったのですが、点数はあまり伸びず...

# 受験後の感想

勉強期間は1ヶ月ほどでしたが、個人的にはSAAよりも解きやすい試験だと感じました。
アソシエイト3冠まで残すは`AWS認定デベロッパー–アソシエイト`のみ！
次もがんばります！

この記事を開いていただき、また、
ここまで読んでいただきありがとうございました。
意外と手間のかかる四則演算プログラム：2. 地道に字句解析と構文解析をする

# 前回

プログラムで解析しやすくするため、入力の側において形式を変化させるという手法を採用しました。実際のシステム構築などでも、この方法が適用できる場合はあると思います。

今回は入力の形式を維持したまま、プログラム側で頑張って解析します。

# 字句解析

## 目的

次の式を文字列として入力するとします。

```text:入力例
(-3*4+ 5) + (11 * 13 / 6 - 9) * (111 % 8)
```

これを、次のようなイメージで内部に持たせるようにするのが目的です。数値、演算子、括弧がそれぞれきちんと切り離されて保存されています。以後、これをトークン列と呼び、一つずつをトークンと呼びます。

```python
["(", "-", "3", "*", "4", "+", "5", ")", "+", "(", "11", "*", "13", "/", "6", "-", "9", ")", "*", "(", "111", "%", "8", ")"]
```

## 状態の変化と文字列の蓄え

ここでは、状態と蓄えをそれぞれ Q, S と表すことにします。

- Q は、通常 (P)、数値読み込み状態 (N) のどちらかをとる。初期状態は P である。
- S は、 Q = N のとき、読んだ数字を追加することで蓄え、 Q = P になったときに空にする。初期状態は空文字列である。

この状況で、文字列を左から1文字ずつ読んでいき、その文字を c として次の処理を実行します。

- c が数値であれば、 Q = N に変更し、 S に c を追加。
- c が演算子であれば、 Q = P に変更する。 S の内容を数値としてトークン列に追加し、 S を空文字列にする。さらに、演算子をトークン列に追加する。
- c が空白であれば、 Q = P に変更する。 S の内容を数値としてトークン列に追加し、 S を空文字列にする。

## 注意

演算子を読み込んだときに演算子をトークン列にすぐ突っ込めるのは、今回扱う演算子が全て1文字であるからです。

例えば `++` のような演算子が存在した場合、 `+` を読み込んだ時点で、その次が `+` なのかそれ以外なのかの分岐が発生します。 Q には N, P の他に `+` を1文字だけ読み込んだ新しい状態が追加され、処理もその分だけ分岐により増えます。

# 構文解析

今度は、字句解析によって生成されたトークン列を読み込んで、計算を行った結果を数値として返します。

さて、工夫すべきポイントがあります。

- 乗算 (*)、除算 (/, %) は、加算 (+) 、減算 (-) より優先して計算する。
- 括弧の中は先に計算する。

何らかのプログラムを書いたとき、多くの場合は文字列もリストも左から順番に処理していくので、上記の対応が難しくなります。

関数 evaluate は、トークン列を入力とし、計算結果の数値（あるいは入力ミスによる計算不能）を返すものとして定義します。

アルゴリズムの特徴
1. トークン列を左から読んでいく。
2. 右括弧がいきなり現れた場合はエラー。
3. 左括弧が位置 L に現れた場合、対応する右括弧が現れるまで読み進める。左括弧が連続した場合、同じ個数の右括弧が出るまで。対応する右括弧が位置 R の場合、 L から R までのトークン列を新たに入力として evaluate を行う。
4. トークン列に括弧がない場合、左から順番に読んでいき、乗算、除算があればそれを計算する。
5. 加算、減算を計算する。

3 によって、括弧があればその中だけを見るという操作になるので、括弧の対応が複雑に入り込んでいても、一つずつ取り払われていき、最終的に4以降の処理に進むことになります。プログラム自体は再帰を用いることになるので、思考は複雑にはなります。

# 参照

自作コード： https://github.com/tfull/arithmetic_operations/tree/main/normal
多対多：野球選手を例にして考えてみる


##Laravel多対多について
多対多の概念や使い方が難しかったので、野球選手とポジションを例に考えてみる。
野球選手：ポジション

例えば、
### 選手目線
大谷は投手と外野の複数のポジションを守れる

### ポジション目線
外野は大谷とイチロ-が守れる
このとき、野球選手とポジションは多対多の関係にあるといえる
この考えから下記のテーブルを作成する。

### users(選手)目線
イチロー(1)：外野(4)
大谷(2)：投手(1)、外野(4)
阿部(3)：捕手(2)、内野(3)

### ポジション目線
投手(1)：大谷(2)
捕手(2)：阿部(3)
内野(3)：阿部(3)
外野(4)：イチロー(1)と大谷(2)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/e1261a9e-67a2-29a7-39e7-0f7a52b22538.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/8305afb7-c115-20e0-34a8-cf5ba615e144.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/43459bd4-80eb-d940-e5ec-26426dc6e4f4.png)





このとき、選手目線からみたポジションの情報がほしいときは下記のModelを作成する

```php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
	    
    public function potisions()
    {
				// 第2,3,4引数は省略できる
				// 実際は第2:users_positions 第3:users_id 第4:positions_id 
        return $this->belongsToMany('App\Potision');
    }

}
```

このModelを使えば、選手目線の情報(例えば大谷は投手と外野)が取得できる。
逆にポジション目線の情報(例えば外野はイチローと大谷)が欲しい場合は下記のモデルを作成する。

```php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Potision extends Model
{
	  public function members()
    {
				// 第2,3,4引数は省略できる
        return $this->belongsToMany('App\User');
    }  
}
```

これらのModelを使って情報を取得する。
色相差固定で３色選べるカラーパレットつくってみた

# 画面キャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/c694a1c5-18c4-6951-8568-ecb11122bb61.png)

# できたもの

つかいかた

- マウスで`canvas`（色の円のあたり）をクリックすると、色情報が表示され、色相と彩度をスライダでも調整できるようになります。
- 色相Aとマウス操作（左ボタンクリックとドラッグ）が連動します。マウスで操作した場合、もしくは色相Aをスライダで操作した場合、色相Bと色相Cの色が相対値を保って追従します。

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

※右上に表示される３色のサンプルは、文字列「■■■」の文字間隔をCSSで強引に寄せているだけの雑なつくりです。環境によっては崩れるかも。

# 参考サイト
 - [HSV色空間 - Wikipedia](https://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93)
 - [Canvas とピクセル操作 - 開発者ガイド | MDN](https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Canvas_tutorial/Pixel_manipulation_with_canvas)
 - [ビットマップ，フィルタ，外部画像(JavaScript)](https://www.sist.ac.jp/~suganuma/kougi/animation/JavaScript/filter/filter.htm)
 - [inputタグのrangeの値(value)が文字列でドハマりした話 - Qiita](https://qiita.com/kob58im/items/89facd0e6469ee615a5b)
 - [JavaScriptでRGBをHEXに変換する方法](https://lab.syncer.jp/Web/JavaScript/Snippet/60/)
 - [MouseEvent.buttons - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/MouseEvent/buttons)
 - [【CSS】letter-spacingで字間を調整する方法まとめ](https://saruwakakun.com/html-css/reference/letter-spacing)
 - [Webサイトをダークモードに対応させよう | Webクリエイターボックス](https://www.webcreatorbox.com/tech/dark-mode)
Gitの開発の流れと、基本的なコマンド・便利なコマンド

# Gitの開発の流れと、基本的なコマンド・便利なコマンド

会社にGitが導入されたので、忘備録としてまとめました。
随時更新していきます！
## 自分で 0 から開発に入る場合

1.まず初めにローカルリポジトリを作る！  
   プロジェクトのディレクトリ配下で git init コマンドを打ちます。
   そうすると、プロジェクト内に `.git` ファイルが作成されます。

```
git init
```

<br>

２. 🌀 これは必要に応じてですが、 `.gitignore` ファイルも作る  
   `.gitignore` ファイルは git で管理しないファイルやディレクトリを指定するためのファイルです。
ソースとして関係のないファイルは`.gitignore` に記述しておきましょう！

```
touch .gitignore
```

<br>

3.リモートリポジトリを追加する！

プロジェクト配下で ↓ のコマンドを打つことで、リモートリポジトリを作成できます。
ここの、origin というのは、リモートリポジトリのエイリアス(別名)を意味します。

```
git remote add origin https://~~~~~.git
```

<br>

---

<br>
<br>

## 自分が開発に参加して修正などを行う場合

1. まず、自分の作業場にリモートリポジトリの最新ファイルを持ってくる！  

プロジェクトのディレクトリを作成したい場所で、git clone リモートリポジトリ でクローンした後に、
念のため git pullコマンドで作業場を最新にしましょう！

```
git clone https://~~~.git
git pull
```

<br>
<br>

---

## _最低限の環境の構築はここまでです。_

ここから先は、ブランチの使い方(作業ごとに毎回ブランチを切るのか、dev ブランチのように開発専用ブランチを作るのか、など)
によって変わってくると思うので、これから更新していきます。

---

<br>
# 🔥 git の基本的なコマンド

## ファイルをステージに上げる

```
//git add ファイル名
git add index.html

//全て上げるときは . を使います！
git add .
```

<br>

## ステージに上げたファイルをローカルリポジトリにコミットする

git commit コマンドを打つと、ターミナル上で Vim というエディタが起動し、そこにコミットメッセージを書くことになります。  
コミットメッセージのいいとされている形はこんな感じです ↓

> １行目：種別と対応内容  
> ２行目：空行  
> ３行目～：対応内容の詳細

```
//ステージにある全てのファイルをコミット
git commit

// ものすごく簡単な修正などで 詳細も何もない場合は -mオプションを使い、コミットメッセージをサクッと入力できます！
git commit -m "コミットメッセージ"
```

<br>

## ローカルリポジトリをリモートリポジトリへプッシュする

```
//git push origin プッシュしたいリモートブランチの名前

// devブランチにプッシュしたいなら
git push origin dev
```

<br>

## ブランチの作成・変更・削除

```
//ブランチ作成
git branch ブランチ名

//現在いるブランチの確認
git branch

//ブランチの切り替え
git checkout 切り替え先のブランチ名

//ブランチ削除
// -d オプションをつけておくことで、マージが未完了なブランチは削除できないです
git branch -d ブランチ名


//リモートブランチの削除
git push --delete origin ブランチ名
```

<br>
<br>

# 🌈 割と便利なコマンド

## ワークツリーを最新のステージの状態に戻す

作業中に、このファイルで何してたかよく分からなくなった！ 一回全部戻したい！ というとき

```
// ステージの最新の状態に戻ります
git checkout -- ファイル名
```

<br>

## コミットをやり直す

コミットしてから誤字に気づいた...  
誤字の修正だけで、また新しく commit して コミットメッセージも書くのはイヤだ！ というとき、  
あと、コミットメッセージ ミスった... ってとき

```
まず、修正を行い、git add する
そして ↓

// 最新のコミットを上書きする
git commit --amend --no-edit

コミットメッセージをミスったときは --no-editオプションをつけずに叩きましょう！ コミットメッセージも修正できます
git commit --amend
```

<!-- <br>

```

```

<br>

```

```

<br>

```

```

<br>

```

``` -->
JavaScriptからPHPのサーバに文字列を引数にしてWebAPIを実行する例

# クライアント側のhtmlファイル

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<style></style>
</head>
<body>
<input type="text" id="input_message">
<button onclick="PostString()">WebAPI実行</button>
<div id="result">ここにWebAPIの結果が入ります</div>
</body>
</html>

<script>
function PostString()
{
    const xhr = new XMLHttpRequest();

    //http://XXXXXXX.jp/test.php が今回呼び出すWebAPIを記述したphpファイル
    xhr.open('POST', 'http://XXXXXXX.jp/test.php');

    //文字列を引数にしてWebAPIを実行する(日本語も可能です)
    const msg = document.getElementById("input_message").value;
    xhr.send(msg);
    xhr.onreadystatechange = function() 
    {
        if(xhr.readyState === 4 && xhr.status === 200)
        {
            document.getElementById( "result" ).innerHTML = xhr.responseText;
        };
    }
}
</script>
```
XMLHttpRequestオブジェクトの
sendメソッドでデータをpostして
結果があれば
responseTextプロパティで取得します


# サーバー側のphpファイル
```php:test.php
<?php
    echo date("Y/m/d H:i:s") . "</br>";
    echo "送られた文字列は" . "</br>";
    echo file_get_contents("php://input") . "</br>";
    echo "です" . "</br>";
?>
```

file_get_contents("php://input")でpostされたメタデータが取得できるようです。

# 注意事項
htmlファイルをWEB上にホスティングせず、PCのローカルディスク上でブラウザで開いて実行しても、うまく動かないようです。

2021/1/23 追記
エラー原因はCORSエラーというものでphpの先頭に

```
header("Access-Control-Allow-Origin: *");
```
を追加することで回避できるようです。詳しくはセキュリティに関するものなのでご自身で調査ください。
ただし、別の問題もあることがわかりました。
`https://` のサイト(GitHub Pagesなど)から `http://` のサイトへのAPIはブロックされてしまいます。
当方は `http://` のレンタルサーバー上のphpへWebApiをCallしようとしていたので困ってしまいました。( ﾉД`)ｼｸｼｸ…
inputタグのrangeの値(value)が文字列でドハマりした話

`<input type="range" min="0" max="100" value="100" step="1" oninput="hogeValueChanged()">`

こいつの`value`を使っているときに、意図しない動作に遭遇し、追っかけてみたら、文字列でした・・・(;・∀・)
仕様はちゃんと読みましょう。ってことですね。。。

# `input`タグの`range`のイメージ

こんな感じのコントロール（文字列は別）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/93ca99b6-91c6-ee7b-883f-807be04c355b.png)

# うまくいかなかった箇所をさらしてみる

`curHue1 = hue1.value;` とか代入しています。

```js

    let diffHue = newHue0 - curHue0;
    curHue0 = newHue0;
    console.log("diff hue:");
    console.log(diffHue);
    console.log("hue1 before:");
    console.log(curHue1);
    curHue1 = (curHue1+diffHue+360)%360;
    console.log("hue1 after:");
    console.log(curHue1); // ここで NaN になることがある
    curHue2 = (curHue2+diffHue+360)%360;
```

# 仕様記載

[&lt;input type="range"&gt; - HTML： HyperText Markup Language | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/range)

> `value` 属性は、選択された数値を表す<b>文字列</b>が入った DOMString です。

と

> 	選択された数値を表す文字列を含む DOMString。<b> Number として値を取得するには valueAsNumber</b> を使用する。
Excelアドイン（VSTO）でボタンのイベントを削除して別のボタンに置き換える方法

# 開発環境

- Windows 10 Home
- Microsoft Visual Studio Community 2019 Version 16.8.4
- Microsoft .NET Framework Version 4.8.03752

# はじめに
アドインで使用できるUIツールの一つ**SplitButton**は、上部にボタン、下部にメニュー（なかにボタン配置が可能）という形で構成されています。

ここでは、メニューの中のボタンをクリックしたら、上部のボタンのデザインや挙動を置き換える方法について説明します。

※ 独自のやり方なので、よりよい方法があれば教えてください。

## イメージ
![splitButton_replace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691672/1fc48e9d-b5c6-c578-e555-7617ce21f740.png)

## ユースケース
よく使うボタンがメニューのなかにあり、何度もメニューを開いてクリックするのが大変な場合、前回クリックしたボタンを上のボタンに設定しておくことで操作の煩雑さを回避できます。

## 既存のイベントの削除
SplitButtonにすでに設定されているイベントを削除します。
※ 削除しないとイベントが複数起床してしまいます

いま設定されているイベントを知る術が見つからず、設定されている可能性のあるイベントを片っ端から削除していきます。（もっとスマートにやりたい）
※ 設定されていないものを削除してもエラーにはなりません


``` C#
splitButton.Click -= button_1_Click;
splitButton.Click -= button_2_Click;
splitButton.Click -= button_3_Click;
```

## 新しいボタンへ乗り換える
ここでは、button_1を押されたときを考えます。
必要なプロパティ情報をコピーしましょう。

``` C#
private void button_1_Click(...)
{
    splitButton.Label = button_1.Label;
    splitButton.Tag = button_1.Tag;
    splitButton.OfficeImageId = button_1.OfficeImageId;
    splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
}
```

## 汎用関数を作成する
各ボタンのクリックイベントごとに上記のコードを追加していくのもイマイチなので、抽象化した関数を用意します。

``` C#
private void changeEvent_splitButton(RibbonSplitButton btnDst, RibbonButton btnSrc)
{
    btnDst.Click -= button_1_Click;
    btnDst.Click -= button_2_Click;
    btnDst.Click -= button_3_Click;

    btnDst.Label = btnSrc.Label;
    btnDst.Tag = btnSrc.Tag;
    btnDst.OfficeImageId = btnSrc.OfficeImageId;
}
```

各ボタンのクリックイベントからは下記のようにCallします。

``` C#
private void button_1_Click(...)
{
    changeEvent_splitButton(splitButton, button_1);
    splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
}
```


## 選択されたボタンを設定ファイルに保存する方法

ボタンを入れ替えたあと、その状態を次回起動時にも反映させたい場合の方法になります。

設定ファイルに保存する方法は下記を参考にしてください。
[Excelアドイン（VSTO）で設定ファイルを扱う方法](https://qiita.com/saka-guti/items/5a49255679180eafbbff)

1. メニュー内のボタンそれぞれに**タグ名（Tag）**を付与します。
内容は何でもよいです。switch文で分岐するために利用します。
2. 設定ファイルに、**splitButton（名前は何でもよいです）**を追加します

![splitButton_tag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691672/37f2dbc9-51f4-6e67-5dd9-748705b2de3f.png)

### 設定ファイルを読み込みUIに反映する
※ 先ほどの汎用関数を利用します

``` C#
Properties.Settings setting = Properties.Settings.Default;
switch (setting.splitButton)
{
    case "1":
        changeEvent_splitButton(splitButton, button_1, button_1_Click);
        splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
        break;
    case "2":
        changeEvent_splitButton(splitButton, button_2, button_2_Click);
        splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_2_Click);
        break;
}
```
### UIの状態を設定ファイルに保存する

``` C#
Properties.Settings setting = Properties.Settings.Default;
setting.splitButton = splitButton.Tag.ToString();
setting.Save();
```
---
以上です。
Excelアドイン（VSTO）でユーザー設定を保存する方法

# 開発環境

- Windows 10 Home
- Microsoft Visual Studio Community 2019 Version 16.8.4
- Microsoft .NET Framework Version 4.8.03752

## 設定ファイル（app.config or user.config）の読み書き
ユーザが変更したUIの設定などを記録するために利用
（参考：[Visual Studioでアプリケーションの設定を保存する](https://dobon.net/vb/dotnet/programing/mysettings.html)）

1．ソリューションエクスプローラーでプロジェクトを右クリック「プロパティ」を選択
2. 「設定」で保存したいパラメータ（名前、型、スコープ、初期値）を追加
![setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691672/0fe8d21a-db84-9d8c-cd46-72ee8b0af22e.png)
3. アドインのLoad関数（Ribbon_アドイン名_Load()）のなかで設定を読み込み
4. アドインのClose関数が無いので、値が変更されたら随時保存する

``` C#
Properties.Settings setting = Properties.Settings.Default;

// Write
setting.checkBox = checkBox.Checked;
setting.Save();

// Read
checkBox.Checked = setting.checkBox;
```

## アップグレード時の対応
設定ファイルはバージョンごとにフォルダが作られ保存されるため、バージョンアップをすると初期値が設定されてしまう。
以下は、直前のバージョンの設定ファイルを引き継ぐ処理。

事前に、パラメータを追加して、設定を読み込む前（Load関数など）に実施しておく。

|名前|種類|スコープ|値|
|:--|:--|:--|:--|
|IsUpgrated|bool|（不問）|False|

``` C#
if (!Properties.Settings.Default.IsUpgrated)
{
    Properties.Settings.Default.Upgrade();
    Properties.Settings.Default.IsUpgrated = true;
}
```

## 設定ファイルの場所の確認

- 参照に追加：System.Configuration

``` C#
using System.Configuration;

Configuration config = ConfigurationManager.OpenExeConfiguration(
    ConfigurationUserLevel.PerUserRoamingAndLocal
);
string path = config.FilePath;
```
pythonで逆辞書を作る最速の方法は？

# TL;DR
pythonのdictのkey,valueを逆にしたものを生成したい場合は、以下が最速。

```python
d = dict(zip(list('abc'), range(3))) # 例として適当な辞書を生成
d2 = dict(zip(d.values(), d.keys())) # 逆
```

# 本題
pythonを書いていると、既存のdictのkey,valueを逆にしたものを生成したい場合があったりします。例えば、

```python
{'a': 0, 'b': 1, 'c': 2}
```

に対する

```python
{0: 'a', 1: 'b', 2: 'c'}
```

です。そこで、逆版を最速で得るやり方を幾つか試してみました。
## 準備
```python
d = dict(zip([f'key{i}' for i in range(10000)], range(10000))) # 適当な辞書
```

## 1. forループ
```
%%timeit
d2 = dict()
for k in d:
    d2[d[k]] = k
```
結果: 1.09 ms ± 57.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

## 2. zipで値とキーを結合
```python
%timeit dict(zip(d.values(), d.keys()))
```
結果: 525 µs ± 21.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

## 3. 辞書内包表記
```python
%timeit {v:k for k,v in d.items()}
```
結果: 661 µs ± 23 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

## 結果
結果、2. zipで値とキーを結合　が最速となりました。pythonの内部の挙動は不勉強でよく分かりませんが、forループが効いているように感じます。pythonのforループは一回ごとに型チェックが入るので遅い、というのは色々な所で指摘されています。

ただ、2位である辞書内包表記とあまり差がないので、()のネストが深い分可読性が落ちることを考慮して、3.でも良いかも知れません。

以上。
seeds.rbなどでActiveStorageを使って大量の画像をアップロードする際に発生する SQLite3::BusyException の対処法

## 発生する問題

Railsの`rails db:seed`を実行すると、以下のようなエラーが起きる場合がある。

```
$ rails db:seed
rails aborted!
ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked
/path-to-your-app/db/seeds.rb:69:in `<main>'
```

### エラーが発生するコード例

エラーが発生した周辺のコードは次のようになっている。

```ruby
# ...

User.destroy_all

100.times do |n|
  user = User.create!(
    email: "sample-#{n}@example.com",
    password: 'password',
    name: Faker::Name.name
  )
  image_url = Faker::Avatar.image(slug: user.email, size: '150x150')
  # ActiveStorageを使ってavatarを設定
  user.avatar.attach(io: URI.parse(image_url).open, filename: 'avatar.png')
end

# ...
```

加えて、このアプリケーションではSQLite3を使っている。

```yaml
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3
```

## エラーが発生する原因

このエラーは以下の2つの要因で引き起こされる。

- ActiveStorageを使っているため、画像のアップロードや削除が非同期で行われる
- SQLite3は並行処理に弱い（[参考](https://stackoverflow.com/questions/3172929/operationalerror-database-is-locked/3172950#3172950)）

`User.destroy_all`をしたときは既存のデータに対して画像の削除処理が非同期で実行される。既存のデータが大量にあると、データベースに対して読み込みや書き込みのクエリが並行して発行される。

`user.avatar.attach`も同様に非同期で画像のアップロード処理が行われる。上のコード例では100件のユーザーデータを作成しようとしたため、やはりデータベースに対して読み込みや書き込みのクエリが並行して発行される。

SQLiter3が並行処理に耐えきれなくなると、SQLite3::BusyExceptionが発生する。

## エラー回避策

SQLite3の性能上の制約を考慮し、画像の削除処理やアップロード処理を同期的に行うようにする。具体的には以下の2行を`config/seeds.rb`に追加する。

```diff
+ActiveStorage::AnalyzeJob.queue_adapter = :inline
+ActiveStorage::PurgeJob.queue_adapter = :inline

 User.destroy_all

 100.times do |n|
   user = User.create!(
     email: "sample-#{n}@example.com",
     password: 'password',
     name: Faker::Name.name
   )
   image_url = Faker::Avatar.image(slug: user.email, size: '150x150')
   user.avatar.attach(io: URI.parse(image_url).open, filename: 'avatar.png')
 end
```

ActiveStorage::AnalyzeJobはアップロード時に、ActiveStorage::PurgeJobは削除時にそれぞれ利用されるActiveJobのクラスである。
この`queue_adapter`を`:inline`に変更することで、画像のアップロードや削除を同期的に実行できる。

参考 https://api.rubyonrails.org/classes/ActiveJob/QueueAdapters/InlineAdapter.html

## 動作確認環境

- Rails 6.1.0
- Ruby 3.0.0
- SQLite3 3.32.3
Railsで簡単にサイトの雛形を作る

# サマリ
サイトをたくさん作れるようになりたいけど、どうやろうか？という疑問が浮かんだ。
そこで、いろんなチュートリアルサイトを見たけど、Railsでつかうscaffoldという機能が便利そうだったから、その実施をやってみる。

# プロジェクトの立ち上げ

## Ruby と Railsの導入
まずは、rubyとRailsをPCにセットアップする。
以下の記事を参考に実施した。(Mac)

[【完全版】MacでRails環境構築する手順の全て
](https://qiita.com/kodai_0122/items/56168eaec28eb7b1b93b)
上記の記事を参考にして一通りのインストールを行う。

振り返っての注意点だが、なるべく過去1年間に投稿された記事をなるべく参考にしたほうがいいと思う。
それ以上前だと、os自体のバージョンアップをまたいだりとうまく動かない可能性が出てくる。

## Railsプロジェクトの実行

```shell
$ rails new scaffold_sample
$ cd scaffold_sample
$ rails generate scaffold user name:string age:integer
```
こんな感じで入力すると、ユーザーモデルを備えたviewやcontrollerが一通りできる。

画面の操作も可能なので、何をやっていけばいいか？は結構わかりやすいかも。

次からは、こんなサイトを作れるように色々やっていこうかな。
[ハロワ求人検索](https://www.hellowork-search.careers)
[ハロワまとめサイト](https://www.hellowork.careers)
[ハローワーク検索サイト](https://xn--yckc0gzcq.com)
when looking up transform from frame [odom] to frame [map] amclのエラー

```
Extrapolation Error: Lookup would require extrapolation into the future.  Requested time ?.? but the latest data is at time ?.?, when looking up transform from frame [odom] to frame [map]

Could not transform the global plan to the frame of the controller
```

amclを動かそうとするとこのエラーが出た.
amclをlaunchするときのパラーメータに下記を追加すると動いた

```
<node name="amcl" pkg="amcl" type="amcl">
~~
<param name="transform_tolerance" value="1.0"/>
~~
</node>

```
Qiskit.aquaでShorの素因数分解アルゴリズムを使ってみる

# Shorの素因数分解アルゴリズム
Shorの素因数分解アルゴリズムは、素因数分解を高速に解く量子アルゴリズムです。

動画解説
[Qiskit Textbook 日本語解説 3.9章](https://www.youtube.com/watch?v=25J1jshTp0k)
[数学好きから見た量子コンピュータ　＠第12回日曜数学会](https://www.nicovideo.jp/watch/sm33475803)

今回はアルゴリズムの詳細を勉強する前に、ライブラリを使って、ブラックボックスとしての動作を見てみます。

# qiskit.aquaによるShorの素因数分解アルゴリズム

15を素因数分解する場合です。

```python
import math
import numpy as np
from qiskit import BasicAer
from qiskit.aqua import QuantumInstance
from qiskit.aqua.algorithms import Shor

N = 15
shor = Shor(N)
backend = BasicAer.get_backend('qasm_simulator')
quantum_instance = QuantumInstance(backend, shots=1024)
result = shor.run(quantum_instance)
print(f"The list of factors of {N} as computed by the Shor's algorithm is {result['factors'][0]}.")
print(f'Computed of qubits for circuit: {4 * math.ceil(math.log(N, 2)) + 2}')
print(f'Actual number of qubits of circuit: {shor.construct_circuit().num_qubits}')
```

実行すると、かなりの時間を要します。（数十秒）
これは量子計算を古典計算機上でシミュレーションしているためです。
結果は、

`The list of factors of 15 as computed by the Shor's algorithm is [3, 5].
Computed of qubits for circuit: 18
Actual number of qubits of circuit: 18`

と出ます。
- 15の素因数分解は3x5 →　合っている
- 使用した量子ビット数は18量子ビット

ということです。18という数字は、素因数分解される数を$N$としたとき、$ 4*\lceil \log_{2}(N) \rceil +2 $から出るらしいです。

## 回路を見てみる
回路を見てみましょう。

```python
circ_shor = shor.construct_circuit()
circ_shor.draw('mpl', scale=0.7, fold=50)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/02bb1e55-4bf2-8174-2b2e-167342b60057.png)

さっぱりわかりません。
解釈してみます。Shorの素因数分解アルゴリズムの根幹は、実は**量子位相推定(QPE)アルゴリズム**です。
素因数分解の問題を、あるユニタリ行列の固有値の位相推定に帰着させた点が高速性の所以と考えられます。

QPEだと思って解釈すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/91060dac-db5f-dc9a-8ecb-612dfcc281f7.png)


このようになります。
上部の8bitがユニタリ行列$U$の固有値の位相の書き出し先として使われています。
下部の10bitでユニタリ行列$U$の固有ベクトルの重ね合わせを入れています。
ここで、なぜ一個目のbitだけに$X$をかけると、うまい固有ベクトルの重ね合わせが作れるのかは
[Qiskit Textbook 日本語解説 3.9章](https://www.youtube.com/watch?v=25J1jshTp0k)
で説明されています。

bitを割り当てた後は、QPEをやっているだけです。
QPEの手順は、
- 補助量子ビット全てにHゲートをかける
- 各補助量子ビットを制御ビットとした$2^k$回のコントロール$U$ゲートをかける
- 最後に補助量子ビットに逆QFT(QFTはユニタリ演算なので、逆QFT=QFT†)をする。

まさにそのとおりに図が書かれていることがわかると思います。


## 現状での素因数分解の限界は？
実機では大規模な回路は実行不能ですので、上記の15の素因数分解でも厳しいでしょう。
シミュレーターの場合を考えましょう。IBMが提供しているQASMシミュレーターの最大量子ビット数を調べます。
参考にしたのは、
[Maximum number of qubits suppoted by the Qasm simulator](https://quantumcomputing.stackexchange.com/questions/14927/maximum-number-of-qubits-suppoted-by-the-qasm-simulator)
です。

```python
from qiskit import Aer
Aer.get_backend('qasm_simulator').configuration().to_dict()
```
実行結果の中に、
 `'n_qubits': 29`
というのが見つかります。最大29量子ビット数までシミュレーション可能です。
$N$を素因数分解するのに必要な量子ビット数は、$4*\lceil \log_{2}(N) \rceil +2$　でしたから、ざっくり
$N ≦ 64$ と思われます。
グロタンディーク素数57の素因数分解である
[数学好きから見た量子コンピュータ　＠第12回日曜数学会](https://www.nicovideo.jp/watch/sm33475803)　
は、結構限界に近いところだったのかなと思われます。
もちろん、上記の数字はqiskit.aquaのライブラリを愚直に使った場合であって、
問題の答えや候補範囲を知っていてそれを事前知識として使ってしまう場合、量子ビット数が減らせることがあるかもしれません。
このあたりは、

- Shorの素因数分解アルゴリズムをもっと理解する
- qiskit.aquaの実装を確認する

の両方が必要でしょう。

# 結論
とりあえずライブラリを呼び出すだけなら、さくっと素因数分解が試せる。
python embed インストール

■　python embedded インストール

[1] python.exe のあるフォルダで setenv.batを作成して実行
PYTHON_PATHの箇所は実際にpythonEmbedをおいたフォルダ名に編集　（※ %DP0% は変えない）
参考：
↓全体手順
https://hituji-ws.com/code/python/python-emb-usage/
Windowsでpythonを使う/配布する時に便利！Python embeddable package使い方

　例：変更後
　SET PYTHON_PATH=%DP0%\PythonEmbed395
 
[2] get-pip.py をダウンロードして、python.exeのあるフォルダで実行する
    　　https://bootstrap.pypa.io/

[2]-2 実行は　python get-pip.py コマンド

[2]-3 pythonXX_.pth の編集
　　　import siteの前についている #を消す

[3]current.pth ファイルを python.exeのあるフォルダに作成する
【対応方法】
Pythonをインストールしたフォルダ内に「current.pth」というファイルを作成します。
作成した「current.pth」をメモ帳などで開いてimport sys; sys.path.append('')と記載して保存します。

参考：
↓全体手順
https://hituji-ws.com/code/python/python-emb-usage/
Windowsでpythonを使う/配布する時に便利！Python embeddable package使い方

↓current.pthについて
https://qiita.com/rhene/items/68941aced93ccc9c3071
Windowsで環境を極力汚さずにPythonを動かす方法 (Python embeddable版)
→
Pythonは特に意識しなくてもカレントディレクトリに存在するPythonファイルをimportできるのですが、embeddable版ではパスが通らずアクセスできない状態になっています。
自分でコードを書く分にはそれほど問題になりませんが、TensorFlowなどをpipでインストールする際にエラーでコケる場合があります。
そこで、下記の方法でカレントディレクトリにパスを通すことで、問題を回避します。

↓参考まで（使用なし）
https://qiita.com/mm_sys/items/1fd3a50a930dac3db299

------------

■ Tkinter の追加
参考： 
https://qiita.com/Neilus/items/17b44d737d5acd1982fb

ただし tkinterはLib直下でなく、 Lib/sitepackages に置く。
（例　C:\PythonEmbed395\Lib\site-packages　)
自動デプロイに失敗してwe are sorry

##前書き　
プログラミングをしていて最も見たくないエラーに遭遇してしまった。
初学者の自分にとってポートフォリオが公開できないことはすなわち死に直結するからである。
少しの間デプロイせずに開発していたところ自動デプロイのやり方を忘れてしまいエラーになった。

##前提
・ローカルでは問題なく動いている
・ローカル→GiuHubへのpushのし忘れはない（mergeまで確認）
・GitHubからEC2への反映（git pull origin master）のし忘れはない
・EC2サーバー側でエラーログの内容を確認し、原因を探す
・Nginxは正しく起動しているか
・EC2サーバー側の環境変数は正しく設定できているか
・EC2インスタンスの再起動を行ってみる


##結論
ただの勘違い。ローカルでやるべき

```
bundle exec cap production deploy
ローカル開発環境のディレクトリで実行する
```
これだけで自動デプロイが完了した。

そもそもbundle exec cap production deployは自動デプロイを実行するコマンドなのだが何を思ったのかEC2ターミナルで行っていた。
開発環境の変更データを本番に反映するコマンドなのでEC2ターミナルで行っても反映されるはずがないのだ。なぜなら本番環境だから。こんな感じで怒られます↓

```
[ec2-user@ip-000-00-00-00 ~]$ bundle exec cap production deploy
Could not locate Gemfile or .bundle/ directory
```

##終わりに
そんなとこでつまづくなよ、、って言われそうですがこの経験が実務で活きると信じて今日も頑張ります。
SenseHat でIMUを使ったゲーム

今度のsense hatゲームは、IMU(慣性測定ユニット)を試してみました。

本体を傾けると、赤いピクセルが動きます。これで緑のピクセルをすべて取るとクリア。最右列の青いピクセルは、時間制限です。

![IMG_5938.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238815/73f94951-42d8-a8a1-b169-476e60616d02.jpeg)

ただ今回苦労したのは、IMUではなく、同時に初めて使ったPythonのスレッドです。
IMUの方は、ジョイスティックと同様、結構簡単でした。
 
メインループと並行して時間制限をカウントするスレッドを動かしてみましたが、相互の制御（ゲームクリアならスレッドを停止し、タイムオーバーしたらメインループを停止）の方法が分かりませんでした。
threading.Event()による制御を知り、解決できました。


```python

from sense_hat import SenseHat, ACTION_PRESSED, ACTION_HELD, ACTION_RELEASED
from time import sleep
from random import randint
from copy import copy
import threading

sense = SenseHat()
sense.clear()

red = (255, 0, 0)
blue = (0, 0, 255)
yellow=(255,255,0)
purple=(128,0,128)
green=(0,255,0)
indigg=(75,0,130)
orange=(255,128,0)
black=[0,0,0]

sense.set_rotation(0)

ncol = 8
nrow = 8
col_max = ncol - 2
row_max = nrow - 1

event = threading.Event()

def setdisturbs(num_disturbs, initpos):
    disturbs = list()
    for i in range(0,num_disturbs):
        while True:
            candi = (randint(0, col_max), randint(0, row_max))
            if candi == initpos:
                continue

            duplicated = False
            for j in disturbs:
                if candi == j:
                    duplicated = True
                    break
            if duplicated:
                continue
            disturbs.append(candi)
            break

    color_disturb = green
    for i in disturbs:
        sense.set_pixel(i[0], i[1], color_disturb)

def timecount(interval):
    col = ncol - 1
    for row in range(row_max):
        sense.set_pixel(col, row, blue)
        if event.wait(interval):
            break
    event.set()

speed = 0.2
num_disturbs = 10
interval = 3

ballpos = (ncol/2, nrow/2)
sense.set_pixel(ballpos[0], ballpos[1], red)
ballvec = (0, 0)

setdisturbs(num_disturbs, ballpos)

t1 = threading.Thread(target=timecount, args=(interval,))
t1.start()

success = False
while True:
    if event.is_set():
        break
    
    acceleration = sense.get_accelerometer_raw()
    x = acceleration['x']
    y = acceleration['y']
    z = acceleration['z']

    x=int(round(x, 0))
    y=int(round(y, 0))
    z=int(round(z, 0))
    
    #print("x={0}, y={1}, z={2}".format(x, y, z))

    ballvec = (x, y)
    # if x  == -1: #left
    #   ballvec = (-1, 0)
    # elif y == -1: #top
    #   ballvec = (0, -1)
    # elif x == 1: #right
    #   ballvec = (1, 0)
    # elif y == 1: #bottom
    #   ballvec = (0, 1)
    # else:
    #   ballvec = (0, 0)

    sense.set_pixel(ballpos[0], ballpos[1], black)
    ballpos = (max(min(ballpos[0] + ballvec[0], col_max), 0), max(min(ballpos[1] + ballvec[1], row_max), 0))
    sense.set_pixel(ballpos[0], ballpos[1], red)

    #print("col={0}, row={1}".format(ballpos[0], ballpos[1]))
    num_colorpx = 0
    cur_px = sense.get_pixels()
    for px in cur_px:
        if px == [0,252,0]: # green
            num_colorpx = num_colorpx + 1
    if num_colorpx == 0:
        event.set()
        success = True
        break

    sleep(speed)

if success:
    sense.show_letter("O")
else:
    sense.show_letter("X")

sleep(2)
sense.clear()

```
【Rails】gem active_decoratorでコードを綺麗にまとめる

# 背景
・カラムの合計値や平均値といった計算をviewに書いていると、ごちゃごちゃしてきて読みにくくなってきたため。
・viewに書くのか、controllerに書くのか問題の解決のため

# 導入
まずはgemfileに追記します。

```gemfile
gem 'active_decorator'
```

bundle installします。

```terminal
$ bundle install
```

# decoratorファイルの生成
次に、decoratorファイルを作ります。
今回はscoreというモデルに関するものです。
scoreの部分は好きな名前にして下さい。

```terminal
$ rails g decorator score
```
そうすると、このようなファイルを生成してくれます。
`app/decorators/score_decorator.rb`



今回はゴルフのスコアだったので、１８Hの合計を計算させます。

```
module ScoreDecorator
  def total_score
    format('%+d', hole1_score.to_i + 
                  hole2_score.to_i + 
                  hole3_score.to_i +
　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　・
                  hole18_score.to_i)
  end
end
```

# viewで出力
これでviewがすっきりしました！

```erb
  <% @scores.each do |score| %>
        <%= score.total_score %>
  <% end %>
```
Debianのsystemdを更新するとdockerが動かなくなる件

Debian の systemd はパッケージバージョン 247.2-2 でデフォルト[cgroupのバージョン](https://qiita.com/kakinaguru_zo/items/cb18bd8f7aa92c11f6bf)を1から2に変更している。これに対応するにはdocker.ioのDebianパッケージバージョンを20.10以降に新しくすればよい。dockerのcgroup v2対応は[20.10から](https://docs.docker.com/engine/release-notes/#runtime-1)。
フロントエンドコーディング後によく利用するチェックサイト（随時更新）

## [Unicorn - W3C 統合検証サービス](https://validator.w3.org/unicorn/?ucn_lang=ja)

以下の4つのサービスを統合したものみたいです。
一度に確認できるので便利ですが、エラー内容の詳細は各サービスでチェックしたほうがわかりやすいです。

* HTML用の [The W3C Markup Validation Service](http://validator.w3.org/)
* CSS用の [W3C CSS 検証サービス](http://jigsaw.w3.org/css-validator/)
* モバイル用の [The W3C Mobile Checker](https://www.w3.org/2016/11/mobile-checker-disabled/)
* ATOM/RSS用の [W3C Feed Validation Service](http://validator.w3.org/feed/)

![unicorn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/0b2fb262-a673-1b90-33e5-16bb68083a68.png)

紹介しておきながらですが…
実際はHTMLのバリーデーションのみ[Chromeの拡張機能](https://chrome.google.com/webstore/detail/html-validator/mpbelhhnfhfjnaehkcnnaknldmnocglk)で行っています。

## [モバイル フレンドリー テスト](https://search.google.com/test/mobile-friendly?hl=ja)

問題があるとGoogleから「モバイルユーザビリティで問題が検出されました」ってメールが届きます。

![mobile-friendly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/1098d745-e31d-7fd4-168e-733165347ac3.png)

## [リッチリザルト テスト](https://search.google.com/test/rich-results?hl=ja)

構造化データは間違えると検索結果に影響するので設定したら確認しておきましょう。

![rich-results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/54f111a7-6215-0e9b-d548-f9eb31516179.png)

## [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=ja)

ページの読み込み時間を短くするのって難しい…

![pagespeed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/5d92b765-4c3c-d888-ce14-3e40a4d7c939.png)

## [robots.txtテスター](https://www.google.com/webmasters/tools/robots-testing-tool)

「ページが検索結果に表示されなくなった！」という時に利用しています。
利用するには [Google Search Console](https://search.google.com/search-console/welcome?hl=ja) にログインが必要です。

![robots-testing-tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/6a3ef316-b593-dc0b-601d-c1ef88816d9e.png)

## [The AMP Validator](https://validator.ampproject.org/)

AMP対応することはほぼないですが、一応載せておきます。

![amp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/e205d10b-7cd0-4cb6-a3c0-2e38008ef97d.png)

## [シェアデバッガー](https://developers.facebook.com/tools/debug/)

公開後は全ページチェックするようにしています。
利用するには [Facebook](https://www.facebook.com/login/) にログインが必要です。

![facebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/1239f669-b2d7-08f0-a384-275de7b45cfd.png)

## [Card Validator](https://cards-dev.twitter.com/validator/)

公開後は全ページチェックするようにしています。
利用するには [Twitter](https://twitter.com/login/) にログインが必要です。

![twitter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/07e182c2-2706-f1bd-18d3-181787ac2dee.png)

## 関連記事
<!-- フロントエンドコーディング時に便利なジェネレーターサイト（随時更新） -->
https://qiita.com/taqumo/items/7df0c4dfaca6bd6436a3

<!-- フロントエンドコーディング時に便利な Visual Studio Code 拡張機能（随時更新） -->
https://qiita.com/taqumo/items/cdd7a9ecd631ecc37793

<!-- フロントエンドコーディング時に便利なChrome拡張機能（随時更新） -->
https://qiita.com/taqumo/items/b2cc6807bc3ca31a5063
[Swift]アプリアイコンの設定をしたのに反映されない時の対処法

#困っていたこと
![a](https://i.gyazo.com/23b9d308a3c2a54856b0ea495c3b4896.png)
このようにAppIconにアイコンを設定したのに、いざシミュレーターや実機テストで確認してみると、アイコン画像が初期画像のまま変わっていない時の解決策について
調べて出てきた再起動、アプリを削除して再インストール、Clean Build Folderをしても解決できませんでした。
#解決した方法
![b](https://i.gyazo.com/b68ecb37b46e5573b021505327dbfa62.png)
Assets.xcassetsをクリック→AppIconをクリックし、
![c](https://i.gyazo.com/2115b9ceabdef34a01483f862bf57f80.png)
この画像のTarget Membershipの一番上の部分にチェックを入れると、変更されます。
ここのチェックが外れると、初期画像になってしまうようです。
#最後に
同じような事例で、他の解決方法、ご指摘などあれば気軽にコメントお願いします！
【Git】複数のリモートリポジトリに一括でpushしたい

# やりたいこと
ローカルの変更を

- github
- heroku

のリモートリポジトリに一括でpushしたい。

![無題の図形描画.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/3635d2c5-f7f5-6e37-db41-a2fe24685fc9.png)


# 今回やってみた方法

[こちらの記事を参考にしました](https://stackoverflow.com/questions/5785549/able-to-push-to-all-git-remotes-with-the-one-command)　

```
git remote
```
でリモートリポジトリ名一覧を取得出来るので、
パイプを使ってxargsに渡し、各リモートリポジトリ名ごとにコマンドを作成します。

```shell:
git remote | xargs -I reponame git push reponame main 
# -I reponame: 変数reponameを任意の場所で展開する
```

今回の環境では

```shell:
$ git push heroku main
$ git push origin main
```

が順に実行されることになります


# おまけ
エイリアス設定するとより楽になると思います

```shell:
git config --global alias.pushall '!git remote | xargs -I reponame git push reponame main'
```

# 追記

githubにpushすると自動でherokuにデプロイしてくれる設定がありました... 
初めからこれ使えばよかったですね
https://devcenter.heroku.com/ja/articles/github-integration

お読みいただきありがとうございました。
GitHubの既存リポジトリにローカルで作成したプロジェクトを移植する

諸事情により、GitHubの既存のリポジトリにローカルで作成したプロジェクトを移植しないといけないという経験をしたのでここにアウトプット

## 流れはGitの初期化と同じ感じに

移植作業といっても、既存のリポジトリに初期化したプロジェクトを`push`するのと同じ流れになるから普通に初期化の流れをやってみる。

```
$ git remote -v  // remoteのURLがないか確認
$ rm -rf .git  // remoteのURLがあったら実行
$ git init
$ git add .
$ git commit -a -m "新プロジェクトの移植作業"
$ git remote add origin git@github.com:管理ユーザー名/移植したいリポジトリ名.git
$ git push -u origin main -f  // 強制的にpushを実行
```

これで処理を実行すると、以下のようなエラーが発生。

```
error: src refspec main does not match any
error: failed to push some refs to 'git@github.com:管理ユーザー名/移植したいリポジトリ名.git
```

エラーが出たからとりあえずググる。

この記事 （ https://qiita.com/fukkatsu3/items/c488ec9559f6cca34313 ） を参考に確認してみると、

```
$ git branch
* master
```

`main`ブランチに移植したいのに`master`ブランチの状態だったことを確認。

```
$ git push -u origin HEAD:main
```

記事をそのまま参考にしてやってみた。

```
$ git push origin HEAD:main
To github.com:管理ユーザー名/移植したいリポジトリ名.git
 ! [rejected]        HEAD -> main (fetch first)
error: failed to push some refs to 'git@github.com:管理ユーザー名/移植したいリポジトリ名.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

依存関係とか諸々で`push`を拒絶した模様。

今回は思考停止で上書きしてもよかったから、強制的に`push`を実行。

```
$ git push -u origin HEAD:main -f
```

これでできた。
Angular の Binding 備忘録

～BindingはAngularの重要な概念の1つです～

AngularのBindingについて改めて調べることがあったので、備忘録として。
ざっくり大筋のイメージを書いてあるので粗さには目をつぶってほしい。

#AngularにおけるBindingとは
component(TypeScript)とtemplate(HTML)間で情報を渡すこと。
AngularのBindingは他のフレームワークと比べて簡単。
ビューモデルなど難しい定義は必要ない。

Angularには大きくわけて3つのBindingタイプがある。
1.Data Binding
2.Event Binding
3.Two-way Binding

##1.Data Binding：データバインディング
TypeScriptからHTMLにデータを単方向に送るバインディング。
Data BindingにはInterpolation(補間) Binding とProperty(プロパティ) Bindingがある。



####〇Interpolation Binding (補間バインディング)
Interpolation Bindingはstringのみを対象とし、データを含めることができない。
つまりboolean(true/false)だとかが無効になってしまう。
全てstringとしてレンダリングされる。
そしてテンプレートリテラルとして参照されるので、連結・足し算・メソッド適用などが可能。

使い方.
バインドには二重波括弧 {{}} を使用する。

例.

``` typescript:TypeScript
name = "Alice";
message = "Hello";
```

``` html:HTML
<p>{{message}}</p>             // Hello
<p>{{" Hello " + name }}</p>   // Hello Alice
<p>{{name.length}}</p>         // 5
<p>{{ 2 + 3 }}</p>             // 5
```

####〇Property Binding
Property Bindingはstring + dataの情報をバインドをしてくれる。
Property Bindingの場合、属性やクラス、スタイルなどにもバインディングができる。
間違えてInterpolation Binding{{}}で書くと無視されるので注意する。

使い方.
バインドには角括弧 [] を使用する。


HTMLでは、バインド対象の属性等に角括弧で囲み、
ダブルクオーテーションで囲まれたプロパティをイコールでつなぐ。
TypeScriptでは、対応するプロパティを値を定義する。

例.
disabled属性がtrueになり、テキストボックスが非活性になる。

``` html:HTML
<input type = "text" [disabled]="isDisabled">
```
``` typescript:Typescript
isDisabled = true;
```
これにはもう少し細かい話があるが今回は割愛。
([attr.xxx] , [class.xxx] , [style.xxx]など)

##2.Event Binding：イベントバインディング
HTMLからTypeScriptにデータを単方向に送るバインディング。
Event BindingはHTML上のeventの情報をバインドしてくれる。
つまりHTML上で起こった変化(event : input,submit,blur...)をTypeScriptに送ってくれる。

使い方.
バインドには丸括弧()を使用する。
HTML上でイベント名を書く際に丸括弧で囲み、
ダブルクオーテーションで囲んだTypeScript上の呼び出したいメソッド名をイコールでつなぐ。
TypeScriptには対応するメソッドを書いておく。

例.
1.Clickボタンだけ表示される
2.Clickボタンを押す
3.HelloがClickボタンの下に表示される

``` html:HTML
<button (click)="change()"> Click </button>
<p>{{message}}</p>
```
``` typescript:Typescript
message = "";              //初期値

change(){
    this.message="Hello";  //Clickボタン押下時にmessageプロパティの中身を"Hello"にする
}
```
$eventを使うことでイベントに関する情報を取得出来て～という話も今回は割愛。

##3.Two-way Binding：双方向バインディング
HTMLとTypeScriptにデータを双方向に送るバインディング。
つまりHTMLとTypeScriptでデータが同期される。
双方向バインディングを有効にするには ngModel ディレクティブが必要。
また、ngModelを有効にするにはFormModuleのインポートが必要。

使い方.
バインドには [( )] を使用する。(よくバナナ in ボックスと呼ばれる)
HTMLでは、イベントタグ内に[(ngModel)]を書き、
ダブルクオーテーションで囲んだ同期したいプロパティをイコールでつなぐ。
TypeScriptでは、FormModuleをapp.module.tsにインポートしておく。
下記例の場合、もし初期値を設定したければ設定しておく。なくてもいい。

例.
1.テキストボックス及びその下に Hey が表示されている
2.テキストボックスの文字を変化させる
3.1文字ずつテキストボックス下の文字も変化する = 同期している！


``` html:HTML
<input [(ngModel)]="message" >
<p>{{message}}</p>
```
``` typescript:Typescript
message = "Hey";              //初期値(なくてもいい)
```

``` typescript:Typescript(app.module.ts)
import { FormsModule } from '@angular/forms';  //忘れないこと
...
@NgModule({
  imports: [
    FormsModule //忘れないこと
  ]
...

```
注：イベントが発生 ⇒ プロパティが更新 ⇒ 補間で表示　という流れになっている。
あくまでTwo-way Binding = Property Binding + Event Binding