OmniAICreator/Qiita-1.07M huggingface dataset:
rails7.2から`TestFixtures#fixture_path`が廃止されるためrails 7.1では`DEPRECATION WARNING: TestFixtures#fixture_path is deprecated`が発生する

# 発生する理由

`rspec_helper.rb`の中で以下のように`fixture_path`を指定してテストケースで参照している場合に`DEPRECATION WARNING`が発生します。

```ruby:rspec_helper.rb
config.fixture_path = Rails.root.join('spec/fixtures')
```

```ruby:spec/sample_spec.rb
Rack::Test::UploadedFile.new("#{fixture_path}/test.txt")
```

### DEPRECATION WARNING

```
DEPRECATION WARNING: TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2. Use #fixture_paths instead.  If multiple fixture paths have been configured with #fixture_paths, then #fixture_path will just return the first path.
```

rails 7.2から`TestFixtures#fixture_path`が廃止されるため代わりに`#fixture_paths`を使用する必要があるとのことです。

https://github.com/rails/rails/pull/47675


# 対応

## `rspec-rails`

bundleされているrailsのバージョンが7.1以上の場合は`fixture_paths`がconfigに設定可能になる様なので以下のコミットが含まれたバージョンがリリースされたら`rspec-rails`を更新します。

https://github.com/rspec/rspec-rails/commit/8429760b5100d2aa00e9453db102d5386b0a745b

前述したテストファイルを以下の様に修正します。

```diff:rspec_helper.rb
- config.fixture_path = Rails.root.join('spec/fixtures')
+ config.fixture_paths = [
+   Rails.root.join('spec/fixtures')
+ ]
```


```diff
- Rack::Test::UploadedFile.new("#{fixture_path}/test.txt")
+ Rack::Test::UploadedFile.new("#{fixture_paths.first}/test.txt")
```
ntp

```
[linuxstudy@localhost ~]$ sudo ntpdate ntp.nict.jp      //時刻の同期
[sudo] linuxstudy のパスワード:
12 Jul 18:02:15 ntpdate[11216]: step time server 133.243.238.243 offset 742499691.267028 sec
[linuxstudy@localhost ~]$ date
2023年  7月 12日 水曜日 18:02:24 JST         //正しい時刻になった
[linuxstudy@localhost ~]$ host ntp.nict.jp
ntp.nict.jp has address 61.205.120.130
ntp.nict.jp has address 133.243.238.243
ntp.nict.jp has address 133.243.238.244
ntp.nict.jp has address 133.243.238.164
ntp.nict.jp has address 133.243.238.163
ntp.nict.jp has IPv6 address 2001:ce8:78::2
ntp.nict.jp has IPv6 address 2001:df0:232:eea0::fff4
ntp.nict.jp has IPv6 address 2001:df0:232:eea0::fff3
[linuxstudy@localhost ~]$ sudo ntpdate -q ntp.nict.jp
[sudo] linuxstudy のパスワード:
server 61.205.120.130, stratum 1, offset -2.719226, delay 0.08287
server 133.243.238.244, stratum 1, offset -2.699823, delay 0.07071
server 133.243.238.163, stratum 1, offset -2.329411, delay 0.09416
server 133.243.238.164, stratum 1, offset -2.843979, delay 0.07439
server 133.243.238.243, stratum 1, offset -2.280362, delay 0.06973
12 Jul 18:05:40 ntpdate[11299]: step time server 133.243.238.243 offset -2.280362 sec
```
chronyc

```
[linuxstudy@localhost ~]$ sudo chronyc[sudo] linuxstudy のパスワード:
chrony version 3.4
Copyright (C) 1997-2003, 2007, 2009-2018 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> makestep             //いますぐ同期
200 OK
chronyc> tracking
Reference ID    : 7AD7F034 (122x215x240x52.ap122.ftth.ucom.ne.jp)
Stratum         : 3
Ref time (UTC)  : Wed Jul 12 09:25:26 2023
System time     : 0.000000000 seconds slow of NTP time
Last offset     : -0.014968553 seconds
RMS offset      : 131531592.000000000 seconds
Frequency       : 28.344 ppm fast
Residual freq   : +48.763 ppm
Skew            : 3.503 ppm
Root delay      : 0.134579659 seconds
Root dispersion : 0.044130549 seconds
Update interval : 64.8 seconds
Leap status     : Normal
chronyc> sources                  //時刻源情報
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^+ mail1.marinecat.net           2   6   177    54  +9004us[+9004us] +/-   72ms
^* 122x215x240x52.ap122.ftt>     2   6   177    56  -8873us[  -24ms] +/-   93ms
^- 45.77.27.63.vultrusercon>     3   6   137    56    +15ms[  +15ms] +/-  263ms
^+ sv1.localdomain1.com          2   6   177    58    -13ms[  -28ms] +/-   78ms
chronyc> ^D
[linuxstudy@local
```
SolidityのNatSpecコメントとその用法について


**概要**

Smart contract開発では、ソースコードの可読性や保守性を高めるために、正しくドキュメンテーションを行うことが非常に重要です（Smart contractに限った話ではないですが）。Solidityでは、このためにNatSpec（Natural Specification）と呼ばれる特殊なコメント機能が提供されています。この記事では、SolidityのNatSpecコメントの各タグについて詳しく説明します。

**NatSpecとは**

NatSpecは、EthereumのSmart Contractsのためのドキュメンテーションフォーマットです。開発者はこの形式を使用して、Smart Contractsとその関数の振る舞いについて詳細な説明を提供できます。

**主なNatSpecタグとその用法**

以下に、NatSpecの主なタグとその用法について解説します。

1. `@title`:

   `@title`タグは、コントラクトのタイトルを定義します。一つのコントラクトにつき一つだけ指定可能です。

   ```solidity
   /// @title A simple greeter contract
   contract Greeter {
       // ...
   }
   ```

2. `@notice`:

   `@notice`タグは、ユーザーに表示するための説明を提供します。これは、関数やコントラクト全体に関する説明文を作成するのに使われます。

   ```solidity
   /// @notice Calculate the sum of two numbers
   function add(uint a, uint b) public pure returns(uint) {
       return a + b;
   }
   ```

3. `@dev`:

   `@dev`タグは、開発者向けの詳細な説明を提供します。コードの内部ロジックや注意事項をここで説明します。（個人的に頻度高め）

   ```solidity
   /// @dev Be aware that this function does not check for overflows
   function multiply(uint a, uint b) public pure returns (uint) {
       return a * b;
   }
   ```

4. `@param`:

   `@param`タグは、関数のパラメータについて説明します。各パラメータは新たな`@param`タグで説明されます。

   ```solidity
   /// @param a The first number
   /// @param b The second number
   function subtract(uint a, uint b) public pure returns (uint) {
       return a - b;
   }
   ```

5. `@return`:

   `@return`タグは、関数の戻り値について説明します。

   ```solidity
   /// @return The difference of a and b
   function subtract(uint a, uint b) public pure returns (uint) {
       return a - b;
   }
   ```

6. `@inheritdoc`:

   `@inheritdoc`タグは、スーパーコントラクトから注釈を継承します。

   ```solidity
   /// @inheritdoc SuperContract
   function myFunction() public {
   }
   ```

以上が主なNatSpecのタグです。これらを適切に使用することで、Solidityのコードはより読みやすく、理解しやすいものになります。

**まとめ＆所感**

最初はSpring bootっぽいなーって思ったけど全然違いました。
Cargoから提供される環境変数のスコープ

Rustにおいて、Cargoからcrateのバージョンなどの情報がビルド時に登録される。
これを`env!`のマクロでコードから取得することができる。

https://doc.rust-lang.org/cargo/reference/environment-variables.html

ただこの情報はどのcrateの情報なのか気になったので検証してみた。つまり、
- buildしているbinのcrateの情報
- `env!`で呼び出した箇所のcrateの情報

どちらが出るかが気になった。大抵こういう情報はcliツールで呼び出すのでbinのcrateと`env!`の情報が同じなので問題にならないが、たまたま呼び出し元のcrateのバージョンを取得したかったので検証することにした。

やったことは単純に呼び出し元のlibのcrateで`env!`で取得した値を返す関数を呼び出し先のbinのcrateで呼ぶだけである。

```rs:sub-crate/lib.rs
pub fn get_name() -> &'static str {
    env!("CARGO_PKG_NAME")
}
```


```rs:main-crate/main.rs
fn main() {
    println!("{}",sub_crate::get_name());
}
```

結果は…

```
sub-crate
```

だった！なので`env!`で呼び出し元の環境変数を取得できるようだ。
Google map apiを使ってvue.jsで地図を描画する。


# はじめに

何かAPIを使ってみたかったので、Google map apiを使ってvue.jsで地図を描画してみました。


# 環境

### バージョンなど

```
OS
macOS Big Sur 11.3
```

