OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】Windows10 ブートローダーの回復手順（GPT）

イメージバックアップをリストアした際に、Widows BootloaderがOSの起動に失敗した時の回復作業メモ

# コマンドプロンプトを起動
USBメモリ等にインストーラーを焼いてブートし、修復オプションからコマンドプロンプトを起動

# 修復を試みる
`bootrec`コマンドでBCDの再構築やエントリへの再登録を行う。詳細は`bootrec /?`
- `bootrec /RebuildBcd`
- `bootrec /FixBoot`

# EFIパーティションを再構築する
解決しない場合はEFIパーティションごと作り直す

1. EFIシステムパーティションをマウント  

```
EFIシステムパーティションを選択
diskpart> list voume 
diskpart> select volume <?>

ドライブレターの付与
diskpart> assign letter=E:
```

2. EFIシステムパーティションをフォーマット
`format E: /FS:FAT32`
ラベル名を聞かれたら削除前と同じ「SYSTEM」

3. ブートローダーの構築
bcdboot C:\windows /s E: /f UEFI

# 回復パーティションの再登録
ブートローダーを修正してOSを起動後、上記手順を実行すると回復パーティションへのリンクが切れている思うので、再リンクする。

1. 状態の確認
`reagentc /info`
Windows REの状態がDisableになっていたり、場所が空白になっていれば以下を実行

2. Windows REの場所を再登録
回復パーティションをマウントして、ファイルの存在とパスを確認しておく
`cmd> reagentc /setreimage /path p:\recovery\WindowsRE`

3. Windows REを有効化
`reagentc /enable`

4. 状態の確認
`reagentc /info`
修正された事を確認
年度が変わったら自動でファイルを更新するマクロ

年度が変わった時に新たにファイルを作成することをしないといけなかったので
自動でできるようにしてみました。

忘れたり、工数を低減することが出来ます。



```c++
sub 年度が変わったら自動でファイルを更新するマクロ

‘変数の定義
dim FolderName as string
dim FolderUrl as string 
dim Mithumori as string

‘変数へ値の代入
FolderName = Year(date) & “年度”
FolderUrl = “フォルダーの作成先url” & FolderName
Mithumori = FolderUrl & “¥見積もり”

‘月を判別
if Month(date) = 4 then

　　‘同じ名前のフォルダがあるかを検索しなければ作成する
　　if Dir(FolderUrl, vbDirectory) = “” then

　　　　‘フォルダの作成
　　　　MkDir FolderUrl
　　　　Mkdir Mithumori

　　　　‘シートの削除操作
　　　　application.displayalerts = false
　　　　sheets(“削除するシート名”).delete

　　　　‘シートコピー操作
　　　　sheets(“コピーするシート”).copy after:=sheets(“シート名”)
　　　　activesheet.name = “作成したシートの名称”

　　　　‘ファイルの作成（名前をつけて保存）
　　　　activeworkbook.saveas filename:=FolderUrl & “¥ファイルの名前”
　　　　msgbox “新規で” & FolderName & “のファイルを作成しました”

　　endif
endif

end sub
```
Jenkinsの代わりにCircleCIを導入したい

# 背景

所属するチームでJenkinsを使ってCI/CDを取り込んでいます。最近業務の量が大きくなったので、PRの数も大変増えて来ました。その故に、Jenkinsの負担も結構重くなりまして、下記の問題が行っています。
1. CIが重いので、単体テストは走れない状態で失敗になりました。
2. PRのレビューやマージすることが一旦止まれてしまう。
3. CDも影響されまして、デポロイも失敗になりました。

そして、最近ではなくて、いつでも存在している問題もあります。
1. CI結果は見辛い。コケっている原因を調べる際に、まずJenkinsをログインして、後はタスクを探して、その「**console出力ログ**」をちゃんと観ないと原因が分からない。
2. 今回のCI結果が後のタスクで被られる。CI結果を早く見ないと消えるの大変困っています。
3. 改修はややこしい。Jenkinsの改修はインフラの方を頼まなければならない。CIはそもそも開発を上手く進めていくツールと思うので、開発チームが手軽で改修できれば助かります。
4. [技術的負債](https://qiita.com/erukiti/items/9cc7850250268582dde7)

# CircleCI

CircleCIは現在流行っているCIツールとして、いろんなプロジェクトに使われています。
例：
https://github.com/facebook/react/pull/20849
![WX20210223-115639@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199563/417b5f95-327e-3eb5-a17e-d22c0af1307d.png)

## 目の前のまとめ

1. 並行性が優れてしまうので、「走れない状態で失敗する」ことを回避することができます。
2. CDと分離しまうので、デポロイに影響を与えて来ないにする。
3. Github Friendly。GithubでCircleCIの結果は見えやすいです。そして、他のタスクで被られることがないです。
例：
https://app.circleci.com/pipelines/github/facebook/react/10476/workflows/2145d75f-ea91-4fbe-b8fe-121c8b00e9f1/jobs/273374
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199563/842569ab-880e-a3d2-32a8-8dbc498ccd61.png)
4. 改修はやり易い。CircleCIの改修はチーム内で対応できます。そして、手数は大変減らしてしまう。
例：https://github.com/facebook/react/blob/master/.circleci/config.yml

## 将来のメリット

既存の問題を解決するだけではなく、将来にもいろんなことができそうになります。

### gemの導入

現在でrspec、rubocopだけの検証は大規模なプロジェクトにとって、コード品質を保証するために全然足りないと思うので、Dangerやbrakemanなど検証gemをどんどん導入する必要があります。
参考：
https://github.com/danger/danger
https://github.com/presidentbeef/brakeman
https://github.com/cucumber/cucumber-ruby

### 多言語対応

様々なプログラム言語は自身の特性によって、一番適用のシナリオンもそれぞれです。
例えば、 Railsのweb開発速度が早い。Pythonは豊富なlibraryを持っています。Golangの並行処理はすごい。云々。
多言語を取り込んだプロジェクトにとって、JenkinsでCI方針を作って実装することより多言語対応できるなCircleCIがやり易いです。

### communityが強い

googleやstackoverflowでもcircleCIのcommunityが活躍なので、問題解決はとても便利です。

参考： 
https://discuss.circleci.com/
https://stackoverflow.com/search?q=circleCI

### 価格も高くない

JenkinsやAWS側のアップグレードより、CircleCIの価格はあまり高くない。

参考：https://circleci.com/pricing/

# まとめ

今回CircleCIを導入して来たい理由は、

1. 目の前の問題を解決したい。CircleCIの並行処理を活用して、チーム開発を上手く進めて欲しい。
2. 将来の改善やリファクタリングを準備する。
3. 流行っていることを追いかけたい。
浮動小数点

##浮動小数点の利点##
ルールを使うことで・・・少ない情報量で非常に大きな範囲の数が表現できる。
**→メモリ使用の効率化**
ex 1.000000000000=1.0✖️10^12
   0.000000000001=-1.0✖️10^-12


##浮動小数点の表現方法##
浮動小数点は３つの部屋に分かれる

![スクリーンショット 2021-02-23 17.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131065/7d1f01e4-eeb3-a4f1-ae8c-3d75430bebfb.png)

それぞれの部屋の説明は以下の通りである。

**１.符号部**
数値の正負を表す部分
１なら負数　０なら正数

**2.指数部**
指数部とはn乗を表す部分　ex. 1.0✖️10^12←この12の部分
**２進数の不動小数点の場合はnに127を足した値とする。**

**３.仮数部**
頭の1.0の表す部分
但し、整数部分が１になるまでシフト演算を行い、
**整数部の１を省略して小数点第一位の値から**格納する。
余った部分はゼロで埋める。


##浮動小数点の直し方##

ex １０進数0.375を2進数の浮動小数点形式に直す

STEP1　0.375を2進数へ変換。
0.375=0.011

STEP2 ２進数を**1.Mという表現になるように直す
0.011=1.1✖︎2^-2乗（左へ2ビットシフト）

STEP３　変換して出した指数に**（127）10＝（01111111)**を足して
仮数部のブランクに格納。

−２（上記指数部）＋127＝125→（０１１１１１０１）となる

![スクリーンショット 2021-02-23 19.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131065/129a35fe-0880-9cf5-1d27-5344bce5cab2.png)

STEP4　変換した仮数部を格納する
→変換して出てきた仮数（1.1)から整数部分を省略して
**小数第一位から**格納していく
余った部分は０で埋める。
![スクリーンショット 2021-02-23 19.25.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131065/e6ca5a75-e435-3c92-b7bf-667554268ce8.png)

STEP5 符号部に該当の符号を入力して完成。
今回の場合は先頭に０を追加

