OmniAICreator/Qiita-1.07M huggingface dataset:
AppSheetでOIDCを使ってAzureADB2Cとつなぐ

# はじめに

- AppSheet自体はOIDCに対応しているので大丈夫だとは思いましたが、AppSheetでB2Cとつなぐ記事なんてニッチな記事はないので残してみます。
- 公式ドキュメントはこちらです。
    - https://support.google.com/appsheet/answer/10105083?hl=en

# AzureADB2Cの設定

アプリ名はAppSheetにしました。

- AppSheetのプレビューはWEBでしたのでプラットフォームはWEB,リダイレクトURIはマニュアルに従って2つ設定しています。（後者のlocalhostのほうがどこに使うのかまだよくわかってないです。）
  ```
  https://www.appsheet.com/Account/ELC
  http://localhost:53519/Account/ELC
  ```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/fbd74ea3-56d3-eda4-93b3-136a9859193a.png)

スコープを追加して、APIのアクセス許可を与えます（APIのアクセス許可で管理者の同意も与えておきます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/8b57534a-57d9-a5e8-aa02-6e4d9d324e70.png)

証明書とシークレットからシークレットを発行します。これはAppSheetの設定で利用するのでコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/0306974c-9fbc-1eaf-de61-c7b24ff5773c.png)

概要からアプリケーションIDをコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/d820cd68-ff81-d4a1-c311-7ccfe7a1b548.png)

 authorization エンドポイント, tokenエンドポイントも併せてコピーしておきます。利用するときはpolicy-nameを自身が設定したポリシーに併せて修正してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/fc378b31-43a5-f0d3-e432-2e377006047c.png)

# AppSheetの設定

Account setting → Integrations → Auth Domains → 「＋New Auth Domain」をクリックして設定していきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/c2e1539a-d9ee-3d9c-f230-154d7f3ab367.png)

Open ID Connectを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/05874342-f3e3-0e07-6712-1ffd9ca819e2.png)

先ほどコピーした値を設定し、保存します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/99145b77-9b31-6476-bbe1-852e9bccd8f0.png)

再度設定画面を開いて、名前を変えておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/53f6c5c1-e19b-39d4-af77-ef0001fcdb6b.png)

これをアプリ側に組み込みます

画面左のSecurity → Domain Authenticationで先ほど設定したものを設定します.(Groupは適当です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/f5cf047f-5e2b-d2ea-84fb-f58f42141738.png)

# 動作確認していきます

アプリのプレビューをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/d241c1b6-07f7-5930-4f9c-10b5820b1df0.png)

いつものB2Cのログイン画面が開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/a4c6ef33-2623-4471-6573-2012cd5469d2.png)

認証すると同意画面が出てきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/d91cc1db-d33b-446f-5506-c5dcf00dd831.png)

Acceptをクリックするとアプリ内に遷移できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/ac40f084-30d0-9510-2d06-e720dd91b8a2.png)
Terraform 基礎(バージョン変更)

# 目的
1年前ぐらいにTerraformの基礎的なところを学習したけど、結局なんとなくの理解のまま終わってしまったので
また、今回を機に少しずつ思い出しながらやっていく。

# やったこと
以前使っていた時より、バージョンのアップデートがあったので、バージョンのアップデートから行なっていきます
```ruby:
### 現在使用しているバージョンの確認
% terraform version
Terraform v0.14.4

### 現在使用(tfenv)しているバージョンの確認
% tfenv --version
tfenv 2.2.2

### インストールできるバージョン一覧
% tfenv list-remote
1.3.3
1.3.2
1.3.1
略

### バージョンインストール
% tfenv install 1.3.3
Installing Terraform v1.3.3
略

### 使用可能なバージョン一覧
% tfenv list
  1.3.3
* 0.14.4 (set by /usr/local/Cellar/tfenv/2.2.2/version)
  0.13.6

### 使用するバージョンの指定
% tfenv use 1.3.3
Switching default version to v1.3.3
Switching completed

### 現在使用しているバージョンの確認
% tfenv list
* 1.3.3 (set by /usr/local/Cellar/tfenv/2.2.2/version)
  0.14.4
  0.13.6
```
【Android】リスト選択ダイアログを簡単に表示する方法

# はじめに
ダイアログ上で選択させる表示を実装することがたまにありますよね。
要件としてはあまり多くない印象ですが、デザインに特に決まりがなければ簡単に表示する方法があるので残しておこうと思います。

# ひとつ選択可能なリスト選択ダイアログ

まず、ひとつだけ選択可能なダイアログの実装方法を紹介します。
実装は非常にシンプルで、表示したいタイミングで以下を実装するだけです。

```MainActivity.kt
val items = listOf("りんご", "メロン")
MaterialAlertDialogBuilder(this)
   .setTitle("タイトル")
   .setSingleChoiceItems(items.toTypedArray(), 0) { dialog, index ->
      // アイテムを選択した際の処理
   }
   .setPositiveButton("OK") { _, _ ->
      // ok押した際の処理
   }
   .setNegativeButton("Cancel") { _, _ ->
      // cancelを押した際の処理
   }
   .setCancelable(false)
   .show()
```
以上になります、表示された形が以下です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/e5a09396-6998-9d91-3ab4-54b47dde7e35.jpeg" width="220px">

setSingleChoiceItemsの第二引数は表示した際に最初に選択されていて欲しいアイテムのpositionになります。
該当するアイテムが存在しないpositionが設定されると、何も選択されていない状態になります。

# 複数選択可能なリスト選択ダイアログ

次に複数選択可能なリスト選択ダイアログの実装方法を紹介します。

```MainActivity.kt
val items = listOf("りんご", "メロン")
MaterialAlertDialogBuilder(this)
   .setTitle("タイトル")
   .setMultiChoiceItems(items.toTypedArray(), BooleanArray(items.size)) { dialog, index, isChecked ->
      // アイテムを選択した際の処理
   }
   .setPositiveButton("OK") { _, _ ->
      // ok押した際の処理
   }
   .setNegativeButton("Cancel") { _, _ ->
      // cancelを押した際の処理
   }
   .setCancelable(false)
   .show()
```
以上になります、表示された形が以下です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/e3293c6c-2ba9-285a-911c-c00a6c1c70c7.jpeg" width="220px">

setMultiChoiceItemsの第二引数は単一選択時と同様に特定のアイテムの選択有無ですが、こちらは複数選択が可能ということでbooleanのリストとなっています。
このbooleanのリストはitemと同じ要素数が必要で、少なかったりするとIndexOutOfBoundsでクラッシュしますのでご注意ください。

# さいごに
レイアウトを調整したい場合はこのダイアログを使用することはできませんが、シンプルでいい場合はかなり簡単に実装が可能です。
実装の際の選択肢にでもしていただければ幸いです。
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-03

こんにちは

SalesforcePlatform認定アプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-pt1

今回はTrailhead

認定 Platform アプリケーションビルダー資格の受験準備: Fundamentals and User Interface (基本事項とユーザインターフェース)
Salesforce の基本事項の学習

にある練習問題3問目をご紹介します

なお今回の内容は動画でも公開しております


https://youtu.be/0YGpaFi89Kg


今回の内容はこちらです

![0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/23a74c6a-1cc2-626e-dbfd-11252f64c55f.png)



正解はDです

問題としては
・最小限にユーザに権限を付与するにはどうすればいいか

という話です

権限の付与方法は２つございます
・プロファイル
・権限セット

プロファイルは１ユーザーに１つ必ず割り当てる権限のまとまりです


一般的に営業部、総務部　などのプロファイルを用意して１つのプロファイルに複数のユーザが使っていることが多いです

権限セットは特定のユーザに付与する権限のまとまりです


一般的に突発的な権限付与やプロファイルで割り当てられなかった特殊な権限の割当が可能です


今回の内容である取引先は
・すべての変更
については
・プロファイル
・権限セット

両方で付与可能です

しかしながら今回の問題は
・最小限の権限を念頭に

と書いてあるように特定のユーザに権限付与をするため権限セットの付与が正解でした

Aについて
上級マネージャーのプロファイルを変更すると、そのプロファイルに割り当てているすべてのユーザの権限が変更されるためふさわしくありません


Bについて
今回のように少数のユーザを対象に権限付与をする際にプロファイルを作成しているのは適切ではないようです
権限セットを作成しましょう

Cについて
共有設定はユーザが何を表示できるものですね。
今回の場合権限セット作成が正解でした
重複のバリデーションエラーを回避するFactoryBotの書き方