```
%  vue -V
@vue/cli 5.0.8
```

```
$ node -v
v18.0.0
```

```
$ npm -v
8.6.0
```




# 注意
最新の状態を確認して下さい。

# 参考さまはこちら
https://www.npmjs.com/package/vue3-google-map

# 最終更新日
2023年7月12日


# 状況

プロジェクトは作成状態。

```
% tree
├── src
│   ├── App.vue
│   ├── assets
│   │   └── logo.png
│   ├── components
│   │   ├── HelloWorld.vue
│   │   └── Test.vue
│   ├── index.css
│   ├── main.js
│   ├── page
│   │   └── index.vue
│   └── router
│       └── index.js
└── vue.config.js
```

↓

https://www.npmjs.com/package/vue3-google-map

これをとってくる。

↓

```
 % npm install vue3-google-map

added 1 package, and audited 1041 packages in 7s
109 packages are looking for funding
  run `npm fund` for details
5 high severity vulnerabilities
To address all issues (including breaking changes), run:
  npm audit fix --force
Run `npm audit` for details.
```
↓

https://console.cloud.google.com/

で　google-mapを有効にする。
そして、どうにかAPIのキーを作る。
（作り方はたくさんの方が書いてるのでググってみてください・・・）
![無題3594_20230712175521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/53a2fcad-1cc1-29d7-f857-69d7c6a04afc.png)

↓

```main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'

createApp(App)
.use(router)
.mount('#app')
```
↓

```Test.vue
<template>
  <GoogleMap api-key="ここにAPIキーを貼り付ける" style="width: 100%; height: 500px" :center="center" :zoom="15">
    <Marker :options="{ position: center }" />
  </GoogleMap>
</template>

<script>
import { defineComponent } from "vue";
import { GoogleMap, Marker } from "vue3-google-map";

export default defineComponent({
  components: { GoogleMap, Marker },
  setup() {
    const center = { lat: 40.689247, lng: -74.044502 };

    return { center };
  },
});
</script>
```

↓

起動し直す。

```
% npm run serve              

> my-project@0.1.0 serve
> vue-cli-service serve

 INFO  Starting development server...
```


# 終わり

じゃーん

![スクリーンショット 2023-07-12 17.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/82ed1ee2-ddde-7933-a444-8bfe82d69856.png)
C#とVB.NETでPDF から画像を抽出する

PDFから画像を抽出することは、PDF文書内の画像リソースを効果的に管理し活用するための重要な手段です。これらの画像は、変換や編集、再利用、印刷など、さまざまな目的に活用できます。この記事では、Javaプログラムを使用してPDFから画像を抽出する方法について詳しく解説します。

## プログラム環境
* [Free Spire.PDF for .NET](https://www.e-iceblue.com/Introduce/free-pdf-component.html#.ZH_ihWdByUk)
* Visual Studio 2022

## DLLファイルのインポート
* Visual Studioを開いて新しいプロジェクトを作成します。
* 「Solution Explorer」で「References」を右クリックします。
* 「NuGet Manage Packages」を選択します。
* Free Spire.PDF for .NETを検索してインストールします。

または、この[リンク](https://www.e-iceblue.com/Download/download-pdf-for-net-free.html)から直接ダウンロードすることもできます。
* Visual Studioを開いて新しいプロジェクトを作成します。
* 「Solution Explorer」で「References」を右クリックします。
* 「Add Reference」を選択します。
* 「Browse」をクリックします。
* DLLを検索してインストールしてプロジェクトにインポートします。

## コード
C#：
```c#
using Spire.Pdf;
using System.Drawing;

namespace ExtractImages
{
    class Program
    {
        static void Main(string[] args)
        {
            //PdfDocumentインスタンスを作成する
            PdfDocument pdf = new PdfDocument();

            //PDF をロード
            pdf.LoadFromFile("sample.pdf");

            int i = 1;
            //すべてのページをループする
            foreach (PdfPageBase page in pdf.Pages)
            {
                //各ページから画像を抽出し、指定したパスに保存する
                foreach (Image image in page.ExtractImages())
                {
                    image.Save(@"C:/Users/Administrator/Desktop/Images/" + "image" + i + ".png", System.Drawing.Imaging.ImageFormat.Png);
                    i++;
                }
            }
        }
    }
}
```
VB.net
```vb
Imports Spire.Pdf

Namespace ExtractImages
    Friend Class Program
        Private Shared Sub Main(ByVal args As String())

            'PdfDocumentインスタンスを作成する
            Dim pdf As PdfDocument = New PdfDocument()

            'PDF をロード
            pdf.LoadFromFile("sample.pdf")
            Dim i = 1

            'すべてのページをループする
            For Each page As PdfPageBase In pdf.Pages

                '各ページから画像を抽出し、指定したパスに保存する
                For Each image As Image In page.ExtractImages()
                    image.Save("C:/Users/Administrator/Desktop/Images/" & "image" & i & ".png", Drawing.Imaging.ImageFormat.Png)
                    i += 1
                Next
            Next
        End Sub
    End Class
End Namespace
```
## 説明
1. Spire.PdfおよびSystem.Drawingの名前空間をインポートします。
2. PdfDocumentクラスのインスタンスを作成します。
3. LoadFromFileメソッドを使用して、PDFファイルを読み込みます。
4. ページごとに画像を抽出し、指定したパスに保存します。
5. 画像はPNG形式で保存されます。
6. 最後に、それぞれの画像にユニークな名前を付けるために、カウンター変数iを使用します。
## 効果イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/5055e496-a624-c47c-8391-45849083a864.png)
上記の方法を参照して、このライブラリを通じて [PDFを圧縮](https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/Document-Operation/How-to-Compress-PDF-Document-in-C-VB.NET.html)し、PDFに[画像の透かし](https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/Watermark/Add-image-watermark-to-pdf-in-C.html)と[テキストの透かし](https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/PDF-Watermark-Add-Watermark-in-PDF-with-C-VB.NET.html)を挿入することもできます。
rex0220 計算式プラグイン 作業者の所属組織・グループ

計算式プラグインで、作業者の所属組織とグループを取得してみます。

# 概要

プロセス管理の作業者情報をステータス変化のタイミングと作業者を変更したタイミングで取得し、所属組織・グループの項目に設定します。

※計算式プラグイン Ver.65 以降でサポート
※上長の情報を取得する場合、ユーザー数等が多いと画面表示の処理時間が長くなります。

![2023-07-12_17h38_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7c4a8779-b453-bb0c-fdf6-bb22efc65763.png)

# 操作例

![2023-07-12_17h53_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1c378fd3-9db1-52b3-14bd-39cb6cddcc85.gif)

# 画面フォーマット

![2023-07-12_17h55_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/00697adc-c6fe-81f2-f861-d6fd67100b67.png)

# 計算式プラグインの設定

![2023-07-12_17h55_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d052a0f3-8a6c-9c75-19b8-1ffc22a891e3.png)

```.js
// 作業者コピー USER_SELECT
SET_CODE(
  SEL_CODE(作業者,"array")
)

// 作業者上司 USER_SELECT
LET(a,SEL_CODE(作業者,"array"), // 作業者コード
  b,UINFO(UINFO(a,"#boss"),"code"), // 上司コード
  SET_CODE(b)
)

// 作業者所属組織 ORGANIZATION_SELECT
SET_CODE(
  OINFO(UINFO(
    SEL_CODE(作業者,"array"),"orgs"
  ),"code")
)

// 作業者所属グループ GROUP_SELECT
SET_CODE(
  GINFO(UINFO(
    SEL_CODE(作業者,"array"),"groups"
  ),"code")
)

```

```LET 関数を使った例.js
// 作業者所属グループ GROUP_SELECT
LET(a,SEL_CODE(作業者,"array"),  // 作業者コード
  b,UINFO(a,"groups"),  // 所属グループ文字列
  c,GINFO(b,"code"),  // 所属グループコード配列
  SET_CODE(c)  // グループ選択設定
)
```

各ステップ毎の取得値例

- SEL_CODE(作業者,"array"),  // 作業者コード
    - ->["営業太郎"]　：作業者コードの配列
- UINFO(a,"groups"),  // 所属グループ文字列
    - ->["kintone-manage,everyone"]　：グループコード文字列（csv）の配列
- GINFO(b,"code"),  // 所属グループコード配列
    - ->["kintone-manage","everyone"]　：グループコードの配列
- SET_CODE(c)  // グループ選択設定
    - -> [{"code":"kintone-manage"},{"code":"everyone"}]　：グループ選択設定用のオブジェクト
【Python】Pytestで3種類のテストをやってみる

# 初めに

私は最近QA分野にはまっており、QAエンジニア資格であるJSTQBのシラバスを読んでいます。

シラバス31ページ`2.2 テストレベル`にはテストの種類が書いてあります。

今回はその3種類のテストをPytestでやってみます。

# テスト対象は`FizzBuzz`

テストする都合上、Fizz&Buzzの判定を関数化しています。

```python
def IsFizz(num: int)-> bool:
    return num % 3 == 0

def IsBuzz(num: int)-> bool:
    return num % 5 == 0

def main():
    for i in range(10, 16):
        if IsFizz(i) and IsBuzz(i):
            print("FizzBuzz")
        elif IsFizz(i):
            print("Fizz")
        elif IsBuzz(i):
            print("Buzz")
        else:
            print(i)

if __name__ == "__main__":
    main()
```

# テストしてみる

## コンポーネントテスト

コンポーネントテストは部品単位に焦点を当てたテストです。

別名「単位テスト」とも呼ばれます。

今回であれば`IsFizz関数`と`IsBuzz関数`がテスト対象になります。

また `main関数` はシステム全体の統括を担っているためコンポーネントテスト対象外になります。

### テスト内容

`IsFizz関数`と`IsBuzz関数` が正常に判定ができるかテストします。

```python
class TestComponent:
    """コンポーネントテスト"""
    
    def test_IsFizz(self):
        assert main.IsFizz(3)

    def test_IsBuzz(self):
        assert main.IsBuzz(5)
```

## 統合テスト

統合テストはコンポーネントやシステム間に焦点を当てたテストです。

今回はFizzBuzzとなる数字を判定するため、`IsFizz関数`と`IsBuzz関数` を組み合わせがテスト対象になります。

### テスト内容

FizzBuzzとなる数字を`IsFizz関数`と`IsBuzz関数` に渡してFizzBuzzとなるかテストします。

```python
class TestIntegration:
    """コンポーネントテスト"""
    
    def test_FizzBuzz(self):
        num = 15
        assert main.IsFizz(num) and main.IsBuzz(num)
```

## システムテスト

システムテストはシステム全体の振る舞いに焦点を当てたテストです。

今回はシステム全体を統括している`main関数`をテストします。

### テスト内容

main関数は10~15の数字にFizzBuzz判定を行ってその結果をprintしています。

そのためprintされた結果をテストします。

```python
class TestSystem:
    """システムテスト"""
    
    def test_main(self, capfd):
        main.main()
        out, err = capfd.readouterr()
        assert out == 'Buzz\n11\nFizz\n13\n14\nFizzBuzz\n'
        assert err is ''
```

## テストコード全体

```py
import main

class TestComponent:
    """コンポーネントテスト"""
    
    def test_IsFizz(self):
        assert main.IsFizz(3)

    def test_IsBuzz(self):
        assert main.IsBuzz(5)

class TestIntegration:
    """コンポーネントテスト"""
    
    def test_FizzBuzz(self):
        num = 15
        assert main.IsFizz(num) and main.IsBuzz(num)

class TestSystem:
    """システムテスト"""
    
    def test_main(self, capfd):
        main.main()
        out, err = capfd.readouterr()
        assert out == 'Buzz\n11\nFizz\n13\n14\nFizzBuzz\n'
        assert err is ''

```

# 参考にしたJSTQBのシラバス

https://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018V31.J03.pdf
Gitコマンド 備忘録

Git学習の備忘録兼、チートシートのようなもの

```Git:Gitコマンド
git branch
```
ブランチを確認する

```Git:Gitコマンド
git branch <branch名>
```
ブランチを作成する


```Git:Gitコマンド
git checkout <branch名>
```
ブランチを移動する

```Git:Gitコマンド
git branch -m <変更前のbranch名> <変更後のbranch名>
```
ブランチ名を変更する

```Git:Gitコマンド
git branch -d <branch名>
```
ブランチを削除する

```Git:Gitコマンド
git checkout -b <branch名>
```
ブランチを作成して、作成したブランチに切り替える


```Git:Gitコマンド
git add <変更したファイル>
```
変更したファイルをstaging areaに追加します。

```Git:Gitコマンド
git commit -m "<message>"
```
stading areaの変更をコミットする

```Git:Gitコマンド
git merge <マージするブランチ>
```
変更したブランチを、今いるブランチにマージすることができる。

```Git:Gitコマンド
git diff <branch名> <branch名>
```
ブランチ間の差分を確認する
「Microsoft Teams」のチャット通知をMacのDockに表示する方法

こんにちは。E-kan株式会社の岡田です。

先日、現場のコミュニケーションツールが「Google Chat」から「Microsoft Teams」に変わったのですが、設定をデフォルトのままでいたところチャットの通知がDockに表示されず、メンションに丸一日気づかないという自体が発生したので急いで設定を変えました。
備忘録として残しておこうと思います。

まずは設定を開きます。
右上の「…」から設定を選択。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/2dacbfd2-c076-6111-d829-7e300b18d582.png)

「通知」メニューの中にある「通知スタイル」を「Teamsの組み込み」から「Mac」に変更する。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/d24342b0-9ae0-2d5f-fab8-b2d9da4435a2.png)