##参考文献##
キタミ式基本情報技術者P５８〜P66


































![Something went wrong]()
amplifyの作法 その3

#概要

amplifyの作法、調べてみた。
sum使ってみた。

#サンプルコード

```

import numpy as np
from amplify import BinaryPoly, gen_symbols
from amplify.constraint import equal_to
from amplify import Solver
from amplify.client import FixstarsClient
from amplify import BinaryQuadraticModel
from amplify import decode_solution

q = gen_symbols(BinaryPoly, 9, 9, 9)
initial = np.array([
        [2, 0, 5, 1, 3, 0, 0, 0, 4],
        [0, 0, 0, 0, 4, 8, 0, 0, 0],
        [0, 0, 0, 0, 0, 7, 0, 2, 0],
        [0, 3, 8, 5, 0, 0, 0, 9, 2],
        [0, 0, 0, 0, 9, 0, 7, 0, 0],
        [0, 0, 0, 0, 0, 0, 4, 5, 0],
        [8, 6, 0, 9, 7, 0, 0, 0, 0],
        [9, 5, 0, 0, 0, 0, 0, 3, 1],
        [0, 0, 4, 0, 0, 0, 0, 0, 0],
])
def print_sudoku(sudoku):
    print("\n\n")
    for i in range(len(sudoku)):
        line = ""
        if i == 3 or i == 6:
            print("---------------------")
        for j in range(len(sudoku[i])):
            if j == 3 or j == 6:
                line += "| "
            line += str(sudoku[i][j]) + " "
        print(line)

print_sudoku(initial)
for i, j in zip(*np.where(initial != 0)):
    k = initial[i, j] - 1
    for m in range(9):
        q[i][m][k] = BinaryPoly(0)
        q[m][j][k] = BinaryPoly(0)
        q[i][j][m] = BinaryPoly(0)
        q[3 * (i // 3) + m // 3][3 * (j // 3) + m % 3][k] = BinaryPoly(0)
    q[i][j][k] = BinaryPoly(1)

row_constraints = [equal_to(sum([q[i][j][k] for j in range(9)]), 1) for i in range(9) for k in range(9)]
col_constraints = [equal_to(sum([q[i][j][k] for i in range(9)]), 1) for j in range(9) for k in range(9)]
num_constraints = [equal_to(sum([q[i][j][k] for k in range(9)]), 1) for i in range(9) for j in range(9)]
block_constraints = [equal_to(sum([q[i + m // 3][j + m % 3][k] for m in range(9)]), 1)
    for i in range(0, 9, 3)
    for j in range(0, 9, 3)
    for k in range(9)]
constraints = (sum(row_constraints) + sum(col_constraints) + sum(num_constraints) + sum(block_constraints))
solver = Solver(client)
model = BinaryQuadraticModel(constraints)
result = solver.solve(model)
if len(result) == 0:
    raise RuntimeError("Any one of constaraints is not satisfied.")
values = result[0].values
q_values = decode_solution(q, values)
answer = np.array([np.where(np.array(q_values[i]) != 0)[1] + 1 for i in range(9)])
print_sudoku(answer)




```


以上。
Action Cableでグループチャット機能と削除機能、スクロール機能を実装したい(その１)

#1初めまして
プログラミングというものをやり始めて、3ヶ月というど素人ですが、今回ポートフォリオで実装したaction cableの上記機能を、復習がてらもう一度作って行きたいと思います。
Qiita初投稿&素人投稿なので、ガバガバな部分もありますが、一つお願いいたします。
#2作成バージョン
使用環境
ruby 2.6.3
rails 5.2
#３土台を作りもす
今回は、ユーザーというテーブルと、ユーザーが入る為のルームを作成し、そこに中間テーブルのチャットを作って行きたいと思います。
deviseでさっくり作ります。bundle installした後に、

```
rails g devise:install
rails g devise User
```
でユーザーモデルを作成します。
続いて、ルームと中間テーブルのチャットモデルを作成します。

```
rails g model Room
rails g model Chat
```
今回は、ルームに名前のカラムと、チャットの方には外部キーのルームとユーザーIDを指定して、実際コメントを保存するメッセージカラムを用意します。

```ruby
class CreateRooms < ActiveRecord::Migration[5.2]
  def change
    create_table :rooms do |t|
      t.string :name #ここのカラムはお好みで
      t.timestamps
    end
  end
end
```

```ruby
  def change
    create_table :chats do |t|
      t.integer :user_id, null: false
      t.integer :room_id, null: false
      t.text :message
      t.timestamps
    end
  end
end
```
最後に忘れがちなリレーションを行って土台作りは完了です。

```ruby:user.rb
has_many :chats, dependent: :destroy
```
```ruby:room.rb
has_many :chats, dependent: :destroy
```

```ruby:chat.rb
class Chat < ApplicationRecord
  belongs_to :user
  belongs_to :room
end
```
#4チャット機能の準備
土台は出来たので、次はactioncableでのチャットを行う際のコントローラーやviewの作成を行います。

```ruby
rails g controller rooms
```
作成したコントローラーに

```ruby:rooms_controller.rb
class RoomsController < ApplicationController

  def index
  @rooms = Room.all
  @room = Room.new
  end

  def create
    room = Room.new(room_params)
    room.save
    redirect_to rooms_path
  end
  
  def show
   @room = Room.find(params[:id])
   @chats = @room.chats
  end

private
  def room_params
    params.require(:room).permit(:name)
  end

end
```
viewには

```ruby:rooms/index.html.erb
<% @rooms.each do |room| %>
<%= link_to room_path(room) do %>
<%= room.name %>
<%= room.id%>
<% end %>
<% end %>

<%= form_with model: @room, local:true do |f| %>
<%= f.hidden_field :name, :value => "ChatRoom" %>
<%= f.submit "作成"%>
<% end %>
```
を記入して準備はほぼ終わりです。

#5 その２へ続きます
非常に長くなってしまったので、その２に続きます。
こんな駄文でよければ、その２も見ていただけるとありがたいです。



クソお世話になった記事（ほぼこれを見ながら実装しました)
https://qiita.com/rhiroe/items/4c4e983e34a44c5ace27
M5Stack UIFlowでHTTP(GET)通信


M5Stack UIFlowでのHTTP(GET)通信についてメモ

##参考にしたサイト
こちらを参考にさせてもらいました。ありがとうございました。