# 目的
Userモデルにてemailの一意性をバリデーションとして設定している場合、下記のテストコードではエラーが発生する。
```ruby
FactoryBot.define do
  factory :user do
    user_name { "tester" }
    email { "tester@example.com" }
    password { "password" }
  end
end
```
```ruby
it "複数のユーザー登録" do
    user1 = FactoryBot.create(:user)
    user2 = FactoryBot.create(:user)
  end
```
エラーが発生しないように複数のテストユーザーを作成する。
# 実装方法
```ruby
FactoryBot.define do
  factory :user do
    user_name { "tester" }
		#シーケンスを利用する
    sequence(:email) { |n| "tester#{n}@example.com" }
    password { "password" }
  end
end
```
上記の記述により「tester1@example.com」「tester２@example.com」のようにユニークなemailが出力される。
# 注意点・メモ
Factory_Botのシーケンスにはさまざまな利用方法があるので理解しておくこと。
# 参考サイト・資料
[Qiita：【RSpec】重複のバリデーションエラーを回避するFactoryBotの書き方](https://qiita.com/maa0917/items/aa33c5929614096e92cf)
エラー対応：Migration Nameにて「NO FILE」

# エラー内容
modelを実装中、DBに不手際を確認。
該当ファイルを削除した結果、Migration Nameにて「NO FILE」のエラーを確認。
「rails db:rollback」を実施していないため、エラーが発生。
# 修正対応
- migrationの状態を確認
```ruby
rails db:migrate:status
```
- 下記のmigrationを確認
```ruby
Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210726110200  Sorcery core
   up     20210726111347  Add columns to users
   up     20210804115220  Create boards
   up     20210804120214  Add user id to boards
   up     20210811081624  Add img to boards
   up     20210812091707  ********** NO FILE **********
```
- Migration IDをコピペし、ダミーファイルを作成
```terminal:terminal
touch db/migrate/20210812091707_hoge.rb
```
- 20210812091707_hoge.rbに下記を記載
```ruby
class Hoge < ActiveRecord::Migration[5.2]
  def change
  end
end
```
- rails db:migrate:status を実行してMigration Nameが付与されていることを確認
```ruby
Status   Migration ID    Migration Name
--------------------------------------------------
~ 
   up     20210812091707  Hog
```
- 下記コマンドを実行して、migrationをdownにする

```ruby
rails db:migrate:down VERSION=20210812091707
```
- 再度、migrationの状態を確認
```ruby
Status   Migration ID    Migration Name
--------------------------------------------------
~ 
   down     20210812091707  Hog
```
- ステータスが「down」になっていれば完了。ダミーファイル「20210812091707_hoge.rb」を削除して完了
# 参考サイト
[Ruby on Rails 『NO FILEのmigrationを削除する方法』](https://qiita.com/sakatan_1/items/9bf321f81d3b84042694)

開発中の不手際により、失敗の備忘も兼ねて学習メモを作成。
gretelを使ってパンくずリストを作成

# 目的
scaffoldアプリにてgretelを使ってパンくずリストを作成する。
最低限の内容を学習するため表示させるのはuser_newとuser_showのみにします。
# 新規の技術・機能の概要
## gretelの概要 ##
パンくずリストを作成するgem
![edit_パンくず](https://storage.googleapis.com/zenn-user-upload/bfc1d2ce13dae18ea22395b7.png)
webサイトの上部などにあるサイトページの位置等を示すリストがパンくずリストです。
gretelの設定ファイルは下記の通り
```ruby
crumb "ページ名" do
  link "ビューに表示される名前", "リンクされるURL"
  parent :親のページ名（現在の前のページ）
end
```
表示させるコードは下記
```ruby
<%= breadcrumbs separator: "区切り文字" %>
```
## 執筆時のバージョン ##
Rails:5.2.6
gretel:4.3.0
# 実装方法
## 新規アプリを作成
```terminal:terminal
rails new gretel_app
cd gretel_app
```
**scaffoldを使ってユーザー登録機能を実装**
```terminal:terminal
rails g scaffold User name:string
rails db:create && rails db:migrate
```
**rootを設定**
```diff ruby:config/routes.rb
  Rails.application.routes.draw do
    resources :users
+   root "users#index"
  end
```
## gretelの導入
**Gemfileにgretelを追加**
```diff ruby:Gemfile
+ gem 'gretel'
```
```terminal:terminal
bundle install
```
**gretelをインストール**
```terminal:terminal
rails g gretel:install
```
**config/breadcrumbs.rbが作成されていることを確認**
```ruby:config/breadcrumbs.rb
crumb :root do
  link "Home", root_path
end
```
## ユーザー登録画面に表示するパンくずリストを設定
```diff ruby:config/breadcrumbs.rb
 # 下記を追記
+ crumb :user_new do
+   link "ユーザー登録", new_user_path
+   parent :root
+ end
```
```ruby
# それぞれ下記の設定と対応（下記は説明用のコードです）
crumb "ページ名" do
  link "ビューに表示される名前", "リンクされるURL"
  parent :親のページ名（現在の前のページ）
end
```
**パンくずリストの設定を表示させる（application.html.erb）**
```diff ruby:app/views/layouts/application.html.erb
---省略---
  <body>
    # 仕切りもじは「" &rsaquo; "」で「>」が表示される
+   <%= breadcrumbs separator: " &rsaquo; " %> 
    <%= yield %>
  </body>
---省略---
```
```ruby
# それぞれ下記の設定と対応（下記は説明用のコードです）
<%= breadcrumbs separator: "区切り文字" %>
```
**パンくずリストの設定を表示させる（users/new.html.erb）**
```diff ruby:app/views/users/new.html.erb
 # 下記を追加
+ <% breadcrumb :user_new %>

  <h1>New User</h1>

  <%= render 'form', user: @user %>

  <%= link_to 'Back', users_path %>
```
**サーバーを起動してパンくずリストが表示されることを確認（ユーザー登録画面）**
```terminal:terminal
rails s
```
![](https://storage.googleapis.com/zenn-user-upload/8ac763f9a292ac39fba7e5bb.png)
*ユーザー新規登録画面に表示されるパンくずリスト*
## ユーザー詳細画面に表示するパンくずリストを設定
```diff ruby:config/breadcrumbs.rb
  ---省略---
 # 下記を追記
+ crumb :user_show do |user|
+   link "#{user.name}さんの詳細", user_path(user)
+   parent :root
+ end
```
**パンくずリストの設定を表示させる（users/show.html.erb）**
```diff ruby:app/views/users/show.html.erb
 # 下記を追加 @userに注意
+ <% breadcrumb :user_show, @user %>

  <p id="notice"><%= notice %></p>

  <p>
    <strong>Name:</strong>
    <%= @user.name %>
  </p>

  <%= link_to 'Edit', edit_user_path(@user) %> |
  <%= link_to 'Back', users_path %>
```
**サーバーを起動してパンくずリストが表示されることを確認（ユーザー詳細画面）**
```terminal:terminal
rails s
```
![](https://storage.googleapis.com/zenn-user-upload/90d6d819d709481269c7bfb5.png)
*ユーザー詳細画面に表示されるパンくずリスト*
# 参考サイト・資料
[Pikawaka:【Rails】 gretelを使ってパンくずリストを作成しよう](https://pikawaka.com/rails/gretel)
[gretel公式ドキュメント](https://github.com/kzkn/gretel)
RakeタスクでHelloWorldを表示

# 目的
Railsにて簡単なRakeタスクを学習
# 新規の技術・機能の概要
**Rakeとは？**
Rubyで記述されたビルドツール
**学習アプリに実装する機能**
RailsにてRakeタスク「HelloWorld」（ターミナルにHelloWorldを表示）を実装します。
**対象Version**
Rails:5.2.6
# 実装方法
## RakeでHelloWorld
```terminal:terminal
# 新しいRailsアプリ「task_rake」を作成
rails new task_rake
cd task_rake
```
```terminal:terminal
# Rakeタスク「task_sample」を作成
rails g task task_sample
```
```ruby:lib/tasks/task_sample.rake
# 下記のようなファイルが作成されることを確認
namespace :task_sample do
end
```
```diff ruby:lib/tasks/task_sample.rake
# 下記に編集
namespace :task_sample do
+    # descにはrakeタスクの説明を記載
+    desc "Hello Worldを表示"
+    task :sample do
+      puts "Hello World"
+    end
end
```
```terminal:terminal
# 下記のコマンドを実行、ズラズラと出力結果が表示される。
rake -vT
（省略）
rake task_sample:sample                 # Hello Worldを表示
（省略）
```
```terminal:terminal
# Hello Worldが表示されることを確認
rake task_sample:sample
Hello World
```
## モデルにアクセスする場合は :environment　を指定します
```diff ruby:lib/tasks/task_sample.rake
namespace :task_sample do
  desc "task_sample_use_model"
+ task :task_model => :environment do
    puts User.first().to_yaml  #Userモデルを参照する！
  end
end
```
# 参考サイト・資料
[Railsドキュメント:Rakeとは](https://railsdoc.com/rake)
[Railsガイド：カスタムRake](https://railsguides.jp/command_line.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0rake%E3%82%BF%E3%82%B9%E3%82%AF)
[Qiita:RailsでRakeタスクの作成](https://qiita.com/suzuki-koya/items/787b5562d2ae1a215d94)
【エラー】terminate called after throwing an instance of 'std::runtime_error' の解決

# 概要
あるニューラルネットワークの学習をしようとしたところ、以下のような流れでエラーが発生。

1. 学習しようとしたら使用GPUメモリが大きすぎてできなかった。
1. 別のサーバ（もっとGPU積んであるやつ）で学習しようとDockerコンテナを立てて環境構築。
1. 学習開始直後、print出力されていたログが全く表示されない（表示されても物凄く時間がかかる）。
1. 長時間待ってようやく表示されたと思ったら以下のようなエラーが発生。
```
terminate called after throwing an instance of 'std::runtime_error'
what():  NCCL Error 1: unhandled cuda error
Aborted (core dumped)
```

# 解決方法
NVIDIAのDocker imageをDockerfileに記述していたものの、そのCUDAバージョンが適切でなかった。

元々のDOckerfileの記述
```
ARG CUDA="10"
ARG CUDNN="7"
FROM nvidia/cuda:${CUDA}-cudnn${CUDNN}-devel
```
解決後
```
ARG CUDA="11.3.0"
ARG CUDNN="8"
FROM nvidia/cuda:${CUDA}-cudnn${CUDNN}-devel-ubuntu20.04
```
nvidia-smiの出力できたCUDAバージョン
```
 NVIDIA-SMI 470.103.01   Driver Version: 470.103.01   CUDA Version: 11.4 
```
また学習にはpytorchを使用していたが、pytorchのバージョンも変更した。

元々のDockerfile
```
RUN conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch-lts
```
解決後
```
RUN conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch
```

# まとめ
元々GPUメモリが足りず処理が終了していたサーバもCUDAバージョンが11だったので、「CUDA11のやつで一応動いているのだから、CUDAバージョンは関係ないよね」と勝手に思っていたのですが、どうやらそういうわけではなかったみたいです。きちんとバージョン確認・変更する、大事。
paiza.ioでelixir

# 概要
paiza.ioでelixirやってみた。
fizzbuzzやってみた。

# サンプルコード

```
defmodule FizzBuzz do
  def say(n) do
    cond do
    rem(n, 15) == 0 -> 
        "FizzBuzz"
    rem(n, 3) == 0 -> 
        "Fizz"
    rem(n, 5) == 0 -> 
        "Buzz"
    :else -> 
        n
    end
  end
end

for n <- 1..100 do
  IO.puts FizzBuzz.say(n)
end

```

# 実行結果


```

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

# 成果物

https://paiza.io/projects/8hZVKO0bN0-LUnnZmU1aog


以上。
論文；Neural Networks are Decision Trees (2022)

https://arxiv.org/abs/2210.05189

## TITLE 
Neural Networks are Decision Trees

## AUTHOR 
Caglar Aytekin (AI Lead, AAC Technologies)
AAC Technologies...香港の企業らしい

## MOTIVATION
Neural NetworkってBlack boxで困ることあるやん？
Decision Treeと等価なら置き換えて解釈性上げられるやん？
DTに置き換えられるならおまけで計算も効率的にできるかもね？

## METHOD
Neural Networkを定式化して、Decision Treeとの等価性を示す
等価変換のアルゴリズム（プロセス）を定式化

## Insight
単純に置き換えると冗長になるよ、でも単純化すればいいよ

## Contribution
定式化して、例も交えてNNがDTで置き換えられることを示したよ
Black boxの解消につかえるかもね
計算も効率的にできるはずだよ
Linux Remixes（Debian, Ubuntu and Manjaro-jp)

Linuxには、いろいろなデスクトップ環境が用意されています。

Ubuntuでも、提供されているし、

https://ubuntu.com/desktop/flavours

Debianでも、提供されています。

https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/11.5.0-live+nonfree/amd64/bt-hybrid/

Ubuntu Remixesというプロジェクトもあります。

https://gitlab.com/ubuntu-unity/ubuntu-remixes

今日は、UbuntuとDebianのGNOME環境で、snapdを削除して、flatpakを有効にした上で、
デフォルトブラウザを[ablaze](https://ablaze.one)さんの[floorp](https://floorp.ablaze.one)に変更したカスタマイズISOを次のURLにアップロードしました。
DebianのGNOMEは若干古めですが、その分、軽い感じです。
UbuntuのGNOMEは素のGNOMEな感じになっているか、ちょっと不安ですが、、、。

また、[Manjaro-jp](https://ja.osdn.net/projects/manjaro-jp/)ではVivaldiをブラウザとして採用していましたが、floorpに変更してみました。
Manjaro GNOME、KDEおよびxfceでデフォルトブラウザとして、floorpをプリインストールしてみました。

https://mega.nz/folder/YOVmSaxD#JUuILxlHAM9bdyx3DKLD0A

とりあえず日本語入力が使えて、ブラウザで動画が見れる（音声も出る）くらいのテストしかしていませんが、よかったら、遊んでみてください。

https://osdn.net/projects/manjaro-jp/simple/

OSDNへのアップロードも完了しました。2022.10.25.のISOです。

参考リンク
Ubuntu LiveCDカスタマイズ
https://help.ubuntu.com/community/LiveCDCustomization


メモ
GNOMEのお気に入りアプリの初期値を変更するには？
/usr/share/glib-2.0/schemas/ 以下のファイルで設定されている
favorite-appsの項目を変更して、コンパイルすればOKです。
```
glib-compile-schemas /usr/share/glib-2.0/schemas/
```

メモ２
GNOMEの設定画面で選択する既定のアプリケーションの選択肢に自分のアプリを登録するには？
これらの設定は、次のフォルダ下で設定されています。
/usr/share/applications/ 以下に、ファイルの関連付けの記述が設定されているので、ここに記述を追加します。
ファイルの関連付けというのは、音楽ファイルなら、どのアプリを起動するか？、テキストなら？、メールなら？、といった関連付けのことです。
/etc/gnome/default.list （/usr/share/applications/default.listは/etc/gnome/default.listのsymlinkでした）
関連付けや、デフォルトアプリの記述については、~/.config/mimeapps.listもチェックしてみてください。
.listファイルは非推奨らしいです。.desktopファイルに統一される感じみたいです。

mimeinfo.cacheの更新はupdate-desktop-databaseコマンドを用います。
```
update-desktop-databse /usr/share/applications
```
xfce4の場合には、/usr/share/xfce4/helpersを参考にしてみてください。
.desktopファイル内のTYPEをApplicationではなく、X-XFCE-Helperにすることで、ヘルパーアプリとして結びつけることができるようです。
```
update-desktop-databse /usr/share/xfce4/helpers
```

flatpakアプリなら、下記のコマンドで反映されるようです。
```
update-desktop-databse /var/lib/flatpak/exports/share/applications
```
通常、flatpakアプリのインストール時に自動で更新されるので必要はないでしょうが、うまく行かない場合に試してみてください。

ぜひ自分好みのLinuxを楽しんでください。
faviconに絵文字を使う

## TL;DR

🎉の部分を任意の絵文字に変更することで、その絵文字をfaviconとすることができます。

```html
<!-- svgに変換する場合 -->
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎉</text></svg>">

<!-- twemojiを利用する場合 -->
<link rel="icon" href="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f389.png">
```

これでとりあえずのページでもfaviconなしを避けることができますね。

## 2023/01/01 追記

`twemoji`を利用するほうが素直でした。

ただし、`twemoji`の今までのデフォルトCDN`twemoji.maxcdn.com`は2022年末でサービス停止するとのこと[^1]で、今後は`cdn.jsdelivr.net/gh/twitter/twemoji@{version}/assets/{svg|72x72}/{codepoint}.{extension}`を使うのがよいそうです。

`{version}`はご利用中のバージョンに合わせて指定することで、古いバージョンのものも使い続けられるようです。

```
# 🎉の場合
https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f389.png
```

と、いうわけでfaviconにtwemojiを使うHTMLは次のようになります。

```html
<link rel="icon" href="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f389.png">
```


### 参考サイト

[How To Use an Emoji as a Favicon Easily | CSS-Tricks - CSS-Tricks](
https://css-tricks.com/emoji-as-a-favicon/)

[^1]: [Twemojiが2023年になると表示されなくなる(かもしれない)問題に対処する - Zenn](https://zenn.dev/yhatt/articles/60ce0c3ca79994)
ABC274回答メモ

0.はじめに
　A～Cは、ほどほどにいい派応えでしたが、Ｄから一気に難しい・・・
　気がしました。（DPをマスターしてないからな気もしますが。）
　悩みポイントがなかったため、あっさりした解説になりました。

1.A - Batting Average
　formatは競プロだとあまり使わないので、調べながらの解答となりました。
　もしかしたらroundはいらないのかも。

```
print("{:.3f}".format(round(B/A,3)))
```

　https://atcoder.jp/contests/abc274/submissions/35870092

2.B - Line Sensor
　インプットをため込んで列ごとにカウントして出力する素直な感じで
　実装してACでした。
　出力を一行にするのにちょっと工夫がいるくらいかな・・。　

　https://atcoder.jp/contests/abc274/submissions/35874996

3.C - Ameba
　問題文を読んだ最初は言っていることが分からなかったけど
　読み込めば単純に番号を毎に何世代目かを記憶しておけばよく
　番号は、何回目の分裂でできた固体かを表すことがわかり
　そのまま実装でACでした。

　https://atcoder.jp/contests/abc274/submissions/35883035
WSL2でLinux用VSCodeを動かしてみた

# はじめに

WSL2（Windows11環境で、WSLgも有効になっている）だったら、Linux版のVSCodeが動作するはず。
試して見ました。

※VSCodeは、Windows用を入れておけば、WSL内からも開けるし、WSLのプラグインを入れればWSL内のフォルダー開けます。

# インストール方法
vscodeは、本家のドキュメントのUbuntuの場合に従ってレポジトリーを登録して`sudo apt install code `でインストール。
https://code.visualstudio.com/docs/setup/linux


# 実行

実行すると、Windows版をいれれば、WSLからも使えるよ。という警告が表示されました。

承知済みなので、yで進みます。

```
masa@DESKTOP-HP:~$ code
To use Visual Studio Code with the Windows Subsystem for Linux, please install Visual Studio Code in Windows and uninstall the Linux version in WSL. You can then use the `code` command in a WSL terminal just as you would in a normal command prompt.
Do you want to continue anyway? [y/N] y
To no longer see this prompt, start Visual Studio Code with the environment variable DONT_PROMPT_WSL_INSTALL defined.
```

おお。ウインドウマネージャが違うのが表示された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/0864e09b-a5c9-7834-e07b-98e932a415da.png)


# 今後

予想はしてたんですが、日本語入力ができません。
調べてみると、WSLgで日本語入力をできるようにすることは可能らしいです。
日本語の表示はできます。

今のところ、日本語入力のデメリットを上回る、メリットがありません。
Perl多次元データ構造 - Perlプログラミング入門【Windows・Mac・Linuxテキスト処理】

Perlの多次元データ構造について解説しました。

https://www.youtube.com/watch?v=stcKc37U5OM

・多次元データ構造は、業務で必須。JSONやデータベースの処理。
・リファレンス・デリファレンスの知識が必要
・配列の配列、ハッシュの配列、配列のハッシュ、ハッシュのハッシュ
・多次元データ構造の操作は、筋トレのようなもの。
・Perl入門書では、詳しく解説されていないが、業務ではとても大事。

Perlゼミ - リファレンスと多次元データ構造

https://perlzemi.com/blog/20100930127859.html

Perlプログラミングちゃんねるは、初級者向けのPerlプログラミング入門です。Perlテキスト処理プログラミングを覚えると文章の中に含まれる文字を簡単に検索・置換できるようになります。対応OSは、Windows/Mac/Linuxです。

テキスト処理プログラミングは、一番簡単なプログラミングの分野のひとつです。プログラミングが初めての方でも大丈夫。テキスト処理は、あらゆる分野に登場するので、実用性も高いです。

Perlのダウンロードとインストールからはじめて、Perlの基本的なプログラミングが書けるようになります。Perlゼミの無料オンラインテキストも活用できます。わからないことがあれば、Perlクラブフォーラムで、質問することができます。

木本裕紀のプロフィール

Perlゼミを運営しているPerlクラブ代表の木本です。次世代プログラミング言語SPVMの作者。CPANモジュール、Giblog、DBIx::Customの作者。Youtube「Perlプログラミングちゃんねる」。YAPC::Kansai 2017 OSAKA ゲストスピーカー。技術評論社「業務に役立つPerl」著者。
処理を続けるLambdaを中断させる方法とか

JAWS-UG 朝会にてLTをやった内容をもうちょい深掘りしてみました。
Lambda の処理が止まらなくなったので、やったことをまとめてみます。
  
## やろうとしていたこと
KinesisからのストリーミングデータをLambdaで受け取り、よしなに処理したあとに別サービスへとAPI連携をしていこうとするつもりでした。
  
## CloudWatch にずっと出てくるログを見て・・・
メッセージを見るために何度かみているのですが、どうもずっと動いているようでした。
最初は継続しているのかな？と思いながら見ていたのですが、１分で出ている量がおかしいと思い、対処していくことにしました。
  
## まずは止めにかかる
### Lambda を一時停止させる
兎にも角にも Lambda は停止しないと無限課金されるので一旦処理を止めます。
止める方法は対象の関数から「同時実行」→「編集」から「同時実行の予約」の数を 0 に設定します。
  
これで処理は一旦止められたのでそこから見ていきます。
同時実行の設定を戻すと当然処理が再開されますので、一時しのぎです。
  
### LambdaとKinesisの連携を止める
Lambdaの対象関数の画面からトリガー→無効化で連携を切ります。後述しますが、Kinesisから情報が来続ける限りデータの処理をしようとしちゃうので止めます。
  
## パラメータをチェックしていく
普段意識せずに見ていたパラメータについてせっかくなので深掘りしながら見ていこうと思います。
  
### Lambda のモニタリング項目
デフォルトで表示されているものです。
  
- Invocations
  関数コードが呼び出された回数で、成功失敗問わずここにカウントされていきます
- Duration
  関数コードがイベントの処理に費やした時間
- Error count and success rate
  エラーの発生回数。例外処理の回数もここに含みます
- Throttles
  スロットリングされたリクエスト数
- IteratorAge
  ストリームから読み取る場合のイベントのレコード最後の所要時間
- Concurrent executions
  イベントを処理しているインスタンスの数
  
まず今回は明らかに処理の時間が増えたこと、エラーの割合が大幅に増えていました。
思いつくのは書いたコードの中身がおかしく、それをずっと処理し続けていたことだと思いました。
にしてもそれまできちんと動いていたのと、エラーも無視してたのでなんでだろうって感じでしたが・・・。
  
## 原因と反省
今回やらかしたのは関数内にてループ処理を行ったこと。一応breakも入れて大丈夫なようにしたのですが、それでも引っかかってしまったようです。
どうやらLambdaのアンチパターンとして再帰パターンを引き起こすようなものを入れてはいけないとのことでした。
いくらbreak文を入れていたとはいえ、forループを入れたものを使うのは危険かもしれないですね（単純に自分のコードがだめだめだった可能性があります）
  
また、Kinesisは情報の保持期間の間は無事に送られるまで繰り返し送ろうとします。つまりLambdaが処理できるまでずっと続くという仕様でした。
Kinesisのデータ保持期間は最低でも24時間。Lambdaの最大実行時間が15分だから大丈夫と高をくくっていたら新規で処理を開始してたので結局続きました・・・。
  
Step functionsとかを使うことでそれらは回避できるようですし、CloudWatchでの検出が出来るように設定をしておけばもっと早く気付けたし回避できたのではないかと思ってます。
  
## 結局どうしたか
### やらかした部分のコード修正
根本的に見直しました。テストとはいえ、下手に動かすのは良くなかったですね。それまで動いていたのはたまたまで本来の動きを取り戻しただけでしょう・・・。
  
### Lambdaの非同期呼び出し変更
Lambdaの動きを制御する場所の一つに「非同期呼び出し」の部分があります。デフォルトではイベントの最大実行時間は６時間、再試行は２回となっています。
処理自体に問題が無いなら最大実行時間は少なくしてもいいですし、再試行の回数も１回とかにしてもいいと思います。
  
## おわりに
今回はたまたま目視で早めに確認できたのでそこまで大きなトラブルにならずにすみました。
でも調べているとむちゃくちゃ課金されているという例もあるので、CloudWatchでの検出もちゃんと出来るようにしとくのがいいなと感じました。
  
監視って甘く見てるときにサボると痛い目みるなと思いました。皆様も気をつけましょう。
  
## 参考
[エラー処理と AWS Lambda での自動再試行](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-retries.html)
[Lambda アプリケーションのモニタリングとトラブルシューティング](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-monitoring.html)
[身に覚えのない170万円の請求が……AWSの運用管理で起きた“4つのしくじり”](https://www.itmedia.co.jp/news/articles/2008/17/news025.html)
[Operating Lambda: イベント駆動型アーキテクチャにおけるアンチパターン – Part 3](https://aws.amazon.com/jp/blogs/news/compute-operating-lambda-anti-patterns-in-event-driven-architectures-part-3/)
[10日間 で AWS Lambda 関数を 28億回 実行した話](https://blog.mmmcorp.co.jp/blog/2019/12/25/lambda-cloud-bankruptcy/)
ある資料の説明

# 背景　
いろいろな大陸、島に於いて、どこと接続すると便利か分からないことがある。　

 <この項は書きかけです。順次追記します。>
# 目的
ネットワークの接続、経路選択をする際に測定する方法を検討する。

# 目標　
測定方法を一つ示す。　

# 前提条件　
有線。無線を含む。　

# 事前条件　
RFCは芋蔓式に調べてある。　

# 参加文献　
入手可能で有れば参加文献の参加文献の参加文献まで調べる。　

# 実験方法　
BSDを対向試験機器に導入している。　

# 実験媒体　
二つ以上の媒体を利用する。

# 模擬試験　
ns2. ns3またはmatlab,simlinkを使いたい。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">通信の遅延差測定非対称経路選択博士論文 <a href="https://twitter.com/hashtag/%E7%9F%AD%E6%AD%8C?src=hash&amp;ref_src=twsrc%5Etfw">#短歌</a></p>&mdash; naokiakutagawa (@naokiakutagawa) <a href="https://twitter.com/naokiakutagawa/status/1586371869745512448?ref_src=twsrc%5Etfw">October 29, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 　20221029

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
デザインパターン_Singleton

## Singletonパターンとは
クラスでインスタンスが1つしかなく，どこからでも値を持ったインスタンスを
取得することができるパターン

## 参照
[Singleton何が悪いの？](https://qiita.com/mo12ino/items/abf2e31e34278ebea42c)
[【Singeltonパターン】考え方は単純だが、使いどころが大切なデザインパターン【コード例はRubyとJava】](https://debimate.jp/2020/04/26/%e3%80%90singelton%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3%e3%80%91%e8%80%83%e3%81%88%e6%96%b9%e3%81%af%e5%8d%98%e7%b4%94%e3%81%a0%e3%81%8c%e3%80%81%e4%bd%bf%e3%81%84%e3%81%a9%e3%81%93%e3%82%8d%e3%81%8c/)
[シングルトンが邪悪な理由](https://matsu.teraren.com/blog/2012/11/20/evil-singleton)
[シングルトンパターンの誘惑に負けない](https://プログラマが知るべき97のこと.com/エッセイ/シングルトンパターンの誘惑に負けない/)

## クラス図
![300px-Singleton_UML_class_diagram.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736795/3ba3a168-760a-8a7d-0bcf-8ee6c03b8228.png)
[wiki-Singletonパターン](https://ja.wikipedia.org/wiki/Singleton_パターン)より引用

## メリット

### メリット
- メモリを節約できる

### メモリを節約できる
インスタンスを，生成するとヒープ領域にインスタンス分のメモリが，割り当てられる．
それが，Singletonパターンの場合1回で済むのでメモリの節約になる


## デメリット
- グローバル変数化する
- 状態を持ち続ける
- ユニットテストがしにくい

### グローバル変数化する
インスタンスが1個で固定されていて，それが常に保有されている
そして，どこからでも変更ができるので，エラーの原因になったり，コードの複雑性に繋がったりする

### 状態を持ち続ける
グローバル変数と一緒なのだが，状態を持ち続けてしまうことで
どこかで，値を変えられた時に原因を突き止めるのが難しくなる．

### ユニットテストがしにくい
> 理論的には独立しているはずのコード間に暗黙の依存関係を生んでしまう。これが問題なのは、まず依存関係が一見してわかりにくいからです。また、生まれてしまう依存関係は、本来不必要なはずです。問題の存在がはっきりするのは、ユニットテストの時です。ユニットテストは疎結合が前提となっていて、また「本物の」実装コードの代わりに、適宜モック(テスト用の偽者)実装に差し替えられることも重要だ、からです。シングルトンパターンはその妨げになるのです。

[シングルトンパターンの誘惑に負けない](https://プログラマが知るべき97のこと.com/エッセイ/シングルトンパターンの誘惑に負けない/)より引用

## 処理

### Singleton
``` C++:Singleton.h
template <class T>
class Singleton
{
public:
    static T& GetInstance(){
        static T instance;
        return instance;
    }
protected:
    Singleton() {};
    virtual ~Singleton() {};
};
```


### Test
```C++:Test.h
#include<string>
#include"Singleton.h"

using namespace std;

class TEST1 :public Singleton<TEST1>
{
    friend Singleton<TEST1>;
private:
    TEST1() {};
    ~TEST1() {};
public:
    void SetStr(const string str) { this->str = str; }
    string GetStr()const { return str; }
private:
    std::string str;
};


class TEST2 :public Singleton<TEST2>
{
    friend Singleton<TEST2>;
private:
    TEST2() {};
    ~TEST2() {};
public:
    void SetStr(const string str) { this->str = str; }
    string GetStr()const { return str; }
private:
    std::string str;
};
```


### Main
``` C++:main.cpp
#include <iostream>
#include "Test.h"

using namespace std;

int main()
{
    TEST1& test1 = TEST1::GetInstance();
    test1.SetStr("test1");
    //output: test1
    cout << test1.GetStr() << endl;


    TEST2& test2 = TEST2::GetInstance();
    test2.SetStr("test2");
    //output: test2
    cout << test2.GetStr() << endl;

    return 0;
}
```


### 実行結果
``` :実行結果
test1
test2
```
[Rails][shebang] bin/rails  : No such file or directory 解決法




# 問題

VM上のCentOS 環境からgit cloneした 
Rails projectの `bin/rails` `bin/rake` などbinstabコマンドがうまく実行できない。


```
$ bin/rails console
: No such file or directory
```

->
bin/rails ファイル中身を 削って、見ると
そもそも1行もruby実行できていない


# 原因


shebang とよばれる1行目 の読み込みが悪いよう

一方で `rails c`
など 当のbinstab を使用しないと実行はできる:


```
$ rails c
/home/vagrant/.rbenv/versions/2.7.6/bin/ruby: warning: shebang line ending with \r may cause problems
..
```
( ->
改行コードが 悪いみたいなwarning が出ている..

## 解決法

全体的に改行コードが問題っぽいが、

とりあえず、
当binstab を以下でencode変換したら 解決した。


```
$ dos2unix bin/*
```
->
```
$ bin/rails c
..
irb > 
```


# 参考

https://stackoverflow.com/questions/27810625/ruby-script-shebang-with-absolute-path-to-ruby-not-working
音楽再生システムを作ってみた (前編)

# 1. 今回のやりたいこと
音楽再生システムを作ります。

まずはどういう機能が必要かを本記事にて記載し、別途、各機能ごとに記事を記載していこうと考えています。

# 2. 音楽再生システム

音楽システムの概要を下記に示します。
![全体像.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782242/b6489f84-edc0-fa83-e492-60a2b699be0c.png)

仕様は下記の通りとします。
* 音楽データのフォーマットは、WAVファイルとする
* 音声の仕様としては、1サンプル16bit、モノラル、サンプリング周波数16kHzとする
* 音楽データは、PCからBlueTooth経由で送信される
* 1曲までダウンロードできることとする
* ユーザインタフェースは上記図の通り

# 2. 方式設計

### 2.1 環境
* 使用ボード：nucleo l4r5zi
    * Cortex-M4搭載、2MBのFlash、640KのSRAM、USB OTG
* 開発環境：Atollic TrueSTUDIO® for STM32, Built on Eclipse Neon.1a.(Version: 9.3.0 )
* 対象OS：KOZOS※
※下記書籍で紹介されているOSになります。ソースコードも展開されています。
[12ステップで作る 組込みOS自作入門](http://kozos.jp/books/makeos/)
* LCD：[AQM1602Y-NLW-BBW](https://akizukidenshi.com/catalog/g/gP-12485/)



* シリアルフラッシュ：[W25Q20EWSNIG](https://www.digikey.jp/ja/products/detail/winbond-electronics/W25Q20EWSNIG/5764886)
* Audio Codec：[デジタルオーディオコーデック独立実験基](https://eleshop.jp/shop/g/gC7E411/)
* ステレオミニジャック：[３．５ｍｍステレオミニジャックＤＩＰ化キット](https://akizukidenshi.com/catalog/g/gK-05363/)
* BlueTooth通信モジュール：[HC-06](https://qiita.com/hcuymitoh/items/5bea7f9bed80ff842ea2)

### 2.2 システム構成図
システム構成図と機能を下記に示します。
![システム構成図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782242/656e575f-8221-de2f-37d0-da3e15572193.png)


* __表示機能__
ユーザインタフェースに該当するところになります。
LCD上に選択肢を表示し、ボタンで選択肢を決定します。
今回使用するLCDの通信インタフェースはI2Cとなっています。
* __ダウンロード機能__
PCから送信されたWAVファイルをシリアルフラッシュメモリに格納します。
今回使用するシリアルフラッシュの通信インタフェースは、Quad SPIとなっています。
* __音楽受信機能__
WAVファイルをBlueTooth経由で受信します。
今回使用するHC-06の通信インタフェースは、USARTとなっています。

* __音楽再生機能__
ダウンロードされている音楽、または、PCから送信された音楽を再生します。
オーディオコーデックとの通信インタフェースはSAIとなっています。

# 3. 最後に
本記事は、簡単ではありますがこれで終わりになります。
次回からは、上記の4つの機能ごとに記事を記載していく予定です。
順番はまだ決めていませんが、おそらく最初は、"ダウンロード機能"になるかと思います。

本件について、何か不明点・アドバイスがあればコメントしていただけると嬉しいです。
Azureのデプロイモデルの種類



●クラシックデプロイモデル（ASM)
従来のモデル

●Resorce Manager デプロイモデル（ARM)
関連するリソースをグループ化して管理できる。つまり、関連したリソースのデプロイや削除などを一回の連携した操作で実施できる。
また、ロック、タグ、ロールベースのアクセス制御、テンプレートによるデプロイ　があるのがクラシックとは違う点。

●Azure Resorce Manager
Resorce Manager デプロイモデルの中核を担うエンジン。AzureポータルやAzure PowerShellなどの管理ツールからのユーザー要求を受け取り、その要求をREST APIを通じて適切なリソースプロバイダーへ転送する。

●リソースプロバイダー
Resorce Manager デプロイモデルにおける要求を処理するプログラムおよびサービス。

リソースプロバイダーの管理は、Azureポータルの「サブスクリプション」のリソースプロバイダー」のメニューから行う。
microsoft.insightsなど特定のリソースプロバイダーを使用するには明示的な登録作業が必要。
#1293 – Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

Xfreeのサーバーを使ってPHPファイルとphpMyAdminを連携してデプロイに上記のエラーが発生しました。

原因としてはXfreeのmyadminのバージョンが低いため上記のエラーが発生しました。

Xfreeのバージョン（phpmyadminのバージョン）
5.0.95

localhostのバージョン（phpmyadminのバージョン）
5.1.0


原因
phpMyAdiminのバージョンが古いため、CURRENT_TIMESTAMPが１つしか使えないため



対策
CURRENT_TIMESTAMPを１つにする。
php MyAdminの構造をクリックして
タイプカラムを「datetime」へ全て変更する。
デフォルト値カラムを１つは「TIMESTAMP」残りは「null」に変更する。
他にテーブルがある場合も同様の対応をする。
AtCoderで必要な基礎知識(Python編)



この記事ではAtCoderで必要な基礎知識をまとめてありますのでぜひ参考にしてください。
- 標準入力
- 標準出力

## 標準入力
一字の読み込み(数値)
```py
n = int(input())
```
一行の読み込み(文字)
```py
s = input().split()
```
一行の読み込み(数値)
```py
nLine = [int(i) for i in input().split()]
```
一行目でサイズが指定された多重配列の読み込み(文字・空白あり)
```py
nLine = [int(i) for i in input().split()]
sList = [input().split() for i in range(nLine[0])]
```
一行目でサイズが指定された多重配列の読み込み(文字・空白なし)
```py
nLine = [int(i) for i in input().split()]
sList = [list(input()) for i in range(nLine[0])]
```
一行目でサイズが指定された多重配列の読み込み(数字・空白あり)
```py
# 想定される入力形式
# N K
# A_1 ... A_K
# ... ... ...
# N_1 ... N_K
nLine = [int(i) for i in input().split()]
nList = [[0]*Line[1] for i in range(nLine[0])]
for i in range(nInt[0]):
    nList[i] = [int(i) for i in input().split()]
```


## 標準出力

桁数制限した数字の出力
```py
#S:出力したい文字, .3f:小数点第三桁まで
print(format(S,'.3f'))
```
```py
#右寄せ0埋め
n = 1
print(str(n).zfill(8))
#00000001
```

フラグ管理によるYes/No出力
```py
flag = False
if(flag):
    print("Yes")
else: 
    print("No")
```
c++備忘録

## テンプレ
~~~
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
  ...
}

~~~

## 型、入出力
~~~
int H, W;
double D;

cin >> H >> W;
cout << H << endl;
~~~




## 配列関係
~~~
vector<string> C(H);

if (C[i][j] == '#') ans[j]++;

~~~
ESP8266でタイマ割込したい(Arduino + ESP8266TimerInterrupt Library)

## TL;DR
ESP8266TimerInterrupt Library を使う

https://github.com/khoih-prog/ESP8266TimerInterrupt

## 経緯
安価でArduinoライクに開発できるWiFi対応モジュール ESP8266 と、それをベースとした ESP-WROOM-02 という便利なモジュールが存在する。これを用いて複雑なデバイスを開発していると、タスクを分けて実行したいと思うことがある。

> 例：メイン関数からHTTP GETをリクエストしたいが、レスポンスを待っている間もモータやLEDを10msおきに操作し続けたい

このような状況で、呼び出し間隔ごとにタスクを分けて、タイマ割込により定期的に呼び出すということをする。そこで、本記事ではESP8266におけるタイマ割込の実行方法をメモしておく。

## 導入
ESP8266TimerInterrupt Library という便利なライブラリが存在する。これをインポートする。

https://github.com/khoih-prog/ESP8266TimerInterrupt

（ライブラリの導入方法自体は、Arduino IDE なのか Platform IO なのかでも変わってくる気がするので、省略）

## 利用

ひとまず、一番簡単な利用方法だけ記載しておく。
（ほかの機能は後日追加）

```c
#include "ESP8266TimerInterrupt.h"

ESP8266Timer ITimer;

// 定期的に呼び出すタスク
// 引数と戻り値は共に void にする
void subtask() {
    // 定期的に呼び出すタスクの内容
}

void setup() {
    // subtask 関数を10msごとに呼び出す例
    // 秒数はマイクロ秒で書く
    ITimer.attachInterruptInterval(10000, subtask);
}

void loop() {
    // subtask のタイマ割込とは別で、ここでメインの処理を行うことができる
}
```

## Todo
グローバル変数経由で別タスクにデータを渡しだすと、データの整合性を保つためなどの理由で、割込禁止を設定したくなる。割込禁止について調べる。

- そもそもできるのか？
- できるとして、どのように実装するのか？
raspberry pi をWiFiの中継機にする方法のメモ

raspberry pi zeroを[過去](https://qiita.com/wear_volt/items/4e05a7a9899aacb00e87)にAP化することに成功しているので、今度は中継機を作成した。

**今回想定する構成**

**サーバ（192.168.100.1）**
    ↑↓ wlan0(内蔵WiFi)
**中継機(192.168.101.1)**
    ↑↓ wlan1(WiFIアダプタ)
**端末**

:::note warn
サーバの設定、中継機の初期設定は[過去](https://qiita.com/wear_volt/items/4e05a7a9899aacb00e87)に設定したものとする
:::


**中継機のWiFi設定**
| wlan0 | wlan1 |
|:-----------:|:------------:|
| 内蔵WiFi       | WiFIアダプタ        | 
| サーバへ接続する       | APの電波を発信する        | 

**接続先設定**
wpa_supplicant.confでサーバへのSSID、PWを設定しておく


## 中継機のための設定手順
### ①dhcpcd.confの設定
```/etc/dhcpcd.conf
interface wlan1
static ip_address=192.168.101.1/24
static routers=192.168.101.1
static domain_name_servers=192.168.101.1
static broadcast 192.168.101.255
#これ大事
nohook wpa_supplicant
```
:::note info
**nohook wpa_supplicant**とすることでWiFIアダプタがサーバへ接続することを防ぐ
:::


### ②dnsmasq.confの設定
```
interface=wlan1
dhcp-range=192.168.101.2,192.168.101.140,255.255.255.0,24h
```
:::note info
**192.168.101.1**は中継機のIPに割り当てるため、**192.168.101.2**からにする
:::

### ③rc.localで起動時に実行されるようにする
```
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sh -c "iptables-save > /etc/iptables.ipv4.nat"
```
:::note info
他ブログでdnsmasqの設定をrc.localで実行されている方もいたが、特になしで良さそう
:::

### ④おまじない
```
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
sudo systemctl restart dnsmasq
sudo systemctl restart hostapd
```

以上で、中継機として動作する。
SSIDはサーバのSSIDと中継機のSSIDの両方が共存しているはず。
中継機のSSIDに接続していてもサーバのデータにアクセスできればOK

接続先がサーバではなく家庭内のWiFiであれば、
```
ping www.google.co.jp
```
で中継機から接続確認できる。


参考文献
[CCIE TOZAIとITを楽しむブログ　「Raspberry pi 4を無線の中継機(AP)にする手順」](https://ccie-go.com/raspberry-pi-4-chuukeiki/)


2022/12/04　追記

## 上記のままでは、中継機のwlan1がwlan0に接続してしまう事象が発生した。
そこで、wpa_supplicant.conf内の設定を以下のように修正した。

```/etc/wpa_supplicant/wpa_supplicant.conf
#サーバー
network={
        ssid="サーバと中継機と同一のSSID"
        psk="password"
        bssid="サーバのMACアドレス"
        key_mgmt=WPA-PSK
}
```

以上の設定で指定のmacアドレスのssidにしか接続しない設定になる。

#### しかし、サーバとの接続が切れた場合に、中継機のwlan1がwlan0に接続してしまう事象が発生した。
詳細は不明だが、サーバとの通信が切断されたときにのみ起きる事象であることから、
再接続スクリプトをcronで実行するようにした。

## 再起動スクリプト
pingがサーバに通った場合はOKを出力
pingが通らなかった場合はWiFiの再接続コマンドを実行する。
WiFiの再接続コマンド実行後はwlan1がwlan0に接続することはない。
```reconnct.sh
#!/bin/sh 
if ping 192.168.100.1 -c 1 >> /dev/null 
then 
        echo "OK" 
else 
        sudo ifconfig wlan0 down 
        sleep 1 
        sudo ifconfig wlan0 up 
        echo "restart" 
fi
```

#### 中継機に中継機が接続する場合のスクリプト
```reconnct.sh
#!/bin/sh 
if ping 192.168.100.1 -c 1 >> /dev/null; then 
        echo "server OK" 
else
        if ping 192.168.101.1 -c 1 >> /dev/null; then 
                echo "bridge OK" 
        else 
                sudo ifconfig wlan0 down 
                sleep 1 
                sudo ifconfig wlan0 up 
                echo "restart" 
        fi
fi
```

## 定期実行設定
#### cron編集
```
crontab -e
```

```/etc/init.d/cron
* * * * * cd /home/pi/Desktop && sh reconnect.sh
* * * * * sudo chronyc -a makestep
```
#### cron再起動
```
sudo /etc/init.d/cron restart
```

以上の処理を追加することで、中継機が自分に接続することを防ぐことができる。
paizaラーニング レベルアップ問題集 paizaの森練習問題コンテスト過去問題6 JavaScript ロボットの移動

ロボットの移動 (paizaランク D 相当)

https://paiza.jp/works/mondai/forest_contest_006/forest_contest_006__d_robot_movement

x,yそれぞれの絶対値の和が答えです。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
console.log(lines[0].split(" ").reduce((x, y) => Math.abs(x) + Math.abs(y)));
```
【AWS】lambdaでCloudFrontのキャッシュを削除する方法

# はじめに
S3にアップロードした画像や動画は、CloudFront側で自動で検知して更新を反映してくれないので、いつまでもキャッシュされた古いデータを見てしまうということが起こり得る。
そのため、CloudFront側でキャッシュを削除する必要がある。これをLambdaでスケジューリング実行する。一応手動実行の方法も記載しておきます。

# CloudFrontのキャッシュ削除（手動実行）
手動実行でキャッシュを削除する方法は以下

![](https://storage.googleapis.com/zenn-user-upload/c52cb2fb7e0f-20221015.png)

![](https://storage.googleapis.com/zenn-user-upload/86f95bc403d4-20221015.png)

![](https://storage.googleapis.com/zenn-user-upload/0adfce76a593-20221015.png)

# CloudFrontのキャッシュ削除（Lambda）
Lambda実行でキャッシュを削除する方法は以下

## Lambda関数の作成
- 関数名：remove-cache
- ランタイム：Python3.9
- アーキテクチャ：arm(x86でも可)
- ロール：「CloudFrontFullAccess」のポリシーがアタッチされたロールを設定
- 関数の処理を設定
```
from __future__ import print_function

import boto3
import time

def lambda_handler(event, context):
    client = boto3.client('cloudfront')
    invalidation = client.create_invalidation(DistributionId='【ディストリビューションID】',
        InvalidationBatch={
            'Paths': {
                'Quantity': 1,
                'Items': ['/*'] // ファイルパス指定
            },
        'CallerReference': str(time.time())
    })
```

- トリガー（EventBridge CloudWatch）
何をトリガーにするかは要件による。S3にオブジェクトが置かれたことをトリガーにして、実行するもよし。
スケジュール式はcronまたはrate式を使って、スケジュールを設定する。UTCでもローカルタイムでも設定可能。

![](https://storage.googleapis.com/zenn-user-upload/e1fe9b4cfa7b-20221015.png)

![](https://storage.googleapis.com/zenn-user-upload/6f5b45967807-20221015.png)

# まとめ
キャッシュを頻繁に削除する場合は、上記の手動工程をいちいち行わなければいけない。そこでLambdaのスケジュール実行を行うと自動化できる。<br>
Javaで何か作ってみる(2022/10/22 Day2)

## 今日やった事
- Windows環境に、Java開発環境を構築した。
## 参考にしたもの
- [【超絶丁寧解説】Javaプログラミングをゼロから学ぶ！絶対挫折させない「基礎入門」講座【講師評価4.3】](https://www.udemy.com/course/uz-java-kiso/)
    &rarr; Javaの勉強に使用しているUdemyの動画教材。  
    まだ序盤しか見ていないが、環境構築で、「EclipseをインストールするだけでOK」で、  
    済ませすに、JDKを使って環境構築する方法や、JDKの歴史等を解説してくれていて、  
    とても親切。声も聞き取りやすい。
- [Java環境構築(Adoptium(旧:AdoptOpenJDK))](https://zenn.dev/sasakiki/articles/54f68ee1576380)
    &rarr; 上記 動画教材で、AdoptOpenJDKを紹介しているが、名前が変わっていて、  
    「あれ、違うぞ？」と思って、調べたら見つかったサイト。  
    とても分かりやすかった。
## 所感
- 今日は朝からバタバタしており、日中の勉強時間の確保が出来なかった。
    &rarr; 寝る前の1時間くらいで環境構築したのだけど、眠いし、目が疲れる。。。
- 環境構築（しかもJDKのインストール）のみで終わってしまった。
    &rarr; VSCodeで、Java書けるようになるところまでは進めたかった。
## 明日の予定
- 最低でも、VSCodeで、**Hello Java!** を実行出来るところまでは進めたい。
- 時間に余裕があれば、GitHubの整理もしたい。
paizaラーニング レベルアップ問題集 paizaの森練習問題コンテスト過去問題6 JavaScript 最大イニング

最大イニング (paizaランク D 相当)

https://paiza.jp/works/mondai/forest_contest_006/forest_contest_006__d_maxinning

JavaScriptで解いてみました。
降板イニングを`leave`とすると、初期値は`1 ≦ i ≦ 9`以外なら任意なので0とします。完投の時は`leave = 0`のまま、完投できなかったら`leave`に降板イニングを記録することにします。
iイニングが終わった時点で、投げた球数がkを超えていたら、iイニングで降板します。降板イニングiを`leave = i`で記録します。

iイニング終了時、球数がkちょうどだったときに考えることがあります。

>ちょうどイニングの終了時に k 球に到達した場合は、もうそのイニングが終了してしまい、投手を交代することができないため、次のイニング開始時に降板します。(入力例 3 のケース)

すなわち、投げ終わったイニングをiとすると`leave = i + 1`になります。
ただし、最終9イニングに球数がちょうどkに達したら、完投したことになり、`leave = 0`のままです。


```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const k = Number(lines[0]);//球数制限 k

let numBall = 0;//球数
let leave = 0;//降板イニング、初期値は0とする
for (let i = 1; i <= 9; i++) {
  const m = Number(lines[i]);//i イニング目の球数を表す整数 m
  numBall += m;

  //イニングが終わったときの球数がk以上なら降板
  if (numBall > k) {
    leave = i;//降板イニング
    break;//降板

  //kちょうどのとき
  //9イニングじゃなかったら次のイニングで降板、9イニングだったら完投
  } else if (numBall === k && i !== 9) {
    leave = i + 1;//次のイニングで降板
    break;//降板 
  }
}
//完投できたか(leave初期値のままか)、できない場合は何イニングで降板か
console.log(leave === 0 ? "Yes" : leave);
```
ネット・会議の取捨選択

ネット会議で、個人的にはチャットだけでよい。　

４０年ほど前から、パソコン通信のチャットだけでソフトウェアを作っていたから。　

画面を共有した方が楽だというのはよく分かる。　

よく使っているシステムを記録して、取捨選択の、その都度の方針を検討する。　

PC起動時にかってに立ち上がり、作業がなかなか始められないことがあり、順次、自動起動を切る方法を追記する予定です。

プログラマ:顔を見合わせて会議、テレビ会議、コメント・チャット。 仮説（194）
https://qiita.com/kaizen_nagoya/items/2f9d2969e8b30e12f0c1

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">プログラマ顔を見合わせ会議やだチャットで全部済ませたいです。 <a href="https://twitter.com/hashtag/%E7%9F%AD%E6%AD%8C?src=hash&amp;ref_src=twsrc%5Etfw">#短歌</a></p>&mdash; naokiakutagawa (@naokiakutagawa) <a href="https://twitter.com/naokiakutagawa/status/1586367562094637057?ref_src=twsrc%5Etfw">October 29, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

 <この項は書きかけです。順次追記します。>
# Line Works
Line Worksは、５年ほど前導入した企業の仕事をしていた。　

メンバ通しの会話なら、十分な気がする。　

ソフトウェアの不具合の管理方法は、どうしたらいいかはわかっていない。 

Line Works Windowsで自動起動を切る方法。
https://did2memo.net/2018/11/12/naver-line-windows-start-up-settings/

# Skype
６年ほど前、カーネルソースの勉強会で利用していた。　

ゲートウェイの設定との組み合わせがよくないのか、音声だけしか通らないことがあった。　

あるいは映像だけしか通らないこともあった。携帯電話で音声のやりとりをして、映像だけを写したりもした。 

## FaceTime 
macOS, iPhone, iPadの間で利用している。最近から導入済みだから。
# Teams

あまり使いこなせていない。複数のネット会議を掛け持ちする場合に、スピーカーをオフしたいのだがどのボタンを押せばいいかわかっていない。 

Windows 自動起動を切る方法
https://dekiru.net/article/18777/

# Zoom 
無料版しか利用したことがない。 
現在だと40分制限があるらしい。　

https://zoom.us/pricing?creative=627445559718&keyword=zoom%20有料&matchtype=e&network=s&device=c&zcid=6094&gclid=EAIaIQobChMIxt-Mv4L0-gIVBlVgCh2HSQ90EAAYASAAEgJhnfD_BwE

「会議は30分未満」小耳にはさんだ話。臨機応変。 
https://qiita.com/kaizen_nagoya/items/55ab43e7f50434156ff4

会議は30分未満だから40分あれば十分すぎる。 

# WebEX 
ルータ　のCISCO だから安心感はある。お値段との相談だろうか。
https://www.cisco.com/c/ja_jp/products/conferencing/index.html

一番長く使わせていただいている。直接契約したことはない。契約している組織のお手伝いで操作しているだけ。　

# Google Meet
あまり使いこなせていない。Googleを仕事で使わない方針の会社さんとの会合では使えない。　
　
## oVoice 
https://ovice.in/ja/ovice-3/

一度利用したまま、よくわかっていない。
# discord
https://support.discord.com/hc/ja

ある行事で使った。使い方がわからずに、参加者の方にお聞きした。　

たまたま、丁寧な回答をいただける方で、無事参加できた。　
https://qiita.com/karaage0703

主催したことはなく、主催者側の使い勝手もわかっていない。　

# まとめの前に　
利用方法を絞って記述予定。 

### 1. 1対1
うまくいかなければ、他の手段を取る。最悪携帯電話の番号を交換しておく。
### 2. 10人未満　
誰か、一人、システムに長けた人がいればよい。
### 3. 10人以上。
主催者側の手間がはぶけるかどうか。管理者側の操作が直感的にできるか。HELPが適切か。マニュアル類が揃っているか。
参加者が初めて利用する場合でも、直感で操作できるか。HELPが適切に表示するか。マニュアル類を整備しているかどうか。
### 4. 100人以上
ほぼ、主催者が個人を把握できない。常時、誰かが不具合が発生しているに違いない。音声が届かない、画面共有ができない、通信路が遮断しているなど、分類ごとに体系的な指示ができる体制が、ソフト側、主催者側、参加者側のどれくらいの労力負担分布があるかがわかっているとよい。無料行事で１０回くらい試してから、有料行事で使用するとよいかも。　

## メーリングリスト、掲示板、チャット
最初はyahooのメーリングリストを使っていた。　
次にサイボウズライブを使っていた。　
最近は、Gitlabを使っていた。　

Slackが無償サービスを辞めても影響はない。よかった。

２度の移行にすごく手間がかかった。それぞれ半分くらい移行できなかった。　

「会議は30分未満」小耳にはさんだ話。臨機応変。 
https://qiita.com/kaizen_nagoya/items/55ab43e7f50434156ff4

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 　20221022
ver. 0.02 短歌追記 20221029
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Windowsでzxを使うと(デフォルトでは)WSLで動く……？

zxというのがございます。こちらの記事で詳しく紹介されています。

https://zenn.dev/offers/articles/20220606-zx-introduction

google謹製の、Javascriptでシェルを扱えるやつです。

これってwindowsに入れたらcmdが扱えてbatファイルとおさらばできるのか？いやいや、そんなわけないよなあ、と調べてみるも、ググラビリティの問題なのか、単に使ってる人がいないのか、あんまり（日本語の）情報が多くない気がする。
なればと、物は試しでやってみました。

## (追記)cmdを扱う方法

コメントで教えていただきました。ありがとうございます！
以下の設定をすることでcmdが扱えるようになります(筆者はzx@8.0.2/Windows11Homeで確認)
```
$.shell = 'cmd.exe';
$.prefix = '';
$.verbose = false
```
当然ながら日本語を扱う場合は`chcp 65001`が必要です。気が向いたら別記事を立てます。

## 実験

とりあえずpowershellで作業してみます。npmでzxをグローバルインストールすると、すんなり入りました。

```bash
npm i -g zx
```


実行用のjsファイルを作ります。
`` await $`ここにコマンド` ``という書き方でシェルが実行できます。jsのテンプレートリテラルなので、変数を埋め込むと自動でエスケープしてくれたりしてべんり。
拡張子を`.mjs`にするとトップレベルで`await`が使えます。

```javascript:test.mjs
await $`echo hello, zx!`
```

実行してみましょう。
```bash
zx test.mjs
```

以下、`$`はzxから走らせたコマンドです。

```bash
$ echo hello, zx!
hello, zx!
```

お、いけたいけた。ついでにもういっちょ。

```
$ ipconfig
/bin/bash: ipconfig: command not found
Error: /bin/bash: ipconfig: command not found
    at file:///C:/Users/<ユーザー名>/Desktop/zx/test.mjs:4:8
    exit code: 127 (Command not found)
```
さすがにcmdが扱えるなんてことはなくて、bashで動いてるんですね。
**……いや、なんで？**

## WSLで動いてる？

なんでwindowsでbashが動いてるんだ？と思って、いろいろ試しました。

```bash
$ pwd
/mnt/c/Users/<ユーザー名>/Desktop/zx
```

/mntって、確かwslからwindowsを見るときのパスだったよな。WSLで動いてるのか？

試しに、wslに無いコマンドを打ってみて・・・

```bash
$ convert -size 100x100 xc:white test.png
Error: /bin/bash: convert: command not found
```

wslにconvertを入れて・・・
```bash:wsl
apt install imagemagick
```

もう一回打つと・・・？
```bash
$ convert -size 100x100 xc:white test.png
$ ls
basic1.png
test.mjs
```

なるほど。理屈はわからないけど、WSLで動いてるみたいです・・・。zxが中でなんかやっているのでしょう。
たぶんどっかには仕様が書いてあると思うんだけど、めんどくさいので調べるのはやめた。
誰か、なぜWSLで動くのか、教えてください。

WSLをインストールしてないマシンでやるとどうなるんだろう？
paizaラーニング レベルアップ問題集 paizaの森練習問題コンテスト過去問題6 JavaScript 球数制限

球数制限 (paizaランク D 相当)

https://paiza.jp/works/mondai/forest_contest_006/forest_contest_006__d_balllimit

JavaScriptで解いてみました。sliceとreduce、三項演算子で解いてみました。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, k] = lines[0].split(" ").map(Number);
const sum = lines.slice(1, n + 1).map(Number).reduce((a, b) => a + b);
console.log(sum >= k ? "No" : "Yes");
```
サクラエディタで空行をすべて削除したい場合の正規表現

いつも作業のたびにやりかたをググっている気がするので、自分用にメモを残しておきます(´・ω・`)

# TL; DR

サクラエディタを利用して、テキストファイルの空行をすべて削除したい場合、次の正規表現で置換すればよいです。

- 置換前(N): `^\r\n`
- 置換後(P): 何も入力しない

# 例

①以下のようなテキストファイルがあり、空行をすべて削除したいとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/74b4780d-901d-24f9-7e60-0134b2d2f169.png)

②まず置換機能を起動します。起動方法はメニューの「検索(S)」から「置換(R)」を選択する、もしくは、ショートカット「Ctrl＋R」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/d41d3228-2006-dfeb-d4d3-d1f2e529f02b.png)

③置換機能が起動したら以下の通り入力し、「すべて置換(A)」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/7275196c-4f79-4dad-dba4-0571a7f8491b.png)

④削除した空行の行数がポップアップとして表示されると同時に、空行がすべて削除されたことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/4bb65a5d-8e2f-73f8-e54e-c38fbcb2ef9a.png)