これでチャットに発言があった場合はDockのTeamsアイコンに赤い通知が現れるようになります。
受け取りたい通知は「チームとチャンネル」の項目で設定出来ます。

私はとりあえずチャットを見逃すのが怖いのでリアクション以外はすべてオンにしています。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/3cf11b00-9452-b398-cb33-b34e08c2c5ae.png)

Teamsは自社でも使っているツールなのですが、自社の場合は基本的にビデオ通話をメインで使っていてチャットは別のツールなので特に通知設定をしていなかったのですよね。
使い慣れていない機能は怖いわ…
Threads（スレッズ）の特徴や使い方は？現段階で分かったことをまとめました

たび重なる仕様変更で混乱が続く「Twitter」に対抗し得るSNSに成長するかもしれないと話題の「Threads（スレッズ）」が、7月6日朝（日本時間）からサービスの提供を始めました。
![threads.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508810/6f00627d-60b9-666f-c245-47e93c0da674.jpeg)


【画像解説】Threads（スレッズ）の特徴や使い方をまとめました！

Threadsの開発元は、InstagramやFacebookで知られるメタ社。Twitterと同じように、文字だけでも投稿できるほか、画像や動画も投稿できます。

Instagramの公式TwitterはThreadsについて、「Threadsが登場 - 最新情報を共有し、会話に参加できる新しいアプリ」と説明しています。

どうやってアカウントを作って始めればいいのか、そして現段階で分かっている特徴についてまとめました。

Threadsの始め方
①Threadsは7月6日現在、AndroidとiOS版のアプリが提供されています。Google PlayストアまたはApp StoreからThreadsのアプリをダウンロードしてください。

②アプリを開いたら、紐づけたいインスタグラムのアカウントを選択します。インスタグラムのアカウントがないと利用できないようです。

③プロフィールを設定します。インスタグラムのプロフィールをそのまま使うことも可能です。

④プライバシー設定で、プロフィールを公開するか、非公開にするか選びます。

Threadsの始め方①⑤フォローする人を決めます。インスタグラムで元々フォローしていた人をそのままフォローできます。

⑥Threadsの規約などを確認し、「Threadsに参加する」を押すとアカウントができます。

現段階で分かったThreadsの特徴は？
Twitterによく似たデザインのThreadsですが、違う部分もあるようです。現時点で分かっている10の特徴をご紹介します。

・投稿できる画像は最大10枚
・プロフィールにリンクを一つ、なんでも貼れる
・URL投稿ができる️
・全角で最大500字投稿できる。タイムライン上でもそのまま表示される
・検索機能で探せるのはアカウントのみ。投稿は探せない模様
・タイムラインにはオススメのみ。自分のフォロワーのみの表示はできない
・ハッシュタグは効かない、メンションは可能
・アカウントの切り替えができないので、ログアウトする必要あり
・（現時点では）パソコンからだと開けない
・リツイートではなく「再投稿」。「引用」で引用リツイート的なこともできる

Threadsの今後の動向に注目です。
Threads video downloader: https://snapthreads.net/
リーダーとして成長するためには

# リーダーに求められる要件
リーダーシップとは、その人自身が優れた業務遂行能力を持つことでなく、組織の人材の能力を高め、それを生かす行動である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510329/1861f83f-5512-8e3b-e2b7-359144638e71.png)

# コーチングスキル
コーチングスキルには以下6つがある
- スキル1「聞く」
- スキル2「質問」
- スキル3「ペーシング」
- スキル4「アクノレッジメント」
- スキル5「提案」
- スキル6「タイプを知る」

## スキル1「聞く」 
聞かれることでアイデアや考え方が明確になる　
- 最後まで聞く。途中で意見を言わない
- 否定しない
- あいづちで話しやすくする
- 声のトーン：相手の気持ちを察する
- 姿勢：感情は姿勢に現れる
- 表情・視線：感情に現れる