- [第9回 - インターネット 編【PLEN5Stackでプログラミング学習](https://note.com/plenproject/n/ncd935f974443)

<br>
##配列がない場合
※JSON内に［大括弧］が無い場合
<br>
例えば、
HTTP（GET）通信でこんなJSONデータが取得できるとします。


```
{
  "id": "1",
  "payloads": {
    "gyroX": -14,
    "gyroY": -21.1,
    "gyroZ": -18.5
  }
}
```
<BR>
このJSONデータから gyroX を取得するUIFlowは以下のとおりになります。

[![Image from Gyazo](https://i.gyazo.com/77e522dac78a88de858884b9a22a6fa1.png)](https://gyazo.com/77e522dac78a88de858884b9a22a6fa1)



##配列の場合　※未実践のため参考情報
※配列とは、JSON内に［大括弧］があるケース

配列のあるJSONを試すケースがなかったので、[参考にしたサイト](https://note.com/plenproject/n/ncd935f974443)を読んだだけの情報です。おそらく大丈夫なはずです。
未来の自分がここの記憶を忘れたころにJSON配列にあたった場合に備えてここに残します。
<br>
例えば、以下のような配列のあるJSONの場合

```
{
  "id": "1",
  "payloads": [
    {
      "gyroX": -14,
      "gyroY": -21.1,
      "gyroZ": -18.5
    },
    {
      "gyroX": -13.2,
      "gyroY": -20.1,
      "gyroZ": -30.5
    }
  ]
}
```

<br>
リストというブロックを使います。
<br>
以下のブロックで1番最初のデータの取得できるはずです。
[![Image from Gyazo](https://i.gyazo.com/aba9fb21a2b39e4167bc38d700a67218.png)](https://gyazo.com/aba9fb21a2b39e4167bc38d700a67218)

<br>


##wifiが自動的につながらない場合
普通は自動的につながるのですが、つながらない場合は、以下のブロックを追加します。
[![Image from Gyazo](https://i.gyazo.com/0f745ca5535875c5264a41f28b2ffa09.png)](https://gyazo.com/0f745ca5535875c5264a41f28b2ffa09)

つながってるかどうか視覚的に分かるように、こんなブロックを追加したらいいと思います。
[![Image from Gyazo](https://i.gyazo.com/f0df1eb4df99bcfafbf8eba2e1ea3198.png)](https://gyazo.com/f0df1eb4df99bcfafbf8eba2e1ea3198)

##その他
POST通信はこちら

- [M5Stack UIFlowでHTTP(POST)通信](https://qiita.com/tatsuya1970/items/737b9af78191846d4556)

<br>
vanilla.jsでswiperを使う

https://swiperjs.com/swiper-api#thumbs
を参考にする


```js 
var tab = new Swiper('.tab-content', {
    slidesPerView: 1,
    autoHeight: true,
    
    thumbs: {
        swiper: {
            el: '.tab-menu',
            slidesPerView: 3,//タブの数を決めたら勝手にスタイル当てられる
        }
    },
});
```
M5StackとFlutterと通信してみた

# はじめに
以前投稿した[M5StackとiOS端末と通信してみた](https://qiita.com/From_F/items/66099d488a324ad38d40)をFlutter版にしました。

サンプルコードとして[github](https://github.com/FromF/FlutterBluetoothLECommunication)にアップしてありますので参考にしてください。

BluetoothLEについては[前回の記事](https://qiita.com/From_F/items/66099d488a324ad38d40)を参考にしてください。

# 実装ポイント
実装のポイントを記載します。

## ペリフェラルスキャン

`startScan`を実行するとペリフェラルスキャンします。
`r.device.name`でローカルネームを参照してターゲットデバイス確認しています。

```dart
  void scanDevices() {
    // Start scanning
    _flutterBlue.startScan(timeout: Duration(seconds: _timeout));
    // Listen to scan results
    var subscription = _flutterBlue.scanResults.listen((results) async {
      // do something with scan results
      for (ScanResult r in results) {
        print('${r.device.name} found! rssi: ${r.rssi}');
        if (r.device.name == _connectToLocalName) {
          //デバイスを発見したのでここでデバイス情報を保持する
          if (_device == null) {
            _device = r.device;
            notifyListeners();
            await connect();
            break;
          }
        }
      }
    });
    // Stop scanning
    _flutterBlue.stopScan();
  }
```

## サービスのスキャン
サービススキャンして必要なサービスを`write`と`notify`をつないでいます。

```dart
    List<BluetoothService> services = await _device.discoverServices();
    services.forEach((service) async {
      // do something with service
      service.characteristics.forEach((characteristic) async {
        if (characteristic.properties.write) {
          _writeCharacteristic = characteristic;
          print('write');
        } else if (characteristic.properties.notify) {
          _notifyCharacteristic = characteristic;
          await _notifyCharacteristic.setNotifyValue(true);
          _notifyCharacteristic.value.listen((value) {
            // do something with new value
            receiveRaw = value;
            receiveString = utf8.decode(value);
            print('recevied:${receiveString}');
            notifyListeners();
          });
          print('notify');
        }
      });
    });
```

# 最後に
すっごく簡単な記事で恐縮ですが、Peripheral側のパッケージ[flutter_ble_peripheral](https://pub.dev/packages/flutter_ble_peripheral)は開発中で、今のところ逆は簡単に実現できないようです。
amplifyの作法 その2

#概要

amplifyの作法、調べてみた。
decode_solution使ってみた。

#サンプルコード

```
from amplify import BinaryPoly, gen_symbols
import japanmap as jm
from amplify import sum_poly
from amplify.constraint import equal_to, penalty
from amplify import Solver
from amplify.client import FixstarsClient
from amplify import BinaryQuadraticModel
from amplify import decode_solution
import numpy as np
import matplotlib.pyplot as plt

colors = ["red", "green", "blue", "yellow"]
num_colors = len(colors)
num_region = len(jm.pref_names) - 1
q = gen_symbols(BinaryPoly, num_region, num_colors)
reg_constraints = [equal_to(sum_poly([q[i][c] for c in range(num_colors)]), 1) for i in range(num_region)]
adj_constraints = [penalty(q[i][c] * q[j - 1][c]) for i in range(num_region) for j in jm.adjacent(i + 1) if i + 1 < j for c in range(num_colors)]
constraints = sum(reg_constraints) + sum(adj_constraints)
solver = Solver(client)
model = BinaryQuadraticModel(constraints)
result = solver.solve(model)
if len(result) == 0:
    raise RuntimeError("Any one of constraints is not satisfied.")
values = result[0].values
q_values = decode_solution(q, values, 1)
color_indices = np.where(np.array(q_values) == 1)[1]
color_map = {jm.pref_names[i + 1]: colors[color_indices[i]] for i in range(len(color_indices))}
plt.rcParams["figure.figsize"] = 6, 6
plt.imshow(jm.picture(color_map))
plt.show()


```


以上。
Raspberry Pi PicoでGarageBand(ソフトウエア音源)を鳴らす

pico-sdkの中身にtinyUSBのサンプルにmidi_testがあり、USB経由のmidi出力をMacのGarageBandのピアノを鳴らすことができました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Raspberry Pi PicoでGarageBand(MIDI)を鳴らす<a href="https://twitter.com/hashtag/RaspberryPiPico?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPiPico</a><a href="https://t.co/5vhnNbmRcV">https://t.co/5vhnNbmRcV</a> <a href="https://t.co/7K3hCdGGWU">pic.twitter.com/7K3hCdGGWU</a></p>&mdash; Sam Akada@HomeKit (@sam_akada) <a href="https://twitter.com/sam_akada/status/1364003716710375426?ref_src=twsrc%5Etfw">February 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
## tinyusbのmidi_testサンプルプログラムをコピーする
Getting started with Raspberry Pi Picoの通り、picoディレクトリ配下にpico-sdkがある前提で説明します。

```
$ cp -r pico-sdk/lib/tinyusb/examples/device/midi_test .
$ cd midi_test
$ cp ../pico-sdk/external/pico_sdk_import.cmake .
```
# CMakeList.txtを作成する
```
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
get_filename_component(PROJECT ${CMAKE_CURRENT_SOURCE_DIR} NAME)
project(${PROJECT})
pico_sdk_init()
add_executable(${PROJECT}
    src/main.c
    src/usb_descriptors.c
)
pico_enable_stdio_usb(${PROJECT} 0)
pico_enable_stdio_uart(${PROJECT} 1)
pico_add_extra_outputs(${PROJECT})
target_link_libraries(${PROJECT} pico_stdlib tinyusb_device tinyusb_board)
include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src)
```

## ディレクトリ構成
```
pico-sdk
midi_test
├── CMakeLists.txt
├── Makefile
├── pico_sdk_import.cmake
└── src
    ├── main.c
    ├── tusb_config.h
    └── usb_descriptors.c
```
## ビルド
```
$ mkdir build
$ cd build
$ cmake ..
$ make
```

## テスト
midi_test.uf2が作成されるので、Raspberry Pi Picoへコピーする。
Raspberry Pi PicoがMIDIコントローラになり、MacのGarageBand(ソフトウエア音源)を鳴らすことができます。
docker からホストのフォルダのマウント

イメージからコンテナを作るときに`-v`オプションを渡す。

```bash
sudo docker run -it --name my_app -v /home/***/my_app:/usr/local/my_app <イメージ名>
```
コンテナ内に`/usr/local/my_app`が作られてここで共有される。
ソースなどホストから参照かつ頻繁に更新する場合はこのやり方がいいらしい。

一方DBなどホストからは触りたくないブラックボックスとなるデータは volume で管理することが推奨される。
input type=numberの上下キーでの増減を無効にする

　input type=numberの値が上下キーで増減するのを無効にする必要があったので、HTML属性で有効無効を切り替えられるのかと思ったけれど、無効にはできないようなので、JQueryで対処。
　押したキーを無効化するだけですが、検索して調べる人もいると思うので書いておきます。

　画面上のすべてのinput type=numberに対して効くので、一部のinputだけに適応させたい場合はセレクタでidやclassを指定してあげてください。

```javascript
$(function ()
{
	$('input[type=number]').keydown(function (event)
	{
		switch (event.key)
		{
			case 'ArrowUp':
			case 'ArrowDown':
				return false;
		}
	});
});
```

　「矢印ボタンを出さない」と「マウススクロールでの増減無効化」は実装例がたくさんあるのだけれど、上下キー無効はあまり必要ないのかな。
　間違ってカーソルキーを押しちゃった時にいつのまにか値が変わっていたら嫌なので需要はあると思うんですけどね。金額入力とか。
初学者がDockerを使ってdjango+gunicorn+Nginxの環境を構築する

# Dockerfileを作成
```dockerfile:Dockerfile
FROM python:3

RUN apt-get update && apt-get install -y \
	nano
WORKDIR  /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt

RUN mkdir -p /var/run/gunicorn
# CMD ["gunicorn", "conf.wsgi", "--bind=unix:/var/run/gunicorn/gunicorn.sock"]
```

# requirements.txtを作成
```requirements.txt
Django==2.2.6
gunicorn
```

# docker-compose.ymlを作成
```yaml:docker-compose.yml
version: '3'

volumes:
  gunicorn:
    driver: local

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: django
    ports:
      - '8000:8000'
    volumes:
      - './web:/code'
      - gunicorn:/var/run/gunicorn
    tty: true
    stdin_open: true
  
  nginx:
    image: nginx
    container_name: test_nginx
    ports:
      - '80:80'
    volumes:
      - './nginx/html:/usr/share/nginx/html'
      - './nginx/conf.d:/etc/nginx/conf.d'
      - gunicorn:/var/run/gunicorn
    depends_on:
      - web
```

# ディレクトリを作る
```text:構成
.
├── Dockerifle
├── requirements.txt
├── docker-compose.yml
├── nginx
│   └── conf.d    # gunicornの設定ファイルを格納するため
└── web           # djangoプロジェクトを格納するため
```

# gunicornの設定ファイルを作成
```text:構成
.
├── docker-compose.yml
├── Dockerifle
├── requirements.txt
├── nginx
│   └── conf.d
│       └── gunicorn.conf    # コレを作成
└── web       
```

gunicorn.confの中身はこのような感じです。

```text:gunicorn.conf
upstream gunicorn-django {
    server unix:///var/run/gunicorn/gunicorn.sock;
}

server {
    listen 80;
    server_name localhost;

    location / {
        try_files $uri @gunicorn;
    }

    location @gunicorn {
        proxy_pass http://gunicorn-django;
    }
}
```
# docker-composeでイメージをビルドし、コンテナを起動する
```
$ docker-compose up -d
```
$ docker-compose ps でコンテナが二つともUpになっていることを確認します。

# djangoプロジェクトを作成
まずはdjangoコンテナに入ります。

```
$ docker-compose exec web bash
```

djangoプロジェクトを作成します。

```
$ django-admin startproject conf .
```

バインドマウントをしているので、ホストのwebフォルダの配下にもconfフォルダやmanage.pyが作成されていると思います。今回、アプリケーションの作成は割愛しますが、実際のアプリ開発はここで行うと便利かもしれません。

# settings.pyを変更
先ほど作成したdjangoプロジェクト内にあるsettings.pyのALLOWED_HOSTSを変更します。とりあえずどんなサーバーアドレスからのアクセスも受理することにしますが、必要に応じて変更した方が良いような気がします。。。

```python:settings.py
ALLOWED_HOSTS = ['*']
```
exitでコンテナから抜けます。

# ここからは試行錯誤…
ここからは試行錯誤の結果なので、非効率なやり方になっていると思います。何卒、ご容赦ください。良いやり方があったら教えて頂けると嬉しい…。
|ω・`）チラ　

<hr>

一旦、コンテナをダウンさせます。

```
$ docker-compose down
```
次にDockerfileに追記します。

```dockerfile:Dockerfile
# 末尾に追加
CMD ["gunicorn", "conf.wsgi", "--bind=unix:/var/run/gunicorn/gunicorn.sock"]
```

再びDockerをupさせます。

```
$ docker-compose up --build -d
```

$ docker-compose psでコンテナがUpになっていることを確認したら、ブラウザからlocalhost:80にアクセスし、ロケットが飛び立っていることを確認します。
![スクリーンショット 2021-02-23 11.43.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689015/30a8ea2a-b620-1f4d-5da5-113608bf2b4e.png)

うーん…ひとまず動きましたが、うまくいっている確証が持てていません…。
間違っているところがありましたら申し訳ありません！
Ruffle を使って「おもしろフラッシュ倉庫」を復活させる

# はじめに

Flash Playerの終了でFlash不足の紳士淑女に朗報です！
ruffleを使えばあの懐かしFlashが蘇ります！
しかも無料です！

~~いいからさっさとFlashを見せろという方はこちら~~
**公開は終了しました<(_ _)>**



# 救世主「ruffle」 

https://ruffle.rs/

海外の有志によって開発されたFlashPlayerエミュレーターです。
こいつを使えば Flash黄金時代復活は間違いなしです。

中身はRust言語、WebAssemblyで動くためiPhone・Androidでも動作します。
３種類の利用方法が提供されているため、環境に合わせてチョイスしましょう。

 - ウェブサイト管理者がサイトに埋め込む（サイトの管理者向け）
 - 利用者がブラウザ拡張機能としてインストールする（サイトの利用者向け）
 - デスクトップアプリとしてインストールする（ローカル向け）

今回はおもしろフラッシュ倉庫の復活が目標なので 1 の埋め込み方式です。
~~拡張機能方式の場合は[こちら](https://oppekepe.org/5553)が参考になります。~~
[おまけで書きました！！](#おまけ)


# ウェブサイトにJavaScriptを一行追加するだけ

手順は一般的なJavaScript追加と同じで

1. ruffleの公式サイトから「Self Hosted」をダウンロード
2. 解凍して必要なファイルをサーバにアップロード
3. Flashのあるページに`script`タグを埋め込む

だけです！
元々あるFlashに設定を入れたり、変換したりは不要です。
では実際にやってみます。

## 1.「Self Hosted」をダウンロード

[https://ruffle.rs/#releases](https://ruffle.rs/#releases)の「Self Hosted」と書かれたリンクからファイルをダウンロードします。
毎日リリースされているので最も新しいファイルを選びましょう。

![alt](https://qiita-image.cloudremix.net/Ruffle-Download.jpg)

## 2. サーバにアップロード

ダウンロードしたZIPファイルを解凍して、必要なファイルをFlashのあるサーバにアップロードします。
Flashとは別サーバ（別ドメイン）でも動きますが[CORS](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS)が必要になります。

```:必要なファイル
bf4d4f25e545c29722d2ab3143ad22e4.wasm  # ランダムのため.wasmで探す 
ruffle.js
```

## 3.`script`タグを埋め込み

Flashがあるページの`<body>`直下に先ほどアップロードしたscriptを埋め込みます。
`~.wasm`は`ruffle.js`から呼ばれるため不要です。

```
<script src="https://【ドメイン】/ruffle.js"></script>
```

## 4. Flashを楽しむ

タグの埋め込みが終わればあとは煮るなり焼くなりお好きに！！

~~復活したおもしろフラッシュ倉庫はこちらから~~
~~※利用ストレージの関係で期限付き公開です。~~
**公開は終了しました<(_ _)>**



# 蛇足

最近のモニタだと相当荒く表示されるかと思ったけど、きれいに表示された。
Adobe系で使われるベクター形式という拡大縮小に強い形式とのこと。（SVGと同じ感じ）

※画像は4Kモニタで表示した場合（クリックで原寸大）

[![alt](https://qiita-image.cloudremix.net/Ruffle-Flash-Demo-Small.jpg)](https://qiita-image.cloudremix.net/Ruffle-Flash-Demo-4K.jpg)

# おまけ

いろいろな人が見ていただけているので、拡張機能の方法も紹介します。

## 1.「Browser Extension」をインストール

#### Chrome

https://chrome.google.com/webstore/detail/ruffle/donbcfbmhbcapadipfkeojnmajbakjdc

#### Firefox

https://addons.mozilla.org/ja/firefox/addon/ruffle_rs/

## 2. Flashを楽しむ

あとはFlashのあるページを表示するだけです！！
この方法であれば管理下にないファイルも自由に楽しめます！！！

![alt](https://qiita-image.cloudremix.net/Ruffle-Extension-Demo.jpg)
2バイト言語で作れるメールアドレス、もじアドレス

<a href="https://figreen.org/moji/">もじアドレス</a>とは、どんなWebサービスですか？

２バイト文字、つまり日本語の文字だけをアドレスにしてメールを送れるサービスです。もっと分かりやすく言うと、コンタクトフォーム自体を任意の文字で検索できるようにした感じです。実質日本語、漢字だけのメールアドレスを持てるような雰囲気になります。twitter質問箱のリアル版というか、ペイパルやホワットスリーワーズにインスパイアされて作りました。

そもそもこの <a href="https://figreen.org/moji/">もじアドレス</a> というのはなんの役に立つのですか？

行政とか民間の企業は、個人と音声通話のみでコンタクトをとろうとすることが多いと思います。連絡したい相手の携帯番号を知っているのであれば、簡単なショートメールの1つや2つくれればいいのにな。と思う反面、それをやろうとするとスマホ＆スマホの二台間でのやりとりが必要になってくる為、個人対組織では難しいですよね。

人の名前だけでテキストが伝達できれば、色々と社会がもう少しスムーズに動くだろうなあと思って作りました。でも本当は、街中で見かけた子とかコンビニで働いている可愛い子に声がかけられないので作りました。

機能面でこだわった点などありますか？

自分が設定した期日を過ぎると、自動的に検索対象から外れる機能を付けました。これは洋服にメールを送るシーンを考えた時の機能として付けました。

<a href="https://figreen.org/moji/">もじアドレス</a>は2020年5月にできたサービスです。
amplifyの作法

#概要

amplifyの作法、調べてみた。
sum_poly使ってみた。

#サンプルコード

```

import numpy as np
from amplify import (BinaryPoly, BinaryQuadraticModel, sum_poly, gen_symbols, Solver, decode_solution, )
from amplify import sum_poly
from amplify.constraint import equal_to
import matplotlib.pyplot as plt

def show_route(route: list, distances: np.ndarray, locations: np.ndarray):
    ncity = len(route)
    path_length = sum([distances[route[i]][route[(i + 1) % ncity]] for i in range(ncity)])
    x = [i[0] for i in locations]
    y = [i[1] for i in locations]
    plt.figure(figsize=(7, 7))
    plt.title(f"path length: {path_length}")
    plt.xlabel("x")
    plt.ylabel("y")
    for i in range(ncity):
        r = route[i]
        n = route[(i + 1) % ncity]
        plt.plot([x[r], x[n]], [y[r], y[n]], "b-")
    plt.plot(x, y, "ro")
    plt.show()
    return path_length

def gen_random_tsp(ncity: int):
    locations = np.random.uniform(size = (ncity, 2))
    all_diffs = np.expand_dims(locations, axis = 1) - np.expand_dims(locations, axis = 0)
    distances = np.sqrt(np.sum(all_diffs ** 2, axis = -1))
    return locations, distances

ncity = 15
locations, distances = gen_random_tsp(ncity)
q = gen_symbols(BinaryPoly, ncity, ncity)
cost = sum_poly(ncity, lambda n: sum_poly(ncity, lambda i: sum_poly(ncity, lambda j: distances[i][j] * q[n][i] * q[(n + 1) % ncity][j]), ), )
row_constraints = [equal_to(sum_poly([q[n][i] for i in range(ncity)]), 1) for n in range(ncity)]
col_constraints = [equal_to(sum_poly([q[n][i] for n in range(ncity)]), 1) for i in range(ncity)]
constraints = sum(row_constraints) + sum(col_constraints)
constraints *= np.amax(distances)
model = cost + constraints
solver = Solver(client)
result = solver.solve(model)
energy, values = result[0].energy, result[0].values
q_values = decode_solution(q, values, 1)
route = np.where(np.array(q_values) == 1)[1]
show_route(route, distances, locations)

```


以上。
STM32L010のMbedでの時計,DS1307で時刻表示( AQM0802A i2c)


x時間合わせは、なし
x5Vをds1307に接続

xもうどうゃつても入らないので一旦、時間合わせのプログラムをローディング
して再度、表示のプログラムを書き込む。考え中　リコンパイルまで含めるか
x時間合わせは、とりあえず対応済

注意
mbedのリビジョンは、125

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

忙しい人よう
https://os.mbed.com/users/caa45040/code/i2c_lcd_ds1307_010_1/

```c++

#include "mbed.h"

#define ADDR        (0xD0)   //  address
#define ADDR_LCD    (0x7C)      //  address

//I2C i2c(I2C_SDA, I2C_SCL); //767
//I2C i2c(dp5, dp27); //1114
I2C i2c(PA_10, PA_9); //010

char    data_read[8];   //i2cバッファー

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41,0x99,0x99};

char INIT_cls[]={0x0,0x1};

char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
    ch_hex_a_b[0] = '@';
    ch_hex_a_b[1] = '0' + (l_num >> 4);
    ch_hex_a_b[2] = '0' + (l_num & 0xf);
    ch_hex_a_b[3] = ':';
    ch_hex_a_b[4] = 0;
    return(ch_hex_a_b);
}

int ii;     //ループカウンタ

int main()
{
    //液晶の初期化
    for(ii=0;ii<11;ii++){
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);wait_ms(2);
    } //for
 
    while (1) {
        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);wait_ms(2);
        
        //時間の読み込み
        i2c.write(ADDR, "\000", 1);
        i2c.read(ADDR | 1, data_read, 7);
       
        i2c.write(ADDR_LCD, ch_hex_a(data_read[2]) ,4); wait_ms(1);
        i2c.write(ADDR_LCD, ch_hex_a(data_read[1]) ,4); wait_ms(1);
        i2c.write(ADDR_LCD, ch_hex_a(data_read[0]) ,4);

        wait_ms(1000);
    }//while
 
}//main



```


時間合わせプログラム

```

#include "mbed.h"
#include <stdio.h>
 
//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX);

#define ADDR        (0xD0)  //  address
#define ADDR_LCD    (0x7C)  //  address

//I2C i2c(I2C_SDA, I2C_SCL); //767
//I2C i2c(dp5, dp27); //1114
I2C i2c(PA_10, PA_9); //010

char data_read[8];  //i2cバッファー

#define HH  12
#define MM  34

int main() {
    
///*INIT start *********  

    data_read[0]=0;
    data_read[1]=0;
    data_read[2]= ( MM /10)*16+( MM %10);
    data_read[3]= ( HH /10)*16+( HH %10);
    data_read[4]=3;    
    data_read[5]=1;
    data_read[6]=1;
    data_read[7]=0x20;
    
    i2c.write(ADDR, data_read, 8);

//*/  //INIT end *********

    while(1){} //無限ループ

} // main

```

![i2c_ds1307_010_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/27637443-f14c-4bd5-03df-1df4b2428b5e.jpeg)

![010_ds1307_ff_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0c9eb9c6-da95-8e04-b391-728b249d492d.jpeg)

![i2c_lcd_ds1307_010_a_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2ae7248b-2cf2-586a-9d18-a20a7e40551a.jpeg)
CodeCommit(git)でpushを取り消す方法

# はじめに
タイトルの通りです。忘れがちなので自分用のメモです。
# やること

CodeCommitの画面でコミットを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685335/2bb1dca0-589f-e2ba-b11a-4dded86e5335.png)

ブランチを選択して**戻りたいコミット**のIDをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685335/3203dcd9-2f4d-b52b-ef95-e351cda45d72.png)

あとは以下のコマンドを実行します。

```
git push -f origin <コピーしたコミットのID>:branch名
```

CodeCommitを確認すると、指定したコミットまでさかのぼっていることがわかります。
```revert```コマンドとかを使うと、情報を残せるらしいです。

# おわりに
誤pushや誤commitは極力控えたいですね。
android studio Opencv manager package was not found! の対処法

## 概要
android アプリにおいてOpencvを用いており、
このようなエラーがメッセージが出ていました。

git にはgoogle play store よりダウンロードするように書かれていましたが、
リンクに飛んでみるとリンクがなくなっており、どうしたものかと考えていました。

## 解決策

Opencv-android-sdkを公式からダウンロード
そしてadbコマンドにて手動でapkを端末にインストールします。


```
adb devices
```
をすることで、現在デバッグ作業をしているデバイスが見えるはず。

これが確認できたら、

Opencv-android-sdk/apk　に移動し、

```
adb -s <device name > install OpenCV_3.2.0_Manager_3.20_arm64-v8a.apk
```

にて解決しました。
レンタルサーバー運営会社に不正利用を通報したときの窓口と、各社の対応をまとめた。

## 動機
おそらくCMSがクラッキングされて、私のブログの文章を断片的にコピーしたサイトがフィッシングサイトへの誘導に使用されているのを見つけたので、コンテンツをホスティングしている会社に片っ端から不正利用を報告しました。各社の窓口と対応スピードをまとめておけば、今後の自分の役に立ちそうだったのでまとめておきます。
なお、他人のブログをコピーしたものをつなぎ合わせたり、キーワードがひたすら埋め込まれたページを追加してフィッシングサイト等に誘導する手口は**ジブリッシュハック**と呼ぶそうです。
[意味不明な内容によるハッキングを解決する  \|  Web Fundamentals  \|  Google Developers](https://developers.google.com/web/fundamentals/security/hacked/fixing_the_gibberish_hack?hl=ja)
被害を受けるとこういう感じのページが量産されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/06557124-3b57-e113-2209-e6fa96880e8a.png)
今回の報告はすべてジブリッシュハックに対するものです。

なお、今回の報告対象は脆弱性ではないのでIPAには報告していませんが、脆弱性に関連する問題を発見した場合はIPAに届けるべきです。
[脆弱性関連情報の届出受付：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/security/vuln/report/)

## 各社の対応

対応速度は、「報告を送信してから」～「不正使用しているコンテンツへアクセス不能になったことを確認したおおよその時間」で計測しています。報告はだいたい平日の夕方くらいに行っています。
ただし、サーバーを使用している顧客側の対応速度にも依存するはずなので、一概に運営会社だけでどうにかなる時間ではないと思っています。

### Amazon Web Service (S3, EC2)

* 報告用窓口
 - [AWS Support](https://support.aws.amazon.com/#/contacts/report-abuse) 
* 対応速度
  - 報告件数3件中、最速が1時間、最遅が8時間
 
かなり対応が早かったのと、3件とも対応時にGoogleの検索結果からクラックされたページが根こそぎ消えていたので、さすがだなぁという印象です。なお、最速対応だった1件は世界的に有名な某飲料メーカーのドメインでした。
ログの提出が必要だったため、フィッシングサイトにジャンプするまでのネットワーク要求のログをHARにして、抜粋したものを添付しました。

### KAGOYA JAPAN

* 報告用窓口
  - [違法・有害情報に対する取り組み \- KAGOYA Internet Routing サポートサイト](https://support.kagoya.jp/kir/policy/abuse.html)に記載されている報告用メールアドレス
* 対応速度
  - 報告件数2件ともに、おおよそ12時間以内に対応

こちらもかなり対応が早くてありがたかったです。2件とも対象のコンテンツにBasic認証が設定されていましたが、KAGOYAさん側の対応なのか顧客側の対応なのかは不明です。

### 使えるねっと

* 報告用窓口
  - 該当するIPアドレスをwhoisで調べたときに出てくるAbuseメールアドレス
  - 補足：[使えるねっと \| サポートセンター](https://www.tsukaeru.net/support)には不正利用報告フォームに該当する問い合わせ先の記載はない模様
* 対応速度
  - 報告件数1件、24時間以内に対応

対象のコンテンツは503が設定されていましたが、使えるねっとさん側の対応なのか顧客側の対応なのかは不明です。

### GMOグローバルサインHD (WADAX)
* 報告用窓口
  -  [お問い合わせフォーム](https://form.gmocloud.com/wadax/contact/)
  -  補足：不正報告に関する問い合わせ先が不明のため、とりあえずWADAXの問い合わせフォームから送信した
* 対応速度
  - 報告件数2件中、最速が24時間以内、最遅が72時間以内

どこに報告していいのか一切わからなかったので、最初GMOグローバルサインHDのお問い合わせフォームに投稿したのですが、`ASPMX.L.GOOGLE.com`から[NoSuchUserエラー](https://support.google.com/mail/?p=NoSuchUser)が返ってきました。今は直っているみたいです。
[お問い合わせ \| GMOグローバルサイン・ホールディングス株式会社](https://www.gmogshd.com/contact/)

### さくらインターネット
* 報告用窓口
  -  [迷惑行為・不正なサイトなどの相談窓口](https://abuse.sakura.ad.jp/)
* 対応速度
  - 報告件数4件中、35営業日経過したが1件も対応されていないため不明

報告用窓口の使いやすさは一番素晴らしく、URLを入力しただけでさくらがホスティングしてるかどうか判定してくれるため、他社でもぜひ導入してもらいたいです。ただ、4件報告して1ヶ月とちょっと待っても1つも対応されていないので、個人的な心象は最悪です。ジブリッシュハックは優先度が低いのかもしれません。

## 所感
フィッシングサイトへの誘導に使われているためか、さくらインターネットさん以外については遅くても72時間以内には対応してもらえて安心しました。
他の会社に問い合わせすることがあれば追記していこうと思っています。
【NumPy】np.randomじゃなくてRandomStateを使いたい理由


## 結論から

np.randomは広範囲に影響があるので、RandomStateを使いましょう。

## はじめに

hoge君が以下のようなコードを作りました。

```python
import numpy as np

np.random.seed(1234)

# 処理Aのブロック
for i in range(1,5):
    arr1 = np.random.randint(1,10,10)

    #------------------------------------
    # ...(略：arr1を使った具体的な処理)...
    #------------------------------------
```

後日、hoge君は処理Aの前に処理Bを実装する必要が出てきました。

```python
import numpy as np
np.random.seed(1234)

# 処理B
arr2 = np.random.randint(1,10,10)

#------------------------------------
# ...(略：arr2を使った具体的な処理)...
#------------------------------------

# 処理Aのブロック
for i in range(1,5):
    arr = np.random.randint(1,10,10)
    print(aaa)

    #------------------------------------
    # ...(略：arr1を使った具体的な処理)...
    #------------------------------------
```

A君「ああ、まずい。これでは処理Aの結果が以前と変わってしまう。。。」

A君「あ！でももう一度シード設定すればいっか」(安易)

```python
import numpy as np

# 処理B
np.random.seed(2345) # 一応別のシードにした
arr2 = np.random.randint(1,10,10)

#------------------------------------
# ...(略：arr2を使った具体的な処理)...
#------------------------------------

# 処理Aのブロック
np.random.seed(1234) # こっちはさっきと同じシード
for i in range(1,5):
    arr = np.random.randint(1,10,10)
    print(aaa)

    #------------------------------------
    # ...(略：arr1を使った具体的な処理)...
    #------------------------------------
```

A君「これで一安心～」

## 数日後

先輩「この前作ってもらった処理、ユーザー毎にマルチスレッドで処理したいんだよね」

A君「」

## 結論

要はnp.random.seed()はグローバルにいろんな範囲に影響あるからやめようねって話です。
一人での開発ならばなんとか管理できるかもしれないけど、複数人の開発や
並列処理や関数化・クラス化などの実装を進めると、どこで再現性が取れなくなっているか追えなくなります。

RandomStateを使えば、ほかの処理に影響を与えずに乱数生成ができる。

```python
import numpy as np

# 処理B
rs2 = np.random.RandomState(2345)
arr2 = rs2.randint(1,10,10)
# ...(略：具体的な処理)...

# 処理Aのブロック
rs1 = np.random.RandomState(1234)
for i in range(1,5):
    arr = rs1.randint(1,10,10)
    print(aaa)
    # ...(略：具体的な処理)...
```

## 補足

ちなみに以下は同じ乱数列を返します。
グローバルなseed=1234と、RandomStateのseed=1234は同じ乱数を生成する。

```python
import numpy as np

np.random.seed(1234)
print(np.random.randint(1,10,10))

rs = np.random.RandomState(1234)
print(rs.randint(1,10,10))
```
TWELITEを試す

# TWELITEについて
　TWELITEはモノワイヤレス株式会社が製造しているワンボードマイコン。メーカーの[ホームページ](https://mono-wireless.com/jp/products/index.html "モノワイヤレスホームページ")の情報によると、WiFiをつかう無線機器より省電力であり、BlueToothより飛ばせる距離が長く、かつ、全体的に省電力とのこと。スリープ時の待機電流が1.5μA以下、通信中の電流20mA程度。スリープの設定が細かくできるようであり、電池で長時間動作させるには魅力的に見える。
　使い方を習得しようと勉強中。同社のホームページにチュートリアルやマニュアルもあるし、書籍もあるのではあるが、Arduinoと比べるとなにかしらハードルが高いように感じる。

# MacOS Big Sur上でTWELITEを使うには
　自分のメインのパソコンがMacOS Big Surなので、それを使ってTWELITEを試してみました。

- ハードウェアの準備：TWELITEは以下のいずれかの組み合わせで揃えておく。少し値が張るが、３が一番試験しやすい。
    1. TWELITE DIP２台　＋　TWELITE R2 1台（TWELITE R2にTWELITE DIPを装着し、TWELITE R2経由でPCとUSB接続する。一方、もう一台のTWELITE DIPはブレッドボードや電池を使って電気を供給し、動作させる。）
    + TWELITE DIP 1台　＋　MONOSTICK 1台（MONOSTICKをパソコンのUSBに接続する。TWELITE DIPはブレッドボードや電池を使って電気を供給し、動作させる。）
    + TWELITE DIP1台　＋　TWELITE R2 1台 + MONOSTICK 1台（TWELITE R2にTWELITE DIPを装着し、TWELITE R2経由でPCとUSB接続する。また、MONOSTICKをパソコンのUSBに接続する。）

- ソフトウェアの準備：　
    - [TWELITE STAGEのページ](https://mono-wireless.com/jp/products/stage/index.html)からTWELITE STAGE SDKをダウンロード
    - ダウンロードしたら解凍し、任意の場所にそのフォルダ（MWSTAGE）を置く。
    - 以上に加えて、TWELITEのプログラムを書き換えようとすると、どうやらCommandLineToolsをインストールする必要があるらしい。

MWSTAGEの最上部に含まれているTWELITE_Stage.commandをダブルクリックすると、TWELITE STAGE Appが立ち上がる。そこからプログラムを書き換えたりシリアル通信の状況をターミナルで見たりできる。

# TWELITEをMacOS Big Surで使うにあたっての注意事項
　基本的にはTWELITEとPCは、MONOSTICKやTWELITE R2を用いて接続し、そのあとはCoolTermなどのシリアル通信ソフトを使って通信すれば良い（らしい）。通信速度は115200。しかし、MacOS Big Surだと、それがうまくいかない。
　色々調べたが、どうやらFTDI 232RLというシリアル変換モジュールを使っており、以前のMacOSだとそれがデフォルトで使えていたらしいのだが（実際、MacOSX 12のMacBook AirだとCoolTermで通信できる）、Big Surはデフォルトでは対応していないらしい。[秋月電子の情報](https://akizukidenshi.com/catalog/faq/goodsfaq.aspx?goods=K-01977)等によると、[FTDI社のVCPドライバー](https://ftdichip.com/drivers/vcp-drivers/)をインストールすればよいような情報もあるが、それもやってみたがうまくいかない。
　かといって、万事休すというわけでもない。上記のように、TWELITE STAGE SDK（MWSTAGE)に含まれるTWELITE STAGE Appを使うと、シリアル通信できる。試すぐらいであれば、TWELITE_Stageをもちいたシリアル通信でよいだろう。
　本格運用するにはMacOSX Big Surではなく、より古いバージョンのMacOSや、Windowsパソコン、Raspberry Piを含むlinux機が良さそう。

# TWELITEの勉強の方針
以下の順番でやるとよさそう。
- 超簡単標準アプリを試す。単にセンサーの信号を取得するだけなら、あるいは遠隔のスイッチをオンオフする程度なら、これで十分そう。普通にシリアル通信できればProcessingを使って遠隔操作するスケッチを書けば良さそうに思える。
- [Act1〜Act5](https://mono-wireless.com/jp/products/act/index.html)を試す。
- さらに、[MWXライブラリ](https://mwx.twelite.info)を習得する。MWXライブラリを使うといろいろなActを作成できる、ということらしい。
Matplotlib覚え書き by 具体例

# 画像をタイル形式でプロット
## cifar-10、ランダムに選んだ100枚、タイトル付き
```python:コード
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

print('# Image shapes')
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)

CLASSES = np.array([
    'airplane', 'automobile', 'bird', 'cat', 'deer', 'dog',
    'frog', 'horse', 'ship', 'truck'
])

# 100個のアイテムをランダムに選びだす
idxs = np.random.randint(low=0, high=x_train.shape[0], size=100)
imgs, labels = x_train[idxs], y_train[idxs]

# ラベル(0~9整数)をクラス名に変更
labels = [CLASSES[x] for x in labels.flatten()]

# 10x10のタイルにする
fig, axs = plt.subplots(nrows=10, ncols=10, figsize=(12, 12))
# .flatで一次元アクセスできるイテレータができる
for ax, img, label in zip(axs.flat, imgs, labels):
    ax.imshow(img)
    ax.set_title(label)
    ax.set_axis_off()

# tight_layoutしないとタイトルと画像が被る
plt.tight_layout()
plt.savefig('image.png')
plt.show()
```

```:出力
# Image shapes
(50000, 32, 32, 3) (50000, 1)
(10000, 32, 32, 3) (10000, 1)
```
![cifar-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417310/254c313a-09db-b6c4-1a84-35febc01278b.png)
商品選択で１クリック減らしてみた

#概要
ECサイトでは購入までの流れをシンプルにして、１クリックでも減らしたいですよね。
そこで、Shopifyの標準テンプレートで１クリック減らすようにカスタマイズしてみました。

Shopifyでは、商品詳細ページで、サイズや色等々のバリエーションを選択できます。
しかし、標準ではプルダウン形式なので、２クリックが必要です。

こちらをボタン表示にして１クリックで選択できるようにカスタマイズしました。

ちなみに、最初から全種類を表示できるので選びやすくもなりました。

#サンプル
■左が標準の2クリック版、右が1クリック版
<img width="50%"  alt="1クリック版" src="https://i.gyazo.com/97176186c932880a1bfcac2d31166c9c.gif"><img width="50%" alt="1クリック版" src="https://i.gyazo.com/b8290a1446b1e177566439a1cb8adc8f.gif">

#カスタマイズ方法

### ドロップダウン部分を非表示にします
cssの「.selector-wrapper select」 の設定に「display:none;」を追加　
※2箇所修正

内部的には残しておいて、実際の処理は元々のドロップダウン側で
引き続き対応してもらいます。

```product-template.liquid　
{% if section.settings.add_to_cart_button_size == 'large' %}
  <style>
    .selector-wrapper select ,.product-variants select {
      max-width: 100%;
      
       display:none;

    }
  </style>
{% endif %}

{% if section.settings.product_quantity_enable == false %}
  <style>
    .selector-wrapper select, .product-variants select {
      margin-bottom: 13px;  

       display:none;

    }
  </style>
{% endif %}
```

###バリエーションをボタンで表示

次の処理を個数表示の「 {% if section.settings.product_quantity_enable %}」の前あたりに下記のコードを追加
※表示したい位置に移動しても問題ないです。

前半：バリーエーションの情報を元にボタンを表示
後半：ボタンを押した時のバリーエーションの選択処理とボタンの表示変更です。
　　　非表示にしたドロップダウンの選択を変更後、更新イベントを発生させて、元々の処理を動かしています。

```product-template.liquid
{% for variant in product.variants %}
    <button type="button" id="button_sample_{{ forloop.index0}}"  onclick="func1({{forloop.index0 }},'{{variant.title}}');"    >
        <font size="4" >{{variant.title}}</font>
    </button>
{% endfor %}

<br/> <br/>

<script>
function func1( sample_index,sample_variant_title ) {
    var sample_select = document.getElementById('productSelect-product-template-option-0');
    sample_select.value = sample_variant_title;
    sample_select.dispatchEvent(new Event('change'));

    for (let i = 0; i < {{product.variants.size }}  ; i++) {
        if( i==sample_index )  {
            document.getElementById('button_sample_'+i).setAttribute('style', 'border-width: medium;border-color: blue;');
        } else{
            document.getElementById('button_sample_'+i).setAttribute('style', 'border-width: 1px;border-color: black;');
        }
    } 
}
</script>
      
        {% if section.settings.product_quantity_enable %}
```

#参考
#### 画像クリックでバリエーションを選択する方法
　[Select variants by clicking their images](https://shopify.dev/tutorials/customize-theme-select-variants-by-clicking-images)

#### 関連オブジェクトの資料
　[商品情報の出力に使う「product」オブジェクト](https://takblog.site/web/?p=218)
【ミライトデザイン社内勉強会#17】「IDDD本から理解するドメイン駆動設計」輪読会~第8章「ドメインイベント」~

### 前回の記事
[【ミライトデザイン社内勉強会#16】「IDDD本から理解するドメイン駆動設計」輪読会~第7章「ドメインサービス」~ - Qiita](https://qiita.com/tkek321/items/2990c4a3533d9550b3a3)

## [実践DDD本 第8章「ドメインイベント」～出来事を記録して活用～ \(1/3\)：CodeZine（コードジン）](https://codezine.jp/article/detail/10392)

### ドメインイベントがどんな時に必要になるのかが、イメージがわかない。重要なイベントはドメインイベントにしといた方がメリットあるよって話？
- 複数の集約の操作をしたい時とか（トランザクションをまたいだ処理）
- メール送信とか複数の人に送ると意外と時間がかかるので、イベントに切り出して、別のサーバーで実行するとか
- 一般的なシステムは××が起きたから〇〇をするっていう作りになっている
    - ドメインイベントは××が起きたまでを管理している
        - 結果整合性を用いたシステムを作る時に役にたつ
        - 例えば、××が起きた時（イベントがあった時）にはAとBを更新するって処理があった時に、ドメインイベントとしてイベント分離されているとA、B以外のCの処理を追加したい。ってなった時に楽に追加することができる
- 結果生合成を保つ目的であればドメインイベントを使用しなくても実装は可能。
    - トランザクションを広げる。
    - しかし、トランザクションは単一の集約に対して変更することを推奨している為、ドメインイベントを作成することでトランザクションを分散することができる

### `他システム（他の境界づけられたコンテキスト）とのイベント送受信`で１と３の違いがいまいちわからない
[p2](https://codezine.jp/article/detail/10392?p=2)

- 1メッセージ基盤を直接ドメインイベントが利用しているが、3はイベントは同じデータ領域に保存するが、メッセージ基盤は外部にある
- 3は`イベントストアのイベントをメッセージ基盤に転送する仕組みが必要`ここを２フェーズコミットでやると2と同じになりそう
    - [２相コミットメント](https://tips-memo.com/two-phase-commit#i-4)
    - こういうサービスを使えば2フェーズコミットにならずに実装できるのかも
        - https://www.eventstore.com/event-store-cloud
    - [Chatworkのテックリードが語る、CQRSを上手に使うため方法 - ログミーTech](https://logmi.jp/tech/articles/322972)
    - [マイクロサービスのための分散データ 〜 イベントソーシング vs チェンジデータキャプチャ - 赤帽エンジニアブログ](https://rheb.hatenablog.com/entry/2020/02/10/event-sourcing-vs-cdc/)
- 一番楽に実装できるのは1
    - ただ柔軟性にかけるかも
- 2は1に柔軟性を求めたもので
- 3は2の問題点を解消しようとしたものだと思う

##### メッセージ基盤
- メッセージだけを責務とした基盤
    - A、Bというインスタンスがあったらそのやりとりを仲介する基盤
    - メッセージというのはキューであったりイベントであったり決まりはない


### ユースケースで複数の集約を操作する場合にイベントをトリガーに処理を分けようってこと？

- ドメインイベントを発行するユースケースで行うのはドメインイベントの発行まで
- ドメインイベントを受け取ってその後どうするかは、責務が別になる（ドメインイベントを受け取った側が考える）

## 次回
[【ミライトデザイン社内勉強会#18】「IDDD本から理解するドメイン駆動設計」輪読会~第9章「モジュール」~ - Qiita](https://qiita.com/tkek321/items/2e89db963bd51e25fa1d)
【Python】読込むブック名とセルの値をパラメーターにする。③

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、パラメーターに関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

後々レイアウトを変更したり、プログラムで読み込むブック名やセルの値を変えてしまうかもしれない時の対処法です。
なんだかちょっと実戦形式っぽくてワクワクしてます。

今回はこちらのブック「日報.xlsx」を、使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/bbc57acb-3d52-bacc-6512-533a4f62f4bf.png)

# argparseモジュール

コマンドラインで入力するのはsysモジュールと同じですが、より多くの機能があります。
詳しくはこちらをご覧ください。
https://docs.python.org/ja/3/library/argparse.html

先ずは、argparse.ArgumentParserオブジェクトを作り

```
parser = argparse.ArgumentParser(description=プログラムの説明)
```

次に、Parser.add_argumentメソッドを使って
コマンドラインで入力したパラメーターを取得します。

```
parser.add_argument(引数の名前, help=引数の説明)
```

コマンドラインで入力されたパラメーターは、ArgumentParser.parse_argsメソッドで取り出します。

```
parser.parse_args()
```

それらを踏まえて

```python:argparse_arguments.py
import argparse
from openpyxl import load_workbook

parser = argparse.ArgumentParser(description='Excelのセルの値を取得するプログラム')

parser.add_argument('filename', help='読込むブック名: ')
parser.add_argument('cellno', help='読込むセル名(例 A1): ')

args = parser.parse_args()

wb = load_workbook(args.filename, read_only=True)
ws = wb.active

print(ws[args.cellno].value)
```

こんな感じで出来ました。

```python
# 読み込むブック名とセル名を入力して実行
>python argparse_arguments.py 日報.xlsx I1
-->hogehoge
```

argparseの便利な点は、
descriptionの引数やadd_argumentメソッドのhelp引数の詳細を記述できる点でしょうか。
「-h」オプションを付けてプログラムを実行するとプログラムの詳細を表示してくれます。
Chatwork Room & User ID 取得方法

#はじめに
Chatwork APIの利用に伴い、Room IDとUser IDが必要になり、毎回忘れるのでマニュアル化します。

#Chatwork Room ID取得方法
取得したいルームを開き、URL末尾のridの後の数値がRoom IDになります。（以下画像の赤塗りつぶし枠）
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246142/1b5c2aaf-c471-045d-3aed-3e8003562cef.png)

#Chatwork User ID取得方法
チャット入力欄にて「TO」をクリックしてユーザーを選択します。すると、チャット入力欄に宛先が追加され、「TO:」の後の数値がUser IDになります。（以下画像の赤塗りつぶし枠）
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246142/a147e660-598c-1f48-3256-f568eda1cc8f.png)


#最後に
特に難しい手順はないですね！最後まで読んでいただきありがとうございます。
M5Stack Groveポート A-B-C

M5Stack Basic、Gray、CORE2のGroveポート。赤色になっていますが、これは、I2C向けのポートとなっており、UARTやGPIOポートとして利用することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/f4974eb4-e112-4c65-397c-cd72c56d345b.png)
UARTやGPIO用にGroveポートを使いたい場合は、[M5Stack PLUSエンコーダモジュール](https://m5stack.com/collections/m5-module/products/plus-module)を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/8ff4f438-9b08-2d85-b220-3175d203e3cc.png)
確かに、手元にある拡張UNITを見てみると、PORT.A.I2CやPORT.B.I/O、PORT.C.UARTと書かれているとともに色分けもされているじゃないですか。。。（これを知らずして、とりあえずUNITを買うと、思わぬ出費が発生してしまうかもしれないですね。）
![IMG_5773.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/18a20d71-140f-1992-4552-e715df284e92.jpeg)

以下に、各ユニットのポートタイプ一覧をまとめておきます。

|UNIT|センサ|ポートタイプ|
|:---|:---|:---|
|Mini Heart Rate Unit (MAX30100) Pulse Oximeter|心拍|PORT.A.I2C|
|Barometric Pressure Unit(BMP280)|気圧|PORT.A.I2C|
|ENV II Unit with Temperature Humidity Environment Sensor (SHT30+BMP280)|温湿度|PORT.A.I2C|
|Thermal Camera Unit (MLX90640)|サーマルカメラ|PORT.A.I2C|
|6-Axis IMU Unit(MPU6886)|6軸加速度|PORT.A.I2C|
|TVOC/eCO2 Gas Sensor Unit (SGP30)|ガス|PORT.A.I2C|
|I2C Joystick Unit (MEGA328P)|ジャイロスティック|PORT.A.I2C|
|Color Sensor RGB Unit (TCS3472)|カラーセンサ|PORT.A.I2C|
|Time-of-Flight Distance Ranging Sensor Unit (VL53L0X)|TOF|PORT.A.I2C|
|Laser.Tx - a Laser Emitter Unit|レーザー出力|PORT.B.I/O|
|RGB LED Unit (SK6812)|LED|PORT.B.I/O|
|Earth Moisture Sensor Unit Analog and Digital Output|土壌水分量|PORT.B.I/O|
|Mini Button Unit|ボタン|PORT.B.I/O|
|Microphone Unit (LM393)|マイク|PORT.B.I/O|
|Light Sensor Unit with Photo-resistance|照度センサ|PORT.B.I/O|
|PIR Motion Sensor (AS312)|PIR赤外線|PORT.B.I/O|
|RS485 to TTL Converter Unit|RS485|PORT.C.UART|
ほぼほぼ、PORT.A.I2Cでいけそうですが、人感センサーや土壌水分量などを計る場合は注意が必要そうですね。
ちなみに、PLUSエンコーダモジュールとM5Stackとの通信にはI2Cを使用するそうなので、[COM.X Sigfox](https://www.switch-science.com/catalog/6624/)との併用も可能です。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/d6ad10bc-75ba-8124-14d4-f144657c6473.png)](https://twitter.com/ghibi)
swift スコープとは

■よくswiftを調べたら出てくるスコープ


簡単に言うとif文や関数などで使われている{}

{}の波かっこの中の事である。


*ここ重要
{}の中で定義してある変数や定数などは{}の中でのみ使える。
逆に言うと他の場所では使えない。
複数行テキストの末尾省略をCSSのみで実現する方法(複数行）とフォローバックについて

https://qiita.com/ezawa800/items/534e36f819e9ad2712af

```css
.style-jobs-contents{
  /* -webkit-がIEなど古いブラウザに対応していないためフォローバックを入れる */
  display: block;
  display: -webkit-box;
  height: 50px;
  margin: 0 auto;
  line-height: 16px;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}
```

CSSがどのブラウザで使用できるか知るのは以下のサイトで可能です。
-webkit-はIEに対応していないことがわかります。
https://caniuse.com/