OmniAICreator/Qiita-1.07M huggingface dataset:
Railsで子レコードを複数同時保存する際のバリデーション

## やりたいこと
`gem 'cocoon'`を使ったStationレコードのedit画面内の営業時間登録フォームで、曜日の重複をバリデーションメッセージ表示したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504414/59950242-373a-c253-0993-0b8dd13f137a.png)

ベストプラクティスを調べてみたが見つからなかったので、親モデルでのカスタムバリデーションで実装する

## モデル
```ruby
### Stationモデル
class Station < ActiveRecord::Base
  has_many :business_hours, inverse_of: :station, dependent: :destroy

  validate :business_hours_day_of_week_is_uniq

  def business_hours_day_of_week_is_uniq
    day_of_week_ary, index_of_errors = [[], []]
    business_hours.each_with_index do |bh, i|
      next if bh.day_of_week.nil?
      index_of_errors << i if day_of_week_ary.include?(bh.day_of_week)
      day_of_week_ary << bh.day_of_week
    end
    index_of_errors.each{ |i| business_hours[i].errors.add(:day_of_week, '曜日が重複しています') }
  end
end

### BusinessHourモデル
class BusinessHour < ActiveRecord::Base
  belongs_to :station

  enum day_of_week: { monday: 1, tuesday: 2, wednesday: 3, thursday: 4, friday: 5, saturday: 6, sunday: 7 }
end

```

## フォーム

```erb
  <div>
    <%= link_to_add_association '営業時間を追加', f, :business_hours,
      class: 'btn btn-success',
      data: { association_insertion_node: '#business_hour-association-insertion-point', association_insertion_method: 'append' } %>
    <div>※一つも登録がない場合は24時間営業扱いになります</div>
  </div>

  <table class="table table-list">
    <tbody id='business_hour-association-insertion-point'>
      <div class="form-group">
        <%= f.fields_for :business_hours do |bh| %>
          <%= render 'admin/stations/business_hour_fields', f: bh %>
        <% end %>
      </div>
    </tbody>
  </table>

<%# _business_hour_fields.html.erb %>
<tr class="nested-fields">
  <td>
    <%= f.select :day_of_week, BusinessHour.day_of_weeks_i18n.invert, {include_blank: true} %>
  </td>
  <td>
    <%= f.text_field :from, placeholder: '「07:30」のように入力' %>
  </td>
  <td>
    <%= f.text_field :to, placeholder: '「24:30」のように入力' %>
  </td>
  <td>
    <%= link_to_remove_association '削除', f, class: 'btn btn-danger' %>
  </td>
</tr>

```

## コントローラー
```ruby
  def update
    @station.assign_attributes(station_params)
    station_valid = @station.valid?
    business_hours_valid = true
    @station.business_hours.each{ |bh| business_hours_valid = false if bh.errors.any? }
    if station_valid && business_hours_valid
      @station.update(station_params)
      redirect_to [:admin, @station], notice: "#{Station.model_name.human}を更新しました。"
    else
      render :edit
    end
  end

```
欠損値フラグを作成する(SPSS Modeler データ加工逆引き5-12)

# 欠損値フラグを作成する

![スクリーンショット 2022-09-30 9.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0d091cc5-0964-ce0f-b7d6-acec18f47fda.png)

## 1.想定される利用目的

・欠損レコードの識別

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/missing_values2flag.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-09-30 9.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/975f512f-4bfb-0c55-7dc5-531bef242679.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-09-30 9.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4bd9dbf3-b6e0-e8d2-a8a3-f50fb719a144.png)

#### 単一フィールドの欠損値フラグ作成

b.[フィールド作成]ノードを編集します。
![スクリーンショット 2022-09-30 10.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/38f94cf5-8070-f723-ebf4-ad79f1422124.png)

式ビルダーの 空白とヌル関数を利用すると便利です。
![スクリーンショット 2022-09-30 10.20.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a6a902db-0b56-8cae-5dbf-05f23e0bb909.png)

[プレビュー]します。温度がNULLの場合には温度欠損フラグが作られました。
![スクリーンショット 2022-09-30 10.01.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a0454c1d-6fee-463b-b108-51c26b4d865a.png)

#### テーブルから欠損値フラグ作成の自動生成

元データのNULLを指定してから、以下のメニューを使うとノードが自動生成されます。
![スクリーンショット 2022-09-30 12.18.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e41962fd-1a8a-cd3b-1193-9e0d2f5d3f6a.png)

![スクリーンショット 2022-09-30 12.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ca97f216-46e1-59df-eeda-e67eb1c206e4.png)

#### 複数フィールドの欠損値フラグ作成

c.[フィールド作成]ノードを編集します。@&#xFFF0;FILEDはワイルドカードです。同時に複数のフィールドに処理を加えることができます。
![スクリーンショット 2022-09-30 10.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/79a7bb49-7800-c9e9-dcbf-cf6613ddb6f7.png)

[プレビュー]します。
![スクリーンショット 2022-09-30 10.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/32929ca8-e8ad-08c5-8d30-3afc054e022b.png)


#### 注意点

欠損値が思うように扱われていない場合には[データ型]ノードで欠損値の定義を確認してください。

![スクリーンショット 2022-09-30 10.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8af5dd70-d4ea-1dd6-25e1-7387afcfaa93.png)

## 4.参考情報

#### フィールド毎に欠損値を確認する

https://qiita.com/416nishimaki/items/b5ebb7f0aca1ee7ec2cb

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
enebularでkuromoji その3

# 概要
enebularでkuromojiやってみた。
練習問題やってみた。

# 練習問題
apiを作って、plunkerでtable表示せよ。

# 方針
- herokuに設置する。
- endpointは、kuromojiでget
- 結果のjsonをそのまま返す。
- parseして、tr,tdを追加

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6c1e01f4-ef75-f38e-6833-f92bf0e3e382.png)


# サンプルコード

```

var endpoint = "https://ohiapp0.herokuapp.com/kuromoji?token=";
var src = document.getElementById('src');
var res = document.getElementById('res');
var tbody = document.getElementById('tbl');

function send(msg) {
	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4 && xhr.status == 200)
		{
			//alert(xhr.responseText);
			var data = JSON.parse(xhr.responseText);
      for (i = 0; i < data.length; i++)
			{
          var tr = document.createElement('tr');
          var td = document.createElement('td');
          td.innerHTML = data[i].surface_form;
          tbody.appendChild(td);
          var td = document.createElement('td');
          td.innerHTML = data[i].pos;
          tbody.appendChild(td);
          var td = document.createElement('td');
					td.innerHTML = data[i].pos_detail_1;
          tbody.appendChild(td);
          var td = document.createElement('td');
					td.innerHTML = data[i].pos_detail_2;
          tbody.appendChild(td);
          var td = document.createElement('td');
					td.innerHTML = data[i].pos_detail_3;
          tbody.appendChild(td);
          var td = document.createElement('td');
					td.innerHTML = data[i].conjugated_type;
          tbody.appendChild(td);
          var td = document.createElement('td');
					td.innerHTML = data[i].conjugated_form;
          tbody.appendChild(td);
					var td = document.createElement('td');
					td.innerHTML = data[i].basic_form;
          tbody.appendChild(td);
          var td = document.createElement('td');
					td.innerHTML = data[i].reading;
          tbody.appendChild(td);
          var td = document.createElement('td');
					td.innerHTML = data[i].pronunciation;
          tbody.appendChild(td);
          tbody.appendChild(tr);
      }					
		}
		else
		{
			//alert(xhr.readyState);
			//alert(xhr.status);
			//alert(xhr.responseText);
		}
	};
  var uri = endpoint + msg;
	xhr.open("GET", uri, true);
	xhr.send();
	//alert("ok");
}

function run() {
  send(src.value);
  src.value = '';  
};






```

# 成果物

https://embed.plnkr.co/plunk/vOnlNdeIueVcTHIm


以上。
enebularでkuromoji その2

# 概要
enebularでkuromojiやってみた。
練習問題やってみた。

# 練習問題

apiを作って、plunkerで表示せよ。


# 方針

- herokuに設置する。
- endpointは、kuromojiでget
- 結果のjsonをそのまま返す。

# フロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e1d0fda1-ee14-89d1-071f-314940a5b50d.png)


```
[{"id":"372f37d3.63e518","type":"debug","z":"51ad95ea.8b77ec","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":530,"y":100,"wires":[]},{"id":"a9eb53ee.6a444","type":"http in","z":"51ad95ea.8b77ec","name":"","url":"/kuromoji","method":"get","upload":false,"swaggerDoc":"","x":110,"y":260,"wires":[["8cc58da7.521bb"]]},{"id":"8cc58da7.521bb","type":"function","z":"51ad95ea.8b77ec","name":"token","func":"\nmsg.payload = msg.req.query.token;\nreturn msg;","outputs":1,"noerr":0,"x":300,"y":260,"wires":[["f98cd94b.b10998"]]},{"id":"f1ca732c.ca026","type":"http response","z":"51ad95ea.8b77ec","name":"","statusCode":"","headers":{},"x":600,"y":260,"wires":[]},{"id":"f98cd94b.b10998","type":"Kuromoji Tokenizer","z":"51ad95ea.8b77ec","name":"","x":330,"y":100,"wires":[["372f37d3.63e518","f1ca732c.ca026"]]}]
```