## スキル2「質問」
視点を変え、思考の枠を超えるきっかけを作る
- 質問の目的を明確にする
- オープンクエスチョンを多く用いる
  - 5W1H（いつ、どこ、だれ、なに、なぜ、どのように）
- クローズドクエスチョンは確認することを目的に用いるようにする
  - Yes or Noで答える質問
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510329/e687e58a-5cbb-84ff-b432-b440cae351b2.png)

## スキル3「ペーシング」
相手に合わせ、防衛本能を納め信頼関係を築く
- バーバルのペーシング
  - 相槌（なるどの、へぇー、そうなんだ）
  - 接続詞（それで？）
  - 同じ言葉を反復する
- ノンバーバルのページング
  - 声のトーン、話す速度
  - 視線・表情
  - 姿勢
- 行動のペーシング
  - 話しかけられたら聞く姿勢をとる
 
## スキル4「アクノレッジメント」
「その人がそこにいるということに気付いている」このことを知らせる
 - 観察して変化を伝える
 - 成果や成長を伝える
 - 1メッセージで自分の感じていることを伝える
 - 相談する。任せる
 
## スキル5「提案」
選択肢を増やし可能性を広げる
- 相手から引き出してから提案する
- 事前に許可をとる
- 内容は具体的に、明確に伝える
- 提案する理由（体験、情報）を伝える
- Yes/Noの選択を相手に委ねる

## スキル6「タイプを知る」
人はそれぞれ違う
以下4つに分類できる。
- コントローラ
- プロモータ
- アナライザ
- サポータ

### コントローラ
行動的で自分が思った通りに物事を進めることを好む
- 承認方法
  - 達成時にタイミングよく、素直に伝える
- 要望対応
  - 短く、簡潔に、単刀直入に
  - 選択肢をいくつか用意する
  - 全面的に任せる
 
### プロモータ
アイデアを大切にし、人と活気のあることをするのを好む
- 承認方法
  - 回数は多く
  - 感嘆符（！）のつく表現が機能する「さすが！」「すごい！」
- 要望対応
   - 「君だから」「期待してるよ」の一言が機能する

### アナライザ
行動に際して多くの情報を集め、分析、計画を好む
- 承認方法
  - 専門的な知識や技術を承認する
  - 具体的に承認する
- 要望対応
  - 要望の目的・内容・段取りを事前に、詳細に伝えておく
  - 相手のペースを乱さない

### サポータ
他人を援助することを好み、協力関係を好む
- 承認方法
  - 努力、気配り、貢献を承認する
  - 1メッセージが機能する「君のお陰で助かっているよ」
- 要望対応
  - ノンバーバルのメッセージに注意を払い、要望が相手の許容範囲を超えないようにする

## NGマネジメント方法
- マイクロマネジメント
- 権力やエゴを介したマネジメント
- きちんと耳を傾けない
- 社員を軽視する
  - 社員に対し、成長のチャンスやメンタリングの機会を与えない
  - 各社員のスキルや長所にあった、成果をあげるのにもっとも適した場所でそれを活用させない
- 信頼の欠如
指じゃんけんWebアプリのモード追加

# １．はじめに
　先日、SKJvillageの動画内で作られた謎ゲーム「**指じゃんけん**」を遊ぶことができるWebアプリを開発しました！今回は、「ハードモード」「extraモード」を加えてみたので紹介します。

↓前回の記事

https://qiita.com/nyar_ramen/items/37aa7b996e9c612f31f0

