OmniAICreator/Qiita-1.07M huggingface dataset:
Numo::NArray でワーシャル–フロイド法の多重ループを記述削減

多次元配列[NArray](https://ruby-numo.github.io/narray/)の機能を利用すれば、[ワーシャル–フロイド法](https://ja.wikipedia.org/wiki/ワーシャル–フロイド法)の3重ループのうち**内側2つを書かなくてよくなる**。Rubyレベルの記述が減ることで計算速度も向上する。

（AtCoderのコンテストでスラスラ書けず、NArray不使用で提出してTLEに苦しんだので、きちんと纏めておくことにした。）

## コード

```ruby
# n頂点m辺の重み付き有向グラフを標準入力から読み込み
n, m = gets.split.map!(&:to_i)
edges = Array.new(m) { gets.split.map!(&:to_i) }

# 隣接行列を作成
d = Numo::Int64.new(n, n).fill(Numo::Int64::MAX >> 1)
d.diagonal[true] = 0
edges.each do |i, j, dist|
	d[i, j] = dist if d[i, j] > dist
end

# ワーシャル–フロイド法
n.times do |k|
	d_via_k = d[true, k..k] + d[k..k, true]
	d = Numo::Int64.minimum(d, d_via_k)
end

# 結果（全ペアの最短経路）を出力
p d
```

### 入出力のサンプル
[Wikipedia英語版の例](https://en.wikipedia.org/wiki/Floyd–Warshall_algorithm#Example)を拝借する。（頂点の添字は0始まりに変更）

```text:input
4 5
0 2 -2
1 0 4
1 2 3
2 3 2
3 1 -1
```

```ruby:output
Numo::Int64#shape=[4,4]
[[0, -1, -2, 0],
 [4, 0, 2, 4],
 [5, 1, 0, 2],
 [3, -1, 1, 0]]
```

## 変形のメモ
ワーシャル–フロイド法の3重ループをふつうに書けばこうなる。

```ruby
n.times do |k|
	n.times do |i|
		n.times do |j|
			d_ikj = d[i, k] + d[k, j]
			d[i, j] = d_ikj if d[i, j] > d_ikj
		end
	end
end
```

全ての `[i, j]` の組は独立して計算できるので、内側の2重ループを `map` で書き直してみる。

```ruby
n.times do |k|
	d = d.map_with_index do |d_ij, i, j|
		d_ikj = d[i, k] + d[k, j]
		d_ikj < d_ij ? d_ikj : d_ij
	end
end
```

ループ内の処理をもっと単純にするため、一旦 `d_ikj` の計算と最小値の計算を分離してみる。（一時記憶用の配列を用意する必要が生じるため、メモリ効率は悪くなる）

```ruby
n.times do |k|
	# （注意）計算時は d にinplaceフラグが立っていないこと
	d_via_k = d.map_with_index do |_, i, j|
		d[i, k] + d[k, j]
	end

	d = d.map_with_index do |d_ij, i, j|
		d_ikj = d_via_k[i, j]
		d_ikj < d_ij ? d_ikj : d_ij
	end
end
```

すると、前半は**外積の計算方法と同じもの**（演算は掛け算でなく足し算）、後半は**要素毎の最小値計算**であることがわかる。どちらもNArrayではループを書かず計算できるので、冒頭のコードの形に纏められる。

* [Numo::NArray で行列の積（あるいはテンソルの縮約）を計算](/HMMNRST/items/88908fd96d36c4f7720e)
* [Numo::NArray で二項演算としての最大値・最小値の計算](/HMMNRST/items/7a1cf8dd96563d46c4e9)

```ruby
n.times do |k|
	d_via_k = d[true, k..k] + d[k..k, true]
	d = Numo::Int64.minimum(d, d_via_k)
end
```

※ `d[true, k..k]` と範囲指定しているのは、配列の次元を減らさずに1列を取り出すため。 `d.slice(true, k)` と書いてもいい。
phpで擬似データベースを作ろう 改

<h1>追記・このプログラムは使えません。もうまじで頭おかしいです。使わないでください(2回目)</h1>

<p>雑です</p>
<h1>最初に</h1>
<p>この記事は、<b>語彙力ゴミ</b>が書いた記事です。</p>
<p>命の保証はしません。注意ください。</p>
<p>あと思いつきです。</p>
<p>設定がやりやすいので、まあ見てくださいな。</p>
<h1>仕組み</h1>
<p>▼ 全体図
<img src="https://i.imgur.com/3eLE1HM.png"></p>
<p>図はこんな感じです。<?p>
<p>ざっくり言うとBasic認証があるフォルダーにデータを保存するだけです。</p>
<p>なのでユーザーはBasic認証のパスワードとIDを知らないと入れないのです。</p>
<p>サーバー一つで済みますね。Yeah!!</p>
<h1>プログラムを書いてみよう</h1>
<h2>DBもどき側のプログラム</h2>
<p>Basic認証のプログラムは、<a href="https://qiita.com/mpyw/items/dc2cb3632370389d700e" target="_blank">@mpyw さんの記事</a>から引用させていただいております。</p>

```php:db/password.php
<?php

$user = "[USER]";
$pw = "[PASSWORD]";

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_USER']) ||
    $_SERVER['PHP_AUTH_USER'] != $user || $_SERVER['PHP_AUTH_PW'] != $pw) {
    header('WWW-Authenticate: Basic realm="ender your id, password"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
}
?> 
```
素晴らしいプログラムッ!!美しいっ！！！()
<h2>書き込み側</h2>

```php:kakikaki.php
<?php
$name = "basyo";
file_put_contents("db/".$name.".phpdb", "内容");
?>
```

<p>file_put_contents でデータベースに書き込みします。</p>
<p>.phpdb という拡張子で保存します。適当です。</p>

<h2>ファイルを取得</h2>
<p>参考: <a href="https://blog.dreamhive.co.jp/mkoba/?p=999" target="_blank">mkoba のお部屋様</a></p>

```php:read.php
<?php
 file_get_contents("http://ID:PW@example.com/db/example.phpdb");
?>
```

<p>こんな感じで読み込めます。</p>
<p>Basic認証付きのフォルダーにアクセスし、ファイルを取得します。</p>
<h1>最後に</h1>
<p>どうでしたでしょうか。</p>
<p><u>結構雑な作りでしょ。。。。。。</u></p>
<p>まあでも結果的にDBもどきになって、扱いやすいし設定しなくていいので使いやすいと思います。</p>
STM32L010のMbedでのHT16K33でナイトライダー(Keil)


x Mbed2



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


なぜかわからないがmbed.bldのファイルを変更したら動いた


mbed.bld


```

https://os.mbed.com/users/mbed_official/code/mbed/builds/2e9cc70d1897


```





```c++


//HT16K33_010_1_1

#include "mbed.h"

#define ADDR        (0xE0)  //  address

I2C i2c(PA_10, PA_9); //010

char data_read[8];  //i2cバッファー
int ii;             //ループカウンター


int main() {
    
//INIT start *********  
    
    data_read[0]=0x21;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    data_read[0]=0x81;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    data_read[0]=0xef;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    for(ii=0;ii<16;ii++){
        data_read[0]=ii;
        data_read[1]=0x00;
        i2c.write(ADDR, data_read, 2);wait_ms(1);
    }//for

    
    wait_ms(2000);
    
//INIT end *********    

    while(1){
        for(ii=0;ii<8;ii++){
        
        data_read[0]=0;
        data_read[1]= (1<<ii);
        i2c.write(ADDR, data_read, 2);wait_ms(1000);

        }//for
    }//while

} // main

void error(const char* format, ...){}




```
Vue.js v-ifの使い方

# 概要
Vue.jsでv-ifによる処理の方法を記載します。


# 記述方法
v-ifは以下のように`v-if`, `v-else`という形式で記載します。
タグは処理の内容によって変更してください。
``` html
<template v-if="条件">
   // 条件にあった場合の処理を書く
</template>
```

# 実例
``` html
<template v-if="A">
   // Aの場合の処理
</template>
<template v-else-if="B">
   // Bの場合の処理
</template>
<template v-else>
   // A,B以外の場合の処理
</template>
```

基本的には他のプログラム言語のif文と同じような感覚で使用できます。
Codeigniter テスト環境構築

codeignierのテスト環境を構築したはなし

# 環境
php version
```:bash
# php -v
PHP 7.4.10 (cli) (built: Sep 10 2020 14:00:50) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
```

codeigniter version
```
codeigniter/framework: 3.1.13
```

# ci-phpunit-test のインストール
* Composer Installation
```
composer require kenjis/ci-phpunit-test --dev
```
* installコマンド
```
php vendor/kenjis/ci-phpunit-test/install.php -a application -p public
```
 オプションの説明
`-a: applicationの配置パス -p: publicの配置パス`

※ index.phpをカスタマイズしている場合には、
tests/Bootstrap.phpにも同様の内容を追記する

# テスト実行
```
vendor/bin/phpunit -c application/tests/
```
※ applictionの配置パスが異なる場合には読み替えで実行してください
display: none; にtransitionを使いたい


どうしてもdispla:none;からdisplay:block;に変更したときにtransitionをつけたかった。

ここに答えがありました

https://qiita.com/gonshi_com/items/4ae066ef4bea6d519854


でも自分の環境ではうまく機能しませんでした。　なぜ。。

結局displayを使うのを諦め、opacityに変更しました。。


https://csshtml.work/displaynone-anime/
trコマンドの範囲指定を[0-9]と書く人はオジサン（POSIX準拠は0-9）

## TL;DR

POSIX 準拠の `tr` コマンドでは文字の範囲指定に `[ ]` は不要です。`[0-9]` のような書き方は System V 版の古い書き方であり、`0-9` と書くのが POSIX 準拠の今の書き方です。いずれの環境でも動く書き方であり POSIX 準拠の環境を最低基準とするならば古い書き方をする必要はありません。`[0-9]`でも動くように思えるかもしれませんが `-d` オプションを指定した場合に困ることになります。正規表現の書き方と混乱するという方は「`tr` コマンドは正規表現は使えない」で覚えると良いのではないかと思います。

**完**

### System V 版を考慮した書き方をする必要はないよ

「System V 版の書き方をしないと動かない環境がある」と反論されそうなので指摘しておくと、それは **「Unix 互換モード」から「POSIX 準拠モード」に切り替えていないだけ**です。（注意 「Unix 互換モード」と「POSIX 準拠モード」は私がつけた便宜上の名前です）

**参考** [「え？UNIXなのにPOSIXに準拠してないの！？」シェルスクリプト実行環境をPOSIX準拠モードに変更して互換性を上げる方法 (Solaris, AIX, HP-UX, Linux, macOS, BSD)](https://qiita.com/ko1nksm/items/6ebdcba7050da2f3c585) 

商用 UNIX の一部（すべて？）では後方互換性を維持するために**デフォルト**では System V 版のコマンドが使われるようになっている場合があります。その場合でも Unix の認証を取得しているのであれば POSIX にも準拠しているので、**どこかに POSIX 版の `tr` コマンドを使う方法が必ずあります。**

### 「POSIX 準拠モード」と「Unix 互換モード」

「POSIX 準拠モード」の事を知らなければ気がつきにくい点だとは思いますが man ページや OS ベンダーが提供してるドキュメントには書いていると思います。ただしこれは OS ベンダーが用意している OS 固有の機能であるため [POSIX](https://pubs.opengroup.org/onlinepubs/9699919799/) には書かれていません。POSIX しか参照してないような人は気がついてないかもしれません。ただし [POSIX の tr コマンドのページ](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html) の下にある RATIONALE には BSD 版の動作を採用したというようなことが書いてあるので、ちゃんと読んでいれば何かがおかしいと気づくはずです。

こういった点から POSIX に準拠させる方法にたどり着けると思うのですが、ドキュメントを読まずにコードばかり書いているような人や知識をアップデートしない人は「POSIX 準拠モード」のことを知らずにいつまでも古い「Unix 互換モード」を使い続けてしまうことになります。「Unix 互換モード」は OS のアップデート時の互換性を保つためのもので、常用するために用意されているのではありません。少しずつ POSIX 準拠のコードに置き換えていけるようにするためのものです。

「Unix 互換モード」は POSIX に準拠してないので、さまざまなコマンドの動作が POSIX に準拠していません。例えば `awk` コマンドは関数が使えません。OS 間での互換性問題がひどかった古い時代の Unix コマンドを使い続けるということは、今書いているコードも POSIX に準拠してないコードになっている可能性があるということです。例えば将来 OS を Linux にリプレースする場合などに移植性の問題が出来る可能性があるので注意してください。POSIX に準拠している実装間でも完全に同じ動作をしてないというのに System V 版のコマンドにまで対応していたのではいくら時間があっても足りません。

### さいごに

ソフトウェア開発業界では新しいことを学ばずに同じやり方を続けていても技術力は上がりません。残念ながら一度覚えた知識が何年もずっと使えることはないのです。新しく優れたやり方が登場しつづける世界では、同じやり方を続けるというのは相対的に生産性を下げ続けるということを意味しています。ハードウェアは買い換えれば性能は向上しますが、ソフトウェアはやり方を変えねば生産性は向上しません。

`tr` コマンドは OS のサポート期間を考慮しても 10 ～ 20 年前には System V 版を考慮した書き方をする必要は完全になくなっていたはずです。必要なものは昔の Unix に対応させるための古い知識ではなく POSIX に準拠させるための新しい知識です。・・・いや別にそんなに新しい知識でもないのですが。

**関連記事**「[シェルスクリプトの \[ は /bin/\[ と言ったり [ "x$var" = "xval" ] と書く人はオジサン](https://qiita.com/ko1nksm/items/f772b782a760bbfa1b28)」
AtCoder Beginner Contest 242 参戦記

# AtCoder Beginner Contest 242 参戦記

ジャッジが詰まっていて大変だった上に、Dが解けなくて落緑_(┐「ε:)_

## [ABC242A - T-shirt](https://atcoder.jp/contests/abc242/tasks/abc242_a)

書くだけ. `elif` を `if` と誤記して WA1(泣).

```python
A, B, C, X = map(int, input().split())

if X <= A:
    print(1)
elif X > B:
    print(0)
else:
    print(C / (B - A))
```

## [ABC242B - Minimize Ordering](https://atcoder.jp/contests/abc242/tasks/abc242_b)

書くだけ.

```python
S = input()

print(''.join(sorted(S)))
```

## [ABC242C - 1111gal password](https://atcoder.jp/contests/abc242/tasks/abc242_c)

素直に DP するだけ. C問題で DP はもう普通なんだな.

```python
m = 998244353

N = int(input())

t = [1] * 10
t[0] = 0

for i in range(N - 1):
    u = [0] * 10
    for i in range(1, 10):
        for j in [-1, 0, 1]:
            k = i + j
            if k < 1 or k > 9:
                continue
            u[k] += t[i]
            u[k] %= m
    t = u
print(sum(t) % m)
```
Javaのマップとは?

## マップ
マップは、一意のキーと値のペアで管理されるデータ構造です。言語によっては、ディクショナリ（辞書）、ハッシュ、連想配列と呼ぶ。
キーという意味ある情報できる点が、マップの特徴です。

## 先ずは書いてみましょう...
Main.java
```
package com.company;

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        var map = new HashMap<String, String>(Map.of("Rose", "バラ",
                "Sunflower", "ひまわり", "Morning Glory", "あさがお"));
        // 指定のキーが含まれているかを検索
        System.out.println(map.containsKey("Rose")); // 結果 : true
        // 指定の値が含まれているかを検索
        System.out.println(map.containsValue("バラ")); // 結果 : true
        // マップの中身が空かを検索
        System.out.println(map.isEmpty()); // 結果 : false

        // すべてのキーを取得
        for (var key : map.keySet()) {
            System.out.println(key); // 結果 : Rose, Sunflower, Morning Glory
        }
        // すべての値を取得
        for (var value : map.values()) {
            System.out.println(value); // 結果 : バラ、ひまわり、あさがお
        }
        // 指定のキーの値をvalueに置き換え
        map.replace("Rose", "薔薇");
        // 指定のキーkey/値oldがある場合、その値をnewに置き換え
        map.replace("Sunflower", "ひまわり", "向日葵");

        for (var entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
            // // 結果 : Rose:薔薇、 Sunflower:向日葵、 Morning Glory:あさがお
        }
    }
}
```
実行結果
```
true
true
false
Rose
Sunflower
Morning Glory
バラ
ひまわり
あさがお
Rose:薔薇
Sunflower:向日葵
Morning Glory:あさがお
```

マップはそのまま拡張for命令に渡すことはできない点に注意してください。キー/値を列挙するには、keySet/valuesメソッドでキー/値のセットを取り出す必要があります。
もしくは、entrySet/メソッドで、マップエントリー(Map.Entry)のセットを取得してもかまいません。
その場合は、エントリーからさらにgetKey/getValueメソッド経由でキー/値にアクセスできます。

## 値を追加して、ログで取得するサンプル
Main.java
```
package com.company;

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        var key1 = Integer.valueOf(1);
        var key2 = Integer.valueOf(2);
        var key3 = Integer.valueOf(3);
        var key4 = Integer.valueOf(4);

        var data = new HashMap<Integer, String>() {
            {
                // pub(K key, V value) 指定のキー/値の要素を追加
                put(key1, "Apple");
                put(key2, "Google");
                put(key3, "FaceBook");
                put(key4, "Amazon");
            }
        };
        System.out.println(data.get(key1)); // 指定のキーの値を取得
        System.out.println(data.getOrDefault(key2, "Google")); // 指定のキーの値を取得
        System.out.println(data.entrySet()); // すべて要素を取得
        System.out.println(data.keySet()); // すべてのキーを取得
        System.out.println(data.size()); // マップの要素数を取得
        System.out.println(data.values()); // すべての値を取得
    }
}

```
実行結果
```
Apple
Google
[1=Apple, 2=Google, 3=FaceBook, 4=Amazon]
[1, 2, 3, 4]
4
[Apple, Google, FaceBook, Amazon]
```
LaravelをMacOS上設定して分かったこと

お仕事には主にWindows OSで使用して、当然LaravelもWindows OSでインストールしていました。だだ家にはMac Osしかなく、Laravelをインストールする時にはめっちゃ苦労したので、メモを残します。

## Composerをインストール
Laravelをインストールするために、まずComposerをインストールしないといけないです。特にMac OSには、Brew経由でインストールするのはおすすめです。
Brewにも、Mysqlとphpも同時にインストールしましょう。
ここのサイト参考し、コマンドを打つだけ
https://brew.sh/
```bat
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

## BrewHomeでMysqlとphpをインストール
```bat
$ brew update
$ brew install mysql

$ brew install php
```


## Mysqlを起動
```bat
 brew services start mysql
```

## 注意点
Mac OSには、Brew経由でMysqlサービスを利用します。
Mac OS用のMysqlソフトは別の物ですので、使えないです。BrewのMysqlを使いましょう。

## 終わり
簡単ですが、一旦これでメモします。また何かUPDATEするかもしれません。
[css] animation / transition 中の backdrop-filter が効かない！

Chrome でアニメーション中に `backdrop-filter` を使おうとしても動いてくれなかったので対応方法を備忘録として残します。

実際に動くサンプルがこちらです。

https://codepen.io/sygnas/pen/RwxwyJY

# 結論

**背景色を入れればOK！**

```scss
background-color: rgba(255, 255, 255, 0.01);
```

不透明度 0.01 の白を背景色にしたら動きました！
（色は何でもOKです）

ここから先は特に関係ない解説なので読まなくてもOKです。

Safari では `background-color` の指定がなくても動くので Chrome の不具合かもしれません。
なお css の仕様は確認してません。


# ソースコード

今回はメニューの背景用 `backdrop-filter` です。
つまり普段は非表示で、メニュー使用時だけ表示します。

```html
<span class="backdrop" data-state="init"></span>
```

CSS全文がこちらです。

```scss
.backdrop{
  position: fixed;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  animation-duration: 1s;
  animation-fill-mode: forwards;
  
  // ここがポイント！！
  background-color: rgba(255, 255, 255, 0.01);
  
  &[data-state="init"]{
    // 初期状態は高さ 0
    height: 0;
  }
  &[data-state="on"]{
    // 表示アニメ
    animation-name: backdrop-on;
  }
  &[data-state="off"]{
    // 非表示アニメ
    animation-name: backdrop-off;
  }
}

@keyframes backdrop-on{
  0%{
    height: 100%;
    backdrop-filter: blur(0);
    -webkit-backdrop-filter: blur(0);
  }
  100%{
    height: 100%;
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
  }
}

@keyframes backdrop-off{
  0%{
    height: 100%;
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
  }
  99%{
    height: 100%;
    backdrop-filter: blur(0);
    -webkit-backdrop-filter: blur(0);
  }
  100%{
    // 最後に高さを 0 に戻す
    height: 0;
  }
}
```

## 解説

初期状態では `data-state` 属性を `init` にしてあり、css で高さを `0` にしています。

```html
<span class="backdrop" data-state="init"></span>
```

```scss
  &[data-state="init"]{
    height: 0;
  }
```

`data-state="on"` になると `@keyframes backdrop-on` が動きます。

```scss
  &[data-state="on"]{
    animation-name: backdrop-on;
  }
```
```scss
@keyframes backdrop-on{
  0%{
    height: 100%;
    backdrop-filter: blur(0);
    -webkit-backdrop-filter: blur(0);
  }
  100%{
    height: 100%;
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
  }
}
```

そして `data-state="off"` になると `@keyframes backdrop-off` が動きます。

```scss
  &[data-state="off"]{
    animation-name: backdrop-off;
  }
```

```scss
@keyframes backdrop-off{
  0%{
    height: 100%;
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
  }
  99%{
    height: 100%;
    backdrop-filter: blur(0);
    -webkit-backdrop-filter: blur(0);
  }
  100%{
    // 最後に高さを 0 に戻す
    height: 0;
  }
}
```

99% でアニメーション演出は終了して、最後の 100% で高さ 0 に戻しています。
若手SIerがOutsystems Plat server(OSP)のマイナーバージョンアップで失敗したこと

# 自己紹介
　Outsystemsでアプリケーションを開発している若手
 主にアプリ開発をしていて、検証環境をAWS上で構築しており、AWS環境の構築・運用もしている

# 初めに
　社内の検証環境のOSPのバージョンが低かったため、マイナーバージョンアップを実施せよとのお達しがあり対応
その時の僕は以前も実施したことがあり。何も心配はしていなかった、、（チェックリスト見れば楽勝だろ、、）

# はまった部分
* Configuration ToolからSystem Componentsがアップロードできない（ほら見たことか）

これはInstall checkListの項目にあるんですが
```
Service Centerとシステムコンポーネントをインストールします。 
•［Apply and Exit］ボタンを押してConfiguration Toolを終了します。
•OutSystems Scheduler ServiceとOutSystems SMS Connector Serviceを開始するかどうかをたずねるポップアップが表示されたら、［Yes］と回答します。
•Service Centerとシステムコンポーネントのの最新バージョンをパブリッシュするかどうかをたずねるポップアップが表示されたら、［Yes］と回答します。
•Windowsメニューから［OutSystems > Service Center］を起動して、Service Centerが利用可能であることを確認します。
```
Configuration Toolの[Apply and Exit]押下すると
```
-----------
Finished installing Service Center version 11.14.1 build 34445!
Service Center install ended successfully
No System Component dependencies to prepare
System Components install started
There was an error while contacting the server:  HTTP InternalServerError
Environment Setup ended with errors
Done!
```
Why!?
とりあえず問題をしらべることに、、
調べた結果
・どうやらIISの設定に問題がありそう？？(System_Componetsのファイル制限!?)
・どうやらConfiguration ToolはServer.APIとServer.identityで連携してるぽい！？
⇒ここで対応できそう！？
　[IISで30MB以上のファイルをアップロードする場合の事前設定](https://pleasanter.org/manual/iis-large-file-30)
　[ “Request Entity Too Large” エラーの対応](https://techcommunity.microsoft.com/t5/iis-support-blog/solution-for-request-entity-too-large-error/ba-p/501134)

↑↑　実施したところ、、ダメでしたー


結果的に、、Service Centerから対応できました。

が今後の為、Configuration ToolからSystem Componentsがアップロードできない事象については今後更新できたらと思います。
初心者ブロックチェーンに挑戦する　13

# 昨日の記事が下書きに引っかかっていた

　ので、せっかくだから追記して投稿。

## 身の程知らず

　第一プロジェクトの課題は、メッセージを送ってくれた人に、おもちゃイーサが当たるかもしれないし、当たらないかもしれない、というwebページをつくること。一応、テキストに書かれていることは全てやった。あとは何かしら＋αをつけるか、そのまま提出するかなのだが、性格的にそのまま出せない。
　身の程知らずというのは、こういうことを言うのだろう。[UNCHAIN](https://app.shiftbase.xyz/)に参加しているのは、私のような素人ばかりではない。だからそういう人たちがUIをおしゃれにカスタマイズして提出してくるのはわかる。そして当然それに憧れる。これがflutterでモバイルアプリにしていいよ、と言われたら、私も頑張ってアプリをつくるか、と言ったら、テキストに書かれているのはWEB向けの言語なので、dartに翻訳する力は今の私にはない。
　だったらさっさと忠実な写経を提出しなさいよ、という話なのだが、私はちょっと、やりたいことを思いついてしまったのだ。

- 思いついたから、やりたい。
- それだけのこと。

## [MIMO](https://apps.apple.com/jp/app/mimo-learn-coding-programming/id1133960732)で遊んで日が暮れる

　昔、生徒たちと遊んだいろいろなアプリの中に、[MIMO](https://apps.apple.com/jp/app/mimo-learn-coding-programming/id1133960732)というのがある。そこにたしか、webページの作り方もあったはずだ。HTML、CSS、JS・・・このアプリの難点は、問題を一問ずつ解かないと進めないこと。この辺にあったはず、とかいって、見たいものだけを見るわけにいかない。それで仕方ない、1日これで遊び続けた。問題の一つはとてもあっさり片がついた。が、もう一つを見つけられない。

- webページに写真1を表示する。
- メッセージを送ってくれたら写真2に切り替える。もしおもちゃイーサが当たったら、写真3に切り替える。

　実に簡単そうなんだけどねえ。基礎のない身は悲しい。もうちょっとがんばります。
OneDriveで他の人とファイル共有する。

# はじめに
先日、メールで送るには大きいサイズのファイルをやり取りする機会があり、その時に`OneDrive`でやり取りしたので、`OneDrive`で他の人とファイルを共有する方法を記載します。

# OneDriveとは
最近の`Windows OS`には標準でインストールされている**オンラインストレージサービス**で、個人のMicrosoftアカウントであればデフォルトで**5GB**の領域、Microsoft 365を購入しているのであれば**1TB**の領域を使うことができます。

# OneDriveでの共有方法
オンラインの画面上から共有設定を行うこともできますが、`Windows 10`や`Windows 11`では標準で`OneDrive`アプリがインストールされているため、今回は`OneDrive`のアプリから行う方法を紹介します。

## OneDriveアプリの起動
「**検索**」バーから「**OneDrive**」と入力して`OneDrive`を起動すると`OneDrive`で管理しているファイル・フォルダが表示されます。

![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/755f654b-8f5c-bae8-44a5-16af0e5a86b9.jpeg)

## 任意のファイル・フォルダの共有
他の人と共有したいファイルやフォルダを右クリックして「**OneDrive**」→「**共有**」を選択します。

![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/0ddae6ea-f88a-c393-3444-1bf938d10a76.jpeg)

## 共有する際のリンク設定
`OneDrive`のファイル・フォルダを共有する際の共有方法を設定します。

`OneDrive`の設定は個人アカウント、法人アカウントで設定可能な共有方法が異なり、以下の違いがあります。

|リンクの設定|設定可能種別|備考|
|:--|:--|:--|
|リンクを知っているすべてのユーザー|個人・法人両方|パスワード設定可能|
|リンクを知っている自組織のユーザー|法人のみ||
|既存アクセス権を持つユーザー|法人のみ||
|特定のユーザー|個人・法人両方||

また、共有方法とは別に編集方法として以下が設定できます。

|編集方法|備考|
|:--|:--|
|編集可能|他の人が編集も可能|
|表示可能|他の人は表示のみ可能|

不特定多数の人にファイルを見られても良いのであれば、「**リンクを知っているすべてのユーザー**」の設定を行えば共有できますが、特定の人に限定して共有したいのであれば、「**特定のユーザー**」で設定することで限定した共有を行うことができます。

共有設定の画面より、リンクの設定、編集方法、共有したい人のメールアドレスを入力して「**送信**」ボタンを選択することで共有したい人にメールが送信されます。

以下はフォルダを「**特定のユーザー**」で「**編集可能**」として他の人と共有する場合の例となります。

![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/77874c0c-e584-0940-7bf4-9c36ccbc6e51.jpeg)

# 他の人から共有ファイル・フォルダへのアクセス
共有元からメール送信されると、以下のようなメールが共有先の人に届きます。

尚、「**迷惑メール**」フォルダに入ってしまうことがあるので、もし届いていないようなら「**迷惑メール**」フォルダを確認してみてください。

![004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/fd6a2dd5-73eb-91e0-f051-8357649faf72.jpeg)

メールに記載されている「**開く**」ボタンを選択すると、以下のように共有したファイル・フォルダにアクセスできます。

![005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/774ceaee-1578-a15b-3f75-bbaa50b26975.jpeg)

共有先となる他の人にファイルを格納してもらう場合、画面上の「**アップロード**」からアップロードしてもらいましょう。

# ファイル・フォルダの共有解除
共有していたファイル・フォルダの共有を解除するには、共有設定を行った場合と同様、「**OneDrive**」→「**共有**」から行います。

共有設定画面より、赤枠のユーザアイコンが表示されている部分をクリックして「**アクセス許可の管理**」に遷移します。

![006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/4e51b82b-bfde-1211-a12b-42294c8d7474.jpeg)

「**・・・**」の部分を選択すると赤枠の「**×**」が選択できるようになるので、「**×**」を選択してリンクを解除します。

![007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/54abf7c4-210b-f616-2137-1827b21eec29.jpeg)

![008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/85ac2b03-a8fe-6c3a-8e7b-efbe76fb8a73.jpeg)

完全に共有を解除するためには、再度同様の操作を行う必要があるようなので、再度同様の操作を行い、リンクを解除します。

完全に共有が解除できた場合、エクスプローラに表示される以下赤枠のユーザマークが消えるので、マークが消えることを確認しましょう。

![009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/c7f98ff1-7535-295b-d864-9805744b41cc.jpeg)

# おわりに
オンラインストレージサービスは様々なサービスがあるため、使うサービスを選ぶのも大変ですが、Windowsに標準でインストールされている`OneDrive`であれば、一時的にファイルのやり取りをしたい場合など、特にサービス登録等行わずにできるため、便利だと感じました。
PythonでFFmpegを使う方法 - Juliusの使用に向けて -

今回は、大語彙連続音声認識エンジンJuliusを使いたい。
Juliusを使うためには、音声ファイルを以下の形式に変換しておく必要があります。
- チャンネル数：1チャンネル（モノラル）
- サンプルレート：16000 Hz 
- ファイル形式：.wavファイル、ヘッダなしRAWファイル

今回は、PythonでFFmpegを実行してJuliusで使用できる形式に変換する。

# FFmpegのオプション
### サンプルレート
以下のように設定する。
```
-ar [サンプルレート] # 例：-ar 16000
```

### チャンネル数
以下のように設定する。
```
-ac [チャンネル数] # 例：-ac 1
```

# コマンドプロンプトでFFmpegを実行
まず、コマンドプロンプトで以下のようにFFmpegを実行して、Julius用に変換する。
```
ffmpeg -i [input_file] -ar 16000 -ac 1 output.wav
```
次のように変更結果を確認する。
```
ffprobe -i output.wav
```
結果が以下の通りになればOK
```
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, 1 channels
```

# PythonでFFmpegを実行
ソースコードを以下に載せております。
```ffmpeg.py
import subprocess

input_file = "input.mp4"
output_file = "output.wav"

args = ["ffmpeg", "-i", input_file, "-ar", "16000", "-ac", "1", output_file]

subprocess.run(args, stdout=subprocess.PIPE)
```
コマンドプロンプトで実行した時と同じ結果が出力されればOK。
以上、Windows環境のPythonでFFmpegを使う方法でした。

# 参考にしたページ
https://homemadegarbage.com/ffmpeg-wav-mp3
AWS Hands-on for Beginners 〜 スケーラブルウェブサイト構築編 〜

## はじめに
AWS Certified SysOps Administrator - Associateの試験ラボを乗り切るために、勉強していることをなんとなくメモっていきます。
　**基本的にハンズオンの内容は説明せずに気になった部分だけをメモ代わりに残していきます。**

行うこと
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/
〜〜スケーラブルウェブサイト構築編〜〜

本人情報
IT現場雑用員（SEで採用されながら一生Excel触ってる人）
半年前にAWS SAA取得済み

<br>

## 構築するアーキテクチャ
![Untitled Diagram.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/73322350-e4d4-0f7f-7ca6-6b3cbc7ff46c.png)

EC２インスタンスの負荷分散やRDSのマルチAZ構成などを通して冗長構成などを行います。
VPC作成　→  EC2作成　→ RDS作成　→ ELB作成　の順に行います。その後、２つの EC２、RDSのうち片方がダウンした後でも問題なくWord Pressで作成したWebサイトが閲覧できることを確認していきます。

<br>

## VPCの作成
![スクリーンショット 2022-03-12 15.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/63873406-0d89-5e7e-0af4-9009bcb19e89.png)
![スクリーンショット 2022-03-12 15.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/374fee4d-574e-3302-9bd5-ec8bebf4afc7.png)

VPC作成画面のレイアウトが大きく変更されていましたので、ここだけスクリーンショットを撮っておきます。VPC内のAZ、パブリックサブネット、プライベートサブネット、NATゲートウェイ、VPCエンドポイントをこの画面から一括で指定することができます。また、右側の図で何がどのように関連づいているかを視覚的に確認することができます。左側それぞれの項目の逆三角を押すとサブネットのCIDRブロックを指定できるため今回はこのように指定しました。

![スクリーンショット 2022-03-12 16.19.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/72f77bd1-f2a8-7eb4-5d9d-07d14183f99b.png)

名前は後から変更できます。



<br>


## 疎通確認
ハンズオン内ではwebページを表示するだけで疎通を確認していましたが、正直実感が湧かなかったのでcloud watch logsを使ってログ画面から負荷分散を確認したいと思います。

まずwebサーバーとして作成したEC２２つにCloudWatch Logs エージェントのインストールを行います。
~~~
yum install -y awslogs
~~~

次にインストールされたcloud watch logs　エージェントの設定ファイルを変更します。
~~~
[plugins]
cwlogs = cwlogs
[default]
region =ap-northeast-1
~~~

~~~
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/httpd/access_log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages
~~~

<br>
セキュリティグループのアウトバウンドルールにHTTPSを追加します。

![スクリーンショット 2022-03-13 0.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/b3aa6bb4-a4fc-91b2-54af-4bf36a53d86b.png)

<br>
同じく EC2インスタンスにCloudWatch　Logsへの書き込みを許可するIAMロールを設定します。

![スクリーンショット 2022-03-13 0.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/0a0ec567-421c-714b-3704-03bc050e237f.png)



それぞれのログストリームにELBからのアクセスログがあることが確認できました。
![スクリーンショット 2022-03-13 18.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/cdc3176b-e9ae-c6c8-55f5-14b4d1a3840c.png)


## あとがき
本編よりもcloud watch logsの設定の方が時間がかかってしまいました......
Alma Linux/Rocky Linuxにプリザンターをインストールしてみた

## CentOS Linux 8の代わりは・・・
CentOS Linux 8に.NET 6.0を入れようと思ったら、入れられない!?ようなので、代わりになるOSを探してみました。
どうやらAlma Linux、Rocky Linuxが代わりになるOSのようですね。

※Microsoftの[こちらのページ](https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-centos)によると、サポートされていないとのこと。

## isoファイルのダウンロード
各OSのisoファイルは下記ページからダウンロードしました。
#### Alma Linux
https://mirrors.almalinux.org/isos/x86_64/8.5.html
#### Rocky Linux
https://rockylinux.org/ja/download

## さっそくインストールしてみた
#### Alma Linux
色鮮やかですね～！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/04837769-0c34-b85c-fabd-43f67f7e812a.png)
#### Rocky Linux
シンプルですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/9a60e1ed-2931-bd09-8c45-cc5445e00df5.png)

## .NET 6.0のインストール
下記ページを参考に.NET6.0をインストールしてみました。
https://computingforgeeks.com/install-net-core-on-rocky-linux-almalinux-8/

#### Alma Linux
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/824d51af-20ea-19c2-18e2-b0aec7afa32b.png)
#### Rocky Linux
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/84192957-0afd-b0b3-2e89-f30b10c4aa5e.png)

## プリザンターのインストール
下記ページを参考にプリザンターをインストールしてみました。
https://pleasanter.org/manual/getting-started-pleasanter-centos

#### Alma Linux
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/394b8113-305a-b0b4-69c3-2c27e61912bc.png)
#### Rocky Linux
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/2d97ae30-7962-f00a-e9e8-2df47d58921c.png)

## さいごに
お手元のAlma Linux、Rocky Linuxの環境に、ぜひプリザンターをインストールしてみてください！
※本記事はあくまで自身の環境で試したものであり、ご使用の環境によって、手順等異なる部分がある可能性がございますのでご注意ください。
初心者ブロックチェーンに挑戦する　12

# 行き違い

## いや、コミュニティの問題ではなく

　[UNCHAIN](https://app.shiftbase.xyz/)の第一プロジェクト第四章第一節

　タイプミスは減ってきたというか、自力で見つけて直せるようになってきたが、反対に、根本的な理解を必要とする部分の「わからない」が増えた。というか、何がわからないかわからないので質問できない、的な。

そこまで深刻ではない問題としては、昨日、VSCodeにsolodityのパッケージ入れて発生した

- import "hardhat/console.sol";　 に赤波線　

Discordでの助言により

- import ../node_modules/hardhat/console.sol

　こう書きかえることで、警告が消えた。
　にもかかわらず、逆に走らない！
　エラーメッセージメモっておくの忘れたけれど、node_modulesなんてないよ的な。

　要はsolidity内部、あるいはVSCode内部での行き違いのようだ。私の手の届く範囲の問題ではなさそうなので、赤波線と共存して、先に進むことにする。

- PS コミュニティに投稿したら、早速直し方を教えてもらえたが、それ自体が私には難しいので保留。後日のためにメモ

1. vscodeのworkspaceをmy-wave-portalにする(ルートディレクトリにnode_modules が来るように)
2. .vscode/settings.json を追加
3.  settings.json に以下を追加
{
    "solidity.packageDefaultDependenciesContractsDirectory": "",
    "solidity.packageDefaultDependenciesDirectory": "node_modules"
}


## もやもやを抱えて

　4-1はなんとなく不完全燃焼なところで終わる。すべきことはやったから、あとはオリジナリティ発揮して仕上げてね、みたいな感じで4-2に続くのだ。フロントエンドのデザインとか、昔「ホームページビルダー」使い倒していた頃は、自分でコード書いたわけではないので、オリジナルでUI仕上げてね、というのは、実際とほうに暮れる事態だ。

　まだリミットの12時には十分に余裕があるけど、今日はここで止めて、UIのことなど考えることにしよう。
Rustで二次元配列内の最大値を取得したい

for文の二重ループでいちいち比較するコードを書くのが嫌だったのですが、調べてもあまり有用な情報にありつけず、以下のように回避しました。

```rust
let dist = vec![vec![2, 4, 5], vec![1, 3, 6]];
let max = dist
    .iter()
    .map(|v| v.iter().max().unwrap_or(&0))
    .max()
    .unwrap_or(&0);
println!("{}", max); //6
```

それぞれの最大値を`max`で取得した結果を、`max`で取得しました。
もう少しエレガントに書ける気もしますが、自分の調べた感じだとこのようになりそうです。。

**[2022/3/14追記]**
@ktz_alias さんに以下コメントにて紹介していただきましたので以下使いましょう！(エレガント)

```rust
let dist = vec![vec![2, 4, 5], vec![1, 3, 6]];
let max = dist
    .iter()
    .flat_map(|v| v)
    .max()
    .unwrap_or(&0);
println!("{}", max);
```

**[2022/3/14追記]**
@benki さんに以下コメントにて紹介していただきました！！！(エレガント!!!)

```rust
let dist = vec![vec![2, 4, 5], vec![1, 3, 6]];
let max = dist
    .iter()
    .flattern()
    .max()
    .unwrap_or(&0);
println!("{}", max);
```
平成の大横綱が語る「運」とはっ！

## 前書き

『「運」という不確実なものについて、世の先人たちが語る「運」には、ある種の共通項があるのではないか？』
毎日続けている読書感想文「１日１話」の記事の読書の中で、何度か「運」について語る先人たちの記事を読んできた私は、「運」について語る記事について「運シリーズ」というタグを振る感想文をQiitaの中でも書くことを始めた。
先人たちが語る「共通項」について考察し、エンジニアとして、人間として生きるためのヒントを掴もうというためである。

今日読んだ記事、致知出版社[『1日1話、読めば心が熱くなる365人の仕事の教科書』][1]の【11月18日】目。
元横綱白鵬、現間垣（まがき）親方が語る「運」。
それは、白鵬がファンであるという歌手の松山千春さんに教わった「運」。
そして、振り返ると自らも心掛けて実践していたことであったという。

[1]:https://www.amazon.co.jp/1%E6%97%A51%E8%A9%B1%E3%80%81%E8%AA%AD%E3%82%81%E3%81%B0%E5%BF%83%E3%81%8C%E7%86%B1%E3%81%8F%E3%81%AA%E3%82%8B365%E4%BA%BA%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E8%97%A4%E5%B0%BE%E7%A7%80%E6%98%AD/dp/4800912474




## 本題【11月18日】 ”たまたま”ということはない 白鵬翔 第六十九代横綱

白鵬 翔（現：間垣親方）。第六十九代横綱。最多幕内優勝（45回）、最長横綱在位（84場所）、最多幕内通算勝利（1093勝）、最多通算勝利（1187勝）、最多幕内全勝優勝（16回）の記録を打ち出し、ギネス世界記録にも認定される。
2021年現役引退後は、年寄・間垣（まがき）を襲名。
1985年生まれ。御年、37歳。

白鵬。モンゴル出身の平成の大横綱だ。とても強かった。
その言動・行動が横綱らしくないと周りから注意を受けたりすることもあったが、自分の信念を貫き、また、勝ち続けることで周りの小言を抑え込んだ。
この記事は2014年の雑誌「致知」7月号の対談記事。現役バリバリで横綱在位7年目の頃だ。
白鵬が語るのは、幕内力士に昇格するまでに「いつも心掛けていたこと」。自らは『運も良かった』と語る。
おや、「運」シリーズだ。

白鷗は語り出す。
>　私が十両に上がって関取になるまでの三年間、いつも心掛けていたのは、「稽古は本場所のごとく、本場所は稽古のごとく」ということ。
　あとは、なるべく人を怒らせないようにしようと。何ていうか、なるべく人を立てようという思いがありました。
　そういうことが勝負に生きたような気がします。

彼は『運もよかった』と振り返る。幕内力士に昇格出来た時もそうだったという。

>　普通なら上がれない勝ち星なのですが、たまたまその時武蔵丸関とか何人かが引退して、ガラッと空いたんです。
　それで私も繰り上げられたんですね。
　幕内力士の定員は四十二人です。その四十二人に入るために何百人という力士が鎬（しのぎ）を削っています。

>　ある人が言っていましたが、”たまたま”ということはないそうですね。そういう星の下に生まれた、という言い方をされて、ああ、なるほどなと思いました。
　また、歌手の松山千春さんとお話しした時、「”運”という漢字の意味が分かりますか」と聞かれ、私は漢字が分かりませんから、教えていただいたのですが、「”運”は”軍が走る”と書くから、戦わないと運は来ない」とおっしゃっていました。

なるほど。”軍が走る”と書くから運か。戦わないと運は来ない。
つまり、普段から自らの使命・本分に向かって挑戦し続ける人に「運」は来るのだ。
ボーッと生きていても運が来るわけではない。
白鵬たち力士の場合、相撲道の上位を目指して日々稽古に精進している力士に運が向いてくる。
『ある人』が白鵬に語ったという「”たまたま”ということはない」ということも同じような意味であろう。

白鵬は振り返る。
>　こういうふうに私はいろんなことを教えてくださる方にたくさん出会いました。
　相撲は結果を出してナンボの世界で、結果を出せば、十代や二十代ではとても会えないような方にも会えますからね。
　そういう機会も心の成長につながっていきます。
　やはりいろんな方の話を素直によく聞くことが、自分を成長させるために大切だと感じています。

”たまたま”ではあるが、今日、2022年3月13日は大相撲三月場所の初日であった。
そして、”たまたま”ではあるが、国連の常任理事国である世界のリーダー国であるべきロシアが、ウクライナに軍事行動を発動させ侵攻しており、いま、第二次世界大戦後最大の緊張が走っている。

ん？　「”たまたま”とうことはない」のだったっけ？　

この記事を私が今日、この日に読んだという事実が、そういう星の下に生まれた何かしらの運命であるということであれば、プーチンさんにひと言言おう。

相撲も他のスポーツもビジネスも社会も、ルールを守って切磋琢磨するから素晴らしいのだ。
ルールを守って切磋琢磨している人に「運」も付いてくる。
ルールを無視し、武力で脅し人を殺す戦争に「正義」も「平和」も語る資格はない。
当然、「運」が付いてくるということもなく、そもそも「運」を語る資格もない。
即刻戦争を止めるべきだ。まずは戦争を止めてほしい。話はそれからだ。

（参考）

https://ja.wikipedia.org/wiki/%E7%99%BD%E9%B5%AC%E7%BF%94#%E4%B8%BB%E3%81%AA%E6%88%90%E7%B8%BE

https://www.yomiuri.co.jp/sports/sumo/20211203-OYT1T50147/

https://www.chichi.co.jp/web/20200719_taihouxhakuhou/

https://www.sumo.or.jp/

## 後書き
以上、「運シリーズ」第8弾、**平成の大横綱が語る「運」とはっ！** でした。
最後までお読みいただきありがとうございました。

よろしければ、過去の「運シリーズ」も読んでいただければ幸いです。

https://qiita.com/takeC74/items/9030941082d9e08782e9

https://qiita.com/takeC74/items/30bcef3dbcfb595864d6

https://qiita.com/takeC74/items/fcc22c9a0e27bc8b0f46

https://qiita.com/takeC74/items/c496778447ea86ce8769

https://qiita.com/takeC74/items/5801a8e53e63153f86a6

https://qiita.com/takeC74/items/386a20e56d2cffa3bd94

https://qiita.com/takeC74/items/e2f51d395a6efc94d8c5
気象庁の過去気象データを Ruby でスクレイピング

このページで Python でやっているのと同じことを、Ruby でやってみたものです。

https://qiita.com/Cyber_Hacnosuke/items/122cec35d299c4d01f10

元ページは簡単な HTML の読み方についても解説されてあります。

# やること
気象庁のサイト（例えば[こんな感じ](https://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=14&block_no=47412&year=2007&month=1&day=&view=)）から、

``` 
札幌, 室蘭, 函館, 青森, 秋田, 盛岡, 山形, 仙台, 福島, 新潟, 金沢, 富山, 長野, 宇都宮, 福井, 前橋, 熊谷, 水戸, 岐阜, 名古屋, 甲府, 銚子, 津, 静岡, 横浜, 松江, 鳥取, 京都, 彦根, 広島, 岡山, 神戸, 和歌山, 奈良, 松山, 高松, 高知, 徳島, 下関, 福岡, 佐賀, 大分, 長崎, 熊本, 鹿児島, 宮崎
```

の都市の、

``` 
年月日, 陸の平均気圧(hPa), 海の平均気圧(hPa), 降水量(mm), 平均気温(℃), 平均湿度(%), 平均風速(m/s), 日照時間(h)
```

を取得し、csv形式でファイルに書き出します。

# 前提
「Nokogiri」という Gem が必要です。`gem install nokogiri`などでインストールして下さい。
Linux Mint 20.3 で実行したので、Windows では文字化けが起きるかも知れません。（追記：よく考えてみたら今回のはほぼ数値データしか扱っていないので、文字化けはたぶんないですね。）

# コード

```ruby:Ruby
require "nokogiri"
require "open-uri"
require "csv"

place_codeA = [14, 21, 23, 31, 32, 33, 35, 34, 36, 54, 56, 55, 48, 41, 57, 42, 43, 40, 52, 51, 49, 45, 53, 50, 46, 68, 69, 61, 60, 67, 66, 63, 65, 64, 73, 72, 74, 71, 81, 82, 85, 83, 84, 86, 88, 87]
place_codeB = [47412, 47423, 47430, 47575, 47582, 47584, 47588, 47590, 47595, 47604, 47605, 47607, 47610, 47615, 47616, 47624, 47626, 47629, 47632, 47636, 47638, 47648, 47651, 47656, 47670, 47741, 47746, 47759, 47761, 47765, 47768, 47770, 47777, 47780, 47887, 47891, 47893, 47895, 47762, 47807, 47813, 47815, 47817, 47819, 47827, 47830]
place_name = ["札幌", "室蘭", "函館", "青森", "秋田", "盛岡", "山形", "仙台", "福島", "新潟", "金沢", "富山", "長野", "宇都宮", "福井", "前橋", "熊谷", "水戸", "岐阜", "名古屋", "甲府", "銚子", "津", "静岡", "横浜", "松江", "鳥取", "京都", "彦根", "広島", "岡山", "神戸", "和歌山", "奈良", "松山", "高松", "高知", "徳島", "下関", "福岡", "佐賀", "大分", "長崎", "熊本", "鹿児島", "宮崎"]

base_url = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php"

place_data = place_name.zip(place_codeA, place_codeB)
place_data.each do |place, pc_a, pc_b|
  all_list = [['年月日', '陸の平均気圧(hPa)', '海の平均気圧(hPa)', '降水量(mm)', '平均気温(℃)', '平均湿度(%)', '平均風速(m/s)', '日照時間(h)']]
  puts place
  
  (2007..2017).each do |year|
    puts year
    (1..12).each do |month|
      url = base_url + "?prec_no=#{pc_a}&block_no=#{pc_b}&year=#{year}&month=#{month}&day=1&view=p1"
      
      body = Nokogiri::HTML(URI.open(url))    #サイトのHTMLを取得し、Nokogiriに流し込む
      sleep(1)    #サイト攻撃にならないためのマナー
      
      #Nokogiriから返ってきたオブジェクトを加工する
      body.css("tr.mtx").drop(4).each do |row|
        data = row.css("td").map(&:text)    #map(&:text)でtd要素の「中身」を得ている
        
        row_data = ["#{year}/#{month}/#{data[0]}"]
        col_idxs = [1, 2, 3, 6, 9, 11, 16]    #取得する列の一覧
        row_data += col_idxs.map { |i| data[i].to_f.to_s }
        
        all_list << row_data
      end
    end
  end
  
  #ファイルに書き出し
  CSV.open(place + ".csv", "w") do |csv|
    all_list.each { |row| csv << row }
  end
end
```

元の Python コードにないのは`sleep(1)`です。直接サイトにアクセスするので、マナーとして入れておきました。また、データをわざわざ一旦 Float に変換するのは、必要ない気もしますがそのままにしてあります。（追記。`"--".to_f`が`0.0`になることに気づいたので、コードを修正しました。）

なお、`sleep(1)`を入れてあるせいで、このコードをすべて実行するのにはかなりの時間がかかります。のんびりお待ち下さい。
CodePipelineとは？？

# まず始めに
この記事はCodepipelineについての自分なりの理解をまとめたものです。
間違いなどあればご指摘お願い致します。

# Codepipelineとは？
[公式](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/welcome.html)には以下の説明がされていました。
>AWS CodePipeline は、ソフトウェアをリリースするために必要なステップのモデル化、視覚化、および自動化に使用できる継続的な配信サービスです。ソフトウェアリリースプロセスのさまざまなステージをすばやくモデル化して設定できます。CodePipeline はソフトウェアの変更を継続的にリリースするために必要なステップを自動化します。

簡単にまとめると書いたソースコードを自動でビルド、またはデプロイ、テストしてくれるサービスの一つです。
一連の流れを**パイプライン**といい、ソースコードに対する処理を**アクション**といいます。
各アクションを行う部分を**ステージ**といい、そのステージは大きく分けて**ソース**、**ビルド**、**デプロイ**の3つ構成されています。
・ソース　　…S3バケットやGithub、CodeCommit内のソースコードを取得する処理。
・ビルド　　…ソースで取得してソースコードをサーバなしに構築やコンパイル、テストを実行できます。
・デプロイ　…ソースコードの配置、アプリケーションやサービスの更新などを行います。
ステージを2つ以上使用して、パイプラインを構成します。
また、各ステージで行ったアクション後のソースをテンプレートなどのデータの集合体**アーティファクト**として、別のステージへ共有します。

主な機能としては、ソースで用いる**CodeCommit**、ビルドを行う**CodeBuild**、デプロイを行う**CodeDeploy**の3つです。
それぞれの仕様をまとめていこうと思います。

# CodeCommit
ソースステージでS3やGithubとともに並ぶCodeCommitとは、前述したもと同様のGitリポジトリの一つで、ドキュメントやソースコードなどのアセットを保存、管理するAWSサービスです。
S3のファイルのバージョニングとの違いとしては、
バッチ管理における複数での変更が可能であることです。(S3では過去バージョンの管理、復元のみ)

# CodeBuild
CodeBuildでは任意のコンテナを起動し、ソースコード内や設定した任意のコマンドを実行します。
実行した結果はアーティファクトとして出力します。
実際の例としてはアプリケーションのテストやコンテナイメージのビルドとECRへのプッシュなどを実行できます。
各アクションのコマンドはbuildspecというソースを使用して実行します。
使用するコンテナ環境はカスタム可能で、あらかじめECRなどにプッシュして置けば、そのイメージが利用可能です。

# CodeDeploy
CodeDeployはECSやEC2、Lambdaなど様々なサービス、またはオンプレミスインスタンスへのデプロイを実行できるサービスです。
ビルドステージがなくとも、S3やGitリポジトリに保存されているアプリケーションなどをデプロイすることも可能です。
使う利点としては、自動化はもちろんのことエラー時のロールバック、各環境や複数アプリケーションへの同時デプロイが可能な点があげられます。

# 最後に
今回はCodePipelineの主な機能についてまとめてみましたが、この機能は実際に使用してみると奥が深く、様々なカスタマイズやアクションを組み合わせることが可能で、できることに上限はないと思います。
少しでも参考にしていただければと思います。
次は実際の使い方についてまとめてみようと思います。
　
最後まで読んでいただきありがとうございました。
flops_counterの使い方とインストール方法

## CNNの計算量
そこら中でやられているので、やってみた記事。Tipsも含めて。
例えばConvolution層の計算量（ここでは計算量をFLOPsと定義し、biasに関する計算は除く）は、下記のように表されます。

$$
FLOps = HWC_{in}K^2C_{out}
$$

ここで、$H,W,C_{in}$はそれぞれ入力画像の縦横チャンネル数。$K$はカーネルサイズで、$C_{out}$は出力のチャンネル数です。
基本的な内容ですので、興味がある人は[こちらの論文](https://arxiv.org/pdf/1611.06440.pdf)[^1]などを参照されると良いと思います。

これを全部の層について考えて、モデル全体でどのくらいあるのかを調べたいわけです。
演算の並列化や最適化があると厳密ではありませんが、だいたいの計算量の目安になります。

## flops_counter
Computer Vision界隈で有名なオープンソースのmmcvですが、こちらのutilityの中に、flops_counterというものがあります。その名の通り、モデルを与えるとFLOPsをカウントしてくれる、超絶便利なモジュールです。

使い方は下記のように行います。

```python
from mmcv.cnn.utils import flops_counter

model = <MODEL DEFINE>
input_shape = <INPUT SHAPE>
flops_counter.get_model_complexity_info(model, input_shape)
```

非常にシンプルです。

## 実際に動かしてみる

手元で適当な小さいPyTorchのモデルを作ってみます。
全結合層が二つ。途中に適当なReluとDropoutを入れています。
この二つは不要ですが、どのように表示されるか、見てみましょう。

```python
import torch.nn as nn
from mmcv.cnn.utils import flops_counter
net_seq = nn.Sequential(
    nn.Linear(100, 10),  #  weight:100x10=1000, bias:10
    nn.ReLU(),
    nn.Dropout(0.2),
    nn.Linear(10, 2)  # weight:10x2=20, bias:2
)
flops_counter.get_model_complexity_info(net_seq, (100,), as_strings=False)
```
実行結果
```bash
Sequential(
  0.001 M, 100.000% Params, 0.0 GFLOPs, 100.000% FLOPs, 
  (0): Linear(0.001 M, 97.868% Params, 0.0 GFLOPs, 97.087% FLOPs, in_features=100, out_features=10, bias=True)
  (1): ReLU(0.0 M, 0.000% Params, 0.0 GFLOPs, 0.971% FLOPs, )
  (2): Dropout(0.0 M, 0.000% Params, 0.0 GFLOPs, 0.000% FLOPs, p=0.2, inplace=False)
  (3): Linear(0.0 M, 2.132% Params, 0.0 GFLOPs, 1.942% FLOPs, in_features=10, out_features=2, bias=True)
)
(1030.0, 1032)
```

期待する結果通り、約1000回の演算と、1032個のWeightが表示されました。
（演算も1032を期待していたのですが、1030となりました。誰か理由を教えて。どこかで丸められているだけ？）

また、どの層でどの程度のパラメータがあるのか、など詳細に見ることが可能です。
お手軽で素晴らしいですね。

## flops_counter使用時のエラー
### 状況
pip install mmcv-fullなどをしたあとに、こんなエラーが出た人はこちらを参照してください。

```bash
RuntimeError: roi_width >= 0 && roi_height >= 0INTERNAL ASSERT FAILED at "/<PROJECT PATH>/mmcv/mmcv/ops/csrc/pytorch/cpu/roi_align.cpp":141, please report a bug to PyTorch. ROIs in ROIAlign cannot have non-negative size!
```

### 対策
- [ソースから直接インストールする。](https://mmcv.readthedocs.io/en/latest/get_started/build.html)
1. まずはソースのダウンロード。
   ```bash
   git clone https://github.com/open-mmlab/mmcv.git
   ```

2. 下記ファイルの140行目付近に、２行を追加する。

   ```cpp: mmcv/mmcv/ops/csrc/pytorch/cpu/roi_align.cpp
   T roi_width = roi_end_w - roi_start_w;
   T roi_height = roi_end_h - roi_start_h;
   if (roi_width < 0) roi_width = 0;  // この行を追加
   if (roi_height < 0) roi_height = 0;  // この行を追加
   if (aligned) {
     AT_ASSERTM(roi_width >= 0 && roi_height >= 0,
               "ROIs in ROIAlign cannot have non-negative size!");
   } else {  // for backward-compatibility only
     roi_width = std::max(roi_width, (T)1.);
     roi_height = std::max(roi_height, (T)1.);
   }
   ```

3. インストールをする
   ```bash: command on linux
   MMCV_WITH_OPS=1 pip install -e .
   ```

   ```bash: command on mac
   CC=clang CXX=clang++ CFLAGS='-stdlib=libc++' MMCV_WITH_OPS=1 pip install -e .
   ```

これで無事に実行できました。

[^1]: Pruning Convolutional Neural Networks for Resource Efficient Inference. P.Molchanov et al
Ubuntu 20.04 LTS 64bit版にlibzipをインストールする

# 概要
Ubuntu 20.04 LTS 64bit版にlibzipをインストールしようとしたら、困ったので備忘録として残す。

# 結論
これでうまくいった。少なくとも手元のzip.hをインクルードしたC言語ソースはビルドエラー出ない。
世の中の試行と結果をみると何かのパッケージのインストール状態が影響していて1つの方法に定まっていないのかもしれない。(根拠なし)

```
sudo apt install libzip5
```

# 過程
検索したら以下のコマンドでインストール！とあったので試したらダメだった。
```
sudo apt install libzip-dev
```
出てきたエラー
```
以下のパッケージには満たせない依存関係があります:
 libzip-dev : 依存: zlib1g-dev しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

では、zlib1g-devをインストールしよう。
```
sudo apt install zlib1g-dev
```

結果
```
以下のパッケージには満たせない依存関係があります:
 zlib1g-dev : 依存: zlib1g (= 1:1.2.11.dfsg-2ubuntu1) しかし、1:1.2.11.dfsg-2ubuntu1.2 はインストールされようとしています
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

zlib1g をインストールしてみると？
```
sudo apt-get install zlib1g
```

想定通りエラー
```
zlib1g はすでに最新バージョン (1:1.2.11.dfsg-2ubuntu1.2) です。
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:
```


一度アンインストールしてみるか？
```
sudo apt-get remove zlib1g
```
が、多くのパッケージが依存しているとしてエラーが出た。まぁそうなるだろうね…

debならどうか？
```
sudo dpkg -i libzip-dev_1.5.1-0ubuntu1_amd64.deb
```

やはりダメ
```
libzip-dev:amd64 (1.5.1-0ubuntu1) を展開しています...
dpkg: 依存関係の問題により libzip-dev:amd64 の設定ができません:
 libzip-dev:amd64 は以下に依存 (depends) します: zlib1g-dev ...しかし:
  パッケージ zlib1g-dev はまだインストールされていません。

dpkg: パッケージ libzip-dev:amd64 の処理中にエラーが発生しました (--install):
 依存関係の問題 - 設定を見送ります
```

libzipでググっているとlibzip4とかlibzip5というキーワードが出てくる。
サイト/ページの目的はこちらとはちょっとずれているようだが、もしや？

```
sudo apt install libzip5
```

インストールは完了した。

```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  libzip5
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
46.7 kB のアーカイブを取得する必要があります。
この操作後に追加で 134 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu focal/universe amd64 libzip5 amd64 1.5.1-0ubuntu1 [46.7 kB]
46.7 kB を 1秒 で取得しました (83.5 kB/s)
以前に未選択のパッケージ libzip5:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 243077 個のファイルとディレクトリがインストールされています。)
.../libzip5_1.5.1-0ubuntu1_amd64.deb を展開する準備をしています ...
libzip5:amd64 (1.5.1-0ubuntu1) を展開しています...
libzip5:amd64 (1.5.1-0ubuntu1) を設定しています ...
libc-bin (2.31-0ubuntu9.7) のトリガを処理しています ...
```

findするとzip.hがある。念のためOS再起動もしておく。
zip.hをインクルードしたC sourceがエラーを吐かなくなったのでよしとする。

# 感想
結構ヒットする libzip-dev のインストールでなぜエラーが出るのか分からない。

以上
SQLメモ

### 基本形
・テーブル内の情報を全て取得
```sql
select * from hogetable; 
```
・hogetableからnameカラムの値を全て取得
```sql
select name from hogetable;
```
・idが4の人の名前を取得する(文字列の場合は検索する値を「''」で囲む)
```sql
select name from hogetable where id = 4;
```

### IN
複数検索する時
・nameカラムの値が大城,佐藤,田中のIDを取得する
```sql
select id from hogetable name IN('大城','佐藤','田中');
```

### NOT IN
・nameカラムの値が大城,佐藤,田中以外のIDを取得する
```sql
select id from hogetable name NOT IN('大城','佐藤','田中');
```

### LIKE
・名前に '大城'　を含むレコードを抽出する。
```sql
select * from hogetable where name LIKE '大城%';
```

### OR/XOR
・条件Aもしくは条件Bに合致しているやつ(OR)
```sql
select * from hogetable where 条件A OR 条件B;
```
・条件Aもしくは条件Bに合致しているやつで両方合致しているやつは省く(XOR)
```sql
select * from hogetable　where 条件A XOR 条件B;
```

### ROUND
・数値10.037を小数第2位で四捨五入する
```sql
select ROUND(10.037,2) from hogetable;
```

### LENGTH
・国名 name と首都 capital が同じ長さの国の、国名と首都を表示する。
```sql
select name, capital from world where LENGTH (name) = LENGTH (capital);
```

### SUBSTRING
・国名と首都の先頭の文字が同じである国の、国名と首都名を表示する。ただし、国名と首都名が同じ場合は除く
```sql
select name,capital from world 
where SUBSTRING(name, 1, 1) = SUBSTRING(capital,1,1)
and not name = capital;
```
用語

# GUI
Graphical User Interface
ユーザーがマウスやタッチパネルで直接操作することができる画面のこと。
本来、開発者以外はデータを見ることができないが、データを理解しやすい形で表示できるGUIが開発されたおかげで、ユーザーはコンピュータの仕組みやコンピュータサイエンスの知識を持たずとも、アプリケーションからデータを見てコンピューターや電子機器を操作することができる。

https://recursionist.io/dashboard/course/15/lesson/286

# API
Application Programming Interface
他のプログラムと繋がるプログラムの総称。

# DOM
Document Object Model
document(HTMLファイル)のためのプログラミングAPI。
主にJavaScriptからHTMLを操作してブラウザに表示されるWebページの見た目を処理するための仕組みで、Webページのそれぞれの要素(オブジェクト)を木構造で表すことによって、プログラム側から管理、アクセス、操作、保存を容易にするもの。

https://eng-entrance.com/what-is-dom

# document
ブラウザが読み込むメインのHTMLファイルを JavaScript では「document」と呼び、JavaScriptではそれにアクセスするために必要な「document」というオブジェクトと、特定の状態やメソッドがパッケージ化された DOMというデータ構造を提供している。DOMというAPIを利用することでそのデータ構造を操作でき、ファイルを読み書きが可能になっている。

# Webアプリケーション
手元の端末内にプログラム本体が保存されるネイティブアプリと違って、Webアプリケーションではユーザーがブラウザを使ってインターネット上でWEBサーバー内にあるプログラムにアクセスする。
例えば、開発者はJavaScriptが提供するライブラリ（Webアプリケーションでは、DOM が提供するデータ構造や関数を主なレンダリング用ライブラリとする。）を使うと、ブラウザに何を、どこで、どのようにデータをレンダリングするかを指示することができる。

https://www.kagoya.jp/howto/it-glossary/web/webapplication/

#

#

#

#

#

#

#
ウクライナで起きていることをデータとしてアーカイブ

# 概要

ウクライナの衛星画像が、見たい。

# 参考にしたページ

https://github.com/mapconcierge/Ukraine2022data

# cesium  storiesで、worldview(maxar)の衛星画像が見れる。


https://cesium.com/ion/stories/viewer/?id=8be6f99c-0d4c-46ce-91a3-313e3cac62fe


以上。
AstroでERROR: Unexpected "Component"

# 発生した問題
Astroを使っていて、他コンポーネントをimportするとエラーが出た。
```js
---
const{title="THIS IS A PAGE"} = Astro.props;
import Navbar from "../components/Navbar.astro"
---
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680862/bde42d04-9da6-7141-812a-d5e796595536.png)
なんでさ!?
ちゃんとNavbarはフロントマターの中でimportしているのに……。
# 解決した方法
```js
---
import Navbar from "../components/Navbar.astro"
const{title="THIS IS A PAGE"} = Astro.props;
---
```
フロントマターの中で、propsを取り出すより前にimportしたら直った。
【Rails】主キー以外でテーブル間を関連付ける

## 前提条件
以下のような関係性を想定します。
`staff（職員）`の中には、`manager（マネージャー）`の権限を持っている者がいて、
`manager`は`assessment(評価)`することができる。
今回は赤枠`(manager-assessments)`に焦点を絞る。
（「初めからmanager_idを主キーにすればいいじゃん」
というツッコミは今回スルーさせていただきます。m(_ _)m  ）  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/630bb79e-6121-3c9f-d44d-237cb8943e74.png)

## やりたいこと
`primary_key`を意図的に変更したい。
（関連づけの際に主キー`（primary_key）`を選択しない場合、（Rails が空気を読んで）
`manager_id`が`primary_key`になる。）

## 方法
以下をモデルに追記すればOK
```Manager.rb
has_many :assessments, primary_key: 'staff_id', foreign_key: 'input_staff_id'

has_many :子(複数形), primary_key: 主キーになるカラム, foreign_key: 外部キーにしたい関連先のカラム
```

```Assessment.rb
belongs_to :manager, primary_key: 'staff_id', foreign_key: 'input_staff_id'

belongs_to :親(単数系), primary_key: 主キーにしたい関連先のカラム, foreign_key: 外部キーになるカラム
```
上記の設定をすることでいつものRailsらしい書き方ができる。
```ruby
特定のマネージャーに紐づく、評価を全て取得したい
manager = Manager.find_by(staff_id: 10)
manager.assessments  
```

## 参考にした記事

[Railsで主キーをid以外に設定し、ほかのテーブルとアソシエーションを結ぶ](https://qiita.com/tanutanu/items/6c53b5290eaa9bf905d3)

↓ 関連づけでエラーが出れば以下を参照↓
[Validation failed: モデル must existエラー](https://qiita.com/tanaka7014/items/50a1a953b3f440cbe481)
勉強メモ42_シートの内容コピーしてiniなどの環境設定ファイルをテキストで作成

## 0 はじめに

シートの内容をコピーしてテキストファイル　例えばiniファイルなどの環境設定ファイルを作成する方法のメモ

## 1 Excelファイルのシート名と中身の内容と置き場所
置き場所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/faf85ea0-22ec-314d-157b-56633ea8c8e1.png)
シート名と中身の内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/8fba849b-4b17-8453-52a5-8fb1859396ab.png)

## 2 VBAのソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/e368c851-cd66-dfc3-ac09-b31ae714a37f.png)

```vb:
Option Explicit

'Excelのシートから環境設定ファイルを作成
Sub makeIniFile()
    Dim startFilePath As String
    startFilePath = ThisWorkbook.Path & "\" & "paypaApri_shukei.ini"
    
    Worksheets("環境設定ファイル").Copy
    Application.ScreenUpdating = False
    ActiveWorkbook.SaveAs Filename:=startFilePath, FileFormat:=xlText
    ActiveWorkbook.Close
    Application.ScreenUpdating = True
    'ファイル作成終了メッセージ
    MsgBox ThisWorkbook.Path & "\" & "paypaApri_shukei.ini" & "を作成しました。"
    
End Sub

```

## 3 VBA実行時の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/117df0cd-aa9c-fc72-4936-b0191d0f3310.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/98908968-5bf9-d629-4224-b7317529454c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730323/3b931af8-cbd1-b3ce-f961-4f775ca9c563.png)