OmniAICreator/Qiita-1.07M huggingface dataset:
ValueDomain（CORESERVER）でワードプレスをインストールする

レンタルサーバー（CORESERVER）でワードプレスをインストールするための手順を書いていきます。

<br>
<br>
<br>

まずWordPressの利用にはMySQL（MariaDB）の作成が必要です。

CORESERVERのコントロールパネルの左メニューにある「データベース」をクリックします。
![database_signup01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/57a42a74-00bf-bc7c-dcd2-500315c003ce.png)


左メニュー右側に「MySQL（MariaDB）」「PostgreSQL」と出てくるので、「MySQL（MariaDB）」を選択し、右側にMariaDB一覧の右側にある「データベースの新規作成」をクリックします。
![database_signup03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/8c810daa-5af2-b214-2ec5-26a625e74fa4.png)

①任意のDB名（「アカウント名_」含め最大64文字まで）を入力
　※入力なしの場合、アカウント名のみで作成されます。
②パスワード（半角英数記号最大15文字まで）を設定
③「データベースを新規作成する」をクリックします。
![database_signup04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/5d9d5c20-6953-af73-6b5e-7ec481a2ab67.jpeg)

以上でデータベースの新規作成が完了しました。

<br>
<br>
<br>

次にWordPressのインストールを行います。

CORESERVERのコントロールパネルの左メニューにある「サイト設定」をクリックします。

左メニュー右側に出てくるドメインの中から、WordPressをインストールするドメインを選択します。

CMSインストールの「WordPress」をクリックします。
![wp_install02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/1bc9aa49-62eb-6ade-edd4-da6c371e2724.jpeg)

インストール先のパスを指定し、サイトからインストールするドメインを選択して、「CMSインストール」をクリックします。

WordPressのインストールが完了しました。
※反映までに5分程度かかりますので少し時間を起きて次の手順に進みます。

ブラウザからドメインへアクセスし、「さあ、始めましょう！」をクリックします。
![wp_install05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/d8023541-d6ab-3308-fa2b-5edf372e3de5.jpeg)

データベースの接続設定を入力します。
入力内容はCORESERVERのコントロールパネルの左メニューにある「データベース」をクリックし、該当のドメインを選択すると表示されます。
![wp_install06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/691f24a2-f575-af88-74a1-3a98a09aa007.png)
![wp_install07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/49ad6193-9e8c-aded-ac25-fc0c73a573a4.jpeg)

「送信」をクリックします。

「インストール実行」をクリックします。

WordPressにログインする為の必要情報を設定します。
入力後、「WordPressをインストール」をクリックします。
![wp_install08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870330/07de6f06-b03a-6090-eabd-16eb6334a5ab.jpeg)
||  |
|:--|:--:|
|サイトのタイトル| 任意のタイトルを設定します。 |
|ユーザー名 | 任意のユーザー名を設定します。|
|メールアドレス | 利用可能なメールアドレス|

<br>
<br>

WordPress側のインストールが完了しました。
「ログイン」をクリックします。

設定したユーザー名とパスワードを入力し、「ログイン」をクリックします。

WordPress管理画面へのログインが完了しました。
住所と住居番号と地番

# 概要
住所には「住居番号」と「地番」の２種類があるようです。仕事で「地番」のクレンジングに関わり調査をしたので、「何が違うの？」「なんで２種類おあるの？」といったあたりを少しまとめました。

# 住居番号と地番の違い
それぞれの定義は以下の通り。

## 住居番号
「住居表示に関する法律」に基づいて住居表示エリアとして指定されたエリアの建物に付与される番号。市町村が管理。私たちがよく目にしているのはこちらが多いと思われます。

https://ja.wikipedia.org/wiki/%E4%BD%8F%E5%B1%85%E7%95%AA%E5%8F%B7
 
## 地番
土地の登記、売買の際に用いられる、土地に付与される番号。法務省が管理。

https://ja.wikipedia.org/wiki/%E5%9C%B0%E7%95%AA

# なぜ２種類あるのか

もともとは地番しかなかったようですが、土地の併合や分割を繰り返すうちに番号が不規則になってしまい配達に使いづらくなったため、住居番号という新たな住居表示を利用するようになったそうです。

https://www.city.sapporo.jp/shimin/koseki/jukyo-hyoji/chiban.html

# なぜ地番が住所につかわれるのか？

どうやら住居表示を採用していない市町村もあるようで、そこでは地番を住所として利用しているそうです（例：京都府南丹市など）。なのでそういうエリアにお住まいの方は住所として普段から「地番」を見られているはずです。

# まとめ

住所は人が住んでいる場所を示すもので、住居表示エリアであれば住居番号が住所として利用され、エリア外であれば地番が住所として利用されるようです。そして地番は人が住んでないエリアでも登記登録があれば付与されているのでより広いエリアをカバーしているみたいです。
【Sonic Pi】リングバッファを用いてドラムを何拍目に鳴らすか直感的に指定する

# はじめに

Sonic Piにおいてドラムのビートを直感的に指定したい。
何拍目を音符にして何拍目を休符にするかを簡単にカスタマイズしたい。


# まずはサンプルコード

```ruby
live_loop :hihat do
  if 'x-x-x-x-xxxxx-x-'.ring.tick == "x" then
    sample :drum_cymbal_closed
  end
  sleep 0.25
end
```
4/4拍子の曲を想定としている。このコードでは4小節分のハイハットシンバルの音を指定している。
これは1, 3, 5, 7, 9, 10, 11, 12, 13, 15拍目に`:drum_cymbal_closed`の音を鳴らすコードである。

例えば
```ruby
if 'x-x-x-x-xxxxx-x-'.ring.tick == "x" then
```
の箇所を
```ruby
if '-x-x-x-x-x-x-x-x'.ring.tick == "x" then
```
とすると、偶数拍で音が鳴るようになる。

'x'と'-'を入れ替えると音符と休符が入れ替わり、直感的にビートをカスタマイズすることができる。

# 解説

### ring

`SonicPi::Core::RingVector`というリングバッファを作成する。
これにより文字列をリングバッファに変換する。

```ruby
puts '12345678'.ring
```
上記の出力は
```ruby
(ring "1", "2", "3", "4", "5", "6", "7", "8")
```
である。


また、リングバッファは、指定したインデックスの値をバッファのサイズで割った余りをインデックスとして扱う。
```ruby
puts '12345678'.ring[2]
puts '12345678'.ring[11]
```
上記の出力は
```ruby
"3"
"4"
```

である。

### tick

tickは呼び出されるたび、デフォルトのtickの値をインクリメントし、値を返す。

```ruby
puts tick
puts tick
puts tick
puts tick
```
上記の出力は
```ruby
0
1
2
3
```
である。tick値はlive_loopごとに独立して存在している。
そのため、tickを呼び出す際に、他のlive_loopへの影響を気にする必要はない。

また、`tick_reset`や`tick_set`でtick値を操作することも可能である。

### まとめ

もう一度サンプルコードを示す。

```ruby
live_loop :hihat do
  if 'x-x-x-x-xxxxx-x-'.ring.tick == "x" then
    sample :drum_cymbal_closed
  end
  sleep 0.25
end
```


Sonic Piのringとtickを組み合わせて用いることにより、このような直感的な記述が可能となる。
リングバッファはループ演奏と相性がいいため、積極的に取り入れていきたい。

# さいごに
間違いや改善等ありましたら、コメントいただけますと大変嬉しいです！

# 参考

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

https://ja.wikipedia.org/wiki/リングバッファ
JavaScriptで平仮名(ひらがな)を判定する