# ２．SKJvillageとは？
　[SKJvillage](https://www.youtube.com/@SKJVillage)は、3人組のゲーム実況系YouTubeチャンネル。高校時代の親友で「早稲田・慶應・上智」大学にそれぞれ進学し、大手企業を退職後、2018年に３人でYoutube活動開始。
(https://www.youtube.com/@SKJVillage/about より参考)

# ３．指じゃんけんについて
　改めて指じゃんけんとは何かを紹介します。指じゃんけんは下記のリンクに掲載した動画内のくだりであり、マリオメーカーの勝敗を決めるために行われたゲームです。指で１から５を作り遊びます。

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

ルールを以下にまとめます。

・出す手は1から５
・基本的には数字が大きい方が勝ち
・同じ数字は両者負け
・1は5に勝てる
・2は5に勝てる(ここだけ2がチョキ✌, 5がパー✋になり普通のじゃんけんになる)
・3と4の場合は両者勝ち

これらのルールは動画内でsa2が言ってた内容をまとめたものになります。

# ４．追加したゲームモード
## ハードモード
　このモードは、SKJvillageのメンバーである、「sa2」「サイカツ」「シンカ」全員に勝つというモードです。
　今回の仕様は、同時に3人という形式を取っています。本来は、1人に勝ったら次の人が現れるという仕様にしたかったのですが、なかなか上手くいきませんでした。。。絶対リベンジします！(プログラムは割愛します。)

## Extra
　秘密のパスワードを知ってる人だけが遊べるExtraモードです。正しいパスワードが入力されるとラスボスが出てきます。秘密のパスワードは、このWebアプリでちゃんと遊んでくれた人だけ知ることができます。
　ラスボスですが、激ムズ設定にしています。皆さんが勝てる確率を1/Sai(Sai=206)に設定しています。約0.5%です。ちなみに作成者の私はまだ1回も勝ってませんｗかれこれ300回ぐらいやってますｗ

# ５．実際のWebアプリ
　以下がWebアプリのリンクです。遊んだことない人はぜひチュートリアルとしてノーマルから遊んで見てください！

https://nyarramen-skj-fingerjanken-skj-janken-4yoi3m.streamlit.app/

# ６．今後の計画
　前回の記事でも記載した内容が含まれています。
・人と対戦(Streamlitだとキツイ。。。)
・出力される画像の種類を増やす
・プレイヤーの手から学習して強くなる対戦相手(CPU)を導入
・対戦相手のメンバーごとに出す手の癖を導入(シンカはロマンを求めて1,2を出しやすいなど)
・哀川チョキを増やす(?)
★ハードモードの仕様を変更

　特に最後の★は重要だと思っています。遊んでいただいた方に「リセマラできるやん」って言われてグサッときました。みなさんの興味がなくなっても必ず変更します！！

# 感想
　最後まで見ていただきありがとうございます！SKJvillageを見る中で「指じゃんけんみたいなゲーム化できるくだりないかなあ」と待ってる自分がいますｗ

　みんなが飽きても俺はいろいろ作ります！それでは、バイバイシンカチャンネル
timezone, utc

```
[root@localhost system]# export TZ=America/New_York
[root@localhost system]# date
Wed Jul 12 04:37:33 EDT 2023
[root@localhost system]# export TZ=Asia/Tokyo
[root@localhost system]# date
Wed Jul 12 17:38:26 JST 2023
```
tzselectで指定可能なタイムゾーンを調べる
```
[root@localhost system]# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 2
Please select a country.
 1) Anguilla		  19) Dominican Republic    37) Peru
 2) Antigua & Barbuda	  20) Ecuador		    38) Puerto Rico
 3) Argentina		  21) El Salvador	    39) St Barthelemy
 4) Aruba		  22) French Guiana	    40) St Kitts & Nevis
 5) Bahamas		  23) Greenland		    41) St Lucia
 6) Barbados		  24) Grenada		    42) St Maarten (Dutch)
 7) Belize		  25) Guadeloupe	    43) St Martin (French)
 8) Bolivia		  26) Guatemala		    44) St Pierre & Miquelon
 9) Brazil		  27) Guyana		    45) St Vincent
10) Canada		  28) Haiti		    46) Suriname
11) Caribbean NL	  29) Honduras		    47) Trinidad & Tobago
12) Cayman Islands	  30) Jamaica		    48) Turks & Caicos Is
13) Chile		  31) Martinique	    49) United States
14) Colombia		  32) Mexico		    50) Uruguay
15) Costa Rica		  33) Montserrat	    51) Venezuela
16) Cuba		  34) Nicaragua		    52) Virgin Islands (UK)
17) Curaçao		  35) Panama		    53) Virgin Islands (US)
18) Dominica		  36) Paraguay
#? 49
Please select one of the following time zone regions.
 1) Eastern (most areas)	      16) Central - ND (Morton rural)
 2) Eastern - MI (most areas)	      17) Central - ND (Mercer)
 3) Eastern - KY (Louisville area)    18) Mountain (most areas)
 4) Eastern - KY (Wayne)	      19) Mountain - ID (south); OR (east)
 5) Eastern - IN (most areas)	      20) MST - AZ (except Navajo)
 6) Eastern - IN (Da, Du, K, Mn)      21) Pacific
 7) Eastern - IN (Pulaski)	      22) Alaska (most areas)
 8) Eastern - IN (Crawford)	      23) Alaska - Juneau area
 9) Eastern - IN (Pike)		      24) Alaska - Sitka area
10) Eastern - IN (Switzerland)	      25) Alaska - Annette Island
11) Central (most areas)	      26) Alaska - Yakutat
12) Central - IN (Perry)	      27) Alaska (west)
13) Central - IN (Starke)	      28) Alaska - western Aleutians
14) Central - MI (Wisconsin border)   29) Hawaii
15) Central - ND (Oliver)
#? 1

The following information has been given:

	United States
	Eastern (most areas)

Therefore TZ='America/New_York' will be used.
Local time is now:	Wed Jul 12 04:36:49 EDT 2023.
Universal Time is now:	Wed Jul 12 08:36:49 UTC 2023.
Is the above information OK?
1) Yes
2) No
#? 1

```
service, timer

1 シェルを用意する(/home/root/sample.sh)
```
#!/bin/sh -v
    echo "this is sample.sh" >> ~/sample.sh.log
    date >> ~/sample.sh.log
```
2 サービスを用意する(/etc/systemd/system/timer-test.service)
```timer-test.service
[Unit]
Description="this is test-time-service"

[Service]
ExecStart=/home/linuxstudy/sample.sh
```
3 timerを用意する(/etc/systemd/system/timer-test.timer)
```timer-test.timer
[Unit]
Description="test timer2"

[Timer]
OnActiveSec=1min       //初回起動は1分後
OnUnitActiveSec=1hour    //2回目以降は1時間毎
Unit=timer-test.service

[Install]
WantedBy=multi-user.target
```
サービス有効化、タイマー有効化、起動
```
[root@localhost system]# systemctl enable timer-test
[root@localhost system]# systemctl enable timer-test.timer
Created symlink from /etc/systemd/system/multi-user.target.wants/timer-test.timer to /etc/systemd/system/timer-test.timer.
[root@localhost system]# systemctl start timer-test.timer
```
タイマー状況一覧。17:17起動予定
```
[root@localhost system]# systemctl list-timers
NEXT                         LEFT     LAST                         PASSED       
Wed 2023-07-12 17:17:01 JST  29s left n/a                          n/a          
```
次回は18:17(1時間後)
```
[root@localhost system]# systemctl list-timers
NEXT                         LEFT       LAST                         PASSED     
Wed 2023-07-12 18:17:53 JST  58min left Wed 2023-07-12 17:17:53 JST  1min 25s ag
```
シェルで書き込んだログ
```
this is sample.shWed Jul 12 17:17:53 JST 2023
/root/sample.sh.log (END)
```
Java 基礎の基礎2

# はじめに
- Javaの学習を始めたので、備忘録その2
- 基礎の基礎からしっかりと

[基礎の基礎1](https://qiita.com/takayuki91/items/be28a8da35c7a8a4d0c3)

# 学んだこと
- インクリメント・デクリメント演算子
- 比較演算子
- 論理演算子
- 反転

# インクリメント・デクリメント演算子
```java
//X+1をしてから、YにXを代入
Y = ++X
//YにXを代入してから、X+1
Y = X++
//X-1をしてから、YにXを代入
Y = --X
//YにXを代入してから、X-1
Y = X--
```

# 比較演算子
```java
//X=Y
X == Y
//X≠Y
X != Y
//XがYより大きい
X > Y
//XがYより大きいか同じ
X >= Y
//XがYより小さい
X < Y
//XがYより小さいか同じ
X <= Y
```
# 論理演算子
### 論理積
```Java
//XかつY
X && Y
```

### 論理和
```Java
//XもYも評価
X | Y
//XがtrueならYを評価
X || Y
```

# 反転
```Java
!true => false
!false => true
```

# まとめ
- 論理和の「|」と「||」の違いに注意
- 後は大丈夫そう

⚠️学習4ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。
OpenMPを用いて多重ループを高速化する場合

## 目的
C言語でOpenMPを用いて、並列化を行い高速化を図る場合、思うように高速化がされない場合がある。その一つの例が多重ループを用いた時である。今回は多重ループを持ちいる場合のOpenMPを正しく使う方法を解説する。

## TL;DR
多重ループをする場合は、ループの内側だけか両側に `#pragma omp parallel for`を置いてあげないといけない。

正解例 (両側配置)
```openmp.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <omp.h>

double start,end;
int a[50][40], i, j;

int main(void){
start = omp_get_wtime();
  #pragma omp parallel for
  for(i = 0; i < 50; i++) {
    #pragma omp parallel for
    for(j = 0; j < 40; j++) {
      a[i][j] = i*j;
    }
  }
end = omp_get_wtime();

printf("Time:%e(sec)\n",end-start);


return 0;
}
```
（内側配置）
```openmp.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <omp.h>

double start,end;
int a[50][40], i, j;

int main(void){
start = omp_get_wtime();
  for(i = 0; i < 50; i++) {
#pragma omp parallel for
    for(j = 0; j < 40; j++) {
      a[i][j] = i*j;
    }
  }
end = omp_get_wtime();

printf("Time:%e(sec)\n",end-start);


return 0;
}
```
## 計測結果
- OpenMP無し
```
$ ./a.out
Time:2.463534e-05(sec)
```
- OpenMP有
```
$ ./a.out
Time:1.131900e-03(sec)
```


## 間違い例
外側だけ配置していると上手く行かない
```間違い.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <omp.h>

double start,end;
int a[50][40], i, j;

int main(void){
start = omp_get_wtime();
  #pragma omp parallel for
  for(i = 0; i < 50; i++) {
    for(j = 0; j < 40; j++) {
      a[i][j] = i*j;
    }
  }
end = omp_get_wtime();

printf("Time:%e(sec)\n",end-start);


return 0;
}
```
Server/Client コンポーネントの抽象的な使い分け基準

サーバーコンポーネントとクライアントコンポーネントは、アプリケーションの設計や開発において重要な役割を果す。抽象的な使い分け基準を下記で説明する

![99378EC9-41E2-42B5-975F-B81E88E44E8D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557072/5c79e075-4bdf-dcd7-c484-53faeca927fe.jpeg)



## サーバーコンポーネント
サーバーコンポーネントは、データや処理を提供する。

1. データの処理と保管: サーバーコンポーネントは、データベースやAPIにアクセスし、データの作成、整形、更新、削除などの操作を実行する。

2. ビジネスロジックの実行: サーバーコンポーネントは、クライアントからの要求に基づいてビジネスロジックを実行する。例えば、予約金額の計算、予約情報の検証、入力データのバリデーションなど。

3. セキュリティと認証: サーバーコンポーネントは、ユーザーの認証やセキュリティの管理を行う。ユーザーのログイン、アクセス制御、データの保護など。

## クライアントコンポーネント
クライアントコンポーネントは、UIとユーザーのインタラクションを提供する。

1. ユーザーインターフェース: クライアントコンポーネントは、ユーザーが操作するためのインターフェースを提供する。これには、Webアプリケーションのフロントエンド、モバイルアプリケーションの画面などが含まれる。

2. ユーザーの入力の処理: クライアントコンポーネントは、ユーザーからの入力（ボタンのクリック、フォームの入力など）を受け取り、サーバーコンポーネントに送信する。

3. UXの改善: クライアントコンポーネントは、ユーザーに対してスムーズな操作や視覚的なフィードバックを提供し、使いやすさやUX向上に貢献する

## 使い分け
- ビジネスロジックやデータの処理は、セキュリティ上の理由やパフォーマンスの観点からサーバーコンポーネントに配置する。

- ユーザーインターフェースやユーザー操作に関連する要素は、クライアントコンポーネントに配置する。

- クライアントとサーバーの間でデータの送受信が必要な場合、APIを使用して相互に通信する。クライアントはAPIを介してサーバーにデータを送信し、サーバーはAPIを通して結果を返す。

- サーバーコンポーネントはセキュリティ上の重要な機能を担当するため、適切な認証やアクセス制御の実装が必要である。


具体的な要件やアプリの性質によって最適な使い分けが異なる場合もある。設計や開発の際には、システム全体の要件や目標を考慮し、適切なコンポーネントの配置を決定することが重要である。

以上
【効率化などやりたいこと】#1

##  【効率化などやりたいこと】

業務効率を上げたいって、誰しも思いますよね。
早く仕事終わらせたいですから。
自分が考えているアイデアというか、効率化したいことを列挙します。
これらは、ほぼ全企業同じように悩んでるんじゃないかな？

もし解決できている会社があれば、教えてください。

なお、AIが業務でも使える感じになってきたので、それもイメージしてみました。
AIってまだまだ、通常業務と別のレイヤで動いてて、日常業務に入り込んでないよなー。
自分のスキルでは一つも出来ないけど、何とかならんですか？

とりあえず、こんなことをここに書いてよいかわからないので、まず一つ掲載します。
問題があれば削除するのでご指摘ください。

## １．文書の自動校正は、AIにお任せしたい！
数名で作成したドキュメント、色々な目的で作成した資料を寄せ集めたドキュメント、等合成資料のレビューをすると、体裁のチェック結構入るよね。

英数字は半角に統一、ですます調の統一、句読点チェック、段落のインシデントや番号の振り方などの統一、用語の全角半角統一、タイポなど、機械的に修正できる範囲は自動で修正してほしい。

一つ一つの修正は、ある程度は一括で出来るものもあるが、何かルールを設定しておいて、一括で修正できると修正漏れが無くなる。

そもそも、そのルールだってある程度定型化されているので、部内報告パターン、経営会議報告パターンみたいに選ぶだけがいいな。

こんなのって、全ての会社の全業務共通の悩みじゃない？
AI全盛期なのに、こんな単純作業を、相変わらず人間が行ってます。
担当者はこの辺りの修正は結構気を遣うので、AIがチェック＆修正を行ってくれれば、心理的負担も減らせる。

なお、ある程度定型が出来てしまえば、それほど大量な知識も必要とは思えないので、セキュリティーを考慮すると、ローカルアプリでの実現が望ましい。

ちなみに、インデントとか番号振りとか、ワードはめっちゃ統一しにくいので、この機能が充実したワード形式の編集プログラムか、ワープロそのもの、誰か作りませんか？

それとも、既に何かいいものありますかね。
SSHの環境を検知して自動でmatplotlibのGUIをブラウザで表示する

## Abstract

SSHで接続している時は、matplotlibを利用してプロットしていると通常はGUIが使えません。
Matplotlibでは、そのような状況ではバックエンドを変更することで対処することができます。
しかしながら、次のようなケースでは、面倒なことになります。

- 普段は研究室(職場)のPCで作業をしているが、たまにSSHで自宅から接続して、自宅のPCで作業を行う

普段使う時と自宅から使う時で毎回matplotlibのバックエンドを変更するのは面倒です。
本記事では、SSH接続中かどうかを判定して、自動でバックエンドを変更する仕組みを紹介します。

## 結論

```python
import os
import atexit
import matplotlib as mpl

def is_under_ssh_connection():
    # The environment variable `SSH_CONNECTION` exists only in the SSH session.
    return 'SSH_CONNECTION' in os.environ.keys()

def use_WebAgg(port = 8000, port_retries = 50):
    """use WebAgg for matplotlib backend.
    """
    current_backend = mpl.get_backend()
    current_webagg_configs = {
        'port': mpl.rcParams['webagg.port'],
        'port_retries': mpl.rcParams['webagg.port_retries'],
        'open_in_browser': mpl.rcParams['webagg.open_in_browser'],
    }
    def reset():
        mpl.use(current_backend)
        mpl.rc('webagg', **current_webagg_configs)
    
    mpl.use('WebAgg')
    mpl.rc('webagg', **{
        'port': port,
        'port_retries': port_retries,
        'open_in_browser': False
    })
    atexit.register(reset)


if is_under_ssh_connection():
    use_WebAgg(port = 8000, port_retries = 50)
```

普段実行するmatplotlibもファイルで、上記コードを貼り付ければオッケーです。
VSCodeで実行していると、自動でPort Forwadingが行われるので、指示通りブラウザで開くもヨシ。VSCodeのタブで開くもヨシ。

## 解説

### SSH接続のセッションかどうかを判定する

`SSH_CONNECTION`という環境変数を確認することで、セッションがSSH接続かどうかを判定できます。

https://kazuhira-r.hatenablog.com/entry/2023/01/05/235018

Pythonでは、環境変数は`os`モジュールを利用すればよいので、次のように書けば判定が可能です。

```python
def is_under_ssh_connection():
    return 'SSH_CONNECTION' in os.environ.keys()
```

### WebAggとは

matplotlibはバックエンドを切り替えることで、様々な環境で作成したグラフを開くことができます。
多くの場合、通常はバックエンドは Qt4Agg などです。
これは描画する処理を何にするかや、GUIの表示方法をどうするかを定義していて、普段`plt.show()`するとGUIが開くのはこのバックエンドがGUIのウィンドウを作って開くものに設定されているからです。

WebAggでは、ブラウザでグラフを表示することを可能にするバックエンドの一つです。
`plt.show()`すると、設定されたポートでサーバーを立てて表示します。

その他にもたくさんありますので、公式ドキュメントに目を通してみてください。

https://matplotlib.org/stable/users/explain/backends.html

### `atexit.register`とは

プログラムが終了する時に呼ばれる関数を定義できる標準モジュールを利用した実装です。
`mpl.use('WebAgg')`はグローバルに設定を変更するので、プログラムが終了したら実行前に戻るようにしています。
直前のものではなく、既定のものに戻す場合は`def reset()`の部分を次のようにしてみてください。

```python
def reset():
    mpl.use(mpl.rcParamsDefault['backend'])
    ...
```
githubの変更するときの操作まとめ

gitのremote urlを変更する(レポジトリ移行時)

現在のリモートURLを確認する
```
git remote -v
```
新しいリモートURLに変更する(sshのurlを使用)
```
git remote set-url origin　git@github.com:xxxx/Practice.git
```
リモートリポジトリの削除


git branch -m を使用してブランチ名を変更する。
オプション -m はブランチ名の変更

引数を1つ指定した場合 カレントブランチ名の変更
```
git branch -m NEW_BRANCH_NAME
```
カレントブランチ名を、引数で指定したブランチ名に変更する
あらかじめ、名前変更したいブランチにcheckoutしておく必要がある


引数を2つ指定した場合　　指定したブランチ名の変更
```
git branch -m OLD_BRANCH_NAME NEW_BRANCH_NAME
```
1つ目の引数で指定したブランチの名前を、2つ目の引数で指定したブランチ名に変更する
カレントブランチに関わらず指定したブランチの名前を変更できる
既に存在しているブランチ名を指定した場合はエラーとなるが、 -M オプションを使用することで強制的にブランチ名を変更することが可能 (もともとあったブランチは消える)
```
git push -u origin NEW_BRANCH_NAME
```
リモートの OLD_BRANCH_NAME のブランチ名が変更されているわけではなく、NEW_BRANCH_NAME という別名のブランチが新規作成されていることに注意。

つまり、リモートには変更前のブランチが残ってしまっている。
```
git push origin --delete 変更前のブランチ名
(省略形)
git push origin :変更前のブランチ名
```
「キーロガー」はどのマルウェアに分類されるのか

### はじめに
マルウェアを勉強していくうちに、キーロガーが様々な種類のマルウェアに分類されていることを知りました。
混乱している人もいると思うので、簡単にまとめてみました。

### キーロガーとは
キーボード操作の内容（履歴）を記録するソフトウェア、またはハードウェアの総称です。

### 侵入経路
・ソフトウェアタイプ：主にメールなどを経由してパソコンに侵入
・ハードウェアタイプ：ソーシャルエンジニアリングがUSB端子に接続して侵入

※ソーシャルエンジニアリング：技術を使用せずにパスワードを盗み出すこと。
例：電話で巧みにパスワードを聞きだしたり、清掃員に変装してキーロガーを接続する等。

### キーロガーはどのマルウェアに分類されるのか

**結論、キーロガーは、「トロイの木馬」と「スパイウェア」の一種に分類されます。**

前提としてマルウェアは、大別するとトロイの木馬・ウイルス・ワームに分けられます。
（他にもスパイウェア、ランサムウェア、バックドア、スケアウェアで分ける場合もありますが、派生なので今回は省いています）
　マルウェアは昨今、IT技術の発展により、時間経過と共に数・種類が増え、複雑になってきています。
それぞれの動きに特徴や役割がありますが、必ずしも異なる挙動をするわけではありません。
そのため、複数の種類のマルウェアに分類されることは必然ということです。
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501557/0e4283e5-fdb0-83cf-2535-6b2c73bd5234.png)
### キーロガーの被害にあった場合
不正アクセスされてしまいます。
キーボード操作の記録されているので、ログインIDとパスワードを盗まれます。それに伴い、ログイン情報を使って、サービスに不正アクセスされてしまう恐れもあります。


### まとめ
今回は代表してキーロガーに着目してマルウェアの分類について記載しました。
キーロガーの基本知識と、マルウェア分類の考え方について理解を深められたら幸いです。
ですが今でも新しいマルウェアが増えてきて、分類がどんどん複雑になってきています。
一つずつ対象のマルウェアがどのマルウェアに分類されるか暗記するより、マルウェアの特徴や役割をとらえて分類していく方が効率も良いと思います。

https://qiita.com/mizushino/items/d2857c0fed815ff84219
ExcelのText関数で和暦変換がうまくいかない場合がありました

# 事象
Excel VBAで日付を和暦の文字列に変換するためにWorksheetFunction.Textメソッドで第2引数に"ggge年m月d日"と指定したところ、特定の環境では西暦で返ってきた。

```
Debug.Print WorksheetFunction.Text(Now(), "ggge年m月d日")
```
"令和5年7月12日"（実行日）と出力されることを期待しているが、"2023年7月12日" と出力された。

# 原因
Officeの編集言語が日本語以外の言語になっていた。

# 対応方法１
Officeの編集言語を日本語にする。和暦を扱うんだから日本語使えの精神。
[ファイル]-[オプション]で Excelのオプション（下記）を表示し、[Officeの編集言語と校正機能]で[日本語]を選択して、[優先として設定(P)]で変更します。
![of.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119086/6be1127f-f5e7-506a-08db-1e0b00d3b23d.png)

# 対応方法２
対応方法１ができない場合、プログラム的に対処することもできます。
WorksheetFunction.Textメソッドで第2引数にロケールIDを含めて書式を指定します。
```
Debug.Print WorksheetFunction.Text(Now(), "[$-411]ggge年m月d日")
```

以上です。

Excelの和暦変換について説明しているサイトは初心者向けやそこそこ中級者向けっぽいサイトなどで山のようにありますが、上記の事象についての説明があるサイトは見つけられず、原因の特定にかなり時間がかかりましたのでここに残しておきます。

最後に蛇足ですが、Format関数ではこの問題はおきないようです。なんでや。
Tailwind CSSを使ってかわいく文字をグラデーションさせながら跳ねさせる

# はじめに
おそらくかなり需要しかない記事。みんなロード画面とか作ってる時に文字をグラデーションさせながら跳ねさせたくなるよね。つくってみたよ。
# Code
```html
<div className="absolute inset-0 flex flex-col items-center justify-center bg-gray-50 py-12">
      <div className="animate-bounce">
          <h1 className="background-animate font-extrabold text-8xl bg-clip-text bg-gradient-to-r from-indigo-500 via-sky-500 to-emerald-500 text-transparent text-center p-5 mb-4 leading-none text-gray-900">
                Loading...
          </h1>
      </div>
</div>
```
# イメージ
もうちょっとぬるぬるだから、試してみてね
![画面収録-2023-07-12-15.45.01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997280/6318917e-ac8a-63e5-238f-356418af7027.gif)
おわり
Autoware.Universeを4Kモニターで使う場合の注意点

# 概要

最近新調したPCにAutoware.Universeを導入したところ、Rviz2が正常に立ち上がらない問題が発生した。GitHubのIssuesに似た問題がないかを調べたところ、どうやら4Kモニターとその設定が問題だったようなので現象の内容と解決策をメモとして残す。

## 現象
チュートリアルを実行しようとしたとき、Rviz2の画面が起動後すぐに終了する。
Rviz2単体だけを起動する場合は発生しない。

https://autowarefoundation.github.io/autoware-documentation/main/tutorials/ad-hoc-simulation/planning-simulation/

## 環境

* 自作PC
    * Ubuntu22.04
* ディスプレイ
    * 4Kモニター×2台
    * 両方とも倍率200%で使用


## 結論
私の場合は4Kモニターを倍率200%で使っていたことが原因みたいで、倍率を100%に戻したところ問題が発生しなくなりました。

割と最近Issuesにこの問題が登録されています（2023年7月12日現在まだOpen)

https://github.com/autowarefoundation/autoware/issues/3173

読んでみると解像度に関する問題がいくつか出ているようなので、4Kモニターを使っている人はチェックしておくといいかもしれません。

## 参考

以前、以下のような記事を書きましたが使っているディスプレイはこのときと同じためディスプレイ周りの問題だった可能性があります。時間があればチュートリアルを一通り実行してみようと思います。

https://qiita.com/np_hsgw/items/4e585f272771ecb908ab

https://qiita.com/np_hsgw/items/53974ac9aa9c4943455b
zlsof command - display open/delete files,sockets and pipes

When you want to list open files, sockets and pipes. zlsof command is useful.

Display open files in /tmp directory
```
zlsof /tmp
```

Display delted files
```
zlsof -d
```
Note : You must be root user if you want to display allusers files.

https://www.ibm.com/docs/en/zos/2.5.0?topic=scd-zlsof-display-information-about-open-files-sockets-pipes
ABC309 - D - Add One Edge 自己解法

# 問題

https://atcoder.jp/contests/abc309/tasks/abc309_d

# 考察
無向グラフがあります。連結している頂点の集まりを「島」と呼ぶことにします。問題では島が2つあることが保証されてます。そして頂点$1$と頂点$N_1 + N_2$は必ず別々の島にあることも保証されています。それぞれの島のいずれかの頂点を辺で結びたいです。さらにこの時、頂点$1$と頂点$N_1 + N_2$との距離がありえる中で最大にしたいようです。そのあり得る距離を求めてくださいという問題です。(問題ページの「入力例・出力例1」に掲載されている図を見ると理解しやすいです。)

頂点$1$と頂点$N_1 + N_2$まで移動するには、新たに結ぶ辺を通る必要があります。そのため、「頂点$1$を含む島の中で頂点$1$からの距離が最大の頂点」と「$N_1 + N_2$を含む島の中で頂点$N_1 + N_2$からの距離が最大の頂点」同士に新たに辺を結べば題意を満たす無向グラフになります。これが分かれば下記の式に当てはめれば答えが出てきます。
$$(頂点1を含む島の中で頂点1からの距離が最大の頂点との距離) + (頂点N_1 + N_2を含む島の中で頂点N_1 + N_2からの距離が最大の頂点との距離) + 1$$
あとは「頂点$1$を含む島の中で頂点$1$からの距離が最大の頂点との距離」と「$N_1 + N_2$を含む島の中で頂点$N_1 + N_2$からの距離が最大の頂点との距離」を求めていきましょう。
これについては、「幅優先探索」という探索手法を使えば大きくない計算量で求めることができます。それぞれの距離を求めるために、下記の2通りの幅優先探索を行いましょう。
- 頂点$1$を始点として、島の中で幅優先探索
- 頂点$N_1 + N_2$を始点として、島の中で幅優先探索

幅優先探索で各頂点の距離を求める実装方法は下記の記事が参考になります。

https://qiita.com/drken/items/996d80bcae64649a6580

これで答えを求めることができます。

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc309/submissions/43499744

ご不明点などがあれば教えていただけると幸いです。

# 参考

https://qiita.com/drken/items/996d80bcae64649a6580
[React]onClickの使い方

# onClick

<br><br>
今日は簡単に**react**で**onClick**の使用方法を見てみましょう。
<br><br>

### 1. 準備

>いいねボタン

ハートを押すと数字が上がる機能を作りましょう。
まずいいねボタンを作ります。
```react
<h1> いいね！ <span>❤️</span> 0 </h1>
```
![スクリーンショット 2023-07-12 142205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509555/6b475424-4275-c8c0-e545-3e4c8525ed65.png)

<br><br>


数字の部分は変わるのでstateに変更してあげます。
[state使い方](https://qiita.com/huraipan/items/86eb1c9fa2e334fdde6f)

```react
function App(){
  
  let [heart, setHeart] = useState(0);
  return (
    <h1> いいね！ <span>❤️</span> { heart } </h1>
  )
}
```
<br/>

<br><br>

### 2. どう使う?
```react
<div onClick={関数}>
```
従来のジャバスクリプトコードとは異なり、**cが大文字**で **中括弧**を入れるのが特徴です。

1. あらかじめ用意した関数を入れる。
    ```react
    function App(){
  
      function 関数名(){
        console.log(1)
      }
      return (
         <div onClick={関数名}> こんにちは </div>
      )
    }
    ```

<br><br>

2. すぐ入れる。
    ```react
    <div onClick={ function(){ コード } }> 
    <div onClick={ () => { コード } }> // arrow functionを使っても大丈夫です。
    ```

<br><br>

### 3. いいねを完成しましょう！
私はarrow functionをつかいますた。
```react
function App(){
  
  let [ heart, setHeart ] = useState(0);
  return (
      <h4> いいね！ <span onClick={ ()=>{ setHeart(heart + 1) } } >❤️</span> { heart }</h4>
  )
}
```

![スクリーンショット 2023-07-12 144340.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509555/e4775baa-b43d-77a1-47c1-14c8fc545fdb.png)

<br><br>

# onClickによるarrayデータの変更
今回は**onClick**を使って**array**のデータを切り替えます。

今回は答えからお見せします。
```react
function App(){
  
  let [location, setLocation] = useState( ['東京', '大阪', '名古屋'] );  
  
  return (
    <button onClick={ ()=>{ 
      let copy = [...location];
      copy[0] = '福岡';
      setLocation(copy)
    } }> 修正 </button>
  )
}
```

arrayにあるデータ値を変える方法は本当に多様です。

最も注意すべき点はこれです。
```react
let copy = location;
copy[0] = '福岡';
setLocation(copy)
```
これでは正しく変更できないんです。
その理由は**state変更関数**は、値が変更された場合にのみ機能します。
locationは**arry**なので、中には**アドレス値**が保存されています。
そのため、copy関数に入れても同じ**アドレス値**がコピーされます。
それなら結局setLocation(copy)にある**copy**は最初と同じですね。

<br><br>


だからこれはオッケーです
```react
let copy = [...location];
copy[0] = '福岡';
setLocation(copy)
```
ちなみに[...location]の...は括弧をなくす役割をします。
シェルスクリプトでループを回したとき配列の1番目の要素しか取得できなかった

# 環境
vscode
拡張機能[BASH Extension Pack](https://marketplace.visualstudio.com/items?itemName=lizebang.bash-extension-pack)
今回扱うのはBASH Extension Pack内のshellcheck

次のようなbashファイルを書いていたとき次のようなメッセージが表示された。

```bash:loop.bash
#!/bin/bash

num=(12 14 18 44 53 80 87 114)

for i in $num; do
    echo ${i}
done
```

shell checkによるエラーメッセージ
Expanding an array without an index only gives the first element.shellcheckSC2128

どうやら配列の一つ目の要素しかループで取り出せないらしい。

実行結果
```shell
$ ./loop.bash
12
```

以下のように書き換えるとすべての要素が取得できた。

```bash:loop.bash
#!/bin/bash

num=(12 14 18 44 53 80 87 114)

for i in "${num[@]}"; do
    echo ${i}
done
```

変更部分はループの

```text
$num->"${num[@]}"
```

です。

実行結果
```shell
$ ./loop.bash
12
14
18
44
53
80
87
114
```


参考
https://www.shellcheck.net/wiki/SC2128
ChaosMeshにて「error.api.internal_server_error:Unauthorized」のエラーが発生したときの対処法

Chaos-meshを使用するとき，下の画像のように「error.api.internal_server_error:Unauthorized」というエラーが発生することがあります．

![スクリーンショット 2023-07-11 155357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/d39bfe53-d73d-2212-34a2-78919d777166.png)

このエラーが出た時の対処方法を説明します．

と，いってもとても簡単で，いったんログアウトをしてトークンの設定をもう一度して入りなおすだけです．
それでも手順は書き綴りますね．

まずはログアウトをしましょう．左にある「Setting」を選択して右上の「Logout」をクリックするだけですね．

![スクリーンショット 2023-07-12 152106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/e15ef2bd-7d0d-7a8f-85bd-35611a35b4c0.png)

今の手順でログアウトをすれば以下ような画面になると思います．

![スクリーンショット 2023-07-12 152818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/3e7414cd-7f03-63fc-fd03-2e1963dee5a9.png)

ここからはトークンの設定です．

まず「Click here to generate」をクリックします．
次の画面では「Cluster scoped」にチェックをつけて，Roleは「Manager」を選択してください．

![スクリーンショット 2023-07-12 153116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/36c773d5-0ec2-11ab-4cea-56bb6003f913.png)

つぎはChaosMeshを使うvmでviコマンド使って，以下の部分をコピーして貼り付けましょう．
説明に書いてある通り，ファイル名は「rbac.yaml」にして下さい．右側のCopyを押せば作ったファイルに貼り付けるだけでOKです．

![スクリーンショット 2023-07-12 153332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/0d0fa4d5-a847-1ace-c264-21366f8bc1b4.png)

次に「rbac.yaml」を作った場所で以下の部分に記述されているコマンドを打ちます．

ですが，ここからの部分で注意点があります．
    ChaosMeshの方のコマンドをコピーしようと画面をクリックしたりするとトークンが勝手に変更されてしまい，先ほど入力したyamlファイルと齟齬が生じてしまいます．ですので，あまりChaosMeshの画面を触らずに手入力でコマンドを打つことをオススメします．
（タブを切り替える時のクリックでも変更されてしまったことが確認できてます．）

![スクリーンショット 2023-07-12 154357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/c93ce50a-6fb3-e3d7-1967-035f9c8e56d5.png)

上記のコマンドを打って正常だった場合はこのように出力されると思います．

![スクリーンショット 2023-07-12 155103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/3a5712e9-9018-b762-31f7-1244778aba0f.png)

次は以下の部分に記述されているコマンドを打ってください．

![スクリーンショット 2023-07-12 155643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/df7b3ffd-9468-3482-fcdc-a5c19be78d5e.png)

そうすることで以下のような長い文字が出てきます．これをコピーしてください．

![スクリーンショット 2023-07-12 160010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/c713c1b0-6516-42c8-d62d-4913b4c460ed.png)

後は，右下のcloseを押して最初のトークンの画面に戻りTokenの場所に貼り付けましょう．
Nameは好きに名前をつけてください．
最後はSubmitを押して完了です．

![スクリーンショット 2023-07-12 160154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111717/acdc0c23-df9a-5742-1732-268446589ca1.png)

異常がエラーが出た時の対処方法になります．

もし，この方法で対処が出来て助かったなどがあれば嬉しい限りです．
スパイウェアとトロイの木馬の違い



### ▼はじめに
トロイの木馬とスパイウェアは、どちらもマルウェアの一種です。
コンピューターへの侵入方法がとても似ていますが実際は異なります。
ややこしかったので簡単にまとめてみました。

### 1.「トロイの木馬」とは
通常のファイルに偽装して潜伏する悪意のあるソフトウェアの総称です。
#### 1-1.侵入方法
ユーザーが**安全なソフトウェアだと判断して**インストールすることで侵入します。

#### 1-2.侵入後の処理
トロイの木馬は、コンピューターに侵入後に行う悪質な処理については特徴がありません。
なぜなら、種類によって様々な処理を行うトロイの木馬があるからです。
コンピューター内のデータを破壊するトロイの木馬もあれば、スパイウェアと同じようにデータを盗むトロイの木馬もあります。

#### 2.「スパイウェア」とは
コンピュータ内部からインターネットに対して情報を送り出すソフトウェアの総称です。
##### 2-1.侵入方法
ユーザーが**気づかぬ内**にインストールすることで侵入します。
ユーザが安全なソフトウェアをインストールすると自動的にスパイウェアもインストールされている等の例もあります。
他にもコンピューターに不正アクセスして、スパイウェアをインストールするという侵入方法もあります。

##### 2-2.侵入後の処理
スパイウェアがコンピューターに侵入後に行う悪質な処理には、データを盗むという特徴があります。

### ▼まとめ
**<font color="Red">トロイの木馬</font>**は、ユーザーに**安全なソフトウェアだと見せかけて**パソコン等のコンピューターに侵入して、種類によって様々な悪質な処理を行う。

**<font color="Red">スパイウェア</font>**は、ユーザーに**気づかれないように**パソコン等のコンピューターに侵入します。その後、ひっそりとコンピューター内のデータを収集し、取得したデータをインターネットを利用して外部へ流出させます。
Codicを使ってみた


## はじめに
コーディング時に、変数名やプロパティ名をどのように命名すればいいのか
悩んだ時に使えるサイトを紹介します。

## Codicの紹介
Codicは、日本語を入力するだけで、自動的にネーミングを生成してくるツールです。
![スクリーンショット 2023-07-12 14.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478070/70bd229c-b82a-e81e-18dd-14cf9b1ab172.png)

## Codicの使い方
会員登録しなくても利用することが出来ます。
左側に日本語入力してみたら、自動的にプログラマー向けの英語ネームに変換されます。
![スクリーンショット 2023-07-12 14.47.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478070/d6ecce08-a4c3-2185-9337-c6bb220330de.png)

## さいごに
今まで命名に迷ったりすることがありましたが、
変数名やプロパティを命名することが楽になったので良かったら使って下さい！
RAMLで道を切り開く：RAMLの作成ステップ

# はじめに

皆さん、こんにちは。
ゼロから始めるMuleSoft学習旅行の一環として、「RAML」という道は実装する際に、最初に道を切り開くところです。
これからRAMLの使用方法、その特性、設計のベストプラクティス、そして具体的な実装手順について見ていきます。

今日はまず、Design CenterにてRAMLを作成する手順を紹介していきたいと思います。

# Design CenterにてRAMLの作成手順

左上のメニューを開く
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/16228cf0-b1e9-06f5-6485-1d7a08ec9511.png)

「create」ボタンを押す
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/44a3bba9-6005-420e-1a71-fc17136c3f8f.png)

「New API Specification」をクリック
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/c6dd1506-8ed4-cb45-4474-bc442e4d4f97.png)

Project Nameを入力し、「Creae API」ボタンを押す
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/38749b7e-9c5b-8668-7760-684460931fea.png)

APIが作成されました、これでRAMLの開発ができる状態です。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/ce4834dd-f4a6-8c16-2ce1-770675a8b285.png)

次回からは、具体的なRAMLの特性と開発を紹介していきますので、お楽しみに！