# サンプルコード

```

var endpoint = "https://ohiapp0.herokuapp.com/kuromoji?token=";
var src = document.getElementById('src');

function send(msg) {
	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4 && xhr.status == 200)
		{
			//alert(xhr.responseText);
    	document.body.appendChild(document.createTextNode(xhr.responseText));	
		}
		else
		{
			//alert(xhr.readyState);
			//alert(xhr.status);
			//alert(xhr.responseText);
		}
	};
  var uri = endpoint + msg;
	xhr.open("GET", uri, true);
	xhr.send();
	//alert("ok");
}

function run() {
  send(src.value);
  src.value = '';  
};




```

# 成果物

https://embed.plnkr.co/plunk/Y5KA4MNhKxsrYGju


以上。
Visual Studioのデバッグについてのメモ

Debug/Releaseにある実行ファイルはそのファイルのディレクトリを基準にdllなどのリソースを探すが、Editor上でDebugしている場合、ソリューションもしくはプロジェクトのディレクトリを基準にdllを探すので注意
【Flutter】shared_preferencesの基本的な使い方

# はじめに

Flutter入門としてメモアプリを作成している際に、
データをローカルに保持しておく方法があることを学んだため、記事にしてみました。

前回のメモアプリの記事は、[こちら](https://qiita.com/kitaji12/items/5d5e84c323b4560e8e60)です。

# shared_preferences とは？
単純なデータ用のプラットフォーム固有の永続ストレージをラップします（iOS および macOS では NSUserDefaults、Android では SharedPreferences など）。
データは非同期的にディスクに永続化される可能性があり、書き込みが返された後にディスクに永続化されるという保証はないため、このプラグインを重要なデータの保存には使用しないでください。

サポートされるデータ型は `int`、`double`、`bool`、`String`と`List<String>`です。

（[Flutter公式ドキュメント](https://pub.dev/packages/shared_preferences)より引用）

# 開発環境
- macOS Monterey 12.5
- Android Studio Chipmunk | 2021.2.1 Patch 1
- Flutter 3.0.1

# 事前準備
## ①　pubspec.yaml に追記
pubspec.yaml に、`shared_preferences` パッケージを追加します。
※2022/09 時点の最新バージョンが `^2.0.15` だったため、最新を設定しています。

```yaml: pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15
```

## ②　パッケージをダウンロード
下記コマンドを実行して、パッケージをダウンロードします。

```
$ flutter pub get
```

## ③　クラスにパッケージをインポート
`shared_preferences` を使用したいクラスにパッケージをimportします。

```dart
import 'package:shared_preferences/shared_preferences.dart';
```

# データの保存・更新
List<String>型のデータ保存・更新には、`setStringList` を使用します。

```dart
final prefs = await SharedPreferences.getInstance();
prefs.setStringList('memoList', memoList);
```

その他の型のデータ保存・更新時は以下を使用します。
- int型 : `setInt`
- double型 : `setDouble`
- bool型 : `setBool`
- String型 : `setString`

# データの取得
List<String>型のデータ取得には、`getStringList` を使用します。

```dart
final prefs = await SharedPreferences.getInstance();
prefs.getStringList('memoList');
```

その他の型のデータ取得時は以下を使用します。
- int型 : `getInt`
- double型 : `getDouble`
- bool型 : `getBool`
- String型 : `getString`

# データの削除
データの削除にはデータ型に関係なく、`remove` を使用します。

```dart
final prefs = await SharedPreferences.getInstance();
await prefs.remove('memoList');
```

# さいごに
クラウドサービスを使わないでローカルにデータを保存する shared_preferences の基本的な使い方を紹介しました。

iOSでいう NSUserDefaults、Androidでいう SharedPreferences のようなものです。
単純なデータ保存に向いているパッケージなので、重要なデータ保存時は別のクラウドサービスを使用した方が良さそうです！


# 参考サイト
- [shared_preferences | Flutter Package - Pub.dev](https://pub.dev/packages/shared_preferences)
Azure Fundamentals(AZ-900)：クラウドの概念について説明する「クラウドモデル(実装モデル)」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「クラウドモデル(実装モデル)」**
◇対応するMicrosoft Learn ラーニングパス
[Microsoft Azure の基礎: クラウドの概念について説明する](https://learn.microsoft.com/ja-jp/training/paths/microsoft-azure-fundamentals-describe-cloud-concepts/)
◇対応するモジュール
[クラウド モデルを定義する](https://learn.microsoft.com/ja-jp/training/modules/describe-cloud-compute/5-define-cloud-models)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：クラウドの概念について説明する「サービスモデルの種類」と「責任共有モデル」](https://qiita.com/fsd-jume/items/cdef9615ba28b2fbc885)

## クラウドモデル(実装モデル)
**クラウドサービスの利用機会の開かれ方により分類し、クラウドリソースの配置の種類を定義**

### ◆プライベートクラウド
**企業や組織が自社専用のクラウド環境を構築し、社内の各部署やグループ会社に提供するクラウド形態**
・オンプレミス型(所有型)
→自社でインフラを用意して構築運用。物理サーバを仮想化し、クラウド環境として限られたユーザに提供。
・ホステッド型(利用型)
→クラウド事業者が提供する環境内に、自社専用の環境を用意。クラウド事業者が提供するVPNや専用線で接続。

### ◆コミュニティクラウド
**目的や業務が関連する複数組織における共同利用を提供するクラウド形態**
・例)銀行間の情報共有やサービス連携を目的としたクラウドや、各府省が共同で利用する行政クラウドである「政府共通プラットフォーム」など。
・特定のコミュニティ内における情報共有や共同作業のために利用。

### ◆パブリッククラウド
**クラウド事業者によって企業や一般ユーザ向けにクラウドコンピューティング環境を提供するクラウド形態 = AWS, Azure, GCP**
・設備はクラウド事業者が構築し、利用者はインターネットを経由してクラウド事業者のリソースを共有。
・利用料金やサービス内容が決まっており、個々の利用者に応じたカスタマイズは原則行われない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/86ecea81-38da-6ed1-7212-02770344a298.png)

### ◆ハイブリッドクラウド
**異なるクラウドモデルを組み合わせ、それらを統合して単一のシステムを提供するクラウド形態**
・例)複雑なカスタマイズが必要な部分はプライベートクラウドで構築し、定型的なサービスで対応できる部分はパブリッククラウド上に構築。
・プライベート/パブリッククラウドと、オンプレミスの物理サーバを組み合わせることもある。

### ◆マルチクラウド
**異なるクラウド事業者のクラウドを組み合わせるものの、それらは相互接続させずに提供するクラウド形態**
・例)異なるクラウド事業者のパブリッククラウドを使い、本番環境とバックアップ環境を構築。
・大規模障害や過負荷によるシステムダウンを想定したリスク分散や同時利用に用いられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/753f661b-1e90-f518-fbb5-3040c465e954.png)

### ◆Azure Arc
**異なるクラウド事業者を含めた異なるクラウドモデルのサーバや仮想マシンなどをAzure Portal上で一元管理できるサービス**
・例)オンプレミスの物理サーバやAWSの仮想マシンをAzure Arcに登録してAzure Portal上から管理。

### ◆Azure VMware Solution(AVS)
**オンプレミスやプライベートクラウド上のVMware環境をAzureに容易に移行できるサービス**
・IPアドレスを維持したままの移行やダウンタイムなしでの移行が可能。

## 次の学習内容
**従量課金ベースモデル**

https://qiita.com/fsd-jume/items/17f551a1f93c0dace855

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8