正規表現を使い、文字列が平仮名か否かを判定します。
以下のように判定できることを目指します。
```javascript
regex = /*ここに何らかの正規表現*/;
regex.test("あいうえお");
// -> true
regex.test("あぁ");
// -> true
regex.test("aiueo");
// -> false
regex.test("あいueo");
// -> false
regex.test("あい うえお");
// -> false
```
3つの方法を紹介します。
1. **[Unicodeプロパティを使う](#1-unicodeプロパティを使う)**
1. **[Unicodeエスケープシーケンスを使う](#2-unicodeエスケープシーケンスを使う)**
1. **[平仮名を使う](#3-平仮名を使う)**
 
:::note warn
[注意事項](#注意事項nanto_viさんのコメントより引用)や、コメント欄もお読みください。
:::

# 1. Unicodeプロパティを使う
これが最もスマートです。
現在では殆どの環境でUnicodeプロパティをサポートしているので、気にせず使えます。ええ時代や。
```javascript
regex = /^[\p{scx=Hiragana}]+$/u;
```
↑だけであれば、`[` `]`は省略できます。
```javascript
regex = /^\p{scx=Hiragana}+$/u;
```
:::note warn
ちなみに、この方法では鍵括弧や句読点にもマッチしてしまいます。
[注意事項](#注意事項nanto_viさんのコメントより引用)をご参照ください。
:::

参考: UNICODE REGULAR EXPRESSIONS - Unicode® Technical Standard 
> - gc: [General Category Property](https://unicode.org/reports/tr18/#General_Category_Property)
> - sc: [The Script Property](https://unicode.org/reports/tr24/#Script)
> - scx: [The Script_Extensions Property
](https://unicode.org/reports/tr24/#Script_Extensions)

# 2. Unicodeエスケープシーケンスを使う
Unicodeにおける平仮名の範囲は`U+3041`-`U+3093`ですので、以下のようになります。
```javascript
regex = /^[\u3041-\u3093]+$/u;
```


# 3. 平仮名を使う
Shift-JISでもUTF-8でも、平仮名の範囲は`ぁ`-`ん`ですので、そのまま`[ぁ-ん]`とする方法です。
旧石器時代から使われています。直感的ですわ<font color="Red">ぁ〜ん</font>。
```javascript
regex = /^[ぁ-ん]+$/u;
```

# 注意事項(@nanto_viさんのコメントより引用)
[`1. Unicodeプロパティを使う`](#1-unicodeプロパティを使う)のマッチングについて
> また、\p{scx=Hiragana}だと鍵括弧や句読点にもマッチするので、用途によってはscx（Script_Extensionsプロパティ）ではなくsc（Scriptプロパティ）を使って[\p{sc=Hiragana}ー]（「ひらがな」文字体系および長音符）くらいが適しているかもしれません。

[`2. Unicodeエスケープシーケンスを使う`](#2-unicodeエスケープシーケンスを使う)および、
[`3. 平仮名を使う`](#3-平仮名を使う)のマッチングについて
>また、[\u3041-\u3093]でも[ぁ-ん]でも「ゔ」などの文字が含まれないので、用途によってはそうした文字を含めるようにしてもよいかもしれません。

# まとめ
**[Unicodeプロパティ](#1-unicodeプロパティを使う)最強。**
`scx=Katakana`とすれば`カタカナ`を指定できたりと、つよつよすぎてこれしか使えない体にされてしまいました。
しかし、現在でも[`3.`](#3-平仮名を使う)の方法で学ぶことが多いようです。

Unicodeプロパティの便利さが世に広がるといいな。
> 参考:
> [[正規表現] Unicode 文字プロパティ (01) -- 概要 - @hachi8833 さんの記事](https://qiita.com/hachi8833/items/22d21d03827dfd5fbed1)
> [JavaScriptで扱えるUnicodeプロパティ一覧 - @BlueSilverCat さんの記事](https://qiita.com/BlueSilverCat/items/3b27be62a359592f40e5)

# Special Thanks - 謝辞
順不同

@nanto_viさん
いただきましたコメントを参考に、記事の内容や、表現を一部編集させていただきました。
大変有益なコメント/ご指摘、ありがとうございます！

@jack-lowさん
タイポのご指摘ありがとうございます！
gitのコミットメッセージにissue番号を自動付与する

# 概要
GitHubではコミットメッセージにissue番号が入っていると、コミットメッセージがissueにも表示されるようになる。

開発を続けていくとコード上の変更がなぜ行われたかがわからなくなることがある。
その際にコミットメッセージだけではなく、元issueも参照できると変更理由やそれに伴うレビュー内容が追跡しやすくなる。
そのため、コミットメッセージにissue番号を自動付与する仕組みを導入する。

# 前提条件
ブランチ名は issue-【issue番号】-【任意の文字列】とする。
（実際は-【番号】-だけで抜き出せたりもするが一応そんなルールに
例：
　issue-15-add-aspell
　issue-18-

# 導入方法
該当プロジェクトの`.git\hooks\commit-msg`を以下の通りとする

```.git\hooks\commit-msg
#!/bin/sh

#ブランチ名を取得
Branch="$(git branch --show-current)"

#正規表現でブランチ名からissue番号を取得
RequestNo="$(echo $Branch | sed -e "s/.*\-\([0-9]*\)\-.*/\1/g")"

#コミットメッセージの最初にチケット番号を追加する
mv $1 $1.tmpbycommit-msg
echo -n "#$RequestNo " > $1
cat $1.tmpbycommit-msg >> $1
```

# こんな感じ
GitHub上でcodeをblameで見ると…
![Screenshot_190.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217092/ddc60baf-8535-8424-6912-3c0d25f34b1a.png)
となっているので、どのissueで対応したブランチなのかがすぐわかる
いす作りで考えるfactory methodパターン

factoryを使わないパターン
①いす職人にウォールナットの木材で椅子を作るよう指示

factoryを使うパターン
①ウォールナット材職人に木材用意するよう指示
②いす職人に指定の木材職人から渡された木材で椅子を作るよう指示
※どんな木材かは意識しない。

登場クラスと紐づけ
iSample・・・広義の木材
Sample・・・ウォールナット材
iCreator・・・広義の木材職人
Creator・・・ウォールナット材職人
Logic・・・いす職人


プログラム
```java
class Sample implements ISample {
}
interface ISample {   
}
interface ICreator {
    public ISample create();
}
class Creator implements ICreator{
    @Override
    public ISample create() {
        return new Sample();
    }
}
class Logic {
    private ICreator creator;
    Logic(ICreator creator) {
        this.creator = creator;
    }
    void doLogic() {
        ISample s = creator.create();
    }
}
public class Outer {
    public static void main(String[] args) {
        Logic l = new Logic(new Creator());
        l.doLogic();
    }
}
```
ひのき椅子を作らせたい場合、プログラムを以下のように対応する
・ひのき材(hSample)を追加
・ひのき材職人(hCreator)を追加
・いす職人に引き継ぐ職人をウォールナット職人⇒ヒノキ職人に差し替える(new Logic(new hCreator())


参考にしたサイト
https://blog.ecbeing.tech/entry/2021/01/20/114000
Elixirから覚えるJavaScript 〜Arrayで追加と取出し〜

僕は普段はElixirを使ってます
必要になったのでJavaScriptの勉強をはじめました
題名はElixirから覚えるJavaScriptですが、逆もできるかも？

今日はJavaScriptではArrayで追加と取出しを見てみたいと思います
※ElixirはList

お題
a)、[1, 2, 3, 4, 5]に値を追加して[1, 2, 3, 4, 6]にする、そして元の変数の影響を調査
b)、[1, 2, 3, 4, 5]を先頭の要素1と後ろの要素[2, 3, 4, 5]に分割する


# a)、[1, 2, 3, 4, 5]に値を追加して[1, 2, 3, 4, 6]にする、そして元の変数の影響を調査
## Elixir

```elixir
x = [1, 2, 3, 4, 5]
y = x ++ [6]       
IO.inspect(x)
IO.inspect(y)
```

```elixir:実行結果
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
```

## JavaScript

```javascript
x = [1, 2, 3, 4, 5]
y = x.push(6)
```

```javascript:実行結果
[ 1, 2, 3, 4, 5, 6 ]
6
```

想像していた動きと違ったのでElixirと同じ結果を求めたい

```javascript
x = [1, 2, 3, 4, 5]
y = [...x]
y.push(6)
console.log(x)
console.log(y)
```

```javascript:実行結果
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5, 6 ]
```

## JavaScript別の方法（こっちのほうが求めている答え）
@mnishiguchiさんに教えてもらいました
ありがとうございます

```javascript
x = [1, 2, 3, 4, 5]
y = x.concat(6)
console.log(x)
console.log(y)
```

```javascript:実行結果
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5, 6 ]
```


# b)、[1, 2, 3, 4, 5]を先頭の要素1とに後ろの要素[2, 3, 4, 5]に分割する
## Elixir

```elixir
x = [1, 2, 3, 4, 5]
[h | t] = x        
IO.inspect(x)
IO.inspect(h)
IO.inspect(t)
```

```elixir:実行結果
[1, 2, 3, 4, 5]
1
[2, 3, 4, 5]
```

## JavaScript

```javascript
x = [1, 2, 3, 4, 5]
[h, ...t] = [1, 2, 3, 4, 5]
console.log(x)
console.log(h)
console.log(t)
```

```javascript:実行結果
[ 1, 2, 3, 4, 5 ]
1
[ 2, 3, 4, 5 ]
```


無事に同じ結果になりました

https://qiita.com/t-yamanashi/items/263b53d889dc5f7ddf17
【Golang】日付の月を数値で取得する

## 結論

```go:main.go
package main

import (
	"fmt"
	"time"
)

func main() {

    // Januaryなどの英語表記で取得
    targetMonthString := time.Now().Month()
    fmt.Println("targetMonthString: ",targetMonthString)

    // 1や2などの数値で取得
    targetMonthInt := int(time.Now().Month())
    fmt.Println("targetMonthInt: ",targetMonthInt)
}
```

```実行結果
~/go/src/jikken$ go run main.go
targetMonthString:  January
targetMonthInt:  1
```
envファイルの内容をグローバル変数として定義する

## 環境

- macOS 13.1
- rustc 1.65.0

### 他言語のようには定義できない...

Pythonの場合

```python:constants.py
import os
from dotenv import load_dotenv

load_dotenv()

XXX = os.getenv("XXX")
```

Rustで書こうとするとPythonのようには書けません。

```rust:constants.rs
use std::env::{self, VarError};

pub static XXX: Result<String, VarError> = env::var("xxx");
```

```sh
error[E0015]: cannot call non-const fn `std::env::var::<&str>` in statics
  --> src/constants.rs:36:45
   |
36 | pub static XXX: Result<String, VarError> = env::var("xxx");
   |                                            ^^^^^^^^^^^^^^^
   |
   = note: calls in statics are limited to constant functions, tuple structs and tuple variants
   = note: consider wrapping this expression in `Lazy::new(|| ...)` from the `once_cell` crate: https://crates.io/crates/once_cell
```

[E0015](https://doc.rust-lang.org/error_codes/E0015.html)の詳細を読み解くと、定数として定義する場合は初期化する際にconstant expressionを用いた方法でないといけないとあり、`env::var("xxx")`はconst functionではないためこのようには定義できません。

これを修正できる案として、エラーメッセージに以下の内容が書いてあります。

```sh
   = note: consider wrapping this expression in `Lazy::new(|| ...)` from the `once_cell` crate: https://crates.io/crates/once_cell
```

`once_cell`は`lazy_static`に取って代わるクレートで、`lazy_static`はマクロを用いるのに対し、`once_cell`はマクロを用いずに以下のように書けます。

```rs:constants.rs
use std::env;
use once_cell::sync::Lazy;

pub static XXX: Lazy<String> = Lazy::new(|| env::var("xxx").unwrap());
```

一つの変数を読み取るのであれば上記方法をとってもいいかもしれませんが、複数の変数を読み取るのであれば`Config`クレートも一緒に使う方が楽かもしれません。

### envファイルの内容をグローバル変数として定義する

#### 使用するクレイト

```toml:Cargo.toml
dotenv = "0.15.0"
serde = "1.0.151"
config = "0.13.3"
once_cell = "1.17.0"
```

### envファイル

```env:.env
xxx="hello from .env"
```

#### コード

```rs:constants.rs
use config::ConfigError;
use dotenv::dotenv;
use once_cell::sync::Lazy;
use serde::Deserialize;

#[derive(Deserialize)]
pub struct Config {
    // .envファイルから読み取る値をフィールドに定義する
    pub xxx: String,
}

impl Config {
    // 環境変数よりConfigを作成し、返却する
    pub fn from_env() -> Result<Self, ConfigError> {
        let cfg = config::Config::builder()
            .add_source(config::Environment::default())
            .build()?;

        cfg.try_deserialize()
    }
}

pub static CONFIG: Lazy<Config> = Lazy::new(|| {
    dotenv().expect("Cannot find .env file");
    Config::from_env().expect("Failed to load config")
});
```

### 参考

https://qiita.com/tiohsa/items/d694dfbfce52da09ea53

https://zenn.dev/frozenlib/articles/lazy_static_to_once_cell

https://crates.io/crates/lazy_static

https://crates.io/crates/once_cell
pexpectを使った自動化プログラミング

# pexpectを使った自動化プログラミング

pexpectはPythonでインタラクティブなプログラムを自動化するためのモジュールです。本記事では、pexpectの基本的な使い方、応用例、類似モジュールとの違いを説明します。

## pexpectとは

pexpectはPythonでインタラクティブなプログラムを自動化するためのモジュールです。コマンドを実行して、入力を受け取るなど、インタラクティブなプロセスを自動的に処理できます。

## 主な用途

pexpectを使用すると、インタラクティブなプログラムを自動化できます。テスト自動化、サーバー設定の自動化、インストールスクリプトの自動化など、様々な用途に使用できます。

## コーディング例1

pexpectを使用するためには、まず以下のようにインポートします。

```python
import pexpect
```

次に、pexpectを使用してコマンドを実行します。

```python
child = pexpect.spawn('/bin/bash')
child.expect('$')
child.sendline('ls -l')
child.expect('$')
print(child.before)
```

## コーディング例2

ユーザー入力を受け取る場合は、expect_exact メソッドを使用します。

```python
import pexpect
child = pexpect.spawn('/bin/bash')
child.expect('$')
child.sendline('echo "Hello!"')
child.expect_exact('Input your name:')
child.sendline('John')
child.expect('$')
print(child.before)
```

## コーディング例3

pexpectを使用すれば、データを受信して処理したり、処理結果を受信してファイルに保存することもできます。

```python
import pexpect
child = pexpect.spawn('/bin/bash')
child.expect('$')
child.sendline('curl http://example.com/data.json')
child.expect('$')
with open('data.json', 'w') as f:
    f.write(child.before)
```

## 類似モジュールとpexpectとの違い

似たようなモジュールとして、subprocessやparamikoなどがあります。subprocessはPythonから外部プロセスを実行し、入出力を行うためのモジュールです。paramikoは、SSHを使用してリモートマシンに接続して、コマンドを実行したり、ファイルを転送したりするためのモジュールです。一方、pexpectは、インタラクティブなプロセスを自動的に処理するためのモジュールです。

## まとめ

pexpectを使用すると、インタラクティブなプログラムを自動化することができます。様々な用途で使用でき、類似モジュールとの違いを理解することで、より効果的なプログラミングを行うことができます。
class with final

finalをつけたクラスはextendsできない
```java
final public class SampleFinalClass {
    int i;
    void method(){};
}
public class SampleSubClass extends SampleFinalClass {
    int i;
}
```
```
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project mavenproject1: Compilation failure
com/mycompany/mavenproject1/SampleSubClass.java:[11,37] final com.mycompany.mavenproject1.SampleFinalClassからは継承できません
```
トピックブランチの作成から削除まで

コードの修正を行う場合、トピックブランチを作成してそこで作業を行う。
トピックブランチの作成から削除までで使うコマンドをまとめる。

使用ツール：
GitLab

#### トピックブランチの作成　

**トピックブランチ**をmasterブランチから作成する。
```
$ git switch -c ○○○○　←トピックブランチの名前
```
このコマンドを実行することで、ブランチの作成＆作成したブランチへの移動を行うことができる。
```
$ git branch
```
ブランチがきちんと作成されているか確認する。
作成したブランチ名と、その名前の前に* がついていることが確認できればOK

#### トピックブランチをプッシュする

トピックブランチをリモートへプッシュする。
```
$ git push origin ○○○○　←トピックブランチの名前
もしくは
$ git push origin HEAD 
```


<br>

`コード修正の流れ`
1. 修正したいブランチからトピックブランチを作成する
1. 修正したコードをリモートのトピックブランチにプッシュする
1. トピックブランチを元のブランチにマージする<br>※GitLab上でマージリクエストを新規作成を行う。
1. 担当者にマージリクエストを承認してもらう

マージが完了したら、適宜ローカルにプルすること
また、マージが完了した時点で、基本的にはリモートにプッシュしたトピックブランチは削除されるが、ローカルのブランチは削除されない。
そのため自分で削除する必要があるが、必要に応じて残しておいても良い。

#### ローカルブランチ削除コマンド
```
$ git branch -d　○○○○　←トピックブランチの名前
```
<br>
<br>
【Swift】画面の明るさを強制的に変更する

# はじめに
PayPayをよく使うのですが、QRコードを表示する際に画面が強制的に明るくなるのでどうやるのか気になって調べてみました。

# サンプルアプリ
動画だと画面の明るさが変わってるのがわからない。。。
![Simulator Screen Recording - iPhone 14 - 2023-01-05 at 19.33.59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/2a75691e-5db3-d630-f1c1-b6673f425032.gif)

:::note warn
**注意**
実機でのみ画面の明るさが変わっていることを確認できます。
:::


# 実装
```swift:ContentView
import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationStack {
            NavigationLink {
                QRCodeView()
            } label: {
                Text("QRコードを表示する")
            }
        }
    }
}
```
```swift:QRCodeView
import SwiftUI

struct QRCodeView: View {
    private let brightness: CGFloat = UIScreen.main.brightness
    var body: some View {
        Image("qrcode")
            .resizable()
            .scaledToFit()
            .frame(maxWidth: .infinity)
            .onAppear {
                UIScreen.main.brightness = 1.0
            }
            .onDisappear {
                UIScreen.main.brightness = brightness
            }
    }
}
```

# 解説
以下のコードで画面の明るさをMAXにしています。
```swift
UIScreen.main.brightness = 1.0
```
以下のコードで遷移前の画面の明るさを保管しています。
```swift
private let brightness: CGFloat = UIScreen.main.brightness
```
以下のコードで画面の明るさを元に戻しています。
```swift
UIScreen.main.brightness = brightness
```

# おわり
今度は強制的に音量を上げるについて調査してみたいです。
PayPayは音量が0でも「ペイペイッ！」だけ爆音でなるのでどうやってるのかかなり気になります。

# 参考記事
https://igasu.net/brightness/
ModelSim、リスタート操作をキーボード一撃で実行する

# 概要
ModelSimでシミュレーションをする際に頻繁に使用する、「シミュレーションのリスタート」。
デフォルト設定では、マウスでボタンを押すしかないので少々面倒です。

といういうことで、操作が早くできるようにキーボードショートカットの割り当て方法を紹介いたします！


# キーボードショートカットの割り当て方法

メニューから「Window⇒keybord Shortcuts…」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/3f64c3f9-55dd-8fee-c0f7-bb6f40f78f7e.png)

これでシミュレーションリスタートを「Ctrl＋R」で呼び出せます！
W&Bの使い方に関する良記事まとめ

[W&Bの使い方 github](https://github.com/MLHPC/wandb_tutorial)
[W&Bを使ってみる qiita](https://qiita.com/daikiclimate/items/96bd784170582651651b)
[5行でかっこいい可視化を　qiita](https://qiita.com/Yu_Mochi/items/4fc283ebc31225d4e106)
[深層学習のハイパーパラメータをRay Tuneで最適化](https://qiita.com/_akisato/items/f2bdbe37df5dffc883fc)

[Weights & Bias の使い方[note]](https://note.com/npaka/n/ne1e5112a796a)
https://reminiscent-airboat-0be.notion.site/8a756ad691274b3e885508bad67987ab?pvs=4
AWSについて簡単に解説してみた①(学習まとめ)

今回は、(珍しく)時流に乗って、「Amazon-Web-Service」＝「AWS」について解説していきます。
早速、行ってみましょう！～～。

AWSを利用するにはまずアカウントを作成しなければなりませんが、その際、ルートユーザーが設定されます。
ルートユーザーとは、AWSを利用するための最上位のアクセス＆利用権限を伴ったロールのことです。
※通常はIAMと呼ばれる仕組みに則ってアクセス＆利用権限をユーザーごとに設定しなければならない。
※ルートのロールが悪意ある者に乗っ取られると、当然、不正にサーヴィスが利用されて料金が発生してしまう。
※また、AWS上で稼働・運用しているアプリやシステムが持つ全ユーザーの個人情報なども窃取・破壊されてしまう。

AWSには４つの利用プランが用意されており、ユーザーのニーズや目的に合わせてプランを選択できます。
利用プランには、「ベーシック」「ディヴェロッパー」「ビジネス」「エンタープライズ」の４つがあります。
※ベーシックのみ無料。有料プランでは技術的サポートを受けられる。

AWSを利用するにはブラウザーを用いてアクセスする方法と、AWS-CLIを用いてアクセスする方法と、
「Ruby」「Python」「Java」「Go」「PHP」などの言語で書かれたプログラムからアクセスする方法の３つがあります。
※各言語プログラムからAWSにアクセスするには、AWS-SDKを用いる必要がある。

AWSにはリージョンと呼ばれる仕組みがあり、利用するAWSのクラウドサーヴァーを世界中の地域から選択できます。
さらに、リージョン内にはAZがあり、これは各リージョン内に設置されている利用可能なサーヴァー群のことです。
※世界中の各リージョンは、プライベートネットワークで結ばれていて、各リージョン間で通信や連携ができる。
※このプライベートネットワークは非常に高速であり、トラフィック(＝データ通信内容)は暗号化される。
※「AZ」＝「アヴェイラビリティーゾーン」。
※特に商業目的でAWSを利用する場合には、障害・災害対策のために複数のAZを利用するのが常道。
※この考え方を「Design for Failure」と呼ぶ。

AWSでは、「コンピュート」「ストレージ」「ネットワーク」、
「データベース」「セキュリティー」の５つの部分的サーヴィスが提供されています。
※ユーザーは、これらのサーヴィスを適宜組み合わせてアプリなりシステムを構築する。
※AWSの利用料金は従量課金で「(サーヴァーの規模に応じて変わる)利用料」×「利用時間」で決まる。時間は１時間単位。
※ただし、リージョン外に向かうネットワークトラフィックの量や、ストレージの容量によっても料金が変わってくる。

AWSのサーヴァーは仮想サーヴァーであり、物理サーヴァーを仮想化技術を使って複数のユーザーが分有・共用します。
※AWSのサーヴァー仮想化技術は、「Amazon-Elastic-Compute-Cloud」＝「EC2」と呼ばれる。
EC2では、各仮想サーヴァーが「インスタンス」と呼ばれる単位で管理されます。
このインスタンスは、「AMI」「スペック」「配置ネットワーク」「ストレージ容量」「アクセス許可」で構成されます。
※「AMI」＝「Amazon マシンイメージ」。
※「スペック」とは、サーヴァーの規模といって良い。
※「アクセス許可」では、仮想ファイアウォール機能を管理する。これは、セキュリティーグループを用いて設定する。
※セキュリティーグループでは、インバウンド(＝EC2への通信)とアウトバウンド(＝EC2からの通信)のルールを決める。
※このルールは、トラフィックを許可するネットワークとポートで構成される。

AWSでは、アプリやシステムの使用するリソースやマシン負荷に応じて、サーヴァーの規模を自動でスケールします。
※AWSのサーヴァー規模をオートスケールする技術は、「Amazon-EC2-Auto-Scaling」＝「Auto-Scaling」と呼ばれる。

以上が解説となります。
今回は(珍しく)気合を入れて記事を書いてみました～～。
また、AWSの５つの部分的サーヴィスについて別の記事で解説していきたいと思います。
乞うご期待！。それではまた～～。
光ファイバー/SFPについて

光ケーブル周りについてうろ覚えだったのでメモ。

## 光ケーブルの種類 ##

* 1Gbps光ファイバー
・1000BASE-SX：マルチモードケーブル （550m）
・1000BASE-LX：マルチモードケーブル（500m前後）シングルモードケーブル（5 - 10km前後）
メタルケーブル
・1000BASE-T：（100m）

* 10Gbps光ファイバー
・10GBASE-SR：マルチモード光ケーブル （300m）
**・10GBASE-LR：シングルモード光ケーブル （10km）**　← コアSWから建屋SW間ではよく使用される。
メタルケーブル
・10GBASE-T：（100m）

シングルモードの10GBASE-LRケーブルは1G,10G両方を兼ねることが出来る。
マルチモードのケーブルは1G,10Gで別の規格になるのでケーブルを変える必要がある。

### 違いが分かりやすかった参考サイト↓↓ ###

https://blogs.itmedia.co.jp/komata/2013/08/post-6143.html


## モード毎の特徴 ##

マルチモードのケーブルはシングルモードのケーブルに比べて安価。
だが距離が短いのも特徴。300mくらい

シングルモードのケーブルはマルチモードのケーブルに比べて高価。
だが長距離を伝達できる。5～10Kmくらい



## 光ケーブルのコネクタの種類 ##

SCコネクタ	
標準的な光ケーブルの端子。
LANなどで使われ光パッチパネルなどでよく用いる。


LCコネクタ
構内配線などで使われSWへの接続によく用いる。


## SFPトランシーバの種類 ##
SFP (Small Form Factor Pluggable)ポートはUTPケーブルや光ケーブルなど
様々な規格に対応できる為にある。


SFPトランシーバは1Gケーブルなら1G用のSFPを、10Gケーブルなら10Gに対応したSFPを用意する必要有り。
tecoGANをtensorflow 2系に書き換えた

Colaboratoryでtensorflow 1系へのサポートが終わっていたので、2系に書き換えた。

## TecoGAN 
TecoGANについてはこちらから
https://qiita.com/kannkyo/items/4d515ca988f536fadf44

# Tensorflow 2系への書き換え
## 自動書き換え

>まずは1系から2系への自動アップデートスクリプトを行った。
https://www.tensorflow.org/guide/migrate?hl=ja


`lib/ops.py`と`main.py`が対象となる
```
!tf_upgrade_v2 \
  --intree ./ \
  --outtree ./ \
  --reportfile report.txt


!tf_upgrade_v2 \
  --intree ./lib/ \
  --outtree ./lib/ \
  --reportfile report_lib.txt
```
ただ、これだけだと動かないので色々書き換える
## 手動書き換え
上記で直りきらなかった部分を治していった結果を覚えている限り書く

### tf_slim
`tensorflow.contrib.slim`が無くなっていた。調べたところ新たに`tf_slim`に置き換わったみたいなので、こちらに書き換えた。該当コードは`main.py`の21行目あたりと`lib/ops.py`の2行目
```diff_python
+ import tf_slim as slim
- import tensorflow.contrib.slim as slim
```
もちろん`tf_slim`はインストール
```
!pip install tf_slim
```

### tensorflow_addons

`tensorflow.contrib`が2系から無くなったみたいなので、どこに移行されたのか調べていたらここに行きついた。該当コードは216行目当たり
https://www.tensorflow.org/addons/api_docs/python/tfa/image/dense_image_warp

```diff_python
+ import tensorflow_addons as tfa
+ pre_warp_hi = tfa.image.dense_image_warp(pre_gen, gen_flow)
- pre_warp_hi = tf.contrib.image.dense_image_warp(pre_gen, gen_flow)
```

### eager execution を無効化
eager executionの意味を調べたところ切実な実行らしい。このままだと
```
inputs_raw = tf.compat.v1.placeholder(tf.float32, shape=input_shape, name='inputs_raw')
```
のところでエラーが生じる。`tf.compat.v1`は2系で無理矢理1系を使う形だから切実に実行しようとするとダメ？

```diff_python
import tensorflow_addons as tfa
+ tf.compat.v1.disable_eager_execution()
```
これを追加してeager execution を無効化する。

## 結果
coraboratoryでtecoGANを動かせた!
OpenPLC用 Arduino UNO用テストベンチボードを作ってみました Runtimeもマイコンボードに実装

数時間前に
[OpenPLC用 Arduino UNO用テストベンチボードを作ってみました ラダープログラム編](https://qiita.com/kaz19610303/items/a2d347defd7e2b6ecd04)  
を投稿しました。
その記事では、**Arduino UNO**と**indows runtime** で**OpenPLC**を動かしていたために、
Arduino UNO 単体では動きませんでした。

公式ページに
[1.5 INSTALLING OPENPLC RUNTIME ON MICROCONTROLLERS](https://openplcproject.com/docs/installing-openplc-runtime-on-arduino-and-other-platforms/)  
の記事があったのでRuntime自体もマイコンボードに組み込めると思い試行錯誤してみました。
なんせ情報が少なくて(泣)

前回の記事で使ったラダープログラムで試してみました。
公式ページの英語の記事を翻訳ソフト(DeepL)を翻訳すると
「OpenPLC ランタイムは、移植性を考慮して設計されました。そのコアは純粋な C で記述されているため、多くの異なるハードウェア プラットフォームに移植できます。Windows や Linux などの最も一般的なオペレーティング システムには、実行可能なアプリケーションとしてランタイムを展開する、すぐに使用できるインストーラーがあります。本格的な OS を持たない組み込みシステムの場合、ランタイムを PLC プログラム自体の一部として展開する必要があります。OpenPLC Editor は、公式にサポートされているすべてのボードでこのタスクを非常に簡単にします。PLC プログラムを Arduino 互換ボードに展開する準備ができたら、上部のツールバーにある Arduino アイコンをクリックするだけです。」
と言うことなので、とりあえず**Arduinoアイコン**をクリックしてみました。
(初めて**Arduinoアイコン**をクリックした場合はこの画面が表示されるまで結構な時間がかかります)
![2023-01-05 (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/94cbfbb1-b27c-8e3b-25c9-1dc92d94b643.png)
Board Typeやシリアルポートの設定をして
Uploadボタンを押しましたが、エラーが出ました。
**__IX100_0** に関してのエラーぽいので
多分ビット![2023-01-05 (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/e4a603ff-5052-a4d1-6f95-fc0aabae9425.png)
設定の **%IX100.0** と関係がありそうですが、ソース上どこで設定してあるのかわかりません。
![2023-01-05 (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/3319a59e-201c-7fbb-2525-fc50bb7ec926.png)
良く分からないまま、**%IX100.Xを%IX000.X**に、**%QX100.Xを%QX000.X**に変更したらこのエラーは無くなりました。ただ次は **__IW100** でエラーです。
同じように
**%IW10Xを%IW00X**に、**%QW10Xを%QW00X**に変更したらエラーが無くなり**アップロード**も成功しました。
![2023-01-05 (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/de7cb5bf-0b34-355a-07c8-3e95861323f9.png)

そして、**Windows runtime**を必要とせず**Arduino UNOボード**だけでラダープログラムが走りました。

良く分からないままに、とりあえず動いたという感じですが、マイコンボード単体だけで、
PLCプログラムが動くので実用に一歩近づいたと思います。
それにたくさんのマイコンボードをサポートしているみたいなので、他のボードに関しても検証しようと思っています。
![2023-01-05 (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/ab074e67-a431-04cd-5467-f80554a7ddb9.png)

参考までに変更した入出力の設定です。
![2023-01-05 (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/ab074e67-a431-04cd-5467-f80554a7ddb9.png)


分かり辛いですが、単体で動作している写真です。
IX000.0をON
![IMG-0968.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/b5ee798d-789f-1836-c7df-f4fabda033e5.jpeg)
IX000.3をON
![IMG-0969.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/4a9a81c3-66f3-1762-b12f-46e273593be4.jpeg)
アナログ入力とアナログ出力
![IMG-0953.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/9cccffa1-624b-f7ca-fb00-db16d037b095.jpeg)

ただ情報が少ないので、何らかの情報をお持ちの方は教えてください。

2023年1月9日追記
入出力の設定ですが
[公式のドキュメント 2.4 PHYSICAL ADDRESSING](https://openplcproject.com/docs/2-4-physical-addressing/)  
に記載がありました。
![スクリーンショット 2023-01-09 132450.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/5eeea9af-fb66-f655-bbfc-75f2f17ad8c0.png)

**%IX000.0**と書いても動いていましたが正しくは **%IX0.0** でした。
【Go+gorm】sql.Openとmysql.Openの違い

# はじめに
gorm.Openの第一引数にデータベース接続情報をもったsql.Openの返り値を渡せないことが気になりました。
正しくはmysql.Openを渡してあげることになるのですが、名称も似ていてよく分からなかったので調べてまとめてみます。
```
gorm.Open(mysql.Open(dbConn), &gorm.Config{})
```

# 結論
そもそも返り値の型や数が違いました

# sql.Openとmysql.Openの違い

sqlパッケージの公式ドキュメントでは以下のように定義されていました

```sql.Open
func Open(driverName, dataSourceName string) (*DB, error)
```

一方、mysqlパッケージの公式ドキュメントでは以下のように定義されていました

```mysql.Open
func Open(dsn string) gorm.Dialector
```

また、gormパッケージの公式ドキュメントでは以下のように定義されていました
第一引数のDialector型はmysql.Openの返り値であるgorm.Dialector型で満たすことができます

```gorm
func Open(dialector Dialector, opts ...Option) (db *DB, err error)
```

# おわりに
パッケージの公式ドキュメントも読んで型や引数を調べるようにしていきます

# 参考
https://pkg.go.dev/database/sql#Open

https://pkg.go.dev/gorm.io/driver/mysql@v1.4.4#Open

https://pkg.go.dev/gorm.io/gorm@v1.24.2#Open

https://qiita.com/taka23kz/items/cb7ae9ac6cf343b3dec2
【Flutter】画像の角を丸くするには？

柔らかい印象を持たせたくて、画像の角を丸くしたいことってありますよね。
この記事では、Flutterで画像の角を丸くするための方法を説明していきます。

## 画像を表示しただけの状態
こちらがとりあえず画面の真ん中に画像を表示しただけの状態です。
しっかりと角は尖っています。
![Simulator Screen Shot - iPhone SE (3rd generation) - 2023-01-05 at 16.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1080626/007443cd-91f0-5c40-b0fb-c0022b48922f.png)
ソースコードはこんな感じ。
```dart
@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(20),
          child: Image.asset('images/ochazuke.jpeg'),
        ),
      ),
    );
  }
```
ここから画像の角を丸くしていきます。

## ClipRRectを追加
画像の角を丸くするには、ClipRRectを使います。
先にコードを載せてから説明しますね。
```dart
@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(20),
          child: ClipRRect( // これを追加
            borderRadius: BorderRadius.circular(20), // これを追加
            child: Image.asset('images/ochazuke.jpeg'),
          ),
        ),
      ),
    );
  }
```
ClipRRectとは、画像などの長方形のコンテンツを角丸にしてくれるものです。
ただ、デフォルトでは角丸にする範囲は0、つまりは角丸にはしないことになっているので、
BorderRadius.circular([どれくらい丸くするか])を追加することで角丸になってくれます。
今回は[どれくらい丸くするか]に20を指定しましたが、
ここは実際にエミュレータなどで画像を見て、お好みで設定することができます。

それでは実際に動かしてみましょう。
![Simulator Screen Shot - iPhone SE (3rd generation) - 2023-01-05 at 17.18.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1080626/9a2d8b92-229a-efbe-0050-7128c3dc24b2.png)
無事角を丸くすることができました。

## （おまけ）うまくいかなかった例
最初は単純に「Containerで囲んでBorderRadius.circularで角丸にできるんじゃないの？」と思っていました。
Containerで囲めば画像もContainerの形に沿って角丸になってくれるんじゃないかなー、という考えです。
ソースコードで言うとこんな感じですね。
```dart
@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container( // PaddingからContainerに変更
          padding: const EdgeInsets.all(20),
          decoration: BoxDecoration( // BoxDecorationを追加
            borderRadius:
                BorderRadius.circular(20), // BorderRadius.circular(20)を追加
          ),
          child: Image.asset('images/ochazuke.jpeg'),
        ),
      ),
    );
  }
```
が、しかし、角丸にはならない。
![Simulator Screen Shot - iPhone SE (3rd generation) - 2023-01-05 at 17.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1080626/1287ee5a-d770-4c3c-e577-df93a0ec877f.png)
試しにContainerに色をつけて、Containerの範囲をわかるようにしてみたところ、
こんな感じになっていました。
![Simulator Screen Shot - iPhone SE (3rd generation) - 2023-01-05 at 17.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1080626/0d57b2dc-44c5-f66d-897d-41dd4f1043e8.png)
画像の周りを囲むような感じでContainerができていたんですね。
Containerでダメなら、どしたらいいの？　という疑問から、上述のClipRRectにたどり着いた次第です。

以上、失敗例も合わせて、画像を角丸にする方法をご説明しました。
参考になれば幸いです。
Irisのバージョンアップ・ダウンの方法



# はじめに
下記の記事でVisualizerのバージョンアップ・ダウンの方法を紹介しましたが、
Irisの場合は少し異なるため改めてそれぞれご紹介します。

https://qiita.com/Kony_Team/items/9623c054c3f3b122621f

# バージョンアップする方法
VoltMX IrisメニューをクリックしてAvailable Fix Packsをクリックします。
![スクリーンショット_0005-01-05_17_10_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/a561959e-de31-23d5-9c2a-91db162c4a56.png)

バージョン一覧が表示されるため、欲しいバージョンの欄でDownloadボタンをクリックします。
![スクリーンショット 0005-01-05 17.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/326ad8aa-d731-0d0a-f749-669a7c8b03fa.png)

クラウドアカウントの左側のアイコンが更新ボタンの表示に変わりますので、
更新が終わるまでしばらく待機しましょう。

以下のような表示になったらダウンロード完了です。
「Install」ボタンを押して対象バージョンをインストールをしましょう。
![スクリーンショット_0005-01-05_17_17_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/a35e36c7-f10c-fc4d-34de-6c603ea20b48.png)

ローディング画面が表示されます。
![スクリーンショット 0005-01-05 17.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/d8f549de-75b3-4a54-8f86-a07013db665f.png)

インストール完了すると、以下のような画面が表示されるので、
「Launch Iris」をクリックしたら、アップデート完了です。
![スクリーンショット 0005-01-05 17.24.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/2f609cad-cbdf-e1b7-b6cb-14ba3a6781bc.png)

# バージョンダウンする方法
ダウンロード済みのバージョンは、
クラウド環境名の左アイコンをクリックすると表示されます。

![スクリーンショット_0005-01-05_17_27_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/e184432a-f994-17a9-8fb3-6c8e9eeeda29.png)

ダウンロード済みのバージョンが表示されたら、
「Download」をクリックします。
![スクリーンショット_0005-01-05_17_25_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/13dcd571-bb19-52a1-ac42-02c0cf5220c6.png)

現在より古いバージョンをクリックすると、
以下のようなポップアップが表示されるので、「Confirm」を押しましょう。
![スクリーンショット_0005-01-05_17_04_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/6210c5a8-1a74-51f1-3c0e-b2cd1faac3de.png)

ダウンロードが完了したら、「Install」ボタンが表示されるので、
「Install」をクリックします。
![スクリーンショット_0005-01-05_17_17_43-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/af26f89b-6cd1-71c1-070a-6c2ba4d29d6f.png)

以下のようなポップアップが表示された場合は、
「Install Now」をクリックしましょう。
![スクリーンショット_0005-01-05_17_18_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/99a085c7-2952-9aa6-adc4-9bc6f2c26b55.png)

あとはアップデート時と同じです。
インストールが完了後、Irisを開いたら完了です。

# 最後に

今回はIrisのバージョンアップ・ダウンの方法について説明しました！
参考になれば嬉しいです。

# 参考
https://opensource.hcltechsw.com/volt-mx-docs/docs/documentation/Iris/iris_starter_install_win/Content/Upgrade.html
コードレス電話機を設置した話

# 背景

年末年始は奥さんの実家に帰省していました。

実家では電子機器の修理や設置をお願いされることが多く、これまでも万歩計を修理したり、Wi-fi環境を設置・設定したりしております。

そして今回、依頼されたのは **「コードレス電話機」** の設定でございました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972052/5b7a35fc-e1f6-6440-b70d-01103e26692e.png)

奥さんの実家は大きめの一軒家でして、2階の隅っこの部屋に設置してあるコードレス電話機の子機が、圏外になってしまうとのことでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972052/28aaf962-8da1-1def-69bf-3ab9e7ae9282.png)

Wi-fi環境は整備されていますので、こそに載せれば良いのかなと思ったんですが、 **そもそもWi-fiを使っている空気を感じません…**


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972052/4215f460-2c8f-4d9f-d500-8c93e4defa22.png)

# 意外に知らないコードレス電話機の仕組み

コードレス電話機の子機、Wi-fiを使っていなければ、モバイルネットワークに接続している感じでも無いんです。

これまでネットワークのことは何年もやってきましたが、コードレス電話機の通信のことは全く知らない分野でございました（笑）


# DECT準拠方式

公式ホームページに、 **「DECT準拠方式」** というものを使っているということが書かれていました。

https://jpn.faq.panasonic.com/app/answers/detail/a_id/819/~/dect%E6%BA%96%E6%8B%A0%E6%96%B9%E5%BC%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

>DECT準拠方式の「通信技術」、「互換性」などについてご紹介します。
>
>＜通信技術＞
>■ 国内新無線方式「DECT準拠方式」とは
>　DECT準拠方式は、2011年3月に策定された新しいデジタルコードレス電話機の標準規格です。
>　DECT（Digital Enhanced Cordless Telecommunications）はETSI（欧州電気通信標準化機>構）の商標で、
>  世界で広く普及している無線通信方式のひとつです。
>  当社の製品はARIB（一般社団法人電波産業会）の標準規格「ARIB STD-T101」に準拠しています。


> ■ 2.4GHzコードレスとの違いはなにか
>　使用する周波数帯、通信方式が異なります。


> ■ 使用する周波数、通信方式は
> 1.9GHz帯の周波数を使用します。通信方式は、TDMA-WB（時分割多元接続方式）です。

> ＜互換性＞
> ■ DECT準拠方式であれば、どのメーカーの商品でも登録して使えるのか
> 　2011年秋以降に発売する当社のDECT準拠方式採用新製品で、指定機種間でのみ登録して使えます。

> ■ Panasonicの旧機種デジタルコードレス電話の子機は増設できるのか
> 通信方式と通信手順が異なるため増設できません。
>　互換性については、下図を参考にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972052/9d1a9de1-fc33-4260-5fe9-c33adf7fe2e6.png)

要は、コードレス電話機は、Wi-fiとは違う帯域を使っているので、Wi-fiとは別に整備する必要がありますよということでした。



## 中継機


2階の奥に繋ぐには **中継機** での増幅が必要でした。

ところが、DECT通信での中継機は、バッファローとか、IO DATAとか、そういう汎用品のメーカーでは取り扱いがありませんでした。

というのも **DECT通信方式の暗号化のアルゴリズムは公開されておらず、各メーカーにしか分からないロジックとなっている** ようです。

Wi-fiとはぜんぜん違う世界ですね。

なので、コードレス電話機が指定する中継機を買う必要があるようでした。

https://ec-plus.panasonic.jp/store/ap/storeaez/a2A/ProductDetail?HB=KX-FKD3

![スクリーンショット 2023-01-05 17.02.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972052/1d32fcf6-e734-db6a-8140-4be1f2aa244b.png)

めちゃくちゃ高い！！！（笑）

![スクリーンショット 2023-01-05 17.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972052/436b6f83-bbad-b792-8201-0dcda28fcc12.png)

ビックカメラですと多少安かったので、こちらで買って家の真ん中に設置し、解決しました。

# まとめ

- コードレス電話機はDECT通信方式を利用して、1.9Hｚ帯で通信している
- DECT通信方式の暗号化の仕組みは各メーカーで非公開
- 中継機はメーカー指定のものを買う必要がある

年末年始から、役に立つのか立たないのか、面白い知識を知ることができました。
IrisでモバイルWeb（SPA）のFaviconが反映されない場合の対処法

# 目次
1. はじめに
1. 事象
1. 対処法
1. 最後に

# はじめに

Irisでは、Project SettingのAdaptive Webの画面を開くと、
モバイルWeb（SPA）で表示するアイコンの設定をすることができますが、
設定をしても、画面上にアイコンが反映されないことがあります。
※2023/1/5現在の最新ver（9.2.57）時点

設定内容
|Project Settings|画像格納先|
|--|--|
|![スクリーンショット_0005-01-05_15_56_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/a4e2797d-aebe-877d-068e-e9ad9af55909.png)|![スクリーンショット_0005-01-05_17_08_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/b83424bd-8134-abf8-ff96-bfc4c6f5ccbf.png)|

ビルド時
→アイコンが反映されない

|iPhone|Android|
|--|--|
|![スクリーンショット_0005-01-05_16_43_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/688584c1-011d-21ff-0928-b8ce4d13d781.png)|![スクリーンショット_0005-01-05_16_43_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/c65e5487-96aa-eec3-be7a-30b97763bc7c.png)|

今回は、モバイルWebでアイコンが表示されない場合の対処法についてご紹介します。


# 対処方法
※Project SettingのAdaptive Webにアイコンが設定されていることが前提となります。
設定できていない方は、[はじめに](#はじめに)の画像を参考にして設定をしておいてください。
（この時画像名は、`favicon.ico`と命名するようにしましょう。）

早速対処法を紹介します。

## SPAのリソースフォルダにfaviconを格納
faviconを設定すると、デフォルトでCommonのディレクトリに格納されますが、
`~resources/mobile/web/spaiphone`にも画像を配置しましょう。

以下のように設定できればOKです。
![スクリーンショット_0005-01-05_17_46_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/33fcc5b0-bca3-8d0a-fa8c-f78a46ebba61.png)

## HTML Headにアイコンのパスを指定
リソースフォルダに画像を入れても解消されない場合、
HTML Headにアイコンのパスを直接指定しましょう。

HTML Headに以下パスを入力しDoneをクリックすれば完了です。
`<link rel="shortcut icon" href="spaiphone/images/favicon.ico">`

![スクリーンショット_0005-01-05_17_00_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/efeabe87-4bfa-09d7-26ba-0cdd3f90709a.png)

設定が完了したらビルドしてみましょう。

|iPhone|Android|
|--|--|
|![スクリーンショット_0005-01-05_17_02_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/363d9700-31f6-2634-2293-128c1c94dc18.png)|![スクリーンショット_0005-01-05_17_02_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/1ed3044d-754c-c7a6-92b3-dee1b98c5fe9.png)|

アイコンが表示されるようになりましたね！


# 最後に
最新バージョンに更新しても解消されない方や
バージョンを上げられない方で同じように困ってる方がいたら、
今回紹介した方法を試してみてくださいね！
【MicroStrategy】ドシエ上で新規項目を作成する方法と注意点

## はじめに
今回はMicroStrategyのドシエ上で既存アトリビュートから新規アトリビュートを作成する際の以下2つの方法について、手順とそれぞれのメリット・デメリットを紹介します。
・「グループ化」機能を使用
・関数を使用

## 検証
検証用に以下のような年月データを用意しました。
年と月がyyyymm形式で入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/4ee0445c-6bf5-29e2-ef41-11d3836a8a86.png)
今回はこの「年月」をもとに新しく「年」という項目を作成したいと思います。
以下それぞれの方法でやってみます。
・「グループ化」機能を使用
　→GUI操作で既存データをまとめ上げる機能です。今回は年月を年単位にまとめ上げます。
・関数を使用
　→今回はLeftStr関数を使用して年月から年データを作成します

#### 方法1：グループ機能を使用して作成
①ビジュアリゼーション上でまとめ上げたいデータを複数選択→右クリック→「グループ」を選択
※複数選択は Ctrlキーを押しながらデータを選択、もしくは
　Shiftキー を押しながらデータを選択すると範囲選択ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/41e01992-0db1-efad-a46d-cf41e20a62df.png)

②グループの名前を付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/2b6fe607-e71a-1b00-6d4d-b1fb66797b1b.png)

③データが1つのグループとしてまとめ上げられますので、
　残りのデータも同様の手順でグループ化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/f976c1e1-62df-a5b7-0054-d1fdc7c132e0.png)

④新規作成したアトリビュートを名前を変更したい場合は、
　データセット欄の対象のアトリビュートを右クリック→「名前の変更」から変更可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/2d4bbb5b-dc07-b196-8801-5c0c0266da42.png)

以上でグループ化手順は終わりです。

#### 方法2：関数を使用して作成
①アトリビュートエディターに関数を入力します。
今回は年月(yyyymm)の年(yyyy)部分を抜き出したいので以下のLeftStr関数を使用します。
式を検証し「有効な式です」と表示されましたら保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/eb4cc654-cb50-d071-3cd2-f3b351b868c5.png)

②確認のため、作成した新規アトリビュートと作成元の年月アトリビュートを並べると正しく「年」アトリビュートが作成されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/066086f9-6d62-e463-1a48-fa2d51983099.png)

以上で関数によるアトリビュート作成手順は終わりです。

#### グループ化機能の注意点
方法1のグループ化機能での作成の場合、
データソースが更新され新しいデータが追加されても、グループへ自動反映がされません。
例として年月に新しいデータ（202209～202210）を追加しましたが
グループ化機能で作成した「年」においてはどのグループにも含まれていないので、手動で既存グループへ追加もしくは新規グループ作成をする必要があります。
一方、関数で作成した「年」においては追加データも自動で「2022」と判別されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/fdca98d5-678c-47c0-b384-260126aa840c.png)

#### メリット・デメリット
それぞれの作成方法のメリット・デメリットについて以下の観点で整理しました。
・簡易性（初心者でも作業が可能かどうか）
・メンテナンス性（データソース更新時などに修正の手間がかかるかどうか）
・ミス防止（人為的ミスを防ぎやすいかどうか）
※あくまで個人の主観ですので実作業においては実際のデータの性質等を合わせて検討いただければと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/7d591c93-6348-595f-7347-6cf1a372b7f3.png)
グループ化機能は難しい操作や関数知識など必要なく初心者でも作業が可能という利点がある一方で、前述の通りメンテナンス性においては注意が必要です。
また、手作業のためまとめ上げるグループを間違えるなどの人為的ミスのリスクも考えられます。
関数作成の場合これらの懸念はクリアされますが、欲しいデータを作るための関数知識が必要になります。
今回はとてもシンプルなケースを例にしましたが、実際にはもっと複雑な関数・式を作成する必要も想定されるので、ある程度MicroStrategyの経験や知識が求められます。

実業務においては、データの性質や更新頻度などを考慮したうえで、どの方法を採用するのか検討が必要です。

## おわりに
今回はドシエ上で新規項目を作成する以下2つの方法について紹介しました。
・「グループ化」機能を使用
・関数を使用
上記以外にも、そもそも元データに項目を最初から追加するという方法もあるかと思いますが、元データの変更が難しい場合などは上記方法も検討いただければと思います。

簡単な紹介でしたが本記事が何か参考になれば幸いです。
最後までご覧いただきありがとうございました。
Mailto: での公開アドレスに対するスパムボットの巡回・収集を防ぐ


## HTML
```HTML
<a href="mail+mail.com" class="mailto"><span>mail</span>mail.com</a>
```

## jQuery
```PHP
 $( '.mailto' ).click( function() {
            var address = $( this ).attr( 'href' ).replace( '+', '@' );
            location.href = 'mailto:' + address;
            return false;
});
```

## CSS
```CSS
.mailto span:after {
    content:'@';
}
ソフトウェア品質管理を実現する11の方法


本記事では、ソフトウェア品質管理を実装するための11の効果的な方法を紹介し読者のプロジェクト運用時に役立てていただければと思います。

1.オートメーションによる早期テストと頻繁なテスト
ソフトウェア 品質管理
ソフトウェアの品質を向上させるためには、早期かつ頻繁なテストが重要です。早期にテストを行うことで、不具合がより重大な問題に発展するのを阻止することができます。不具合を修正するためのコストは、不具合の大きさに応じて増加していきます。

そのため、テスターをできるだけ早くチームに参加させた方がよいでしょう。ソフトウェア設計の初期段階からテスターを参加させることで、問題やバグが発生したときに、テスターが常に把握できるようにします。問題が急激に大きくなってデバッグが困難になる前に、テスターを参加させることをお勧めします。

テストはしばしば、適切な自動化されたテスト規律を早期に採用することに焦点を当てる必要があります。最初は非UIテストの自動化から始め、製品が安定した後に徐々にUIベースのテストにカバレッジを増やします。もしアプリケーションがウェブサービスやAPIを利用している場合、これらのテストを自動化し、すべてのビジネス・ルールとロジックがテストされていることを確認してください。

この段階では、ソフトウェア開発者と協力して、自動テストが開発チームにも導入されるようにし、テストのカバレッジと精度を高め、ソフトウェアの品質を向上させることが重要です。
Read more: https://bit.ly/3VkjHCk
PL-900：モデル駆動型アプリ(model-driven apps)

この投稿はMicrosoft PL-900の受験に向けた勉強資料をMS Learnページを参考にして作っています。
一発合格に向けて頑張りましょう！

[モデル駆動型アプリ][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/how-build-model-driven-app/02-model-driven-apps

# モデル駆動型アプリ(model-driven apps)
* モデル駆動型アプリの設計
    * アプリを開発するためのコンポーネント中心としたアプローチ
    * ローコードおよびノーコードで、シンプルもしくは複雑なアプリを作成可能
    * デザイナーがアプリのレイアウトを完全に制御できるキャンバスアプリ開発とは異なり、モデル駆動型アプリではレイアウトの大枠は決まっていて、そこにアプリに追加するコンポーネントによってレイアウトの大部分が指定される

<img src="https://learn.microsoft.com/ja-jp/training/modules/how-build-model-driven-app/media/basic-model-driven-app.png">


## モデル駆動型アプリの作成方法
モデル駆動型アプリには 3 つの設計フェーズがある

### ① ビジネス データのモデル化
* 設計者がコードを記述せずアプリをカスタマイズできるように、メタデータ駆動型アーキテクチャ(metadata-driven architecture)が使用される
* ビジネスデータをモデル化するためには、
    * アプリケーションに必要なデータとそのデータ、他のデータとの関係を決定する
* メタデータは
    * データに関するデータを意味
    * Microsoft Dataverseに格納されているデータの構造を定義する

### ② ビジネス プロセスの定義
* 一貫性のあるビジネスプロセスを定義・適用するのは重要
→　このプロセスによって、アプリのユーザーは手順を覚えることなく、作業に集中できる
* プロセスはシンプルな場合も複雑な場合もあり、多くの場合、時間の経過と共に変化する

### ③ アプリの構築
このフェーズではアプリデザイナーに必要となるコンポーネントを選択・設定してアプリを構築する

<img src="https://learn.microsoft.com/ja-jp/training/modules/how-build-model-driven-app/media/app-designer.png">
LINEミニアプリを開発する前に

## LINEミニアプリは、[LINE Developers](https://developers.line.biz/ja/)から開発することができます。
![スクリーンショット 2022-12-27 14.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/3f40b195-bfcd-f734-f4d3-24e5de34b78e.png)
![スクリーンショット 2022-12-27 14.44.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/e05c6d05-a511-885d-e41c-4fa9d01ad6a9.png)
まずは、ドキュメンテーションから[クイックスタートガイド](https://developers.line.biz/ja/docs/line-mini-app/quickstart/)を選択し流れを把握します。
![スクリーンショット 2022-12-27 14.45.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/e3fe311a-4df8-2a70-f924-851a73cdc73b.png)

- LINE Developersコンソール上にプロバイダとLINEミニアプリチャネルを作成
- LINEミニアプリチャネル上にサービス登録に必要な情報を入力
- LINEミニアプリとしてローンチするWebアプリケーションのURLをエンドポイントURLに設定
- サービス提供者のLINE公式アカウントをミニアプリを紐づける
- 開発とチャネル登録が完了したら、コンソール上で申請
- リリース審査を
- 通過したら、ミニアプリの公開設定を行い、サービス稼働を開始

[詳しくはこちらを参照ください。](https://go.linebiz.com/rs/872-KNP-101/images/%E3%80%90LINE%E3%83%9F%E3%83%8B%E3%82%A2%E3%83%95%E3%82%9A%E3%83%AA%E3%80%91%E3%83%95%E3%82%9A%E3%83%AD%E3%83%8F%E3%82%99%E3%82%A4%E3%82%BF%E3%82%99%E3%83%BC%E4%BD%9C%E6%88%90%E3%81%8B%E3%82%89%E5%AF%A9%E6%9F%BB%E6%8F%90%E5%87%BA%E3%81%BE%E3%81%A6%E3%82%99%E3%81%AE%E3%83%95%E3%83%AD%E3%83%BC%E8%AA%AC%E6%98%8E%E6%9B%B8.pdf?_gl=1*1sesqfd*_ga*NTA5Mjg4NTU0LjE2NzE2MTQ3MTU.*_ga_3ZNKEDC2XK*MTY3MjEyMTEyNC41LjEuMTY3MjEyMTQ1Mi41NC4wLjA.&_ga=2.52963629.462079904.1672118086-509288554.1671614715)
## LINEミニアプリの実装は、LIFF（LINE Front-end Framework）というLINEのトークルーム内で動作するフロントエンドフレームワークを用いて開発します

LINEのトークルーム内でLIFFに登録したウェブアプリを開くと、LINEのユーザーIDやユーザー名などを取得することができ、ウェブアプリでLINEのコンテキストを利用した機能の提供ができます。

## LIFFアプリ開発はLIFFスターターアプリを試してみよう

LIFFアプリ開発に必要な最低限の機能を持ったテンプレートをカスタマイズしていくことで、独自のLIFFアプリが開発できるようになります。

![スクリーンショット 2023-01-05 16.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/11024a28-2b8e-e87b-559e-c2b6265aa13f.png)
[ドキュメントにある手順](https://developers.line.biz/ja/docs/liff/trying-liff-app/)でLINE画面上にLIFFアプリを開けるようにしてみましょう。
SPSS Modelerで電力需要を予測する

SPSS Modelerの時系列予測ノードを使って前月の電力需要の実績から、次月の電力需要を予測します。

* テスト環境
    * Modeler 18.4
    * Windows 11 64bit
 

* サンプルストリーム

https://github.com/hkwd/spsssample/raw/master/230105%E9%9C%80%E8%A6%81%E4%BA%88%E6%B8%ACCPLEX/%E9%9B%BB%E5%8A%9B%E9%9C%80%E8%A6%81%E4%BA%88%E6%B8%AC.str

* サンプルデータ

https://raw.githubusercontent.com/hkwd/spsssample/master/230105%E9%9C%80%E8%A6%81%E4%BA%88%E6%B8%ACCPLEX/%E9%81%8E%E5%8E%BB%E9%9B%BB%E5%8A%9B%E9%9C%80%E8%A6%81.csv

# 1.データ読込

「過去電力需要.csv」を読み込みます。

2022-05-01からひと月分の１時間毎の電力需要のデータになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c5686055-7d91-b567-ea56-579a9b51be8f.png)


「データ型」ノードを接続し、「値の読み込み」をクリックし、「DEMAND」列のロールを「対象」にし、「OK」で閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8dd1a983-f751-bf93-048c-b075f8062c49.png)

# 2.モデル作成

「時系列」ノードを接続します。「データ指定」タブの「観測」で「日付/時刻フィールドごとに観測を指定する」を選び、「日付/時刻フィールド」に日時の記録された「TS」列を選びます。１時間毎に記録されているので、「時間区分」に「１日あたりの時間数」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/967a4e75-0d01-ad0c-5b76-e0456a63d19b.png)


「モデルオプション」タブを開きます。「レコードの将来への拡張」にチェックをつけ、24時間＊30日＝「720」を入力します。6月一か月分の予測をするという意味です。そして、「実行」で、モデルを作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7756c9db-8826-4877-2fb7-e7e35bab5dcb.png)

以下のようにモデルができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8193b63b-8494-d822-17d0-d5261f6a80fd.png)

# 3.スコアリング

「テーブル」ノードを接続して確認をすると、6月の電力需要予測ができています。「＄TS」が予測値で「＄TSLCI」が下側95%、「\$TSUCI」が上側95\%の予測値になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/30d69511-9b88-164d-a94b-6ea936123802.png)

「線グラフ」ノードを接続します。そして、Xフィールドに「TS」を設定し、Yフィールドに実績値の「DEMAND」と予測値「\$TS-DEMAND」を設定し、「実行」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0ab052f1-e0f6-852b-52d9-f3edfac30b8d.png)

以下のように予測結果がグラフ化されました。６月分は予測結果のみで赤い線だけになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7dcd1a47-973c-ec72-3dd6-ee07e81ecb3c.png)

# 参考
#### SPSS Modeler ノードリファレンス 5-8 時系列(時系列Autoモデリング) - Qiita

https://qiita.com/416nishimaki/items/f7842af5af1d6410526d
CNNで親子丼と牛丼を見分ける...!!

# 概要
今回は、畳み込みニューラルネットワークを利用して、親子丼と牛丼の分類に挑戦しました!


# 1. CNNとは
## 1.1 CNNの特徴
　CNNは一般的な全結合型ニューラルネットワークと違い、2次元データをそのまま学習に取り込むことができます。例えば、28x28の画像データを学習に利用する場合、全結合ニューラルネットワークでは784x1の1次元ベクトルに変換します。そのため、二次元情報が失われてしまいピクセルが一つずれても、後続データも同様にずらせば同じように学習されてしまいます。CNNでは畳み込み演算という処理によって、2次元空間の情報を取り出します。
## 1.2 畳み込み
　畳み込み演算とは、画像の値とフィルタとの積の和を元の画像に書き込む処理のことです。ここのフィルタとは演算によって画像を加工するもので、例えば3x3の上下方向のエッジを検知するフィルタは以下のようになります。
![スクリーンショット 2022-11-14 10.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/c2df8f8d-5639-3d34-a691-55ba3e6c9111.png)
　このフィルタを画像に畳み込み演算を行っていく、下の図のようになる。
![スクリーンショット 2022-11-14 11.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/18b0ba8d-7c2b-115c-d206-65c7cd7f1838.png)
　例えば、左上の3x3の部分にフィルタを先のフィルタを適用すると、最終的にな和は6となり元の画像の中心に書き込んでいきます。そして、フィルタを1ピクセルずつずらして適用し、画像全体に行っていきます。
![スクリーンショット 2022-11-14 11.27.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/a5063b52-1251-371b-2c01-50791aaf63da.png)　
　このように、縦方向のエッジが存在する領域の数値が高くなります。また、これを見ると複数のフィルタを連続して適用すると、出力がどんどん小さくなっていくことがわかります。これを防ぐために、ゼロパディングという手法をとります。これは、周りをゼロで埋めてからフィルタを適用する手法で、何もしない時より画像の端の情報が反映されやすくなります。![スクリーンショット 2022-11-14 11.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/117308a2-0672-b382-23e2-100b7ec8775f.png)
## 1.2 プーリング
プーリングは、画像の歪みや連れの影響を減らすために行われる処理です。例として、6x6の画像に2x2の最大プーリングを行っていきます。
![スクリーンショット 2022-11-14 12.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/844b51e9-9559-fabc-9512-503b6c0b5d46.png)
　上図のように2x2の最大プーリングを行うと、出力は元の画像の4分の1サイズになるので、この分の情報がなくなります。

# 2. PytorchによるCNN実装

## 2.1データ収集
データ収集は、CookPadから行いました。CookPadでは、レシピカテゴリが下図のように階層構造になっています。今回は、「どんぶりもの」カテゴリの「牛丼」カテゴリと「親子丼」カテゴリから画像を取得しました。
![スクリーンショット 2022-12-01 12.02.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/a8fa3b3a-0dc8-5395-d7d2-371c46e208e0.png)

## 2.2前処理
　続いて画像データを学習に利用できるように前処理を行った。画像認識のタスクでは、よく拡張処理を行いデータの水増しを行う。今回は、学習データをtorchvisionというライブラリを利用しました。
* RandomResizedCrop: ランダムにトリミング
* RandomHorizontalFlip: 水平方向反転。(今回は0.2の確率)
* RandomRotation: ランダムに回転(今回は15度の範囲)
* ColorJitter: 明度(brightness)、彩度(saturation)を変化(変化係数0.3に設定)
* Normalize: 平均、標準偏差で正規化
そしてデータを読み込んで、Dataloaderオブジェクトを生成してミニバッチのサイズなどを登録する。学習やテストはこのDataLoaderを呼び出してモデルに入力します。
batch_sizeは64に設定しています。

## 2.3モデルの作成
今回構築したモデルは以下のような構成になります。
![スクリーンショット 2022-12-01 17.11.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/c7073e03-c413-242e-8643-3e2bdc1167cb.png)
畳み込み層6,プーリング層3,全結合層1, 出力層(全結合層)1の計11層で、活性化関数にReLU関数を利用しています。

## 2.4モデルの評価
エポックごとのlossとaccuracyのグラフを確認してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/45baf98f-a570-6723-d3fb-af96495b030c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774002/7177c025-3620-1ac2-4e85-5b677998dd34.png)
かなりいい感じですね。最後にテストデータの結果を調べてみました。
テストデータの結果は84.38%でした。結構いい感じです^^

# 3.まとめ
今回は、CNNをPytorchを利用して実装し、親子丼と牛丼の画像分類を実施しました。テストデータの結果に関しては、まだ向上が期待できそうなので次回は転移学習を実施してみようと思います。