## 参考
* [総務省 ICTスキル総合習得プログラム コース2-2 クラウドのサービスモデル・実装モデル](https://www.soumu.go.jp/ict_skill/pdf/ict_skill_2_2.pdf)
SharePoint 管理アカウントのパスワード変更方法

# はじめに
SharePoint Serverの管理アカウントで利用しているActive Directory ユーザーアカウントのパスワードを変更する機会がありましたが、SharePoint上のパスワード変更について纏まった記事が見当たらなかったため本記事にて紹介します。

# 環境
* SharePoint Server 2016
* サーバー ファーム構成
  * フロントエンドWebサーバー
  * アプリケーションサーバー
  * データベースサーバー

# SharePoint Server 管理アカウント
SharePoint Serverでは、インストールや設定変更、運用保守するための適切な管理アカウントが必要になります。
本記事では以下の管理アカウントのパスワード変更方法を説明します。
* ファームサービスアカウント
* コンテンツアクセスアカウント
* プロファイル同期アカウント

:::note info
「SQLサーバーサービスアカウント」と「ファーム管理者ユーザーアカウント」はSharePoint側でパスワードが管理されていないため説明は省きます。
:::

# パスワード変更方法
### 1. ファームサービスアカウントのパスワード変更手順
1. SharePoint Server 2016 サーバーにログオンします。
1. [スタート] - [すべてのプログラム] - [Microsoft SharePoint 2016 Products] - [SharePoint 2016 サーバーの全体管理] をクリックし、全体管理サイトにアクセスします。
1. [セキュリティ] セクション - [サービス アカウントの構成] をクリックします。
1. 最初のドロップダウン リストにて、"ファーム アカウント" を選択します。
1. [このコンポーネントのアカウントの選択] に表示されるアカウントを確認します。
1. [スタート] - [すべてのプログラム] - [Microsoft SharePoint 2016 Products] - [SharePoint 2016 管理シェル] を右クリックし、[管理者として実行] をクリックして SharePoint 2016 管理シェルを起動します。
1. 以下のコマンドを実施します。
~~~powershell:コマンド
$secure_string_pwd = convertto-securestring "<パスワード>" -asplaintext -force;
Set-SPManagedAccount -Identity "<ドメイン>\<ユーザー名>" -ExistingPassword $secure_string_pwd;
~~~
:::note info
手順4で確認したアカウントを<ドメイン>\<ユーザー名>に指定します。
:::
~~~powershell:例
$secure_string_pwd = convertto-securestring "PasswordSample123" -asplaintext -force; 
Set-SPManagedAccount -Identity "contoso\spsadmin" -ExistingPassword $secure_string_pwd;
~~~
8\. [スタート] - [すべてのプログラム] - [アクセサリ] - [コマンド プロンプト] を右クリックします。
9\. [管理者として実行] をクリックして、コマンド プロンプトを開きます。
10\. iisreset /noforce を実行します。

:::note warn
iisreset 実施の際に、一時的にサイトにアクセスできなくなりますのでご注意ください。
:::

### 2. コンテンツアクセスアカウントのパスワード変更手順
1. 「1. ファームサービスアカウントのパスワード変更手順」と同様に、全体管理サイトにアクセスします。
1. [アプリケーション構成の管理] - [サービス アプリケーションの管理] をクリックします。
1. 既定のコンテンツ アクセス アカウントを変更する[Search Service Application] のリンクをクリックします。
1. [システムの状態] セクション - [既定のコンテンツ アクセス アカウント] に記載の Domain\UserName 形式で表示されたアカウントのリンクをクリックします。
1. [既定のコンテンツ アクセス アカウント] ダイアログ ボックスが表示されます。
1. [アカウント] テキスト ボックスが想定のアカウントとなっていることを確認します。
1. [パスワード] テキスト ボックスと [パスワードの確認] テキスト ボックスに新しいパスワードを入力し、[OK] をクリックします。

### 3. プロファイル同期アカウントのパスワード変更手順
1. 「1. ファームサービスアカウントのパスワード変更手順」と同様に、全体管理サイトにアクセスします。
1. [アプリケーション構成の管理] - [サービス アプリケーションの管理] をクリックします。
1. [User Profile Service Application] のリンクをクリックします。
1. [同期] セクションにて [同期接続の構成] をクリックします。
1. 接続の一覧から、表示されている接続名を選択して、ドロップダウン リストより [編集] をクリックします。
1. [同期接続の編集] 画面にてパスワードを入力して、同期させるコンテナーを選択し、[OK] をクリックします。

# 参考
* [[Microsoft Docs] SharePoint Server の管理アカウントとサービス アカウントを計画する](https://docs.microsoft.com/ja-jp/sharepoint/security-for-sharepoint-server/plan-for-administrative-and-service-accounts)
* [[Microsoft Docs] Set-SPManagedAccount](https://docs.microsoft.com/ja-jp/powershell/module/sharepoint-server/set-spmanagedaccount?redirectedfrom=MSDN&view=sharepoint-ps)
はじめてのroboflow

:::note info
本記事は、システムズナカシマの[ブログ記事](https://www.systems.nakashima.co.jp/rf/roboflow/blog/)を基に作成しています。
:::

## roboflowって何？
皆さんこんにちは。
システムズナカシマの松浦です。

これから数回にわたり、**roboflow**を使ったAIモデル構築用の学習データを効率良く作成する方法についてご紹介します。

AIモデル構築の経験がある方は、学習データの整備で大変な思いをされていると思います。:disappointed_relieved:
「データ収集」、「管理」、「作業の割り当て」、「アノテーション」、「レビュー」、「データ増強」、「学習」、「推論処理の実装」など非常に多くの作業が必要となります。

AIモデル構築の作業の大半が「学習データの整備・作成」と言っても過言ではありません。

そんな時に役に立つのが**AIモデル構築プラットフォーム：roboflow**です。:fire:

roboflowは、2019年にアメリカ、アイオワ州:flag_us:にて設立されたベンチャー企業です。
2024年12月現在で**世界中の100万人を超える開発者**に利用されており、多くのDXの取り組み・研究開発で利用されています。

シリーズ初回の今回は、roboflowで何ができるかご紹介します。

## roboflowでできること



roboflowでは、以下にあるAIモデル構築に必要な一通りの作業を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882762/2861d0bd-21fc-a694-ba1f-cd57343f8bd0.png)

画像データの管理、アノテーションは〇〇ツールで、データ増強（オーグメンテーション）は自分でPythonでスクリプトを書いて...
全てを準備するのは非常に大変です。:worried:

roboflowを使えば、上記の全ての作業を共通のプラットフォーム上で行うことができます。:clap_tone1:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882762/cddf42ea-ee9d-1ee5-3da9-951ab78ad635.png)

また、学習データの整備・作成だけでなくAIモデルの学習も行うことができます。

更に、そのAIモデルを使って自動でラベリング（アノテーション）を行うことができたり、ワークフロー機能を使ってノーコードで独自の推論処理を実装することができます。:blush:

## 今後の予定

これから数回にわたり、roboflowの持つ魅力について順を追って紹介していきたいと思います。
皆さん楽しみにしておいてください。:thumbsup_tone1:

> ※記事一覧
> - [第1回：ワークスペースとプロジェクトの作成（1/2)](https://qiita.com/ShingoMatsuura/items/7d7a7940061f8990f50b)、[（2/2）](https://qiita.com/ShingoMatsuura/items/407bd9122bf07fd0ac4a)
> - [第2回：データのアップロード](https://qiita.com/ShingoMatsuura/items/5443bd69f2ee51ae6b1f)
> - [第3回：アノテーション（1/2）](https://qiita.com/ShingoMatsuura/items/23d241ec31727efd2e66)、[（2/2）](https://qiita.com/ShingoMatsuura/items/1a078681c6e370faeeb9)
> - [第4回：データ増強（オーグメンテーション）](https://qiita.com/ShingoMatsuura/items/64f0255c058b425fe8c1)
> - [第5回：学習](https://qiita.com/ShingoMatsuura/items/4ef2e9edd96191337c00)
> - [第6回：推論結果の確認](https://qiita.com/ShingoMatsuura/items/14c5d717e9d9637f81c8)


## 最後に

システムズナカシマでは、roboflowに関する個別相談・無料デモを行っております。
是非お気軽にご相談ください。

https://www.systems.nakashima.co.jp/inquiry/roboflow/contact/
アジャイルはコミットしなくていいから楽？

ガチガチにスケジューリングされた開発フローに疲れ、その反省から組織にアジャイルを導入したとき、

「**アジャイルは締切にコミットはしない。だからチームは安定して健康的に働けるのだ**」

というような理解・説明がされることがあると思います。

このメッセージは誤りではありませんが、誤読される可能性も高そうです。

この記事では「コミット」をテーマに、アジャイルな計画を学んでみます。

## 非アジャイルは「コミット」をする

アジャイルでない開発で計画するとき、スケジューリングとは「いつまでにできるか」を考えることが大半です。

スケジュールにおける「コミット」とは、「**特定の日付までに、成果物が完成／作業が完了する約束**」を指します。

約束するのだから、適当に日付を決めることはできません。プロダクト開発／プロジェクトのなかで発生するタスクの工数を丁寧に見積もり、合理的な締切[^1]を設定します。

合理的な締切であるからこそ、これに間に合わないことは一種の失敗とみなされることも多いでしょう。

## アジャイルは「見積り」をする

一方でアジャイルにおけるスケジューリングは、基本的に「**いつごろにできそうか**」を見積もるものです。

一見、コミットメントの「いつまでにできるか」とほぼ同じ表現に見えますが、明確な違いがあります。それは、**アジャイルな見積りはコミットすることを拒否します**。

そのため、たとえば以下のようなフレーズが計画中に出てくるでしょう。

- 7,8割の確立で予定通り終わりそう
- とりあえず設定したみたけれど、来月また見積りなおしたほうがよい
- この機能はリリースに間に合わないかもしれない

私なりに言い換えるなら、**日付とスコープと品質のすべてが固定されたコミットをしないこと**、と表現したくなります。

## アジャイルは「見積り」をつねに更新する

「いつまでにできるか」をコミットしないので、アジャイルな計画は楽そうに見えます。しかし一方で大変なこともある、というのが本記事の主張です。

その大変な理由は、アジャイルが「いつまでにできそうか」を**つねに更新する**からです。

開発者・チームは、その日、その週、その月の変化をもとに「いつまでにできそうか」という情報の変化を、ステークホルダーにすぐ伝える義務があります。

この更新によって、下記に引用する各特徴を満たす計画が出来上がっていきます。

> よい計画づくりとは、以下のような特徴を持ったプロセスのことだ。いずれも「ソフトウェア開発の問い」に対する答えを見つける手助けとなる。  
> ・リスクを軽減する
> ・不確実性を減らす
> ・意思決定を支援する
> ・信頼を確立する
> ・情報を伝達する[^2]

ちなみに上記の引用で、計画ではなく**計画づくり**と表現されているのがポイントです。よろしければ[アジャイル開発は計画しない？](https://qiita.com/kobori_akira/items/6f122372ff114d4ae373)も参照ください。

## まとめ

アジャイルは頻繁に計画をする手法です。完璧な計画をつくってコミットすることを拒否する代わりに、完璧な計画がつくれないからこそ計画づくりをやり続けます。

**アジャイルは計画と共に存在する**、というのが自身の理解です。

## 参照

- Mile Cohn『アジャイルな見積りと計画づくり ～価値あるソフトウェアを育てる概念と技法～』
- [アジャイル開発は計画しない？](https://qiita.com/kobori_akira/items/6f122372ff114d4ae373)

[^1]: しかし「合理的な締切」とはなんでしょうか。アジャイルに計画をする人間は、このタイミングでそんなものは作れない、という立場をとります。

[^2]: Mile Cohn『アジャイルな見積りと計画づくり ～価値あるソフトウェアを育てる概念と技法～』、p29。
Classic Email Templates

# 何故かClassic Email Templateが検索できないみたい
+ [Salesforce Classic Email Template in Quick Find Not Found](https://qiita.com/Keiji_otsubo/items/d5da7c09ff2f84ccdd46)
+ [Unable to find classic email template](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdsgASAR)


# visual force email templateの翻訳

[Visualforce email translation not working](https://salesforce.stackexchange.com/questions/219653/visualforce-email-translation-not-working)

anguage属性は、ラベルに関して電子メールの言語を設定するだけです。
受信者の言語がフランス語の場合、この特定のテンプレートが必要になるという意味ではありません。

翻訳したいテキストのカスタムラベルを作成する必要があります。次に、それらのラベルでサポートする各言語の翻訳値を設定できます。あなたの例では、フランス語の値が表示されます。

次のようにして、受信者の言語に基づいて動的にすることもできます。


# 日付のフォーマットを変える

+ [Display Asset Current Expiration Date as YYYY/MM/DD on HTML Classic Template](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clajm)

:::note
Please check this article.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7TAQSA3
:::

# 文字数

+ [Classicメールテンプレートの件名の文字数の制限が何文字か知りたいです。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KhKWv)

:::note
ユーザインターフェースのメールの件名に対する文字制限

ユーザインターフェースでは、メールの件名項目に 100 文字の制限があります。 

注: Winter'16 で新しい機能が追加され、ケースフィードのメールパブリッシャー使用時のみ、メールの件名行に最大 650 文字が表示されるようになりました。メール送信の ToDo (メールの送信)については、これまでどおり 100 文字の制限があります。 

https://help.salesforce.com/s/articleView?id=000385928&type=1
:::
[AWS]クラウドプラクティショナーを受験しました

# はじめに
先日、クラウドプラクティショナーを受験しました(合格することができました)。
受験した理由は

* なんとなく知っているが、体系的に学んだことはなかった
* 業務でAWSを触ることが多くなってきたこと
* 何よりずっとAWSをやりたかった！

です。
受験した感想ですが、受験して本当によかったと思います。
「AWSを学び始めたい」と思っている方には非常におすすめです。
本記事では学習方法と私の備忘録を紹介させていただきます。


# 学習方法

## AWS Skill Builder

https://aws.amazon.com/jp/training/digital/

AWS公式のデジタルトレーニングです。
上記の「AWS Cloud Practitioner Essentials (Japanese)」では、クラウドプラクティショナーで学ぶべきことを学ぶことができます。

## 【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）

https://www.udemy.com/course/aws-4260/

Udemyで販売されている講座です。絶対買いましょう！って言いたいくらいおすすめです。
この講座を受講しきちんと学習すれば、本番の試験が易しく感じると思います。
模擬試験が6つありますが、6つ目の「オプショナル問題(難易度高：アソシエイト試験レベル」を除いた5つの模擬試験の正答率は必ず90%以上になるように学習しました。

# 備忘録

クラウドプラクティショナーで学んだことをまとめると途方に暮れてしまうので、AWSを触っていると必ず出てくるAWS専門用語ではないカタカナの用語をまとめます。

* ポーリング
    * [「定期的な問合せ」のこと。](https://itmanabi.com/polling/)
* スピンアップ
    * [インスタンスの起動からアプリケーションのロードを行い、リクエストを受けることができる状態にするまでの処理。](https://tech.speee.jp/entry/2052#:~:text=%E3%82%B9%E3%83%94%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%92%E6%97%A9%E3%81%8F%E3%81%97%E3%82%88%E3%81%86,%E3%82%B9%E3%83%94%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82)
* ドリルダウン
    * [データ集計や分析で用いる手法の一つで、集計範囲を一段階絞ってより詳細な集計を行うこと。](https://e-words.jp/w/%E3%83%89%E3%83%AA%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3.html)

上記の他にもフォールトトレランスやフェールオーバー、フォールバックは頻出なので押さえておくと良いです。

# さいごに
AWSを使ってさまざまなことにチャレンジしていきたいです。
【Xcode】SendProcessControlEvent:toPid: encountered an error...のエラー解決

## 概要
Xcode14.1(beta版)にて、LiveActivityとDynamicIsland周りのAPIを試しているときのデバッグ時に以下のようなエラーが発生しました。解決法に少し手間取ってしまったため、メモとして解決法を残しておきます。

![スクリーンショット 2022-09-30 9.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773915/19cde694-b275-484f-b3b2-18d49ff1c190.png)

```
SendProcessControlEvent:toPid: encountered an error: Error Domain=com.apple.dt.deviceprocesscontrolservice Code=8 "Failed to show Widget...
```

## 解決法
結論から言うと、schemeの設定を間違えていました。プロジェクトを実行ビルドし、シミュレータなどで動作確認する際に、WidgetExtension側のSchemeに自動的に設定されてしまう時があり、そのままビルドしてしまうと上記のようなエラーが表示されるみたいでした。そのため、下記のようにメインとなるschemeを設定してあげることで解決することができました。(schemeの設定周りはまだまだ理解していない部分も多いのでインプットしないとです💦)

![スクリーンショット 2022-09-30 9.18.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773915/3acf9dcc-fc2c-3f94-ac1c-69f6b664ab1f.png)
Web Component、lit-markdown-editorをリリースしました！

はいさい！ちゅらデータぬオースティンやいびーん！

# lit-markdown-editorをリリースしました！

最近、筆者はMarkdown系の技術にこだわっており、その中で作ってきたツールをパッケージとしてリリースしています。

今回は、簡単にMarkdownのショートカットをまとめた簡素な編集ツール、`lit-markdown-editor`を公開しました。

https://www.npmjs.com/package/lit-markdown-editor

# 試しに使ってみる

CodePenで簡単に使えるアプリケーションを用意しましたので試してみてください。`lit-markdown-editor`は左側の部品です。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="RwyMgYQ" data-user="tronicboy1" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tronicboy1/pen/RwyMgYQ">
  LitMarkdown</a> by 井上　オースティン (<a href="https://codepen.io/tronicboy1">@tronicboy1</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

この前公開した`lit-markdown`と併用して、こうして簡単にMarkdownを表示できるようにしています。

また、CodePenに出しているJavaScriptは`esbuild`を使ってまとめたものです。

`esbuild`は本当に最高のビルドツールで、筆者はLambda関数用のJavaScriptをビルドする時によく使います。

https://esbuild.github.io/

## アップデート： 1.4.~Drag and Dropができるようにしました。

ファイルをドラグアンドドロップすれば自動的に追加してくれるようにしました。非同期処理が必要なプロセスでもOKです。

![ezgif.com-gif-maker (17).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/303a2269-d412-cf01-253e-5cdeda6ea0aa.gif)


# まとめ

以上、`lit-markdown-editor`をご紹介しました！もし使いたければぜひ使っていただければと思います。
Cloud9の［設定］が見つからないときの対処法

# TL; DR

上から来るぞ、気を付けろ！

![閉じたメニューバー展開時の動画](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216416/419afacc-59d0-a10d-c811-9126528db78b.gif)



# はじめに

私のCloud9環境のUIが、他の人となんか違うなーと思っていました。
いつもはCloud9のIDE機能を特に使っておらず、Vimで直接ファイルもターミナルも扱っていたので、普段は困っていませんでした（単なるEC2インスタンス接続装置として使っていました）。

なお、通常時の画面は以下の通りですが、右上隅のウィンドウボタンを押下することで、左右のスペースを展開できることは把握していました。

![通常時の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216416/202baff7-1f49-86eb-55d9-2d3a8fd2fff4.png)



# 設定変更ができない

しかし、 [Cloud9におけるターミナルのスクロール行数](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/settings-user.html#settings-user-change-terminal)を変更したいと思った際、私の環境では初期の初期で躓いてしまいました。

> ## ユーザー設定の表示または変更
>
> 1. メニューバーで、AWS Cloud9、［設定］の順に選択します。
>     - **［設定］** ってなんだ？？？？？ ＜ 私
>
> [AWS Cloud9 IDE におけるユーザー設定の操作 - AWS Cloud9](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/settings-user.html)

当然、左右のスペースで右クリックしても、設定なんてメニューは存在しません。

![ウィンドウ設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216416/4d57d405-4310-3c0e-1388-04fef2aa799d.png)

<!--
左のオブジェクトをクリックしても、左スペースが気持ち程度に動きますが、それだけです。

![検索ボタン押下時の動画](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216416/ff1feb6a-5478-3390-80cf-a5d1faec5006.gif)
-->



# 解決策

実は、うすーい上部に、ほんのわずかですが逆三角形の画像が表示されています。
上部をクリックすることで、メニューバーを展開できます。

![閉じたメニューバー展開時の動画](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216416/419afacc-59d0-a10d-c811-9126528db78b.gif)

いや自分で閉じてたんやないかい！！



# おわりに

クリックしてメニューバーを開いた瞬間、全てを思い出しました。
大昔の私が、少しでもウィンドウを広げようと試行錯誤した際に、メニューバーを閉じていたのでした。
~~ドキュメントに書いてくれたらいいのに......~~

自分で墓穴を掘っていただけですが、似た境遇の方に刺さっていただけたら幸いです。
オーバーサンプリングで不均衡データを調整する(SPSS Modeler データ加工逆引き7-12)

# オーバーサンプリングで不均衡データを調整する（クロスバリデーション）

![スクリーンショット 2022-09-04 17.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7e72f684-ac70-214f-e335-e6dc72a95171.png)

## 1.想定される利用目的

・予測モデルの頑強性を確保する

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/over_sampling.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-09-04 17.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e11ec4e3-bdbd-9520-c7f6-cc81b60654bb.png)

a.入力するデータは以下の通りです。
<img width="500" alt="スクリーンショット 2022-01-12 10.02.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f69d8fae-512c-8c88-49cd-04569e76e4b9.png">

#### バランスノードを自動生成させる

b.[棒グラフ]ノードを実行します。
![スクリーンショット 2022-09-04 17.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/247f9cad-1fd0-5c26-a19d-bf9a1a1b975b.png)

[生成]から以下のメニューを選択します。
![スクリーンショット 2022-09-04 17.08.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/beffe759-a6a7-6baf-3b57-2461d07669cf.png)

ノードcが自動生成されるのでストリームに配置します。

c.[バランス]ノードを編集します。棒グラフの自動生成により真の値を21倍オーバーサンプリングする設定になっています。
![スクリーンショット 2022-09-04 17.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f7efde1e-57b1-6978-801e-1d6c0bd72e27.png)

d.[棒グラフ]を実行します。
![スクリーンショット 2022-09-04 17.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/897b4261-ce29-c645-aad8-c8c5488ca184.png)

モデルとの組み合わせは以下の記事を参照してください。

https://qiita.com/416nishimaki/items/a873ffd1eb14a13296be

#### データ区分ノードとの組み合わせで利用する

e.[データ区分]ノードを編集します。5割を学習、5割を検証に割り当てます。
![スクリーンショット 2022-09-04 17.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f0a21b01-ba69-6444-55c0-fc376195f378.png)

f.[バランス]ノードはcから複製します。[学習のみをバランス]にチェックします。
![スクリーンショット 2022-09-04 17.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f2d004b9-70fe-b618-82d7-842caf652fb5.png)

g.[棒グラフ]を実行します。検証用にはフラグ＝真が増幅されておらず、本来の分布で精度を検証できるようになっています。
![スクリーンショット 2022-09-04 17.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5a797e59-099a-8ef7-e957-a317f1d9d038.png)

#### 注意事項

極端にフラグの真が少ない故障や不正のデータはサンプリングで精度が不安定になる場合がありますので交差検証の方法を注意深く検討します。

## 4.参考情報

#### [バランス]ノードを扱った記事

https://qiita.com/kawada2017/items/88071f2148d150b9267f

#### 不均衡データの調整にアルゴリズム[SMOTE]を用いる

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-10/

https://qiita.com/416nishimaki/items/58cdd5f9b825f17a9e0a

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Arduino UNOで有機エレクトロルミネッセンス温度計。(STTS751)(Adafruit SSD1306,Adafruit GFX)



x ライブラリのインストール方法は、めんどいので省略
x サイズは、約13KB

x OLED096UNO-Aです。
x Arduino UNOは、そのArduino UNO互換機

x 非営利、研究調査目的で引用する。

x 昔、秋月で売っていた温度センサーSTTS751
代用品は、S-5851A。(おもにアドレスの違い)

x 非営利、研究調査目的で引用する。

目的
OLEDで遊ぶ
適当にあつたI2C温度センサーを使用


![o_con832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7c10c200-75d1-6425-8494-76eaaadfd7b0.jpeg)



参考



https://qiita.com/jakalada/items/793a6cf5ff2796db4e86



STM32G071のプログラムの完全にそのまま



```c++



#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>



#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);



// コンパイル時にヘッダーファイルが適切に編集されていない場合に
// "Height incorrect, please fix Adafruit_SSD1306.h!"
// というエラーを表示するための記述
//#if (SSD1306_LCDHEIGHT != 64)
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
//#endif

// RSTピンがない互換品を使用するので-1を指定
//Adafruit_SSD1306 display(-1);

void setup() {
  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
}

#define STTS751 0x39

int tempval;

void loop() {
  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);


  //0番目のレジスター
  Wire.beginTransmission(STTS751);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);

  //温度の読み込み
  tempval = 99;
  Wire.requestFrom(STTS751, 1);
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    tempval = (int)Wire.read(); // 1バイトを受信
  }//while
  delay(1);

  //表示変換する
  char str1[3];
  str1[0] = '0' + (tempval/10);
  str1[1] = '0' + (tempval%10);
  str1[2] = 0;

  // 1行目に"Hello"を表示
  display.println(str1);
  // 2行目に"World!"を表示
  //display.println("World!");

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);
}



```
Python,Ruby,PHP,Java,JavaScript,PerlのPDF作成の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,PerlのPDF作成の比較

# Python

https://qiita.com/godan09/items/13866970972bf3a1c243

# Ruby

https://qiita.com/inoue9951/items/4498e5d130702d884352

# PHP

https://qiita.com/one_punch_man/items/bf140d4300195577dd3d

# Java

https://qiita.com/iceblue/items/a059c99ef1c17226a02a

# JavaScript

https://qiita.com/shuhei_sakiyama/items/ef68d49b7199d50a853b

# Perl

https://perlzemi.com/blog/20191228171433.html
リーダブルコードまとめ(第13章:短いコードを書く)

# 第13章:短いコードを書く
## 概要
本章では、コードを軽量化してできる限り少ないコードプロジェクトを成長させることを提案している。

### まとめ
新しいコードを極力書かないようにうするためには、
・不必要な機能をプロダクトから削除する。過剰な機能を持たせない。
・最も簡単な問題を解決できるような欲求を考える。
・定期的に全てのAPIを読んで、標準れいブラリに慣れ親しんでおく。
ということをまとめている。

### 学んだ点
・読みやすいコードというものは、極端な話何も書かれていないコードである。(コード数が少ないほうがいいとのこと)
・プログラマは、実装にかかる労力を過小評価しがちで、プロトタイプの実装にかかる時間を楽観的に見積もったり、将来的に必要となる保守や文章化などの「負担」時間を忘れたりする。
・求められることを小さく考えて、本当に必要な実装を考える。
・プロジェクトが成長しても、コードをできるだけ小さく軽量に維持する必要がある。そのために行うべきことは、以下の4つ
①汎用的な「ユーティリティ」コードを作って、重複コードを削除する。
②未使用のコードや無用の機能を削除する。
③プロジェクトをサブプロジェクトに分割する。
④コードの「重量」を意識する。軽量で機敏にしておく。
・既存のライブラリでできることを熟知することで、コードを軽量化することができる。
・たまには、標準ライブラリの全ての関数・モジュール・型の名前を15分かけて読んで身近なライブラリに親しむ。
・統計的にソフトウェアエンジニアが1日に書くコードは、10行らしい。その理由は、すでに存在するライブラリがありそれを再利用することで同じようなコードを長く書かなくてよくしてくれている。

### 感想と振り返り
確かに最近コードを書く以前にライブラリを少しだけ見たり調べたりすると、「こんなことができるのか」や「いずれこんなことする時使えそうだな！」という気付きがありますね。それをそっかり使いこなされれば、最高です！
読書の秋に(若い)プログラマーのみなさんにぜひオススメしたいアツい本

# カズオ・イシグロ “充たされざる者”(1995)(訳:古賀林幸)
1000ページを超えるぶ厚い小説。主人公はある街でコンサートを開くためにやってきたピアニストです。彼が行く先々でのいろんな人たちとの関わりが描かれるのですが、物事がちっとも前に進んでいかない。

まるで終わりのない悪夢のような話。ストーリーらしいストーリーはなくて、でも、ちょっとした葛藤や謎に引っ張られながら、ついつい先へ先へと読んでしまうんです。私はこの作品が大好きで、もう5回くらい繰り返して読んでいます。でもなぜ好きなのかうまく説明できないないんですよねえ。

ただ、この作品を読むたびに思うのは、そこには確かに読書の楽しみがある、ということ。村上春樹は自分の好きな小説を語る時に「文章から滋養を受け取る」みたいな言い方をしていました。私がこの小説から受け取っているのも、おそらくそういうものだと思います。翻訳は古賀林幸という方で、スムーズで信頼できる日本語です。

面白いミステリーに夢中になって、ひと晩で読み終わって、謎が解けたぞーっていう「一気飲み」みたいな読書の楽しみ方もあるでしょうけど、2ヶ月も3ヶ月もかけて「ちびちびやる」楽しみ方もあるんです。

私はこれが本と長く付き合っていくためのコツだと思っています。電車やバスで移動する時間、お昼ご飯を食べた後の休みの残り時間、注文した料理が出てくるまでの待ち時間、夜眠りにつくまでの数分間。こういう細切れの時間を繋いでいくんです。

けっして「キリのいいところまで読もう」なんて頑張っちゃいけません。文章の途中でも、時間がきたらさっさと閉じちゃえばいいんです。

電子書籍ならスマホに入れて気軽に持ち運べますし、時間が空いたらいつでも開けます。1000ページもの紙の本を持ち運ぶのは苦痛以外の何物でもないですから。この作品も、以下で紹介する作品も、すべて電子書籍で入手可能です。

SNSの読書タグで、自分の家の立派な書架の写真を投稿して自慢している人がたくさんいます。本の重み、紙の感触、匂いを味わいながら読むのは素晴らしい経験ですが、今や贅沢な楽しみとなりつつあります。

1980年代にCDが登場した時「デジタルは庶民の味方」と言われました。それまでは高価なアナログのステレオ装置とリスニング環境を所有する裕福な人たちだけが音楽を楽しむ事ができたのですが、CDの登場以降、もっと廉価な、場所を取らない装置で、誰もが音楽を楽しめるようになったのです。その後の技術の進歩は凄まじく、今では1000曲の音楽と1000冊の本をスマホに入れて気軽に持ち運べるようになりました。好きな音楽を聴きながら、面白い小説がどこでも読めるなんて、技術の進歩に感謝するしかないですね。

# スティーヴン・キング “ザ・スタンド“(1990)(訳:深町眞理子)
5分冊、2500ページのぶ厚さ。まずは第1巻の無料サンプルを試してみることをオススメします。著者の前書きは長いです。「キングの書いたものなら買い物リストでも読みたい」という熱狂的なファンがいて、著者もそんな読者のために楽しみながら書いているフシがあります。まあ、タダですから読んでみてください。

この文章が気に入らないなら、本篇もきっと読むのが苦痛でしょう。こういうものを面白がって読む人がいるかと思うと、時間のムダだという人もいるんですよね。私はもちろん前者です。後者の方は…そうですね、とりあえず靴でも磨いたらどうでしょうか。

電子書籍のいいところは、買う前に無料のサンプルで冒頭の部分を試し読みできることです。この作者の文章とはどうも相性がよくない、とかありますからね。ちなみにこの本の翻訳者は深町眞理子さんで、このひとの日本語は私は好きです。

ストーリーは、軍の研究所から致死性のウイルスが漏出し、人類は絶滅。僅かに生き残った人々が善と悪に分かれて最後の戦いを繰り広げる、というもの。愛すべき登場人物たち。読み終える頃には、彼らを残してその世界から立ち去るのが辛いとさえ思うようになるでしょう。それくらい夢中になれる小説です。

# トニ・モリスン “青い眼が欲しい“(1970)(訳:大社淑子)
「人々が彼女たち(白人の女の子たち)を見て”まあかわいい“と言うのに、わたしに対して言わないのは、どうしてなの？」という、1人の黒人少女の問いから始まる、差別的な社会の底辺を生きる少女の目から見た世界。

白人から黒人への差別だけではない。弱きものたちの世界にも厳然と存在する差別。男による女性に対する暴力的支配。後にアメリカのアフリカ系女性として初めてノーベル文学賞を受賞した著者のデビュー作。あからさまな性表現や差別表現がガンガン出てきます。気の弱い人は避けた方がいいかも。こういう物語を私たちが読む理由って、他人の思いを追体験することですよね。世の中にある様々な理不尽なことに対して、勇気を持って声を上げた人の声に耳を傾けること。

# 車谷長吉 “人生の救い”(2012)
困難な人生を歩んだ著者による人生相談。「なんかつらい」と感じている人は、まずは無料サンプルの「不況のせいで就職がうまくいかない」という大学生からの相談を読んでみるといいでしょう。私は著者の答えを読んで、ぶっ飛ぶような衝撃を受けました。

# 村上春樹 “海辺のカフカ”(2004)
世界一タフな15歳の冒険の話。
著者は日本だけでなく、世界中にファンがいるのですが、同時に同じくらいの数のアンチがいます。新作が出れば、賞賛とともに憎しみの声がネットに溢れる。まあ仕方ないですね。カンツォーネが大嫌いなイタリア人もいるでしょうし、ヒップホップが大嫌いなアフリカ系アメリカ人もいるでしょうし、ジャーマンテクノが大嫌いなドイツ人もいるでしょう。だから、村上春樹が大嫌いな日本人がいてもちっとも不思議じゃないですよね。私は大好きですけど。

# 伊坂幸太郎“砂漠”(2005)
著者の作品ではいつも、愚直に、悪に立ち向かう人の姿が描かれる。彼の作品を読みたくなる時って、自分も、そういう人でありたい、その思いは変わらない、ということを確認したくなる時なんですよね。

プログラマーは技術だけでなく、知性を身につけるべきだと私は思っています。知性を身につけるには、よい映画をたくさん観て、よい本をたくさん読んで、よい音楽をたくさん聴くこと。

スティーブ・ジョブズはiPodのことを”Device for heart”と呼びました。ここで私が知性と呼んでいるものは、そのハートのことです。

この記事が、これからみなさんがよいものを見つけていくきっかけになってくれればうれしいです。
リーダブルコードまとめ(第12章:コードに思いを込める)

# 第12章:コードに思いを込める
## 概要
本章では、プログラムのことを簡単な言葉で説明する技法について解説してくれる。

### まとめ
プログラムのことを簡単な言葉で説明する技法について解説しており、説明することで、コードがより自然になっていく。この技法が思ったより簡単で強力であるためコードに思いを込めるべきと伝えている。

### 学んだ点
・自分よりも知識が少ない人が理解できるような「簡単な言葉」で説明する能力が大切で、その考えをコードにも活かす。
・ソースコード＝プログラムの動作を説明する最も大切な手段
・ロジックを明確に説明する。
・簡潔なコードを書くためには、ライブラリを理解する。
・問題や設計をうまく言葉で説明できないのであれば、何かを見落としているか、詳細が明確になっていない。

### 感想と振り返り
本章に最初に書かれていた、①コードの動作を簡単な言葉で同僚にもわかるように説明する。②その説明の中で使っているキーワードやフレーズに注目する。③その説明に合わせてコードを書く。の3つの手順があり、この３つを忠実に再現できれば、誰が読んでもわかりやすいコードになると理解できました。自分自身まだまだこの手順に則って実装できてはいないと思いますが、毎回意識してコードを書いて慣れていきたいです！
WC_Order から取り出せる発送データ

WooCommerce の注文データとなる [wc_get_order($order_id)](https://woocommerce.github.io/code-reference/files/woocommerce-includes-wc-order-functions.html#function_wc_get_order)の関数によって取得できる発送データの内容を説明します。
商品データはこちらで案内しています。
[WC_Order から取り出せる商品データ](https://qiita.com/shoheitanaka/items/8e03654d92beee668b1b)

## 配送データの取得方法

```php
$order = wc_get_order( $order_id );// $order_id is Post object or post ID of the order.
$shippings = $order->get_items( 'shipping' );// default is line_item
```

**woocommerce_order_type_to_group**　のフィルターフックで上記の項目が増やすことができますので、拡張プラグイン等で増やされている場合もあるので、フックを使っていないかどうかのチェックをする必要があります。

## 取得できる商品データの詳細

```php
foreach($shippings as $shipping){
    echo $shipping->get_method_title();
}
```
発送データの詳細は上記のように CRUD を利用して取得するのが良いです。
取得できるデータは以下です。

* **method_title** 配送方法の表示名
* **method_id** 配送方法の id
* **instance_id** インスタンス id
* **total** 合計金額
* **total_tax** 配送費用の税額
* **taxes** 税金の内訳で四捨五入などの処理がされる前の数値**（_配列_）**

基本的に送料は一つなので１個なのですが、Orderのオブジェクトとして、配列にKeyが設定されていますので、上記のような形で取得する必要があります。
インスタンス id は配送方法の設定時につけられる番号になります。
(課題のメモ)　MapLibre の ３D terrain と ベクトルタイル（fill-extrusion）の重ね合わせ

# はじめに
MapLibre GL JSで作ったウェブ地図に、高さのあるデータ（Voxelタイル、ベクトルタイル）を乗せることを考えていますが、その関係の技術メモです。（今の課題をメモしておく）

個別レイヤの高さオフセットをうまく取れないなぁということのメモです。

## 環境
MapLibre GL JS v.2.4.0 

# 観察
## terrainなしの地図に fill-extrusion
ベクトルタイルにODMの点群から作ったVoxelタイルをfill-extrusionとして重ねます。高さの効果があるので、voxelタイルが浮いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/eed2bf0f-2387-2624-ecf1-53653cc8781d.png)

傾き０（Pitch=0）で見ていっても視点の中心を動かせば倒れこみの効果が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/51cd9a57-7c29-13ee-04e0-a9d33acc76a5.png)


また、ズームインしていくと視点が地表面によっていき、高さがあるVoxelの場合には、最終的にはボクセルの下に視点が潜ってしまいます。（ボクセルがみられない。ただし、上を見上げればVoxelがある。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/f68141d4-e2b3-d20d-8063-662df1695d5b.png)

上を見るとVoxel
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/c9e35271-db18-a208-5e3a-c4c426338f35.png)

このような効果を防ぐため、なるべく地表面を3D Terrainにして、Voxelタイルがその上に乗るようにしたいのです。

## 3D terrainありの地図に fill-extrusion
ベースマップのTerrainをセットして３Dにしましたが、fill-extrusionもTerrainの上の乗る形なので浮いてみえます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/1d9997cd-85bf-abdc-6c04-61a25e31da7e.png)

voxelタイルだけTerrainのオフセットをゼロにしたいのです。もしも、terrainの高さが['get','elevation']でとれば、レイヤをこんな感じにすればいいのかなと想像します。

```html
...
<script>
var map = new maplibregl.Map({
  container: 'map', 
  hash: true, 
  style: 'hoge/styles/style-el.json', // style file path
  center: [0,0], // center [lng, lat]
  zoom: 2, // zoom level at loading
  maxZoom: 0, // min zoom
  maxZoom: 18, // max zoom
  maxPitch: 85
});

map.on('load', () => {
 map.addSource("voxel",{
      "type": "vector",
      "attribution": "hoge",
      "minzoom": 15,
      "maxzoom": 17,
      "tiles": ["hogehoge/{z}/{x}/{y}.pbf" ]
 });

map.setTerrain({  //given that "dem" is already provided in the style.json
   source: "dem",
   exaggeration: 1
});

map.addLayer({
'id': 'voxel',
'type': 'fill-extrusion',
'source': 'voxel',
'paint': {
'fill-extrusion-color': ['get', 'color'],
'fill-extrusion-opacity': 1,
'fill-extrusion-base': ['-',['get', 'h'],['get','elevation']]
'fill-extrusion-height': ['-',['+', ['get', 'h'],['get', 'spacing']],['get','elevation']]
}
});
</script>

...
```

あるいは特定のレイヤだけ3D Terrainのオフセットをキャンセルできる方法がないものか。。

# 今後の方針
MapLibreでは、似たような問題で困っている人もいるようなので、進捗をウォッチします。
https://github.com/maplibre/maplibre-gl-js/issues/1654
https://github.com/maplibre/maplibre-gl-js/issues/1294

（いざとなったらソースデータに戻って地上高の高さを出してからタイル化してもいいかもしれません。）

# 参考
今回の実験で使ったvoxelタイルの作り方

https://qiita.com/T-ubu/items/87befeb59299fe621daa


MapLibre GL JS

https://github.com/maplibre/maplibre-gl-js
2022/9/30主にITとかセキュリティの記事

WAFルールセット「OWASP CRS」に深刻な脆弱性 - 「ModSecurity」とあわせて更新を
https://www.security-next.com/140103

「GMOクリック証券」を装ったフィッシングに注意
https://www.security-next.com/140073

なぜ、対策してもランサムウェアに感染する？　被害企業の実例から見えてきたこと ～感染経路や攻撃手口を解説し、最適なエンドポイント防御術を解説～(10/14開催)
https://japan.zdnet.com/event_info/30012022/

ビジネスメール詐欺（BEC）対策特設ページ(9/28)
https://www.ipa.go.jp/security/bec/index.html

GTA新作リークに使われた“多要素認証疲れ”攻撃とは　1時間以上通知攻め、従業員の根負け狙う(9/28)
https://www.itmedia.co.jp/news/articles/2209/28/news050.html

Macのセキュリティシステム、実はかなり強固だった...！(9/28)
https://www.gizmodo.jp/2022/09/apple-mac-macos-app-store-security-privacy-antivirus.html

ファイバーゲート回線障害　原因はサイバー攻撃(9/27)
https://www.nikkei.com/article/DGXZQOUC2712N0X20C22A9000000/

増大するフィッシング・クレカ不正のリスク、事業者の実態と対策とは(9/28)
https://news.mynavi.jp/article/20220928-2465058/

知っておきたい、ネットワークの5つの「脅威」(9/28)
https://news.mynavi.jp/techplus/article/20220928-2463877/

Hive、LockBit、BlackCatの3つのランサムウェアグループが、同一のネットワークを連続で攻撃(9/26)
https://www.mapion.co.jp/news/release/dn0000266938-all/

SMSなど用いたフィッシングに注意を　金融庁(9/28)
https://www.zaikei.co.jp/article/20220928/691118.html

Instagramのアカウントが乗っ取られた時の回復方法(9/28)
https://news.mynavi.jp/techplus/article/20220928-2464962/

【フィッシングによるものと見られるインターネットバンキングに係る不正送金被害の急増に注意！】(9/28)
http://www.week.co.jp/pubress/?p=17767

＜調査結果＞ Googleだけが知っているあなたの検索履歴とは？英国の成人2,000人を対象に調査を実施(9/27)
https://www.newsweekjapan.jp/press-release/2022/09/-google2000.php

“あなたと私のコマンドライン”
―初心者のための懇切丁寧なLinuxコマンドラインガイド(9/28)
https://gihyo.jp/article/2022/09/daily-linux-220928?utm_source=feed

Wintermuteセキュリティエクスプロイトはインサイダーの仕事だった可能性が浮上(9/28)
https://nextmoney.jp/?p=53432

クリプトドットコム、フランスで暗号資産事業者の認可取得(9/28)
https://www.neweconomy.jp/posts/262282

日本政府、仮想通貨交換業者に新たな送金ルール導入へ　マネロン対策を徹底＝日経(9/28)
https://coinpost.jp/?p=391886

最高裁が急ピッチで進めるクラウド活用の舞台裏、「紙ベースの業務フロー」とも決別へ(9/28)
https://active.nikkeibp.co.jp/atcl/act/19/00404/081000003/

川崎重工、Microsoftと産業メタバース　工場の不調予測(9/27)
https://www.nikkei.com/article/DGXZQOUC172SP0X10C22A8000000/

Microsoft Teamsの基本と活用 第121回 共有チャネルに外部ユーザーを追加する(9/28)
https://gunosy.com/articles/aiStF

米諜報機関ＨＰに突如ＵＦＯロゴ出現！ 即削除もユリ・ゲラーら拡散(9/28)
https://www.tokyo-sports.co.jp/articles/-/240232

Meta、ロシアによる反ウクライナと中国による米国撹乱のキャンペーンをFacebookとIntagramから排除(9/28)
https://www.itmedia.co.jp/news/articles/2209/28/news075.html

バイナンス、世界各国の法執行機関に仮想通貨調査のワークショップ開催(9/28)
https://jp.cointelegraph.com/news/binance-global-law-enforcement-training-program-is-official-after-year-of-activities

bash スクリプトベースのWebサーバー負荷テストフレームワーク(9/27)
https://qiita.com/kanetugu2018/items/3e666984296520092fbb

DAOと分散型IDの「金融化」とは｜Ontology寄稿
オントロジーによる考察シリーズ(9/27)
https://coinpost.jp/?p=391463

「多要素認証」を破る大規模フィッシング
1万社以上のMicrosoft 365利用企業を襲う(9/29)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800013/091500057/

ランサムウエア亜種が半年で1万件以上に倍増、米フォーティネットがリポート発表(9/29)
https://xtech.nikkei.com/atcl/nxt/news/18/13738/

クラウドサービスの放置は禁物、引き継ぎは生前に設定しよう(9/29)
https://xtech.nikkei.com/atcl/nxt/column/18/02179/083000003/

携帯回線の「マルチキャリア化」に関心集まる(9/29)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/091500186/
秋葉原に売ってるPCファンを卓上扇風機にした

# はじめに
既に夏は終わりの時期ですが、秋葉原で買ってきた１００円のPCファン、3Dプリンター、自作基板を使って卓上扇風機を作りました。

ちなみに基板はJLCPCBで4層基板、5枚で700円でした。

JLCPCBのサイトはこちら！
https://jlcpcb.com/

JLCPCBは新規ユーザー向けに54ドルのクーポンを配っており、安く基板を作れます！
https://jlcpcb.com/JPV

# 今回作ったもの

秋葉原のジャンクを漁って適当に買ってきた92mmのPCファンを
[Thingverse](https://www.thingiverse.com/)とかの3Dプリンター用のSTLデータ配布サイトで拾ってきた適当な土台に取り付ける。
「92mm PCfan」等で検索するとそれっぽいモデルがたくさん見つかるのでお好きな物をどうぞ。

![IMG_0039.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/d6e226dd-e4be-c2c0-681f-d0ca8a0bbfe8.jpeg)



このPCファンは詳細は分からないが、どうやら12Vが定格の様なのでそれにあった電源基板を作成した。
電源回路についてはスイッチング電源回路設計の知見が無かったため、Texas Instrumentsの
[WEBENCH® POWER DESIGNER](https://webench.ti.com/power-designer/switching-regulator?_ticdt=MTY2NDEyMTU0MnwwMTgzNzU1ZDZkMmQwMDFlYzMzOTRkZTU5ODAzMDUwNmYwMDI5MDY3MDBiZDB8R0ExLjMuMTM0NTU4NjQ2LjE2NjQxMjE0MDE)
を使用した。

TIのPOWER DESIGNERはInputとoutputの電圧はどうするか、電流はどのくらい流すのかなど条件を入力するとTIの電源管理ICを使ったデザインのテンプレートが出てくる。便利だね！
今回は提案されたICの中から入手性が良さそうな物を適当に選択した。
(フライバックコンバータIC UCC28631DRを使用したAC100V input ⇒ DC12V 1.5Aの回路を使用)

そんな感じで適当に基板も設計して[JLCPCB](https://jlcpcb.com/)に製造をお願いした。
![スクリーンショット 2022-09-26 010923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/64737e49-e169-59be-7e94-ad5ab1f10bcf.png)

完成品はこちら↓
JLCPCBは何故か製造費がクソ安いので今回も無駄に４層基板＋ステンシルで注文。
こんな感じで完成したPCBが上がって来た
![IMG_0044.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/0478b6a0-4e7d-fd20-ba46-f0ed1f071cba.jpeg)

実装後↓
見てわかる通り、トランスのフットプリントの寸法を間違えたのでトランスをひっくり返して銅線で無理やり結線している
![IMG_0043.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/b01ef0dc-de9d-c445-5b85-4338a43f816b.jpeg)


実際にファンに繋いでみると動いた。
![IMG_0047.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/fee98452-43d3-c6b2-4c2e-177a84defd9a.jpeg)

ただ、このままだと定格でブン回してるからクソうるさいです

# 最後に
今回作ってみた電源は１２V固定で、常にファンが全力で回り続けた為
ファンの土台は風圧で勝手に動くしかなりうるさいので使い勝手が悪いです。

PCファンはDCモーターなので、適当に電圧制御出来るような基板を追加で作成する事でいい感じ出来そう？

JLCPCBへの注文の仕方や、KiCad6での製造データ作成方法は他の記事に書いているので参考にしてみて下さい。
[JLCPCBで基板を作ろう[KiCad6編]](https://qiita.com/Konbanwa11/items/4e1d14b7cdc2282063fb)
[JLCPCBで４層基板を作った](https://qiita.com/Konbanwa11/items/f44084b8963d0147c9f6)

JLCPCBは新規ユーザー向けに54ドルのクーポンを配っているので是非JLCPCBで基板を作ってみよう！
https://jlcpcb.com/JPV
AWS AppRunner 雑感(2022/09)

現時点での雑感
日々パワーアップ中らしいので、今後に期待

# 良き
## ECRとAppRunnerだけでAPサーバが起動できる
特にALB立てなくて良いのは楽、あいつListenerとかTargetGroupとか作るもの多い

## アクセスが無い場合はCPUコストかからない
最小だとメモリ2GBで $13 / 1ヶ月

# しょぼーん
## CDK v2 未対応
アルファ版は出てるっぽいけど、v1なら大丈夫っぽいけど

## cloudformation 完全に対応してない
- autoscaling 非対応
- カスタムドメイン非対応

## セキュリティグループ / WAF非対応
IP制限したい

## multi docker非対応
nginx + app serverしたい

## もう少し小さいインスタンスが欲しい
最小 1vCPU / 2GB
0.25 vCPU / 0.5GBくらい欲しい
メモリ0.25GBくらいがあると、もっとイイ
pythonで対数グラフ(それと聴覚閾値)

# 初めに
　この数式って本当にこのグラフになるのかな？って不安になることってありますよね。
　今回はそんな自分の不安にpythonで解決しようとした際に出た問題を記事にしています。

# 問題
　最小可聴値あるいは聴覚閾値と呼ばれるグラフを探した際に次のようなグラフが見つかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/5c7c1b6b-6c03-9e75-eee6-5bb4e398bcdb.png)
↑wikipediaより

　これをpythonで再現したい。
　xが10の累乗のグラフなので、それが再現できるpythonのコードにしなくてはいけない。

# コード

```python
import matplotlib.pyplot as plt
import numpy as np
f = np.logspace(1,4,500000,base=10)
ath = 3.64*(f/1000)**-0.8-6.5*np.exp(-0.6*(f/1000-3.3)**2)+10**-3*(f/1000)**4
plt.plot(f, ath)
ax = plt.gca()
ax.set_xscale('log')
plt.show()
```

## logspace

```python
f = np.logspace(1,4,500000,base=10)
```

 numpyの対数スケールの配列を生成するためのメソッド。

## ax.set_xscale

```python
ax = plt.gca()
ax.set_xscale('log')
```

　配列ではなくグラフの軸事態を対数スケールに合わせにいくための設定用のメソッド。

# 結果

　こんな感じのグラフが。
　…あれ？Wikipediaにあったグラフとは形は似てるけど値が似ても似ついていないような？
　まぁ、この記事ではやり方さえ紹介できればいいかな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/3ba7b5ab-8f9f-8aea-4cad-0c2c2ace1bf5.png)



# 参考

https://pianofisica.hatenablog.com/entry/2020/09/16/120000

https://algorithm.joho.info/programming/python/numpy-logspace/

https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E5%8F%AF%E8%81%B4%E5%80%A4#cite_note-Suzuki2004-1
リモートリポジトリに不要なファイルを上げてしまった時の対応法

はじめに
--
本来は".gitignore"に設定し、gitに追跡させるべきではない/する必要がないファイル(rails-erdでPDFに出力したER図など)をgithubなどのリモートリポジトリにpushしてしまった際の対応を備忘録として残そうと思います。

"git rm --cashed"を使用する
--
下記のコマンドを叩けば、ローカルのファイルは残しつつgitの記録(履歴)から削除されます。
~~~bash
#ローカルのファイルは削除されない
git rm --cashed {ファイル名}
~~~

ちなみに"--cashed"のオプションをつけないとローカルのファイルも削除されてしまうので注意が必要です。
~~~bash
#ローカルのファイルも削除される
git rm {ファイル名}
~~~

".gitignore"にファイル名を追加する
--
"git rm --cashed"を叩いただけでは、"untracked file(未追跡のファイル)"として扱われるので間違えて再度リモートレポジトリにpushしてしまう可能性があります。

そのため、".gitignore"にローカルにだけ残したいファイル名を追加します。
（今回はpdfなので下記のように記述します）
~~~.gitignore
*.pdf
~~~

最後に変更内容をリモートリポジトリに反映
--
git rm --cashedで削除した状態をリモートレポジトリに反映する必要があるため、commitしてpushすれば完了です。

参考
--

https://www.atlassian.com/ja/git/tutorials/undoing-changes/git-rm